Commit Graph

409 Commits

Author SHA1 Message Date
Matthieu B
7803cfd74c Keep invite form open on errors
Keep form-based invitation screens open on account creation failures so users can see errors without replaying the welcome animation.

Centralize join form template context, preserve theming across invite routes, and add regression coverage for validation and E2E flows.
2026-07-05 18:53:49 +02:00
Matthieu B
04e3b58a82 Fix invite library dropdown interactions (#1324)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-07-05 18:52:22 +02:00
Matthieu B
c10a0e1911 Validate invitation form submissions (#1322)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-07-05 18:37:15 +02:00
Matthieu B
42fdbae8bb Bundle external frontend assets (#1320)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-07-05 18:32:29 +02:00
RicoUHD
365d1d57fe fix(frontend): align static asset cache-busting in Plex login template 2026-05-25 17:54:46 +02:00
RicoUHD
4b0eca0d38 style(flask): use dynamic url_for query parameters and optimize context processor imports
- Refactored all cache-busting v arguments in base.html to pass directly through the Flask url_for Jinja function (v=app_version) rather than string concatenation.
- Moved the os import in context_processors.py to the top level scope to avoid redundant runtime overhead on every request.
2026-05-25 17:52:19 +02:00
RicoUHD
a33d79dd45 fix(assets): implement deterministic build lifecycle and dynamic cache busting
- Added dynamic ?v={{ app_version }} cache-busting query strings to all core stylesheet and script references in base.html.
- Created and registered the inject_app_version context processor in app/context_processors.py and app/__init__.py to inject the APP_VERSION environment variable into all templates dynamically.
- Refactored copy-assets.js to detect production context (NODE_ENV=production or DOCKER_BUILD=true) and fail loudly (process.exit(1)) if assets are missing, avoiding silent failures in the build pipeline.
- Set DOCKER_BUILD=true during the Dockerfile asset compilation step to enforce deterministic production build verification.
2026-05-25 17:33:29 +02:00
RicoUHD
492d96c3e0 fix(assets): resolve external Bowser dependency and casing fallback
- Replaced the external unpkg.com Bowser CDN script load in user-plex-login.html with our offline-capable, local secure vendor script (/static/js/vendor/bowser.min.js).
- Added a fallback in in-app-escape.js to check window.bowser (lowercase) in addition to window.Bowser (uppercase) to support both global casing schemes robustly.
2026-05-25 14:39:33 +02:00
RicoUHD
123a967190 fix(pwa): improve Service Worker update strategy and cache management
- Set updateViaCache to 'none' in SW registration to bypass HTTP cache for the worker script.
- Implemented periodic update checks every hour and update listeners.
- Integrated immediate activation (self.skipWaiting) and adoption (self.clients.claim) in sw.js to resolve cache lock-in instantly.
- Optimized stale-while-revalidate strategy in sw.js to use event.waitUntil to guarantee background fetches complete.
- Removed duplicate css/main.css stylesheet load in base.html template.
- Added app/static/js/vendor/ and app/static/css/vendor/ to .dockerignore to keep Docker daemon build contexts clean.
2026-05-25 14:36:33 +02:00
RicoUHD
a378d76683 fix: resolve White Screen of Death (WSOD) by serving external assets from clean vendor directories
- Relocated Alpine.js, HTMX, Flowbite, Bowser, Inapp-spy, and Animate.css assets out of node_modules into safe vendor folders during build.
- Created cross-platform Node.js copy-assets.js script to copy required front-end packages.
- Updated base.html template to serve assets from secure vendor folders instead of node_modules and fixed Alpine plugin loading order.
- Modified .gitignore to ignore portable local development tools and compiled vendor assets.
2026-05-25 14:14:59 +02:00
Matthieu B
9b8c0248cd fix: resolve double scrollbar on LDAP settings and add experimental label
Add overflow-hidden to admin layout's h-screen container to prevent
body-level scrolling competing with #content's overflow-y-auto.
Mark LDAP settings as experimental with a badge.
2026-03-29 16:51:36 +02:00
Matthieu B
7b70be9d7e fix: correct Jinja2 syntax in passkey registration template (#1126)
The `tojson` filter already outputs a complete JSON object with braces,
but the template wrapped it in extra JavaScript braces, producing invalid
syntax. This caused a SyntaxError that prevented navigator.credentials.create()
from ever being called — no passkey prompt appeared.
2026-03-29 16:34:47 +02:00
Matthieu B
ef8ad20938 style: reformat templates with djlint 2026-03-29 16:34:26 +02:00
Matthieu B
59e2cb8199 chore: merge main into ldap branch, resolve conflicts 2026-03-29 16:28:20 +02:00
Matthieu B
000085731f Merge pull request #1198 from wizarrrr/fix/1163-expiry-display
fix: preserve per-server expiry dates in user grouping
2026-03-29 16:25:23 +02:00
Matthieu B
396e940be6 style: fix djlint formatting in template 2026-03-29 16:23:22 +02:00
Matthieu B
672475469d fix(ldap): security, architecture, and code quality improvements
- Fix SUBTREE→BASE scope in _fetch_user_attributes (security)
- Remove is_ldap_user threading from all 8 media client interfaces;
  set flag after join via workflow-level User.query.update instead
- Use find_user_dn (search-based) instead of build_user_dn (concatenation)
  in delete_user and reset_user_password for robustness
- Wrap all user-facing strings in _() for i18n in ldap_auth.py
- Fix username fallback from hardcoded "wizarr" to unique per-user
- Return failure from _update_existing_user when password update fails
- Replace dynamic Tailwind classes with explicit conditionals in alert
- Add stale group cleanup and upsert in sync_ldap_groups
- Remove fake @ldap.local email fallback in user_sync
2026-03-29 16:18:41 +02:00
Matthieu B
9f3d66e4fe fix: preserve per-server expiry dates in user grouping (#1163)
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.
2026-03-29 16:10:19 +02:00
Matthieu B
e992873e4d Merge origin/main into ldap branch
Resolve conflicts in auth/routes.py (incorporate media_server_url),
login.html (combine admin page text + LDAP error guard), and uv.lock.
2026-03-29 15:49:50 +02:00
Matthieu B
b0856b7473 Merge pull request #1113 from JSWANS0N/main
Add Telegram notification support
2026-03-29 15:32:36 +02:00
Matthieu B
9d6e0406d0 feat: help lost user find thier way closes #1063
On accepting an invite, we store a cookie. On the login page a little banner will be shown letting a user know this is an admin page
2026-02-25 02:05:08 +01:00
Matthieu B
0902f4ba93 feat(invites): streamline invite expiry handling and update UI for expiration display 2026-02-25 02:02:08 +01:00
Matthieu B
dae8372397 style: fix djlint formatting in invite templates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:34:43 +01:00
Matthieu B
ad7f07319d feat(invites): implement per-server expiry handling and update invite modal closes #1138 2026-02-23 12:33:29 +01:00
Tim Gilmore
3612b09ecc changed watch to stream 2026-02-04 20:33:02 -08:00
Jacob Swanson
7f64f558dc Add Telegram notification support
Introduces Telegram as a notification agent, including backend logic, form fields, and database columns for bot token and chat ID. Updates creation and editing flows, notification service, and UI to support Telegram integration. Includes a migration to add the new fields to the Notification model.
2026-01-23 22:03:05 -06:00
Erwan Leboucher
5bb51e0cf1 feat(ldap): add LDAP authentication and invitation integration 2025-12-27 17:14:17 +01:00
Matthieu B
2c58f1daef fix: update server name tag rendering in user accounts 2025-12-09 15:28:59 +01:00
Matthieu B
89762d96dd feat: add bundle preview functionality and improve token generation tests
- Added a preview link for bundles in the wizard settings page. closes #1048
- Enhanced the wizard steps template to handle bundle preview mode.
- Updated JavaScript to generate URLs for bundle preview and runtime modes.
- Improved test coverage for password reset token generation by asserting token creation.
2025-12-09 14:37:39 +01:00
Matthieu B
3d25506745 style: improve HTML formatting and indentation across multiple templates 2025-12-09 14:28:01 +01:00
Matthieu B
4af196f0b8 feat: add manual cleanup route for expired users in settings closes #1047 2025-12-09 14:24:21 +01:00
Matthieu B
0b2c90fee2 Merge pull request #1020 from 6im0n/feature/reset-password
Feat/Adds password reset functionality for Jellyfin user
2025-12-04 12:02:08 +00:00
Matthieu B
c4bafddc71 Update app/templates/tables/user_card.html
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-04 13:01:41 +01:00
copilot-swe-agent[bot]
4bf1f26ca0 Add clarifying comment for max_active_sessions behavior
Co-authored-by: mtthidoteu <66959271+mtthidoteu@users.noreply.github.com>
2025-12-01 11:56:33 +00:00
copilot-swe-agent[bot]
e97fdd5ed2 Fix duplicate max_active_sessions input IDs in invite modal
Co-authored-by: mtthidoteu <66959271+mtthidoteu@users.noreply.github.com>
2025-12-01 11:54:24 +00:00
Simon
237fe620be feat: Add 'Max Active Sessions' input to invite form 2025-11-21 23:49:50 +01:00
Simon
ba7fdce051 fix: reuses generic server type tag 2025-11-21 01:19:34 +01:00
Simon
1f748c37b2 feat: improve the password reset functionality for jellyfin 2025-11-21 00:49:05 +01:00
Simon
fadbf9df35 feat: add UI password reset feature 2025-11-21 00:17:27 +01:00
Matthieu B
fca67912fe feat: implement server-specific color theming for invitations and wizards closes #982 2025-11-06 12:59:57 +01:00
Matthieu B
22cd5c62c8 fix: update x-data structure in user modal for cleaner permission management 2025-11-03 20:55:02 +01:00
Matthieu B
704aaddd97 fix: tests 2025-11-03 17:51:45 +01:00
Matthieu B
0050f4b646 feat: allow user edit 2025-11-03 14:36:04 +01:00
Matthieu B
31d1bba041 fix: Improve date formatting in invite cards for consistency and clarity closes #947 2025-10-27 12:54:01 +01:00
Matthieu B
5feaf51337 Enhance wizard step management and UI
- 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.
2025-10-26 12:26:26 +01:00
Matthieu B
560a6f892e fix: lint: 2025-10-23 19:55:07 +02:00
Matthieu B
b7916658a3 refactor: enhance modal accessibility and styling, add safe area insets for PWA support closes #871 #873 2025-10-23 19:18:28 +02:00
Matthieu B
47f57e0ca7 refactor: update library grouping by server ID and adjust template rendering for invitations closes #938 2025-10-22 12:19:53 +02:00
Matthieu B
07166a1a80 refactor: update Emby collector to use Sessions API polling instead of WebSocket
fix: correct key for transcoding info in admin routes
feat: enhance Jellyfin client to extract additional session and media details
fix: update template to reflect changes in transcoding info structure
chore: update submodule reference for plus
2025-10-21 11:48:07 +02:00
Matthieu B
3e84e68f8b fix: remove deprecated Plus audit route and update Plus settings tab link 2025-10-20 15:49:17 +02:00