mirror of
https://github.com/processwire/processwire.git
synced 2025-08-18 12:31:17 +02:00
Add new page editor Inputfield visibility mode 'Tab' which makes any Inputfield display as a page editor tab. Options included for 'Tab', 'Tab (AJAX)', and 'Tab (locked)'.
This commit is contained in:
@@ -59,6 +59,7 @@
|
||||
* @property string $icon Optional font-awesome icon name to accompany label (excluding the "fa-") part). #pw-group-labels
|
||||
* @property string $requiredLabel Optional custom label to display when missing required value. @since 3.0.98 #pw-group-labels
|
||||
* @property string $head Optional text that appears below label but above description (only used by some Inputfields). #pw-internal
|
||||
* @property string $tabLabel Label for tab if Inputfield rendered in its own tab via Inputfield::collapsedTab* setting. @since 3.0.201 #pw-group-labels
|
||||
* @property string|null $prependMarkup Optional markup to prepend to the Inputfield content container. #pw-group-other
|
||||
* @property string|null $appendMarkup Optional markup to append to the Inputfield content container. #pw-group-other
|
||||
*
|
||||
@@ -218,6 +219,30 @@ abstract class Inputfield extends WireData implements Module {
|
||||
*/
|
||||
const collapsedBlankAjax = 11;
|
||||
|
||||
/**
|
||||
* Collapsed into a separate tab
|
||||
* #pw-group-collapsed-constants
|
||||
* @since 3.0.201
|
||||
*
|
||||
*/
|
||||
const collapsedTab = 20;
|
||||
|
||||
/**
|
||||
* Collapsed into a separate tab and AJAX loaded
|
||||
* #pw-group-collapsed-constants
|
||||
* @since 3.0.201
|
||||
*
|
||||
*/
|
||||
const collapsedTabAjax = 21;
|
||||
|
||||
/**
|
||||
* Collapsed into a separate tab and locked (not editable)
|
||||
* #pw-group-collapsed-constants
|
||||
* @since 3.0.201
|
||||
*
|
||||
*/
|
||||
const collapsedTabLocked = 22;
|
||||
|
||||
/**
|
||||
* Don't skip the label (default)
|
||||
* #pw-group-skipLabel-constants
|
||||
@@ -366,6 +391,7 @@ abstract class Inputfield extends WireData implements Module {
|
||||
$this->set('notes', ''); // highlighted descriptive copy, below output of input field
|
||||
$this->set('detail', ''); // text details that appear below notes
|
||||
$this->set('head', ''); // below label, above description
|
||||
$this->set('tabLabel', ''); // alternate label for tab when Inputfield::collapsedTab* in use
|
||||
$this->set('required', 0); // set to 1 to make value required for this field
|
||||
$this->set('requiredIf', ''); // optional conditions to make it required
|
||||
$this->set('collapsed', ''); // see the collapsed* constants at top of class (use blank string for unset value)
|
||||
@@ -1467,6 +1493,9 @@ abstract class Inputfield extends WireData implements Module {
|
||||
if($this->hasFieldtype !== false) {
|
||||
$field->addOption(self::collapsedYesAjax, $this->_('Closed + Load only when opened (AJAX)') . " †");
|
||||
$field->notes = sprintf($this->_('Options indicated with %s may not work with all input types or placements, test to ensure compatibility.'), '†');
|
||||
$field->addOption(self::collapsedTab, $this->_('Tab'));
|
||||
$field->addOption(self::collapsedTabAjax, $this->_('Tab + Load only when clicked (AJAX)') . " †");
|
||||
$field->addOption(self::collapsedTabLocked, $this->_('Tab + Locked (not editable)'));
|
||||
}
|
||||
$field->addOption(self::collapsedHidden, $this->_('Hidden (not shown in the editor)'));
|
||||
$field->attr('value', (int) $this->collapsed);
|
||||
|
@@ -697,7 +697,13 @@ 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);
|
||||
|
||||
$lockedStates = array(
|
||||
Inputfield::collapsedNoLocked,
|
||||
Inputfield::collapsedYesLocked,
|
||||
Inputfield::collapsedBlankLocked,
|
||||
Inputfield::collapsedTabLocked
|
||||
);
|
||||
|
||||
if($useColumnWidth === true && isset($_classes['form']) && strpos($_classes['form'], 'InputfieldFormNoWidths') !== false) {
|
||||
$useColumnWidth = false;
|
||||
@@ -988,8 +994,9 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
|
||||
public function ___renderInputfield(Inputfield $inputfield, $renderValueMode = false) {
|
||||
|
||||
$inputfieldID = $inputfield->attr('id');
|
||||
$collapsed = $inputfield->getSetting('collapsed');
|
||||
$ajaxInputfield = $collapsed == Inputfield::collapsedYesAjax || ($collapsed == Inputfield::collapsedBlankAjax && $inputfield->isEmpty());
|
||||
$collapsed = (int) $inputfield->getSetting('collapsed');
|
||||
$ajaxInputfield = $collapsed == Inputfield::collapsedYesAjax || $collapsed === Inputfield::collapsedTabAjax
|
||||
|| ($collapsed == Inputfield::collapsedBlankAjax && $inputfield->isEmpty());
|
||||
$ajaxHiddenInput = "<input type='hidden' name='processInputfieldAjax[]' value='$inputfieldID' />";
|
||||
$ajaxID = $this->wire()->config->ajax ? $this->wire()->input->get('renderInputfieldAjax') : '';
|
||||
$required = $inputfield->getSetting('required');
|
||||
@@ -1000,6 +1007,7 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
|
||||
$ajaxInputfield = false;
|
||||
if($collapsed == Inputfield::collapsedYesAjax) $inputfield->collapsed = Inputfield::collapsedYes;
|
||||
if($collapsed == Inputfield::collapsedBlankAjax) $inputfield->collapsed = Inputfield::collapsedBlank;
|
||||
if($collapsed == Inputfield::collapsedTabAjax) $inputfield->collapsed = Inputfield::collapsedTab;
|
||||
// indicate to next processInput that this field can be processed
|
||||
$inputfield->appendMarkup .= $ajaxHiddenInput;
|
||||
}
|
||||
@@ -1172,12 +1180,20 @@ class InputfieldWrapper extends Inputfield implements \Countable, \IteratorAggre
|
||||
Inputfield::collapsedLocked,
|
||||
Inputfield::collapsedNoLocked,
|
||||
Inputfield::collapsedBlankLocked,
|
||||
Inputfield::collapsedYesLocked
|
||||
Inputfield::collapsedYesLocked,
|
||||
Inputfield::collapsedTabLocked,
|
||||
);
|
||||
|
||||
$ajaxTypes = array(
|
||||
Inputfield::collapsedYesAjax,
|
||||
Inputfield::collapsedBlankAjax,
|
||||
Inputfield::collapsedTabAjax,
|
||||
);
|
||||
|
||||
$collapsed = (int) $inputfield->getSetting('collapsed');
|
||||
if(in_array($collapsed, $skipTypes)) return false;
|
||||
|
||||
if(in_array($collapsed, array(Inputfield::collapsedYesAjax, Inputfield::collapsedBlankAjax))) {
|
||||
if(in_array($collapsed, $ajaxTypes)) {
|
||||
$processAjax = $this->wire()->input->post('processInputfieldAjax');
|
||||
if(is_array($processAjax) && in_array($inputfield->attr('id'), $processAjax)) {
|
||||
// field can be processed (convention used by InputfieldWrapper)
|
||||
|
Reference in New Issue
Block a user