From af451350a43ac27bc25866acd57f6f4218d66d86 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 25 Mar 2022 13:58:05 -0400 Subject: [PATCH] Add feature request processwire/processwire-requests#346 - add support for Inputfield::collapsedNoLocked and add a separate collapsedBlankLocked constant --- wire/core/Field.php | 11 +++++++++-- wire/core/Inputfield.php | 16 ++++++++++++---- wire/core/InputfieldWrapper.php | 6 ++++-- .../InputfieldPage/InputfieldPage.module | 2 +- .../InputfieldText/InputfieldText.module | 2 +- .../Process/ProcessPageAdd/ProcessPageAdd.module | 6 ++++-- .../ProcessPageEdit/ProcessPageEdit.module | 1 + 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/wire/core/Field.php b/wire/core/Field.php index 2ef62901..4cafcba2 100644 --- a/wire/core/Field.php +++ b/wire/core/Field.php @@ -1002,11 +1002,18 @@ class Field extends WireData implements Saveable, Exportable { } else if($locked) { // Inputfield is locked as a result of access control $collapsed = $inputfield->getSetting('collapsed'); - $ignoreCollapsed = array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked, Inputfield::collapsedHidden); + $ignoreCollapsed = array( + Inputfield::collapsedNoLocked, + Inputfield::collapsedBlankLocked, + Inputfield::collapsedYesLocked, + Inputfield::collapsedHidden + ); if(!in_array($collapsed, $ignoreCollapsed)) { // Inputfield is not already locked or hidden, convert to locked equivalent - if($collapsed == Inputfield::collapsedYes || $collapsed == Inputfield::collapsedBlank) { + if($collapsed == Inputfield::collapsedYes) { $collapsed = Inputfield::collapsedYesLocked; + } else if($collapsed == Inputfield::collapsedBlank) { + $collapsed = Inputfield::collapsedBlankLocked; } else if($collapsed == Inputfield::collapsedNo) { $collapsed = Inputfield::collapsedNoLocked; } else { diff --git a/wire/core/Inputfield.php b/wire/core/Inputfield.php index b6b9adf2..2aa000ab 100644 --- a/wire/core/Inputfield.php +++ b/wire/core/Inputfield.php @@ -168,13 +168,20 @@ abstract class Inputfield extends WireData implements Module { * */ const collapsedPopulated = 5; - + /** * Not collapsed, value visible but not editable * #pw-group-collapsed-constants + * + */ + const collapsedNoLocked = 6; + + /** + * Collapsed when blank, value visible but not editable + * #pw-group-collapsed-constants * */ - const collapsedNoLocked = 7; + const collapsedBlankLocked = 7; /** * Collapsed unless opened (value becomes visible but not editable) @@ -1448,12 +1455,13 @@ abstract class Inputfield extends WireData implements Module { $field->description = $this->_("How should this field be displayed in the editor?"); $field->addOption(self::collapsedNo, $this->_('Open')); $field->addOption(self::collapsedNever, $this->_('Open + Cannot be closed')); + $field->addOption(self::collapsedNoLocked, $this->_('Open + Locked (not editable)')); $field->addOption(self::collapsedBlank, $this->_('Open when populated + Closed when blank')); if($this->hasFieldtype !== false) { $field->addOption(self::collapsedBlankAjax, $this->_('Open when populated + Closed when blank + Load only when opened (AJAX)') . " †"); } - $field->addOption(self::collapsedNoLocked, $this->_('Open when populated + Closed when blank + Locked (not editable)')); - $field->addOption(self::collapsedPopulated, $this->_('Open when blank + Closed when populated')); + $field->addOption(self::collapsedBlankLocked, $this->_('Open when populated + Closed when blank + Locked (not editable)')); + $field->addOption(self::collapsedPopulated, $this->_('Open when blank + Closed when populated')); $field->addOption(self::collapsedYes, $this->_('Closed')); $field->addOption(self::collapsedYesLocked, $this->_('Closed + Locked (not editable)')); if($this->hasFieldtype !== false) { diff --git a/wire/core/InputfieldWrapper.php b/wire/core/InputfieldWrapper.php index 2881e79c..d5517beb 100644 --- a/wire/core/InputfieldWrapper.php +++ b/wire/core/InputfieldWrapper.php @@ -684,6 +684,7 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre $classes = array(); $useColumnWidth = $this->useColumnWidth; $renderAjaxInputfield = $this->wire()->config->ajax ? $this->wire()->input->get('renderInputfieldAjax') : null; + $lockedStates = array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked, Inputfield::collapsedBlankLocked); if($useColumnWidth === true && isset($_classes['form']) && strpos($_classes['form'], 'InputfieldFormNoWidths') !== false) { $useColumnWidth = false; @@ -718,7 +719,7 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre $showIf = $inputfield->getSetting('showIf'); if($collapsed == Inputfield::collapsedHidden) continue; - if($collapsed == Inputfield::collapsedNoLocked || $collapsed == Inputfield::collapsedYesLocked) $renderValueMode = true; + if(in_array($collapsed, $lockedStates)) $renderValueMode = true; $ffOut = $this->renderInputfield($inputfield, $renderValueMode); if(!strlen($ffOut)) continue; @@ -797,7 +798,7 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre $collapsed === Inputfield::collapsedYesAjax || ($isEmpty && $collapsed === Inputfield::collapsedBlank) || ($isEmpty && $collapsed === Inputfield::collapsedBlankAjax) || - ($isEmpty && $collapsed === Inputfield::collapsedNoLocked) || // collapsedNoLocked assumed to be like a collapsedBlankLocked + ($isEmpty && $collapsed === Inputfield::collapsedBlankLocked) || (!$isEmpty && $collapsed === Inputfield::collapsedPopulated)) { $ffAttrs['class'] .= ' ' . $classes['item_collapsed']; } @@ -1157,6 +1158,7 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre Inputfield::collapsedHidden, Inputfield::collapsedLocked, Inputfield::collapsedNoLocked, + Inputfield::collapsedBlankLocked, Inputfield::collapsedYesLocked ); $collapsed = (int) $inputfield->getSetting('collapsed'); diff --git a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module index 2c5dea7d..df89f0ae 100644 --- a/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module +++ b/wire/modules/Inputfield/InputfieldPage/InputfieldPage.module @@ -344,7 +344,7 @@ class InputfieldPage extends Inputfield implements ConfigurableModule { public function ___getSelectablePages(Page $page) { $pages = $this->wire()->pages; - $lockedModes = array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked); + $lockedModes = array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked, Inputfield::collapsedBlankLocked); $statusUnder = $this->allowUnpub ? Page::statusTrash : Page::statusUnpublished; $children = null; $templateIDs = $this->getTemplateIDs(true); diff --git a/wire/modules/Inputfield/InputfieldText/InputfieldText.module b/wire/modules/Inputfield/InputfieldText/InputfieldText.module index 0321a4fc..401200c9 100644 --- a/wire/modules/Inputfield/InputfieldText/InputfieldText.module +++ b/wire/modules/Inputfield/InputfieldText/InputfieldText.module @@ -135,7 +135,7 @@ class InputfieldText extends Inputfield { } if($this->initValue) { - if(!strlen($attrs['value'])) { + if(!strlen("$attrs[value]")) { $attrs['value'] = $this->initValue; } } diff --git a/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module b/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module index f10010b5..3319aa47 100644 --- a/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module +++ b/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module @@ -829,6 +829,8 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit $pages = $this->wire()->pages; $fields = $this->wire()->fields; $user = $this->wire()->user; + + $lockedStates = array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked, Inputfield::collapsedBlankLocked); /** @var InputfieldForm $form */ $form = $modules->get('InputfieldForm'); @@ -847,7 +849,7 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit $_field = $this->template->fieldgroup->getField($field->id, true); // get in context of fieldgroup if($_field) $field = $_field; } - if(in_array($field->collapsed, array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked))) continue; + if(in_array($field->collapsed, $lockedStates)) continue; $inputfield = $field->getInputfield($page); if($inputfield) { if($this->template && $this->template->noLang) $inputfield->useLanguages = false; @@ -861,7 +863,7 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit /** @var Field $field */ $field = $this->template->fieldgroup->getField('title', true); if($field) { - if(in_array($field->collapsed, array(Inputfield::collapsedNoLocked, Inputfield::collapsedYesLocked))) { + if(in_array($field->collapsed, $lockedStates)) { // skip it } else { $inputfield = $field->getInputfield($page); diff --git a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module index dc9f5332..34905569 100644 --- a/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module +++ b/wire/modules/Process/ProcessPageEdit/ProcessPageEdit.module @@ -912,6 +912,7 @@ class ProcessPageEdit extends Process implements WirePageEditor, ConfigurableMod $skipCollapsed = array( Inputfield::collapsedHidden, Inputfield::collapsedNoLocked, + Inputfield::collapsedBlankLocked, Inputfield::collapsedYesLocked, ); $collapsed = $inputfield->getSetting('collapsed');