Stop mutating primary.expires in _group_users_for_display(); store the
computed earliest date in primary.earliest_expires instead so each
account's individual expires value remains intact for the mixed-expiry
detection logic in user_card.html.
- Updated the sub-navigation for the wizard to conditionally display step creation options based on the default state and available bundles.
- Improved the bundles page layout by categorizing steps into pre-invite, post-invite, and additional categories, enhancing user experience.
- Added orphaned step handling to allow users to remove steps that no longer have an associated entry.
- Displayed the associated wizard bundle name in the invite card if applicable.
- Adjusted JavaScript routing for bundle steps in the wizard.
- Modified the development script to set the NODE_ENV to development when installing npm dependencies, ensuring proper handling of devDependencies.
- Updated the subproject reference in the plus directory to indicate a dirty state.
- Updated title block in frame.html for clarity.
- Improved localization for the "Next" button in steps.html.
- Refactored the WizardController JavaScript for better readability and organization.
- Added detailed comments to the wizard architecture for future reference.
- Enhanced button visibility and state management based on interaction requirements.
- Implemented swipe gesture handling for mobile navigation.
- Updated subproject commit to indicate a dirty state.
- Introduced `is_disabled` attribute to the User model.
- Added `expiry_action` selection in the GeneralSettingsForm for user management.
- Implemented `disable_user` methods for various media clients (Audiobookshelf, Jellyfin, Kavita, etc.) to handle user disabling.
- Updated `check_expiring` task to process expired users based on the new settings.
- Enhanced user interface to reflect disabled status in user cards.
- Added migration for the new `is_disabled` column in the user table.
- Add new connections management system with MediaConnection and DiscordWebhook models
- Implement dynamic server configuration with URL field support
- Add expiry management system with automatic user cleanup
- Create wizard preset system for streamlined server setup
- Add dedicated connections interface in settings with CRUD operations
- Integrate expiry functionality with connection management
- Add proper form validation and error handling
- Update templates and routes for new connection workflow
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added `MediaUserDetails` and `UserLibraryAccess` data classes for consistent user information representation.
- Implemented `get_user_details` method in various media clients (Emby, Jellyfin, Kavita, Komga, Plex, Romm) to return standardized user details.
- Updated `get_user` methods in media clients to maintain backward compatibility while leveraging the new user details structure.
- Enhanced user listing and synchronization processes to include policy attributes and library access information.
- Improved user interface templates to display user policies and account information more effectively.
- Added human-readable date formatting for expiration and creation dates in user-related templates.
- Add copyToClipboard() utility function in base.html with fallback support
- Replace direct navigator.clipboard.writeText() calls with new utility
- Support both HTTPS (modern clipboard API) and HTTP contexts (document.execCommand fallback)
- Add manual copy alert as last resort for complete compatibility
- Update all clipboard usage locations (invite modal, admin invites, invite cards)
Fixes#711🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added routes for resetting and viewing passkeys for admin accounts.
- Integrated passkey checks during login to enforce 2FA when applicable.
- Updated login template to handle passkey authentication and display relevant messages.
- Created a recovery tool for password resets and passkey management in case of lockouts.
- Enhanced admin management UI to include passkey options.
- Documented recovery tool usage and scenarios for admin access recovery.
- Introduced `server_name_tag` filter to generate styled server name spans based on server type.
- Enhanced the `invite_table` view to support improved rendering of invitation cards, including relative expiry strings and server-specific details.
- Updated the invite card template for better layout and user experience, including a masonry layout for dynamic card positioning.
- Added helper functions for relative time formatting and improved server library display logic.
- Add support for inviting users to multiple media servers simultaneously
- Implement Jellyfin-specific invite options (Allow Downloads, Allow Live TV)
- Add server type detection and conditional UI rendering in invite form
- Create new database migration for Jellyfin server options
- Update invite service to handle multi-server invitations
- Add server-specific validation and error handling
- Enhance user management with server-specific permissions
- Update templates to show server-specific invite options
- Add middleware support for multi-server authentication
- Improve settings forms with server type-specific fields
Breaking changes:
- Invite form now requires server selection
- User permissions are now server-specific
- Database schema updated for multi-server support