diff --git a/package.json b/package.json index 942715a..76c0064 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse-signage", - "version": "1.4.2", + "version": "1.4.5", "private": false, "description": "Pulse Signage application with MySQL and media uploads", "repository": { diff --git a/src/db.js b/src/db.js index 258c185..9b1f1e1 100644 --- a/src/db.js +++ b/src/db.js @@ -202,6 +202,9 @@ function getLegacyPermissionTargets(permissionKey) { const sectionKey = parts[0]; const actionKey = parts[1]; + if (normalizedKey === 'screens.allow') { + return ['clients.allow']; + } if (actionKey === 'view') { return [`${sectionKey}.read`]; } @@ -265,7 +268,7 @@ async function backfillLegacyRbacSchema(pool) { for (const row of rolePermissionRows || []) { const currentKey = getPermissionKey(row); const targetKeys = getLegacyPermissionTargets(currentKey); - if (currentKey.endsWith('.view') || currentKey.endsWith('.manage')) { + if (currentKey.endsWith('.view') || currentKey.endsWith('.manage') || currentKey === 'screens.allow') { for (const targetKey of targetKeys) { addRoleTarget(Number(row.role_id), targetKey); } @@ -276,7 +279,7 @@ async function backfillLegacyRbacSchema(pool) { for (const row of permissionRows || []) { const currentKey = getPermissionKey(row); - if (currentKey.endsWith('.view') || currentKey.endsWith('.manage')) { + if (currentKey.endsWith('.view') || currentKey.endsWith('.manage') || currentKey === 'screens.allow') { legacyPermissionRowIds.push(Number(row.id)); } } diff --git a/src/rbac.js b/src/rbac.js index 67d72ea..1589ee9 100644 --- a/src/rbac.js +++ b/src/rbac.js @@ -27,8 +27,7 @@ const PERMISSION_SECTIONS = [ actions: [ { key: 'read', name: 'Read', description: 'View the screen list and open screen details.' }, { key: 'create', name: 'Create', description: 'Create new screens.' }, - { key: 'edit', name: 'Update', description: 'Edit screens and send screen commands.' }, - { key: 'allow', name: 'Allow', description: 'Use the connected client actions on the screen page.' }, + { key: 'edit', name: 'Update', description: 'Edit screens.' }, { key: 'delete', name: 'Delete', description: 'Delete screens.' } ] }, diff --git a/src/web.js b/src/web.js index b1cecd5..ff0b452 100644 --- a/src/web.js +++ b/src/web.js @@ -12,7 +12,7 @@ const registerAdminPagesRoutes = require('./web/routes/admin-pages'); const registerAdminAccountRoutes = require('./web/routes/admin-account'); const registerAdminUsersRoutes = require('./web/routes/admin-users'); const registerAdminManageRoutes = require('./web/routes/admin-manage'); -const registerAdminScreenCommandRoutes = require('./web/routes/admin-screen-commands'); +const registerAdminScreenCommandRoutes = require('./web/routes/admin-client-commands'); const registerAdminContentRoutes = require('./web/routes/admin-content'); const { createWebBootstrap } = require('./web/bootstrap'); const { requirePermission } = require('./rbac'); diff --git a/src/web/public/js/dashboard/dashboard-page.js b/src/web/public/js/dashboard/dashboard-page.js index 3869476..54dd669 100644 --- a/src/web/public/js/dashboard/dashboard-page.js +++ b/src/web/public/js/dashboard/dashboard-page.js @@ -91,7 +91,7 @@ var reloadConfirmMessage = 'Reloading will restart the player page. Continue?'; var blackoutCommandValue = blackout ? 'false' : 'true'; - return '
'; + return ''; } function updateClientActionCell(cell, client) { @@ -119,7 +119,7 @@ if (connectionInput) { connectionInput.value = client.id || ''; } - pauseForm.action = '/admin/screens/' + encodeURIComponent(client.screen_slug) + '/commands'; + pauseForm.action = '/admin/clients/' + encodeURIComponent(client.screen_slug) + '/commands'; } var reloadButton = cell.querySelector('button[data-action="reload"]'); @@ -132,7 +132,7 @@ if (reloadInput) { reloadInput.value = client.id || ''; } - reloadForm.action = '/admin/screens/' + encodeURIComponent(client.screen_slug) + '/commands'; + reloadForm.action = '/admin/clients/' + encodeURIComponent(client.screen_slug) + '/commands'; reloadForm.setAttribute('data-confirm-message', 'Reloading will restart the player page. Continue?'); } } @@ -162,7 +162,7 @@ if (blackoutConnectionInput) { blackoutConnectionInput.value = client.id || ''; } - blackoutForm.action = '/admin/screens/' + encodeURIComponent(client.screen_slug) + '/commands'; + blackoutForm.action = '/admin/clients/' + encodeURIComponent(client.screen_slug) + '/commands'; } var previousButton = cell.querySelector('button[data-action="previous"]'); @@ -182,7 +182,7 @@ if (previousConnectionInput) { previousConnectionInput.value = client.id || ''; } - previousForm.action = '/admin/screens/' + encodeURIComponent(client.screen_slug) + '/commands'; + previousForm.action = '/admin/clients/' + encodeURIComponent(client.screen_slug) + '/commands'; } var nextButton = cell.querySelector('button[data-action="next"]'); @@ -202,7 +202,7 @@ if (nextConnectionInput) { nextConnectionInput.value = client.id || ''; } - nextForm.action = '/admin/screens/' + encodeURIComponent(client.screen_slug) + '/commands'; + nextForm.action = '/admin/clients/' + encodeURIComponent(client.screen_slug) + '/commands'; } } @@ -416,7 +416,7 @@ body.append('deviceId', String(deviceId || '').trim()); body.append('clientName', String(clientName || '').trim()); - return fetch('/admin/screens/' + encodeURIComponent(String(screenSlug || '').trim()) + '/commands', { + return fetch('/admin/clients/' + encodeURIComponent(String(screenSlug || '').trim()) + '/commands', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', diff --git a/src/web/routes/admin-screen-commands.js b/src/web/routes/admin-client-commands.js similarity index 98% rename from src/web/routes/admin-screen-commands.js rename to src/web/routes/admin-client-commands.js index 266b642..2f716ad 100644 --- a/src/web/routes/admin-screen-commands.js +++ b/src/web/routes/admin-client-commands.js @@ -6,7 +6,7 @@ module.exports = function registerAdminScreenCommandRoutes(app, deps) { const withClientNameReservation = deps.withClientNameReservation; const requirePermission = deps.requirePermission; - app.post('/admin/screens/:slug/commands', requirePermission('screens.allow'), async function (req, res, next) { + app.post('/admin/clients/:slug/commands', requirePermission('clients.allow'), async function (req, res, next) { try { const slug = String(req.params.slug || '').trim(); const command = String((req.body && req.body.command) || req.query.command || '').trim().toLowerCase(); diff --git a/src/web/views/clients/list.hbs b/src/web/views/clients/list.hbs index 381d465..7143cbd 100644 --- a/src/web/views/clients/list.hbs +++ b/src/web/views/clients/list.hbs @@ -10,7 +10,7 @@| Client | @@ -19,7 +19,7 @@IP | Viewport | Connected/Updated | - {{#if (hasPermission currentUser 'screens.allow')}}Actions | {{/if}} + {{#if (hasPermission currentUser 'clients.allow')}}Actions | {{/if}}
-
-
-
-
- |
|---|