From 377da15ec19be2224c86fcd4979536e04f37d2bd Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 3 Sep 2025 18:22:47 -0600 Subject: [PATCH] fix for broken GPM + fix for intermitten ajax error Signed-off-by: Andy Miller --- themes/grav/app/forms/state.js | 22 +++++++++++++---- themes/grav/app/updates/update.js | 13 ++++++++++- themes/grav/js/admin.min.js | 39 ++++++++++++++++++++++++------- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/themes/grav/app/forms/state.js b/themes/grav/app/forms/state.js index 01d069f9..4356e3d6 100644 --- a/themes/grav/app/forms/state.js +++ b/themes/grav/app/forms/state.js @@ -13,8 +13,15 @@ const DOMBehaviors = { preventUnload() { let selector = '[name="task"][value^="save"], [data-delete-action], [data-flex-safe-action]'; - if ($._data(window, 'events') && ($._data(window, 'events').beforeunload || []).filter((event) => event.namespace === '_grav').length) { - return; + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + // or check with jQuery's internal data store for jQuery >= 3.0 + try { + const hasData = typeof $._data === 'function'; + if (hasData && $._data(window, 'events') && ($._data(window, 'events').beforeunload || []).filter((event) => event.namespace === '_grav').length) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Allow some elements to leave the page without native confirmation @@ -33,8 +40,15 @@ const DOMBehaviors = { preventClickAway() { let selector = 'a[href]:not([href^="#"]):not([target="_blank"]):not([href^="javascript:"])'; - if ($._data($(selector).get(0), 'events') && ($._data($(selector).get(0), 'events').click || []).filter((event) => event.namespace === '_grav')) { - return; + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + try { + const hasData = typeof $._data === 'function'; + const element = $(selector).get(0); + if (element && hasData && $._data(element, 'events') && ($._data(element, 'events').click || []).filter((event) => event.namespace === '_grav')) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Prevent clicking away if the form state is dirty diff --git a/themes/grav/app/updates/update.js b/themes/grav/app/updates/update.js index 851486a8..5878beda 100644 --- a/themes/grav/app/updates/update.js +++ b/themes/grav/app/updates/update.js @@ -7,7 +7,18 @@ import { Instance as Update } from './index'; // Dashboard update and Grav update $(document).on('click.remodal', '[data-remodal-id="update-grav"] [data-remodal-action="confirm"]', () => { const element = $('#grav-update-button'); - element.html(`${translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT} ${formatBytes(Update.payload.grav.assets['grav-update'].size)}..`); + + // Safely get the file size with fallback + let sizeText = ''; + if (Update.payload && + Update.payload.grav && + Update.payload.grav.assets && + Update.payload.grav.assets['grav-update'] && + Update.payload.grav.assets['grav-update'].size) { + sizeText = ` ${formatBytes(Update.payload.grav.assets['grav-update'].size)}`; + } + + element.html(`${translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT}${sizeText}..`); element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-cloud-download').addClass('fa-refresh fa-spin'); diff --git a/themes/grav/js/admin.min.js b/themes/grav/js/admin.min.js index 56b2d190..7426d17a 100644 --- a/themes/grav/js/admin.min.js +++ b/themes/grav/js/admin.min.js @@ -1692,7 +1692,13 @@ function formatBytes(bytes, decimals) { // Dashboard update and Grav update external_jQuery_default()(document).on('click.remodal', '[data-remodal-id="update-grav"] [data-remodal-action="confirm"]', function () { var element = external_jQuery_default()('#grav-update-button'); - element.html("".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT, " ").concat(formatBytes(updates_Instance.payload.grav.assets['grav-update'].size), "..")); + + // Safely get the file size with fallback + var sizeText = ''; + if (updates_Instance.payload && updates_Instance.payload.grav && updates_Instance.payload.grav.assets && updates_Instance.payload.grav.assets['grav-update'] && updates_Instance.payload.grav.assets['grav-update'].size) { + sizeText = " ".concat(formatBytes(updates_Instance.payload.grav.assets['grav-update'].size)); + } + element.html("".concat(external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.UPDATING_PLEASE_WAIT).concat(sizeText, "..")); element.attr('disabled', 'disabled').find('> .fa').removeClass('fa-cloud-download').addClass('fa-refresh fa-spin'); utils_request(updates_Instance.updateURL, function (response) { if (response.type === 'updategrav') { @@ -4225,10 +4231,17 @@ var DOMBehaviors = { }, preventUnload: function preventUnload() { var selector = '[name="task"][value^="save"], [data-delete-action], [data-flex-safe-action]'; - if (external_jQuery_default()._data(window, 'events') && (external_jQuery_default()._data(window, 'events').beforeunload || []).filter(function (event) { - return event.namespace === '_grav'; - }).length) { - return; + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + // or check with jQuery's internal data store for jQuery >= 3.0 + try { + var hasData = typeof (external_jQuery_default())._data === 'function'; + if (hasData && external_jQuery_default()._data(window, 'events') && (external_jQuery_default()._data(window, 'events').beforeunload || []).filter(function (event) { + return event.namespace === '_grav'; + }).length) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Allow some elements to leave the page without native confirmation @@ -4245,10 +4258,18 @@ var DOMBehaviors = { }, preventClickAway: function preventClickAway() { var selector = 'a[href]:not([href^="#"]):not([target="_blank"]):not([href^="javascript:"])'; - if (external_jQuery_default()._data(external_jQuery_default()(selector).get(0), 'events') && (external_jQuery_default()._data(external_jQuery_default()(selector).get(0), 'events').click || []).filter(function (event) { - return event.namespace === '_grav'; - })) { - return; + + // jQuery 3.x removed $._data, use $._data only if available (jQuery < 3.0) + try { + var hasData = typeof (external_jQuery_default())._data === 'function'; + var element = external_jQuery_default()(selector).get(0); + if (element && hasData && external_jQuery_default()._data(element, 'events') && (external_jQuery_default()._data(element, 'events').click || []).filter(function (event) { + return event.namespace === '_grav'; + })) { + return; + } + } catch (e) { + // $._data not available in jQuery 3.x+, continue with adding event handler } // Prevent clicking away if the form state is dirty