diff --git a/code/extensions/UserFormFieldEditorExtension.php b/code/extensions/UserFormFieldEditorExtension.php index 8c0aa10..3dba1a8 100644 --- a/code/extensions/UserFormFieldEditorExtension.php +++ b/code/extensions/UserFormFieldEditorExtension.php @@ -40,19 +40,14 @@ class UserFormFieldEditorExtension extends DataExtension { $fieldClasses = $this->getEditableFieldClasses(); $editableColumns->setDisplayFields(array( 'ClassName' => function($record, $column, $grid) use ($fieldClasses) { - if($record instanceof EditableFormStep) { - return new LabelField($column, _t('UserFormFieldEditorExtension.PAGE_BREAK', 'Page Break')); - } elseif($record instanceof EditableFieldGroup) { - return new LabelField($column, _t('UserFormFieldEditorExtension.FIELD_GROUP_START', 'Field Group (start)')); - } else if($record instanceof EditableFieldGroupEnd) { - return new LabelField($column, _t('UserFormFieldEditorExtension.FIELD_GROUP_END', 'Field Group (end)')); - } else { - return DropdownField::create($column, '', $fieldClasses); + if($record instanceof EditableFormField) { + return $record->getInlineClassnameField($column, $fieldClasses); } }, 'Title' => function($record, $column, $grid) { - return TextField::create($column, ' ') - ->setAttribute('placeholder', _t('UserDefinedForm.TITLE', 'Title')); + if($record instanceof EditableFormField) { + return $record->getInlineTitleField($column); + } } )); diff --git a/code/formfields/UserFormsCompositeField.php b/code/formfields/UserFormsCompositeField.php new file mode 100644 index 0000000..5188b54 --- /dev/null +++ b/code/formfields/UserFormsCompositeField.php @@ -0,0 +1,47 @@ +parent; + } + + public function setParent(UserFormsFieldContainer $parent) { + $this->parent = $parent; + return $this; + } + + public function processNext(EditableFormField $field) { + // When we find a step, bubble up to the top + if($field instanceof EditableFormStep) { + return $this->getParent()->processNext($field); + } + + // Skip over fields that don't generate formfields + $formField = $field->getFormField(); + if(!$formField) { + return $this; + } + + // Save this field + $this->push($formField); + + // Nest fields that are containers + if($formField instanceof UserFormsFieldContainer) { + return $formField->setParent($this); + } + + // Add any subsequent fields to this + return $this; + } +} diff --git a/code/formfields/UserFormsFieldContainer.php b/code/formfields/UserFormsFieldContainer.php new file mode 100644 index 0000000..b43f7b0 --- /dev/null +++ b/code/formfields/UserFormsFieldContainer.php @@ -0,0 +1,30 @@ +getFormField(); + if(!$formField) { + return $this; + } + + $this->push($formField); + + if($formField instanceof UserFormsFieldContainer) { + return $formField->setParent($this); + } + + return $this; + } + + public function getParent() { + // Field list does not have a parent + return null; + } + + public function setParent(UserFormsFieldContainer $parent) { + return $this; + } + +} diff --git a/code/formfields/UserFormsGroupField.php b/code/formfields/UserFormsGroupField.php new file mode 100644 index 0000000..8860766 --- /dev/null +++ b/code/formfields/UserFormsGroupField.php @@ -0,0 +1,27 @@ +setTag('fieldset'); + } + + public function getLegend() { + // Legend defaults to title + return parent::getLegend() ?: $this->Title(); + } + + public function processNext(EditableFormField $field) { + // When ending a group, jump up one level + if($field instanceof EditableFieldGroupEnd) { + return $this->getParent(); + } + + // Otherwise behave as per normal composite field + return parent::processNext($field); + } +} diff --git a/code/formfields/UserFormsStepField.php b/code/formfields/UserFormsStepField.php new file mode 100644 index 0000000..efcf563 --- /dev/null +++ b/code/formfields/UserFormsStepField.php @@ -0,0 +1,7 @@ +controller->Fields() as $field) { - // When we encounter a step, save it - if ($field instanceof EditableFormStep) { - $emptyStep = $field->getFormField(); - continue; - } - - // Ensure that the last field is a step - if($emptyStep) { - // When we reach the first non-step field, any empty step will no longer be empty - $fields->push($emptyStep); - $emptyStep = null; - - } elseif(! $fields->last()) { - // If no steps have been saved yet, warn - trigger_error('Missing first step in form', E_USER_WARNING); - $fields->push(singleton('EditableFormStep')->getFormField()); - } - - $fields->last()->push($field->getFormField()); + $target = $target->processNext($field); } - $this->extend('updateFormFields', $fields); return $fields; } diff --git a/code/model/editableformfields/EditableFieldGroup.php b/code/model/editableformfields/EditableFieldGroup.php index fe98f95..83c8fa1 100644 --- a/code/model/editableformfields/EditableFieldGroup.php +++ b/code/model/editableformfields/EditableFieldGroup.php @@ -12,5 +12,42 @@ class EditableFieldGroup extends EditableFormField { * @var bool */ private static $hidden = true; + + public function getCMSFields() { + $fields = parent::getCMSFields(); + $fields->removeByName(array('MergeField', 'Default', 'Validation', 'DisplayRules')); + return $fields; + } + + public function getInlineClassnameField($column, $fieldClasses) { + return new LabelField( + $column, + _t('EditableFieldGroup.FIELD_GROUP_START', 'Field Group (start)') + ); + } + + public function showInReports() { + return false; + } + + public function getFormField() { + $field = UserFormsGroupField::create() + ->setTitle($this->EscapedTitle ?: false); + $this->doUpdateFormField($field); + return $field; + } + + protected function updateFormField($field) { + // set the right title on this field + if($this->RightTitle) { + // Since this field expects raw html, safely escape the user data prior + $field->setRightTitle(Convert::raw2xml($this->RightTitle)); + } + + // if this field has an extra class + if($field->ExtraClass) { + $field->addExtraClass($field->ExtraClass); + } + } } diff --git a/code/model/editableformfields/EditableFieldGroupEnd.php b/code/model/editableformfields/EditableFieldGroupEnd.php index 8e0eaf6..53a4e52 100644 --- a/code/model/editableformfields/EditableFieldGroupEnd.php +++ b/code/model/editableformfields/EditableFieldGroupEnd.php @@ -12,5 +12,34 @@ class EditableFieldGroupEnd extends EditableFormField { * @var bool */ private static $hidden = true; + + public function getCMSFields() { + $fields = parent::getCMSFields(); + $fields->removeByName(array('MergeField', 'Default', 'Validation', 'DisplayRules')); + return $fields; + } + + public function getInlineClassnameField($column, $fieldClasses) { + return new LabelField( + $column, + _t('EditableFieldGroupEnd.FIELD_GROUP_END', 'Field Group (end)') + ); + } + + public function getInlineTitleField($column) { + return HiddenField::create($column); + } + + public function getFormField() { + return null; + } + + public function showInReports() { + return false; + } + + public function canEdit($member = null) { + return false; + } } diff --git a/code/model/editableformfields/EditableFormField.php b/code/model/editableformfields/EditableFormField.php index ca913ea..49de232 100755 --- a/code/model/editableformfields/EditableFormField.php +++ b/code/model/editableformfields/EditableFormField.php @@ -624,4 +624,27 @@ class EditableFormField extends DataObject { } } } + + /** + * Get the formfield to use when editing this inline in gridfield + * + * @param string $column name of column + * @param array $fieldClasses List of allowed classnames if this formfield has a selectable class + * @return FormField + */ + public function getInlineClassnameField($column, $fieldClasses) { + return DropdownField::create($column, false, $fieldClasses); + } + + /** + * Get the formfield to use when editing the title inline + * + * @param string $column + * @return FormField + */ + public function getInlineTitleField($column) { + return TextField::create($column, false) + ->setAttribute('placeholder', _t('EditableFormField.TITLE', 'Title')) + ->setAttribute('data-placeholder', _t('EditableFormField.TITLE', 'Title')); + } } diff --git a/code/model/editableformfields/EditableFormStep.php b/code/model/editableformfields/EditableFormStep.php index dac78b7..6de7062 100644 --- a/code/model/editableformfields/EditableFormStep.php +++ b/code/model/editableformfields/EditableFormStep.php @@ -32,10 +32,7 @@ class EditableFormStep extends EditableFormField { public function getCMSFields() { $fields = parent::getCMSFields(); - $fields->removeByName('MergeField'); - $fields->removeByName('Default'); - $fields->removeByName('Validation'); - $fields->removeByName('CustomRules'); + $fields->removeByName(array('MergeField', 'Default', 'Validation', 'DisplayRules')); return $fields; } @@ -44,7 +41,7 @@ class EditableFormStep extends EditableFormField { * @return FormField */ public function getFormField() { - $field = CompositeField::create() + $field = UserFormsStepField::create() ->setTitle($this->EscapedTitle); $this->doUpdateFormField($field); return $field; @@ -63,4 +60,11 @@ class EditableFormStep extends EditableFormField { public function showInReports() { return false; } + + public function getInlineClassnameField($column, $fieldClasses) { + return new LabelField( + $column, + _t('EditableFieldGroupEnd.PAGE_BREAK', 'Page Break') + ); + } }