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
+75 -51
View File
@@ -1,55 +1,69 @@
const ANNOUNCEMENT_ICON_OPTIONS = [
{ value: 'megaphone-fill', label: 'Megaphone' },
{ value: 'megaphone', label: 'Megaphone outline' },
{ value: 'bell-fill', label: 'Bell' },
{ value: 'bell', label: 'Bell outline' },
{ value: 'exclamation-triangle-fill', label: 'Warning' },
{ value: 'exclamation-triangle', label: 'Warning outline' },
{ value: 'info-circle-fill', label: 'Info' },
{ value: 'info-circle', label: 'Info outline' },
{ value: 'check-circle-fill', label: 'Success' },
{ value: 'check-circle', label: 'Success outline' },
{ value: 'lightbulb-fill', label: 'Idea' },
{ value: 'lightbulb', label: 'Idea outline' },
{ value: 'calendar-event-fill', label: 'Calendar' },
{ value: 'calendar-event', label: 'Calendar outline' },
{ value: 'clock-fill', label: 'Clock' },
{ value: 'clock', label: 'Clock outline' },
{ value: 'wifi-off', label: 'Wi-Fi Offline' },
{ value: 'wifi', label: 'Wi-Fi' },
{ value: 'hdd-network', label: 'Network' },
{ value: 'hdd-network-fill', label: 'Network fill' },
{ value: 'speaker-fill', label: 'Speaker' },
{ value: 'speaker', label: 'Speaker outline' },
{ value: 'shield-fill', label: 'Shield' },
{ value: 'shield', label: 'Shield outline' },
{ value: 'collection-play-fill', label: 'Playlist' },
{ value: 'collection-play', label: 'Playlist outline' },
{ value: 'broadcast', label: 'Broadcast' },
{ value: 'broadcast-pin', label: 'Broadcast pin' },
{ value: 'plug-fill', label: 'Plug' },
{ value: 'plug', label: 'Plug outline' },
{ value: 'lightning-charge-fill', label: 'Urgent' },
{ value: 'lightning-charge', label: 'Urgent outline' },
{ value: 'car-front-fill', label: 'Car Front' },
{ value: 'car-front', label: 'Car Front outline' },
{ value: 'lamp-fill', label: 'Lamp' },
{ value: 'lamp', label: 'Lamp outline' },
{ value: 'envelope-fill', label: 'Message' },
{ value: 'envelope', label: 'Message outline' },
{ value: 'people-fill', label: 'Audience' },
{ value: 'people', label: 'Audience outline' },
{ value: 'browser-chrome', label: 'Browser Chrome' },
{ value: 'browser-edge', label: 'Browser Edge' },
{ value: 'browser-firefox', label: 'Browser Firefox' },
{ value: 'browser-safari', label: 'Browser Safari' },
{ value: 'cone', label: 'Cone' },
{ value: 'cone-striped', label: 'Cone striped' },
{ value: 'cup-straw', label: 'Cup straw' },
{ value: 'fire', label: 'Fire' }
const fs = require('fs');
const path = require('path');
const BOOTSTRAP_ICON_CSS_PATH = path.join(__dirname, '..', 'web', 'public', 'adminlte', 'bootstrap-icons', 'css', 'bootstrap-icons.min.css');
const DEFAULT_ANNOUNCEMENT_ICON_KEYS = [
'megaphone-fill', 'megaphone', 'bell-fill', 'bell',
'exclamation-triangle-fill', 'exclamation-triangle', 'info-circle-fill', 'info-circle',
'check-circle-fill', 'check-circle', 'lightbulb-fill', 'lightbulb',
'calendar-event-fill', 'calendar-event', 'clock-fill', 'clock',
'wifi-off', 'wifi', 'hdd-network', 'hdd-network-fill',
'speaker-fill', 'speaker', 'shield-fill', 'shield',
'collection-play-fill', 'collection-play', 'broadcast', 'broadcast-pin',
'plug-fill', 'plug', 'lightning-charge-fill', 'lightning-charge',
'car-front-fill', 'car-front', 'lamp-fill', 'lamp',
'envelope-fill', 'envelope', 'people-fill', 'people',
'browser-chrome', 'browser-edge', 'browser-firefox', 'browser-safari',
'cone', 'cone-striped', 'cup-straw', 'fire'
];
const ANNOUNCEMENT_ICON_KEYS = ANNOUNCEMENT_ICON_OPTIONS.map(function (option) {
function humanizeBootstrapIconLabel(iconKey) {
return String(iconKey || '')
.trim()
.replace(/[-_]+/g, ' ')
.replace(/\b\w/g, function (character) {
return character.toUpperCase();
});
}
function loadBootstrapIconCatalog() {
try {
const css = fs.readFileSync(BOOTSTRAP_ICON_CSS_PATH, 'utf8');
const keys = Array.from(new Set((css.match(/\.bi-([a-z0-9-]+)::?before/g) || []).map(function (match) {
return String(match || '')
.replace(/^\.bi-/, '')
.replace(/::?before$/, '')
.trim()
.toLowerCase();
}).filter(Boolean)));
return keys.map(function (value) {
return {
value: value,
label: humanizeBootstrapIconLabel(value)
};
}).sort(function (left, right) {
return left.value.localeCompare(right.value);
});
} catch (_error) {
return DEFAULT_ANNOUNCEMENT_ICON_KEYS.map(function (value) {
return { value: value, label: humanizeBootstrapIconLabel(value) };
});
}
}
const ANNOUNCEMENT_ICON_CATALOG = loadBootstrapIconCatalog();
const ANNOUNCEMENT_ICON_OPTIONS = DEFAULT_ANNOUNCEMENT_ICON_KEYS.map(function (value) {
const catalogOption = ANNOUNCEMENT_ICON_CATALOG.find(function (option) {
return option.value === value;
});
return catalogOption || { value: value, label: humanizeBootstrapIconLabel(value) };
});
const ANNOUNCEMENT_ICON_KEYS = DEFAULT_ANNOUNCEMENT_ICON_KEYS.slice();
const ANNOUNCEMENT_ICON_CATALOG_KEYS = ANNOUNCEMENT_ICON_CATALOG.map(function (option) {
return option.value;
});
@@ -58,17 +72,27 @@ const ANNOUNCEMENT_ICON_LABELS = ANNOUNCEMENT_ICON_OPTIONS.reduce(function (labe
return labels;
}, Object.create(null));
ANNOUNCEMENT_ICON_CATALOG.forEach(function (option) {
if (!Object.prototype.hasOwnProperty.call(ANNOUNCEMENT_ICON_LABELS, option.value)) {
ANNOUNCEMENT_ICON_LABELS[option.value] = option.label;
}
});
const DEFAULT_ANNOUNCEMENT_ICON = 'megaphone-fill';
function normalizeAnnouncementIcon(value) {
const normalized = String(value || '').trim().toLowerCase();
return ANNOUNCEMENT_ICON_KEYS.includes(normalized) ? normalized : DEFAULT_ANNOUNCEMENT_ICON;
return ANNOUNCEMENT_ICON_CATALOG_KEYS.includes(normalized) ? normalized : DEFAULT_ANNOUNCEMENT_ICON;
}
module.exports = {
DEFAULT_ANNOUNCEMENT_ICON_KEYS,
ANNOUNCEMENT_ICON_OPTIONS,
ANNOUNCEMENT_ICON_KEYS,
ANNOUNCEMENT_ICON_CATALOG,
ANNOUNCEMENT_ICON_CATALOG_KEYS,
ANNOUNCEMENT_ICON_LABELS,
DEFAULT_ANNOUNCEMENT_ICON,
humanizeBootstrapIconLabel,
normalizeAnnouncementIcon
};