From dd35db30a85e9186813621f1d899696ba4a89ae1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:37:21 +0000 Subject: [PATCH 1/2] Initial plan From fde42b9b5c6cbb7aff9a6563dfd4da2a7c19c043 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:43:06 +0000 Subject: [PATCH 2/2] Fix code smells introduced in PR#151 (catch-expired-session) Co-authored-by: frwg <44997160+frwg@users.noreply.github.com> --- .../Resources/public/dataManager.element.js | 36 +++++++++---------- .../public/mapbender.element.digitizer.js | 6 ++-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/Mapbender/DataManagerBundle/Resources/public/dataManager.element.js b/src/Mapbender/DataManagerBundle/Resources/public/dataManager.element.js index feae3bfa..0f15246d 100644 --- a/src/Mapbender/DataManagerBundle/Resources/public/dataManager.element.js +++ b/src/Mapbender/DataManagerBundle/Resources/public/dataManager.element.js @@ -95,29 +95,24 @@ this._afterCreate(); }, _loadGrants: function () { - // Mapbender.handleAjaxError only exists in Mapbender >= 4.2.5 - const failListener = typeof Mapbender.handleAjaxError === 'function' - ? (e) => Mapbender.handleAjaxError(e, () => this._loadGrants()) - : this._onAjaxError.bind(this); - this.grantsRequest_ = $.getJSON(this.elementUrl + 'grants') - .then((mergeWith => allGrants => { + .then((allGrants) => { const schemaNames = Object.keys(allGrants); for (let schemaName of schemaNames) { if (allGrants[schemaName] === false) { - delete mergeWith[schemaName]; + delete this.options.schemes[schemaName]; } else { - Object.assign(mergeWith[schemaName], allGrants[schemaName]); + Object.assign(this.options.schemes[schemaName], allGrants[schemaName]); } } - })(this.options.schemes)) - .fail(failListener) + }) + .fail(this._createFailListener(() => this._loadGrants())) .then(() => this.updateSchemaSelector_()) ; this.onGrantsLoadStarted(); }, - onGrantsLoadStarted: function() { - // do nothing, can be overridden by digitizer + onGrantsLoadStarted: function () { + // do nothing, can be overridden by subclasses }, _createFormRenderer: function () { return new Mapbender.DataManager.FormRenderer(); @@ -626,10 +621,7 @@ this.$loadingIndicator_.css({opacity: 1}); this.fetchXhr = this.decorateXhr_(this.loadItems(this._getSelectRequestParams(schema)), this.$loadingIndicator_); - // Mapbender.handleAjaxError only exists in Mapbender >= 4.2.5 - const failListener = typeof Mapbender.handleAjaxError === 'function' - ? (e) => Mapbender.handleAjaxError(e, () => this._getData(schema)) - : this._onAjaxError.bind(this); + const failListener = this._createFailListener(() => this._getData(schema)); return this.fetchXhr .always(function () { @@ -755,10 +747,7 @@ } this.$loadingIndicator_.css({opacity: 1}); - // Mapbender.handleAjaxError only exists in Mapbender >= 4.2.5 - const failListener = typeof Mapbender.handleAjaxError === 'function' - ? (e) => Mapbender.handleAjaxError(e, () => this.postJSON(uri, data, options, onSuccess)) - : this._onAjaxError.bind(this); + const failListener = this._createFailListener(() => this.postJSON(uri, data, options, onSuccess)); let promise = this.decorateXhr_($.ajax(options_), this.$loadingIndicator_).fail(failListener); if (onSuccess) promise = promise.then(onSuccess); @@ -773,6 +762,13 @@ return jqXhr; }, // TODO: this can be removed for Mapbender 5 + _createFailListener: function (retryCallback) { + // Mapbender.handleAjaxError only exists in Mapbender >= 4.2.5 + return typeof Mapbender.handleAjaxError === 'function' + ? (e) => Mapbender.handleAjaxError(e, retryCallback) + : this._onAjaxError.bind(this); + }, + // TODO: this can be removed for Mapbender 5 _onAjaxError: function (xhr) { if (xhr.statusText === 'abort') { return; diff --git a/src/Mapbender/DigitizerBundle/Resources/public/mapbender.element.digitizer.js b/src/Mapbender/DigitizerBundle/Resources/public/mapbender.element.digitizer.js index 8e2ca2eb..61d503ee 100644 --- a/src/Mapbender/DigitizerBundle/Resources/public/mapbender.element.digitizer.js +++ b/src/Mapbender/DigitizerBundle/Resources/public/mapbender.element.digitizer.js @@ -31,7 +31,7 @@ this._super(); this.styleEditor = this._createStyleEditor(); this.wktFormat_ = new ol.format.WKT(); - // setup() called in onGrantsLoadStarted + // setup() and _start() called via onGrantsLoadStarted() → _onMapAndGrantsLoaded() }, _createTableRenderer: function() { return new Mapbender.Digitizer.TableRenderer(this, this.tableButtonsTemplate_); @@ -55,7 +55,7 @@ // Invoked only by data manager _create // do nothing; deliberately do NOT call parent method }, - onGrantsLoadStarted: function() { + onGrantsLoadStarted: function () { $.when(Mapbender.elementRegistry.waitReady('.mb-element-map'), this.grantsRequest_) .then((mbMap) => this._onMapAndGrantsLoaded(mbMap)); }, @@ -534,7 +534,7 @@ }); } var widget = this; - var promise = this.postJSON('update-multiple', postData, undefined,(response) => { + var promise = this.postJSON('update-multiple', postData, undefined, (response) => { var savedItems = response.saved; for (var i = 0; i < savedItems.length; ++i) { var savedItem = savedItems[i];