Release 1.5.16

This commit is contained in:
2026-07-26 22:03:36 +01:00
parent 42279d95aa
commit de1469c29d
20 changed files with 679 additions and 242 deletions
+28
View File
@@ -135,6 +135,11 @@ module.exports = function registerAdminContentRoutes(app, deps) {
return Array.from(usage);
}
async function fetchSlidesByTemplateId(templateId) {
const [slides] = await pool.query('SELECT id, thumbnail_path FROM slides WHERE template_id = ? ORDER BY id ASC', [templateId]);
return slides;
}
function getRemovedTemplateRegionKeys(existingRegions, nextRegions) {
const nextKeys = new Set((Array.isArray(nextRegions) ? nextRegions : []).map((region) => String(region && region.region_key || '').trim()).filter(Boolean));
return (Array.isArray(existingRegions) ? existingRegions : [])
@@ -171,6 +176,23 @@ module.exports = function registerAdminContentRoutes(app, deps) {
});
}
function queueTemplateSlideThumbnailRefresh(templateId) {
if (!backgroundTaskQueue || typeof backgroundTaskQueue.enqueueTask !== 'function') {
return Promise.resolve(null);
}
return backgroundTaskQueue.enqueueTask({
key: 'template-slide-thumbnail:' + Number(templateId),
title: 'Refresh slide thumbnails',
category: 'slides',
taskType: 'template-slide-thumbnail-refresh',
payload: {
templateId: Number(templateId)
},
persist: true
});
}
async function canvasSizeExists(width, height, ignoreId) {
const params = [width, height];
let query = 'SELECT COUNT(*) AS count FROM canvas_sizes WHERE width = ? AND height = ?';
@@ -524,6 +546,12 @@ module.exports = function registerAdminContentRoutes(app, deps) {
previousUploadRefs: existingUploadRefs,
nextUploadRefs: nextUploadRefs
});
const templateSlides = await fetchSlidesByTemplateId(template.id);
if (templateSlides.length > 0) {
queueTemplateSlideThumbnailRefresh(template.id).catch(function (error) {
console.warn('Unable to queue template slide thumbnail refresh:', error);
});
}
await notifyPlayerScreens(affectedScreens, 'refresh');
redirectAfterSave(req, res, '/templates/' + template.id + '/edit', {
closeUrl: '/templates',
+10 -8
View File
@@ -147,7 +147,6 @@ module.exports = function registerAdminRbacRoutes(app, deps) {
const permissionRows = await rbacData.fetchPermissions(pool);
const selectedPermissionKeys = await rbacData.fetchRolePermissionKeys(pool, role.id);
const selectedUserIds = await rbacData.fetchRoleUserIds(pool, role.id);
const users = await rbacData.fetchUsersWithRoles(pool);
return {
role: Object.assign({}, role, {
permissionKeys: selectedPermissionKeys,
@@ -155,7 +154,7 @@ module.exports = function registerAdminRbacRoutes(app, deps) {
userCount: Number(role.user_count) || 0
}),
permissionGroups: buildPermissionGroups(mapPermissionsForView(permissionRows, selectedPermissionKeys)),
users: mapUsersForView(users, selectedUserIds)
selectedUserIds: selectedUserIds
};
}
@@ -251,14 +250,17 @@ module.exports = function registerAdminRbacRoutes(app, deps) {
return res.status(404).send('Role not found.');
}
const page = Math.max(1, Math.floor(Number(req.query.page) || 1));
const search = common.getSearchQuery(req);
const sort = common.getSortQuery(req);
const direction = common.getSortDirectionQuery(req);
const currentUserId = req.currentUser ? Number(req.currentUser.id) : null;
const users = Array.isArray(viewModel.users)
? viewModel.users.filter(function (user) {
return Number(user && user.id) !== currentUserId;
})
: [];
const data = await rbacData.fetchUsersWithRolesPage(pool, page, LIST_PAGE_SIZE, search, sort, direction, {
excludeUserId: currentUserId
});
const users = mapUsersForView(data.users, viewModel.selectedUserIds);
res.send(pages.renderRbacEditPage(viewModel.role, req.query.message ? String(req.query.message) : '', req.currentUser, viewModel.permissionGroups, users));
res.send(pages.renderRbacEditPage(viewModel.role, req.query.message ? String(req.query.message) : '', req.currentUser, viewModel.permissionGroups, users, buildPagination(data.totalItems, data.currentPage, 'page', { search: search, sort: sort, direction: direction }, LIST_PAGE_SIZE, 'users', 'User pages')));
} catch (error) {
next(error);
}