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.
This commit is contained in:
Luke Towers 2020-03-30 18:07:53 -06:00
parent 0522f50bf4
commit 52cdfda935
2 changed files with 11 additions and 5 deletions

View File

@ -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 () {

View File

@ -123,8 +123,10 @@
* 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))
$(document).on('change.oc.formwidget',
'[data-field-name="' + fieldName + '"]',
$.proxy(self.onRefreshDependants, self, fieldName, toRefresh)
);
})
}