feat: streamer drag-reorder + bulk-queue checkboxes on VOD cards
Two complete UX features. 1. Streamer list is now drag-and-drop reorderable. The order is persisted via the existing config.streamers save path, so it survives a restart. The dragstart-then-click race that would normally fire selectStreamer when the drag is released is suppressed via a 50ms post-dragend window. 2. VOD cards each get a top-left checkbox. Selecting >=1 card opens a sticky action bar above the grid with "+ Queue" and "Clear" buttons. Bulk-add iterates the selected URLs and calls addToQueue for each, with a single per-batch toast summarizing the outcome. Selection is cleared on streamer switch (per-streamer mental model) but not persisted across reloads (stale selection across restarts is more confusing than helpful). Implementation notes: - Click-on-checkbox is handled by a single delegated listener on vodGrid (initVodGridSelectionDelegation), not per-card inline handlers. The card .selected class is toggled in place to avoid re-rendering the entire grid on every check. - Streamer items are rebuilt from createElement so the existing `event.stopPropagation(); removeStreamer(...)` inline pattern is replaced with a real listener; defends against unusual characters in streamer names even though Cycle 4 added the 4-25-char alphanumeric regex. - styles.css: position: relative on .vod-card for the absolute- positioned checkbox; .selected ring highlight; .dragging opacity for streamer drag. - DE / EN locale strings for the bulk-bar; setText / updateBar hook into applyLanguageToStaticUI so the bar count updates on language switch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
6c3dc3d1b6
commit
386998deaf
@@ -258,6 +258,12 @@
|
||||
</select>
|
||||
<span id="vodFilterCount" style="color: var(--text-secondary,#888); font-size:12px; min-width:80px;"></span>
|
||||
</div>
|
||||
<div id="vodBulkBar" class="vod-bulk-bar" style="display:none; align-items:center; gap:10px; padding:8px 12px; background: rgba(145, 70, 255, 0.12); border:1px solid rgba(145, 70, 255, 0.4); border-radius:6px; margin-bottom:12px;">
|
||||
<span id="vodBulkCount" style="color: var(--text-primary,#fff); font-size:13px; font-weight:600;">0 selected</span>
|
||||
<span style="flex:1;"></span>
|
||||
<button id="vodBulkAddBtn" type="button" onclick="bulkAddSelectedVodsToQueue()" style="background:#9146FF; border:none; border-radius:6px; padding:6px 14px; color:white; font-size:13px; font-weight:600; cursor:pointer;">+ Queue</button>
|
||||
<button id="vodBulkClearBtn" type="button" onclick="clearVodSelection()" style="background:transparent; border:1px solid var(--border-color,#444); border-radius:6px; padding:6px 12px; color:var(--text-secondary,#888); font-size:13px; cursor:pointer;">Clear</button>
|
||||
</div>
|
||||
<div class="vod-grid" id="vodGrid">
|
||||
<div class="empty-state">
|
||||
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 14l-5-4 5-4v8zm2-8l5 4-5 4V9z"/></svg>
|
||||
|
||||
Reference in New Issue
Block a user