diff --git a/modules/backend/formwidgets/Repeater.php b/modules/backend/formwidgets/Repeater.php index 2981a770a..15786a842 100644 --- a/modules/backend/formwidgets/Repeater.php +++ b/modules/backend/formwidgets/Repeater.php @@ -1,8 +1,9 @@ vars['prompt'] = $this->prompt; $this->vars['formWidgets'] = $this->formWidgets; $this->vars['titleFrom'] = $this->titleFrom; + $this->vars['minItems'] = $this->minItems; $this->vars['maxItems'] = $this->maxItems; $this->vars['useGroups'] = $this->useGroups; @@ -184,6 +192,13 @@ class Repeater extends FormWidgetBase } } + if ($this->minItems && count($value) < $this->minItems) { + throw new ApplicationException(Lang::get('backend::lang.repeater.min_items_failed', ['name' => $this->fieldName, 'min' => $this->minItems, 'items' => count($value)])); + } + if ($this->maxItems && count($value) > $this->maxItems) { + throw new ApplicationException(Lang::get('backend::lang.repeater.max_items_failed', ['name' => $this->fieldName, 'max' => $this->maxItems, 'items' => count($value)])); + } + return array_values($value); } @@ -196,6 +211,21 @@ class Repeater extends FormWidgetBase $loadedIndexes = $loadedGroups = []; $loadValue = $this->getLoadValue(); + // Ensure that the minimum number of items are preinitialized + // ONLY DONE WHEN NOT IN GROUP MODE + if (!$this->useGroups && $this->minItems > 0) { + if (!is_array($loadValue)) { + $loadValue = []; + for ($i = 0; $i < $this->minItems; $i++) { + $loadValue[$i] = []; + } + } elseif (count($loadValue) < $this->minItems) { + for ($i = 0; $i < ($this->minItems - count($loadValue)); $i++) { + $loadValue[] = []; + } + } + } + if (is_array($loadValue)) { foreach ($loadValue as $index => $loadedValue) { $loadedIndexes[] = $index; diff --git a/modules/backend/formwidgets/repeater/assets/js/repeater.js b/modules/backend/formwidgets/repeater/assets/js/repeater.js index 8e17827e5..042bba684 100644 --- a/modules/backend/formwidgets/repeater/assets/js/repeater.js +++ b/modules/backend/formwidgets/repeater/assets/js/repeater.js @@ -34,6 +34,7 @@ sortableHandle: '.repeater-item-handle', sortableContainer: 'ul.field-repeater-items', titleFrom: null, + minItems: null, maxItems: null } @@ -122,6 +123,13 @@ } Repeater.prototype.togglePrompt = function () { + if (this.options.minItems && this.options.minItems > 0) { + var repeatedItems = this.$el.find('> .field-repeater-items > .field-repeater-item').length, + $removeItemBtn = this.$el.find('> .field-repeater-items > .field-repeater-item > .repeater-item-remove') + + $removeItemBtn.toggle(repeatedItems > this.options.minItems) + } + if (this.options.maxItems && this.options.maxItems > 0) { var repeatedItems = this.$el.find('> .field-repeater-items > .field-repeater-item').length, $addItemBtn = this.$el.find('> .field-repeater-add-item') diff --git a/modules/backend/formwidgets/repeater/partials/_repeater.htm b/modules/backend/formwidgets/repeater/partials/_repeater.htm index 5cdfb0f06..995c42cd8 100644 --- a/modules/backend/formwidgets/repeater/partials/_repeater.htm +++ b/modules/backend/formwidgets/repeater/partials/_repeater.htm @@ -1,6 +1,7 @@