From 52cdfda93564723de684a0951c190d532c8f2dc7 Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Mon, 30 Mar 2020 18:07:53 -0600 Subject: [PATCH] Trigger form change events when items are added / removed in a repeater. Fixes #3595. Replaces #4736. Credit to @SebastiaanKloos for the initial solution. Also fixes a longstanding issue where dynamically added fields were not considered when refreshing dependant fields. --- .../backend/formwidgets/repeater/assets/js/repeater.js | 8 ++++++-- modules/backend/widgets/form/assets/js/october.form.js | 8 +++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/backend/formwidgets/repeater/assets/js/repeater.js b/modules/backend/formwidgets/repeater/assets/js/repeater.js index 615c8cfb8..d4e31a48e 100644 --- a/modules/backend/formwidgets/repeater/assets/js/repeater.js +++ b/modules/backend/formwidgets/repeater/assets/js/repeater.js @@ -118,8 +118,10 @@ } Repeater.prototype.onRemoveItemSuccess = function(ev) { + var $target = $(ev.target) + // Allow any widgets inside a deleted item to be disposed - $(ev.target).closest('.field-repeater-item').find('[data-disposable]').each(function () { + $target.closest('.field-repeater-item').find('[data-disposable]').each(function () { var $elem = $(this), control = $elem.data('control'), widget = $elem.data('oc.' + control) @@ -129,12 +131,14 @@ } }) - $(ev.target).closest('.field-repeater-item').remove() + $target.closest('[data-field-name]').trigger('change.oc.formwidget') + $target.closest('.field-repeater-item').remove() this.togglePrompt() } Repeater.prototype.onAddItemSuccess = function(ev) { this.togglePrompt() + $(ev.target).closest('[data-field-name]').trigger('change.oc.formwidget') } Repeater.prototype.togglePrompt = function () { diff --git a/modules/backend/widgets/form/assets/js/october.form.js b/modules/backend/widgets/form/assets/js/october.form.js index 6d1e7ded2..893c0460f 100644 --- a/modules/backend/widgets/form/assets/js/october.form.js +++ b/modules/backend/widgets/form/assets/js/october.form.js @@ -122,9 +122,11 @@ /* * When a master is updated, refresh its slaves */ - $.each(fieldMap, function(fieldName, toRefresh){ - fieldElements.filter('[data-field-name="'+fieldName+'"]') - .on('change.oc.formwidget', $.proxy(self.onRefreshDependants, self, fieldName, toRefresh)) + $.each(fieldMap, function(fieldName, toRefresh) { + $(document).on('change.oc.formwidget', + '[data-field-name="' + fieldName + '"]', + $.proxy(self.onRefreshDependants, self, fieldName, toRefresh) + ); }) }