From 440b8683f77c9378cd0842e6d51e994239a62446 Mon Sep 17 00:00:00 2001 From: Mark Rapson Date: Tue, 14 Jul 2026 14:49:08 +0100 Subject: [PATCH] Make screen slugs editable --- src/data/screens.js | 10 ++++++++-- src/webui.js | 7 +++++-- src/webui/public/js/slide-form.js | 1 + src/webui/views/screens/add.hbs | 5 ++++- src/webui/views/screens/edit.hbs | 5 ++++- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/data/screens.js b/src/data/screens.js index 2f3de3e..a2a2e30 100644 --- a/src/data/screens.js +++ b/src/data/screens.js @@ -7,12 +7,18 @@ function slugify(value) { .replace(/-{2,}/g, '-'); } -async function uniqueScreenSlug(pool, baseSlug) { +async function uniqueScreenSlug(pool, baseSlug, excludeId) { const start = baseSlug || `screen-${Date.now()}`; let candidate = start; let counter = 2; while (true) { - const [rows] = await pool.query('SELECT id FROM screens WHERE slug = ?', [candidate]); + const params = [candidate]; + let sql = 'SELECT id FROM screens WHERE slug = ?'; + if (excludeId !== undefined && excludeId !== null) { + sql += ' AND id <> ?'; + params.push(excludeId); + } + const [rows] = await pool.query(sql, params); if (!rows.length) { return candidate; } diff --git a/src/webui.js b/src/webui.js index 1bb7ecb..5a5c974 100644 --- a/src/webui.js +++ b/src/webui.js @@ -1457,8 +1457,9 @@ async function start() { if (!name) { return res.status(400).send('Screen name is required.'); } + const slugInput = String(req.body.slug || '').trim(); const playlistId = req.body.playlist_id ? Number(req.body.playlist_id) : null; - const slug = await common.uniqueScreenSlug(pool, common.slugify(name)); + const slug = await common.uniqueScreenSlug(pool, common.slugify(slugInput || name)); const actorId = getAuditUserId(req); await pool.query('INSERT INTO screens (name, slug, playlist_id, created_by, modified_by) VALUES (?, ?, ?, ?, ?)', [name, slug, playlistId, actorId, actorId]); res.redirect('/admin/screens?message=' + encodeURIComponent('Screen created.')); @@ -1477,8 +1478,10 @@ async function start() { if (!screen) { return res.status(404).send('Screen not found'); } + const slugInput = String(req.body.slug || '').trim(); const playlistId = req.body.playlist_id ? Number(req.body.playlist_id) : null; - await pool.query('UPDATE screens SET name = ?, playlist_id = ?, modified_by = ? WHERE id = ?', [name, playlistId, getAuditUserId(req), screen.id]); + const slug = await common.uniqueScreenSlug(pool, common.slugify(slugInput || name), screen.id); + await pool.query('UPDATE screens SET name = ?, slug = ?, playlist_id = ?, modified_by = ? WHERE id = ?', [name, slug, playlistId, getAuditUserId(req), screen.id]); res.redirect('/admin/screens?edit=' + screen.id + '&message=' + encodeURIComponent('Screen updated.')); } catch (error) { next(error); diff --git a/src/webui/public/js/slide-form.js b/src/webui/public/js/slide-form.js index 914734a..a91fecf 100644 --- a/src/webui/public/js/slide-form.js +++ b/src/webui/public/js/slide-form.js @@ -538,6 +538,7 @@ } showToast(savedMessage || 'Saved slide.'); + window.location.href = response.url || slideForm.action; } finally { submitting = false; } diff --git a/src/webui/views/screens/add.hbs b/src/webui/views/screens/add.hbs index a2e56ef..f673b94 100644 --- a/src/webui/views/screens/add.hbs +++ b/src/webui/views/screens/add.hbs @@ -7,10 +7,13 @@
-
+ + +