Release v2.17.4: add API region sorting and indexed placeholders
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m17s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 1m10s

This commit is contained in:
lzstealth committed 2026-10-23 20:54:15 +01:00
1 parent bc8075379a
commit 46636939de
18 files changed
+709 -232

No files matched your search

+57 -18
View File
@@ -748,8 +748,8 @@ import { createSlideAnimationEditor } from '/assets/js/slides/slide-animation-ed
var getCurrentRssConfig = slideRegionHelpers.getCurrentRssConfig;
var getApiFieldList = slideRegionHelpers.getApiFieldList;
var updateApiPlaceholderChips = slideRegionHelpers.updateApiPlaceholderChips;
var updateApiItemsPathReset = slideRegionHelpers.updateApiItemsPathReset;
var updateApiSampleDataPanel = slideRegionHelpers.updateApiSampleDataPanel;
var updateApiItemNumberLimit = slideRegionHelpers.updateApiItemNumberLimit;
var getCurrentApiConfig = slideRegionHelpers.getCurrentApiConfig;
var updateRssItemNumberLimit = slideRegionHelpers.updateRssItemNumberLimit;
@@ -768,6 +768,9 @@ import { createSlideAnimationEditor } from '/assets/js/slides/slide-animation-ed
templateFields.innerHTML = template.regions.length ? template.regions.map(function (region) {
return getRegionEditorCardHtml(region) || '<div class="muted">Region editor unavailable.</div>';
}).join('') : '<div class="muted">This template has no regions.</div>';
if (typeof window.initJsonTogglePanels === 'function') {
window.initJsonTogglePanels(templateFields);
}
if (window.adminlte && typeof window.adminlte.CardWidget === 'function') {
templateFields.querySelectorAll('.card-widget[data-region-id]').forEach(function (card) {
@@ -787,14 +790,6 @@ import { createSlideAnimationEditor } from '/assets/js/slides/slide-animation-ed
window.requestAnimationFrame(function () {
bindRegionCards();
});
templateFields.querySelectorAll('input[name^="region_api_item_number_"]').forEach(function (input) {
var regionId = input.name.replace(/^region_api_item_number_/, '');
var sourceInput = templateFields.querySelector('select[name="region_api_source_id_' + regionId + '"]');
var pathInput = templateFields.querySelector('input[name="region_api_items_path_' + regionId + '"]');
if (sourceInput) {
updateApiItemNumberLimit(regionId, sourceInput.value, pathInput ? pathInput.value : '');
}
});
templateFields.querySelectorAll('input[name^="region_rss_item_number_"]').forEach(function (input) {
var regionId = input.name.replace(/^region_rss_item_number_/, '');
var feedInput = templateFields.querySelector('select[name="region_rss_feed_id_' + regionId + '"]');
@@ -852,39 +847,59 @@ import { createSlideAnimationEditor } from '/assets/js/slides/slide-animation-ed
}
});
}
templateFields.querySelectorAll('select[name^="region_rss_feed_id_"], input[name^="region_rss_item_number_"], select[name^="region_api_source_id_"], input[name^="region_api_item_number_"], input[name^="region_api_items_path_"]').forEach(function (input) {
templateFields.querySelectorAll('select[name^="region_rss_feed_id_"], input[name^="region_rss_item_number_"], select[name^="region_api_source_id_"], input[name^="region_api_items_path_"], select[name^="region_api_sort_mode_"], input[name^="region_api_sort_by_"], select[name^="region_api_sort_direction_"]').forEach(function (input) {
input.addEventListener('input', function () {
var regionId = input.name.replace(/^region_(?:rss_feed_id|rss_item_number|api_source_id|api_item_number|api_items_path)_/, '');
var regionId = input.name.replace(/^region_(?:rss_feed_id|rss_item_number|api_source_id|api_items_path|api_sort_mode|api_sort_by|api_sort_direction)_/, '');
if (input.name.indexOf('region_rss_') === 0) {
var rssFeed = input.name.indexOf('region_rss_feed_id_') === 0 ? input.value : (templateFields.querySelector('select[name="region_rss_feed_id_' + regionId + '"]') || {}).value;
updateRssPlaceholderChips(regionId, rssFeed);
updateRssItemNumberLimit(regionId, rssFeed);
}
if (input.name.indexOf('region_api_') === 0) {
var apiSortMode = templateFields.querySelector('select[name="region_api_sort_mode_' + regionId + '"]');
var apiSortByInput = templateFields.querySelector('input[name="region_api_sort_by_' + regionId + '"]');
var apiSortFieldWrap = apiSortByInput && apiSortByInput.closest('[data-api-sort-field-wrap]');
var apiSortDirection = templateFields.querySelector('select[name="region_api_sort_direction_' + regionId + '"]');
var apiSortDirectionWrap = apiSortDirection && apiSortDirection.closest('[data-api-sort-direction-wrap]');
var apiSortEnabled = apiSortMode && apiSortMode.value === 'field';
if (apiSortFieldWrap) apiSortFieldWrap.hidden = !apiSortEnabled;
if (apiSortDirectionWrap) apiSortDirectionWrap.hidden = !apiSortEnabled;
if (apiSortMode && !apiSortEnabled && apiSortByInput) apiSortByInput.value = '';
var apiSource = input.name.indexOf('region_api_source_id_') === 0 ? input.value : (templateFields.querySelector('select[name="region_api_source_id_' + regionId + '"]') || {}).value;
var apiItemNumber = input.name.indexOf('region_api_item_number_') === 0 ? input.value : (templateFields.querySelector('input[name="region_api_item_number_' + regionId + '"]') || {}).value;
var apiItemsPath = input.name.indexOf('region_api_items_path_') === 0 ? input.value : (templateFields.querySelector('input[name="region_api_items_path_' + regionId + '"]') || {}).value;
updateApiItemNumberLimit(regionId, apiSource, apiItemsPath);
var apiSortBy = apiSortEnabled && apiSortByInput ? apiSortByInput.value : '';
var apiSortDirectionValue = apiSortDirection ? apiSortDirection.value : 'asc';
updateApiItemsPathReset(regionId, apiSource);
updateApiPlaceholderChips(regionId, apiSource, apiItemsPath);
updateApiSampleDataPanel(regionId, apiSource, apiItemNumber, apiItemsPath);
updateApiSampleDataPanel(regionId, apiSource, apiItemsPath, apiSortBy, apiSortDirectionValue);
}
templateSelectorLock.markEdited();
requestPreviewRender();
});
input.addEventListener('change', function () {
var regionId = input.name.replace(/^region_(?:rss_feed_id|rss_item_number|api_source_id|api_item_number|api_items_path)_/, '');
var regionId = input.name.replace(/^region_(?:rss_feed_id|rss_item_number|api_source_id|api_items_path|api_sort_mode|api_sort_by|api_sort_direction)_/, '');
if (input.name.indexOf('region_rss_') === 0) {
var rssFeed = input.name.indexOf('region_rss_feed_id_') === 0 ? input.value : (templateFields.querySelector('select[name="region_rss_feed_id_' + regionId + '"]') || {}).value;
updateRssPlaceholderChips(regionId, rssFeed);
updateRssItemNumberLimit(regionId, rssFeed);
}
if (input.name.indexOf('region_api_') === 0) {
var apiSortMode = templateFields.querySelector('select[name="region_api_sort_mode_' + regionId + '"]');
var apiSortByInput = templateFields.querySelector('input[name="region_api_sort_by_' + regionId + '"]');
var apiSortFieldWrap = apiSortByInput && apiSortByInput.closest('[data-api-sort-field-wrap]');
var apiSortDirection = templateFields.querySelector('select[name="region_api_sort_direction_' + regionId + '"]');
var apiSortDirectionWrap = apiSortDirection && apiSortDirection.closest('[data-api-sort-direction-wrap]');
var apiSortEnabled = apiSortMode && apiSortMode.value === 'field';
if (apiSortFieldWrap) apiSortFieldWrap.hidden = !apiSortEnabled;
if (apiSortDirectionWrap) apiSortDirectionWrap.hidden = !apiSortEnabled;
if (apiSortMode && !apiSortEnabled && apiSortByInput) apiSortByInput.value = '';
var apiSource = input.name.indexOf('region_api_source_id_') === 0 ? input.value : (templateFields.querySelector('select[name="region_api_source_id_' + regionId + '"]') || {}).value;
var apiItemNumber = input.name.indexOf('region_api_item_number_') === 0 ? input.value : (templateFields.querySelector('input[name="region_api_item_number_' + regionId + '"]') || {}).value;
var apiItemsPath = input.name.indexOf('region_api_items_path_') === 0 ? input.value : (templateFields.querySelector('input[name="region_api_items_path_' + regionId + '"]') || {}).value;
updateApiItemNumberLimit(regionId, apiSource, apiItemsPath);
var apiSortBy = apiSortEnabled && apiSortByInput ? apiSortByInput.value : '';
var apiSortDirectionValue = apiSortDirection ? apiSortDirection.value : 'asc';
updateApiItemsPathReset(regionId, apiSource);
updateApiPlaceholderChips(regionId, apiSource, apiItemsPath);
updateApiSampleDataPanel(regionId, apiSource, apiItemNumber, apiItemsPath);
updateApiSampleDataPanel(regionId, apiSource, apiItemsPath, apiSortBy, apiSortDirectionValue);
}
templateSelectorLock.markEdited();
requestPreviewRender();
@@ -989,6 +1004,30 @@ import { createSlideAnimationEditor } from '/assets/js/slides/slide-animation-ed
requestPreviewRender();
});
templateFields.addEventListener('click', function (event) {
var advancedToggle = event.target && typeof event.target.closest === 'function' ? event.target.closest('[data-api-advanced-toggle]') : null;
if (advancedToggle) {
var advancedPanel = templateFields.querySelector('#' + advancedToggle.getAttribute('aria-controls'));
if (advancedPanel) {
var isExpanded = advancedToggle.getAttribute('aria-expanded') === 'true';
advancedToggle.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');
advancedPanel.hidden = isExpanded;
advancedToggle.classList.toggle('btn-outline-secondary', isExpanded);
advancedToggle.classList.toggle('btn-secondary', !isExpanded);
}
return;
}
var sampleToggle = event.target && typeof event.target.closest === 'function' ? event.target.closest('[data-api-sample-toggle]') : null;
if (sampleToggle) {
var sampleAccordion = sampleToggle.closest('[data-api-sample-data-accordion]');
var samplePanel = sampleAccordion && sampleAccordion.querySelector('[data-api-sample-data-panel]');
if (sampleAccordion && samplePanel) {
var isExpanded = sampleToggle.getAttribute('aria-expanded') === 'true';
sampleToggle.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');
sampleAccordion.classList.toggle('is-open', !isExpanded);
samplePanel.hidden = isExpanded;
}
return;
}
var button = event.target && typeof event.target.closest === 'function' ? event.target.closest('[data-api-items-path-reset]') : null;
var webpageUpdateButton = event.target && typeof event.target.closest === 'function' ? event.target.closest('[data-webpage-preview-update]') : null;
if (!button) {