From 30f5ed11b88409e5f797bdd6a47a038111c6670d Mon Sep 17 00:00:00 2001 From: Mark Rapson Date: Fri, 14 Aug 2026 00:20:48 +0100 Subject: [PATCH] Format scheduled task intervals --- CHANGELOG.md | 6 +++ build/package.player.json | 2 +- build/package.web.json | 2 +- package.json | 2 +- .../routes/settings/background-tasks-page.js | 8 ++++ test/background-tasks-page.test.js | 40 +++++++++++++++++++ 6 files changed, 57 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc4cfe0..72487a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. +## 2.6.27 - 2026-08-14 + +### Fixed + +- Scheduled task intervals now display the most appropriate exact unit, such as seconds, minutes, hours, or days, while keeping the sort order numeric. + ## 2.6.26 - 2026-08-10 ### Changed diff --git a/build/package.player.json b/build/package.player.json index 87e08b3..b8fb850 100644 --- a/build/package.player.json +++ b/build/package.player.json @@ -1,6 +1,6 @@ { "name": "pulse-signage-player", - "version": "2.6.26", + "version": "2.6.27", "private": false, "description": "Pulse Signage player application bundle", "main": "src/common.js", diff --git a/build/package.web.json b/build/package.web.json index ea35f29..24ad31e 100644 --- a/build/package.web.json +++ b/build/package.web.json @@ -1,6 +1,6 @@ { "name": "pulse-signage-web", - "version": "2.6.26", + "version": "2.6.27", "private": false, "description": "Pulse Signage web and bridge application bundle", "main": "src/common.js", diff --git a/package.json b/package.json index 242e7cb..5e4cf15 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse-signage", - "version": "2.6.26", + "version": "2.6.27", "private": false, "description": "Pulse Signage application with MySQL and media storage", "repository": { diff --git a/src/web/routes/settings/background-tasks-page.js b/src/web/routes/settings/background-tasks-page.js index 444c64d..a85b7f0 100644 --- a/src/web/routes/settings/background-tasks-page.js +++ b/src/web/routes/settings/background-tasks-page.js @@ -17,6 +17,14 @@ const DATE_FILTER_FIELDS = { function formatIntervalLabel(intervalMs) { const value = Math.max(1, Number(intervalMs) || 0); + if (value % 86400000 === 0) { + const days = Math.max(1, value / 86400000); + return days === 1 ? 'Every day' : `Every ${days} days`; + } + if (value % 3600000 === 0) { + const hours = Math.max(1, value / 3600000); + return hours === 1 ? 'Every hour' : `Every ${hours} hours`; + } if (value % 60000 === 0) { const minutes = Math.max(1, value / 60000); return minutes === 1 ? 'Every minute' : `Every ${minutes} minutes`; diff --git a/test/background-tasks-page.test.js b/test/background-tasks-page.test.js index ef396a8..5977782 100644 --- a/test/background-tasks-page.test.js +++ b/test/background-tasks-page.test.js @@ -91,4 +91,44 @@ test('background task pages opt into 24-hour timestamps, confirm clearing tasks, assert.match(queueDateSearchHtml, /Example task/); assert.match(scheduledHtml, /data-local-datetime-format="24h"/); assert.match(scheduledHtml, /Player:\s+Player Beta/); +}); + +test('scheduled task interval labels use the largest exact unit while sorting stays numeric', () => { + const scheduledHtml = renderBackgroundTasksScheduledPage( + { + recurringTasks: [ + { + title: 'Hourly task', + key: 'hourly', + intervalMs: 7200000, + metadata: {} + }, + { + title: 'Second task', + key: 'seconds', + intervalMs: 3000, + metadata: {} + }, + { + title: 'Minute task', + key: 'minutes', + intervalMs: 60000, + metadata: {} + } + ], + sort: 'interval', + direction: 'asc', + summary: { counts: {}, total: 3, activeCount: 0, scheduledCount: 3 } + }, + '', + { + permissions: ['scheduled-tasks.allow'] + } + ); + + assert.match(scheduledHtml, /Every 3 seconds/); + assert.match(scheduledHtml, /Every minute/); + assert.match(scheduledHtml, /Every 2 hours/); + assert.ok(scheduledHtml.indexOf('Every 3 seconds') < scheduledHtml.indexOf('Every minute')); + assert.ok(scheduledHtml.indexOf('Every minute') < scheduledHtml.indexOf('Every 2 hours')); }); \ No newline at end of file