[TASK] Restructure form setup 66/62366/16
authorMathias Brodala <mbrodala@pagemachine.de>
Fri, 22 Nov 2019 09:01:29 +0000 (10:01 +0100)
committerRalf Zimmermann <ralf.zimmermann@tritum.de>
Fri, 22 Nov 2019 13:47:03 +0000 (14:47 +0100)
The setup of the "form" extension has been restructured. For each
validator, form element, and finisher separate files are available.

In addition, inheritances have been resolved, which makes existing
mixins obsolete. In a subsequent change these mixins will be deprecated
as these where actually meant for internal use only but could be used
by 3rd party extensions.

Due to this change, integrators can easily understand how form objects
are defined.

Resolves: #84221
Resolves: #84203
Releases: master
Change-Id: I1b8d0d67929015ed687335586875fde73b598c13
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/62366
Reviewed-by: Björn Jacob <bjoern.jacob@tritum.de>
Reviewed-by: Daniela Pohl <dpohl@i-d.de>
Reviewed-by: Martin Schöne <martin.koske@gmx.de>
Reviewed-by: Ralf Zimmermann <ralf.zimmermann@tritum.de>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Björn Jacob <bjoern.jacob@tritum.de>
Tested-by: Daniela Pohl <dpohl@i-d.de>
Tested-by: Martin Schöne <martin.koske@gmx.de>
Tested-by: Ralf Zimmermann <ralf.zimmermann@tritum.de>
59 files changed:
typo3/sysext/core/Documentation/Changelog/master/Important-84221-RestructuringOfFormSetup.rst [new file with mode: 0644]
typo3/sysext/form/Classes/Mvc/Configuration/YamlSource.php
typo3/sysext/form/Configuration/TypoScript/setup.typoscript
typo3/sysext/form/Configuration/Yaml/BaseSetup.yaml [deleted file]
typo3/sysext/form/Configuration/Yaml/Finishers/Closure.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/Confirmation.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/DeleteUploads.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/FlashMessage.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/Redirect.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Finishers/SaveToDatabase.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormEditorSetup.yaml [deleted file]
typo3/sysext/form/Configuration/Yaml/FormElements/AdvancedPassword.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Checkbox.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/ContentElement.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Date.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/DatePicker.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Email.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Fieldset.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/FileUpload.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/GridRow.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Hidden.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Honeypot.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/ImageUpload.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/MultiCheckbox.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/MultiSelect.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Number.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Page.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Password.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/RadioButton.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/SingleSelect.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/StaticText.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/SummaryPage.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Telephone.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Text.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Textarea.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormElements/Url.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/FormEngineSetup.yaml [deleted file]
typo3/sysext/form/Configuration/Yaml/FormSetup.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Legacy/mixins.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/Alphanumeric.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/Count.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/DateRange.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/DateTime.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/EmailAddress.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/FileSize.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/Float.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/Integer.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/NotEmpty.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/Number.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/NumberRange.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/RegularExpression.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/StringLength.yaml [new file with mode: 0644]
typo3/sysext/form/Configuration/Yaml/Validators/Text.yaml [new file with mode: 0644]
typo3/sysext/form/Documentation/I/Concepts/Configuration/Index.rst
typo3/sysext/form/Tests/Unit/Mvc/Configuration/YamlSourceTest.php
typo3/sysext/form/ext_localconf.php

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Important-84221-RestructuringOfFormSetup.rst b/typo3/sysext/core/Documentation/Changelog/master/Important-84221-RestructuringOfFormSetup.rst
new file mode 100644 (file)
index 0000000..310caad
--- /dev/null
@@ -0,0 +1,33 @@
+.. include:: ../../Includes.txt
+
+===============================================
+Important: #84221 - Restructuring of form setup
+===============================================
+
+See :issue:`84221`
+
+Description
+===========
+
+The setup of the "form" extension has been restructured. Till now the following files were used:
+
+* :file:`BaseSetup.yaml`: setup shared in all contexts
+* :file:`FormEditorSetup.yaml`: setup of the Form Editor backend module
+* :file:`FormEngineSetup.yaml`: setup of the Form plugin flexForm configuration
+
+From now on only a single file is used:
+
+* :file:`FormSetup.yaml`: basic setup including imports of the configuration for validators, form
+  elements and finishers.
+
+All previously used inheritances and mixins have been resolved which makes it very easy to
+understand the entire configuration.
+
+Consequently the entries in :typoscript:`yamlConfigurations` have changed:
+
+* :typoscript:`10` is now :file:`FormSetup.yaml`
+* :typoscript:`20` and :typoscript:`30` have been dropped
+
+Customizations of those entries must be adjusted accordingly.
+
+.. index:: Backend, FlexForm, Frontend, TypoScript, ext:form
index 38c78f1..b312c5d 100644 (file)
@@ -19,6 +19,7 @@ namespace TYPO3\CMS\Form\Mvc\Configuration;
 
 use Symfony\Component\Yaml\Exception\ParseException;
 use Symfony\Component\Yaml\Yaml;
+use TYPO3\CMS\Core\Configuration\Loader\YamlFileLoader;
 use TYPO3\CMS\Core\Resource\Exception\InsufficientFileAccessPermissionsException;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\FolderInterface;
@@ -54,53 +55,26 @@ class YamlSource
      * Loads the specified configuration files and returns its merged content
      * as an array.
      *
-     * @param array $filesToLoad
-     * @return array
-     * @throws ParseErrorException
-     * @throws NoSuchFileException
      * @internal
      */
     public function load(array $filesToLoad): array
     {
         $configuration = [];
+
         foreach ($filesToLoad as $fileToLoad) {
             if ($fileToLoad instanceof File) {
-                $fileIdentifier = $fileToLoad->getIdentifier();
-                $rawYamlContent = $fileToLoad->getContents();
-                if ($rawYamlContent === false) {
-                    throw new NoSuchFileException(
-                        'The file "' . $fileIdentifier . '" does not exist.',
-                        1498802253
-                    );
-                }
+                $loadedConfiguration = $this->loadFromFile($fileToLoad);
             } else {
-                $fileIdentifier = $fileToLoad;
-                $fileToLoad = GeneralUtility::getFileAbsFileName($fileToLoad);
-                if (is_file($fileToLoad)) {
-                    $rawYamlContent = file_get_contents($fileToLoad);
-                } else {
-                    throw new NoSuchFileException(
-                        'The file "' . $fileToLoad . '" does not exist.',
-                        1471473378
-                    );
-                }
+                $loadedConfiguration = $this->loadFromFilePath($fileToLoad);
             }
 
-            try {
-                $loadedConfiguration = Yaml::parse($rawYamlContent);
-
-                if (is_array($loadedConfiguration)) {
-                    $configuration = array_replace_recursive($configuration, $loadedConfiguration);
-                }
-            } catch (ParseException $exception) {
-                throw new ParseErrorException(
-                    'An error occurred while parsing file "' . $fileIdentifier . '": ' . $exception->getMessage(),
-                    1480195405
-                );
+            if (is_array($loadedConfiguration)) {
+                $configuration = array_replace_recursive($configuration, $loadedConfiguration);
             }
         }
 
         $configuration = ArrayUtility::convertBooleanStringsToBooleanRecursive($configuration);
+
         return $configuration;
     }
 
@@ -152,6 +126,59 @@ class YamlSource
     }
 
     /**
+     * Load YAML configuration from a local file path
+     *
+     * @throws ParseErrorException
+     */
+    protected function loadFromFilePath(string $filePath): array
+    {
+        $loader = GeneralUtility::makeInstance(YamlFileLoader::class);
+
+        try {
+            $loadedConfiguration = $loader->load($filePath);
+        } catch (\RuntimeException $e) {
+            throw new ParseErrorException(
+                sprintf('An error occurred while parsing file "%s": %s', $filePath, $e->getMessage()),
+                1480195405,
+                $e
+            );
+        }
+
+        return $loadedConfiguration;
+    }
+
+    /**
+     * Load YAML configuration from a FAL file
+     *
+     * @throws ParseErrorException
+     * @throws NoSuchFileException
+     */
+    protected function loadFromFile(File $file): array
+    {
+        $fileIdentifier = $file->getIdentifier();
+        $rawYamlContent = $file->getContents();
+
+        if ($rawYamlContent === false) {
+            throw new NoSuchFileException(
+                sprintf('The file "%s" does not exist', $fileIdentifier),
+                1498802253
+            );
+        }
+
+        try {
+            $loadedConfiguration = Yaml::parse($rawYamlContent);
+        } catch (ParseException $e) {
+            throw new ParseErrorException(
+                sprintf('An error occurred while parsing file "%s": %s', $fileIdentifier, $e->getMessage()),
+                1574422322,
+                $e
+            );
+        }
+
+        return $loadedConfiguration;
+    }
+
+    /**
      * Read the header part from the given file. That means, every line
      * until the first non comment line is found.
      *
index eb81df0..3295487 100644 (file)
@@ -18,8 +18,7 @@ plugin.tx_form {
 
     settings {
         yamlConfigurations {
-            10 = EXT:form/Configuration/Yaml/BaseSetup.yaml
-            20 = EXT:form/Configuration/Yaml/FormEngineSetup.yaml
+            10 = EXT:form/Configuration/Yaml/FormSetup.yaml
         }
     }
 }
@@ -30,4 +29,4 @@ lib.tx_form.contentElementRendering {
     tables = tt_content
     source.current = 1
     dontCheckPid = 1
-}
\ No newline at end of file
+}
diff --git a/typo3/sysext/form/Configuration/Yaml/BaseSetup.yaml b/typo3/sysext/form/Configuration/Yaml/BaseSetup.yaml
deleted file mode 100644 (file)
index e75724d..0000000
+++ /dev/null
@@ -1,488 +0,0 @@
-TYPO3:
-  CMS:
-    Form:
-      persistenceManager:
-        allowedFileMounts:
-          10: 1:/form_definitions/
-        allowSaveToExtensionPaths: false
-        allowDeleteFromExtensionPaths: false
-        sortByKeys: ['name', 'fileUid']
-        sortAscending: true
-        #allowedExtensionPaths:
-          #10: EXT:example/Resources/Private/Forms/
-
-      prototypes:
-        standard:
-
-          ########### DEFAULT FORM ELEMENT DEFINITIONS ###########
-          formElementsDefinition:
-
-            ### BASE ELEMENTS ###
-            Form:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseFormElementMixin'
-              rendererClassName: 'TYPO3\CMS\Form\Domain\Renderer\FluidFormRenderer'
-              renderingOptions:
-                __inheritances:
-                  10: 'TYPO3.CMS.Form.mixins.translationSettingsMixin'
-                templateRootPaths:
-                  10: 'EXT:form/Resources/Private/Frontend/Templates/'
-                partialRootPaths:
-                  10: 'EXT:form/Resources/Private/Frontend/Partials/'
-                layoutRootPaths:
-                  10: 'EXT:form/Resources/Private/Frontend/Layouts/'
-                addQueryString: false
-                argumentsToBeExcludedFromQueryString: []
-                additionalParams: []
-                controllerAction: perform
-                httpMethod: post
-                httpEnctype: 'multipart/form-data'
-                _isCompositeFormElement: false
-                _isTopLevelFormElement: true
-
-                honeypot:
-                  enable: true
-                  formElementToUse: 'Honeypot'
-
-                submitButtonLabel: 'Submit'
-
-                # set this to TRUE if you want to avoid exceptions for FormElements without definitions
-                skipUnknownElements: true
-
-            ### FORM ELEMENTS: CONTAINER ###
-            Page:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseFormElementMixin'
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\Page'
-              renderingOptions:
-                _isTopLevelFormElement: true
-                _isCompositeFormElement: true
-                nextButtonLabel: 'next Page'
-                previousButtonLabel: 'previous Page'
-
-            SummaryPage:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.Page'
-              renderingOptions:
-                _isTopLevelFormElement: true
-                _isCompositeFormElement: false
-                nextButtonLabel: 'next Page'
-                previousButtonLabel: 'previous Page'
-
-            Fieldset:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\Section'
-              renderingOptions:
-                _isCompositeFormElement: true
-
-            GridRow:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\GridRow'
-              properties:
-                elementClassAttribute: 'row'
-                gridColumnClassAutoConfiguration:
-                  gridSize: 12
-                  viewPorts:
-                    xs:
-                      classPattern: 'col-xs-{@numbersOfColumnsToUse}'
-                    sm:
-                      classPattern: 'col-sm-{@numbersOfColumnsToUse}'
-                    md:
-                      classPattern: 'col-md-{@numbersOfColumnsToUse}'
-                    lg:
-                      classPattern: 'col-lg-{@numbersOfColumnsToUse}'
-              renderingOptions:
-                _isCompositeFormElement: true
-                _isGridRowFormElement: true
-
-            ### FORM ELEMENTS: INPUT ###
-            Text:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-
-            Password:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-
-            AdvancedPassword:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.Password'
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement'
-              properties:
-                elementClassAttribute: 'input-medium'
-                confirmationLabel: ''
-                # Optional description (hint) for the first password input element
-                #passwordDescription: ''
-                confirmationClassAttribute: 'input-medium'
-
-            Textarea:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              properties:
-                elementClassAttribute: 'xxlarge'
-
-            Honeypot:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              properties:
-                renderAsHiddenField: false
-                styleAttribute: 'position:absolute; margin:0 0 0 -999em;'
-              variants:
-                -
-                  identifier: hide-1
-                  renderingOptions:
-                    enabled: false
-                  condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
-
-            Hidden:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-              variants:
-                -
-                  identifier: hide-1
-                  renderingOptions:
-                    enabled: false
-                  condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
-
-            ### FORM ELEMENTS: HTML5 ###
-            Email:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              validators:
-                -
-                  identifier: EmailAddress
-
-            Telephone:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              validators:
-                -
-                  identifier: RegularExpression
-                  options:
-                    regularExpression: '/^.*$/'
-
-            Url:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              validators:
-                -
-                  identifier: RegularExpression
-                  options:
-                    regularExpression: '/^.*$/'
-
-            Number:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              validators:
-                -
-                  identifier: Number
-
-            Date:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.TextMixin'
-              properties:
-                # Rules for the summary step, email finishers etc. but
-                # **not** for the form element value itself.
-                # The display format of the form element value depends on the browser settings.
-                displayFormat: 'd.m.Y'
-                fluidAdditionalAttributes:
-                  # https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date#Handling_browser_support
-                  # https://tools.ietf.org/html/rfc3339#section-5.6 -> full-date
-                  pattern: '([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])'
-
-            ### FORM ELEMENTS: SELECT ###
-            Checkbox:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-              properties:
-                elementClassAttribute: 'add-on'
-                containerClassAttribute: 'input checkbox'
-                value: 1
-
-            MultiCheckbox:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.MultiSelectionMixin'
-              properties:
-                containerClassAttribute: 'input checkbox'
-
-            MultiSelect:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.MultiSelectionMixin'
-              properties:
-                elementClassAttribute: 'xlarge'
-
-            RadioButton:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.SingleSelectionMixin'
-              properties:
-                elementClassAttribute: 'xlarge'
-
-            SingleSelect:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.SingleSelectionMixin'
-
-            ### FORM ELEMENTS: CUSTOM ###
-            DatePicker:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-              properties:
-                elementClassAttribute: 'small form-control'
-                timeSelectorClassAttribute: 'mini'
-                timeSelectorHourLabel: ''
-                timeSelectorMinuteLabel: ''
-                dateFormat: 'Y-m-d'
-                enableDatePicker: true
-                displayTimeSelector: false
-
-            StaticText:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.ReadOnlyFormElementMixin'
-              properties:
-                text: ''
-
-            ContentElement:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.ReadOnlyFormElementMixin'
-              properties:
-                contentElementUid: ''
-
-            ### FORM ELEMENTS: UPLOADS ###
-            FileUpload:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FileUploadMixin'
-              properties:
-                allowedMimeTypes: []
-              variants:
-                -
-                  identifier: legacy-mime-types
-                  properties:
-                    allowedMimeTypes:
-                      - 'application/msword'
-                      - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
-                      - 'application/vnd.oasis.opendocument.text'
-                      - 'application/pdf'
-                  condition: 'feature("form.legacyUploadMimeTypes")'
-
-            ImageUpload:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.FileUploadMixin'
-              properties:
-                allowedMimeTypes: []
-                elementClassAttribute: 'lightbox'
-                imageLinkMaxWidth: 500
-                imageMaxWidth: 500
-                imageMaxHeight: 500
-              variants:
-                -
-                  identifier: legacy-mime-types
-                  properties:
-                    allowedMimeTypes:
-                      - 'image/jpeg'
-                      - 'image/png'
-                      - 'image/bmp'
-                  condition: 'feature("form.legacyUploadMimeTypes")'
-
-          ### FINISHERS ###
-
-          finishersDefinition:
-            Closure:
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\ClosureFinisher'
-              options:
-                #closure:
-
-            Confirmation:
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\ConfirmationFinisher'
-              options:
-                #message: ''
-                #contentElementUid: 0
-                #typoscriptObjectPath: 'lib.tx_form.contentElementRendering'
-                #variables:
-                templateName: 'Confirmation'
-                templateRootPaths:
-                  10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Confirmation/'
-
-            EmailToSender:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.finishersEmailMixin'
-
-            EmailToReceiver:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.finishersEmailMixin'
-
-            DeleteUploads:
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\DeleteUploadsFinisher'
-
-            FlashMessage:
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\FlashMessageFinisher'
-              #options:
-                #messageBody: ''
-                #messageTitle: ''
-                #messageArguments: {}
-                #messageCode: 0
-                #severity: 0
-
-            Redirect:
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\RedirectFinisher'
-              #options:
-                #pageUid: 1
-                #additionalParameters: ''
-                #delay: 0
-                #statusCode: 303
-
-            SaveToDatabase:
-              implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher'
-              #options:
-                #table: ''
-                #mode: 'insert'
-                #whereClause: []
-                #elements:
-                #  <elementIdentifier>:
-                #    mapOnDatabaseColumn: <databaseColumnName>
-                #    saveFileIdentifierInsteadOfUid: false
-                #    skipIfValueIsEmpty: false
-                #databaseColumnMappings:
-                #  <databaseColumnName>:
-                #    value: 'someValue'
-                #    skipIfValueIsEmpty: false
-
-          ### VALIDATORS ###
-          validatorsDefinition:
-            NotEmpty:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator'
-            DateTime:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\DateTimeValidator'
-            Alphanumeric:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\AlphanumericValidator'
-            Text:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\TextValidator'
-            StringLength:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\StringLengthValidator'
-              #options:
-                #minimum: 0
-                #maximum: 0
-            EmailAddress:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator'
-            Integer:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\IntegerValidator'
-            Float:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\FloatValidator'
-            Number:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\NumberValidator'
-            NumberRange:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\NumberRangeValidator'
-              #options:
-                #minimum: 0
-                #maximum: 0
-            RegularExpression:
-              implementationClassName: 'TYPO3\CMS\Extbase\Validation\Validator\RegularExpressionValidator'
-              #options:
-                #regularExpression: '/^.*$/'
-            Count:
-              implementationClassName: 'TYPO3\CMS\Form\Mvc\Validation\CountValidator'
-              #options:
-                #minimum: 0
-                #maximum: 0
-            FileSize:
-              implementationClassName: 'TYPO3\CMS\Form\Mvc\Validation\FileSizeValidator'
-              #options:
-                #minimum: '0B'
-                #maximum: '10M'
-            DateRange:
-              implementationClassName: 'TYPO3\CMS\Form\Mvc\Validation\DateRangeValidator'
-              options:
-                # https://tools.ietf.org/html/rfc3339#section-5.6 -> full-date
-                format : 'Y-m-d'
-                #minimum: '2018-03-17'
-                #maximum: '2018-03-17'
-
-      ########### MIXINS ###########
-      mixins:
-        translationSettingsMixin:
-          translation:
-            translationFiles:
-              10: 'EXT:form/Resources/Private/Language/locallang.xlf'
-            #translatePropertyValueIfEmpty: true
-
-        ########### FORM ELEMENT MIXINS ###########
-        formElementMixins:
-          BaseFormElementMixin: []
-              # The form element type is chosen as the template name by default.
-              # If you want another name you can set it with 'templateName'
-              #templateName: 'CustomTemplateName'
-
-          ReadOnlyFormElementMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseFormElementMixin'
-            implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement'
-            variants:
-              -
-                identifier: hide-1
-                renderingOptions:
-                  enabled: false
-                condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
-
-          FormElementMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseFormElementMixin'
-            implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement'
-            properties:
-              containerClassAttribute: 'input'
-              elementClassAttribute: ''
-              elementErrorClassAttribute: 'error'
-              #gridColumnClassAutoConfiguration:
-              #  viewPorts:
-              #    xs:
-              #      numbersOfColumnsToUse: ''
-              #    sm:
-              #      numbersOfColumnsToUse: ''
-              #    md:
-              #      numbersOfColumnsToUse: ''
-              #    lg:
-              #      numbersOfColumnsToUse: ''
-
-          TextMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-
-          SelectionMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-
-          SingleSelectionMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.SelectionMixin'
-
-          MultiSelectionMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.SelectionMixin'
-
-          FileUploadMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.FormElementMixin'
-            implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload'
-            properties:
-              saveToFileMount: '1:/user_upload/'
-
-        finishersEmailMixin:
-          implementationClassName: 'TYPO3\CMS\Form\Domain\Finishers\EmailFinisher'
-          options:
-            #subject: ''
-            #recipients: {}
-            #senderAddress:
-            #senderName: ''
-            #replyToRecipients: {}
-            #carbonCopyRecipients: {}
-            #blindCarbonCopyRecipients: {}
-            #addHtmlPart: true
-            #attachUploads: true
-            #translation:
-            #  language: 'default'
-            # {@format} depends the 'format' value
-            templateName: '{@format}.html'
-            templateRootPaths:
-              10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Email/'
-            #partialRootPaths: []
-            #layoutRootPaths: []
-            #variables: {}
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/Closure.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/Closure.yaml
new file mode 100644 (file)
index 0000000..e99fa5d
--- /dev/null
@@ -0,0 +1,14 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            Closure:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ClosureFinisher
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.Closure.editor.header.label
+                predefinedDefaults:
+                  options:
+                    closure: ''
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/Confirmation.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/Confirmation.yaml
new file mode 100644 (file)
index 0000000..d1411e0
--- /dev/null
@@ -0,0 +1,37 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            Confirmation:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ConfirmationFinisher
+              options:
+                templateName: Confirmation
+                templateRootPaths:
+                  10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Confirmation/'
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.Confirmation.editor.header.label
+                predefinedDefaults:
+                  options:
+                    message: ''
+                    contentElementUid: ''
+              FormEngine:
+                label: tt_content.finishersDefinition.Confirmation.label
+                elements:
+                  contentElementUid:
+                    label: tt_content.finishersDefinition.Confirmation.contentElementUid.label
+                    config:
+                      type: group
+                      internal_type: db
+                      allowed: tt_content
+                      size: 1
+                      maxitems: 1
+                      fieldWizard:
+                        recordsOverview:
+                          disabled: 1
+                  message:
+                    label: tt_content.finishersDefinition.Confirmation.message.label
+                    config:
+                      type: text
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/DeleteUploads.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/DeleteUploads.yaml
new file mode 100644 (file)
index 0000000..995fab9
--- /dev/null
@@ -0,0 +1,11 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            DeleteUploads:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\DeleteUploadsFinisher
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.DeleteUploads.editor.header.label
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToReceiver.yaml
new file mode 100644 (file)
index 0000000..4c7f618
--- /dev/null
@@ -0,0 +1,151 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            EmailToReceiver:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher
+              options:
+                templateName: '{@format}.html'
+                templateRootPaths:
+                  10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Email/'
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label
+                predefinedDefaults:
+                  options:
+                    subject: ''
+                    recipients: {  }
+                    senderAddress: ''
+                    senderName: ''
+                    replyToRecipients: {  }
+                    carbonCopyRecipients: {  }
+                    blindCarbonCopyRecipients: {  }
+                    addHtmlPart: true
+                    attachUploads: true
+                    translation:
+                      language: ''
+              FormEngine:
+                label: tt_content.finishersDefinition.EmailToReceiver.label
+                elements:
+                  subject:
+                    label: tt_content.finishersDefinition.EmailToReceiver.subject.label
+                    config:
+                      type: input
+                      eval: required
+                  recipients:
+                    title: tt_content.finishersDefinition.EmailToReceiver.recipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.recipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  senderAddress:
+                    label: tt_content.finishersDefinition.EmailToReceiver.senderAddress.label
+                    config:
+                      type: input
+                      eval: required
+                  senderName:
+                    label: tt_content.finishersDefinition.EmailToReceiver.senderName.label
+                    config:
+                      type: input
+                  replyToRecipients:
+                    title: tt_content.finishersDefinition.EmailToReceiver.replyToRecipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.replyToRecipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  carbonCopyRecipients:
+                    title: tt_content.finishersDefinition.EmailToReceiver.carbonCopyRecipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.carbonCopyRecipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  blindCarbonCopyRecipients:
+                    title: tt_content.finishersDefinition.EmailToReceiver.blindCarbonCopyRecipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.blindCarbonCopyRecipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  addHtmlPart:
+                    label: tt_content.finishersDefinition.EmailToReceiver.addHtmlPart.label
+                    config:
+                      type: check
+                      default: 1
+                  translation:
+                    language:
+                      label: tt_content.finishersDefinition.EmailToReceiver.language.label
+                      config:
+                        type: select
+                        renderType: selectSingle
+                        minitems: 1
+                        maxitems: 1
+                        size: 1
+                        items:
+                          10:
+                            - tt_content.finishersDefinition.EmailToReceiver.language.1
+                            - default
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/EmailToSender.yaml
new file mode 100644 (file)
index 0000000..00f879b
--- /dev/null
@@ -0,0 +1,136 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            EmailToSender:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher
+              options:
+                templateName: '{@format}.html'
+                templateRootPaths:
+                  10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Email/'
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.EmailToSender.editor.header.label
+                predefinedDefaults:
+                  options:
+                    subject: ''
+                    recipients: {  }
+                    senderAddress: ''
+                    senderName: ''
+                    replyToRecipients: {  }
+                    carbonCopyRecipients: {  }
+                    blindCarbonCopyRecipients: {  }
+                    addHtmlPart: true
+                    attachUploads: true
+              FormEngine:
+                label: tt_content.finishersDefinition.EmailToSender.label
+                elements:
+                  subject:
+                    label: tt_content.finishersDefinition.EmailToSender.subject.label
+                    config:
+                      type: input
+                      eval: required
+                  recipients:
+                    title: tt_content.finishersDefinition.EmailToSender.recipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.recipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  senderAddress:
+                    label: tt_content.finishersDefinition.EmailToSender.senderAddress.label
+                    config:
+                      type: input
+                      eval: required
+                  senderName:
+                    label: tt_content.finishersDefinition.EmailToSender.senderName.label
+                    config:
+                      type: input
+                  replyToRecipients:
+                    title: tt_content.finishersDefinition.EmailToSender.replyToRecipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.replyToRecipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  carbonCopyRecipients:
+                    title: tt_content.finishersDefinition.EmailToSender.carbonCopyRecipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.carbonCopyRecipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  blindCarbonCopyRecipients:
+                    title: tt_content.finishersDefinition.EmailToSender.blindCarbonCopyRecipients.label
+                    type: array
+                    section: true
+                    sectionItemKey: email
+                    sectionItemValue: name
+                    el:
+                      _arrayContainer:
+                        type: array
+                        title: tt_content.finishersDefinition.EmailToSender.blindCarbonCopyRecipients.item.label
+                        el:
+                          email:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.email.label
+                              config:
+                                type: input
+                                eval: 'required,email'
+                          name:
+                            TCEforms:
+                              label: tt_content.finishersDefinition.EmailToSender.recipients.name.label
+                              config:
+                                type: input
+                  addHtmlPart:
+                    label: tt_content.finishersDefinition.EmailToSender.addHtmlPart.label
+                    config:
+                      type: check
+                      default: 1
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/FlashMessage.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/FlashMessage.yaml
new file mode 100644 (file)
index 0000000..100e0da
--- /dev/null
@@ -0,0 +1,18 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            FlashMessage:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\FlashMessageFinisher
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.FlashMessage.editor.header.label
+                predefinedDefaults:
+                  options:
+                    messageBody: ''
+                    messageTitle: ''
+                    messageArguments: ''
+                    messageCode: 0
+                    severity: 0
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/Redirect.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/Redirect.yaml
new file mode 100644 (file)
index 0000000..48aa32d
--- /dev/null
@@ -0,0 +1,34 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            Redirect:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\RedirectFinisher
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.Redirect.editor.header.label
+                predefinedDefaults:
+                  options:
+                    pageUid: ''
+                    additionalParameters: ''
+              FormEngine:
+                label: tt_content.finishersDefinition.Redirect.label
+                elements:
+                  pageUid:
+                    label: tt_content.finishersDefinition.Redirect.pageUid.label
+                    config:
+                      type: group
+                      internal_type: db
+                      allowed: pages
+                      size: 1
+                      minitems: 1
+                      maxitems: 1
+                      fieldWizard:
+                        recordsOverview:
+                          disabled: 1
+                  additionalParameters:
+                    label: tt_content.finishersDefinition.Redirect.additionalParameters.label
+                    config:
+                      type: input
diff --git a/typo3/sysext/form/Configuration/Yaml/Finishers/SaveToDatabase.yaml b/typo3/sysext/form/Configuration/Yaml/Finishers/SaveToDatabase.yaml
new file mode 100644 (file)
index 0000000..e5a62f1
--- /dev/null
@@ -0,0 +1,13 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          finishersDefinition:
+            SaveToDatabase:
+              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher
+              formEditor:
+                iconIdentifier: form-finisher
+                label: formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label
+                predefinedDefaults:
+                  options: {  }
diff --git a/typo3/sysext/form/Configuration/Yaml/FormEditorSetup.yaml b/typo3/sysext/form/Configuration/Yaml/FormEditorSetup.yaml
deleted file mode 100644 (file)
index abe8c82..0000000
+++ /dev/null
@@ -1,1611 +0,0 @@
-TYPO3:
-  CMS:
-    Form:
-      ########### FORM MANAGER CONFIGURATION ###########
-      formManager:
-        dynamicRequireJsModules:
-          app: 'TYPO3/CMS/Form/Backend/FormManager'
-          viewModel: 'TYPO3/CMS/Form/Backend/FormManager/ViewModel'
-        stylesheets:
-          100: 'EXT:form/Resources/Public/Css/form.css'
-        translationFiles:
-          10: 'EXT:form/Resources/Private/Language/Database.xlf'
-        javaScriptTranslationFile: 'EXT:form/Resources/Private/Language/locallang_formManager_javascript.xlf'
-        selectablePrototypesConfiguration:
-          100:
-            identifier: 'standard'
-            label: 'formManager.selectablePrototypesConfiguration.standard.label'
-            newFormTemplates:
-              100:
-                templatePath: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/BlankForm.yaml'
-                label: 'formManager.selectablePrototypesConfiguration.standard.newFormTemplates.blankForm.label'
-              200:
-                templatePath: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml'
-                label: 'formManager.selectablePrototypesConfiguration.standard.newFormTemplates.simpleContactForm.label'
-        controller:
-          deleteAction:
-            errorTitle: 'formManagerController.deleteAction.error.title'
-            errorMessage: 'formManagerController.deleteAction.error.body'
-
-      ########### FORMEDITOR CONFIGURATION ###########
-      prototypes:
-        standard:
-          formEditor:
-            translationFiles:
-              10: 'EXT:form/Resources/Private/Language/Database.xlf'
-            dynamicRequireJsModules:
-              app: 'TYPO3/CMS/Form/Backend/FormEditor'
-              mediator: 'TYPO3/CMS/Form/Backend/FormEditor/Mediator'
-              viewModel: 'TYPO3/CMS/Form/Backend/FormEditor/ViewModel'
-              additionalViewModelModules:
-
-            addInlineSettings: []
-            maximumUndoSteps: 10
-
-            stylesheets:
-              200: 'EXT:form/Resources/Public/Css/form.css'
-
-            formEditorFluidConfiguration:
-              templatePathAndFilename: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.html'
-              partialRootPaths:
-                10: 'EXT:form/Resources/Private/Backend/Partials/FormEditor/'
-              layoutRootPaths:
-                10: 'EXT:form/Resources/Private/Backend/Layouts/FormEditor/'
-
-            formEditorPartials:
-              # abstract form element partials
-              FormElement-_ElementToolbar: 'Stage/_ElementToolbar'
-              FormElement-_UnknownElement: 'Stage/_UnknownElement'
-              FormElement-Page: 'Stage/Page'
-              FormElement-SummaryPage: 'Stage/SummaryPage'
-              FormElement-Fieldset: 'Stage/Fieldset'
-              FormElement-GridRow: 'Stage/Fieldset'
-              FormElement-Text: 'Stage/SimpleTemplate'
-              FormElement-Password: 'Stage/SimpleTemplate'
-              FormElement-AdvancedPassword: 'Stage/SimpleTemplate'
-              FormElement-Textarea: 'Stage/SimpleTemplate'
-              FormElement-Checkbox: 'Stage/SimpleTemplate'
-              FormElement-MultiCheckbox: 'Stage/SelectTemplate'
-              FormElement-MultiSelect: 'Stage/SelectTemplate'
-              FormElement-RadioButton: 'Stage/SelectTemplate'
-              FormElement-SingleSelect: 'Stage/SelectTemplate'
-              FormElement-DatePicker: 'Stage/SimpleTemplate'
-              FormElement-StaticText: 'Stage/StaticText'
-              FormElement-Hidden: 'Stage/SimpleTemplate'
-              FormElement-ContentElement: 'Stage/ContentElement'
-              FormElement-FileUpload: 'Stage/FileUploadTemplate'
-              FormElement-ImageUpload: 'Stage/FileUploadTemplate'
-              FormElement-Email: 'Stage/SimpleTemplate'
-              FormElement-Telephone: 'Stage/SimpleTemplate'
-              FormElement-Url: 'Stage/SimpleTemplate'
-              FormElement-Number: 'Stage/SimpleTemplate'
-              FormElement-Date: 'Stage/SimpleTemplate'
-
-              # modals
-              Modal-InsertElements: 'Modals/InsertElements'
-              Modal-InsertPages: 'Modals/InsertPages'
-              Modal-ValidationErrors: 'Modals/ValidationErrors'
-
-              # inspector editors
-              Inspector-FormElementHeaderEditor: 'Inspector/FormElementHeaderEditor'
-              Inspector-CollectionElementHeaderEditor: 'Inspector/CollectionElementHeaderEditor'
-              Inspector-TextEditor: 'Inspector/TextEditor'
-              Inspector-PropertyGridEditor: 'Inspector/PropertyGridEditor'
-              Inspector-SingleSelectEditor: 'Inspector/SingleSelectEditor'
-              Inspector-MultiSelectEditor: 'Inspector/MultiSelectEditor'
-              Inspector-GridColumnViewPortConfigurationEditor: 'Inspector/GridColumnViewPortConfigurationEditor'
-              Inspector-TextareaEditor: 'Inspector/TextareaEditor'
-              Inspector-RemoveElementEditor: 'Inspector/RemoveElementEditor'
-              Inspector-FinishersEditor: 'Inspector/FinishersEditor'
-              Inspector-ValidatorsEditor: 'Inspector/ValidatorsEditor'
-              Inspector-RequiredValidatorEditor: 'Inspector/RequiredValidatorEditor'
-              Inspector-CheckboxEditor: 'Inspector/CheckboxEditor'
-              Inspector-ValidationErrorMessageEditor: 'Inspector/ValidationErrorMessageEditor'
-              Inspector-Typo3WinBrowserEditor: 'Inspector/Typo3WinBrowserEditor'
-              Inspector-MaximumFileSizeEditor: 'Inspector/MaximumFileSizeEditor'
-
-            formElementPropertyValidatorsDefinition:
-              NotEmpty:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.NotEmpty.label'
-              Integer:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.Integer.label'
-              NaiveEmail:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.NaiveEmail.label'
-              NaiveEmailOrEmpty:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.NaiveEmail.label'
-              FormElementIdentifierWithinCurlyBracesInclusive:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.FormElementIdentifierWithinCurlyBraces.label'
-              FormElementIdentifierWithinCurlyBracesExclusive:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.FormElementIdentifierWithinCurlyBraces.label'
-              FileSize:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.FileSize.label'
-              RFC3339FullDate:
-                errorMessage: 'formEditor.formElementPropertyValidatorsDefinition.RFC3339FullDate.label'
-
-            formElementGroups:
-              input:
-                label: 'formEditor.formElementGroups.input.label'
-              html5:
-                label: 'formEditor.formElementGroups.html5.label'
-              select:
-                label: 'formEditor.formElementGroups.select.label'
-              custom:
-                label: 'formEditor.formElementGroups.custom.label'
-              container:
-                label: 'formEditor.formElementGroups.container.label'
-              page:
-                label: 'formEditor.formElementGroups.page.label'
-
-          ########### DEFAULT FORM ELEMENT DEFINITIONS ###########
-          formElementsDefinition:
-            Form:
-              formEditor:
-                _isCompositeFormElement: false
-                _isTopLevelFormElement: true
-
-                saveSuccessFlashMessageTitle: 'formEditor.elements.Form.saveSuccessFlashMessageTitle'
-                saveSuccessFlashMessageMessage: 'formEditor.elements.Form.saveSuccessFlashMessageMessage'
-                saveErrorFlashMessageTitle: 'formEditor.elements.Form.saveErrorFlashMessageTitle'
-                saveErrorFlashMessageMessage: 'formEditor.elements.Form.saveErrorFlashMessageMessage'
-
-                modalValidationErrorsDialogTitle: 'formEditor.modals.validationErrors.dialogTitle'
-                modalValidationErrorsConfirmButton: 'formEditor.modals.validationErrors.confirmButton'
-
-                modalInsertElementsDialogTitle: 'formEditor.modals.insertElements.dialogTitle'
-                modalInsertPagesDialogTitle: 'formEditor.modals.newPages.dialogTitle'
-
-                modalCloseDialogMessage: 'formEditor.modals.close.dialogMessage'
-                modalCloseDialogTitle: 'formEditor.modals.close.dialogTitle'
-                modalCloseConfirmButton: 'formEditor.modals.close.confirmButton'
-                modalCloseCancleButton: 'formEditor.modals.close.cancleButton'
-
-                modalRemoveElementDialogTitle: 'formEditor.modals.removeElement.dialogTitle'
-                modalRemoveElementDialogMessage: 'formEditor.modals.removeElement.dialogMessage'
-                modalRemoveElementConfirmButton: 'formEditor.modals.removeElement.confirmButton'
-                modalRemoveElementCancleButton: 'formEditor.modals.removeElement.cancleButton'
-                modalRemoveElementLastAvailablePageFlashMessageTitle: 'formEditor.modals.removeElement.lastAvailablePageFlashMessageTitle'
-                modalRemoveElementLastAvailablePageFlashMessageMessage: 'formEditor.modals.removeElement.lastAvailablePageFlashMessageMessage'
-
-                inspectorEditorFormElementSelectorNoElements: 'formEditor.inspector.editor.formelement_selector.no_elements'
-
-                paginationTitle: 'formEditor.pagination.title'
-
-                iconIdentifier: 'content-form'
-                predefinedDefaults:
-                  renderingOptions:
-                    submitButtonLabel: 'formEditor.elements.Form.editor.submitButtonLabel.value'
-                editors:
-                  300:
-                    identifier: 'submitButtonLabel'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.Form.editor.submitButtonLabel.label'
-                    propertyPath: 'renderingOptions.submitButtonLabel'
-                  900:
-                    identifier: 'finishers'
-                    templateName: 'Inspector-FinishersEditor'
-                    label: 'formEditor.elements.Form.editor.finishers.label'
-                    selectOptions:
-                      10:
-                        value: ''
-                        label: 'formEditor.elements.Form.editor.finishers.EmptyValue.label'
-                      20:
-                        value: 'EmailToSender'
-                        label: 'formEditor.elements.Form.editor.finishers.EmailToSender.label'
-                      30:
-                        value: 'EmailToReceiver'
-                        label: 'formEditor.elements.Form.editor.finishers.EmailToReceiver.label'
-                      40:
-                        value: 'Redirect'
-                        label: 'formEditor.elements.Form.editor.finishers.Redirect.label'
-                      50:
-                        value: 'DeleteUploads'
-                        label: 'formEditor.elements.Form.editor.finishers.DeleteUploads.label'
-                      60:
-                        value: 'Confirmation'
-                        label: 'formEditor.elements.Form.editor.finishers.Confirmation.label'
-
-                propertyCollections:
-                  finishers:
-                    10:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.formEmailFinisherMixin'
-                      identifier: 'EmailToSender'
-
-                    20:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.formEmailFinisherMixin'
-                      identifier: 'EmailToReceiver'
-                      editors:
-                        100:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label'
-                        200:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.subject.label'
-                        350:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.label'
-                          fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.fieldExplanationText'
-                        500:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.senderAddress.label'
-                          fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.senderAddress.fieldExplanationText'
-                        600:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.label'
-                          fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.fieldExplanationText'
-                        750:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.replyToRecipients.label'
-                        850:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.carbonCopyRecipients.label'
-                        950:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.blindCarbonCopyRecipients.label'
-                        1050:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.label'
-                          fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.fieldExplanationText'
-                        1100:
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.attachUploads.label'
-                        1200:
-                          identifier: 'language'
-                          templateName: 'Inspector-SingleSelectEditor'
-                          label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.language.label'
-                          propertyPath: 'options.translation.language'
-                          selectOptions:
-                            10:
-                              value: 'default'
-                              label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.language.1'
-
-                    30:
-                      identifier: 'Redirect'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.Form.finisher.Redirect.editor.header.label'
-                        200:
-                          identifier: 'pageUid'
-                          templateName: 'Inspector-Typo3WinBrowserEditor'
-                          label: 'formEditor.elements.Form.finisher.Redirect.editor.pageUid.label'
-                          buttonLabel: 'formEditor.elements.Form.finisher.Redirect.editor.pageUid.buttonLabel'
-                          browsableType: pages
-                          propertyPath: 'options.pageUid'
-                          propertyValidatorsMode: 'OR'
-                          propertyValidators:
-                            10: 'Integer'
-                            20: 'FormElementIdentifierWithinCurlyBracesExclusive'
-
-                        300:
-                          identifier: 'additionalParameters'
-                          templateName: 'Inspector-TextEditor'
-                          label: 'formEditor.elements.Form.finisher.Redirect.editor.additionalParameters.label'
-                          propertyPath: 'options.additionalParameters'
-
-                    40:
-                      identifier: 'DeleteUploads'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.Form.finisher.DeleteUploads.editor.header.label'
-
-                    50:
-                      identifier: 'Confirmation'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.Form.finisher.Confirmation.editor.header.label'
-                        200:
-                          identifier: 'contentElement'
-                          templateName: 'Inspector-Typo3WinBrowserEditor'
-                          label: 'formEditor.elements.Form.finisher.Confirmation.editor.contentElement.label'
-                          buttonLabel: 'formEditor.elements.Form.finisher.Confirmation.editor.contentElement.buttonLabel'
-                          browsableType: tt_content
-                          propertyPath: 'options.contentElementUid'
-                          propertyValidatorsMode: 'OR'
-                          propertyValidators:
-                            10: 'IntegerOrEmpty'
-                            20: 'FormElementIdentifierWithinCurlyBracesExclusive'
-                        300:
-                          identifier: 'message'
-                          templateName: 'Inspector-TextareaEditor'
-                          label: 'formEditor.elements.Form.finisher.Confirmation.editor.message.label'
-                          propertyPath: 'options.message'
-                          fieldExplanationText: 'formEditor.elements.Form.finisher.Confirmation.editor.message.fieldExplanationText'
-
-                    60:
-                      identifier: 'Closure'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.Form.finisher.Closure.editor.header.label'
-
-                    70:
-                      identifier: 'FlashMessage'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.Form.finisher.FlashMessage.editor.header.label'
-
-                    80:
-                      identifier: 'SaveToDatabase'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label'
-
-            ### FORM ELEMENTS: CONTAINER ###
-            Fieldset:
-              formEditor:
-                label: 'formEditor.elements.Fieldset.label'
-                group: container
-                groupSorting: 100
-                _isCompositeFormElement: true
-                iconIdentifier: 'form-fieldset'
-                editors:
-                  200:
-                    label: 'formEditor.elements.Fieldset.editor.label.label'
-                  230: null
-                  800: null
-
-            GridRow:
-              formEditor:
-                label: 'formEditor.elements.GridRow.label'
-                group: container
-                groupSorting: 300
-                _isCompositeFormElement: true
-                _isGridRowFormElement: true
-                iconIdentifier: 'form-gridrow'
-                editors:
-                  200:
-                    label: 'formEditor.elements.GridRow.editor.label.label'
-                  230: null
-                  800: null
-
-            ### FORM ELEMENTS: PAGE TYPES ###
-            Page:
-              formEditor:
-                __inheritances:
-                  10: 'TYPO3.CMS.Form.mixins.formElementMixins.RemovableFormElementMixin'
-                predefinedDefaults:
-                  renderingOptions:
-                    previousButtonLabel: 'formEditor.elements.Page.editor.previousButtonLabel.value'
-                    nextButtonLabel: 'formEditor.elements.Page.editor.nextButtonLabel.value'
-                label: 'formEditor.elements.Page.label'
-                group: page
-                groupSorting: 100
-                _isTopLevelFormElement: true
-                _isCompositeFormElement: true
-                iconIdentifier: 'form-page'
-                editors:
-                  200:
-                    label: 'formEditor.elements.Page.editor.label.label'
-                  300:
-                    identifier: 'previousButtonLabel'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.Page.editor.previousButtonLabel.label'
-                    propertyPath: 'renderingOptions.previousButtonLabel'
-                  400:
-                    identifier: 'nextButtonLabel'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.Page.editor.nextButtonLabel.label'
-                    propertyPath: 'renderingOptions.nextButtonLabel'
-
-            SummaryPage:
-              formEditor:
-                predefinedDefaults:
-                  renderingOptions:
-                    previousButtonLabel: 'formEditor.elements.SummaryPage.editor.previousButtonLabel.value'
-                    nextButtonLabel: 'formEditor.elements.SummaryPage.editor.nextButtonLabel.value'
-                label: 'formEditor.elements.SummaryPage.label'
-                group: page
-                groupSorting: 200
-                _isTopLevelFormElement: true
-                _isCompositeFormElement: false
-                iconIdentifier: 'form-summary-page'
-                editors:
-                  200:
-                    label: 'formEditor.elements.SummaryPage.editor.label.label'
-                  300:
-                    identifier: 'previousButtonLabel'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.SummaryPage.editor.previousButtonLabel.label'
-                    propertyPath: 'renderingOptions.previousButtonLabel'
-                  400:
-                    identifier: 'nextButtonLabel'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.SummaryPage.editor.nextButtonLabel.label'
-                    propertyPath: 'renderingOptions.nextButtonLabel'
-
-            ### FORM ELEMENTS: INPUT ###
-
-            Text:
-              formEditor:
-                label: 'formEditor.elements.Text.label'
-                group: input
-                groupSorting: 100
-                iconIdentifier: 'form-text'
-
-            Password:
-              formEditor:
-                label: 'formEditor.elements.Password.label'
-                group: input
-                groupSorting: 300
-                iconIdentifier: 'form-password'
-
-            AdvancedPassword:
-              formEditor:
-                label: 'formEditor.elements.AdvancedPassword.label'
-                group: custom
-                groupSorting: 500
-                predefinedDefaults:
-                  properties:
-                    confirmationLabel: 'formEditor.element.AdvancedPassword.editor.confirmationLabel.predefinedDefaults'
-                  defaultValue: null
-                iconIdentifier: 'form-advanced-password'
-                editors:
-                  300:
-                    identifier: 'confirmationLabel'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.AdvancedPassword.editor.confirmationLabel.label'
-                    propertyPath: 'properties.confirmationLabel'
-                  500: null
-
-            Hidden:
-              formEditor:
-                label: 'formEditor.elements.Hidden.label'
-                group: custom
-                groupSorting: 300
-                iconIdentifier: 'form-hidden'
-                predefinedDefaults:
-                  defaultValue: ''
-                editors:
-                  230: null
-                  300:
-                    identifier: 'defaultValue'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.Hidden.editor.defaultValue.label'
-                    propertyPath: 'defaultValue'
-                  800: null
-
-            Textarea:
-              formEditor:
-                label: 'formEditor.elements.Textarea.label'
-                group: input
-                groupSorting: 200
-                iconIdentifier: 'form-textarea'
-                editors:
-                  900:
-                    selectOptions:
-                      # remove email validator
-                      50: null
-
-            ### FORM ELEMENTS: HTML5 ###
-            Email:
-              formEditor:
-                label: 'formEditor.elements.Email.label'
-                group: html5
-                groupSorting: 100
-                iconIdentifier: 'form-email'
-                predefinedDefaults:
-                  validators:
-                    -
-                      identifier: EmailAddress
-                editors:
-                  500:
-                    propertyValidators:
-                      10: 'NaiveEmailOrEmpty'
-                  900:
-                    selectOptions:
-                      20: null
-                      30: null
-                      40: null
-                      60: null
-                      70: null
-                      80: null
-                      90: null
-
-                propertyCollections:
-                  validators:
-                    40:
-                      editors:
-                        9999: null
-
-            Telephone:
-              formEditor:
-                label: 'formEditor.elements.Telephone.label'
-                group: html5
-                groupSorting: 200
-                iconIdentifier: 'form-telephone'
-
-                editors:
-                  900:
-                    selectOptions:
-                      20: null
-                      30: null
-                      40: null
-                      50: null
-                      60: null
-                      70: null
-                      80: null
-
-                propertyCollections:
-                  validators:
-                    80:
-                      editors:
-                        9999: null
-
-            Url:
-              formEditor:
-                label: 'formEditor.elements.Url.label'
-                group: html5
-                groupSorting: 300
-                iconIdentifier: 'form-url'
-
-                editors:
-                  900:
-                    selectOptions:
-                      20: null
-                      30: null
-                      40: null
-                      50: null
-                      60: null
-                      70: null
-                      80: null
-
-                propertyCollections:
-                  validators:
-                    80:
-                      editors:
-                        9999: null
-
-            Number:
-              formEditor:
-                label: 'formEditor.elements.Number.label'
-                group: html5
-                groupSorting: 400
-                iconIdentifier: 'form-number'
-                predefinedDefaults:
-                  properties:
-                    fluidAdditionalAttributes:
-                      step: 1
-                  validators:
-                    -
-                      identifier: Number
-                editors:
-                  500:
-                   propertyValidators:
-                      10: 'IntegerOrEmpty'
-                  700:
-                    identifier: 'step'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.TextMixin.editor.step.label'
-                    propertyPath: 'properties.fluidAdditionalAttributes.step'
-                    propertyValidators:
-                      10: 'Integer'
-
-                  900:
-                    selectOptions:
-                      20: null
-                      30: null
-                      40: null
-                      50: null
-                      60:
-                        value: 'Number'
-                        label: 'formEditor.elements.Number.editor.validators.Number.label'
-                      70: null
-                      90: null
-
-                propertyCollections:
-                  validators:
-                    60:
-                      identifier: 'Number'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.TextMixin.validators.Number.editor.header.label'
-                        9999: null
-
-            Date:
-              formEditor:
-                label: 'formEditor.elements.Date.label'
-                group: html5
-                groupSorting: 500
-                iconIdentifier: 'form-date-picker'
-                predefinedDefaults:
-                  properties:
-                    fluidAdditionalAttributes:
-                      min: ''
-                      max: ''
-                      step: 1
-                editors:
-                  400: null
-                  500:
-                    placeholder: 'formEditor.elements.Date.editor.defaultValue.placeholder'
-                    propertyValidators:
-                      10: 'RFC3339FullDateOrEmpty'
-                  550:
-                    identifier: 'step'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.Date.editor.step.label'
-                    fieldExplanationText: 'formEditor.elements.Date.editor.step.fieldExplanationText'
-                    propertyPath: 'properties.fluidAdditionalAttributes.step'
-                    propertyValidators:
-                      10: 'Integer'
-                  900:
-                    selectOptions:
-                      20:
-                        value: 'DateRange'
-                        label: 'formEditor.elements.Date.editor.validators.DateRange.label'
-                      30: null
-                      40: null
-                      50: null
-                      60: null
-                      70: null
-                      80: null
-                      90: null
-
-                propertyCollections:
-                  validators:
-                    10:
-                      identifier: 'DateRange'
-                      editors:
-                        100:
-                          label: 'formEditor.elements.DatePicker.validators.DateRange.editor.header.label'
-                        200:
-                          errorCodes:
-                            10: 1521293685
-                            20: 1521293686
-                            30: 1521293687
-                        250:
-                          identifier: 'minimum'
-                          templateName: 'Inspector-TextEditor'
-                          label: 'formEditor.elements.DatePicker.validators.DateRange.editor.minimum'
-                          placeholder: 'formEditor.elements.DatePicker.validators.DateRange.editor.minimum.placeholder'
-                          propertyPath: 'options.minimum'
-                          propertyValidators:
-                            10: 'RFC3339FullDateOrEmpty'
-                          additionalElementPropertyPaths:
-                            10: 'properties.fluidAdditionalAttributes.min'
-                        300:
-                          identifier: 'maximum'
-                          templateName: 'Inspector-TextEditor'
-                          label: 'formEditor.elements.DatePicker.validators.DateRange.editor.maximum'
-                          placeholder: 'formEditor.elements.DatePicker.validators.DateRange.editor.maximum.placeholder'
-                          propertyPath: 'options.maximum'
-                          propertyValidators:
-                            10: 'RFC3339FullDateOrEmpty'
-                          additionalElementPropertyPaths:
-                            10: 'properties.fluidAdditionalAttributes.max'
-
-            ### FORM ELEMENTS: SELECT ###
-            Checkbox:
-              formEditor:
-                label: 'formEditor.elements.Checkbox.label'
-                group: select
-                groupSorting: 100
-                iconIdentifier: 'form-checkbox'
-
-            MultiCheckbox:
-              formEditor:
-                label: 'formEditor.elements.MultiCheckbox.label'
-                group: select
-                groupSorting: 400
-                iconIdentifier: 'form-multi-checkbox'
-                editors:
-                  800:
-                    propertyPath: null
-                    propertyValue: null
-
-            MultiSelect:
-              formEditor:
-                label: 'formEditor.elements.MultiSelect.label'
-                group: select
-                groupSorting: 500
-                iconIdentifier: 'form-multi-select'
-                editors:
-                  250:
-                    identifier: 'inactiveOption'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.SelectionMixin.editor.inactiveOption.label'
-                    propertyPath: 'properties.prependOptionLabel'
-                    fieldExplanationText: 'formEditor.elements.SelectionMixin.editor.inactiveOption.fieldExplanationText'
-                    doNotSetIfPropertyValueIsEmpty: true
-
-            RadioButton:
-              formEditor:
-                label: 'formEditor.elements.RadioButton.label'
-                group: select
-                groupSorting: 300
-                iconIdentifier: 'form-radio-button'
-
-            SingleSelect:
-              formEditor:
-                label: 'formEditor.elements.SingleSelect.label'
-                group: select
-                groupSorting: 200
-                iconIdentifier: 'form-single-select'
-                editors:
-                  250:
-                    identifier: 'inactiveOption'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.SelectionMixin.editor.inactiveOption.label'
-                    propertyPath: 'properties.prependOptionLabel'
-                    fieldExplanationText: 'formEditor.elements.SelectionMixin.editor.inactiveOption.fieldExplanationText'
-                    doNotSetIfPropertyValueIsEmpty: true
-
-            ### FORM ELEMENTS: CUSTOM ###
-            DatePicker:
-              formEditor:
-                label: 'formEditor.elements.DatePicker.label'
-                group: custom
-                groupSorting: 200
-                predefinedDefaults:
-                  properties:
-                    dateFormat: 'Y-m-d'
-                    enableDatePicker: true
-                    displayTimeSelector: false
-                iconIdentifier: 'form-date-picker'
-                editors:
-                  300:
-                    identifier: 'dateFormat'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.DatePicker.editor.dateFormat.label'
-                    propertyPath: 'properties.dateFormat'
-                  350:
-                    identifier: 'placeholder'
-                    templateName: 'Inspector-TextEditor'
-                    label: 'formEditor.elements.TextMixin.editor.placeholder.label'
-                    propertyPath: 'properties.fluidAdditionalAttributes.placeholder'
-                    doNotSetIfPropertyValueIsEmpty: true
-                  400:
-                    identifier: 'enableDatePicker'
-                    templateName: 'Inspector-CheckboxEditor'
-                    label: 'formEditor.elements.DatePicker.editor.enableDatePicker.label'
-                    propertyPath: 'properties.enableDatePicker'
-                  500:
-                    identifier: 'displayTimeSelector'
-                    templateName: 'Inspector-CheckboxEditor'
-                    label: 'formEditor.elements.DatePicker.editor.displayTimeSelector.label'
-                    propertyPath: 'properties.displayTimeSelector'
-                  900:
-                    identifier: 'validators'
-                    templateName: 'Inspector-ValidatorsEditor'
-                    label: 'formEditor.elements.DatePicker.editor.validators.label'
-                    selectOptions:
-                      10:
-                        value: ''
-                        label: 'formEditor.elements.DatePicker.editor.validators.EmptyValue.label'
-                      20:
-                        value: 'DateTime'
-                        label: 'formEditor.elements.DatePicker.editor.validators.DateTime.label'
-
-                propertyCollections:
-                  validators:
-                    10:
-                      identifier: 'DateTime'
-                      editors:
-                        __inheritances:
-                          10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        100:
-                          label: 'formEditor.elements.DatePicker.validators.DateTime.editor.header.label'
-                        200:
-                          identifier: 'validationErrorMessage'
-                          templateName: 'Inspector-ValidationErrorMessageEditor'
-                          label: 'formEditor.elements.DatePicker.validators.DateTime.editor.validationErrorMessage.label'
-                          fieldExplanationText: 'formEditor.elements.DatePicker.validators.DateTime.editor.validationErrorMessage.fieldExplanationText'
-                          errorCodes:
-                            10: 1238087674
-                          propertyPath: 'properties.validationErrorMessages'
-
-            StaticText:
-              formEditor:
-                label: 'formEditor.elements.StaticText.label'
-                group: custom
-                groupSorting: 600
-                predefinedDefaults:
-                  properties:
-                    text: ''
-                iconIdentifier: 'form-static-text'
-                editors:
-                  200:
-                    label: 'formEditor.elements.StaticText.editor.label.label'
-                  300:
-                    identifier: 'staticText'
-                    templateName: 'Inspector-TextareaEditor'
-                    label: 'formEditor.elements.StaticText.editor.staticText.label'
-                    propertyPath: 'properties.text'
-
-            ContentElement:
-              formEditor:
-                label: 'formEditor.elements.ContentElement.label'
-                group: custom
-                groupSorting: 700
-                predefinedDefaults:
-                  label: 'formEditor.elements.ContentElement.label'
-                  properties:
-                    contentElementUid: ''
-                iconIdentifier: 'form-content-element'
-                editors:
-                  200: null
-                  300:
-                    identifier: 'contentElement'
-                    templateName: 'Inspector-Typo3WinBrowserEditor'
-                    label: 'formEditor.elements.ContentElement.editor.contentElement.label'
-                    buttonLabel: 'formEditor.elements.ContentElement.editor.contentElement.buttonLabel'
-                    browsableType: tt_content
-                    propertyPath: 'properties.contentElementUid'
-                    propertyValidatorsMode: 'OR'
-                    propertyValidators:
-                      10: 'Integer'
-                      20: 'FormElementIdentifierWithinCurlyBracesExclusive'
-
-            ### FORM ELEMENTS: UPLOADS ###
-            FileUpload:
-              formEditor:
-                label: 'formEditor.elements.FileUpload.label'
-                group: custom
-                groupSorting: 100
-                predefinedDefaults:
-                  properties:
-                    allowedMimeTypes: ['application/pdf']
-                iconIdentifier: 'form-file-upload'
-                editors:
-                  300:
-                    identifier: 'allowedMimeTypes'
-                    templateName: 'Inspector-MultiSelectEditor'
-                    label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.label'
-                    propertyPath: 'properties.allowedMimeTypes'
-                    selectOptions:
-                      10:
-                        value: 'application/msword'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.doc'
-                      20:
-                        value: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.docx'
-                      30:
-                        value: 'application/msexcel'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.xls'
-                      40:
-                        value: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.xlsx'
-                      50:
-                        value: 'application/pdf'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.pdf'
-                      60:
-                        value: 'application/vnd.oasis.opendocument.text'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.odt'
-                      70:
-                        value: 'application/vnd.oasis.opendocument.spreadsheet-template'
-                        label: 'formEditor.elements.FileUpload.editor.allowedMimeTypes.ods'
-
-            ImageUpload:
-              formEditor:
-                label: 'formEditor.elements.ImageUpload.label'
-                group: custom
-                groupSorting: 400
-                predefinedDefaults:
-                  properties:
-                    allowedMimeTypes: ['image/jpeg']
-                iconIdentifier: 'form-image-upload'
-                editors:
-                  300:
-                    identifier: 'allowedMimeTypes'
-                    templateName: 'Inspector-MultiSelectEditor'
-                    label: 'formEditor.elements.ImageUpload.editor.allowedMimeTypes.label'
-                    propertyPath: 'properties.allowedMimeTypes'
-                    selectOptions:
-                      10:
-                        value: 'image/jpeg'
-                        label: 'formEditor.elements.ImageUpload.editor.allowedMimeTypes.jpg'
-                      20:
-                        value: 'image/png'
-                        label: 'formEditor.elements.ImageUpload.editor.allowedMimeTypes.png'
-                      30:
-                        value: 'image/bmp'
-                        label: 'formEditor.elements.ImageUpload.editor.allowedMimeTypes.bmp'
-
-          ### FINISHERS ###
-          finishersDefinition:
-            EmailToSender:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    subject: ''
-                    recipients: {}
-                    senderAddress: ''
-                    senderName: ''
-                    replyToRecipients: {}
-                    carbonCopyRecipients: {}
-                    blindCarbonCopyRecipients: {}
-                    addHtmlPart: true
-                    attachUploads: true
-
-            EmailToReceiver:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    subject: ''
-                    recipients: {}
-                    senderAddress: ''
-                    senderName: ''
-                    replyToRecipients: {}
-                    carbonCopyRecipients: {}
-                    blindCarbonCopyRecipients: {}
-                    addHtmlPart: true
-                    attachUploads: true
-                    translation:
-                      language: ''
-
-            Redirect:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.Redirect.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    pageUid: ''
-                    additionalParameters: ''
-
-            Closure:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.Closure.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    closure: ''
-
-            Confirmation:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.Confirmation.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    message: ''
-                    contentElementUid: ''
-
-            FlashMessage:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.FlashMessage.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    messageBody: ''
-                    messageTitle: ''
-                    messageArguments: ''
-                    messageCode: 0
-                    severity: 0
-
-            SaveToDatabase:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label'
-                predefinedDefaults:
-                  options: []
-
-            DeleteUploads:
-              formEditor:
-                iconIdentifier: 'form-finisher'
-                label: 'formEditor.elements.Form.finisher.DeleteUploads.editor.header.label'
-
-          ### VALIDATORS ###
-          validatorsDefinition:
-            NotEmpty:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label : 'formEditor.elements.FormElement.editor.requiredValidator.label'
-            DateTime:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.DatePicker.validators.DateTime.editor.header.label'
-            Alphanumeric:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.Alphanumeric.label'
-            Text:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.Text.label'
-            StringLength:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.StringLength.label'
-                predefinedDefaults:
-                  options:
-                    minimum: ''
-                    maximum: ''
-            EmailAddress:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.EmailAddress.label'
-            Integer:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.Integer.label'
-            Float:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.Float.label'
-            Number:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.Number.label'
-            NumberRange:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.NumberRange.label'
-                predefinedDefaults:
-                  options:
-                    minimum: ''
-                    maximum: ''
-            RegularExpression:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.TextMixin.editor.validators.RegularExpression.label'
-                predefinedDefaults:
-                  options:
-                    regularExpression: ''
-            Count:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    minimum: ''
-                    maximum: ''
-            FileSize:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    minimum: '0B'
-                    maximum: '10M'
-            DateRange:
-              formEditor:
-                iconIdentifier: 'form-validator'
-                label: 'formEditor.elements.FormElement.validators.DateRange.editor.header.label'
-                predefinedDefaults:
-                  options:
-                    minimum: ''
-                    maximum: ''
-
-      ########### MIXINS ###########
-      mixins:
-        ########### FORM ELEMENT MIXINS ###########
-        formElementMixins:
-          BaseFormElementMixin:
-            formEditor:
-              predefinedDefaults: []
-              editors:
-                100:
-                  identifier: 'header'
-                  templateName: 'Inspector-FormElementHeaderEditor'
-                200:
-                  identifier: 'label'
-                  templateName: 'Inspector-TextEditor'
-                  label: 'formEditor.elements.BaseFormElementMixin.editor.label.label'
-                  propertyPath: 'label'
-
-          RemoveButtonMixin:
-            9999:
-              identifier: 'removeButton'
-              templateName: 'Inspector-RemoveElementEditor'
-
-          RemovableFormElementMixin:
-            editors:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.RemoveButtonMixin'
-
-          BaseCollectionEditorsMixin:
-            __inheritances:
-              10: 'TYPO3.CMS.Form.mixins.formElementMixins.RemoveButtonMixin'
-            100:
-              identifier: 'header'
-              templateName: 'Inspector-CollectionElementHeaderEditor'
-              label: ''
-
-          MinimumMaximumEditorsMixin:
-            200:
-              identifier: 'minimum'
-              templateName: 'Inspector-TextEditor'
-              label: 'formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label'
-              propertyPath: 'options.minimum'
-              propertyValidators:
-                10: 'Integer'
-            300:
-              identifier: 'maximum'
-              templateName: 'Inspector-TextEditor'
-              label: 'formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label'
-              propertyPath: 'options.maximum'
-              propertyValidators:
-                10: 'Integer'
-
-          ReadOnlyFormElementMixin:
-            formEditor:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.RemovableFormElementMixin'
-              editors:
-                200:
-                  label: 'formEditor.elements.ReadOnlyFormElement.editor.label.label'
-
-          FormElementMixin:
-            formEditor:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.RemovableFormElementMixin'
-              editors:
-                200:
-                  label: 'formEditor.elements.FormElement.editor.label.label'
-
-                230:
-                  identifier: 'elementDescription'
-                  templateName: 'Inspector-TextEditor'
-                  label: 'formEditor.elements.FormElement.editor.elementDescription.label'
-                  propertyPath: 'properties.elementDescription'
-
-                700:
-                  identifier: 'gridColumnViewPortConfiguration'
-                  templateName: 'Inspector-GridColumnViewPortConfigurationEditor'
-                  label: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label'
-                  configurationOptions:
-                    viewPorts:
-                      10:
-                        viewPortIdentifier: 'xs'
-                        label: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label'
-                      20:
-                        viewPortIdentifier: 'sm'
-                        label: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label'
-                      30:
-                        viewPortIdentifier: 'md'
-                        label: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label'
-                      40:
-                        viewPortIdentifier: 'lg'
-                        label: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label'
-                    numbersOfColumnsToUse:
-                      label: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label'
-                      propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
-                      fieldExplanationText: 'formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText'
-
-                800:
-                  identifier: 'requiredValidator'
-                  templateName: 'Inspector-RequiredValidatorEditor'
-                  label: 'formEditor.elements.FormElement.editor.requiredValidator.label'
-                  validatorIdentifier: 'NotEmpty'
-                  propertyPath: 'properties.fluidAdditionalAttributes.required'
-                  propertyValue: 'required'
-                  configurationOptions:
-                    validationErrorMessage:
-                      label: 'formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label'
-                      propertyPath: 'properties.validationErrorMessages'
-                      fieldExplanationText: 'formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText'
-                      errorCodes:
-                        10: 1221560910
-                        20: 1221560718
-                        30: 1347992400
-                        40: 1347992453
-
-          TextMixin:
-            formEditor:
-              predefinedDefaults:
-                defaultValue: ''
-              editors:
-                400:
-                  identifier: 'placeholder'
-                  templateName: 'Inspector-TextEditor'
-                  label: 'formEditor.elements.TextMixin.editor.placeholder.label'
-                  propertyPath: 'properties.fluidAdditionalAttributes.placeholder'
-                  doNotSetIfPropertyValueIsEmpty: true
-                500:
-                  identifier: 'defaultValue'
-                  templateName: 'Inspector-TextEditor'
-                  label: 'formEditor.elements.TextMixin.editor.defaultValue.label'
-                  propertyPath: 'defaultValue'
-                900:
-                  identifier: 'validators'
-                  templateName: 'Inspector-ValidatorsEditor'
-                  label: 'formEditor.elements.TextMixin.editor.validators.label'
-                  selectOptions:
-                    10:
-                      value: ''
-                      label: 'formEditor.elements.TextMixin.editor.validators.EmptyValue.label'
-                    20:
-                      value: 'Alphanumeric'
-                      label: 'formEditor.elements.TextMixin.editor.validators.Alphanumeric.label'
-                    30:
-                      value: 'Text'
-                      label: 'formEditor.elements.TextMixin.editor.validators.Text.label'
-                    40:
-                      value: 'StringLength'
-                      label: 'formEditor.elements.TextMixin.editor.validators.StringLength.label'
-                    50:
-                      value: 'EmailAddress'
-                      label: 'formEditor.elements.TextMixin.editor.validators.EmailAddress.label'
-                    60:
-                      value: 'Integer'
-                      label: 'formEditor.elements.TextMixin.editor.validators.Integer.label'
-                    70:
-                      value: 'Float'
-                      label: 'formEditor.elements.TextMixin.editor.validators.Float.label'
-                    80:
-                      value: 'NumberRange'
-                      label: 'formEditor.elements.TextMixin.editor.validators.NumberRange.label'
-                    90:
-                      value: 'RegularExpression'
-                      label: 'formEditor.elements.TextMixin.editor.validators.RegularExpression.label'
-
-              propertyCollections:
-                validators:
-                  10:
-                    identifier: 'Alphanumeric'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label'
-                      200:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221551320
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  20:
-                    identifier: 'Text'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.Text.editor.header.label'
-                      200:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221565786
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  30:
-                    identifier: 'StringLength'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        20: 'TYPO3.CMS.Form.mixins.formElementMixins.MinimumMaximumEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.StringLength.editor.header.label'
-                      200:
-                        additionalElementPropertyPaths:
-                          10: 'properties.fluidAdditionalAttributes.minlength'
-                      300:
-                        additionalElementPropertyPaths:
-                          10: 'properties.fluidAdditionalAttributes.maxlength'
-                      400:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1238110957
-                          20: 1269883975
-                          30: 1428504122
-                          40: 1238108068
-                          50: 1238108069
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  40:
-                    identifier: 'EmailAddress'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label'
-                      200:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221559976
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  50:
-                    identifier: 'Integer'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.Integer.editor.header.label'
-                      200:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221560494
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  60:
-                    identifier: 'Float'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.Float.editor.header.label'
-                      200:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221560288
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  70:
-                    identifier: 'NumberRange'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        20: 'TYPO3.CMS.Form.mixins.formElementMixins.MinimumMaximumEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.NumberRange.editor.header.label'
-                      200:
-                        additionalElementPropertyPaths:
-                          10: 'properties.fluidAdditionalAttributes.min'
-                      300:
-                        additionalElementPropertyPaths:
-                          10: 'properties.fluidAdditionalAttributes.max'
-                      400:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221563685
-                          20: 1221561046
-                        propertyPath: 'properties.validationErrorMessages'
-
-                  80:
-                    identifier: 'RegularExpression'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label'
-                      200:
-                        identifier: 'regex'
-                        templateName: 'Inspector-TextEditor'
-                        label: 'formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.fieldExplanationText'
-                        propertyPath: 'options.regularExpression'
-                        propertyValidators:
-                          10: 'NotEmpty'
-                      300:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1221565130
-                        propertyPath: 'properties.validationErrorMessages'
-
-          SelectionMixin:
-            formEditor:
-              predefinedDefaults:
-                properties:
-                  options: []
-              editors:
-                300:
-                  identifier: 'options'
-                  templateName: 'Inspector-PropertyGridEditor'
-                  label: 'formEditor.elements.SelectionMixin.editor.options.label'
-                  propertyPath: 'properties.options'
-                  propertyValidators:
-                    10: 'NotEmpty'
-                  isSortable: true
-                  enableAddRow: true
-                  enableDeleteRow: true
-                  removeLastAvailableRowFlashMessageTitle: 'formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle'
-                  removeLastAvailableRowFlashMessageMessage: 'formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage'
-
-          SingleSelectionMixin:
-            formEditor:
-              editors:
-                300:
-                  shouldShowPreselectedValueColumn: 'single'
-                  multiSelection: false
-
-          MultiSelectionMixin:
-            formEditor:
-              editors:
-                300:
-                  shouldShowPreselectedValueColumn: 'multiple'
-                  multiSelection: true
-                900:
-                  identifier: 'validators'
-                  templateName: 'Inspector-ValidatorsEditor'
-                  label: 'formEditor.elements.MultiSelectionMixin.editor.validators.label'
-                  selectOptions:
-                    10:
-                      value: ''
-                      label: 'formEditor.elements.MultiSelectionMixin.editor.validators.EmptyValue.label'
-                    20:
-                      value: 'Count'
-                      label: 'formEditor.elements.MultiSelectionMixin.editor.validators.Count.label'
-
-              propertyCollections:
-                validators:
-                  10:
-                    identifier: 'Count'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        20: 'TYPO3.CMS.Form.mixins.formElementMixins.MinimumMaximumEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label'
-                      400:
-                        identifier: 'validationErrorMessage'
-                        templateName: 'Inspector-ValidationErrorMessageEditor'
-                        label: 'formEditor.elements.MultiSelectionMixin.validators.Count.editor.validationErrorMessage.label'
-                        fieldExplanationText: 'formEditor.elements.MultiSelectionMixin.validators.Count.editor.validationErrorMessage.fieldExplanationText'
-                        errorCodes:
-                          10: 1475002976
-                          20: 1475002994
-                        propertyPath: 'properties.validationErrorMessages'
-
-          FileUploadMixin:
-            formEditor:
-              predefinedDefaults:
-                properties:
-                  saveToFileMount: '1:/user_upload/'
-              editors:
-                400:
-                  identifier: 'saveToFileMount'
-                  templateName: 'Inspector-SingleSelectEditor'
-                  label: 'formEditor.elements.FileUploadMixin.editor.saveToFileMount.label'
-                  propertyPath: 'properties.saveToFileMount'
-                  selectOptions:
-                    10:
-                      value: '1:/user_upload/'
-                      label: '1:/user_upload/'
-                900:
-                  identifier: 'validators'
-                  templateName: 'Inspector-ValidatorsEditor'
-                  label: 'formEditor.elements.FileUploadMixin.editor.validators.label'
-                  selectOptions:
-                    10:
-                      value: ''
-                      label: 'formEditor.elements.FileUploadMixin.editor.validators.EmptyValue.label'
-                    20:
-                      value: 'FileSize'
-                      label: 'formEditor.elements.FileUploadMixin.editor.validators.FileSize.label'
-
-              propertyCollections:
-                validators:
-                  10:
-                    identifier: 'FileSize'
-                    editors:
-                      __inheritances:
-                        10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                        20: 'TYPO3.CMS.Form.mixins.formElementMixins.MinimumMaximumEditorsMixin'
-                      100:
-                        label: 'formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label'
-                      150:
-                        identifier: 'maximumFileSize'
-                        templateName: 'Inspector-MaximumFileSizeEditor'
-                        label: 'formEditor.elements.FileUpload.editor.maximumFileSize.label'
-                      200:
-                        propertyValidators:
-                          10: 'FileSize'
-                      300:
-                        propertyValidators:
-                          10: 'FileSize'
-
-          formEmailFinisherMixin:
-            editors:
-              __inheritances:
-                10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-              100:
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.header.label'
-              200:
-                identifier: 'subject'
-                templateName: 'Inspector-TextEditor'
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.subject.label'
-                propertyPath: 'options.subject'
-                enableFormelementSelectionButton: true
-                propertyValidators:
-                  10: 'NotEmpty'
-                  20: 'FormElementIdentifierWithinCurlyBracesInclusive'
-              350:
-                identifier: 'recipients'
-                templateName: 'Inspector-PropertyGridEditor'
-                label: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.label
-                propertyPath: 'options.recipients'
-                propertyValidators:
-                  10: 'NotEmpty'
-                fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToSender.editor.recipients.fieldExplanationText'
-                isSortable: true
-                enableAddRow: true
-                enableDeleteRow: true
-                useLabelAsFallbackValue: false
-                gridColumns:
-                  - name: value
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
-                  - name: label
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
-              500:
-                identifier: 'senderAddress'
-                templateName: 'Inspector-TextEditor'
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.senderAddress.label'
-                propertyPath: 'options.senderAddress'
-                enableFormelementSelectionButton: true
-                propertyValidatorsMode: 'OR'
-                propertyValidators:
-                  10: 'NaiveEmail'
-                  20: 'FormElementIdentifierWithinCurlyBracesExclusive'
-                fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToSender.editor.senderAddress.fieldExplanationText'
-              600:
-                identifier: 'senderName'
-                templateName: 'Inspector-TextEditor'
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.senderName.label'
-                propertyPath: 'options.senderName'
-                enableFormelementSelectionButton: true
-                propertyValidators:
-                  10: 'FormElementIdentifierWithinCurlyBracesInclusive'
-                fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToSender.editor.senderName.fieldExplanationText'
-              750:
-                identifier: 'replyToRecipients'
-                templateName: 'Inspector-PropertyGridEditor'
-                label: formEditor.elements.Form.finisher.EmailToSender.editor.replyToRecipients.label
-                propertyPath: 'options.replyToRecipients'
-                isSortable: true
-                enableAddRow: true
-                enableDeleteRow: true
-                useLabelAsFallbackValue: false
-                gridColumns:
-                  - name: value
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
-                  - name: label
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
-              850:
-                identifier: 'carbonCopyRecipients'
-                templateName: 'Inspector-PropertyGridEditor'
-                label: formEditor.elements.Form.finisher.EmailToSender.editor.carbonCopyRecipients.label
-                propertyPath: 'options.carbonCopyRecipients'
-                isSortable: true
-                enableAddRow: true
-                enableDeleteRow: true
-                useLabelAsFallbackValue: false
-                gridColumns:
-                  - name: value
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
-                  - name: label
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
-              950:
-                identifier: 'blindCarbonCopyRecipients'
-                templateName: 'Inspector-PropertyGridEditor'
-                label: formEditor.elements.Form.finisher.EmailToSender.editor.blindCarbonCopyRecipients.label
-                propertyPath: 'options.blindCarbonCopyRecipients'
-                isSortable: true
-                enableAddRow: true
-                enableDeleteRow: true
-                useLabelAsFallbackValue: false
-                gridColumns:
-                  - name: value
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
-                  - name: label
-                    title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
-              1050:
-                identifier: 'addHtmlPart'
-                templateName: 'Inspector-CheckboxEditor'
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.label'
-                propertyPath: 'options.addHtmlPart'
-                fieldExplanationText: 'formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.fieldExplanationText'
-              1100:
-                identifier: 'attachUploads'
-                templateName: 'Inspector-CheckboxEditor'
-                label: 'formEditor.elements.Form.finisher.EmailToSender.editor.attachUploads.label'
-                propertyPath: 'options.attachUploads'
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/AdvancedPassword.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/AdvancedPassword.yaml
new file mode 100644 (file)
index 0000000..0338a40
--- /dev/null
@@ -0,0 +1,319 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            AdvancedPassword:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  300:
+                    identifier: confirmationLabel
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.AdvancedPassword.editor.confirmationLabel.label
+                    propertyPath: properties.confirmationLabel
+                  400:
+                    identifier: placeholder
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.placeholder.label
+                    propertyPath: properties.fluidAdditionalAttributes.placeholder
+                    doNotSetIfPropertyValueIsEmpty: true
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.TextMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label
+                      20:
+                        value: Alphanumeric
+                        label: formEditor.elements.TextMixin.editor.validators.Alphanumeric.label
+                      30:
+                        value: Text
+                        label: formEditor.elements.TextMixin.editor.validators.Text.label
+                      40:
+                        value: StringLength
+                        label: formEditor.elements.TextMixin.editor.validators.StringLength.label
+                      50:
+                        value: EmailAddress
+                        label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label
+                      60:
+                        value: Integer
+                        label: formEditor.elements.TextMixin.editor.validators.Integer.label
+                      70:
+                        value: Float
+                        label: formEditor.elements.TextMixin.editor.validators.Float.label
+                      80:
+                        value: NumberRange
+                        label: formEditor.elements.TextMixin.editor.validators.NumberRange.label
+                      90:
+                        value: RegularExpression
+                        label: formEditor.elements.TextMixin.editor.validators.RegularExpression.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  properties:
+                    confirmationLabel: formEditor.element.AdvancedPassword.editor.confirmationLabel.predefinedDefaults
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: Alphanumeric
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221551320
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    20:
+                      identifier: Text
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565786
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    30:
+                      identifier: StringLength
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.minlength
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.maxlength
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1238110957
+                            20: 1269883975
+                            30: 1428504122
+                            40: 1238108068
+                            50: 1238108069
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    40:
+                      identifier: EmailAddress
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221559976
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    50:
+                      identifier: Integer
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560494
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    60:
+                      identifier: Float
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560288
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    70:
+                      identifier: NumberRange
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.min
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.max
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221563685
+                            20: 1221561046
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    80:
+                      identifier: RegularExpression
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label
+                        200:
+                          identifier: regex
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.fieldExplanationText
+                          propertyPath: options.regularExpression
+                          propertyValidators:
+                            10: NotEmpty
+                        300:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565130
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                label: formEditor.elements.AdvancedPassword.label
+                group: custom
+                groupSorting: 500
+                iconIdentifier: form-advanced-password
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: input-medium
+                elementErrorClassAttribute: error
+                confirmationLabel: ''
+                confirmationClassAttribute: input-medium
+          formEditor:
+            formEditorPartials:
+              FormElement-AdvancedPassword: Stage/SimpleTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Checkbox.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Checkbox.yaml
new file mode 100644 (file)
index 0000000..5ff2867
--- /dev/null
@@ -0,0 +1,78 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Checkbox:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults: {  }
+                label: formEditor.elements.Checkbox.label
+                group: select
+                groupSorting: 100
+                iconIdentifier: form-checkbox
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: 'input checkbox'
+                elementClassAttribute: add-on
+                elementErrorClassAttribute: error
+                value: 1
+          formEditor:
+            formEditorPartials:
+              FormElement-Checkbox: Stage/SimpleTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/ContentElement.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/ContentElement.yaml
new file mode 100644 (file)
index 0000000..2a7fabf
--- /dev/null
@@ -0,0 +1,46 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            ContentElement:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  300:
+                    identifier: contentElement
+                    templateName: Inspector-Typo3WinBrowserEditor
+                    label: formEditor.elements.ContentElement.editor.contentElement.label
+                    buttonLabel: formEditor.elements.ContentElement.editor.contentElement.buttonLabel
+                    browsableType: tt_content
+                    propertyPath: properties.contentElementUid
+                    propertyValidatorsMode: OR
+                    propertyValidators:
+                      10: Integer
+                      20: FormElementIdentifierWithinCurlyBracesExclusive
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  label: formEditor.elements.ContentElement.label
+                  properties:
+                    contentElementUid: ''
+                label: formEditor.elements.ContentElement.label
+                group: custom
+                groupSorting: 700
+                iconIdentifier: form-content-element
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              variants:
+                -
+                  identifier: hide-1
+                  renderingOptions:
+                    enabled: false
+                  condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
+              properties:
+                contentElementUid: ''
+          formEditor:
+            formEditorPartials:
+              FormElement-ContentElement: Stage/ContentElement
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Date.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Date.yaml
new file mode 100644 (file)
index 0000000..b1020ed
--- /dev/null
@@ -0,0 +1,330 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Date:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  500:
+                    identifier: defaultValue
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.defaultValue.label
+                    propertyPath: defaultValue
+                    placeholder: formEditor.elements.Date.editor.defaultValue.placeholder
+                    propertyValidators:
+                      10: RFC3339FullDateOrEmpty
+                  550:
+                    identifier: step
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.Date.editor.step.label
+                    fieldExplanationText: formEditor.elements.Date.editor.step.fieldExplanationText
+                    propertyPath: properties.fluidAdditionalAttributes.step
+                    propertyValidators:
+                      10: Integer
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.TextMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label
+                      20:
+                        value: DateRange
+                        label: formEditor.elements.Date.editor.validators.DateRange.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  defaultValue: ''
+                  properties:
+                    fluidAdditionalAttributes:
+                      min: ''
+                      max: ''
+                      step: 1
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: DateRange
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.DatePicker.validators.DateRange.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1521293685
+                            20: 1521293686
+                            30: 1521293687
+                          propertyPath: properties.validationErrorMessages
+                        250:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.DatePicker.validators.DateRange.editor.minimum
+                          placeholder: formEditor.elements.DatePicker.validators.DateRange.editor.minimum.placeholder
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: RFC3339FullDateOrEmpty
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.min
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.DatePicker.validators.DateRange.editor.maximum
+                          placeholder: formEditor.elements.DatePicker.validators.DateRange.editor.maximum.placeholder
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: RFC3339FullDateOrEmpty
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.max
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    20:
+                      identifier: Text
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565786
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    30:
+                      identifier: StringLength
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.minlength
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.maxlength
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1238110957
+                            20: 1269883975
+                            30: 1428504122
+                            40: 1238108068
+                            50: 1238108069
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    40:
+                      identifier: EmailAddress
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221559976
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    50:
+                      identifier: Integer
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560494
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    60:
+                      identifier: Float
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560288
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    70:
+                      identifier: NumberRange
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.min
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.max
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221563685
+                            20: 1221561046
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    80:
+                      identifier: RegularExpression
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label
+                        200:
+                          identifier: regex
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.fieldExplanationText
+                          propertyPath: options.regularExpression
+                          propertyValidators:
+                            10: NotEmpty
+                        300:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565130
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                label: formEditor.elements.Date.label
+                group: html5
+                groupSorting: 500
+                iconIdentifier: form-date-picker
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+                displayFormat: d.m.Y
+                fluidAdditionalAttributes:
+                  pattern: '([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])'
+          formEditor:
+            formEditorPartials:
+              FormElement-Date: Stage/SimpleTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/DatePicker.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/DatePicker.yaml
new file mode 100644 (file)
index 0000000..0ea3cba
--- /dev/null
@@ -0,0 +1,139 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            DatePicker:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  300:
+                    identifier: dateFormat
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.DatePicker.editor.dateFormat.label
+                    propertyPath: properties.dateFormat
+                  350:
+                    identifier: placeholder
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.placeholder.label
+                    propertyPath: properties.fluidAdditionalAttributes.placeholder
+                    doNotSetIfPropertyValueIsEmpty: true
+                  400:
+                    identifier: enableDatePicker
+                    templateName: Inspector-CheckboxEditor
+                    label: formEditor.elements.DatePicker.editor.enableDatePicker.label
+                    propertyPath: properties.enableDatePicker
+                  500:
+                    identifier: displayTimeSelector
+                    templateName: Inspector-CheckboxEditor
+                    label: formEditor.elements.DatePicker.editor.displayTimeSelector.label
+                    propertyPath: properties.displayTimeSelector
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.DatePicker.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.DatePicker.editor.validators.EmptyValue.label
+                      20:
+                        value: DateTime
+                        label: formEditor.elements.DatePicker.editor.validators.DateTime.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  properties:
+                    dateFormat: Y-m-d
+                    enableDatePicker: true
+                    displayTimeSelector: false
+                label: formEditor.elements.DatePicker.label
+                group: custom
+                groupSorting: 200
+                iconIdentifier: form-date-picker
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: DateTime
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.DatePicker.validators.DateTime.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.DatePicker.validators.DateTime.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.DatePicker.validators.DateTime.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1238087674
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: 'small form-control'
+                elementErrorClassAttribute: error
+                timeSelectorClassAttribute: mini
+                timeSelectorHourLabel: ''
+                timeSelectorMinuteLabel: ''
+                dateFormat: Y-m-d
+                enableDatePicker: true
+                displayTimeSelector: false
+          formEditor:
+            formEditorPartials:
+              FormElement-DatePicker: Stage/SimpleTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Email.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Email.yaml
new file mode 100644 (file)
index 0000000..a0e7573
--- /dev/null
@@ -0,0 +1,300 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Email:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  400:
+                    identifier: placeholder
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.placeholder.label
+                    propertyPath: properties.fluidAdditionalAttributes.placeholder
+                    doNotSetIfPropertyValueIsEmpty: true
+                  500:
+                    identifier: defaultValue
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.defaultValue.label
+                    propertyPath: defaultValue
+                    propertyValidators:
+                      10: NaiveEmailOrEmpty
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.TextMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label
+                      50:
+                        value: EmailAddress
+                        label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  defaultValue: ''
+                  validators:
+                    -
+                      identifier: EmailAddress
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: Alphanumeric
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221551320
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    20:
+                      identifier: Text
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565786
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    30:
+                      identifier: StringLength
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.minlength
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.maxlength
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1238110957
+                            20: 1269883975
+                            30: 1428504122
+                            40: 1238108068
+                            50: 1238108069
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    40:
+                      identifier: EmailAddress
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221559976
+                          propertyPath: properties.validationErrorMessages
+                    50:
+                      identifier: Integer
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560494
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    60:
+                      identifier: Float
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560288
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    70:
+                      identifier: NumberRange
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.min
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.max
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221563685
+                            20: 1221561046
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    80:
+                      identifier: RegularExpression
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label
+                        200:
+                          identifier: regex
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.fieldExplanationText
+                          propertyPath: options.regularExpression
+                          propertyValidators:
+                            10: NotEmpty
+                        300:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565130
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                label: formEditor.elements.Email.label
+                group: html5
+                groupSorting: 100
+                iconIdentifier: form-email
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+              validators:
+                -
+                  identifier: EmailAddress
+          formEditor:
+            formEditorPartials:
+              FormElement-Email: Stage/SimpleTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Fieldset.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Fieldset.yaml
new file mode 100644 (file)
index 0000000..96b53f7
--- /dev/null
@@ -0,0 +1,58 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Fieldset:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.Fieldset.editor.label.label
+                    propertyPath: label
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults: {  }
+                label: formEditor.elements.Fieldset.label
+                group: container
+                groupSorting: 100
+                _isCompositeFormElement: true
+                iconIdentifier: form-fieldset
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Section
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+              renderingOptions:
+                _isCompositeFormElement: true
+          formEditor:
+            formEditorPartials:
+              FormElement-Fieldset: Stage/Fieldset
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/FileUpload.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/FileUpload.yaml
new file mode 100644 (file)
index 0000000..8dbda36
--- /dev/null
@@ -0,0 +1,164 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            FileUpload:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  300:
+                    identifier: allowedMimeTypes
+                    templateName: Inspector-MultiSelectEditor
+                    label: formEditor.elements.FileUpload.editor.allowedMimeTypes.label
+                    propertyPath: properties.allowedMimeTypes
+                    selectOptions:
+                      10:
+                        value: application/msword
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.doc
+                      20:
+                        value: application/vnd.openxmlformats-officedocument.wordprocessingml.document
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.docx
+                      30:
+                        value: application/msexcel
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.xls
+                      40:
+                        value: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.xlsx
+                      50:
+                        value: application/pdf
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.pdf
+                      60:
+                        value: application/vnd.oasis.opendocument.text
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.odt
+                      70:
+                        value: application/vnd.oasis.opendocument.spreadsheet-template
+                        label: formEditor.elements.FileUpload.editor.allowedMimeTypes.ods
+                  400:
+                    identifier: saveToFileMount
+                    templateName: Inspector-SingleSelectEditor
+                    label: formEditor.elements.FileUploadMixin.editor.saveToFileMount.label
+                    propertyPath: properties.saveToFileMount
+                    selectOptions:
+                      10:
+                        value: '1:/user_upload/'
+                        label: '1:/user_upload/'
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.FileUploadMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.FileUploadMixin.editor.validators.EmptyValue.label
+                      20:
+                        value: FileSize
+                        label: formEditor.elements.FileUploadMixin.editor.validators.FileSize.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  properties:
+                    saveToFileMount: '1:/user_upload/'
+                    allowedMimeTypes:
+                      - application/pdf
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: FileSize
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label
+                        150:
+                          identifier: maximumFileSize
+                          templateName: Inspector-MaximumFileSizeEditor
+                          label: formEditor.elements.FileUpload.editor.maximumFileSize.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: FileSize
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: FileSize
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                label: formEditor.elements.FileUpload.label
+                group: custom
+                groupSorting: 100
+                iconIdentifier: form-file-upload
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+                saveToFileMount: '1:/user_upload/'
+                allowedMimeTypes:
+                  - application/msword
+                  - application/vnd.openxmlformats-officedocument.wordprocessingml.document
+                  - application/vnd.oasis.opendocument.text
+                  - application/pdf
+          formEditor:
+            formEditorPartials:
+              FormElement-FileUpload: Stage/FileUploadTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Form.yaml
new file mode 100644 (file)
index 0000000..ec841a6
--- /dev/null
@@ -0,0 +1,433 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Form:
+              formEditor:
+                predefinedDefaults:
+                  renderingOptions:
+                    submitButtonLabel: formEditor.elements.Form.editor.submitButtonLabel.value
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.BaseFormElementMixin.editor.label.label
+                    propertyPath: label
+                  300:
+                    identifier: submitButtonLabel
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.Form.editor.submitButtonLabel.label
+                    propertyPath: renderingOptions.submitButtonLabel
+                  900:
+                    identifier: finishers
+                    templateName: Inspector-FinishersEditor
+                    label: formEditor.elements.Form.editor.finishers.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.Form.editor.finishers.EmptyValue.label
+                      20:
+                        value: EmailToSender
+                        label: formEditor.elements.Form.editor.finishers.EmailToSender.label
+                      30:
+                        value: EmailToReceiver
+                        label: formEditor.elements.Form.editor.finishers.EmailToReceiver.label
+                      40:
+                        value: Redirect
+                        label: formEditor.elements.Form.editor.finishers.Redirect.label
+                      50:
+                        value: DeleteUploads
+                        label: formEditor.elements.Form.editor.finishers.DeleteUploads.label
+                      60:
+                        value: Confirmation
+                        label: formEditor.elements.Form.editor.finishers.Confirmation.label
+                _isCompositeFormElement: false
+                _isTopLevelFormElement: true
+                saveSuccessFlashMessageTitle: formEditor.elements.Form.saveSuccessFlashMessageTitle
+                saveSuccessFlashMessageMessage: formEditor.elements.Form.saveSuccessFlashMessageMessage
+                saveErrorFlashMessageTitle: formEditor.elements.Form.saveErrorFlashMessageTitle
+                saveErrorFlashMessageMessage: formEditor.elements.Form.saveErrorFlashMessageMessage
+                modalValidationErrorsDialogTitle: formEditor.modals.validationErrors.dialogTitle
+                modalValidationErrorsConfirmButton: formEditor.modals.validationErrors.confirmButton
+                modalInsertElementsDialogTitle: formEditor.modals.insertElements.dialogTitle
+                modalInsertPagesDialogTitle: formEditor.modals.newPages.dialogTitle
+                modalCloseDialogMessage: formEditor.modals.close.dialogMessage
+                modalCloseDialogTitle: formEditor.modals.close.dialogTitle
+                modalCloseConfirmButton: formEditor.modals.close.confirmButton
+                modalCloseCancleButton: formEditor.modals.close.cancleButton
+                modalRemoveElementDialogTitle: formEditor.modals.removeElement.dialogTitle
+                modalRemoveElementDialogMessage: formEditor.modals.removeElement.dialogMessage
+                modalRemoveElementConfirmButton: formEditor.modals.removeElement.confirmButton
+                modalRemoveElementCancleButton: formEditor.modals.removeElement.cancleButton
+                modalRemoveElementLastAvailablePageFlashMessageTitle: formEditor.modals.removeElement.lastAvailablePageFlashMessageTitle
+                modalRemoveElementLastAvailablePageFlashMessageMessage: formEditor.modals.removeElement.lastAvailablePageFlashMessageMessage
+                inspectorEditorFormElementSelectorNoElements: formEditor.inspector.editor.formelement_selector.no_elements
+                paginationTitle: formEditor.pagination.title
+                iconIdentifier: content-form
+                propertyCollections:
+                  finishers:
+                    10:
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.header.label
+                        200:
+                          identifier: subject
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.subject.label
+                          propertyPath: options.subject
+                          enableFormelementSelectionButton: true
+                          propertyValidators:
+                            10: NotEmpty
+                            20: FormElementIdentifierWithinCurlyBracesInclusive
+                        350:
+                          identifier: recipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.label
+                          propertyPath: options.recipients
+                          propertyValidators:
+                            10: NotEmpty
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.fieldExplanationText
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        500:
+                          identifier: senderAddress
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.senderAddress.label
+                          propertyPath: options.senderAddress
+                          enableFormelementSelectionButton: true
+                          propertyValidatorsMode: OR
+                          propertyValidators:
+                            10: NaiveEmail
+                            20: FormElementIdentifierWithinCurlyBracesExclusive
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.senderAddress.fieldExplanationText
+                        600:
+                          identifier: senderName
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.label
+                          propertyPath: options.senderName
+                          enableFormelementSelectionButton: true
+                          propertyValidators:
+                            10: FormElementIdentifierWithinCurlyBracesInclusive
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.fieldExplanationText
+                        750:
+                          identifier: replyToRecipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.replyToRecipients.label
+                          propertyPath: options.replyToRecipients
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        850:
+                          identifier: carbonCopyRecipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.carbonCopyRecipients.label
+                          propertyPath: options.carbonCopyRecipients
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        950:
+                          identifier: blindCarbonCopyRecipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.blindCarbonCopyRecipients.label
+                          propertyPath: options.blindCarbonCopyRecipients
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        1050:
+                          identifier: addHtmlPart
+                          templateName: Inspector-CheckboxEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.label
+                          propertyPath: options.addHtmlPart
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.fieldExplanationText
+                        1100:
+                          identifier: attachUploads
+                          templateName: Inspector-CheckboxEditor
+                          label: formEditor.elements.Form.finisher.EmailToSender.editor.attachUploads.label
+                          propertyPath: options.attachUploads
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                      identifier: EmailToSender
+                    20:
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label
+                        200:
+                          identifier: subject
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.subject.label
+                          propertyPath: options.subject
+                          enableFormelementSelectionButton: true
+                          propertyValidators:
+                            10: NotEmpty
+                            20: FormElementIdentifierWithinCurlyBracesInclusive
+                        350:
+                          identifier: recipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.label
+                          propertyPath: options.recipients
+                          propertyValidators:
+                            10: NotEmpty
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.fieldExplanationText
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        500:
+                          identifier: senderAddress
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderAddress.label
+                          propertyPath: options.senderAddress
+                          enableFormelementSelectionButton: true
+                          propertyValidatorsMode: OR
+                          propertyValidators:
+                            10: NaiveEmail
+                            20: FormElementIdentifierWithinCurlyBracesExclusive
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderAddress.fieldExplanationText
+                        600:
+                          identifier: senderName
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.label
+                          propertyPath: options.senderName
+                          enableFormelementSelectionButton: true
+                          propertyValidators:
+                            10: FormElementIdentifierWithinCurlyBracesInclusive
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.fieldExplanationText
+                        750:
+                          identifier: replyToRecipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.replyToRecipients.label
+                          propertyPath: options.replyToRecipients
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        850:
+                          identifier: carbonCopyRecipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.carbonCopyRecipients.label
+                          propertyPath: options.carbonCopyRecipients
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        950:
+                          identifier: blindCarbonCopyRecipients
+                          templateName: Inspector-PropertyGridEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.blindCarbonCopyRecipients.label
+                          propertyPath: options.blindCarbonCopyRecipients
+                          isSortable: true
+                          enableAddRow: true
+                          enableDeleteRow: true
+                          useLabelAsFallbackValue: false
+                          gridColumns:
+                            -
+                              name: value
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title
+                            -
+                              name: label
+                              title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title
+                        1050:
+                          identifier: addHtmlPart
+                          templateName: Inspector-CheckboxEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.label
+                          propertyPath: options.addHtmlPart
+                          fieldExplanationText: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.fieldExplanationText
+                        1100:
+                          identifier: attachUploads
+                          templateName: Inspector-CheckboxEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.attachUploads.label
+                          propertyPath: options.attachUploads
+                        1200:
+                          identifier: language
+                          templateName: Inspector-SingleSelectEditor
+                          label: formEditor.elements.Form.finisher.EmailToReceiver.editor.language.label
+                          propertyPath: options.translation.language
+                          selectOptions:
+                            10:
+                              value: default
+                              label: formEditor.elements.Form.finisher.EmailToReceiver.editor.language.1
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                      identifier: EmailToReceiver
+                    30:
+                      identifier: Redirect
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.Redirect.editor.header.label
+                        200:
+                          identifier: pageUid
+                          templateName: Inspector-Typo3WinBrowserEditor
+                          label: formEditor.elements.Form.finisher.Redirect.editor.pageUid.label
+                          buttonLabel: formEditor.elements.Form.finisher.Redirect.editor.pageUid.buttonLabel
+                          browsableType: pages
+                          propertyPath: options.pageUid
+                          propertyValidatorsMode: OR
+                          propertyValidators:
+                            10: Integer
+                            20: FormElementIdentifierWithinCurlyBracesExclusive
+                        300:
+                          identifier: additionalParameters
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.Form.finisher.Redirect.editor.additionalParameters.label
+                          propertyPath: options.additionalParameters
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    40:
+                      identifier: DeleteUploads
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.DeleteUploads.editor.header.label
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    50:
+                      identifier: Confirmation
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.Confirmation.editor.header.label
+                        200:
+                          identifier: contentElement
+                          templateName: Inspector-Typo3WinBrowserEditor
+                          label: formEditor.elements.Form.finisher.Confirmation.editor.contentElement.label
+                          buttonLabel: formEditor.elements.Form.finisher.Confirmation.editor.contentElement.buttonLabel
+                          browsableType: tt_content
+                          propertyPath: options.contentElementUid
+                          propertyValidatorsMode: OR
+                          propertyValidators:
+                            10: IntegerOrEmpty
+                            20: FormElementIdentifierWithinCurlyBracesExclusive
+                        300:
+                          identifier: message
+                          templateName: Inspector-TextareaEditor
+                          label: formEditor.elements.Form.finisher.Confirmation.editor.message.label
+                          propertyPath: options.message
+                          fieldExplanationText: formEditor.elements.Form.finisher.Confirmation.editor.message.fieldExplanationText
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    60:
+                      identifier: Closure
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.Closure.editor.header.label
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    70:
+                      identifier: FlashMessage
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.FlashMessage.editor.header.label
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    80:
+                      identifier: SaveToDatabase
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+              rendererClassName: TYPO3\CMS\Form\Domain\Renderer\FluidFormRenderer
+              renderingOptions:
+                translation:
+                  translationFiles:
+                    10: 'EXT:form/Resources/Private/Language/locallang.xlf'
+                templateRootPaths:
+                  10: 'EXT:form/Resources/Private/Frontend/Templates/'
+                partialRootPaths:
+                  10: 'EXT:form/Resources/Private/Frontend/Partials/'
+                layoutRootPaths:
+                  10: 'EXT:form/Resources/Private/Frontend/Layouts/'
+                addQueryString: false
+                argumentsToBeExcludedFromQueryString: {  }
+                additionalParams: {  }
+                controllerAction: perform
+                httpMethod: post
+                httpEnctype: multipart/form-data
+                _isCompositeFormElement: false
+                _isTopLevelFormElement: true
+                honeypot:
+                  enable: true
+                  formElementToUse: Honeypot
+                submitButtonLabel: Submit
+                skipUnknownElements: true
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/GridRow.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/GridRow.yaml
new file mode 100644 (file)
index 0000000..69e1a96
--- /dev/null
@@ -0,0 +1,71 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            GridRow:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.GridRow.editor.label.label
+                    propertyPath: label
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults: {  }
+                label: formEditor.elements.GridRow.label
+                group: container
+                groupSorting: 300
+                _isCompositeFormElement: true
+                _isGridRowFormElement: true
+                iconIdentifier: form-gridrow
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GridRow
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: row
+                elementErrorClassAttribute: error
+                gridColumnClassAutoConfiguration:
+                  gridSize: 12
+                  viewPorts:
+                    xs:
+                      classPattern: 'col-xs-{@numbersOfColumnsToUse}'
+                    sm:
+                      classPattern: 'col-sm-{@numbersOfColumnsToUse}'
+                    md:
+                      classPattern: 'col-md-{@numbersOfColumnsToUse}'
+                    lg:
+                      classPattern: 'col-lg-{@numbersOfColumnsToUse}'
+              renderingOptions:
+                _isCompositeFormElement: true
+                _isGridRowFormElement: true
+          formEditor:
+            formEditorPartials:
+              FormElement-GridRow: Stage/Fieldset
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Hidden.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Hidden.yaml
new file mode 100644 (file)
index 0000000..871a595
--- /dev/null
@@ -0,0 +1,67 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Hidden:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  300:
+                    identifier: defaultValue
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.Hidden.editor.defaultValue.label
+                    propertyPath: defaultValue
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  defaultValue: ''
+                label: formEditor.elements.Hidden.label
+                group: custom
+                groupSorting: 300
+                iconIdentifier: form-hidden
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+              variants:
+                -
+                  identifier: hide-1
+                  renderingOptions:
+                    enabled: false
+                  condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
+          formEditor:
+            formEditorPartials:
+              FormElement-Hidden: Stage/SimpleTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/Honeypot.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/Honeypot.yaml
new file mode 100644 (file)
index 0000000..8e68cac
--- /dev/null
@@ -0,0 +1,317 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            Honeypot:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  400:
+                    identifier: placeholder
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.placeholder.label
+                    propertyPath: properties.fluidAdditionalAttributes.placeholder
+                    doNotSetIfPropertyValueIsEmpty: true
+                  500:
+                    identifier: defaultValue
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.TextMixin.editor.defaultValue.label
+                    propertyPath: defaultValue
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.TextMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label
+                      20:
+                        value: Alphanumeric
+                        label: formEditor.elements.TextMixin.editor.validators.Alphanumeric.label
+                      30:
+                        value: Text
+                        label: formEditor.elements.TextMixin.editor.validators.Text.label
+                      40:
+                        value: StringLength
+                        label: formEditor.elements.TextMixin.editor.validators.StringLength.label
+                      50:
+                        value: EmailAddress
+                        label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label
+                      60:
+                        value: Integer
+                        label: formEditor.elements.TextMixin.editor.validators.Integer.label
+                      70:
+                        value: Float
+                        label: formEditor.elements.TextMixin.editor.validators.Float.label
+                      80:
+                        value: NumberRange
+                        label: formEditor.elements.TextMixin.editor.validators.NumberRange.label
+                      90:
+                        value: RegularExpression
+                        label: formEditor.elements.TextMixin.editor.validators.RegularExpression.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  defaultValue: ''
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: Alphanumeric
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221551320
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    20:
+                      identifier: Text
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565786
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    30:
+                      identifier: StringLength
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.minlength
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.maxlength
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1238110957
+                            20: 1269883975
+                            30: 1428504122
+                            40: 1238108068
+                            50: 1238108069
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    40:
+                      identifier: EmailAddress
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221559976
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    50:
+                      identifier: Integer
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560494
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    60:
+                      identifier: Float
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.header.label
+                        200:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221560288
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    70:
+                      identifier: NumberRange
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.min
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                          additionalElementPropertyPaths:
+                            10: properties.fluidAdditionalAttributes.max
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221563685
+                            20: 1221561046
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                    80:
+                      identifier: RegularExpression
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label
+                        200:
+                          identifier: regex
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.fieldExplanationText
+                          propertyPath: options.regularExpression
+                          propertyValidators:
+                            10: NotEmpty
+                        300:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1221565130
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+                renderAsHiddenField: false
+                styleAttribute: 'position:absolute; margin:0 0 0 -999em;'
+              variants:
+                -
+                  identifier: hide-1
+                  renderingOptions:
+                    enabled: false
+                  condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]'
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/ImageUpload.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/ImageUpload.yaml
new file mode 100644 (file)
index 0000000..b5c7ac0
--- /dev/null
@@ -0,0 +1,154 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            ImageUpload:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  300:
+                    identifier: allowedMimeTypes
+                    templateName: Inspector-MultiSelectEditor
+                    label: formEditor.elements.ImageUpload.editor.allowedMimeTypes.label
+                    propertyPath: properties.allowedMimeTypes
+                    selectOptions:
+                      10:
+                        value: image/jpeg
+                        label: formEditor.elements.ImageUpload.editor.allowedMimeTypes.jpg
+                      20:
+                        value: image/png
+                        label: formEditor.elements.ImageUpload.editor.allowedMimeTypes.png
+                      30:
+                        value: image/bmp
+                        label: formEditor.elements.ImageUpload.editor.allowedMimeTypes.bmp
+                  400:
+                    identifier: saveToFileMount
+                    templateName: Inspector-SingleSelectEditor
+                    label: formEditor.elements.FileUploadMixin.editor.saveToFileMount.label
+                    propertyPath: properties.saveToFileMount
+                    selectOptions:
+                      10:
+                        value: '1:/user_upload/'
+                        label: '1:/user_upload/'
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.FileUploadMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.FileUploadMixin.editor.validators.EmptyValue.label
+                      20:
+                        value: FileSize
+                        label: formEditor.elements.FileUploadMixin.editor.validators.FileSize.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  properties:
+                    saveToFileMount: '1:/user_upload/'
+                    allowedMimeTypes:
+                      - image/jpeg
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: FileSize
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label
+                        150:
+                          identifier: maximumFileSize
+                          templateName: Inspector-MaximumFileSizeEditor
+                          label: formEditor.elements.FileUpload.editor.maximumFileSize.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: FileSize
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: FileSize
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                label: formEditor.elements.ImageUpload.label
+                group: custom
+                groupSorting: 400
+                iconIdentifier: form-image-upload
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload
+              properties:
+                containerClassAttribute: input
+                elementClassAttribute: lightbox
+                elementErrorClassAttribute: error
+                saveToFileMount: '1:/user_upload/'
+                allowedMimeTypes:
+                  - image/jpeg
+                  - image/png
+                  - image/bmp
+                imageLinkMaxWidth: 500
+                imageMaxWidth: 500
+                imageMaxHeight: 500
+          formEditor:
+            formEditorPartials:
+              FormElement-ImageUpload: Stage/FileUploadTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/MultiCheckbox.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/MultiCheckbox.yaml
new file mode 100644 (file)
index 0000000..e0be60b
--- /dev/null
@@ -0,0 +1,137 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            MultiCheckbox:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  300:
+                    identifier: options
+                    templateName: Inspector-PropertyGridEditor
+                    label: formEditor.elements.SelectionMixin.editor.options.label
+                    propertyPath: properties.options
+                    propertyValidators:
+                      10: NotEmpty
+                    isSortable: true
+                    enableAddRow: true
+                    enableDeleteRow: true
+                    removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle
+                    removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage
+                    shouldShowPreselectedValueColumn: multiple
+                    multiSelection: true
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor
+                    label: formEditor.elements.MultiSelectionMixin.editor.validators.label
+                    selectOptions:
+                      10:
+                        value: ''
+                        label: formEditor.elements.MultiSelectionMixin.editor.validators.EmptyValue.label
+                      20:
+                        value: Count
+                        label: formEditor.elements.MultiSelectionMixin.editor.validators.Count.label
+                  9999:
+                    identifier: removeButton
+                    templateName: Inspector-RemoveElementEditor
+                predefinedDefaults:
+                  properties:
+                    options: {  }
+                propertyCollections:
+                  validators:
+                    10:
+                      identifier: Count
+                      editors:
+                        100:
+                          identifier: header
+                          templateName: Inspector-CollectionElementHeaderEditor
+                          label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label
+                        200:
+                          identifier: minimum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label
+                          propertyPath: options.minimum
+                          propertyValidators:
+                            10: Integer
+                        300:
+                          identifier: maximum
+                          templateName: Inspector-TextEditor
+                          label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label
+                          propertyPath: options.maximum
+                          propertyValidators:
+                            10: Integer
+                        400:
+                          identifier: validationErrorMessage
+                          templateName: Inspector-ValidationErrorMessageEditor
+                          label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.validationErrorMessage.label
+                          fieldExplanationText: formEditor.elements.MultiSelectionMixin.validators.Count.editor.validationErrorMessage.fieldExplanationText
+                          errorCodes:
+                            10: 1475002976
+                            20: 1475002994
+                          propertyPath: properties.validationErrorMessages
+                        9999:
+                          identifier: removeButton
+                          templateName: Inspector-RemoveElementEditor
+                label: formEditor.elements.MultiCheckbox.label
+                group: select
+                groupSorting: 400
+                iconIdentifier: form-multi-checkbox
+              implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement
+              properties:
+                containerClassAttribute: 'input checkbox'
+                elementClassAttribute: ''
+                elementErrorClassAttribute: error
+          formEditor:
+            formEditorPartials:
+              FormElement-MultiCheckbox: Stage/SelectTemplate
diff --git a/typo3/sysext/form/Configuration/Yaml/FormElements/MultiSelect.yaml b/typo3/sysext/form/Configuration/Yaml/FormElements/MultiSelect.yaml
new file mode 100644 (file)
index 0000000..d36f7f9
--- /dev/null
@@ -0,0 +1,146 @@
+TYPO3:
+  CMS:
+    Form:
+      prototypes:
+        standard:
+          formElementsDefinition:
+            MultiSelect:
+              formEditor:
+                editors:
+                  100:
+                    identifier: header
+                    templateName: Inspector-FormElementHeaderEditor
+                  200:
+                    identifier: label
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.label.label
+                    propertyPath: label
+                  230:
+                    identifier: elementDescription
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.FormElement.editor.elementDescription.label
+                    propertyPath: properties.elementDescription
+                  250:
+                    identifier: inactiveOption
+                    templateName: Inspector-TextEditor
+                    label: formEditor.elements.SelectionMixin.editor.inactiveOption.label
+                    propertyPath: properties.prependOptionLabel
+                    fieldExplanationText: formEditor.elements.SelectionMixin.editor.inactiveOption.fieldExplanationText
+                    doNotSetIfPropertyValueIsEmpty: true
+                  300:
+                    identifier: options
+                    templateName: Inspector-PropertyGridEditor
+                    label: formEditor.elements.SelectionMixin.editor.options.label
+                    propertyPath: properties.options
+                    propertyValidators:
+                      10: NotEmpty
+                    isSortable: true
+                    enableAddRow: true
+                    enableDeleteRow: true
+                    removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle
+                    removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage
+                    shouldShowPreselectedValueColumn: multiple
+                    multiSelection: true
+                  700:
+                    identifier: gridColumnViewPortConfiguration
+                    templateName: Inspector-GridColumnViewPortConfigurationEditor
+                    label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.label
+                    configurationOptions:
+                      viewPorts:
+                        10:
+                          viewPortIdentifier: xs
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xs.label
+                        20:
+                          viewPortIdentifier: sm
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.sm.label
+                        30:
+                          viewPortIdentifier: md
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.md.label
+                        40:
+                          viewPortIdentifier: lg
+                          label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.lg.label
+                      numbersOfColumnsToUse:
+                        label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label
+                        propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse'
+                        fieldExplanationText: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.fieldExplanationText
+                  800:
+                    identifier: requiredValidator
+                    templateName: Inspector-RequiredValidatorEditor
+                    label: formEditor.elements.FormElement.editor.requiredValidator.label
+                    validatorIdentifier: NotEmpty
+                    propertyPath: properties.fluidAdditionalAttributes.required
+                    propertyValue: required
+                    configurationOptions:
+                      validationErrorMessage:
+                        label: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.label
+                        propertyPath: properties.validationErrorMessages
+                        fieldExplanationText: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.fieldExplanationText
+                        errorCodes:
+                          10: 1221560910
+                          20: 1221560718
+                          30: 1347992400
+                          40: 1347992453
+                  900:
+                    identifier: validators
+                    templateName: Inspector-ValidatorsEditor