Release 2.9.0

This commit is contained in:
2026-08-28 02:53:59 +01:00
parent 9097d45d6a
commit 3de0e89e94
67 changed files with 1767 additions and 98 deletions
@@ -25,6 +25,7 @@ function buildSlideFormViewModel(data, slide, message, currentUser, isEdit) {
const rssFeeds = data && data.rssFeeds ? data.rssFeeds : [];
const apiSources = data && data.apiSources ? data.apiSources : [];
const timetableGroups = data && data.timetableGroups ? data.timetableGroups : [];
const weatherLocations = data && data.weatherLocations ? data.weatherLocations : [];
const fontLibrary = data && data.fontLibrary ? data.fontLibrary : null;
const uploadLimits = data && data.uploadLimits ? data.uploadLimits : {};
const templates = buildTemplates(data && data.templates ? data.templates : [], templateRegions);
@@ -48,6 +49,7 @@ function buildSlideFormViewModel(data, slide, message, currentUser, isEdit) {
rssFeeds: rssFeeds,
apiSources: apiSources,
timetableGroups: timetableGroups,
weatherLocations: weatherLocations,
fontStylesheetHref: fontLibrary && fontLibrary.stylesheetHref ? fontLibrary.stylesheetHref : '',
fontFamilyFormats: fontLibrary && fontLibrary.fontFamilyFormats ? fontLibrary.fontFamilyFormats : '',
existingTemplateId: viewSlide && viewSlide.template_id ? viewSlide.template_id : null,
+19
View File
@@ -6,6 +6,7 @@ const crypto = require('crypto');
const path = require('path');
const { verifyRequestAuth, verifyPageAuthToken } = require('#src/request-auth');
const { getFontStylesheetHref } = require('#src/web/lib/media/font-library');
const { convertWeatherSnapshot } = require('#src/data/weather-units');
const { buildThumbnailPreviewPayload } = require('#src/web/lib/media/slide-thumbnails');
function safeJsonForScript(value) {
@@ -80,6 +81,20 @@ module.exports = function registerSlidesRoutes(app, deps) {
const apiSources = (apiData.apiSources || []).map(function (source) {
return Object.assign({}, source, { responseJson: common.parseJsonSafe ? common.parseJsonSafe(source.last_response_json) : null });
});
const weatherData = typeof common.fetchWeatherLocationsData === 'function' ? await common.fetchWeatherLocationsData(pool) : { weatherLocations: [] };
const weatherLocations = (weatherData.weatherLocations || []).map(function (location) {
const snapshot = common.parseJsonSafe ? common.parseJsonSafe(location.last_response_json) : null;
if (!snapshot || typeof snapshot !== 'object') return null;
const item = Object.assign({}, convertWeatherSnapshot(snapshot, {
temperature: location.temperature_unit === 'fahrenheit' ? 'fahrenheit' : 'celsius',
wind: location.wind_unit === 'mph' ? 'mph' : location.wind_unit === 'ms' ? 'ms' : 'kmh',
precipitation: location.precipitation_unit === 'inch' ? 'inch' : 'mm'
}), { location_label: location.location_label || '', name: location.name || '', timezone: location.timezone || '', temp_unit: location.temperature_unit === 'fahrenheit' ? '°F' : '°C', wind_unit: location.wind_unit === 'mph' ? 'mph' : location.wind_unit === 'ms' ? 'm/s' : 'km/h', precip_unit: location.precipitation_unit === 'inch' ? 'in' : 'mm' });
item.current = Object.assign({}, item.current || {}, { temperature_unit: location.temperature_unit === 'fahrenheit' ? '°F' : '°C', wind_speed_unit: location.wind_unit === 'mph' ? 'mph' : location.wind_unit === 'ms' ? 'm/s' : 'km/h', precipitation_unit: location.precipitation_unit === 'inch' ? 'in' : 'mm' });
item.daily = Object.assign({}, item.daily || {}, { temperature_unit: location.temperature_unit === 'fahrenheit' ? '°F' : '°C' });
item.hourly = Object.assign({}, item.hourly || {}, { temperature_unit: location.temperature_unit === 'fahrenheit' ? '°F' : '°C' });
return { id: location.id, data: item };
}).filter(Boolean);
const getApiItems = function (source) {
const response = source && source.responseJson;
const itemsPath = String(source && source.items_path || '').trim();
@@ -103,6 +118,10 @@ module.exports = function registerSlidesRoutes(app, deps) {
const feed = rssFeeds.find(function (entry) { return Number(entry.id) === Number(regionContent.feed_id); });
return feed && Array.isArray(feed.items) ? feed.items[index] || null : null;
}
if (type === 'weather') {
const location = weatherLocations.find(function (entry) { return Number(entry.id) === Number(regionContent.weather_location_id); });
return location ? location.data : null;
}
return null;
};
const getCachedImagePath = function (remoteUrl) {