diff --git a/CHANGELOG.md b/CHANGELOG.md index d75ada9..d1165ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. +## 2.20.5 - 2026-10-25 + +### Fixed + +- Fixed playlist schedule summaries showing weekday text and omitting boundary times when dates are returned as `Date` objects. + ## 2.20.4 - 2026-10-25 ### Added diff --git a/build/package.player.json b/build/package.player.json index 972a1ab..1e3fa23 100644 --- a/build/package.player.json +++ b/build/package.player.json @@ -1,6 +1,6 @@ { "name": "pulse-signage-player", - "version": "2.20.4", + "version": "2.20.5", "private": false, "description": "Pulse Signage player application bundle", "engines": { diff --git a/build/package.web.json b/build/package.web.json index 00fe2e7..38747a4 100644 --- a/build/package.web.json +++ b/build/package.web.json @@ -1,6 +1,6 @@ { "name": "pulse-signage-web", - "version": "2.20.4", + "version": "2.20.5", "private": false, "description": "Pulse Signage web and bridge application bundle", "engines": { diff --git a/package-lock.json b/package-lock.json index 9718ca0..0383684 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pulse-signage", - "version": "2.20.4", + "version": "2.20.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pulse-signage", - "version": "2.20.4", + "version": "2.20.5", "dependencies": { "@better-auth/passkey": "^1.7.13", "animate.css": "^4.1.1", diff --git a/package.json b/package.json index dce9782..8226606 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse-signage", - "version": "2.20.4", + "version": "2.20.5", "private": false, "description": "Pulse Signage application with MySQL and media storage", "engines": { diff --git a/src/web/lib/playlist-schedule.js b/src/web/lib/playlist-schedule.js index b4c13ec..27925c0 100644 --- a/src/web/lib/playlist-schedule.js +++ b/src/web/lib/playlist-schedule.js @@ -3,6 +3,14 @@ const DAY_NAMES = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; function normalizeDateTimeValue(value) { + if (value instanceof Date || Object.prototype.toString.call(value) === '[object Date]') { + if (Number.isNaN(value.getTime())) { + return null; + } + const pad = (part) => String(part).padStart(2, '0'); + return value.getFullYear() + '-' + pad(value.getMonth() + 1) + '-' + pad(value.getDate()) + + 'T' + pad(value.getHours()) + ':' + pad(value.getMinutes()); + } const raw = String(value || '').trim(); return raw ? raw : null; } diff --git a/src/web/public/js/playlists/playlist-schedule.js b/src/web/public/js/playlists/playlist-schedule.js index d7138c6..4087c99 100644 --- a/src/web/public/js/playlists/playlist-schedule.js +++ b/src/web/public/js/playlists/playlist-schedule.js @@ -14,6 +14,18 @@ }; // Schedule helpers. + function normalizeDateTimeValue(value) { + if (value instanceof Date || Object.prototype.toString.call(value) === '[object Date]') { + if (Number.isNaN(value.getTime())) { + return ''; + } + var pad = function (part) { return String(part).padStart(2, '0'); }; + return value.getFullYear() + '-' + pad(value.getMonth() + 1) + '-' + pad(value.getDate()) + + 'T' + pad(value.getHours()) + ':' + pad(value.getMinutes()); + } + return String(value || '').trim(); + } + function formatDays(daysValue) { var days = []; if (Array.isArray(daysValue)) { @@ -36,8 +48,8 @@ function normalizeScheduleRuleValue(rule) { var input = rule && typeof rule === 'object' ? rule : {}; - var startDatetime = String(input.start_datetime || input.startDateTime || input.startDateTimeValue || '').trim(); - var endDatetime = String(input.end_datetime || input.endDateTime || input.endDateTimeValue || '').trim(); + var startDatetime = normalizeDateTimeValue(input.start_datetime || input.startDateTime || input.startDateTimeValue); + var endDatetime = normalizeDateTimeValue(input.end_datetime || input.endDateTime || input.endDateTimeValue); var startTime = String(input.start_time || input.startTime || input.startTimeValue || '').trim(); var endTime = String(input.end_time || input.endTime || input.endTimeValue || '').trim(); var days = []; diff --git a/test/playlist-form-view-model.test.js b/test/playlist-form-view-model.test.js index 0eed636..16f0361 100644 --- a/test/playlist-form-view-model.test.js +++ b/test/playlist-form-view-model.test.js @@ -26,6 +26,8 @@ test('playlist schedule summaries show up to two short rules on separate lines a [[{ days: [1] }, { days: [2] }, { days: [3] }, { days: [4] }], '4 rules'], [[{ start_datetime: '2026-10-25T09:00', end_datetime: '2026-10-26T17:00', days: [1] }], 'Rule 1: Dates 2026-10-25 09:00 to 2026-10-26 17:00: Mon'], + [[{ start_datetime: new Date(2026, 0, 1, 0, 0), end_datetime: new Date(2026, 9, 30, 20, 0) }], + 'Rule 1: Dates 2026-01-01 00:00 to 2026-10-30 20:00'], [[{ start_datetime: '2026-10-25T09:00', end_datetime: '2026-10-26T17:00', days: [1, 2], start_time: '09:00', end_time: '17:00' }], '1 rule'],