Release 2.8.0
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m49s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 32s

This commit is contained in:
2026-08-16 17:15:31 +01:00
parent 1bdc122995
commit 203d0bfc01
105 changed files with 4185 additions and 677 deletions
+31 -6
View File
@@ -11,6 +11,7 @@ module.exports = function registerAnnouncementRoutes(app, deps) {
const { buildPagination } = require('../../../lib/pagination');
const announcementData = require('#src/data/announcements');
const announcementIcons = require('#src/data/announcement-icons');
const { fetchAppSettings } = require('#src/data/app-settings');
const { buildDuplicateAnnouncementName, buildDuplicateAnnouncement } = require('./duplicate');
const LIST_PAGE_SIZE = 25;
@@ -30,6 +31,21 @@ module.exports = function registerAnnouncementRoutes(app, deps) {
{ value: 'light', label: 'Light' }
];
const ANNOUNCEMENT_ICONS = announcementIcons.ANNOUNCEMENT_ICON_OPTIONS || [];
const ANNOUNCEMENT_ICON_CATALOG = announcementIcons.ANNOUNCEMENT_ICON_CATALOG || ANNOUNCEMENT_ICONS;
async function fetchSuggestedAnnouncementIcons() {
const settings = await fetchAppSettings(pool);
const catalogByKey = new Map(ANNOUNCEMENT_ICON_CATALOG.map(function (option) {
return [option.value, option];
}));
const configuredKeys = Array.isArray(settings['announcements.suggested_icons'])
? settings['announcements.suggested_icons']
: [];
const configuredOptions = configuredKeys.map(function (key) {
return catalogByKey.get(String(key || '').trim().toLowerCase()) || null;
}).filter(Boolean);
return configuredOptions.length ? configuredOptions : ANNOUNCEMENT_ICONS;
}
function normalizeDurationUnit(value) {
return String(value || 'minutes').trim().toLowerCase() === 'seconds' ? 'seconds' : 'minutes';
@@ -269,21 +285,28 @@ module.exports = function registerAnnouncementRoutes(app, deps) {
app.get('/announcements/new', requirePermission('announcements.create'), async function (req, res, next) {
try {
const screens = await fetchAnnouncementScreens();
const suggestedAnnouncementIcons = await fetchSuggestedAnnouncementIcons();
const settings = await fetchAppSettings(pool);
const configuredIcon = String(settings['announcements.default_icon'] || '').trim().toLowerCase();
const defaultIcon = ANNOUNCEMENT_ICON_CATALOG.some(function (option) { return option.value === configuredIcon; })
? configuredIcon
: (suggestedAnnouncementIcons[0] && suggestedAnnouncementIcons[0].value ? suggestedAnnouncementIcons[0].value : announcementIcons.DEFAULT_ANNOUNCEMENT_ICON);
res.send(pages.renderAnnouncementAddPage(buildAnnouncementFormData({
message: '',
short_label: '',
announcement_type: 'lower-third',
color_key: 'primary',
icon_key: announcementIcons.DEFAULT_ANNOUNCEMENT_ICON,
icon_key: defaultIcon,
durationMode: 'duration',
duration_seconds: null,
durationValue: 5,
durationUnit: 'minutes',
durationValue: Number(settings['announcements.default_duration_value']) || 10,
durationUnit: String(settings['announcements.default_duration_unit'] || 'seconds'),
screen_ids: []
}), req.query.message ? String(req.query.message) : '', req.currentUser, {
announcementTypes: ANNOUNCEMENT_TYPES,
announcementColors: ANNOUNCEMENT_COLORS,
announcementIcons: ANNOUNCEMENT_ICONS,
announcementIcons: suggestedAnnouncementIcons,
announcementIconCatalog: ANNOUNCEMENT_ICON_CATALOG,
announcementScreens: buildAnnouncementScreenOptions(screens, [])
}));
} catch (error) {
@@ -301,7 +324,8 @@ module.exports = function registerAnnouncementRoutes(app, deps) {
res.send(pages.renderAnnouncementEditPage(buildAnnouncementFormData(announcement), null, req.query.message ? String(req.query.message) : '', req.currentUser, {
announcementTypes: ANNOUNCEMENT_TYPES,
announcementColors: ANNOUNCEMENT_COLORS,
announcementIcons: ANNOUNCEMENT_ICONS,
announcementIcons: await fetchSuggestedAnnouncementIcons(),
announcementIconCatalog: ANNOUNCEMENT_ICON_CATALOG,
announcementScreens: buildAnnouncementScreenOptions(screens, announcement.screen_ids || [])
}));
} catch (error) {
@@ -327,7 +351,8 @@ module.exports = function registerAnnouncementRoutes(app, deps) {
res.send(pages.renderAnnouncementAddPage(buildAnnouncementFormData(buildDuplicateAnnouncement(announcement, duplicateName)), req.query.message ? String(req.query.message) : 'Review the copied values and save when ready.', req.currentUser, {
announcementTypes: ANNOUNCEMENT_TYPES,
announcementColors: ANNOUNCEMENT_COLORS,
announcementIcons: ANNOUNCEMENT_ICONS,
announcementIcons: await fetchSuggestedAnnouncementIcons(),
announcementIconCatalog: ANNOUNCEMENT_ICON_CATALOG,
announcementScreens: buildAnnouncementScreenOptions(screens, announcement.screen_ids || []),
messageVariant: 'info'
}));