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 @@