mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-12 12:06:16 -08:00
feat(settings): search settings from the header and the command palette
The header search on the Settings page was shown but disabled. It now searches a shared index of all 56 settings rows by translated title, description and English synonyms, replaces the section page with ranked results, and opens a result by scrolling to, focusing and briefly highlighting its row. Enter opens the best match, and the section navigation shows per-section match counts. The command palette gains a "Settings" group that lists the best six matches for a non-empty query, so any setting is one Ctrl/Cmd+K away. Rows hidden by the current form state fall back to the control that reveals them; rows the runtime cannot render are never returned. The index ships through a new @iptvnator/workspace/shell/util/settings-search sub-entrypoint so it stays out of the eager bundle, and a registry spec keeps it in step with the section templates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
587e19541f
commit
3b3357713f
75 files changed
+3124
-311
No files matched your search
@@ -9,7 +9,7 @@
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="video-player">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.VIDEO_PLAYER_LABEL' | translate }}</h4>
|
||||
<p>{{ 'SETTINGS.VIDEO_PLAYER_DESCRIPTION' | translate }}</p>
|
||||
@@ -35,7 +35,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="stream-format">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.STREAM_FORMAT' | translate }}</h4>
|
||||
<p>{{ 'SETTINGS.STREAM_FORMAT_DESCRIPTION' | translate }}</p>
|
||||
@@ -67,6 +67,7 @@
|
||||
@if (isWebPlayerSelected()) {
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="web-player-shared-controls"
|
||||
data-test-id="web-player-shared-controls-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -91,7 +92,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting-item" data-test-id="player-ambient-mode-setting">
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="player-ambient-mode"
|
||||
data-test-id="player-ambient-mode-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
<h4>
|
||||
{{ 'SETTINGS.PLAYER_AMBIENT_MODE' | translate }}
|
||||
@@ -109,7 +114,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting-item" data-test-id="player-up-next-rail-setting">
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="player-up-next-rail"
|
||||
data-test-id="player-up-next-rail-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
<h4>
|
||||
{{ 'SETTINGS.PLAYER_UP_NEXT_RAIL' | translate }}
|
||||
@@ -131,6 +140,7 @@
|
||||
@if (supportsFullscreenChannelPanel()) {
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="fullscreen-channel-panel"
|
||||
data-test-id="fullscreen-channel-panel-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -159,7 +169,11 @@
|
||||
<!-- Only the web players raise a playback diagnostic, so under MPV, VLC
|
||||
or Embedded MPV nothing would ever trigger a failover. -->
|
||||
@if (supportsVodMultiSource() && isWebPlayerSelected()) {
|
||||
<div class="setting-item" data-test-id="vod-auto-failover-setting">
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="vod-auto-failover"
|
||||
data-test-id="vod-auto-failover-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
<h4>
|
||||
{{ 'SETTINGS.VOD_AUTO_FAILOVER' | translate }}
|
||||
@@ -181,6 +195,7 @@
|
||||
@if (supportsManagedExternalPlayers() && isExternalPlayerSelected()) {
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="external-player-double-click"
|
||||
data-test-id="external-player-double-click-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -206,7 +221,7 @@
|
||||
}
|
||||
|
||||
@if (isDesktop()) {
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="show-external-playback-bar">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.SHOW_EXTERNAL_PLAYBACK_BAR' | translate }}</h4>
|
||||
<p>
|
||||
@@ -226,6 +241,7 @@
|
||||
@if (frameCopyAvailable() || form().value.embeddedMpvFrameCopy) {
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="embedded-mpv-frame-copy"
|
||||
data-test-id="embedded-mpv-frame-copy-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -262,6 +278,7 @@
|
||||
@if (form().value.player === 'embedded-mpv') {
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="embedded-mpv-extra-options"
|
||||
data-test-id="embedded-mpv-extra-options-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -332,6 +349,7 @@
|
||||
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="embedded-mpv-auto-reconnect"
|
||||
data-test-id="embedded-mpv-auto-reconnect-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -354,7 +372,11 @@
|
||||
</div>
|
||||
}
|
||||
|
||||
<div class="setting-item" data-test-id="recording-folder-setting">
|
||||
<div
|
||||
class="setting-item"
|
||||
data-setting-id="recording-folder"
|
||||
data-test-id="recording-folder-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.RECORDING_FOLDER_LABEL' | translate }}</h4>
|
||||
<p>
|
||||
@@ -391,7 +413,7 @@
|
||||
@if (
|
||||
supportsExternalPlayerPathSettings() && form().value.player === 'mpv'
|
||||
) {
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="mpv-player-path">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.MPV_PLAYER_PATH_LABEL' | translate }}</h4>
|
||||
<p>
|
||||
@@ -418,6 +440,7 @@
|
||||
|
||||
<div
|
||||
class="setting-item setting-item--external-player-arguments"
|
||||
data-setting-id="mpv-player-arguments"
|
||||
data-test-id="mpv-player-arguments-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -449,7 +472,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="mpv-reuse-instance">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.MPV_REUSE_INSTANCE_LABEL' | translate }}</h4>
|
||||
<p>
|
||||
@@ -465,7 +488,7 @@
|
||||
@if (
|
||||
supportsExternalPlayerPathSettings() && form().value.player === 'vlc'
|
||||
) {
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="vlc-player-path">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.VLC_PLAYER_PATH_LABEL' | translate }}</h4>
|
||||
<p>
|
||||
@@ -489,6 +512,7 @@
|
||||
|
||||
<div
|
||||
class="setting-item setting-item--external-player-arguments"
|
||||
data-setting-id="vlc-player-arguments"
|
||||
data-test-id="vlc-player-arguments-setting"
|
||||
>
|
||||
<div class="setting-item__meta">
|
||||
@@ -520,7 +544,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="setting-item">
|
||||
<div class="setting-item" data-setting-id="vlc-reuse-instance">
|
||||
<div class="setting-item__meta">
|
||||
<h4>{{ 'SETTINGS.VLC_REUSE_INSTANCE_LABEL' | translate }}</h4>
|
||||
<p>
|
||||
|
||||
Reference in new issue
Block a user