Commit graph

2949 commits

Author SHA1 Message Date
None
fc01a6d04d Improve ProgramDetailModal layout per feedback
- Move channel name/number into modal header title bar (was empty after removing duplicate title)
- Remove channel logo from modal (didn't fit well)
- Remove custom background color override, inherit from Mantine dark theme for consistency with VOD/Series modals
- Fix wrong channel shown in modal: pass channel directly from renderProgram instead of re-looking up by tvg_id
- Clean up unused imports (getChannelLogoUrl, Image/Group no longer needed in title)
2026-03-12 21:33:58 -05:00
None
ada7e03a10 apply dev mode port handling
Applied the same dev mode port handling to getChannelLogoUrl that is used by GetPosterUrl
to allow URL retrieval without path interruption
2026-03-12 16:26:13 -05:00
None
ae2d111eb2 Remove program.title from modal title bar
Program title was intentionally being shown in the modal title bar and modal body, but when no program artwork was provided via EPG the title components were layered one after the other, making it look like a duplicated title.
2026-03-12 16:10:10 -05:00
None
79dc113a1c remove infer_is_live()
After discussion, decided to keep live badge inference deterministic
2026-03-12 16:01:35 -05:00
None
516ec43c75 fix GuideRow test
- Add Tooltip to GuideRow test mock, remove EXPANDED_PROGRAM_HEIGHT references
2026-03-10 11:37:14 -05:00
None
c2ead35519 Move test_wait_for_redis.py call
Moved inline so mock data is not overwritten
2026-03-10 11:17:41 -05:00
None
49825f3733 Merge remote-tracking branch 'origin/dev' into feat/1065-Add-Subtitle-and-Season-Episode-to-Guide 2026-03-10 11:17:00 -05:00
None
b490ac4675 revert padding change
Sticking with the 3-row layout, additional padding unnecessary
2026-03-10 11:03:45 -05:00
None
9e47b176ba Merge commit '61c24866' into feat/1065-Add-Subtitle-and-Season-Episode-to-Guide 2026-03-10 10:56:39 -05:00
None
b72a9a870e feat(guide): redesign guide with detail modal, progress bars, and season/episode display
Replace expanded inline cards with a ProgramDetailModal for viewing full program
details. Add real-time progress bars to currently-airing programs using direct DOM manipulation. Extract and display season/episode info from EPG data with a 3-tier fallback (custom_properties → onscreen_episode → description text).

Backend:
- Add ProgramDetailSerializer for rich EPG data (categories, credits, ratings, images, external IDs) served on the detail endpoint
- Add infer_is_live() for status badges (live, new, premiere, finale)
- Add shared S/E extraction utilities in apps/epg/utils.py
- Optimize querysets with select_related("epg")

Frontend:
- ProgramDetailModal with conditional field rendering and image fallback chain
- Progress bars via scaleX transform updated every second
- Parallel data fetching with Promise.all for channels + programs
- Browser tab visibility recovery for progress bars
- Now-line with triangle marker and sub-millisecond precision
- Card layout: title, season/episode + subtitle, time + badges
- Shared formatSeasonEpisode() and external URL helpers
2026-03-10 10:53:19 -05:00
SergeantPanda
d473b9325d
Merge pull request #1082 from nick4810:tests/frontend-unit-tests
Tests/frontend unit tests
2026-03-10 09:00:54 -05:00
Nick Sandstrom
5add51c337 Minor refactors for readability 2026-03-09 14:13:30 -07:00
Nick Sandstrom
aeb6997541 Added tests for cards/ components 2026-03-09 14:12:59 -07:00
Nick Sandstrom
7a0e396bc0 Merge remote-tracking branch 'upstream/dev' into test/component-cleanup 2026-03-09 14:04:35 -07:00
SergeantPanda
f75a3134fa tests: More failed test fixes...
Some checks failed
CI Pipeline / prepare (push) Has been cancelled
Build and Push Multi-Arch Docker Image / build-and-push (push) Has been cancelled
Frontend Tests / test (push) Has been cancelled
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Has been cancelled
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Has been cancelled
CI Pipeline / create-manifest (push) Has been cancelled
2026-03-08 21:55:23 -05:00
SergeantPanda
fa143aac41 tests: More frontend test fixes.
Some checks are pending
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
Frontend Tests / test (push) Waiting to run
2026-03-08 21:19:19 -05:00
SergeantPanda
4e66363565 tests: Update frontend tests after sidebar changes. 2026-03-08 21:10:53 -05:00
SergeantPanda
e4ba7b6d20
Merge pull request #943 from CodeBormen/Feature/854-Add-Ability-to-sort-Channels-by-Group
feat: Add sorting by Group and EPG columns to Channels and Streams ta…
2026-03-08 19:01:44 -05:00
SergeantPanda
1c6e9bbf04 changelog: Added clarification about api abilities prior to PR. 2026-03-08 19:00:44 -05:00
SergeantPanda
5f80ab08b6 changelog: Update changelog for table sorting pr. 2026-03-08 18:54:28 -05:00
SergeantPanda
ff2d11a199 Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/CodeBormen/943 2026-03-08 18:50:38 -05:00
SergeantPanda
7899901936 Enhancement: Channels page default splitter ratio changed from 50/50 to 60/40 (channels/streams) so all channel action buttons are visible without scrolling on 1080p displays. 2026-03-08 18:48:20 -05:00
SergeantPanda
39865d3732 Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/CodeBormen/943 2026-03-08 18:04:11 -05:00
SergeantPanda
95c2589594
Merge pull request #922 from jcasimir/ui-navigation
Add configurable navigation ordering and visibility
2026-03-08 17:23:33 -05:00
SergeantPanda
ac71458729 changelog: Update changelog for navigation ordering PR 2026-03-08 17:08:52 -05:00
SergeantPanda
70a0b43c8a Cleanup frontend and backend if valid item ids change. 2026-03-08 17:05:26 -05:00
SergeantPanda
76d980dcee Bug Fix: onLogout is not defined, use logout from auth store 2026-03-08 16:36:36 -05:00
SergeantPanda
63234a4a46 Bug Fix: Restore integrations/system groups and fix channels reference after rebase 2026-03-08 16:35:34 -05:00
SergeantPanda
72e4ce0813 tests: Add a check that a user can not self elevate. 2026-03-08 16:30:50 -05:00
SergeantPanda
0070e66dd1 Bug Fix: Fix double merge race condition in auth.jsx 2026-03-08 16:30:49 -05:00
SergeantPanda
d5aaa0277c security: Do not allow user to give themselves admin or super_user privileges. 2026-03-08 16:30:48 -05:00
SergeantPanda
1a9d2e2777 Remove double error notifications. 2026-03-08 16:30:47 -05:00
SergeantPanda
a4ad9a9135 Move python test into tests folder. Fix frontend test after merge changes. 2026-03-08 16:30:47 -05:00
SergeantPanda
cde39c0e13 Fixed logic with default orders. 2026-03-08 16:30:42 -05:00
SergeantPanda
678240da6e Move navigation settings under ui settings 2026-03-08 16:29:38 -05:00
Jeff Casimir
8fb88827ae Fix code review findings for navigation ordering PR
P1 (Critical):
- Replace undefined @swagger_auto_schema with @extend_schema
- Add custom_properties validation with size limits
- Add merge semantics in serializer update() to prevent data loss

P2 (Important):
- Add debouncing (800ms) for drag operations in NavOrderForm
- Add error handling with notifications for visibility toggle
- Use store getters in Sidebar instead of direct property access
- Cache hiddenNav before render loop

P3 (Nice-to-have):
- Add canHide: false to settings nav item
- Fix admin check to use >= instead of ==
- Fix ESLint unused variable warnings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:28:29 -05:00
Jeff Casimir
ed117661b5 Add ability to hide navigation items
- Add eye icon toggle to show/hide nav items in settings panel
- Hidden items stay in position but are dimmed with eye-slash icon
- Sidebar filters out hidden items
- Settings item cannot be hidden
- Reset to Default also clears hidden items
- Add getHiddenNav and toggleNavVisibility to auth store
- Update tests for visibility toggle feature

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:28:28 -05:00
Jeff Casimir
adc28551a6 Integrate configurable navigation into Settings and Sidebar
- Add Navigation accordion section to Settings page
- Update Sidebar to use getOrderedNavItems() with user's saved order
- Sidebar updates immediately when order changes
- Add test coverage for Navigation settings section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:28:02 -05:00
Jeff Casimir
e2205fb454 Add NavOrderForm component for drag-and-drop nav ordering
- Drag-and-drop reorderable list using dnd-kit
- Auto-saves on drop with optimistic update
- Reset to Default button restores role-based defaults
- Shows only items available to user's role
- Add test coverage for admin and non-admin users

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:25:51 -05:00
Jeff Casimir
e876d6e926 Add navigation preference methods to auth store
- Add updateMe() API method for PATCH requests to /me/
- Add getNavOrder() to retrieve saved navigation order
- Add setNavOrder() to persist navigation order changes
- Add updateUserPreferences() with optimistic updates and rollback

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:25:49 -05:00
Jeff Casimir
0e34415493 Add centralized navigation configuration
- Extract nav item definitions into config/navigation.js
- Define NAV_ITEMS with id, label, icon, path, adminOnly for each item
- Add DEFAULT_ADMIN_ORDER and DEFAULT_USER_ORDER arrays
- Create getOrderedNavItems() helper for custom ordering
- Handle missing items by appending to end of saved order
- Add comprehensive test coverage

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:25:47 -05:00
Jeff Casimir
edf81ef6c6 Add PATCH method to /me/ endpoint for user preferences
- Allow users to update their own profile via PATCH /api/accounts/users/me/
- Supports partial updates to custom_properties (including navOrder)
- Add comprehensive test coverage for the endpoint

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-08 16:25:47 -05:00
SergeantPanda
76271fc9fd Bug Fix: Version update notification persisting after upgrading to the notified version (e.g. "v0.20.2 available" shown while already running v0.20.2). Root cause: check_for_version_update.delay() was called from AppConfig.ready(), which fires inside Celery prefork pool subprocesses before the broker connection is established, causing the dispatch to fail silently with no log output. Fixed by moving the startup dispatch to the worker_ready signal in celery.py (consistent with the existing recover_recordings_on_startup pattern), and deleting the stale version-{current_version} notification at the top of the production check path so it is cleared even when GitHub is unreachable. A WebSocket update is sent immediately on deletion so the frontend badge clears without waiting for the API response. 2026-03-08 13:38:18 -05:00
SergeantPanda
0a658007ac
Merge pull request #1062 from JCBird1012:1061
Some checks are pending
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
fix: guard is_adult parsing against invalid values
2026-03-08 12:03:11 -05:00
SergeantPanda
b61f3f970d changelog: Update changelog for parse_is_adult PR. 2026-03-08 12:02:28 -05:00
SergeantPanda
ea9f4f4bbd Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/JCBird1012/1062 2026-03-08 12:00:46 -05:00
SergeantPanda
dfb91db987 Bug Fix: VOD orphan cleanup crashing with a ForeignKeyViolation (IntegrityError) when a concurrent refresh task created a new M3UMovieRelation or M3USeriesRelation for a movie/series between the orphan-detection query and the DELETE SQL. Both orphaned_movies.delete() and orphaned_series.delete() are now wrapped in try/except IntegrityError; affected records are skipped with a warning and will be cleaned up on the next scheduled run. 2026-03-08 11:56:52 -05:00
SergeantPanda
753bc1a893 fix(stream-preview): restore stream_name and stream_stats for stream previews
Stream.get_stream() was never called in the preview path of
generate_stream_url(), so the channel_stream and stream_profile
Redis keys were never written. This caused the stream_id to be
missing from channel metadata, which silently broke two things:

- Stats page showed no stream name or logo
- stream_stats were never saved to the database

Fix: replace the manual profile-selection loop in the preview path
with a direct call to Stream.get_stream(), matching the channel path
exactly. This also fixes a pre-existing non-atomic slot reservation
(read-then-check vs INCR-first) that could over-allocate connections
on concurrent previews.

Regression introduced in 49b7b9e2.
2026-03-08 11:46:31 -05:00
SergeantPanda
c0d70767e6 changelog: Add credit to @patchy8736 for contributions that came from his closed PR.
Some checks are pending
CI Pipeline / prepare (push) Waiting to run
CI Pipeline / docker (amd64, ubuntu-24.04) (push) Blocked by required conditions
CI Pipeline / docker (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
CI Pipeline / create-manifest (push) Blocked by required conditions
Build and Push Multi-Arch Docker Image / build-and-push (push) Waiting to run
2026-03-07 18:39:41 -06:00
SergeantPanda
9876a25e62 Bug Fix: XC stream refresh crashing with a null value in column "name" database error when a provider returns streams with a null or empty name. Affected streams are now assigned a generated fallback name in the format <account name> - <stream_id> so the refresh completes successfully and the stream remains accessible. A warning is logged for each affected stream. 2026-03-07 18:33:17 -06:00