Fix template default editor font previews
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m22s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 30s

This commit is contained in:
lzstealth committed 2026-10-27 23:08:18 +00:00
1 parent b71958cb38
commit c40bc6844a
3 files changed
+14

No files matched your search

+1
View File
@@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file.
### Fixed ### Fixed
- Template default-content WYSIWYG font menus now load managed font faces, matching slide editor previews.
- Playlist offline fallback now uses only the current service-worker cache generation, and cached playlists no longer mask HTTP errors. - Playlist offline fallback now uses only the current service-worker cache generation, and cached playlists no longer mask HTTP errors.
## 2.21.6 - 2026-10-27 ## 2.21.6 - 2026-10-27
@@ -46,6 +46,7 @@ function resolveTemplateCanvasSize(template, canvasSizes) {
function buildTemplateFormViewModel(template, message, canvasSizes, currentUser, isEdit, mediaAssets, imageUploadMaxBytes, regionEditorData) { function buildTemplateFormViewModel(template, message, canvasSizes, currentUser, isEdit, mediaAssets, imageUploadMaxBytes, regionEditorData) {
const current = resolveTemplateCanvasSize(template || buildDefaultTemplate(), canvasSizes || []); const current = resolveTemplateCanvasSize(template || buildDefaultTemplate(), canvasSizes || []);
const assetVersion = Date.now().toString(36); const assetVersion = Date.now().toString(36);
const fontLibrary = regionEditorData && regionEditorData.fontLibrary ? regionEditorData.fontLibrary : null;
return { return {
title: isEdit ? 'Edit template' : 'Create Template', title: isEdit ? 'Edit template' : 'Create Template',
@@ -66,6 +67,7 @@ function buildTemplateFormViewModel(template, message, canvasSizes, currentUser,
canvasSizes: canvasSizes || [], canvasSizes: canvasSizes || [],
mediaAssets: Array.isArray(mediaAssets) ? mediaAssets : [], mediaAssets: Array.isArray(mediaAssets) ? mediaAssets : [],
regionEditorData: regionEditorData || {}, regionEditorData: regionEditorData || {},
stylesheets: fontLibrary && fontLibrary.stylesheetHref ? [fontLibrary.stylesheetHref] : [],
imageUploadMaxBytes: Number(imageUploadMaxBytes) || 100 * 1024 * 1024, imageUploadMaxBytes: Number(imageUploadMaxBytes) || 100 * 1024 * 1024,
animationPresets: animationPresets, animationPresets: animationPresets,
scripts: ['js/lib/modal.js?v=' + assetVersion, 'js/shared/region-layout.js?v=' + assetVersion, 'js/templates/animation-presets.js?v=' + assetVersion, 'vendor/qr-code-styling/qr-code-styling-loader.js?v=' + assetVersion].concat(getRegionEditorScripts(assetVersion), ['js/templates/template-designer-utils.js?v=' + assetVersion, 'js/shared/region-animation-controls.js?v=' + assetVersion, 'js/templates/template-designer.js?v=' + assetVersion]) scripts: ['js/lib/modal.js?v=' + assetVersion, 'js/shared/region-layout.js?v=' + assetVersion, 'js/templates/animation-presets.js?v=' + assetVersion, 'vendor/qr-code-styling/qr-code-styling-loader.js?v=' + assetVersion].concat(getRegionEditorScripts(assetVersion), ['js/templates/template-designer-utils.js?v=' + assetVersion, 'js/shared/region-animation-controls.js?v=' + assetVersion, 'js/templates/template-designer.js?v=' + assetVersion])
+11
View File
@@ -12,6 +12,7 @@ const {
} = require('../src/data/templates'); } = require('../src/data/templates');
const renderTemplateAddPage = require('../src/web/routes/signage/templates/add'); const renderTemplateAddPage = require('../src/web/routes/signage/templates/add');
const renderTemplateEditPage = require('../src/web/routes/signage/templates/edit'); const renderTemplateEditPage = require('../src/web/routes/signage/templates/edit');
const { buildTemplateFormViewModel } = require('../src/web/routes/signage/templates/form-view-model');
const { buildDuplicateTemplateName, buildDuplicateTemplate } = require('../src/web/routes/signage/templates/duplicate'); const { buildDuplicateTemplateName, buildDuplicateTemplate } = require('../src/web/routes/signage/templates/duplicate');
const { buildThumbnailPreviewPayload } = require('../src/web/lib/media/slide-thumbnails'); const { buildThumbnailPreviewPayload } = require('../src/web/lib/media/slide-thumbnails');
@@ -610,6 +611,16 @@ test('template default content adapter reuses slide region helpers and TinyMCE c
assert.match(source, /createSlideFormEditorController/); assert.match(source, /createSlideFormEditorController/);
}); });
test('template editor loads the managed font stylesheet for its WYSIWYG font menu', () => {
const viewModel = buildTemplateFormViewModel(null, '', [], null, false, [], 0, {
fontLibrary: { stylesheetHref: '/media/fonts.css', fontFamilyFormats: 'Display Face="Display Face"' }
});
assert.deepEqual(viewModel.stylesheets, ['/media/fonts.css']);
assert.equal(viewModel.regionEditorData.fontLibrary.stylesheetHref, '/media/fonts.css');
assert.deepEqual(buildTemplateFormViewModel(null, '', [], null, false, [], 0, {}).stylesheets, []);
});
test('template designer restores region default content and read-only state from saved data', () => { test('template designer restores region default content and read-only state from saved data', () => {
const source = fs.readFileSync(require.resolve('../src/web/public/js/templates/template-designer.js'), 'utf8'); const source = fs.readFileSync(require.resolve('../src/web/public/js/templates/template-designer.js'), 'utf8');
const match = source.match(/ function populateRegionCard\([^]*?\n }/); const match = source.match(/ function populateRegionCard\([^]*?\n }/);