Files
tuliprox/frontend/scss/app/components/_table.scss
T
euzuandGitHub 16d32d1298 DVR Feature (#819)
feat: complete DVR and improve streaming, security, configuration, and UI

Complete the Digital Video Recorder subsystem and add a broad set of
reliability, security, streaming, configuration, processing, and Web UI
improvements across Tuliprox.

DVR:

* complete live recording and provider-aware VOD download support
* add recording queue, workers, scheduling, and recurring recording rules
* add conflict detection and capacity-aware scheduling
* add pause, resume, retry, edit, cancel, and delete workflows
* add recording quotas and configurable retention policies
* add crash recovery and startup reconciliation
* add durable lifecycle notifications with per-channel retries
* add DVR health monitoring and diagnostic tooling
* add secure access to recordings, thumbnails, and subtitles
* add WebSocket notifications for recording and rule changes
* add Web UI management for recordings, rules, progress, and task state
* add RBAC, configuration, documentation, and i18n support

Streaming and HLS:

* fix shared-stream idle handling and release dead provider streams correctly
* stop tee streams when both client and cache consumers are gone
* cancel provisioning probes when client streams terminate
* fix transient HLS origin work accounting and intermittent 503 responses
* make stream buffer byte limits configurable
* make shared subscriber idle timeout configurable
* make initial HLS manifest wait timeout configurable
* add configurable TS chunk packet count
* add configurable HLS refresh failure backoff
* centralize redirect limits and retry jitter handling
* improve provider DNS refresh behavior and failover tuning
* preserve UTF-8 characters in catchup templates
* improve stream history validation and persistence error handling

Security:

* use constant-time credential comparisons
* harden library and media path handling against traversal and symlink escapes
* only trust forwarded client IP headers from configured trusted proxies
* redact credentials and sensitive URL data from logs
* reject invalid authentication status-code configuration
* deny users with unresolved plans or invalid content filters
* improve authentication error handling across proxy and HLS endpoints

Configuration and reliability:

* prevent invalid api-proxy.yml reloads from terminating the running server
* fully validate API proxy configuration before persisting changes
* log configuration and EPG cleanup failures instead of silently discarding them
* keep the last valid configuration active after failed hot reloads
* align backend and shared media-server validation
* remove duplicated path and normalization logic
* improve DNS-store recovery and Windows rename fallback handling
* reject invalid duration, timestamp, and numeric conversions safely
* fix playlist bouquet save error handling
* fix provider record update detection
* fix cache boundary handling
* improve startup and persistence failure diagnostics

Filtering, search, sorting, and processing:

* add field-scoped playlist explorer search
* centralize shared stream-history search field definitions
* extend the filter DSL with string, set, and numeric operators
* add EPG ID, channel number, and detected quality as filterable fields
* add filter dry-run preview API with match statistics and samples
* report filter syntax errors with line and column information
* add natural numeric-aware sorting
* add quality-aware channel deduplication
* add accent-independent deduplication
* move natural sorting and quality detection helpers into shared code
* persist explorer search-field selection across reloads

User plans and content access:

* add reusable API user plans for capability tiers
* support inherited cluster and connection limits with per-user overrides
* add plan-level and user-level content filters
* enforce content filters across Xtream, M3U, direct playback, resource access,
  stream info, short EPG, categories, and XMLTV
* add trial plans with automatic expiry and Trial status
* add plan selection and content filtering to the user editor
* add full plan management to the API configuration Web UI
* migrate the API user database to schema V7 with plan and filter persistence

Web UI and accessibility:

* add live logging console to the stats page
* improve login error handling and prevent duplicate authentication requests
* add keyboard navigation to tabs, menus, tables, and search
* add ARIA roles, labels, validation state, and live-region feedback
* add confirmation dialogs for destructive actions
* add unsaved-change warnings and Ctrl/Cmd+S shortcuts
* add loading, progress, empty, and in-flight states across views
* improve dropdown and single-selection behavior
* add clipboard and credential-copy helpers
* persist table pagination and explorer search preferences
* improve error recovery when UI context providers are unavailable
* remove multiple panic-prone unwrap and browser API paths
* replace remaining hardcoded UI strings with translation keys

Maintenance:

* resolve backend and frontend compiler and Clippy warnings
* update packages and test fixtures
* consolidate duplicated helpers and validation logic
* improve documentation for configuration, filters, plans, DVR, and REST APIs
* add and update tests for migrations, filters, deduplication, sorting,
  configuration, streaming, and accessibility behavior
2026-08-21 14:50:12 +02:00

155 lines
3.1 KiB
SCSS

.tp__table {
display: flex;
flex-flow: column;
gap: var(--gap-default);
background-color: var(--card-background-color);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
overflow: hidden;
fill: var(--modest-text-color);
&__container {
display: flex;
flex-flow: column;
padding-right: 1px;
overflow: auto; pointer-events: auto;
touch-action: pan-x pan-y;
-webkit-overflow-scrolling: touch;
}
&__nowrap {
white-space: nowrap;
}
&__table {
width: 100%;
border-collapse: collapse;
position: relative;
thead {
tr {
th {
position: sticky;
top: 0;
z-index: 2;
font-size: var(--font-size-md);
font-weight: bold;
//text-align: center;
padding: var(--padding-mini);
line-height: 1.2;
background-color: var(--table-header-background-color);
box-shadow: inset 0 -1px 0 var(--border-color);
&:not(:last-child) {
border-right: 1px solid var(--border-color);
}
svg,
.svg-icon {
display: block;
width: 1rem;
height: 1rem;
}
}
.tp__table-header {
display: flex;
flex-flow: row;
gap: var(--gap-small);
align-items: center;
justify-content: center;
cursor: pointer;
width: 100%;
background: transparent;
border: 0;
margin: 0;
padding: 0;
color: inherit;
font: inherit;
svg,
.svg-icon {
display: block;
width: 1rem;
height: 1rem;
}
}
}
}
tbody {
tr {
&:nth-child(even) {
background-color: var(--table-alternate-background-color);
}
&:not(:last-child) {
border-bottom: 1px solid var(--border-color);
}
td {
height: fit-content;
vertical-align: top;
padding: var(--padding-mini);
/* cell border
&:not(:last-child) {
border-right: 1px solid var(--border-color);
}
*/
svg,
.svg-icon {
display: block;
width: 1rem;
height: 1rem;
}
}
}
}
}
&__cell--center {
text-align: center;
}
&__number-cell {
text-align: right;
}
}
.tp__paged-table {
&__controls {
display: flex;
flex-flow: column;
gap: var(--gap-default);
padding: var(--padding-default) 0;
}
&__paging-info {
display: flex;
flex-flow: row nowrap;
gap: var(--gap-larger);
align-items: center;
}
&__size {
display: flex;
flex-flow: row nowrap;
gap: var(--gap-default);
align-items: center;
}
&__buttons {
display: flex;
flex-flow: row nowrap;
gap: var(--gap-default);
align-items: center;
}
&__pages {
display: flex;
flex-flow: row nowrap;
gap: var(--gap-default);
align-items: center;
}
}