source: Klonkt/src/views/pages/admin-videos.ejs@ bec9001

main
Last change on this file since bec9001 was bec9001, checked in by Robin <roboburr@…>, 3 weeks ago

Beheer: de vijf mediapagina's op een gedeelde ax-romp

admin/media, media/videos en admin/listeners vielen buiten het
ax-*-systeem waar audio en playlists al op zaten. Media en video's
stonden volledig op inline styles, listeners had eigen .lis-*-klassen in
een eigen style-blok. Drie ontwerpen achter vijf tabs.

Nu alle vijf dezelfde romp: dezelfde breedte, dezelfde kop met tagline,
tabs op dezelfde plek (na de terugknop, voor de kop) en dezelfde
terugknop-sleutel -- listeners gebruikte aaud.back waar de rest
nav.admin heeft.

De primitieven staan in partials/admin-styles.ejs. Ze stonden vijf keer
los: .ax-header, .ax-header h1, .ax-back en .ax-back:hover byte voor byte
gelijk in vijf bestanden, .ax-flash-ok/-err in vier. Gelijktrekken zonder
een gedeelde plek is eenmalig -- de volgende die een knop aanpast raakt
een van de kopieen. admin-playlists schreef zelf al boven zijn blok
waarom het misging: "both pages get refreshed independently".

De tabbalk droeg zijn eigen opmaak inline mee en kon daardoor niet
meebewegen; die zit nu ook in de partial. De actieve tab is
aria-current="page" in plaats van een klasse: dat is wat een schermlezer
nodig heeft, en de opmaak haakt er net zo goed op.

audio en playlists zijn NIET aangeraakt. Hun blokken bevatten @media- en
paginaeigen regels door elkaar, en die mechanisch scheiden met een regex
is precies het soort ingreep dat niet faalt maar liegt. Aparte bead.

scripts/render-admin-views.mjs rendert de drie views gevuld en leeg. De
suite stond op 1040 groen terwijl de nieuwe partial niet eens kon parsen
-- hij raakt geen enkele view, dus faalt hij nooit op opmaak.

Co-Authored-By: Claude Opus 5 <noreply@…>

  • Property mode set to 100644
File size: 2.4 KB
Line 
1<%# Beheer -> Media -> Video's (Robins opdracht, 30-7): de video's die via C2S
2 binnenkwamen (Shaers composer, de reddingsboei), met gebruik en opruiming.
3
4 De voorvertoning is de video zelf met preload="metadata", zodat de browser
5 het eerste beeld als miniatuur toont tot echte poster-generatie landt
6 (bead: ffmpeg ontbreekt).
7
8 Zelfde romp als de andere mediapagina's; stond hiervoor op inline styles. %>
9<%- include('../partials/admin-styles') %>
10<div class="container ax-page">
11
12 <p><a href="/admin" class="ax-btn">&larr; <%= t('nav.admin') %></a></p>
13 <%- include('../partials/media-tabs', { active: 'videos', audioOn: audioOn }) %>
14 <header class="ax-header">
15 <div>
16 <h1><%= t('admin.t_media') %></h1>
17 <p class="ax-tagline"><%= items.length %> <%= t('admin.videos_count') %></p>
18 </div>
19 </header>
20
21 <% if (success) { %><div class="ax-flash ax-flash-ok"><%= success %></div><% } %>
22
23 <% if (!items.length) { %>
24 <div class="ax-empty">
25 <div class="ax-empty-icon">&#127916;</div>
26 <p><%= t('admin.videos_empty') %></p>
27 </div>
28 <% } else { %>
29 <div class="ax-grid" style="--ax-tile:220px;">
30 <% items.forEach(function(it){ %>
31 <div class="ax-tile media-card" data-file="<%= it.file %>">
32 <div class="ax-tile-media" style="aspect-ratio:16/10;background:#000;">
33 <video src="<%= it.url %>" preload="metadata" controls playsinline style="height:100%;object-fit:contain;"></video>
34 <% if (!it.usedCount) { %><span class="ax-tile-badge"><%= t('admin.media_unused') %></span><% } %>
35 </div>
36 <div class="ax-tile-body">
37 <div class="ax-tile-meta" style="word-break:break-all;"><%= it.file %></div>
38 <div class="ax-tile-meta"><%= it.kb %> KB &middot; <%= it.usedCount %>&times;</div>
39 <div class="ax-tile-actions">
40 <button type="button" class="ax-btn ax-btn-sm" data-copy="<%= it.url %>"><%= t('admin.media_copy') %></button>
41 <% if (!it.usedCount) { %>
42 <button type="button" class="ax-btn ax-btn-sm ax-btn-danger" data-del="<%= it.file %>">&#128465;</button>
43 <% } %>
44 </div>
45 </div>
46 </div>
47 <% }) %>
48 </div>
49 <% } %>
50</div>
51
52<%# Het script staat in assets/js/mod/admin-videos.js; de gegevens via partials/page-data.ejs (shaer-bqr). %>
53<%- include('../partials/page-data', { pageData: { copy: t('admin.media_copy'), delC: t('admin.videos_del_confirm') } }) %>
Note: See TracBrowser for help on using the repository browser.