Commit graph

956 commits

Author SHA1 Message Date
SergeantPanda
e2a915f10b Perf: lazy load editable cells on focus, not on unlock. Also don't wait for all channels to load before logging in. 2026-01-26 16:19:07 -06:00
SergeantPanda
716dc25c52 Enhancement: Prevent duplicate fetch requests in ChannelsTable and StreamsTable by tracking last fetch parameters and in-progress status 2026-01-25 21:14:44 -06:00
SergeantPanda
e0829719cd Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into dev 2026-01-25 20:56:48 -06:00
SergeantPanda
9440bbe2ab Performance: Removed unnecessary double wait that was causing fetching of channel data to not run in parallel. 2026-01-25 20:56:41 -06:00
SergeantPanda
e22e003be9 Data loading and initialization refactor: Major performance improvement reducing initial page load time by eliminating duplicate API requests caused by race conditions between authentication flow and route rendering:
- Fixed authentication race condition where `isAuthenticated` was set before data loading completed, causing routes to render and tables to mount prematurely
  - Added `isInitialized` flag to delay route rendering until after all initialization data is loaded via `initData()`
  - Consolidated version and environment settings fetching into centralized settings store with caching to prevent redundant calls
  - Implemented stale fetch prevention in ChannelsTable and StreamsTable using fetch version tracking to ignore outdated responses
  - Fixed filter handling in tables to use `debouncedFilters` consistently, preventing unnecessary refetches
  - Added initialization guards using refs to prevent double-execution of auth and superuser checks during React StrictMode's intentional double-rendering in development
  - Removed duplicate version/environment fetch calls from Sidebar, LoginForm, and SuperuserForm by using centralized store
2026-01-25 19:46:34 -06:00
SergeantPanda
22ecee4f85 Bug Fix: Fix No EPG filter on channels table. 2026-01-23 17:56:21 -06:00
SergeantPanda
5348a4a564 Feature: Editable Channel Table Mode:
- Added a robust inline editing mode for the channels table, allowing users to quickly edit channel fields (name, number, group, EPG, logo) directly in the table without opening a modal.
  - EPG and logo columns now support searchable dropdowns with instant filtering and keyboard navigation for fast assignment.
  - Drag-and-drop reordering of channels enabled when unlocked, with persistent order updates.
  - Group column now uses a searchable dropdown for quick group assignment, matching the UX of EPG and logo selectors.
  - All editable cells provide clear focus, hover, and disabled states for improved accessibility and usability.
  - Table unlock/edit mode toggle with clear visual cues and safe-guarded save logic to prevent accidental edits.
  - All changes are saved via API with optimistic UI updates and error handling.
2026-01-23 16:03:26 -06:00
SergeantPanda
d4f412e352 Bug Fix: Channels table pagination error handling: Fixed "Invalid page" error notifications that appeared when filters reduced the result set while on a page beyond the new total. The API layer now automatically detects invalid page errors, resets pagination to page 1, and retries the request transparently. (Fixes #864)
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-01-23 10:33:14 -06:00
SergeantPanda
3311a38aae Bug fix: Fixed long IP addresses overlapping adjacent columns in stream connection card by adding truncation with tooltips displaying the full address. (Fixes #712)
Some checks failed
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) Has been cancelled
2026-01-21 16:55:25 -06:00
SergeantPanda
e79622f513 adjust arrow to be next to title always. 2026-01-21 16:44:31 -06:00
SergeantPanda
58d14664e3 Enhancement: Adjust layout and spacing in StreamConnectionCard for improved UI consistency and readability 2026-01-21 16:35:00 -06:00
SergeantPanda
e43aba67e7 Enhancement: Refactor StreamConnectionCard layout for improved UI, separating channel name and current program display. 2026-01-20 19:35:19 -06:00
SergeantPanda
2fc2486c34 Enhancement: Added "Hide Stale" filter to quickly hide streams marked as stale.
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-01-20 18:51:13 -06:00
SergeantPanda
c9b454431c Enhancement: Streams table UI: Added descriptive tooltips to top-toolbar buttons (Add to Channel, Create Channels, Filters, Create Stream, Delete) and to row action icons (Add to Channel, Create New Channel). Tooltips now use a 500ms open delay for consistent behavior with existing table header tooltips.
Streams table button labels: Renamed "Remove" to "Delete" and "Add Stream to Channel" to "Add to Channel" for clarity and consistency with other UI terminology.
2026-01-20 18:01:17 -06:00
SergeantPanda
8bc88112aa Enhancement: Improved pill functionality and sizing. 2026-01-20 17:09:28 -06:00
SergeantPanda
0984ec9834 Enhancement: Add Progress bar showing elapsed and remaining time for currently playing programs 2026-01-20 16:31:41 -06:00
SergeantPanda
6b9e6b2d8a tests: Fix frontent tests for new stats features. 2026-01-20 15:38:36 -06:00
SergeantPanda
091c1686e5 Enhancement: Added tooltip on filter pills showing all selected items in a vertical list (up to 10 items, with "+N more" indicator) Also fixed +N not working as intended. 2026-01-20 15:31:34 -06:00
SergeantPanda
c6f359c159 Enhancement: Refactor StreamsTable component to improve MultiSelect UI with tooltips and pill displays for selected groups and M3Us. 2026-01-20 14:56:32 -06:00
SergeantPanda
0e1db3e39c Enhancement: - Stats page enhancements: Added "Now Playing" program information for active streams with smart polling that only fetches EPG data when programs are about to change (not on every stats refresh). Features include:
- Currently playing program title displayed with live broadcast indicator (green Radio icon)
  - Expandable program descriptions via chevron button
  - Efficient POST-based API endpoint (`/api/epg/current-programs/`) supporting batch channel queries or fetching all channels
  - Smart scheduling that fetches new program data 5 seconds after current program ends
  - Only polls when active channel list changes, not on stats refresh
- Channel preview button: Added preview functionality to active stream cards on stats page
2026-01-20 13:37:40 -06:00
SergeantPanda
7fc2cbc45b tests: Fixed frontend tests failing after datetime utility changes. 2026-01-19 20:16:06 -06:00
SergeantPanda
cbcf2ac3c2 Bug fix: - Fixed date/time formatting across all tables to respect user's UI preferences (time format and date format) set in Settings page:
- Stream connection card "Connected" column
  - VOD connection card "Connection Start Time" column
  - M3U table "Updated" column
  - EPG table "Updated" column
  - Users table "Last Login" and "Date Joined" columns
  - All components now use centralized `format()` helper from dateTimeUtils for consistency
- Removed unused imports from table components for cleaner code
2026-01-19 20:07:31 -06:00
SergeantPanda
fec868ac30
Merge pull request #867 from JeffreyBytes/hotfix/streamtable-filter-bug
Fix streams requery to respect table filters
2026-01-18 17:01:29 -06:00
SergeantPanda
39bf57bf40 Bug Fix: Fixed TypeError on streams table load after container restart: Added robust data validation and type coercion to handle malformed filter options during container startup. The streams table MultiSelect components now safely convert group names to strings and filter out null/undefined values, preventing "right-hand side of 'in' should be an object, got number" errors when the backend hasn't fully initialized. API error handling returns safe defaults. 2026-01-18 16:24:26 -06:00
Jeffrey C
4f9088c6fc
Fix: requery streams using table filters 2026-01-17 21:15:02 -06:00
SergeantPanda
a37659eb82
Merge pull request #846 from JeffreyBytes:feature/667
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
feat: Add unassociated streams filter; fix: StreamsTable Group column header overflow
2026-01-17 18:07:50 -06:00
SergeantPanda
0a340e51e2 Enhancement: Add playlist and channel group fetching logic to StreamsTable for improved data management 2026-01-17 18:05:57 -06:00
SergeantPanda
f810142493 Enhancement: Optimize channel filtering in StreamViewSet using Count annotation for improved performance on large datasets. 2026-01-17 17:55:12 -06:00
SergeantPanda
1afb15fb63 Revert change to header sizing. 2026-01-17 16:15:11 -06:00
SergeantPanda
d33d047a94 Enhancement: - Mature content filtering support:
- Added `is_adult` boolean field to both Stream and Channel models with database indexing for efficient filtering and sorting
  - Automatically populated during M3U/XC refresh operations by extracting `is_adult` value from provider data
  - Type-safe conversion supporting both integer (0/1) and string ("0"/"1") formats from different providers
  - UI controls in channel edit form (Switch with tooltip) and bulk edit form (Select dropdown) for easy management
  - XtreamCodes API support with proper integer formatting (0/1) in live stream responses
  - Automatic propagation from streams to channels during both single and bulk channel creation operations
  - Included in serializers for full API support
  - User-level content filtering: Non-admin users can opt to hide mature content channels across all interfaces (web UI, M3U playlists, EPG data, XtreamCodes API) via "Hide Mature Content" toggle in user settings (stored in custom_properties, admin users always see all content)
2026-01-17 15:00:28 -06:00
Jeffrey C
c46e258d3d
Merge branch 'upstream/dev' into feature/667
Resolved conflicts in StreamsTable.jsx:
- Kept API.queryStreamsTable() for automatic store updates
- Preserved unassociated streams filter functionality
- Maintained Group column overflow fix (no sorting icon)
- Added upstream's improved M3U filter options and UX
- Integrated upstream's filter validation logic
- Fixed CSS to allow custom-multiselect headers to expand vertically"
2026-01-17 10:50:30 -06:00
SergeantPanda
19d25f37c6 Bug Fix: Fixed VOD logo cleanup button count: The "Cleanup Unused" button now displays the total count of all unused logos across all pages instead of only counting unused logos on the current page.
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-01-16 14:03:48 -06:00
SergeantPanda
f0267508ff Enhancement: Cascading filters for streams table: Improved filter usability with hierarchical M3U and Group dropdowns. M3U acts as the parent filter showing only active/enabled accounts, while Group options dynamically update to display only groups available in the selected M3U(s). Only enabled M3U's are displayed. (Closes #647)
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-01-15 16:26:06 -06:00
SergeantPanda
0f29cc6e66 fix: Update timezone settings structure in UiSettingsFormUtils tests 2026-01-15 13:52:33 -06:00
SergeantPanda
10169b96c0 feat: Implement table header pin toggle and refactor table preferences management (Closes #663)
- Added functionality to pin/unpin table headers, maintaining visibility while scrolling. This feature is accessible via the channel table menu and UI Settings page, with persistence across sessions.
- Refactored table preferences management by migrating `table-size` preference to a centralized `useTablePreferences` hook, enhancing maintainability and consistency across table components.
2026-01-15 13:40:13 -06:00
Jeffrey C
3ddc6d196b
Fix: restore StreamsTable loading feedback 2026-01-15 10:23:20 -06:00
SergeantPanda
54644df9a3 Test Fix: Fixed SettingsUtils frontend tests for new grouped settings architecture. Updated test suite to properly verify grouped JSON settings (stream_settings, dvr_settings, etc.) instead of individual CharField settings, including tests for type conversions, array-to-CSV transformations, and special handling of proxy_settings and network_access. Frontend tests GitHub workflow now uses Node.js 24 (matching Dockerfile) and runs on both main and dev branch pushes and pull requests for comprehensive CI coverage.
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-01-15 08:55:38 -06:00
Jeffrey C
29395f0538
unify StreamsTable refresh with channels requery 2026-01-14 13:07:08 -06:00
Jeffrey C
77067d4a1d
Fix: refresh streams after bulk channel creation
Signed-off-by: Jeffrey C <990135+JeffreyBytes@users.noreply.github.com>
2026-01-14 13:07:08 -06:00
Jeffrey C
367ee26f9a
Fix unassigned filter not updating after adding streams to channels
When a stream was added to a channel (via "Add to Channel" button, "Create New Channel", or bulk "Add Streams to Channel"), the StreamsTable data wasn't being refetched. This caused streams to remain visible even when the "Only Unassociated" filter was active, despite no longer being unassociated.

Fixed by calling fetchData() after channel updates in:
  - StreamRowActions.addStreamToChannel (single stream to channel)
  - addStreamsToChannel (bulk add to channel)
  - executeSingleChannelCreation (create new channel from stream)

Now streams immediately disappear from the filtered view when associated with a channel.
2026-01-14 13:07:08 -06:00
Jeffrey C
cbde9297ea
Fix StreamsTable Group column header overflow and align with ChannelsTable
The Group column header was overflowing vertically when multiple groups were selected in the MultiSelect filter. Initial attempts to preserve sorting functionality while fixing the overflow were unsuccessful due to how Mantine's MultiSelect rightSection positioning works.

Final solution removes the sorting icon from the Group column to match ChannelsTable's implementation, where channel_group also uses a MultiSelect filter without sorting. This allows the header to properly expand vertically to accommodate selected filter values without overflow.

Resolves #613
2026-01-14 13:07:08 -06:00
Jeffrey C
6a8a94101a
Add filter to show unassociated streams in Streams table
Adds a filter button with 'Only Unassociated' toggle option to the Streams table, allowing users to quickly identify streams from providers that are not associated with any channel. The filter button follows the existing UI pattern from ChannelTableHeader, positioned on the right side of the toolbar. Leverages existing backend support for the unassigned query parameter.

Resolves #667
2026-01-14 13:07:07 -06:00
SergeantPanda
36967c10ce Refactor CoreSettings to use JSONField for value storage and update related logic for proper type handling. Adjusted serializers and forms to accommodate new data structure, ensuring seamless integration across the application. 2026-01-13 12:18:34 -06:00
SergeantPanda
2a3d0db670 Enhancement: Loading feedback for all confirmation dialogs: Extended visual loading indicators across all confirmation dialogs throughout the application. Delete, cleanup, and bulk operation dialogs now show an animated dots loader and disabled state during async operations, providing consistent user feedback for backups (restore/delete), channels, EPGs, logos, VOD logos, M3U accounts, streams, users, groups, filters, profiles, batch operations, and network access changes.
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-01-12 13:53:44 -06:00
SergeantPanda
43636a84d0 Enhancement: Added visual loading indicator to the backup restore confirmation dialog. When clicking "Restore", the button now displays an animated dots loader and becomes disabled, providing clear feedback that the restore operation is in progress. 2026-01-12 13:22:24 -06:00
SergeantPanda
f821dabe8e Enhancement: Users can now rename existing channel profiles and create duplicates with automatic channel membership cloning. Each profile action (edit, duplicate, delete) in the profile dropdown for quick access. 2026-01-12 11:29:33 -06:00
SergeantPanda
564dceb210 Bug fix: Fixed TV Guide loading overlay not disappearing after navigating from DVR page. The fetchRecordings() function in the channels store was setting isLoading: true on start but never resetting it to false on successful completion, causing the Guide page's loading overlay to remain visible indefinitely when accessed after the DVR page.
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-01-11 20:51:26 -06:00
SergeantPanda
e72e0215cb
Merge pull request #841 from nick4810/tests/frontend-unit-tests
Tests/frontend unit tests
2026-01-11 19:20:37 -06:00
SergeantPanda
b8374fcc68 Refactor/Enhancement: Refactored channel numbering dialogs into a unified CreateChannelModal component that now includes channel profile selection alongside channel number assignment for both single and bulk channel creation. Users can choose to add channels to all profiles, no profiles, or specific profiles with mutual exclusivity between special options ("All Profiles", "None") and specific profile selections. Profile selection defaults to the current table filter for intuitive workflow. 2026-01-11 19:05:07 -06:00
SergeantPanda
6b873be3cf Bug Fix: Fixed bulk and manual channel creation not refreshing channel profile memberships in the UI for all connected clients. WebSocket channels_created event now calls fetchChannelProfiles() to ensure profile membership updates are reflected in real-time for all users without requiring a page refresh. 2026-01-11 17:51:00 -06:00