Changeset e6ad948 in Klonkt
- Timestamp:
- 06/20/2026 06:47:41 AM (3 months ago)
- Branches:
- main
- Children:
- 08cfdaa
- Parents:
- 57b1843
- Location:
- src
- Files:
-
- 3 edited
-
routes/admin-epk.js (modified) (5 diffs)
-
routes/epk.js (modified) (1 diff)
-
views/pages/admin-epk.ejs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/admin-epk.js
r57b1843 re6ad948 10 10 11 11 import express from 'express'; 12 import db from '../config/database.js'; 12 13 import { renderPage } from '../middleware/render.js'; 13 14 import { requireGod } from '../middleware/auth.js'; … … 17 18 const router = express.Router(); 18 19 20 const MAX_EPK_TRACKS = 5; 21 19 22 router.get('/', requireGod, (req, res) => { 20 23 const site = res.locals.site; … … 23 26 return res.status(403).send('Perskit is een premium-functie.'); 24 27 } 28 const allTracks = db.prepare( 29 `SELECT id, title, artist FROM audio_tracks WHERE site_id = ? ORDER BY position ASC, created_at ASC` 30 ).all(site.id); 31 let chosen = []; 32 try { const r = JSON.parse(getSetting('epk_tracks_' + site.id, '') || '[]'); if (Array.isArray(r)) chosen = r; } catch (e) {} 25 33 renderPage(req, res, 'pages/admin-epk', { 26 34 pageTitle: 'Perskit bewerken', … … 29 37 epkBio: getSetting('epk_bio_' + site.id, '') || '', 30 38 epkContact: getSetting('epk_contact_' + site.id, '') || '', 39 allTracks, 40 chosenTracks: chosen, 41 maxEpkTracks: MAX_EPK_TRACKS, 31 42 success: req.query.success || null, 32 43 }); … … 38 49 setSetting('epk_bio_' + site.id, (req.body.epk_bio || '').toString().slice(0, 1000).trim()); 39 50 setSetting('epk_contact_' + site.id, (req.body.epk_contact || '').toString().slice(0, 300).trim()); 51 // Gekozen nummers: alleen ids van DEZE site, max 5, in de aangeleverde volgorde. 52 let ids = req.body.epk_tracks; 53 if (!Array.isArray(ids)) ids = ids ? [ids] : []; 54 const valid = new Set(db.prepare('SELECT id FROM audio_tracks WHERE site_id = ?').all(site.id).map((r) => r.id)); 55 ids = ids.map(String).filter((id) => valid.has(id)).slice(0, MAX_EPK_TRACKS); 56 setSetting('epk_tracks_' + site.id, JSON.stringify(ids)); 40 57 res.redirect('/admin/epk?success=' + encodeURIComponent('Perskit opgeslagen')); 41 58 }); -
src/routes/epk.js
r57b1843 re6ad948 25 25 if (!site) return next(); 26 26 27 // Top 10 meest beluisterde nummers (op play_count), niet zomaar de eerste paar. 28 const tracks = db.prepare( 29 `SELECT title, artist, duration, cover_url, COALESCE(play_count, 0) AS plays 30 FROM audio_tracks 31 WHERE site_id = ? 32 ORDER BY plays DESC, position ASC, created_at ASC 33 LIMIT 10` 34 ).all(site.id); 27 // Nummers op de perskit: een door de admin GEKOZEN selectie (max 5, in eigen 28 // volgorde) als die is ingesteld; anders automatisch de top 5 meest beluisterde. 29 let chosenIds = []; 30 try { 31 const raw = JSON.parse(getSetting('epk_tracks_' + site.id, '') || '[]'); 32 if (Array.isArray(raw)) chosenIds = raw.filter((x) => typeof x === 'string').slice(0, 5); 33 } catch (e) { /* ongeldige JSON → val terug op top */ } 34 35 let tracks; 36 if (chosenIds.length) { 37 const ph = chosenIds.map(() => '?').join(','); 38 const rows = db.prepare( 39 `SELECT id, title, artist, duration, cover_url, COALESCE(play_count, 0) AS plays 40 FROM audio_tracks WHERE site_id = ? AND id IN (${ph})` 41 ).all(site.id, ...chosenIds); 42 const byId = new Map(rows.map((r) => [r.id, r])); 43 tracks = chosenIds.map((id) => byId.get(id)).filter(Boolean); // behoud gekozen volgorde 44 } else { 45 tracks = db.prepare( 46 `SELECT title, artist, duration, cover_url, COALESCE(play_count, 0) AS plays 47 FROM audio_tracks 48 WHERE site_id = ? 49 ORDER BY plays DESC, position ASC, created_at ASC 50 LIMIT 5` 51 ).all(site.id); 52 } 35 53 36 54 const posts = db.prepare( -
src/views/pages/admin-epk.ejs
r57b1843 re6ad948 26 26 value="<%= epkContact %>"> 27 27 </label> 28 29 <div class="set-field"> 30 <span>Nummers op de perskit <small>(kies er max <%= maxEpkTracks %>; laat leeg voor automatisch de top <%= maxEpkTracks %> meest beluisterd)</small></span> 31 <% if (!allTracks.length) { %> 32 <p class="set-help" style="margin:0">Nog geen nummers — voeg eerst audio toe in Beheer → Audio.</p> 33 <% } else { %> 34 <div class="epk-track-pick" data-max="<%= maxEpkTracks %>"> 35 <% allTracks.forEach(function(t){ %> 36 <label class="epk-pick-item"> 37 <input type="checkbox" name="epk_tracks" value="<%= t.id %>" <%= chosenTracks.indexOf(t.id) >= 0 ? 'checked' : '' %>> 38 <span class="epk-pick-title"><%= t.title || '(zonder titel)' %></span> 39 <% if (t.artist) { %><span class="epk-pick-artist"><%= t.artist %></span><% } %> 40 </label> 41 <% }); %> 42 </div> 43 <% } %> 44 </div> 45 28 46 <button type="submit" class="btn btn-primary">Opslaan</button> 29 47 </form> … … 51 69 .admin-page .set-field textarea:focus { outline: 2px solid var(--accent); outline-offset: -1px; border-color: var(--accent); } 52 70 .admin-page .set-form .btn { align-self: flex-start; } 71 .admin-page .epk-track-pick { display: flex; flex-direction: column; gap: 2px; max-height: 300px; overflow-y: auto; border: 1px solid var(--rule); border-radius: 8px; padding: 4px; } 72 .admin-page .epk-pick-item { display: flex; align-items: center; gap: 0.5rem; padding: 0.45rem 0.5rem; border-radius: 6px; cursor: pointer; } 73 .admin-page .epk-pick-item:hover { background: var(--paper); } 74 .admin-page .epk-pick-item input { width: auto; flex: 0 0 auto; } 75 .admin-page .epk-pick-title { font-weight: 600; } 76 .admin-page .epk-pick-artist { color: var(--ink-muted, var(--ink-soft)); font-size: 0.85rem; } 77 .admin-page .epk-pick-item input:disabled ~ .epk-pick-title { opacity: 0.45; } 53 78 </style> 79 <script> 80 (function () { 81 var box = document.querySelector('.epk-track-pick'); 82 if (!box) return; 83 var max = parseInt(box.dataset.max, 10) || 5; 84 function sync() { 85 var checks = box.querySelectorAll('input[type=checkbox]'); 86 var n = box.querySelectorAll('input[type=checkbox]:checked').length; 87 checks.forEach(function (c) { c.disabled = (!c.checked && n >= max); }); 88 } 89 box.addEventListener('change', sync); 90 sync(); 91 })(); 92 </script>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)