Release v2.5.6

This commit is contained in:
2026-08-05 19:38:16 +01:00
parent a8ef35b287
commit 9f831f04bc
161 changed files with 8487 additions and 1295 deletions
+97 -15
View File
@@ -178,12 +178,25 @@
return 'video';
}
if (button && button.hasAttribute('data-remove-region-qr-image')) {
return 'qr-image';
}
if (button && button.hasAttribute('data-remove-region-image')) {
return 'image';
}
if (card && card.dataset && String(card.dataset.regionMediaType || '').trim()) {
return String(card.dataset.regionMediaType || '').trim() === 'video' ? 'video' : 'image';
var regionMediaType = String(card.dataset.regionMediaType || '').trim();
if (regionMediaType === 'video') {
return 'video';
}
if (regionMediaType === 'qr-image') {
return 'qr-image';
}
return 'image';
}
return 'image';
@@ -194,7 +207,15 @@
return callbacks.getExistingMediaPrefix(mediaType);
}
return String(mediaType || '').trim() === 'video' ? 'existing_region_video_' : 'existing_region_image_';
if (String(mediaType || '').trim() === 'video') {
return 'existing_region_video_';
}
if (String(mediaType || '').trim() === 'qr-image') {
return 'existing_region_qr_image_';
}
return 'existing_region_image_';
}
function getMediaPrefix(mediaType) {
@@ -202,7 +223,15 @@
return callbacks.getMediaPrefix(mediaType);
}
return String(mediaType || '').trim() === 'video' ? 'region_video_' : 'region_image_';
if (String(mediaType || '').trim() === 'video') {
return 'region_video_';
}
if (String(mediaType || '').trim() === 'qr-image') {
return 'region_qr_image_';
}
return 'region_image_';
}
function getVideoDurationHiddenInput(regionId) {
@@ -214,18 +243,33 @@
}
function handleRemove(button) {
var regionId = button.getAttribute('data-remove-region-image') || button.getAttribute('data-remove-region-video');
var regionId = button.getAttribute('data-remove-region-image') || button.getAttribute('data-remove-region-video') || button.getAttribute('data-remove-region-qr-image');
var card = getCard(regionId);
var mediaType = getMediaType(button, card);
var hidden = card && card.querySelector('input[type="hidden"][name="' + getExistingPrefix(mediaType) + regionId + '"]');
var input = card && card.querySelector('input[type="file"][name="' + getMediaPrefix(mediaType) + regionId + '"]');
var hiddenName = getExistingPrefix(mediaType) + regionId;
var inputName = getMediaPrefix(mediaType) + regionId;
var hidden = card && card.querySelector('input[type="hidden"][name="' + hiddenName + '"]');
var input = card && card.querySelector('input[type="file"][name="' + inputName + '"]');
if (!hidden && regionId) {
hidden = templateFields.querySelector('input[type="hidden"][name="' + hiddenName + '"]');
}
if (!input && regionId) {
input = templateFields.querySelector('input[type="file"][name="' + inputName + '"]');
}
var uploadPath = input ? String(input.dataset.uploadedPath || '').trim() : '';
var hasPendingUpload = input && input.dataset && String(input.dataset.uploadToken || '').trim();
if (input && input.dataset.previewUrl) {
URL.revokeObjectURL(input.dataset.previewUrl);
delete input.dataset.previewUrl;
}
if (input && hasPendingUpload) {
input.dataset.uploadCancelRequested = '1';
}
if (input && input.dataset.uploadedNeedsCleanup === '1' && uploadPath && typeof callbacks.queueUploadCleanup === 'function') {
callbacks.queueUploadCleanup([uploadPath]);
}
@@ -238,6 +282,7 @@
if (hidden) {
hidden.value = '';
hidden.dispatchEvent(new Event('change', { bubbles: true }));
}
var durationHidden = getVideoDurationHiddenInput(regionId);
@@ -259,7 +304,7 @@
}
templateFields.addEventListener('click', function (event) {
var button = event.target && event.target.closest ? event.target.closest('[data-remove-region-image], [data-remove-region-video]') : null;
var button = event.target && event.target.closest ? event.target.closest('[data-remove-region-image], [data-remove-region-video], [data-remove-region-qr-image]') : null;
if (!button || !templateFields.contains(button)) {
return;
@@ -273,7 +318,7 @@
return;
}
var button = event.target && event.target.closest ? event.target.closest('[data-remove-region-image], [data-remove-region-video]') : null;
var button = event.target && event.target.closest ? event.target.closest('[data-remove-region-image], [data-remove-region-video], [data-remove-region-qr-image]') : null;
if (!button || !templateFields.contains(button)) {
return;
@@ -304,7 +349,15 @@
return callbacks.getMediaTypeFromInput(input);
}
return input && input.name && input.name.indexOf('region_video_') === 0 ? 'video' : 'image';
if (input && input.name && input.name.indexOf('region_video_') === 0) {
return 'video';
}
if (input && input.name && input.name.indexOf('region_qr_image_') === 0) {
return 'qr-image';
}
return 'image';
}
function getMediaPrefix(mediaType) {
@@ -312,7 +365,15 @@
return callbacks.getMediaPrefix(mediaType);
}
return String(mediaType || '').trim() === 'video' ? 'region_video_' : 'region_image_';
if (String(mediaType || '').trim() === 'video') {
return 'region_video_';
}
if (String(mediaType || '').trim() === 'qr-image') {
return 'region_qr_image_';
}
return 'region_image_';
}
function getExistingMediaPrefix(mediaType) {
@@ -320,7 +381,15 @@
return callbacks.getExistingMediaPrefix(mediaType);
}
return String(mediaType || '').trim() === 'video' ? 'existing_region_video_' : 'existing_region_image_';
if (String(mediaType || '').trim() === 'video') {
return 'existing_region_video_';
}
if (String(mediaType || '').trim() === 'qr-image') {
return 'existing_region_qr_image_';
}
return 'existing_region_image_';
}
function getUploadZone(input) {
@@ -440,7 +509,7 @@
}
function getPendingUploadCleanupPaths() {
return Array.prototype.slice.call(templateFields.querySelectorAll('input[type="file"][name^="region_image_"], input[type="file"][name^="region_video_"]')).map(function (input) {
return Array.prototype.slice.call(templateFields.querySelectorAll('input[type="file"][name^="region_image_"], input[type="file"][name^="region_video_"], input[type="file"][name^="region_qr_image_"]')).map(function (input) {
if (!input || String(input.dataset.uploadedNeedsCleanup || '') !== '1') {
return null;
}
@@ -450,7 +519,7 @@
}
function clearPendingUploadCleanupPaths() {
Array.prototype.slice.call(templateFields.querySelectorAll('input[type="file"][name^="region_image_"], input[type="file"][name^="region_video_"]')).forEach(function (input) {
Array.prototype.slice.call(templateFields.querySelectorAll('input[type="file"][name^="region_image_"], input[type="file"][name^="region_video_"], input[type="file"][name^="region_qr_image_"]')).forEach(function (input) {
if (!input) {
return;
}
@@ -465,7 +534,7 @@
}
var mediaType = getMediaTypeFromInput(input);
var regionId = input.name.replace(/^region_(?:image|video)_/, '');
var regionId = input.name.replace(/^region_(?:image|video|qr_image)_/, '');
var card = getCard(regionId);
var hidden = card && card.querySelector('input[type="hidden"][name="' + getExistingMediaPrefix(mediaType) + regionId + '"]');
var zone = getUploadZone(input);
@@ -475,6 +544,7 @@
var uploadUrl = String(callbacks.uploadUrl || '/slides/uploads');
var uploadTimeoutMs = Math.max(1, Number(callbacks.uploadTimeoutMs || 30000));
delete input.dataset.uploadCancelRequested;
input.dataset.uploadToken = uploadToken;
setUploadState(input, true, 0, 'Uploading...', true);
@@ -549,8 +619,19 @@
delete input.dataset.previewUrl;
}
if (String(input.dataset.uploadCancelRequested || '') === '1') {
if (uploadedPath) {
queueUploadCleanup([uploadedPath]);
}
setUploadState(input, false);
resolve(payload);
return;
}
if (hidden) {
hidden.value = uploadedPath;
hidden.dispatchEvent(new Event('change', { bubbles: true }));
}
input.dataset.uploadedPath = uploadedPath;
input.dataset.uploadedNeedsCleanup = '1';
@@ -611,6 +692,7 @@
xhr.onloadend = function () {
if (input.dataset.uploadToken === uploadToken) {
delete input.dataset.uploadToken;
delete input.dataset.uploadCancelRequested;
setUploadState(input, false);
}
};
@@ -647,7 +729,7 @@
templateFields.dataset.regionMediaUploadBound = '1';
templateFields.addEventListener('change', function (event) {
var input = event.target && event.target.matches && event.target.matches('input[type="file"][name^="region_image_"], input[type="file"][name^="region_video_"]') ? event.target : null;
var input = event.target && event.target.matches && event.target.matches('input[type="file"][name^="region_image_"], input[type="file"][name^="region_video_"], input[type="file"][name^="region_qr_image_"]') ? event.target : null;
if (!input || !templateFields.contains(input)) {
return;