Files
pulse-signage/src/web/routes/signage/slides/form-view-model.js
T
2026-08-03 21:20:54 +01:00

63 lines
2.7 KiB
JavaScript

// Shared slide form view-model builder.
const { getRegionEditorScripts } = require('../../../lib/region-scripts');
function buildDefaultSlide() {
return {
title: '',
template_id: null,
content: {}
};
}
function buildTemplates(templates, templateRegions) {
const regions = Array.isArray(templateRegions) ? templateRegions : [];
return (Array.isArray(templates) ? templates : []).map((template) => Object.assign({}, template, {
canvas_size_width: template.canvas_size_width,
canvas_size_height: template.canvas_size_height,
regions: regions.filter((region) => Number(region.template_id) === Number(template.id))
}));
}
function buildSlideFormViewModel(data, slide, message, currentUser, isEdit) {
const assetVersion = Date.now().toString(36);
const templateRegions = data && data.templateRegions ? data.templateRegions : [];
const rssFeeds = data && data.rssFeeds ? data.rssFeeds : [];
const apiSources = data && data.apiSources ? data.apiSources : [];
const timetableGroups = data && data.timetableGroups ? data.timetableGroups : [];
const fontLibrary = data && data.fontLibrary ? data.fontLibrary : null;
const templates = buildTemplates(data && data.templates ? data.templates : [], templateRegions);
const viewSlide = slide || buildDefaultSlide();
return {
title: isEdit ? 'Edit slide' : 'Create slide',
active: 'slides',
message: message,
isEdit: Boolean(isEdit),
inUse: Boolean(viewSlide && viewSlide.inUse),
action: isEdit && viewSlide.id ? '/slides/' + viewSlide.id : '/slides',
formAttrs: isEdit
? 'data-async-save data-async-save-close-url="/slides" data-async-save-new-url="/slides/new"'
: 'data-async-save data-async-save-close-url="/slides" data-async-save-new-redirect="response-url" data-async-save-new-url="/slides/new"',
slide: viewSlide,
templates: templates,
stylesheets: fontLibrary && fontLibrary.stylesheetHref ? [fontLibrary.stylesheetHref] : [],
slideEditorData: {
templates: templates,
rssFeeds: rssFeeds,
apiSources: apiSources,
timetableGroups: timetableGroups,
fontStylesheetHref: fontLibrary && fontLibrary.stylesheetHref ? fontLibrary.stylesheetHref : '',
fontFamilyFormats: fontLibrary && fontLibrary.fontFamilyFormats ? fontLibrary.fontFamilyFormats : '',
existingTemplateId: viewSlide && viewSlide.template_id ? viewSlide.template_id : null,
existingContent: viewSlide && viewSlide.content ? viewSlide.content : {}
},
assetVersion: assetVersion,
slideEditorScripts: ['vendor/qrcode-generator/qrcode.js?v=' + assetVersion].concat(getRegionEditorScripts(assetVersion)),
currentUser: currentUser || null
};
}
module.exports = {
buildSlideFormViewModel: buildSlideFormViewModel
};