Release v2.19.2: reorganize shared UI modules
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m11s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 33s

This commit is contained in:
lzstealth committed 2026-10-24 21:27:51 +01:00
1 parent f7d29ac326
commit 55ee5dc366
33 files changed
+48 -42

No files matched your search

+6
View File
@@ -2,6 +2,12 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## 2.19.2 - 2026-10-24
### Fixed
- Updated the server-side toast helper reference after organizing browser UI modules into shared and RBAC namespaces, preventing web startup failure.
## 2.19.1 - 2026-10-24 ## 2.19.1 - 2026-10-24
### Fixed ### Fixed
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pulse-signage-player", "name": "pulse-signage-player",
"version": "2.19.1", "version": "2.19.2",
"private": false, "private": false,
"description": "Pulse Signage player application bundle", "description": "Pulse Signage player application bundle",
"engines": { "engines": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pulse-signage-web", "name": "pulse-signage-web",
"version": "2.19.1", "version": "2.19.2",
"private": false, "private": false,
"description": "Pulse Signage web and bridge application bundle", "description": "Pulse Signage web and bridge application bundle",
"engines": { "engines": {
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "pulse-signage", "name": "pulse-signage",
"version": "2.19.1", "version": "2.19.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "pulse-signage", "name": "pulse-signage",
"version": "2.19.1", "version": "2.19.2",
"dependencies": { "dependencies": {
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"bootstrap-icons": "1.13.1", "bootstrap-icons": "1.13.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pulse-signage", "name": "pulse-signage",
"version": "2.19.1", "version": "2.19.2",
"private": false, "private": false,
"description": "Pulse Signage application with MySQL and media storage", "description": "Pulse Signage application with MySQL and media storage",
"engines": { "engines": {
+3 -3
View File
@@ -3944,7 +3944,7 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
text-transform: none; text-transform: none;
} }
.api-region-placeholder-section .chip { .placeholder-chip {
padding: 0.2rem 0.45rem; padding: 0.2rem 0.45rem;
border: 1px solid var(--bs-border-color); border: 1px solid var(--bs-border-color);
border-radius: 0.3rem; border-radius: 0.3rem;
@@ -3954,12 +3954,12 @@ html[data-bs-theme='dark'] .template-field-card .tox .tox-collection {
font-size: 0.75rem; font-size: 0.75rem;
} }
.api-region-placeholder-section .chip:hover { .placeholder-chip:hover {
border-color: var(--bs-secondary-color); border-color: var(--bs-secondary-color);
background: var(--bs-tertiary-bg); background: var(--bs-tertiary-bg);
} }
.api-region-placeholder-section .chip:focus-visible { .placeholder-chip:focus-visible {
outline: 2px solid var(--bs-primary); outline: 2px solid var(--bs-primary);
outline-offset: 2px; outline-offset: 2px;
} }
File renamed without changes.
+1 -1
View File
@@ -208,7 +208,7 @@
} }
return tokens.map(function (token) { return tokens.map(function (token) {
return '<span class="chip">{{' + token + '}}</span>'; return '<span class="chip placeholder-chip">{{' + token + '}}</span>';
}).join(''); }).join('');
} }
+1 -1
View File
@@ -215,7 +215,7 @@
} }
return tokens.map(function (token) { return tokens.map(function (token) {
return '<span class="chip">{{' + escapeHtml(token) + '}}</span>'; return '<span class="chip placeholder-chip">{{' + escapeHtml(token) + '}}</span>';
}).join(''); }).join('');
} }
+2 -2
View File
@@ -64,14 +64,14 @@
if (visibleCount >= fields.length) return fields.map(function (field) { if (visibleCount >= fields.length) return fields.map(function (field) {
return window.placeholderChips && typeof window.placeholderChips.renderChip === 'function' return window.placeholderChips && typeof window.placeholderChips.renderChip === 'function'
? window.placeholderChips.renderChip(field) ? window.placeholderChips.renderChip(field)
: '<span class="chip">{{' + escapeHtml(field) + '}}</span>'; : '<span class="chip placeholder-chip">{{' + escapeHtml(field) + '}}</span>';
}).join(''); }).join('');
var visibleFields = fields.slice(0, visibleCount); var visibleFields = fields.slice(0, visibleCount);
var overflowFields = fields.slice(visibleFields.length); var overflowFields = fields.slice(visibleFields.length);
var renderChip = function (field) { var renderChip = function (field) {
return window.placeholderChips && typeof window.placeholderChips.renderChip === 'function' return window.placeholderChips && typeof window.placeholderChips.renderChip === 'function'
? window.placeholderChips.renderChip(field) ? window.placeholderChips.renderChip(field)
: '<span class="chip">{{' + escapeHtml(field) + '}}</span>'; : '<span class="chip placeholder-chip">{{' + escapeHtml(field) + '}}</span>';
}; };
var visibleMarkup = visibleFields.map(renderChip).join(''); var visibleMarkup = visibleFields.map(renderChip).join('');
if (!overflowFields.length) return visibleMarkup; if (!overflowFields.length) return visibleMarkup;
@@ -98,7 +98,7 @@
var escapedCopyText = escapeHtml(copyText); var escapedCopyText = escapeHtml(copyText);
ensureCopyHandler(); ensureCopyHandler();
return '<span class="chip" ' + CHIP_ATTR + '="1" data-copy-text="' + escapedCopyText + '" role="button" tabindex="0" title="Click to copy ' + escapedCopyText + '" aria-label="Copy ' + escapedCopyText + '">' + escapedCopyText + '</span>'; return '<span class="chip placeholder-chip" ' + CHIP_ATTR + '="1" data-copy-text="' + escapedCopyText + '" role="button" tabindex="0" title="Click to copy ' + escapedCopyText + '" aria-label="Copy ' + escapedCopyText + '">' + escapedCopyText + '</span>';
} }
function renderChips(tokens) { function renderChips(tokens) {
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -137,7 +137,7 @@ export function createSlideFormRegionHelpers(options) {
var visibleMarkup = visibleFields.map(function (field) { var visibleMarkup = visibleFields.map(function (field) {
return typeof placeholderChips.renderChip === 'function' return typeof placeholderChips.renderChip === 'function'
? placeholderChips.renderChip(field) ? placeholderChips.renderChip(field)
: '<span class="chip">{{' + escapeHtml(field) + '}}</span>'; : '<span class="chip placeholder-chip">{{' + escapeHtml(field) + '}}</span>';
}).join(''); }).join('');
var transformHint = includeTransformHint === false ? '' : '<div class="text-body-secondary small mt-1">Placeholder values support transforms, for example <code>{{title.upper()}}</code>, <code>{{title.title()}}</code>, <code>{{title.lower()}}</code>, <code>{{publishedAt.format("MMM D, YYYY")}}</code>, or <code>{{amount.multiply(10)}}</code>.</div>'; var transformHint = includeTransformHint === false ? '' : '<div class="text-body-secondary small mt-1">Placeholder values support transforms, for example <code>{{title.upper()}}</code>, <code>{{title.title()}}</code>, <code>{{title.lower()}}</code>, <code>{{publishedAt.format("MMM D, YYYY")}}</code>, or <code>{{amount.multiply(10)}}</code>.</div>';
@@ -153,7 +153,7 @@ export function createSlideFormRegionHelpers(options) {
'<div class="d-flex flex-wrap gap-2 mt-1">' + overflowFields.map(function (field) { '<div class="d-flex flex-wrap gap-2 mt-1">' + overflowFields.map(function (field) {
return typeof placeholderChips.renderChip === 'function' return typeof placeholderChips.renderChip === 'function'
? placeholderChips.renderChip(field) ? placeholderChips.renderChip(field)
: '<span class="chip">{{' + escapeHtml(field) + '}}</span>'; : '<span class="chip placeholder-chip">{{' + escapeHtml(field) + '}}</span>';
}).join('') + '</div>' + }).join('') + '</div>' +
'</details>'; '</details>';
} }
@@ -226,7 +226,7 @@ export function createSlideFormRegionHelpers(options) {
var chips = Array.isArray(fieldList) ? fieldList.map(function (field) { var chips = Array.isArray(fieldList) ? fieldList.map(function (field) {
return typeof placeholderChips.renderChip === 'function' return typeof placeholderChips.renderChip === 'function'
? placeholderChips.renderChip(field) ? placeholderChips.renderChip(field)
: '<span class="chip">{{' + escapeHtml(field) + '}}</span>'; : '<span class="chip placeholder-chip">{{' + escapeHtml(field) + '}}</span>';
}).join('') : ''; }).join('') : '';
container.innerHTML = chips || '<span class="muted slide-image-file">' + escapeHtml(emptyLabel) + '</span>'; container.innerHTML = chips || '<span class="muted slide-image-file">' + escapeHtml(emptyLabel) + '</span>';
+1 -1
View File
@@ -14,6 +14,6 @@ module.exports = function renderSettingsPage(settings, suggestedAnnouncementIcon
defaultAnnouncementIconSuggestions: iconOptions.filter(function (option) { return option.isSelected; }), defaultAnnouncementIconSuggestions: iconOptions.filter(function (option) { return option.isSelected; }),
mediaSettings: mediaSettings || {}, mediaSettings: mediaSettings || {},
diagnostics: diagnostics || {}, diagnostics: diagnostics || {},
scripts: ['js/icon-picker.js', 'js/settings/settings-page.js'] scripts: ['js/shared/ui/icon-picker.js', 'js/settings/settings-page.js']
}); });
}; };
@@ -119,7 +119,7 @@ function buildRbacAddViewModel(message, currentUser, formValues, permissionGroup
users: users || [], users: users || [],
pagination: pagination || null, pagination: pagination || null,
roleEditBasePath: '/settings/roles/new', roleEditBasePath: '/settings/roles/new',
scripts: ['js/rbac-permissions.js'], scripts: ['js/rbac/permissions.js'],
formAttrs: 'data-async-save data-async-save-close-url="/settings/roles" data-async-save-new-redirect="response-url" data-async-save-new-url="/settings/roles/new"' formAttrs: 'data-async-save data-async-save-close-url="/settings/roles" data-async-save-new-redirect="response-url" data-async-save-new-url="/settings/roles/new"'
}; };
} }
@@ -155,7 +155,7 @@ function buildRbacEditViewModel(role, message, currentUser, permissionGroups, us
users: users || [], users: users || [],
pagination: pagination || null, pagination: pagination || null,
roleEditBasePath: '/settings/roles/' + Number(role && role.id) + '/edit', roleEditBasePath: '/settings/roles/' + Number(role && role.id) + '/edit',
scripts: ['js/rbac-permissions.js'], scripts: ['js/rbac/permissions.js'],
formAttrs: 'data-async-save data-async-save-close-url="/settings/roles" data-async-save-new-url="/settings/roles/new"' formAttrs: 'data-async-save data-async-save-close-url="/settings/roles" data-async-save-new-url="/settings/roles/new"'
}; };
} }
+1 -1
View File
@@ -6,7 +6,7 @@ const Handlebars = require('handlebars');
const { version: appVersion } = require('#root/package.json'); const { version: appVersion } = require('#root/package.json');
const { hasPermission, hasAnyPermission, hasAssignedPermission } = require('#src/rbac'); const { hasPermission, hasAnyPermission, hasAssignedPermission } = require('#src/rbac');
const { registerHandlebars } = require('#src/web/handlebars'); const { registerHandlebars } = require('#src/web/handlebars');
const { getMessageVariant: inferMessageVariant } = require('#src/web/public/js/toast'); const { getMessageVariant: inferMessageVariant } = require('#src/web/public/js/shared/ui/toast');
const VIEWS_ROOT = path.join(__dirname, 'views'); const VIEWS_ROOT = path.join(__dirname, 'views');
const cache = new Map(); const cache = new Map();
+4 -4
View File
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{{title}} - Pulse</title> <title>{{title}} - Pulse</title>
<link rel="icon" type="image/png" href="/assets/favicon.png" /> <link rel="icon" type="image/png" href="/assets/favicon.png" />
<script src="/assets/js/theme-init.js"></script> <script src="/assets/js/shared/theme-init.js"></script>
<link rel="stylesheet" href="/assets/adminlte/bootstrap-icons/css/bootstrap-icons.min.css" /> <link rel="stylesheet" href="/assets/adminlte/bootstrap-icons/css/bootstrap-icons.min.css" />
<link rel="stylesheet" href="/assets/adminlte/css/adminlte.min.css" /> <link rel="stylesheet" href="/assets/adminlte/css/adminlte.min.css" />
<link rel="stylesheet" href="/assets/adminlte/css/adminlte-colors.min.css" /> <link rel="stylesheet" href="/assets/adminlte/css/adminlte-colors.min.css" />
@@ -83,12 +83,12 @@
{{/if}} {{/if}}
<script src="/assets/adminlte/js/bootstrap.bundle.min.js"></script> <script src="/assets/adminlte/js/bootstrap.bundle.min.js"></script>
<script src="/assets/adminlte/js/adminlte.min.js"></script> <script src="/assets/adminlte/js/adminlte.min.js"></script>
<script src="/assets/js/web-ui-helpers.js"></script> <script src="/assets/js/shared/web-ui-helpers.js"></script>
<script src="/assets/js/toast.js"></script> <script src="/assets/js/shared/ui/toast.js"></script>
<script src="/assets/js/table/table-sort.js"></script> <script src="/assets/js/table/table-sort.js"></script>
<script src="/assets/js/table/table-search.js"></script> <script src="/assets/js/table/table-search.js"></script>
<script src="/assets/js/admin/admin-page.js"></script> <script src="/assets/js/admin/admin-page.js"></script>
<script src="/assets/js/system-status.js"></script> <script src="/assets/js/shared/system-status.js"></script>
{{#if scripts.length}} {{#if scripts.length}}
{{#each scripts}} {{#each scripts}}
<script src="/assets/{{this}}"></script> <script src="/assets/{{this}}"></script>
+7 -7
View File
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>{{title}} - Pulse</title> <title>{{title}} - Pulse</title>
<link rel="icon" type="image/png" href="/assets/favicon.png" /> <link rel="icon" type="image/png" href="/assets/favicon.png" />
<script src="/assets/js/theme-init.js"></script> <script src="/assets/js/shared/theme-init.js"></script>
<link rel="stylesheet" href="/assets/adminlte/bootstrap-icons/css/bootstrap-icons.min.css" /> <link rel="stylesheet" href="/assets/adminlte/bootstrap-icons/css/bootstrap-icons.min.css" />
<link rel="stylesheet" href="/assets/adminlte/css/adminlte.min.css" /> <link rel="stylesheet" href="/assets/adminlte/css/adminlte.min.css" />
<link rel="stylesheet" href="/assets/adminlte/css/adminlte-colors.min.css" /> <link rel="stylesheet" href="/assets/adminlte/css/adminlte-colors.min.css" />
@@ -26,7 +26,7 @@
</div> </div>
</main> </main>
<script src="/assets/js/admin/admin-page.js"></script> <script src="/assets/js/admin/admin-page.js"></script>
<script src="/assets/js/system-status.js"></script> <script src="/assets/js/shared/system-status.js"></script>
{{else if authShell}} {{else if authShell}}
<div id="app-toast-container" class="toast-container app-toast-container position-fixed end-0 p-3"> <div id="app-toast-container" class="toast-container app-toast-container position-fixed end-0 p-3">
{{#if message}} {{#if message}}
@@ -56,9 +56,9 @@
{{{body}}} {{{body}}}
</div> </div>
</main> </main>
<script src="/assets/js/toast.js"></script> <script src="/assets/js/shared/ui/toast.js"></script>
<script src="/assets/js/admin/admin-page.js"></script> <script src="/assets/js/admin/admin-page.js"></script>
<script src="/assets/js/system-status.js"></script> <script src="/assets/js/shared/system-status.js"></script>
{{else}} {{else}}
<div id="app-toast-container" class="toast-container app-toast-container position-fixed end-0 p-3"> <div id="app-toast-container" class="toast-container app-toast-container position-fixed end-0 p-3">
{{#if message}} {{#if message}}
@@ -413,8 +413,8 @@
</dialog> </dialog>
<script src="/assets/adminlte/js/bootstrap.bundle.min.js"></script> <script src="/assets/adminlte/js/bootstrap.bundle.min.js"></script>
<script src="/assets/adminlte/js/adminlte.min.js"></script> <script src="/assets/adminlte/js/adminlte.min.js"></script>
<script src="/assets/js/web-ui-helpers.js"></script> <script src="/assets/js/shared/web-ui-helpers.js"></script>
<script src="/assets/js/toast.js"></script> <script src="/assets/js/shared/ui/toast.js"></script>
<script src="/assets/js/table/table-sort.js"></script> <script src="/assets/js/table/table-sort.js"></script>
<script src="/assets/js/table/table-search.js"></script> <script src="/assets/js/table/table-search.js"></script>
<script src="/assets/js/admin/admin-page.js"></script> <script src="/assets/js/admin/admin-page.js"></script>
@@ -427,7 +427,7 @@
{{/if}} {{/if}}
{{/each}} {{/each}}
{{/if}} {{/if}}
<script src="/assets/js/system-status.js"></script> <script src="/assets/js/shared/system-status.js"></script>
{{/if}} {{/if}}
</body> </body>
</html> </html>
+1 -1
View File
@@ -174,7 +174,7 @@
</div> </div>
</div> </div>
</div> </div>
<script src="/assets/js/icon-picker.js?v={{appVersion}}"></script> <script src="/assets/js/shared/ui/icon-picker.js?v={{appVersion}}"></script>
<script type="module" src="/assets/js/announcements/announcement-form.js?v={{appVersion}}"></script> <script type="module" src="/assets/js/announcements/announcement-form.js?v={{appVersion}}"></script>
</form> </form>
+1 -1
View File
@@ -247,5 +247,5 @@
{{/each}} {{/each}}
<script type="module" src="/assets/js/slides/slide-form.js?v={{assetVersion}}"></script> <script type="module" src="/assets/js/slides/slide-form.js?v={{assetVersion}}"></script>
<script type="module" src="/assets/js/slides/slide-image-cropper.js?v={{assetVersion}}"></script> <script type="module" src="/assets/js/slides/slide-image-cropper.js?v={{assetVersion}}"></script>
<script type="module" src="/assets/js/media-picker.js?v={{appVersion}}"></script> <script type="module" src="/assets/js/shared/ui/media-picker.js?v={{appVersion}}"></script>
+1 -1
View File
@@ -213,4 +213,4 @@
<textarea id="template-region-editor-data" hidden>{{json regionEditorData}}</textarea> <textarea id="template-region-editor-data" hidden>{{json regionEditorData}}</textarea>
<script src="/assets/vendor/tinymce/tinymce.min.js"></script> <script src="/assets/vendor/tinymce/tinymce.min.js"></script>
<script type="module" src="/assets/js/templates/template-default-content-editor.js?v={{appVersion}}"></script> <script type="module" src="/assets/js/templates/template-default-content-editor.js?v={{appVersion}}"></script>
<script type="module" src="/assets/js/media-picker.js?v={{appVersion}}"></script> <script type="module" src="/assets/js/shared/ui/media-picker.js?v={{appVersion}}"></script>
+1 -1
View File
@@ -4,7 +4,7 @@ const fs = require('node:fs');
const vm = require('node:vm'); const vm = require('node:vm');
function loadTimeDateModule() { function loadTimeDateModule() {
const webUiHelpersScript = fs.readFileSync(require.resolve('../src/web/public/js/web-ui-helpers.js'), 'utf8'); const webUiHelpersScript = fs.readFileSync(require.resolve('../src/web/public/js/shared/web-ui-helpers.js'), 'utf8');
const sharedRenderingScript = fs.readFileSync(require.resolve('../src/player/rendering-shared.js'), 'utf8'); const sharedRenderingScript = fs.readFileSync(require.resolve('../src/player/rendering-shared.js'), 'utf8');
const renderingScript = fs.readFileSync(require.resolve('../src/player/public/js/player-page-rendering.js'), 'utf8'); const renderingScript = fs.readFileSync(require.resolve('../src/player/public/js/player-page-rendering.js'), 'utf8');
const placeholderScript = fs.readFileSync(require.resolve('../src/web/public/js/shared/placeholder-utils.js'), 'utf8'); const placeholderScript = fs.readFileSync(require.resolve('../src/web/public/js/shared/placeholder-utils.js'), 'utf8');
+1 -1
View File
@@ -2,7 +2,7 @@ const test = require('node:test');
const assert = require('node:assert/strict'); const assert = require('node:assert/strict');
const fs = require('node:fs'); const fs = require('node:fs');
const rbacPermissionsScript = fs.readFileSync(require.resolve('../src/web/public/js/rbac-permissions.js'), 'utf8'); const rbacPermissionsScript = fs.readFileSync(require.resolve('../src/web/public/js/rbac/permissions.js'), 'utf8');
const rbacFormTemplate = fs.readFileSync(require.resolve('../src/web/views/settings/rbac/form.hbs'), 'utf8'); const rbacFormTemplate = fs.readFileSync(require.resolve('../src/web/views/settings/rbac/form.hbs'), 'utf8');
const rbacRoutesSource = fs.readFileSync(require.resolve('../src/web/routes/admin/rbac.js'), 'utf8'); const rbacRoutesSource = fs.readFileSync(require.resolve('../src/web/routes/admin/rbac.js'), 'utf8');
const { buildPermissionSections, buildRbacEditViewModel } = require('../src/web/routes/settings/rbac/form-view-model'); const { buildPermissionSections, buildRbacEditViewModel } = require('../src/web/routes/settings/rbac/form-view-model');
+1 -1
View File
@@ -6,7 +6,7 @@ const vm = require('node:vm');
const slideFormEditorSource = fs.readFileSync(require.resolve('../src/web/public/js/slides/slide-form-editor.js'), 'utf8'); const slideFormEditorSource = fs.readFileSync(require.resolve('../src/web/public/js/slides/slide-form-editor.js'), 'utf8');
const slideFormSource = fs.readFileSync(require.resolve('../src/web/public/js/slides/slide-form.js'), 'utf8'); const slideFormSource = fs.readFileSync(require.resolve('../src/web/public/js/slides/slide-form.js'), 'utf8');
const slideFormTemplateSource = fs.readFileSync(require.resolve('../src/web/views/signage/slides/form.hbs'), 'utf8'); const slideFormTemplateSource = fs.readFileSync(require.resolve('../src/web/views/signage/slides/form.hbs'), 'utf8');
const mediaPickerSource = fs.readFileSync(require.resolve('../src/web/public/js/media-picker.js'), 'utf8'); const mediaPickerSource = fs.readFileSync(require.resolve('../src/web/public/js/shared/ui/media-picker.js'), 'utf8');
const slideThumbnailPreviewSource = fs.readFileSync(require.resolve('../src/web/lib/media/slide-thumbnail-preview.js'), 'utf8'); const slideThumbnailPreviewSource = fs.readFileSync(require.resolve('../src/web/lib/media/slide-thumbnail-preview.js'), 'utf8');
const slideThumbnailsSource = fs.readFileSync(require.resolve('../src/web/lib/media/slide-thumbnails.js'), 'utf8'); const slideThumbnailsSource = fs.readFileSync(require.resolve('../src/web/lib/media/slide-thumbnails.js'), 'utf8');
const slideHtmlRegionSource = fs.readFileSync(require.resolve('../src/web/public/js/regions/type/html.js'), 'utf8'); const slideHtmlRegionSource = fs.readFileSync(require.resolve('../src/web/public/js/regions/type/html.js'), 'utf8');
+2 -2
View File
@@ -4,7 +4,7 @@ const fs = require('node:fs');
const vm = require('node:vm'); const vm = require('node:vm');
test('system status shows connected player count in the live feed label', () => { test('system status shows connected player count in the live feed label', () => {
const script = fs.readFileSync(require.resolve('../src/web/public/js/system-status.js'), 'utf8'); const script = fs.readFileSync(require.resolve('../src/web/public/js/shared/system-status.js'), 'utf8');
const elements = { const elements = {
'sidebar-status-dot': { 'sidebar-status-dot': {
classList: { classList: {
@@ -74,7 +74,7 @@ test('system status shows connected player count in the live feed label', () =>
}); });
test('system status shows an explicit idle label when no players are connected', () => { test('system status shows an explicit idle label when no players are connected', () => {
const script = fs.readFileSync(require.resolve('../src/web/public/js/system-status.js'), 'utf8'); const script = fs.readFileSync(require.resolve('../src/web/public/js/shared/system-status.js'), 'utf8');
const elements = { const elements = {
'sidebar-status-dot': { 'sidebar-status-dot': {
classList: { classList: {
+1 -1
View File
@@ -284,7 +284,7 @@ test('schema startup runs the 2.19.1 repair on its existing locked connection',
assert.equal(acquisitions, 1); assert.equal(acquisitions, 1);
const commitIndex = connection.queries.findIndex(([sql]) => sql === 'COMMIT'); const commitIndex = connection.queries.findIndex(([sql]) => sql === 'COMMIT');
const versionIndex = connection.queries.findIndex(([sql, params]) => sql.startsWith('UPDATE o_app_state') && params[0] === '2.19.1'); const versionIndex = connection.queries.findIndex(([sql, params]) => sql.startsWith('UPDATE o_app_state') && params[0] === require('../package.json').version);
assert.ok(commitIndex > 0); assert.ok(commitIndex > 0);
assert.ok(versionIndex > commitIndex); assert.ok(versionIndex > commitIndex);
assert.deepEqual(connection.queries.slice(-2), [ assert.deepEqual(connection.queries.slice(-2), [
+1 -1
View File
@@ -130,7 +130,7 @@ test('pending toast is shown after a refresh and cleared from storage', () => {
}; };
sandbox.window = sandbox; sandbox.window = sandbox;
const scriptPath = path.join(__dirname, '..', 'src', 'web', 'public', 'js', 'toast.js'); const scriptPath = path.join(__dirname, '..', 'src', 'web', 'public', 'js', 'shared', 'ui', 'toast.js');
const script = fs.readFileSync(scriptPath, 'utf8'); const script = fs.readFileSync(scriptPath, 'utf8');
vm.runInNewContext(script, sandbox, { filename: scriptPath }); vm.runInNewContext(script, sandbox, { filename: scriptPath });
+1 -1
View File
@@ -23,7 +23,7 @@ test('client row keys prefer the client name', () => {
}; };
sandbox.window = sandbox; sandbox.window = sandbox;
loadScript(path.join(__dirname, '..', 'src', 'web', 'public', 'js', 'web-ui-helpers.js'), sandbox); loadScript(path.join(__dirname, '..', 'src', 'web', 'public', 'js', 'shared', 'web-ui-helpers.js'), sandbox);
const helpers = sandbox.window.webUiHelpers; const helpers = sandbox.window.webUiHelpers;
assert.equal(helpers.getClientRowKey({ client_name: 'Conference Left', screen_slug: 'alpha', deviceId: 'device-123', id: 'conn-1', clientId: 'client-1' }), 'conn-1'); assert.equal(helpers.getClientRowKey({ client_name: 'Conference Left', screen_slug: 'alpha', deviceId: 'device-123', id: 'conn-1', clientId: 'client-1' }), 'conn-1');