Files
pulse-signage/src/web/view.js
T
lzstealth 55ee5dc366
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
Release v2.19.2: reorganize shared UI modules
2026-10-24 21:27:51 +01:00

69 lines
2.6 KiB
JavaScript

// View rendering, template loading, and Handlebars registration helpers.
const fs = require('fs');
const path = require('path');
const Handlebars = require('handlebars');
const { version: appVersion } = require('#root/package.json');
const { hasPermission, hasAnyPermission, hasAssignedPermission } = require('#src/rbac');
const { registerHandlebars } = require('#src/web/handlebars');
const { getMessageVariant: inferMessageVariant } = require('#src/web/public/js/shared/ui/toast');
const VIEWS_ROOT = path.join(__dirname, 'views');
const cache = new Map();
const SIGNAGE_VIEW_PREFIXES = new Set(['dashboard', 'clients', 'screens', 'playlists', 'slides', 'canvas-sizes', 'templates']);
registerHandlebars(Handlebars, {
viewsRoot: VIEWS_ROOT,
hasPermission: hasPermission,
hasAnyPermission: hasAnyPermission,
hasAssignedPermission: hasAssignedPermission
});
function resolveTemplatePath(relativePath) {
const firstSegment = String(relativePath || '').split(/[\\/]/)[0];
if (SIGNAGE_VIEW_PREFIXES.has(firstSegment)) {
return path.join(VIEWS_ROOT, 'signage', relativePath);
}
return path.join(VIEWS_ROOT, relativePath);
}
function loadTemplate(relativePath) {
const filePath = resolveTemplatePath(relativePath);
const stat = fs.statSync(filePath);
const cached = cache.get(filePath);
if (cached && cached.mtimeMs === stat.mtimeMs) {
return cached.template;
}
const template = Handlebars.compile(fs.readFileSync(filePath, 'utf8'));
cache.set(filePath, { mtimeMs: stat.mtimeMs, template: template });
return template;
}
function renderView(viewName, context) {
const viewContext = Object.assign({ stylesheets: [], scripts: [], appVersion: appVersion }, context || {});
if (!viewContext.messageVariant) {
viewContext.messageVariant = inferMessageVariant(viewContext.message, 'success');
}
const page = loadTemplate(`${viewName}.hbs`);
const layout = loadTemplate(path.join('shared', 'layout.hbs'));
const body = page(viewContext);
return layout(Object.assign({}, viewContext, { body: body }));
}
function renderFragment(viewName, context) {
const viewContext = Object.assign({ stylesheets: [], scripts: [], appVersion: appVersion }, context || {});
if (!viewContext.messageVariant) {
viewContext.messageVariant = inferMessageVariant(viewContext.message, 'success');
}
const page = loadTemplate(`${viewName}.hbs`);
const layout = loadTemplate(path.join('shared', 'frame-layout.hbs'));
const body = page(viewContext);
return layout(Object.assign({}, viewContext, { body: body }));
}
module.exports = {
renderView,
renderFragment
};