diff --git a/admin/javascript/LeftAndMain.EditForm.js b/admin/javascript/LeftAndMain.EditForm.js index a9ee20fd9..9e62ca75e 100644 --- a/admin/javascript/LeftAndMain.EditForm.js +++ b/admin/javascript/LeftAndMain.EditForm.js @@ -46,6 +46,14 @@ ChangeTrackerOptions: { ignoreFieldSelector: '.no-change-track, .ss-upload :input, .cms-navigator :input' }, + + /** + * Variable: ValidationErrorShown + * Boolean for tracking whether a validation error has been already been shown. Used because tabs can + * sometimes be inadvertently initialised multiple times, but we don't want duplicate messages + * (Boolean) + */ + ValidationErrorShown: false, /** * Constructor: onmatch @@ -77,23 +85,44 @@ } } + // Reset error display + this.setValidationErrorShown(false); + // TODO // // Rewrite # links // html = html.replace(/(]+href *= *")#/g, '$1' + window.location.href.replace(/#.*$/,'') + '#'); // // // Rewrite iframe links (for IE) // html = html.replace(/(]*src=")([^"]+)("[^>]*>)/g, '$1' + $('base').attr('href') + '$2$3'); - - // Show validation errors if necessary - if(this.hasClass('validationerror')) { - // Ensure the first validation error is visible - var tabError = this.find('.message.validation, .message.required').first().closest('.tab'); - $('.cms-container').clearCurrentTabState(); // clear state to avoid override later on - tabError.closest('.ss-tabset').tabs('option', 'active', tabError.index('.tab')); - } this._super(); }, + 'from .cms-tabset': { + onafterredrawtabs: function () { + // Show validation errors if necessary + if(this.hasClass('validationerror')) { + // Ensure the first validation error is visible + var tabError = this.find('.message.validation, .message.required').first().closest('.tab'); + $('.cms-container').clearCurrentTabState(); // clear state to avoid override later on + + // Attempt #1: Look for nearest .ss-tabset (usually nested deeper underneath a .cms-tabset). + var $tabSet = tabError.closest('.ss-tabset'); + + // Attempt #2: Next level in tab-ception, try to select the tab within this higher level .cms-tabset if possible + if (!$tabSet.length) { + $tabSet = tabError.closest('.cms-tabset'); + } + + if ($tabSet.length) { + $tabSet.tabs('option', 'active', tabError.index('.tab')); + } else if (!this.getValidationErrorShown()) { + // Ensure that this error message popup won't be added more than once + this.setValidationErrorShown(true); + errorMessage(ss.i18n._t('ModelAdmin.VALIDATIONERROR', 'Validation Error')); + } + } + } + }, onremove: function() { this.changetracker('destroy'); this._super(); diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index c63787bd0..23d141c77 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -1450,6 +1450,8 @@ jQuery.noConflict(); } } }); + + this.trigger('afterredrawtabs'); }, /**