diff --git a/wire/modules/AdminTheme/AdminThemeUikit/AdminThemeUikit.module b/wire/modules/AdminTheme/AdminThemeUikit/AdminThemeUikit.module index 70dea295..def4f2ad 100644 --- a/wire/modules/AdminTheme/AdminThemeUikit/AdminThemeUikit.module +++ b/wire/modules/AdminTheme/AdminThemeUikit/AdminThemeUikit.module @@ -564,11 +564,13 @@ class AdminThemeUikit extends AdminThemeFramework implements Module, Configurabl case 'highlight': $wrapClasses[] = 'InputfieldIsHighlight'; break; case 'none': break; } - - switch($themeBorder) { - case 'none': $wrapClasses[] = 'InputfieldNoBorder'; break; - case 'hide': $wrapClasses[] = 'InputfieldHideBorder'; break; - case 'card': $wrapClasses[] = 'uk-card uk-card-default'; break; + + if(strpos($inputfield->attr('name'), '_repeater') === false || $themeBorder === 'card') { + switch($themeBorder) { + case 'none': $wrapClasses[] = 'InputfieldNoBorder'; break; + case 'hide': $wrapClasses[] = 'InputfieldHideBorder'; break; + case 'card': $wrapClasses[] = 'uk-card uk-card-default'; break; + } } if($themeOffset && $themeOffset !== 'none') { diff --git a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module index 59d94b9e..35abab09 100644 --- a/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module +++ b/wire/modules/Fieldtype/FieldtypeRepeater/InputfieldRepeater.module @@ -5,18 +5,18 @@ * * Maintains a collection of fields that are repeated for any number of times. * - * ProcessWire 3.x, Copyright 2024 by Ryan Cramer + * ProcessWire 3.x, Copyright 2025 by Ryan Cramer * https://processwire.com * - * @property int $repeaterMaxItems - * @property int $repeaterMinItems - * @property int $repeaterDepth - * @property bool|int $familyFriendly - * @property bool|int $familyToggle - * @property bool|int $accordionMode - * @property bool|int $singleMode - * @property bool|int $loudControls Always show controls regardless of hover? - * @property bool|int $noScroll Do not scroll to newly added items? + * @property int $repeaterMaxItems Maximum repeater items or 0 for no max (default=0) + * @property int $repeaterMinItems Minimum repeater items or 0 for no min (default=0) + * @property int $repeaterDepth Maximum allowed depth for repeater items or 0 to disable (default=0) + * @property bool|int $familyFriendly This setting makes the admin page editor treat item depth as a parent/child relationship when it comes to sorting/moving items. (default=false) + * @property bool|int $familyToggle When enabled, opening (or closing) a repeater item also opens (or closes) the next items that are visually children of it, when combined with familyFriendly mode. (default=false) + * @property bool|int $accordionMode When enabled, only one repeater item will be open at a time. (default=false) + * @property bool|int $singleMode Limit repeater to a single item, primarily for the extending FieldsetPage module. (default=false) + * @property bool|int $loudControls Always show controls regardless of hover? (default=false) + * @property bool|int $noScroll Do not scroll to newly added items? (default=false) * * @method string renderRepeaterLabel($label, $cnt, Page $page) * @@ -27,8 +27,8 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { public static function getModuleInfo() { return array( - 'title' => __('Repeater', __FILE__), // Module Title - 'summary' => __('Repeats fields from another template. Provides the input for FieldtypeRepeater.', __FILE__), // Module Summary + 'title' => 'Repeater', + 'summary' => 'Repeats fields from another template. Provides the input for FieldtypeRepeater.', 'version' => 111, 'requires' => 'FieldtypeRepeater', ); @@ -393,12 +393,17 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { $minItems = $this->repeaterMinItems; // if there are a minimum required number of items, set them up now - if(!$itemID && $minItems > 0) { - $notIDs = $value->explode('id'); - while($value->count() < $minItems) { - $item = $this->getNextReadyPage($notIDs); - $value->add($item); - $notIDs[] = $item->id; + if(!$itemID && $minItems > 0 && $value instanceof PageArray) { + $process = $this->wire()->process; + if($process instanceof WirePageEditor && $process->getPage()->id === $this->page->id) { + // do not enforce minItems when repeater page being edited directly + } else { + $notIDs = $value->explode('id'); + while($value->count() < $minItems) { + $item = $this->getNextReadyPage($notIDs); + $value->add($item); + $notIDs[] = $item->id; + } } } @@ -485,6 +490,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { $itemType = $this->getRepeaterItemType($page); $itemTypeName = $this->getRepeaterItemTypeName($itemType); + $hasCustomColor = false; if(!$isPost) { $wrap->entityEncodeLabel = false; @@ -500,10 +506,24 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { // background-color definition if(strlen($matches[1]) === 3 || strlen($matches[1]) === 6) { $wrapLabel = str_replace($matches[0], '', $wrapLabel); + $hasCustomColor = true; $typeStyles[$itemTypeName] = ".Inputfield_$this->name .InputfieldContent " . - ".InputfieldRepeaterItem[data-typeName=\"$itemTypeName\"] > .InputfieldHeader " . - "{ background-color: #$matches[1]; outline-color: #$matches[1] }"; + ".InputfieldRepeaterItem[data-typeName=\"$itemTypeName\"]:not(.InputfieldRepeaterDeletePending) > " . + ".InputfieldHeader {" . + "background-color: #$matches[1]; " . + "outline-color: #$matches[1]; " . + "color: #fff; " . + "--pw-inputs-background: #$matches[1]; " . + "--pw-text-color: #fff; " . + "} " . + ".Inputfield_$this->name .InputfieldContent " . + ".InputfieldRepeaterItem[data-typeName=\"$itemTypeName\"]:not(.InputfieldRepeaterDeletePending) > " . + ".InputfieldHeader .ui-priority-secondary {" . + "color: #fff; " . + "--pw-text-color: #fff; " . + "opacity: 0.8" . + "}"; } } @@ -517,6 +537,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { $wrap->wrapAttr('data-typeName', $itemTypeName); $wrap->wrapAttr('data-fnsx', "_repeater$page->id"); // fnsx=field name suffix $wrap->wrapAttr('data-depth', $depth ? $depth->val() : '0'); + if($hasCustomColor) $wrap->addClass('InputfieldRepeaterColor'); if($wrapIcon) $wrap->wrapAttr('data-icon', $wrapIcon); //$wrap->wrapAttr('data-editorPage', $this->page->id); //$wrap->wrapAttr('data-parentPage', $page->parent->id); @@ -634,7 +655,7 @@ class InputfieldRepeater extends Inputfield implements InputfieldItemList { $this->form = $form; if(!$isPost && count($typeStyles)) { - $styles = ""; + $styles = ""; if($this->wire()->config->ajax && ($this->page instanceof RepeaterPage || $this->hasPage instanceof RepeaterPage)) { // ajax-rendered nested repeater page $this->prependMarkup .= $styles;