From aad9daaefd25a66c98ffec20518e7084c39872a2 Mon Sep 17 00:00:00 2001 From: Sven Wappler Date: Mon, 10 Aug 2026 22:31:24 +0200 Subject: [PATCH] TYPO3 v15 dev-main snapshot () --- .gitignore | 1 + Classes/Command/CleanupFormUploadsCommand.php | 197 ++ .../Command/TransferFormDefinitionCommand.php | 285 +++ .../FormYamlProvider.php | 69 + Classes/Controller/FormEditorController.php | 666 +++++++ Classes/Controller/FormFrontendController.php | 156 ++ Classes/Controller/FormManagerController.php | 569 ++++++ .../FormYamlCollectorConfigurator.php | 129 ++ .../Domain/Condition/ConditionProvider.php | 37 + .../FormConditionFunctionsProvider.php | 70 + .../ArrayProcessing/ArrayProcessing.php | 64 + .../ArrayProcessing/ArrayProcessor.php | 93 + .../Configuration/ConfigurationService.php | 676 +++++++ .../Exception/ArrayProcessorException.php | 25 + .../Exception/PropertyException.php | 25 + .../Exception/PrototypeNotFoundException.php | 25 + .../Processors/AbstractProcessor.php | 34 + .../Processors/FinisherOptionGenerator.php | 98 + .../Processors/ProcessorDto.php | 83 + .../Processors/ProcessorInterface.php | 33 + .../Converters/AbstractConverter.php | 40 + .../Converters/AddHmacDataConverter.php | 94 + ...HmacDataToFormElementPropertyConverter.php | 51 + ...taToPropertyCollectionElementConverter.php | 65 + .../Converters/ConverterDto.php | 125 ++ .../Converters/ConverterInterface.php | 31 + ...isherOptionsFlexFormOverridesConverter.php | 117 ++ .../FinisherTranslationLanguageConverter.php | 54 + .../FlexFormFinisherOverridesConverterDto.php | 83 + .../Converters/RemoveHmacDataConverter.php | 43 + .../Validators/AbstractValidator.php | 72 + .../Validators/CollectionBasedValidator.php | 82 + ...reatableFormElementPropertiesValidator.php | 170 ++ ...tyCollectionElementPropertiesValidator.php | 165 ++ .../Validators/ElementBasedValidator.php | 68 + .../FormElementHmacDataValidator.php | 40 + ...ertyCollectionElementHmacDataValidator.php | 42 + .../Validators/ValidationDto.php | 159 ++ .../Validators/ValidatorInterface.php | 31 + .../FormDefinitionConversionService.php | 524 +++++ .../FormDefinitionValidationService.php | 352 ++++ .../Extractors/AbstractExtractor.php | 34 + ...dditionalElementPropertyPathsExtractor.php | 36 + .../Extractors/ExtractorDto.php | 55 + .../Extractors/ExtractorInterface.php | 31 + .../IsCreatableFormElementExtractor.php | 61 + .../MultiValuePropertiesExtractor.php | 89 + .../PredefinedDefaultsExtractor.php | 38 + .../FormElement/PropertyPathsExtractor.php | 90 + .../FormElement/SelectOptionsExtractor.php | 95 + ...ablePropertyCollectionElementExtractor.php | 103 + .../MultiValuePropertiesExtractor.php | 90 + .../PredefinedDefaultsExtractor.php | 39 + .../PropertyPathsExtractor.php | 53 + .../SelectOptionsExtractor.php | 77 + .../PersistenceConfigurationService.php | 155 ++ Classes/Domain/DTO/FormData.php | 66 + Classes/Domain/DTO/FormMetadata.php | 208 ++ .../DTO/PersistenceManagerConfiguration.php | 81 + Classes/Domain/DTO/SearchCriteria.php | 152 ++ Classes/Domain/DTO/StorageContext.php | 36 + Classes/Domain/Exception.php | 25 + .../Exception/IdentifierNotValidException.php | 30 + .../Domain/Exception/RenderingException.php | 29 + .../TypeDefinitionNotFoundException.php | 30 + .../TypeDefinitionNotValidException.php | 30 + .../UnknownCompositRenderableException.php | 30 + .../Domain/Factory/AbstractFormFactory.php | 79 + Classes/Domain/Factory/ArrayFormFactory.php | 148 ++ .../Domain/Factory/FormFactoryInterface.php | 55 + Classes/Domain/Finishers/AbstractFinisher.php | 400 ++++ Classes/Domain/Finishers/ClosureFinisher.php | 67 + .../Domain/Finishers/ConfirmationFinisher.php | 127 ++ .../Finishers/DeleteUploadsFinisher.php | 109 ++ Classes/Domain/Finishers/EmailFinisher.php | 268 +++ .../Finishers/Exception/FinisherException.php | 25 + Classes/Domain/Finishers/FinisherContext.php | 109 ++ .../Domain/Finishers/FinisherInterface.php | 59 + .../Finishers/FinisherVariableProvider.php | 187 ++ .../Domain/Finishers/FlashMessageFinisher.php | 128 ++ Classes/Domain/Finishers/RedirectFinisher.php | 110 ++ .../Finishers/SaveToDatabaseFinisher.php | 407 ++++ Classes/Domain/Model/Exception.php | 25 + .../DuplicateFormElementException.php | 26 + .../FinisherPresetNotFoundException.php | 26 + .../FormDefinitionConsistencyException.php | 26 + .../ValidatorPresetNotFoundException.php | 26 + Classes/Domain/Model/FormDefinition.php | 698 +++++++ .../FormElements/AbstractFormElement.php | 166 ++ .../Model/FormElements/AbstractSection.php | 182 ++ Classes/Domain/Model/FormElements/Date.php | 56 + .../Domain/Model/FormElements/FileUpload.php | 107 + .../FormElements/FormElementInterface.php | 117 ++ .../Model/FormElements/GenericFormElement.php | 29 + .../Domain/Model/FormElements/GridColumn.php | 30 + .../FormElements/GridColumnInterface.php | 23 + Classes/Domain/Model/FormElements/GridRow.php | 30 + .../Model/FormElements/GridRowInterface.php | 23 + Classes/Domain/Model/FormElements/Page.php | 69 + Classes/Domain/Model/FormElements/Section.php | 134 ++ .../StringableFormElementInterface.php | 32 + .../Model/FormElements/UnknownFormElement.php | 118 ++ .../AbstractCompositeRenderable.php | 209 ++ .../Model/Renderable/AbstractRenderable.php | 448 +++++ .../CompositeRenderableInterface.php | 40 + .../Model/Renderable/RenderableInterface.php | 90 + .../Model/Renderable/RenderableVariant.php | 106 + .../Renderable/RenderableVariantInterface.php | 40 + .../Renderable/RootRenderableInterface.php | 63 + .../VariableRenderableInterface.php | 50 + .../Renderer/AbstractElementRenderer.php | 45 + Classes/Domain/Renderer/FluidFormRenderer.php | 182 ++ Classes/Domain/Renderer/RendererInterface.php | 46 + .../Repository/FormDefinitionRepository.php | 291 +++ .../Exception/PropertyMappingException.php | 27 + Classes/Domain/Runtime/FormRuntime.php | 1114 +++++++++++ .../Runtime/FormRuntime/FormSession.php | 88 + Classes/Domain/Runtime/FormState.php | 102 + .../FormTranslationKeychainBuilder.php | 272 +++ Classes/Domain/ValueObject/FormIdentifier.php | 54 + .../EmailOrFormElementIdentifier.php | 43 + Classes/Event/AbstractFormEvent.php | 38 + .../Event/AfterCurrentPageIsResolvedEvent.php | 35 + ...ionValidationConfigurationIsBuiltEvent.php | 48 + Classes/Event/AfterFormIsBuiltEvent.php | 30 + .../Event/AfterFormStateInitializedEvent.php | 33 + .../BeforeEmailFinisherInitializedEvent.php | 56 + Classes/Event/BeforeFormIsCreatedEvent.php | 24 + Classes/Event/BeforeFormIsDeletedEvent.php | 41 + Classes/Event/BeforeFormIsDuplicatedEvent.php | 24 + Classes/Event/BeforeFormIsSavedEvent.php | 24 + .../BeforeRenderableIsAddedToFormEvent.php | 30 + ...BeforeRenderableIsRemovedFromFormEvent.php | 40 + .../Event/BeforeRenderableIsRenderedEvent.php | 32 + .../BeforeRenderableIsValidatedEvent.php | 35 + .../DataStructureIdentifierListener.php | 352 ++++ .../FormatDateRenderableBeforeRendering.php | 93 + ...rmDefinitionRecordActionsEventListener.php | 93 + ...rmDefinitionRecordListRowEventListener.php | 68 + .../ProcessFileListActionsEventListener.php | 48 + .../TranslateDefaultValueBeforeRendering.php | 65 + .../ValidateAdvancedPasswordRenderable.php | 56 + Classes/Exception.php | 25 + .../Hooks/FormDefinitionDataHandlerHook.php | 127 ++ Classes/Hooks/FormFileProvider.php | 89 + Classes/Hooks/ImportExportHook.php | 39 + .../Configuration/ConfigurationManager.php | 140 ++ .../ConfigurationManagerInterface.php | 29 + Classes/Mvc/Configuration/Exception.php | 27 + .../Exception/FileWriteException.php | 24 + .../Exception/NoSuchFileException.php | 24 + .../Exception/ParseErrorException.php | 24 + .../Mvc/Configuration/FormYamlCollector.php | 69 + .../Configuration/FormYamlConfiguration.php | 47 + .../Mvc/Configuration/TypoScriptService.php | 84 + Classes/Mvc/Configuration/YamlSource.php | 196 ++ .../Event/AfterFormDefinitionLoadedEvent.php | 50 + Classes/Mvc/Persistence/Exception.php | 27 + .../Exception/NoUniqueIdentifierException.php | 25 + ...NoUniquePersistenceIdentifierException.php | 25 + .../Exception/PersistenceManagerException.php | 27 + .../Persistence/FormPersistenceManager.php | 404 ++++ .../FormPersistenceManagerInterface.php | 100 + Classes/Mvc/ProcessingRule.php | 200 ++ .../Exception/TypeConverterException.php | 43 + .../Property/PropertyMappingConfiguration.php | 143 ++ .../FormDefinitionArrayConverter.php | 203 ++ .../Mvc/Property/TypeConverter/PseudoFile.php | 106 + .../TypeConverter/PseudoFileReference.php | 86 + .../UploadedFileReferenceConverter.php | 637 ++++++ Classes/Mvc/Validation/CountValidator.php | 73 + Classes/Mvc/Validation/DateRangeValidator.php | 165 ++ Classes/Mvc/Validation/EmptyValidator.php | 52 + .../InvalidValidationOptionsException.php | 22 + Classes/Mvc/Validation/FileSizeValidator.php | 112 ++ Classes/Mvc/Validation/MimeTypeValidator.php | 115 ++ ...ObjectStorageElementValidatorInterface.php | 32 + Classes/Preview/FormPagePreviewRenderer.php | 163 ++ Classes/Security/HashScope.php | 38 + Classes/Service/CleanupFormUploadsService.php | 162 ++ Classes/Service/DatabaseService.php | 219 +++ .../Service/FormEditorEnrichmentService.php | 137 ++ Classes/Service/FormTransferResult.php | 40 + Classes/Service/FormTransferService.php | 330 ++++ .../Service/RichTextConfigurationService.php | 327 ++++ Classes/Service/TranslationService.php | 583 ++++++ Classes/Slot/FilePersistenceSlot.php | 187 ++ .../FormDefinitionPersistenceException.php | 24 + Classes/Slot/ResourcePublicationSlot.php | 92 + ...rsistenceIdentifierSoftReferenceParser.php | 116 ++ .../Storage/AbstractFileStorageAdapter.php | 173 ++ Classes/Storage/DatabaseStorageAdapter.php | 352 ++++ Classes/Storage/ExtensionStorageAdapter.php | 354 ++++ .../Storage/JsonObjectKeyOrderPreserver.php | 110 ++ .../Permission/DatabasePermissionChecker.php | 152 ++ .../FormDefinitionPersistenceCommand.php | 31 + .../FormDefinitionPersistenceGuard.php | 146 ++ Classes/Storage/StorageAdapterFactory.php | 151 ++ Classes/Storage/StorageAdapterInterface.php | 186 ++ Classes/Type/FormDefinitionArray.php | 24 + .../FileFormsToDatabaseUpgradeWizard.php | 559 ++++++ .../Utility/DateRangeValidatorPatterns.php | 66 + .../Be/MaximumFileSizeViewHelper.php | 41 + .../RenderContentElementPreviewViewHelper.php | 145 ++ .../Form/UploadDeleteCheckboxViewHelper.php | 117 ++ .../Form/UploadedResourceViewHelper.php | 162 ++ Classes/ViewHelpers/FormViewHelper.php | 92 + ...ColumnClassAutoConfigurationViewHelper.php | 110 ++ .../RenderAllFormValuesViewHelper.php | 74 + .../ViewHelpers/RenderFormValueViewHelper.php | 207 ++ .../RenderRenderableViewHelper.php | 84 + Classes/ViewHelpers/RenderViewHelper.php | 104 + .../TranslateElementErrorViewHelper.php | 61 + .../TranslateElementPropertyViewHelper.php | 93 + Configuration/Backend/Modules.php | 46 + Configuration/ExpressionLanguage.php | 8 + Configuration/Extbase/Persistence/Classes.php | 9 + Configuration/FlexForms/FormFramework.xml | 27 + Configuration/Fluid/Namespaces.php | 7 + .../Form/Base/Finishers/Closure.yaml | 12 + .../Form/Base/Finishers/Confirmation.yaml | 46 + .../Form/Base/Finishers/DeleteUploads.yaml | 8 + .../Form/Base/Finishers/EmailToReceiver.yaml | 161 ++ .../Form/Base/Finishers/EmailToSender.yaml | 161 ++ .../Form/Base/Finishers/FlashMessage.yaml | 16 + .../Form/Base/Finishers/Redirect.yaml | 36 + .../Form/Base/Finishers/SaveToDatabase.yaml | 11 + .../Base/FormElements/AdvancedPassword.yaml | 342 ++++ .../Form/Base/FormElements/Checkbox.yaml | 109 ++ .../Base/FormElements/ContentElement.yaml | 76 + .../Form/Base/FormElements/CountrySelect.yaml | 134 ++ .../Form/Base/FormElements/Date.yaml | 351 ++++ .../Form/Base/FormElements/Email.yaml | 324 ++++ .../Form/Base/FormElements/Fieldset.yaml | 64 + .../Form/Base/FormElements/FileUpload.yaml | 220 +++ .../Form/Base/FormElements/Form.yaml | 520 +++++ .../Form/Base/FormElements/GridColumn.yaml | 59 + .../Form/Base/FormElements/GridRow.yaml | 80 + .../Form/Base/FormElements/Hidden.yaml | 86 + .../Form/Base/FormElements/Honeypot.yaml | 328 ++++ .../Form/Base/FormElements/ImageUpload.yaml | 211 ++ .../Form/Base/FormElements/MultiCheckbox.yaml | 169 ++ .../Form/Base/FormElements/MultiSelect.yaml | 174 ++ .../Form/Base/FormElements/Number.yaml | 346 ++++ .../Form/Base/FormElements/Page.yaml | 44 + .../Form/Base/FormElements/Password.yaml | 337 ++++ .../Form/Base/FormElements/RadioButton.yaml | 134 ++ .../Form/Base/FormElements/SingleSelect.yaml | 137 ++ .../Form/Base/FormElements/StaticText.yaml | 75 + .../Form/Base/FormElements/SummaryPage.yaml | 48 + .../Form/Base/FormElements/Telephone.yaml | 336 ++++ .../Form/Base/FormElements/Text.yaml | 391 ++++ .../Form/Base/FormElements/Textarea.yaml | 331 ++++ Configuration/Form/Base/FormElements/Url.yaml | 324 ++++ .../Form/Base/Validators/Alphanumeric.yaml | 8 + Configuration/Form/Base/Validators/Count.yaml | 17 + .../Form/Base/Validators/DateRange.yaml | 18 + .../Form/Base/Validators/DateTime.yaml | 8 + .../Form/Base/Validators/EmailAddress.yaml | 8 + .../Form/Base/Validators/FileSize.yaml | 17 + Configuration/Form/Base/Validators/Float.yaml | 8 + .../Form/Base/Validators/Integer.yaml | 8 + .../Form/Base/Validators/NotEmpty.yaml | 8 + .../Form/Base/Validators/Number.yaml | 8 + .../Form/Base/Validators/NumberRange.yaml | 17 + .../Base/Validators/RegularExpression.yaml | 14 + .../Form/Base/Validators/StringLength.yaml | 17 + Configuration/Form/Base/Validators/Text.yaml | 8 + Configuration/Form/Base/config.yaml | 177 ++ Configuration/JavaScriptModules.php | 11 + Configuration/RTE/FormContent.yaml | 23 + Configuration/RTE/FormLabel.yaml | 20 + Configuration/RTE/ProcessingContent.yaml | 40 + Configuration/RTE/ProcessingLabel.yaml | 37 + Configuration/Services.php | 30 + Configuration/Services.yaml | 40 + Configuration/Sets/Form/config.yaml | 2 + Configuration/Sets/Form/labels.xlf | 44 + .../Sets/Form/settings.definitions.yaml | 24 + Configuration/Sets/Form/setup.typoscript | 1 + Configuration/TCA/Overrides/sys_template.php | 11 + Configuration/TCA/Overrides/tt_content.php | 18 + Configuration/TCA/form_definition.php | 58 + Configuration/TypoScript/setup.typoscript | 28 + Configuration/page.tsconfig | 4 + Documentation/D/Events/Index.rst | 171 ++ .../_codesnippets/_MyFormEventListener.php | 20 + .../D/FormEditor/FormElementModel/Index.rst | 182 ++ .../FormElementModel/_codesnippets/_clone.js | 5 + .../_codesnippets/_get-property-collection.js | 10 + .../_codesnippets/_get-simple.js | 6 + .../_codesnippets/_model-structure.js | 19 + .../FormElementModel/_codesnippets/_off.js | 5 + .../FormElementModel/_codesnippets/_on.js | 9 + .../FormElementModel/_codesnippets/_set.js | 5 + .../_codesnippets/_to-string.js | 5 + .../FormElementModel/_codesnippets/_unset.js | 5 + Documentation/D/FormEditor/Index.rst | 97 + .../D/FormEditor/JavaScriptEvents/Index.rst | 1717 +++++++++++++++++ .../_codesnippets/_inspector-editor-insert.js | 22 + .../_inspector-editor-insert.yaml | 18 + .../_codesnippets/_publish.js | 3 + .../_codesnippets/_some-property-changed.js | 11 + .../_stage-template-perform.html | 4 + .../_codesnippets/_stage-template-perform.js | 24 + .../_stage-template-perform.yaml | 11 + .../_codesnippets/_subscribe.js | 11 + .../_codesnippets/_view-ready.js | 5 + .../D/FormEditor/StageTemplates/Index.rst | 137 ++ .../_codesnippets/_file-upload-partial.html | 2 + .../_select-template-partial.html | 2 + .../_codesnippets/_select-template.yaml | 7 + .../_codesnippets/_JavaScriptModules.php | 9 + .../D/FormEditor/_codesnippets/_bootstrap.js | 10 + .../_codesnippets/_prototype-setup.yaml | 6 + Documentation/D/FrontendRendering/Index.rst | 320 +++ .../FrontendRendering/_CustomFormFactory.php | 78 + .../D/FrontendRendering/_layoutRootPaths.yaml | 8 + .../FrontendRendering/_partialRootPaths.yaml | 8 + .../_renderFactoryClass.html | 3 + .../_renderPersistenceIdentifier.html | 3 + .../D/FrontendRendering/_templateName.yaml | 6 + .../FrontendRendering/_templateRootPaths.yaml | 8 + Documentation/D/Index.rst | 20 + Documentation/E/Accessibility/Index.rst | 46 + .../Images/form_finishers_overview.png | Bin 0 -> 69885 bytes Documentation/E/Finishers/Index.rst | 36 + .../form_elements_advancedPassword_1.png | Bin 0 -> 2089 bytes .../form_elements_advancedPassword_2.png | Bin 0 -> 6023 bytes .../FormElements/Images/form_elements_all.png | Bin 0 -> 23832 bytes .../Images/form_elements_checkbox_1.png | Bin 0 -> 766 bytes .../Images/form_elements_checkbox_2.png | Bin 0 -> 2677 bytes .../Images/form_elements_contentElement_1.png | Bin 0 -> 7155 bytes .../Images/form_elements_contentElement_2.png | Bin 0 -> 2021 bytes .../Images/form_elements_datePicker_1.png | Bin 0 -> 1667 bytes .../Images/form_elements_datePicker_2.png | Bin 0 -> 7851 bytes .../Images/form_elements_date_1.png | Bin 0 -> 946 bytes .../Images/form_elements_date_2.png | Bin 0 -> 6970 bytes .../Images/form_elements_email_1.png | Bin 0 -> 1014 bytes .../Images/form_elements_email_2.png | Bin 0 -> 4611 bytes .../Images/form_elements_fieldset_1.png | Bin 0 -> 2590 bytes .../Images/form_elements_fieldset_2.png | Bin 0 -> 1880 bytes .../Images/form_elements_fieldset_3.png | Bin 0 -> 1369 bytes .../Images/form_elements_fileUpload_1.png | Bin 0 -> 2301 bytes .../Images/form_elements_fileUpload_2.png | Bin 0 -> 7902 bytes .../Images/form_elements_grid_1.png | Bin 0 -> 1314 bytes .../Images/form_elements_grid_2.png | Bin 0 -> 1743 bytes .../Images/form_elements_grid_3.png | Bin 0 -> 2365 bytes .../Images/form_elements_grid_4.png | Bin 0 -> 8928 bytes .../Images/form_elements_hidden_1.png | Bin 0 -> 1972 bytes .../Images/form_elements_hidden_2.png | Bin 0 -> 1797 bytes .../Images/form_elements_imageUpload_1.png | Bin 0 -> 2466 bytes .../Images/form_elements_imageUpload_2.png | Bin 0 -> 7471 bytes .../Images/form_elements_multiCheckbox_1.png | Bin 0 -> 1937 bytes .../Images/form_elements_multiCheckbox_2.png | Bin 0 -> 6480 bytes .../Images/form_elements_multiSelect_1.png | Bin 0 -> 1655 bytes .../Images/form_elements_multiSelect_2.png | Bin 0 -> 8133 bytes .../Images/form_elements_number_1.png | Bin 0 -> 765 bytes .../Images/form_elements_number_2.png | Bin 0 -> 5387 bytes .../Images/form_elements_password_1.png | Bin 0 -> 902 bytes .../Images/form_elements_password_2.png | Bin 0 -> 4675 bytes .../Images/form_elements_radioBtn_1.png | Bin 0 -> 1626 bytes .../Images/form_elements_radioBtn_2.png | Bin 0 -> 5435 bytes .../Images/form_elements_singleSelect_1.png | Bin 0 -> 1666 bytes .../Images/form_elements_singleSelect_2.png | Bin 0 -> 7356 bytes .../Images/form_elements_staticText_1.png | Bin 0 -> 2921 bytes .../Images/form_elements_staticText_2.png | Bin 0 -> 3189 bytes .../Images/form_elements_telephone_1.png | Bin 0 -> 1128 bytes .../Images/form_elements_telephone_2.png | Bin 0 -> 5062 bytes .../Images/form_elements_text_1.png | Bin 0 -> 567 bytes .../Images/form_elements_text_2.png | Bin 0 -> 4245 bytes .../Images/form_elements_textarea_1.png | Bin 0 -> 959 bytes .../Images/form_elements_textarea_2.png | Bin 0 -> 4566 bytes .../Images/form_elements_url_1.png | Bin 0 -> 520 bytes .../Images/form_elements_url_2.png | Bin 0 -> 4197 bytes Documentation/E/FormElements/Index.rst | 651 +++++++ Documentation/E/Index.rst | 61 + .../BasicForm/Images/10_chosenFormInCE.png | Bin 0 -> 69436 bytes .../BasicForm/Images/10_elementWizard.png | Bin 0 -> 60602 bytes .../BasicForm/Images/11_finishedForm.png | Bin 0 -> 33781 bytes .../Tutorials/BasicForm/Images/1_newForm.png | Bin 0 -> 20130 bytes .../BasicForm/Images/2_newForm_wizard1.png | Bin 0 -> 25453 bytes .../BasicForm/Images/2_newForm_wizard2.png | Bin 0 -> 25161 bytes .../BasicForm/Images/3_createElement_1.png | Bin 0 -> 32977 bytes .../BasicForm/Images/3_createElement_2.png | Bin 0 -> 43233 bytes .../BasicForm/Images/3_createElement_3.png | Bin 0 -> 92086 bytes .../BasicForm/Images/3_newForm_wizard3.png | Bin 0 -> 31883 bytes .../Tutorials/BasicForm/Images/4_lastName.png | Bin 0 -> 77163 bytes .../E/Tutorials/BasicForm/Images/5_email.png | Bin 0 -> 77139 bytes .../BasicForm/Images/6_textarea_1.png | Bin 0 -> 87545 bytes .../BasicForm/Images/6_textarea_2.png | Bin 0 -> 80251 bytes .../BasicForm/Images/7_addFinisherEmail_1.png | Bin 0 -> 73809 bytes .../BasicForm/Images/7_addFinisherEmail_2.png | Bin 0 -> 89549 bytes .../BasicForm/Images/7_addFinisherEmail_3.png | Bin 0 -> 17772 bytes .../BasicForm/Images/7_addFinisherEmail_4.png | Bin 0 -> 76547 bytes .../Tutorials/BasicForm/Images/85_preview.png | Bin 0 -> 67683 bytes .../Images/8_addFinisherConfirmation_1.png | Bin 0 -> 79943 bytes .../Images/8_addFinisherConfirmation_2.png | Bin 0 -> 83017 bytes .../BasicForm/Images/9_selectPageForForm.png | Bin 0 -> 66064 bytes Documentation/E/Tutorials/BasicForm/Index.rst | 219 +++ Documentation/E/Tutorials/Index.rst | 13 + .../PhotoContest/Images/10_saveTheForm.png | Bin 0 -> 79277 bytes .../PhotoContest/Images/11_selectPage.png | Bin 0 -> 61818 bytes .../PhotoContest/Images/12_chooseForm.png | Bin 0 -> 60412 bytes .../Images/13_chooseFormDefinition.png | Bin 0 -> 67407 bytes .../PhotoContest/Images/14_frontend_1.png | Bin 0 -> 44597 bytes .../PhotoContest/Images/14_frontend_2.png | Bin 0 -> 307786 bytes .../PhotoContest/Images/15_addEmail.png | Bin 0 -> 116319 bytes .../PhotoContest/Images/16_addRedirect_1.png | Bin 0 -> 88045 bytes .../PhotoContest/Images/16_addRedirect_2.png | Bin 0 -> 60912 bytes .../PhotoContest/Images/17_thankYouPage.png | Bin 0 -> 14563 bytes .../PhotoContest/Images/1_createForm.png | Bin 0 -> 36817 bytes .../PhotoContest/Images/2_wizard_1.png | Bin 0 -> 46044 bytes .../PhotoContest/Images/2_wizard_2.png | Bin 0 -> 43802 bytes .../PhotoContest/Images/3_createElement_1.png | Bin 0 -> 50852 bytes .../PhotoContest/Images/3_createElement_2.png | Bin 0 -> 64991 bytes .../Images/4_createImageUpload_1.png | Bin 0 -> 77610 bytes .../Images/4_createImageUpload_2.png | Bin 0 -> 82150 bytes .../Images/5_createStaticText_1.png | Bin 0 -> 93066 bytes .../Images/5_createStaticText_2.png | Bin 0 -> 78943 bytes .../Images/6_setOptionsForStep.png | Bin 0 -> 90203 bytes .../PhotoContest/Images/7_createSummary_1.png | Bin 0 -> 83118 bytes .../PhotoContest/Images/7_createSummary_2.png | Bin 0 -> 81354 bytes .../PhotoContest/Images/7_createSummary_3.png | Bin 0 -> 61819 bytes .../PhotoContest/Images/8_preview.png | Bin 0 -> 59130 bytes .../PhotoContest/Images/9_missingEmail_1.png | Bin 0 -> 82196 bytes .../PhotoContest/Images/9_missingEmail_2.png | Bin 0 -> 82606 bytes .../PhotoContest/Images/9_missingEmail_3.png | Bin 0 -> 79954 bytes .../PhotoContest/Images/9_missingEmail_4.png | Bin 0 -> 82403 bytes .../E/Tutorials/PhotoContest/Index.rst | 255 +++ .../E/Validators/Images/form_validators.png | Bin 0 -> 1233 bytes .../Images/form_validators_alphanumeric.png | Bin 0 -> 3288 bytes .../Images/form_validators_dateRange.png | Bin 0 -> 5597 bytes .../Images/form_validators_dateTime.png | Bin 0 -> 3134 bytes .../Images/form_validators_email.png | Bin 0 -> 2958 bytes .../Images/form_validators_fileSize.png | Bin 0 -> 1903 bytes .../form_validators_floatingPointNumber.png | Bin 0 -> 3509 bytes .../Images/form_validators_integerNumber.png | Bin 0 -> 3245 bytes .../Images/form_validators_number.png | Bin 0 -> 2976 bytes ...orm_validators_numberOfSubmittedValues.png | Bin 0 -> 3281 bytes .../Images/form_validators_numberRange.png | Bin 0 -> 2869 bytes .../form_validators_regularExpression.png | Bin 0 -> 3480 bytes .../Images/form_validators_stringLength.png | Bin 0 -> 2866 bytes Documentation/E/Validators/Index.rst | 333 ++++ .../I/Concepts/Autocomplete/Index.rst | 39 + .../_CustomFormSetupAutoCompleteOption.yaml | 12 + .../I/Concepts/Autocomplete/_config.yaml | 17 + .../I/Concepts/Configuration/Index.rst | 379 ++++ .../CustomFinisherImplementations/Index.rst | 268 +++ .../_codesnippets/_CustomFinisher.php | 18 + .../_codesnippets/_CustomFinisher.yaml | 7 + .../_codesnippets/_backend-ui.yaml | 64 + .../_codesnippets/_finishersDefinition.yaml | 6 + .../_codesnippets/_my_form.yaml | 13 + .../_codesnippets/_my_form_custom.yaml | 15 + .../_codesnippets/_my_form_extended.yaml | 16 + Documentation/I/Concepts/Finishers/Index.rst | 40 + .../ClosureFinisher/Index.rst | 43 + .../_codesnippets/_finisher.php.inc | 20 + .../ConfirmationFinisher/Index.rst | 109 ++ .../_codesnippets/_finisher.php.inc | 19 + ...orm_with_confirmation_content_element.yaml | 10 + .../_form_with_confirmation_finisher.yaml | 10 + ...ith_propertiesExcludedFromTranslation.yaml | 17 + .../DeleteUploadsFinisher/Index.rst | 48 + .../_codesnippets/_finisher.php.inc | 11 + .../_codesnippets/_form.yaml | 13 + .../EmailFinisher/Index.rst | 325 ++++ .../_codesnippets/_example-email.yaml | 15 + .../_codesnippets/_finisher.php.inc | 19 + .../EmailFinisher/_codesnippets/_form.yaml | 14 + .../FlashMessageFinisher/Index.rst | 116 ++ .../_codesnippets/_finisher.php.inc | 18 + .../_codesnippets/_form.yaml | 14 + .../Finishers/ReadyToUseFinishers/Index.rst | 62 + .../RedirectFinisher/Index.rst | 135 ++ .../_codesnippets/_example-redirect.yaml | 17 + .../_codesnippets/_finisher.php.inc | 14 + .../RedirectFinisher/_codesnippets/_form.yaml | 10 + .../SaveToDatabaseFinisher/Index.rst | 245 +++ .../_example-fal-uploads_news.yaml | 73 + .../_codesnippets/_finisher-multiple.php.inc | 30 + .../_codesnippets/_finisher.php.inc | 31 + .../_codesnippets/_form-multiple.yaml | 22 + .../_codesnippets/_form.yaml | 28 + .../FormConfigurationFormDefinition/Index.rst | 113 ++ Documentation/I/Concepts/FormEditor/Index.rst | 579 ++++++ .../I/Concepts/FormFileStorages/Index.rst | 78 + .../I/Concepts/FormManager/Index.rst | 133 ++ Documentation/I/Concepts/FormPlugin/Index.rst | 100 + .../I/Concepts/FrontendRendering/Index.rst | 937 +++++++++ Documentation/I/Concepts/Index.rst | 26 + .../TargetGroupsAndMainPrinciples/Index.rst | 37 + Documentation/I/Concepts/Validators/Index.rst | 294 +++ Documentation/I/Concepts/Variants/Index.rst | 686 +++++++ Documentation/I/Config/Index.rst | 17 + Documentation/I/Config/formManager/Index.rst | 410 ++++ .../I/Config/persistenceManager/Index.rst | 198 ++ Documentation/I/Config/proto/Index.rst | 96 + .../proto/finishersDefinition/Index.rst | 395 ++++ .../finishersDefinition/finishers/Closure.rst | 186 ++ .../finishers/Confirmation.rst | 377 ++++ .../finishers/DeleteUploads.rst | 114 ++ .../finishers/EmailToReceiver.rst | 813 ++++++++ .../finishers/EmailToSender.rst | 812 ++++++++ .../finishers/FlashMessage.rst | 372 ++++ .../finishers/Redirect.rst | 450 +++++ .../finishers/SaveToDatabase.rst | 580 ++++++ .../properties/formEngine/elements.rst.txt | 6 + .../properties/formEngine/label.rst.txt | 5 + .../properties/iconIdentifier.rst.txt | 4 + .../implementationClassName.rst.txt | 3 + .../properties/label.rst.txt | 3 + .../properties/predefinedDefaults.rst.txt | 3 + Documentation/I/Config/proto/form/Index.rst | 325 ++++ .../I/Config/proto/form/formEditor.rst.txt | 472 +++++ .../_isCompositeFormElement.rst.txt | 30 + .../formEditor/_isTopLevelFormElement.rst.txt | 30 + .../proto/form/formEditor/editors/100.rst.txt | 31 + .../proto/form/formEditor/editors/200.rst.txt | 33 + .../proto/form/formEditor/editors/300.rst.txt | 33 + .../proto/form/formEditor/editors/900.rst.txt | 49 + .../form/formEditor/iconIdentifier.rst.txt | 36 + .../formEditor/modalCloseCancelButton.rst.txt | 30 + .../modalCloseConfirmButton.rst.txt | 30 + .../modalCloseDialogMessage.rst.txt | 30 + .../formEditor/modalCloseDialogTitle.rst.txt | 30 + .../modalInsertElementsDialogTitle.rst.txt | 30 + .../modalInsertPagesDialogTitle.rst.txt | 30 + .../modalRemoveElementCancelButton.rst.txt | 30 + .../modalRemoveElementConfirmButton.rst.txt | 30 + .../modalRemoveElementDialogMessage.rst.txt | 30 + .../modalRemoveElementDialogTitle.rst.txt | 30 + ...stAvailablePageFlashMessageMessage.rst.txt | 30 + ...LastAvailablePageFlashMessageTitle.rst.txt | 30 + ...modalValidationErrorsConfirmButton.rst.txt | 30 + .../modalValidationErrorsDialogTitle.rst.txt | 30 + .../form/formEditor/paginationTitle.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../propertyCollections/finishers/10.rst.txt | 167 ++ .../finishers/10/editors/100.rst.txt | 34 + .../finishers/10/editors/1050.rst.txt | 36 + .../finishers/10/editors/1100.rst.txt | 35 + .../finishers/10/editors/1200.rst.txt | 39 + .../finishers/10/editors/1400.rst.txt | 39 + .../finishers/10/editors/200.rst.txt | 39 + .../finishers/10/editors/350.rst.txt | 51 + .../finishers/10/editors/500.rst.txt | 40 + .../finishers/10/editors/600.rst.txt | 38 + .../finishers/10/editors/750.rst.txt | 48 + .../finishers/10/editors/850.rst.txt | 48 + .../finishers/10/editors/950.rst.txt | 48 + .../finishers/10/editors/9999.rst.txt | 33 + .../finishers/10/identifier.rst.txt | 34 + .../propertyCollections/finishers/20.rst.txt | 167 ++ .../finishers/20/editors/100.rst.txt | 34 + .../finishers/20/editors/1050.rst.txt | 36 + .../finishers/20/editors/1100.rst.txt | 35 + .../finishers/20/editors/1200.rst.txt | 39 + .../finishers/20/editors/1400.rst.txt | 38 + .../finishers/20/editors/200.rst.txt | 39 + .../finishers/20/editors/350.rst.txt | 51 + .../finishers/20/editors/500.rst.txt | 40 + .../finishers/20/editors/600.rst.txt | 38 + .../finishers/20/editors/750.rst.txt | 48 + .../finishers/20/editors/850.rst.txt | 48 + .../finishers/20/editors/950.rst.txt | 48 + .../finishers/20/editors/9999.rst.txt | 33 + .../finishers/20/identifier.rst.txt | 34 + .../propertyCollections/finishers/30.rst.txt | 61 + .../finishers/30/editors/100.rst.txt | 34 + .../finishers/30/editors/200.rst.txt | 41 + .../finishers/30/editors/300.rst.txt | 35 + .../finishers/30/editors/400.rst.txt | 38 + .../finishers/30/editors/9999.rst.txt | 33 + .../finishers/30/identifier.rst.txt | 34 + .../propertyCollections/finishers/40.rst.txt | 37 + .../finishers/40/editors/100.rst.txt | 34 + .../finishers/40/editors/9999.rst.txt | 33 + .../finishers/40/identifier.rst.txt | 34 + .../propertyCollections/finishers/50.rst.txt | 55 + .../finishers/50/editors/100.rst.txt | 34 + .../finishers/50/editors/200.rst.txt | 42 + .../finishers/50/editors/300.rst.txt | 36 + .../finishers/50/editors/9999.rst.txt | 33 + .../finishers/50/identifier.rst.txt | 34 + .../propertyCollections/finishers/60.rst.txt | 37 + .../finishers/60/editors/100.rst.txt | 34 + .../finishers/60/editors/9999.rst.txt | 33 + .../finishers/60/identifier.rst.txt | 34 + .../propertyCollections/finishers/70.rst.txt | 37 + .../finishers/70/editors/100.rst.txt | 34 + .../finishers/70/editors/9999.rst.txt | 33 + .../finishers/70/identifier.rst.txt | 34 + .../propertyCollections/finishers/80.rst.txt | 37 + .../finishers/80/editors/100.rst.txt | 34 + .../finishers/80/editors/9999.rst.txt | 33 + .../finishers/80/identifier.rst.txt | 34 + .../saveErrorFlashMessageMessage.rst.txt | 30 + .../saveErrorFlashMessageTitle.rst.txt | 30 + .../saveSuccessFlashMessageMessage.rst.txt | 30 + .../saveSuccessFlashMessageTitle.rst.txt | 30 + .../_isCompositeFormElement.rst.txt | 57 + .../_isTopLevelFormElement.rst.txt | 57 + .../renderingOptions/addQueryString.rst.txt | 57 + .../renderingOptions/additionalParams.rst.txt | 57 + ...gumentsToBeExcludedFromQueryString.rst.txt | 57 + .../renderingOptions/controllerAction.rst.txt | 57 + .../fluidAdditionalAttributes.rst.txt | 22 + .../renderingOptions/honeypot/enable.rst.txt | 90 + .../honeypot/formElementToUse.rst.txt | 57 + .../form/renderingOptions/httpEnctype.rst.txt | 57 + .../form/renderingOptions/httpMethod.rst.txt | 57 + .../renderingOptions/layoutRootPaths.rst.txt | 57 + .../renderingOptions/partialRootPaths.rst.txt | 57 + .../skipUnknownElements.rst.txt | 57 + .../submitButtonLabel.rst.txt | 57 + .../templateRootPaths.rst.txt | 57 + .../translation/translationFiles.rst.txt | 58 + .../I/Config/proto/formEditor/Index.rst | 710 +++++++ .../I/Config/proto/formElements/Index.rst | 828 ++++++++ .../proto/formElements/formEditor/Index.rst | 111 ++ .../inspectorEditors/CheckboxEditor.rst | 60 + .../CollectionElementHeaderEditor.rst | 57 + .../inspectorEditors/FinishersEditor.rst | 105 + .../FormElementHeaderEditor.rst | 53 + .../GridColumnViewPortConfigurationEditor.rst | 175 ++ .../inspectorEditors/MultiSelectEditor.rst | 108 ++ .../inspectorEditors/PropertyGridEditor.rst | 207 ++ .../inspectorEditors/RemoveElementEditor.rst | 52 + .../RequiredValidatorEditor.rst | 127 ++ .../inspectorEditors/SingleSelectEditor.rst | 110 ++ .../inspectorEditors/TextEditor.rst | 205 ++ .../inspectorEditors/TextareaEditor.rst | 158 ++ .../Typo3WinBrowserEditor.rst | 278 +++ .../ValidationErrorMessageEditor.rst | 84 + .../inspectorEditors/ValidatorsEditor.rst | 104 + .../properties/Identifier.rst.txt | 25 + .../inspectorEditors/properties/Label.rst.txt | 25 + .../properties/PropertyPath.rst.txt | 26 + .../properties/TemplateName.rst.txt | 4 + .../formElementTypes/AdvancedPassword.rst | 190 ++ .../AdvancedPassword/formEditor.rst.txt | 241 +++ .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/230.rst.txt | 29 + .../formEditor/editors/300.rst.txt | 33 + .../formEditor/editors/400.rst.txt | 35 + .../formEditor/editors/700.rst.txt | 49 + .../formEditor/editors/800.rst.txt | 35 + .../formEditor/editors/900.rst.txt | 54 + .../formEditor/editors/9999.rst.txt | 31 + .../AdvancedPassword/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../AdvancedPassword/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../propertyCollections/validators/10.rst.txt | 36 + .../validators/10/editors/100.rst.txt | 33 + .../validators/10/editors/9999.rst.txt | 32 + .../validators/10/identifier.rst.txt | 34 + .../propertyCollections/validators/20.rst.txt | 36 + .../validators/20/editors/100.rst.txt | 33 + .../validators/20/editors/9999.rst.txt | 32 + .../validators/20/identifier.rst.txt | 34 + .../propertyCollections/validators/30.rst.txt | 54 + .../validators/30/editors/100.rst.txt | 33 + .../validators/30/editors/200.rst.txt | 38 + .../validators/30/editors/300.rst.txt | 38 + .../validators/30/editors/9999.rst.txt | 32 + .../validators/30/identifier.rst.txt | 34 + .../propertyCollections/validators/40.rst.txt | 36 + .../validators/40/editors/100.rst.txt | 33 + .../validators/40/editors/9999.rst.txt | 32 + .../validators/40/identifier.rst.txt | 34 + .../propertyCollections/validators/50.rst.txt | 36 + .../validators/50/editors/100.rst.txt | 33 + .../validators/50/editors/9999.rst.txt | 32 + .../validators/50/identifier.rst.txt | 34 + .../propertyCollections/validators/60.rst.txt | 36 + .../validators/60/editors/100.rst.txt | 33 + .../validators/60/editors/9999.rst.txt | 32 + .../validators/60/identifier.rst.txt | 34 + .../propertyCollections/validators/70.rst.txt | 54 + .../validators/70/editors/100.rst.txt | 33 + .../validators/70/editors/200.rst.txt | 38 + .../validators/70/editors/300.rst.txt | 38 + .../validators/70/editors/9999.rst.txt | 32 + .../validators/70/identifier.rst.txt | 34 + .../propertyCollections/validators/80.rst.txt | 45 + .../validators/80/editors/100.rst.txt | 33 + .../validators/80/editors/200.rst.txt | 38 + .../validators/80/editors/9999.rst.txt | 32 + .../validators/80/identifier.rst.txt | 34 + .../implementationClassName.rst.txt | 35 + .../confirmationClassAttribute.rst.txt | 40 + .../properties/confirmationLabel.rst.txt | 40 + .../containerClassAttribute.rst.txt | 40 + .../properties/elementClassAttribute.rst.txt | 40 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 40 + .../formElementTypes/Checkbox.rst | 68 + .../Checkbox/formEditor.rst.txt | 74 + .../Checkbox/formEditor/editors/100.rst.txt | 31 + .../Checkbox/formEditor/editors/200.rst.txt | 33 + .../Checkbox/formEditor/editors/230.rst.txt | 29 + .../Checkbox/formEditor/editors/700.rst.txt | 50 + .../Checkbox/formEditor/editors/800.rst.txt | 37 + .../Checkbox/formEditor/editors/9999.rst.txt | 32 + .../Checkbox/formEditor/group.rst.txt | 31 + .../Checkbox/formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../Checkbox/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 30 + .../Checkbox/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 39 + .../properties/elementClassAttribute.rst.txt | 39 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 39 + .../Checkbox/properties/value.rst.txt | 39 + .../formElementTypes/ContentElement.rst | 49 + .../ContentElement/formEditor.rst.txt | 70 + .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/300.rst.txt | 38 + .../formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/9999.rst.txt | 32 + .../ContentElement/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../ContentElement/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../implementationClassName.rst.txt | 35 + .../properties/contentElementUid.rst.txt | 36 + .../formElements/formElementTypes/Date.rst | 236 +++ .../formElementTypes/Date/formEditor.rst.txt | 119 ++ .../Date/formEditor/editors/100.rst.txt | 31 + .../Date/formEditor/editors/200.rst.txt | 33 + .../Date/formEditor/editors/230.rst.txt | 29 + .../Date/formEditor/editors/500.rst.txt | 36 + .../Date/formEditor/editors/550.rst.txt | 36 + .../Date/formEditor/editors/700.rst.txt | 50 + .../Date/formEditor/editors/800.rst.txt | 44 + .../Date/formEditor/editors/900.rst.txt | 40 + .../Date/formEditor/editors/9999.rst.txt | 32 + .../Date/formEditor/group.rst.txt | 31 + .../Date/formEditor/groupSorting.rst.txt | 30 + .../Date/formEditor/iconIdentifier.rst.txt | 36 + .../Date/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 40 + .../propertyCollections/validators/10.rst.txt | 66 + .../validators/10/editors/100.rst.txt | 33 + .../validators/10/editors/200.rst.txt | 38 + .../validators/10/editors/250.rst.txt | 39 + .../validators/10/editors/300.rst.txt | 39 + .../validators/10/editors/9999.rst.txt | 32 + .../validators/10/identifier.rst.txt | 34 + .../propertyCollections/validators/20.rst.txt | 43 + .../validators/20/editors/100.rst.txt | 33 + .../validators/20/editors/200.rst.txt | 36 + .../validators/20/editors/9999.rst.txt | 32 + .../validators/20/identifier.rst.txt | 34 + .../propertyCollections/validators/30.rst.txt | 65 + .../validators/30/editors/100.rst.txt | 33 + .../validators/30/editors/200.rst.txt | 38 + .../validators/30/editors/300.rst.txt | 38 + .../validators/30/editors/400.rst.txt | 40 + .../validators/30/editors/9999.rst.txt | 32 + .../validators/30/identifier.rst.txt | 34 + .../propertyCollections/validators/40.rst.txt | 43 + .../validators/40/editors/100.rst.txt | 33 + .../validators/40/editors/200.rst.txt | 36 + .../validators/40/editors/9999.rst.txt | 32 + .../validators/40/identifier.rst.txt | 34 + .../propertyCollections/validators/50.rst.txt | 43 + .../validators/50/editors/100.rst.txt | 33 + .../validators/50/editors/200.rst.txt | 36 + .../validators/50/editors/9999.rst.txt | 32 + .../validators/50/identifier.rst.txt | 34 + .../propertyCollections/validators/60.rst.txt | 43 + .../validators/60/editors/100.rst.txt | 33 + .../validators/60/editors/200.rst.txt | 36 + .../validators/60/editors/9999.rst.txt | 32 + .../validators/60/identifier.rst.txt | 34 + .../propertyCollections/validators/70.rst.txt | 62 + .../validators/70/editors/100.rst.txt | 33 + .../validators/70/editors/200.rst.txt | 38 + .../validators/70/editors/300.rst.txt | 38 + .../validators/70/editors/400.rst.txt | 37 + .../validators/70/editors/9999.rst.txt | 32 + .../validators/70/identifier.rst.txt | 34 + .../propertyCollections/validators/80.rst.txt | 52 + .../validators/80/editors/100.rst.txt | 33 + .../validators/80/editors/200.rst.txt | 38 + .../validators/80/editors/300.rst.txt | 36 + .../validators/80/editors/9999.rst.txt | 32 + .../validators/80/identifier.rst.txt | 34 + .../Date/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 41 + .../Date/properties/displayFormat.rst.txt | 46 + .../properties/elementClassAttribute.rst.txt | 41 + .../elementErrorClassAttribute.rst.txt | 41 + .../fluidAdditionalAttributes/pattern.rst.txt | 41 + .../formElements/formElementTypes/Email.rst | 85 + .../formElementTypes/Email/formEditor.rst.txt | 111 ++ .../Email/formEditor/editors/100.rst.txt | 32 + .../Email/formEditor/editors/200.rst.txt | 34 + .../Email/formEditor/editors/230.rst.txt | 29 + .../Email/formEditor/editors/400.rst.txt | 37 + .../Email/formEditor/editors/500.rst.txt | 34 + .../Email/formEditor/editors/700.rst.txt | 51 + .../Email/formEditor/editors/800.rst.txt | 35 + .../Email/formEditor/editors/900.rst.txt | 40 + .../Email/formEditor/editors/9999.rst.txt | 32 + .../Email/formEditor/group.rst.txt | 28 + .../Email/formEditor/groupSorting.rst.txt | 30 + .../Email/formEditor/iconIdentifier.rst.txt | 36 + .../Email/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 34 + .../propertyCollections/validators/40.rst.txt | 34 + .../validators/40/editors/100.rst.txt | 34 + .../validators/40/identifier.rst.txt | 34 + .../Email/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/Email/validators.rst.txt | 37 + .../formElementTypes/Fieldset.rst | 58 + .../Fieldset/formEditor.rst.txt | 63 + .../_isCompositeFormElement.rst.txt | 30 + .../Fieldset/formEditor/editors/100.rst.txt | 31 + .../Fieldset/formEditor/editors/200.rst.txt | 33 + .../Fieldset/formEditor/editors/700.rst.txt | 50 + .../Fieldset/formEditor/editors/9999.rst.txt | 32 + .../Fieldset/formEditor/group.rst.txt | 31 + .../Fieldset/formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../Fieldset/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 30 + .../Fieldset/implementationClassName.rst.txt | 35 + .../properties/elementClassAttribute.rst.txt | 38 + .../elementErrorClassAttribute.rst.txt | 38 + .../_isCompositeFormElement.rst.txt | 36 + .../formElementTypes/FileUpload.rst | 97 + .../FileUpload/formEditor.rst.txt | 151 ++ .../FileUpload/formEditor/editors/100.rst.txt | 31 + .../FileUpload/formEditor/editors/200.rst.txt | 33 + .../FileUpload/formEditor/editors/230.rst.txt | 29 + .../FileUpload/formEditor/editors/300.rst.txt | 55 + .../FileUpload/formEditor/editors/400.rst.txt | 37 + .../FileUpload/formEditor/editors/700.rst.txt | 49 + .../FileUpload/formEditor/editors/800.rst.txt | 35 + .../FileUpload/formEditor/editors/900.rst.txt | 39 + .../formEditor/editors/9999.rst.txt | 31 + .../FileUpload/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../FileUpload/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 34 + .../propertyCollections/validators/10.rst.txt | 50 + .../validators/10/editors/100.rst.txt | 33 + .../validators/10/editors/200.rst.txt | 36 + .../validators/10/editors/300.rst.txt | 36 + .../validators/10/editors/9999.rst.txt | 32 + .../validators/10/identifier.rst.txt | 34 + .../implementationClassName.rst.txt | 35 + .../properties/allowedMimeTypes.rst.txt | 44 + .../containerClassAttribute.rst.txt | 44 + .../properties/elementClassAttribute.rst.txt | 44 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 44 + .../properties/saveToFileMount.rst.txt | 48 + .../formElements/formElementTypes/GridRow.rst | 76 + .../GridRow/formEditor.rst.txt | 64 + .../_isCompositeFormElement.rst.txt | 30 + .../formEditor/_isGridRowFormElement.rst.txt | 30 + .../GridRow/formEditor/editors/100.rst.txt | 31 + .../GridRow/formEditor/editors/200.rst.txt | 33 + .../GridRow/formEditor/editors/700.rst.txt | 50 + .../GridRow/formEditor/editors/9999.rst.txt | 32 + .../GridRow/formEditor/group.rst.txt | 31 + .../GridRow/formEditor/groupSorting.rst.txt | 30 + .../GridRow/formEditor/iconIdentifier.rst.txt | 36 + .../GridRow/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 30 + .../GridRow/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 49 + .../properties/elementClassAttribute.rst.txt | 49 + .../elementErrorClassAttribute.rst.txt | 49 + .../gridSize.rst.txt | 49 + .../viewPorts.rst.txt | 49 + .../viewPorts/classPattern.rst.txt | 53 + .../_isCompositeFormElement.rst.txt | 37 + .../_isGridRowFormElement.rst.txt | 37 + .../formElements/formElementTypes/Hidden.rst | 59 + .../Hidden/formEditor.rst.txt | 68 + .../Hidden/formEditor/editors/100.rst.txt | 31 + .../Hidden/formEditor/editors/200.rst.txt | 33 + .../Hidden/formEditor/editors/300.rst.txt | 33 + .../Hidden/formEditor/editors/700.rst.txt | 50 + .../Hidden/formEditor/editors/9999.rst.txt | 32 + .../Hidden/formEditor/group.rst.txt | 31 + .../Hidden/formEditor/groupSorting.rst.txt | 30 + .../Hidden/formEditor/iconIdentifier.rst.txt | 36 + .../Hidden/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 31 + .../Hidden/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/Honeypot.rst | 31 + .../Honeypot/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 40 + .../properties/elementClassAttribute.rst.txt | 40 + .../elementErrorClassAttribute.rst.txt | 40 + .../properties/renderAsHiddenField.rst.txt | 40 + .../properties/styleAttribute.rst.txt | 40 + .../formElementTypes/ImageUpload.rst | 106 + .../ImageUpload/formEditor.rst.txt | 139 ++ .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/230.rst.txt | 29 + .../formEditor/editors/300.rst.txt | 43 + .../formEditor/editors/400.rst.txt | 38 + .../formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/800.rst.txt | 37 + .../formEditor/editors/900.rst.txt | 39 + .../formEditor/editors/9999.rst.txt | 32 + .../ImageUpload/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../ImageUpload/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 34 + .../propertyCollections/validators/10.rst.txt | 50 + .../validators/10/editors/100.rst.txt | 33 + .../validators/10/editors/200.rst.txt | 36 + .../validators/10/editors/300.rst.txt | 36 + .../validators/10/editors/9999.rst.txt | 32 + .../validators/10/identifier.rst.txt | 34 + .../implementationClassName.rst.txt | 35 + .../properties/allowedMimeTypes.rst.txt | 46 + .../containerClassAttribute.rst.txt | 46 + .../properties/elementClassAttribute.rst.txt | 46 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 46 + .../properties/imageLinkMaxWidth.rst.txt | 46 + .../properties/imageMaxHeight.rst.txt | 46 + .../properties/imageMaxWidth.rst.txt | 46 + .../properties/saveToFileMount.rst.txt | 50 + .../formElementTypes/MultiCheckbox.rst | 88 + .../MultiCheckbox/formEditor.rst.txt | 122 ++ .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/230.rst.txt | 29 + .../formEditor/editors/300.rst.txt | 39 + .../formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/800.rst.txt | 37 + .../formEditor/editors/900.rst.txt | 40 + .../formEditor/editors/9999.rst.txt | 32 + .../MultiCheckbox/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../MultiCheckbox/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../propertyCollections/validators/10.rst.txt | 51 + .../validators/10/editors/100.rst.txt | 34 + .../validators/10/editors/200.rst.txt | 37 + .../validators/10/editors/300.rst.txt | 37 + .../validators/10/editors/9999.rst.txt | 33 + .../validators/10/identifier.rst.txt | 34 + .../implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/MultiSelect.rst | 97 + .../MultiSelect/formEditor.rst.txt | 131 ++ .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/230.rst.txt | 29 + .../formEditor/editors/250.rst.txt | 35 + .../formEditor/editors/300.rst.txt | 39 + .../formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/800.rst.txt | 37 + .../formEditor/editors/900.rst.txt | 40 + .../formEditor/editors/9999.rst.txt | 32 + .../MultiSelect/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../MultiSelect/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../propertyCollections/validators/10.rst.txt | 51 + .../validators/10/editors/100.rst.txt | 34 + .../validators/10/editors/200.rst.txt | 37 + .../validators/10/editors/300.rst.txt | 37 + .../validators/10/editors/9999.rst.txt | 33 + .../validators/10/identifier.rst.txt | 34 + .../implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../properties/prependOptionLabel.rst.txt | 30 + .../properties/prependOptionValue.rst.txt | 30 + .../formElements/formElementTypes/Number.rst | 106 + .../Number/formEditor.rst.txt | 152 ++ .../Number/formEditor/editors/100.rst.txt | 32 + .../Number/formEditor/editors/200.rst.txt | 34 + .../Number/formEditor/editors/230.rst.txt | 29 + .../Number/formEditor/editors/400.rst.txt | 37 + .../Number/formEditor/editors/500.rst.txt | 34 + .../Number/formEditor/editors/550.rst.txt | 36 + .../Number/formEditor/editors/700.rst.txt | 50 + .../Number/formEditor/editors/800.rst.txt | 35 + .../Number/formEditor/editors/900.rst.txt | 43 + .../Number/formEditor/editors/9999.rst.txt | 32 + .../Number/formEditor/group.rst.txt | 28 + .../Number/formEditor/groupSorting.rst.txt | 30 + .../Number/formEditor/iconIdentifier.rst.txt | 36 + .../Number/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 37 + .../propertyCollections/validators/60.rst.txt | 34 + .../validators/60/editors/100.rst.txt | 34 + .../validators/60/identifier.rst.txt | 39 + .../propertyCollections/validators/70.rst.txt | 55 + .../validators/70/editors/100.rst.txt | 34 + .../validators/70/editors/200.rst.txt | 38 + .../validators/70/editors/300.rst.txt | 38 + .../validators/70/editors/9999.rst.txt | 33 + .../validators/70/identifier.rst.txt | 34 + .../Number/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../Number/validators.rst.txt | 37 + .../formElements/formElementTypes/Page.rst | 67 + .../formElementTypes/Page/formEditor.rst.txt | 56 + .../_isCompositeFormElement.rst.txt | 30 + .../formEditor/_isTopLevelFormElement.rst.txt | 30 + .../Page/formEditor/editors/100.rst.txt | 31 + .../Page/formEditor/editors/200.rst.txt | 33 + .../Page/formEditor/editors/300.rst.txt | 33 + .../Page/formEditor/editors/400.rst.txt | 33 + .../Page/formEditor/editors/9999.rst.txt | 32 + .../Page/formEditor/group.rst.txt | 31 + .../Page/formEditor/groupSorting.rst.txt | 30 + .../Page/formEditor/iconIdentifier.rst.txt | 36 + .../Page/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 33 + .../Page/implementationClassName.rst.txt | 35 + .../_isCompositeFormElement.rst.txt | 39 + .../_isTopLevelFormElement.rst.txt | 39 + .../renderingOptions/nextButtonLabel.rst.txt | 39 + .../previousButtonLabel.rst.txt | 39 + .../formElementTypes/Password.rst | 184 ++ .../Password/formEditor.rst.txt | 240 +++ .../Password/formEditor/editors/100.rst.txt | 31 + .../Password/formEditor/editors/200.rst.txt | 34 + .../Password/formEditor/editors/230.rst.txt | 29 + .../Password/formEditor/editors/400.rst.txt | 37 + .../Password/formEditor/editors/500.rst.txt | 34 + .../Password/formEditor/editors/700.rst.txt | 50 + .../Password/formEditor/editors/800.rst.txt | 37 + .../Password/formEditor/editors/900.rst.txt | 55 + .../Password/formEditor/editors/9999.rst.txt | 32 + .../Password/formEditor/group.rst.txt | 31 + .../Password/formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../Password/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 31 + .../propertyCollections/validators/10.rst.txt | 37 + .../validators/10/editors/100.rst.txt | 34 + .../validators/10/editors/9999.rst.txt | 33 + .../validators/10/identifier.rst.txt | 34 + .../propertyCollections/validators/20.rst.txt | 37 + .../validators/20/editors/100.rst.txt | 34 + .../validators/20/editors/9999.rst.txt | 33 + .../validators/20/identifier.rst.txt | 34 + .../propertyCollections/validators/30.rst.txt | 55 + .../validators/30/editors/100.rst.txt | 34 + .../validators/30/editors/200.rst.txt | 39 + .../validators/30/editors/300.rst.txt | 39 + .../validators/30/editors/9999.rst.txt | 33 + .../validators/30/identifier.rst.txt | 34 + .../propertyCollections/validators/40.rst.txt | 37 + .../validators/40/editors/100.rst.txt | 34 + .../validators/40/editors/9999.rst.txt | 33 + .../validators/40/identifier.rst.txt | 34 + .../propertyCollections/validators/50.rst.txt | 37 + .../validators/50/editors/100.rst.txt | 34 + .../validators/50/editors/9999.rst.txt | 33 + .../validators/50/identifier.rst.txt | 34 + .../propertyCollections/validators/60.rst.txt | 37 + .../validators/60/editors/100.rst.txt | 34 + .../validators/60/editors/9999.rst.txt | 33 + .../validators/60/identifier.rst.txt | 34 + .../propertyCollections/validators/70.rst.txt | 55 + .../validators/70/editors/100.rst.txt | 34 + .../validators/70/editors/200.rst.txt | 38 + .../validators/70/editors/300.rst.txt | 38 + .../validators/70/editors/9999.rst.txt | 33 + .../validators/70/identifier.rst.txt | 34 + .../propertyCollections/validators/80.rst.txt | 46 + .../validators/80/editors/100.rst.txt | 34 + .../validators/80/editors/200.rst.txt | 39 + .../validators/80/editors/9999.rst.txt | 33 + .../validators/80/identifier.rst.txt | 34 + .../Password/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/RadioButton.rst | 67 + .../RadioButton/formEditor.rst.txt | 87 + .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/230.rst.txt | 29 + .../formEditor/editors/300.rst.txt | 39 + .../formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/800.rst.txt | 37 + .../formEditor/editors/9999.rst.txt | 32 + .../RadioButton/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../RadioButton/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/SingleSelect.rst | 76 + .../SingleSelect/formEditor.rst.txt | 94 + .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/230.rst.txt | 29 + .../formEditor/editors/250.rst.txt | 35 + .../formEditor/editors/300.rst.txt | 39 + .../formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/800.rst.txt | 37 + .../formEditor/editors/9999.rst.txt | 32 + .../SingleSelect/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../SingleSelect/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../properties/prependOptionLabel.rst.txt | 30 + .../properties/prependOptionValue.rst.txt | 30 + .../formElementTypes/StaticText.rst | 52 + .../StaticText/formEditor.rst.txt | 70 + .../StaticText/formEditor/editors/100.rst.txt | 31 + .../StaticText/formEditor/editors/200.rst.txt | 33 + .../StaticText/formEditor/editors/300.rst.txt | 33 + .../StaticText/formEditor/editors/700.rst.txt | 50 + .../formEditor/editors/9999.rst.txt | 32 + .../StaticText/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../StaticText/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 32 + .../implementationClassName.rst.txt | 35 + .../StaticText/properties/text.rst.txt | 36 + .../formElementTypes/SummaryPage.rst | 67 + .../SummaryPage/formEditor.rst.txt | 56 + .../_isCompositeFormElement.rst.txt | 30 + .../formEditor/_isTopLevelFormElement.rst.txt | 30 + .../formEditor/editors/100.rst.txt | 31 + .../formEditor/editors/200.rst.txt | 33 + .../formEditor/editors/300.rst.txt | 33 + .../formEditor/editors/400.rst.txt | 33 + .../formEditor/editors/9999.rst.txt | 32 + .../SummaryPage/formEditor/group.rst.txt | 31 + .../formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../SummaryPage/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 33 + .../implementationClassName.rst.txt | 35 + .../_isCompositeFormElement.rst.txt | 39 + .../_isTopLevelFormElement.rst.txt | 39 + .../renderingOptions/nextButtonLabel.rst.txt | 39 + .../previousButtonLabel.rst.txt | 39 + .../formElementTypes/Telephone.rst | 88 + .../Telephone/formEditor.rst.txt | 112 ++ .../Telephone/formEditor/editors/100.rst.txt | 32 + .../Telephone/formEditor/editors/200.rst.txt | 34 + .../Telephone/formEditor/editors/230.rst.txt | 29 + .../Telephone/formEditor/editors/400.rst.txt | 37 + .../Telephone/formEditor/editors/500.rst.txt | 34 + .../Telephone/formEditor/editors/700.rst.txt | 51 + .../Telephone/formEditor/editors/800.rst.txt | 35 + .../Telephone/formEditor/editors/900.rst.txt | 37 + .../Telephone/formEditor/editors/9999.rst.txt | 32 + .../Telephone/formEditor/group.rst.txt | 28 + .../Telephone/formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../Telephone/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 31 + .../propertyCollections/validators/80.rst.txt | 43 + .../validators/80/editors/100.rst.txt | 34 + .../validators/80/editors/200.rst.txt | 39 + .../validators/80/identifier.rst.txt | 34 + .../Telephone/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../Telephone/validators.rst.txt | 39 + .../formElements/formElementTypes/Text.rst | 184 ++ .../formElementTypes/Text/formEditor.rst.txt | 240 +++ .../Text/formEditor/editors/100.rst.txt | 32 + .../Text/formEditor/editors/200.rst.txt | 34 + .../Text/formEditor/editors/230.rst.txt | 29 + .../Text/formEditor/editors/400.rst.txt | 37 + .../Text/formEditor/editors/500.rst.txt | 34 + .../Text/formEditor/editors/700.rst.txt | 51 + .../Text/formEditor/editors/800.rst.txt | 38 + .../Text/formEditor/editors/900.rst.txt | 55 + .../Text/formEditor/editors/9999.rst.txt | 32 + .../Text/formEditor/group.rst.txt | 31 + .../Text/formEditor/groupSorting.rst.txt | 30 + .../Text/formEditor/iconIdentifier.rst.txt | 36 + .../Text/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 31 + .../propertyCollections/validators/10.rst.txt | 37 + .../validators/10/editors/100.rst.txt | 34 + .../validators/10/editors/9999.rst.txt | 33 + .../validators/10/identifier.rst.txt | 34 + .../propertyCollections/validators/20.rst.txt | 37 + .../validators/20/editors/100.rst.txt | 34 + .../validators/20/editors/9999.rst.txt | 33 + .../validators/20/identifier.rst.txt | 34 + .../propertyCollections/validators/30.rst.txt | 55 + .../validators/30/editors/100.rst.txt | 34 + .../validators/30/editors/200.rst.txt | 39 + .../validators/30/editors/300.rst.txt | 39 + .../validators/30/editors/9999.rst.txt | 33 + .../validators/30/identifier.rst.txt | 34 + .../propertyCollections/validators/40.rst.txt | 37 + .../validators/40/editors/100.rst.txt | 34 + .../validators/40/editors/9999.rst.txt | 33 + .../validators/40/identifier.rst.txt | 34 + .../propertyCollections/validators/50.rst.txt | 37 + .../validators/50/editors/100.rst.txt | 34 + .../validators/50/editors/9999.rst.txt | 33 + .../validators/50/identifier.rst.txt | 34 + .../propertyCollections/validators/60.rst.txt | 37 + .../validators/60/editors/100.rst.txt | 34 + .../validators/60/editors/9999.rst.txt | 33 + .../validators/60/identifier.rst.txt | 34 + .../propertyCollections/validators/70.rst.txt | 55 + .../validators/70/editors/100.rst.txt | 34 + .../validators/70/editors/200.rst.txt | 38 + .../validators/70/editors/300.rst.txt | 38 + .../validators/70/editors/9999.rst.txt | 33 + .../validators/70/identifier.rst.txt | 34 + .../propertyCollections/validators/80.rst.txt | 46 + .../validators/80/editors/100.rst.txt | 34 + .../validators/80/editors/200.rst.txt | 39 + .../validators/80/editors/9999.rst.txt | 33 + .../validators/80/identifier.rst.txt | 34 + .../Text/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/Textarea.rst | 184 ++ .../Textarea/formEditor.rst.txt | 237 +++ .../Textarea/formEditor/editors/100.rst.txt | 31 + .../Textarea/formEditor/editors/200.rst.txt | 33 + .../Textarea/formEditor/editors/230.rst.txt | 29 + .../Textarea/formEditor/editors/400.rst.txt | 35 + .../Textarea/formEditor/editors/500.rst.txt | 33 + .../Textarea/formEditor/editors/700.rst.txt | 49 + .../Textarea/formEditor/editors/800.rst.txt | 35 + .../Textarea/formEditor/editors/900.rst.txt | 54 + .../Textarea/formEditor/editors/9999.rst.txt | 31 + .../Textarea/formEditor/group.rst.txt | 31 + .../Textarea/formEditor/groupSorting.rst.txt | 30 + .../formEditor/iconIdentifier.rst.txt | 36 + .../Textarea/formEditor/label.rst.txt | 30 + .../formEditor/predefinedDefaults.rst.txt | 31 + .../propertyCollections/validators/10.rst.txt | 37 + .../validators/10/editors/100.rst.txt | 34 + .../validators/10/editors/9999.rst.txt | 33 + .../validators/10/identifier.rst.txt | 34 + .../propertyCollections/validators/20.rst.txt | 37 + .../validators/20/editors/100.rst.txt | 34 + .../validators/20/editors/9999.rst.txt | 33 + .../validators/20/identifier.rst.txt | 34 + .../propertyCollections/validators/30.rst.txt | 55 + .../validators/30/editors/100.rst.txt | 34 + .../validators/30/editors/200.rst.txt | 39 + .../validators/30/editors/300.rst.txt | 39 + .../validators/30/editors/9999.rst.txt | 33 + .../validators/30/identifier.rst.txt | 34 + .../propertyCollections/validators/40.rst.txt | 37 + .../validators/40/editors/100.rst.txt | 34 + .../validators/40/editors/9999.rst.txt | 33 + .../validators/40/identifier.rst.txt | 34 + .../propertyCollections/validators/50.rst.txt | 37 + .../validators/50/editors/100.rst.txt | 34 + .../validators/50/editors/9999.rst.txt | 33 + .../validators/50/identifier.rst.txt | 34 + .../propertyCollections/validators/60.rst.txt | 37 + .../validators/60/editors/100.rst.txt | 34 + .../validators/60/editors/9999.rst.txt | 33 + .../validators/60/identifier.rst.txt | 34 + .../propertyCollections/validators/70.rst.txt | 55 + .../validators/70/editors/100.rst.txt | 34 + .../validators/70/editors/200.rst.txt | 38 + .../validators/70/editors/300.rst.txt | 38 + .../validators/70/editors/9999.rst.txt | 33 + .../validators/70/identifier.rst.txt | 34 + .../propertyCollections/validators/80.rst.txt | 46 + .../validators/80/editors/100.rst.txt | 34 + .../validators/80/editors/200.rst.txt | 39 + .../validators/80/editors/9999.rst.txt | 33 + .../validators/80/identifier.rst.txt | 34 + .../Textarea/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElements/formElementTypes/Url.rst | 88 + .../formElementTypes/Url/formEditor.rst.txt | 110 ++ .../Url/formEditor/editors/100.rst.txt | 32 + .../Url/formEditor/editors/200.rst.txt | 34 + .../Url/formEditor/editors/230.rst.txt | 29 + .../Url/formEditor/editors/400.rst.txt | 37 + .../Url/formEditor/editors/500.rst.txt | 34 + .../Url/formEditor/editors/700.rst.txt | 51 + .../Url/formEditor/editors/800.rst.txt | 35 + .../Url/formEditor/editors/900.rst.txt | 37 + .../Url/formEditor/editors/9999.rst.txt | 32 + .../Url/formEditor/group.rst.txt | 28 + .../Url/formEditor/groupSorting.rst.txt | 30 + .../Url/formEditor/iconIdentifier.rst.txt | 36 + .../Url/formEditor/label.rst.txt | 30 + .../Url/formEditor/predefinedDefaults.rst.txt | 31 + .../propertyCollections/validators/80.rst.txt | 43 + .../validators/80/editors/100.rst.txt | 34 + .../validators/80/editors/200.rst.txt | 39 + .../validators/80/identifier.rst.txt | 34 + .../Url/implementationClassName.rst.txt | 35 + .../containerClassAttribute.rst.txt | 38 + .../properties/elementClassAttribute.rst.txt | 38 + .../Url/properties/elementDescription.rst.txt | 32 + .../elementErrorClassAttribute.rst.txt | 38 + .../formElementTypes/Url/validators.rst.txt | 39 + .../I/Config/proto/formEngine/Index.rst | 46 + .../proto/validatorsDefinition/Index.rst | 297 +++ .../properties/iconIdentifier.rst.txt | 4 + .../implementationClassName.rst.txt | 3 + .../properties/label.rst.txt | 3 + .../properties/predefinedDefaults.rst.txt | 3 + .../validators/Alphanumeric.rst | 123 ++ .../validatorsDefinition/validators/Count.rst | 210 ++ .../validators/DateRange.rst | 242 +++ .../validators/DateTime.rst | 123 ++ .../validators/EmailAddress.rst | 126 ++ .../validators/FileSize.rst | 211 ++ .../validatorsDefinition/validators/Float.rst | 123 ++ .../validators/Integer.rst | 123 ++ .../validators/NotEmpty.rst | 132 ++ .../validators/Number.rst | 124 ++ .../validators/NumberRange.rst | 210 ++ .../validators/RegularExpression.rst | 182 ++ .../validators/StringLength.rst | 219 +++ .../validatorsDefinition/validators/Text.rst | 123 ++ Documentation/I/FAQ/Index.rst | 248 +++ .../I/HowTos/CustomFormElement/Index.rst | 173 ++ .../CustomFormElement/_CustomFormSetup.yaml | 82 + .../_GenderSelect.fluid.html | 105 + Documentation/I/HowTos/Index.rst | 16 + .../I/Images/basic_code_components.png | Bin 0 -> 124554 bytes Documentation/I/Images/form_manager.png | Bin 0 -> 37998 bytes .../Images/javascript_module_interaction.png | Bin 0 -> 54086 bytes Documentation/I/Index.rst | 16 + Documentation/Images/InstallActivate.png | Bin 0 -> 19382 bytes Documentation/Images/SiteSet.png | Bin 0 -> 47194 bytes Documentation/Includes.rst.txt | 1 + Documentation/Includes/_NoteFinisher.rst | 7 + Documentation/Index.rst | 56 + Documentation/Installation/Index.rst | 52 + .../Images/introduction_form_editor.png | Bin 0 -> 65639 bytes Documentation/Introduction/Index.rst | 98 + Documentation/QuickStartForEditors/Index.rst | 32 + .../QuickStartForIntegrators/Index.rst | 76 + Documentation/Sitemap.rst | 9 + Documentation/guides.xml | 21 + LICENSE.txt | 339 ++++ README.rst | 11 + .../Inspector/CheckboxEditor.fluid.html | 14 + .../CollectionElementHeaderEditor.fluid.html | 8 + .../Inspector/CountrySelectEditor.fluid.html | 16 + .../CountrySingleSelectEditor.fluid.html | 16 + .../Inspector/DateEditor.fluid.html | 14 + .../Inspector/FinishersEditor.fluid.html | 16 + .../FormElementHeaderEditor.fluid.html | 5 + ...lumnViewPortConfigurationEditor.fluid.html | 25 + .../MaximumFileSizeEditor.fluid.html | 10 + .../Inspector/MultiSelectEditor.fluid.html | 16 + .../Inspector/PropertyGridEditor.fluid.html | 25 + .../Inspector/RemoveElementEditor.fluid.html | 8 + .../RequiredValidatorEditor.fluid.html | 22 + .../Inspector/SingleSelectEditor.fluid.html | 16 + .../Inspector/TextEditor.fluid.html | 17 + .../Inspector/TextareaEditor.fluid.html | 14 + .../Typo3WinBrowserEditor.fluid.html | 21 + .../ValidationErrorMessageEditor.fluid.html | 15 + .../Inspector/ValidatorsEditor.fluid.html | 18 + .../Modals/InsertElements.fluid.html | 9 + .../FormEditor/Modals/InsertPages.fluid.html | 9 + .../Modals/ValidationErrors.fluid.html | 18 + .../FormEditor/InlineTemplates.fluid.html | 7 + .../FormEditor/Yaml/NewForms/BlankForm.yaml | 8 + .../Yaml/NewForms/SimpleContactForm.yaml | 86 + .../Partials/AdvancedPassword.fluid.html | 55 + .../Frontend/Partials/Checkbox.fluid.html | 28 + .../Partials/ContentElement.fluid.html | 27 + .../Partials/CountrySelect.fluid.html | 47 + .../Private/Frontend/Partials/Date.fluid.html | 24 + .../Frontend/Partials/Email.fluid.html | 23 + .../Frontend/Partials/Field/Field.fluid.html | 43 + .../Partials/Field/Required.fluid.html | 3 + .../Frontend/Partials/Fieldset.fluid.html | 19 + .../Frontend/Partials/FileUpload.fluid.html | 67 + .../Partials/Form/Navigation.fluid.html | 17 + .../Frontend/Partials/GridColumn.fluid.html | 7 + .../Frontend/Partials/GridRow.fluid.html | 13 + .../Frontend/Partials/Hidden.fluid.html | 10 + .../Frontend/Partials/Honeypot.fluid.html | 10 + .../Frontend/Partials/ImageUpload.fluid.html | 71 + .../Partials/MultiCheckbox.fluid.html | 44 + .../Frontend/Partials/MultiSelect.fluid.html | 44 + .../Frontend/Partials/Number.fluid.html | 24 + .../Private/Frontend/Partials/Page.fluid.html | 10 + .../Frontend/Partials/Password.fluid.html | 23 + .../Frontend/Partials/RadioButton.fluid.html | 43 + .../Frontend/Partials/SingleSelect.fluid.html | 41 + .../Frontend/Partials/StaticText.fluid.html | 12 + .../Frontend/Partials/SummaryPage.fluid.html | 79 + .../Frontend/Partials/Telephone.fluid.html | 24 + .../Private/Frontend/Partials/Text.fluid.html | 23 + .../Frontend/Partials/Textarea.fluid.html | 25 + .../Partials/UnknownElement.fluid.html | 3 + .../Private/Frontend/Partials/Url.fluid.html | 24 + .../Confirmation/Confirmation.fluid.html | 5 + .../Finishers/Email/Default.fluid.html | 53 + .../Finishers/Email/Default.fluid.txt | 19 + .../Templates/Finishers/Error.fluid.html | 3 + .../Frontend/Templates/Form.fluid.html | 21 + .../Frontend/Templates/Render.fluid.html | 6 + Resources/Private/Language/Database.xlf | 1337 +++++++++++++ .../Private/Language/Modules/form_editor.xlf | 17 + .../Private/Language/Modules/form_manager.xlf | 17 + Resources/Private/Language/locallang.xlf | 155 ++ Resources/Private/Language/locallang_db.xlf | 20 + ...ditor_failSafeErrorHandling_javascript.xlf | 17 + .../locallang_formManager_javascript.xlf | 161 ++ .../locallang_form_editor_javascript.xlf | 32 + .../locallang_relative_date_editor.xlf | 44 + Resources/Private/Language/module.xlf | 17 + .../Backend/FormManager/Pagination.fluid.html | 90 + .../Backend/FormEditor/Index.fluid.html | 110 ++ .../Backend/FormManager/Index.fluid.html | 333 ++++ Resources/Public/Css/form.css | 108 ++ Resources/Public/Icons/Extension.svg | 1 + .../backend/form-editor-tree-container.js | 13 + .../backend/form-editor-tree-events.js | 13 + .../JavaScript/backend/form-editor-tree.js | 13 + .../Public/JavaScript/backend/form-editor.js | 16 + .../form-editor/component/date-editor.js | 13 + .../component/form-element-selector.js | 13 + .../form-element-stage-item-toolbar.js | 13 + .../component/form-element-stage-item.js | 13 + .../form-editor/component/page-stage-item.js | 13 + .../component/property-grid-editor.js | 13 + .../JavaScript/backend/form-editor/core.js | 13 + .../JavaScript/backend/form-editor/helper.js | 13 + .../form-editor/inspector-component.js | 13 + .../backend/form-editor/mediator.js | 13 + .../backend/form-editor/modals-component.js | 13 + .../backend/form-editor/stage-component.js | 13 + .../form-editor/tree-component-adapter.js | 13 + .../form-editor/utility/string-utility.js | 13 + .../backend/form-editor/view-model.js | 13 + .../Public/JavaScript/backend/form-manager.js | 13 + .../JavaScript/backend/form-manager/main.js | 13 + .../backend/form-manager/view-model.js | 13 + .../create-form-submission-service.js | 13 + .../duplicate-form-submission-service.js | 13 + .../backend/form-wizard/form-wizard.js | 13 + .../backend/form-wizard/steps/mode-step.js | 13 + .../form-wizard/steps/settings-step.js | 13 + .../backend/form-wizard/steps/storage-step.js | 13 + Resources/Public/JavaScript/backend/helper.js | 13 + composer.json | 64 + ext_localconf.php | 37 + ext_tables.sql | 9 + 1506 files changed, 94005 insertions(+) create mode 100644 .gitignore create mode 100644 Classes/Command/CleanupFormUploadsCommand.php create mode 100644 Classes/Command/TransferFormDefinitionCommand.php create mode 100644 Classes/ConfigurationModuleProvider/FormYamlProvider.php create mode 100644 Classes/Controller/FormEditorController.php create mode 100644 Classes/Controller/FormFrontendController.php create mode 100644 Classes/Controller/FormManagerController.php create mode 100644 Classes/DependencyInjection/FormYamlCollectorConfigurator.php create mode 100644 Classes/Domain/Condition/ConditionProvider.php create mode 100644 Classes/Domain/Condition/Functions/FormConditionFunctionsProvider.php create mode 100644 Classes/Domain/Configuration/ArrayProcessing/ArrayProcessing.php create mode 100644 Classes/Domain/Configuration/ArrayProcessing/ArrayProcessor.php create mode 100644 Classes/Domain/Configuration/ConfigurationService.php create mode 100644 Classes/Domain/Configuration/Exception/ArrayProcessorException.php create mode 100644 Classes/Domain/Configuration/Exception/PropertyException.php create mode 100644 Classes/Domain/Configuration/Exception/PrototypeNotFoundException.php create mode 100644 Classes/Domain/Configuration/FlexformConfiguration/Processors/AbstractProcessor.php create mode 100644 Classes/Domain/Configuration/FlexformConfiguration/Processors/FinisherOptionGenerator.php create mode 100644 Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorDto.php create mode 100644 Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorInterface.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/AbstractConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToFormElementPropertyConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToPropertyCollectionElementConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/ConverterDto.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/ConverterInterface.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/FinisherOptionsFlexFormOverridesConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/FinisherTranslationLanguageConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/FlexFormFinisherOverridesConverterDto.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Converters/RemoveHmacDataConverter.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/AbstractValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/CollectionBasedValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/ElementBasedValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/FormElementHmacDataValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/PropertyCollectionElementHmacDataValidator.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/ValidationDto.php create mode 100644 Classes/Domain/Configuration/FormDefinition/Validators/ValidatorInterface.php create mode 100644 Classes/Domain/Configuration/FormDefinitionConversionService.php create mode 100644 Classes/Domain/Configuration/FormDefinitionValidationService.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AbstractExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AdditionalElementPropertyPathsExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorDto.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorInterface.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/IsCreatableFormElementExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/MultiValuePropertiesExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PredefinedDefaultsExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PropertyPathsExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/SelectOptionsExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/IsCreatablePropertyCollectionElementExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/MultiValuePropertiesExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PredefinedDefaultsExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PropertyPathsExtractor.php create mode 100644 Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/SelectOptionsExtractor.php create mode 100644 Classes/Domain/Configuration/PersistenceConfigurationService.php create mode 100644 Classes/Domain/DTO/FormData.php create mode 100644 Classes/Domain/DTO/FormMetadata.php create mode 100644 Classes/Domain/DTO/PersistenceManagerConfiguration.php create mode 100644 Classes/Domain/DTO/SearchCriteria.php create mode 100644 Classes/Domain/DTO/StorageContext.php create mode 100644 Classes/Domain/Exception.php create mode 100644 Classes/Domain/Exception/IdentifierNotValidException.php create mode 100644 Classes/Domain/Exception/RenderingException.php create mode 100644 Classes/Domain/Exception/TypeDefinitionNotFoundException.php create mode 100644 Classes/Domain/Exception/TypeDefinitionNotValidException.php create mode 100644 Classes/Domain/Exception/UnknownCompositRenderableException.php create mode 100644 Classes/Domain/Factory/AbstractFormFactory.php create mode 100644 Classes/Domain/Factory/ArrayFormFactory.php create mode 100644 Classes/Domain/Factory/FormFactoryInterface.php create mode 100644 Classes/Domain/Finishers/AbstractFinisher.php create mode 100644 Classes/Domain/Finishers/ClosureFinisher.php create mode 100644 Classes/Domain/Finishers/ConfirmationFinisher.php create mode 100644 Classes/Domain/Finishers/DeleteUploadsFinisher.php create mode 100644 Classes/Domain/Finishers/EmailFinisher.php create mode 100644 Classes/Domain/Finishers/Exception/FinisherException.php create mode 100644 Classes/Domain/Finishers/FinisherContext.php create mode 100644 Classes/Domain/Finishers/FinisherInterface.php create mode 100644 Classes/Domain/Finishers/FinisherVariableProvider.php create mode 100644 Classes/Domain/Finishers/FlashMessageFinisher.php create mode 100644 Classes/Domain/Finishers/RedirectFinisher.php create mode 100644 Classes/Domain/Finishers/SaveToDatabaseFinisher.php create mode 100644 Classes/Domain/Model/Exception.php create mode 100644 Classes/Domain/Model/Exception/DuplicateFormElementException.php create mode 100644 Classes/Domain/Model/Exception/FinisherPresetNotFoundException.php create mode 100644 Classes/Domain/Model/Exception/FormDefinitionConsistencyException.php create mode 100644 Classes/Domain/Model/Exception/ValidatorPresetNotFoundException.php create mode 100644 Classes/Domain/Model/FormDefinition.php create mode 100644 Classes/Domain/Model/FormElements/AbstractFormElement.php create mode 100644 Classes/Domain/Model/FormElements/AbstractSection.php create mode 100644 Classes/Domain/Model/FormElements/Date.php create mode 100644 Classes/Domain/Model/FormElements/FileUpload.php create mode 100644 Classes/Domain/Model/FormElements/FormElementInterface.php create mode 100644 Classes/Domain/Model/FormElements/GenericFormElement.php create mode 100644 Classes/Domain/Model/FormElements/GridColumn.php create mode 100644 Classes/Domain/Model/FormElements/GridColumnInterface.php create mode 100644 Classes/Domain/Model/FormElements/GridRow.php create mode 100644 Classes/Domain/Model/FormElements/GridRowInterface.php create mode 100644 Classes/Domain/Model/FormElements/Page.php create mode 100644 Classes/Domain/Model/FormElements/Section.php create mode 100644 Classes/Domain/Model/FormElements/StringableFormElementInterface.php create mode 100644 Classes/Domain/Model/FormElements/UnknownFormElement.php create mode 100644 Classes/Domain/Model/Renderable/AbstractCompositeRenderable.php create mode 100644 Classes/Domain/Model/Renderable/AbstractRenderable.php create mode 100644 Classes/Domain/Model/Renderable/CompositeRenderableInterface.php create mode 100644 Classes/Domain/Model/Renderable/RenderableInterface.php create mode 100644 Classes/Domain/Model/Renderable/RenderableVariant.php create mode 100644 Classes/Domain/Model/Renderable/RenderableVariantInterface.php create mode 100644 Classes/Domain/Model/Renderable/RootRenderableInterface.php create mode 100644 Classes/Domain/Model/Renderable/VariableRenderableInterface.php create mode 100644 Classes/Domain/Renderer/AbstractElementRenderer.php create mode 100644 Classes/Domain/Renderer/FluidFormRenderer.php create mode 100644 Classes/Domain/Renderer/RendererInterface.php create mode 100644 Classes/Domain/Repository/FormDefinitionRepository.php create mode 100644 Classes/Domain/Runtime/Exception/PropertyMappingException.php create mode 100644 Classes/Domain/Runtime/FormRuntime.php create mode 100644 Classes/Domain/Runtime/FormRuntime/FormSession.php create mode 100644 Classes/Domain/Runtime/FormState.php create mode 100644 Classes/Domain/Translation/FormTranslationKeychainBuilder.php create mode 100644 Classes/Domain/ValueObject/FormIdentifier.php create mode 100644 Classes/Evaluation/EmailOrFormElementIdentifier.php create mode 100644 Classes/Event/AbstractFormEvent.php create mode 100644 Classes/Event/AfterCurrentPageIsResolvedEvent.php create mode 100644 Classes/Event/AfterFormDefinitionValidationConfigurationIsBuiltEvent.php create mode 100644 Classes/Event/AfterFormIsBuiltEvent.php create mode 100644 Classes/Event/AfterFormStateInitializedEvent.php create mode 100644 Classes/Event/BeforeEmailFinisherInitializedEvent.php create mode 100644 Classes/Event/BeforeFormIsCreatedEvent.php create mode 100644 Classes/Event/BeforeFormIsDeletedEvent.php create mode 100644 Classes/Event/BeforeFormIsDuplicatedEvent.php create mode 100644 Classes/Event/BeforeFormIsSavedEvent.php create mode 100644 Classes/Event/BeforeRenderableIsAddedToFormEvent.php create mode 100644 Classes/Event/BeforeRenderableIsRemovedFromFormEvent.php create mode 100644 Classes/Event/BeforeRenderableIsRenderedEvent.php create mode 100644 Classes/Event/BeforeRenderableIsValidatedEvent.php create mode 100644 Classes/EventListener/DataStructureIdentifierListener.php create mode 100644 Classes/EventListener/FormatDateRenderableBeforeRendering.php create mode 100644 Classes/EventListener/ModifyFormDefinitionRecordActionsEventListener.php create mode 100644 Classes/EventListener/ModifyFormDefinitionRecordListRowEventListener.php create mode 100644 Classes/EventListener/ProcessFileListActionsEventListener.php create mode 100644 Classes/EventListener/TranslateDefaultValueBeforeRendering.php create mode 100644 Classes/EventListener/ValidateAdvancedPasswordRenderable.php create mode 100644 Classes/Exception.php create mode 100644 Classes/Hooks/FormDefinitionDataHandlerHook.php create mode 100644 Classes/Hooks/FormFileProvider.php create mode 100644 Classes/Hooks/ImportExportHook.php create mode 100644 Classes/Mvc/Configuration/ConfigurationManager.php create mode 100644 Classes/Mvc/Configuration/ConfigurationManagerInterface.php create mode 100644 Classes/Mvc/Configuration/Exception.php create mode 100644 Classes/Mvc/Configuration/Exception/FileWriteException.php create mode 100644 Classes/Mvc/Configuration/Exception/NoSuchFileException.php create mode 100644 Classes/Mvc/Configuration/Exception/ParseErrorException.php create mode 100644 Classes/Mvc/Configuration/FormYamlCollector.php create mode 100644 Classes/Mvc/Configuration/FormYamlConfiguration.php create mode 100644 Classes/Mvc/Configuration/TypoScriptService.php create mode 100644 Classes/Mvc/Configuration/YamlSource.php create mode 100644 Classes/Mvc/Persistence/Event/AfterFormDefinitionLoadedEvent.php create mode 100644 Classes/Mvc/Persistence/Exception.php create mode 100644 Classes/Mvc/Persistence/Exception/NoUniqueIdentifierException.php create mode 100644 Classes/Mvc/Persistence/Exception/NoUniquePersistenceIdentifierException.php create mode 100644 Classes/Mvc/Persistence/Exception/PersistenceManagerException.php create mode 100644 Classes/Mvc/Persistence/FormPersistenceManager.php create mode 100644 Classes/Mvc/Persistence/FormPersistenceManagerInterface.php create mode 100644 Classes/Mvc/ProcessingRule.php create mode 100644 Classes/Mvc/Property/Exception/TypeConverterException.php create mode 100644 Classes/Mvc/Property/PropertyMappingConfiguration.php create mode 100644 Classes/Mvc/Property/TypeConverter/FormDefinitionArrayConverter.php create mode 100644 Classes/Mvc/Property/TypeConverter/PseudoFile.php create mode 100644 Classes/Mvc/Property/TypeConverter/PseudoFileReference.php create mode 100644 Classes/Mvc/Property/TypeConverter/UploadedFileReferenceConverter.php create mode 100644 Classes/Mvc/Validation/CountValidator.php create mode 100644 Classes/Mvc/Validation/DateRangeValidator.php create mode 100644 Classes/Mvc/Validation/EmptyValidator.php create mode 100644 Classes/Mvc/Validation/Exception/InvalidValidationOptionsException.php create mode 100644 Classes/Mvc/Validation/FileSizeValidator.php create mode 100644 Classes/Mvc/Validation/MimeTypeValidator.php create mode 100644 Classes/Mvc/Validation/ObjectStorageElementValidatorInterface.php create mode 100644 Classes/Preview/FormPagePreviewRenderer.php create mode 100644 Classes/Security/HashScope.php create mode 100644 Classes/Service/CleanupFormUploadsService.php create mode 100644 Classes/Service/DatabaseService.php create mode 100644 Classes/Service/FormEditorEnrichmentService.php create mode 100644 Classes/Service/FormTransferResult.php create mode 100644 Classes/Service/FormTransferService.php create mode 100644 Classes/Service/RichTextConfigurationService.php create mode 100644 Classes/Service/TranslationService.php create mode 100644 Classes/Slot/FilePersistenceSlot.php create mode 100644 Classes/Slot/FormDefinitionPersistenceException.php create mode 100644 Classes/Slot/ResourcePublicationSlot.php create mode 100644 Classes/SoftReference/FormPersistenceIdentifierSoftReferenceParser.php create mode 100644 Classes/Storage/AbstractFileStorageAdapter.php create mode 100644 Classes/Storage/DatabaseStorageAdapter.php create mode 100644 Classes/Storage/ExtensionStorageAdapter.php create mode 100644 Classes/Storage/JsonObjectKeyOrderPreserver.php create mode 100644 Classes/Storage/Permission/DatabasePermissionChecker.php create mode 100644 Classes/Storage/Security/FormDefinitionPersistenceCommand.php create mode 100644 Classes/Storage/Security/FormDefinitionPersistenceGuard.php create mode 100644 Classes/Storage/StorageAdapterFactory.php create mode 100644 Classes/Storage/StorageAdapterInterface.php create mode 100644 Classes/Type/FormDefinitionArray.php create mode 100644 Classes/Upgrades/FileFormsToDatabaseUpgradeWizard.php create mode 100644 Classes/Utility/DateRangeValidatorPatterns.php create mode 100644 Classes/ViewHelpers/Be/MaximumFileSizeViewHelper.php create mode 100644 Classes/ViewHelpers/Be/RenderContentElementPreviewViewHelper.php create mode 100644 Classes/ViewHelpers/Form/UploadDeleteCheckboxViewHelper.php create mode 100644 Classes/ViewHelpers/Form/UploadedResourceViewHelper.php create mode 100644 Classes/ViewHelpers/FormViewHelper.php create mode 100644 Classes/ViewHelpers/GridColumnClassAutoConfigurationViewHelper.php create mode 100644 Classes/ViewHelpers/RenderAllFormValuesViewHelper.php create mode 100644 Classes/ViewHelpers/RenderFormValueViewHelper.php create mode 100644 Classes/ViewHelpers/RenderRenderableViewHelper.php create mode 100644 Classes/ViewHelpers/RenderViewHelper.php create mode 100644 Classes/ViewHelpers/TranslateElementErrorViewHelper.php create mode 100644 Classes/ViewHelpers/TranslateElementPropertyViewHelper.php create mode 100644 Configuration/Backend/Modules.php create mode 100644 Configuration/ExpressionLanguage.php create mode 100644 Configuration/Extbase/Persistence/Classes.php create mode 100644 Configuration/FlexForms/FormFramework.xml create mode 100644 Configuration/Fluid/Namespaces.php create mode 100644 Configuration/Form/Base/Finishers/Closure.yaml create mode 100644 Configuration/Form/Base/Finishers/Confirmation.yaml create mode 100644 Configuration/Form/Base/Finishers/DeleteUploads.yaml create mode 100644 Configuration/Form/Base/Finishers/EmailToReceiver.yaml create mode 100644 Configuration/Form/Base/Finishers/EmailToSender.yaml create mode 100644 Configuration/Form/Base/Finishers/FlashMessage.yaml create mode 100644 Configuration/Form/Base/Finishers/Redirect.yaml create mode 100644 Configuration/Form/Base/Finishers/SaveToDatabase.yaml create mode 100644 Configuration/Form/Base/FormElements/AdvancedPassword.yaml create mode 100644 Configuration/Form/Base/FormElements/Checkbox.yaml create mode 100644 Configuration/Form/Base/FormElements/ContentElement.yaml create mode 100644 Configuration/Form/Base/FormElements/CountrySelect.yaml create mode 100644 Configuration/Form/Base/FormElements/Date.yaml create mode 100644 Configuration/Form/Base/FormElements/Email.yaml create mode 100644 Configuration/Form/Base/FormElements/Fieldset.yaml create mode 100644 Configuration/Form/Base/FormElements/FileUpload.yaml create mode 100644 Configuration/Form/Base/FormElements/Form.yaml create mode 100644 Configuration/Form/Base/FormElements/GridColumn.yaml create mode 100644 Configuration/Form/Base/FormElements/GridRow.yaml create mode 100644 Configuration/Form/Base/FormElements/Hidden.yaml create mode 100644 Configuration/Form/Base/FormElements/Honeypot.yaml create mode 100644 Configuration/Form/Base/FormElements/ImageUpload.yaml create mode 100644 Configuration/Form/Base/FormElements/MultiCheckbox.yaml create mode 100644 Configuration/Form/Base/FormElements/MultiSelect.yaml create mode 100644 Configuration/Form/Base/FormElements/Number.yaml create mode 100644 Configuration/Form/Base/FormElements/Page.yaml create mode 100644 Configuration/Form/Base/FormElements/Password.yaml create mode 100644 Configuration/Form/Base/FormElements/RadioButton.yaml create mode 100644 Configuration/Form/Base/FormElements/SingleSelect.yaml create mode 100644 Configuration/Form/Base/FormElements/StaticText.yaml create mode 100644 Configuration/Form/Base/FormElements/SummaryPage.yaml create mode 100644 Configuration/Form/Base/FormElements/Telephone.yaml create mode 100644 Configuration/Form/Base/FormElements/Text.yaml create mode 100644 Configuration/Form/Base/FormElements/Textarea.yaml create mode 100644 Configuration/Form/Base/FormElements/Url.yaml create mode 100644 Configuration/Form/Base/Validators/Alphanumeric.yaml create mode 100644 Configuration/Form/Base/Validators/Count.yaml create mode 100644 Configuration/Form/Base/Validators/DateRange.yaml create mode 100644 Configuration/Form/Base/Validators/DateTime.yaml create mode 100644 Configuration/Form/Base/Validators/EmailAddress.yaml create mode 100644 Configuration/Form/Base/Validators/FileSize.yaml create mode 100644 Configuration/Form/Base/Validators/Float.yaml create mode 100644 Configuration/Form/Base/Validators/Integer.yaml create mode 100644 Configuration/Form/Base/Validators/NotEmpty.yaml create mode 100644 Configuration/Form/Base/Validators/Number.yaml create mode 100644 Configuration/Form/Base/Validators/NumberRange.yaml create mode 100644 Configuration/Form/Base/Validators/RegularExpression.yaml create mode 100644 Configuration/Form/Base/Validators/StringLength.yaml create mode 100644 Configuration/Form/Base/Validators/Text.yaml create mode 100644 Configuration/Form/Base/config.yaml create mode 100644 Configuration/JavaScriptModules.php create mode 100644 Configuration/RTE/FormContent.yaml create mode 100644 Configuration/RTE/FormLabel.yaml create mode 100644 Configuration/RTE/ProcessingContent.yaml create mode 100644 Configuration/RTE/ProcessingLabel.yaml create mode 100644 Configuration/Services.php create mode 100644 Configuration/Services.yaml create mode 100644 Configuration/Sets/Form/config.yaml create mode 100644 Configuration/Sets/Form/labels.xlf create mode 100644 Configuration/Sets/Form/settings.definitions.yaml create mode 100644 Configuration/Sets/Form/setup.typoscript create mode 100644 Configuration/TCA/Overrides/sys_template.php create mode 100644 Configuration/TCA/Overrides/tt_content.php create mode 100644 Configuration/TCA/form_definition.php create mode 100644 Configuration/TypoScript/setup.typoscript create mode 100644 Configuration/page.tsconfig create mode 100644 Documentation/D/Events/Index.rst create mode 100644 Documentation/D/Events/_codesnippets/_MyFormEventListener.php create mode 100644 Documentation/D/FormEditor/FormElementModel/Index.rst create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_clone.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-property-collection.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-simple.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_model-structure.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_off.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_on.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_set.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_to-string.js create mode 100644 Documentation/D/FormEditor/FormElementModel/_codesnippets/_unset.js create mode 100644 Documentation/D/FormEditor/Index.rst create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/Index.rst create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.js create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.yaml create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_publish.js create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_some-property-changed.js create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.html create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.js create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.yaml create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_subscribe.js create mode 100644 Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_view-ready.js create mode 100644 Documentation/D/FormEditor/StageTemplates/Index.rst create mode 100644 Documentation/D/FormEditor/StageTemplates/_codesnippets/_file-upload-partial.html create mode 100644 Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template-partial.html create mode 100644 Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template.yaml create mode 100644 Documentation/D/FormEditor/_codesnippets/_JavaScriptModules.php create mode 100644 Documentation/D/FormEditor/_codesnippets/_bootstrap.js create mode 100644 Documentation/D/FormEditor/_codesnippets/_prototype-setup.yaml create mode 100644 Documentation/D/FrontendRendering/Index.rst create mode 100644 Documentation/D/FrontendRendering/_CustomFormFactory.php create mode 100644 Documentation/D/FrontendRendering/_layoutRootPaths.yaml create mode 100644 Documentation/D/FrontendRendering/_partialRootPaths.yaml create mode 100644 Documentation/D/FrontendRendering/_renderFactoryClass.html create mode 100644 Documentation/D/FrontendRendering/_renderPersistenceIdentifier.html create mode 100644 Documentation/D/FrontendRendering/_templateName.yaml create mode 100644 Documentation/D/FrontendRendering/_templateRootPaths.yaml create mode 100644 Documentation/D/Index.rst create mode 100644 Documentation/E/Accessibility/Index.rst create mode 100644 Documentation/E/Finishers/Images/form_finishers_overview.png create mode 100644 Documentation/E/Finishers/Index.rst create mode 100644 Documentation/E/FormElements/Images/form_elements_advancedPassword_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_advancedPassword_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_all.png create mode 100644 Documentation/E/FormElements/Images/form_elements_checkbox_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_checkbox_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_contentElement_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_contentElement_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_datePicker_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_datePicker_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_date_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_date_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_email_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_email_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_fieldset_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_fieldset_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_fieldset_3.png create mode 100644 Documentation/E/FormElements/Images/form_elements_fileUpload_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_fileUpload_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_grid_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_grid_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_grid_3.png create mode 100644 Documentation/E/FormElements/Images/form_elements_grid_4.png create mode 100644 Documentation/E/FormElements/Images/form_elements_hidden_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_hidden_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_imageUpload_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_imageUpload_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_multiCheckbox_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_multiCheckbox_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_multiSelect_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_multiSelect_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_number_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_number_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_password_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_password_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_radioBtn_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_radioBtn_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_singleSelect_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_singleSelect_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_staticText_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_staticText_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_telephone_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_telephone_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_text_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_text_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_textarea_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_textarea_2.png create mode 100644 Documentation/E/FormElements/Images/form_elements_url_1.png create mode 100644 Documentation/E/FormElements/Images/form_elements_url_2.png create mode 100644 Documentation/E/FormElements/Index.rst create mode 100644 Documentation/E/Index.rst create mode 100644 Documentation/E/Tutorials/BasicForm/Images/10_chosenFormInCE.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/10_elementWizard.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/11_finishedForm.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/1_newForm.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/2_newForm_wizard1.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/2_newForm_wizard2.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/3_createElement_1.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/3_createElement_2.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/3_createElement_3.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/3_newForm_wizard3.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/4_lastName.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/5_email.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/6_textarea_1.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/6_textarea_2.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_1.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_2.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_3.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_4.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/85_preview.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/8_addFinisherConfirmation_1.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/8_addFinisherConfirmation_2.png create mode 100644 Documentation/E/Tutorials/BasicForm/Images/9_selectPageForForm.png create mode 100644 Documentation/E/Tutorials/BasicForm/Index.rst create mode 100644 Documentation/E/Tutorials/Index.rst create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/10_saveTheForm.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/11_selectPage.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/12_chooseForm.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/13_chooseFormDefinition.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/14_frontend_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/14_frontend_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/15_addEmail.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/16_addRedirect_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/16_addRedirect_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/17_thankYouPage.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/1_createForm.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/2_wizard_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/2_wizard_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/3_createElement_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/3_createElement_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/4_createImageUpload_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/4_createImageUpload_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/5_createStaticText_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/5_createStaticText_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/6_setOptionsForStep.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_3.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/8_preview.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_1.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_2.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_3.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_4.png create mode 100644 Documentation/E/Tutorials/PhotoContest/Index.rst create mode 100644 Documentation/E/Validators/Images/form_validators.png create mode 100644 Documentation/E/Validators/Images/form_validators_alphanumeric.png create mode 100644 Documentation/E/Validators/Images/form_validators_dateRange.png create mode 100644 Documentation/E/Validators/Images/form_validators_dateTime.png create mode 100644 Documentation/E/Validators/Images/form_validators_email.png create mode 100644 Documentation/E/Validators/Images/form_validators_fileSize.png create mode 100644 Documentation/E/Validators/Images/form_validators_floatingPointNumber.png create mode 100644 Documentation/E/Validators/Images/form_validators_integerNumber.png create mode 100644 Documentation/E/Validators/Images/form_validators_number.png create mode 100644 Documentation/E/Validators/Images/form_validators_numberOfSubmittedValues.png create mode 100644 Documentation/E/Validators/Images/form_validators_numberRange.png create mode 100644 Documentation/E/Validators/Images/form_validators_regularExpression.png create mode 100644 Documentation/E/Validators/Images/form_validators_stringLength.png create mode 100644 Documentation/E/Validators/Index.rst create mode 100644 Documentation/I/Concepts/Autocomplete/Index.rst create mode 100644 Documentation/I/Concepts/Autocomplete/_CustomFormSetupAutoCompleteOption.yaml create mode 100644 Documentation/I/Concepts/Autocomplete/_config.yaml create mode 100644 Documentation/I/Concepts/Configuration/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.php create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.yaml create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_backend-ui.yaml create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_finishersDefinition.yaml create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form.yaml create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_custom.yaml create mode 100644 Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_extended.yaml create mode 100644 Documentation/I/Concepts/Finishers/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_content_element.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_finisher.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_propertiesExcludedFromTranslation.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_form.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_example-email.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_form.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_form.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_example-redirect.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_form.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/Index.rst create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_example-fal-uploads_news.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher-multiple.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher.php.inc create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form-multiple.yaml create mode 100644 Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form.yaml create mode 100644 Documentation/I/Concepts/FormConfigurationFormDefinition/Index.rst create mode 100644 Documentation/I/Concepts/FormEditor/Index.rst create mode 100644 Documentation/I/Concepts/FormFileStorages/Index.rst create mode 100644 Documentation/I/Concepts/FormManager/Index.rst create mode 100644 Documentation/I/Concepts/FormPlugin/Index.rst create mode 100644 Documentation/I/Concepts/FrontendRendering/Index.rst create mode 100644 Documentation/I/Concepts/Index.rst create mode 100644 Documentation/I/Concepts/TargetGroupsAndMainPrinciples/Index.rst create mode 100644 Documentation/I/Concepts/Validators/Index.rst create mode 100644 Documentation/I/Concepts/Variants/Index.rst create mode 100644 Documentation/I/Config/Index.rst create mode 100644 Documentation/I/Config/formManager/Index.rst create mode 100644 Documentation/I/Config/persistenceManager/Index.rst create mode 100644 Documentation/I/Config/proto/Index.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/Index.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/Closure.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/Confirmation.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/DeleteUploads.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/EmailToReceiver.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/EmailToSender.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/FlashMessage.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/Redirect.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/finishers/SaveToDatabase.rst create mode 100644 Documentation/I/Config/proto/finishersDefinition/properties/formEngine/elements.rst.txt create mode 100644 Documentation/I/Config/proto/finishersDefinition/properties/formEngine/label.rst.txt create mode 100644 Documentation/I/Config/proto/finishersDefinition/properties/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/finishersDefinition/properties/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/finishersDefinition/properties/label.rst.txt create mode 100644 Documentation/I/Config/proto/finishersDefinition/properties/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/form/Index.rst create mode 100644 Documentation/I/Config/proto/form/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/_isTopLevelFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalCloseCancelButton.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalCloseConfirmButton.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalCloseDialogMessage.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalCloseDialogTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalInsertElementsDialogTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalInsertPagesDialogTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalRemoveElementCancelButton.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalRemoveElementConfirmButton.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogMessage.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageMessage.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalValidationErrorsConfirmButton.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/modalValidationErrorsDialogTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/paginationTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1050.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1400.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/350.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/600.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/750.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/850.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/950.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1050.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1400.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/350.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/600.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/750.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/850.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/950.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageMessage.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageMessage.rst.txt create mode 100644 Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageTitle.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/_isTopLevelFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/addQueryString.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/additionalParams.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/argumentsToBeExcludedFromQueryString.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/controllerAction.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/fluidAdditionalAttributes.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/honeypot/enable.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/honeypot/formElementToUse.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/httpEnctype.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/httpMethod.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/layoutRootPaths.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/partialRootPaths.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/skipUnknownElements.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/submitButtonLabel.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/templateRootPaths.rst.txt create mode 100644 Documentation/I/Config/proto/form/renderingOptions/translation/translationFiles.rst.txt create mode 100644 Documentation/I/Config/proto/formEditor/Index.rst create mode 100644 Documentation/I/Config/proto/formElements/Index.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/Index.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CheckboxEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CollectionElementHeaderEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FinishersEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FormElementHeaderEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/GridColumnViewPortConfigurationEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/MultiSelectEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/PropertyGridEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RemoveElementEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RequiredValidatorEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/SingleSelectEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextareaEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/Typo3WinBrowserEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidationErrorMessageEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidatorsEditor.rst create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/PropertyPath.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/TemplateName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/value.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/properties/contentElementUid.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/550.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/250.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/displayFormat.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/fluidAdditionalAttributes/pattern.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Email/validators.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/renderingOptions/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/allowedMimeTypes.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/saveToFileMount.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isGridRowFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/gridSize.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts/classPattern.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isGridRowFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/renderAsHiddenField.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/styleAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/allowedMimeTypes.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageLinkMaxWidth.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxHeight.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxWidth.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/saveToFileMount.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/250.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionValue.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/550.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Number/validators.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isTopLevelFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isTopLevelFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/nextButtonLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/previousButtonLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/250.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionValue.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/StaticText/properties/text.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isTopLevelFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isCompositeFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isTopLevelFormElement.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/nextButtonLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/previousButtonLabel.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Telephone/validators.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/300.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url.rst create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/230.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/400.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/500.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/700.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/800.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/900.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/9999.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/group.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/groupSorting.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/label.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/100.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/200.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/identifier.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/containerClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementDescription.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementErrorClassAttribute.rst.txt create mode 100644 Documentation/I/Config/proto/formElements/formElementTypes/Url/validators.rst.txt create mode 100644 Documentation/I/Config/proto/formEngine/Index.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/Index.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/properties/iconIdentifier.rst.txt create mode 100644 Documentation/I/Config/proto/validatorsDefinition/properties/implementationClassName.rst.txt create mode 100644 Documentation/I/Config/proto/validatorsDefinition/properties/label.rst.txt create mode 100644 Documentation/I/Config/proto/validatorsDefinition/properties/predefinedDefaults.rst.txt create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/Alphanumeric.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/Count.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/DateRange.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/DateTime.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/EmailAddress.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/FileSize.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/Float.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/Integer.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/NotEmpty.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/Number.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/NumberRange.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/RegularExpression.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/StringLength.rst create mode 100644 Documentation/I/Config/proto/validatorsDefinition/validators/Text.rst create mode 100644 Documentation/I/FAQ/Index.rst create mode 100644 Documentation/I/HowTos/CustomFormElement/Index.rst create mode 100644 Documentation/I/HowTos/CustomFormElement/_CustomFormSetup.yaml create mode 100644 Documentation/I/HowTos/CustomFormElement/_GenderSelect.fluid.html create mode 100644 Documentation/I/HowTos/Index.rst create mode 100644 Documentation/I/Images/basic_code_components.png create mode 100644 Documentation/I/Images/form_manager.png create mode 100644 Documentation/I/Images/javascript_module_interaction.png create mode 100644 Documentation/I/Index.rst create mode 100644 Documentation/Images/InstallActivate.png create mode 100644 Documentation/Images/SiteSet.png create mode 100644 Documentation/Includes.rst.txt create mode 100644 Documentation/Includes/_NoteFinisher.rst create mode 100644 Documentation/Index.rst create mode 100644 Documentation/Installation/Index.rst create mode 100644 Documentation/Introduction/Images/introduction_form_editor.png create mode 100644 Documentation/Introduction/Index.rst create mode 100644 Documentation/QuickStartForEditors/Index.rst create mode 100644 Documentation/QuickStartForIntegrators/Index.rst create mode 100644 Documentation/Sitemap.rst create mode 100644 Documentation/guides.xml create mode 100644 LICENSE.txt create mode 100644 README.rst create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/CheckboxEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/CollectionElementHeaderEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySelectEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySingleSelectEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/DateEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/FinishersEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/FormElementHeaderEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/GridColumnViewPortConfigurationEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/MaximumFileSizeEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/MultiSelectEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/PropertyGridEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/RemoveElementEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/RequiredValidatorEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/SingleSelectEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/TextEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/TextareaEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/Typo3WinBrowserEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/ValidationErrorMessageEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Inspector/ValidatorsEditor.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Modals/InsertElements.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Modals/InsertPages.fluid.html create mode 100644 Resources/Private/Backend/Partials/FormEditor/Modals/ValidationErrors.fluid.html create mode 100644 Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html create mode 100644 Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/BlankForm.yaml create mode 100644 Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml create mode 100644 Resources/Private/Frontend/Partials/AdvancedPassword.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Checkbox.fluid.html create mode 100644 Resources/Private/Frontend/Partials/ContentElement.fluid.html create mode 100644 Resources/Private/Frontend/Partials/CountrySelect.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Date.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Email.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Field/Field.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Field/Required.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Fieldset.fluid.html create mode 100644 Resources/Private/Frontend/Partials/FileUpload.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Form/Navigation.fluid.html create mode 100644 Resources/Private/Frontend/Partials/GridColumn.fluid.html create mode 100644 Resources/Private/Frontend/Partials/GridRow.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Hidden.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Honeypot.fluid.html create mode 100644 Resources/Private/Frontend/Partials/ImageUpload.fluid.html create mode 100644 Resources/Private/Frontend/Partials/MultiCheckbox.fluid.html create mode 100644 Resources/Private/Frontend/Partials/MultiSelect.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Number.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Page.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Password.fluid.html create mode 100644 Resources/Private/Frontend/Partials/RadioButton.fluid.html create mode 100644 Resources/Private/Frontend/Partials/SingleSelect.fluid.html create mode 100644 Resources/Private/Frontend/Partials/StaticText.fluid.html create mode 100644 Resources/Private/Frontend/Partials/SummaryPage.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Telephone.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Text.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Textarea.fluid.html create mode 100644 Resources/Private/Frontend/Partials/UnknownElement.fluid.html create mode 100644 Resources/Private/Frontend/Partials/Url.fluid.html create mode 100644 Resources/Private/Frontend/Templates/Finishers/Confirmation/Confirmation.fluid.html create mode 100644 Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.html create mode 100644 Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.txt create mode 100644 Resources/Private/Frontend/Templates/Finishers/Error.fluid.html create mode 100644 Resources/Private/Frontend/Templates/Form.fluid.html create mode 100644 Resources/Private/Frontend/Templates/Render.fluid.html create mode 100644 Resources/Private/Language/Database.xlf create mode 100644 Resources/Private/Language/Modules/form_editor.xlf create mode 100644 Resources/Private/Language/Modules/form_manager.xlf create mode 100644 Resources/Private/Language/locallang.xlf create mode 100644 Resources/Private/Language/locallang_db.xlf create mode 100644 Resources/Private/Language/locallang_formEditor_failSafeErrorHandling_javascript.xlf create mode 100644 Resources/Private/Language/locallang_formManager_javascript.xlf create mode 100644 Resources/Private/Language/locallang_form_editor_javascript.xlf create mode 100644 Resources/Private/Language/locallang_relative_date_editor.xlf create mode 100644 Resources/Private/Language/module.xlf create mode 100644 Resources/Private/Partials/Backend/FormManager/Pagination.fluid.html create mode 100644 Resources/Private/Templates/Backend/FormEditor/Index.fluid.html create mode 100644 Resources/Private/Templates/Backend/FormManager/Index.fluid.html create mode 100644 Resources/Public/Css/form.css create mode 100644 Resources/Public/Icons/Extension.svg create mode 100644 Resources/Public/JavaScript/backend/form-editor-tree-container.js create mode 100644 Resources/Public/JavaScript/backend/form-editor-tree-events.js create mode 100644 Resources/Public/JavaScript/backend/form-editor-tree.js create mode 100644 Resources/Public/JavaScript/backend/form-editor.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/component/date-editor.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/component/form-element-selector.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item-toolbar.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/component/page-stage-item.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/component/property-grid-editor.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/core.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/helper.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/inspector-component.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/mediator.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/modals-component.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/stage-component.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/tree-component-adapter.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/utility/string-utility.js create mode 100644 Resources/Public/JavaScript/backend/form-editor/view-model.js create mode 100644 Resources/Public/JavaScript/backend/form-manager.js create mode 100644 Resources/Public/JavaScript/backend/form-manager/main.js create mode 100644 Resources/Public/JavaScript/backend/form-manager/view-model.js create mode 100644 Resources/Public/JavaScript/backend/form-wizard/finisher/create-form-submission-service.js create mode 100644 Resources/Public/JavaScript/backend/form-wizard/finisher/duplicate-form-submission-service.js create mode 100644 Resources/Public/JavaScript/backend/form-wizard/form-wizard.js create mode 100644 Resources/Public/JavaScript/backend/form-wizard/steps/mode-step.js create mode 100644 Resources/Public/JavaScript/backend/form-wizard/steps/settings-step.js create mode 100644 Resources/Public/JavaScript/backend/form-wizard/steps/storage-step.js create mode 100644 Resources/Public/JavaScript/backend/helper.js create mode 100644 composer.json create mode 100644 ext_localconf.php create mode 100644 ext_tables.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57872d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/vendor/ diff --git a/Classes/Command/CleanupFormUploadsCommand.php b/Classes/Command/CleanupFormUploadsCommand.php new file mode 100644 index 0000000..63be9d9 --- /dev/null +++ b/Classes/Command/CleanupFormUploadsCommand.php @@ -0,0 +1,197 @@ +` sub-folders. + * Over time these folders accumulate — both from completed and incomplete form submissions. + * Since files are not moved upon submission, there is no way to distinguish between + * the two. This command removes form upload folders older than a configurable retention period. + * + * Usage examples: + * # Dry-run: list form upload folders older than 2 weeks (default) + * bin/typo3 form:cleanup:uploads 1:/user_upload/ --dry-run + * + * # Delete folders older than 48 hours in specific upload folders + * bin/typo3 form:cleanup:uploads 1:/user_upload/ 2:/custom_uploads/ --retention-period=48 + * + * # Force deletion without confirmation (e.g. for scheduler) + * bin/typo3 form:cleanup:uploads 1:/user_upload/ --force + */ +#[AsCommand('form:cleanup:uploads', 'Remove old form file upload folders based on retention period.')] +class CleanupFormUploadsCommand extends Command +{ + private const int DEFAULT_RETENTION_PERIOD_HOURS = 336; + + public function __construct( + private readonly CleanupFormUploadsService $cleanupService, + ) { + parent::__construct(); + } + + protected function configure(): void + { + $this + ->setHelp( + 'Removes old form upload folders (form_) that were created by file uploads ' + . 'in ext:form.' . LF . LF + . 'Since uploaded files are not moved when a form is submitted, the command cannot ' . LF + . 'distinguish between folders from completed and abandoned submissions. It uses ' . LF + . 'the folder modification time and a configurable retention period to decide ' . LF + . 'which folders to remove.' . LF . LF + . 'You must specify at least one upload folder to scan. Each form element can configure ' . LF + . 'a different saveToFileMount; pass all relevant folders as arguments.' . LF . LF + . 'Use --verbose for detailed output about each folder found.' + ) + ->addArgument( + 'upload-folder', + InputArgument::REQUIRED | InputArgument::IS_ARRAY, + 'Combined folder identifier(s) to scan (e.g. "1:/user_upload/").', + ) + ->addOption( + 'retention-period', + 'r', + InputOption::VALUE_REQUIRED, + 'Minimum age in hours before a form upload folder is considered for removal.', + (string)self::DEFAULT_RETENTION_PERIOD_HOURS, + ) + ->addOption( + 'dry-run', + null, + InputOption::VALUE_NONE, + 'Only list expired folders without deleting them.', + ) + ->addOption( + 'force', + 'f', + InputOption::VALUE_NONE, + 'Skip the confirmation question. Automatically set when using --no-interaction.', + ); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $retentionHours = (int)$input->getOption('retention-period'); + if ($retentionHours < 1) { + $io->error('The retention period must be at least 1 hour.'); + return Command::FAILURE; + } + + $maximumAgeSeconds = $retentionHours * 3600; + /** @var list $uploadFolders */ + $uploadFolders = $input->getArgument('upload-folder'); + $isDryRun = (bool)$input->getOption('dry-run'); + + $io->section(sprintf( + 'Scanning %s for form upload folders older than %d hour(s)', + 'folders: ' . implode(', ', $uploadFolders), + $retentionHours, + )); + + $expiredFolders = $this->cleanupService->getExpiredFolders($maximumAgeSeconds, $uploadFolders); + + if ($expiredFolders === []) { + $io->success('No expired form upload folders found. Nothing to do.'); + return Command::SUCCESS; + } + + if ($output->isVerbose()) { + foreach ($expiredFolders as $folder) { + $age = time() - $folder->getModificationTime(); + $ageHours = round($age / 3600, 1); + $fileCount = $folder->getFileCount(); + $io->writeln(sprintf( + ' [FOLDER] %s (age: %s hours, files: %d)', + $folder->getCombinedIdentifier(), + $ageHours, + $fileCount, + )); + } + } + + $totalFiles = 0; + foreach ($expiredFolders as $folder) { + $totalFiles += $folder->getFileCount(); + } + + $io->writeln(sprintf( + 'Found %d folder(s) containing %d file(s).', + count($expiredFolders), + $totalFiles, + )); + + if ($isDryRun) { + $io->note('Dry-run mode: no folders were deleted.'); + return Command::SUCCESS; + } + + // Do not ask for confirmation when running the command in EXT:scheduler + if (!$input->isInteractive()) { + $input->setOption('force', true); + } + + if (!$input->getOption('force')) { + /** @var QuestionHelper $questionHelper */ + $questionHelper = $this->getHelper('question'); + $question = new ConfirmationQuestion( + sprintf( + 'Are you sure you want to delete %d folder(s) with %d file(s)? [default: no] ', + count($expiredFolders), + $totalFiles, + ), + false, + ); + if (!$questionHelper->ask($input, $output, $question)) { + $io->note('Aborted by user.'); + return Command::SUCCESS; + } + } + + $result = $this->cleanupService->deleteFolders($expiredFolders); + + if ($result['deleted'] > 0) { + $io->success(sprintf('Successfully deleted %d form upload folder(s).', $result['deleted'])); + } + + if ($result['failed'] > 0) { + $io->warning(sprintf('Failed to delete %d folder(s).', $result['failed'])); + if ($output->isVerbose()) { + foreach ($result['errors'] as $error) { + $io->writeln(sprintf(' [ERROR] %s: %s', $error['folder'], $error['message'])); + } + } + } + + return $result['failed'] > 0 ? Command::FAILURE : Command::SUCCESS; + } +} diff --git a/Classes/Command/TransferFormDefinitionCommand.php b/Classes/Command/TransferFormDefinitionCommand.php new file mode 100644 index 0000000..466b0dc --- /dev/null +++ b/Classes/Command/TransferFormDefinitionCommand.php @@ -0,0 +1,285 @@ +setHelp( + 'Transfers form definitions from one storage backend to another.' . LF . LF + . 'Available storage types depend on the installed adapters. Core provides:' . LF + . ' - database: Database storage (default target)' . LF + . ' - extension: Extension paths (EXT:...)' . LF + . ' - filemount: File mount storage (deprecated since v14.2)' . LF . LF + . 'Target location (--target-location / -l) per storage type:' . LF + . ' - database: Always "0" (fixed; forms are stored at the root level).' . LF + . ' - extension: An EXT: path configured in "persistenceManager.allowedExtensionPaths",' . LF + . ' with "persistenceManager.allowSaveToExtensionPaths: true" set.' . LF + . ' e.g. --target-location="EXT:my_extension/Resources/Private/Forms/"' . LF . LF + . 'Use --dry-run to preview which forms would be transferred.' . LF + . 'Use --move to delete the source form after successful transfer.' . LF . LF + . 'After a successful transfer, content element references in "tt_content" are automatically' . LF + . 'updated to point to the new storage location. No other tables are updated.' + ) + ->addOption( + 'source', + null, + InputOption::VALUE_REQUIRED, + 'Source storage type identifier (e.g., "extension", "filemount", "database").', + ) + ->addOption( + 'target', + null, + InputOption::VALUE_REQUIRED, + 'Target storage type identifier (e.g., "database", "extension").', + ) + ->addOption( + 'target-location', + 'l', + InputOption::VALUE_REQUIRED, + 'Target storage location. For "database": always "0". For "extension": EXT: path from allowedExtensionPaths.', + '0', + ) + ->addOption( + 'form-identifier', + 'f', + InputOption::VALUE_REQUIRED, + 'Transfer only the form with this identifier. If omitted, all forms from the source are transferred.', + ) + ->addOption( + 'move', + 'm', + InputOption::VALUE_NONE, + 'Delete the source form after successful transfer (move operation).', + ) + ->addOption( + 'dry-run', + null, + InputOption::VALUE_NONE, + 'Only list forms that would be transferred without making changes.', + ); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + Bootstrap::initializeBackendAuthentication(); + + // @todo: ConfigurationManager triggered by PersistenceConfigurationService needs a Request + $request = (new ServerRequest('https://localhost/', 'GET')); + $request = $request->withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE) + ->withAttribute('normalizedParams', NormalizedParams::createFromRequest($request)); + $GLOBALS['TYPO3_REQUEST'] = $request; + + $io = new SymfonyStyle($input, $output); + $sourceType = $input->getOption('source'); + $targetType = $input->getOption('target'); + $targetLocation = $input->getOption('target-location'); + $formIdentifier = $input->getOption('form-identifier'); + $isMove = (bool)$input->getOption('move'); + $isDryRun = (bool)$input->getOption('dry-run'); + + if ($sourceType === null || $targetType === null) { + $io->error('Both --source and --target options are required.'); + $io->note(sprintf( + 'Available storage types: %s', + implode(', ', $this->formTransferService->getAvailableStorageTypes()), + )); + return Command::FAILURE; + } + + if (!$this->formTransferService->hasStorageType($sourceType)) { + $io->error(sprintf( + 'Unknown source storage type "%s". Available types: %s', + $sourceType, + implode(', ', $this->formTransferService->getAvailableStorageTypes()), + )); + return Command::FAILURE; + } + + if (!$this->formTransferService->hasStorageType($targetType)) { + $io->error(sprintf( + 'Unknown target storage type "%s". Available types: %s', + $targetType, + implode(', ', $this->formTransferService->getAvailableStorageTypes()), + )); + return Command::FAILURE; + } + + if ($sourceType === $targetType && $formIdentifier === null) { + $io->error('Source and target storage types are identical. Use --form-identifier to transfer a specific form, or choose different storage types.'); + return Command::FAILURE; + } + + $targetAdapter = $this->formTransferService->getAdapter($targetType); + if (!$targetAdapter->isAllowedStorageLocation($targetLocation)) { + $hint = match ($targetType) { + 'database' => 'For database storage the only valid location is "0" (default). The option can be omitted.', + 'extension' => 'For extension storage, provide an EXT: path that is registered in "persistenceManager.allowedExtensionPaths"' . LF + . 'and ensure "persistenceManager.allowSaveToExtensionPaths: true" is set in your form YAML setup.' . LF + . 'Example: --target-location="EXT:my_extension/Resources/Private/Forms/"', + default => 'Check the storage adapter documentation for valid location formats.', + }; + $io->error(sprintf( + 'The target location "%s" is not valid for the "%s" storage adapter.' . LF . '%s', + $targetLocation, + $targetType, + $hint, + )); + return Command::FAILURE; + } + + $sourceForms = $this->formTransferService->listSourceForms($sourceType, $formIdentifier); + + if ($sourceForms === []) { + $message = $formIdentifier !== null + ? sprintf('No form with identifier "%s" found in "%s" storage.', $formIdentifier, $sourceType) + : sprintf('No forms found in "%s" storage.', $sourceType); + $io->warning($message); + return Command::SUCCESS; + } + + $operation = $isMove ? 'move' : 'transfer'; + $io->section(sprintf( + 'Found %d form(s) to %s from "%s" to "%s"', + count($sourceForms), + $operation, + $sourceType, + $targetType, + )); + + if ($isDryRun) { + $rows = []; + foreach ($sourceForms as $form) { + $rows[] = [ + $form->identifier, + $form->name, + $form->persistenceIdentifier ?? '-', + 'would ' . $operation . '', + ]; + } + $io->table(['Identifier', 'Name', 'Source', 'Status'], $rows); + $io->note('Dry-run mode: no forms were transferred.'); + return Command::SUCCESS; + } + + $transferred = 0; + $failed = 0; + $results = []; + $migrationMap = []; + + foreach ($sourceForms as $form) { + try { + $result = $this->formTransferService->transferForm( + $form, + $sourceType, + $targetType, + $targetLocation, + $isMove, + ); + + $status = 'success'; + if ($isMove && $result->sourceDeleted) { + $status = 'moved'; + } elseif ($isMove && $result->deletionError !== null) { + $status = 'transferred, source deletion failed: ' . $result->deletionError . ''; + } + + $results[] = [ + $result->formIdentifier, + $result->formName, + $result->sourceIdentifier, + $result->targetIdentifier, + $status, + ]; + $migrationMap[$result->sourceIdentifier] = $result->targetIdentifier; + $transferred++; + } catch (\Exception $e) { + $results[] = [ + $form->identifier, + $form->name, + $form->persistenceIdentifier ?? '-', + '-', + '' . $e->getMessage() . '', + ]; + $failed++; + if ($output->isVerbose()) { + $io->error(sprintf('Failed to transfer "%s": %s', $form->identifier, $e->getMessage())); + } + } + } + + $io->table(['Identifier', 'Name', 'Source', 'Target', 'Status'], $results); + + if ($migrationMap !== []) { + $referencesUpdated = $this->formTransferService->updateContentElementReferences($migrationMap); + if ($referencesUpdated > 0) { + $io->note(sprintf('Updated %d content element reference(s).', $referencesUpdated)); + } + } + + if ($transferred > 0) { + $verb = $isMove ? 'moved' : 'transferred'; + $io->success(sprintf('Successfully %s %d form(s) from "%s" to "%s".', $verb, $transferred, $sourceType, $targetType)); + } + if ($failed > 0) { + $io->warning(sprintf('Failed to transfer %d form(s).', $failed)); + } + + return $failed > 0 ? Command::FAILURE : Command::SUCCESS; + } +} diff --git a/Classes/ConfigurationModuleProvider/FormYamlProvider.php b/Classes/ConfigurationModuleProvider/FormYamlProvider.php new file mode 100644 index 0000000..b573b93 --- /dev/null +++ b/Classes/ConfigurationModuleProvider/FormYamlProvider.php @@ -0,0 +1,69 @@ +identifier = $attributes['identifier']; + return $this; + } + + public function getIdentifier(): string + { + return $this->identifier; + } + + public function getLabel(): string + { + return $this->getLanguageService()->sL( + 'LLL:EXT:form/Resources/Private/Language/locallang.xlf:form.configuration.module.provider' + ); + } + + public function getConfiguration(): array + { + // Another hidden dependency to $GLOBALS['TYPO3_REQUEST'] made explicit here. + $request = $GLOBALS['TYPO3_REQUEST']; + $extbaseConfigurationManager = $this->extbaseConfigurationManager; + $extbaseConfigurationManager->setRequest($request); + $typoScriptSettings = $extbaseConfigurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + $configuration = $this->extFormConfigurationManager->getYamlConfiguration($typoScriptSettings, false); + ArrayUtility::naturalKeySortRecursive($configuration); + return $configuration; + } + + protected function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/Controller/FormEditorController.php b/Classes/Controller/FormEditorController.php new file mode 100644 index 0000000..cd6de1e --- /dev/null +++ b/Classes/Controller/FormEditorController.php @@ -0,0 +1,666 @@ +coreUriBuilder->buildUriFromRoute('form_manager')); + } + $formSettings = $this->getFormSettings(); + if (!$this->formPersistenceManager->isAllowedPersistenceIdentifier($formPersistenceIdentifier)) { + throw new PersistenceManagerException(sprintf('Read "%s" is not allowed', $formPersistenceIdentifier), 1614500662); + } + if (PathUtility::isExtensionPath($formPersistenceIdentifier) + && !PersistenceManagerConfiguration::fromArray($formSettings['persistenceManager'] ?? [])->allowSaveToExtensionPaths + ) { + throw new PersistenceManagerException('Edit an extension formDefinition is not allowed.', 1478265661); + } + $formDefinition = $this->formPersistenceManager->load($formPersistenceIdentifier); + if ($prototypeName === null) { + $prototypeName = $formDefinition['prototypeName'] ?? 'standard'; + } else { + // Loading a form definition with another prototype is currently not implemented but is planned in the future. + // This safety check is a preventive measure. + $selectablePrototypeNames = $this->configurationService->getSelectablePrototypeNamesDefinedInFormEditorSetup(); + if (!in_array($prototypeName, $selectablePrototypeNames, true)) { + throw new Exception(sprintf('The prototype name "%s" is not configured within "formManager.selectablePrototypesConfiguration" ', $prototypeName), 1528625039); + } + } + $formDefinition['prototypeName'] = $prototypeName; + $prototypeConfiguration = $this->configurationService->getPrototypeConfiguration($prototypeName); + $formDefinition = $this->transformFormDefinitionForFormEditor($prototypeConfiguration, $formDefinition, $formPersistenceIdentifier); + $formEditorDefinitions = $this->getFormEditorDefinitions($prototypeConfiguration); + $additionalViewModelJavaScriptModules = array_map( + static fn(string $name) => JavaScriptModuleInstruction::create($name), + $prototypeConfiguration['formEditor']['dynamicJavaScriptModules']['additionalViewModelModules'] ?? [] + ); + array_map($this->pageRenderer->getJavaScriptRenderer()->addJavaScriptModuleInstruction(...), $additionalViewModelJavaScriptModules); + $formEditorAppInitialData = [ + 'formEditorDefinitions' => $formEditorDefinitions, + 'formDefinition' => $formDefinition, + 'formPersistenceIdentifier' => $formPersistenceIdentifier, + 'prototypeName' => $prototypeName, + 'endpoints' => [ + 'formPageRenderer' => $this->uriBuilder->uriFor('renderFormPage'), + 'saveForm' => $this->uriBuilder->uriFor('saveForm'), + ], + 'additionalViewModelModules' => $additionalViewModelJavaScriptModules, + 'maximumUndoSteps' => $prototypeConfiguration['formEditor']['maximumUndoSteps'], + ]; + $moduleTemplate = $this->initializeModuleTemplate($this->request, $returnUrl); + $moduleTemplate->assign('formEditorTemplates', $this->renderFormEditorTemplates($prototypeConfiguration, $formEditorDefinitions)); + $moduleTemplate->getDocHeaderComponent()->addBreadcrumbSuffixNode(new BreadcrumbNode( + identifier: $formPersistenceIdentifier, + label: $formDefinition['label'], + icon: 'content-form', + )); + $addInlineSettings = [ + 'FormEditor' => [ + 'typo3WinBrowserUrl' => (string)$this->coreUriBuilder->buildUriFromRoute('wizard_element_browser'), + 'dateEditor' => [ + 'absolutePattern' => DateRangeValidatorPatterns::RFC3339_FULL_DATE, + ], + ], + ]; + $addInlineSettings = array_replace_recursive( + $addInlineSettings, + $prototypeConfiguration['formEditor']['addInlineSettings'] + ); + if (json_encode($formEditorAppInitialData) === false) { + throw new Exception('The form editor app data could not be encoded', 1628677079); + } + $javaScriptModules = array_map( + static fn(string $name) => JavaScriptModuleInstruction::create($name), + array_filter( + $prototypeConfiguration['formEditor']['dynamicJavaScriptModules'] ?? [], + fn(string $name) => in_array($name, self::JS_MODULE_NAMES, true), + ARRAY_FILTER_USE_KEY + ) + ); + $pageRenderer = $this->pageRenderer; + $pageRenderer->getJavaScriptRenderer()->addJavaScriptModuleInstruction( + JavaScriptModuleInstruction::create('@typo3/form/backend/helper.js', 'Helper') + ->invoke('dispatchFormEditor', $javaScriptModules, $formEditorAppInitialData) + ); + array_map($pageRenderer->getJavaScriptRenderer()->addJavaScriptModuleInstruction(...), $javaScriptModules); + $pageRenderer->addInlineSettingArray('', $addInlineSettings); + $stylesheets = $prototypeConfiguration['formEditor']['stylesheets']; + foreach ($stylesheets as $stylesheet) { + $pageRenderer->addCssFile($stylesheet); + } + $moduleTemplate->setModuleClass($this->request->getPluginName() . '_' . $this->request->getControllerName()); + $moduleTemplate->setFlashMessageQueue($this->getFlashMessageQueue()); + $moduleTemplate->setTitle( + $this->getLanguageService()->translate('title', 'form.module'), + $formDefinition['label'] + ); + return $moduleTemplate->renderResponse('Backend/FormEditor/Index'); + } + + /** + * Initialize the save action. + * This action uses the Fluid JsonView::class as view. + */ + protected function initializeSaveFormAction(): void + { + $this->assertAllowedHttpMethod($this->request, 'POST'); + $this->defaultViewObjectName = JsonView::class; + } + + /** + * Save a formDefinition which was build by the form editor. + */ + protected function saveFormAction(string $formPersistenceIdentifier, FormDefinitionArray $formDefinition): ResponseInterface + { + $formDefinition = $formDefinition->getArrayCopy(); + $event = $this->eventDispatcher->dispatch( + new BeforeFormIsSavedEvent($formPersistenceIdentifier, $formDefinition, $this->request), + ); + $formPersistenceIdentifier = $event->formPersistenceIdentifier; + $formDefinition = $event->form; + $response = [ + 'status' => 'success', + ]; + try { + if (!$this->formPersistenceManager->isAllowedPersistenceIdentifier($formPersistenceIdentifier)) { + throw new PersistenceManagerException(sprintf('Save "%s" is not allowed', $formPersistenceIdentifier), 1614500663); + } + $this->formPersistenceManager->save($formPersistenceIdentifier, $formDefinition, []); + $this->flushPageCache($formPersistenceIdentifier); + $prototypeConfiguration = $this->configurationService->getPrototypeConfiguration($formDefinition['prototypeName']); + $formDefinition = $this->transformFormDefinitionForFormEditor($prototypeConfiguration, $formDefinition, $formPersistenceIdentifier); + $response['formDefinition'] = $formDefinition; + } catch (PersistenceManagerException $e) { + $response = [ + 'status' => 'error', + 'message' => $e->getMessage(), + 'code' => $e->getCode(), + ]; + } + // saveFormAction uses the extbase JsonView::class. + // That's why we have to set the view variables in this way. + /** @var JsonView $view */ + $view = $this->view; + $view->assign('response', $response); + $view->setVariablesToRender([ + 'response', + ]); + return $this->jsonResponse(); + } + + /** + * Render a page from the formDefinition which was build by the form editor. + * Use the frontend rendering and set the form framework to preview mode. + */ + protected function renderFormPageAction( + FormDefinitionArray $formDefinition, + int $pageIndex, + ?string $prototypeName = null, + ?string $formPersistenceIdentifier = null + ): ResponseInterface { + $prototypeName = $prototypeName ?: $formDefinition['prototypeName'] ?? 'standard'; + $formDefinition = $formDefinition->getArrayCopy(); + $formDefinition['renderingOptions']['previewMode'] = true; + $formDefinition = $this->arrayFormFactory->build($formDefinition, $prototypeName, $this->request); + + if ($formPersistenceIdentifier !== null) { + $formDefinition->setRenderingOption('formPersistenceIdentifier', $formPersistenceIdentifier); + } + + $form = $formDefinition->bind($this->request); + $form->setCurrentSiteLanguage($this->buildFakeSiteLanguage(0, 0)); + $form->overrideCurrentPage($pageIndex); + return $this->htmlResponse($form->render()); + } + + protected function getFormSettings(): array + { + $typoScriptSettings = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + $formSettings = $this->extFormConfigurationManager->getYamlConfiguration($typoScriptSettings, false); + if (!isset($formSettings['formManager'])) { + // Config sub array formManager is crucial and should always exist. If it does + // not, this indicates an issue in config loading logic. Except in this case. + throw new \LogicException('Configuration could not be loaded', 1681549038); + } + return $formSettings; + } + + /** + * Build a SiteLanguage object to render the form preview with a + * specific language. + */ + protected function buildFakeSiteLanguage(int $pageId, int $languageId): SiteLanguage + { + $fakeSiteConfiguration = [ + 'languages' => [ + [ + 'languageId' => $languageId, + 'title' => 'Dummy', + 'navigationTitle' => '', + 'flag' => '', + 'locale' => '', + ], + ], + ]; + return GeneralUtility::makeInstance(Site::class, 'form-dummy', $pageId, $fakeSiteConfiguration)->getLanguageById($languageId); + } + + /** + * Prepare the formElements.*.formEditor section from the YAML settings. + * Sort all formElements into groups and add additional data. + */ + protected function getInsertRenderablesPanelConfiguration(array $prototypeConfiguration, array $formElementsDefinition, bool $isInsertPages = false): array + { + /** @var array>> $formElementsByGroup */ + $formElementsByGroup = []; + foreach ($formElementsDefinition as $formElementName => $formElementConfiguration) { + if (!isset($formElementConfiguration['group']) || ($isInsertPages && $formElementConfiguration['group'] !== 'page') || (!$isInsertPages && $formElementConfiguration['group'] === 'page')) { + continue; + } + if (!isset($formElementsByGroup[$formElementConfiguration['group']])) { + $formElementsByGroup[$formElementConfiguration['group']] = []; + } + $formElementConfiguration = $this->translationService->translateValuesRecursive( + $formElementConfiguration, + $prototypeConfiguration['formEditor']['translationFiles'] ?? [] + ); + $formElementsByGroup[$formElementConfiguration['group']][] = [ + 'identifier' => $formElementName, + 'label' => $formElementConfiguration['label'], + 'description' => $formElementConfiguration['description'] ?? '', + 'requestType' => 'event', + 'event' => 'typo3:form:insert-element-click', + 'sorting' => $formElementConfiguration['groupSorting'], + 'icon' => $formElementConfiguration['iconIdentifier'], + ]; + } + $formGroups = []; + foreach ($prototypeConfiguration['formEditor']['formElementGroups'] ?? [] as $groupName => $groupConfiguration) { + if (!isset($formElementsByGroup[$groupName])) { + continue; + } + usort($formElementsByGroup[$groupName], static function ($a, $b) { + return $a['sorting'] - $b['sorting']; + }); + $groupConfiguration = $this->translationService->translateValuesRecursive( + $groupConfiguration, + $prototypeConfiguration['formEditor']['translationFiles'] ?? [] + ); + $formGroups[$groupName] = [ + 'identifier' => $groupName, + 'items' => $formElementsByGroup[$groupName], + 'label' => $groupConfiguration['label'], + ]; + } + return $formGroups; + } + + /** + * Reduce the YAML settings by the 'formEditor' keyword. + */ + protected function getFormEditorDefinitions(array $prototypeConfiguration): array + { + $formEditorDefinitions = []; + foreach ([$prototypeConfiguration, $prototypeConfiguration['formEditor']] as $configuration) { + foreach ($configuration as $firstLevelItemKey => $firstLevelItemValue) { + if (!str_ends_with($firstLevelItemKey, 'Definition')) { + continue; + } + $reducedKey = substr($firstLevelItemKey, 0, -10); + foreach ($firstLevelItemValue as $formEditorDefinitionKey => $formEditorDefinitionValue) { + if (isset($formEditorDefinitionValue['formEditor'])) { + $formEditorDefinitionValue = array_intersect_key($formEditorDefinitionValue, array_flip(['formEditor'])); + $formEditorDefinitions[$reducedKey][$formEditorDefinitionKey] = $formEditorDefinitionValue['formEditor']; + } else { + $formEditorDefinitions[$reducedKey][$formEditorDefinitionKey] = $formEditorDefinitionValue; + } + } + } + } + $formEditorDefinitions = ArrayUtility::reIndexNumericArrayKeysRecursive($formEditorDefinitions); + $formEditorDefinitions = $this->formEditorEnrichmentService->enrichFormEditorDefinitions($formEditorDefinitions); + return $this->translationService->translateValuesRecursive( + $formEditorDefinitions, + $prototypeConfiguration['formEditor']['translationFiles'] ?? [] + ); + } + + /** + * Initialize ModuleTemplate and register docheader icons. + */ + protected function initializeModuleTemplate(RequestInterface $request, string $returnUrl = ''): ModuleTemplate + { + $moduleTemplate = $this->moduleTemplateFactory->create($request); + $getVars = $request->getArguments(); + if (isset($getVars['action']) && $getVars['action'] === 'index') { + $closeUrl = $returnUrl !== '' ? $returnUrl : (string)$this->coreUriBuilder->buildUriFromRoute('web_FormFormbuilder'); + $closeButton = $this->componentFactory->createCloseButton($closeUrl) + ->setDataAttributes(['identifier' => 'closeButton']) + ->setClasses('formeditor-element-close-form-button hidden'); + $moduleTemplate->addButtonToButtonBar($closeButton, ButtonBar::BUTTON_POSITION_LEFT, 2); + $saveButton = $this->componentFactory->createInputButton() + ->setDataAttributes(['identifier' => 'saveButton']) + ->setTitle($this->getLanguageService()->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.save_button')) + ->setName('formeditor-save-form') + ->setValue('save') + ->setClasses('formeditor-element-save-form-button hidden') + ->setIcon($this->iconFactory->getIcon('actions-document-save', IconSize::SMALL)) + ->setShowLabelText(true); + $moduleTemplate->addButtonToButtonBar($saveButton, ButtonBar::BUTTON_POSITION_LEFT, 3); + $undoButton = $this->componentFactory->createInputButton() + ->setDataAttributes(['identifier' => 'undoButton']) + ->setTitle($this->getLanguageService()->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.undo_button')) + ->setName('formeditor-undo-form') + ->setValue('undo') + ->setClasses('formeditor-element-undo-form-button hidden disabled') + ->setIcon($this->iconFactory->getIcon('actions-edit-undo', IconSize::SMALL)); + $moduleTemplate->addButtonToButtonBar($undoButton, ButtonBar::BUTTON_POSITION_LEFT, 5); + $redoButton = $this->componentFactory->createInputButton() + ->setDataAttributes(['identifier' => 'redoButton']) + ->setTitle($this->getLanguageService()->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.redo_button')) + ->setName('formeditor-redo-form') + ->setValue('redo') + ->setClasses('formeditor-element-redo-form-button hidden disabled') + ->setIcon($this->iconFactory->getIcon('actions-edit-redo', IconSize::SMALL)); + $moduleTemplate->addButtonToButtonBar($redoButton, ButtonBar::BUTTON_POSITION_LEFT, 5); + } + return $moduleTemplate; + } + + /** + * Render the form editor templates. + */ + protected function renderFormEditorTemplates(array $prototypeConfiguration, array $formEditorDefinitions): string + { + $fluidConfiguration = $prototypeConfiguration['formEditor']['formEditorFluidConfiguration'] ?? null; + $formEditorPartials = $prototypeConfiguration['formEditor']['formEditorPartials'] ?? null; + if (!isset($fluidConfiguration['templatePathAndFilename'])) { + throw new RenderingException('The option templatePathAndFilename must be set.', 1485636499); + } + if (!isset($fluidConfiguration['layoutRootPaths']) || !is_array($fluidConfiguration['layoutRootPaths'])) { + throw new RenderingException('The option layoutRootPaths must be set.', 1480294721); + } + if (!isset($fluidConfiguration['partialRootPaths']) || !is_array($fluidConfiguration['partialRootPaths'])) { + throw new RenderingException('The option partialRootPaths must be set.', 1480294722); + } + + $elementsCategories = $this->getInsertRenderablesPanelConfiguration($prototypeConfiguration, $formEditorDefinitions['formElements']); + $pagesCategories = $this->getInsertRenderablesPanelConfiguration($prototypeConfiguration, $formEditorDefinitions['formElements'], true); + $viewFactoryData = new ViewFactoryData( + templatePathAndFilename: $fluidConfiguration['templatePathAndFilename'], + partialRootPaths: $fluidConfiguration['partialRootPaths'], + layoutRootPaths: $fluidConfiguration['layoutRootPaths'], + request: $this->request, + ); + $view = $this->viewFactory->create($viewFactoryData); + $view->assignMultiple([ + 'elementsCategoriesJson' => GeneralUtility::jsonEncodeForHtmlAttribute($elementsCategories, false), + 'pagesCategoriesJson' => GeneralUtility::jsonEncodeForHtmlAttribute($pagesCategories, false), + 'formEditorPartials' => $formEditorPartials, + ]); + return $view->render(); + } + + /** + * @todo move this to FormDefinitionConversionService + */ + protected function transformFormDefinitionForFormEditor(array $prototypeConfiguration, array $formDefinition, string $formPersistenceIdentifier): array + { + /** @var array> $multiValueFormElementProperties */ + $multiValueFormElementProperties = []; + /** @var array> $multiValueFinisherProperties */ + $multiValueFinisherProperties = []; + foreach ($prototypeConfiguration['formElementsDefinition'] as $type => $configuration) { + if (!isset($configuration['formEditor']['editors'])) { + continue; + } + foreach ($configuration['formEditor']['editors'] as $editorConfiguration) { + if (($editorConfiguration['templateName'] ?? '') === 'Inspector-PropertyGridEditor') { + $multiValueFormElementProperties[$type][] = $editorConfiguration['propertyPath']; + } + } + } + foreach ($prototypeConfiguration['formElementsDefinition']['Form']['formEditor']['propertyCollections']['finishers'] ?? [] as $configuration) { + if (!isset($configuration['editors'])) { + continue; + } + foreach ($configuration['editors'] as $editorConfiguration) { + if (($editorConfiguration['templateName'] ?? '') === 'Inspector-PropertyGridEditor') { + $multiValueFinisherProperties[$configuration['identifier']][] = $editorConfiguration['propertyPath']; + } + } + } + $formDefinition = $this->filterEmptyArrays($formDefinition); + $formDefinition = $this->migrateEmailFinisherRecipients($formDefinition); + + $formDefinition = $this->transformMultiValuePropertiesForFormEditor( + $formDefinition, + 'type', + $multiValueFormElementProperties + ); + $formDefinition = $this->transformMultiValuePropertiesForFormEditor( + $formDefinition, + 'identifier', + $multiValueFinisherProperties + ); + + $rtePropertyPaths = $this->formDefinitionConversionService->extractRtePropertyPaths($prototypeConfiguration); + if ($rtePropertyPaths !== []) { + $formDefinition = $this->formDefinitionConversionService->transformRteContentForRichTextEditor( + $formDefinition, + $rtePropertyPaths + ); + } + + $formDefinition = $this->formDefinitionConversionService->sanitizeHtml($formDefinition, $rtePropertyPaths); + $formDefinition = $this->formDefinitionConversionService->addHmacData($formDefinition, $formPersistenceIdentifier); + return $this->formDefinitionConversionService->migrateFinisherConfiguration($formDefinition); + } + + /** + * Some data needs a transformation before it can be used by the + * form editor. This rules for multivalue elements like select + * elements. To ensure the right sorting if the data goes into + * javascript, we need to do transformations: + * + * [ + * '5' => '5', + * '4' => '4', + * '3' => '3' + * ] + * + * + * This method transform this into: + * + * [ + * [ + * _label => '5' + * _value => 5 + * ], + * [ + * _label => '4' + * _value => 4 + * ], + * [ + * _label => '3' + * _value => 3 + * ], + * ] + * + * @param array> $multiValueProperties + */ + protected function transformMultiValuePropertiesForFormEditor( + array $formDefinition, + string $identifierProperty, + array $multiValueProperties + ): array { + $output = $formDefinition; + foreach ($formDefinition as $key => $value) { + $identifier = $value[$identifierProperty] ?? null; + if (is_string($identifier) && array_key_exists($identifier, $multiValueProperties)) { + $multiValuePropertiesForIdentifier = $multiValueProperties[$identifier]; + foreach ($multiValuePropertiesForIdentifier as $multiValueProperty) { + if (!ArrayUtility::isValidPath($value, $multiValueProperty, '.')) { + continue; + } + $multiValuePropertyData = ArrayUtility::getValueByPath($value, $multiValueProperty, '.'); + if (!is_array($multiValuePropertyData)) { + continue; + } + $newMultiValuePropertyData = []; + foreach ($multiValuePropertyData as $k => $v) { + $newMultiValuePropertyData[] = [ + '_label' => $v, + '_value' => $k, + ]; + } + $value = ArrayUtility::setValueByPath($value, $multiValueProperty, $newMultiValuePropertyData, '.'); + } + } + $output[$key] = $value; + if (is_array($value)) { + $output[$key] = $this->transformMultiValuePropertiesForFormEditor( + $value, + $identifierProperty, + $multiValueProperties + ); + } + } + return $output; + } + + /** + * Remove keys from an array if the key value is an empty array + */ + protected function filterEmptyArrays(array $array): array + { + foreach ($array as $key => $value) { + if (!is_array($value)) { + continue; + } + if (empty($value)) { + unset($array[$key]); + continue; + } + $array[$key] = $this->filterEmptyArrays($value); + if (empty($array[$key])) { + unset($array[$key]); + } + } + return $array; + } + + /** + * Migrate single recipient options to their list successors + */ + protected function migrateEmailFinisherRecipients(array $formDefinition): array + { + foreach ($formDefinition['finishers'] ?? [] as $i => $finisherConfiguration) { + if (!in_array($finisherConfiguration['identifier'], ['EmailToSender', 'EmailToReceiver'], true)) { + continue; + } + $recipientAddress = $finisherConfiguration['options']['recipientAddress'] ?? ''; + $recipientName = $finisherConfiguration['options']['recipientName'] ?? ''; + $carbonCopyAddress = $finisherConfiguration['options']['carbonCopyAddress'] ?? ''; + $blindCarbonCopyAddress = $finisherConfiguration['options']['blindCarbonCopyAddress'] ?? ''; + $replyToAddress = $finisherConfiguration['options']['replyToAddress'] ?? ''; + if (!empty($recipientAddress)) { + $finisherConfiguration['options']['recipients'][$recipientAddress] = $recipientName; + } + if (!empty($carbonCopyAddress)) { + $finisherConfiguration['options']['carbonCopyRecipients'][$carbonCopyAddress] = ''; + } + if (!empty($blindCarbonCopyAddress)) { + $finisherConfiguration['options']['blindCarbonCopyRecipients'][$blindCarbonCopyAddress] = ''; + } + if (!empty($replyToAddress)) { + $finisherConfiguration['options']['replyToRecipients'][$replyToAddress] = ''; + } + unset( + $finisherConfiguration['options']['recipientAddress'], + $finisherConfiguration['options']['recipientName'], + $finisherConfiguration['options']['carbonCopyAddress'], + $finisherConfiguration['options']['blindCarbonCopyAddress'], + $finisherConfiguration['options']['replyToAddress'] + ); + $formDefinition['finishers'][$i] = $finisherConfiguration; + } + return $formDefinition; + } + + protected function flushPageCache(string $formPersistenceIdentifier): void + { + $pageIdList = []; + $referenceRows = $this->databaseService->getReferencesByPersistenceIdentifier($formPersistenceIdentifier); + foreach ($referenceRows as $referenceRow) { + $record = BackendUtility::getRecord($referenceRow['tablename'], $referenceRow['recuid']); + if (!$record) { + continue; + } + $pageIdList[] = $record['pid']; + } + + foreach (array_unique($pageIdList) as $pageId) { + $this->cacheManager->flushCachesInGroupByTag('pages', 'pageId_' . $pageId); + } + } + + protected function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/Controller/FormFrontendController.php b/Classes/Controller/FormFrontendController.php new file mode 100644 index 0000000..075ca8b --- /dev/null +++ b/Classes/Controller/FormFrontendController.php @@ -0,0 +1,156 @@ +settings['persistenceIdentifier'])) { + $typoScriptSettings = $this->configurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + $formDefinition = $this->formPersistenceManager->load($this->settings['persistenceIdentifier'], $typoScriptSettings, $this->request); + $formDefinition['persistenceIdentifier'] = $this->settings['persistenceIdentifier']; + $formDefinition = $this->overrideByFlexFormSettings($formDefinition); + $formDefinition = ArrayUtility::setValueByPath($formDefinition, 'renderingOptions._originalIdentifier', $formDefinition['identifier'], '.'); + $formDefinition['identifier'] .= '-' . ($this->request->getAttribute('currentContentObject')?->data['uid'] ?? ''); + } + $this->view->assign('formConfiguration', $formDefinition); + return $this->htmlResponse(); + } + + /** + * This method is used to display all pages / finishers except the + * first page because its non cached. + * + * @internal + */ + public function performAction(): ResponseInterface + { + return new ForwardResponse('render'); + } + + /** + * Override the formDefinition with additional data from the Flexform + * settings. For now, only finisher settings are overridable. + */ + protected function overrideByFlexFormSettings(array $formDefinition): array + { + $flexFormData = $this->request->getAttribute('currentContentObject')?->data['pi_flexform'] ?? []; + if (is_string($flexFormData) && $flexFormData !== '') { + $flexFormData = GeneralUtility::xml2array($flexFormData); + } + if (!is_array($flexFormData) || $flexFormData === []) { + return $formDefinition; + } + if (isset($formDefinition['finishers'])) { + $prototypeName = $formDefinition['prototypeName'] ?? 'standard'; + $prototypeConfiguration = $this->configurationService->getPrototypeConfiguration($prototypeName); + foreach ($formDefinition['finishers'] as $index => $formFinisherDefinition) { + $finisherIdentifier = $formFinisherDefinition['identifier']; + $sheetIdentifier = $this->getFlexformSheetIdentifier($formDefinition, $prototypeName, $finisherIdentifier); + $flexFormSheetSettings = $this->getFlexFormSettingsFromSheet($flexFormData, $sheetIdentifier); + if (($this->settings['overrideFinishers'] ?? false) && isset($flexFormSheetSettings['finishers'][$finisherIdentifier])) { + $prototypeFinisherDefinition = $prototypeConfiguration['finishersDefinition'][$finisherIdentifier] ?? []; + $converterDto = GeneralUtility::makeInstance( + FlexFormFinisherOverridesConverterDto::class, + $prototypeFinisherDefinition, + $formFinisherDefinition, + $finisherIdentifier, + $flexFormSheetSettings + ); + // Iterate over all `prototypes..finishersDefinition..FormEngine.elements` values + GeneralUtility::makeInstance(ArrayProcessor::class, $prototypeFinisherDefinition['FormEngine']['elements'])->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'modifyFinisherOptionsFromFlexFormOverrides', + '^(.*)(?:\.config\.type|\.section)$', + GeneralUtility::makeInstance(FinisherOptionsFlexFormOverridesConverter::class, $converterDto) + ) + ); + $formDefinition['finishers'][$index] = $converterDto->getFinisherDefinition(); + } + } + } + return $formDefinition; + } + + protected function getFlexformSheetIdentifier(array $formDefinition, string $prototypeName, string $finisherIdentifier): string + { + return md5( + implode('', [ + $formDefinition['persistenceIdentifier'], + $prototypeName, + $formDefinition['identifier'], + $finisherIdentifier, + ]) + ); + } + + protected function getFlexFormSettingsFromSheet(array $flexForm, string $sheetIdentifier): array + { + $sheetData = []; + $sheetData['data'] = array_filter( + $flexForm['data'] ?? [], + static function ($key) use ($sheetIdentifier) { + return $key === $sheetIdentifier; + }, + ARRAY_FILTER_USE_KEY + ); + if (empty($sheetData['data'])) { + return []; + } + $sheetDataXml = $this->flexFormTools->flexArray2Xml($sheetData); + return $this->flexFormTools->convertFlexFormContentToArray($sheetDataXml)['settings'] ?? []; + } +} diff --git a/Classes/Controller/FormManagerController.php b/Classes/Controller/FormManagerController.php new file mode 100644 index 0000000..46bab0f --- /dev/null +++ b/Classes/Controller/FormManagerController.php @@ -0,0 +1,569 @@ +getFormSettings(); + $hasForms = $this->formPersistenceManager->hasForms([]); + $searchCriteria = new SearchCriteria(searchTerm: trim($searchTerm), orderField: $orderField, orderDirection: $orderDirection); + $returnUrl = $this->request->getAttribute('normalizedParams')->getRequestUri(); + $forms = $hasForms ? $this->getAvailableFormDefinitions($formSettings, $searchCriteria, $returnUrl) : []; + $arrayPaginator = new ArrayPaginator($forms, $page, self::PAGINATION_MAX); + $pagination = new SimplePagination($arrayPaginator); + $moduleTemplate = $this->initializeModuleTemplate($this->request, $page, $searchTerm); + $moduleTemplate->assignMultiple([ + 'paginator' => $arrayPaginator, + 'pagination' => $pagination, + 'searchTerm' => $searchTerm, + 'orderField' => $searchCriteria->orderField, + 'orderDirection' => $searchCriteria->orderDirection, + 'hasForms' => $hasForms, + 'stylesheets' => $formSettings['formManager']['stylesheets'], + 'formManagerAppInitialData' => json_encode($this->getFormManagerAppInitialData($formSettings)), + ]); + $javaScriptModules = array_map( + static fn(string $name) => JavaScriptModuleInstruction::create($name), + array_filter( + $formSettings['formManager']['dynamicJavaScriptModules'] ?? [], + fn(string $name) => in_array($name, self::JS_MODULE_NAMES, true), + ARRAY_FILTER_USE_KEY + ) + ); + $this->pageRenderer->getJavaScriptRenderer()->addJavaScriptModuleInstruction( + JavaScriptModuleInstruction::create('@typo3/form/backend/helper.js', 'Helper') + ->invoke('dispatchFormManager', $javaScriptModules, $this->getFormManagerAppInitialData($formSettings)) + ); + array_map($this->pageRenderer->getJavaScriptRenderer()->addJavaScriptModuleInstruction(...), $javaScriptModules); + $moduleTemplate->setModuleClass($this->request->getPluginName() . '_' . $this->request->getControllerName()); + $moduleTemplate->setFlashMessageQueue($this->getFlashMessageQueue()); + $moduleTemplate->setTitle( + $this->getLanguageService()->translate('title', 'form.module') + ); + return $moduleTemplate->renderResponse('Backend/FormManager/Index'); + } + + /** + * Initialize the "create" action. + * This action uses the Fluid JsonView::class as view. + */ + protected function initializeCreateAction(): void + { + $this->assertAllowedHttpMethod($this->request, 'POST'); + $this->defaultViewObjectName = JsonView::class; + } + + /** + * Creates a new Form and redirects to the Form Editor + * + * @throws FormException + * @throws PersistenceManagerException + */ + protected function createAction(string $formName, string $templatePath, string $prototypeName, string $storage, string $storageLocation): ResponseInterface + { + $formSettings = $this->getFormSettings(); + if (!$this->formPersistenceManager->isAllowedStorageLocation($storageLocation)) { + throw new PersistenceManagerException(sprintf('Save to storage location "%s" is not allowed', $storageLocation), 1614500657); + } + if (!$this->isValidTemplatePath($formSettings, $prototypeName, $templatePath)) { + throw new FormException(sprintf('The template path "%s" is not allowed', $templatePath), 1329233410); + } + if (empty($formName)) { + throw new FormException('No form name', 1472312204); + } + $templatePath = GeneralUtility::getFileAbsFileName($templatePath); + $form = $this->yamlSource->load([$templatePath]); + $form['label'] = $formName; + $form['identifier'] = $this->formPersistenceManager->getUniqueIdentifier($this->convertFormNameToIdentifier($formName)); + $form['prototypeName'] = $prototypeName; + $formPersistenceIdentifier = $this->formPersistenceManager->getUniquePersistenceIdentifier($storage, $form['identifier'], $storageLocation); + $event = $this->eventDispatcher->dispatch( + new BeforeFormIsCreatedEvent($formPersistenceIdentifier, $form, $this->request) + ); + $formPersistenceIdentifier = $event->formPersistenceIdentifier; + $form = $event->form; + $form = ArrayUtility::stripTagsFromValuesRecursive($form); + try { + $formIdentifier = $this->formPersistenceManager->save($formPersistenceIdentifier, $form, [], $storageLocation); + $response = [ + 'status' => 'success', + 'url' => (string)$this->coreUriBuilder->buildUriFromRoute('form_editor', ['formPersistenceIdentifier' => $formIdentifier->identifier]), + ]; + } catch (PersistenceManagerException $e) { + $response = [ + 'status' => 'error', + 'message' => $e->getMessage(), + 'code' => $e->getCode(), + ]; + } + // createAction uses the Extbase JsonView::class. + // That's why we have to set the view variables in this way. + /** @var JsonView $view */ + $view = $this->view; + $view->assign('response', $response); + $view->setVariablesToRender([ + 'response', + ]); + return $this->jsonResponse(); + } + + /** + * Initialize the duplicate action. + * This action uses the Fluid JsonView::class as view. + */ + protected function initializeDuplicateAction(): void + { + $this->assertAllowedHttpMethod($this->request, 'POST'); + $this->defaultViewObjectName = JsonView::class; + } + + /** + * Duplicates a given formDefinition and redirects to the Form Editor + * + * @throws PersistenceManagerException + */ + protected function duplicateAction(string $formName, string $formPersistenceIdentifier, string $storage, string $storageLocation): ResponseInterface + { + if (!$this->formPersistenceManager->isAllowedStorageLocation($storageLocation)) { + throw new PersistenceManagerException(sprintf('Save to storage location "%s" is not allowed', $storageLocation), 1614500658); + } + if (!$this->formPersistenceManager->isAllowedPersistenceIdentifier($formPersistenceIdentifier)) { + throw new PersistenceManagerException(sprintf('Read of "%s" is not allowed', $formPersistenceIdentifier), 1614500659); + } + $formToDuplicate = $this->formPersistenceManager->load($formPersistenceIdentifier); + $formToDuplicate['label'] = $formName; + $formToDuplicate['identifier'] = $this->formPersistenceManager->getUniqueIdentifier($this->convertFormNameToIdentifier($formName)); + $formPersistenceIdentifier = $this->formPersistenceManager->getUniquePersistenceIdentifier($storage, $formToDuplicate['identifier'], $storageLocation); + $event = $this->eventDispatcher->dispatch( + new BeforeFormIsDuplicatedEvent($formPersistenceIdentifier, $formToDuplicate, $this->request) + ); + $formPersistenceIdentifier = $event->formPersistenceIdentifier; + $formToDuplicate = $event->form; + $formToDuplicate = ArrayUtility::stripTagsFromValuesRecursive($formToDuplicate); + try { + $formIdentifier = $this->formPersistenceManager->save($formPersistenceIdentifier, $formToDuplicate, [], $storageLocation); + $response = [ + 'status' => 'success', + 'url' => (string)$this->coreUriBuilder->buildUriFromRoute('form_editor', ['formPersistenceIdentifier' => $formIdentifier->identifier]), + ]; + } catch (PersistenceManagerException $e) { + $response = [ + 'status' => 'error', + 'message' => $e->getMessage(), + 'code' => $e->getCode(), + ]; + } + // createAction uses the Extbase JsonView::class. + // That's why we have to set the view variables in this way. + /** @var JsonView $view */ + $view = $this->view; + $view->assign('response', $response); + $view->setVariablesToRender([ + 'response', + ]); + return $this->jsonResponse(); + } + + /** + * Initialize the references action. + * This action uses the Fluid JsonView::class as view. + */ + protected function initializeReferencesAction(): void + { + $this->defaultViewObjectName = JsonView::class; + } + + /** + * Show references to this persistence identifier + * + * @throws PersistenceManagerException + */ + protected function referencesAction(string $formPersistenceIdentifier): ResponseInterface + { + if (!$this->formPersistenceManager->isAllowedPersistenceIdentifier($formPersistenceIdentifier)) { + throw new PersistenceManagerException(sprintf('Access to "%s" is not allowed', $formPersistenceIdentifier), 1614500661); + } + // referencesAction uses the extbase JsonView::class. + // That's why we have to set the view variables in this way. + /** @var JsonView $view */ + $view = $this->view; + $view->assign('references', $this->getProcessedReferencesRows($formPersistenceIdentifier)); + $view->assign('formPersistenceIdentifier', $formPersistenceIdentifier); + $view->setVariablesToRender([ + 'references', + 'formPersistenceIdentifier', + ]); + return $this->jsonResponse(); + } + + protected function initializeDeleteAction(): void + { + $this->assertAllowedHttpMethod($this->request, 'POST'); + $this->defaultViewObjectName = JsonView::class; + } + + /** + * Delete a formDefinition identified by the $formPersistenceIdentifier. + * + * @throws PersistenceManagerException + */ + protected function deleteAction(string $formPersistenceIdentifier): ResponseInterface + { + $formSettings = $this->getFormSettings(); + if (!$this->formPersistenceManager->isAllowedPersistenceIdentifier($formPersistenceIdentifier)) { + throw new PersistenceManagerException(sprintf('Delete "%s" is not allowed', $formPersistenceIdentifier), 1768562524); + } + + $hasReferences = !empty($this->databaseService->getReferencesByPersistenceIdentifier($formPersistenceIdentifier)); + + if ($hasReferences) { + $response = $this->getErrorResponseForDeleteAction($formSettings, $formPersistenceIdentifier); + } else { + $event = $this->eventDispatcher->dispatch( + new BeforeFormIsDeletedEvent($formPersistenceIdentifier, $this->request) + ); + if ($event->preventDeletion) { + $response = $this->getErrorResponseForDeleteAction($formSettings, $formPersistenceIdentifier); + } else { + $this->formPersistenceManager->delete($formPersistenceIdentifier, []); + $response = [ + 'status' => 'success', + 'url' => $this->uriBuilder->uriFor('index', [], 'FormManager'), + ]; + } + } + + // deleteAction uses the extbase JsonView::class. + // That's why we have to set the view variables in this way. + /** @var JsonView $view */ + $view = $this->view; + $view->assign('response', $response); + $view->setVariablesToRender([ + 'response', + ]); + return $this->jsonResponse(); + } + + protected function getErrorResponseForDeleteAction(array $formSettings, string $formPersistenceIdentifier): array + { + $controllerConfiguration = $this->translationService->translateValuesRecursive( + $formSettings['formManager']['controller'], + $formSettings['formManager']['translationFiles'] ?? [] + ); + return [ + 'status' => 'error', + 'title' => $controllerConfiguration['deleteAction']['errorTitle'], + 'message' => sprintf($controllerConfiguration['deleteAction']['errorMessage'], $formPersistenceIdentifier), + ]; + } + + protected function getFormSettings(): array + { + $typoScriptSettings = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + $formSettings = $this->extFormConfigurationManager->getYamlConfiguration($typoScriptSettings, false); + if (!isset($formSettings['formManager'])) { + // Config sub array formManager is crucial and should always exist. If it does + // not, this indicates an issue in config loading logic. Except in this case. + throw new \LogicException('Configuration could not be loaded', 1723717461); + } + return $formSettings; + } + + /** + * Returns the json encoded data which is used by the form editor + * JavaScript app. + */ + protected function getFormManagerAppInitialData(array $formSettings): array + { + $formManagerAppInitialData = [ + 'selectablePrototypesConfiguration' => $formSettings['formManager']['selectablePrototypesConfiguration'], + 'endpoints' => [ + 'create' => $this->uriBuilder->uriFor('create'), + 'duplicate' => $this->uriBuilder->uriFor('duplicate'), + 'delete' => $this->uriBuilder->uriFor('delete'), + 'references' => $this->uriBuilder->uriFor('references'), + ], + 'accessibleStorageAdapters' => $this->formPersistenceManager->getAccessibleStorageAdapters(), + ]; + $formManagerAppInitialData = ArrayUtility::reIndexNumericArrayKeysRecursive($formManagerAppInitialData); + return $this->translationService->translateValuesRecursive( + $formManagerAppInitialData, + $formSettings['formManager']['translationFiles'] ?? [] + ); + } + + /** + * List all formDefinitions which can be loaded through form persistence + * manager. Enrich this data by a reference counter. + */ + protected function getAvailableFormDefinitions(array $formSettings, SearchCriteria $searchCriteria, string $returnUrl = ''): array + { + $availableFormDefinitions = []; + + foreach ($this->formPersistenceManager->listForms($formSettings, $searchCriteria) as $formMetadata) { + + if ($formMetadata->persistenceIdentifier && !$formMetadata->invalid && !$formMetadata->readOnly) { + $editUrl = (string)$this->coreUriBuilder->buildUriFromRoute( + 'form_editor', + array_filter([ + 'formPersistenceIdentifier' => $formMetadata->persistenceIdentifier, + 'returnUrl' => $returnUrl, + ]) + ); + $formMetadata = $formMetadata->withEditUrl($editUrl); + } + + $actions = $this->getRecordActions($formMetadata->persistenceIdentifier); + $formMetadata = $formMetadata->withActions($actions); + + if ($searchCriteria->searchTerm === '' + || $this->valueContainsSearchTerm($formMetadata->name, $searchCriteria->searchTerm) + || ($formMetadata->persistenceIdentifier && $this->valueContainsSearchTerm($formMetadata->persistenceIdentifier, $searchCriteria->searchTerm)) + ) { + $availableFormDefinitions[] = $formMetadata; + } + } + + return $availableFormDefinitions; + } + + protected function valueContainsSearchTerm(string $value, string $searchTerm): bool + { + return str_contains(strtolower($value), strtolower($searchTerm)); + } + + /** + * Returns an array with information about the references for a + * formDefinition identified by $persistenceIdentifier. + */ + protected function getProcessedReferencesRows(string $persistenceIdentifier): array + { + if (empty($persistenceIdentifier)) { + throw new \InvalidArgumentException('$persistenceIdentifier must not be empty.', 1477071939); + } + $references = []; + $referenceRows = $this->databaseService->getReferencesByPersistenceIdentifier($persistenceIdentifier); + foreach ($referenceRows as $referenceRow) { + $record = $this->getRecord($referenceRow['tablename'], $referenceRow['recuid']); + if (!$record) { + continue; + } + $pageRecord = $this->getRecord('pages', $record['pid']); + $urlParameters = [ + 'edit' => [ + $referenceRow['tablename'] => [ + $referenceRow['recuid'] => 'edit', + ], + ], + 'module' => 'web_FormFormbuilder', + 'returnUrl' => $this->getModuleUrl('web_FormFormbuilder'), + ]; + $references[] = [ + 'recordPageTitle' => is_array($pageRecord) ? BackendUtility::getRecordTitle('pages', $pageRecord) : '', + 'recordTitle' => BackendUtility::getRecordTitle($referenceRow['tablename'], $record), + 'recordIcon' => $this->iconFactory->getIconForRecord($referenceRow['tablename'], $record, IconSize::SMALL)->render(), + 'recordUid' => $referenceRow['recuid'], + 'recordEditUrl' => $this->getModuleUrl('record_edit', $urlParameters), + ]; + } + return $references; + } + + /** + * Check if a given $templatePath for a given $prototypeName is valid + * and accessible. + * + * Valid template paths has to be configured within + * formManager.selectablePrototypesConfiguration.[('identifier': $prototypeName)].newFormTemplates.[('templatePath': $templatePath)] + */ + protected function isValidTemplatePath(array $formSettings, string $prototypeName, string $templatePath): bool + { + $isValid = false; + foreach ($formSettings['formManager']['selectablePrototypesConfiguration'] as $prototypesConfiguration) { + if ($prototypesConfiguration['identifier'] !== $prototypeName) { + continue; + } + foreach ($prototypesConfiguration['newFormTemplates'] as $templatesConfiguration) { + if ($templatesConfiguration['templatePath'] !== $templatePath) { + continue; + } + $isValid = true; + break; + } + } + $templatePath = GeneralUtility::getFileAbsFileName($templatePath); + if (!is_file($templatePath)) { + $isValid = false; + } + return $isValid; + } + + /** + * Returns the record actions + * + * @return array + * @throws RouteNotFoundException + */ + protected function getRecordActions(string $persistenceIdentifier): array + { + if (!MathUtility::canBeInterpretedAsInteger($persistenceIdentifier)) { + return []; + } + + $actions = []; + + // History button + $urlParameters = [ + 'element' => FormDefinitionRepository::TABLE_NAME . ':' . $persistenceIdentifier, + 'returnUrl' => $this->request->getAttribute('normalizedParams')->getRequestUri(), + ]; + $actions['recordHistoryUrl'] = (string)$this->coreUriBuilder->buildUriFromRoute('record_history', $urlParameters); + + return $actions; + } + + /** + * Init ModuleTemplate and register document header buttons + */ + protected function initializeModuleTemplate(ServerRequestInterface $request, int $page, string $searchTerm): ModuleTemplate + { + $moduleTemplate = $this->moduleTemplateFactory->create($request); + // Create new + $addFormButton = $this->componentFactory->createLinkButton() + ->setDataAttributes(['identifier' => 'newForm']) + ->setHref('#') + ->setTitle($this->getLanguageService()->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.create_new_form')) + ->setShowLabelText(true) + ->setIcon($this->iconFactory->getIcon('actions-plus', IconSize::SMALL)); + $moduleTemplate->addButtonToButtonBar($addFormButton); + // Shortcut + $arguments = []; + if ($searchTerm) { + $arguments['tx_form_web_formformbuilder']['searchTerm'] = $searchTerm; + $arguments['tx_form_web_formformbuilder']['controller'] = 'FormManager'; + } + if ($page > 1) { + $arguments['tx_form_web_formformbuilder']['page'] = $page; + $arguments['tx_form_web_formformbuilder']['controller'] = 'FormManager'; + } + $moduleTemplate->getDocHeaderComponent()->setShortcutContext( + 'web_FormFormbuilder', + $this->getLanguageService()->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:module.shortcut_name'), + $arguments + ); + return $moduleTemplate; + } + + /** + * Returns a form identifier which is the lower cased form name. + */ + protected function convertFormNameToIdentifier(string $formName): string + { + $formName = \Normalizer::normalize($formName) ?: $formName; + $formIdentifier = $this->charsetConverter->utf8_char_mapping($formName); + $formIdentifier = (string)preg_replace('/[^a-zA-Z0-9-_]/', '', $formIdentifier); + return lcfirst($formIdentifier); + } + + /** + * Wrapper used for unit testing. + */ + protected function getRecord(string $table, int $uid): ?array + { + return BackendUtility::getRecord($table, $uid); + } + + /** + * Wrapper used for unit testing. + */ + protected function getModuleUrl(string $moduleName, array $urlParameters = []): string + { + return (string)$this->coreUriBuilder->buildUriFromRoute($moduleName, $urlParameters); + } + + protected function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/DependencyInjection/FormYamlCollectorConfigurator.php b/Classes/DependencyInjection/FormYamlCollectorConfigurator.php new file mode 100644 index 0000000..258e9fd --- /dev/null +++ b/Classes/DependencyInjection/FormYamlCollectorConfigurator.php @@ -0,0 +1,129 @@ +/} with the collector. + * + * Each set directory must contain a {@code config.yaml} + * with the actual form configuration (loaded in both frontend and backend). + * + * Sets whose declared {@code name} in {@code config.yaml} appears in + * {@code $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['form']['disabledSets']} + * are skipped. + * + * @internal + */ +final readonly class FormYamlCollectorConfigurator +{ + public function __construct( + private PackageManager $packageManager, + private LoggerInterface $logger, + ) {} + + /** + * Populates the given {@see FormYamlCollector} with all auto-discovered + * form YAML configurations across all active extensions. + * + * Note: {@see $GLOBALS['TYPO3_CONF_VARS']} is read at service-instantiation + * time (not at DI-compile time), so ext_localconf.php values are available. + */ + public function configure(FormYamlCollector $collector): void + { + // Sets listed here (by their config.yaml "name" field) are excluded from loading. + // Example in ext_localconf.php: + // $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['form']['disabledSets'][] = 'vendor/set-name'; + $disabledSets = (array)($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['form']['disabledSets'] ?? []); + + foreach ($this->packageManager->getActivePackages() as $package) { + $formConfigPath = $package->getPackagePath() . 'Configuration/Form'; + + if (!is_dir($formConfigPath)) { + continue; + } + + $extensionKey = $package->getPackageKey(); + + try { + $finder = Finder::create() + ->files() + ->depth(1) + ->sortByName() + ->name('config.yaml') + ->in($formConfigPath); + } catch (\InvalidArgumentException) { + // Directory exists but is not traversable + continue; + } + + foreach ($finder as $fileInfo) { + $setDirectory = dirname($fileInfo->getPathname()); + $setDirectoryName = basename($setDirectory); + + try { + $config = Yaml::parseFile($fileInfo->getPathname()) ?? []; + } catch (ParseException $e) { + $this->logger->warning( + 'EXT:form skipped form set: could not parse config.yaml.', + [ + 'file' => $fileInfo->getPathname(), + 'error' => $e->getMessage(), + ] + ); + continue; + } + + if (!is_array($config)) { + $this->logger->warning( + 'EXT:form skipped form set: config.yaml did not return an array.', + ['file' => $fileInfo->getPathname()] + ); + continue; + } + + // Skip disabled sets. Matching is done against the declared "name" in config.yaml + // (e.g. "my-vendor/my-set"), NOT against the directory name, so that renaming + // a set directory does not break the disable list. + $declaredName = (string)($config['name'] ?? ''); + if ($declaredName !== '' && in_array($declaredName, $disabledSets, true)) { + continue; + } + + $priority = (int)($config['priority'] ?? 100); + $virtualBase = 'EXT:' . $extensionKey . '/Configuration/Form/' . $setDirectoryName . '/'; + + $collector->add(new FormYamlConfiguration( + path: $virtualBase . 'config.yaml', + priority: $priority, + setName: $declaredName, + )); + } + } + } +} diff --git a/Classes/Domain/Condition/ConditionProvider.php b/Classes/Domain/Condition/ConditionProvider.php new file mode 100644 index 0000000..ab37531 --- /dev/null +++ b/Classes/Domain/Condition/ConditionProvider.php @@ -0,0 +1,37 @@ +expressionLanguageProviders = [ + FormConditionFunctionsProvider::class, + ]; + } +} diff --git a/Classes/Domain/Condition/Functions/FormConditionFunctionsProvider.php b/Classes/Domain/Condition/Functions/FormConditionFunctionsProvider.php new file mode 100644 index 0000000..923ce19 --- /dev/null +++ b/Classes/Domain/Condition/Functions/FormConditionFunctionsProvider.php @@ -0,0 +1,70 @@ +getFormValueFunction(), + $this->getRootFormPropertyFunction(), + ]; + } + + /** + * Shortcut function to access field values + */ + protected function getFormValueFunction(): ExpressionFunction + { + return new ExpressionFunction( + 'getFormValue', + static fn() => null, // Not implemented, we only use the evaluator + static function ($arguments, $field, $default = null) { + return $arguments['formValues'][$field] ?? $default; + } + ); + } + + protected function getRootFormPropertyFunction(): ExpressionFunction + { + return new ExpressionFunction( + 'getRootFormProperty', + static fn() => null, // Not implemented, we only use the evaluator + static function ($arguments, $property) { + $formDefinition = $arguments['formRuntime']->getFormDefinition(); + try { + $value = ObjectAccess::getPropertyPath($formDefinition, $property); + } catch (\Exception) { + $value = null; + } + return $value; + } + ); + } +} diff --git a/Classes/Domain/Configuration/ArrayProcessing/ArrayProcessing.php b/Classes/Domain/Configuration/ArrayProcessing/ArrayProcessing.php new file mode 100644 index 0000000..b458591 --- /dev/null +++ b/Classes/Domain/Configuration/ArrayProcessing/ArrayProcessing.php @@ -0,0 +1,64 @@ +identifier = $identifier; + $this->expression = $expression; + $this->processor = $processor; + } + + public function getIdentifier(): string + { + return $this->identifier; + } + + public function getExpression(): string + { + return $this->expression; + } + + public function getProcessor(): callable + { + return $this->processor; + } +} diff --git a/Classes/Domain/Configuration/ArrayProcessing/ArrayProcessor.php b/Classes/Domain/Configuration/ArrayProcessing/ArrayProcessor.php new file mode 100644 index 0000000..a8569ab --- /dev/null +++ b/Classes/Domain/Configuration/ArrayProcessing/ArrayProcessor.php @@ -0,0 +1,93 @@ +data = ArrayUtility::flattenPlain($data); + } + + /** + * @param ArrayProcessing[] $processings + */ + public function forEach(...$processings): array + { + $result = []; + + $processings = $this->getValidProcessings($processings); + foreach ($this->data as $key => $value) { + foreach ($processings as $processing) { + // explicitly escaping non-escaped '#' which is used + // as PCRE delimiter in the following processing + $expression = preg_replace( + '/(?getExpression() + ); + + if (preg_match('#' . $expression . '#', $key, $matches)) { + $identifier = $processing->getIdentifier(); + $processor = $processing->getProcessor(); + $result[$identifier] = $result[$identifier] ?? []; + $result[$identifier][$key] = $processor($key, $value, $matches); + } + } + } + + return $result; + } + + /** + * @return ArrayProcessing[] + * @throws ArrayProcessorException + */ + protected function getValidProcessings(array $allProcessings): array + { + $validProcessings = []; + $identifiers = []; + foreach ($allProcessings as $processing) { + if ($processing instanceof ArrayProcessing) { + if (in_array($processing->getIdentifier(), $identifiers, true)) { + throw new ArrayProcessorException( + 'ArrayProcessing identifier must be unique.', + 1528638085 + ); + } + $identifiers[] = $processing->getIdentifier(); + $validProcessings[] = $processing; + } + } + return $validProcessings; + } +} diff --git a/Classes/Domain/Configuration/ConfigurationService.php b/Classes/Domain/Configuration/ConfigurationService.php new file mode 100644 index 0000000..51f3e38 --- /dev/null +++ b/Classes/Domain/Configuration/ConfigurationService.php @@ -0,0 +1,676 @@ +getFormSettings(); + if (!isset($formSettings['prototypes'][$prototypeName])) { + throw new PrototypeNotFoundException(sprintf('The Prototype "%s" was not found.', $prototypeName), 1475924277); + } + return $formSettings['prototypes'][$prototypeName]; + } + + /** + * Return all prototype names which are defined within "formManager.selectablePrototypesConfiguration.*.identifier" + * + * @internal + */ + public function getSelectablePrototypeNamesDefinedInFormEditorSetup(): array + { + $formSettings = $this->getFormSettings(); + $returnValue = GeneralUtility::makeInstance( + ArrayProcessor::class, + $formSettings['formManager']['selectablePrototypesConfiguration'] ?? [] + )->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'selectablePrototypeNames', + '^([\d]+)\.identifier$', + static function ($_, $value) { + return $value; + } + ) + ); + return array_values($returnValue['selectablePrototypeNames'] ?? []); + } + + /** + * Check if a form element property is defined in the form setup. + * If a form element property is defined in the form setup then it + * means that the form element property can be written by the form editor. + * A form element property can be written if the property path is defined within + * the following form editor properties: + * * formElementsDefinition..formEditor.editors..propertyPath + * * formElementsDefinition..formEditor.editors..*.propertyPath + * * formElementsDefinition..formEditor.editors..additionalElementPropertyPaths + * * formElementsDefinition..formEditor.propertyCollections...editors..additionalElementPropertyPaths + * If a form editor property "templateName" is + * "Inspector-PropertyGridEditor" or "Inspector-MultiSelectEditor" or "Inspector-ValidationErrorMessageEditor" + * it means that the form editor property "propertyPath" is interpreted as a so called "multiValueProperty". + * A "multiValueProperty" can contain any subproperties relative to the value from "propertyPath" which are valid. + * If "formElementsDefinition..formEditor.editors..templateName = Inspector-PropertyGridEditor" + * and + * "formElementsDefinition..formEditor.editors..propertyPath = options.xxx" + * then (for example) "options.xxx.yyy" is a valid property path to write. + * If you use a custom form editor "inspector editor" implementation which does not define the writable + * property paths by one of the above described inspector editor properties (e.g "propertyPath") within + * the form setup, you must provide the writable property paths via the + * AfterFormDefinitionValidationConfigurationIsBuiltEvent PSR-14 event. + * + * @internal + */ + public function isFormElementPropertyDefinedInFormEditorSetup(ValidationDto $dto): bool + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $subConfig = $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()] ?? []; + return $this->isPropertyDefinedInFormEditorSetup($dto->getPropertyPath(), $subConfig); + } + + /** + * Check if a form elements finisher|validator property is defined in the form setup. + * If a form elements finisher|validator property is defined in the form setup then it + * means that the form elements finisher|validator property can be written by the form editor. + * A form elements finisher|validator property can be written if the property path is defined within + * the following form editor properties: + * * formElementsDefinition..formEditor.propertyCollections...editors..propertyPath + * * formElementsDefinition..formEditor.propertyCollections...editors..*.propertyPath + * If a form elements finisher|validator property "templateName" is + * "Inspector-PropertyGridEditor" or "Inspector-MultiSelectEditor" or "Inspector-ValidationErrorMessageEditor" + * it means that the form editor property "propertyPath" is interpreted as a so called "multiValueProperty". + * A "multiValueProperty" can contain any subproperties relative to the value from "propertyPath" which are valid. + * If "formElementsDefinition..formEditor.propertyCollections...editors..templateName = Inspector-PropertyGridEditor" + * and + * "formElementsDefinition..formEditor.propertyCollections...editors..propertyPath = options.xxx" + * that (for example) "options.xxx.yyy" is a valid property path to write. + * If you use a custom form elements finisher|validator editor implementation which does not define the writable + * property paths by one of the above described inspector editor properties (e.g "propertyPath") within + * the form setup, you must provide the writable property paths via the + * AfterFormDefinitionValidationConfigurationIsBuiltEvent PSR-14 event. + * + * @internal + */ + public function isPropertyCollectionPropertyDefinedInFormEditorSetup(ValidationDto $dto): bool + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $subConfig = $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()]['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()] ?? []; + return $this->isPropertyDefinedInFormEditorSetup($dto->getPropertyPath(), $subConfig); + } + + /** + * If a form element editor has a property called "selectOptions" + * (e.g. editors with templateName "Inspector-SingleSelectEditor" or "Inspector-MultiSelectEditor") + * then only the defined values within the selectOptions are allowed to be written + * by the form editor. + * + * @internal + */ + public function formElementPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup( + ValidationDto $dto + ): bool { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $propertyPath = $this->getBasePropertyPathFromMultiValueFormElementProperty($dto); + return isset( + $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()]['selectOptions'][$propertyPath] + ); + } + + /** + * Get the "selectOptions" value for a form element property from the form setup. + * + * @throws PropertyException + * @internal + */ + public function getAllowedValuesForFormElementPropertyFromFormEditorSetup( + ValidationDto $dto, + bool $translated = true + ): array { + if (!$this->formElementPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup($dto)) { + throw new PropertyException( + sprintf( + 'No selectOptions found for form element type "%s" and property path "%s"', + $dto->getFormElementType(), + $dto->getPropertyPath() + ), + 1614264312 + ); + } + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $property = $translated ? 'selectOptions' : 'untranslatedSelectOptions'; + $propertyPath = $this->getBasePropertyPathFromMultiValueFormElementProperty($dto); + return $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()][$property][$propertyPath]; + } + + /** + * If a form elements finisher|validator editor has a property called "selectOptions" + * (e.g. editors with templateName "Inspector-SingleSelectEditor" or "Inspector-MultiSelectEditor") + * then only the defined values within the selectOptions are allowed to be written + * by the form editor. + * + * @internal + */ + public function propertyCollectionPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup( + ValidationDto $dto + ): bool { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $propertyPath = $this->getBasePropertyPathFromMultiValuePropertyCollectionElement($dto); + return isset( + $formDefinitionValidationConfiguration['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()]['selectOptions'][$propertyPath] + ); + } + + /** + * Get the "selectOptions" value for a form elements finisher|validator property from the form setup. + * + * @throws PropertyException + * @internal + */ + public function getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetup( + ValidationDto $dto, + bool $translated = true + ): array { + if (!$this->propertyCollectionPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup($dto)) { + throw new PropertyException( + sprintf( + 'No selectOptions found for property collection "%s" and identifier "%s" and property path "%s"', + $dto->getPropertyCollectionName(), + $dto->getPropertyCollectionElementIdentifier(), + $dto->getPropertyPath() + ), + 1614264313 + ); + } + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $property = $translated ? 'selectOptions' : 'untranslatedSelectOptions'; + $propertyPath = $this->getBasePropertyPathFromMultiValuePropertyCollectionElement($dto); + return $formDefinitionValidationConfiguration['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()][$property][$propertyPath]; + } + + protected function getBasePropertyPathFromMultiValueFormElementProperty(ValidationDto $dto): string + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $propertyPath = $dto->getPropertyPath(); + $multiValueProperties = $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()]['multiValueProperties'] ?? []; + foreach ($multiValueProperties as $multiValueProperty) { + if (str_starts_with($propertyPath, $multiValueProperty)) { + $propertyPath = $multiValueProperty; + } + } + return $propertyPath; + } + + protected function getBasePropertyPathFromMultiValuePropertyCollectionElement(ValidationDto $dto): string + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $propertyPath = $dto->getPropertyPath(); + $multiValueProperties = $formDefinitionValidationConfiguration['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()]['multiValueProperties'] ?? []; + foreach ($multiValueProperties as $multiValueProperty) { + if (str_starts_with($propertyPath, $multiValueProperty)) { + $propertyPath = $multiValueProperty; + } + } + return $propertyPath; + } + + /** + * Check if a form element property is defined in "predefinedDefaults" in the form setup. + * If a form element property is defined in the "predefinedDefaults" in the form setup then it + * means that the form element property can be written by the form editor. + * A form element default property is defined within the following form editor properties: + * * formElementsDefinition..formEditor.predefinedDefaults. = "default value" + * + * @internal + */ + public function isFormElementPropertyDefinedInPredefinedDefaultsInFormEditorSetup(ValidationDto $dto): bool + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + return isset( + $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()]['predefinedDefaults'][$dto->getPropertyPath()] + ); + } + + /** + * Get the "predefinedDefaults" value for a form element property from the form setup. + * A form element default property is defined within the following form editor properties: + * * formElementsDefinition..formEditor.predefinedDefaults. = "default value" + * + * @throws PropertyException + * @internal + */ + public function getFormElementPredefinedDefaultValueFromFormEditorSetup(ValidationDto $dto, bool $translated = true): mixed + { + if (!$this->isFormElementPropertyDefinedInPredefinedDefaultsInFormEditorSetup($dto)) { + throw new PropertyException( + sprintf( + 'No predefinedDefaults found for form element type "%s" and property path "%s"', + $dto->getFormElementType(), + $dto->getPropertyPath() + ), + 1528578401 + ); + } + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $property = $translated ? 'predefinedDefaults' : 'untranslatedPredefinedDefaults'; + return $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()][$property][$dto->getPropertyPath()]; + } + + /** + * Check if a form elements finisher|validator property is defined in "predefinedDefaults" in the form setup. + * If a form elements finisher|validator property is defined in "predefinedDefaults" in the form setup then it + * means that the form elements finisher|validator property can be written by the form editor. + * A form elements finisher|validator default property is defined within the following form editor properties: + * * ..formEditor.predefinedDefaults. = "default value" + * + * @internal + */ + public function isPropertyCollectionPropertyDefinedInPredefinedDefaultsInFormEditorSetup(ValidationDto $dto): bool + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + return isset( + $formDefinitionValidationConfiguration['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()]['predefinedDefaults'][$dto->getPropertyPath()] + ); + } + + /** + * Get the "predefinedDefaults" value for a form elements finisher|validator property from the form setup. + * A form elements finisher|validator default property is defined within the following form editor properties: + * * ..formEditor.predefinedDefaults. = "default value" + * + * @throws PropertyException + * @internal + */ + public function getPropertyCollectionPredefinedDefaultValueFromFormEditorSetup(ValidationDto $dto, bool $translated = true): mixed + { + if (!$this->isPropertyCollectionPropertyDefinedInPredefinedDefaultsInFormEditorSetup($dto)) { + throw new PropertyException( + sprintf( + 'No predefinedDefaults found for property collection "%s" and identifier "%s" and property path "%s"', + $dto->getPropertyCollectionName(), + $dto->getPropertyCollectionElementIdentifier(), + $dto->getPropertyPath() + ), + 1528578402 + ); + } + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + $property = $translated ? 'predefinedDefaults' : 'untranslatedPredefinedDefaults'; + return $formDefinitionValidationConfiguration['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()][$property][$dto->getPropertyPath()]; + } + + /** + * Check if the form element is creatable through the form editor. + * A form element is creatable if the following properties are set: + * * formElementsDefinition..formEditor.group + * * formElementsDefinition..formEditor.groupSorting + * And the value from "formElementsDefinition..formEditor.group" is + * one of the keys within "formEditor.formElementGroups" + * + * @internal + */ + public function isFormElementTypeCreatableByFormEditor(ValidationDto $dto): bool + { + if ($dto->getFormElementType() === 'Form') { + return true; + } + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + return $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()]['creatable'] ?? false; + } + + /** + * Check if the form elements finisher|validator is creatable through the form editor. + * A form elements finisher|validator is creatable if the following conditions are true: + * "formElementsDefinition..formEditor.editors..templateName = Inspector-FinishersEditor" + * or + * "formElementsDefinition..formEditor.editors..templateName = Inspector-ValidatorsEditor" + * and + * "formElementsDefinition..formEditor.editors..selectOptions..value = " + * + * @internal + */ + public function isPropertyCollectionElementIdentifierCreatableByFormEditor(ValidationDto $dto): bool + { + $formDefinitionValidationConfiguration = $this->buildFormDefinitionValidationConfigurationFromFormEditorSetup( + $dto->getPrototypeName() + ); + return $formDefinitionValidationConfiguration['formElements'][$dto->getFormElementType()]['collections'][$dto->getPropertyCollectionName()][$dto->getPropertyCollectionElementIdentifier()]['creatable'] ?? false; + } + + /** + * Check if the form elements type is defined within the form setup. + * + * @internal + */ + public function isFormElementTypeDefinedInFormSetup(ValidationDto $dto): bool + { + $prototypeConfiguration = $this->getPrototypeConfiguration($dto->getPrototypeName()); + return ArrayUtility::isValidPath( + $prototypeConfiguration, + 'formElementsDefinition.' . $dto->getFormElementType(), + '.' + ); + } + + /** + * @internal + */ + public function getAllBackendTranslationsForTranslationKeys(array $keys, string $prototypeName): array + { + $translations = []; + foreach ($keys as $key) { + if (!is_string($key)) { + continue; + } + $translations[$key] = $this->getAllBackendTranslationsForTranslationKey($key, $prototypeName); + } + return $translations; + } + + public function getAllBackendTranslationsForTranslationKey(string $key, string $prototypeName): array + { + $prototypeConfiguration = $this->getPrototypeConfiguration($prototypeName); + return $this->translationService->translateToAllBackendLanguages( + $key, + [], + $prototypeConfiguration['formEditor']['translationFiles'] ?? [] + ); + } + + protected function getFormSettings(): array + { + // @todo: This is needed for extFormConfigurationManager to apply stdWrap on TS configuration. + // Find a way to get rid of this. + $isFrontend = false; + $request = $GLOBALS['TYPO3_REQUEST'] ?? null; + if ($request instanceof ServerRequestInterface) { + $isFrontend = ApplicationType::fromRequest($request)->isFrontend(); + } + // @todo: Note this code relies on the fact that the request has been set to ExtbaseConfigurationManagerInterface already. + $typoScriptSettings = $this->extbaseConfigurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + return $this->extFormConfigurationManager->getYamlConfiguration($typoScriptSettings, $isFrontend, $isFrontend ? $request : null); + } + + /** + * Collect all the form editor configurations which are needed to check if a + * form definition property can be written or not. + */ + protected function buildFormDefinitionValidationConfigurationFromFormEditorSetup(string $prototypeName): array + { + $cacheKey = implode('_', ['buildFormDefinitionValidationConfigurationFromFormEditorSetup', $prototypeName]); + $configuration = $this->getCacheEntry($cacheKey); + if ($configuration === null) { + $prototypeConfiguration = $this->getPrototypeConfiguration($prototypeName); + $extractorDto = GeneralUtility::makeInstance(ExtractorDto::class, $prototypeConfiguration); + GeneralUtility::makeInstance(ArrayProcessor::class, $prototypeConfiguration)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'formElementPropertyPaths', + '^formElementsDefinition\.(.*)\.formEditor\.editors\.([\d]+)\.(propertyPath|.*\.propertyPath)$', + GeneralUtility::makeInstance(PropertyPathsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'formElementAdditionalElementPropertyPaths', + '^formElementsDefinition\.(.*)\.formEditor\.editors\.([\d]+)\.additionalElementPropertyPaths\.([\d]+)', + GeneralUtility::makeInstance(AdditionalElementPropertyPathsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'formElementRelativeMultiValueProperties', + '^formElementsDefinition\.(.*)\.formEditor\.editors\.([\d]+)\.templateName$', + GeneralUtility::makeInstance(MultiValuePropertiesExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'formElementSelectOptions', + '^formElementsDefinition\.(.*)\.formEditor\.editors\.([\d]+)\.selectOptions\.([\d]+)\.value$', + GeneralUtility::makeInstance(SelectOptionsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'formElementPredefinedDefaults', + '^formElementsDefinition\.(.*)\.formEditor\.predefinedDefaults\.(.+)$', + GeneralUtility::makeInstance(PredefinedDefaultsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'formElementCreatable', + '^formElementsDefinition\.(.*)\.formEditor.group$', + GeneralUtility::makeInstance(IsCreatableFormElementExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'propertyCollectionCreatable', + '^formElementsDefinition\.(.*)\.formEditor\.editors\.([\d]+)\.templateName$', + GeneralUtility::makeInstance(IsCreatablePropertyCollectionElementExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'propertyCollectionPropertyPaths', + '^formElementsDefinition\.(.*)\.formEditor\.propertyCollections\.(finishers|validators)\.([\d]+)\.editors\.([\d]+)\.(propertyPath|.*\.propertyPath)$', + GeneralUtility::makeInstance(CollectionPropertyPathsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'propertyCollectionAdditionalElementPropertyPaths', + '^formElementsDefinition\.(.*)\.formEditor\.propertyCollections\.(finishers|validators)\.([\d]+)\.editors\.([\d]+)\.additionalElementPropertyPaths\.([\d]+)', + GeneralUtility::makeInstance(AdditionalElementPropertyPathsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'propertyCollectionRelativeMultiValueProperties', + '^formElementsDefinition\.(.*)\.formEditor\.propertyCollections\.(finishers|validators)\.([\d]+)\.editors\.([\d]+)\.templateName$', + GeneralUtility::makeInstance(CollectionMultiValuePropertiesExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'propertyCollectionSelectOptions', + '^formElementsDefinition\.(.*)\.formEditor\.propertyCollections\.(finishers|validators)\.([\d]+)\.editors\.([\d]+)\.selectOptions\.([\d]+)\.value$', + GeneralUtility::makeInstance(CollectionSelectOptionsExtractor::class, $extractorDto) + ), + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'propertyCollectionPredefinedDefaults', + '^(validatorsDefinition|finishersDefinition)\.(.*)\.formEditor\.predefinedDefaults\.(.+)$', + GeneralUtility::makeInstance(CollectionPredefinedDefaultsExtractor::class, $extractorDto) + ) + ); + $configuration = $extractorDto->getResult(); + $configuration = $this->translateValues($prototypeConfiguration, $configuration); + $configuration = $this->eventDispatcher + ->dispatch(new AfterFormDefinitionValidationConfigurationIsBuiltEvent($prototypeName, $configuration)) + ->getConfiguration(); + $this->setCacheEntry($cacheKey, $configuration); + } + return $configuration; + } + + protected function isPropertyDefinedInFormEditorSetup(string $propertyPath, array $subConfig): bool + { + if (empty($subConfig)) { + return false; + } + if (in_array($propertyPath, $subConfig['propertyPaths'] ?? [], true) + || in_array($propertyPath, $subConfig['additionalElementPropertyPaths'] ?? [], true) + || in_array($propertyPath, $subConfig['additionalPropertyPaths'] ?? [], true) + ) { + return true; + } + foreach ($subConfig['multiValueProperties'] ?? [] as $relativeMultiValueProperty) { + if (str_starts_with($propertyPath, $relativeMultiValueProperty)) { + return true; + } + } + return false; + } + + protected function translateValues(array $prototypeConfiguration, array $configuration): array + { + if (isset($configuration['formElements'])) { + $configuration['formElements'] = $this->translatePredefinedDefaults( + $prototypeConfiguration, + $configuration['formElements'] + ); + $configuration['formElements'] = $this->translateSelectOptions( + $prototypeConfiguration, + $configuration['formElements'] + ); + } + foreach ($configuration['collections'] ?? [] as $name => $collections) { + $configuration['collections'][$name] = $this->translatePredefinedDefaults($prototypeConfiguration, $collections); + $configuration['collections'][$name] = $this->translateSelectOptions($prototypeConfiguration, $configuration['collections'][$name]); + } + return $configuration; + } + + protected function translatePredefinedDefaults(array $prototypeConfiguration, array $formElements): array + { + foreach ($formElements as $name => $formElement) { + if (!isset($formElement['predefinedDefaults'])) { + continue; + } + $formElement['untranslatedPredefinedDefaults'] = $formElement['predefinedDefaults']; + $formElement['predefinedDefaults'] = $this->translationService->translateValuesRecursive( + $formElement['predefinedDefaults'], + $prototypeConfiguration['formEditor']['translationFiles'] ?? [] + ); + $formElements[$name] = $formElement; + } + return $formElements; + } + + protected function translateSelectOptions(array $prototypeConfiguration, array $formElements): array + { + foreach ($formElements as $name => $formElement) { + if (empty($formElement['selectOptions']) || !is_array($formElement['selectOptions'])) { + continue; + } + $formElement['untranslatedSelectOptions'] = $formElement['selectOptions']; + $formElement['selectOptions'] = $this->translationService->translateValuesRecursive( + $formElement['selectOptions'], + $prototypeConfiguration['formEditor']['translationFiles'] ?? [] + ); + $formElements[$name] = $formElement; + } + return $formElements; + } + + protected function getCacheEntry(string $cacheKey): mixed + { + $cacheKey = 'form_' . $cacheKey; + if ($this->runtimeCache->has($cacheKey)) { + return $this->runtimeCache->get($cacheKey); + } + if ($this->assetsCache->has($cacheKey)) { + return $this->assetsCache->get($cacheKey); + } + return null; + } + + protected function setCacheEntry(string $cacheKey, mixed $value): void + { + $cacheKey = 'form_' . $cacheKey; + $this->runtimeCache->set($cacheKey, $value); + $this->assetsCache->set($cacheKey, $value); + } +} diff --git a/Classes/Domain/Configuration/Exception/ArrayProcessorException.php b/Classes/Domain/Configuration/Exception/ArrayProcessorException.php new file mode 100644 index 0000000..19620f0 --- /dev/null +++ b/Classes/Domain/Configuration/Exception/ArrayProcessorException.php @@ -0,0 +1,25 @@ +converterDto = $converterDto; + } +} diff --git a/Classes/Domain/Configuration/FlexformConfiguration/Processors/FinisherOptionGenerator.php b/Classes/Domain/Configuration/FlexformConfiguration/Processors/FinisherOptionGenerator.php new file mode 100644 index 0000000..9a84e07 --- /dev/null +++ b/Classes/Domain/Configuration/FlexformConfiguration/Processors/FinisherOptionGenerator.php @@ -0,0 +1,98 @@ +converterDto->getFinisherIdentifier(); + $finisherDefinitionFromSetup = $this->converterDto->getFinisherDefinitionFromSetup(); + $finisherDefinitionFromFormDefinition = $this->converterDto->getFinisherDefinitionFromFormDefinition(); + + try { + $elementConfiguration = ArrayUtility::getValueByPath( + $finisherDefinitionFromSetup['FormEngine']['elements'], + $optionKey, + '.' + ); + } catch (MissingArrayPathException $exception) { + return; + } + + // use the option value from the ext:form setup from the current finisher as default value + try { + $optionValue = ArrayUtility::getValueByPath( + $finisherDefinitionFromSetup, + sprintf('options.%s', $optionKey), + '.' + ); + } catch (MissingArrayPathException $exception) { + $optionValue = null; + } + + // use the option value from the form definition from the current finisher (if exists) as default value + try { + $optionValue = ArrayUtility::getValueByPath( + $finisherDefinitionFromFormDefinition, + sprintf('options.%s', $optionKey), + '.' + ); + } catch (MissingArrayPathException $exception) { + } + + if (isset($elementConfiguration['config'])) { + $elementConfiguration['config']['default'] = $optionValue; + } + + $languageService = $this->getLanguageService(); + $elementConfiguration['label'] = (string)($elementConfiguration['label'] ?? ''); + if (empty($optionValue)) { + $optionValue = $languageService->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:empty'); + } elseif (is_array($optionValue)) { + $optionValue = implode(',', $optionValue); + } + $elementConfiguration['label'] .= sprintf(' (%s: "%s")', $languageService->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:default'), $optionValue); + + $sheetElements = $this->converterDto->getResult(); + $sheetElements['settings.finishers.' . $finisherIdentifier . '.' . $optionKey] = $elementConfiguration; + + $this->converterDto->setResult($sheetElements); + } + + protected function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorDto.php b/Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorDto.php new file mode 100644 index 0000000..d843b4c --- /dev/null +++ b/Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorDto.php @@ -0,0 +1,83 @@ +finisherIdentifier = $finisherIdentifier; + $this->finisherDefinitionFromSetup = $finisherDefinitionFromSetup; + $this->finisherDefinitionFromFormDefinition = $finisherDefinitionFromFormDefinition; + } + + public function getFinisherIdentifier(): string + { + return $this->finisherIdentifier; + } + + public function getFinisherDefinitionFromSetup(): array + { + return $this->finisherDefinitionFromSetup; + } + + public function getFinisherDefinitionFromFormDefinition(): array + { + return $this->finisherDefinitionFromFormDefinition; + } + + public function getResult(): array + { + return $this->result; + } + + public function setResult(array $result): ProcessorDto + { + $this->result = $result; + + return $this; + } +} diff --git a/Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorInterface.php b/Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorInterface.php new file mode 100644 index 0000000..ac72fc7 --- /dev/null +++ b/Classes/Domain/Configuration/FlexformConfiguration/Processors/ProcessorInterface.php @@ -0,0 +1,33 @@ +converterDto = $converterDto; + $this->sessionToken = $sessionToken; + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataConverter.php b/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataConverter.php new file mode 100644 index 0000000..369cf3b --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataConverter.php @@ -0,0 +1,94 @@ +" as a sibling of the property key. + * "_orig_" is an array which contains the property value + * and a hmac hash for the property value. + * "_orig_" will be used to validate the form definition on saving. + * @see \TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService::validateFormDefinitionProperties() + * + * @param mixed $value + */ + public function __invoke(string $key, $value): void + { + $formDefinition = $this->converterDto->getFormDefinition(); + + $renderablePathParts = explode('.', $key); + array_pop($renderablePathParts); + + if (count($renderablePathParts) > 1) { + $renderablePath = implode('.', $renderablePathParts); + $currentFormElement = ArrayUtility::getValueByPath($formDefinition, $renderablePath, '.'); + } else { + $currentFormElement = $formDefinition; + } + + $propertyCollectionElements = $currentFormElement['finishers'] ?? $currentFormElement['validators'] ?? []; + $propertyCollectionName = $currentFormElement['type'] === 'Form' ? 'finishers' : 'validators'; + unset($currentFormElement['renderables'], $currentFormElement['finishers'], $currentFormElement['validators']); + + $this->converterDto + ->setRenderablePathParts($renderablePathParts) + ->setFormElementIdentifier($value); + + GeneralUtility::makeInstance(ArrayProcessor::class, $currentFormElement)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'addHmacData', + '^.*', + GeneralUtility::makeInstance( + AddHmacDataToFormElementPropertyConverter::class, + $this->converterDto, + $this->sessionToken + ) + ) + ); + + $this->converterDto->setPropertyCollectionName($propertyCollectionName); + foreach ($propertyCollectionElements as $propertyCollectionIndex => $propertyCollectionElement) { + $this->converterDto + ->setPropertyCollectionIndex((int)$propertyCollectionIndex) + ->setPropertyCollectionElementIdentifier($propertyCollectionElement['identifier']); + + GeneralUtility::makeInstance(ArrayProcessor::class, $propertyCollectionElement)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'addHmacData', + '^(?!(.*\._label|.*\._value)$).*', + GeneralUtility::makeInstance( + AddHmacDataToPropertyCollectionElementConverter::class, + $this->converterDto, + $this->sessionToken + ) + ) + ); + } + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToFormElementPropertyConverter.php b/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToFormElementPropertyConverter.php new file mode 100644 index 0000000..ee65908 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToFormElementPropertyConverter.php @@ -0,0 +1,51 @@ +converterDto->getFormDefinition(); + + $propertyPathParts = explode('.', $key); + $lastKeySegment = array_pop($propertyPathParts); + $propertyPathParts[] = '_orig_' . $lastKeySegment; + + $hashService = GeneralUtility::makeInstance(HashService::class); + $hmacValuePath = implode('.', array_merge($this->converterDto->getRenderablePathParts(), $propertyPathParts)); + $hmacValue = [ + 'value' => $value, + 'hmac' => $hashService->hmac(serialize([$this->converterDto->getFormElementIdentifier(), $key, $value]), $this->sessionToken), + ]; + + $formDefinition = ArrayUtility::setValueByPath($formDefinition, $hmacValuePath, $hmacValue, '.'); + + $this->converterDto->setFormDefinition($formDefinition); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToPropertyCollectionElementConverter.php b/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToPropertyCollectionElementConverter.php new file mode 100644 index 0000000..d1870ad --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/AddHmacDataToPropertyCollectionElementConverter.php @@ -0,0 +1,65 @@ +converterDto->getFormDefinition(); + + $propertyPathParts = explode('.', $key); + $lastKeySegment = array_pop($propertyPathParts); + $propertyPathParts[] = '_orig_' . $lastKeySegment; + + $hmacValuePath = implode('.', array_merge( + $this->converterDto->getRenderablePathParts(), + [$this->converterDto->getPropertyCollectionName(), $this->converterDto->getPropertyCollectionIndex()], + $propertyPathParts + )); + + $hashService = GeneralUtility::makeInstance(HashService::class); + $hmacValue = [ + 'value' => $value, + 'hmac' => $hashService->hmac( + serialize([ + $this->converterDto->getFormElementIdentifier(), + $this->converterDto->getPropertyCollectionName(), + $this->converterDto->getPropertyCollectionElementIdentifier(), + $key, + $value, + ]), + $this->sessionToken + ), + ]; + + $formDefinition = ArrayUtility::setValueByPath($formDefinition, $hmacValuePath, $hmacValue, '.'); + + $this->converterDto->setFormDefinition($formDefinition); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/ConverterDto.php b/Classes/Domain/Configuration/FormDefinition/Converters/ConverterDto.php new file mode 100644 index 0000000..fbacc68 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/ConverterDto.php @@ -0,0 +1,125 @@ +formDefinition = $formDefinition; + } + + public function getFormDefinition(): array + { + return $this->formDefinition; + } + + public function setFormDefinition(array $formDefinition): ConverterDto + { + $this->formDefinition = $formDefinition; + return $this; + } + + public function getRenderablePathParts(): array + { + return $this->renderablePathParts; + } + + public function setRenderablePathParts(array $renderablePathParts): ConverterDto + { + $this->renderablePathParts = $renderablePathParts; + return $this; + } + + public function getFormElementIdentifier(): string + { + return $this->formElementIdentifier; + } + + public function setFormElementIdentifier(string $formElementIdentifier): ConverterDto + { + $this->formElementIdentifier = $formElementIdentifier; + return $this; + } + + public function getPropertyCollectionIndex(): int + { + return $this->propertyCollectionIndex; + } + + public function setPropertyCollectionIndex(int $propertyCollectionIndex): ConverterDto + { + $this->propertyCollectionIndex = $propertyCollectionIndex; + return $this; + } + + public function getPropertyCollectionName(): string + { + return $this->propertyCollectionName; + } + + public function setPropertyCollectionName(string $propertyCollectionName): ConverterDto + { + $this->propertyCollectionName = $propertyCollectionName; + return $this; + } + + public function getPropertyCollectionElementIdentifier(): string + { + return $this->propertyCollectionElementIdentifier; + } + + public function setPropertyCollectionElementIdentifier(string $propertyCollectionElementIdentifier): ConverterDto + { + $this->propertyCollectionElementIdentifier = $propertyCollectionElementIdentifier; + return $this; + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/ConverterInterface.php b/Classes/Domain/Configuration/FormDefinition/Converters/ConverterInterface.php new file mode 100644 index 0000000..4c20846 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/ConverterInterface.php @@ -0,0 +1,31 @@ +converterDto = $converterDto; + } + + /** + * Used for overriding finisher options with flexform settings + * Flexform settings "win": When a setting is set in the form + * definition and in flexform the one in flexform will overwrite the + * one defined in the form definition. + * + * Here we adjust the parsed configuration and apply the overrides. + * + * @param string $_ unused in this context + * @param mixed $__ unused in this context + * @param array $matches the expression matches from the ArrayProcessor - for example matches of ^(.*)\.config\.type$ + */ + public function __invoke(string $_, $__, array $matches): void + { + [, $optionKey] = $matches; + $prototypeFinisherDefinition = $this->converterDto->getPrototypeFinisherDefinition(); + $finisherDefinition = $this->converterDto->getFinisherDefinition(); + $finisherIdentifier = $this->converterDto->getFinisherIdentifier(); + $flexFormSheetSettings = $this->converterDto->getFlexFormSheetSettings(); + + try { + $value = ArrayUtility::getValueByPath( + $flexFormSheetSettings['finishers'][$finisherIdentifier], + $optionKey, + '.' + ); + } catch (MissingArrayPathException $exception) { + return; + } + + $fieldConfiguration = $prototypeFinisherDefinition['FormEngine']['elements'][$optionKey] ?? []; + + if ($fieldConfiguration['section'] ?? false) { + if (!is_array($value) || $value === []) { + // Do not process empty values for sections + return; + } + + $processedOptionValue = []; + + foreach ($value as $optionListValue) { + $key = $optionListValue[$fieldConfiguration['sectionItemKey']]; + $value = $optionListValue[$fieldConfiguration['sectionItemValue']]; + $processedOptionValue[$key] = $value; + } + + $value = $processedOptionValue; + } + + $optionPath = 'options.' . $optionKey; + + // Skip additional translation for finisher options that were changed via flexform + if ($this->optionValueHasChanged($finisherDefinition, $optionPath, $value)) { + $finisherDefinition['options']['translation']['propertiesExcludedFromTranslation'][] = $optionKey; + } + + $finisherDefinition = ArrayUtility::setValueByPath($finisherDefinition, $optionPath, $value, '.'); + + $this->converterDto->setFinisherDefinition($finisherDefinition); + } + + /** + * Test if finisher option value differs from finisher definition. + * + * Compares the given finisher option value with the corresponding value in the + * finisher definition. Returns `true` if both values are equal, `false` otherwise. + * + * @param array $finisherDefinition + */ + protected function optionValueHasChanged(array $finisherDefinition, string $optionPath, mixed $value): bool + { + try { + return $value !== ArrayUtility::getValueByPath($finisherDefinition, $optionPath, '.'); + } catch (MissingArrayPathException) { + return true; + } + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/FinisherTranslationLanguageConverter.php b/Classes/Domain/Configuration/FormDefinition/Converters/FinisherTranslationLanguageConverter.php new file mode 100644 index 0000000..ec18535 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/FinisherTranslationLanguageConverter.php @@ -0,0 +1,54 @@ +converterDto->getFormDefinition(); + + $formDefinition = ArrayUtility::setValueByPath($formDefinition, $key, 'default', '.'); + + $hmacPropertyPathParts = explode('.', $key); + $lastKeySegment = array_pop($hmacPropertyPathParts); + $hmacPropertyPathParts[] = '_orig_' . $lastKeySegment; + $hmacValuePath = implode('.', $hmacPropertyPathParts); + + if (ArrayUtility::isValidPath($formDefinition, $hmacValuePath, '.')) { + $formDefinition = ArrayUtility::removeByPath($formDefinition, $hmacValuePath, '.'); + } + + $this->converterDto->setFormDefinition($formDefinition); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/FlexFormFinisherOverridesConverterDto.php b/Classes/Domain/Configuration/FormDefinition/Converters/FlexFormFinisherOverridesConverterDto.php new file mode 100644 index 0000000..8030fde --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/FlexFormFinisherOverridesConverterDto.php @@ -0,0 +1,83 @@ +prototypeFinisherDefinition = $prototypeFinisherDefinition; + $this->finisherDefinition = $finisherDefinition; + $this->finisherIdentifier = $finisherIdentifier; + $this->flexFormSheetSettings = $flexFormSheetSettings; + } + + public function getPrototypeFinisherDefinition(): array + { + return $this->prototypeFinisherDefinition; + } + + public function getFinisherDefinition(): array + { + return $this->finisherDefinition; + } + + public function setFinisherDefinition(array $finisherDefinition): FlexFormFinisherOverridesConverterDto + { + $this->finisherDefinition = $finisherDefinition; + + return $this; + } + + public function getFinisherIdentifier(): string + { + return $this->finisherIdentifier; + } + + public function getFlexFormSheetSettings(): array + { + return $this->flexFormSheetSettings; + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Converters/RemoveHmacDataConverter.php b/Classes/Domain/Configuration/FormDefinition/Converters/RemoveHmacDataConverter.php new file mode 100644 index 0000000..b8a5d15 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Converters/RemoveHmacDataConverter.php @@ -0,0 +1,43 @@ +") for the corresponding property. + * + * @param mixed $value + */ + public function __invoke(string $key, $value): void + { + $formDefinition = $this->converterDto->getFormDefinition(); + + $propertyPathParts = explode('.', $key); + array_pop($propertyPathParts); + $propertyPath = implode('.', $propertyPathParts); + $formDefinition = ArrayUtility::removeByPath($formDefinition, $propertyPath, '.'); + + $this->converterDto->setFormDefinition($formDefinition); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/AbstractValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/AbstractValidator.php new file mode 100644 index 0000000..da59810 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/AbstractValidator.php @@ -0,0 +1,72 @@ +currentElement = $currentElement; + $this->sessionToken = $sessionToken; + $this->validationDto = $validationDto; + } + + /** + * Builds the path in which the hmac value is expected based on the property path. + */ + protected function buildHmacDataPath(string $propertyPath): string + { + $pathParts = explode('.', $propertyPath); + $lastPathSegment = array_pop($pathParts); + $pathParts[] = '_orig_' . $lastPathSegment; + + return implode('.', $pathParts); + } + + protected function getFormDefinitionValidationService(): FormDefinitionValidationService + { + return GeneralUtility::makeInstance(FormDefinitionValidationService::class); + } + + protected function getConfigurationService(): ConfigurationService + { + return GeneralUtility::makeInstance(ConfigurationService::class); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/CollectionBasedValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/CollectionBasedValidator.php new file mode 100644 index 0000000..fd133da --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/CollectionBasedValidator.php @@ -0,0 +1,82 @@ +buildHmacDataPath($dto->getPropertyPath()); + if (ArrayUtility::isValidPath($currentElement, $hmacDataPath, '.')) { + $hmacData = ArrayUtility::getValueByPath($currentElement, $hmacDataPath, '.'); + + $hmacContent = [ + $dto->getFormElementIdentifier(), + $dto->getPropertyCollectionName(), + $dto->getPropertyCollectionElementIdentifier(), + $dto->getPropertyPath(), + ]; + + if (!$this->getFormDefinitionValidationService()->isPropertyValueEqualToHistoricalValue($hmacContent, $value, $hmacData, $sessionToken)) { + $message = 'The value "%s" of property "%s" (form element "%s" / "%s.%s") is not equal to the historical value "%s" #1528591586'; + throw new PropertyException( + sprintf( + $message, + $value, + $dto->getPropertyPath(), + $dto->getFormElementIdentifier(), + $dto->getPropertyCollectionName(), + $dto->getPropertyCollectionElementIdentifier(), + $hmacData['value'] ?? '' + ), + 1528591586 + ); + } + } else { + $message = 'No hmac found for property "%s" (form element "%s" / "%s.%s") #1528591585'; + throw new PropertyException( + sprintf( + $message, + $dto->getPropertyPath(), + $dto->getFormElementIdentifier(), + $dto->getPropertyCollectionName(), + $dto->getPropertyCollectionElementIdentifier() + ), + 1528591585 + ); + } + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidator.php new file mode 100644 index 0000000..03abb1b --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidator.php @@ -0,0 +1,170 @@ +validationDto->withPropertyPath($key); + + if ($this->getConfigurationService()->isFormElementPropertyDefinedInFormEditorSetup($dto)) { + if ($this->getConfigurationService()->formElementPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup($dto)) { + $this->validateFormElementValue($value, $dto); + } + } elseif ( + $this->getConfigurationService()->isFormElementPropertyDefinedInPredefinedDefaultsInFormEditorSetup($dto) + && !ArrayUtility::isValidPath($this->currentElement, $this->buildHmacDataPath($dto->getPropertyPath()), '.') + ) { + $this->validateFormElementPredefinedDefaultValue($value, $dto); + } else { + $this->validateFormElementPropertyValueByHmacData( + $this->currentElement, + $value, + $this->sessionToken, + $dto + ); + } + } + + /** + * Throws an exception if the value from a form element property + * does not match the default value from the form editor setup. + * + * @param mixed $value + * @throws PropertyException + */ + protected function validateFormElementPredefinedDefaultValue( + $value, + ValidationDto $dto + ): void { + // If the form element is newly created, we have to compare the $value (form definition) with $predefinedDefaultValue (form setup) + // to check the integrity (at this time we don't have a hmac for the $value to check the integrity) + $predefinedDefaultValue = $this->getConfigurationService()->getFormElementPredefinedDefaultValueFromFormEditorSetup($dto); + if ($value !== $predefinedDefaultValue) { + $throwException = true; + + if (is_string($predefinedDefaultValue)) { + // Last chance: + // Get all translations (from all backend languages) for the untranslated! $predefinedDefaultValue and + // compare the (already translated) $value (from the form definition) against the possible + // translations from $predefinedDefaultValue. + // Usecase: + // * backend language is EN + // * open the form editor and add a ContentElement form element + // * switch to another browser tab and change the backend language to DE + // * clear the cache + // * go back to the form editor and click the save button + // Out of scope: + // * the same scenario as above + delete the previous chosen backend language within the maintenance tool + $untranslatedPredefinedDefaultValue = $this->getConfigurationService()->getFormElementPredefinedDefaultValueFromFormEditorSetup($dto, false); + $translations = $this->getConfigurationService()->getAllBackendTranslationsForTranslationKey( + $untranslatedPredefinedDefaultValue, + $dto->getPrototypeName() + ); + + if (in_array($value, $translations, true)) { + $throwException = false; + } + } + + if ($throwException) { + $message = 'The value "%s" of property "%s" (form element "%s") is not equal to the default value "%s" #1528588035'; + throw new PropertyException( + sprintf( + $message, + $value, + $dto->getPropertyPath(), + $dto->getFormElementIdentifier(), + $predefinedDefaultValue + ), + 1528588035 + ); + } + } + } + + /** + * Throws an exception if the value from a form element property + * does not match the allowed set of values (defined within the form setup). + * + * @param mixed $value + * @throws PropertyException + */ + protected function validateFormElementValue( + $value, + ValidationDto $dto + ): void { + $allowedValues = $this->getConfigurationService()->getAllowedValuesForFormElementPropertyFromFormEditorSetup($dto); + + if (!in_array($value, $allowedValues, true)) { + $untranslatedAllowedValues = $this->getConfigurationService()->getAllowedValuesForFormElementPropertyFromFormEditorSetup($dto, false); + // Compare the $value against the untranslated set of allowed values + if (in_array($value, $untranslatedAllowedValues, true)) { + // All good, $value is within the untranslated set of allowed values + return; + } + // Get all translations (from all backend languages) for the untranslated! $allowedValues and + // compare the (already translated) $value (from the form definition) against all possible + // translations for $untranslatedAllowedValues. + $allPossibleAllowedValuesTranslations = $this->getConfigurationService()->getAllBackendTranslationsForTranslationKeys( + $untranslatedAllowedValues, + $dto->getPrototypeName() + ); + + foreach ($allPossibleAllowedValuesTranslations as $translations) { + if (in_array($value, $translations, true)) { + // All good, $value is within the set of translated allowed values + return; + } + } + + // Last chance: + // If $value is not configured within the form setup as an allowed value + // but was written within the form definition by hand (and therefore contains a hmac), + // check if $value is manipulated. + // If $value has no hmac or if the hmac exists but is not valid, + // then $this->validatePropertyCollectionElementPropertyValueByHmacData() will + // throw an exception. + $this->validateFormElementPropertyValueByHmacData( + $this->currentElement, + $value, + $this->sessionToken, + $dto + ); + } + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidator.php new file mode 100644 index 0000000..c200d88 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidator.php @@ -0,0 +1,165 @@ +validationDto->withPropertyPath($key); + + if ($this->getConfigurationService()->isPropertyCollectionPropertyDefinedInFormEditorSetup($dto)) { + if ($this->getConfigurationService()->propertyCollectionPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup($dto)) { + $this->validatePropertyCollectionPropertyValue($value, $dto); + } + } elseif ( + $this->getConfigurationService()->isPropertyCollectionPropertyDefinedInPredefinedDefaultsInFormEditorSetup($dto) + && !ArrayUtility::isValidPath($this->currentElement, $this->buildHmacDataPath($dto->getPropertyPath()), '.') + ) { + $this->validatePropertyCollectionElementPredefinedDefaultValue($value, $dto); + } else { + $this->validatePropertyCollectionElementPropertyValueByHmacData( + $this->currentElement, + $value, + $this->sessionToken, + $dto + ); + } + } + + /** + * Throws an exception if the value from a property collection property + * does not match the default value from the form editor setup. + * + * @param mixed $value + * @throws PropertyException + */ + protected function validatePropertyCollectionElementPredefinedDefaultValue( + $value, + ValidationDto $dto + ): void { + // If the property collection element is newly created, we have to compare the $value (form definition) with $predefinedDefaultValue (form setup) + // to check the integrity (at this time we don't have a hmac on the value to check the integrity) + $predefinedDefaultValue = $this->getConfigurationService()->getPropertyCollectionPredefinedDefaultValueFromFormEditorSetup($dto); + if ($value !== $predefinedDefaultValue) { + $throwException = true; + + if (is_string($predefinedDefaultValue)) { + // Last chance: + // Get all translations (from all backend languages) for the untranslated! $predefinedDefaultValue and + // compare the (already translated) $value (from the form definition) against the possible + // translations from $predefinedDefaultValue. + $untranslatedPredefinedDefaultValue = $this->getConfigurationService()->getPropertyCollectionPredefinedDefaultValueFromFormEditorSetup($dto, false); + $translations = $this->getConfigurationService()->getAllBackendTranslationsForTranslationKey( + $untranslatedPredefinedDefaultValue, + $dto->getPrototypeName() + ); + + if (in_array($value, $translations, true)) { + $throwException = false; + } + } + + if ($throwException) { + $message = 'The value "%s" of property "%s" (form element "%s" / "%s.%s") is not equal to the default value "%s" #1528591502'; + throw new PropertyException( + sprintf( + $message, + $value, + $dto->getPropertyPath(), + $dto->getFormElementIdentifier(), + $dto->getPropertyCollectionName(), + $dto->getPropertyCollectionElementIdentifier(), + $predefinedDefaultValue + ), + 1528591502 + ); + } + } + } + + /** + * Throws an exception if the value from a property collection property + * does not match the allowed set of values (defined within the form setup). + * + * @param mixed $value + * @throws PropertyException + */ + protected function validatePropertyCollectionPropertyValue( + $value, + ValidationDto $dto + ): void { + $allowedValues = $this->getConfigurationService()->getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetup($dto); + + if (!in_array($value, $allowedValues, true)) { + $untranslatedAllowedValues = $this->getConfigurationService()->getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetup($dto, false); + // Compare the $value against the untranslated set of allowed values + if (in_array($value, $untranslatedAllowedValues, true)) { + // All good, $value is within the untranslated set of allowed values + return; + } + // Get all translations (from all backend languages) for the untranslated! $allowedValues and + // compare the (already translated) $value (from the form definition) against all possible + // translations for $untranslatedAllowedValues. + $allPossibleAllowedValuesTranslations = $this->getConfigurationService()->getAllBackendTranslationsForTranslationKeys( + $untranslatedAllowedValues, + $dto->getPrototypeName() + ); + + foreach ($allPossibleAllowedValuesTranslations as $translations) { + if (in_array($value, $translations, true)) { + // All good, $value is within the set of translated allowed values + return; + } + } + + // Last chance: + // If $value is not configured within the form setup as an allowed value + // but was written within the form definition by hand (and therefore contains a hmac), + // check if $value is manipulated. + // If $value has no hmac or if the hmac exists but is not valid, + // then $this->validatePropertyCollectionElementPropertyValueByHmacData() will + // throw an exception. + $this->validatePropertyCollectionElementPropertyValueByHmacData( + $this->currentElement, + $value, + $this->sessionToken, + $dto + ); + } + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/ElementBasedValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/ElementBasedValidator.php new file mode 100644 index 0000000..d7e1e1a --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/ElementBasedValidator.php @@ -0,0 +1,68 @@ +buildHmacDataPath($dto->getPropertyPath()); + if (ArrayUtility::isValidPath($currentElement, $hmacDataPath, '.')) { + $hmacData = ArrayUtility::getValueByPath($currentElement, $hmacDataPath, '.'); + + $hmacContent = [$dto->getFormElementIdentifier(), $dto->getPropertyPath()]; + if (!$this->getFormDefinitionValidationService()->isPropertyValueEqualToHistoricalValue($hmacContent, $value, $hmacData, $sessionToken)) { + $message = 'The value "%s" of property "%s" (form element "%s") is not equal to the historical value "%s" #1528588036'; + throw new PropertyException( + sprintf( + $message, + $value, + $dto->getPropertyPath(), + $dto->getFormElementIdentifier(), + $hmacData['value'] ?? '' + ), + 1528588036 + ); + } + } else { + $message = 'No hmac found for property "%s" (form element "%s") #1528588037'; + throw new PropertyException( + sprintf($message, $dto->getPropertyPath(), $dto->getFormElementIdentifier()), + 1528588037 + ); + } + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/FormElementHmacDataValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/FormElementHmacDataValidator.php new file mode 100644 index 0000000..22e741f --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/FormElementHmacDataValidator.php @@ -0,0 +1,40 @@ +validationDto->withPropertyPath($key); + $this->validateFormElementPropertyValueByHmacData( + $this->currentElement, + $value, + $this->sessionToken, + $dto + ); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/PropertyCollectionElementHmacDataValidator.php b/Classes/Domain/Configuration/FormDefinition/Validators/PropertyCollectionElementHmacDataValidator.php new file mode 100644 index 0000000..ee6ed5e --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/PropertyCollectionElementHmacDataValidator.php @@ -0,0 +1,42 @@ +validationDto->withPropertyPath($key)->withPropertyCollectionElementIdentifier( + $this->currentElement['identifier'] + ); + $this->validatePropertyCollectionElementPropertyValueByHmacData( + $this->currentElement, + $value, + $this->sessionToken, + $dto + ); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/ValidationDto.php b/Classes/Domain/Configuration/FormDefinition/Validators/ValidationDto.php new file mode 100644 index 0000000..6a17a64 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/ValidationDto.php @@ -0,0 +1,159 @@ +prototypeName = $prototypeName; + $this->formElementType = $formElementType; + $this->formElementIdentifier = $formElementIdentifier; + $this->propertyPath = $propertyPath; + $this->propertyCollectionName = $propertyCollectionName; + $this->propertyCollectionElementIdentifier = $propertyCollectionElementIdentifier; + } + + public function getPrototypeName(): string + { + return $this->prototypeName; + } + + public function getFormElementType(): string + { + return $this->formElementType; + } + + public function getFormElementIdentifier(): string + { + return $this->formElementIdentifier; + } + + public function getPropertyPath(): string + { + return $this->propertyPath; + } + + public function getPropertyCollectionName(): string + { + return $this->propertyCollectionName; + } + + public function getPropertyCollectionElementIdentifier(): string + { + return $this->propertyCollectionElementIdentifier; + } + + public function hasPrototypeName(): bool + { + return !empty($this->prototypeName); + } + + public function hasFormElementType(): bool + { + return !empty($this->formElementType); + } + + public function hasFormElementIdentifier(): bool + { + return !empty($this->formElementIdentifier); + } + + public function hasPropertyPath(): bool + { + return !empty($this->propertyPath); + } + + public function hasPropertyCollectionName(): bool + { + return !empty($this->propertyCollectionName); + } + + public function hasPropertyCollectionElementIdentifier(): bool + { + return !empty($this->propertyCollectionElementIdentifier); + } + + public function withPrototypeName(string $prototypeName): ValidationDto + { + return GeneralUtility::makeInstance(self::class, $prototypeName, $this->formElementType, $this->formElementIdentifier, $this->propertyPath, $this->propertyCollectionName, $this->propertyCollectionElementIdentifier); + } + + public function withFormElementType(string $formElementType): ValidationDto + { + return GeneralUtility::makeInstance(self::class, $this->prototypeName, $formElementType, $this->formElementIdentifier, $this->propertyPath, $this->propertyCollectionName, $this->propertyCollectionElementIdentifier); + } + + public function withFormElementIdentifier(string $formElementIdentifier): ValidationDto + { + return GeneralUtility::makeInstance(self::class, $this->prototypeName, $this->formElementType, $formElementIdentifier, $this->propertyPath, $this->propertyCollectionName, $this->propertyCollectionElementIdentifier); + } + + public function withPropertyPath(string $propertyPath): ValidationDto + { + return GeneralUtility::makeInstance(self::class, $this->prototypeName, $this->formElementType, $this->formElementIdentifier, $propertyPath, $this->propertyCollectionName, $this->propertyCollectionElementIdentifier); + } + + public function withPropertyCollectionName(string $propertyCollectionName): ValidationDto + { + return GeneralUtility::makeInstance(self::class, $this->prototypeName, $this->formElementType, $this->formElementIdentifier, $this->propertyPath, $propertyCollectionName, $this->propertyCollectionElementIdentifier); + } + + public function withPropertyCollectionElementIdentifier(string $propertyCollectionElementIdentifier): ValidationDto + { + return GeneralUtility::makeInstance(self::class, $this->prototypeName, $this->formElementType, $this->formElementIdentifier, $this->propertyPath, $this->propertyCollectionName, $propertyCollectionElementIdentifier); + } +} diff --git a/Classes/Domain/Configuration/FormDefinition/Validators/ValidatorInterface.php b/Classes/Domain/Configuration/FormDefinition/Validators/ValidatorInterface.php new file mode 100644 index 0000000..29861f6 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinition/Validators/ValidatorInterface.php @@ -0,0 +1,31 @@ +" for each scalar property value + * within the form definition as a sibling of the property key. + * "_orig_" is an array which contains the property value + * and a hmac hash for the property value. + * "_orig_" will be used to validate the form definition on saving. + * @see \TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService::validateFormDefinitionProperties() + */ + public function addHmacData(array $formDefinition, string $formPersistenceIdentifier): array + { + // Extend the hmac hashing key with a "per form editor session" unique key. + $sessionToken = $this->generateSessionToken(); + $this->persistSessionToken($sessionToken, $formPersistenceIdentifier); + + $converterDto = GeneralUtility::makeInstance(ConverterDto::class, $formDefinition); + + GeneralUtility::makeInstance(ArrayProcessor::class, $formDefinition)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'addHmacData', + '(^identifier$|renderables\.([\d]+)\.identifier$)', + GeneralUtility::makeInstance( + AddHmacDataConverter::class, + $converterDto, + $sessionToken + ) + ) + ); + + $result = $converterDto->getFormDefinition(); + + // Embed the form persistence identifier so the TypeConverter can + // look up the correct per-form session token when saving. + $result['_formPersistenceIdentifier'] = $formPersistenceIdentifier; + + return $result; + } + + /** + * Remove the "_orig_" values and the + * "_formPersistenceIdentifier" marker from the form definition. + */ + public function removeHmacData(array $formDefinition): array + { + unset($formDefinition['_formPersistenceIdentifier']); + + $converterDto = GeneralUtility::makeInstance(ConverterDto::class, $formDefinition); + + GeneralUtility::makeInstance(ArrayProcessor::class, $formDefinition)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'removeHmacData', + '(_orig_.*|.*\._orig_.*)\.hmac', + GeneralUtility::makeInstance( + RemoveHmacDataConverter::class, + $converterDto + ) + ) + ); + + return $converterDto->getFormDefinition(); + } + + /** + * Migrate various finisher options + */ + public function migrateFinisherConfiguration(array $formDefinition): array + { + $converterDto = GeneralUtility::makeInstance(ConverterDto::class, $formDefinition); + + GeneralUtility::makeInstance(ArrayProcessor::class, $formDefinition)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'migrateFinisherLanguageSettings', + '^finishers\.([\d]+)\.options.translation.language$', + GeneralUtility::makeInstance( + FinisherTranslationLanguageConverter::class, + $converterDto + ) + ) + ); + + return $converterDto->getFormDefinition(); + } + + protected function persistSessionToken(string $sessionToken, string $formPersistenceIdentifier): void + { + $tokens = $this->getBackendUser()->getSessionData('extFormProtectionSessionTokens') ?? []; + if (!is_array($tokens)) { + $tokens = []; + } + $tokens[$formPersistenceIdentifier] = $sessionToken; + $this->getBackendUser()->setAndSaveSessionData('extFormProtectionSessionTokens', $tokens); + } + + /** + * Retrieve the session token for a specific form persistence identifier. + */ + public function retrieveSessionToken(string $formPersistenceIdentifier): string + { + $tokens = $this->getBackendUser()->getSessionData('extFormProtectionSessionTokens'); + if (is_array($tokens) && isset($tokens[$formPersistenceIdentifier]) && is_string($tokens[$formPersistenceIdentifier])) { + return $tokens[$formPersistenceIdentifier]; + } + return ''; + } + + public function sanitizeHtml(array $rawFormDefinitionArray, array $rtePropertyPaths = [], string $defaultBuild = 'default'): array + { + return $this->sanitizeValuesRecursively($rawFormDefinitionArray, $rtePropertyPaths, $defaultBuild); + } + + public function transformRteContentForPersistence(array $formDefinition, array $rtePropertyPaths): array + { + if ($rtePropertyPaths === []) { + return $formDefinition; + } + + return $this->transformRteContentRecursively($formDefinition, $rtePropertyPaths, $this->richTextConfigurationService, 'persistence'); + } + + public function transformRteContentForRichTextEditor(array $formDefinition, array $rtePropertyPaths): array + { + if ($rtePropertyPaths === []) { + return $formDefinition; + } + + return $this->transformRteContentRecursively($formDefinition, $rtePropertyPaths, $this->richTextConfigurationService, 'rte'); + } + + protected function transformRteContentRecursively( + array $formDefinition, + array $rtePropertyPaths, + RichTextConfigurationService $richTextConfigurationService, + string $direction = 'persistence' + ): array { + // Get the element type (e.g., 'Checkbox', 'StaticText', 'Form') + $elementType = $formDefinition['type'] ?? null; + + // Transform properties for this specific element type + if ($elementType !== null && isset($rtePropertyPaths[$elementType])) { + foreach ($rtePropertyPaths[$elementType] as $propertyPath => $presetName) { + $value = $this->getValueByPath($formDefinition, $propertyPath); + if (is_string($value) && $value !== '') { + $transformedValue = $direction === 'persistence' + ? $richTextConfigurationService->transformTextForPersistence($value, $presetName) + : $richTextConfigurationService->transformTextForRichTextEditor($value, $presetName); + $formDefinition = $this->setValueByPath($formDefinition, $propertyPath, $transformedValue); + } + } + } + + // Recurse into renderables (form elements on pages) + if (is_array($formDefinition['renderables'] ?? null)) { + foreach ($formDefinition['renderables'] as $key => $renderable) { + if (is_array($renderable)) { + $formDefinition['renderables'][$key] = $this->transformRteContentRecursively( + $renderable, + $rtePropertyPaths, + $richTextConfigurationService, + $direction + ); + } + } + } + + // Transform finisher options + if (is_array($formDefinition['finishers'] ?? null)) { + $finisherRtePaths = $rtePropertyPaths['_finishers'] ?? []; + foreach ($formDefinition['finishers'] as $key => $finisher) { + if (!is_array($finisher)) { + continue; + } + + $finisherIdentifier = $finisher['identifier'] ?? null; + if ($finisherIdentifier === null || !isset($finisherRtePaths[$finisherIdentifier])) { + continue; + } + + foreach ($finisherRtePaths[$finisherIdentifier] as $propertyPath => $presetName) { + // Property path in finisher config is like 'options.message' + $value = $this->getValueByPath($finisher, $propertyPath); + if (is_string($value) && $value !== '') { + $transformedValue = $direction === 'persistence' + ? $richTextConfigurationService->transformTextForPersistence($value, $presetName) + : $richTextConfigurationService->transformTextForRichTextEditor($value, $presetName); + $finisher = $this->setValueByPath($finisher, $propertyPath, $transformedValue); + $formDefinition['finishers'][$key] = $finisher; + } + } + } + } + + return $formDefinition; + } + + protected function getValueByPath(array $array, string $path): mixed + { + $keys = explode('.', $path); + $current = $array; + + foreach ($keys as $key) { + if (!is_array($current) || !array_key_exists($key, $current)) { + return null; + } + $current = $current[$key]; + } + + return $current; + } + + protected function setValueByPath(array $array, string $path, mixed $value): array + { + $keys = explode('.', $path); + $current = &$array; + + foreach ($keys as $i => $key) { + if ($i === count($keys) - 1) { + $current[$key] = $value; + } else { + if (!isset($current[$key]) || !is_array($current[$key])) { + $current[$key] = []; + } + $current = &$current[$key]; + } + } + + return $array; + } + + /** + * Extract RTE-enabled property paths from prototype configuration. + * + * Scans the form editor configuration for all form element types and finishers + * to find editors with enableRichtext=true and returns their property paths + * along with the RTE preset name, organized by element type. + * + * @param array $prototypeConfiguration The prototype configuration array + * @return array Map of element types to their RTE property paths + * Format: [ + * 'Checkbox' => ['label' => 'form-label'], + * 'StaticText' => ['properties.text' => 'form-content'], + * '_finishers' => ['Confirmation' => ['options.message' => 'form-label']] + * ] + */ + public function extractRtePropertyPaths(array $prototypeConfiguration): array + { + $rtePropertyPaths = []; + + // Extract from form elements definition + $formElementsDefinition = $prototypeConfiguration['formElementsDefinition'] ?? []; + foreach ($formElementsDefinition as $formElementType => $elementConfig) { + $editors = $elementConfig['formEditor']['editors'] ?? []; + foreach ($editors as $editor) { + if ($this->isRteEditor($editor)) { + $propertyPath = $editor['propertyPath'] ?? ''; + $presetName = $editor['richtextConfiguration'] ?? 'form-label'; + if ($propertyPath !== '') { + $rtePropertyPaths[$formElementType][$propertyPath] = $presetName; + } + } + } + } + + // Extract from finisher property collections on the Form element + // Finisher editors are defined in: + // formElementsDefinition.Form.formEditor.propertyCollections.finishers..editors + $finisherCollections = $formElementsDefinition['Form']['formEditor']['propertyCollections']['finishers'] ?? []; + foreach ($finisherCollections as $finisherCollection) { + $finisherIdentifier = $finisherCollection['identifier'] ?? ''; + if ($finisherIdentifier === '') { + continue; + } + $editors = $finisherCollection['editors'] ?? []; + foreach ($editors as $editor) { + if ($this->isRteEditor($editor)) { + $propertyPath = $editor['propertyPath'] ?? ''; + $presetName = $editor['richtextConfiguration'] ?? 'form-label'; + if ($propertyPath !== '') { + $rtePropertyPaths['_finishers'][$finisherIdentifier][$propertyPath] = $presetName; + } + } + } + } + + return $rtePropertyPaths; + } + + /** + * Check if an editor configuration represents an RTE-enabled textarea. + */ + protected function isRteEditor(array $editor): bool + { + return ($editor['templateName'] ?? '') === 'Inspector-TextareaEditor' + && ($editor['enableRichtext'] ?? false) === true; + } + + /** + * Recursively sanitizes values in form definition. + * + * For RTE-enabled fields: Uses HtmlSanitizer with the preset configured in the RTE configuration + * For all other string fields: Uses strip_tags to remove ALL HTML + * + * @param array $array The array to sanitize + * @param array $rtePropertyPaths Map of element types to their RTE property paths with preset names + * @param string $defaultBuild Default sanitizer build name for RTE fields without specific preset + * @param string|null $currentElementType The current element type being processed + * @param string $currentPath The current property path being processed + */ + protected function sanitizeValuesRecursively( + array $array, + array $rtePropertyPaths = [], + string $defaultBuild = 'default', + ?string $currentElementType = null, + string $currentPath = '' + ): array { + $result = $array; + + // Detect element type from current array (only at element root level) + $elementType = $result['type'] ?? $currentElementType; + + // Get RTE property paths for this element type (with their preset names) + $elementRtePaths = []; + if ($elementType !== null && isset($rtePropertyPaths[$elementType])) { + $elementRtePaths = $rtePropertyPaths[$elementType]; + } + + foreach ($result as $key => $value) { + // Build the full property path + $propertyPath = $currentPath === '' ? $key : $currentPath . '.' . $key; + + if ($key === 'renderables' && is_array($value)) { + // For renderables, process each child element with fresh context + foreach ($value as $childKey => $childValue) { + if (is_array($childValue)) { + $result[$key][$childKey] = $this->sanitizeValuesRecursively( + $childValue, + $rtePropertyPaths, + $defaultBuild + ); + } + } + } elseif ($key === 'finishers' && is_array($value)) { + // Handle finishers separately + $finisherRtePaths = $rtePropertyPaths['_finishers'] ?? []; + foreach ($value as $finisherKey => $finisher) { + if (is_array($finisher)) { + $finisherIdentifier = $finisher['identifier'] ?? null; + $finisherRteFields = []; + if ($finisherIdentifier !== null && isset($finisherRtePaths[$finisherIdentifier])) { + $finisherRteFields = $finisherRtePaths[$finisherIdentifier]; + } + $result[$key][$finisherKey] = $this->sanitizeFinisherRecursively( + $finisher, + $finisherRteFields, + $defaultBuild + ); + } + } + } elseif (is_array($value)) { + // Recurse into nested arrays, keeping the element type and building path + $result[$key] = $this->sanitizeValuesRecursively( + $value, + $rtePropertyPaths, + $defaultBuild, + $elementType, + $propertyPath + ); + } elseif (is_string($value) || (is_object($value) && method_exists($value, '__toString'))) { + $stringValue = (string)$value; + + // Check if this property path is an RTE field for the current element type + if (isset($elementRtePaths[$propertyPath])) { + // RTE field: use HtmlSanitizer with the configured preset + // This ensures sanitization even for form definitions from external sources + $presetBuild = $this->resolveSanitizerBuildFromPreset($elementRtePaths[$propertyPath]); + $result[$key] = $this->sanitizeWithBuild($stringValue, $presetBuild ?? $defaultBuild); + } else { + // Non-RTE field: strip ALL HTML tags for security + $result[$key] = strip_tags($stringValue); + } + } + } + + return $result; + } + + /** + * Recursively sanitize finisher values. + * + * @param array $finisher The finisher configuration + * @param array $rteFields Map of RTE field paths to their preset names + * @param string $defaultBuild Default sanitizer build name + * @param string $currentPath Current property path + */ + protected function sanitizeFinisherRecursively( + array $finisher, + array $rteFields, + string $defaultBuild = 'default', + string $currentPath = '' + ): array { + foreach ($finisher as $key => $value) { + $fullPath = $currentPath === '' ? $key : $currentPath . '.' . $key; + + if (is_array($value)) { + $finisher[$key] = $this->sanitizeFinisherRecursively($value, $rteFields, $defaultBuild, $fullPath); + } elseif (is_string($value) || (is_object($value) && method_exists($value, '__toString'))) { + $stringValue = (string)$value; + + if (isset($rteFields[$fullPath])) { + // RTE field: use HtmlSanitizer with the configured preset + $presetBuild = $this->resolveSanitizerBuildFromPreset($rteFields[$fullPath]); + $finisher[$key] = $this->sanitizeWithBuild($stringValue, $presetBuild ?? $defaultBuild); + } else { + // Non-RTE field: strip ALL HTML tags for security + $finisher[$key] = strip_tags($stringValue); + } + } + } + + return $finisher; + } + + /** + * Resolve the sanitizer build name from an RTE preset configuration. + * + * @param string $presetName The RTE preset name (e.g., 'form-label', 'form-content') + * @return string|null The sanitizer build name, or null if not configured + */ + protected function resolveSanitizerBuildFromPreset(string $presetName): ?string + { + $processingConfig = $this->richTextConfigurationService->resolveProcessingConfiguration($presetName); + return $processingConfig['HTMLparser_db.']['htmlSanitize.']['build'] ?? null; + } + + /** + * Sanitize HTML content with the specified sanitizer build. + * + * @param string $content The HTML content to sanitize + * @param string $build The sanitizer build name or class name + * @return string The sanitized content + */ + protected function sanitizeWithBuild(string $content, string $build): string + { + return $this->createSanitizer($build)->sanitize($content); + } + + /** + * Create a sanitizer instance for the given build configuration. + * + * Supports both preset names (e.g., 'default') and class names implementing BuilderInterface. + * + * @param string $build The sanitizer build name or class name + * @return Sanitizer The sanitizer instance + */ + protected function createSanitizer(string $build): Sanitizer + { + if (class_exists($build) && is_a($build, \TYPO3\HtmlSanitizer\Builder\BuilderInterface::class, true)) { + $builder = GeneralUtility::makeInstance($build); + } else { + $factory = GeneralUtility::makeInstance(SanitizerBuilderFactory::class); + $builder = $factory->build($build); + } + return $builder->build(); + } + + /** + * Generates the random token which is used in the hash for the form tokens. + * + * @return string + */ + protected function generateSessionToken(): string + { + return GeneralUtility::makeInstance(Random::class)->generateRandomHexString(64); + } + + protected function getBackendUser(): BackendUserAuthentication + { + return $GLOBALS['BE_USER']; + } +} diff --git a/Classes/Domain/Configuration/FormDefinitionValidationService.php b/Classes/Domain/Configuration/FormDefinitionValidationService.php new file mode 100644 index 0000000..4901b67 --- /dev/null +++ b/Classes/Domain/Configuration/FormDefinitionValidationService.php @@ -0,0 +1,352 @@ +configurationService->isFormElementTypeCreatableByFormEditor($validationDto)) { + $this->validateAllPropertyValuesFromCreatableFormElement( + $currentFormElement, + $sessionToken, + $validationDto + ); + foreach ($propertyCollectionElements as $propertyCollectionElement) { + $validationDto = $validationDto->withPropertyCollectionElementIdentifier( + $propertyCollectionElement['identifier'] + ); + if ($this->configurationService->isPropertyCollectionElementIdentifierCreatableByFormEditor($validationDto)) { + $this->validateAllPropertyValuesFromCreatablePropertyCollectionElement( + $propertyCollectionElement, + $sessionToken, + $validationDto + ); + } else { + $this->validateAllPropertyCollectionElementValuesByHmac( + $propertyCollectionElement, + $sessionToken, + $validationDto + ); + } + } + } else { + $this->validateAllFormElementPropertyValuesByHmac($currentFormElement, $sessionToken, $validationDto); + foreach ($propertyCollectionElements as $propertyCollectionElement) { + $this->validateAllPropertyCollectionElementValuesByHmac( + $propertyCollectionElement, + $sessionToken, + $validationDto + ); + } + } + + foreach ($renderables as $renderable) { + $this->validateFormDefinitionProperties($renderable, $prototypeName, $sessionToken); + } + } + + /** + * Returns TRUE if a property value is equals to the historical value + * and FALSE if not. + * "Historical values" means values which are available within the form definition + * while the form editor is loaded and the values which are available after a + * successful validation of the form definition on a save operation. + * The value must be equal to the historical value if the property key for the value + * is not defined within the form setup. + * This means that the property can not be changed by the form editor but we want to keep the value + * in its original state. + * If this is not the case (return value is FALSE), an exception must be thrown. + * + * @throws PropertyException + */ + public function isPropertyValueEqualToHistoricalValue( + array $hmacContent, + mixed $propertyValue, + array $hmacData, + string $sessionToken + ): bool { + $this->checkHmacDataIntegrity($hmacData, $hmacContent, $sessionToken); + $hmacContent[] = $propertyValue; + $expectedHash = $this->hashService->hmac(serialize($hmacContent), $sessionToken); + return hash_equals($expectedHash, $hmacData['hmac']); + } + + /** + * Compares the historical value and the hmac hash to ensure the integrity + * of the data. + * An exception will be thrown if the value is modified. + * + * @throws PropertyException + */ + protected function checkHmacDataIntegrity(array $hmacData, array $hmacContent, string $sessionToken) + { + $hmac = $hmacData['hmac'] ?? null; + if (empty($hmac)) { + throw new PropertyException('Hmac must not be empty. #1528538222', 1528538222); + } + $hmacContent[] = $hmacData['value'] ?? ''; + $expectedHash = $this->hashService->hmac(serialize($hmacContent), $sessionToken); + if (!hash_equals($expectedHash, $hmac)) { + throw new PropertyException('Unauthorized modification of historical data. #1528538252', 1528538252); + } + } + + /** + * Walk through all form element properties and checks + * if the values matches to their hmac hashes. + */ + protected function validateAllFormElementPropertyValuesByHmac( + array $currentElement, + string $sessionToken, + ValidationDto $validationDto + ): void { + GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'validateProperties', + '^(?!(_orig_.*|.*\._orig_.*)$).*', + GeneralUtility::makeInstance( + FormElementHmacDataValidator::class, + $currentElement, + $sessionToken, + $validationDto + ) + ) + ); + } + + /** + * Walk through all property collection properties and checks + * if the values matches to their hmac hashes. + */ + protected function validateAllPropertyCollectionElementValuesByHmac( + array $currentElement, + string $sessionToken, + ValidationDto $validationDto + ): void { + GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'validateProperties', + '^(?!(_orig_.*|.*\._orig_.*)$).*', + GeneralUtility::makeInstance( + PropertyCollectionElementHmacDataValidator::class, + $currentElement, + $sessionToken, + $validationDto + ) + ) + ); + } + + /** + * Walk through all form element properties and checks + * if the property is defined within the form editor setup + * or if the property is defined within the "predefinedDefaults" in the form editor setup + * and the property value matches the predefined value + * or if there is a valid hmac hash for the value. + */ + protected function validateAllPropertyValuesFromCreatableFormElement( + array $currentElement, + string $sessionToken, + ValidationDto $validationDto + ): void { + GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'validateProperties', + '^(?!(_orig_.*|.*\._orig_.*|type|identifier)$).*', + GeneralUtility::makeInstance( + CreatableFormElementPropertiesValidator::class, + $currentElement, + $sessionToken, + $validationDto + ) + ) + ); + } + + /** + * Walk through all property collection properties and checks + * if the property is defined within the form editor setup + * or if the property is defined within the "predefinedDefaults" in the form editor setup + * and the property value matches the predefined value + * or if there is a valid hmac hash for the value. + */ + protected function validateAllPropertyValuesFromCreatablePropertyCollectionElement( + array $currentElement, + string $sessionToken, + ValidationDto $validationDto + ): void { + GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'validateProperties', + '^(?!(_orig_.*|.*\._orig_.*|identifier)$).*', + GeneralUtility::makeInstance( + CreatablePropertyCollectionElementPropertiesValidator::class, + $currentElement, + $sessionToken, + $validationDto + ) + ) + ); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AbstractExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AbstractExtractor.php new file mode 100644 index 0000000..724abd7 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AbstractExtractor.php @@ -0,0 +1,34 @@ +extractorDto = $extractorDto; + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AdditionalElementPropertyPathsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AdditionalElementPropertyPathsExtractor.php new file mode 100644 index 0000000..58bbdd5 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/AdditionalElementPropertyPathsExtractor.php @@ -0,0 +1,36 @@ +extractorDto->getResult(); + $result['formElements'][$formElementType]['additionalElementPropertyPaths'][] = $value; + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorDto.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorDto.php new file mode 100644 index 0000000..68e851e --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorDto.php @@ -0,0 +1,55 @@ +prototypeConfiguration = $prototypeConfiguration; + } + + public function getPrototypeConfiguration(): array + { + return $this->prototypeConfiguration; + } + + public function getResult(): array + { + return $this->result; + } + + public function setResult(array $result): ExtractorDto + { + $this->result = $result; + return $this; + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorInterface.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorInterface.php new file mode 100644 index 0000000..7755b1a --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/ExtractorInterface.php @@ -0,0 +1,31 @@ +extractorDto->getResult(); + + if (!ArrayUtility::isValidPath( + $this->extractorDto->getPrototypeConfiguration(), + 'formElementsDefinition.' . $formElementType . '.formEditor.groupSorting', + '.' + )) { + $result['formElements'][$formElementType]['creatable'] = false; + $this->extractorDto->setResult($result); + return; + } + + $formElementGroups = array_keys( + ArrayUtility::getValueByPath($this->extractorDto->getPrototypeConfiguration(), 'formEditor.formElementGroups', '.') + ); + + $result['formElements'][$formElementType]['creatable'] = in_array( + $formElementGroup, + $formElementGroups, + true + ); + + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/MultiValuePropertiesExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/MultiValuePropertiesExtractor.php new file mode 100644 index 0000000..bb0bb9b --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/MultiValuePropertiesExtractor.php @@ -0,0 +1,89 @@ +extractorDto->getResult(); + + if (ArrayUtility::isValidPath($this->extractorDto->getPrototypeConfiguration(), $propertyPath, '.')) { + $result['formElements'][$formElementType]['multiValueProperties'][] = ArrayUtility::getValueByPath( + $this->extractorDto->getPrototypeConfiguration(), + $propertyPath, + '.' + ); + } + + if ($value === 'Inspector-PropertyGridEditor') { + $result['formElements'][$formElementType]['multiValueProperties'][] = 'defaultValue'; + } + + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PredefinedDefaultsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PredefinedDefaultsExtractor.php new file mode 100644 index 0000000..28ad329 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PredefinedDefaultsExtractor.php @@ -0,0 +1,38 @@ +extractorDto->getResult(); + $result['formElements'][$formElementType]['predefinedDefaults'][$propertyPath] = $value; + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PropertyPathsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PropertyPathsExtractor.php new file mode 100644 index 0000000..920b01c --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/PropertyPathsExtractor.php @@ -0,0 +1,90 @@ +getPropertyPaths($value, $matches); + + $result = $this->extractorDto->getResult(); + $result = array_merge_recursive($result, ['formElements' => $formElementPropertyPaths]); + $this->extractorDto->setResult($result); + } + + protected function getPropertyPaths(string $value, array $matches): array + { + $paths = []; + [, $formElementType, $formEditorIndex] = $matches; + + $paths[$formElementType]['propertyPaths'] = []; + $templateNamePath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'templateName', + ] + ); + $templateName = ArrayUtility::getValueByPath( + $this->extractorDto->getPrototypeConfiguration(), + $templateNamePath, + '.' + ); + + // Special processing of "Inspector-GridColumnViewPortConfigurationEditor" inspector editors. + // Expand the property path which contains a "{@viewPortIdentifier}" placeholder + // to X property paths which contain all available placeholder replacements. + if ($templateName === 'Inspector-GridColumnViewPortConfigurationEditor') { + $viewPortsPath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'configurationOptions', + 'viewPorts', + ] + ); + $viewPorts = ArrayUtility::getValueByPath($this->extractorDto->getPrototypeConfiguration(), $viewPortsPath, '.'); + foreach ($viewPorts as $viewPort) { + $viewPortIdentifier = $viewPort['viewPortIdentifier']; + $propertyPath = str_replace('{@viewPortIdentifier}', $viewPortIdentifier, $value); + $paths[$formElementType]['propertyPaths'][] = $propertyPath; + } + } else { + $paths[$formElementType]['propertyPaths'][] = $value; + } + return $paths; + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/SelectOptionsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/SelectOptionsExtractor.php new file mode 100644 index 0000000..126d9b8 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/FormElement/SelectOptionsExtractor.php @@ -0,0 +1,95 @@ +extractorDto->getPrototypeConfiguration(), + implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'templateName', + ] + ), + '.' + ); + + if ($templateName === 'Inspector-FinishersEditor') { + $propertyPath = '_finishers'; + } elseif ($templateName === 'Inspector-ValidatorsEditor') { + $propertyPath = '_validators'; + } else { + if ($templateName === 'Inspector-RequiredValidatorEditor') { + $propertyPath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'configurationOptions', + 'validationErrorMessage', + 'propertyPath', + ] + ); + } else { + $propertyPath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'propertyPath', + ] + ); + } + + $propertyPath = ArrayUtility::getValueByPath( + $this->extractorDto->getPrototypeConfiguration(), + $propertyPath, + '.' + ); + } + + $result = $this->extractorDto->getResult(); + $result['formElements'][$formElementType]['selectOptions'][$propertyPath][] = $value; + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/IsCreatablePropertyCollectionElementExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/IsCreatablePropertyCollectionElementExtractor.php new file mode 100644 index 0000000..4839ece --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/IsCreatablePropertyCollectionElementExtractor.php @@ -0,0 +1,103 @@ +extractorDto->getResult(); + + if ( + $value === 'Inspector-FinishersEditor' + || $value === 'Inspector-ValidatorsEditor' + ) { + $selectOptionsPath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'selectOptions', + ] + ); + if (!ArrayUtility::isValidPath($this->extractorDto->getPrototypeConfiguration(), $selectOptionsPath, '.')) { + return; + } + $selectOptions = ArrayUtility::getValueByPath( + $this->extractorDto->getPrototypeConfiguration(), + $selectOptionsPath, + '.' + ); + foreach ($selectOptions as $selectOption) { + $validatorIdentifier = $selectOption['value'] ?? ''; + if (empty($validatorIdentifier)) { + continue; + } + + $result['formElements'][$formElementType]['collections'][$propertyCollectionName][$validatorIdentifier]['creatable'] = true; + } + } else { + $validatorIdentifierPath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'editors', + $formEditorIndex, + 'validatorIdentifier', + ] + ); + if (!ArrayUtility::isValidPath($this->extractorDto->getPrototypeConfiguration(), $validatorIdentifierPath, '.')) { + return; + } + $validatorIdentifier = ArrayUtility::getValueByPath( + $this->extractorDto->getPrototypeConfiguration(), + $validatorIdentifierPath, + '.' + ); + $result['formElements'][$formElementType]['collections'][$propertyCollectionName][$validatorIdentifier]['creatable'] = true; + } + + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/MultiValuePropertiesExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/MultiValuePropertiesExtractor.php new file mode 100644 index 0000000..85cad00 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/MultiValuePropertiesExtractor.php @@ -0,0 +1,90 @@ +extractorDto->getPrototypeConfiguration(), $propertyPath, '.'); + + $result = $this->extractorDto->getResult(); + + if ( + $value === 'Inspector-PropertyGridEditor' + || $value === 'Inspector-MultiSelectEditor' + ) { + $identifierPath = implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'propertyCollections', + $propertyCollectionName, + $propertyCollectionIndex, + 'identifier', + ] + ); + $identifier = ArrayUtility::getValueByPath($this->extractorDto->getPrototypeConfiguration(), $identifierPath, '.'); + + $result['formElements'][$formElementType]['collections'][$propertyCollectionName][$identifier]['multiValueProperties'][] = $propertyValue; + if ($value === 'Inspector-PropertyGridEditor') { + $result['formElements'][$formElementType]['collections'][$propertyCollectionName][$identifier]['multiValueProperties'][] = 'defaultValue'; + } + } else { + $result['formElements'][$formElementType]['multiValueProperties'][] = $propertyValue; + } + + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PredefinedDefaultsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PredefinedDefaultsExtractor.php new file mode 100644 index 0000000..194b5c8 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PredefinedDefaultsExtractor.php @@ -0,0 +1,39 @@ +extractorDto->getResult(); + $result['collections'][$propertyCollectionName][$propertyCollectionElementIdentifier]['predefinedDefaults'][$propertyPath] = $value; + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PropertyPathsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PropertyPathsExtractor.php new file mode 100644 index 0000000..08e9a84 --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/PropertyPathsExtractor.php @@ -0,0 +1,53 @@ +extractorDto->getPrototypeConfiguration(), $identifierPath, '.'); + + $result = $this->extractorDto->getResult(); + $result['formElements'][$formElementType]['collections'][$propertyCollectionName][$identifier]['propertyPaths'][] = $value; + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/SelectOptionsExtractor.php b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/SelectOptionsExtractor.php new file mode 100644 index 0000000..352e6bf --- /dev/null +++ b/Classes/Domain/Configuration/FrameworkConfiguration/Extractors/PropertyCollectionElement/SelectOptionsExtractor.php @@ -0,0 +1,77 @@ +extractorDto->getPrototypeConfiguration(), + implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'propertyCollections', + $propertyCollectionName, + $propertyCollectionIndex, + 'editors', + $propertyCollectionEditorIndex, + 'propertyPath', + ] + ), + '.' + ); + + $propertyCollectionElementIdentifier = ArrayUtility::getValueByPath( + $this->extractorDto->getPrototypeConfiguration(), + implode( + '.', + [ + 'formElementsDefinition', + $formElementType, + 'formEditor', + 'propertyCollections', + $propertyCollectionName, + $propertyCollectionIndex, + 'identifier', + ] + ), + '.' + ); + + $propertyCollectionName = str_replace('Definition', '', $propertyCollectionName); + + $result = $this->extractorDto->getResult(); + $result['collections'][$propertyCollectionName][$propertyCollectionElementIdentifier]['selectOptions'][$propertyPath][] = $value; + $this->extractorDto->setResult($result); + } +} diff --git a/Classes/Domain/Configuration/PersistenceConfigurationService.php b/Classes/Domain/Configuration/PersistenceConfigurationService.php new file mode 100644 index 0000000..15d0f69 --- /dev/null +++ b/Classes/Domain/Configuration/PersistenceConfigurationService.php @@ -0,0 +1,155 @@ +isFrontendRequest(); + $request = $this->getCurrentRequest(); + + $typoScriptSettings = $this->extbaseConfigurationManager->getConfiguration( + ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, + 'form' + ); + + return $this->extFormConfigurationManager->getYamlConfiguration( + $typoScriptSettings, + $isFrontend, + $isFrontend ? $request : null + ); + } + + /** + * Get persistence manager settings as a typed DTO + */ + public function getPersistenceManagerConfiguration(): PersistenceManagerConfiguration + { + $formSettings = $this->getFormSettings(); + return PersistenceManagerConfiguration::fromArray($formSettings['persistenceManager'] ?? []); + } + + /** + * Get allowed extension paths from form configuration + * + * @return string[] Array of allowed extension paths (e.g., ["EXT:my_extension/Configuration/Forms/"]) + */ + public function getAllowedExtensionPaths(): array + { + return $this->getPersistenceManagerConfiguration()->allowedExtensionPaths; + } + + /** + * Get allowed pages for form storage. + * + * Forms are always stored on pid 0 (root level). + * + * @return array Array of allowed page IDs + */ + public function getAllowedPages(): array + { + return [ + 0 => [ + 'uid' => 0, + 'title' => 'Root', + ], + ]; + } + + /** + * Check if saving to extension paths is allowed + */ + public function isAllowedToSaveToExtensionPaths(): bool + { + return $this->getPersistenceManagerConfiguration()->allowSaveToExtensionPaths; + } + + /** + * Check if deleting from extension paths is allowed + */ + public function isAllowedToDeleteFromExtensionPaths(): bool + { + return $this->getPersistenceManagerConfiguration()->allowDeleteFromExtensionPaths; + } + + /** + * Get sort configuration for form listing + * + * @return array{sortByKeys: string[], sortAscending: bool} + */ + public function getSortConfiguration(): array + { + $configuration = $this->getPersistenceManagerConfiguration(); + + return [ + 'sortByKeys' => $configuration->sortByKeys, + 'sortAscending' => $configuration->sortAscending, + ]; + } + + /** + * Check if current request is a frontend request + */ + private function isFrontendRequest(): bool + { + $request = $this->getCurrentRequest(); + + if ($request !== null) { + return ApplicationType::fromRequest($request)->isFrontend(); + } + + return false; + } + + /** + * Get current request from globals + */ + private function getCurrentRequest(): ?ServerRequestInterface + { + return $GLOBALS['TYPO3_REQUEST'] ?? null; + } +} diff --git a/Classes/Domain/DTO/FormData.php b/Classes/Domain/DTO/FormData.php new file mode 100644 index 0000000..93fad7b --- /dev/null +++ b/Classes/Domain/DTO/FormData.php @@ -0,0 +1,66 @@ + $this->identifier, + 'type' => $this->type, + 'label' => $this->name, + 'prototypeName' => $this->prototypeName, + 'renderingOptions' => $this->renderingOptions, + 'finishers' => $this->finishers, + 'renderables' => $this->renderables, + 'variants' => $this->variants, + ]; + } +} diff --git a/Classes/Domain/DTO/FormMetadata.php b/Classes/Domain/DTO/FormMetadata.php new file mode 100644 index 0000000..01e8ff4 --- /dev/null +++ b/Classes/Domain/DTO/FormMetadata.php @@ -0,0 +1,208 @@ +withPersistenceIdentifier($persistenceIdentifier) + ->withFileUid($fileUid); + } + + public function toArray(): array + { + return [ + 'identifier' => $this->identifier, + 'type' => $this->type, + 'label' => $this->name, + 'name' => $this->name, + 'prototypeName' => $this->prototypeName, + 'persistenceIdentifier' => $this->persistenceIdentifier ?? $this->identifier, + 'invalid' => $this->invalid, + 'readOnly' => $this->readOnly, + 'removable' => $this->removable, + 'storageType' => $this->storageType, + 'storageLocation' => $this->storageLocation ?? $this->storageType, + 'duplicateIdentifier' => $this->duplicateIdentifier, + 'fileUid' => $this->fileUid, + 'referenceCount' => $this->referenceCount, + 'editUrl' => $this->editUrl, + 'actions' => $this->actions, + ]; + } + + private function with(array $changes): self + { + return new self( + identifier: $changes['identifier'] ?? $this->identifier, + type: $changes['type'] ?? $this->type, + name: $changes['name'] ?? $this->name, + prototypeName: $changes['prototypeName'] ?? $this->prototypeName, + persistenceIdentifier: $changes['persistenceIdentifier'] ?? $this->persistenceIdentifier, + invalid: $changes['invalid'] ?? $this->invalid, + readOnly: $changes['readOnly'] ?? $this->readOnly, + removable: $changes['removable'] ?? $this->removable, + storageType: $changes['storageType'] ?? $this->storageType, + duplicateIdentifier: $changes['duplicateIdentifier'] ?? $this->duplicateIdentifier, + fileUid: $changes['fileUid'] ?? $this->fileUid, + referenceCount: $changes['referenceCount'] ?? $this->referenceCount, + editUrl: $changes['editUrl'] ?? $this->editUrl, + storageLocation: $changes['storageLocation'] ?? $this->storageLocation, + actions: $changes['actions'] ?? $this->actions, + ); + } + + public function withPersistenceIdentifier(string $persistenceIdentifier): self + { + return $this->with(['persistenceIdentifier' => $persistenceIdentifier]); + } + + public function withStorageType(string $storageType): self + { + return $this->with(['storageType' => $storageType]); + } + + public function withDuplicateIdentifier(bool $duplicateIdentifier): self + { + return $this->with(['duplicateIdentifier' => $duplicateIdentifier]); + } + + public function withReadOnly(bool $readOnly): self + { + return $this->with(['readOnly' => $readOnly]); + } + + public function withRemovable(bool $removable): self + { + return $this->with(['removable' => $removable]); + } + + public function withFileUid(?int $fileUid): self + { + return $this->with(['fileUid' => $fileUid]); + } + + public function withReferenceCount(int $referenceCount): self + { + return $this->with(['referenceCount' => $referenceCount]); + } + + public function withInvalid(bool $invalid): self + { + return $this->with(['invalid' => $invalid]); + } + + public function withEditUrl(string $editUrl): self + { + return $this->with(['editUrl' => $editUrl]); + } + + public function withStorageLocation(?string $storageLocation): self + { + return $this->with(['storageLocation' => $storageLocation]); + } + + public function withActions(array $actions): self + { + return $this->with(['actions' => $actions]); + } + + /** + * Returns a comparable scalar value for the given sort field. + * + * Field names in SearchCriteria::ORDER_FIELDS are intentionally kept + * identical to the property names of this class, so a dynamic lookup + * is sufficient. Unknown fields yield null and are skipped by the + * caller. Booleans are cast to int for correct numeric ordering. + */ + public function getSortableValue(string $field): int|string|null + { + if (!property_exists($this, $field)) { + return null; + } + $value = $this->$field; + if (is_bool($value)) { + return (int)$value; + } + return is_int($value) || is_string($value) ? $value : null; + } +} diff --git a/Classes/Domain/DTO/PersistenceManagerConfiguration.php b/Classes/Domain/DTO/PersistenceManagerConfiguration.php new file mode 100644 index 0000000..da54f5f --- /dev/null +++ b/Classes/Domain/DTO/PersistenceManagerConfiguration.php @@ -0,0 +1,81 @@ + + */ + public const DEFAULT_SORT_BY_KEYS = ['name', 'fileUid']; + + /** + * @param list $sortByKeys Keys the forms are sorted by in the form manager and plugin select + * @param list $allowedExtensionPaths EXT: paths that contain forms shipped within extensions + * @param list $allowedFileMounts File mounts forms may be stored in + */ + public function __construct( + public bool $allowSaveToExtensionPaths = false, + public bool $allowDeleteFromExtensionPaths = false, + public array $sortByKeys = self::DEFAULT_SORT_BY_KEYS, + public bool $sortAscending = true, + public array $allowedExtensionPaths = [], + public array $allowedFileMounts = [], + ) {} + + /** + * Create the DTO from the raw "persistenceManager" configuration array. + * + * @param array $configuration + */ + public static function fromArray(array $configuration): self + { + return new self( + allowSaveToExtensionPaths: (bool)($configuration['allowSaveToExtensionPaths'] ?? false), + allowDeleteFromExtensionPaths: (bool)($configuration['allowDeleteFromExtensionPaths'] ?? false), + sortByKeys: self::normalizeStringList($configuration['sortByKeys'] ?? null, self::DEFAULT_SORT_BY_KEYS), + sortAscending: (bool)($configuration['sortAscending'] ?? true), + allowedExtensionPaths: self::normalizeStringList($configuration['allowedExtensionPaths'] ?? null, []), + allowedFileMounts: self::normalizeStringList($configuration['allowedFileMounts'] ?? null, []), + ); + } + + /** + * Normalize a configuration value into a numerically indexed list of strings. + * + * The YAML configuration may use associative keys (e.g. `10:`, `20:`) to + * define ordering, so values are cast to strings and re-indexed. + * + * @param list $default + * @return list + */ + private static function normalizeStringList(mixed $value, array $default): array + { + if (!is_array($value)) { + return $default; + } + + return array_values(array_map(strval(...), $value)); + } +} diff --git a/Classes/Domain/DTO/SearchCriteria.php b/Classes/Domain/DTO/SearchCriteria.php new file mode 100644 index 0000000..0af181e --- /dev/null +++ b/Classes/Domain/DTO/SearchCriteria.php @@ -0,0 +1,152 @@ +$field) instead of an explicit mapping. + */ + private const array ORDER_FIELDS = ['name', 'identifier', 'persistenceIdentifier', 'prototypeName', 'storageLocation', 'duplicateIdentifier', 'referenceCount']; + + public string $orderField; + public string $orderDirection; + + public function __construct( + public ?string $searchTerm = null, + ?string $orderField = null, + ?string $orderDirection = null, + public ?int $limit = null, + ) { + // Validate and normalize orderField + $this->orderField = in_array($orderField, self::ORDER_FIELDS, true) + ? $orderField + : self::DEFAULT_ORDER_FIELD; + + // Validate and normalize orderDirection + $this->orderDirection = in_array($orderDirection, [self::ORDER_ASCENDING, self::ORDER_DESCENDING], true) + ? $orderDirection + : self::ORDER_ASCENDING; + } + + public static function fromArray(array $data): self + { + return new self( + searchTerm: $data['searchTerm'] ?? null, + orderField: $data['orderField'] ?? null, + orderDirection: $data['orderDirection'] ?? null, + limit: $data['limit'] ?? null, + ); + } + + public static function fromRequest(ServerRequestInterface $request): self + { + $queryParams = $request->getQueryParams(); + $parsedBody = $request->getParsedBody() ?? []; + + return new self( + searchTerm: $queryParams['searchTerm'] ?? $parsedBody['searchTerm'] ?? null, + orderField: $queryParams['orderField'] ?? $parsedBody['orderField'] ?? null, + orderDirection: $queryParams['orderDirection'] ?? $parsedBody['orderDirection'] ?? null, + limit: isset($queryParams['limit']) ? (int)$queryParams['limit'] : (isset($parsedBody['limit']) ? (int)$parsedBody['limit'] : null), + ); + } + + public function getOrderField(): string + { + return $this->orderField; + } + + public function getOrderDirection(): string + { + return $this->orderDirection; + } + + public function getDefaultOrderDirection(): string + { + return self::ORDER_ASCENDING; + } + + public function getReverseOrderDirection(): string + { + return $this->orderDirection === self::ORDER_ASCENDING + ? self::ORDER_DESCENDING + : self::ORDER_ASCENDING; + } + + public function getSearchTerm(): ?string + { + return $this->searchTerm; + } + + public function hasSearchTerm(): bool + { + return $this->searchTerm !== null && $this->searchTerm !== ''; + } + + public function getLimit(): ?int + { + return $this->limit; + } + + public function hasLimit(): bool + { + return $this->limit !== null && $this->limit > 0; + } + + /** + * Check if any filter/search constraints are set + */ + public function hasConstraints(): bool + { + return $this->hasSearchTerm() || $this->hasLimit(); + } + + public function getParameters(): array + { + $parameters = []; + if ($this->hasSearchTerm()) { + $parameters['searchTerm'] = $this->searchTerm; + } + if ($this->hasLimit()) { + $parameters['limit'] = $this->limit; + } + $parameters['orderField'] = $this->orderField; + $parameters['orderDirection'] = $this->orderDirection; + return $parameters; + } +} diff --git a/Classes/Domain/DTO/StorageContext.php b/Classes/Domain/DTO/StorageContext.php new file mode 100644 index 0000000..1a36609 --- /dev/null +++ b/Classes/Domain/DTO/StorageContext.php @@ -0,0 +1,36 @@ + + * class MyFooBarFactory extends AbstractFormFactory { + * public function build(array $configuration, $prototypeName) { + * $configurationService = GeneralUtility::makeInstance(ConfigurationService::class); + * $prototypeConfiguration = $configurationService->getPrototypeConfiguration($prototypeName); + * $formDefinition = GeneralUtility::makeInstance(FormDefinition::class, 'nameOfMyForm', $prototypeConfiguration); + * + * // now, you should call methods on $formDefinition to add pages and form elements + * + * return $formDefinition; + * } + * } + * + * + * Scope: frontend / backend + * **This class is meant to be sub classed by developers.** + */ +abstract class AbstractFormFactory implements FormFactoryInterface +{ + protected ?EventDispatcherInterface $eventDispatcher = null; + protected ?FormDefinitionConversionService $formDefinitionConversionService = null; + + public function injectEventDispatcher(EventDispatcherInterface $eventDispatcher): void + { + $this->eventDispatcher = $eventDispatcher; + } + + public function injectFormDefinitionConversionService(FormDefinitionConversionService $formDefinitionConversionService): void + { + $this->formDefinitionConversionService = $formDefinitionConversionService; + } + + protected function triggerFormBuildingFinished(FormDefinition $form): FormDefinition + { + return $this->eventDispatcher->dispatch(new AfterFormIsBuiltEvent($form))->form; + } + + protected function getFormDefinitionConversionService(): FormDefinitionConversionService + { + return $this->formDefinitionConversionService; + } +} diff --git a/Classes/Domain/Factory/ArrayFormFactory.php b/Classes/Domain/Factory/ArrayFormFactory.php new file mode 100644 index 0000000..0230761 --- /dev/null +++ b/Classes/Domain/Factory/ArrayFormFactory.php @@ -0,0 +1,148 @@ +getPrototypeConfiguration($prototypeName); + + // Get RTE property paths for proper sanitization + $rtePropertyPaths = $this->getFormDefinitionConversionService()->extractRtePropertyPaths($prototypeConfiguration); + + $configuration = $this->getFormDefinitionConversionService()->sanitizeHtml($configuration, $rtePropertyPaths); + + if ($configuration['invalid'] ?? false) { + throw new RenderingException($configuration['label'], 1529710560); + } + + $form = GeneralUtility::makeInstance( + FormDefinition::class, + $configuration['identifier'], + $prototypeConfiguration, + 'Form', + $persistenceIdentifier + ); + // Set renderingOptions before processing renderables, so that options + // like 'previewMode' are available during initializeFormElement(). + if (isset($configuration['renderingOptions'])) { + foreach ($configuration['renderingOptions'] as $key => $value) { + $form->setRenderingOption($key, $value); + } + } + if (isset($configuration['renderables'])) { + foreach ($configuration['renderables'] as $pageConfiguration) { + $this->addNestedRenderable($pageConfiguration, $form, $request); + } + } + + unset($configuration['persistenceIdentifier']); + unset($configuration['prototypeName']); + unset($configuration['renderables']); + unset($configuration['type']); + unset($configuration['identifier']); + $form->setOptions($configuration); + $form->setRequest($request); + + return $this->triggerFormBuildingFinished($form); + } + + /** + * Add form elements to the $parentRenderable + * + * @return mixed + * @throws IdentifierNotValidException + * @throws UnknownCompositRenderableException + */ + protected function addNestedRenderable( + array $nestedRenderableConfiguration, + CompositeRenderableInterface $parentRenderable, + ?ServerRequestInterface $request = null + ) { + if (!isset($nestedRenderableConfiguration['identifier'])) { + throw new IdentifierNotValidException('Identifier not set.', 1329289436); + } + if ($parentRenderable instanceof FormDefinition) { + $renderable = $parentRenderable->createPage($nestedRenderableConfiguration['identifier'], $nestedRenderableConfiguration['type']); + } elseif ($parentRenderable instanceof AbstractSection) { + $renderable = $parentRenderable->createElement($nestedRenderableConfiguration['identifier'], $nestedRenderableConfiguration['type']); + if ($request !== null && method_exists($renderable, 'setRequest')) { + $renderable->setRequest($request); + } + } else { + throw new UnknownCompositRenderableException('Unknown composit renderable "' . get_class($parentRenderable) . '"', 1479593622); + } + + $childRenderables = is_array($nestedRenderableConfiguration['renderables'] ?? null) + ? $nestedRenderableConfiguration['renderables'] + : []; + + unset($nestedRenderableConfiguration['type']); + unset($nestedRenderableConfiguration['identifier']); + unset($nestedRenderableConfiguration['renderables']); + + $renderable->setOptions($nestedRenderableConfiguration); + + if ($renderable instanceof CompositeRenderableInterface) { + foreach ($childRenderables as $elementConfiguration) { + $this->addNestedRenderable($elementConfiguration, $renderable, $request); + } + } + + return $this->eventDispatcher->dispatch(new BeforeRenderableIsAddedToFormEvent($renderable))->renderable; + } +} diff --git a/Classes/Domain/Factory/FormFactoryInterface.php b/Classes/Domain/Factory/FormFactoryInterface.php new file mode 100644 index 0000000..a3205f8 --- /dev/null +++ b/Classes/Domain/Factory/FormFactoryInterface.php @@ -0,0 +1,55 @@ +viewFactory = $viewFactory; + } + + public function injectTranslationService(TranslationService $translationService) + { + $this->translationService = $translationService; + } + + /** + * @param string $finisherIdentifier The identifier for this finisher + */ + public function setFinisherIdentifier(string $finisherIdentifier): void + { + $this->finisherIdentifier = $finisherIdentifier; + $this->shortFinisherIdentifier = preg_replace('/Finisher$/', '', $finisherIdentifier) ?? ''; + } + + public function getFinisherIdentifier(): string + { + return $this->finisherIdentifier; + } + + /** + * @param array $options configuration options in the format ['option1' => 'value1', 'option2' => 'value2', ...] + */ + public function setOptions(array $options) + { + $this->options = $options; + } + + /** + * Sets a single finisher option (@see setOptions()) + * + * @param string $optionName name of the option to be set + * @param mixed $optionValue value of the option + */ + public function setOption(string $optionName, $optionValue) + { + $this->options[$optionName] = $optionValue; + } + + /** + * Executes the finisher + * + * @param FinisherContext $finisherContext The Finisher context that contains the current Form Runtime and Response + * @return string|null + */ + final public function execute(FinisherContext $finisherContext) + { + $this->finisherContext = $finisherContext; + + if (!$this->isEnabled()) { + return null; + } + + try { + return $this->executeInternal(); + } catch (FinisherException $e) { + $this->logger->error('Failed to execute finisher', ['exception' => $e]); + $this->finisherContext->cancel(); + $formRuntime = $this->finisherContext->getFormRuntime(); + $renderingOptions = $formRuntime->getRenderingOptions(); + $viewFactoryData = new ViewFactoryData( + templateRootPaths: is_array($renderingOptions['templateRootPaths'] ?? null) ? $renderingOptions['templateRootPaths'] : [], + partialRootPaths: is_array($renderingOptions['partialRootPaths'] ?? null) ? $renderingOptions['partialRootPaths'] : [], + layoutRootPaths: is_array($renderingOptions['layoutRootPaths'] ?? null) ? $renderingOptions['layoutRootPaths'] : [], + request: $this->finisherContext->getRequest(), + ); + $view = $this->viewFactory->create($viewFactoryData); + $message = $this->parseOption('errorMessage') ?: $this->translationService->translate('form.finisher.error', null, 'EXT:form/Resources/Private/Language/locallang.xlf'); + $view->assign('message', $message); + return $view->render('Finishers/Error'); + } + } + + /** + * This method is called in the concrete finisher whenever self::execute() is called. + * + * Override and fill with your own implementation! + * + * @throws FinisherException + * @return string|void|null + */ + abstract protected function executeInternal(); + + /** + * Read the option called $optionName from $this->options, and parse {...} + * as object accessors. + * + * Then translate the value. + * + * If $optionName was not found, the corresponding default option is returned (from $this->defaultOptions) + * + * @param string $optionName + * @return string|array|int|bool|\Closure|callable|null + */ + protected function parseOption(string $optionName) + { + if ($optionName === 'translation') { + return null; + } + + try { + $optionValue = ArrayUtility::getValueByPath($this->options, $optionName, '.'); + } catch (MissingArrayPathException $exception) { + $optionValue = null; + } + try { + $defaultValue = ArrayUtility::getValueByPath($this->defaultOptions, $optionName, '.'); + } catch (MissingArrayPathException $exception) { + $defaultValue = null; + } + + if ($optionValue === null && $defaultValue !== null) { + $optionValue = $defaultValue; + } + + if ($optionValue === null) { + return null; + } + + if (!is_string($optionValue) && !is_array($optionValue)) { + return $optionValue; + } + + $formRuntime = $this->finisherContext->getFormRuntime(); + $optionValue = $this->substituteRuntimeReferences($optionValue, $formRuntime); + + if (is_string($optionValue)) { + $translationOptions = is_array($this->options['translation'] ?? null) + ? $this->options['translation'] + : []; + + $optionValue = $this->translateFinisherOption( + $optionValue, + $formRuntime, + $optionName, + $optionValue, + $translationOptions + ); + + $optionValue = $this->substituteRuntimeReferences($optionValue, $formRuntime); + } + + if (empty($optionValue)) { + if ($defaultValue !== null) { + $optionValue = $defaultValue; + } + } + return $optionValue; + } + + /** + * Wraps TranslationService::translateFinisherOption to recursively + * invoke all array items of resolved form state values or nested + * finisher option configuration settings. + * + * @param string|array $subject + * @param FormRuntime $formRuntime + * @param string|array $optionValue + * @return array|string + */ + protected function translateFinisherOption( + $subject, + FormRuntime $formRuntime, + string $optionName, + $optionValue, + array $translationOptions + ) { + if (is_array($subject)) { + foreach ($subject as $key => $value) { + $subject[$key] = $this->translateFinisherOption( + $value, + $formRuntime, + $optionName . '.' . $value, + $value, + $translationOptions + ); + } + return $subject; + } + + return $this->translationService->translateFinisherOption( + $formRuntime, + $this->finisherIdentifier, + $optionName, + $optionValue, + $translationOptions + ); + } + + /** + * You can encapsulate an option value with {}. + * This enables you to access every gettable property from the + * TYPO3\CMS\Form\Domain\Runtime\FormRuntime. + * + * For example: {formState.formValues.} + * or {} + * + * Both examples are equal to "$formRuntime->getFormState()->getFormValues()[]" + * There is a special option value '{__currentTimestamp}'. + * This will be replaced with the current timestamp. + * + * @param string|array $needle + * @param FormRuntime $formRuntime + * @return mixed + */ + protected function substituteRuntimeReferences($needle, FormRuntime $formRuntime) + { + // neither array nor string, directly return + if (!is_array($needle) && !is_string($needle)) { + return $needle; + } + + // resolve (recursively) all array items + if (is_array($needle)) { + $substitutedNeedle = []; + foreach ($needle as $key => $item) { + $key = $this->substituteRuntimeReferences($key, $formRuntime); + $item = $this->substituteRuntimeReferences($item, $formRuntime); + $substitutedNeedle[$key] = $item; + } + return $substitutedNeedle; + } + + // substitute one(!) variable in string which either could result + // again in a string or an array representing multiple values + if (preg_match('/^{([^}]+)}$/', $needle, $matches)) { + return $this->resolveRuntimeReference( + $matches[1], + $formRuntime + ); + } + + // in case string contains more than just one variable or just a static + // value that does not need to be substituted at all, candidates are: + // * "prefix{variable}suffix + // * "{variable-1},{variable-2}" + // * "some static value" + // * mixed cases of the above + return preg_replace_callback( + '/{([^}]+)}/', + function ($matches) use ($formRuntime) { + $value = $this->resolveRuntimeReference( + $matches[1], + $formRuntime + ); + + // substitute each match by returning the resolved value + if (!is_array($value)) { + return $value; + } + + // now the resolve value is an array that shall substitute + // a variable in a string that probably is not the only one + // or is wrapped with other static string content (see above) + // ... which is just not possible + throw new FinisherException( + 'Cannot convert array to string', + 1519239265 + ); + }, + $needle + ); + } + + /** + * Resolving property by name from submitted form data. + * + * @return int|string|array + */ + protected function resolveRuntimeReference(string $property, FormRuntime $formRuntime) + { + if ($property === '__currentTimestamp') { + return time(); + } + + // try to resolve the path '{...}' within the FormRuntime + $value = ObjectAccess::getPropertyPath($formRuntime, $property); + + if (is_object($value)) { + $element = $formRuntime->getFormDefinition()->getElementByIdentifier($property); + + if (!$element instanceof StringableFormElementInterface) { + throw new FinisherException( + sprintf('Cannot convert object value of "%s" to string', $property), + 1574362327 + ); + } + + $value = $element->valueToString($value); + } + + if ($value === null) { + // try to resolve the path '{...}' within the FinisherVariableProvider + $value = ObjectAccess::getPropertyPath( + $this->finisherContext->getFinisherVariableProvider(), + $property + ); + } + + if ($value !== null) { + return $value; + } + + // in case no value could be resolved + return '{' . $property . '}'; + } + + /** + * Returns whether this finisher is enabled + */ + public function isEnabled(): bool + { + return !isset($this->options['renderingOptions']['enabled']) || (bool)$this->parseOption('renderingOptions.enabled') === true; + } +} diff --git a/Classes/Domain/Finishers/ClosureFinisher.php b/Classes/Domain/Finishers/ClosureFinisher.php new file mode 100644 index 0000000..f103cb9 --- /dev/null +++ b/Classes/Domain/Finishers/ClosureFinisher.php @@ -0,0 +1,67 @@ +setOption('closure', function($finisherContext) { + * $formRuntime = $finisherContext->getFormRuntime(); + * // ... + * }); + * $formDefinition->addFinisher($closureFinisher); + * // ... + * + * Scope: frontend + */ +class ClosureFinisher extends AbstractFinisher +{ + /** + * @var array + */ + protected $defaultOptions = [ + 'closure' => null, + ]; + + /** + * Executes this finisher + * @see AbstractFinisher::execute() + * + * @throws FinisherException + */ + protected function executeInternal() + { + $closure = $this->parseOption('closure'); + if ($closure === null) { + return; + } + if (!$closure instanceof \Closure) { + throw new FinisherException(sprintf('The option "closure" must be of type Closure, "%s" given.', gettype($closure)), 1332155239); + } + $closure($this->finisherContext); + } +} diff --git a/Classes/Domain/Finishers/ConfirmationFinisher.php b/Classes/Domain/Finishers/ConfirmationFinisher.php new file mode 100644 index 0000000..610165f --- /dev/null +++ b/Classes/Domain/Finishers/ConfirmationFinisher.php @@ -0,0 +1,127 @@ +setOptions( + * [ + * 'message' => 'foo', + * ] + * ); + * $formDefinition->addFinisher($confirmationFinisher); + * // ... + * + * Scope: frontend + */ +class ConfirmationFinisher extends AbstractFinisher +{ + /** + * @var array + */ + protected $defaultOptions = [ + 'message' => 'The form has been submitted.', + 'contentElementUid' => 0, + 'typoscriptObjectPath' => 'lib.tx_form.contentElementRendering', + ]; + + public function __construct( + private readonly ExtbaseConfigurationManagerInterface $extbaseConfigurationManager, + private readonly ViewFactoryInterface $viewFactory, + ) {} + + /** + * @throws FinisherException + */ + protected function executeInternal(): string + { + $options = $this->options; + if (!isset($options['templateName']) || !is_string($options['templateName'])) { + throw new FinisherException( + 'The option "templateName" must be set for the ConfirmationFinisher.', + 1521573955 + ); + } + + $contentElementUid = $this->parseOption('contentElementUid'); + $typoscriptObjectPath = $this->parseOption('typoscriptObjectPath'); + $typoscriptObjectPath = is_string($typoscriptObjectPath) ? $typoscriptObjectPath : ''; + if (!empty($contentElementUid)) { + $pathSegments = GeneralUtility::trimExplode('.', $typoscriptObjectPath); + $lastSegment = array_pop($pathSegments); + $setup = $this->extbaseConfigurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); + foreach ($pathSegments as $segment) { + if (!array_key_exists($segment . '.', $setup)) { + throw new FinisherException( + sprintf('TypoScript object path "%s" does not exist', $typoscriptObjectPath), + 1489238980 + ); + } + $setup = $setup[$segment . '.']; + } + $contentObjectRenderer = GeneralUtility::makeInstance(ContentObjectRenderer::class); + $contentObjectRenderer->setRequest($this->finisherContext->getRequest()->withoutAttribute('extbase')); + $contentObjectRenderer->start([$contentElementUid]); + $contentObjectRenderer->setCurrentVal((string)$contentElementUid); + $message = $contentObjectRenderer->cObjGetSingle($setup[$lastSegment], $setup[$lastSegment . '.'], $lastSegment); + } else { + $message = $this->parseOption('message'); + } + + $formRuntime = $this->finisherContext->getFormRuntime(); + $viewFactoryData = new ViewFactoryData( + templateRootPaths: is_array($options['templateRootPaths'] ?? null) ? $options['templateRootPaths'] : [], + partialRootPaths: is_array($options['partialRootPaths'] ?? null) ? $options['partialRootPaths'] : [], + layoutRootPaths: is_array($options['layoutRootPaths'] ?? null) ? $options['layoutRootPaths'] : [], + request: $this->finisherContext->getRequest(), + ); + $view = $this->viewFactory->create($viewFactoryData); + if ($view instanceof FluidViewAdapter) { + $view->getRenderingContext()->getViewHelperVariableContainer() + ->addOrUpdate(RenderRenderableViewHelper::class, 'formRuntime', $formRuntime); + } + if (is_array($this->options['variables'] ?? null)) { + $view->assignMultiple($this->options['variables']); + } + $view->assignMultiple([ + 'form' => $formRuntime, + 'finisherVariableProvider' => $this->finisherContext->getFinisherVariableProvider(), + 'message' => $message, + 'isPreparedMessage' => !empty($contentElementUid), + ]); + return $view->render($options['templateName']); + } +} diff --git a/Classes/Domain/Finishers/DeleteUploadsFinisher.php b/Classes/Domain/Finishers/DeleteUploadsFinisher.php new file mode 100644 index 0000000..a407bdd --- /dev/null +++ b/Classes/Domain/Finishers/DeleteUploadsFinisher.php @@ -0,0 +1,109 @@ +finisherContext->getFormRuntime(); + + $uploadFolders = []; + $elements = $formRuntime->getFormDefinition()->getRenderablesRecursively(); + foreach ($elements as $element) { + if (!$element instanceof FileUpload) { + continue; + } + $file = $formRuntime[$element->getIdentifier()]; + if (!$file) { + continue; + } + + if ($file instanceof ExtbaseFileReference) { + $file = $file->getOriginalResource(); + } + if ($file instanceof FileReference) { + $this->deleteFileAndCollectFolder($file, $uploadFolders); + } elseif ($file instanceof ObjectStorage) { + foreach ($file as $singleFile) { + if ($singleFile instanceof ExtbaseFileReference) { + $singleFile = $singleFile->getOriginalResource(); + } + if ($singleFile instanceof FileReference) { + $this->deleteFileAndCollectFolder($singleFile, $uploadFolders); + } + } + } + + } + + $this->deleteEmptyUploadFolders($uploadFolders); + } + + /** + * Deletes the file and collects its parent folder for later cleanup. + * + * @param array $uploadFolders + */ + private function deleteFileAndCollectFolder(FileReference $file, array &$uploadFolders): void + { + $folder = $file->getParentFolder(); + if ($folder instanceof Folder) { + $uploadFolders[$folder->getCombinedIdentifier()] = $folder; + } + $file->getStorage()->deleteFile($file->getOriginalFile()); + } + + /** + * note: + * TYPO3\CMS\Form\Mvc\Property\TypeConverter\UploadedFileReferenceConverter::importUploadedResource() + * creates a sub-folder for file uploads (e.g. .../form_<40-chars-hash>/actual.file) + * @param Folder[] $folders + */ + protected function deleteEmptyUploadFolders(array $folders): void + { + foreach ($folders as $folder) { + if ($this->isEmptyFolder($folder)) { + $folder->delete(); + } + } + } + + protected function isEmptyFolder(Folder $folder): bool + { + return $folder->getFileCount() === 0 + && $folder->getStorage()->countFoldersInFolder($folder) === 0; + } +} diff --git a/Classes/Domain/Finishers/EmailFinisher.php b/Classes/Domain/Finishers/EmailFinisher.php new file mode 100644 index 0000000..5ec763a --- /dev/null +++ b/Classes/Domain/Finishers/EmailFinisher.php @@ -0,0 +1,268 @@ + '', + 'senderName' => '', + 'addHtmlPart' => true, + 'attachUploads' => true, + ]; + + public function __construct( + protected readonly EventDispatcherInterface $eventDispatcher, + protected readonly TemplatedEmailFactory $templatedEmailFactory, + protected readonly MailerInterface $mailer, + ) {} + + /** + * Executes this finisher + * @see AbstractFinisher::execute() + * + * @throws FinisherException + */ + protected function executeInternal(): void + { + $this->options = $this->eventDispatcher + ->dispatch(new BeforeEmailFinisherInitializedEvent($this->finisherContext, $this->options)) + ->getOptions(); + // Flexform overrides write strings instead of integers so + // we need to cast the string '0' to false. + if ( + isset($this->options['addHtmlPart']) + && $this->options['addHtmlPart'] === '0' + ) { + $this->options['addHtmlPart'] = false; + } + + $subject = (string)$this->parseOption('subject'); + $recipients = $this->getRecipients('recipients'); + $senderAddress = $this->parseOption('senderAddress'); + $senderAddress = is_string($senderAddress) ? $senderAddress : ''; + $senderName = $this->parseOption('senderName'); + $senderName = is_string($senderName) ? $senderName : ''; + $replyToRecipients = $this->getRecipients('replyToRecipients'); + $carbonCopyRecipients = $this->getRecipients('carbonCopyRecipients'); + $blindCarbonCopyRecipients = $this->getRecipients('blindCarbonCopyRecipients'); + $addHtmlPart = (bool)$this->parseOption('addHtmlPart'); + $attachUploads = $this->parseOption('attachUploads'); + $title = (string)$this->parseOption('title') ?: $subject; + + if ($subject === '') { + throw new FinisherException('The option "subject" must be set for the EmailFinisher.', 1327060320); + } + if (empty($recipients)) { + throw new FinisherException('The option "recipients" must be set for the EmailFinisher.', 1327060200); + } + if (empty($senderAddress)) { + throw new FinisherException('The option "senderAddress" must be set for the EmailFinisher.', 1327060210); + } + + $formRuntime = $this->finisherContext->getFormRuntime(); + + $mail = $this + ->initializeFluidEmail($formRuntime) + ->from(new Address($senderAddress, $senderName)) + ->to(...$recipients) + ->subject($subject) + ->format($addHtmlPart ? FluidEmail::FORMAT_BOTH : FluidEmail::FORMAT_PLAIN) + ->assign('title', $title); + + if (!empty($replyToRecipients)) { + $mail->replyTo(...$replyToRecipients); + } + + if (!empty($carbonCopyRecipients)) { + $mail->cc(...$carbonCopyRecipients); + } + + if (!empty($blindCarbonCopyRecipients)) { + $mail->bcc(...$blindCarbonCopyRecipients); + } + + if (is_string($this->options['translation']['language'] ?? null) && $this->options['translation']['language'] !== '') { + $mail->assign('languageKey', $this->options['translation']['language']); + } + + $message = $this->parseOption('message'); + if (is_string($message) && $message !== '') { + // Remove whitespace between HTML tags to prevent lib.parseFunc_RTE + // from converting newlines into additional blank lines in the email output + $message = preg_replace('/>\s+<', $message); + $placeholderPos = strpos($message, '{formValues}'); + if ($placeholderPos !== false) { + $mail->assign('messageBefore', substr($message, 0, $placeholderPos)); + $mail->assign('messageAfter', substr($message, $placeholderPos + strlen('{formValues}'))); + } else { + // No placeholder - show message only, no form values + $mail->assign('messageBefore', $message); + $mail->assign('messageAfter', ''); + $mail->assign('hideFormValues', true); + } + } + + if ($attachUploads) { + foreach ($formRuntime->getFormDefinition()->getRenderablesRecursively() as $element) { + if (!$element instanceof FileUpload) { + continue; + } + $file = $formRuntime[$element->getIdentifier()]; + if ($file instanceof FileReference) { + $file = $file->getOriginalResource(); + } + if ($file instanceof FileInterface) { + $mail->attach($file->getContents(), $file->getName(), $file->getMimeType()); + } elseif ($file instanceof ObjectStorage) { + foreach ($file as $singleFile) { + if ($singleFile instanceof FileReference) { + $singleFile = $singleFile->getOriginalResource(); + } + if ($singleFile instanceof FileInterface) { + $mail->attach($singleFile->getContents(), $singleFile->getName(), $singleFile->getMimeType()); + } + } + } + } + } + + try { + $this->mailer->send($mail); + } catch (TransportExceptionInterface $e) { + throw new FinisherException( + 'Failed to send the email: ' . $e->getMessage(), + 1754047320, + $e + ); + } + } + + protected function initializeFluidEmail(FormRuntime $formRuntime): FluidEmail + { + $mailMessage = $this->templatedEmailFactory->createWithOverrides( + $this->options['templateRootPaths'] ?? [], + $this->options['layoutRootPaths'] ?? [], + $this->options['partialRootPaths'] ?? [], + $this->finisherContext->getRequest(), + ); + + if (!isset($this->options['templateName']) || $this->options['templateName'] === '') { + throw new FinisherException('The option "templateName" must be set to use FluidEmail.', 1599834020); + } + + // Migrate old template name to default FluidEmail name + if ($this->options['templateName'] === '{@format}.html') { + $this->options['templateName'] = 'Default'; + } + + $mailMessage + ->setTemplate($this->options['templateName']) + ->assignMultiple([ + 'finisherVariableProvider' => $this->finisherContext->getFinisherVariableProvider(), + 'form' => $formRuntime, + ]); + + if (is_array($this->options['variables'] ?? null)) { + $mailMessage->assignMultiple($this->options['variables']); + } + + $mailMessage + ->getViewHelperVariableContainer() + ->addOrUpdate(RenderRenderableViewHelper::class, 'formRuntime', $formRuntime); + + return $mailMessage; + } + + protected function getRecipients(string $listOption): array + { + $recipients = $this->parseOption($listOption) ?? []; + if (!is_array($recipients) || $recipients === []) { + return []; + } + + $addresses = []; + foreach ($recipients as $address => $name) { + // The if is needed to set address and name with TypoScript + if (MathUtility::canBeInterpretedAsInteger($address)) { + if (is_array($name)) { + $address = $name[0] ?? ''; + $name = $name[1] ?? ''; + } else { + $address = $name; + $name = ''; + } + } + + $address = trim((string)$address); + + if (!GeneralUtility::validEmail($address)) { + // Drop entries without a valid address + continue; + } + $addresses[] = new Address($address, $name); + } + return $addresses; + } +} diff --git a/Classes/Domain/Finishers/Exception/FinisherException.php b/Classes/Domain/Finishers/Exception/FinisherException.php new file mode 100644 index 0000000..71f3049 --- /dev/null +++ b/Classes/Domain/Finishers/Exception/FinisherException.php @@ -0,0 +1,25 @@ +formRuntime = $formRuntime; + $this->request = $request; + $this->finisherVariableProvider = new FinisherVariableProvider(); + } + + /** + * Cancels the finisher invocation after the current finisher + */ + public function cancel() + { + $this->cancelled = true; + } + + /** + * TRUE if no further finishers should be invoked. Defaults to FALSE + * + * @internal + */ + public function isCancelled(): bool + { + return $this->cancelled; + } + + /** + * The Form Runtime that is associated with the current finisher + */ + public function getFormRuntime(): FormRuntime + { + return $this->formRuntime; + } + + /** + * The values of the submitted form (after validation and property mapping) + */ + public function getFormValues(): array + { + return $this->formRuntime->getFormState()->getFormValues(); + } + + public function getFinisherVariableProvider(): FinisherVariableProvider + { + return $this->finisherVariableProvider; + } + + public function getRequest(): Request + { + return $this->request; + } +} diff --git a/Classes/Domain/Finishers/FinisherInterface.php b/Classes/Domain/Finishers/FinisherInterface.php new file mode 100644 index 0000000..8a2bd90 --- /dev/null +++ b/Classes/Domain/Finishers/FinisherInterface.php @@ -0,0 +1,59 @@ + 'value1', 'option2' => 'value2', ...] + */ + public function setOptions(array $options); + + /** + * Sets a single finisher option (@see setOptions()) + * + * @param string $optionName name of the option to be set + * @param mixed $optionValue value of the option + */ + public function setOption(string $optionName, $optionValue); + + /** + * Returns whether this finisher is enabled + */ + public function isEnabled(): bool; +} diff --git a/Classes/Domain/Finishers/FinisherVariableProvider.php b/Classes/Domain/Finishers/FinisherVariableProvider.php new file mode 100644 index 0000000..d07fada --- /dev/null +++ b/Classes/Domain/Finishers/FinisherVariableProvider.php @@ -0,0 +1,187 @@ +addOrUpdate($finisherIdentifier, $key, $value); + } + + /** + * Add a variable to the Variable Container. + * In case the value is already inside, it is silently overridden. + * + * @param mixed $value + */ + public function addOrUpdate(string $finisherIdentifier, string $key, $value) + { + if (!array_key_exists($finisherIdentifier, $this->objects)) { + $this->objects[$finisherIdentifier] = []; + } + $this->objects[$finisherIdentifier] = ArrayUtility::setValueByPath( + $this->objects[$finisherIdentifier], + $key, + $value, + '.' + ); + } + + /** + * Gets a variable which is stored + * + * @param mixed $default + * @return mixed + */ + public function get(string $finisherIdentifier, string $key, $default = null) + { + if ($this->exists($finisherIdentifier, $key)) { + return ArrayUtility::getValueByPath($this->objects[$finisherIdentifier], $key, '.'); + } + return $default; + } + + /** + * Determine whether there is a variable stored for the given key + * + * @param string $finisherIdentifier + * @param string $key + */ + public function exists($finisherIdentifier, $key): bool + { + try { + ArrayUtility::getValueByPath($this->objects[$finisherIdentifier] ?? [], $key, '.'); + } catch (MissingArrayPathException $e) { + return false; + } + return true; + } + + /** + * Remove a value from the variable container + */ + public function remove(string $finisherIdentifier, string $key) + { + if ($this->exists($finisherIdentifier, $key)) { + $this->objects[$finisherIdentifier] = ArrayUtility::removeByPath( + $this->objects[$finisherIdentifier], + $key, + '.' + ); + } + } + + /** + * Clean up for serializing. + * + * @return array + */ + public function __sleep() + { + return ['objects']; + } + + /** + * Whether an offset exists + * + * @link https://php.net/manual/en/arrayaccess.offsetexists.php + * @param mixed $offset An offset to check for. + * @return bool TRUE on success or FALSE on failure. + */ + public function offsetExists(mixed $offset): bool + { + return isset($this->objects[$offset]); + } + + /** + * Offset to retrieve + * + * @link https://php.net/manual/en/arrayaccess.offsetget.php + * @param mixed $offset The offset to retrieve. + * @return mixed Can return all value types. + */ + public function offsetGet(mixed $offset): mixed + { + return $this->objects[$offset]; + } + + /** + * Offset to set + * + * @link https://php.net/manual/en/arrayaccess.offsetset.php + * @param mixed $offset The offset to assign the value to. + * @param mixed $value The value to set. + */ + public function offsetSet(mixed $offset, mixed $value): void + { + $this->objects[$offset] = $value; + } + + /** + * Offset to unset + * + * @link https://php.net/manual/en/arrayaccess.offsetunset.php + * @param mixed $offset The offset to unset. + */ + public function offsetUnset(mixed $offset): void + { + unset($this->objects[$offset]); + } + + public function getIterator(): \Traversable + { + foreach ($this->objects as $offset => $value) { + yield $offset => $value; + } + } + + /** + * Count elements of an object + * + * @link https://php.net/manual/en/countable.count.php + * @return int The custom count as an integer. + */ + public function count(): int + { + return count($this->objects); + } +} diff --git a/Classes/Domain/Finishers/FlashMessageFinisher.php b/Classes/Domain/Finishers/FlashMessageFinisher.php new file mode 100644 index 0000000..c75723d --- /dev/null +++ b/Classes/Domain/Finishers/FlashMessageFinisher.php @@ -0,0 +1,128 @@ +setOptions( + * [ + * 'messageBody' => 'Some message body', + * 'messageTitle' => 'Some message title', + * 'messageArguments' => ['foo' => 'bar'], + * 'severity' => \TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR + * ] + * ); + * $formDefinition->addFinisher($flashMessageFinisher); + * // ... + * + * Scope: frontend + */ +class FlashMessageFinisher extends AbstractFinisher +{ + /** + * @var array + */ + protected $defaultOptions = [ + 'messageBody' => null, + 'messageTitle' => '', + 'messageArguments' => [], + 'messageCode' => null, + 'severity' => ContextualFeedbackSeverity::OK, + ]; + + private ExtensionService $extensionService; + private FlashMessageService $flashMessageService; + + public function injectFlashMessageService(FlashMessageService $flashMessageService): void + { + $this->flashMessageService = $flashMessageService; + } + + public function injectExtensionService(ExtensionService $extensionService): void + { + $this->extensionService = $extensionService; + } + + /** + * Executes this finisher + * @see AbstractFinisher::execute() + * + * @throws FinisherException + */ + protected function executeInternal() + { + $messageBody = $this->parseOption('messageBody'); + if (!is_string($messageBody)) { + throw new FinisherException(sprintf('The message body must be of type string, "%s" given.', gettype($messageBody)), 1335980069); + } + $messageTitle = $this->parseOption('messageTitle'); + $messageArguments = $this->parseOption('messageArguments'); + $messageCode = $this->parseOption('messageCode'); + $severity = $this->parseOption('severity'); + + if (MathUtility::canBeInterpretedAsInteger($severity)) { + $severity = ContextualFeedbackSeverity::tryFrom((int)$severity); + } + if (!$severity instanceof ContextualFeedbackSeverity) { + $severity = $this->defaultOptions['severity']; + } + + $messageClass = match ($severity) { + ContextualFeedbackSeverity::NOTICE => Notice::class, + ContextualFeedbackSeverity::WARNING => Warning::class, + ContextualFeedbackSeverity::ERROR => Error::class, + default => Message::class, + }; + /** @var Message|Notice|Warning|Error $message */ + $message = GeneralUtility::makeInstance($messageClass, $messageBody, $messageCode, $messageArguments, $messageTitle); + $flashMessage = new FlashMessage( + $message->render(), + $message->getTitle(), + $severity, + true + ); + + // todo: this value has to be taken from the request directly in the future + $pluginNamespace = $this->extensionService->getPluginNamespace( + $this->finisherContext->getRequest()->getControllerExtensionName(), + $this->finisherContext->getRequest()->getPluginName() + ); + + $this->flashMessageService->getMessageQueueByIdentifier('extbase.flashmessages.' . $pluginNamespace)->addMessage($flashMessage); + } +} diff --git a/Classes/Domain/Finishers/RedirectFinisher.php b/Classes/Domain/Finishers/RedirectFinisher.php new file mode 100644 index 0000000..2019d6e --- /dev/null +++ b/Classes/Domain/Finishers/RedirectFinisher.php @@ -0,0 +1,110 @@ + 1, + 'additionalParameters' => '', + 'statusCode' => 303, + 'fragment' => '', + ]; + + /** + * Executes this finisher + * @see AbstractFinisher::execute() + */ + protected function executeInternal(): void + { + $pageUid = $this->parseOption('pageUid'); + $pageUid = (int)str_replace('pages_', '', (string)$pageUid); + $additionalParameters = $this->parseOption('additionalParameters'); + $additionalParameters = is_string($additionalParameters) ? $additionalParameters : ''; + $additionalParameters = '&' . ltrim($additionalParameters, '&'); + $statusCode = (int)$this->parseOption('statusCode'); + $fragment = (string)$this->parseOption('fragment'); + + $this->finisherContext->cancel(); + $this->redirect($pageUid, $additionalParameters, $fragment, $statusCode); + } + + /** + * Redirects the request to another page. + * + * Redirect will be sent to the client which then performs another request to the new URI. + * + * NOTE: This method only supports web requests and will thrown an exception + * if used with other request types. + * + * @param int $pageUid Target page uid. If NULL, the current page uid is used + * @param int $statusCode (optional) The HTTP status code for the redirect. Default is "303 See Other" + * @see forward() + */ + protected function redirect(int $pageUid, string $additionalParameters, string $fragment, int $statusCode): never + { + $redirectUri = $this->finisherContext->getRequest()->getAttribute('currentContentObject')->createUrl([ + 'parameter' => $pageUid, + 'additionalParams' => $additionalParameters, + 'section' => $fragment, + ]); + $this->redirectToUri($redirectUri, $statusCode); + } + + /** + * Redirects the web request to another uri. + * + * NOTE: This method only supports web requests and will throw an exception if used with other request types. + * + * @param string $uri A string representation of a URI + * @param int $statusCode (optional) The HTTP status code for the redirect. Default is "303 See Other + * @throws PropagateResponseException + */ + protected function redirectToUri(string $uri, int $statusCode = 303): never + { + $uri = $this->addBaseUriIfNecessary($uri); + $response = new RedirectResponse($uri, $statusCode); + // End processing and dispatching by throwing a PropagateResponseException with our response. + // @todo: Should be changed to *return* a response instead, but this requires the ContentObjectRender + // @todo: to deal with responses instead of strings, if the form is used in a fluid template rendered by the + // @todo: FluidTemplateContentObject and the extbase bootstrap isn't used. + throw new PropagateResponseException($response, 1477070964); + } + + /** + * Adds the base uri if not already in place. + * + * @param string $uri The URI + */ + protected function addBaseUriIfNecessary(string $uri): string + { + return GeneralUtility::locationHeaderUrl($uri, $this->finisherContext->getRequest()); + } +} diff --git a/Classes/Domain/Finishers/SaveToDatabaseFinisher.php b/Classes/Domain/Finishers/SaveToDatabaseFinisher.php new file mode 100644 index 0000000..96bb877 --- /dev/null +++ b/Classes/Domain/Finishers/SaveToDatabaseFinisher.php @@ -0,0 +1,407 @@ +.mapOnDatabaseColumn (mandatory) + * -------------------------------------------------------- + * The value from the submitted form element with the identifier + * '' will be written into this database column + * + * options.elements..skipIfValueIsEmpty (default: false) + * ------------------------------------------------------ + * Set this to true if the database column should not be written + * if the value from the submitted form element with the identifier + * '' is empty (think about password fields etc.) + * + * options.elements..hashed (default: false) + * ------------------------------------------------------ + * Set this to true if the value from the submitted form element + * should be hashed before writing into the database. + * + * options.elements..saveFileIdentifierInsteadOfUid (default: false) + * ------------------------------------------------------------------- + * This setting only rules for form elements which creates a FAL object + * like FileUpload or ImageUpload. + * By default, the uid of the FAL object will be written into + * the database column. Set this to true if you want to store the + * FAL identifier (1:/user_uploads/some_uploaded_pic.jpg) instead. + * + * options.databaseColumnMappings + * ------------------------------ + * Use this to map database columns to static values (which can be + * made dynamic through typoscript overrides of course). + * Each key within options.databaseColumnMappings has to match with a + * existing database column. + * The value for each key within options.databaseColumnMappings is an + * array with additional information. + * + * This mapping is done *before* the options.elements mapping. + * This means if you map a database column to a value through + * options.databaseColumnMappings and map a submitted form element + * value to the same database column, the submitted form element value + * will override the value you set within options.databaseColumnMappings. + * + * options.databaseColumnMappings..value + * --------------------------------------------------------- + * The value which will be written to the database column. + * You can use the FormRuntime accessor feature to access every + * getable property from the TYPO3\CMS\Form\Domain\Runtime\FormRuntime + * Read the description within + * TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher::parseOption + * In short: use something like {} to get the value + * from the submitted form element with the identifier + * + * + * Don't be confused. If you use the FormRuntime accessor feature within + * options.databaseColumnMappings, the functionality is nearly equal + * to the options.elements configuration. + * + * options.databaseColumnMappings..skipIfValueIsEmpty (default: false) + * --------------------------------------------------------------------- + * Set this to true if the database column should not be written + * if the value from + * options.databaseColumnMappings..value is empty. + * + * Example + * ======= + * + * finishers: + * - + * identifier: SaveToDatabase + * options: + * table: 'fe_users' + * mode: update + * whereClause: + * uid: 1 + * databaseColumnMappings: + * pid: + * value: 1 + * elements: + * text-1: + * mapOnDatabaseColumn: 'first_name' + * text-2: + * mapOnDatabaseColumn: 'last_name' + * text-3: + * mapOnDatabaseColumn: 'username' + * advancedpassword-1: + * mapOnDatabaseColumn: 'password' + * skipIfValueIsEmpty: true + * hashed: true + * + * Multiple database operations + * ============================ + * + * You can write options as an array to perform multiple database operations. + * + * finishers: + * - + * identifier: SaveToDatabase + * options: + * 1: + * table: 'my_table' + * mode: insert + * databaseColumnMappings: + * some_column: + * value: 'cool' + * 2: + * table: 'my_other_table' + * mode: update + * whereClause: + * pid: 1 + * databaseColumnMappings: + * some_other_column: + * value: '{SaveToDatabase.insertedUids.1}' + * + * This would perform 2 database operations. + * One insert and one update. + * You can access the inserted uids with '{SaveToDatabase.insertedUids.}' + * If you perform an insert operation, the value of the inserted database row will be stored + * within the FinisherVariableProvider. + * references to the numeric key within options + * within which the insert operation is executed. + * + * Scope: frontend + */ +class SaveToDatabaseFinisher extends AbstractFinisher +{ + /** + * @var array + */ + protected $defaultOptions = [ + 'table' => null, + 'mode' => 'insert', + 'whereClause' => [], + 'elements' => [], + 'databaseColumnMappings' => [], + ]; + + /** + * @var \TYPO3\CMS\Core\Database\Connection + */ + protected $databaseConnection; + + /** + * Executes this finisher + * @see AbstractFinisher::execute() + * + * @throws FinisherException + */ + protected function executeInternal(): void + { + $options = []; + if (isset($this->options['table'])) { + $options[] = $this->options; + } else { + $options = $this->options; + } + + foreach ($options as $optionKey => $option) { + $this->options = $option; + $this->process($optionKey); + } + } + + /** + * Prepare data for saving to database + */ + protected function prepareData(array $elementsConfiguration, array $databaseData): array + { + foreach ($this->getFormValues() as $elementIdentifier => $elementValue) { + if ( + ($elementValue === null || $elementValue === '') + && isset($elementsConfiguration[$elementIdentifier]) + && isset($elementsConfiguration[$elementIdentifier]['skipIfValueIsEmpty']) + && $elementsConfiguration[$elementIdentifier]['skipIfValueIsEmpty'] === true + ) { + continue; + } + + $element = $this->getElementByIdentifier($elementIdentifier); + if ( + !$element + || !isset($elementsConfiguration[$elementIdentifier]) + || !isset($elementsConfiguration[$elementIdentifier]['mapOnDatabaseColumn']) + ) { + continue; + } + + if (isset($elementsConfiguration[$elementIdentifier]['saveFileIdentifierInsteadOfUid'])) { + $saveFileIdentifierInsteadOfUid = (bool)$elementsConfiguration[$elementIdentifier]['saveFileIdentifierInsteadOfUid']; + } else { + $saveFileIdentifierInsteadOfUid = false; + } + + if ($elementValue instanceof FileReference) { + $elementValue = $this->prepareFileForDatabase($elementValue, $saveFileIdentifierInsteadOfUid); + } elseif ($elementValue instanceof ObjectStorage) { + $fileIdentifiers = []; + foreach ($elementValue as $singleElement) { + if ($singleElement instanceof FileReference) { + $fileIdentifiers[] = $this->prepareFileForDatabase($singleElement, $saveFileIdentifierInsteadOfUid); + } + } + $elementValue = implode(',', $fileIdentifiers); + } elseif (is_array($elementValue)) { + $elementValue = implode(',', $elementValue); + } elseif ($elementValue instanceof \DateTimeInterface) { + $format = $elementsConfiguration[$elementIdentifier]['dateFormat'] ?? 'U'; + $elementValue = $elementValue->format($format); + } elseif ($elementValue && ($elementsConfiguration[$elementIdentifier]['hashed'] ?? false) === true) { + $hashInstance = GeneralUtility::makeInstance(PasswordHashFactory::class)->getDefaultHashInstance('FE'); + $elementValue = $hashInstance->getHashedPassword($elementValue); + } + + $databaseData[$elementsConfiguration[$elementIdentifier]['mapOnDatabaseColumn']] = $elementValue; + } + return $databaseData; + } + + /** + * Perform the current database operation + * @throws FinisherException + */ + protected function process(int $iterationCount): void + { + $this->throwExceptionOnInconsistentConfiguration(); + + $table = $this->parseOption('table'); + $table = is_string($table) ? $table : ''; + $elementsConfiguration = $this->parseOption('elements'); + $elementsConfiguration = is_array($elementsConfiguration) ? $elementsConfiguration : []; + $databaseColumnMappingsConfiguration = $this->parseOption('databaseColumnMappings'); + + $this->databaseConnection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($table); + + $databaseData = []; + foreach ($databaseColumnMappingsConfiguration as $databaseColumnName => $databaseColumnConfiguration) { + $value = $this->parseOption('databaseColumnMappings.' . $databaseColumnName . '.value'); + if ( + empty($value) + && ($databaseColumnConfiguration['skipIfValueIsEmpty'] ?? false) === true + ) { + continue; + } + + $databaseData[$databaseColumnName] = $value; + } + + $databaseData = $this->prepareData($elementsConfiguration, $databaseData); + + try { + $this->saveToDatabase($databaseData, $table, $iterationCount); + } catch (Exception $e) { + throw new FinisherException( + 'Failed to save data to database table: ' . $table . '. Error message:' . $e->getMessage(), + 1754050114, + $e + ); + } + } + + /** + * Save or insert the values from + * $databaseData into the table $table + * @throws Exception + */ + protected function saveToDatabase(array $databaseData, string $table, int $iterationCount): void + { + if (!empty($databaseData)) { + if ($this->parseOption('mode') === 'update') { + $whereClause = $this->parseOption('whereClause'); + foreach ($whereClause as $columnName => $columnValue) { + $whereClause[$columnName] = $this->parseOption('whereClause.' . $columnName); + } + $this->databaseConnection->update( + $table, + $databaseData, + $whereClause + ); + } else { + $this->databaseConnection->insert($table, $databaseData); + try { + $insertedUid = (int)$this->databaseConnection->lastInsertId(); + } catch (Exception) { + // Some database tables like sys_category_record_mm may not + // have an "identity" (uid column). In this case DBAL may + // throw an exception, which we gracefully handle here. + $insertedUid = 0; + } + $this->finisherContext->getFinisherVariableProvider()->add( + $this->shortFinisherIdentifier, + 'insertedUids.' . $iterationCount, + $insertedUid + ); + } + } + } + + /** + * Throws an exception if some inconsistent configuration + * are detected. + * + * @throws FinisherException + */ + protected function throwExceptionOnInconsistentConfiguration(): void + { + if ( + $this->parseOption('mode') === 'update' + && empty($this->parseOption('whereClause')) + ) { + throw new FinisherException( + 'An empty option "whereClause" is not allowed in update mode.', + 1480469086 + ); + } + } + + /** + * Returns the values of the submitted form + */ + protected function getFormValues(): array + { + return $this->finisherContext->getFormValues(); + } + + /** + * Returns a form element object for a given identifier. + * + * @return FormElementInterface|null + */ + protected function getElementByIdentifier(string $elementIdentifier): ?FormElementInterface + { + return $this + ->finisherContext + ->getFormRuntime() + ->getFormDefinition() + ->getElementByIdentifier($elementIdentifier); + } + + protected function prepareFileForDatabase(FileReference $fileReference, bool $saveFileIdentifierInsteadOfUid = false): int|string + { + if ($saveFileIdentifierInsteadOfUid) { + $elementValue = $fileReference->getOriginalResource()->getCombinedIdentifier(); + } else { + $elementValue = $fileReference->getOriginalResource()->getProperty('uid_local'); + } + + return $elementValue; + } +} diff --git a/Classes/Domain/Model/Exception.php b/Classes/Domain/Model/Exception.php new file mode 100644 index 0000000..ac158ee --- /dev/null +++ b/Classes/Domain/Model/Exception.php @@ -0,0 +1,25 @@ +addPage($page); + * + * $element1 = GeneralUtility::makeInstance(GenericFormElement::class, 'title', 'Textfield'); # the second argument is the type of the form element + * $page1->addElement($element1); + * \--- + * + * Creating a Form, Using Abstract Form Element Types + * ===================================================== + * + * While you can use the {@link FormDefinition::addPage} or {@link Page::addElement} + * methods and create the Page and FormElement objects manually, it is often better + * to use the corresponding create* methods ({@link FormDefinition::createPage} + * and {@link Page::createElement}), as you pass them an abstract *Form Element Type* + * such as *Text* or *Page*, and the system **automatically + * resolves the implementation class name and sets default values**. + * + * So the simple example from above should be rewritten as follows: + * + * /---code php + * $prototypeConfiguration = []; // We'll talk about this later + * + * $formDefinition = GeneralUtility::makeInstance(FormDefinition::class, 'myForm', $prototypeConfiguration); + * $page1 = $formDefinition->createPage('page1'); + * $element1 = $page1->addElement('title', 'Textfield'); + * \--- + * + * Now, you might wonder how the system knows that the element *Textfield* + * is implemented using a GenericFormElement: **This is configured in the $prototypeConfiguration**. + * + * To make the example from above actually work, we need to add some sensible + * values to *$prototypeConfiguration*: + * + *
+ * $prototypeConfiguration = [
+ *   'formElementsDefinition' => [
+ *     'Page' => [
+ *       'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\Page'
+ *     ],
+ *     'Textfield' => [
+ *       'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement'
+ *     ]
+ *   ]
+ * ]
+ * 
+ * + * For each abstract *Form Element Type* we add some configuration; in the above + * case only the *implementation class name*. Still, it is possible to set defaults + * for *all* configuration options of such an element, as the following example + * shows: + * + *
+ * $prototypeConfiguration = [
+ *   'formElementsDefinition' => [
+ *     'Page' => [
+ *       'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\Page',
+ *       'label' => 'this is the label of the page if nothing is specified'
+ *     ],
+ *     'Textfield' => [
+ *       'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement',
+ *       'label' = >'Default Label',
+ *       'defaultValue' => 'Default form element value',
+ *       'properties' => [
+ *         'placeholder' => 'Text which is shown if element is empty'
+ *       ]
+ *     ]
+ *   ]
+ * ]
+ * 
+ * + * Using Preconfigured $prototypeConfiguration + * --------------------------------- + * + * Often, it is not really useful to manually create the $prototypeConfiguration array. + * + * Most of it comes pre-configured inside the YAML settings of the extensions, + * and the {@link \TYPO3\CMS\Form\Domain\Configuration\ConfigurationService} contains helper methods + * which return the ready-to-use *$prototypeConfiguration*. + * + * Property Mapping and Validation Rules + * ===================================== + * + * Besides Pages and FormElements, the FormDefinition can contain information + * about the *format of the data* which is inputted into the form. This generally means: + * + * - expected Data Types + * - Property Mapping Configuration to be used + * - Validation Rules which should apply + * + * Background Info + * --------------- + * You might wonder why Data Types and Validation Rules are *not attached + * to each FormElement itself*. + * + * If the form should create a *hierarchical output structure* such as a multi- + * dimensional array or a PHP object, your expected data structure might look as follows: + *
+ * - person
+ * -- firstName
+ * -- lastName
+ * -- address
+ * --- street
+ * --- city
+ * 
+ * + * Now, let's imagine you want to edit *person.address.street* and *person.address.city*, + * but want to validate that the *combination* of *street* and *city* is valid + * according to some address database. + * + * In this case, the form elements would be configured to fill *street* and *city*, + * but the *validator* needs to be attached to the *compound object* *address*, + * as both parts need to be validated together. + * + * Connecting FormElements to the output data structure + * ==================================================== + * + * The *identifier* of the *FormElement* is most important, as it determines + * where in the output structure the value which is entered by the user is placed, + * and thus also determines which validation rules need to apply. + * + * Using the above example, if you want to create a FormElement for the *street*, + * you should use the identifier *person.address.street*. + * + * Rendering a FormDefinition + * ========================== + * + * In order to trigger *rendering* on a FormDefinition, + * the current {@link \TYPO3\CMS\Extbase\Mvc\Request} needs to be bound to the FormDefinition, + * resulting in a {@link \TYPO3\CMS\Form\Domain\Runtime\FormRuntime} object which contains the *Runtime State* of the form + * (such as the currently inserted values). + * + * /---code php + * # $currentRequest and $currentResponse need to be available, f.e. inside a controller you would + * # use $this->request. Inside a ViewHelper you would use $this->renderingContext->getRequest() + * $form = $formDefinition->bind($currentRequest); + * + * # now, you can use the $form object to get information about the currently + * # entered values into the form, etc. + * \--- + * + * Refer to the {@link \TYPO3\CMS\Form\Domain\Runtime\FormRuntime} API doc for further information. + * + * Scope: frontend + * **This class is NOT meant to be sub classed by developers.** + * + * @internal May change any time, use FormFactoryInterface to select a different FormDefinition if needed + * @todo: Declare final in v12 + */ +class FormDefinition extends AbstractCompositeRenderable implements VariableRenderableInterface +{ + /** + * The Form's pages + * + * @var array + */ + protected $renderables = []; + + /** + * The finishers for this form + * + * @var list + */ + protected array $finishers = []; + + /** + * Property Mapping Rules, indexed by element identifier + * + * @var array + */ + protected array $processingRules = []; + + /** + * Contains all elements of the form, indexed by identifier. + * Is used as internal cache as we need this really often. + * + * @var array + */ + protected array $elementsByIdentifier = []; + + /** + * Form element default values in the format ['elementIdentifier' => 'default value'] + * + * @var array + */ + protected array $elementDefaultValues = []; + + /** + * Renderer class name to be used. + */ + protected string $rendererClassName = ''; + + /** + * @var array> + */ + protected array $typeDefinitions = []; + + /** + * @var array> + */ + protected array $validatorsDefinition = []; + + /** + * @var array> + */ + protected array $finishersDefinition = []; + + /** + * The persistence identifier of the form + */ + protected string $persistenceIdentifier = ''; + + /** + * Constructor. Creates a new FormDefinition with the given identifier. + * + * @param string $identifier The Form Definition's identifier, must be a non-empty string. + * @param array $prototypeConfiguration overrides form defaults of this definition + * @param string $type element type of this form + * @param string|null $persistenceIdentifier the persistence identifier of the form + * @throws IdentifierNotValidException if the identifier was not valid + */ + public function __construct( + string $identifier, + array $prototypeConfiguration = [], + string $type = 'Form', + ?string $persistenceIdentifier = null + ) { + $this->typeDefinitions = $prototypeConfiguration['formElementsDefinition'] ?? []; + $this->validatorsDefinition = $prototypeConfiguration['validatorsDefinition'] ?? []; + $this->finishersDefinition = $prototypeConfiguration['finishersDefinition'] ?? []; + + if ($identifier === '') { + throw new IdentifierNotValidException('The given identifier was empty.', 1477082503); + } + + $this->identifier = $identifier; + $this->type = $type; + $this->persistenceIdentifier = (string)$persistenceIdentifier; + + if ($prototypeConfiguration !== []) { + $this->initializeFromFormDefaults(); + } + } + + /** + * Initialize the form defaults of the current type + * + * @throws TypeDefinitionNotFoundException + * @internal + */ + protected function initializeFromFormDefaults() + { + if (!isset($this->typeDefinitions[$this->type])) { + throw new TypeDefinitionNotFoundException(sprintf('Type "%s" not found. Probably some configuration is missing.', $this->type), 1474905835); + } + $typeDefinition = $this->typeDefinitions[$this->type]; + $this->setOptions($typeDefinition); + } + + /** + * Set multiple properties of this object at once. + * Every property which has a corresponding set* method can be set using + * the passed $options array. + * + * @internal + */ + public function setOptions(array $options, bool $resetFinishers = false) + { + if (isset($options['rendererClassName'])) { + $this->setRendererClassName($options['rendererClassName']); + } + if (isset($options['label'])) { + $this->setLabel($options['label']); + } + if (isset($options['renderingOptions'])) { + foreach ($options['renderingOptions'] as $key => $value) { + $this->setRenderingOption($key, $value); + } + } + if (isset($options['finishers'])) { + if ($resetFinishers) { + $this->finishers = []; + } + foreach ($options['finishers'] as $finisherConfiguration) { + $this->createFinisher($finisherConfiguration['identifier'], $finisherConfiguration['options'] ?? []); + } + } + + if (isset($options['variants'])) { + foreach ($options['variants'] as $variantConfiguration) { + $this->createVariant($variantConfiguration); + } + } + + ArrayUtility::assertAllArrayKeysAreValid( + $options, + ['rendererClassName', 'renderingOptions', 'finishers', 'formEditor', 'label', 'variants'] + ); + } + + /** + * Create a page with the given $identifier and attach this page to the form. + * + * - Create Page object based on the given $typeName + * - set defaults inside the Page object + * - attach Page object to this form + * - return the newly created Page object + * + * @param string $identifier Identifier of the new page + * @param string $typeName Type of the new page + * @return Page the newly created page + * @throws TypeDefinitionNotFoundException + */ + public function createPage(string $identifier, string $typeName = 'Page'): Page + { + if (!isset($this->typeDefinitions[$typeName])) { + throw new TypeDefinitionNotFoundException(sprintf('Type "%s" not found. Probably some configuration is missing.', $typeName), 1474905953); + } + + $typeDefinition = $this->typeDefinitions[$typeName]; + + if (!isset($typeDefinition['implementationClassName'])) { + throw new TypeDefinitionNotFoundException(sprintf('The "implementationClassName" was not set in type definition "%s".', $typeName), 1477083126); + } + $implementationClassName = $typeDefinition['implementationClassName']; + + /** @var Page $page */ + $page = GeneralUtility::makeInstance($implementationClassName, $identifier, $typeName); + + if (isset($typeDefinition['label'])) { + $page->setLabel($typeDefinition['label']); + } + + if (isset($typeDefinition['renderingOptions'])) { + foreach ($typeDefinition['renderingOptions'] as $key => $value) { + $page->setRenderingOption($key, $value); + } + } + + if (isset($typeDefinition['variants'])) { + foreach ($typeDefinition['variants'] as $variantConfiguration) { + $page->createVariant($variantConfiguration); + } + } + + ArrayUtility::assertAllArrayKeysAreValid( + $typeDefinition, + ['implementationClassName', 'label', 'renderingOptions', 'formEditor', 'variants'] + ); + + $this->addPage($page); + return $page; + } + + /** + * Add a new page at the end of the form. + * + * Instead of this method, you should often use {@link createPage} instead. + * + * @param Page $page + * @throws FormDefinitionConsistencyException if Page is already added to a FormDefinition + * @see createPage + */ + public function addPage(Page $page) + { + $this->addRenderable($page); + } + + /** + * Get the Form's pages + * + * @return array The Form's pages in the correct order + */ + public function getPages(): array + { + return $this->renderables; + } + + /** + * Check whether a page with the given $index exists + * + * @return bool TRUE if a page with the given $index exists, otherwise FALSE + */ + public function hasPageWithIndex(int $index): bool + { + return isset($this->renderables[$index]); + } + + /** + * Get the page with the passed index. The first page has index zero. + * + * If page at $index does not exist, an exception is thrown. @see hasPageWithIndex() + * + * @param int $index + * @return Page the page + * @throws FormException if the specified index does not exist + */ + public function getPageByIndex(int $index) + { + if (!$this->hasPageWithIndex($index)) { + throw new FormException(sprintf('There is no page with an index of %d', $index), 1329233627); + } + return $this->renderables[$index]; + } + + /** + * Adds the specified finisher to this form + */ + public function addFinisher(FinisherInterface $finisher) + { + $this->finishers[] = $finisher; + } + + /** + * @param string $finisherIdentifier identifier of the finisher as registered in the current form (for example: "Redirect") + * @param array $options options for this finisher in the format ['option1' => 'value1', 'option2' => 'value2', ...] + * @throws FinisherPresetNotFoundException + */ + public function createFinisher(string $finisherIdentifier, array $options = []): FinisherInterface + { + if (isset($this->finishersDefinition[$finisherIdentifier]['implementationClassName'])) { + $implementationClassName = $this->finishersDefinition[$finisherIdentifier]['implementationClassName']; + $defaultOptions = $this->finishersDefinition[$finisherIdentifier]['options'] ?? []; + ArrayUtility::mergeRecursiveWithOverrule($defaultOptions, $options); + /** @var FinisherInterface $finisher */ + $finisher = GeneralUtility::makeInstance($implementationClassName); + $finisher->setFinisherIdentifier($finisherIdentifier); + $finisher->setOptions($defaultOptions); + $this->addFinisher($finisher); + return $finisher; + } + throw new FinisherPresetNotFoundException('The finisher preset identified by "' . $finisherIdentifier . '" could not be found, or the implementationClassName was not specified.', 1328709784); + } + + /** + * Gets all finishers of this form + * + * @return list + */ + public function getFinishers(): array + { + return $this->finishers; + } + + /** + * Add an element to the ElementsByIdentifier Cache. + * + * @throws DuplicateFormElementException + * @internal + */ + public function registerRenderable(RenderableInterface $renderable) + { + if ($renderable instanceof FormElementInterface) { + if (isset($this->elementsByIdentifier[$renderable->getIdentifier()])) { + throw new DuplicateFormElementException(sprintf('A form element with identifier "%s" is already part of the form.', $renderable->getIdentifier()), 1325663761); + } + $this->elementsByIdentifier[$renderable->getIdentifier()] = $renderable; + } + } + + /** + * Remove an element from the ElementsByIdentifier cache + * + * @internal + */ + public function unregisterRenderable(RenderableInterface $renderable) + { + if ($renderable instanceof FormElementInterface) { + unset($this->elementsByIdentifier[$renderable->getIdentifier()]); + } + } + + /** + * Get all form elements with their identifiers as keys + * + * @return array + */ + public function getElements(): array + { + return $this->elementsByIdentifier; + } + + /** + * Get a Form Element by its identifier + * + * If identifier does not exist, returns NULL. + * + * @param string $elementIdentifier + * @return FormElementInterface|null The element with the given $elementIdentifier or NULL if none found + */ + public function getElementByIdentifier(string $elementIdentifier) + { + return $this->elementsByIdentifier[$elementIdentifier] ?? null; + } + + /** + * Sets the default value of a form element + * + * @param string $elementIdentifier identifier of the form element. This supports property paths! + * @param mixed $defaultValue + * @internal + */ + public function addElementDefaultValue(string $elementIdentifier, $defaultValue) + { + $this->elementDefaultValues = ArrayUtility::setValueByPath( + $this->elementDefaultValues, + $elementIdentifier, + $defaultValue, + '.' + ); + } + + /** + * returns the default value of the specified form element + * or NULL if no default value was set + * + * @param string $elementIdentifier identifier of the form element. This supports property paths! + * @return mixed The elements default value + * @internal + */ + public function getElementDefaultValueByIdentifier(string $elementIdentifier) + { + return ObjectAccess::getPropertyPath($this->elementDefaultValues, $elementIdentifier); + } + + /** + * Move $pageToMove before $referencePage + */ + public function movePageBefore(Page $pageToMove, Page $referencePage) + { + $this->moveRenderableBefore($pageToMove, $referencePage); + } + + /** + * Move $pageToMove after $referencePage + */ + public function movePageAfter(Page $pageToMove, Page $referencePage) + { + $this->moveRenderableAfter($pageToMove, $referencePage); + } + + /** + * Remove $pageToRemove from form + */ + public function removePage(Page $pageToRemove) + { + $this->removeRenderable($pageToRemove); + } + + /** + * Bind the current request & response to this form instance, effectively creating + * a new "instance" of the Form. + */ + public function bind(RequestInterface $request): FormRuntime + { + $formRuntime = GeneralUtility::makeInstance(FormRuntime::class); + $formRuntime->setFormDefinition($this); + $formRuntime->setRequest($request); + $formRuntime->initialize(); + return $formRuntime; + } + + public function getProcessingRule(string $propertyPath): ProcessingRule + { + if (!isset($this->processingRules[$propertyPath])) { + $this->processingRules[$propertyPath] = GeneralUtility::makeInstance(ProcessingRule::class); + } + return $this->processingRules[$propertyPath]; + } + + /** + * Get all mapping rules + * + * @return array + * @internal + */ + public function getProcessingRules(): array + { + return $this->processingRules; + } + + /** + * @return array> + * @internal + */ + public function getTypeDefinitions(): array + { + return $this->typeDefinitions; + } + + /** + * @return array> + * @internal + */ + public function getValidatorsDefinition(): array + { + return $this->validatorsDefinition; + } + + /** + * Get the persistence identifier of the form + * + * @internal + */ + public function getPersistenceIdentifier(): string + { + return $this->persistenceIdentifier; + } + + /** + * Set the renderer class name + */ + public function setRendererClassName(string $rendererClassName) + { + $this->rendererClassName = $rendererClassName; + } + + /** + * Get the classname of the renderer + */ + public function getRendererClassName(): string + { + return $this->rendererClassName; + } +} diff --git a/Classes/Domain/Model/FormElements/AbstractFormElement.php b/Classes/Domain/Model/FormElements/AbstractFormElement.php new file mode 100644 index 0000000..18318aa --- /dev/null +++ b/Classes/Domain/Model/FormElements/AbstractFormElement.php @@ -0,0 +1,166 @@ +identifier = $identifier; + $this->type = $type; + } + + /** + * Override this method in your custom FormElements if needed + */ + public function initializeFormElement() {} + + /** + * Get the global unique identifier of the element + */ + public function getUniqueIdentifier(): string + { + $formDefinition = $this->getRootForm(); + $uniqueIdentifier = sprintf('%s-%s', $formDefinition->getIdentifier(), $this->identifier); + $uniqueIdentifier = (string)preg_replace('/[^a-zA-Z0-9_-]/', '_', $uniqueIdentifier); + return lcfirst($uniqueIdentifier); + } + + public function setOptions(array $options, bool $resetValidators = false) + { + if (isset($options['defaultValue'])) { + $this->setDefaultValue($options['defaultValue']); + } + + if (isset($options['properties'])) { + foreach ($options['properties'] as $key => $value) { + $this->setProperty($key, $value); + } + } + + parent::setOptions($options, $resetValidators); + } + + /** + * Get the default value of the element + * + * @return mixed + */ + public function getDefaultValue() + { + $formDefinition = $this->getRootForm(); + return $formDefinition->getElementDefaultValueByIdentifier($this->identifier); + } + + /** + * Set the default value of the element + * + * @param mixed $defaultValue + */ + public function setDefaultValue($defaultValue) + { + $formDefinition = $this->getRootForm(); + $currentDefaultValue = $formDefinition->getElementDefaultValueByIdentifier($this->identifier); + if (is_array($currentDefaultValue) && is_array($defaultValue)) { + ArrayUtility::mergeRecursiveWithOverrule($currentDefaultValue, $defaultValue); + $defaultValue = ArrayUtility::removeNullValuesRecursive($currentDefaultValue); + } + $formDefinition->addElementDefaultValue($this->identifier, $defaultValue); + } + + /** + * Check if the element is required + */ + public function isRequired(): bool + { + foreach ($this->getValidators() as $validator) { + if ($validator instanceof NotEmptyValidator) { + return true; + } + } + return false; + } + + /** + * Set a property of the element + * + * @param mixed $value + */ + public function setProperty(string $key, $value) + { + if (is_array($value) && isset($this->properties[$key]) && is_array($this->properties[$key])) { + ArrayUtility::mergeRecursiveWithOverrule($this->properties[$key], $value); + $this->properties[$key] = ArrayUtility::removeNullValuesRecursive($this->properties[$key]); + } elseif ($value === null) { + unset($this->properties[$key]); + } else { + $this->properties[$key] = $value; + } + } + + /** + * Get all properties + */ + public function getProperties(): array + { + return $this->properties; + } +} diff --git a/Classes/Domain/Model/FormElements/AbstractSection.php b/Classes/Domain/Model/FormElements/AbstractSection.php new file mode 100644 index 0000000..e28ebf4 --- /dev/null +++ b/Classes/Domain/Model/FormElements/AbstractSection.php @@ -0,0 +1,182 @@ +identifier = $identifier; + $this->type = $type; + } + + /** + * Get the child Form Elements + * + * @return FormElementInterface[] The Page's elements + */ + public function getElements(): array + { + return $this->renderables; + } + + /** + * Get the child Form Elements + * + * @return FormElementInterface[] The Page's elements + */ + public function getElementsRecursively(): array + { + return $this->getRenderablesRecursively(); + } + + /** + * Add a new form element at the end of the section + * + * @param FormElementInterface $formElement The form element to add + * @throws FormDefinitionConsistencyException if FormElement is already added to a section + */ + public function addElement(FormElementInterface $formElement) + { + $this->addRenderable($formElement); + } + + /** + * Create a form element with the given $identifier and attach it to this section/page. + * + * - Create Form Element object based on the given $typeName + * - set defaults inside the Form Element (based on the parent form's field defaults) + * - attach Form Element to this Section/Page + * - return the newly created Form Element object + * + * + * @param string $identifier Identifier of the new form element + * @param string $typeName type of the new form element + * @return FormElementInterface the newly created form element + * @throws TypeDefinitionNotFoundException + * @throws TypeDefinitionNotValidException + */ + public function createElement(string $identifier, string $typeName): FormElementInterface + { + $formDefinition = $this->getRootForm(); + + $typeDefinitions = $formDefinition->getTypeDefinitions(); + if (isset($typeDefinitions[$typeName])) { + $typeDefinition = $typeDefinitions[$typeName]; + } else { + $renderingOptions = $formDefinition->getRenderingOptions(); + $skipUnknownElements = isset($renderingOptions['skipUnknownElements']) && $renderingOptions['skipUnknownElements'] === true; + if (!$skipUnknownElements) { + throw new TypeDefinitionNotFoundException(sprintf('Type "%s" not found. Probably some configuration is missing.', $typeName), 1382364019); + } + + $element = GeneralUtility::makeInstance(UnknownFormElement::class, $identifier, $typeName); + $this->addElement($element); + return $element; + } + + if (!isset($typeDefinition['implementationClassName'])) { + throw new TypeDefinitionNotFoundException(sprintf('The "implementationClassName" was not set in type definition "%s".', $typeName), 1325689855); + } + + $implementationClassName = $typeDefinition['implementationClassName']; + $element = GeneralUtility::makeInstance($implementationClassName, $identifier, $typeName); + if (!$element instanceof FormElementInterface) { + throw new TypeDefinitionNotValidException(sprintf('The "implementationClassName" for element "%s" ("%s") does not implement the FormElementInterface.', $identifier, $implementationClassName), 1327318156); + } + unset($typeDefinition['implementationClassName']); + + $this->addElement($element); + $element->setOptions($typeDefinition); + + $element->initializeFormElement(); + return $element; + } + + /** + * Move FormElement $element before $referenceElement. + * + * Both $element and $referenceElement must be direct descendants of this Section/Page. + * + * @param FormElementInterface $elementToMove + * @param FormElementInterface $referenceElement + */ + public function moveElementBefore(FormElementInterface $elementToMove, FormElementInterface $referenceElement) + { + $this->moveRenderableBefore($elementToMove, $referenceElement); + } + + /** + * Move FormElement $element after $referenceElement + * + * Both $element and $referenceElement must be direct descendants of this Section/Page. + * + * @param FormElementInterface $elementToMove + * @param FormElementInterface $referenceElement + */ + public function moveElementAfter(FormElementInterface $elementToMove, FormElementInterface $referenceElement) + { + $this->moveRenderableAfter($elementToMove, $referenceElement); + } + + /** + * Remove $elementToRemove from this Section/Page + */ + public function removeElement(FormElementInterface $elementToRemove) + { + $this->removeRenderable($elementToRemove); + } +} diff --git a/Classes/Domain/Model/FormElements/Date.php b/Classes/Domain/Model/FormElements/Date.php new file mode 100644 index 0000000..5e1d0d2 --- /dev/null +++ b/Classes/Domain/Model/FormElements/Date.php @@ -0,0 +1,56 @@ +setDataType(\DateTime::class); + /** @var \TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration $propertyMappingConfiguration */ + $propertyMappingConfiguration = $this->getRootForm()->getProcessingRule($this->getIdentifier())->getPropertyMappingConfiguration(); + // @see https://www.w3.org/TR/2011/WD-html-markup-20110405/input.date.html#input.date.attrs.value + // 'Y-m-d' = https://tools.ietf.org/html/rfc3339#section-5.6 -> full-date + $propertyMappingConfiguration->setTypeConverterOption(DateTimeConverter::class, DateTimeConverter::CONFIGURATION_DATE_FORMAT, 'Y-m-d'); + } + + /** + * @param \DateTime $value + */ + public function valueToString($value): string + { + $dateFormat = $this->properties['displayFormat'] ?? 'Y-m-d'; + + return $value->format($dateFormat); + } +} diff --git a/Classes/Domain/Model/FormElements/FileUpload.php b/Classes/Domain/Model/FormElements/FileUpload.php new file mode 100644 index 0000000..71ac8e3 --- /dev/null +++ b/Classes/Domain/Model/FormElements/FileUpload.php @@ -0,0 +1,107 @@ +setDataType(FileReference::class); + + // Set the property mapping configuration for the file upload element. + // * Add the UploadedFileReferenceConverter to convert an uploaded file to a + // FileReference (single upload) or ObjectStorage (multiple uploads). + // * Setup the storage: + // If the property "saveToFileMount" exist for this element it will be used. + // If this file mount or the property "saveToFileMount" does not exist + // the default storage "1:/user_uploads/" will be used. Uploads are placed + // in a dedicated sub-folder (e.g. ".../form_<40-chars-hash>/actual.file"). + $typeConverter = GeneralUtility::makeInstance(UploadedFileReferenceConverter::class); + /** @var \TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration $propertyMappingConfiguration */ + $propertyMappingConfiguration = $this->getRootForm() + ->getProcessingRule($this->getIdentifier()) + ->getPropertyMappingConfiguration() + ->setTypeConverter($typeConverter); + + $uploadConfiguration = [ + UploadedFileReferenceConverter::CONFIGURATION_UPLOAD_CONFLICT_MODE => 'rename', + ]; + + // In preview mode (Form Editor backend module), skip upload folder resolution + // entirely. File uploads are non-functional during preview and resolving the + // target folder may throw access permission exceptions for backend users who + // do not have access to the configured upload storage. + if (!($this->getRootForm()->getRenderingOptions()['previewMode'] ?? false)) { + $saveToFileMountIdentifier = $this->getProperties()['saveToFileMount'] ?? ''; + if ($this->checkSaveFileMountAccess($saveToFileMountIdentifier)) { + $uploadConfiguration[UploadedFileReferenceConverter::CONFIGURATION_UPLOAD_FOLDER] = $saveToFileMountIdentifier; + } else { + // @todo Why should uploaded files be stored to the same directory as the *.form.yaml definitions? + $persistenceIdentifier = $this->getRootForm()->getPersistenceIdentifier(); + if (!empty($persistenceIdentifier)) { + $pathinfo = PathUtility::pathinfo($persistenceIdentifier); + $saveToFileMountIdentifier = $pathinfo['dirname']; + if ($this->checkSaveFileMountAccess($saveToFileMountIdentifier)) { + $uploadConfiguration[UploadedFileReferenceConverter::CONFIGURATION_UPLOAD_FOLDER] = $saveToFileMountIdentifier; + } + } + } + } + $propertyMappingConfiguration->setTypeConverterOptions(UploadedFileReferenceConverter::class, $uploadConfiguration); + } + + /** + * @internal + */ + protected function checkSaveFileMountAccess(string $saveToFileMountIdentifier): bool + { + if (empty($saveToFileMountIdentifier)) { + return false; + } + + if (PathUtility::isExtensionPath($saveToFileMountIdentifier)) { + return false; + } + + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); + + try { + $resourceFactory->getFolderObjectFromCombinedIdentifier($saveToFileMountIdentifier); + return true; + } catch (\InvalidArgumentException|InsufficientFolderAccessPermissionsException|FolderDoesNotExistException $e) { + return false; + } + } +} diff --git a/Classes/Domain/Model/FormElements/FormElementInterface.php b/Classes/Domain/Model/FormElements/FormElementInterface.php new file mode 100644 index 0000000..0b7e672 --- /dev/null +++ b/Classes/Domain/Model/FormElements/FormElementInterface.php @@ -0,0 +1,117 @@ + + * @internal + */ + public function getValidators(): \SplObjectStorage; + + /** + * Registers a validator for this element + */ + public function addValidator(ValidatorInterface $validator); + + /** + * Set the target data type for this element + * + * @param string $dataType the target data type + */ + public function setDataType(string $dataType); + + /** + * Whether or not this element is required + */ + public function isRequired(): bool; +} diff --git a/Classes/Domain/Model/FormElements/GenericFormElement.php b/Classes/Domain/Model/FormElements/GenericFormElement.php new file mode 100644 index 0000000..0e31dac --- /dev/null +++ b/Classes/Domain/Model/FormElements/GenericFormElement.php @@ -0,0 +1,29 @@ + $value) { + $this->setProperty($key, $value); + } + } + + parent::setOptions($options, $resetValidators); + } + + /** + * Returns a unique identifier of this element. + * While element identifiers are only unique within one form, + * this includes the identifier of the form itself, making it "globally" unique + * + * @return string the "globally" unique identifier of this element + */ + public function getUniqueIdentifier(): string + { + $formDefinition = $this->getRootForm(); + return sprintf('%s-%s', $formDefinition->getIdentifier(), $this->identifier); + } + + /** + * Get the default value with which the Form Element should be initialized + * during display. + * Note: This is currently not used for section elements + * + * @return mixed the default value for this Form Element + */ + public function getDefaultValue() + { + return null; + } + + /** + * Set the default value with which the Form Element should be initialized + * during display. + * Note: This is currently ignored for section elements + * + * @param mixed $defaultValue the default value for this Form Element + */ + public function setDefaultValue($defaultValue) {} + + /** + * Get all element-specific configuration properties + */ + public function getProperties(): array + { + return $this->properties; + } + + /** + * Set an element-specific configuration property. + * + * @param mixed $value + */ + public function setProperty(string $key, $value) + { + if (is_array($value) && isset($this->properties[$key]) && is_array($this->properties[$key])) { + ArrayUtility::mergeRecursiveWithOverrule($this->properties[$key], $value); + $this->properties[$key] = ArrayUtility::removeNullValuesRecursive($this->properties[$key]); + } elseif ($value === null) { + unset($this->properties[$key]); + } else { + $this->properties[$key] = $value; + } + } + + /** + * Whether or not this element is required + */ + public function isRequired(): bool + { + foreach ($this->getValidators() as $validator) { + if ($validator instanceof NotEmptyValidator) { + return true; + } + } + return false; + } +} diff --git a/Classes/Domain/Model/FormElements/StringableFormElementInterface.php b/Classes/Domain/Model/FormElements/StringableFormElementInterface.php new file mode 100644 index 0000000..7b63ac8 --- /dev/null +++ b/Classes/Domain/Model/FormElements/StringableFormElementInterface.php @@ -0,0 +1,32 @@ +identifier = $identifier; + $this->type = $type; + } + + /** + * Sets up the form element + */ + public function initializeFormElement() {} + + /** + * Returns a unique identifier of this element. + * While element identifiers are only unique within one form, + * this includes the identifier of the form itself, making it "globally" unique + * + * @return string the "globally" unique identifier of this element + */ + public function getUniqueIdentifier(): string + { + $formDefinition = $this->getRootForm(); + $uniqueIdentifier = sprintf('%s-%s', $formDefinition->getIdentifier(), $this->identifier); + $uniqueIdentifier = (string)preg_replace('/[^a-zA-Z0-9-_]/', '_', $uniqueIdentifier); + return lcfirst($uniqueIdentifier); + } + + /** + * Get the template name of the renderable + */ + public function getTemplateName(): string + { + return 'UnknownElement'; + } + + /** + * @return mixed the default value for this Form Element + * @internal + */ + public function getDefaultValue() + { + return null; + } + + /** + * Not used in this implementation + * + * @param mixed $defaultValue the default value for this Form Element + * @internal + */ + public function setDefaultValue($defaultValue) {} + + /** + * Not used in this implementation + * + * @param mixed $value + * @internal + */ + public function setProperty(string $key, $value) {} + + /** + * @internal + */ + public function getProperties(): array + { + return []; + } + + /** + * @internal + */ + public function isRequired(): bool + { + return false; + } +} diff --git a/Classes/Domain/Model/Renderable/AbstractCompositeRenderable.php b/Classes/Domain/Model/Renderable/AbstractCompositeRenderable.php new file mode 100644 index 0000000..90585fc --- /dev/null +++ b/Classes/Domain/Model/Renderable/AbstractCompositeRenderable.php @@ -0,0 +1,209 @@ +getParentRenderable() !== null) { + throw new FormDefinitionConsistencyException(sprintf('The renderable with identifier "%s" is already added to another element (element identifier: "%s").', $renderable->getIdentifier(), $renderable->getParentRenderable()->getIdentifier()), 1325665144); + } + $renderable->setIndex(count($this->renderables)); + $renderable->setParentRenderable($this); + $this->renderables[] = $renderable; + } + + /** + * Move $renderableToMove before $referenceRenderable + * + * This function will be wrapped by the subclasses, f.e. with an "movePageBefore" + * or "moveElementBefore" method with the correct type hint. + * + * @param RenderableInterface $renderableToMove + * @param RenderableInterface $referenceRenderable + * @throws FormDefinitionConsistencyException + * @internal + */ + protected function moveRenderableBefore(RenderableInterface $renderableToMove, RenderableInterface $referenceRenderable) + { + if ($renderableToMove->getParentRenderable() !== $referenceRenderable->getParentRenderable() || $renderableToMove->getParentRenderable() !== $this) { + throw new FormDefinitionConsistencyException('Moved renderables need to be part of the same parent element.', 1326089744); + } + + $reorderedRenderables = []; + $i = 0; + foreach ($this->renderables as $renderable) { + if ($renderable === $renderableToMove) { + continue; + } + + if ($renderable === $referenceRenderable) { + $reorderedRenderables[] = $renderableToMove; + $renderableToMove->setIndex($i); + $i++; + } + $reorderedRenderables[] = $renderable; + $renderable->setIndex($i); + $i++; + } + $this->renderables = $reorderedRenderables; + } + + /** + * Move $renderableToMove after $referenceRenderable + * + * This function will be wrapped by the subclasses, f.e. with an "movePageAfter" + * or "moveElementAfter" method with the correct type hint. + * + * @param RenderableInterface $renderableToMove + * @param RenderableInterface $referenceRenderable + * @throws FormDefinitionConsistencyException + * @internal + */ + protected function moveRenderableAfter(RenderableInterface $renderableToMove, RenderableInterface $referenceRenderable) + { + if ($renderableToMove->getParentRenderable() !== $referenceRenderable->getParentRenderable() || $renderableToMove->getParentRenderable() !== $this) { + throw new FormDefinitionConsistencyException('Moved renderables need to be part of the same parent element.', 1477083145); + } + + $reorderedRenderables = []; + $i = 0; + foreach ($this->renderables as $renderable) { + if ($renderable === $renderableToMove) { + continue; + } + + $reorderedRenderables[] = $renderable; + $renderable->setIndex($i); + $i++; + + if ($renderable === $referenceRenderable) { + $reorderedRenderables[] = $renderableToMove; + $renderableToMove->setIndex($i); + $i++; + } + } + $this->renderables = $reorderedRenderables; + } + + /** + * Returns all RenderableInterface instances of this composite renderable recursively + * + * @return RenderableInterface[] + * @internal + */ + public function getRenderablesRecursively(): array + { + $renderables = []; + foreach ($this->renderables as $renderable) { + $renderables[] = $renderable; + if ($renderable instanceof CompositeRenderableInterface) { + $renderables = array_merge($renderables, $renderable->getRenderablesRecursively()); + } + } + return $renderables; + } + + /** + * Remove a renderable from this renderable. + * + * This function will be wrapped by the subclasses, f.e. with an "removePage" + * or "removeElement" method with the correct type hint. + * + * @param RenderableInterface $renderableToRemove + * @throws FormDefinitionConsistencyException + * @internal + */ + protected function removeRenderable(RenderableInterface $renderableToRemove) + { + if ($renderableToRemove->getParentRenderable() !== $this) { + throw new FormDefinitionConsistencyException('The renderable to be removed must be part of the calling parent renderable.', 1326090127); + } + + $updatedRenderables = []; + foreach ($this->renderables as $renderable) { + if ($renderable === $renderableToRemove) { + continue; + } + + $updatedRenderables[] = $renderable; + } + $this->renderables = $updatedRenderables; + + $renderableToRemove->onRemoveFromParentRenderable(); + } + + /** + * Register this element at the parent form, if there is a connection to the parent form. + * + * @internal + */ + public function registerInFormIfPossible() + { + parent::registerInFormIfPossible(); + foreach ($this->renderables as $renderable) { + $renderable->registerInFormIfPossible(); + } + } + + /** + * This function is called after a renderable has been removed from its parent + * renderable. + * This just passes the event down to all child renderables of this composite renderable. + * + * @internal + */ + public function onRemoveFromParentRenderable() + { + foreach ($this->renderables as $renderable) { + $renderable->onRemoveFromParentRenderable(); + } + parent::onRemoveFromParentRenderable(); + } +} diff --git a/Classes/Domain/Model/Renderable/AbstractRenderable.php b/Classes/Domain/Model/Renderable/AbstractRenderable.php new file mode 100644 index 0000000..08a95e4 --- /dev/null +++ b/Classes/Domain/Model/Renderable/AbstractRenderable.php @@ -0,0 +1,448 @@ +type; + } + + /** + * Get the identifier of the element + */ + public function getIdentifier(): string + { + return $this->identifier; + } + + /** + * Set the identifier of the element + */ + public function setIdentifier(string $identifier) + { + $this->identifier = $identifier; + } + + public function getRequest(): ?ServerRequestInterface + { + return $this->request; + } + + public function setRequest(?ServerRequestInterface $request): void + { + $this->request = $request; + } + + /** + * Set multiple properties of this object at once. + * Every property which has a corresponding set* method can be set using + * the passed $options array. + */ + public function setOptions(array $options, bool $resetValidators = false) + { + if (isset($options['label'])) { + $this->setLabel($options['label']); + } + + if (isset($options['renderingOptions'])) { + foreach ($options['renderingOptions'] as $key => $value) { + $this->setRenderingOption($key, $value); + } + } + + if (isset($options['validators'])) { + $runtimeCache = GeneralUtility::makeInstance(CacheManager::class)->getCache('runtime'); + $configurationHashes = $runtimeCache->get('formAbstractRenderableConfigurationHashes') ?: []; + + if ($resetValidators) { + $this->getRootForm()->getProcessingRule($this->getIdentifier())->removeAllValidators(); + $configurationHashes = []; + } + + foreach ($options['validators'] as $validatorConfiguration) { + $configurationHash = md5( + spl_object_hash($this) + . json_encode($validatorConfiguration) + ); + if (in_array($configurationHash, $configurationHashes)) { + continue; + } + $this->createValidator($validatorConfiguration['identifier'], $validatorConfiguration['options'] ?? []); + $configurationHashes[] = $configurationHash; + $runtimeCache->set('formAbstractRenderableConfigurationHashes', $configurationHashes); + } + } + + if (isset($options['variants'])) { + foreach ($options['variants'] as $variantConfiguration) { + $this->createVariant($variantConfiguration); + } + } + + ArrayUtility::assertAllArrayKeysAreValid( + $options, + ['label', 'defaultValue', 'properties', 'renderingOptions', 'validators', 'formEditor', 'variants'] + ); + } + + /** + * Create a validator for the element. + * + * @throws ValidatorPresetNotFoundException + */ + public function createValidator(string $validatorIdentifier, array $options = []): ?ValidatorInterface + { + $validatorsDefinition = $this->getRootForm()->getValidatorsDefinition(); + if (isset($validatorsDefinition[$validatorIdentifier]) && is_array($validatorsDefinition[$validatorIdentifier]) && isset($validatorsDefinition[$validatorIdentifier]['implementationClassName'])) { + $implementationClassName = $validatorsDefinition[$validatorIdentifier]['implementationClassName']; + $defaultOptions = $validatorsDefinition[$validatorIdentifier]['options'] ?? []; + ArrayUtility::mergeRecursiveWithOverrule($defaultOptions, $options); + // @todo: It would be great if Renderable's and FormElements could use DI, but especially + // FormElements which extend AbstractRenderable pollute __construct() with manual + // arguments. To retrieve the ValidatorResolver, we have to fall back to getContainer() + // for now, until this has been resolved. + if ($this->validatorResolver === null) { + $container = GeneralUtility::getContainer(); + $this->validatorResolver = $container->get(ValidatorResolver::class); + } + $validator = $this->validatorResolver->createValidator($implementationClassName, $defaultOptions, $this->request); + if ($validator !== null) { + $this->addValidator($validator); + } + return $validator; + } + throw new ValidatorPresetNotFoundException('The validator preset identified by "' . $validatorIdentifier . '" could not be found, or the implementationClassName was not specified.', 1328710202); + } + + /** + * Add a validator to the element. + */ + public function addValidator(ValidatorInterface $validator) + { + $formDefinition = $this->getRootForm(); + $formDefinition->getProcessingRule($this->getIdentifier())->addValidator($validator); + } + + /** + * Get all validators on the element + * + * @internal + */ + public function getValidators(): \SplObjectStorage + { + $formDefinition = $this->getRootForm(); + return $formDefinition->getProcessingRule($this->getIdentifier())->getValidators(); + } + + /** + * Set the datatype + */ + public function setDataType(string $dataType) + { + $formDefinition = $this->getRootForm(); + $formDefinition->getProcessingRule($this->getIdentifier())->setDataType($dataType); + } + + /** + * Get the classname of the renderer + */ + public function getRendererClassName(): string + { + return $this->getRootForm()->getRendererClassName(); + } + + /** + * Get all rendering options + */ + public function getRenderingOptions(): array + { + return $this->renderingOptions; + } + + /** + * Set the rendering option $key to $value. + * + * @param mixed $value + * @return mixed + */ + public function setRenderingOption(string $key, $value) + { + if (is_array($value) && isset($this->renderingOptions[$key]) && is_array($this->renderingOptions[$key])) { + ArrayUtility::mergeRecursiveWithOverrule($this->renderingOptions[$key], $value); + $this->renderingOptions[$key] = ArrayUtility::removeNullValuesRecursive($this->renderingOptions[$key]); + } elseif ($value === null) { + unset($this->renderingOptions[$key]); + } else { + $this->renderingOptions[$key] = $value; + } + } + + /** + * Get the parent renderable + * + * @return CompositeRenderableInterface|null + */ + public function getParentRenderable() + { + return $this->parentRenderable; + } + + /** + * Set the parent renderable + */ + public function setParentRenderable(CompositeRenderableInterface $parentRenderable) + { + $this->parentRenderable = $parentRenderable; + $this->registerInFormIfPossible(); + } + + /** + * Get the root form this element belongs to + * + * @throws FormDefinitionConsistencyException + */ + public function getRootForm(): FormDefinition + { + $rootRenderable = $this->parentRenderable; + while ($rootRenderable !== null && !($rootRenderable instanceof FormDefinition)) { + $rootRenderable = $rootRenderable->getParentRenderable(); + } + if ($rootRenderable === null) { + throw new FormDefinitionConsistencyException(sprintf('The form element "%s" is not attached to a parent form.', $this->identifier), 1326803398); + } + + return $rootRenderable; + } + + /** + * Register this element at the parent form, if there is a connection to the parent form. + * + * @internal + */ + public function registerInFormIfPossible() + { + try { + $rootForm = $this->getRootForm(); + $rootForm->registerRenderable($this); + } catch (FormDefinitionConsistencyException $exception) { + } + } + + /** + * Triggered when the renderable is removed from it's parent + * + * @internal + */ + public function onRemoveFromParentRenderable() + { + $event = GeneralUtility::makeInstance(EventDispatcherInterface::class)->dispatch( + new BeforeRenderableIsRemovedFromFormEvent($this) + ); + if ($event->isPropagationStopped()) { + return; + } + + try { + $rootForm = $this->getRootForm(); + $rootForm->unregisterRenderable($this); + } catch (FormDefinitionConsistencyException $exception) { + } + $this->parentRenderable = null; + } + + /** + * Get the index of the renderable + * + * @internal + */ + public function getIndex(): int + { + return $this->index; + } + + /** + * Set the index of the renderable + * + * @internal + */ + public function setIndex(int $index) + { + $this->index = $index; + } + + /** + * Get the label of the renderable + */ + public function getLabel(): string + { + return $this->label; + } + + /** + * Set the label which shall be displayed next to the form element + */ + public function setLabel(string $label) + { + $this->label = $label; + } + + /** + * Get the templateName name of the renderable + */ + public function getTemplateName(): string + { + return empty($this->renderingOptions['templateName']) + ? $this->type + : $this->renderingOptions['templateName']; + } + + /** + * Returns whether this renderable is enabled + */ + public function isEnabled(): bool + { + return !isset($this->renderingOptions['enabled']) || (bool)$this->renderingOptions['enabled'] === true; + } + + /** + * Get all rendering variants + * + * @return RenderableVariantInterface[] + */ + public function getVariants(): array + { + return $this->variants; + } + + public function createVariant(array $options): RenderableVariantInterface + { + $identifier = $options['identifier'] ?? ''; + unset($options['identifier']); + + $variant = GeneralUtility::makeInstance(RenderableVariant::class, $identifier, $options, $this); + + $this->addVariant($variant); + return $variant; + } + + /** + * Adds the specified variant to this form element + */ + public function addVariant(RenderableVariantInterface $variant) + { + $this->variants[$variant->getIdentifier()] = $variant; + } + + /** + * Apply the specified variant to this form element + * regardless of their conditions + */ + public function applyVariant(RenderableVariantInterface $variant) + { + $variant->apply(); + } +} diff --git a/Classes/Domain/Model/Renderable/CompositeRenderableInterface.php b/Classes/Domain/Model/Renderable/CompositeRenderableInterface.php new file mode 100644 index 0000000..0f8629d --- /dev/null +++ b/Classes/Domain/Model/Renderable/CompositeRenderableInterface.php @@ -0,0 +1,40 @@ +parentRenderable or deregistering the renderable + * of the form. + * + * @internal + */ + public function onRemoveFromParentRenderable(); + + /** + * Register this element at the parent form, if there is a connection to the parent form. + * + * @internal + */ + public function registerInFormIfPossible(); + + /** + * Get the template name of the renderable + */ + public function getTemplateName(): string; + + /** + * Returns whether this renderable is enabled + */ + public function isEnabled(): bool; +} diff --git a/Classes/Domain/Model/Renderable/RenderableVariant.php b/Classes/Domain/Model/Renderable/RenderableVariant.php new file mode 100644 index 0000000..b7a7f73 --- /dev/null +++ b/Classes/Domain/Model/Renderable/RenderableVariant.php @@ -0,0 +1,106 @@ +identifier = $identifier; + $this->renderable = $renderable; + + if (isset($options['condition']) && is_string($options['condition'])) { + $this->condition = $options['condition']; + } + + unset($options['condition'], $options['identifier'], $options['variants']); + + $this->options = $options; + } + + /** + * Apply the specified variant to this form element + * regardless of their conditions + */ + public function apply(): void + { + $this->renderable->setOptions($this->options, true); + $this->applied = true; + } + + public function conditionMatches(Resolver $conditionResolver): bool + { + if (empty($this->condition)) { + return false; + } + + return (bool)$conditionResolver->evaluate($this->condition, ['renderable' => $this->renderable]); + } + + public function getIdentifier(): string + { + return $this->identifier; + } + + public function isApplied(): bool + { + return $this->applied; + } +} diff --git a/Classes/Domain/Model/Renderable/RenderableVariantInterface.php b/Classes/Domain/Model/Renderable/RenderableVariantInterface.php new file mode 100644 index 0000000..011a56e --- /dev/null +++ b/Classes/Domain/Model/Renderable/RenderableVariantInterface.php @@ -0,0 +1,40 @@ +formRuntime = $formRuntime; + } + + public function getFormRuntime(): FormRuntime + { + return $this->formRuntime; + } +} diff --git a/Classes/Domain/Renderer/FluidFormRenderer.php b/Classes/Domain/Renderer/FluidFormRenderer.php new file mode 100644 index 0000000..1aab293 --- /dev/null +++ b/Classes/Domain/Renderer/FluidFormRenderer.php @@ -0,0 +1,182 @@ +getType() = Form + * Expected template file: EXT:form/Resources/Private/Frontend/Templates/Form.html + * There is a setting available to set a custom template name. Please read + * the section 'templateName'. + * + * Only the root renderable (FormDefinition) has to be a template file. + * All child renderables are partials. By default, the root renderable + * is called 'Form'. + * + * layoutRootPaths + * --------------- + * + * Used to define several paths for layouts, which will be tried in reversed + * order (the paths are searched from bottom to top). The first folder where + * the desired layout is found, is used. If the array keys are numeric, + * they are first sorted and then tried in reversed order. + * + * partialRootPaths + * ---------------- + * + * Used to define several paths for partials, which will be tried in reversed + * order. The first folder where the desired partial is found, is used. + * The keys of the array define the order. + * + * Within this paths, fluid will search for a file which is named like the + * renderable *type*. + * For example: + * templateRootPaths.10 = EXT:form/Resources/Private/Frontend/Partials/ + * $renderable->getType() = Text + * Expected template file: EXT:form/Resources/Private/Frontend/Partials/Text.html + * There is a setting available to set a custom partial name. Please read + * the section 'templateName'. + * + * templateName + * ----------- + * By default, the renderable type will be taken as the name for the + * template / partial. + * For example: + * partialRootPaths.10 = EXT:form/Resources/Private/Frontend/Partials/ + * $renderable->getType() = Text + * Expected partial file: EXT:form/Resources/Private/Frontend/Partials/Text.html + * + * Set 'templateName' to define a custom name which should be used instead. + * For example: + * templateName = Foo + * $renderable->getType() = Text + * Expected partial file: EXT:form/Resources/Private/Frontend/Partials/Foo.html + * + * Rendering Child Renderables + * =========================== + * + * If a renderable wants to render child renderables, inside its template / partial, + * it can do that using the ViewHelper. + * + * A template example from Page shall demonstrate this: + * + *
+ *   
+ *       
+ *           
+ *               
+ *           
+ *       
+ *   
+ * 
+ * + * Scope: frontend + * **This class is NOT meant to be sub classed by developers.** + * @internal + */ +#[Autoconfigure(public: true, shared: false)] +class FluidFormRenderer extends AbstractElementRenderer +{ + public function __construct( + protected readonly ViewFactoryInterface $viewFactory, + private readonly EventDispatcherInterface $eventDispatcher, + ) {} + + /** + * Renders the FormDefinition. + * + * This method is expected to call the 'beforeRendering' hook + * on each renderable. + * This method call the 'beforeRendering' hook initially. + * Each other hooks will be called from the + * renderRenderable viewHelper. + * {@link \TYPO3\CMS\Form\ViewHelpers\RenderRenderableViewHelper::render()} + * + * @return string the rendered $formRuntime + * @internal + */ + public function render(): string + { + $formElementType = $this->formRuntime->getType(); + $renderingOptions = $this->formRuntime->getRenderingOptions(); + if (!isset($renderingOptions['templateRootPaths']) || !is_array($renderingOptions['templateRootPaths'])) { + throw new RenderingException(sprintf('The option templateRootPaths must be set for renderable "%s"', $formElementType), 1480293084); + } + if (!isset($renderingOptions['layoutRootPaths']) || !is_array($renderingOptions['layoutRootPaths'])) { + throw new RenderingException(sprintf('The option layoutRootPaths must be set for renderable "%s"', $formElementType), 1480293085); + } + if (!isset($renderingOptions['partialRootPaths']) || !is_array($renderingOptions['partialRootPaths'])) { + throw new RenderingException(sprintf('The option partialRootPaths must be set for renderable "%s"', $formElementType), 1480293086); + } + $viewFactoryData = new ViewFactoryData( + templateRootPaths: $renderingOptions['templateRootPaths'], + partialRootPaths: $renderingOptions['partialRootPaths'], + layoutRootPaths: $renderingOptions['layoutRootPaths'], + request: $this->getFormRuntime()->getRequest(), + ); + $view = $this->viewFactory->create($viewFactoryData); + $view->assign('form', $this->formRuntime); + if ($view instanceof FluidViewAdapter) { + // @todo: Find a different solution than setting this state here. This happens in other + // ext:form places as well and should vanish to be more non-fluid view friendly. + $view->getRenderingContext() + ->getViewHelperVariableContainer() + ->addOrUpdate(RenderRenderableViewHelper::class, 'formRuntime', $this->formRuntime); + } + $this->eventDispatcher->dispatch(new BeforeRenderableIsRenderedEvent($this->formRuntime->getFormDefinition(), $this->formRuntime)); + return $view->render($this->formRuntime->getTemplateName()); + } +} diff --git a/Classes/Domain/Renderer/RendererInterface.php b/Classes/Domain/Renderer/RendererInterface.php new file mode 100644 index 0000000..a00bc3d --- /dev/null +++ b/Classes/Domain/Renderer/RendererInterface.php @@ -0,0 +1,46 @@ +connectionPool->getQueryBuilderForTable(self::TABLE_NAME); + + $row = $queryBuilder + ->select('*') + ->from(self::TABLE_NAME) + ->where( + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($uid, ParameterType::INTEGER)) + ) + ->executeQuery() + ->fetchAssociative(); + + return $row ?: null; + } + + /** + * Find all form definitions with optional search criteria. + * Returns an array of database rows including full configuration. + */ + public function findAll(SearchCriteria $criteria): array + { + $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::TABLE_NAME); + + $queryBuilder + ->select('*') + ->from(self::TABLE_NAME); + + $this->applySearchCriteria($queryBuilder, $criteria); + + return $queryBuilder + ->executeQuery() + ->fetchAllAssociative(); + } + + /** + * Find all form definitions for listing purposes. + * Returns only metadata columns (uid, pid, identifier, label) without + * the potentially large configuration JSON column. + * + * @return array + */ + public function findAllForListing(SearchCriteria $criteria): array + { + $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::TABLE_NAME); + + $queryBuilder + ->select('uid', 'pid', 'identifier', 'label') + ->from(self::TABLE_NAME); + + $this->applySearchCriteria($queryBuilder, $criteria); + + return $queryBuilder + ->executeQuery() + ->fetchAllAssociative(); + } + + /** + * Check if a form definition with the given form identifier exists. + * Uses a COUNT query on the indexed identifier column for efficiency. + */ + public function existsByFormIdentifier(string $formIdentifier): bool + { + $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::TABLE_NAME); + + $count = $queryBuilder + ->count('uid') + ->from(self::TABLE_NAME) + ->where( + $queryBuilder->expr()->eq( + 'identifier', + $queryBuilder->createNamedParameter($formIdentifier) + ) + ) + ->executeQuery() + ->fetchOne(); + + return (int)$count > 0; + } + + /** + * Find the UID of a form definition by its form identifier. + * + * Returns the UID of the first matching non-deleted record, or null if not found. + * Used by the upgrade wizard to check for already-migrated forms. + */ + public function findUidByFormIdentifier(string $formIdentifier): ?int + { + $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::TABLE_NAME); + + $uid = $queryBuilder + ->select('uid') + ->from(self::TABLE_NAME) + ->where( + $queryBuilder->expr()->eq( + 'identifier', + $queryBuilder->createNamedParameter($formIdentifier) + ) + ) + ->executeQuery() + ->fetchOne(); + + return $uid !== false ? (int)$uid : null; + } + + /** + * Apply search criteria (search term, limit) to a query builder. + */ + private function applySearchCriteria(QueryBuilder $queryBuilder, SearchCriteria $criteria): void + { + if (!empty($criteria->searchTerm)) { + $queryBuilder->where( + $queryBuilder->expr()->or( + $queryBuilder->expr()->like( + 'identifier', + $queryBuilder->createNamedParameter('%' . $queryBuilder->escapeLikeWildcards($criteria->searchTerm) . '%') + ), + $queryBuilder->expr()->like( + 'label', + $queryBuilder->createNamedParameter('%' . $queryBuilder->escapeLikeWildcards($criteria->searchTerm) . '%') + ) + ) + ); + } + + if ($criteria->hasLimit()) { + $queryBuilder->setMaxResults($criteria->limit); + } + } + + /** + * Insert a form definition in the database. + * @return int|null UID of the newly created record or null on failure. + * @throws \JsonException + */ + public function add(string $persistenceIdentifier, int $pid, FormData $formDefinition): ?int + { + $formDefinitionJson = json_encode($this->jsonObjectKeyOrderPreserver->protect($formDefinition->toArray()), JSON_THROW_ON_ERROR); + $fields = [ + 'pid' => $pid, + 'label' => $formDefinition->name, + 'identifier' => $formDefinition->identifier, + 'configuration' => $formDefinitionJson, + ]; + + $this->persistenceGuard->allowInvocation(FormDefinitionPersistenceCommand::Create, $persistenceIdentifier, $fields); + /** @var DataHandler $dataHandler */ + $dataHandler = GeneralUtility::makeInstance(DataHandler::class); + $dataHandler->start([self::TABLE_NAME => [$persistenceIdentifier => $fields]], []); + try { + $dataHandler->process_datamap(); + } finally { + $this->persistenceGuard->consumeInvocation(FormDefinitionPersistenceCommand::Create, $persistenceIdentifier, $fields); + } + + if ($dataHandler->errorLog !== []) { + return null; + } + + return isset($dataHandler->substNEWwithIDs[$persistenceIdentifier]) + ? (int)$dataHandler->substNEWwithIDs[$persistenceIdentifier] + : null; + } + + /** + * Insert a form definition using a raw database insert (no DataHandler). + * + * This method is intended for contexts where DataHandler cannot be used, + * e.g. the Install Tool upgrade wizard where no backend user is available. + * + * @return int|null The UID of the newly created record, or null on failure + */ + public function addRaw(int $pid, FormData $formDefinition): ?int + { + $connection = $this->connectionPool->getConnectionForTable(self::TABLE_NAME); + $connection->insert(self::TABLE_NAME, [ + 'pid' => $pid, + 'deleted' => 0, + 'label' => $formDefinition->name, + 'identifier' => $formDefinition->identifier, + 'configuration' => $this->jsonObjectKeyOrderPreserver->protect($formDefinition->toArray()), + 'crdate' => $GLOBALS['EXEC_TIME'] ?? time(), + 'tstamp' => $GLOBALS['EXEC_TIME'] ?? time(), + ]); + $uid = (int)$connection->lastInsertId(); + return $uid > 0 ? $uid : null; + } + + /** + * Removes a form definition completely from the system using DataHandler. + * + * @param int $uid The UID representing the form definition to delete + * @return bool TRUE if the form definition was successfully deleted, FALSE otherwise + */ + public function remove(int $uid): bool + { + $this->persistenceGuard->allowInvocation(FormDefinitionPersistenceCommand::Delete, $uid); + /** @var DataHandler $dataHandler */ + $dataHandler = GeneralUtility::makeInstance(DataHandler::class); + $dataHandler->start([], [self::TABLE_NAME => [$uid => ['delete' => 1]]]); + try { + $dataHandler->process_cmdmap(); + } finally { + $this->persistenceGuard->consumeInvocation(FormDefinitionPersistenceCommand::Delete, $uid); + } + return $dataHandler->errorLog === []; + } + + /** + * Update a form definition in the database using DataHandler. + * + * @param int $uid The UID of the form definition to update + * @param FormData $formDefinition + * @return bool TRUE if update was successful, FALSE otherwise + * @throws \JsonException + */ + public function update(int $uid, FormData $formDefinition): bool + { + if (empty($uid)) { + return false; + } + + $formDefinitionJson = json_encode($this->jsonObjectKeyOrderPreserver->protect($formDefinition->toArray()), JSON_THROW_ON_ERROR); + $fields = [ + 'label' => $formDefinition->name, + 'identifier' => $formDefinition->identifier, + 'configuration' => $formDefinitionJson, + ]; + + $this->persistenceGuard->allowInvocation(FormDefinitionPersistenceCommand::Update, $uid, $fields); + /** @var DataHandler $dataHandler */ + $dataHandler = GeneralUtility::makeInstance(DataHandler::class); + $dataHandler->start([self::TABLE_NAME => [$uid => $fields]], []); + try { + $dataHandler->process_datamap(); + } finally { + $this->persistenceGuard->consumeInvocation(FormDefinitionPersistenceCommand::Update, $uid, $fields); + } + + return $dataHandler->errorLog === []; + } +} diff --git a/Classes/Domain/Runtime/Exception/PropertyMappingException.php b/Classes/Domain/Runtime/Exception/PropertyMappingException.php new file mode 100644 index 0000000..e1c31ec --- /dev/null +++ b/Classes/Domain/Runtime/Exception/PropertyMappingException.php @@ -0,0 +1,27 @@ +bind($request); + * $renderedForm = $form->render(); + * \--- + * + * Accessing Form Values + * ===================== + * + * In order to get the values the user has entered into the form, you can access + * this object like an array: If a form field with the identifier *firstName* + * exists, you can do **$form['firstName']** to retrieve its current value. + * + * You can also set values in the same way. + * + * Rendering Internals + * =================== + * + * The FormRuntime asks the FormDefinition about the configured Renderer + * which should be used ({@link \TYPO3\CMS\Form\Domain\Model\FormDefinition::getRendererClassName}), + * and then trigger render() on this Renderer. + * + * This makes it possible to declaratively define how a form should be rendered. + * + * Scope: frontend + * **This class is NOT meant to be sub classed by developers.** + * + * @internal High cohesion to FormDefinition, may change any time + * @todo: Declare final in v12 + */ +#[Autoconfigure(public: true, shared: false)] +class FormRuntime implements RootRenderableInterface, \ArrayAccess +{ + public const HONEYPOT_NAME_SESSION_IDENTIFIER = 'tx_form_honeypot_name_'; + + protected FormDefinition $formDefinition; + protected RequestInterface $request; + protected ResponseInterface $response; + + /** + * @var FormState + */ + protected $formState; + + /** + * Individual unique random form session identifier valid + * for current user session. This value is not persisted server-side. + * + * @var FormSession|null + */ + protected $formSession; + + /** + * The current page is the page which will be displayed to the user + * during rendering. + * + * If $currentPage is NULL, the *last* page has been submitted and + * finishing actions need to take place. You should use $this->isAfterLastPage() + * instead of explicitly checking for NULL. + * + * @var Page|null + */ + protected $currentPage; + + /** + * Reference to the page which has been shown on the last request (i.e. + * we have to handle the submitted data from lastDisplayedPage) + * + * @var Page + */ + protected $lastDisplayedPage; + + /** + * The current site language configuration. + * + * @var SiteLanguage + */ + protected $currentSiteLanguage; + + /** + * Reference to the current running finisher + * + * @var FinisherInterface + */ + protected $currentFinisher; + + public function __construct( + protected readonly ContainerInterface $container, + protected readonly ConfigurationManagerInterface $configurationManager, + protected readonly HashService $hashService, + protected readonly ValidatorResolver $validatorResolver, + private readonly Context $context, + private readonly EventDispatcherInterface $eventDispatcher, + ) { + $this->response = new Response(); + } + + public function setFormDefinition(FormDefinition $formDefinition) + { + $this->formDefinition = $formDefinition; + } + + public function setRequest(RequestInterface $request) + { + $this->request = clone $request; + } + + public function initialize() + { + $arguments = $this->request->getArguments(); + $formIdentifier = $this->formDefinition->getIdentifier(); + if (isset($arguments[$formIdentifier])) { + $this->request = $this->request->withArguments($arguments[$formIdentifier]); + } + + $this->initializeCurrentSiteLanguage(); + $this->initializeFormSessionFromRequest(); + $this->initializeFormStateFromRequest(); + $this->triggerAfterFormStateInitialized(); + $this->processVariants(); + $this->initializeCurrentPageFromRequest(); + $this->initializeHoneypotFromRequest(); + + // Only validate and set form values within the form state + // if the current request is not the very first request + // and the current request can be processed (POST request and uncached). + if (!$this->isFirstRequest() && $this->canProcessFormSubmission()) { + $this->processSubmittedFormValues(); + } + + $this->renderHoneypot(); + } + + /** + * @todo `FormRuntime::$formSession` is still vulnerable to session fixation unless a real cookie-based process is used + */ + protected function initializeFormSessionFromRequest(): void + { + // Initialize the form session only if the current request can be processed + // (POST request and uncached) to ensure unique sessions for each form submitter. + if (!$this->canProcessFormSubmission()) { + return; + } + + /** @var ExtbaseRequestParameters $extbaseRequestParameters */ + $extbaseRequestParameters = $this->request->getAttribute('extbase'); + $sessionIdentifierFromRequest = $extbaseRequestParameters->getInternalArgument('__session'); + $this->formSession = GeneralUtility::makeInstance(FormSession::class, $sessionIdentifierFromRequest); + } + + /** + * Initializes the current state of the form, based on the request + * @throws BadRequestException + */ + protected function initializeFormStateFromRequest() + { + // Only try to reconstitute the form state if the current request + // is not the very first request and if the current request can + // be processed (POST request and uncached). + /** @var ExtbaseRequestParameters $extbaseRequestParameters */ + $extbaseRequestParameters = $this->request->getAttribute('extbase'); + $serializedFormStateWithHmac = $extbaseRequestParameters->getInternalArgument('__state'); + if ($serializedFormStateWithHmac === null || !$this->canProcessFormSubmission()) { + $this->formState = GeneralUtility::makeInstance(FormState::class); + } else { + try { + $serializedFormState = $this->hashService->validateAndStripHmac($serializedFormStateWithHmac, HashScope::FormState->prefix(), HashAlgo::SHA3_256); + } catch (InvalidHashStringException $e) { + throw new BadRequestException('The HMAC of the form state could not be validated.', 1581862823); + } + /* @phpstan-ignore unserialize.allowedClasses.insecure (Integrity check already happens via HMAC validation) */ + $this->formState = unserialize(base64_decode($serializedFormState), ['allowed_classes' => true]); + } + } + + protected function triggerAfterFormStateInitialized(): void + { + $this->eventDispatcher->dispatch( + new AfterFormStateInitializedEvent($this, $this->request) + ); + } + + /** + * Initializes the current page data based on the current request, also modifiable by a hook + */ + protected function initializeCurrentPageFromRequest(): void + { + // If there was no previous form submissions or if the current request + // can't be processed (no POST request and/or cached) then display the first + // form step + if (!$this->formState->isFormSubmitted() || !$this->canProcessFormSubmission()) { + $this->currentPage = $this->formDefinition->getPageByIndex(0); + + if (!$this->currentPage->isEnabled()) { + throw new FormException('Disabling the first page is not allowed', 1527186844); + } + $this->dispatchCurrentPageInitializedEvent(); + return; + } + + $this->lastDisplayedPage = $this->formDefinition->getPageByIndex($this->formState->getLastDisplayedPageIndex()); + $currentPageIndex = $this->determineCurrentPageIndex(); + + if ($this->isLastPage($currentPageIndex)) { + $this->currentPage = null; + } else { + $this->currentPage = $this->formDefinition->getPageByIndex($currentPageIndex); + if (!$this->currentPage->isEnabled()) { + if ($currentPageIndex === 0) { + throw new FormException('Disabling the first page is not allowed', 1527186845); + } + if ($this->userWentBackToPreviousStep()) { + $this->currentPage = $this->getPreviousEnabledPage(); + } else { + $this->currentPage = $this->getNextEnabledPage(); + } + } + } + $this->dispatchCurrentPageInitializedEvent($this->lastDisplayedPage); + } + + private function isLastPage(int $currentPageIndex): bool + { + return $currentPageIndex >= count($this->formDefinition->getPages()); + } + + /** + * Get the current page index by resolving the request + */ + private function determineCurrentPageIndex(): int + { + /** @var ExtbaseRequestParameters $extbaseRequestParameters */ + $extbaseRequestParameters = $this->request->getAttribute('extbase'); + $currentPageIndex = (int)$extbaseRequestParameters->getInternalArgument('__currentPage'); + if ($this->userWentBackToPreviousStep()) { + if ($currentPageIndex < $this->lastDisplayedPage->getIndex()) { + $currentPageIndex = $this->lastDisplayedPage->getIndex(); + } + } else { + if ($currentPageIndex > $this->lastDisplayedPage->getIndex() + 1) { + $currentPageIndex = $this->lastDisplayedPage->getIndex() + 1; + } + } + return $currentPageIndex; + } + + /** + * Dispatches the AfterCurrentPageIsInitializedEvent event and sets the current page + */ + private function dispatchCurrentPageInitializedEvent(?Page $lastDisplayedPage = null): void + { + $event = $this->eventDispatcher->dispatch( + new AfterCurrentPageIsResolvedEvent( + $this->currentPage, + $this, + $lastDisplayedPage, + $this->request, + ) + ); + $this->currentPage = $event->currentPage; + } + + /** + * Checks if the honey pot is active, and adds a validator if so. + */ + protected function initializeHoneypotFromRequest() + { + $renderingOptions = $this->formDefinition->getRenderingOptions(); + if (!isset($renderingOptions['honeypot']['enable']) + || $renderingOptions['honeypot']['enable'] === false + || ApplicationType::fromRequest($this->request)->isBackend() + ) { + return; + } + + ArrayUtility::assertAllArrayKeysAreValid($renderingOptions['honeypot'], ['enable', 'formElementToUse']); + + if (!$this->isFirstRequest()) { + $elementsCount = count($this->lastDisplayedPage->getElements()); + if ($elementsCount === 0) { + return; + } + + $honeypotNameFromSession = $this->getHoneypotNameFromSession($this->lastDisplayedPage); + if ($honeypotNameFromSession) { + $honeypotElement = $this->lastDisplayedPage->createElement($honeypotNameFromSession, $renderingOptions['honeypot']['formElementToUse']); + $validator = $this->validatorResolver->createValidator(EmptyValidator::class, [], $this->request); + $honeypotElement->addValidator($validator); + } + } + } + + /** + * Renders a hidden field if the honey pot is active. + */ + protected function renderHoneypot() + { + $renderingOptions = $this->formDefinition->getRenderingOptions(); + if (!isset($renderingOptions['honeypot']['enable']) + || $this->currentPage === null + || $renderingOptions['honeypot']['enable'] === false + || ApplicationType::fromRequest($this->request)->isBackend() + ) { + return; + } + + ArrayUtility::assertAllArrayKeysAreValid($renderingOptions['honeypot'], ['enable', 'formElementToUse']); + + if (!$this->isAfterLastPage()) { + $elementsCount = count($this->currentPage->getElements()); + if ($elementsCount === 0) { + return; + } + + if (!$this->isFirstRequest()) { + $honeypotNameFromSession = $this->getHoneypotNameFromSession($this->lastDisplayedPage); + if ($honeypotNameFromSession) { + $honeypotElement = $this->formDefinition->getElementByIdentifier($honeypotNameFromSession); + if ($honeypotElement instanceof FormElementInterface) { + $this->lastDisplayedPage->removeElement($honeypotElement); + } + } + } + + $elementsCount = count($this->currentPage->getElements()); + $randomElementNumber = random_int(0, $elementsCount - 1); + $honeypotName = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, random_int(5, 26)); + + $referenceElement = $this->currentPage->getElements()[$randomElementNumber]; + $honeypotElement = $this->currentPage->createElement($honeypotName, $renderingOptions['honeypot']['formElementToUse']); + $validator = $this->validatorResolver->createValidator(EmptyValidator::class, [], $this->request); + + $honeypotElement->addValidator($validator); + if (random_int(0, 1) === 1) { + $this->currentPage->moveElementAfter($honeypotElement, $referenceElement); + } else { + $this->currentPage->moveElementBefore($honeypotElement, $referenceElement); + } + $this->setHoneypotNameInSession($this->currentPage, $honeypotName); + } + } + + /** + * @return string|null + */ + protected function getHoneypotNameFromSession(Page $page) + { + if ($this->isFrontendUserAuthenticated()) { + $honeypotNameFromSession = $this->getFrontendUser()->getKey( + 'user', + self::HONEYPOT_NAME_SESSION_IDENTIFIER . $this->getIdentifier() . $page->getIdentifier() + ); + } else { + $honeypotNameFromSession = $this->getFrontendUser()->getKey( + 'ses', + self::HONEYPOT_NAME_SESSION_IDENTIFIER . $this->getIdentifier() . $page->getIdentifier() + ); + } + return $honeypotNameFromSession; + } + + protected function setHoneypotNameInSession(Page $page, string $honeypotName) + { + if ($this->isFrontendUserAuthenticated()) { + $this->getFrontendUser()->setKey( + 'user', + self::HONEYPOT_NAME_SESSION_IDENTIFIER . $this->getIdentifier() . $page->getIdentifier(), + $honeypotName + ); + } else { + $this->getFrontendUser()->setKey( + 'ses', + self::HONEYPOT_NAME_SESSION_IDENTIFIER . $this->getIdentifier() . $page->getIdentifier(), + $honeypotName + ); + } + } + + /** + * Necessary to know if honeypot information should be stored in the user session info, or in the anonymous session. + */ + protected function isFrontendUserAuthenticated(): bool + { + return (bool)$this->context->getPropertyFromAspect('frontend.user', 'isLoggedIn', false); + } + + protected function processVariants(): void + { + $conditionResolver = $this->getConditionResolver(); + $renderables = array_merge([$this->formDefinition], $this->formDefinition->getRenderablesRecursively()); + foreach ($renderables as $renderable) { + if ($renderable instanceof VariableRenderableInterface) { + $variants = $renderable->getVariants(); + foreach ($variants as $variant) { + if ($variant->conditionMatches($conditionResolver)) { + $variant->apply(); + } + } + } + } + } + + /** + * Returns TRUE if the last page of the form has been submitted, otherwise FALSE + */ + protected function isAfterLastPage(): bool + { + return $this->currentPage === null; + } + + /** + * Returns TRUE if no previous page is stored in the FormState, otherwise FALSE + */ + protected function isFirstRequest(): bool + { + return $this->lastDisplayedPage === null; + } + + protected function isPostRequest(): bool + { + return $this->getRequest()->getMethod() === 'POST'; + } + + /** + * Determine whether the surrounding content object is cached. + * If no surrounding content object can be found (which would be strange) + * we assume a cached request for safety which means that an empty form + * will be rendered. + */ + protected function isRenderedCached(): bool + { + $contentObject = $this->request->getAttribute('currentContentObject'); + // @todo: this does not work when rendering a cached `FLUIDTEMPLATE` (not nested in `COA_INT`) + // Rendering the form other than with the controller, will never work out cleanly. + // This likely can only be resolved by deprecating using the form render view helper + // other than in a template for the form plugin and covering the use cases the VH was introduced + // with a different concept + return $contentObject === null || $contentObject->getUserObjectType() === ContentObjectRenderer::OBJECTTYPE_USER; + } + + /** + * Runs through all validations + */ + protected function processSubmittedFormValues() + { + $result = $this->mapAndValidatePage($this->lastDisplayedPage); + if ($result->hasErrors() && !$this->userWentBackToPreviousStep()) { + $this->currentPage = $this->lastDisplayedPage; + /** @var ExtbaseRequestParameters $extbaseRequestParameters */ + $extbaseRequestParameters = clone $this->request->getAttribute('extbase'); + $extbaseRequestParameters->setOriginalRequestMappingResults($result); + $this->request = $this->request->withAttribute('extbase', $extbaseRequestParameters); + } + } + + /** + * returns TRUE if the user went back to any previous step in the form. + */ + protected function userWentBackToPreviousStep(): bool + { + return !$this->isAfterLastPage() && !$this->isFirstRequest() && $this->currentPage->getIndex() < $this->lastDisplayedPage->getIndex(); + } + + /** + * @throws PropertyMappingException + */ + protected function mapAndValidatePage(Page $page): Result + { + $result = GeneralUtility::makeInstance(Result::class); + $requestArguments = $this->request->getArguments(); + + $propertyPathsForWhichPropertyMappingShouldHappen = []; + $registerPropertyPaths = static function ($propertyPath) use (&$propertyPathsForWhichPropertyMappingShouldHappen) { + $propertyPathParts = explode('.', $propertyPath); + $accumulatedPropertyPathParts = []; + foreach ($propertyPathParts as $propertyPathPart) { + $accumulatedPropertyPathParts[] = $propertyPathPart; + $temporaryPropertyPath = implode('.', $accumulatedPropertyPathParts); + $propertyPathsForWhichPropertyMappingShouldHappen[$temporaryPropertyPath] = $temporaryPropertyPath; + } + }; + + $this->eventDispatcher->dispatch( + new BeforeRenderableIsValidatedEvent( + null, + $this, + $page, + $this->request, + ) + ); + + foreach ($page->getElementsRecursively() as $element) { + if (!$this->isRenderableEnabled($element)) { + continue; + } + + try { + $value = ArrayUtility::getValueByPath($requestArguments, $element->getIdentifier(), '.'); + } catch (MissingArrayPathException $exception) { + $value = null; + } + + $event = $this->eventDispatcher->dispatch( + new BeforeRenderableIsValidatedEvent( + $value, + $this, + $element, + $this->request, + ) + ); + $value = $event->value; + + $this->formState->setFormValue($element->getIdentifier(), $value); + $registerPropertyPaths($element->getIdentifier()); + } + + // The more parts the path has, the more early it is processed + usort($propertyPathsForWhichPropertyMappingShouldHappen, static function ($a, $b) { + return substr_count($b, '.') - substr_count($a, '.'); + }); + + $processingRules = $this->formDefinition->getProcessingRules(); + + foreach ($propertyPathsForWhichPropertyMappingShouldHappen as $propertyPath) { + if (isset($processingRules[$propertyPath])) { + $processingRule = $processingRules[$propertyPath]; + $value = $this->formState->getFormValue($propertyPath); + try { + $value = $processingRule->process($value); + } catch (PropertyException $exception) { + throw new PropertyMappingException( + 'Failed to process FormValue at "' . $propertyPath . '" from "' . gettype($value) . '" to "' . $processingRule->getDataType() . '"', + 1480024933, + $exception + ); + } + $result->forProperty($this->getIdentifier() . '.' . $propertyPath)->merge($processingRule->getProcessingMessages()); + $this->formState->setFormValue($propertyPath, $value); + } + } + + return $result; + } + + /** + * Override the current page taken from the request, rendering the page with index $pageIndex instead. + * + * This is typically not needed in production code, but it is very helpful when displaying + * some kind of "preview" of the form (e.g. form editor). + * + * @param int $pageIndex + */ + public function overrideCurrentPage(int $pageIndex) + { + $this->currentPage = $this->formDefinition->getPageByIndex($pageIndex); + } + + /** + * Render this form. + * + * @return string|null rendered form + * @throws RenderingException + */ + public function render() + { + if ($this->isAfterLastPage()) { + return $this->invokeFinishers(); + } + $this->processVariants(); + + $this->formState->setLastDisplayedPageIndex($this->currentPage->getIndex()); + + if ($this->formDefinition->getRendererClassName() === '') { + throw new RenderingException(sprintf('The form definition "%s" does not have a rendererClassName set.', $this->formDefinition->getIdentifier()), 1326095912); + } + $rendererClassName = $this->formDefinition->getRendererClassName(); + $renderer = $this->container->get($rendererClassName); + if (!($renderer instanceof RendererInterface)) { + throw new RenderingException(sprintf('The renderer "%s" des not implement RendererInterface', $rendererClassName), 1326096024); + } + + $renderer->setFormRuntime($this); + return $renderer->render(); + } + + /** + * Executes all finishers of this form + */ + protected function invokeFinishers(): string + { + $finisherContext = GeneralUtility::makeInstance( + FinisherContext::class, + $this, + $this->request + ); + + $output = ''; + $this->response->getBody()->rewind(); + $originalContent = $this->response->getBody()->getContents(); + $this->response->getBody()->write(''); + foreach ($this->formDefinition->getFinishers() as $finisher) { + $this->currentFinisher = $finisher; + $this->processVariants(); + + $finisherOutput = $finisher->execute($finisherContext); + if (is_string($finisherOutput) && !empty($finisherOutput)) { + $output .= $finisherOutput; + } else { + $this->response->getBody()->rewind(); + $output .= $this->response->getBody()->getContents(); + $this->response->getBody()->write(''); + } + + if ($finisherContext->isCancelled()) { + break; + } + } + $this->response->getBody()->rewind(); + $this->response->getBody()->write($originalContent); + + return $output; + } + + /** + * @return string The identifier of underlying form + */ + public function getIdentifier(): string + { + return $this->formDefinition->getIdentifier(); + } + + /** + * Get the request this object is bound to. + * + * This is mostly relevant inside Finishers, where you f.e. want to redirect + * the user to another page. + * + * @return RequestInterface The request this object is bound to + */ + public function getRequest(): RequestInterface + { + return $this->request; + } + + /** + * Get the response this object is bound to. + * + * This is mostly relevant inside Finishers, where you f.e. want to set response + * headers or output content. + * + * @return ResponseInterface the response this object is bound to + */ + public function getResponse(): ResponseInterface + { + return $this->response; + } + + /** + * Only process values if there is a post request and if the + * surrounding content object is uncached. + * Is this not the case, all possible submitted values will be discarded + * and the first form step will be shown with an empty form state. + * + * @internal + */ + public function canProcessFormSubmission(): bool + { + return $this->isPostRequest() && !$this->isRenderedCached(); + } + + /** + * @internal + */ + public function getFormSession(): ?FormSession + { + return $this->formSession; + } + + /** + * Returns the currently selected page + */ + public function getCurrentPage(): ?Page + { + return $this->currentPage; + } + + /** + * Returns the previous page of the currently selected one or NULL if there is no previous page + */ + public function getPreviousPage(): ?Page + { + $previousPageIndex = $this->currentPage->getIndex() - 1; + if ($this->formDefinition->hasPageWithIndex($previousPageIndex)) { + return $this->formDefinition->getPageByIndex($previousPageIndex); + } + return null; + } + + /** + * Returns the next page of the currently selected one or NULL if there is no next page + */ + public function getNextPage(): ?Page + { + $nextPageIndex = $this->currentPage->getIndex() + 1; + if ($this->formDefinition->hasPageWithIndex($nextPageIndex)) { + return $this->formDefinition->getPageByIndex($nextPageIndex); + } + return null; + } + + /** + * Returns the previous enabled page of the currently selected one + * or NULL if there is no previous page + */ + public function getPreviousEnabledPage(): ?Page + { + $previousPage = null; + $previousPageIndex = $this->currentPage->getIndex() - 1; + while ($previousPageIndex >= 0) { + if ($this->formDefinition->hasPageWithIndex($previousPageIndex)) { + $previousPage = $this->formDefinition->getPageByIndex($previousPageIndex); + + if ($previousPage->isEnabled()) { + break; + } + + $previousPage = null; + $previousPageIndex--; + } else { + $previousPage = null; + break; + } + } + + return $previousPage; + } + + /** + * Returns the next enabled page of the currently selected one or + * NULL if there is no next page + */ + public function getNextEnabledPage(): ?Page + { + $nextPage = null; + $pageCount = count($this->formDefinition->getPages()); + $nextPageIndex = $this->currentPage->getIndex() + 1; + + while ($nextPageIndex < $pageCount) { + if ($this->formDefinition->hasPageWithIndex($nextPageIndex)) { + $nextPage = $this->formDefinition->getPageByIndex($nextPageIndex); + $renderingOptions = $nextPage->getRenderingOptions(); + if ( + !isset($renderingOptions['enabled']) + || (bool)$renderingOptions['enabled'] + ) { + break; + } + $nextPage = null; + $nextPageIndex++; + } else { + $nextPage = null; + break; + } + } + + return $nextPage; + } + + /** + * Abstract "type" of this Renderable. Is used during the rendering process + * to determine the template file or the View PHP class being used to render + * the particular element. + */ + public function getType(): string + { + return $this->formDefinition->getType(); + } + + /** + * @param string $identifier + * @internal + */ + public function offsetExists(mixed $identifier): bool + { + $identifier = (string)$identifier; + if ($this->getElementValue($identifier) !== null) { + return true; + } + + if (is_callable([$this, 'get' . ucfirst($identifier)])) { + return true; + } + if (is_callable([$this, 'has' . ucfirst($identifier)])) { + return true; + } + if (is_callable([$this, 'is' . ucfirst($identifier)])) { + return true; + } + if (property_exists($this, $identifier)) { + $propertyReflection = new \ReflectionProperty($this, $identifier); + return $propertyReflection->isPublic(); + } + + return false; + } + + /** + * @param string $identifier + * @internal + */ + public function offsetGet(mixed $identifier): mixed + { + $identifier = (string)$identifier; + if ($this->getElementValue($identifier) !== null) { + return $this->getElementValue($identifier); + } + $getterMethodName = 'get' . ucfirst($identifier); + if (is_callable([$this, $getterMethodName])) { + return $this->{$getterMethodName}(); + } + return null; + } + + /** + * @param string $identifier + * @internal + */ + public function offsetSet(mixed $identifier, mixed $value): void + { + $identifier = (string)$identifier; + $this->formState->setFormValue($identifier, $value); + } + + /** + * @param string $identifier + * @internal + */ + public function offsetUnset(mixed $identifier): void + { + $identifier = (string)$identifier; + $this->formState->setFormValue($identifier, null); + } + + /** + * Returns the value of the specified element + * + * @return mixed + */ + public function getElementValue(string $identifier) + { + $formValue = $this->formState->getFormValue($identifier); + if ($formValue !== null) { + return $formValue; + } + return $this->formDefinition->getElementDefaultValueByIdentifier($identifier); + } + + /** + * @return array|Page[] The Form's pages in the correct order + */ + public function getPages(): array + { + return $this->formDefinition->getPages(); + } + + /** + * @internal + */ + public function getFormState(): ?FormState + { + return $this->formState; + } + + /** + * Get all rendering options + * + * @return array associative array of rendering options + */ + public function getRenderingOptions(): array + { + return $this->formDefinition->getRenderingOptions(); + } + + /** + * Get the renderer class name to be used to display this renderable; + * must implement RendererInterface + * + * @return string the renderer class name + */ + public function getRendererClassName(): string + { + return $this->formDefinition->getRendererClassName(); + } + + /** + * Get the label which shall be displayed next to the form element + */ + public function getLabel(): string + { + return $this->formDefinition->getLabel(); + } + + /** + * Get the template name of the renderable + */ + public function getTemplateName(): string + { + return $this->formDefinition->getTemplateName(); + } + + /** + * Get the underlying form definition from the runtime + */ + public function getFormDefinition(): FormDefinition + { + return $this->formDefinition; + } + + /** + * Get the current site language configuration. + * + * @return SiteLanguage + */ + public function getCurrentSiteLanguage(): ?SiteLanguage + { + return $this->currentSiteLanguage; + } + + /** + * Override the current site language configuration. + * + * This is typically not needed in production code, but it is very + * helpful when displaying some kind of "preview" of the form (e.g. form editor). + * + * @param SiteLanguage $currentSiteLanguage + */ + public function setCurrentSiteLanguage(SiteLanguage $currentSiteLanguage): void + { + $this->currentSiteLanguage = $currentSiteLanguage; + } + + /** + * Initialize the SiteLanguage object. + * This is mainly used by the condition matcher. + */ + protected function initializeCurrentSiteLanguage(): void + { + if ($this->request->getAttribute('language') instanceof SiteLanguage) { + $this->currentSiteLanguage = $this->request->getAttribute('language'); + } else { + $languageId = (int)$this->context->getPropertyFromAspect('language', 'id', 0); + $pageId = $this->request->getAttribute('frontend.page.information')?->getId() ?? 0; + $fakeSiteConfiguration = [ + 'languages' => [ + [ + 'languageId' => $languageId, + 'title' => 'Dummy', + 'navigationTitle' => '', + 'flag' => '', + 'locale' => '', + ], + ], + ]; + $this->currentSiteLanguage = GeneralUtility::makeInstance(Site::class, 'form-dummy', $pageId, $fakeSiteConfiguration) + ->getLanguageById($languageId); + } + } + + /** + * Reference to the current running finisher + */ + public function getCurrentFinisher(): ?FinisherInterface + { + return $this->currentFinisher; + } + + protected function getConditionResolver(): Resolver + { + $formValues = array_replace_recursive( + $this->getFormState()->getFormValues(), + $this->getRequest()->getArguments() + ); + $page = $this->getCurrentPage(); + $stepIdentifier = $page !== null ? $page->getIdentifier() : ''; + $stepType = $page !== null ? $page->getType() : ''; + + $finisherIdentifier = ''; + if ($this->getCurrentFinisher() !== null) { + if (method_exists($this->getCurrentFinisher(), 'getFinisherIdentifier')) { + $finisherIdentifier = $this->getCurrentFinisher()->getFinisherIdentifier(); + } else { + $finisherIdentifier = (new \ReflectionClass($this->getCurrentFinisher()))->getShortName(); + $finisherIdentifier = preg_replace('/Finisher$/', '', $finisherIdentifier); + } + } + + $contentObjectData = $this->request->getAttribute('currentContentObject')->data ?? []; + + return GeneralUtility::makeInstance( + Resolver::class, + 'form', + [ + 'formRuntime' => $this, + 'formValues' => $formValues, + 'stepIdentifier' => $stepIdentifier, + 'stepType' => $stepType, + 'finisherIdentifier' => $finisherIdentifier, + 'contentObject' => $contentObjectData, + 'request' => new RequestWrapper($this->getRequest()), + 'site' => $this->getRequest()->getAttribute('site'), + 'siteLanguage' => $this->getRequest()->getAttribute('language'), + ] + ); + } + + protected function getFrontendUser(): FrontendUserAuthentication + { + return $this->request->getAttribute('frontend.user'); + } + + protected function isRenderableEnabled(RenderableInterface $renderable): bool + { + if (!$renderable->isEnabled()) { + return false; + } + + while ($renderable = $renderable->getParentRenderable()) { + if ($renderable instanceof RenderableInterface && !$renderable->isEnabled()) { + return false; + } + } + + return true; + } +} diff --git a/Classes/Domain/Runtime/FormRuntime/FormSession.php b/Classes/Domain/Runtime/FormRuntime/FormSession.php new file mode 100644 index 0000000..c2a930d --- /dev/null +++ b/Classes/Domain/Runtime/FormRuntime/FormSession.php @@ -0,0 +1,88 @@ +identifier = $this->generateIdentifier(); + } else { + $this->identifier = $this->validateIdentifier($authenticatedIdentifier); + } + } + + /** + * @internal + */ + public function getIdentifier(): string + { + return $this->identifier; + } + + /** + * Consumed by TYPO3\CMS\Form\ViewHelpers\FormViewHelper + * + * @internal + */ + public function getAuthenticatedIdentifier(): string + { + return GeneralUtility::makeInstance(HashService::class) + // restrict string expansion by adding some char ('|') + ->appendHmac($this->identifier . '|', HashScope::FormSession->prefix(), HashAlgo::SHA3_256); + } + + protected function generateIdentifier(): string + { + return GeneralUtility::makeInstance(Random::class)->generateRandomHexString(40); + } + + /** + * @throws BadRequestException + */ + protected function validateIdentifier(string $authenticatedIdentifier): string + { + try { + $identifier = GeneralUtility::makeInstance(HashService::class) + ->validateAndStripHmac($authenticatedIdentifier, HashScope::FormSession->prefix(), HashAlgo::SHA3_256); + return rtrim($identifier, '|'); + } catch (InvalidHashStringException $e) { + throw new BadRequestException('The HMAC of the form session could not be validated.', 1613300274); + } + } +} diff --git a/Classes/Domain/Runtime/FormState.php b/Classes/Domain/Runtime/FormState.php new file mode 100644 index 0000000..6c9a123 --- /dev/null +++ b/Classes/Domain/Runtime/FormState.php @@ -0,0 +1,102 @@ +lastDisplayedPageIndex !== self::NOPAGE; + } + + public function getLastDisplayedPageIndex(): int + { + return $this->lastDisplayedPageIndex; + } + + public function setLastDisplayedPageIndex(int $lastDisplayedPageIndex) + { + $this->lastDisplayedPageIndex = $lastDisplayedPageIndex; + } + + public function getFormValues(): array + { + return $this->formValues; + } + + /** + * @param mixed $value + */ + public function setFormValue(string $propertyPath, $value) + { + $this->formValues = ArrayUtility::setValueByPath( + $this->formValues, + $propertyPath, + $value, + '.' + ); + } + + /** + * @return mixed + */ + public function getFormValue(string $propertyPath) + { + try { + return ArrayUtility::getValueByPath($this->formValues, $propertyPath, '.'); + } catch (MissingArrayPathException $exception) { + return null; + } + } +} diff --git a/Classes/Domain/Translation/FormTranslationKeychainBuilder.php b/Classes/Domain/Translation/FormTranslationKeychainBuilder.php new file mode 100644 index 0000000..0fb9116 --- /dev/null +++ b/Classes/Domain/Translation/FormTranslationKeychainBuilder.php @@ -0,0 +1,272 @@ + + */ + public function buildForElementProperty( + array $translationFiles, + string $formIdentifier, + string $elementIdentifier, + string $elementType, + string $propertyType, + string $property, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.element.%s.%s.%s', $translationFile, $originalFormIdentifier, $elementIdentifier, $propertyType, $property); + } + array_push($chain, ...$this->buildElementPropertyKeys($translationFile, $formIdentifier, $elementIdentifier, $elementType, $propertyType, $property)); + } + return $chain; + } + + /** + * Builds the keychain for a scalar property on the FormRuntime itself, + * where the original form identifier is used as the element segment. + * + * @param string[] $translationFiles + * @return list + */ + public function buildForFormRuntimeProperty( + array $translationFiles, + string $formIdentifier, + string $elementIdentifier, + string $elementType, + string $propertyType, + string $property, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.element.%s.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $propertyType, $property); + $chain[] = sprintf('%s:element.%s.%s.%s', $translationFile, $originalFormIdentifier, $propertyType, $property); + } + array_push($chain, ...$this->buildElementPropertyKeys($translationFile, $formIdentifier, $elementIdentifier, $elementType, $propertyType, $property)); + } + return $chain; + } + + /** + * Builds the keychain for a single option entry inside an "options" + * array property on a regular element (e.g. Select / RadioButton / Checkbox groups). + * + * @param string[] $translationFiles + * @return list + */ + public function buildForElementOption( + array $translationFiles, + string $formIdentifier, + string $elementIdentifier, + string $elementType, + string $propertyType, + string $property, + string|int $optionValue, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.element.%s.%s.%s.%s', $translationFile, $originalFormIdentifier, $elementIdentifier, $propertyType, $property, $optionValue); + } + array_push($chain, ...$this->buildElementOptionKeys($translationFile, $formIdentifier, $elementIdentifier, $elementType, $propertyType, $property, $optionValue)); + } + return $chain; + } + + /** + * Builds the keychain for a single option entry on the FormRuntime itself, + * where the original form identifier is used as the element segment. + * + * @param string[] $translationFiles + * @return list + */ + public function buildForFormRuntimeOption( + array $translationFiles, + string $formIdentifier, + string $elementIdentifier, + string $elementType, + string $propertyType, + string $property, + string|int $optionValue, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.element.%s.%s.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $propertyType, $property, $optionValue); + $chain[] = sprintf('%s:element.%s.%s.%s.%s', $translationFile, $originalFormIdentifier, $propertyType, $property, $optionValue); + } + array_push($chain, ...$this->buildElementOptionKeys($translationFile, $formIdentifier, $elementIdentifier, $elementType, $propertyType, $property, $optionValue)); + } + return $chain; + } + + /** + * Builds the keychain for a validation error code on a regular form element. + * + * @param string[] $translationFiles + * @return list + */ + public function buildForValidationError( + array $translationFiles, + string $formIdentifier, + string $elementIdentifier, + int $code, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.validation.error.%s.%s', $translationFile, $originalFormIdentifier, $elementIdentifier, $code); + $chain[] = sprintf('%s:%s.validation.error.%s', $translationFile, $originalFormIdentifier, $code); + } + array_push($chain, ...$this->buildValidationErrorKeys($translationFile, $formIdentifier, $elementIdentifier, $code)); + } + return $chain; + } + + /** + * Builds the keychain for a validation error code on the FormRuntime itself, + * where the original form identifier is used as the element segment. + * + * @param string[] $translationFiles + * @return list + */ + public function buildForFormRuntimeValidationError( + array $translationFiles, + string $formIdentifier, + string $elementIdentifier, + int $code, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.validation.error.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $code); + $chain[] = sprintf('%s:validation.error.%s.%s', $translationFile, $originalFormIdentifier, $code); + $chain[] = sprintf('%s:%s.validation.error.%s', $translationFile, $originalFormIdentifier, $code); + } + array_push($chain, ...$this->buildValidationErrorKeys($translationFile, $formIdentifier, $elementIdentifier, $code)); + } + return $chain; + } + + /** + * Builds the keychain for a single finisher option. + * + * @param string[] $translationFiles + * @return list + */ + public function buildForFinisherOption( + array $translationFiles, + string $formIdentifier, + string $finisherIdentifier, + string $optionKey, + ?string $originalFormIdentifier + ): array { + $chain = []; + foreach ($translationFiles as $translationFile) { + if ($this->hasOriginalFormIdentifier($originalFormIdentifier)) { + $chain[] = sprintf('%s:%s.finisher.%s.%s', $translationFile, $originalFormIdentifier, $finisherIdentifier, $optionKey); + } + $chain[] = sprintf('%s:%s.finisher.%s.%s', $translationFile, $formIdentifier, $finisherIdentifier, $optionKey); + $chain[] = sprintf('%s:finisher.%s.%s', $translationFile, $finisherIdentifier, $optionKey); + } + return $chain; + } + + private function hasOriginalFormIdentifier(?string $originalFormIdentifier): bool + { + return is_string($originalFormIdentifier) && $originalFormIdentifier !== ''; + } + + /** + * @return list + */ + private function buildElementPropertyKeys( + string $translationFile, + string $formIdentifier, + string $elementIdentifier, + string $elementType, + string $propertyType, + string $property + ): array { + return [ + sprintf('%s:%s.element.%s.%s.%s', $translationFile, $formIdentifier, $elementIdentifier, $propertyType, $property), + sprintf('%s:element.%s.%s.%s', $translationFile, $elementIdentifier, $propertyType, $property), + sprintf('%s:element.%s.%s.%s', $translationFile, $elementType, $propertyType, $property), + ]; + } + + /** + * @return list + */ + private function buildElementOptionKeys( + string $translationFile, + string $formIdentifier, + string $elementIdentifier, + string $elementType, + string $propertyType, + string $property, + string|int $optionValue + ): array { + return [ + sprintf('%s:%s.element.%s.%s.%s.%s', $translationFile, $formIdentifier, $elementIdentifier, $propertyType, $property, $optionValue), + sprintf('%s:element.%s.%s.%s.%s', $translationFile, $elementIdentifier, $propertyType, $property, $optionValue), + sprintf('%s:element.%s.%s.%s.%s', $translationFile, $elementType, $propertyType, $property, $optionValue), + ]; + } + + /** + * @return list + */ + private function buildValidationErrorKeys( + string $translationFile, + string $formIdentifier, + string $elementIdentifier, + int $code + ): array { + return [ + sprintf('%s:%s.validation.error.%s.%s', $translationFile, $formIdentifier, $elementIdentifier, $code), + sprintf('%s:%s.validation.error.%s', $translationFile, $formIdentifier, $code), + sprintf('%s:validation.error.%s.%s', $translationFile, $elementIdentifier, $code), + sprintf('%s:validation.error.%s', $translationFile, $code), + ]; + } +} diff --git a/Classes/Domain/ValueObject/FormIdentifier.php b/Classes/Domain/ValueObject/FormIdentifier.php new file mode 100644 index 0000000..5424fb2 --- /dev/null +++ b/Classes/Domain/ValueObject/FormIdentifier.php @@ -0,0 +1,54 @@ +identifier; + } + + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/Classes/Evaluation/EmailOrFormElementIdentifier.php b/Classes/Evaluation/EmailOrFormElementIdentifier.php new file mode 100644 index 0000000..c4af85e --- /dev/null +++ b/Classes/Evaluation/EmailOrFormElementIdentifier.php @@ -0,0 +1,43 @@ +prototypeName; + } + + public function getConfiguration(): array + { + return $this->configuration; + } + + public function setConfiguration(array $configuration): void + { + $this->configuration = $configuration; + } +} diff --git a/Classes/Event/AfterFormIsBuiltEvent.php b/Classes/Event/AfterFormIsBuiltEvent.php new file mode 100644 index 0000000..7d935c7 --- /dev/null +++ b/Classes/Event/AfterFormIsBuiltEvent.php @@ -0,0 +1,30 @@ + $options + */ + public function __construct( + private readonly FinisherContext $finisherContext, + private array $options + ) {} + + public function getFinisherContext(): FinisherContext + { + return $this->finisherContext; + } + + /** + * @return array + */ + public function getOptions(): array + { + return $this->options; + } + + /** + * @param array $options + */ + public function setOptions(array $options): void + { + $this->options = $options; + } +} diff --git a/Classes/Event/BeforeFormIsCreatedEvent.php b/Classes/Event/BeforeFormIsCreatedEvent.php new file mode 100644 index 0000000..4583f1f --- /dev/null +++ b/Classes/Event/BeforeFormIsCreatedEvent.php @@ -0,0 +1,24 @@ +preventDeletion; + } +} diff --git a/Classes/Event/BeforeFormIsDuplicatedEvent.php b/Classes/Event/BeforeFormIsDuplicatedEvent.php new file mode 100644 index 0000000..9033336 --- /dev/null +++ b/Classes/Event/BeforeFormIsDuplicatedEvent.php @@ -0,0 +1,24 @@ +preventRemoval; + } +} diff --git a/Classes/Event/BeforeRenderableIsRenderedEvent.php b/Classes/Event/BeforeRenderableIsRenderedEvent.php new file mode 100644 index 0000000..7a2634c --- /dev/null +++ b/Classes/Event/BeforeRenderableIsRenderedEvent.php @@ -0,0 +1,32 @@ +getRow(); + if (($row['CType'] ?? '') !== 'form_formframework' || $event->getTableName() !== 'tt_content' || $event->getFieldName() !== 'pi_flexform') { + return; + } + $identifier = $event->getIdentifier(); + $currentFlexData = []; + if (!empty($row['pi_flexform']) && !is_array($row['pi_flexform'])) { + $currentFlexData = GeneralUtility::xml2array($row['pi_flexform']); + } + // Add selected form value + $identifier['ext-form-persistenceIdentifier'] = ''; + if (!empty($currentFlexData['data']['sDEF']['lDEF']['settings.persistenceIdentifier']['vDEF'])) { + $identifier['ext-form-persistenceIdentifier'] = $currentFlexData['data']['sDEF']['lDEF']['settings.persistenceIdentifier']['vDEF']; + } + // Add bool - finisher override active or not + $identifier['ext-form-overrideFinishers'] = ''; + if (isset($currentFlexData['data']['sDEF']['lDEF']['settings.overrideFinishers']['vDEF']) + && (int)$currentFlexData['data']['sDEF']['lDEF']['settings.overrideFinishers']['vDEF'] === 1 + ) { + $identifier['ext-form-overrideFinishers'] = 'enabled'; + } + $event->setIdentifier($identifier); + } + + /** + * Adds the list of existing form definitions to the form selection drop down + * and adds sheets to override finisher settings if requested. + */ + #[AsEventListener('form-framework/modify-data-structure')] + public function modifyDataStructure(AfterFlexFormDataStructureParsedEvent $event): void + { + $identifier = $event->getIdentifier(); + if (!isset($identifier['ext-form-persistenceIdentifier'])) { + return; + } + $dataStructure = $event->getDataStructure(); + // We need $this->extbaseConfigurationManager to work at this point. This is directly needed as + // input for FormPersistenceManager, and indirectly for ConfigurationService. + // The ConfigurationManager of ext:form needs ext:extbase ConfigurationManager to retrieve basic TS + // settings (for "module.tx_form" allowed form storages). ConfigurationManager of extbase should *usually* + // only be called in extbase context and needs a Request, which is usually set by extbase bootstrap. + // We are however not in extbase context here. + // The solution is ugly, but at least makes the situation explicit: + // We fetch the request from $GLOBALS['TYPO3_REQUEST'] and actively fake a request in case this is not set. + // The latter may happen in CLI context, if FlexFormTools->parseDataStructureByIdentifier() is used by CLI (really?). + // @todo: There are various options to deal with this. First, the BE extbase ConfigurationManager could + // make the dependency to request optional. The fact that extbase BE functionality relies on FE TS + // is the main and long standing issue here. If that is possible, this event may not need to + // set the request anymore, and it would probably be enough for ext:form to rely on "global" and + // not page-id dependent TS. + // Secondly, the FlexFormTools data structure identifier stuff could be made request aware and + // could hand over a request to the event. DS identifier retrieval however is low-level and we + // may not want to have this dependency at all in this layer. + // Another option might be to make *this* part of ext:form extbase free and have an own TS + // layer to fetch TS that does not rely on current request. But that is something we may + // not want, either, since it may break too much? + if (($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface) { + $request = $GLOBALS['TYPO3_REQUEST']; + } else { + $request = (new ServerRequest())->withAttribute('applicationType', SystemEnvironmentBuilder::REQUESTTYPE_BE); + } + $this->extbaseConfigurationManager->setRequest($request); + // @todo: Is this really needed? Isn't this event listener bound to BE only? + $isFrontend = false; + if (ApplicationType::fromRequest($request)->isFrontend()) { + $isFrontend = true; + } + $typoScriptSettings = $this->extbaseConfigurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + $formSettings = $this->extFormConfigurationManager->getYamlConfiguration($typoScriptSettings, $isFrontend, $isFrontend ? $request : null); + try { + // Add list of existing forms to drop down if we find our key in the identifier + $formIsAccessible = false; + foreach ($this->formPersistenceManager->listForms($formSettings, new SearchCriteria()) as $formMetadata) { + if ($formMetadata->persistenceIdentifier === $identifier['ext-form-persistenceIdentifier']) { + $formIsAccessible = true; + } + if ($formMetadata->invalid) { + $dataStructure['sheets']['sDEF']['ROOT']['el']['settings.persistenceIdentifier']['config']['items'][] = [ + 'label' => $formMetadata->name . ' (' . $formMetadata->persistenceIdentifier . ')', + 'value' => $formMetadata->persistenceIdentifier, + 'icon' => 'overlay-missing', + ]; + } else { + $dataStructure['sheets']['sDEF']['ROOT']['el']['settings.persistenceIdentifier']['config']['items'][] = [ + 'label' => $formMetadata->name . ' (' . $formMetadata->persistenceIdentifier . ')', + 'value' => $formMetadata->persistenceIdentifier, + 'icon' => 'content-form', + ]; + } + } + if (!empty($identifier['ext-form-persistenceIdentifier']) && !$formIsAccessible) { + $languageService = $this->getLanguageService(); + $dataStructure['sheets']['sDEF']['ROOT']['el']['settings.persistenceIdentifier']['config']['items'][] = [ + 'label' => sprintf( + $languageService->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:tt_content.preview.inaccessiblePersistenceIdentifier'), + $identifier['ext-form-persistenceIdentifier'] + ), + 'value' => $identifier['ext-form-persistenceIdentifier'], + ]; + } + // If a specific form is selected and if finisher override is active, add finisher sheets + if (!empty($identifier['ext-form-persistenceIdentifier']) && $formIsAccessible) { + $persistenceIdentifier = $identifier['ext-form-persistenceIdentifier']; + $formDefinition = $this->formPersistenceManager->load($persistenceIdentifier); + $translationFile = 'LLL:EXT:form/Resources/Private/Language/Database.xlf'; + $dataStructure['sheets']['sDEF']['ROOT']['el']['settings.overrideFinishers'] = [ + 'label' => $translationFile . ':tt_content.pi_flexform.formframework.overrideFinishers', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'check', + ], + ]; + $newSheets = []; + if (!empty($formDefinition['finishers'])) { + $prototypeName = $formDefinition['prototypeName'] ?? 'standard'; + $prototypeConfiguration = $this->configurationService->getPrototypeConfiguration($prototypeName); + $newSheets = $this->getAdditionalFinisherSheets($persistenceIdentifier, $formDefinition, $prototypeName, $prototypeConfiguration); + } + if (empty($newSheets)) { + ArrayUtility::mergeRecursiveWithOverrule( + $dataStructure['sheets']['sDEF']['ROOT']['el']['settings.overrideFinishers'], + [ + 'description' => $translationFile . ':tt_content.pi_flexform.formframework.overrideFinishers.empty', + 'config' => [ + 'readOnly' => true, + ], + ] + ); + } + if ($identifier['ext-form-overrideFinishers'] === 'enabled') { + ArrayUtility::mergeRecursiveWithOverrule($dataStructure, $newSheets); + } + } + } catch (NoSuchFileException|ParseErrorException $e) { + $dataStructure = $this->addSelectedPersistenceIdentifier($identifier['ext-form-persistenceIdentifier'], $dataStructure); + $this->addInvalidFrameworkConfigurationFlashMessage($e, $identifier['ext-form-persistenceIdentifier']); + } + $event->setDataStructure($dataStructure); + } + + /** + * Returns additional flexform sheets with finisher fields + * + * @param string $persistenceIdentifier Current persistence identifier + * @param array $formDefinition The form definition + */ + protected function getAdditionalFinisherSheets(string $persistenceIdentifier, array $formDefinition, string $prototypeName, array $prototypeConfiguration): array + { + if (empty($prototypeConfiguration['finishersDefinition'])) { + return []; + } + $formIdentifier = $formDefinition['identifier']; + $finishersDefinition = $prototypeConfiguration['finishersDefinition']; + $sheets = ['sheets' => []]; + foreach ($formDefinition['finishers'] as $formFinisherDefinition) { + $finisherIdentifier = $formFinisherDefinition['identifier']; + if (!isset($finishersDefinition[$finisherIdentifier]['FormEngine']['elements'])) { + continue; + } + $sheetIdentifier = $this->buildFlexformSheetIdentifier($persistenceIdentifier, $prototypeName, $formIdentifier, $finisherIdentifier); + $finishersDefinition = $this->translateFinisherDefinitionByIdentifier($finisherIdentifier, $finishersDefinition, $prototypeConfiguration); + $prototypeFinisherDefinition = $finishersDefinition[$finisherIdentifier]; + $finisherLabel = $prototypeFinisherDefinition['FormEngine']['label'] ?? ''; + $sheet = $this->initializeNewSheetArray($sheetIdentifier, $finisherLabel); + $converterDto = GeneralUtility::makeInstance(ProcessorDto::class, $finisherIdentifier, $prototypeFinisherDefinition, $formFinisherDefinition); + // Remove all container elements "el" from sections beforehand. + // These should not be matched by the regex below. This greatly reduces headaches. + $elements = $prototypeFinisherDefinition['FormEngine']['elements']; + foreach ($elements as $key => $element) { + if ($element['section'] ?? false) { + unset($elements[$key]['el']); + } + } + // Iterate over all `prototypes..finishersDefinition..FormEngine.elements` + // values and convert them to FlexForm elements. + GeneralUtility::makeInstance(ArrayProcessor::class, $elements)->forEach( + GeneralUtility::makeInstance( + ArrayProcessing::class, + 'convertToFlexFormSheets', + // Parse top level elements and section containers. + '^(.*)(?:\.config\.type|\.section)$', + GeneralUtility::makeInstance(FinisherOptionGenerator::class, $converterDto) + ) + ); + $sheet[$sheetIdentifier]['ROOT']['el'] = $converterDto->getResult(); + ArrayUtility::mergeRecursiveWithOverrule($sheets['sheets'], $sheet); + } + return $sheets; + } + + /** + * Boilerplate XML array of a new sheet. + */ + protected function initializeNewSheetArray(string $sheetIdentifier, string $finisherName): array + { + if (empty($sheetIdentifier)) { + throw new \InvalidArgumentException('$sheetIdentifier must not be empty.', 1472060918); + } + if (empty($finisherName)) { + throw new \InvalidArgumentException('$finisherName must not be empty.', 1472060919); + } + return [ + $sheetIdentifier => [ + 'ROOT' => [ + 'sheetTitle' => $finisherName, + 'type' => 'array', + 'el' => [], + ], + ], + ]; + } + + protected function addSelectedPersistenceIdentifier(string $persistenceIdentifier, array $dataStructure): array + { + if (!empty($persistenceIdentifier)) { + $languageService = $this->getLanguageService(); + $dataStructure['sheets']['sDEF']['ROOT']['el']['settings.persistenceIdentifier']['config']['items'][] = [ + 'label' => sprintf( + $languageService->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:tt_content.preview.inaccessiblePersistenceIdentifier'), + $persistenceIdentifier + ), + 'value' => $persistenceIdentifier, + ]; + } + return $dataStructure; + } + + protected function addInvalidFrameworkConfigurationFlashMessage(\Exception $e, string $identifier = ''): void + { + $languageService = $this->getLanguageService(); + $this->flashMessageService + ->getMessageQueueByIdentifier('core.template.flashMessages') + ->enqueue( + new FlashMessage( + sprintf( + $languageService->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:tt_content.preview.invalidFrameworkConfiguration.text'), + $identifier, + $e->getMessage() + ), + $languageService->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:tt_content.preview.invalidFrameworkConfiguration.title'), + ContextualFeedbackSeverity::ERROR, + true + ) + ); + } + + protected function buildFlexformSheetIdentifier(string $persistenceIdentifier, string $prototypeName, string $formIdentifier, string $finisherIdentifier): string + { + return md5($persistenceIdentifier . $prototypeName . $formIdentifier . $finisherIdentifier); + } + + protected function translateFinisherDefinitionByIdentifier(string $finisherIdentifier, array $finishersDefinition, array $prototypeConfiguration): array + { + $translationFiles = $finishersDefinition[$finisherIdentifier]['FormEngine']['translationFiles'] ?? $prototypeConfiguration['formEngine']['translationFiles']; + $finishersDefinition[$finisherIdentifier]['FormEngine'] = $this->translationService->translateValuesRecursive( + $finishersDefinition[$finisherIdentifier]['FormEngine'], + $translationFiles + ); + return $finishersDefinition; + } + + protected function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/EventListener/FormatDateRenderableBeforeRendering.php b/Classes/EventListener/FormatDateRenderableBeforeRendering.php new file mode 100644 index 0000000..b30e606 --- /dev/null +++ b/Classes/EventListener/FormatDateRenderableBeforeRendering.php @@ -0,0 +1,93 @@ +renderable; + if ($renderable->getType() !== 'Date') { + return; + } + + $date = $event->formRuntime[$renderable->getIdentifier()]; + if ($date instanceof \DateTime) { + // @see https://www.w3.org/TR/2011/WD-html-markup-20110405/input.date.html#input.date.attrs.value + // 'Y-m-d' = https://tools.ietf.org/html/rfc3339#section-5.6 -> full-date + $event->formRuntime[$renderable->getIdentifier()] = $date->format('Y-m-d'); + } elseif (is_string($date) && $date !== '' && !$this->isAbsoluteDate($date)) { + // Resolve relative date expressions used as defaultValue (e.g. "today", "+1 day") + $resolved = $this->parseRelativeDate($date); + if ($resolved !== null) { + $event->formRuntime[$renderable->getIdentifier()] = $resolved->format('Y-m-d'); + } + } + + if ($renderable instanceof FormElementInterface) { + $this->resolveRelativeDateAttributes($renderable); + } + } + + /** + * Resolve relative date expressions in the HTML min/max attributes to absolute Y-m-d format. + * + * The HTML5 element requires min/max values in RFC 3339 full-date + * format (Y-m-d). When a form definition uses relative expressions like "today" or + * "-18 years", these must be resolved to absolute dates before rendering. + */ + private function resolveRelativeDateAttributes(FormElementInterface $renderable): void + { + $properties = $renderable->getProperties(); + $fluidAttributes = $properties['fluidAdditionalAttributes'] ?? []; + + $resolved = false; + foreach (['min', 'max'] as $attribute) { + $value = $fluidAttributes[$attribute] ?? ''; + if ($value === '' || $this->isAbsoluteDate($value)) { + continue; + } + + $date = $this->parseRelativeDate($value); + if ($date !== null) { + $fluidAttributes[$attribute] = $date->format('Y-m-d'); + $resolved = true; + } + } + + if ($resolved) { + $renderable->setProperty('fluidAdditionalAttributes', $fluidAttributes); + } + } + + private function isAbsoluteDate(string $value): bool + { + return (bool)preg_match(DateRangeValidatorPatterns::RFC3339_FULL_DATE_PCRE, $value); + } + + private function parseRelativeDate(string $value): ?\DateTime + { + return DateRangeValidatorPatterns::parseRelativeDateExpression($value); + } +} diff --git a/Classes/EventListener/ModifyFormDefinitionRecordActionsEventListener.php b/Classes/EventListener/ModifyFormDefinitionRecordActionsEventListener.php new file mode 100644 index 0000000..b66a23b --- /dev/null +++ b/Classes/EventListener/ModifyFormDefinitionRecordActionsEventListener.php @@ -0,0 +1,93 @@ +getRecord()->getMainType() !== FormDefinitionRepository::TABLE_NAME) { + return; + } + + $uid = $event->getRecord()->getUid(); + $formPersistenceIdentifier = (string)$uid; + + // Replace the "edit" action with a link to the Form Editor + if ($event->hasAction('edit', ActionGroup::primary)) { + $returnUrl = (string)$event->getRecordList()->listURL(); + $editUrl = (string)$this->uriBuilder->buildUriFromRoute('form_editor', [ + 'formPersistenceIdentifier' => $formPersistenceIdentifier, + 'returnUrl' => $returnUrl, + ]); + + $editButton = $this->componentFactory->createLinkButton() + ->setIcon($this->iconFactory->getIcon('actions-open', IconSize::SMALL)) + ->setTitle($GLOBALS['LANG']->sL('core.mod_web_list:edit')) + ->setHref($editUrl); + + $event->setAction($editButton, 'edit', ActionGroup::primary); + } + + // The “delete” action is being removed because references in the FlexForm are not taken into account + // (no warning is displayed). + $event->removeAction('delete', ActionGroup::primary); + } + + /** + * The “edit” action is being removed, as it is not possible to edit multiple forms simultaneously. + * The form editor should always be used for editing. + * The “delete” action is being removed because references in the FlexForm are not taken into account + * (no warning is displayed). + */ + #[AsEventListener('form-framework/modify-form-definition-record-list-table-actions', method: 'modifyRecordListTableActions')] + public function modifyRecordListTableActions(ModifyRecordListTableActionsEvent $event): void + { + if ($event->getTable() !== FormDefinitionRepository::TABLE_NAME) { + return; + } + $event->removeAction('edit'); + $event->removeAction('delete'); + } +} diff --git a/Classes/EventListener/ModifyFormDefinitionRecordListRowEventListener.php b/Classes/EventListener/ModifyFormDefinitionRecordListRowEventListener.php new file mode 100644 index 0000000..a692676 --- /dev/null +++ b/Classes/EventListener/ModifyFormDefinitionRecordListRowEventListener.php @@ -0,0 +1,68 @@ +getTable() !== FormDefinitionRepository::TABLE_NAME) { + return; + } + + $data = $event->getData(); + + if (!isset($data['__label'])) { + return; + } + + $uid = $event->getRecord()->getUid(); + $formPersistenceIdentifier = (string)$uid; + + $returnUrl = (string)$event->getRecordList()->listURL(); + $editUrl = (string)$this->uriBuilder->buildUriFromRoute('form_editor', [ + 'formPersistenceIdentifier' => $formPersistenceIdentifier, + 'returnUrl' => $returnUrl, + ]); + + $data['__label'] = preg_replace( + '/href="[^"]*"/', + 'href="' . htmlspecialchars($editUrl) . '"', + $data['__label'] + ); + + $event->setData($data); + } +} diff --git a/Classes/EventListener/ProcessFileListActionsEventListener.php b/Classes/EventListener/ProcessFileListActionsEventListener.php new file mode 100644 index 0000000..a402312 --- /dev/null +++ b/Classes/EventListener/ProcessFileListActionsEventListener.php @@ -0,0 +1,48 @@ +isFile() || !$event->getResource() instanceof AbstractFile) { + return; + } + $fullIdentifier = $event->getResource()->getCombinedIdentifier(); + if (!str_ends_with($fullIdentifier, FormPersistenceManagerInterface::FORM_DEFINITION_FILE_EXTENSION)) { + return; + } + + foreach (self::DISABLED_ACTIONS as $disableIconName) { + $event->removeAction($disableIconName); + } + } +} diff --git a/Classes/EventListener/TranslateDefaultValueBeforeRendering.php b/Classes/EventListener/TranslateDefaultValueBeforeRendering.php new file mode 100644 index 0000000..1887f2d --- /dev/null +++ b/Classes/EventListener/TranslateDefaultValueBeforeRendering.php @@ -0,0 +1,65 @@ +renderable; + if (!$renderable instanceof FormElementInterface) { + return; + } + $originalDefaultValue = $renderable->getDefaultValue(); + if ($originalDefaultValue === null) { + return; + } + // Array defaultValues (e.g. MultiCheckbox pre-selections) contain option keys, not + // human-readable labels. Translating them would break the value-to-option mapping. + // The option labels themselves are translated via properties.options.[*] instead. + if (is_array($originalDefaultValue)) { + return; + } + try { + $translatedDefaultValue = $this->translationService->translateFormElementValue( + $renderable, + ['defaultValue'], + $event->formRuntime, + ); + } catch (\Throwable) { + // Translation may fail if site/language configuration is not available in the request. + return; + } + if ($translatedDefaultValue !== null && $translatedDefaultValue !== $originalDefaultValue) { + $renderable->setDefaultValue($translatedDefaultValue); + } + } +} diff --git a/Classes/EventListener/ValidateAdvancedPasswordRenderable.php b/Classes/EventListener/ValidateAdvancedPasswordRenderable.php new file mode 100644 index 0000000..a4c6fd1 --- /dev/null +++ b/Classes/EventListener/ValidateAdvancedPasswordRenderable.php @@ -0,0 +1,56 @@ +renderable; + if ($renderable->getType() !== 'AdvancedPassword') { + return; + } + if (!$renderable instanceof AbstractRenderable) { + return; + } + + $elementValue = $event->value; + if ($elementValue['password'] !== $elementValue['confirmation']) { + $processingRule = $renderable->getRootForm()->getProcessingRule($renderable->getIdentifier()); + $processingRule->getProcessingMessages()->addError( + new Error( + $this->translationService->translate('validation.error.1556283177', null, 'EXT:form/Resources/Private/Language/locallang.xlf'), + 1556283177 + ) + ); + } + $event->value = $elementValue['password']; + } + +} diff --git a/Classes/Exception.php b/Classes/Exception.php new file mode 100644 index 0000000..b8c2d05 --- /dev/null +++ b/Classes/Exception.php @@ -0,0 +1,25 @@ +|null $incomingFieldArray + * @param-out array|null $incomingFieldArray + */ + public function processDatamap_preProcessFieldArray( + ?array &$incomingFieldArray, + string $table, + string|int $id, + DataHandler $dataHandler, + ): void { + if ($table !== 'form_definition') { + return; + } + + $isUpdate = MathUtility::canBeInterpretedAsInteger($id); + $command = $isUpdate + ? FormDefinitionPersistenceCommand::Update + : FormDefinitionPersistenceCommand::Create; + $recordIdentifier = $isUpdate ? (int)$id : (string)$id; + + if (!$this->guard->isInvocationAllowed($command, $recordIdentifier, $incomingFieldArray)) { + $incomingFieldArray = null; + $dataHandler->log( + $table, + $isUpdate ? (int)$id : 0, + $isUpdate ? SystemLogDatabaseAction::UPDATE : SystemLogDatabaseAction::INSERT, + null, + SystemLogErrorClassification::USER_ERROR, + 'Persisting form definition "%s" via DataHandler is denied', + null, + [$id], + ); + return; + } + + $this->guard->consumeInvocation($command, $recordIdentifier, $incomingFieldArray); + } + + /** + * Blocks unauthorised delete commands on form_definition records. + * + * Sets $commandIsProcessed to true (preventing DataHandler's built-in + * delete) when no COMMAND_FORM_DELETE grant is pending. This mirrors the + * FilePersistenceSlot pattern for FAL-based form definitions. + */ + public function processCmdmap( + string $command, + string $table, + int|string $id, + mixed $value, + bool &$commandIsProcessed, + DataHandler $dataHandler, + ): void { + if ($table !== 'form_definition' || $command !== 'delete') { + return; + } + + if (!$this->guard->isInvocationAllowed(FormDefinitionPersistenceCommand::Delete, (int)$id)) { + $commandIsProcessed = true; + $dataHandler->log( + $table, + (int)$id, + SystemLogDatabaseAction::DELETE, + null, + SystemLogErrorClassification::USER_ERROR, + 'Deleting form definition "%s" via DataHandler is denied', + null, + [$id], + ); + return; + } + + $this->guard->consumeInvocation(FormDefinitionPersistenceCommand::Delete, (int)$id); + } +} diff --git a/Classes/Hooks/FormFileProvider.php b/Classes/Hooks/FormFileProvider.php new file mode 100644 index 0000000..ee89378 --- /dev/null +++ b/Classes/Hooks/FormFileProvider.php @@ -0,0 +1,89 @@ +identifier, FormPersistenceManagerInterface::FORM_DEFINITION_FILE_EXTENSION); + } + + public function addItems(array $items): array + { + $this->initialize(); + return $this->purgeItems($items); + } + + /** + * Purges items that are not allowed for according command. + * According canBeEdited, canBeRenamed, ... commands will always return + * false in order to remove those form file items. + * + * Using the canRender() approach avoid adding hardcoded index name + * lookup. Thus, it's streamlined with the rest of the provides, but + * actually purges items instead of adding them. + * + * @param array $items + */ + protected function purgeItems(array $items): array + { + foreach ($items as $name => $item) { + $type = $item['type']; + + if ($type === 'submenu' && !empty($item['childItems'])) { + $item['childItems'] = $this->purgeItems($item['childItems']); + } elseif (!$this->canRender($name, $type)) { + unset($items[$name]); + } + } + + return $items; + } + + protected function canBeEdited(): bool + { + return false; + } + + protected function canBeRenamed(): bool + { + return false; + } +} diff --git a/Classes/Hooks/ImportExportHook.php b/Classes/Hooks/ImportExportHook.php new file mode 100644 index 0000000..cdc3361 --- /dev/null +++ b/Classes/Hooks/ImportExportHook.php @@ -0,0 +1,39 @@ +allowInvocation( + FilePersistenceSlot::COMMAND_FILE_ADD, + implode(':', [$fileRecord['storage'], $fileRecord['identifier']]), + $filePersistenceSlot->getContentSignature(file_get_contents($temporaryFile)) + ); + } +} diff --git a/Classes/Mvc/Configuration/ConfigurationManager.php b/Classes/Mvc/Configuration/ConfigurationManager.php new file mode 100644 index 0000000..436f5bf --- /dev/null +++ b/Classes/Mvc/Configuration/ConfigurationManager.php @@ -0,0 +1,140 @@ +/ directory (see {@see \TYPO3\CMS\Form\DependencyInjection\FormYamlCollectorConfigurator}). + * + * Scope: frontend / backend + * @internal + */ +#[AsAlias(ConfigurationManagerInterface::class, public: true)] +readonly class ConfigurationManager implements ExtFormConfigurationManagerInterface +{ + public function __construct( + private YamlSource $yamlSource, + #[Autowire(service: 'cache.assets')] + private FrontendInterface $cache, + private TypoScriptService $typoScriptService, + private FormYamlCollector $formYamlCollector, + ) {} + + /** + * Load and parse YAML files for the current rendering context. + * + * Files are resolved via auto-discovery: {@see FormYamlCollector} scans every + * active extension's Configuration/Form// directory and returns + * all paths sorted by priority. + * + * The following post-processing steps are applied to the merged configuration: + * + * * Remove all keys whose values are NULL + * * Sort by array keys if all keys within a nesting level are numerical + * * Resolve possible TypoScript settings in FE mode + */ + public function getYamlConfiguration(array $typoScriptSettings, bool $isFrontend, ?ServerRequestInterface $request = null): array + { + $yamlSettingsFilePaths = $this->formYamlCollector->getPaths(); + $cacheKey = strtolower('YamlSettings_form' . md5(json_encode($yamlSettingsFilePaths))); + if ($this->cache->has($cacheKey)) { + $yamlSettings = $this->cache->get($cacheKey); + } else { + $yamlSettings = $this->yamlSource->load($yamlSettingsFilePaths); + $yamlSettings = ArrayUtility::removeNullValuesRecursive($yamlSettings); + $yamlSettings = ArrayUtility::sortArrayWithIntegerKeysRecursive($yamlSettings); + $this->cache->set($cacheKey, $yamlSettings); + } + + $this->applySiteSettingsOverrides($yamlSettings, $request); + + if (is_array($typoScriptSettings['yamlSettingsOverrides'] ?? null) && !empty($typoScriptSettings['yamlSettingsOverrides'])) { + $yamlSettingsOverrides = $typoScriptSettings['yamlSettingsOverrides']; + if ($isFrontend) { + if ($request === null) { + throw new \RuntimeException('Frontend rendering an ext:form requires the request being hand over', 1760451538); + } + $yamlSettingsOverrides = $this->typoScriptService->resolvePossibleTypoScriptConfiguration($yamlSettingsOverrides, $request); + } + ArrayUtility::mergeRecursiveWithOverrule($yamlSettings, $yamlSettingsOverrides); + } + return $yamlSettings; + } + + /** + * Read form template/translation site set settings from the current site + * and merge them into the YAML configuration. + * Non-empty values are added at key 20 so they overlay the base paths (key 10) + * while still allowing higher-priority overrides from form sets or yamlSettingsOverrides. + */ + private function applySiteSettingsOverrides(array &$yamlSettings, ?ServerRequestInterface $request): void + { + $site = $request?->getAttribute('site'); + if (!$site instanceof Site) { + return; + } + + $siteSettings = $site->getSettings(); + $renderingOptionsOverrides = []; + + $templateRootPath = (string)$siteSettings->get('form.templates.templateRootPath', ''); + if ($templateRootPath !== '') { + $renderingOptionsOverrides['templateRootPaths'][20] = $templateRootPath; + } + + $partialRootPath = (string)$siteSettings->get('form.templates.partialRootPath', ''); + if ($partialRootPath !== '') { + $renderingOptionsOverrides['partialRootPaths'][20] = $partialRootPath; + } + + $layoutRootPath = (string)$siteSettings->get('form.templates.layoutRootPath', ''); + if ($layoutRootPath !== '') { + $renderingOptionsOverrides['layoutRootPaths'][20] = $layoutRootPath; + } + + $translationFile = (string)$siteSettings->get('form.translation.translationFile', ''); + if ($translationFile !== '') { + $renderingOptionsOverrides['translation']['translationFiles'][20] = $translationFile; + } + + if ($renderingOptionsOverrides !== []) { + $overrides = [ + 'prototypes' => [ + 'standard' => [ + 'formElementsDefinition' => [ + 'Form' => [ + 'renderingOptions' => $renderingOptionsOverrides, + ], + ], + ], + ], + ]; + ArrayUtility::mergeRecursiveWithOverrule($yamlSettings, $overrides); + } + } +} diff --git a/Classes/Mvc/Configuration/ConfigurationManagerInterface.php b/Classes/Mvc/Configuration/ConfigurationManagerInterface.php new file mode 100644 index 0000000..bf64665 --- /dev/null +++ b/Classes/Mvc/Configuration/ConfigurationManagerInterface.php @@ -0,0 +1,29 @@ +/ + * with an accompanying config.yaml that declares name, label and priority. + * The collector is populated by {@see \TYPO3\CMS\Form\DependencyInjection\FormYamlCollectorConfigurator} + * and provides a priority-sorted list of file paths to {@see ConfigurationManager}. + * + * @internal + */ +final class FormYamlCollector +{ + /** @var list */ + private array $configurations = []; + + public function add(FormYamlConfiguration $configuration): void + { + $this->configurations[] = $configuration; + } + + /** + * Returns all registered file paths sorted by ascending priority + * (lower = loaded first = acts as base, higher = override). + * + * @return list + */ + public function getPaths(): array + { + $sorted = $this->configurations; + usort($sorted, static fn(FormYamlConfiguration $a, FormYamlConfiguration $b): int => $a->priority <=> $b->priority); + + return array_values(array_map( + static fn(FormYamlConfiguration $c): string => $c->path, + $sorted + )); + } + + /** + * Returns all registered configurations, regardless of priority. + * Useful for diagnostic/debug purposes. + * + * @return list + */ + public function getAllConfigurations(): array + { + return array_values($this->configurations); + } +} diff --git a/Classes/Mvc/Configuration/FormYamlConfiguration.php b/Classes/Mvc/Configuration/FormYamlConfiguration.php new file mode 100644 index 0000000..45be8ee --- /dev/null +++ b/Classes/Mvc/Configuration/FormYamlConfiguration.php @@ -0,0 +1,47 @@ +coreTypoScriptService->convertPlainArrayToTypoScriptArray($configuration); + $contentObjectRenderer = GeneralUtility::makeInstance(ContentObjectRenderer::class); + $contentObjectRenderer->setRequest($request); + // @todo: Setting request to COR is probably important, but setting page record here *may* not be needed in this case? + $contentObjectRenderer->start($request->getAttribute('frontend.page.information')->getPageRecord(), 'pages'); + $configuration = $this->resolveTypoScriptConfiguration($configuration, $contentObjectRenderer); + return $this->coreTypoScriptService->convertTypoScriptArrayToPlainArray($configuration); + } + + /** + * Parse a configuration with ContentObjectRenderer::cObjGetSingle() + * if there is an array key without and with a dot at the end. + * This sample would be identified as a TypoScript parsable configuration + * part: + * + * [ + * 'example' => 'TEXT' + * 'example.' => [ + * 'value' => 'some value' + * ] + * ] + */ + protected function resolveTypoScriptConfiguration(array $configuration, ContentObjectRenderer $contentObjectRenderer): array + { + foreach ($configuration as $key => $value) { + $keyWithoutDot = rtrim((string)$key, '.'); + if (isset($configuration[$keyWithoutDot]) && isset($configuration[$keyWithoutDot . '.'])) { + $value = $contentObjectRenderer->cObjGetSingle( + $configuration[$keyWithoutDot], + $configuration[$keyWithoutDot . '.'], + $keyWithoutDot + ); + $configuration[$keyWithoutDot] = $value; + } elseif (!isset($configuration[$keyWithoutDot]) && isset($configuration[$keyWithoutDot . '.'])) { + $configuration[$keyWithoutDot] = $this->resolveTypoScriptConfiguration($value, $contentObjectRenderer); + } + unset($configuration[$keyWithoutDot . '.']); + } + return $configuration; + } +} diff --git a/Classes/Mvc/Configuration/YamlSource.php b/Classes/Mvc/Configuration/YamlSource.php new file mode 100644 index 0000000..bc8617d --- /dev/null +++ b/Classes/Mvc/Configuration/YamlSource.php @@ -0,0 +1,196 @@ +loadFromFile($fileToLoad); + } else { + $loadedConfiguration = $this->loadFromFilePath($fileToLoad); + if (isset($loadedConfiguration['TYPO3']['CMS']['Form'])) { + $namespacedConfiguration = $loadedConfiguration['TYPO3']['CMS']['Form']; + unset($loadedConfiguration['TYPO3']); + $loadedConfiguration = array_replace_recursive($namespacedConfiguration, $loadedConfiguration); + } + } + $configuration = array_replace_recursive($configuration, $loadedConfiguration); + } + return ArrayUtility::convertBooleanStringsToBooleanRecursive($configuration); + } + + /** + * Save the specified configuration array to the given file in YAML format. + * + * @param File|string $fileToSave The file to write to. + * @param array $configuration The configuration to save + * @throws FileWriteException if the file could not be written + * @internal + */ + public function save(File|string $fileToSave, array $configuration): void + { + try { + $header = $this->getHeaderFromFile($fileToSave); + } catch (InsufficientFileAccessPermissionsException $e) { + throw new FileWriteException($e->getMessage(), 1512584488, $e); + } + + $yaml = Yaml::dump($configuration, 99, 2); + + if ($fileToSave instanceof File) { + // @deprecated: Remove in v16 along with the FileFormsToDatabaseUpgradeWizard + try { + $this->filePersistenceSlot->allowInvocation( + FilePersistenceSlot::COMMAND_FILE_SET_CONTENTS, + $this->buildCombinedIdentifier( + $fileToSave->getParentFolder(), + $fileToSave->getName() + ), + $this->filePersistenceSlot->getContentSignature( + $header . LF . $yaml + ) + ); + $fileToSave->setContents($header . LF . $yaml); + } catch (InsufficientFileAccessPermissionsException $e) { + throw new FileWriteException($e->getMessage(), 1512582753, $e); + } + } else { + $byteCount = @file_put_contents($fileToSave, $header . LF . $yaml); + if ($byteCount === false) { + $error = error_get_last(); + $errorMessage = $error['message'] ?? 'Check that the file exists and can be written.'; + throw new FileWriteException($errorMessage, 1512582929); + } + } + } + + /** + * Load YAML configuration from a local file path + * + * @throws ParseErrorException + */ + protected function loadFromFilePath(string $filePath): array + { + try { + $loadedConfiguration = $this->yamlFileLoader->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 + */ + protected function loadFromFile(File $file): array + { + $fileIdentifier = $file->getIdentifier(); + $rawYamlContent = $file->getContents(); + 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. + * + * @return string The header of the given YAML file + */ + protected function getHeaderFromFile(File|string $file): string + { + $header = ''; + if ($file instanceof File) { + $fileLines = explode(LF, $file->getContents()); + } elseif (is_file($file)) { + $fileLines = file($file); + } else { + return ''; + } + foreach ($fileLines as $line) { + if (str_starts_with($line, '#')) { + $header .= $line; + } else { + break; + } + } + return $header; + } + + /* + * @deprecated: Remove in v16 along with the FileFormsToDatabaseUpgradeWizard + */ + protected function buildCombinedIdentifier(FolderInterface $folder, string $fileName): string + { + return sprintf( + '%d:%s%s', + $folder->getStorage()->getUid(), + $folder->getIdentifier(), + $fileName + ); + } +} diff --git a/Classes/Mvc/Persistence/Event/AfterFormDefinitionLoadedEvent.php b/Classes/Mvc/Persistence/Event/AfterFormDefinitionLoadedEvent.php new file mode 100644 index 0000000..59c1ad3 --- /dev/null +++ b/Classes/Mvc/Persistence/Event/AfterFormDefinitionLoadedEvent.php @@ -0,0 +1,50 @@ +formDefinition; + } + + public function setFormDefinition(array $formDefinition): void + { + $this->formDefinition = $formDefinition; + } + + public function getPersistenceIdentifier(): string + { + return $this->persistenceIdentifier; + } + + public function getCacheKey(): string + { + return $this->cacheKey; + } +} diff --git a/Classes/Mvc/Persistence/Exception.php b/Classes/Mvc/Persistence/Exception.php new file mode 100644 index 0000000..7af5f3e --- /dev/null +++ b/Classes/Mvc/Persistence/Exception.php @@ -0,0 +1,27 @@ +runtimeCache->has($cacheKey)) { + $formDefinition = $this->runtimeCache->get($cacheKey); + } else { + $formDefinition = $this->loadFromStorage($persistenceIdentifier, $request); + $this->runtimeCache->set($cacheKey, $formDefinition); + } + + $formDefinition = $this->eventDispatcher + ->dispatch(new AfterFormDefinitionLoadedEvent($formDefinition, $persistenceIdentifier, $cacheKey)) + ->getFormDefinition(); + + if ($request !== null && !empty($typoScriptSettings['formDefinitionOverrides'][$formDefinition['identifier']] ?? null)) { + $formDefinitionOverrides = $this->typoScriptService->resolvePossibleTypoScriptConfiguration( + $typoScriptSettings['formDefinitionOverrides'][$formDefinition['identifier']], + $request + ); + ArrayUtility::mergeRecursiveWithOverrule($formDefinition, $formDefinitionOverrides); + } + + return $formDefinition; + } + + /** + * Save form definition to appropriate storage + * + * @throws PersistenceManagerException + */ + public function save(string $persistenceIdentifier, array $formDefinition, array $formSettings, ?string $storageLocation = null): FormIdentifier + { + if (!$this->isAllowedPersistenceIdentifier($persistenceIdentifier)) { + throw new PersistenceManagerException( + sprintf('Save to path "%s" is not allowed.', $persistenceIdentifier), + 1477680881 + ); + } + + $identifier = new FormIdentifier($persistenceIdentifier); + $adapter = $this->storageAdapterFactory->getAdapterForIdentifier($persistenceIdentifier); + $formData = FormData::fromArray($formDefinition); + + $context = null; + if (MathUtility::canBeInterpretedAsInteger($storageLocation)) { + $context = StorageContext::create((int)$storageLocation); + } + + $savedIdentifier = $adapter->write($identifier, $formData, $context); + + $this->clearFormCache($savedIdentifier->identifier); + return $savedIdentifier; + } + + /** + * Delete form definition from storage + */ + public function delete(string $persistenceIdentifier, array $formSettings): void + { + $identifier = new FormIdentifier($persistenceIdentifier); + $adapter = $this->storageAdapterFactory->getAdapterForIdentifier($persistenceIdentifier); + + if (!$adapter->exists($identifier)) { + throw new PersistenceManagerException( + sprintf('The form "%s" does not exist.', $persistenceIdentifier), + 1472239535 + ); + } + + $adapter->delete($identifier); + $this->clearFormCache($persistenceIdentifier); + } + + /** + * List all form definitions from all available storages + */ + public function listForms(array $formSettings, SearchCriteria $searchCriteria): array + { + $identifiers = []; + $forms = []; + + foreach ($this->storageAdapterFactory->getAllAdapters() as $adapter) { + try { + $formDataList = $adapter->findAll($searchCriteria); + + foreach ($formDataList as $formData) { + if ($formData->storageType === null) { + $formData = $formData->withStorageType($adapter->getTypeIdentifier()); + } + $forms[] = $formData; + if (!isset($identifiers[$formData->identifier])) { + $identifiers[$formData->identifier] = 0; + } + $identifiers[$formData->identifier]++; + } + } catch (\Exception $e) { + continue; + } + } + + foreach ($identifiers as $identifier => $count) { + if ($count > 1) { + foreach ($forms as $index => $formMetadata) { + if ($formMetadata->identifier === $identifier) { + $forms[$index] = $formMetadata->withDuplicateIdentifier(true); + } + } + } + } + + $allReferencesForFileUid = $this->databaseService->getAllReferencesForFileUid(); + $allReferencesForPersistenceIdentifier = $this->databaseService->getAllReferencesForPersistenceIdentifier(); + $allReferencesForFormDefinitionUid = $this->databaseService->getAllReferencesForFormDefinitionUid(); + + foreach ($forms as $index => $formMetadata) { + if (isset($formMetadata->fileUid) && array_key_exists($formMetadata->fileUid, $allReferencesForFileUid)) { + $referenceCount = $allReferencesForFileUid[$formMetadata->fileUid]; + } elseif ($formMetadata->persistenceIdentifier && array_key_exists($formMetadata->persistenceIdentifier, $allReferencesForFormDefinitionUid)) { + $referenceCount = $allReferencesForFormDefinitionUid[$formMetadata->persistenceIdentifier]; + } elseif ($formMetadata->persistenceIdentifier && array_key_exists($formMetadata->persistenceIdentifier, $allReferencesForPersistenceIdentifier)) { + $referenceCount = $allReferencesForPersistenceIdentifier[$formMetadata->persistenceIdentifier]; + } else { + $referenceCount = 0; + } + if ($referenceCount > 0) { + $forms[$index] = $formMetadata->withReferenceCount($referenceCount); + } + } + + return $this->sortForms($forms, $formSettings, $searchCriteria->getOrderField(), $searchCriteria->getOrderDirection()); + } + + /** + * Check if any forms are available + */ + public function hasForms(array $formSettings): bool + { + foreach ($this->storageAdapterFactory->getAllAdapters() as $adapter) { + try { + $forms = $adapter->findAll(new SearchCriteria(limit: 1)); + + if (!empty($forms)) { + return true; + } + } catch (\Exception) { + continue; + } + } + + return false; + } + + /** + * Get unique persistence identifier for a new form + */ + public function getUniquePersistenceIdentifier(string $storage, string $formIdentifier, ?string $savePath): string + { + return $this->storageAdapterFactory->getAdapterByType($storage)->getUniquePersistenceIdentifier($formIdentifier, $savePath); + } + + /** + * Get unique identifier (not persistence identifier) + */ + public function getUniqueIdentifier(string $identifier): string + { + $originalIdentifier = $identifier; + + if ($this->checkForDuplicateIdentifier($identifier)) { + for ($attempts = 1; $attempts < 100; $attempts++) { + $identifier = sprintf('%s_%d', $originalIdentifier, $attempts); + if (!$this->checkForDuplicateIdentifier($identifier)) { + return $identifier; + } + } + + $identifier = $originalIdentifier . '_' . time(); + if ($this->checkForDuplicateIdentifier($identifier)) { + throw new NoUniqueIdentifierException( + sprintf('Could not find a unique identifier for form identifier "%s" after %d attempts', $identifier, $attempts), + 1477688567 + ); + } + } + + return $identifier; + } + + /** + * Check if a storage location is allowed + * + * For database storage: storageLocation is a PID + * For file storage: storageLocation is a folder path (e.g., "1:/forms/") + */ + public function isAllowedStorageLocation(string $storageLocation): bool + { + try { + $adapter = $this->storageAdapterFactory->getAdapterForIdentifier($storageLocation); + return $adapter->isAllowedStorageLocation($storageLocation); + } catch (\Exception) { + return false; + } + } + + /** + * Check if a persistence identifier is allowed + * + * For database storage: identifier is a UID or NEW* + * For file storage: identifier is a full file path (e.g., "1:/forms/contact.form.yaml") + */ + public function isAllowedPersistenceIdentifier(string $persistenceIdentifier): bool + { + try { + $adapter = $this->storageAdapterFactory->getAdapterForIdentifier($persistenceIdentifier); + return $adapter->isAllowedPersistenceIdentifier($persistenceIdentifier); + } catch (\Exception) { + return false; + } + } + + /** + * Check if file has valid extension + */ + public function hasValidFileExtension(string $fileName): bool + { + return str_ends_with($fileName, self::FORM_DEFINITION_FILE_EXTENSION); + } + + /** + * Load form definition from storage + */ + private function loadFromStorage(string $persistenceIdentifier, ?ServerRequestInterface $request = null): array + { + try { + $identifier = new FormIdentifier($persistenceIdentifier); + $adapter = $this->storageAdapterFactory->getAdapterForIdentifier($persistenceIdentifier); + + return $adapter->read($identifier, $request)->toArray(); + } catch (\Exception $e) { + return [ + 'type' => 'Form', + 'identifier' => $persistenceIdentifier, + 'label' => $e->getMessage(), + 'invalid' => true, + ]; + } + } + + /** + * Check if form with persistence identifier exists + */ + private function exists(string $persistenceIdentifier): bool + { + try { + $identifier = new FormIdentifier($persistenceIdentifier); + $adapter = $this->storageAdapterFactory->getAdapterForIdentifier($persistenceIdentifier); + + return $adapter->exists($identifier); + } catch (\Exception) { + return false; + } + } + + /** + * Check if a form with given identifier already exists in any storage + */ + private function checkForDuplicateIdentifier(string $identifier): bool + { + foreach ($this->storageAdapterFactory->getAllAdapters() as $adapter) { + try { + if ($adapter->existsByFormIdentifier($identifier)) { + return true; + } + } catch (\Exception) { + continue; + } + } + + return false; + } + + protected function sortForms(array $forms, array $formSettings, string $orderField = '', ?string $orderDirection = null): array + { + $persistenceConfiguration = PersistenceManagerConfiguration::fromArray($formSettings['persistenceManager'] ?? []); + if ($orderDirection) { + $ascending = $orderDirection === 'asc'; + } else { + $ascending = $persistenceConfiguration->sortAscending; + } + $sortMultiplier = $ascending ? 1 : -1; + $keys = $orderField ? [$orderField] : $persistenceConfiguration->sortByKeys; + + usort($forms, static function (FormMetadata $a, FormMetadata $b) use ($keys, $sortMultiplier) { + foreach ($keys as $key) { + $aValue = $a->getSortableValue($key); + $bValue = $b->getSortableValue($key); + + if ($aValue === null || $bValue === null) { + continue; + } + + $diff = (is_int($aValue) && is_int($bValue)) + ? $aValue - $bValue + : strcasecmp((string)$aValue, (string)$bValue); + + if ($diff !== 0) { + return $diff * $sortMultiplier; + } + } + return 0; + }); + return $forms; + } + + /** + * Clear cache for specific form + */ + private function clearFormCache(string $persistenceIdentifier): void + { + $cacheKey = 'ext-form-load-' . hash('xxh3', $persistenceIdentifier); + $this->runtimeCache->remove($cacheKey); + } + + public function getAccessibleStorageAdapters(): array + { + $storageAdapters = []; + foreach ($this->storageAdapterFactory->getAllAdapters() as $adapter) { + if ($adapter->isAccessible() === false) { + continue; + } + $storageAdapters[] = [ + 'typeIdentifier' => $adapter->getTypeIdentifier(), + 'label' => $adapter->getLabel(), + 'description' => $adapter->getDescription(), + 'iconIdentifier' => $adapter->getIconIdentifier(), + 'options' => $adapter->getFormManagerOptions(), + ]; + } + return $storageAdapters; + } +} diff --git a/Classes/Mvc/Persistence/FormPersistenceManagerInterface.php b/Classes/Mvc/Persistence/FormPersistenceManagerInterface.php new file mode 100644 index 0000000..68b62a4 --- /dev/null +++ b/Classes/Mvc/Persistence/FormPersistenceManagerInterface.php @@ -0,0 +1,100 @@ + 'Form 01', 'persistenceIdentifier' => 'path1'], [ .... ]] + */ + public function listForms(array $formSettings, SearchCriteria $searchCriteria): array; + + /** + * Check if any form definition is available + */ + public function hasForms(array $formSettings): bool; + + /** + * This takes a form identifier and returns a unique persistence identifier for it. + */ + public function getUniquePersistenceIdentifier(string $storage, string $formIdentifier, ?string $savePath): string; + + public function getUniqueIdentifier(string $identifier): string; + + /** + * Check if a storage location (PID for database, folder path for files) is allowed + * + * @param string $storageLocation The storage location (e.g., "123" for PID, "1:/forms/" for file path) + * @return bool True if the storageLocation is allowed + */ + public function isAllowedStorageLocation(string $storageLocation): bool; + + /** + * Check if a persistence identifier (UID for database, full file path for files) is allowed + * + * @param string $persistenceIdentifier The persistence identifier (e.g., "456" for UID, "1:/forms/contact.form.yaml" for file) + * @return bool True if the persistence identifier is allowed + */ + public function isAllowedPersistenceIdentifier(string $persistenceIdentifier): bool; + + public function hasValidFileExtension(string $fileName): bool; + + public function getAccessibleStorageAdapters(): array; +} diff --git a/Classes/Mvc/ProcessingRule.php b/Classes/Mvc/ProcessingRule.php new file mode 100644 index 0000000..d78d788 --- /dev/null +++ b/Classes/Mvc/ProcessingRule.php @@ -0,0 +1,200 @@ +propertyMappingConfiguration = GeneralUtility::makeInstance(PropertyMappingConfiguration::class); + /** @var ConjunctionValidator $validator */ + $validator = $validatorResolver->createValidator(ConjunctionValidator::class); + $this->validator = $validator; + $this->processingMessages = GeneralUtility::makeInstance(Result::class); + } + + /** + * @internal + */ + public function getPropertyMappingConfiguration(): PropertyMappingConfiguration + { + return $this->propertyMappingConfiguration; + } + + /** + * @internal + */ + public function getDataType(): string + { + return $this->dataType; + } + + /** + * @internal + */ + public function setDataType(string $dataType) + { + $this->dataType = $dataType; + } + + /** + * Returns the child validators of the ConjunctionValidator that is bound to this processing rule + * + * @internal + */ + public function getValidators(): \SplObjectStorage + { + return $this->validator->getValidators(); + } + + /** + * @internal + */ + public function addValidator(ValidatorInterface $validator) + { + $this->validator->addValidator($validator); + } + + /** + * Initializes a new validator container + * + * @internal + */ + public function removeAllValidators(): void + { + $this->filterValidators(fn() => false); + } + + /** + * Filters validators based on a closure + * + * @internal + */ + public function filterValidators(\Closure $filter): void + { + $validatorsToRemove = new \SplObjectStorage(); + $validators = $this->getValidators(); + foreach ($validators as $validator) { + if (!$filter($validator)) { + $validatorsToRemove->offsetSet($validator); + } + } + $validators->removeAll($validatorsToRemove); + } + + /** + * Removes the specified validator. + * + * @param ValidatorInterface $validator The validator to remove + * @throws \TYPO3\CMS\Extbase\Validation\Exception\NoSuchValidatorException + * @internal + */ + public function removeValidator(ValidatorInterface $validator) + { + $this->validator->removeValidator($validator); + } + + /** + * @param mixed $value + * @return mixed + * @internal + */ + public function process($value) + { + if ($this->dataType !== null) { + $value = $this->propertyMapper->convert($value, $this->dataType, $this->propertyMappingConfiguration); + $messages = $this->propertyMapper->getMessages(); + $this->propertyMapper->resetMessages(); + } else { + $messages = GeneralUtility::makeInstance(Result::class); + } + + // PropertyMapper::convert() already records the TypeConverter's Error in + // $messages (via doMapping()) and returns null. If errors are present at + // this point, running validators on a null value would add spurious errors + // that mask the real rejection reason — skip them. + if ($messages->hasErrors()) { + $this->processingMessages->merge($messages); + return $value; + } + + // For multi-value fields (e.g. multi-file uploads) the converted value + // is an ObjectStorage. By default, validators receive the whole collection + // (backwards compatible). Validators implementing ObjectStorageElementValidatorInterface + // (e.g. MimeTypeValidator, FileSizeValidator) are called once per element instead. + if ($value instanceof ObjectStorage) { + foreach ($this->getValidators() as $validator) { + $targets = $validator instanceof ObjectStorageElementValidatorInterface + ? iterator_to_array($value) + : [$value]; + foreach ($targets as $target) { + $messages->merge($validator->validate($target)); + } + } + } else { + $messages->merge($this->validator->validate($value)); + } + + $this->processingMessages->merge($messages); + return $value; + } + + /** + * @internal + */ + public function getProcessingMessages(): Result + { + return $this->processingMessages; + } +} diff --git a/Classes/Mvc/Property/Exception/TypeConverterException.php b/Classes/Mvc/Property/Exception/TypeConverterException.php new file mode 100644 index 0000000..3216be3 --- /dev/null +++ b/Classes/Mvc/Property/Exception/TypeConverterException.php @@ -0,0 +1,43 @@ +render(), $error->getCode()); + $exception->error = $error; + + return $exception; + } + + public function getError(): Error + { + if ($this->error === null) { + return new Error($this->getMessage(), $this->getCode(), [$this->getPrevious()]); + } + + return $this->error; + } +} diff --git a/Classes/Mvc/Property/PropertyMappingConfiguration.php b/Classes/Mvc/Property/PropertyMappingConfiguration.php new file mode 100644 index 0000000..3be206a --- /dev/null +++ b/Classes/Mvc/Property/PropertyMappingConfiguration.php @@ -0,0 +1,143 @@ +formRuntime->getFormDefinition()->getRenderablesRecursively() as $renderable) { + $this->adjustPropertyMappingForFileUploadsAtRuntime($event->formRuntime, $renderable); + } + } + + /** + * Adjusts property mapping configuration for file upload elements at runtime. + * + * At this point, form definition properties (from YAML) are fully available, + * unlike in initializeFormElement() which runs before YAML properties are set. + * + * This sets: + * - CONFIGURATION_UPLOAD_SEED: derived from the form session identifier + * for creating storage sub-folders. + * - CONFIGURATION_ALLOW_REMOVAL: from the element's 'allowRemoval' property + * to enable HMAC-signed file deletion. + * + * It also registers the MimeTypeValidator based on the 'allowedMimeTypes' + * property. This must happen here (and not in FileUpload::initializeFormElement()) + * because the concrete form definition properties are only available at runtime. + */ + protected function adjustPropertyMappingForFileUploadsAtRuntime( + FormRuntime $formRuntime, + RenderableInterface $renderable + ): void { + if (!$renderable instanceof FileUpload + || $formRuntime->getFormSession() === null + || !$formRuntime->canProcessFormSubmission() + ) { + return; + } + $processingRule = $renderable->getRootForm() + ->getProcessingRule($renderable->getIdentifier()); + + if ($renderable->getProperties()['multiple'] ?? false) { + $processingRule->setDataType(ObjectStorage::class); + } + + $this->registerMimeTypeValidator($processingRule, $renderable); + + $propertyMappingConfiguration = $processingRule->getPropertyMappingConfiguration(); + + // Pass all registered validators to the TypeConverter so they can run on the + // PseudoFile *before* the file is written to FAL storage. This prevents invalid + // files (wrong MIME type, oversized, etc.) from ever being persisted. + // All validators are forwarded — not only ObjectStorageElementValidatorInterface + // ones — because that interface only controls per-element fan-out inside + // ProcessingRule::process() for ObjectStorage values; it is unrelated to whether + // a validator is meaningful at the individual-file level. Validators that do not + // handle PseudoFile (e.g. NotEmptyValidator) treat it as a non-null value and + // return valid, which is the correct behaviour at this stage. + $preStorageValidators = iterator_to_array($processingRule->getValidators()); + if ($preStorageValidators !== []) { + $propertyMappingConfiguration->setTypeConverterOption( + UploadedFileReferenceConverter::class, + UploadedFileReferenceConverter::CONFIGURATION_PRE_STORAGE_VALIDATORS, + $preStorageValidators + ); + } + + $propertyMappingConfiguration->setTypeConverterOption( + UploadedFileReferenceConverter::class, + UploadedFileReferenceConverter::CONFIGURATION_UPLOAD_SEED, + $formRuntime->getFormSession()->getIdentifier() + ); + + $propertyMappingConfiguration->setTypeConverterOption( + UploadedFileReferenceConverter::class, + UploadedFileReferenceConverter::CONFIGURATION_ALLOW_REMOVAL, + (bool)($renderable->getProperties()['allowRemoval'] ?? false) + ); + } + + /** + * Registers the MimeTypeValidator for the given file upload element based on + * its 'allowedMimeTypes' property. + * + * The validator is only added once, even if this method is called multiple + * times during a request. + */ + protected function registerMimeTypeValidator( + ProcessingRule $processingRule, + FileUpload $renderable + ): void { + $allowedMimeTypes = []; + if (is_array($renderable->getProperties()['allowedMimeTypes'] ?? null)) { + $allowedMimeTypes = array_filter($renderable->getProperties()['allowedMimeTypes']); + } + if ($allowedMimeTypes === []) { + return; + } + + foreach ($processingRule->getValidators() as $validator) { + if ($validator instanceof MimeTypeValidator) { + return; + } + } + + $mimeTypeValidator = GeneralUtility::makeInstance(ValidatorResolver::class) + ->createValidator(MimeTypeValidator::class, ['allowedMimeTypes' => $allowedMimeTypes]); + $processingRule->addValidator($mimeTypeValidator); + } +} diff --git a/Classes/Mvc/Property/TypeConverter/FormDefinitionArrayConverter.php b/Classes/Mvc/Property/TypeConverter/FormDefinitionArrayConverter.php new file mode 100644 index 0000000..9110789 --- /dev/null +++ b/Classes/Mvc/Property/TypeConverter/FormDefinitionArrayConverter.php @@ -0,0 +1,203 @@ +retrieveSessionToken($formPersistenceIdentifier); + + $prototypeName = $rawFormDefinitionArray['prototypeName'] ?? null; + $identifier = $rawFormDefinitionArray['identifier'] ?? null; + + // A modification of the properties "prototypeName" and "identifier" from the root form element + // through the form editor is always forbidden. + try { + if (!$this->formDefinitionValidationService->isPropertyValueEqualToHistoricalValue([$identifier, 'identifier'], $identifier, $rawFormDefinitionArray['_orig_identifier'] ?? [], $sessionToken)) { + throw new PropertyException('Unauthorized modification of "identifier".', 1528538324); + } + + if (!$this->formDefinitionValidationService->isPropertyValueEqualToHistoricalValue([$identifier, 'prototypeName'], $prototypeName, $rawFormDefinitionArray['_orig_prototypeName'] ?? [], $sessionToken)) { + throw new PropertyException('Unauthorized modification of "prototype name".', 1528538323); + } + } catch (PropertyException $e) { + throw new PropertyException('Unauthorized modification of "prototype name" or "identifier".', 1528538322); + } + + $this->formDefinitionValidationService->validateFormDefinitionProperties($rawFormDefinitionArray, $prototypeName, $sessionToken); + + // @todo move all the transformations to FormDefinitionConversionService + $rawFormDefinitionArray = $this->filterEmptyArrays($rawFormDefinitionArray); + $rawFormDefinitionArray = $this->transformMultiValueElementsForFormFramework($rawFormDefinitionArray); + + // Get RTE property paths for transformation and sanitization + $rtePropertyPaths = $this->getRtePropertyPaths($prototypeName); + + // Transform RTE content using RteHtmlParser before persistence + if ($rtePropertyPaths !== []) { + $rawFormDefinitionArray = $this->formDefinitionConversionService->transformRteContentForPersistence( + $rawFormDefinitionArray, + $rtePropertyPaths + ); + } + + // Sanitize HTML: RTE fields use HtmlSanitizer, all others use strip_tags + $rawFormDefinitionArray = $this->formDefinitionConversionService->sanitizeHtml($rawFormDefinitionArray, $rtePropertyPaths); + $rawFormDefinitionArray = $this->formDefinitionConversionService->removeHmacData($rawFormDefinitionArray); + + // Filter empty arrays again after removeHmacData, as removing _orig_* entries + // can leave previously non-empty arrays (e.g. fluidAdditionalAttributes) empty. + $rawFormDefinitionArray = $this->filterEmptyArrays($rawFormDefinitionArray); + + return GeneralUtility::makeInstance(FormDefinitionArray::class, $rawFormDefinitionArray); + } + + /** + * Some data which is build by the form editor needs a transformation before + * it can be used by the framework. + * Multivalue elements like select elements produce data like: + * + * [ + * _label => 'label' + * _value => 'value' + * ] + * + * This method transforms this into: + * + * [ + * 'value' => 'label' + * ] + * + * @param array $input + */ + protected function transformMultiValueElementsForFormFramework(array $input): array + { + $output = []; + + foreach ($input as $key => $value) { + if (is_int($key) && is_array($value) && isset($value['_label']) && isset($value['_value'])) { + $key = $value['_value']; + $value = $value['_label']; + } + + if (is_array($value)) { + $output[$key] = $this->transformMultiValueElementsForFormFramework($value); + } else { + $output[$key] = $value; + } + } + + return $output; + } + + /** + * Remove keys from an array if the key value is an empty array + * + * @todo ArrayUtility? + */ + protected function filterEmptyArrays(array $array): array + { + foreach ($array as $key => $value) { + if (!is_array($value)) { + continue; + } + if (empty($value)) { + unset($array[$key]); + continue; + } + $array[$key] = $this->filterEmptyArrays($value); + if (empty($array[$key])) { + unset($array[$key]); + } + } + + return $array; + } + + protected function retrieveSessionToken(string $formPersistenceIdentifier): string + { + return $this->formDefinitionConversionService->retrieveSessionToken($formPersistenceIdentifier); + } + + /** + * Get RTE-enabled property paths from the prototype configuration. + * + * @param string|null $prototypeName The prototype name + * @return array Map of element types to their RTE property paths + */ + protected function getRtePropertyPaths(?string $prototypeName): array + { + if ($prototypeName === null) { + return []; + } + + try { + $prototypeConfiguration = $this->configurationService->getPrototypeConfiguration($prototypeName); + return $this->formDefinitionConversionService->extractRtePropertyPaths($prototypeConfiguration); + } catch (\Exception $e) { + // If prototype configuration is not available, return empty array + return []; + } + } +} diff --git a/Classes/Mvc/Property/TypeConverter/PseudoFile.php b/Classes/Mvc/Property/TypeConverter/PseudoFile.php new file mode 100644 index 0000000..89284cd --- /dev/null +++ b/Classes/Mvc/Property/TypeConverter/PseudoFile.php @@ -0,0 +1,106 @@ +nameFileInfo = new \SplFileInfo($uploadInfo['name']); + $this->payloadFilePath = $uploadInfo['tmp_name']; + $this->payloadFileInfo = GeneralUtility::makeInstance(FileInfo::class, $uploadInfo['tmp_name']); + } + + public function getName(): string + { + return $this->nameFileInfo->getBasename(); + } + + public function getNameWithoutExtension(): string + { + // `image...png` + return rtrim( + $this->nameFileInfo->getBasename($this->getExtension()), + '.' + ); + } + + public function getExtension(): string + { + return $this->nameFileInfo->getExtension(); + } + + public function getSize(): ?int + { + // returns `null` in case size is empty (includes `0`) + // @see \TYPO3\CMS\Core\Resource\AbstractFile::getSize() + return $this->payloadFileInfo->getSize() ?: null; + } + + public function getMimeType(): ?string + { + $mimeType = $this->payloadFileInfo->getMimeType(); + return is_string($mimeType) ? $mimeType : null; + } + + public function getContents(): string + { + return file_get_contents($this->payloadFilePath); + } + + public function getSha1(): string + { + return sha1_file($this->payloadFilePath); + } +} diff --git a/Classes/Mvc/Property/TypeConverter/PseudoFileReference.php b/Classes/Mvc/Property/TypeConverter/PseudoFileReference.php new file mode 100644 index 0000000..2371b80 --- /dev/null +++ b/Classes/Mvc/Property/TypeConverter/PseudoFileReference.php @@ -0,0 +1,86 @@ +uid > 0) { + $this->_uid = (int)$this->uid; + return ['_uid']; + } + if ($this->getOriginalResource()->getUid() > 0) { + $this->_uid = $this->getOriginalResource()->getUid(); + return ['_uid']; + } + // in case this is a transient file reference, just expose the associated `sys_file.uid` + // (based on previous comments, this is the most probably case in ext:form) + $this->_uidLocal = $this->getOriginalResource()->getOriginalFile()->getUid(); + return ['_uidLocal']; + } + + public function __wakeup(): void + { + $factory = GeneralUtility::makeInstance(ResourceFactory::class); + if ($this->_uid > 0) { + $this->originalResource = $factory->getFileReferenceObject($this->_uid); + } elseif ($this->_uidLocal > 0) { + $this->originalResource = $factory->createFileReferenceObject([ + 'uid_local' => $this->_uidLocal, + 'uid_foreign' => 0, + 'uid' => 0, + 'crop' => null, + ]); + } else { + throw new \LogicException( + sprintf('Cannot unserialize %s', static::class), + 1613216548 + ); + } + unset($this->_uid, $this->_uidLocal); + } +} diff --git a/Classes/Mvc/Property/TypeConverter/UploadedFileReferenceConverter.php b/Classes/Mvc/Property/TypeConverter/UploadedFileReferenceConverter.php new file mode 100644 index 0000000..9d8a679 --- /dev/null +++ b/Classes/Mvc/Property/TypeConverter/UploadedFileReferenceConverter.php @@ -0,0 +1,637 @@ +translationService = $translationService; + } + + /** + * @internal + */ + public function injectResourceFactory(ResourceFactory $resourceFactory): void + { + $this->resourceFactory = $resourceFactory; + } + + /** + * @internal + */ + public function injectHashService(HashService $hashService): void + { + $this->hashService = $hashService; + } + + /** + * @internal + */ + public function injectPersistenceManager(PersistenceManagerInterface $persistenceManager): void + { + $this->persistenceManager = $persistenceManager; + } + + /** + * @internal + */ + public function injectStorageRepository(StorageRepository $storageRepository): void + { + $this->storageRepository = $storageRepository; + } + + /** + * Actually convert from $source to $targetType, taking into account the fully + * built $convertedChildProperties and $configuration. + * + * @param array|UploadedFile|string $source + * @param string $targetType + * @return FileReference|ObjectStorage|Error|null + * @internal + */ + public function convertFrom($source, $targetType, array $convertedChildProperties = [], ?PropertyMappingConfigurationInterface $configuration = null) + { + if ($source === '' || $source === []) { + return null; + } + + if ($source instanceof UploadedFile) { + return $this->convertSingleUpload( + $this->convertUploadedFileToUploadInfoArray($source), + $convertedChildProperties, + $configuration, + ); + } + + $allowRemoval = $configuration?->getConfigurationValue(self::class, self::CONFIGURATION_ALLOW_REMOVAL) ?? false; + + $deleteFileIndices = []; + $filesToDelete = []; + if ($allowRemoval) { + [$deleteFileIndices, $filesToDelete] = $this->extractFileDeletionData($source); + $this->deleteUploadedFiles($filesToDelete); + } + unset($source['__deleteFile']); + + if ($this->isMultiUploadTarget($source, $targetType)) { + return $this->handleMultiUploadSource($source, $deleteFileIndices, $convertedChildProperties, $configuration); + } + + return $this->handleSingleUploadSource($source, $filesToDelete, $allowRemoval, $convertedChildProperties, $configuration); + } + + /** + * Determines whether the source should be treated as a multi-file upload. + * + * Multi-upload is detected when: + * - the target type is ObjectStorage, or + * - the source contains '__submittedFiles' with more than one entry, or + * - the source contains numeric keys holding sub-arrays / UploadedFile objects + * (i.e. no flat 'error' key at the top level). + */ + private function isMultiUploadTarget(array $source, string $targetType): bool + { + if (is_a($targetType, ObjectStorage::class, true)) { + return true; + } + // Fallback heuristic for edge cases where targetType is not ObjectStorage + // but the source structure clearly indicates multi-upload. + if (isset($source['__submittedFiles']) && count($source['__submittedFiles']) > 1) { + return true; + } + return !array_key_exists('error', $source) && !isset($source['submittedFile']) && !isset($source['__submittedFiles']); + } + + /** + * Handles single file upload: standard upload, existing resource pointer only, + * or new upload replacing a previous file. + * + * '__submittedFiles' contains existing resource pointers from hidden inputs. + * 'error' is PHP's native UPLOAD_ERR_* constant from $_FILES. + * + * @param list $filesToDelete + */ + private function handleSingleUploadSource( + array $source, + array $filesToDelete, + bool $allowRemoval, + array $convertedChildProperties, + ?PropertyMappingConfigurationInterface $configuration, + ): FileReference|Error|null { + // Extract the submitted file resource pointer from __submittedFiles + $submittedResourcePointer = null; + if (is_array($source['__submittedFiles'] ?? null)) { + $firstSubmitted = reset($source['__submittedFiles']); + $submittedResourcePointer = $firstSubmitted['submittedFile']['resourcePointer'] ?? null; + } + unset($source['__submittedFiles']); + + // Build a flat source array for convertSingleUpload compatibility + if ($submittedResourcePointer !== null) { + $source['submittedFile']['resourcePointer'] = $submittedResourcePointer; + } + + if ($allowRemoval && $filesToDelete !== []) { + unset($source['submittedFile']['resourcePointer']); + } + + // New upload replaces existing file – clean up the old one + if (isset($source['submittedFile']['resourcePointer'], $source['error']) && $source['error'] === \UPLOAD_ERR_OK + ) { + $this->deletePreviousUpload($source); + unset($source['submittedFile']); + } + + return $this->convertSingleUpload($source, $convertedChildProperties, $configuration); + } + + /** + * @param list $deleteFileIndices + */ + private function handleMultiUploadSource( + array $source, + array $deleteFileIndices, + array $convertedChildProperties, + ?PropertyMappingConfigurationInterface $configuration, + ): ObjectStorage|Error { + $files = new ObjectStorage(); + + // Extract existing file resource pointers from the dedicated sub-key. + // These are stored separately to avoid index collision with new UploadedFile + // objects during array_replace_recursive() in RequestBuilder. + $submittedFiles = []; + if (is_array($source['__submittedFiles'] ?? null)) { + $submittedFiles = $source['__submittedFiles']; + } + unset($source['__submittedFiles']); + + // Process existing files (resource pointers from previous uploads) + $existingFileIndex = 0; + foreach ($submittedFiles as $file) { + if (in_array($existingFileIndex, $deleteFileIndices, true)) { + $existingFileIndex++; + continue; + } + if (is_array($file)) { + $convertedFile = $this->convertSingleUpload( + $file, + $convertedChildProperties, + $configuration, + ); + if ($convertedFile instanceof Error) { + return $convertedFile; + } + if ($convertedFile !== null) { + $files->attach($convertedFile); + } + } + $existingFileIndex++; + } + + // Process new file uploads + foreach ($source as $file) { + if ($file instanceof UploadedFile || is_array($file)) { + $convertedFile = $this->convertSingleUpload( + $file instanceof UploadedFile ? $this->convertUploadedFileToUploadInfoArray($file) : $file, + $convertedChildProperties, + $configuration, + ); + if ($convertedFile instanceof Error) { + return $convertedFile; + } + if ($convertedFile !== null) { + $files->attach($convertedFile); + } + } + } + + return $files; + } + + /** + * Core conversion: upload info array → FileReference, Error, or null. + */ + private function convertSingleUpload( + array $source, + array $convertedChildProperties, + ?PropertyMappingConfigurationInterface $configuration, + ): FileReference|Error|null { + $resourcePublicationSlot = GeneralUtility::makeInstance(ResourcePublicationSlot::class); + + if (!isset($source['error']) || $source['error'] === \UPLOAD_ERR_NO_FILE) { + if (isset($source['submittedFile']['resourcePointer'])) { + try { + $resourcePointer = $this->hashService->validateAndStripHmac( + $source['submittedFile']['resourcePointer'], + HashScope::ResourcePointer->prefix(), + ); + if (str_starts_with($resourcePointer, 'file:')) { + $fileUid = (int)substr($resourcePointer, 5); + $resource = $this->createFileReferenceFromFalFileObject( + $this->resourceFactory->getFileObject($fileUid), + ); + } else { + $resource = $this->createFileReferenceFromFalFileReferenceObject( + $this->resourceFactory->getFileReferenceObject((int)$resourcePointer), + (int)$resourcePointer, + ); + } + $resourcePublicationSlot->add($resource->getOriginalResource()->getOriginalFile()); + return $resource; + } catch (\InvalidArgumentException) { + // No file uploaded and resource pointer is invalid – discard. + } + } + return null; + } + + if ($source['error'] !== \UPLOAD_ERR_OK) { + return GeneralUtility::makeInstance(Error::class, $this->getUploadErrorMessage($source['error']), 1471715915); + } + + if (isset($this->convertedResources[$source['tmp_name']])) { + return $this->convertedResources[$source['tmp_name']]; + } + + if ($configuration === null) { + throw new \InvalidArgumentException('Argument $configuration must not be null', 1589183114); + } + + try { + $resource = $this->importUploadedResource($source, $configuration); + $resourcePublicationSlot->add($resource->getOriginalResource()->getOriginalFile()); + } catch (TypeConverterException $e) { + return $e->getError(); + } catch (\Exception $e) { + return GeneralUtility::makeInstance(Error::class, $e->getMessage(), $e->getCode()); + } + + $this->convertedResources[$source['tmp_name']] = $resource; + return $resource; + } + + /** + * Deletes a previously uploaded file referenced by submittedFile.resourcePointer. + */ + private function deletePreviousUpload(array $source): void + { + if (!isset($source['submittedFile']['resourcePointer'])) { + return; + } + try { + $resourcePointer = $this->hashService->validateAndStripHmac( + $source['submittedFile']['resourcePointer'], + HashScope::ResourcePointer->prefix(), + ); + $fileUid = str_starts_with($resourcePointer, 'file:') + ? (int)substr($resourcePointer, 5) + : null; + if ($fileUid !== null) { + $this->deleteUploadedFiles([$fileUid]); + } + } catch (InvalidHashStringException) { + // Invalid resource pointer – nothing to delete. + } + } + + /** + * Extracts and validates file deletion data from the source array. + * + * @return array{0: list, 1: list} Array containing [deleteFileIndices, filesToDelete] + */ + private function extractFileDeletionData(array $source): array + { + $deleteFileIndices = []; + $filesToDelete = []; + + if (!array_key_exists('__deleteFile', $source) || !is_array($source['__deleteFile'])) { + return [$deleteFileIndices, $filesToDelete]; + } + + foreach ($source['__deleteFile'] as $signedValue) { + try { + $deleteData = $this->hashService->validateAndStripHmac( + $signedValue, + HashScope::DeleteFile->prefix() + ); + $deleteData = json_decode($deleteData, true, 512, JSON_THROW_ON_ERROR); + if (isset($deleteData['fileIndex'])) { + $deleteFileIndices[] = (int)$deleteData['fileIndex']; + } + if (isset($deleteData['fileUid'])) { + $filesToDelete[] = (int)$deleteData['fileUid']; + } + } catch (InvalidHashStringException $e) { + $this->logger?->warning( + 'Invalid file deletion request: HMAC validation failed.', + ['exception' => $e] + ); + } catch (\JsonException $e) { + $this->logger?->warning( + 'Invalid file deletion request: JSON decoding failed.', + ['exception' => $e] + ); + } + } + + return [$deleteFileIndices, $filesToDelete]; + } + + /** + * Deletes uploaded files from the server and cleans up empty upload folders. + * + * @param list $fileUids + */ + private function deleteUploadedFiles(array $fileUids): void + { + foreach ($fileUids as $fileUid) { + try { + $file = $this->resourceFactory->getFileObject($fileUid); + $parentFolder = $file->getParentFolder(); + $file->delete(); + $this->deleteEmptyUploadFolder($parentFolder); + } catch (\Exception $e) { + $this->logger?->warning( + 'Could not delete uploaded file with uid {fileUid}.', + ['fileUid' => $fileUid, 'exception' => $e] + ); + } + } + } + + /** + * Deletes the upload folder if it's empty and was created by the form framework. + */ + private function deleteEmptyUploadFolder(?Folder $folder): void + { + if ($folder === null) { + return; + } + if (!str_starts_with($folder->getName(), 'form_')) { + return; + } + if ($folder->getFileCount() === 0 + && $folder->getStorage()->countFoldersInFolder($folder) === 0 + ) { + $folder->delete(); + } + } + + /** + * Import a resource and respect configuration given for properties + */ + protected function importUploadedResource( + array $uploadInfo, + PropertyMappingConfigurationInterface $configuration + ): PseudoFileReference { + if (!GeneralUtility::makeInstance(FileNameValidator::class)->isValid($uploadInfo['name'])) { + throw new TypeConverterException('Uploading files with PHP file extensions is not allowed!', 1471710357); + } + // `CONFIGURATION_UPLOAD_SEED` is expected to be defined + // if it's not given any random seed is generated, instead of throwing an exception + $seed = $configuration->getConfigurationValue(self::class, self::CONFIGURATION_UPLOAD_SEED) + ?: GeneralUtility::makeInstance(Random::class)->generateRandomHexString(40); + $uploadFolderId = $configuration->getConfigurationValue(self::class, self::CONFIGURATION_UPLOAD_FOLDER) ?: $this->defaultUploadFolder; + $conflictMode = DuplicationBehavior::tryFrom($configuration->getConfigurationValue(self::class, self::CONFIGURATION_UPLOAD_CONFLICT_MODE)) ?? $this->defaultConflictMode; + $pseudoFile = GeneralUtility::makeInstance(PseudoFile::class, $uploadInfo); + + $preStorageValidators = $configuration->getConfigurationValue(self::class, self::CONFIGURATION_PRE_STORAGE_VALIDATORS) ?? []; + foreach ($preStorageValidators as $validator) { + $validationResult = $validator->validate($pseudoFile); + if ($validationResult->hasErrors()) { + $firstError = current($validationResult->getErrors()); + throw TypeConverterException::fromError($firstError); + } + } + + $uploadFolder = $this->provideUploadFolder($uploadFolderId); + // current folder name, derived from public random seed (`formSession`) + $currentName = 'form_' . $this->hashService->hmac($seed, self::class); + // sub-folder in $uploadFolder with 160 bit of derived entropy (.../form_<40-chars-hash>/actual.file) + $uploadFolder = $this->provideTargetFolder($uploadFolder, $currentName); + // allow skipping the consistency check, since custom validators have already been executed + $this->skipResourceConsistencyCheckForUploads($uploadFolder->getStorage(), $uploadInfo); + /** @var File $uploadedFile */ + $uploadedFile = $uploadFolder->addUploadedFile($uploadInfo, $conflictMode); + + $resourcePointer = isset($uploadInfo['submittedFile']['resourcePointer']) && !str_contains($uploadInfo['submittedFile']['resourcePointer'], 'file:') + ? (int)$this->hashService->validateAndStripHmac($uploadInfo['submittedFile']['resourcePointer'], HashScope::ResourcePointer->prefix()) + : null; + + $fileReferenceModel = $this->createFileReferenceFromFalFileObject($uploadedFile, $resourcePointer); + + return $fileReferenceModel; + } + + protected function createFileReferenceFromFalFileObject( + File $file, + ?int $resourcePointer = null + ): PseudoFileReference { + $fileReference = $this->resourceFactory->createFileReferenceObject( + [ + 'uid_local' => $file->getUid(), + 'uid_foreign' => StringUtility::getUniqueId('NEW_'), + 'uid' => StringUtility::getUniqueId('NEW_'), + 'crop' => null, + ] + ); + return $this->createFileReferenceFromFalFileReferenceObject($fileReference, $resourcePointer); + } + + /** + * In case no $resourcePointer is given a new file reference domain object + * will be returned. Otherwise the file reference is reconstituted from + * storage and will be updated(!) with the provided $falFileReference. + */ + protected function createFileReferenceFromFalFileReferenceObject( + CoreFileReference $falFileReference, + ?int $resourcePointer = null + ): PseudoFileReference { + if ($resourcePointer === null) { + $fileReference = GeneralUtility::makeInstance(PseudoFileReference::class); + } else { + $fileReference = $this->persistenceManager->getObjectByIdentifier($resourcePointer, PseudoFileReference::class, false); + } + + $fileReference->setOriginalResource($falFileReference); + return $fileReference; + } + + /** + * Returns a human-readable message for the given PHP file upload error + * constant. + */ + protected function getUploadErrorMessage(int $errorCode): string + { + $logMessage = match ($errorCode) { + \UPLOAD_ERR_INI_SIZE => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', + \UPLOAD_ERR_FORM_SIZE => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.', + \UPLOAD_ERR_PARTIAL => 'The uploaded file was only partially uploaded.', + \UPLOAD_ERR_NO_FILE => 'No file was uploaded.', + \UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder.', + \UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk.', + \UPLOAD_ERR_EXTENSION => 'File upload stopped by extension.', + default => 'Unknown upload error.', + }; + $this->logger?->error($logMessage); + + $translationKey = match ($errorCode) { + \UPLOAD_ERR_INI_SIZE, \UPLOAD_ERR_FORM_SIZE => 'upload.error.150530345', + \UPLOAD_ERR_PARTIAL => 'upload.error.150530346', + \UPLOAD_ERR_NO_FILE => 'upload.error.150530347', + default => 'upload.error.150530348', + }; + + return $this->translationService->translate( + $translationKey, + null, + 'EXT:form/Resources/Private/Language/locallang.xlf' + ); + } + + /** + * Ensures that upload folder exists, creates it if it does not. + */ + protected function provideUploadFolder(string $uploadFolderIdentifier): Folder + { + try { + return $this->resourceFactory->getFolderObjectFromCombinedIdentifier($uploadFolderIdentifier); + } catch (FolderDoesNotExistException $exception) { + [$storageId, $storagePath] = explode(':', $uploadFolderIdentifier, 2); + $storage = $this->storageRepository->getStorageObject($storageId); + $folderNames = GeneralUtility::trimExplode('/', $storagePath, true); + $uploadFolder = $this->provideTargetFolder($storage->getRootLevelFolder(), ...$folderNames); + $this->provideFolderInitialization($uploadFolder); + return $uploadFolder; + } + } + + /** + * Ensures that particular target folder exists, creates it if it does not. + */ + protected function provideTargetFolder(Folder $parentFolder, string $folderName): Folder + { + return $parentFolder->hasFolder($folderName) + ? $parentFolder->getSubfolder($folderName) + : $parentFolder->createFolder($folderName); + } + + /** + * Creates empty index.html file to avoid directory indexing, + * in case it does not exist yet. + */ + protected function provideFolderInitialization(Folder $parentFolder): void + { + if (!$parentFolder->hasFile('index.html')) { + $parentFolder->createFile('index.html'); + } + } + + protected function convertUploadedFileToUploadInfoArray(UploadedFile $uploadedFile): array + { + return [ + 'name' => $uploadedFile->getClientFilename(), + 'tmp_name' => $uploadedFile->getTemporaryFileName(), + 'size' => $uploadedFile->getSize(), + 'error' => $uploadedFile->getError(), + 'type' => $uploadedFile->getClientMediaType(), + ]; + } +} diff --git a/Classes/Mvc/Validation/CountValidator.php b/Classes/Mvc/Validation/CountValidator.php new file mode 100644 index 0000000..6984cd1 --- /dev/null +++ b/Classes/Mvc/Validation/CountValidator.php @@ -0,0 +1,73 @@ + [0, 'The minimum count to accept', 'integer'], + 'maximum' => [PHP_INT_MAX, 'The maximum count to accept', 'integer'], + ]; + + /** + * The given value is valid if it is an array or \Countable that contains the specified amount of elements. + */ + public function isValid(mixed $value): void + { + if (!is_array($value) && !($value instanceof \Countable)) { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1475002976', + 'form' + ), + 1475002976 + ); + return; + } + + $minimum = (int)$this->options['minimum']; + $maximum = (int)$this->options['maximum']; + $count = count($value); + if ($count < $minimum || $count > $maximum) { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1475002994', + 'form', + [$minimum, $maximum] + ), + 1475002994, + [$this->options['minimum'], $this->options['maximum']] + ); + } + } +} diff --git a/Classes/Mvc/Validation/DateRangeValidator.php b/Classes/Mvc/Validation/DateRangeValidator.php new file mode 100644 index 0000000..0f0c2e9 --- /dev/null +++ b/Classes/Mvc/Validation/DateRangeValidator.php @@ -0,0 +1,165 @@ + ['', 'The minimum date formatted as Y-m-d or a relative date expression (e.g. "today", "-18 years")', 'string'], + 'maximum' => ['', 'The maximum date formatted as Y-m-d or a relative date expression (e.g. "today", "-18 years")', 'string'], + 'format' => ['Y-m-d', 'The format of the minimum and maximum option', 'string'], + ]; + + /** + * @param mixed $value The value that should be validated + */ + public function isValid(mixed $value): void + { + $options = $this->validateOptions(); + if ($options === null) { + return; + } + + if (!($value instanceof \DateTime)) { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1521293685', + 'form', + [gettype($value)] + ), + 1521293685 + ); + return; + } + + $minimum = $options['minimum']; + $maximum = $options['maximum']; + $format = $options['format']; + $value->modify('midnight'); + + if ($minimum instanceof \DateTime && $value < $minimum) { + $formattedMinimum = $minimum->format($format); + $this->addError( + $this->translateErrorMessage( + 'validation.error.1521293687', + 'form', + [$formattedMinimum] + ), + 1521293687, + [$formattedMinimum] + ); + } + + if ($maximum instanceof \DateTime && $value > $maximum) { + $formattedMaximum = $maximum->format($format); + $this->addError( + $this->translateErrorMessage( + 'validation.error.1521293686', + 'form', + [$formattedMaximum] + ), + 1521293686, + [$formattedMaximum] + ); + } + } + + /** + * Checks if this validator is correctly configured. + * + * Returns the resolved options array on success, or null if a date + * option is misconfigured. In the latter case a generic validation + * error is added for the end user and the technical details are logged. + */ + private function validateOptions(): ?array + { + $options = $this->options; + if (!empty($this->options['minimum'])) { + $minimum = $this->parseDate($this->options['minimum']); + if ($minimum === null) { + $this->logger->error('DateRangeValidator: The option "minimum" ({value}) could not be converted to DateTime. Use format "{format}" or a relative expression (e.g. "today", "-18 years").', [ + 'value' => $this->options['minimum'], + 'format' => $this->options['format'], + ]); + $this->addError( + $this->translateErrorMessage( + 'validation.error.1748345955', + 'form' + ), + 1748345955 + ); + return null; + } + $minimum->modify('midnight'); + $options['minimum'] = $minimum; + } + + if (!empty($this->options['maximum'])) { + $maximum = $this->parseDate($this->options['maximum']); + if ($maximum === null) { + $this->logger->error('DateRangeValidator: The option "maximum" ({value}) could not be converted to DateTime. Use format "{format}" or a relative expression (e.g. "today", "-18 years").', [ + 'value' => $this->options['maximum'], + 'format' => $this->options['format'], + ]); + $this->addError( + $this->translateErrorMessage( + 'validation.error.1748345955', + 'form' + ), + 1748345955 + ); + return null; + } + $maximum->modify('midnight'); + $options['maximum'] = $maximum; + } + return $options; + } + + /** + * Parse a date string as absolute format first, then fall back to relative expressions. + * + * Supports: + * - Absolute dates matching the configured format (e.g. "2025-03-17") + * - Any relative date expression accepted by PHP's DateTime parser + * (e.g. "today", "-18 years", "last sunday", "first day of next month") + */ + private function parseDate(string $value): ?\DateTime + { + $date = \DateTime::createFromFormat($this->options['format'], $value); + if ($date instanceof \DateTime) { + return $date; + } + + return DateRangeValidatorPatterns::parseRelativeDateExpression($value); + } +} diff --git a/Classes/Mvc/Validation/EmptyValidator.php b/Classes/Mvc/Validation/EmptyValidator.php new file mode 100644 index 0000000..89779d9 --- /dev/null +++ b/Classes/Mvc/Validation/EmptyValidator.php @@ -0,0 +1,52 @@ +addError( + $this->translateErrorMessage( + 'validation.error.1476396435', + 'form' + ), + 1476396435 + ); + } + } +} diff --git a/Classes/Mvc/Validation/Exception/InvalidValidationOptionsException.php b/Classes/Mvc/Validation/Exception/InvalidValidationOptionsException.php new file mode 100644 index 0000000..0d07f3d --- /dev/null +++ b/Classes/Mvc/Validation/Exception/InvalidValidationOptionsException.php @@ -0,0 +1,22 @@ + ['0B', 'The minimum file size to accept', 'string'], + 'maximum' => [PHP_INT_MAX . 'B', 'The maximum file size to accept', 'string'], + ]; + + /** + * The given value is valid + * + * @param mixed $resource + */ + public function isValid(mixed $resource): void + { + $this->validateOptions(); + if ($resource instanceof FileReference) { + $fileSize = $resource->getOriginalResource()->getSize(); + } elseif ($resource instanceof File) { + $fileSize = $resource->getSize(); + } elseif ($resource instanceof PseudoFile) { + $fileSize = $resource->getSize(); + } else { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1505303626', + 'form' + ), + 1505303626 + ); + return; + } + + $minFileSize = GeneralUtility::getBytesFromSizeMeasurement($this->options['minimum']); + $maxFileSize = GeneralUtility::getBytesFromSizeMeasurement($this->options['maximum']); + + $labels = ' Bytes| Kilobyte| Megabyte| Gigabyte'; + if ($fileSize < $minFileSize) { + $formattedMinFileSize = GeneralUtility::formatSize($minFileSize, $labels); + $this->addError( + $this->translateErrorMessage( + 'validation.error.1505305752', + 'form', + [$formattedMinFileSize] + ), + 1505305752, + [$formattedMinFileSize] + ); + } + if ($fileSize > $maxFileSize) { + $formattedMaxFileSize = GeneralUtility::formatSize($maxFileSize, $labels); + $this->addError( + $this->translateErrorMessage( + 'validation.error.1505305753', + 'form', + [$formattedMaxFileSize] + ), + 1505305753, + [$formattedMaxFileSize] + ); + } + } + + /** + * Checks if this validator is correctly configured + * + * @throws InvalidValidationOptionsException if the configured validation options are incorrect + */ + private function validateOptions(): void + { + if (!preg_match('/^(\d*\.?\d+)(B|K|M|G)$/i', $this->options['minimum'])) { + throw new InvalidValidationOptionsException('The option "minimum" has an invalid format. Valid formats are something like this: "10B|K|M|G".', 1505304205); + } + if (!preg_match('/^(\d*\.?\d+)(B|K|M|G)$/i', $this->options['maximum'])) { + throw new InvalidValidationOptionsException('The option "maximum" has an invalid format. Valid formats are something like this: "10B|K|M|G".', 1505304206); + } + } +} diff --git a/Classes/Mvc/Validation/MimeTypeValidator.php b/Classes/Mvc/Validation/MimeTypeValidator.php new file mode 100644 index 0000000..74c7c52 --- /dev/null +++ b/Classes/Mvc/Validation/MimeTypeValidator.php @@ -0,0 +1,115 @@ + [null, 'Allowed mime types (using */* IANA media types)', 'array', true], + ]; + + /** + * The given $value is valid if it is a FileReference of the + * configured type (one of the IANA media types) + * + * Note: a value of NULL or empty string ('') is considered valid + * + * @param mixed $resource The resource that should be validated + */ + public function isValid(mixed $resource): void + { + $this->validateOptions(); + + if ($resource instanceof FileReference) { + $mimeType = $resource->getOriginalResource()->getMimeType(); + $fileExtension = $resource->getOriginalResource()->getExtension(); + } elseif ($resource instanceof File) { + $mimeType = $resource->getMimeType(); + $fileExtension = $resource->getExtension(); + } elseif ($resource instanceof PseudoFile) { + $mimeType = $resource->getMimeType(); + $fileExtension = $resource->getExtension(); + } else { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1471708997', + 'form' + ), + 1471708997 + ); + return; + } + + $allowedMimeTypes = $this->options['allowedMimeTypes']; + if (!in_array($mimeType, $allowedMimeTypes, true)) { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1471708998', + 'form', + [$mimeType] + ), + 1471708998, + [$mimeType] + ); + } else { + // The mime-type which was detected by FAL matches, but the file name does not match. + // Example: myfile.txt is actually a PDF file (defined by mime-type), but .txt is not associated + // for application/pdf, so this is not valid. The file extension of the uploaded file must match + // the mime-type for this file. + $assumedMimesTypeOfFileExtension = (new MimeTypeDetector())->getMimeTypesForFileExtension($fileExtension); + if (empty(array_intersect($allowedMimeTypes, $assumedMimesTypeOfFileExtension))) { + $this->addError( + $this->translateErrorMessage( + 'validation.error.1613126216', + 'form', + [$fileExtension] + ), + 1613126216, + [$fileExtension] + ); + } + } + } + + /** + * Checks if this validator is correctly configured + * + * @throws InvalidValidationOptionsException if the configured validation options are incorrect + */ + private function validateOptions(): void + { + if (!is_array($this->options['allowedMimeTypes'] ?? null) || $this->options['allowedMimeTypes'] === []) { + throw new InvalidValidationOptionsException('The option "allowedMimeTypes" must be an array with at least one item.', 1471713296); + } + } +} diff --git a/Classes/Mvc/Validation/ObjectStorageElementValidatorInterface.php b/Classes/Mvc/Validation/ObjectStorageElementValidatorInterface.php new file mode 100644 index 0000000..1a7e9d4 --- /dev/null +++ b/Classes/Mvc/Validation/ObjectStorageElementValidatorInterface.php @@ -0,0 +1,32 @@ +standardContentPreviewRenderer->renderPageModulePreviewHeader($item); + } + + public function renderPageModulePreviewContent(GridColumnItem $item): string + { + $record = $item->getRecord(); + $request = $item->getContext()->getCurrentRequest(); + $persistenceIdentifier = null; + if ($record->has('pi_flexform')) { + $flexFormData = $record->get('pi_flexform'); + if ($flexFormData instanceof FlexFormFieldValues) { + if ($flexFormData->has('sDEF/settings.persistenceIdentifier')) { + $persistenceIdentifier = $flexFormData->get('sDEF/settings.persistenceIdentifier'); + } else { + $this->logger->warning( + 'Field "pi_flexform" for record-uid "{uid}" does not contain a persistence identifier.', + ['uid' => $record->getUid()] + ); + } + } else { + $this->logger->warning( + 'Type "{type}" of field "pi_flexform" for record-uid "{uid}" is not valid.', + ['type' => get_debug_type($flexFormData), 'uid' => $record->getUid()] + ); + } + } + $languageService = $this->getLanguageService(); + if (!empty($persistenceIdentifier)) { + try { + try { + $formDefinition = $this->formPersistenceManager->load($persistenceIdentifier); + $formLabel = $formDefinition['label']; + } catch (ParseErrorException $e) { + $formLabel = sprintf( + $languageService->sL('form.database:tt_content.preview.invalidPersistenceIdentifier'), + $persistenceIdentifier + ); + } catch (PersistenceManagerException $e) { + $formLabel = sprintf( + $languageService->sL('form.database:tt_content.preview.inaccessiblePersistenceIdentifier'), + $persistenceIdentifier + ); + } catch (Exception $e) { + $formLabel = sprintf( + $languageService->sL('form.database:tt_content.preview.notExistingdPersistenceIdentifier'), + $persistenceIdentifier + ); + } + } catch (NoSuchFileException $e) { + $this->addInvalidFrameworkConfigurationFlashMessage($persistenceIdentifier, $e); + $formLabel = sprintf( + $languageService->sL('form.database:tt_content.preview.notExistingdPersistenceIdentifier'), + $persistenceIdentifier + ); + } catch (ParseErrorException $e) { + $this->addInvalidFrameworkConfigurationFlashMessage($persistenceIdentifier, $e); + $formLabel = sprintf( + $languageService->sL('form.database:tt_content.preview.invalidFrameworkConfiguration'), + $persistenceIdentifier + ); + } catch (\Exception $e) { + // Top level catch - FAL throws top level exceptions on missing files, eg. in getFileInfoByIdentifier() of LocalDriver + $this->addInvalidFrameworkConfigurationFlashMessage($persistenceIdentifier, $e); + $formLabel = sprintf( + $languageService->sL('form.database:tt_content.preview.invalidFrameworkConfiguration.text'), + $persistenceIdentifier, + $e->getMessage() + ); + } + } else { + $formLabel = $languageService->sL('form.database:tt_content.preview.noPersistenceIdentifier'); + } + $itemContent = '' . htmlspecialchars($item->getContext()->getContentTypeLabels()['form_formframework']) . '
'; + return $this->fieldProcessor->linkToEditForm($itemContent . htmlspecialchars($formLabel), $record, $request); + } + + public function renderPageModulePreviewFooter(GridColumnItem $item): string + { + return $this->standardContentPreviewRenderer->renderPageModulePreviewFooter($item); + } + + public function wrapPageModulePreview(string $previewHeader, string $previewContent, GridColumnItem $item): string + { + return $this->standardContentPreviewRenderer->wrapPageModulePreview($previewHeader, $previewContent, $item); + } + + private function addInvalidFrameworkConfigurationFlashMessage(string $persistenceIdentifier, \Exception $e): void + { + $languageService = $this->getLanguageService(); + $this->flashMessageService + ->getMessageQueueByIdentifier('core.template.flashMessages') + ->enqueue( + new FlashMessage( + sprintf( + $languageService->sL('form.database:tt_content.preview.invalidFrameworkConfiguration.text'), + $persistenceIdentifier, + $e->getMessage() + ), + $languageService->sL('form.database:tt_content.preview.invalidFrameworkConfiguration.title'), + ContextualFeedbackSeverity::ERROR, + true + ) + ); + } + + private function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/Security/HashScope.php b/Classes/Security/HashScope.php new file mode 100644 index 0000000..adc52a8 --- /dev/null +++ b/Classes/Security/HashScope.php @@ -0,0 +1,38 @@ +value; + } +} diff --git a/Classes/Service/CleanupFormUploadsService.php b/Classes/Service/CleanupFormUploadsService.php new file mode 100644 index 0000000..a7d3289 --- /dev/null +++ b/Classes/Service/CleanupFormUploadsService.php @@ -0,0 +1,162 @@ +` inside the configured upload folder (default: + * `1:/user_upload/`). Over time, these folders accumulate — both from + * completed and incomplete form submissions. + * + * Since uploaded files are not moved upon form submission, there is no + * way to distinguish between folders from completed and abandoned + * submissions. This service identifies form upload folders based on + * their age (modification time) and provides methods to list and delete them. + * + * @internal + */ +readonly class CleanupFormUploadsService +{ + /** + * Regex matching the folder naming convention used by + * UploadedFileReferenceConverter::importUploadedResource(): + * `form_` followed by exactly 40 hex characters (HMAC output). + */ + private const string FORM_UPLOAD_FOLDER_PATTERN = '/^form_[a-f0-9]{40}$/'; + + public function __construct( + private ResourceFactory $resourceFactory, + private LoggerInterface $logger, + ) {} + + /** + * Finds expired form upload folders in the given upload folders. + * + * A folder is considered expired when: + * 1. Its name matches the `form_<40-hex-chars>` pattern + * 2. Its modification time is older than the given maximum age + * + * @param int $maximumAge Maximum age in seconds. Folders older than this are considered expired. + * @param list $uploadFolderIdentifiers List of combined folder identifiers to scan + * (e.g. ['1:/user_upload/', '2:/custom_uploads/']). + * @return list List of expired form upload folders + */ + public function getExpiredFolders(int $maximumAge, array $uploadFolderIdentifiers): array + { + $cutoffTimestamp = time() - $maximumAge; + $expiredFolders = []; + + foreach ($uploadFolderIdentifiers as $folderIdentifier) { + $expiredFolders = [ + ...$expiredFolders, + ...$this->findExpiredFoldersInParent($folderIdentifier, $cutoffTimestamp), + ]; + } + + return $expiredFolders; + } + + /** + * Deletes the given folders and returns a result summary. + * + * @param list $folders Folders to delete + * @return array{deleted: int, failed: int, errors: list} + */ + public function deleteFolders(array $folders): array + { + $deleted = 0; + $failed = 0; + $errors = []; + + foreach ($folders as $folder) { + try { + $folder->delete(true); + $deleted++; + } catch (\Exception $e) { + $failed++; + $errors[] = [ + 'folder' => $folder->getCombinedIdentifier(), + 'message' => $e->getMessage(), + ]; + $this->logger->error( + 'Failed to delete form upload folder "{folder}": {message}', + ['folder' => $folder->getCombinedIdentifier(), 'message' => $e->getMessage()] + ); + } + } + + return [ + 'deleted' => $deleted, + 'failed' => $failed, + 'errors' => $errors, + ]; + } + + /** + * Find expired form upload folders in a specific parent folder. + * + * @return list + */ + private function findExpiredFoldersInParent(string $folderIdentifier, int $cutoffTimestamp): array + { + $expiredFolders = []; + + try { + $parentFolder = $this->resourceFactory->getFolderObjectFromCombinedIdentifier($folderIdentifier); + } catch (FolderDoesNotExistException|InsufficientFolderAccessPermissionsException|\InvalidArgumentException $e) { + $this->logger->warning( + 'Could not access upload folder "{folder}": {message}', + ['folder' => $folderIdentifier, 'message' => $e->getMessage()] + ); + return $expiredFolders; + } + + foreach ($parentFolder->getSubfolders() as $subFolder) { + if ($this->isExpiredFormUploadFolder($subFolder, $cutoffTimestamp)) { + $expiredFolders[] = $subFolder; + } + } + + return $expiredFolders; + } + + /** + * Determines whether a folder is an expired form upload folder. + * + * A folder is considered an expired form upload folder when: + * 1. Its name matches the exact `form_<40-hex-chars>` pattern + * (as generated by UploadedFileReferenceConverter::importUploadedResource()) + * 2. Its modification time is older than the cutoff timestamp + */ + private function isExpiredFormUploadFolder(Folder $folder, int $cutoffTimestamp): bool + { + if (preg_match(self::FORM_UPLOAD_FOLDER_PATTERN, $folder->getName()) !== 1) { + return false; + } + + return $folder->getModificationTime() < $cutoffTimestamp; + } +} diff --git a/Classes/Service/DatabaseService.php b/Classes/Service/DatabaseService.php new file mode 100644 index 0000000..800dc14 --- /dev/null +++ b/Classes/Service/DatabaseService.php @@ -0,0 +1,219 @@ + interpreted as a sys_file reference UID to a FAL-stored YAML file (user-generated content) + * - EXT:... -> interpreted as a NON-FAL extension-based file + * - any string -> interpreted as FAL-based filename + * + * Note that we explicitly do NOT check for file existence here, + * because we want to be able to reveal sys_refindex entries to files + * that have been deleted meanwhile! + * + * @internal + */ + public function getReferencesByPersistenceIdentifier(string $persistenceIdentifier): array + { + if (empty($persistenceIdentifier)) { + throw new \InvalidArgumentException('$persistenceIdentifier must not be empty.', 1472238493); + } + + $queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_refindex'); + $constraints = [$queryBuilder->expr()->eq('softref_key', $queryBuilder->createNamedParameter('formPersistenceIdentifier'))]; + + // Indicator whether the string-based lookup in sys_refindex shall be performed (true; non FAL-based) or not (false; FAL-based) + $useStringReference = false; + + // Check what $persistenceIdentifier contains. + if (PathUtility::isExtensionPath($persistenceIdentifier)) { + // Uses "EXT:" notation, so it cannot be a FAL identifier. + // We pass the whole "EXT:..." lookup through to the sys_refindex query + // due to its constraint on softref_key=formPersistenceIdentifier, + // we expect no false entries even with "weird" string notations. If sys_refindex + // has it, we yield it. + $useStringReference = true; + } elseif (MathUtility::canBeInterpretedAsInteger($persistenceIdentifier)) { + $constraints[] = $queryBuilder->expr()->or( + $queryBuilder->expr()->eq('ref_string', $queryBuilder->createNamedParameter($persistenceIdentifier)), + $queryBuilder->expr()->eq('ref_uid', $queryBuilder->createNamedParameter($persistenceIdentifier, Connection::PARAM_INT)) + ); + } else { + // Anything else would be either a notation like "/fileadmin/something.form.yaml" + // or a numeric identifier for a sys_file. + try { + // We use this "bulk method" because this is the best-bet from resourceFactory + // to resolve both an integer-ish input value or a FAL value. There is no + // substitute for an "only get a file, not a directory" lookup. + $file = $this->resourceFactory->retrieveFileOrFolderObject($persistenceIdentifier); + + if ($file === null) { + // The associated identifier could (no longer) be retrieved via FAL. + // However, we do want to see existing entries to such stale entries to + // be able to reveal bad references, either by its ref_string or ref_uid + $useStringReference = true; + } elseif ($file instanceof File) { + // We succeeded in retrieving the FAL file object. + $constraints[] = $queryBuilder->expr()->eq('ref_uid', $queryBuilder->createNamedParameter($file->getUid(), Connection::PARAM_INT)); + } else { + // We might have retrieved a "Folder" object. Fall back to passthrough + // with the intent, to retrieve all possible sys_refindex entries. + // If that fails, it's ok to return an empty array. + $useStringReference = true; + } + } catch (ResourceDoesNotExistException) { + // This exception gets triggered when $persistenceIdentifier is not something + // that could be resolved by the bulk-method. + // As above, we want to retrieve all the possible sys_refindex entries, + // so we fall back again to "ref_string". + // This should happen when $persistenceIdentifier is set to a string like '/fileadmin/somefile.form.yaml', + // and a FAL storage could be retrieved, but not the actual file. + $useStringReference = true; + } + } + + if ($useStringReference) { + $constraints[] = $queryBuilder->expr()->eq('ref_string', $queryBuilder->createNamedParameter($persistenceIdentifier)); + } + + return $queryBuilder + ->select('*') + ->from('sys_refindex') + ->where(...$constraints) + ->executeQuery() + ->fetchAllAssociative(); + } + + /** + * Returns an array with all form definition persistenceIdentifiers + * as keys and their reference counts as values. + * + * @internal + */ + public function getAllReferencesForPersistenceIdentifier(): array + { + $items = []; + foreach ($this->getAllReferences('ref_string') as $item) { + $items[$item['identifier']] = $item['items']; + } + return $items; + } + + /** + * Returns an array with all form definition file uids as keys + * and their reference counts as values. + * + * @internal + */ + public function getAllReferencesForFileUid(): array + { + $items = []; + foreach ($this->getAllReferences('ref_uid') as $item) { + $items[$item['identifier']] = $item['items']; + } + return $items; + } + + /** + * Returns an array with all database-stored form definition UIDs as keys + * and their reference counts as values. + * + * These are tracked in sys_refindex via ref_table='form_definition' and ref_uid=. + * + * @return array persistenceIdentifier (UID as string) => reference count + * @internal + */ + public function getAllReferencesForFormDefinitionUid(): array + { + $queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_refindex'); + + $rows = $queryBuilder + ->select('ref_uid AS identifier') + ->addSelectLiteral('COUNT(' . $queryBuilder->quoteIdentifier('ref_uid') . ') AS ' . $queryBuilder->quoteIdentifier('items')) + ->from('sys_refindex') + ->where( + $queryBuilder->expr()->eq('softref_key', $queryBuilder->createNamedParameter('formPersistenceIdentifier')), + $queryBuilder->expr()->eq('ref_table', $queryBuilder->createNamedParameter(FormDefinitionRepository::TABLE_NAME)), + $queryBuilder->expr()->gt('ref_uid', $queryBuilder->createNamedParameter(0, Connection::PARAM_INT)) + ) + ->groupBy('ref_uid') + ->executeQuery() + ->fetchAllAssociative(); + + $items = []; + foreach ($rows as $row) { + $items[(string)$row['identifier']] = (int)$row['items']; + } + return $items; + } + + protected function getAllReferences(string $column): array + { + if ($column !== 'ref_string' && $column !== 'ref_uid') { + throw new \InvalidArgumentException('$column must be "ref_string" or "ref_uid".', 1535406600); + } + + $queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_refindex'); + + $constraints = [ + $queryBuilder->expr()->eq('softref_key', $queryBuilder->createNamedParameter('formPersistenceIdentifier')), + ]; + + if ($column === 'ref_string') { + $constraints[] = $queryBuilder->expr()->neq('ref_string', $queryBuilder->createNamedParameter('')); + } else { + $constraints[] = $queryBuilder->expr()->gt('ref_uid', $queryBuilder->createNamedParameter(0, Connection::PARAM_INT)); + } + + return $queryBuilder + ->select($column . ' AS identifier') + ->addSelectLiteral('COUNT(' . $queryBuilder->quoteIdentifier($column) . ') AS ' . $queryBuilder->quoteIdentifier('items')) + ->from('sys_refindex') + ->where(...$constraints) + ->groupBy($column) + ->executeQuery() + ->fetchAllAssociative(); + } +} diff --git a/Classes/Service/FormEditorEnrichmentService.php b/Classes/Service/FormEditorEnrichmentService.php new file mode 100644 index 0000000..085e2a3 --- /dev/null +++ b/Classes/Service/FormEditorEnrichmentService.php @@ -0,0 +1,137 @@ +enrichDefinitionWithRichTextOptions($definition); + } + } + + return $formEditorDefinitions; + } + + /** + * Enrich a single definition with RTE options for its editors and property collections. + */ + protected function enrichDefinitionWithRichTextOptions(array &$definition): void + { + if (is_array($definition['editors'] ?? null)) { + $this->enrichEditorsWithRichTextOptions($definition['editors']); + } + + if (is_array($definition['propertyCollections'] ?? null)) { + $this->enrichPropertyCollectionsWithRichTextOptions($definition['propertyCollections']); + } + } + + /** + * Enrich property collections (e.g., finishers, validators) with RTE options. + * + * Property collections have an additional numeric level in their structure: + * propertyCollections -> collectionName (e.g., 'finishers') -> numeric index -> editors + */ + protected function enrichPropertyCollectionsWithRichTextOptions(array &$propertyCollections): void + { + foreach ($propertyCollections as &$collectionItems) { + if (!is_array($collectionItems)) { + continue; + } + + foreach ($collectionItems as &$collectionItem) { + if (is_array($collectionItem['editors'] ?? null)) { + $this->enrichEditorsWithRichTextOptions($collectionItem['editors']); + } + } + } + } + + /** + * Enrich editors array with RTE options if enableRichtext is set. + * + * Iterates through all editors and adds RTE configuration options + * to textarea editors that have rich text enabled. + */ + protected function enrichEditorsWithRichTextOptions(array &$editors): void + { + foreach ($editors as &$editor) { + if ($this->shouldEnrichEditorWithRichText($editor)) { + $editor['rteOptions'] = $this->resolveRichTextOptions($editor); + } + } + } + + /** + * Check if an editor should be enriched with RTE options. + * + * An editor qualifies for RTE enrichment if it is a textarea editor + * and has the enableRichtext flag set to true. + */ + protected function shouldEnrichEditorWithRichText(array $editor): bool + { + return ($editor['templateName'] ?? '') === 'Inspector-TextareaEditor' + && ($editor['enableRichtext'] ?? false) === true; + } + + /** + * Resolve CKEditor configuration options for the given editor. + * + * Retrieves the RTE preset configuration and resolves it into + * a complete CKEditor configuration that can be used in the form editor. + */ + protected function resolveRichTextOptions(array $editor): array + { + $presetName = $editor['richtextConfiguration'] ?? 'form-label'; + return $this->richTextConfigurationService->resolveCkEditorConfiguration($presetName); + } +} diff --git a/Classes/Service/FormTransferResult.php b/Classes/Service/FormTransferResult.php new file mode 100644 index 0000000..d4d551d --- /dev/null +++ b/Classes/Service/FormTransferResult.php @@ -0,0 +1,40 @@ +deletionError === null; + } +} diff --git a/Classes/Service/FormTransferService.php b/Classes/Service/FormTransferService.php new file mode 100644 index 0000000..502e6b6 --- /dev/null +++ b/Classes/Service/FormTransferService.php @@ -0,0 +1,330 @@ + + */ + public function listSourceForms(string $sourceType, ?string $formIdentifier = null): array + { + $sourceAdapter = $this->storageAdapterFactory->getAdapterByType($sourceType); + $forms = $sourceAdapter->findAll(new SearchCriteria()); + + if ($formIdentifier !== null) { + $forms = array_values(array_filter( + $forms, + static fn(FormMetadata $form) => $form->identifier === $formIdentifier, + )); + } + + return $forms; + } + + /** + * Read a form definition from a source storage + */ + public function readForm(string $sourceType, string $persistenceIdentifier): FormData + { + return $this->storageAdapterFactory->getAdapterByType($sourceType)->read(FormIdentifier::fromString($persistenceIdentifier)); + } + + /** + * Delete a form from a storage + */ + public function deleteForm(string $storageType, string $persistenceIdentifier): void + { + $adapter = $this->storageAdapterFactory->getAdapterByType($storageType); + $adapter->delete(FormIdentifier::fromString($persistenceIdentifier)); + } + + /** + * Transfer a single form from source to target storage + * + * @return FormTransferResult + */ + public function transferForm( + FormMetadata $sourceForm, + string $sourceType, + string $targetType, + string $targetLocation, + bool $deleteSource = false, + ): FormTransferResult { + $sourceAdapter = $this->storageAdapterFactory->getAdapterByType($sourceType); + $targetAdapter = $this->storageAdapterFactory->getAdapterByType($targetType); + + // Read from source + $sourcePersistenceIdentifier = $sourceForm->persistenceIdentifier ?? $sourceForm->identifier; + $formData = $sourceAdapter->read(FormIdentifier::fromString($sourcePersistenceIdentifier)); + + // Ensure unique identifier in target. + // For a move operation the source form will be deleted afterwards, so it must not be + // counted as a duplicate. Therefore only the target adapter is checked for conflicts. + // For a copy operation all adapters are checked to avoid the same logical identifier + // existing in multiple storages simultaneously. + if ($deleteSource) { + $uniqueIdentifier = $this->getUniqueIdentifierInAdapter($targetAdapter, $formData->identifier); + } else { + $uniqueIdentifier = $this->formPersistenceManager->getUniqueIdentifier($formData->identifier); + } + + // Build FormData with potentially updated identifier + $targetFormData = $uniqueIdentifier !== $formData->identifier + ? FormData::fromArray(array_merge($formData->toArray(), ['identifier' => $uniqueIdentifier])) + : $formData; + + // Get unique persistence identifier in target storage + $targetPersistenceIdentifier = $targetAdapter->getUniquePersistenceIdentifier( + $uniqueIdentifier, + $targetLocation, + ); + + // Write to target + $context = $this->buildStorageContext($targetLocation); + $savedIdentifier = $targetAdapter->write( + FormIdentifier::fromString($targetPersistenceIdentifier), + $targetFormData, + $context, + ); + + // Optionally delete from source + $sourceDeleted = false; + $deletionError = null; + if ($deleteSource) { + try { + $sourceAdapter->delete(FormIdentifier::fromString($sourcePersistenceIdentifier)); + $sourceDeleted = true; + } catch (\Exception $e) { + $deletionError = $e->getMessage(); + } + } + + return new FormTransferResult( + sourceIdentifier: $sourcePersistenceIdentifier, + targetIdentifier: $savedIdentifier->identifier, + formIdentifier: $uniqueIdentifier, + formName: $sourceForm->name, + sourceDeleted: $sourceDeleted, + deletionError: $deletionError, + ); + } + + /** + * Get all registered storage type identifiers + * + * @return list + */ + public function getAvailableStorageTypes(): array + { + return $this->storageAdapterFactory->getRegisteredTypeIdentifiers(); + } + + /** + * Check if a storage type exists + */ + public function hasStorageType(string $typeIdentifier): bool + { + return $this->storageAdapterFactory->hasAdapterType($typeIdentifier); + } + + /** + * Get adapter for a storage type (for validation purposes) + */ + public function getAdapter(string $typeIdentifier): StorageAdapterInterface + { + return $this->storageAdapterFactory->getAdapterByType($typeIdentifier); + } + + /** + * Get a unique form identifier by checking only the given storage adapter for conflicts. + * + * Used for move operations: since the source form is deleted after transfer, only the + * target storage needs to be free of the identifier — not all storages globally. + * + * @throws \RuntimeException if no unique identifier can be found + */ + private function getUniqueIdentifierInAdapter(StorageAdapterInterface $adapter, string $identifier): string + { + $originalIdentifier = $identifier; + + if (!$adapter->existsByFormIdentifier($identifier)) { + return $identifier; + } + + for ($attempts = 1; $attempts < 100; $attempts++) { + $identifier = sprintf('%s_%d', $originalIdentifier, $attempts); + if (!$adapter->existsByFormIdentifier($identifier)) { + return $identifier; + } + } + + $identifier = $originalIdentifier . '_' . time(); + if (!$adapter->existsByFormIdentifier($identifier)) { + return $identifier; + } + + throw new \RuntimeException( + sprintf('Could not find a unique identifier for form identifier "%s" after %d attempts', $originalIdentifier, $attempts), + 1742477400 + ); + } + + private function buildStorageContext(string $targetLocation): ?StorageContext + { + if (ctype_digit($targetLocation)) { + return StorageContext::create((int)$targetLocation); + } + return null; + } + + /** + * Update tt_content FlexForm references from old persistence identifiers + * to new ones. + * + * Uses DOM/XPath parsing to precisely target only the + * `settings.persistenceIdentifier` field in FlexForm XML, avoiding + * false replacements in other fields. + * + * @param array $migrationMap Old persistenceIdentifier => new persistenceIdentifier + * @return int Number of updated content element references + */ + public function updateContentElementReferences(array $migrationMap): int + { + $updatedCount = 0; + $connection = $this->connectionPool->getConnectionForTable('tt_content'); + + $queryBuilder = $this->connectionPool->getQueryBuilderForTable('tt_content'); + $queryBuilder->getRestrictions()->removeAll()->add( + GeneralUtility::makeInstance(DeletedRestriction::class) + ); + + $rows = $queryBuilder + ->select('uid', 'pi_flexform') + ->from('tt_content') + ->where( + $queryBuilder->expr()->eq( + 'CType', + $queryBuilder->createNamedParameter('form_formframework') + ), + $queryBuilder->expr()->isNotNull('pi_flexform'), + $queryBuilder->expr()->neq( + 'pi_flexform', + $queryBuilder->createNamedParameter('') + ) + ) + ->executeQuery() + ->fetchAllAssociative(); + + foreach ($rows as $row) { + $flexForm = $row['pi_flexform']; + $newValue = $this->replacePersistenceIdentifierInFlexForm($flexForm, $migrationMap); + + if ($newValue !== null && $newValue !== $flexForm) { + $connection->update( + 'tt_content', + ['pi_flexform' => $newValue], + ['uid' => (int)$row['uid']] + ); + $updatedCount++; + } + } + + return $updatedCount; + } + + /** + * Replace the persistenceIdentifier value in FlexForm XML using DOM parsing. + * + * Specifically targets only the + * element to avoid replacing values in other FlexForm fields. + * + * @param string $flexFormXml The raw FlexForm XML string + * @param array $migrationMap Old persistenceIdentifier => new persistenceIdentifier + * @return string|null The modified XML string, or null if parsing failed or no changes were made + */ + private function replacePersistenceIdentifierInFlexForm(string $flexFormXml, array $migrationMap): ?string + { + $document = new \DOMDocument(); + $previousErrorHandling = libxml_use_internal_errors(true); + + if (!$document->loadXML($flexFormXml)) { + libxml_clear_errors(); + libxml_use_internal_errors($previousErrorHandling); + $this->logger->warning('Could not parse FlexForm XML.'); + return null; + } + + libxml_clear_errors(); + libxml_use_internal_errors($previousErrorHandling); + + $xpath = new \DOMXPath($document); + $nodes = $xpath->query('//field[@index="settings.persistenceIdentifier"]/value[@index="vDEF"]'); + + if ($nodes === false || $nodes->length === 0) { + return null; + } + + $modified = false; + foreach ($nodes as $node) { + $currentValue = $node->nodeValue; + if (isset($migrationMap[$currentValue])) { + $node->nodeValue = (string)$migrationMap[$currentValue]; + $modified = true; + } + } + + if (!$modified) { + return null; + } + + return $document->saveXML(); + } +} diff --git a/Classes/Service/RichTextConfigurationService.php b/Classes/Service/RichTextConfigurationService.php new file mode 100644 index 0000000..8777e26 --- /dev/null +++ b/Classes/Service/RichTextConfigurationService.php @@ -0,0 +1,327 @@ +loadRichtextConfiguration($presetName); + return $this->prepareConfigurationForEditor($richtextConfiguration); + } + + /** + * Resolves the processing configuration (proc.) for HTML transformations. + * + * This method loads the RTE preset and returns the processing configuration + * that can be used with RteHtmlParser for HTML transformations. + * + * Note: Unlike resolveCkEditorConfiguration(), this method does NOT check for rte_ckeditor + * because RteHtmlParser is part of the Core and works independently of the editor. + * + * @param string $presetName Name of the RTE preset (e.g., 'form-label', 'form-content') + * @return array The processing configuration array + */ + public function resolveProcessingConfiguration(string $presetName = 'form-label'): array + { + + $richtextConfiguration = $this->loadRichtextConfiguration($presetName); + return $richtextConfiguration['proc.'] ?? []; + } + + /** + * Transforms HTML content from RTE format for database persistence. + * + * @param string $htmlContent The HTML content from the RTE editor + * @param string $presetName Name of the RTE preset to use for transformation rules + * @return string The transformed HTML ready for database storage + */ + public function transformTextForPersistence(string $htmlContent, string $presetName = 'form-label'): string + { + $processingConfiguration = $this->resolveProcessingConfiguration($presetName); + return $this->rteHtmlParser->transformTextForPersistence($htmlContent, $processingConfiguration); + } + + /** + * Transforms HTML content from database format for RTE display. + * + * @param string $htmlContent The HTML content from the database + * @param string $presetName Name of the RTE preset to use for transformation rules + * @return string The transformed HTML ready for the RTE editor + */ + public function transformTextForRichTextEditor(string $htmlContent, string $presetName = 'form-label'): string + { + $processingConfiguration = $this->resolveProcessingConfiguration($presetName); + + return $this->rteHtmlParser->transformTextForRichTextEditor($htmlContent, $processingConfiguration); + } + + /** + * Loads the full RTE configuration from the preset. + * + * @param string $presetName Name of the RTE preset + * @return array The full richtext configuration + */ + private function loadRichtextConfiguration(string $presetName): array + { + // Load RTE configuration from TYPO3's global preset system + // We use dummy values since we're in the form editor context without a specific record + return $this->richtext->getConfiguration( + 'tx_form_dummy', + 'dummy_field', + 0, + '', + ['richtextConfiguration' => $presetName] + ); + } + + /** + * Prepares the loaded RTE configuration for the CKEditor. + * + * @param array $richtextConfiguration The raw richtext configuration from preset + * @return array The prepared configuration for CKEditor + */ + private function prepareConfigurationForEditor(array $richtextConfiguration): array + { + $configuration = [ + 'customConfig' => '', + 'label' => '', + ]; + + if (is_array($richtextConfiguration['editor']['config'] ?? null)) { + $configuration = array_replace_recursive($configuration, $richtextConfiguration['editor']['config']); + } + + $this->processExternalPlugins($richtextConfiguration, $configuration); + + $this->configureLanguage($configuration); + + $configuration = $this->replaceLanguageFileReferences($configuration); + $configuration = $this->replaceAbsolutePathsToRelativeResourcesPath($configuration); + + if (!isset($configuration['debug'])) { + $configuration['debug'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['debug'] ?? false) + && Environment::getContext()->isDevelopment(); + } + + return $configuration; + } + + /** + * Processes external plugins configuration. + * + * External plugins may require additional configuration like route URLs for the link browser. + * This method handles the transformation of route names to actual URLs. + * + * Similar to RichTextElement::getExtraPlugins() and resolveCkEditorConfiguration(). + * + * @param array $richtextConfiguration The full richtext configuration + * @param array $configuration The configuration array to modify (passed by reference) + */ + private function processExternalPlugins(array $richtextConfiguration, array &$configuration): void + { + $externalPlugins = $richtextConfiguration['editor']['externalPlugins'] ?? []; + + if ($externalPlugins === []) { + return; + } + + foreach ($externalPlugins as $pluginName => $pluginConfig) { + $configName = $pluginConfig['configName'] ?? $pluginName; + + if (isset($pluginConfig['route'])) { + $pluginConfig['routeUrl'] = $this->buildPluginRouteUrl($pluginConfig['route']); + } + + unset($pluginConfig['route'], $pluginConfig['configName'], $pluginConfig['resource']); + + if ($pluginConfig !== []) { + if (!isset($configuration[$configName])) { + $configuration[$configName] = $pluginConfig; + } elseif (is_array($configuration[$configName])) { + $configuration[$configName] = array_replace_recursive( + $pluginConfig, + $configuration[$configName] + ); + } + } + } + } + + /** + * Builds the route URL for an external plugin. + * + * @param string $route The route identifier (e.g., 'rteckeditor_wizard_browse_links') + * @return string The complete URL for the route + */ + private function buildPluginRouteUrl(string $route): string + { + // Build URL parameters for the route + // Using dummy values for form editor context as we don't have a specific record + $urlParameters = [ + 'P' => [ + 'table' => 'tx_form', + 'uid' => 0, + 'fieldName' => 'form_field', + 'recordType' => '', + 'pid' => 0, + 'richtextConfigurationName' => '', + ], + ]; + + return (string)$this->uriBuilder->buildUriFromRoute($route, $urlParameters); + } + + /** + * Configures language settings for the editor. + * + * Sets both UI language (based on backend user preference) and content language. + * For the form editor context, content language is always set to 'en'. + * + * @param array $configuration The configuration array to modify (passed by reference) + */ + private function configureLanguage(array &$configuration): void + { + // Set the UI language of the editor + if (empty($configuration['language']) + || (is_array($configuration['language']) && empty($configuration['language']['ui'])) + ) { + $userLang = (string)($this->getBackendUser()->user['lang'] ?? 'en'); + $configuration['language']['ui'] = $userLang === 'default' ? 'en' : $userLang; + } elseif (!is_array($configuration['language'])) { + // Convert string language config to array format + $configuration['language'] = [ + 'ui' => $configuration['language'], + ]; + } + + // Set content language to 'en' for form editor (no specific content language context) + $configuration['language']['content'] = 'en'; + } + + /** + * Replaces LLL: language references with translated values. + * + * Recursively processes the configuration array and translates all language labels. + * + * @param array $configuration The configuration to process + * @return array The configuration with translated labels + */ + private function replaceLanguageFileReferences(array $configuration): array + { + foreach ($configuration as $key => $value) { + if (is_array($value)) { + $configuration[$key] = $this->replaceLanguageFileReferences($value); + } elseif (is_string($value) && str_starts_with($value, 'LLL:')) { + $configuration[$key] = $this->getLanguageService()->sL($value); + } + } + return $configuration; + } + + /** + * Replaces absolute EXT: paths with relative web paths. + * + * Recursively processes the configuration array and converts all EXT: paths + * to publicly accessible web paths. + * + * @param array $configuration The configuration to process + * @return array The configuration with resolved paths + */ + private function replaceAbsolutePathsToRelativeResourcesPath(array $configuration): array + { + foreach ($configuration as $key => $value) { + if (is_array($value)) { + $configuration[$key] = $this->replaceAbsolutePathsToRelativeResourcesPath($value); + } elseif ( + is_string($value) + && $value !== '' + && PathUtility::isExtensionPath(strtoupper($value), true) + ) { + $configuration[$key] = $this->resolveUrlPath($value); + } + } + return $configuration; + } + + /** + * Resolves a system resource to an absolute web URL. + * + * @param string $value The resource path (e.g., 'EXT:my_extension/Resources/Public/Css/file.css') + * @return string The public web URL to the resource + */ + private function resolveUrlPath(string $value): string + { + $resource = $this->systemResourceFactory->createPublicResource($value); + return (string)$this->resourcePublisher->generateUri($resource, null); + } + + private function getBackendUser(): BackendUserAuthentication + { + return $GLOBALS['BE_USER']; + } + + private function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } +} diff --git a/Classes/Service/TranslationService.php b/Classes/Service/TranslationService.php new file mode 100644 index 0000000..05812c5 --- /dev/null +++ b/Classes/Service/TranslationService.php @@ -0,0 +1,583 @@ +getRequest(); + $languageService = $this->createLanguageService($locale, $request); + + if (!empty($locallangPathAndFilename) && $request) { + $this->applyTypoScriptOverrides($languageService, $locallangPathAndFilename, $request); + } + + $fullReference = !empty($locallangPathAndFilename) ? $locallangPathAndFilename . ':' . $key : $key; + $value = $languageService->label($fullReference, $arguments ?? []); + return $value ?? $defaultValue; + } + + /** + * Recursively translate values. + * + * @return array the modified array + * @internal + */ + public function translateValuesRecursive(array $array, array $translationFiles = []): array + { + $result = $array; + foreach ($result as $key => $value) { + if (is_array($value)) { + $result[$key] = $this->translateValuesRecursive($value, $translationFiles); + } else { + $translationFiles = $this->sortArrayWithIntegerKeysDescending($translationFiles); + + if (!empty($translationFiles)) { + foreach ($translationFiles as $translationFile) { + $translatedValue = $this->translate($value, null, $translationFile, null); + if (!empty($translatedValue)) { + $result[$key] = $translatedValue; + break; + } + } + } else { + $result[$key] = $this->translate($value, null, null, null, $value); + } + } + } + return $result; + } + + /** + * @return array the modified array + * @internal + */ + public function translateToAllBackendLanguages( + string $key, + ?array $arguments = null, + array $translationFiles = [] + ): array { + $result = []; + $translationFiles = $this->sortArrayWithIntegerKeysDescending($translationFiles); + + foreach ($this->locales->getActiveLanguages() as $language) { + $result[$language] = $key; + foreach ($translationFiles as $translationFile) { + $translatedValue = $this->translate($key, $arguments, $translationFile, $language, $key); + if ($translatedValue !== $key) { + $result[$language] = $translatedValue; + break; + } + } + } + + return $result; + } + + /** + * @throws \InvalidArgumentException + */ + public function translateFinisherOption( + FormRuntime $formRuntime, + string $finisherIdentifier, + string $optionKey, + string $optionValue, + array $renderingOptions = [] + ): string { + if (empty($finisherIdentifier)) { + throw new \InvalidArgumentException('The argument "finisherIdentifier" is empty', 1476216059); + } + if (empty($optionKey)) { + throw new \InvalidArgumentException('The argument "optionKey" is empty', 1476216060); + } + + if (in_array($optionKey, $renderingOptions['propertiesExcludedFromTranslation'] ?? [], true)) { + return $optionValue; + } + + $finisherIdentifier = preg_replace('/Finisher$/', '', $finisherIdentifier); + $translationFiles = $renderingOptions['translationFiles'] ?? []; + if (empty($translationFiles)) { + $translationFiles = $formRuntime->getRenderingOptions()['translation']['translationFiles']; + } + + $translationFiles = $this->sortArrayWithIntegerKeysDescending($translationFiles); + + if (isset($renderingOptions['translatePropertyValueIfEmpty'])) { + $translatePropertyValueIfEmpty = (bool)$renderingOptions['translatePropertyValueIfEmpty']; + } else { + $translatePropertyValueIfEmpty = true; + } + + if (empty($optionValue) && !$translatePropertyValueIfEmpty) { + return $optionValue; + } + + $locale = null; + if (isset($renderingOptions['language'])) { + $locale = $renderingOptions['language']; + } + + try { + $arguments = ArrayUtility::getValueByPath($renderingOptions['arguments'] ?? [], $optionKey, '.'); + } catch (MissingArrayPathException $e) { + $arguments = []; + } + + $originalFormIdentifier = null; + if (isset($formRuntime->getRenderingOptions()['_originalIdentifier'])) { + $originalFormIdentifier = $formRuntime->getRenderingOptions()['_originalIdentifier']; + } + + $translationKeyChain = $this->keychainBuilder->buildForFinisherOption( + $translationFiles, + $formRuntime->getIdentifier(), + $finisherIdentifier, + $optionKey, + $originalFormIdentifier + ); + + $translatedValue = $this->processTranslationChain($translationKeyChain, $locale, $arguments); + $translatedValue = $this->isEmptyTranslatedValue($translatedValue) ? $optionValue : $translatedValue; + + return $translatedValue; + } + + /** + * @throws \InvalidArgumentException + * @internal + */ + public function translateFormElementValue( + RootRenderableInterface $element, + array $propertyParts, + FormRuntime $formRuntime, + Locale|string|null $locale = null, + ): array|string|null { + if (empty($propertyParts)) { + throw new \InvalidArgumentException('The argument "propertyParts" is empty', 1476216007); + } + + $propertyType = 'properties'; + $property = implode('.', $propertyParts); + $renderingOptions = $element->getRenderingOptions(); + + if ($property === 'label') { + $defaultValue = $element->getLabel(); + } elseif ($property === 'defaultValue' && $element instanceof FormElementInterface) { + $defaultValue = $element->getDefaultValue(); + } else { + if ($element instanceof FormElementInterface) { + try { + $defaultValue = ArrayUtility::getValueByPath($element->getProperties(), $propertyParts, '.'); + } catch (MissingArrayPathException $exception) { + $defaultValue = null; + } + } else { + $propertyType = 'renderingOptions'; + try { + $defaultValue = ArrayUtility::getValueByPath($renderingOptions, $propertyParts, '.'); + } catch (MissingArrayPathException $exception) { + $defaultValue = null; + } + } + } + + if (isset($renderingOptions['translation']['translatePropertyValueIfEmpty'])) { + $translatePropertyValueIfEmpty = $renderingOptions['translation']['translatePropertyValueIfEmpty']; + } else { + $translatePropertyValueIfEmpty = true; + } + + if ($this->isEmptyTranslatedValue($defaultValue) && !$translatePropertyValueIfEmpty) { + return $defaultValue; + } + + $defaultValue = $this->isEmptyTranslatedValue($defaultValue) ? '' : $defaultValue; + $translationFiles = $renderingOptions['translation']['translationFiles'] ?? []; + if (empty($translationFiles)) { + $translationFiles = $formRuntime->getRenderingOptions()['translation']['translationFiles']; + } + + $translationFiles = $this->sortArrayWithIntegerKeysDescending($translationFiles); + + if (!$locale && isset($renderingOptions['translation']['language'])) { + $locale = $renderingOptions['translation']['language']; + } + + try { + $arguments = ArrayUtility::getValueByPath($renderingOptions['translation']['arguments'] ?? [], $propertyParts, '.'); + } catch (MissingArrayPathException $e) { + $arguments = []; + } + + $originalFormIdentifier = null; + if (isset($formRuntime->getRenderingOptions()['_originalIdentifier'])) { + $originalFormIdentifier = $formRuntime->getRenderingOptions()['_originalIdentifier']; + } + + $elementIsFormRuntime = $element instanceof FormRuntime; + $elementIdentifier = $element->getIdentifier(); + $elementType = $element->getType(); + + if ($property === 'options' && is_array($defaultValue)) { + foreach ($defaultValue as $optionValue => &$optionLabel) { + if ($elementIsFormRuntime) { + $translationKeyChain = $this->keychainBuilder->buildForFormRuntimeOption( + $translationFiles, + $formRuntime->getIdentifier(), + $elementIdentifier, + $elementType, + $propertyType, + $property, + $optionValue, + $originalFormIdentifier + ); + } else { + $translationKeyChain = $this->keychainBuilder->buildForElementOption( + $translationFiles, + $formRuntime->getIdentifier(), + $elementIdentifier, + $elementType, + $propertyType, + $property, + $optionValue, + $originalFormIdentifier + ); + } + + $translatedValue = $this->processTranslationChain($translationKeyChain, $locale, $arguments); + $optionLabel = $this->isEmptyTranslatedValue($translatedValue) ? $optionLabel : $translatedValue; + } + $translatedValue = $defaultValue; + } elseif ($property === 'fluidAdditionalAttributes') { + // "fluidAdditionalAttributes" is a globally available property and is used across all built-in + // form templates. However, it's not necessarily defined in the form configuration. This can lead to + // an empty string as default value, which is invalid. This check makes sure that an array is returned + // even if the property is not defined. + if (!is_array($defaultValue)) { + $defaultValue = []; + } + foreach ($defaultValue as $propertyName => &$propertyValue) { + if ($elementIsFormRuntime) { + $translationKeyChain = $this->keychainBuilder->buildForFormRuntimeProperty( + $translationFiles, + $formRuntime->getIdentifier(), + $elementIdentifier, + $elementType, + $propertyType, + $propertyName, + $originalFormIdentifier + ); + } else { + $translationKeyChain = $this->keychainBuilder->buildForElementProperty( + $translationFiles, + $formRuntime->getIdentifier(), + $elementIdentifier, + $elementType, + $propertyType, + $propertyName, + $originalFormIdentifier + ); + } + + $translatedValue = $this->processTranslationChain($translationKeyChain, $locale, $arguments); + $propertyValue = $this->isEmptyTranslatedValue($translatedValue) ? $propertyValue : $translatedValue; + } + $translatedValue = $defaultValue; + } else { + if ($elementIsFormRuntime) { + $translationKeyChain = $this->keychainBuilder->buildForFormRuntimeProperty( + $translationFiles, + $formRuntime->getIdentifier(), + $elementIdentifier, + $elementType, + $propertyType, + $property, + $originalFormIdentifier + ); + } else { + $translationKeyChain = $this->keychainBuilder->buildForElementProperty( + $translationFiles, + $formRuntime->getIdentifier(), + $elementIdentifier, + $elementType, + $propertyType, + $property, + $originalFormIdentifier + ); + } + + $translatedValue = $this->processTranslationChain($translationKeyChain, $locale, $arguments); + $translatedValue = $this->isEmptyTranslatedValue($translatedValue) ? $defaultValue : $translatedValue; + } + + return $translatedValue; + } + + /** + * @throws \InvalidArgumentException + * @internal + */ + public function translateFormElementError( + RootRenderableInterface $element, + int $code, + array $arguments, + string $defaultValue, + FormRuntime $formRuntime + ): string { + if (empty($code)) { + throw new \InvalidArgumentException('The argument "code" is empty', 1489272978); + } + + if ($element instanceof FormElementInterface) { + $validationErrors = $element->getProperties()['validationErrorMessages'] ?? null; + if (is_array($validationErrors)) { + foreach ($validationErrors as $validationError) { + if ((int)$validationError['code'] === $code) { + return sprintf($validationError['message'], ...$arguments); + } + } + } + } + + $renderingOptions = $element->getRenderingOptions(); + $translationFiles = $renderingOptions['translation']['translationFiles'] ?? []; + if (empty($translationFiles)) { + $translationFiles = $formRuntime->getRenderingOptions()['translation']['translationFiles']; + } + + $translationFiles = $this->sortArrayWithIntegerKeysDescending($translationFiles); + + $locale = null; + if (isset($renderingOptions['language'])) { + $locale = $renderingOptions['language']; + } + + $originalFormIdentifier = null; + if (isset($formRuntime->getRenderingOptions()['_originalIdentifier'])) { + $originalFormIdentifier = $formRuntime->getRenderingOptions()['_originalIdentifier']; + } + + if ($element instanceof FormRuntime) { + $translationKeyChain = $this->keychainBuilder->buildForFormRuntimeValidationError( + $translationFiles, + $formRuntime->getIdentifier(), + $element->getIdentifier(), + $code, + $originalFormIdentifier + ); + } else { + $translationKeyChain = $this->keychainBuilder->buildForValidationError( + $translationFiles, + $formRuntime->getIdentifier(), + $element->getIdentifier(), + $code, + $originalFormIdentifier + ); + } + + $translatedValue = $this->processTranslationChain($translationKeyChain, $locale, $arguments); + $translatedValue = $this->isEmptyTranslatedValue($translatedValue) ? $defaultValue : $translatedValue; + return $translatedValue; + } + + /** + * @return string|\Stringable|null + */ + protected function processTranslationChain( + array $translationKeyChain, + Locale|string|null $locale = null, + ?array $arguments = null + ) { + $request = $this->getRequest(); + $languageService = $this->createLanguageService($locale, $request); + $appliedOverridesForFiles = []; + + foreach ($translationKeyChain as $translationKey) { + if ($request) { + $fileRef = $this->extractFileReferenceFromKey($translationKey); + if ($fileRef !== '' && !isset($appliedOverridesForFiles[$fileRef])) { + $this->applyTypoScriptOverrides($languageService, $fileRef, $request); + $appliedOverridesForFiles[$fileRef] = true; + } + } + $translatedValue = $languageService->label($translationKey, $arguments ?? []); + if (!$this->isEmptyTranslatedValue($translatedValue)) { + return $translatedValue; + } + } + return null; + } + + /** + * If the array contains numerical keys only, sort it in descending order + */ + protected function sortArrayWithIntegerKeysDescending(array $array): array + { + if (count(array_filter(array_keys($array), 'is_string')) === 0) { + krsort($array); + } + return $array; + } + + /** + * Check if given translated value is considered "empty". + * + * A translated value is considered "empty" if it's either NULL or + * an empty string. This helper method exists to perform a less strict + * check than the native {@see empty()} function, because it is too + * strict in terms of supported translated values. For example, the + * value "0" is valid, whereas {@see empty()} would handle it as "empty" + * and therefore invalid. + */ + protected function isEmptyTranslatedValue(mixed $translatedValue): bool + { + if ($translatedValue === null) { + return true; + } + + if (is_string($translatedValue)) { + return trim($translatedValue) === ''; + } + + if (is_bool($translatedValue)) { + return !$translatedValue; + } + + if (is_array($translatedValue)) { + return $translatedValue === []; + } + + return false; + } + + /** + * Creates a LanguageService for the given locale or the locale from the current request. + * Returns a LanguageService (which implements TranslatorInterface) rather than the interface + * directly, since TypoScript label overrides require LanguageService-specific methods. + */ + private function createLanguageService(Locale|string|null $locale, ?ServerRequestInterface $request): LanguageService + { + if ($locale) { + return $this->languageServiceFactory->create($locale); + } + return $this->languageServiceFactory->create($this->locales->createLocaleFromRequest($request)); + } + + /** + * Applies TypoScript label overrides (plugin.tx_form._LOCAL_LANG) to the given language + * service for the specified file reference, if a frontend TypoScript setup is present. + */ + private function applyTypoScriptOverrides(LanguageService $languageService, string $fileRef, ServerRequestInterface $request): void + { + $typoScript = $request->getAttribute('frontend.typoscript'); + if ($typoScript instanceof FrontendTypoScript && $typoScript->hasSetup()) { + $overrideLabels = $languageService->loadTypoScriptLabelsFromExtension('form', $typoScript); + if ($overrideLabels !== []) { + $languageService->overrideLabels($fileRef, $overrideLabels); + } + } + } + + /** + * Extracts the file reference (domain) part from a full translation key reference such as + * 'EXT:my_ext/path/file.xlf:my.key' or 'LLL:EXT:my_ext/path/file.xlf:my.key'. + * Returns an empty string when no file reference can be determined. + */ + private function extractFileReferenceFromKey(string $key): string + { + $strippedKey = str_starts_with($key, 'LLL:') ? substr($key, 4) : $key; + $keyParts = explode(':', $strippedKey); + if (PathUtility::isExtensionPath($strippedKey)) { + // e.g. EXT:my_ext/path/file.xlf -> keyParts[0]='EXT', keyParts[1]='my_ext/path/file.xlf' + return $keyParts[0] . ':' . ($keyParts[1] ?? ''); + } + // Semantic domain, e.g. 'my.domain:my.key' -> 'my.domain' + return $keyParts[0]; + } + + private function getRequest(): ?ServerRequestInterface + { + return $GLOBALS['TYPO3_REQUEST'] ?? null; + } +} diff --git a/Classes/Slot/FilePersistenceSlot.php b/Classes/Slot/FilePersistenceSlot.php new file mode 100644 index 0000000..9c9343b --- /dev/null +++ b/Classes/Slot/FilePersistenceSlot.php @@ -0,0 +1,187 @@ +hashService->hmac($content, self::class); + } + + /** + * Allows invocation for a particular combination of command and file + * identifier. Commands providing new content have to submit a HMAC + * signature on the content as well. + * + * @see getContentSignature + */ + public function allowInvocation(string $command, string $combinedFileIdentifier, ?string $contentSignature = null): bool + { + $index = $this->searchAllowedInvocation($command, $combinedFileIdentifier, $contentSignature); + if ($index !== null) { + return false; + } + $this->allowedInvocations[] = [ + 'command' => $command, + 'combinedFileIdentifier' => $combinedFileIdentifier, + 'contentSignature' => $contentSignature, + ]; + return true; + } + + #[AsEventListener('form-framework/creation')] + public function onPreFileCreate(BeforeFileCreatedEvent $event): void + { + $combinedFileIdentifier = $this->buildCombinedIdentifier($event->getFolder(), $event->getFileName()); + $this->assertFileName(self::COMMAND_FILE_CREATE, $combinedFileIdentifier); + } + + #[AsEventListener('form-framework/add')] + public function onPreFileAdd(BeforeFileAddedEvent $event): void + { + $combinedFileIdentifier = $this->buildCombinedIdentifier($event->getTargetFolder(), $event->getFileName()); + // While assertFileName() below also checks if it's a form definition + // we want an early return here to not file_get_contents() below which + // would be triggered on every file add() command otherwise. + if (!$this->isFormDefinition($combinedFileIdentifier)) { + return; + } + $this->assertFileName(self::COMMAND_FILE_ADD, $combinedFileIdentifier, (string)file_get_contents($event->getSourceFilePath())); + } + + #[AsEventListener('form-framework/rename')] + public function onPreFileRename(BeforeFileRenamedEvent $event): void + { + $combinedFileIdentifier = $this->buildCombinedIdentifier($event->getFile()->getParentFolder(), $event->getTargetFileName() ?? ''); + $this->assertFileName(self::COMMAND_FILE_RENAME, $combinedFileIdentifier); + } + + #[AsEventListener('form-framework/replace')] + public function onPreFileReplace(BeforeFileReplacedEvent $event): void + { + $combinedFileIdentifier = $this->buildCombinedIdentifier($event->getFile()->getParentFolder(), $event->getFile()->getName()); + $this->assertFileName(self::COMMAND_FILE_REPLACE, $combinedFileIdentifier); + } + + #[AsEventListener('form-framework/move')] + public function onPreFileMove(BeforeFileMovedEvent $event): void + { + // Skip check, in case file extension would not change during this + // command. In case e.g. "file.txt" shall be renamed to "file.form.yaml" + // the invocation still has to be granted. + // Any file moved to a recycle folder is accepted as well. + if ($this->isFormDefinition($event->getFile()->getIdentifier()) + && $this->isFormDefinition($event->getTargetFileName()) + || $this->isRecycleFolder($event->getFolder())) { + return; + } + $combinedFileIdentifier = $this->buildCombinedIdentifier($event->getFolder(), $event->getTargetFileName()); + $this->assertFileName(self::COMMAND_FILE_MOVE, $combinedFileIdentifier); + } + + #[AsEventListener('form-framework/update-content')] + public function onPreFileSetContents(BeforeFileContentsSetEvent $event): void + { + $combinedFileIdentifier = $this->buildCombinedIdentifier($event->getFile()->getParentFolder(), $event->getFile()->getName()); + $this->assertFileName(self::COMMAND_FILE_SET_CONTENTS, $combinedFileIdentifier, $event->getContent()); + } + + /** + * @throws FormDefinitionPersistenceException + */ + private function assertFileName(string $command, string $combinedFileIdentifier, ?string $content = null): void + { + if (!$this->isFormDefinition($combinedFileIdentifier)) { + return; + } + $contentSignature = null; + if ($content !== null) { + $contentSignature = $this->getContentSignature($content); + } + $allowedInvocationIndex = $this->searchAllowedInvocation($command, $combinedFileIdentifier, $contentSignature); + if ($allowedInvocationIndex === null) { + throw new FormDefinitionPersistenceException( + sprintf('Persisting form definition "%s" is denied', $combinedFileIdentifier), + 1530281202 + ); + } + unset($this->allowedInvocations[$allowedInvocationIndex]); + } + + private function searchAllowedInvocation(string $command, string $combinedFileIdentifier, ?string $contentSignature = null): ?int + { + foreach ($this->allowedInvocations as $index => $allowedInvocation) { + if ($command === $allowedInvocation['command'] + && $combinedFileIdentifier === $allowedInvocation['combinedFileIdentifier'] + && $contentSignature === $allowedInvocation['contentSignature'] + ) { + return $index; + } + } + return null; + } + + private function buildCombinedIdentifier(FolderInterface $folder, string $fileName): string + { + return sprintf('%d:%s%s', $folder->getStorage()->getUid(), $folder->getIdentifier(), $fileName); + } + + private function isFormDefinition(string $identifier): bool + { + return str_ends_with( + mb_strtolower($identifier), + FormPersistenceManagerInterface::FORM_DEFINITION_FILE_EXTENSION + ); + } + + private function isRecycleFolder(FolderInterface $folder): bool + { + $role = $folder->getStorage()->getRole($folder); + return $role === FolderInterface::ROLE_RECYCLER; + } +} diff --git a/Classes/Slot/FormDefinitionPersistenceException.php b/Classes/Slot/FormDefinitionPersistenceException.php new file mode 100644 index 0000000..d4d6504 --- /dev/null +++ b/Classes/Slot/FormDefinitionPersistenceException.php @@ -0,0 +1,24 @@ + + */ + protected $fileIdentifiers = []; + + public function __construct(private readonly HashService $hashService) {} + + #[AsEventListener('form-framework/resource-getPublicUrl')] + public function getPublicUrl(GeneratePublicUrlForResourceEvent $event): void + { + $resource = $event->getResource(); + if (!$resource instanceof FileInterface + || !$this->has($resource) + || $event->getStorage()->getDriverType() !== 'Local' + ) { + return; + } + $event->setPublicUrl($this->getStreamUrl($event->getResource())); + } + + public function add(FileInterface $resource): void + { + if ($this->has($resource)) { + return; + } + $this->fileIdentifiers[] = $resource->getIdentifier(); + } + + public function has(FileInterface $resource): bool + { + return in_array($resource->getIdentifier(), $this->fileIdentifiers, true); + } + + protected function getStreamUrl(ResourceInterface $resource): string + { + $queryParameterArray = ['eID' => 'dumpFile', 't' => '']; + if ($resource instanceof File) { + $queryParameterArray['f'] = $resource->getUid(); + $queryParameterArray['t'] = 'f'; + } elseif ($resource instanceof ProcessedFile) { + $queryParameterArray['p'] = $resource->getUid(); + $queryParameterArray['t'] = 'p'; + } + + $queryParameterArray['token'] = $this->hashService->hmac(implode('|', $queryParameterArray), 'resourceStorageDumpFile'); + $publicUrl = ''; + if (($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface) { + $publicUrl = GeneralUtility::locationHeaderUrl(PathUtility::getAbsoluteWebPath(Environment::getPublicPath() . '/index.php'), $GLOBALS['TYPO3_REQUEST']); + } + $publicUrl .= '?' . http_build_query($queryParameterArray, '', '&', PHP_QUERY_RFC3986); + return $publicUrl; + } +} diff --git a/Classes/SoftReference/FormPersistenceIdentifierSoftReferenceParser.php b/Classes/SoftReference/FormPersistenceIdentifierSoftReferenceParser.php new file mode 100644 index 0000000..a596995 --- /dev/null +++ b/Classes/SoftReference/FormPersistenceIdentifierSoftReferenceParser.php @@ -0,0 +1,116 @@ +setTokenIdBasePrefix($table, (string)$uid, $field, $structurePath); + $tokenId = $this->makeTokenID($content); + + // Handle extension paths (EXT:extension_key/...) + if (PathUtility::isExtensionPath($content)) { + return $this->createResultForExtensionReference($content, $tokenId); + } + + // Handle numeric database identifiers (uid) + if (MathUtility::canBeInterpretedAsInteger($content)) { + return $this->createResultForDatabaseReference($content, $tokenId); + } + + // Handle file storage identifiers (storage:/path) + try { + $file = $this->resourceFactory->retrieveFileOrFolderObject($content); + } catch (\Exception $e) { + // Top level catch to ensure useful following exception handling, because FAL throws top level exceptions. + // TYPO3\CMS\Core\Database\ReferenceIndex::getRelations() will check the return value of this hook with is_array() + // so we return null to tell getRelations() to do nothing. + return SoftReferenceParserResult::createWithoutMatches(); + } + + if ($file === null) { + return SoftReferenceParserResult::createWithoutMatches(); + } + + return SoftReferenceParserResult::create('{softref:' . $tokenId . '}', [ + $tokenId => [ + 'matchString' => $content, + 'subst' => [ + 'type' => 'db', + 'recordRef' => 'sys_file:' . $file->getUid(), + 'tokenID' => $tokenId, + 'tokenValue' => $content, + ], + ], + ]); + } + + private function createResultForExtensionReference(string $extensionReference, string $tokenId): SoftReferenceParserResult + { + return SoftReferenceParserResult::create('{softref:' . $tokenId . '}', [ + $tokenId => [ + 'matchString' => $extensionReference, + 'subst' => [ + 'type' => 'string', + 'tokenID' => $tokenId, + 'tokenValue' => $extensionReference, + ], + ], + ]); + } + + /** + * Create soft reference result for database identifiers (numeric uid) + * These are stored as db references in sys_refindex for tracking usage + */ + private function createResultForDatabaseReference(string $databaseReference, string $tokenId): SoftReferenceParserResult + { + return SoftReferenceParserResult::create('{softref:' . $tokenId . '}', [ + $tokenId => [ + 'matchString' => $databaseReference, + 'subst' => [ + 'type' => 'db', + 'recordRef' => FormDefinitionRepository::TABLE_NAME . ':' . $databaseReference, + 'tokenID' => $tokenId, + 'tokenValue' => $databaseReference, + ], + ], + ]); + } +} diff --git a/Classes/Storage/AbstractFileStorageAdapter.php b/Classes/Storage/AbstractFileStorageAdapter.php new file mode 100644 index 0000000..35eb4f4 --- /dev/null +++ b/Classes/Storage/AbstractFileStorageAdapter.php @@ -0,0 +1,173 @@ +storageRepository = $storageRepository; + } + + protected function hasValidFileExtension(string $identifier): bool + { + return str_ends_with($identifier, self::FORM_DEFINITION_FILE_EXTENSION); + } + + abstract public function exists(FormIdentifier $identifier): bool; + abstract public function existsByFormIdentifier(string $formIdentifier): bool; + abstract public function findAll(SearchCriteria $criteria): array; + + /** + * Build a user-friendly storageLocation label for display + * Each storage adapter implements this to provide appropriate storageLocation information + */ + abstract protected function buildStorageLocationLabel(string $persistenceIdentifier): string; + + /** + * This takes a form identifier and returns a unique persistence identifier for it. + * By default, this is just similar to the identifier. But if a form with the same persistence identifier already + * exists a suffix is appended until the persistence identifier is unique. + * + * @param string $formIdentifier lowerCamelCased form identifier + * @param string $storageLocation Path where the form should be saved (e.g., "1:/forms/") + * @return string unique form persistence identifier (e.g., "1:/forms/contact.form.yaml") + * @throws NoUniquePersistenceIdentifierException + * @throws PersistenceManagerException + */ + public function getUniquePersistenceIdentifier(string $formIdentifier, string $storageLocation): string + { + $storageLocation = rtrim($storageLocation, '/') . '/'; + $formPersistenceIdentifier = $storageLocation . $formIdentifier . self::FORM_DEFINITION_FILE_EXTENSION; + + if (!$this->exists(new FormIdentifier($formPersistenceIdentifier))) { + return $formPersistenceIdentifier; + } + + for ($attempts = 1; $attempts < 100; $attempts++) { + $formPersistenceIdentifier = $storageLocation . sprintf('%s_%d', $formIdentifier, $attempts) . self::FORM_DEFINITION_FILE_EXTENSION; + if (!$this->exists(new FormIdentifier($formPersistenceIdentifier))) { + return $formPersistenceIdentifier; + } + } + + $formPersistenceIdentifier = $storageLocation . sprintf('%s_%d', $formIdentifier, time()) . self::FORM_DEFINITION_FILE_EXTENSION; + if (!$this->exists(new FormIdentifier($formPersistenceIdentifier))) { + return $formPersistenceIdentifier; + } + + throw new NoUniquePersistenceIdentifierException( + sprintf('Could not find a unique persistence identifier for form identifier "%s" after %d attempts', $formIdentifier, $attempts), + 1764879439 + ); + } + + protected function extractMetaDataFromCouldBeFormDefinition(string $maybeRawFormDefinition): array + { + $metaDataProperties = ['identifier', 'type', 'label', 'prototypeName']; + $metaData = []; + foreach (explode(LF, $maybeRawFormDefinition) as $line) { + if (empty($line) || $line[0] === ' ') { + continue; + } + $parts = explode(':', $line, 2); + $key = trim($parts[0]); + if (!($parts[1] ?? null) || !in_array($key, $metaDataProperties, true)) { + continue; + } + if ($key === 'label') { + try { + $parsedLabelLine = Yaml::parse($line); + $value = $parsedLabelLine['label'] ?? ''; + } catch (ParseException) { + $value = ''; + } + } else { + $value = trim($parts[1], " '\"\r"); + } + $metaData[$key] = $value; + } + return $metaData; + } + + /** + * @throws PersistenceManagerException + */ + protected function generateErrorsIfFormDefinitionIsInvalidOrHasInvalidFileExtension(array $formDefinition, string $identifier): void + { + if (!$this->looksLikeAFormDefinitionArray($formDefinition) || !$this->hasValidFileExtension($identifier)) { + throw new PersistenceManagerException(sprintf('Form definition "%s" does not end with ".form.yaml".', $identifier), 1531160649); + } + } + + /** + * Check if array looks like a form definition + */ + protected function looksLikeAFormDefinitionArray(array $data): bool + { + return !empty($data['identifier']) && trim($data['type'] ?? '') === 'Form'; + } + + protected function looksLikeAFormDefinition(FormMetadata $formMetadata): bool + { + return !empty($formMetadata->identifier) && trim($formMetadata->type) === 'Form'; + } + + /** + * Check if form data matches search criteria + */ + protected function matchesCriteria(FormMetadata $formMetadata, SearchCriteria $criteria): bool + { + if ($criteria->searchTerm) { + $searchIn = strtolower( + $formMetadata->name . ' ' + . $formMetadata->identifier . ' ' + . $formMetadata->prototypeName . ' ' + . ($formMetadata->persistenceIdentifier ?? '') + ); + + if (!str_contains($searchIn, strtolower($criteria->searchTerm))) { + return false; + } + } + + return true; + } +} diff --git a/Classes/Storage/DatabaseStorageAdapter.php b/Classes/Storage/DatabaseStorageAdapter.php new file mode 100644 index 0000000..a69ff85 --- /dev/null +++ b/Classes/Storage/DatabaseStorageAdapter.php @@ -0,0 +1,352 @@ +extractUidFromIdentifier($identifier); + + $record = $this->repository->findByUid($uid); + if (!$record) { + throw new PersistenceManagerException( + sprintf('The form with uid "%s" could not be loaded.', $uid), + 1767199422 + ); + } + + $applicationType = $request !== null ? ApplicationType::fromRequest($request) : null; + // Skip permission checks in frontend context: Forms must be readable without a + // backend user session, so no backend permission checks are applied for frontend + // requests. In all other contexts (e.g. backend), permission checks are enforced. + if (!$applicationType?->isFrontend()) { + $this->permissionChecker->assertReadAccessForRecord($uid, $record); + } + + try { + $formDefinitionArray = json_decode($record['configuration'] ?? '', true, flags: JSON_THROW_ON_ERROR); + } catch (\JsonException $e) { + throw new PersistenceManagerException( + sprintf('The form definition for uid "%s" is invalid: %s', $uid, $e->getMessage()), + 1767199423, + $e + ); + } + + if (!is_array($formDefinitionArray)) { + throw new PersistenceManagerException( + sprintf('The form definition for uid "%s" is invalid.', $uid), + 1767199444 + ); + } + + $formDefinitionArray = $this->jsonObjectKeyOrderPreserver->restore($formDefinitionArray); + $formDefinitionArray['identifier'] = $record['identifier']; + + return FormData::fromArray($formDefinitionArray); + } + + /** + * @throws PersistenceManagerException + */ + public function write(FormIdentifier $identifier, FormData $data, ?StorageContext $context = null): FormIdentifier + { + if (!$this->exists($identifier)) { + $pid = 0; + + if (!$this->permissionChecker->hasWritePermission($pid)) { + throw new PersistenceManagerException( + 'Access denied: You do not have permission to create a form.', + 1767199435 + ); + } + + $uid = $this->repository->add($identifier->identifier, $pid, $data); + + if (!$uid) { + throw new PersistenceManagerException( + 'Failed to create form definition in database.', + 1767199424 + ); + } + + return new FormIdentifier((string)$uid); + } + + $uid = $this->extractUidFromIdentifier($identifier); + + $record = $this->repository->findByUid($uid); + if (!$record) { + throw new PersistenceManagerException( + sprintf('The form with uid "%s" could not be found.', $uid), + 1767199425 + ); + } + + $this->permissionChecker->assertWriteAccessForRecord($uid, $record); + + $result = $this->repository->update($uid, $data); + + if (!$result) { + throw new PersistenceManagerException( + sprintf('Failed to update form definition with uid "%s".', $uid), + 1767199426 + ); + } + + return $identifier; + } + + /** + * @throws PersistenceManagerException + */ + public function delete(FormIdentifier $identifier): void + { + $uid = $this->extractUidFromIdentifier($identifier); + + $record = $this->repository->findByUid($uid); + if (!$record) { + throw new PersistenceManagerException( + sprintf('The form with uid "%s" could not be found.', $uid), + 1767199431 + ); + } + + $this->permissionChecker->assertWriteAccessForRecord($uid, $record); + + $success = $this->repository->remove($uid); + + if (!$success) { + throw new PersistenceManagerException( + sprintf('Failed to delete form definition with uid "%s".', $uid), + 1767199427 + ); + } + } + + /** + * @throws PersistenceManagerException + */ + public function exists(FormIdentifier $identifier): bool + { + if (str_starts_with($identifier->identifier, 'NEW')) { + return false; + } + + $uid = $this->extractUidFromIdentifier($identifier); + $record = $this->repository->findByUid($uid); + + if ($record === null) { + return false; + } + + $pid = (int)($record['pid'] ?? -1); + return $this->permissionChecker->hasReadPermission($pid); + } + + public function existsByFormIdentifier(string $formIdentifier): bool + { + return $this->repository->existsByFormIdentifier($formIdentifier); + } + + /** + * Find all form definitions for listing. + * + * Uses findAllForListing() which only selects metadata columns (uid, pid, identifier, label) + * instead of the full configuration JSON. This avoids loading and parsing potentially large + * JSON blobs just for the form listing view. + */ + public function findAll(SearchCriteria $criteria): array + { + $rows = $this->repository->findAllForListing($criteria); + + $results = []; + foreach ($rows as $row) { + if ($row['uid'] === null) { + continue; + } + + $pageId = (int)($row['pid'] ?? 0); + $uid = (int)$row['uid']; + + if (!$this->permissionChecker->hasReadPermission($pageId)) { + continue; + } + + $persistenceIdentifier = (string)$uid; + + $hasWritePermission = $this->permissionChecker->hasWritePermission($pageId); + $metadata = new FormMetadata( + identifier: $row['identifier'] ?? '', + type: 'Form', + name: $row['label'] ?? $row['identifier'] ?? '', + prototypeName: 'standard', + persistenceIdentifier: $persistenceIdentifier, + readOnly: !$hasWritePermission, + removable: $hasWritePermission, + fileUid: null, + storageLocation: $this->getStorageLocationLabel(), + ); + + $results[] = $metadata; + } + + return $results; + } + + public function getFormManagerOptions(): array + { + if (!$this->permissionChecker->hasWritePermission(0)) { + return []; + } + + return [ + 'allowedStorageLocations' => [ + [ + 'value' => '0', + 'label' => $this->getStorageLocationLabel(), + ], + ], + ]; + } + + public function isAccessible(): bool + { + return $this->permissionChecker->hasWritePermission(0); + } + + public function isAllowedStorageLocation(string $storageLocation): bool + { + if (MathUtility::canBeInterpretedAsInteger($storageLocation)) { + return (int)$storageLocation === 0; + } + + return false; + } + + public function isAllowedPersistenceIdentifier(string $persistenceIdentifier): bool + { + if (str_starts_with($persistenceIdentifier, 'NEW')) { + return true; + } + + if (!MathUtility::canBeInterpretedAsInteger($persistenceIdentifier)) { + return false; + } + + if (!$this->isAccessible()) { + return false; + } + + $uid = (int)$persistenceIdentifier; + $record = $this->repository->findByUid($uid); + + return $record !== null; + } + + /** + * @throws PersistenceManagerException + */ + private function extractUidFromIdentifier(FormIdentifier $identifier): int + { + if (!MathUtility::canBeInterpretedAsInteger($identifier->identifier)) { + throw new PersistenceManagerException( + sprintf('Invalid database identifier "%s". Expected numeric UID.', $identifier->identifier), + 1767199428 + ); + } + + return (int)$identifier->identifier; + } + + private function getStorageLocationLabel(): string + { + $languageService = $this->getLanguageService(); + return $languageService?->sL('LLL:EXT:form/Resources/Private/Language/Database.xlf:' . $this->getLabel()) ?: 'Database'; + } + + private function getLanguageService(): ?LanguageService + { + return $GLOBALS['LANG'] ?? null; + } +} diff --git a/Classes/Storage/ExtensionStorageAdapter.php b/Classes/Storage/ExtensionStorageAdapter.php new file mode 100644 index 0000000..1f92806 --- /dev/null +++ b/Classes/Storage/ExtensionStorageAdapter.php @@ -0,0 +1,354 @@ +ensureValidPersistenceIdentifier($identifier->identifier); + $file = $identifier->identifier; + $formDefinition = $this->yamlSource->load([$file]); + $this->generateErrorsIfFormDefinitionIsInvalidOrHasInvalidFileExtension($formDefinition, $identifier->identifier); + return FormData::fromArray($formDefinition); + } + + public function write(FormIdentifier $identifier, FormData $data, ?StorageContext $context = null): FormIdentifier + { + if (!$this->hasValidFileExtension($identifier->identifier)) { + throw new PersistenceManagerException(sprintf('The file "%s" could not be saved.', $identifier->identifier), 1764879569); + } + + if (!$this->storageConfiguration->isAllowedToSaveToExtensionPaths()) { + throw new PersistenceManagerException('Save to extension paths is not allowed.', 1764879520); + } + if (!$this->isFileWithinAccessibleExtensionFolders($identifier->identifier)) { + throw new PersistenceManagerException( + sprintf('The file "%s" could not be saved. Please check your configuration option "persistenceManager.allowedExtensionPaths"', $identifier->identifier), + 1484073571 + ); + } + $fileToSave = GeneralUtility::getFileAbsFileName($identifier->identifier); + + try { + $this->yamlSource->save($fileToSave, $data->toArray()); + } catch (\Exception $e) { + throw new PersistenceManagerException( + sprintf('The file "%s" could not be saved: %s', $identifier->identifier, $e->getMessage()), + 1764879589, + $e + ); + } + return $identifier; + } + + public function delete(FormIdentifier $identifier): void + { + if (!$this->hasValidFileExtension($identifier->identifier)) { + throw new PersistenceManagerException(sprintf('The file "%s" could not be removed.', $identifier->identifier), 1764879609); + } + if (!$this->exists($identifier)) { + throw new PersistenceManagerException(sprintf('The file "%s" could not be removed.', $identifier->identifier), 1764879543); + } + if (!$this->storageConfiguration->isAllowedToDeleteFromExtensionPaths()) { + throw new PersistenceManagerException(sprintf('The file "%s" could not be removed.', $identifier->identifier), 1472239536); + } + if (!$this->isFileWithinAccessibleExtensionFolders($identifier->identifier)) { + $message = sprintf('The file "%s" could not be removed. Please check your configuration option "persistenceManager.allowedExtensionPaths"', $identifier->identifier); + throw new PersistenceManagerException($message, 1484073878); + } + $fileToDelete = GeneralUtility::getFileAbsFileName($identifier->identifier); + unlink($fileToDelete); + } + + public function exists(FormIdentifier $identifier): bool + { + $exists = false; + if ($this->hasValidFileExtension($identifier->identifier)) { + if ($this->isFileWithinAccessibleExtensionFolders($identifier->identifier)) { + $exists = file_exists(GeneralUtility::getFileAbsFileName($identifier->identifier)); + } + } + return $exists; + } + + public function existsByFormIdentifier(string $formIdentifier): bool + { + foreach ($this->retrieveYamlFilesFromExtensionFolders() as $identifier) { + $formMetadata = $this->loadMetaData($identifier); + if ($this->looksLikeAFormDefinition($formMetadata) && $formMetadata->identifier === $formIdentifier) { + return true; + } + } + return false; + } + + public function findAll(SearchCriteria $criteria): array + { + $results = []; + foreach ($this->retrieveYamlFilesFromExtensionFolders() as $identifier) { + $formMetadata = $this->loadMetaData($identifier); + + if (!$this->looksLikeAFormDefinition($formMetadata)) { + continue; + } + + if (!$this->hasValidFileExtension($identifier)) { + continue; + } + + $readOnly = !$this->storageConfiguration->isAllowedToSaveToExtensionPaths(); + $formMetadata = $formMetadata->withReadOnly($readOnly); + + $removable = $this->storageConfiguration->isAllowedToDeleteFromExtensionPaths(); + $formMetadata = $formMetadata->withRemovable($removable); + + if (!$this->matchesCriteria($formMetadata, $criteria)) { + continue; + } + + $results[] = $formMetadata; + } + + return $results; + } + + /** + * Return a list of all accessible extension folders + * + * Only registered mount points from + * persistenceManager.allowedExtensionPaths + * are listed. + */ + public function getAccessibleExtensionFolders(): array + { + $cacheKey = 'ext-form-accessibleExtensionFolders'; + + if ($this->runtimeCache->has($cacheKey)) { + return $this->runtimeCache->get($cacheKey); + } + + $extensionFolders = []; + $allowedExtensionPaths = $this->storageConfiguration->getAllowedExtensionPaths(); + + if (empty($allowedExtensionPaths)) { + $this->runtimeCache->set($cacheKey, $extensionFolders); + return $extensionFolders; + } + + foreach ($allowedExtensionPaths as $allowedExtensionPath) { + if (!PathUtility::isExtensionPath($allowedExtensionPath)) { + continue; + } + $allowedExtensionFullPath = GeneralUtility::getFileAbsFileName($allowedExtensionPath); + if (!file_exists($allowedExtensionFullPath)) { + continue; + } + $allowedExtensionPath = rtrim($allowedExtensionPath, '/') . '/'; + $extensionFolders[$allowedExtensionPath] = $allowedExtensionFullPath; + } + + $this->runtimeCache->set($cacheKey, $extensionFolders); + return $extensionFolders; + } + + /** + * Retrieves yaml files from extension folders for further processing. + * At this time it's not determined yet, whether these files contain form data. + * + * @return string[] + */ + protected function retrieveYamlFilesFromExtensionFolders(): array + { + $filesFromExtensionFolders = []; + foreach ($this->getAccessibleExtensionFolders() as $relativePath => $fullPath) { + foreach (new \DirectoryIterator($fullPath) as $fileInfo) { + if ($fileInfo->getExtension() !== 'yaml') { + continue; + } + $filesFromExtensionFolders[] = $relativePath . $fileInfo->getFilename(); + } + } + return $filesFromExtensionFolders; + } + + protected function loadMetaData(string $fileOrIdentifier): FormMetadata + { + $this->ensureValidPersistenceIdentifier($fileOrIdentifier); + $persistenceIdentifier = $fileOrIdentifier; + $rawYamlContent = false; + $absoluteFilePath = GeneralUtility::getFileAbsFileName($fileOrIdentifier); + if ($absoluteFilePath !== '' && file_exists($absoluteFilePath)) { + $rawYamlContent = file_get_contents($absoluteFilePath); + } + + try { + if ($rawYamlContent === false) { + throw new NoSuchFileException(sprintf('YAML file "%s" could not be loaded', $persistenceIdentifier), 1524684462); + } + $yaml = $this->extractMetaDataFromCouldBeFormDefinition($rawYamlContent); + $this->generateErrorsIfFormDefinitionIsInvalidOrHasInvalidFileExtension($yaml, $persistenceIdentifier); + return FormMetadata::createFromYaml( + $yaml, + $persistenceIdentifier, + )->withStorageLocation($this->buildStorageLocationLabel($persistenceIdentifier)); + } catch (\Exception $e) { + return FormMetadata::createInvalid($persistenceIdentifier, $e->getMessage()); + } + } + + protected function isAccessibleExtensionFolder(string $folderName): bool + { + $folderName = rtrim($folderName, '/') . '/'; + return array_key_exists($folderName, $this->getAccessibleExtensionFolders()); + } + + protected function isFileWithinAccessibleExtensionFolders(string $fileName): bool + { + $pathInfo = PathUtility::pathinfo($fileName, PATHINFO_DIRNAME); + $dirName = rtrim($pathInfo, '/') . '/'; + return array_key_exists($dirName, $this->getAccessibleExtensionFolders()); + } + + /** + * @throws PersistenceManagerException + */ + protected function ensureValidPersistenceIdentifier(string $identifier): void + { + if (pathinfo($identifier, PATHINFO_EXTENSION) !== 'yaml') { + throw new PersistenceManagerException(sprintf('The file "%s" could not be loaded.', $identifier), 1764879628); + } + if (PathUtility::isExtensionPath($identifier) + && !$this->isFileWithinAccessibleExtensionFolders($identifier) + ) { + throw new PersistenceManagerException( + sprintf('The file "%s" could not be loaded. Please check your configuration option "persistenceManager.allowedExtensionPaths"', $identifier), + 1484071985 + ); + } + } + + /** + * Check if a storage location (extension folder) is allowed + */ + public function isAllowedStorageLocation(string $storageLocation): bool + { + // For extension storage, storageLocation is a folder path within allowed extensions + return $this->isAccessibleExtensionFolder($storageLocation); + } + + /** + * Check if a persistence identifier (full file path) is allowed + */ + public function isAllowedPersistenceIdentifier(string $persistenceIdentifier): bool + { + // For extension storage, persistence identifier is a full file path (EXT:...) + return $this->hasValidFileExtension($persistenceIdentifier) + && $this->isFileWithinAccessibleExtensionFolders($persistenceIdentifier); + } + + public function getFormManagerOptions(): array + { + $preparedAccessibleFormStorageFolders = []; + if ($this->storageConfiguration->isAllowedToSaveToExtensionPaths()) { + foreach ($this->getAccessibleExtensionFolders() as $relativePath => $fullPath) { + $preparedAccessibleFormStorageFolders[] = [ + 'label' => $relativePath, + 'value' => $relativePath, + ]; + } + } + return [ + 'allowedStorageLocations' => $preparedAccessibleFormStorageFolders, + ]; + } + + public function isAccessible(): bool + { + return $this->storageConfiguration->isAllowedToSaveToExtensionPaths() && !empty($this->getAccessibleExtensionFolders()); + } + + /** + * Build a user-friendly storage location label + * Format: "extension_key/Configuration/Forms/file.form.yaml" + */ + protected function buildStorageLocationLabel(string $persistenceIdentifier): string + { + return $persistenceIdentifier; + } +} diff --git a/Classes/Storage/JsonObjectKeyOrderPreserver.php b/Classes/Storage/JsonObjectKeyOrderPreserver.php new file mode 100644 index 0000000..5bf0a2b --- /dev/null +++ b/Classes/Storage/JsonObjectKeyOrderPreserver.php @@ -0,0 +1,110 @@ + label) keyed by option value. json_encode() of such a map + * produces a JSON *object*, and MySQL's native JSON column type does not + * guarantee that a JSON object's member order survives a write/read round + * trip. This is documented, spec-compliant behavior (RFC 8259: object + * member order "has no significance"). JSON *array* element order, by + * contrast, is reliably preserved by MySQL. + * + * MariaDB's JSON type is a plain LONGTEXT alias with a + * CHECK(JSON_VALID(...)) constraint, so it happens to preserve the exact + * text (and therefore object member order) byte-for-byte, which is why + * this only reproduces on real MySQL. + * + * Practical effect without this workaround: reordering a select element's + * options in the form editor visibly "works" right after saving, but + * reverts to the previous order on the next reload, once MySQL has + * renormalized the JSON object. + * + * protect() wraps every "options" map in an array-based structure before + * persisting, so the intended order survives via a JSON array instead of + * relying on object member order. restore() reverses this again after + * json_decode() on read, using the explicit order list rather than the + * member order MySQL happened to return the object in. + * + * Note: "options" is matched by key name rather than by resolving each + * renderable's prototype configuration for declared multi-value + * properties (as FormEditorController does for the editor UI). This is a + * deliberate simplification. It also protects option order inside + * variant overrides for free, without needing prototype/DI wiring in the + * persistence layer and is safe even where it over-applies, since + * protect()/restore() are lossless no-ops on any "options" map that + * doesn't need reordering. + * + * @internal + */ +final readonly class JsonObjectKeyOrderPreserver +{ + private const string MARKER = '__jsonKeyOrderProtected'; + + public function protect(array $formDefinition): array + { + $output = $formDefinition; + foreach ($formDefinition as $key => $value) { + if (!is_array($value)) { + continue; + } + if ($key === 'options' && !array_is_list($value)) { + $output[$key] = [ + self::MARKER => true, + 'order' => array_keys($value), + 'values' => $value, + ]; + continue; + } + $output[$key] = $this->protect($value); + } + return $output; + } + + public function restore(array $formDefinition): array + { + $output = $formDefinition; + foreach ($formDefinition as $key => $value) { + if (!is_array($value)) { + continue; + } + if ($key === 'options' && ($value[self::MARKER] ?? false) === true) { + $order = $value['order'] ?? []; + $values = $value['values'] ?? []; + $restored = []; + foreach ($order as $optionKey) { + if (array_key_exists($optionKey, $values)) { + $restored[$optionKey] = $values[$optionKey]; + unset($values[$optionKey]); + } + } + // Defensive fallback for entries the order list doesn't cover + // (should not normally happen, keeps old/foreign data intact). + $output[$key] = $restored + $values; + continue; + } + $output[$key] = $this->restore($value); + } + return $output; + } +} diff --git a/Classes/Storage/Permission/DatabasePermissionChecker.php b/Classes/Storage/Permission/DatabasePermissionChecker.php new file mode 100644 index 0000000..6680c1e --- /dev/null +++ b/Classes/Storage/Permission/DatabasePermissionChecker.php @@ -0,0 +1,152 @@ +hasBackendUser()) { + return false; + } + return $this->tcaSchemaFactory->has(FormDefinitionRepository::TABLE_NAME) + && $this->hasTableReadAccess() + && $this->hasPageAccess($pageId); + } + + /** + * Assert that the current backend user has read permissions for the page + * a given form record is stored on. + * + * @throws PersistenceManagerException + */ + public function assertReadAccessForRecord(int $uid, ?array $record): void + { + $pid = (int)($record['pid'] ?? throw new PersistenceManagerException( + sprintf('The form with uid "%d" has no valid pid.', $uid), + 1774364028 + )); + + if (!$this->hasReadPermission($pid)) { + throw new PersistenceManagerException( + sprintf('Access denied: You do not have permission to access forms on page "%d".', $pid), + 1774364031 + ); + } + } + + /** + * Check if the current backend user has write permissions for the given page + */ + public function hasWritePermission(int $pageId): bool + { + if (!$this->hasBackendUser()) { + return false; + } + return $this->tcaSchemaFactory->has(FormDefinitionRepository::TABLE_NAME) + && $this->hasTableWriteAccess() + && $this->hasPageAccess($pageId); + } + + /** + * Assert that the current backend user has write permissions for the page + * a given form record is stored on. + * + * @throws PersistenceManagerException + */ + public function assertWriteAccessForRecord(int $uid, ?array $record): void + { + $pid = (int)($record['pid'] ?? throw new PersistenceManagerException( + sprintf('The form with uid "%d" has no valid pid.', $uid), + 1767199436 + )); + + if (!$this->hasWritePermission($pid)) { + throw new PersistenceManagerException( + sprintf('Access denied: You do not have permission to persist forms on page "%d".', $pid), + 1767199442 + ); + } + } + + private function hasPageAccess(int $pageId): bool + { + $backendUser = $this->getBackendUser(); + if ($backendUser->isAdmin()) { + return true; + } + if ($pageId <= 0) { + return true; + } + + $pageRow = BackendUtility::getRecord('pages', $pageId); + if ($pageRow === null) { + return false; + } + + // For all other pages, check web mount and page permissions + if ($backendUser->isInWebMount($pageId) === null) { + return false; + } + return $backendUser->doesUserHaveAccess($pageRow, Permission::PAGE_SHOW); + } + + private function hasTableReadAccess(): bool + { + return $this->getBackendUser()->check('tables_select', FormDefinitionRepository::TABLE_NAME); + } + + private function hasTableWriteAccess(): bool + { + return $this->getBackendUser()->check('tables_modify', FormDefinitionRepository::TABLE_NAME); + } + + private function hasBackendUser(): bool + { + return ($GLOBALS['BE_USER'] ?? null) instanceof BackendUserAuthentication; + } + + private function getBackendUser(): BackendUserAuthentication + { + return $GLOBALS['BE_USER']; + } +} diff --git a/Classes/Storage/Security/FormDefinitionPersistenceCommand.php b/Classes/Storage/Security/FormDefinitionPersistenceCommand.php new file mode 100644 index 0000000..682a516 --- /dev/null +++ b/Classes/Storage/Security/FormDefinitionPersistenceCommand.php @@ -0,0 +1,31 @@ +findInvocationIndex($command, $identifier) !== null) { + return false; + } + $item = [ + 'command' => $command, + 'identifier' => $identifier, + ]; + if ($fields !== null) { + $processed = $this->processFields($fields); + $item['names'] = $processed['names']; + $item['hmac'] = $processed['hmac']; + } + $this->allowedInvocations[] = $item; + return true; + } + + /** + * Returns true if a matching invocation has been granted and not yet consumed. + * The provided fields must produce the same sorted key list and HMAC as + * the fields that were registered via allowInvocation(). + */ + public function isInvocationAllowed( + FormDefinitionPersistenceCommand $command, + string|int $identifier, + ?array $fields = null, + ): bool { + $index = $this->findInvocationIndex($command, $identifier); + if ($index === null) { + return false; + } + if ($fields === null) { + return true; + } + $item = $this->allowedInvocations[$index]; + $processed = $this->processFields($fields); + return $item['names'] === $processed['names'] && $item['hmac'] === $processed['hmac']; + } + + /** + * Consumes a matching invocation (removes it from the pending list). + * Called both by the hook after successful verification (single-use + * enforcement) and by the repository's finally block (cleanup). + */ + public function consumeInvocation( + FormDefinitionPersistenceCommand $command, + string|int $identifier, + ?array $fields = null, + ): void { + $index = $this->findInvocationIndex($command, $identifier); + if ($index === null) { + return; + } + if ($fields === null) { + unset($this->allowedInvocations[$index]); + return; + } + $item = $this->allowedInvocations[$index]; + $processed = $this->processFields($fields); + if ($item['names'] === $processed['names'] && $item['hmac'] === $processed['hmac']) { + unset($this->allowedInvocations[$index]); + } + } + + private function findInvocationIndex(FormDefinitionPersistenceCommand $command, string|int $identifier): ?int + { + foreach ($this->allowedInvocations as $index => $invocation) { + if ($invocation['command'] === $command && $invocation['identifier'] === $identifier) { + return $index; + } + } + return null; + } + + /** + * Sorts fields alphabetically and returns an array with keys 'names' and 'hmac'. + * + * @return array{names: list, hmac: string} + */ + private function processFields(array $fields): array + { + ksort($fields); + return [ + 'names' => array_keys($fields), + 'hmac' => $this->hashService->hmac( + json_encode($fields, JSON_THROW_ON_ERROR), + FormDefinitionPersistenceGuard::class, + HashAlgo::SHA3_384 + ), + ]; + } +} diff --git a/Classes/Storage/StorageAdapterFactory.php b/Classes/Storage/StorageAdapterFactory.php new file mode 100644 index 0000000..24403ee --- /dev/null +++ b/Classes/Storage/StorageAdapterFactory.php @@ -0,0 +1,151 @@ + + */ + private array $adapters; + + /** + * @param iterable $adapters + */ + public function __construct(iterable $adapters) + { + $this->adapters = $this->sortAdaptersByPriority($adapters); + } + + /** + * Get storage adapter that can handle the given persistence identifier + * + * Uses Chain of Responsibility pattern to find the first adapter + * (in priority order) that supports the given identifier. + * + * @param string $identifier Persistence identifier (e.g., "EXT:my_extension/Forms/contact.form.yaml", "1:/forms/contact.form.yaml") + * @throws \RuntimeException if no adapter can handle the identifier + */ + public function getAdapterForIdentifier(string $identifier): StorageAdapterInterface + { + foreach ($this->adapters as $adapter) { + if ($adapter->supports($identifier)) { + return $adapter; + } + } + + throw new \RuntimeException( + sprintf( + 'No storage adapter found that can handle identifier "%s". Registered adapters: %s', + $identifier, + implode(', ', array_map(fn($a) => $a->getTypeIdentifier(), $this->adapters)) + ), + 1731672000 + ); + } + + /** + * Get adapter by type identifier + * + * @param string $typeIdentifier Type identifier (e.g., 'extension', 'filemount') + * @throws \InvalidArgumentException if no adapter with this type identifier exists + */ + public function getAdapterByType(string $typeIdentifier): StorageAdapterInterface + { + foreach ($this->adapters as $adapter) { + if ($adapter->getTypeIdentifier() === $typeIdentifier) { + return $adapter; + } + } + + throw new \InvalidArgumentException( + sprintf( + 'No storage adapter found with type identifier "%s". Available types: %s', + $typeIdentifier, + implode(', ', array_map(fn($a) => $a->getTypeIdentifier(), $this->adapters)) + ), + 1731672002 + ); + } + + /** + * Check if an adapter with the given type identifier exists + */ + public function hasAdapterType(string $typeIdentifier): bool + { + foreach ($this->adapters as $adapter) { + if ($adapter->getTypeIdentifier() === $typeIdentifier) { + return true; + } + } + return false; + } + + /** + * Get all registered storage adapters + * + * @return list + */ + public function getAllAdapters(): array + { + return $this->adapters; + } + + /** + * Get all registered storage type identifiers + * + * @return list + */ + public function getRegisteredTypeIdentifiers(): array + { + return array_map( + fn(StorageAdapterInterface $adapter) => $adapter->getTypeIdentifier(), + $this->adapters + ); + } + + /** + * Sort adapters by priority (highest first) + * + * @param iterable $adapters + * @return list + */ + private function sortAdaptersByPriority(iterable $adapters): array + { + $sortedAdapters = [...$adapters]; + + usort( + $sortedAdapters, + fn(StorageAdapterInterface $a, StorageAdapterInterface $b) => $b->getPriority() <=> $a->getPriority() + ); + + return $sortedAdapters; + } +} diff --git a/Classes/Storage/StorageAdapterInterface.php b/Classes/Storage/StorageAdapterInterface.php new file mode 100644 index 0000000..2f718ef --- /dev/null +++ b/Classes/Storage/StorageAdapterInterface.php @@ -0,0 +1,186 @@ + + */ + public function findAll(SearchCriteria $criteria): array; + + /** + * Get unique persistence identifier for a new form in this storage + * + * @param string $formIdentifier The form identifier (e.g., "contact-form") + * @param string $storageLocation The save path (e.g., "1:/forms/" for filemount, pid for database) + * @return string Unique persistence identifier + * @throws NoUniquePersistenceIdentifierException + */ + public function getUniquePersistenceIdentifier(string $formIdentifier, string $storageLocation): string; + + /** + * Check if a storage location is allowed for this adapter + * + * For database storage: storageLocation is a PID + * For file storage: storageLocation is a folder path (e.g., "1:/forms/") + * + * @param string $storageLocation The storage location to check + * @return bool True if the storage location is allowed + */ + public function isAllowedStorageLocation(string $storageLocation): bool; + + /** + * Check if a persistence identifier is allowed for this adapter + * + * For database storage: identifier is a UID or NEW* + * For file storage: identifier is a full file path (e.g., "1:/forms/contact.form.yaml") + * + * @param string $persistenceIdentifier The persistence identifier to check + * @return bool True if the persistence identifier is allowed + */ + public function isAllowedPersistenceIdentifier(string $persistenceIdentifier): bool; +} diff --git a/Classes/Type/FormDefinitionArray.php b/Classes/Type/FormDefinitionArray.php new file mode 100644 index 0000000..93f23f1 --- /dev/null +++ b/Classes/Type/FormDefinitionArray.php @@ -0,0 +1,24 @@ +getFileBasedForms(); + $count = count($forms); + + if ($count === 0) { + return 'No file-based form definitions found.'; + } + + $description = sprintf( + 'Found %d file-based form definition(s) that will be migrated to database storage:', + $count + ); + + foreach ($forms as $form) { + $description .= LF . sprintf( + ' • %s (%s)', + $form->name, + $form->persistenceIdentifier ?? $form->identifier + ); + } + + $description .= LF . LF . 'After migration, all tt_content references will be updated automatically.'; + $description .= LF . LF . 'Note: Only references in tt_content (CType form_formframework) are updated ' + . 'automatically. If your installation uses form persistence identifiers in custom ' + . 'database tables or FlexForm fields outside tt_content, these references must be ' + . 'updated manually.'; + $description .= LF . LF . 'The original YAML files WILL BE DELETED after successful migration. ' + . 'Please ensure backups exist. Failures will be logged and can be found in their ' + . 'configured log locations after execution, and should be reviewed.'; + + return $description; + } + + public function getConfirmation(): Confirmation + { + return new Confirmation( + 'Migrate forms to database?', + 'This will move all filemount-based form definitions into the database ' + . 'and update content element references in tt_content. ' + . 'References in custom database tables or FlexForm fields outside tt_content ' + . 'are NOT updated automatically and must be migrated manually. ' + . 'The original YAML files will be deleted after successful migration. ' + . 'YAML files in extension directories are not affected. ' + . 'Please make sure you have a backup before proceeding.', + false, + 'Yes, migrate forms to database', + 'No, keep file-based storage' + ); + } + + public function updateNecessary(): bool + { + return $this->getFileBasedForms() !== []; + } + + public function executeUpdate(): bool + { + $forms = $this->getFileBasedForms(); + + if ($forms === []) { + return true; + } + + $success = true; + $migrationMap = []; + $migratedFiles = []; + + foreach ($forms as $form) { + $persistenceIdentifier = $form->persistenceIdentifier ?? $form->identifier; + + try { + $formData = $this->readForm($persistenceIdentifier); + } catch (\Exception $e) { + $this->logger->error('Failed to load form definition from "{identifier}": {message}', [ + 'identifier' => $persistenceIdentifier, + 'message' => $e->getMessage(), + ]); + $success = false; + continue; + } + + // Check if this form was already migrated (by identifier) + $existingUid = $this->formDefinitionRepository->findUidByFormIdentifier($formData->identifier); + if ($existingUid !== null) { + $this->logger->info('Form "{identifier}" already exists in database, skipping.', [ + 'identifier' => $formData->identifier, + ]); + // Still track mapping for reference updates + $migrationMap[$persistenceIdentifier] = $existingUid; + $migratedFiles[] = $persistenceIdentifier; + continue; + } + + // Write to database using raw insert (no DataHandler required, + // so this works in Install Tool context without a backend user) + try { + $newUid = $this->formDefinitionRepository->addRaw(0, $formData); + } catch (\Exception $e) { + $this->logger->error('Database insert failed for form "{identifier}": {message}', [ + 'identifier' => $formData->identifier, + 'message' => $e->getMessage(), + ]); + $newUid = null; + } + + if ($newUid === null) { + $this->logger->error('Failed to insert form "{identifier}" into database.', [ + 'identifier' => $formData->identifier, + 'persistenceIdentifier' => $persistenceIdentifier, + ]); + $success = false; + continue; + } + + $migrationMap[$persistenceIdentifier] = $newUid; + $migratedFiles[] = $persistenceIdentifier; + + $this->logger->info('Migrated form "{identifier}" from "{file}" to database UID {uid}.', [ + 'identifier' => $formData->identifier, + 'file' => $persistenceIdentifier, + 'uid' => $newUid, + ]); + } + + // Update tt_content FlexForm references + if ($migrationMap !== []) { + // Convert int UIDs to string for the service (persistenceIdentifier values are always strings) + $stringMap = array_map(strval(...), $migrationMap); + $referencesUpdated = $this->formTransferService->updateContentElementReferences($stringMap); + $this->logger->info('Updated {count} content element reference(s).', [ + 'count' => $referencesUpdated, + ]); + } + + // Delete original YAML files only when all forms were migrated successfully. + // If any migration failed, keep all files to allow re-running the wizard. + if ($success && $migratedFiles !== []) { + $deletedCount = $this->deleteOriginalFiles($migratedFiles); + $this->logger->info('Deleted {count} of {total} original YAML file(s).', [ + 'count' => $deletedCount, + 'total' => count($migratedFiles), + ]); + } elseif (!$success && $migratedFiles !== []) { + $this->logger->warning( + 'Some forms could not be migrated. Original YAML files were kept to allow re-running the wizard.' + ); + } + + return $success; + } + + public function getPrerequisites(): array + { + return [ + DatabaseUpdatedPrerequisite::class, + ]; + } + + /** + * Find all YAML form definitions in configured file mounts. + * + * @return list + */ + private function getFileBasedForms(): array + { + try { + $results = []; + foreach ($this->retrieveYamlFilesFromStorageFolders() as $file) { + $formMetadata = $this->loadMetaData($file); + + if (!$this->looksLikeAFormDefinition($formMetadata)) { + continue; + } + + if (!$this->hasValidFileExtension($file->getCombinedIdentifier())) { + continue; + } + $results[] = $formMetadata; + } + return $results; + } catch (\Exception $e) { + $this->logger->warning('Could not list file-based forms: {message}', [ + 'message' => $e->getMessage(), + ]); + return []; + } + } + + /** + * Delete original YAML files from file storage after successful migration. + * + * Files that cannot be deleted (e.g. due to permissions) are logged but + * do not cause the overall migration to fail — the database records are + * already the authoritative source at this point. + * + * @param list $persistenceIdentifiers Combined identifiers (e.g. "1:/form_definitions/contact.form.yaml") + * @return int Number of successfully deleted files + */ + private function deleteOriginalFiles(array $persistenceIdentifiers): int + { + $deletedCount = 0; + + foreach ($persistenceIdentifiers as $persistenceIdentifier) { + try { + $this->deleteForm($persistenceIdentifier); + $deletedCount++; + + $this->logger->info('Deleted original YAML file "{identifier}".', [ + 'identifier' => $persistenceIdentifier, + ]); + } catch (\Exception $e) { + $this->logger->warning('Could not delete original YAML file "{identifier}": {message}', [ + 'identifier' => $persistenceIdentifier, + 'message' => $e->getMessage(), + ]); + } + } + + return $deletedCount; + } + + private function readForm(string $identifier): FormData + { + $file = $this->retrieveFileByPersistenceIdentifier($identifier); + $formDefinition = $this->yamlSource->load([$file]); + $this->generateErrorsIfFormDefinitionIsValidButHasInvalidFileExtension($formDefinition, $identifier); + return FormData::fromArray($formDefinition); + } + + private function deleteForm(string $identifier): void + { + if (!$this->hasValidFileExtension($identifier)) { + throw new PersistenceManagerException(sprintf('The file "%s" could not be removed.', $identifier), 1472239534); + } + if (!$this->exists($identifier)) { + throw new PersistenceManagerException(sprintf('The file "%s" could not be removed.', $identifier), 1764879545); + } + [$storageUid, $fileIdentifier] = explode(':', $identifier, 2); + $storage = $this->getStorageByUid((int)$storageUid); + $file = $storage->getFile($fileIdentifier); + if (!$storage->checkFileActionPermission('delete', $file)) { + throw new PersistenceManagerException(sprintf('No delete access to file "%s".', $identifier), 1472239516); + } + $storage->deleteFile($file); + } + + /** + * @throws PersistenceManagerException + * @throws NoSuchFileException + */ + private function retrieveFileByPersistenceIdentifier(string $identifier): File + { + $this->ensureValidPersistenceIdentifier($identifier); + try { + $file = $this->resourceFactory->retrieveFileOrFolderObject($identifier); + } catch (\Exception) { + // Top level catch to ensure useful following exception handling, because FAL throws top level exceptions. + $file = null; + } + if ($file === null) { + throw new NoSuchFileException(sprintf('YAML file "%s" could not be loaded', $identifier), 1524684442); + } + if (!$file->getStorage()->checkFileActionPermission('read', $file)) { + throw new PersistenceManagerException(sprintf('No read access to file "%s".', $identifier), 1471630578); + } + return $file; + } + + /** + * @throws PersistenceManagerException + */ + private function ensureValidPersistenceIdentifier(string $identifier): void + { + if (pathinfo($identifier, PATHINFO_EXTENSION) !== 'yaml') { + throw new PersistenceManagerException(sprintf('The file "%s" could not be loaded.', $identifier), 1477679819); + } + } + + /** + * @throws PersistenceManagerException + */ + private function generateErrorsIfFormDefinitionIsValidButHasInvalidFileExtension(array $formDefinition, string $identifier): void + { + if ($this->looksLikeAFormDefinitionArray($formDefinition) && !$this->hasValidFileExtension($identifier)) { + throw new PersistenceManagerException(sprintf('Form definition "%s" does not end with ".form.yaml".', $identifier), 1780660703); + } + } + + /** + * Check if array looks like a form definition + */ + private function looksLikeAFormDefinitionArray(array $data): bool + { + return !empty($data['identifier']) && trim($data['type'] ?? '') === 'Form'; + } + + private function hasValidFileExtension(string $identifier): bool + { + return str_ends_with($identifier, FormPersistenceManagerInterface::FORM_DEFINITION_FILE_EXTENSION); + } + + private function exists(string $identifier): bool + { + $exists = false; + if ($this->hasValidFileExtension($identifier) && $this->pathIsIntendedAsFileMountPath($identifier)) { + [$storageUid, $fileIdentifier] = explode(':', $identifier, 2); + $storage = $this->getStorageByUid((int)$storageUid); + $exists = $storage->hasFile($fileIdentifier); + } + return $exists; + } + + /** + * Returns a ResourceStorage for a given uid + * + * @throws PersistenceManagerException + */ + private function getStorageByUid(int $storageUid): ResourceStorage + { + $storage = $this->storageRepository->findByUid($storageUid); + if (!$storage?->isBrowsable()) { + throw new PersistenceManagerException(sprintf('Could not access storage with uid "%d".', $storageUid), 1471630581); + } + return $storage; + } + + private function pathIsIntendedAsFileMountPath(string $path): bool + { + if (empty($path)) { + return false; + } + [$storageUid, $pathIdentifier] = explode(':', $path, 2); + if (empty($storageUid) || empty($pathIdentifier)) { + return false; + } + return MathUtility::canBeInterpretedAsInteger($storageUid); + } + + /** + * Retrieves yaml files from storage folders for further processing. + * At this time it's not determined yet, whether these files contain form data. + * + * @return File[] + */ + private function retrieveYamlFilesFromStorageFolders(): array + { + $filesFromStorageFolders = []; + $fileExtensionFilter = GeneralUtility::makeInstance(FileExtensionFilter::class); + $fileExtensionFilter->setAllowedFileExtensions(['yaml']); + foreach ($this->getAccessibleFormStorageFolders() as $folder) { + $storage = $folder->getStorage(); + $storage->setFileAndFolderNameFilters([ + [$fileExtensionFilter, 'filterFileList'], + ]); + $files = $folder->getFiles(0, 0, Folder::FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS, true); + array_push($filesFromStorageFolders, ...array_values($files)); + $storage->resetFileAndFolderNameFiltersToDefault(); + } + return $filesFromStorageFolders; + } + + /** + * Return a list of all accessible file mountpoints for the + * current backend user. + * + * Only registered mount points from + * persistenceManager.allowedFileMounts + * are listed. + * + * @return Folder[] + */ + private function getAccessibleFormStorageFolders(): array + { + $storageFolders = []; + $allowedFileMounts = $this->storageConfiguration->getPersistenceManagerConfiguration()->allowedFileMounts; + + if (empty($allowedFileMounts)) { + return $storageFolders; + } + + foreach ($allowedFileMounts as $allowedFileMount) { + $allowedFileMount = rtrim($allowedFileMount, '/') . '/'; + [$storageUid, $fileMountPath] = explode(':', $allowedFileMount, 2); + try { + $storage = $this->getStorageByUid((int)$storageUid); + } catch (PersistenceManagerException) { + continue; + } + $isStorageFileMount = false; + $parentFolder = $storage->getRootLevelFolder(false); + foreach ($storage->getFileMounts() as $storageFileMount) { + $storageFileMountFolder = $storageFileMount['folder']; + // Normally should use ResourceStorage::isWithinFolder() to check if the configured file mount path is within + // a storage file mount but this requires a valid Folder object and thus a directory which already exists. + // And the folder could simply not exist yet. + if (str_starts_with($fileMountPath, $storageFileMountFolder->getIdentifier())) { + $isStorageFileMount = true; + $parentFolder = $storageFileMountFolder; + } + } + // Get storage folder object, create it if missing + try { + $fileMountFolder = $storage->getFolder($fileMountPath); + } catch (InsufficientFolderAccessPermissionsException) { + continue; + } catch (FolderDoesNotExistException) { + if ($isStorageFileMount) { + $fileMountPath = substr( + $fileMountPath, + strlen($parentFolder->getIdentifier()) + ); + } + try { + $fileMountFolder = $storage->createFolder($fileMountPath, $parentFolder); + } catch (InsufficientFolderAccessPermissionsException) { + continue; + } + } + $storageFolders[$allowedFileMount] = $fileMountFolder; + } + return $storageFolders; + } + + private function loadMetaData(File $file): FormMetadata + { + $persistenceIdentifier = $file->getCombinedIdentifier(); + $rawYamlContent = $file->getContents(); + + try { + $yaml = $this->extractMetaDataFromCouldBeFormDefinition($rawYamlContent); + $this->generateErrorsIfFormDefinitionIsValidButHasInvalidFileExtension($yaml, $persistenceIdentifier); + return FormMetadata::createFromYaml( + $yaml, + $persistenceIdentifier, + $file->getUid() + ); + } catch (\Exception $e) { + return FormMetadata::createInvalid($persistenceIdentifier, $e->getMessage()); + } + } + + private function extractMetaDataFromCouldBeFormDefinition(string $maybeRawFormDefinition): array + { + $metaDataProperties = ['identifier', 'type', 'label', 'prototypeName']; + $metaData = []; + foreach (explode(LF, $maybeRawFormDefinition) as $line) { + if (empty($line) || $line[0] === ' ') { + continue; + } + $parts = explode(':', $line, 2); + $key = trim($parts[0]); + if (!($parts[1] ?? null) || !in_array($key, $metaDataProperties, true)) { + continue; + } + if ($key === 'label') { + try { + $parsedLabelLine = Yaml::parse($line); + $value = $parsedLabelLine['label'] ?? ''; + } catch (ParseException) { + $value = ''; + } + } else { + $value = trim($parts[1], " '\"\r"); + } + $metaData[$key] = $value; + } + return $metaData; + } + + private function looksLikeAFormDefinition(FormMetadata $formMetadata): bool + { + return !empty($formMetadata->identifier) && trim($formMetadata->type) === 'Form'; + } + +} diff --git a/Classes/Utility/DateRangeValidatorPatterns.php b/Classes/Utility/DateRangeValidatorPatterns.php new file mode 100644 index 0000000..998acf4 --- /dev/null +++ b/Classes/Utility/DateRangeValidatorPatterns.php @@ -0,0 +1,66 @@ +registerArgument('contentElementUid', 'int', 'The uid of a content element'); + $this->registerArgument('formPersistenceIdentifier', 'string', 'The form persistence identifier for return URL', false, ''); + } + + public function render(): string + { + $content = ''; + $contentElementUid = $this->arguments['contentElementUid']; + $contentRecord = BackendUtility::getRecord('tt_content', $contentElementUid); + $request = null; + if ($this->renderingContext->hasAttribute(ServerRequestInterface::class)) { + $request = $this->renderingContext->getAttribute(ServerRequestInterface::class); + } + if (!empty($contentRecord) && $request !== null) { + $backendLayout = GeneralUtility::makeInstance(BackendLayout::class, 'dummy', 'dummy', []); + $pageId = (int)$contentRecord['pid']; + $pageContext = $request->getAttribute('pageContext'); + if (!$pageContext instanceof PageContext) { + try { + $pageContext = $this->pageContextFactory->createFromRequest($request, $pageId, $this->getBackendUser()); + } catch (\Exception $e) { + return ''; + } + } + + $manipulatedRequest = $this->getManipulatedRequestToFormEditor($request, $contentRecord); + + $pageLayoutContext = GeneralUtility::makeInstance( + PageLayoutContext::class, + $pageContext, + $backendLayout, + DrawingConfiguration::create($backendLayout, BackendUtility::getPagesTSconfig($pageId), PageViewMode::LayoutView), + $manipulatedRequest + ); + $gridColumn = GeneralUtility::makeInstance(GridColumn::class, $pageLayoutContext, []); + $contentRecord = $this->recordFactory->createResolvedRecordFromDatabaseRow('tt_content', $contentRecord, null, $pageLayoutContext->getRecordIdentityMap()); + $columnItem = GeneralUtility::makeInstance(GridColumnItem::class, $pageLayoutContext, $gridColumn, $contentRecord); + return $columnItem->getPreview(); + } + return $content; + } + + private function getBackendUser(): BackendUserAuthentication + { + return $GLOBALS['BE_USER']; + } + + /** + * Create a manipulated request with custom NormalizedParams to override the return URL. + * This allows customizing the return URL used by PageLayoutContext->getReturnUrl() + * without modifying the original request or the PageLayoutContext logic. + */ + private function getManipulatedRequestToFormEditor(ServerRequestInterface $request, array $contentRecord): ServerRequestInterface + { + $serverParams = $request->getServerParams(); + $serverParams['REQUEST_URI'] = $this->buildCustomReturnUrl($request, $contentRecord); + + $customNormalizedParams = NormalizedParams::createFromServerParams($serverParams); + + return $request->withAttribute('normalizedParams', $customNormalizedParams); + } + + /** + * Build the custom return URL for the form editor. + * Generates the URL to FormEditor->index action with the formPersistenceIdentifier parameter. + */ + private function buildCustomReturnUrl(ServerRequestInterface $request, array $contentRecord): string + { + $formPersistenceIdentifier = $this->arguments['formPersistenceIdentifier'] ?? ''; + + if (empty($formPersistenceIdentifier)) { + return $request->getAttribute('normalizedParams')->getRequestUri(); + } + + $uri = $this->uriBuilder->buildUriFromRoute( + 'form_editor', + ['formPersistenceIdentifier' => $formPersistenceIdentifier] + ); + return (string)$uri; + } +} diff --git a/Classes/ViewHelpers/Form/UploadDeleteCheckboxViewHelper.php b/Classes/ViewHelpers/Form/UploadDeleteCheckboxViewHelper.php new file mode 100644 index 0000000..19679b6 --- /dev/null +++ b/Classes/ViewHelpers/Form/UploadDeleteCheckboxViewHelper.php @@ -0,0 +1,117 @@ + + * ``` + * + * Scope: frontend + * + * @see https://docs.typo3.org/permalink/t3viewhelper:typo3-form-form-uploaddeletecheckbox + */ +final class UploadDeleteCheckboxViewHelper extends AbstractFormFieldViewHelper +{ + /** + * @var string + */ + protected $tagName = 'input'; + + public function __construct( + private readonly HashService $hashService, + ) { + parent::__construct(); + } + + public function initializeArguments(): void + { + parent::initializeArguments(); + $this->registerArgument('fileReference', FileReference::class, 'The file reference object', true); + $this->registerArgument('fileIndex', 'int', 'Index of the file in multiple upload context', false, 0); + } + + public function render(): string + { + /** @var FileReference|null $fileReference */ + $fileReference = $this->arguments['fileReference']; + $fileIndex = (int)$this->arguments['fileIndex']; + + // Early return if no file reference given + if (!$fileReference instanceof FileReference) { + return ''; + } + + $this->tag->addAttribute('type', 'checkbox'); + + // Build the deletion data that will be validated on submit + $deleteData = [ + 'property' => $this->arguments['property'], + 'fileIndex' => $fileIndex, + 'fileUid' => $fileReference->getUid() ?? $fileReference->getOriginalResource()->getOriginalFile()->getUid(), + ]; + + // Create HMAC-signed value + $valueAttribute = $this->hashService->appendHmac( + json_encode($deleteData, JSON_THROW_ON_ERROR), + HashScope::DeleteFile->prefix() + ); + + // Build name attribute using the form field prefix + $name = $this->getName(); + $nameAttribute = $name . '[__deleteFile][' . $fileIndex . ']'; + + $this->tag->addAttribute('name', $nameAttribute); + $this->tag->addAttribute('value', $valueAttribute); + + // Check if this checkbox was previously checked (in case of validation errors) + if ($this->isChecked($fileIndex)) { + $this->tag->addAttribute('checked', 'checked'); + } + + return $this->tag->render(); + } + + /** + * Checks if the checkbox for the given file index was checked in the current request + */ + private function isChecked(int $fileIndex): bool + { + $value = $this->getValueAttribute(); + if (is_array($value) && isset($value['__deleteFile'][$fileIndex])) { + return !empty($value['__deleteFile'][$fileIndex]); + } + return false; + } +} diff --git a/Classes/ViewHelpers/Form/UploadedResourceViewHelper.php b/Classes/ViewHelpers/Form/UploadedResourceViewHelper.php new file mode 100644 index 0000000..c7e92fd --- /dev/null +++ b/Classes/ViewHelpers/Form/UploadedResourceViewHelper.php @@ -0,0 +1,162 @@ +registerArgument('as', 'string', ''); + $this->registerArgument('accept', 'array', 'Values for the accept attribute', false, []); + $this->registerArgument('errorClass', 'string', 'CSS class to set if there are errors for this ViewHelper', false, 'f3-form-error'); + $this->registerArgument('multiple', 'boolean', 'Defines the upload element accepting multiple files', false, false); + } + + public function render(): string + { + $output = ''; + + $name = $this->getName(); + $as = $this->arguments['as']; + $accept = $this->arguments['accept']; + $multiple = $this->arguments['multiple']; + $resource = $this->getUploadedResource(); + + if (!empty($accept)) { + $this->tag->addAttribute('accept', implode(',', $accept)); + } + + if ($resource !== null) { + if ($resource instanceof FileReference) { + $resourcePointerValue = $resource->getUid() ?? ('file:' . $resource->getOriginalResource()->getOriginalFile()->getUid()); + $output .= $this->buildResourcePointerInput( + 0, + (string)$resourcePointerValue, + $this->buildResourcePointerIdAttribute(), + ); + } elseif ($resource instanceof ObjectStorage) { + foreach ($resource as $file) { + $index = $resource->getPosition($file); + $resourcePointerValue = $file->getUid() ?? ('file:' . $file->getOriginalResource()->getOriginalFile()->getUid()); + $output .= $this->buildResourcePointerInput( + $index, + (string)$resourcePointerValue, + $this->buildResourcePointerIdAttribute('-' . $index), + ); + } + } + + $this->templateVariableContainer->add($as, $resource); + $output .= $this->renderChildren(); + $this->templateVariableContainer->remove($as); + } + + foreach (['name', 'type', 'tmp_name', 'error', 'size'] as $fieldName) { + $this->registerFieldNameForFormTokenGeneration($name . '[' . $fieldName . ']'); + } + $this->tag->addAttribute('type', 'file'); + + if ($multiple === true) { + $this->tag->addAttribute('name', $name . '[]'); + $this->tag->addAttribute('multiple', true); + } else { + $this->tag->addAttribute('name', $name); + } + + $this->setErrorClassAttribute(); + $output .= $this->tag->render(); + + return $output; + } + + private function buildResourcePointerInput(int $index, string $resourcePointerValue, string $idAttribute): string + { + $name = htmlspecialchars($this->getName()); + $hmac = htmlspecialchars($this->hashService->appendHmac($resourcePointerValue, HashScope::ResourcePointer->prefix())); + return ''; + } + + private function buildResourcePointerIdAttribute(string $suffix = ''): string + { + if (!isset($this->additionalArguments['id'])) { + return ''; + } + return ' id="' . htmlspecialchars($this->additionalArguments['id']) . '-file-reference' . $suffix . '"'; + } + + /** + * Return a previously uploaded resource. + * Return NULL if errors occurred during property mapping for this property. + */ + private function getUploadedResource(): FileReference|ObjectStorage|null + { + if ($this->getMappingResultsForProperty()->hasErrors()) { + return null; + } + $resource = $this->getValueAttribute(); + if ($resource instanceof ObjectStorage) { + return $resource; + } + if ($resource instanceof FileReference) { + // When multiple uploads are enabled but the stored value is a single + // FileReference, wrap it in an ObjectStorage so that the Fluid template's + // f:for ViewHelper receives an iterable instead of crashing. + if ($this->arguments['multiple']) { + $storage = new ObjectStorage(); + $storage->attach($resource); + return $storage; + } + return $resource; + } + return $this->propertyMapper->convert($resource, FileReference::class); + } +} diff --git a/Classes/ViewHelpers/FormViewHelper.php b/Classes/ViewHelpers/FormViewHelper.php new file mode 100644 index 0000000..15fe29f --- /dev/null +++ b/Classes/ViewHelpers/FormViewHelper.php @@ -0,0 +1,92 @@ +getFormRuntime(); + $prefix = $this->prefixFieldName($this->getFormObjectName()); + + $markup = $this->createHiddenInputElement( + $prefix . '[__state]', + $this->hashService->appendHmac( + base64_encode(serialize($formRuntime->getFormState())), + HashScope::FormState->prefix(), + HashAlgo::SHA3_256 + ) + ); + + // ONLY assign `__session` if form is performing (uncached) + if ($formRuntime->canProcessFormSubmission() && $formRuntime->getFormSession() !== null) { + $markup .= $this->createHiddenInputElement( + $prefix . '[__session]', + $formRuntime->getFormSession()->getAuthenticatedIdentifier() + ); + } + return $markup; + } + + private function createHiddenInputElement(string $name, string $value): string + { + $tagBuilder = GeneralUtility::makeInstance(TagBuilder::class, 'input'); + $tagBuilder->addAttribute('type', 'hidden'); + $tagBuilder->addAttribute('name', $name); + $tagBuilder->addAttribute('value', $value); + return $tagBuilder->render(); + } + + /** + * We do NOT return NULL as in this case, the Form ViewHelpers do not enter $objectAccessorMode. + * However, we return the form identifier. + */ + protected function getFormObjectName(): string + { + return $this->getFormRuntime()->getFormDefinition()->getIdentifier(); + } + + private function getFormRuntime(): FormRuntime + { + return $this->arguments['object']; + } +} diff --git a/Classes/ViewHelpers/GridColumnClassAutoConfigurationViewHelper.php b/Classes/ViewHelpers/GridColumnClassAutoConfigurationViewHelper.php new file mode 100644 index 0000000..f863f4d --- /dev/null +++ b/Classes/ViewHelpers/GridColumnClassAutoConfigurationViewHelper.php @@ -0,0 +1,110 @@ +registerArgument('element', RootRenderableInterface::class, 'A RootRenderableInterface instance', true); + } + + public function render(): string + { + $formElement = $this->arguments['element']; + + if ($formElement instanceof RenderableInterface && !$formElement->isEnabled()) { + return ''; + } + + $gridRowElement = $formElement->getParentRenderable(); + $gridRowChildElements = $gridRowElement->getElements(); + $gridViewPortConfiguration = $gridRowElement->getProperties()['gridColumnClassAutoConfiguration']; + if (empty($gridViewPortConfiguration)) { + return ''; + } + $gridSize = (int)$gridViewPortConfiguration['gridSize']; + $columnsToCalculate = []; + $usedColumns = []; + foreach ($gridRowChildElements as $childElement) { + if ($childElement instanceof RenderableInterface && !$childElement->isEnabled()) { + continue; + } + if (empty($childElement->getProperties()['gridColumnClassAutoConfiguration'])) { + foreach ($gridViewPortConfiguration['viewPorts'] as $viewPortName => $configuration) { + $columnsToCalculate[$viewPortName]['elements'] = ($columnsToCalculate[$viewPortName]['elements'] ?? 0) + 1; + } + } else { + $gridColumnViewPortConfiguration = $childElement->getProperties()['gridColumnClassAutoConfiguration']; + foreach ($gridViewPortConfiguration['viewPorts'] as $viewPortName => $configuration) { + $configuration = $gridColumnViewPortConfiguration['viewPorts'][$viewPortName] ?? []; + if ( + isset($configuration['numbersOfColumnsToUse']) + && (int)$configuration['numbersOfColumnsToUse'] > 0 + ) { + $usedColumns[$viewPortName]['sum'] = ($usedColumns[$viewPortName]['sum'] ?? 0); + $usedColumns[$viewPortName]['sum'] += (int)$configuration['numbersOfColumnsToUse']; + if ($childElement->getIdentifier() === $formElement->getIdentifier()) { + $usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'] = (int)$configuration['numbersOfColumnsToUse']; + if ($usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'] > $gridSize) { + $usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'] = $gridSize; + } + } + } else { + $columnsToCalculate[$viewPortName]['elements'] = ($columnsToCalculate[$viewPortName]['elements'] ?? 0) + 1; + } + } + } + } + $classes = []; + foreach ($gridViewPortConfiguration['viewPorts'] as $viewPortName => $configuration) { + if (isset($usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse'])) { + $numbersOfColumnsToUse = $usedColumns[$viewPortName]['concreteNumbersOfColumnsToUse']; + } else { + $restColumnsToDivide = $gridSize - ($usedColumns[$viewPortName]['sum'] ?? 0); + $restElements = (int)$columnsToCalculate[$viewPortName]['elements']; + + if ($restColumnsToDivide < 1) { + $restColumnsToDivide = $gridSize; + } + $numbersOfColumnsToUse = floor($restColumnsToDivide / $restElements); + } + + $classes[] = str_replace( + '{@numbersOfColumnsToUse}', + (string)$numbersOfColumnsToUse, + $configuration['classPattern'] + ); + } + return implode(' ', $classes); + } +} diff --git a/Classes/ViewHelpers/RenderAllFormValuesViewHelper.php b/Classes/ViewHelpers/RenderAllFormValuesViewHelper.php new file mode 100644 index 0000000..d3d7b78 --- /dev/null +++ b/Classes/ViewHelpers/RenderAllFormValuesViewHelper.php @@ -0,0 +1,74 @@ +registerArgument('renderable', RootRenderableInterface::class, 'A RootRenderableInterface instance', true); + $this->registerArgument('as', 'string', 'The name within the template', false, 'formValue'); + } + + /** + * Return array element by key. + */ + public function render(): string + { + $renderable = $this->arguments['renderable']; + if ($renderable instanceof CompositeRenderableInterface) { + $elements = $renderable->getRenderablesRecursively(); + } else { + $elements = [$renderable]; + } + $as = $this->arguments['as']; + $output = ''; + foreach ($elements as $element) { + $output .= $this->renderingContext->getViewHelperInvoker()->invoke( + RenderFormValueViewHelper::class, + [ + 'renderable' => $element, + 'as' => $as, + ], + $this->renderingContext, + $this->renderChildren(...), + ); + } + return $output; + } +} diff --git a/Classes/ViewHelpers/RenderFormValueViewHelper.php b/Classes/ViewHelpers/RenderFormValueViewHelper.php new file mode 100644 index 0000000..1d6e015 --- /dev/null +++ b/Classes/ViewHelpers/RenderFormValueViewHelper.php @@ -0,0 +1,207 @@ +registerArgument('renderable', RenderableInterface::class, 'A renderable element', true); + $this->registerArgument('as', 'string', 'The name within the template', false, 'formValue'); + } + + /** + * Return array element by key + */ + public function render(): string + { + $element = $this->arguments['renderable']; + if (!$element instanceof FormElementInterface || !self::isEnabled($element)) { + return ''; + } + $renderingOptions = $element->getRenderingOptions(); + if ($renderingOptions['_isSection'] ?? false) { + $data = [ + 'element' => $element, + 'isSection' => true, + ]; + } elseif ($renderingOptions['_isCompositeFormElement'] ?? false) { + return ''; + } else { + $formRuntime = $this->renderingContext + ->getViewHelperVariableContainer() + ->get(RenderRenderableViewHelper::class, 'formRuntime'); + $value = $formRuntime[$element->getIdentifier()]; + $data = [ + 'element' => $element, + 'value' => $value, + 'processedValue' => $this->processElementValue($element, $value), + 'isMultiValue' => is_iterable($value), + ]; + } + $variableProvider = new ScopedVariableProvider($this->renderingContext->getVariableProvider(), new StandardVariableProvider([$this->arguments['as'] => $data])); + $this->renderingContext->setVariableProvider($variableProvider); + $output = (string)$this->renderChildren(); + $this->renderingContext->setVariableProvider($variableProvider->getGlobalVariableProvider()); + return $output; + } + + /** + * Converts the given value to a simple type (string or array) considering the underlying FormElement definition. + * + * @param mixed $value + * @return mixed + */ + private function processElementValue( + FormElementInterface $element, + $value + ) { + $properties = $element->getProperties(); + $options = $properties['options'] ?? null; + if ($element->getType() === 'CountrySelect') { + $country = $this->countryProvider->getByIsoCode($value ?? ''); + if ($country !== null) { + return (string)LocalizationUtility::translate($country->getLocalizedNameLabel()); + } + } + if (is_array($options)) { + $options = (array)$this->renderingContext->getViewHelperInvoker()->invoke( + TranslateElementPropertyViewHelper::class, + ['element' => $element, 'property' => 'options'], + $this->renderingContext, + $this->renderChildren(...), + ); + if (is_array($value)) { + return self::mapValuesToOptions($value, $options); + } + return self::mapValueToOption($value, $options); + } + if ($value instanceof ObjectStorage) { + $result = []; + foreach ($value as $item) { + $result[] = is_object($item) ? self::processObject($element, $item) : $item; + } + return $result; + } + if (is_object($value)) { + return self::processObject($element, $value); + } + return $value; + } + + /** + * Replaces the given values (=keys) with the corresponding elements in $options. + * + * @see mapValueToOption() + */ + private static function mapValuesToOptions(array $value, array $options): array + { + $result = []; + foreach ($value as $key) { + $result[] = self::mapValueToOption($key, $options); + } + return $result; + } + + /** + * Replaces the given value (=key) with the corresponding element in $options + * If the key does not exist in $options, it is returned without modification + * + * @param mixed $value + * @return mixed + */ + private static function mapValueToOption($value, array $options) + { + return $options[$value] ?? $value; + } + + /** + * Converts the given $object to a string representation considering the $element FormElement definition. + * + * @param object $object + */ + private static function processObject(FormElementInterface $element, $object): string + { + if ($element instanceof StringableFormElementInterface) { + return $element->valueToString($object); + } + + if ($object instanceof \DateTime) { + return $object->format(\DateTimeInterface::W3C); + } + + if ($object instanceof File || $object instanceof FileReference) { + if ($object instanceof FileReference) { + $object = $object->getOriginalResource(); + } + + return $object->getName(); + } + + if (method_exists($object, '__toString')) { + return (string)$object; + } + + return 'Object [' . get_class($object) . ']'; + } + + private static function isEnabled(RenderableInterface $renderable): bool + { + if (!$renderable->isEnabled()) { + return false; + } + while ($renderable = $renderable->getParentRenderable()) { + if (!$renderable->isEnabled()) { + return false; + } + } + return true; + } +} diff --git a/Classes/ViewHelpers/RenderRenderableViewHelper.php b/Classes/ViewHelpers/RenderRenderableViewHelper.php new file mode 100644 index 0000000..b175158 --- /dev/null +++ b/Classes/ViewHelpers/RenderRenderableViewHelper.php @@ -0,0 +1,84 @@ +registerArgument('renderable', RootRenderableInterface::class, 'A RenderableInterface instance', true); + } + + public function render(): string + { + /** @var FormRuntime $formRuntime */ + $formRuntime = $this->renderingContext + ->getViewHelperVariableContainer() + ->get(self::class, 'formRuntime'); + $renderable = $this->arguments['renderable']; + $this->eventDispatcher->dispatch(new BeforeRenderableIsRenderedEvent($renderable, $formRuntime)); + $content = ''; + if ($renderable instanceof FormRuntime || ($renderable instanceof RenderableInterface && $renderable->isEnabled())) { + $content = $this->renderChildren(); + } + // Wrap every renderable with a span with an identifier path data attribute if previewMode is active + if (!empty($content)) { + $renderingOptions = $formRuntime->getRenderingOptions(); + if (isset($renderingOptions['previewMode']) && $renderingOptions['previewMode'] === true) { + $path = $renderable->getIdentifier(); + if ($renderable instanceof RenderableInterface) { + while ($renderable = $renderable->getParentRenderable()) { + $path = $renderable->getIdentifier() . '/' . $path; + } + } + $content = '' . $content . ''; + } + } + return $content; + } +} diff --git a/Classes/ViewHelpers/RenderViewHelper.php b/Classes/ViewHelpers/RenderViewHelper.php new file mode 100644 index 0000000..5a25c14 --- /dev/null +++ b/Classes/ViewHelpers/RenderViewHelper.php @@ -0,0 +1,104 @@ + + * + * The factory class must implement :php:`TYPO3\CMS\Form\Domain\Factory\FormFactoryInterface`. + * + * Scope: frontend + * + * @see https://docs.typo3.org/permalink/t3viewhelper:typo3-form-render + */ +final class RenderViewHelper extends AbstractViewHelper +{ + /** + * @var bool + */ + protected $escapeOutput = false; + + public function __construct( + private readonly FormPersistenceManagerInterface $formPersistenceManager, + private readonly ExtbaseConfigurationManagerInterface $extbaseConfigurationManager, + ) {} + + public function initializeArguments(): void + { + $this->registerArgument('persistenceIdentifier', 'string', 'The persistence identifier for the form.'); + $this->registerArgument('factoryClass', 'string', 'The fully qualified class name of the factory', false, ArrayFormFactory::class); + $this->registerArgument('prototypeName', 'string', 'Name of the prototype to use'); + $this->registerArgument('overrideConfiguration', 'array', 'factory specific configuration', false, []); + } + + public function render(): ?string + { + $persistenceIdentifier = $this->arguments['persistenceIdentifier']; + $prototypeName = $this->arguments['prototypeName']; + $overrideConfiguration = $this->arguments['overrideConfiguration']; + /** @var RequestInterface $request */ + $request = $this->renderingContext->getAttribute(ServerRequestInterface::class); + // @todo: formvh:render() does not make sense without a persistenceIdentifier, does it? + if (!empty($persistenceIdentifier)) { + // The ConfigurationManager of ext:form needs ext:extbase ConfigurationManager to retrieve basic TS + // settings. ConfigurationManager of extbase should *usually* only be called in extbase context and + // needs a Request, which is usually set by extbase bootstrap. + // We are however (most likely) not in extbase context here. + // To prevent a fallback of extbase ConfigurationManager to $GLOBALS['TYPO3_REQUEST'], we set + // the request explicitly here, to then fetch $formSettings from ext:form ConfigurationManager. + // $typoScriptSettings is hand over to load() to apply TS overrides for single forms, see #92408. + $this->extbaseConfigurationManager->setRequest($request); + $typoScriptSettings = $this->extbaseConfigurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); + $formConfiguration = $this->formPersistenceManager->load($persistenceIdentifier, $typoScriptSettings, $request); + ArrayUtility::mergeRecursiveWithOverrule($formConfiguration, $overrideConfiguration); + $overrideConfiguration = $formConfiguration; + $overrideConfiguration['persistenceIdentifier'] = $persistenceIdentifier; + } + if (empty($prototypeName)) { + $prototypeName = $overrideConfiguration['prototypeName'] ?? 'standard'; + } + // Even though getContainer() is internal, we can't get container injected here due to static scope + /** @var FormFactoryInterface $factory */ + $factory = GeneralUtility::getContainer()->get($this->arguments['factoryClass']); + $formDefinition = $factory->build($overrideConfiguration, $prototypeName, $request); + $form = $formDefinition->bind($request); + return $form->render(); + } +} diff --git a/Classes/ViewHelpers/TranslateElementErrorViewHelper.php b/Classes/ViewHelpers/TranslateElementErrorViewHelper.php new file mode 100644 index 0000000..9d72eca --- /dev/null +++ b/Classes/ViewHelpers/TranslateElementErrorViewHelper.php @@ -0,0 +1,61 @@ +registerArgument('element', RootRenderableInterface::class, 'Form Element to translate', true); + $this->registerArgument('error', Error::class, 'Error', true); + } + + public function render(): string + { + $element = $this->arguments['element']; + $error = $this->arguments['error']; + /** @var FormRuntime $formRuntime */ + $formRuntime = $this->renderingContext + ->getViewHelperVariableContainer() + ->get(RenderRenderableViewHelper::class, 'formRuntime'); + return $this->translationService->translateFormElementError( + $element, + $error->getCode(), + $error->getArguments(), + $error->__toString(), + $formRuntime + ); + } +} diff --git a/Classes/ViewHelpers/TranslateElementPropertyViewHelper.php b/Classes/ViewHelpers/TranslateElementPropertyViewHelper.php new file mode 100644 index 0000000..fe4e923 --- /dev/null +++ b/Classes/ViewHelpers/TranslateElementPropertyViewHelper.php @@ -0,0 +1,93 @@ +registerArgument('element', RootRenderableInterface::class, 'Form Element to translate', true); + $this->registerArgument('property', 'mixed', 'Property to translate'); + $this->registerArgument('renderingOptionProperty', 'mixed', 'Property to translate'); + $this->registerArgument('languageKey', 'string', 'Language key ("da" for example) or "default" to use. Also a Locale object is possible. If empty, use current locale from the request.'); + } + + /** + * Return array element by key. + */ + public function render(): array|string|null + { + self::assertArgumentTypes($this->arguments); + $element = $this->arguments['element']; + $property = null; + if (!empty($this->arguments['property'])) { + $property = $this->arguments['property']; + } elseif (!empty($this->arguments['renderingOptionProperty'])) { + $property = $this->arguments['renderingOptionProperty']; + } + if (empty($property)) { + $propertyParts = []; + } elseif (is_array($property)) { + $propertyParts = $property; + } else { + $propertyParts = [$property]; + } + /** @var FormRuntime $formRuntime */ + $formRuntime = $this->renderingContext + ->getViewHelperVariableContainer() + ->get(RenderRenderableViewHelper::class, 'formRuntime'); + return $this->translationService->translateFormElementValue($element, $propertyParts, $formRuntime, $this->arguments['languageKey']); + } + + private static function assertArgumentTypes(array $arguments): void + { + foreach (['property', 'renderingOptionProperty'] as $argumentName) { + if ( + !isset($arguments[$argumentName]) + || is_string($arguments[$argumentName]) + || is_array($arguments[$argumentName]) + ) { + continue; + } + throw new InvalidArgumentValueException( + sprintf( + 'Arguments "%s" either must be string or array', + $argumentName + ), + 1504871830 + ); + } + } +} diff --git a/Configuration/Backend/Modules.php b/Configuration/Backend/Modules.php new file mode 100644 index 0000000..83e5f8b --- /dev/null +++ b/Configuration/Backend/Modules.php @@ -0,0 +1,46 @@ + [ + 'parent' => 'content', + 'position' => ['after' => 'workspaces_admin'], + 'access' => 'user', + 'path' => '/module/form', + 'iconIdentifier' => 'module-form', + 'labels' => 'form.module', + 'inheritNavigationComponentFromMainModule' => false, + ], + 'form_manager' => [ + 'parent' => 'web_FormFormbuilder', + 'access' => 'user', + 'path' => '/module/form/overview', + 'iconIdentifier' => 'module-form', + 'labels' => 'form.modules.form_manager', + 'extensionName' => 'Form', + 'controllerActions' => [ + FormManagerController::class => [ + 'index', 'show', 'create', 'duplicate', 'references', 'delete', + ], + ], + ], + 'form_editor' => [ + 'parent' => 'web_FormFormbuilder', + 'access' => 'user', + 'path' => '/module/form/editor', + 'iconIdentifier' => 'module-form', + 'navigationComponent' => '@typo3/form/backend/form-editor-tree-container', + 'labels' => 'form.modules.form_editor', + 'extensionName' => 'Form', + 'controllerActions' => [ + FormEditorController::class => [ + 'index', 'saveForm', 'renderFormPage', + ], + ], + ], +]; diff --git a/Configuration/ExpressionLanguage.php b/Configuration/ExpressionLanguage.php new file mode 100644 index 0000000..c03a2bd --- /dev/null +++ b/Configuration/ExpressionLanguage.php @@ -0,0 +1,8 @@ + [ + \TYPO3\CMS\Core\ExpressionLanguage\TypoScriptConditionProvider::class, + \TYPO3\CMS\Form\Domain\Condition\ConditionProvider::class, + ], +]; diff --git a/Configuration/Extbase/Persistence/Classes.php b/Configuration/Extbase/Persistence/Classes.php new file mode 100644 index 0000000..cb64483 --- /dev/null +++ b/Configuration/Extbase/Persistence/Classes.php @@ -0,0 +1,9 @@ + [ + 'tableName' => 'sys_file_reference', + ], +]; diff --git a/Configuration/FlexForms/FormFramework.xml b/Configuration/FlexForms/FormFramework.xml new file mode 100644 index 0000000..ee32bc1 --- /dev/null +++ b/Configuration/FlexForms/FormFramework.xml @@ -0,0 +1,27 @@ + + + + + LLL:EXT:form/Resources/Private/Language/Database.xlf:tt_content.pi_flexform.formframework.sheet_general + array + + + + reload + + select + selectSingle + + + + + + + formPersistenceIdentifier + + + + + + + diff --git a/Configuration/Fluid/Namespaces.php b/Configuration/Fluid/Namespaces.php new file mode 100644 index 0000000..add7bbd --- /dev/null +++ b/Configuration/Fluid/Namespaces.php @@ -0,0 +1,7 @@ + [ + 'TYPO3\\CMS\\Form\\ViewHelpers', + ], +]; diff --git a/Configuration/Form/Base/Finishers/Closure.yaml b/Configuration/Form/Base/Finishers/Closure.yaml new file mode 100644 index 0000000..1d824ab --- /dev/null +++ b/Configuration/Form/Base/Finishers/Closure.yaml @@ -0,0 +1,12 @@ +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: '' + errorMessage: '' diff --git a/Configuration/Form/Base/Finishers/Confirmation.yaml b/Configuration/Form/Base/Finishers/Confirmation.yaml new file mode 100644 index 0000000..64dc01b --- /dev/null +++ b/Configuration/Form/Base/Finishers/Confirmation.yaml @@ -0,0 +1,46 @@ +prototypes: + standard: + finishersDefinition: + Confirmation: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ConfirmationFinisher + options: + templateName: Confirmation + # @todo: These paths are unfortunate. They should in general be + # "EXT:form/Resources/Private/(Templates / Layout / Partials), + # and then "Frontend/Finishers/Confirmation/Confirmation" as templateName + # to be fed to render(), to follow general core view rendering practice + # of having global "extension entry paths". Create some b/w compat layer, + # move position of default templates around and deprecate the old way. + templateRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Confirmation/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Layout/Finishers/Confirmation/' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Partials/Finishers/Confirmation/' + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Confirmation.editor.header.label + predefinedDefaults: + options: + message: '' + contentElementUid: '' + errorMessage: '' + FormEngine: + label: tt_content.finishersDefinition.Confirmation.label + elements: + contentElementUid: + label: tt_content.finishersDefinition.Confirmation.contentElementUid.label + config: + type: group + allowed: tt_content + size: 1 + maxitems: 1 + fieldWizard: + recordsOverview: + disabled: 1 + message: + label: tt_content.finishersDefinition.Confirmation.message.label + config: + type: text + enableRichtext: true + richtextConfiguration: form-content diff --git a/Configuration/Form/Base/Finishers/DeleteUploads.yaml b/Configuration/Form/Base/Finishers/DeleteUploads.yaml new file mode 100644 index 0000000..44f2aeb --- /dev/null +++ b/Configuration/Form/Base/Finishers/DeleteUploads.yaml @@ -0,0 +1,8 @@ +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/Configuration/Form/Base/Finishers/EmailToReceiver.yaml b/Configuration/Form/Base/Finishers/EmailToReceiver.yaml new file mode 100644 index 0000000..6fcaa8a --- /dev/null +++ b/Configuration/Form/Base/Finishers/EmailToReceiver.yaml @@ -0,0 +1,161 @@ +prototypes: + standard: + finishersDefinition: + EmailToReceiver: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher + options: + templateName: 'Default' + 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: '' + title: '' + message: '' + errorMessage: '' + FormEngine: + label: tt_content.finishersDefinition.EmailToReceiver.label + elements: + message: + label: tt_content.finishersDefinition.EmailToReceiver.message.label + config: + type: text + enableRichtext: true + richtextConfiguration: form-content + subject: + label: tt_content.finishersDefinition.EmailToReceiver.subject.label + config: + type: input + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + label: tt_content.finishersDefinition.EmailToSender.recipients.name.label + config: + type: input + senderAddress: + label: tt_content.finishersDefinition.EmailToReceiver.senderAddress.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + 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: + 5: + label: tt_content.finishersDefinition.EmailToReceiver.language.0 + value: '' + 10: + label: tt_content.finishersDefinition.EmailToReceiver.language.1 + value: default + title: + label: tt_content.finishersDefinition.EmailToReceiver.title.label + config: + type: input diff --git a/Configuration/Form/Base/Finishers/EmailToSender.yaml b/Configuration/Form/Base/Finishers/EmailToSender.yaml new file mode 100644 index 0000000..e9c4ff0 --- /dev/null +++ b/Configuration/Form/Base/Finishers/EmailToSender.yaml @@ -0,0 +1,161 @@ +prototypes: + standard: + finishersDefinition: + EmailToSender: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher + options: + templateName: 'Default' + 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 + title: '' + message: '' + translation: + language: '' + errorMessage: '' + FormEngine: + label: tt_content.finishersDefinition.EmailToSender.label + elements: + message: + label: tt_content.finishersDefinition.EmailToSender.message.label + config: + type: text + enableRichtext: true + richtextConfiguration: form-content + subject: + label: tt_content.finishersDefinition.EmailToSender.subject.label + config: + type: input + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + label: tt_content.finishersDefinition.EmailToSender.recipients.name.label + config: + type: input + senderAddress: + label: tt_content.finishersDefinition.EmailToSender.senderAddress.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: input + eval: TYPO3\CMS\Form\Evaluation\EmailOrFormElementIdentifier + required: true + name: + label: tt_content.finishersDefinition.EmailToSender.recipients.name.label + config: + type: input + addHtmlPart: + label: tt_content.finishersDefinition.EmailToSender.addHtmlPart.label + config: + type: check + default: 1 + translation: + language: + label: tt_content.finishersDefinition.EmailToSender.language.label + config: + type: select + renderType: selectSingle + minitems: 1 + maxitems: 1 + size: 1 + items: + 5: + label: tt_content.finishersDefinition.EmailToSender.language.0 + value: '' + 10: + label: tt_content.finishersDefinition.EmailToSender.language.1 + value: default + title: + label: tt_content.finishersDefinition.EmailToSender.title.label + config: + type: input diff --git a/Configuration/Form/Base/Finishers/FlashMessage.yaml b/Configuration/Form/Base/Finishers/FlashMessage.yaml new file mode 100644 index 0000000..1f11049 --- /dev/null +++ b/Configuration/Form/Base/Finishers/FlashMessage.yaml @@ -0,0 +1,16 @@ +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 + errorMessage: '' diff --git a/Configuration/Form/Base/Finishers/Redirect.yaml b/Configuration/Form/Base/Finishers/Redirect.yaml new file mode 100644 index 0000000..eb1137d --- /dev/null +++ b/Configuration/Form/Base/Finishers/Redirect.yaml @@ -0,0 +1,36 @@ +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: '' + fragment: '' + errorMessage: '' + FormEngine: + label: tt_content.finishersDefinition.Redirect.label + elements: + pageUid: + label: tt_content.finishersDefinition.Redirect.pageUid.label + config: + type: group + allowed: pages + size: 1 + minitems: 1 + maxitems: 1 + fieldWizard: + recordsOverview: + disabled: 1 + additionalParameters: + label: tt_content.finishersDefinition.Redirect.additionalParameters.label + config: + type: input + fragment: + label: tt_content.finishersDefinition.Redirect.fragment.label + config: + type: input diff --git a/Configuration/Form/Base/Finishers/SaveToDatabase.yaml b/Configuration/Form/Base/Finishers/SaveToDatabase.yaml new file mode 100644 index 0000000..a3c3ec0 --- /dev/null +++ b/Configuration/Form/Base/Finishers/SaveToDatabase.yaml @@ -0,0 +1,11 @@ +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: + errorMessage: '' diff --git a/Configuration/Form/Base/FormElements/AdvancedPassword.yaml b/Configuration/Form/Base/FormElements/AdvancedPassword.yaml new file mode 100644 index 0000000..c455d74 --- /dev/null +++ b/Configuration/Form/Base/FormElements/AdvancedPassword.yaml @@ -0,0 +1,342 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'new-password' + label: formEditor.elements.FormElement.editor.autocomplete.option.new-password + 30: + value: 'current-password' + label: formEditor.elements.FormElement.editor.autocomplete.option.current-password + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.AdvancedPassword.label + description: formEditor.elements.AdvancedPassword.description + group: custom + groupSorting: 500 + iconIdentifier: form-advanced-password + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + renderFieldset: 1 + fieldsetClassAttribute: 'form-element form-element-advancedpassword mb-3' + containerClassAttribute: 'form-element mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + confirmationLabel: '' + confirmationClassAttribute: form-control diff --git a/Configuration/Form/Base/FormElements/Checkbox.yaml b/Configuration/Form/Base/FormElements/Checkbox.yaml new file mode 100644 index 0000000..0a4e9b4 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Checkbox.yaml @@ -0,0 +1,109 @@ +prototypes: + standard: + formElementsDefinition: + Checkbox: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextareaEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + enableRichtext: true + richtextConfiguration: form-label + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'honorific-prefix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-prefix + 30: + value: 'honorific-suffix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-suffix + 70: + value: 'language' + label: formEditor.elements.FormElement.editor.autocomplete.option.language + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + errorCodes: + 10: 1221560910 + 20: 1221560718 + 30: 1347992400 + 40: 1347992453 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Checkbox.label + description: formEditor.elements.Checkbox.description + group: select + groupSorting: 100 + iconIdentifier: form-checkbox + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-check mb-3' + elementClassAttribute: form-check-input + elementErrorClassAttribute: ~ + labelClassAttribute: form-check-wrapping-label + labelTextClassAttribute: form-check-label + value: 1 diff --git a/Configuration/Form/Base/FormElements/ContentElement.yaml b/Configuration/Form/Base/FormElements/ContentElement.yaml new file mode 100644 index 0000000..1530e38 --- /dev/null +++ b/Configuration/Form/Base/FormElements/ContentElement.yaml @@ -0,0 +1,76 @@ +prototypes: + standard: + formElementsDefinition: + ContentElement: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 300: + identifier: contentElement + templateName: Inspector-Typo3WinBrowserEditor + label: formEditor.elements.ContentElement.editor.contentElement.label + buttonLabel: formEditor.elements.ContentElement.editor.contentElement.buttonLabel + browsableType: tt_content + iconIdentifier: mimetypes-x-content-text + propertyPath: properties.contentElementUid + propertyValidatorsMode: OR + propertyValidators: + 10: Integer + 20: FormElementIdentifierWithinCurlyBracesExclusive + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + label: formEditor.elements.ContentElement.label + properties: + contentElementUid: '' + label: formEditor.elements.ContentElement.label + description: formEditor.elements.ContentElement.description + group: custom + groupSorting: 700 + iconIdentifier: form-content-element + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + contentElementUid: '' + outerContainerClassAttribute: clearfix + variants: + - + identifier: hide-1 + renderingOptions: + enabled: false + condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]' diff --git a/Configuration/Form/Base/FormElements/CountrySelect.yaml b/Configuration/Form/Base/FormElements/CountrySelect.yaml new file mode 100644 index 0000000..3750cab --- /dev/null +++ b/Configuration/Form/Base/FormElements/CountrySelect.yaml @@ -0,0 +1,134 @@ +prototypes: + standard: + formElementsDefinition: + CountrySelect: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 245: + identifier: defaultValue + templateName: Inspector-CountrySingleSelectEditor + label: formEditor.elements.CountrySelect.editor.defaultValue.label + propertyPath: defaultValue + description: formEditor.elements.CountrySelect.editor.defaultValue.description + 250: + identifier: inactiveOption + templateName: Inspector-TextEditor + label: formEditor.elements.SelectionMixin.editor.inactiveOption.label + propertyPath: properties.prependOptionLabel + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + doNotSetIfPropertyValueIsEmpty: true + 300: + identifier: prioritizedCountries + templateName: Inspector-CountrySelectEditor + label: formEditor.elements.CountrySelect.editor.prioritizedCountries.label + propertyPath: properties.prioritizedCountries + 310: + identifier: onlyCountries + templateName: Inspector-CountrySelectEditor + label: formEditor.elements.CountrySelect.editor.onlyCountries.label + propertyPath: properties.onlyCountries + 320: + identifier: excludeCountries + templateName: Inspector-CountrySelectEditor + label: formEditor.elements.CountrySelect.editor.excludeCountries.label + propertyPath: properties.excludeCountries + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'country' + label: formEditor.elements.FormElement.editor.autocomplete.option.country + 30: + value: 'country-name' + label: formEditor.elements.FormElement.editor.autocomplete.option.country-name + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + errorCodes: + 10: 1221560910 + 20: 1221560718 + 30: 1347992400 + 40: 1347992453 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + defaultValue: '' + properties: + options: { } + label: formEditor.elements.CountrySelect.label + description: formEditor.elements.CountrySelect.description + group: select + groupSorting: 200 + iconIdentifier: form-multi-select + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-select mb-3' + elementClassAttribute: form-select + elementErrorClassAttribute: ~ + labelClassAttribute: form-label diff --git a/Configuration/Form/Base/FormElements/Date.yaml b/Configuration/Form/Base/FormElements/Date.yaml new file mode 100644 index 0000000..35b9193 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Date.yaml @@ -0,0 +1,351 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 300: + identifier: defaultValue + templateName: Inspector-DateEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + propertyValidators: + 10: RFC3339FullDateOrEmpty + 550: + identifier: step + templateName: Inspector-TextEditor + label: formEditor.elements.Date.editor.step.label + description: formEditor.elements.Date.editor.step.description + propertyPath: properties.fluidAdditionalAttributes.step + propertyValidators: + 10: Integer + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'bday' + label: formEditor.elements.FormElement.editor.autocomplete.option.bday + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 250: + identifier: minimum + templateName: Inspector-DateEditor + label: formEditor.elements.DatePicker.validators.DateRange.editor.minimum + propertyPath: options.minimum + propertyValidators: + 10: RFC3339FullDateOrEmpty + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min + 300: + identifier: maximum + templateName: Inspector-DateEditor + label: formEditor.elements.DatePicker.validators.DateRange.editor.maximum + propertyPath: options.maximum + propertyValidators: + 10: RFC3339FullDateOrEmpty + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max + 400: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + errorCodes: + 10: 1521293685 + 20: 1521293686 + 30: 1521293687 + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Date.label + description: formEditor.elements.Date.description + group: html5 + groupSorting: 500 + iconIdentifier: form-date-picker + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Date + properties: + containerClassAttribute: 'form-element form-element-date mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + 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])' diff --git a/Configuration/Form/Base/FormElements/Email.yaml b/Configuration/Form/Base/FormElements/Email.yaml new file mode 100644 index 0000000..ea708a1 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Email.yaml @@ -0,0 +1,324 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'email' + label: formEditor.elements.FormElement.editor.autocomplete.option.email + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Email.label + description: formEditor.elements.Email.description + group: html5 + groupSorting: 100 + iconIdentifier: form-email + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-email mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + validators: + - + identifier: EmailAddress diff --git a/Configuration/Form/Base/FormElements/Fieldset.yaml b/Configuration/Form/Base/FormElements/Fieldset.yaml new file mode 100644 index 0000000..ccf2b29 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Fieldset.yaml @@ -0,0 +1,64 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Fieldset.label + description: formEditor.elements.Fieldset.description + group: container + groupSorting: 100 + _isCompositeFormElement: true + iconIdentifier: form-fieldset + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Section + properties: + containerClassAttribute: ~ + elementClassAttribute: 'form-element form-element-fieldset mb-3' + elementErrorClassAttribute: ~ + renderingOptions: + _isCompositeFormElement: true + _isSection: true diff --git a/Configuration/Form/Base/FormElements/FileUpload.yaml b/Configuration/Form/Base/FormElements/FileUpload.yaml new file mode 100644 index 0000000..9311dbf --- /dev/null +++ b/Configuration/Form/Base/FormElements/FileUpload.yaml @@ -0,0 +1,220 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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/' + 500: + identifier: multiple + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FileUpload.editor.multiple.label + propertyPath: properties.multiple + 550: + identifier: allowRemoval + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FileUpload.editor.allowRemoval.label + propertyPath: properties.allowRemoval + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'photo' + label: formEditor.elements.FormElement.editor.autocomplete.option.photo + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 30: + value: Count + label: formEditor.elements.FileUploadMixin.editor.validators.Count.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 + 20: + identifier: Count + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.FileUpload.label + description: formEditor.elements.FileUpload.description + group: custom + groupSorting: 100 + iconIdentifier: form-file-upload + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload + properties: + containerClassAttribute: 'form-element form-element-fileupload mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: [] diff --git a/Configuration/Form/Base/FormElements/Form.yaml b/Configuration/Form/Base/FormElements/Form.yaml new file mode 100644 index 0000000..a5b55f7 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Form.yaml @@ -0,0 +1,520 @@ +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 + modalCloseCancelButton: formEditor.modals.close.cancelButton + modalRemoveElementDialogTitle: formEditor.modals.removeElement.dialogTitle + modalRemoveElementDialogMessage: formEditor.modals.removeElement.dialogMessage + modalRemoveElementConfirmButton: formEditor.modals.removeElement.confirmButton + modalRemoveElementCancelButton: formEditor.modals.removeElement.cancelButton + modalRemoveElementLastAvailablePageFlashMessageTitle: formEditor.modals.removeElement.lastAvailablePageFlashMessageTitle + modalRemoveElementLastAvailablePageFlashMessageMessage: formEditor.modals.removeElement.lastAvailablePageFlashMessageMessage + 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 + 250: + identifier: message + templateName: Inspector-TextareaEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.message.label + propertyPath: options.message + description: formEditor.elements.Form.finisher.EmailToSender.editor.message.description + enableRichtext: true + richtextConfiguration: form-content + 350: + identifier: recipients + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.label + propertyPath: options.recipients + propertyValidators: + 10: NotEmpty + description: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + description: formEditor.elements.Form.finisher.EmailToSender.editor.senderAddress.description + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + description: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.description + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.description + 1100: + identifier: attachUploads + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.attachUploads.label + propertyPath: options.attachUploads + 1200: + identifier: language + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.label + propertyPath: options.translation.language + selectOptions: + 5: + value: '' + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.0 + 10: + value: default + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.1 + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToSender.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + 250: + identifier: message + templateName: Inspector-TextareaEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.message.label + propertyPath: options.message + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.message.description + enableRichtext: true + richtextConfiguration: form-content + 350: + identifier: recipients + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.label + propertyPath: options.recipients + propertyValidators: + 10: NotEmpty + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderAddress.description + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.description + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.description + 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: + 5: + value: '' + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.language.0 + 10: + value: default + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.language.1 + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + iconIdentifier: apps-pagetree-page-default + 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 + 400: + identifier: fragment + templateName: Inspector-Typo3WinBrowserEditor + label: formEditor.elements.Form.finisher.Redirect.editor.fragment.label + buttonLabel: formEditor.elements.Form.finisher.Redirect.editor.fragment.buttonLabel + browsableType: tt_content + iconIdentifier: mimetypes-x-content-text + propertyPath: options.fragment + description: formEditor.elements.Form.finisher.Redirect.editor.fragment.description + 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 + iconIdentifier: mimetypes-x-content-text + 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 + description: formEditor.elements.Form.finisher.Confirmation.editor.message.description + enableRichtext: true + richtextConfiguration: form-content + 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 + fieldProperties: + errorMsgClassAttribute: invalid-feedback + errorClassAttribute: is-invalid + descriptionClassAttribute: form-text + requiredMarkClassAttribute: required + visuallyHiddenClassAttribute: visually-hidden + formNavigation: + navigationWrapperClassAttribute: actions + navigationClassAttribute: form-navigation + navigationAriaLabelAttribute: Form Navigation + btnPreviousClassAttribute: 'btn btn-outline-primary' + btnNextClassAttribute: 'btn btn-primary' + btnSubmitClassAttribute: 'btn btn-primary' diff --git a/Configuration/Form/Base/FormElements/GridColumn.yaml b/Configuration/Form/Base/FormElements/GridColumn.yaml new file mode 100644 index 0000000..00ea2a7 --- /dev/null +++ b/Configuration/Form/Base/FormElements/GridColumn.yaml @@ -0,0 +1,59 @@ +prototypes: + standard: + formElementsDefinition: + GridColumn: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.GridColumn.editor.label.label + propertyPath: label + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.GridColumn.label + description: formEditor.elements.GridColumn.description + group: container + groupSorting: 400 + _isCompositeFormElement: true + iconIdentifier: form-gridcolumn + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GridColumn + renderingOptions: + _isCompositeFormElement: true diff --git a/Configuration/Form/Base/FormElements/GridRow.yaml b/Configuration/Form/Base/FormElements/GridRow.yaml new file mode 100644 index 0000000..4eff4bb --- /dev/null +++ b/Configuration/Form/Base/FormElements/GridRow.yaml @@ -0,0 +1,80 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.GridRow.label + description: formEditor.elements.GridRow.description + group: container + groupSorting: 300 + _isCompositeFormElement: true + _isGridRowFormElement: true + iconIdentifier: form-gridrow + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GridRow + properties: + containerClassAttribute: ~ + elementClassAttribute: 'form-element form-element-gridrow row' + elementErrorClassAttribute: ~ + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + xl: + classPattern: 'col-xl-{@numbersOfColumnsToUse}' + xxl: + classPattern: 'col-xxl-{@numbersOfColumnsToUse}' + renderingOptions: + _isCompositeFormElement: true + _isGridRowFormElement: true diff --git a/Configuration/Form/Base/FormElements/Hidden.yaml b/Configuration/Form/Base/FormElements/Hidden.yaml new file mode 100644 index 0000000..f435e81 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Hidden.yaml @@ -0,0 +1,86 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 300: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.Hidden.editor.defaultValue.label + propertyPath: defaultValue + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + defaultValue: '' + label: formEditor.elements.Hidden.label + description: formEditor.elements.Hidden.description + group: custom + groupSorting: 300 + iconIdentifier: form-hidden + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-hidden' + elementClassAttribute: '' + elementErrorClassAttribute: ~ + variants: + - + identifier: hide-1 + renderingOptions: + enabled: false + condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]' diff --git a/Configuration/Form/Base/FormElements/Honeypot.yaml b/Configuration/Form/Base/FormElements/Honeypot.yaml new file mode 100644 index 0000000..88821df --- /dev/null +++ b/Configuration/Form/Base/FormElements/Honeypot.yaml @@ -0,0 +1,328 @@ +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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: form-element + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + 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/Configuration/Form/Base/FormElements/ImageUpload.yaml b/Configuration/Form/Base/FormElements/ImageUpload.yaml new file mode 100644 index 0000000..ecaba44 --- /dev/null +++ b/Configuration/Form/Base/FormElements/ImageUpload.yaml @@ -0,0 +1,211 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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/' + 500: + identifier: multiple + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FileUpload.editor.multiple.label + propertyPath: properties.multiple + 550: + identifier: allowRemoval + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FileUpload.editor.allowRemoval.label + propertyPath: properties.allowRemoval + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'photo' + label: formEditor.elements.FormElement.editor.autocomplete.option.photo + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 30: + value: Count + label: formEditor.elements.FileUploadMixin.editor.validators.Count.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 + 20: + identifier: Count + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.ImageUpload.label + description: formEditor.elements.ImageUpload.description + group: custom + groupSorting: 400 + iconIdentifier: form-image-upload + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload + properties: + containerClassAttribute: 'form-element form-element-imageupload mb-3' + elementClassAttribute: 'form-control lightbox' + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: [] + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 diff --git a/Configuration/Form/Base/FormElements/MultiCheckbox.yaml b/Configuration/Form/Base/FormElements/MultiCheckbox.yaml new file mode 100644 index 0000000..942b579 --- /dev/null +++ b/Configuration/Form/Base/FormElements/MultiCheckbox.yaml @@ -0,0 +1,169 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + multiSelection: true + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'honorific-prefix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-prefix + 30: + value: 'honorific-suffix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-suffix + 70: + value: 'language' + label: formEditor.elements.FormElement.editor.autocomplete.option.language + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + description: formEditor.elements.MultiSelectionMixin.validators.Count.editor.validationErrorMessage.description + errorCodes: + 10: 1475002976 + 20: 1475002994 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.MultiCheckbox.label + description: formEditor.elements.MultiCheckbox.description + group: select + groupSorting: 400 + iconIdentifier: form-multi-checkbox + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + renderFieldset: 1 + fieldsetClassAttribute: 'form-element form-element-radio mb-3' + containerClassAttribute: 'form-check mb-2' + elementClassAttribute: form-check-input + elementErrorClassAttribute: ~ + labelClassAttribute: form-check-wrapping-label + labelTextClassAttribute: form-check-label + legendVisuallyHidden: 0 diff --git a/Configuration/Form/Base/FormElements/MultiSelect.yaml b/Configuration/Form/Base/FormElements/MultiSelect.yaml new file mode 100644 index 0000000..fc5d6ed --- /dev/null +++ b/Configuration/Form/Base/FormElements/MultiSelect.yaml @@ -0,0 +1,174 @@ +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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 250: + identifier: inactiveOption + templateName: Inspector-TextEditor + label: formEditor.elements.SelectionMixin.editor.inactiveOption.label + propertyPath: properties.prependOptionLabel + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + 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 + multiSelection: true + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'honorific-prefix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-prefix + 30: + value: 'honorific-suffix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-suffix + 70: + value: 'language' + label: formEditor.elements.FormElement.editor.autocomplete.option.language + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + description: formEditor.elements.MultiSelectionMixin.validators.Count.editor.validationErrorMessage.description + errorCodes: + 10: 1475002976 + 20: 1475002994 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.MultiSelect.label + description: formEditor.elements.MultiSelect.description + group: select + groupSorting: 500 + iconIdentifier: form-multi-select + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-multiselect mb-3' + elementClassAttribute: 'form-select xlarge' + elementErrorClassAttribute: ~ + labelClassAttribute: form-label diff --git a/Configuration/Form/Base/FormElements/Number.yaml b/Configuration/Form/Base/FormElements/Number.yaml new file mode 100644 index 0000000..b5dc79b --- /dev/null +++ b/Configuration/Form/Base/FormElements/Number.yaml @@ -0,0 +1,346 @@ +prototypes: + standard: + formElementsDefinition: + Number: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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: IntegerOrEmpty + 550: + identifier: step + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.step.label + propertyPath: properties.fluidAdditionalAttributes.step + propertyValidators: + 10: Integer + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 50: + value: 'postal-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.postal-code + 60: + value: 'bday-day' + label: formEditor.elements.FormElement.editor.autocomplete.option.bday-day + 70: + value: 'bday-month' + label: formEditor.elements.FormElement.editor.autocomplete.option.bday-month + 80: + value: 'bday-year' + label: formEditor.elements.FormElement.editor.autocomplete.option.bday-year + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 60: + value: Number + label: formEditor.elements.Number.editor.validators.Number.label + 80: + value: NumberRange + label: formEditor.elements.TextMixin.editor.validators.NumberRange.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + defaultValue: '' + properties: + fluidAdditionalAttributes: + step: 1 + validators: + - + identifier: Number + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + errorCodes: + 10: 1221560494 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + 60: + identifier: Number + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Number.editor.header.label + 200: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + errorCodes: + 10: 1221560288 + propertyPath: properties.validationErrorMessages + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Number.label + description: formEditor.elements.Number.description + group: html5 + groupSorting: 400 + iconIdentifier: form-number + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-number mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + validators: + - + identifier: Number diff --git a/Configuration/Form/Base/FormElements/Page.yaml b/Configuration/Form/Base/FormElements/Page.yaml new file mode 100644 index 0000000..ed885c7 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Page.yaml @@ -0,0 +1,44 @@ +prototypes: + standard: + formElementsDefinition: + Page: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.Page.editor.label.label + propertyPath: 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + renderingOptions: + previousButtonLabel: formEditor.elements.Page.editor.previousButtonLabel.value + nextButtonLabel: formEditor.elements.Page.editor.nextButtonLabel.value + label: formEditor.elements.Page.label + description: formEditor.elements.Page.description + group: page + groupSorting: 100 + _isTopLevelFormElement: true + _isCompositeFormElement: true + iconIdentifier: form-page + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Page + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: true + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' diff --git a/Configuration/Form/Base/FormElements/Password.yaml b/Configuration/Form/Base/FormElements/Password.yaml new file mode 100644 index 0000000..d8857b6 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Password.yaml @@ -0,0 +1,337 @@ +prototypes: + standard: + formElementsDefinition: + Password: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'new-password' + label: formEditor.elements.FormElement.editor.autocomplete.option.new-password + 30: + value: 'current-password' + label: formEditor.elements.FormElement.editor.autocomplete.option.current-password + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Password.label + description: formEditor.elements.Password.description + group: input + groupSorting: 300 + iconIdentifier: form-password + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-password mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label diff --git a/Configuration/Form/Base/FormElements/RadioButton.yaml b/Configuration/Form/Base/FormElements/RadioButton.yaml new file mode 100644 index 0000000..677fea8 --- /dev/null +++ b/Configuration/Form/Base/FormElements/RadioButton.yaml @@ -0,0 +1,134 @@ +prototypes: + standard: + formElementsDefinition: + RadioButton: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + multiSelection: false + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'honorific-prefix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-prefix + 30: + value: 'honorific-suffix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-suffix + 40: + value: 'tel-country-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-country-code + 50: + value: 'tel-area-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-area-code + 60: + value: 'sex' + label: formEditor.elements.FormElement.editor.autocomplete.option.sex + 70: + value: 'language' + label: formEditor.elements.FormElement.editor.autocomplete.option.language + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + errorCodes: + 10: 1221560910 + 20: 1221560718 + 30: 1347992400 + 40: 1347992453 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + options: { } + label: formEditor.elements.RadioButton.label + description: formEditor.elements.RadioButton.description + group: select + groupSorting: 300 + iconIdentifier: form-radio-button + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + renderFieldset: 1 + fieldsetClassAttribute: 'form-element form-element-radio mb-3' + containerClassAttribute: 'form-check mb-2' + elementClassAttribute: form-check-input + elementErrorClassAttribute: ~ + labelClassAttribute: form-check-wrapping-label + labelTextClassAttribute: form-check-label + legendVisuallyHidden: 1 diff --git a/Configuration/Form/Base/FormElements/SingleSelect.yaml b/Configuration/Form/Base/FormElements/SingleSelect.yaml new file mode 100644 index 0000000..2a05eff --- /dev/null +++ b/Configuration/Form/Base/FormElements/SingleSelect.yaml @@ -0,0 +1,137 @@ +prototypes: + standard: + formElementsDefinition: + SingleSelect: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 250: + identifier: inactiveOption + templateName: Inspector-TextEditor + label: formEditor.elements.SelectionMixin.editor.inactiveOption.label + propertyPath: properties.prependOptionLabel + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + 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 + multiSelection: false + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'honorific-prefix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-prefix + 30: + value: 'honorific-suffix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-suffix + 40: + value: 'tel-country-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-country-code + 50: + value: 'tel-area-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-area-code + 60: + value: 'sex' + label: formEditor.elements.FormElement.editor.autocomplete.option.sex + 70: + value: 'language' + label: formEditor.elements.FormElement.editor.autocomplete.option.language + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + errorCodes: + 10: 1221560910 + 20: 1221560718 + 30: 1347992400 + 40: 1347992453 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + options: { } + label: formEditor.elements.SingleSelect.label + description: formEditor.elements.SingleSelect.description + group: select + groupSorting: 200 + iconIdentifier: form-single-select + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-select mb-3' + elementClassAttribute: form-select + elementErrorClassAttribute: ~ + labelClassAttribute: form-label diff --git a/Configuration/Form/Base/FormElements/StaticText.yaml b/Configuration/Form/Base/FormElements/StaticText.yaml new file mode 100644 index 0000000..6a06724 --- /dev/null +++ b/Configuration/Form/Base/FormElements/StaticText.yaml @@ -0,0 +1,75 @@ +prototypes: + standard: + formElementsDefinition: + StaticText: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.StaticText.editor.label.label + propertyPath: label + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 300: + identifier: staticText + templateName: Inspector-TextareaEditor + label: formEditor.elements.StaticText.editor.staticText.label + propertyPath: properties.text + enableRichtext: true + richtextConfiguration: form-content + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + text: '' + label: formEditor.elements.StaticText.label + description: formEditor.elements.StaticText.description + group: custom + groupSorting: 600 + iconIdentifier: form-static-text + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + text: '' + containerClassAttribute: 'form-element form-element-statictext mb-3' + variants: + - + identifier: hide-1 + renderingOptions: + enabled: false + condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]' diff --git a/Configuration/Form/Base/FormElements/SummaryPage.yaml b/Configuration/Form/Base/FormElements/SummaryPage.yaml new file mode 100644 index 0000000..856160a --- /dev/null +++ b/Configuration/Form/Base/FormElements/SummaryPage.yaml @@ -0,0 +1,48 @@ +prototypes: + standard: + formElementsDefinition: + SummaryPage: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.SummaryPage.editor.label.label + propertyPath: 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + renderingOptions: + previousButtonLabel: formEditor.elements.SummaryPage.editor.previousButtonLabel.value + nextButtonLabel: formEditor.elements.SummaryPage.editor.nextButtonLabel.value + label: formEditor.elements.SummaryPage.label + description: formEditor.elements.SummaryPage.description + group: page + groupSorting: 200 + _isTopLevelFormElement: true + _isCompositeFormElement: false + iconIdentifier: form-summary-page + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Page + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + listClassAttribute: summary-list + listRowClassAttribute: row + labelWrapperClassAttribute: col + valueWrapperClassAttribute: col diff --git a/Configuration/Form/Base/FormElements/Telephone.yaml b/Configuration/Form/Base/FormElements/Telephone.yaml new file mode 100644 index 0000000..0d93b79 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Telephone.yaml @@ -0,0 +1,336 @@ +prototypes: + standard: + formElementsDefinition: + Telephone: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'tel' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel + 30: + value: 'tel-country-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-country-code + 40: + value: 'tel-national' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-national + 50: + value: 'tel-area-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-area-code + 60: + value: 'tel-local' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-local + 70: + value: 'tel-extension' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel-extension + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Telephone.label + description: formEditor.elements.Telephone.description + group: html5 + groupSorting: 200 + iconIdentifier: form-telephone + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-phone mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + validators: + - + identifier: RegularExpression + options: + regularExpression: '/^.*$/' diff --git a/Configuration/Form/Base/FormElements/Text.yaml b/Configuration/Form/Base/FormElements/Text.yaml new file mode 100644 index 0000000..264eb61 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Text.yaml @@ -0,0 +1,391 @@ +prototypes: + standard: + formElementsDefinition: + Text: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'name' + label: formEditor.elements.FormElement.editor.autocomplete.option.name + 30: + value: 'honorific-prefix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-prefix + 40: + value: 'given-name' + label: formEditor.elements.FormElement.editor.autocomplete.option.given-name + 50: + value: 'additional-name' + label: formEditor.elements.FormElement.editor.autocomplete.option.additional-name + 60: + value: 'family-name' + label: formEditor.elements.FormElement.editor.autocomplete.option.family-name + 70: + value: 'honorific-suffix' + label: formEditor.elements.FormElement.editor.autocomplete.option.honorific-suffix + 80: + value: 'nickname' + label: formEditor.elements.FormElement.editor.autocomplete.option.nickname + 90: + value: 'organization-title' + label: formEditor.elements.FormElement.editor.autocomplete.option.organization-title + 100: + value: 'username' + label: formEditor.elements.FormElement.editor.autocomplete.option.username + 110: + value: 'organization' + label: formEditor.elements.FormElement.editor.autocomplete.option.organization + 120: + value: 'address-line1' + label: formEditor.elements.FormElement.editor.autocomplete.option.address-line1 + 130: + value: 'address-line2' + label: formEditor.elements.FormElement.editor.autocomplete.option.address-line2 + 140: + value: 'address-level1' + label: formEditor.elements.FormElement.editor.autocomplete.option.address-level1 + 150: + value: 'address-level2' + label: formEditor.elements.FormElement.editor.autocomplete.option.address-level2 + 190: + value: 'country-name' + label: formEditor.elements.FormElement.editor.autocomplete.option.country-name + 200: + value: 'postal-code' + label: formEditor.elements.FormElement.editor.autocomplete.option.postal-code + 210: + value: 'tel' + label: formEditor.elements.FormElement.editor.autocomplete.option.tel + 220: + value: 'impp' + label: formEditor.elements.FormElement.editor.autocomplete.option.impp + 230: + value: 'sex' + label: formEditor.elements.FormElement.editor.autocomplete.option.sex + 240: + value: 'language' + label: formEditor.elements.FormElement.editor.autocomplete.option.language + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Text.label + description: formEditor.elements.Text.description + group: input + groupSorting: 100 + iconIdentifier: form-text + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-text mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label diff --git a/Configuration/Form/Base/FormElements/Textarea.yaml b/Configuration/Form/Base/FormElements/Textarea.yaml new file mode 100644 index 0000000..b39a780 --- /dev/null +++ b/Configuration/Form/Base/FormElements/Textarea.yaml @@ -0,0 +1,331 @@ +prototypes: + standard: + formElementsDefinition: + Textarea: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'street-address' + label: formEditor.elements.FormElement.editor.autocomplete.option.street-address + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 40: + value: StringLength + label: formEditor.elements.TextMixin.editor.validators.StringLength.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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Textarea.label + description: formEditor.elements.Textarea.description + group: input + groupSorting: 200 + iconIdentifier: form-textarea + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-textarea mb-3' + elementClassAttribute: 'form-control xxlarge' + elementErrorClassAttribute: error + labelClassAttribute: form-label diff --git a/Configuration/Form/Base/FormElements/Url.yaml b/Configuration/Form/Base/FormElements/Url.yaml new file mode 100644 index 0000000..2fa02aa --- /dev/null +++ b/Configuration/Form/Base/FormElements/Url.yaml @@ -0,0 +1,324 @@ +prototypes: + standard: + formElementsDefinition: + Url: + 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 + 240: + identifier: enabled + templateName: Inspector-CheckboxEditor + label: formEditor.elements.FormElement.editor.enabled.label + propertyPath: renderingOptions.enabled + 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 + 600: + identifier: autocomplete + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.FormElement.editor.autocomplete.label + propertyPath: properties.fluidAdditionalAttributes.autocomplete + doNotSetIfPropertyValueIsEmpty: true + selectOptions: + 10: + value: '' + label: formEditor.elements.FormElement.editor.autocomplete.option.none + 15: + value: 'off' + label: formEditor.elements.FormElement.editor.autocomplete.option.off + 20: + value: 'url' + label: formEditor.elements.FormElement.editor.autocomplete.option.url + 30: + value: 'impp' + label: formEditor.elements.FormElement.editor.autocomplete.option.impp + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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 + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Url.label + description: formEditor.elements.Url.description + group: html5 + groupSorting: 300 + iconIdentifier: form-url + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + properties: + containerClassAttribute: 'form-element form-element-url mb-3' + elementClassAttribute: form-control + elementErrorClassAttribute: ~ + labelClassAttribute: form-label + validators: + - + identifier: RegularExpression + options: + regularExpression: '/^.*$/' diff --git a/Configuration/Form/Base/Validators/Alphanumeric.yaml b/Configuration/Form/Base/Validators/Alphanumeric.yaml new file mode 100644 index 0000000..7f3c78e --- /dev/null +++ b/Configuration/Form/Base/Validators/Alphanumeric.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + Alphanumeric: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\AlphanumericValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Alphanumeric.label diff --git a/Configuration/Form/Base/Validators/Count.yaml b/Configuration/Form/Base/Validators/Count.yaml new file mode 100644 index 0000000..22cf2f6 --- /dev/null +++ b/Configuration/Form/Base/Validators/Count.yaml @@ -0,0 +1,17 @@ +prototypes: + standard: + validatorsDefinition: + Count: + implementationClassName: TYPO3\CMS\Form\Mvc\Validation\CountValidator + #options: + # minimum count to accept + #minimum: + # maximum count to accept + #maximum: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label + predefinedDefaults: + options: + minimum: '' + maximum: '' diff --git a/Configuration/Form/Base/Validators/DateRange.yaml b/Configuration/Form/Base/Validators/DateRange.yaml new file mode 100644 index 0000000..4101eee --- /dev/null +++ b/Configuration/Form/Base/Validators/DateRange.yaml @@ -0,0 +1,18 @@ +prototypes: + standard: + validatorsDefinition: + DateRange: + implementationClassName: TYPO3\CMS\Form\Mvc\Validation\DateRangeValidator + options: + format: Y-m-d + # minimum date formatted as Y-m-d + #minimum: + # maximum date formatted as Y-m-d + #maximum: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FormElement.validators.DateRange.editor.header.label + predefinedDefaults: + options: + minimum: '' + maximum: '' diff --git a/Configuration/Form/Base/Validators/DateTime.yaml b/Configuration/Form/Base/Validators/DateTime.yaml new file mode 100644 index 0000000..0583950 --- /dev/null +++ b/Configuration/Form/Base/Validators/DateTime.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + DateTime: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\DateTimeValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.DatePicker.validators.DateTime.editor.header.label diff --git a/Configuration/Form/Base/Validators/EmailAddress.yaml b/Configuration/Form/Base/Validators/EmailAddress.yaml new file mode 100644 index 0000000..b5a92ef --- /dev/null +++ b/Configuration/Form/Base/Validators/EmailAddress.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + EmailAddress: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\EmailAddressValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label diff --git a/Configuration/Form/Base/Validators/FileSize.yaml b/Configuration/Form/Base/Validators/FileSize.yaml new file mode 100644 index 0000000..00fd35f --- /dev/null +++ b/Configuration/Form/Base/Validators/FileSize.yaml @@ -0,0 +1,17 @@ +prototypes: + standard: + validatorsDefinition: + FileSize: + implementationClassName: TYPO3\CMS\Form\Mvc\Validation\FileSizeValidator + #options: + # minimum file size to accept + #minimum: + # maximum file size to accept + #maximum: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label + predefinedDefaults: + options: + minimum: 0B + maximum: 10M diff --git a/Configuration/Form/Base/Validators/Float.yaml b/Configuration/Form/Base/Validators/Float.yaml new file mode 100644 index 0000000..a387f7e --- /dev/null +++ b/Configuration/Form/Base/Validators/Float.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + Float: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\FloatValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Float.label diff --git a/Configuration/Form/Base/Validators/Integer.yaml b/Configuration/Form/Base/Validators/Integer.yaml new file mode 100644 index 0000000..537caf2 --- /dev/null +++ b/Configuration/Form/Base/Validators/Integer.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + Integer: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\IntegerValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Integer.label diff --git a/Configuration/Form/Base/Validators/NotEmpty.yaml b/Configuration/Form/Base/Validators/NotEmpty.yaml new file mode 100644 index 0000000..9ea36bd --- /dev/null +++ b/Configuration/Form/Base/Validators/NotEmpty.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + NotEmpty: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FormElement.editor.requiredValidator.label diff --git a/Configuration/Form/Base/Validators/Number.yaml b/Configuration/Form/Base/Validators/Number.yaml new file mode 100644 index 0000000..4535425 --- /dev/null +++ b/Configuration/Form/Base/Validators/Number.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + Number: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NumberValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Number.label diff --git a/Configuration/Form/Base/Validators/NumberRange.yaml b/Configuration/Form/Base/Validators/NumberRange.yaml new file mode 100644 index 0000000..d6a504b --- /dev/null +++ b/Configuration/Form/Base/Validators/NumberRange.yaml @@ -0,0 +1,17 @@ +prototypes: + standard: + validatorsDefinition: + NumberRange: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NumberRangeValidator + #options: + # minimum value to accept + #minimum: + # maximum value to accept + #maximum: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.NumberRange.label + predefinedDefaults: + options: + minimum: '' + maximum: '' diff --git a/Configuration/Form/Base/Validators/RegularExpression.yaml b/Configuration/Form/Base/Validators/RegularExpression.yaml new file mode 100644 index 0000000..0544ea9 --- /dev/null +++ b/Configuration/Form/Base/Validators/RegularExpression.yaml @@ -0,0 +1,14 @@ +prototypes: + standard: + validatorsDefinition: + RegularExpression: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\RegularExpressionValidator + #options: + # the regular expression to use for validation, used as given + #regularExpression: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.RegularExpression.label + predefinedDefaults: + options: + regularExpression: '' diff --git a/Configuration/Form/Base/Validators/StringLength.yaml b/Configuration/Form/Base/Validators/StringLength.yaml new file mode 100644 index 0000000..264317e --- /dev/null +++ b/Configuration/Form/Base/Validators/StringLength.yaml @@ -0,0 +1,17 @@ +prototypes: + standard: + validatorsDefinition: + StringLength: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\StringLengthValidator + #options: + # minimum length for a valid string + #minimum: + # maximum length for a valid string + #maximum: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.StringLength.label + predefinedDefaults: + options: + minimum: '' + maximum: '' diff --git a/Configuration/Form/Base/Validators/Text.yaml b/Configuration/Form/Base/Validators/Text.yaml new file mode 100644 index 0000000..3d14b74 --- /dev/null +++ b/Configuration/Form/Base/Validators/Text.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + validatorsDefinition: + Text: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\TextValidator + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Text.label diff --git a/Configuration/Form/Base/config.yaml b/Configuration/Form/Base/config.yaml new file mode 100644 index 0000000..616674b --- /dev/null +++ b/Configuration/Form/Base/config.yaml @@ -0,0 +1,177 @@ +imports: + # Validators + - { resource: 'EXT:form/Configuration/Form/Base/Validators/NotEmpty.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/DateTime.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/Alphanumeric.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/Text.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/StringLength.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/EmailAddress.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/Integer.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/Float.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/Number.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/NumberRange.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/RegularExpression.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/Count.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/FileSize.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Validators/DateRange.yaml' } + + # Form elements + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Form.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Page.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/SummaryPage.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Fieldset.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/GridColumn.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/GridRow.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Text.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Password.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/AdvancedPassword.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Textarea.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Honeypot.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Hidden.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Email.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Telephone.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Url.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Number.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Date.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Checkbox.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/MultiCheckbox.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/MultiSelect.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/RadioButton.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/SingleSelect.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/CountrySelect.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/StaticText.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/ContentElement.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/FileUpload.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/ImageUpload.yaml' } + + # Finishers + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/Closure.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/Confirmation.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/EmailToSender.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/EmailToReceiver.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/DeleteUploads.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/FlashMessage.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/Redirect.yaml' } + - { resource: 'EXT:form/Configuration/Form/Base/Finishers/SaveToDatabase.yaml' } + +name: typo3/form-base +label: 'TYPO3 Form — Base Configuration' +priority: 10 + +persistenceManager: + allowSaveToExtensionPaths: false + allowDeleteFromExtensionPaths: false + sortByKeys: + - name + - fileUid + sortAscending: true + +prototypes: + standard: + formEditor: + translationFiles: + 10: 'EXT:form/Resources/Private/Language/Database.xlf' + dynamicJavaScriptModules: + app: '@typo3/form/backend/form-editor.js' + mediator: '@typo3/form/backend/form-editor/mediator.js' + viewModel: '@typo3/form/backend/form-editor/view-model.js' + addInlineSettings: { } + maximumUndoSteps: 10 + stylesheets: + 200: 'EXT:form/Resources/Public/Css/form.css' + formEditorFluidConfiguration: + templatePathAndFilename: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Partials/FormEditor/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Layouts/FormEditor/' + + formEditorPartials: + Modal-InsertElements: Modals/InsertElements + Modal-InsertPages: Modals/InsertPages + Modal-ValidationErrors: Modals/ValidationErrors + 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 + Inspector-CountrySelectEditor: Inspector/CountrySelectEditor + Inspector-CountrySingleSelectEditor: Inspector/CountrySingleSelectEditor + Inspector-DateEditor: Inspector/DateEditor + + 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 + RegularExpressionPattern: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.RegularExpressionPattern.label + ItemCount: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.ItemCount.label + IntegerList: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.IntegerList.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 + + formEngine: + translationFiles: + 10: 'EXT:form/Resources/Private/Language/Database.xlf' + +formManager: + dynamicJavaScriptModules: + app: '@typo3/form/backend/form-manager.js' + viewModel: '@typo3/form/backend/form-manager/view-model.js' + stylesheets: + 100: 'EXT:form/Resources/Public/Css/form.css' + translationFiles: + 10: 'EXT:form/Resources/Private/Language/Database.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 diff --git a/Configuration/JavaScriptModules.php b/Configuration/JavaScriptModules.php new file mode 100644 index 0000000..aa8b6a4 --- /dev/null +++ b/Configuration/JavaScriptModules.php @@ -0,0 +1,11 @@ + [ + 'backend', + 'core', + ], + 'imports' => [ + '@typo3/form/backend/' => 'EXT:form/Resources/Public/JavaScript/backend/', + ], +]; diff --git a/Configuration/RTE/FormContent.yaml b/Configuration/RTE/FormContent.yaml new file mode 100644 index 0000000..51c306c --- /dev/null +++ b/Configuration/RTE/FormContent.yaml @@ -0,0 +1,23 @@ +# Load processing options +imports: + - { resource: 'EXT:form/Configuration/RTE/ProcessingContent.yaml' } + - { resource: 'EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml' } + - { resource: 'EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml' } + +# RTE configuration for form content fields (e.g., StaticText) +# Contains extended formatting options including lists +editor: + config: + toolbar: + items: + - bold + - italic + - '|' + - link + - '|' + - bulletedList + - numberedList + - '|' + - clipboard + - undo + - redo diff --git a/Configuration/RTE/FormLabel.yaml b/Configuration/RTE/FormLabel.yaml new file mode 100644 index 0000000..2f6ede2 --- /dev/null +++ b/Configuration/RTE/FormLabel.yaml @@ -0,0 +1,20 @@ +# Load processing options +imports: + - { resource: 'EXT:form/Configuration/RTE/ProcessingLabel.yaml' } + - { resource: 'EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml' } + - { resource: 'EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml' } + +# RTE configuration for form labels and short text fields +# Contains only essential formatting options: bold, italic, link +editor: + config: + toolbar: + items: + - bold + - italic + - '|' + - link + - '|' + - clipboard + - undo + - redo diff --git a/Configuration/RTE/ProcessingContent.yaml b/Configuration/RTE/ProcessingContent.yaml new file mode 100644 index 0000000..7f93e0c --- /dev/null +++ b/Configuration/RTE/ProcessingContent.yaml @@ -0,0 +1,40 @@ +# ******************************************************** +# Processing configuration for form content fields +# Extended version that allows lists +# https://docs.typo3.org/permalink/t3tsref:rte-config-proc +# ******************************************************** + +processing: + mode: default + # Tags that are allowed in the content + # Includes list elements for extended formatting + allowTags: + - a + - br + - i + - strong + - ul + - ol + - li + - p + + denyTags: b,u,img,div,center,pre,figure,figcaption,font,hr,sub,sup,em,blockquote,strike,span,abbr,acronym,dfn + + ## Tags that are allowed outside of paragraphs + allowTagsOutside: + - ul + - ol + + ## CONTENT TO PERSISTENCE + HTMLparser_db: + + ## REMOVE OPEN OFFICE META DATA TAGS, WORD 2003 TAGS, LINK, META, STYLE AND TITLE TAGS, AND DEPRECATED HTML TAGS + removeTags: [link, meta, o:p, sdfield, style, title, font, center] + + ## PROTECT CUSTOM TAGS + keepNonMatchedTags: protect + + # HTML Sanitizer + htmlSanitize: + build: default + diff --git a/Configuration/RTE/ProcessingLabel.yaml b/Configuration/RTE/ProcessingLabel.yaml new file mode 100644 index 0000000..f1621d6 --- /dev/null +++ b/Configuration/RTE/ProcessingLabel.yaml @@ -0,0 +1,37 @@ +# ******************************************************** +# Sets the proc options for all default configurations +# https://docs.typo3.org/permalink/t3tsref:rte-config-proc +# ******************************************************** + +processing: + mode: default + # Tags that are allowed in the content in general + # If you adapt this preset, you need to ship your own Checkbox.fluid.html template alongside it + # and adapt the `stripTags` call + allowTags: + - a + - br + - i + - strong + + denyTags: b,u,img,div,center,pre,figure,figcaption,font,hr,sub,sup,em,li,ul,ol,blockquote,strike,span,abbr,acronym,dfn + + ## Tags that are allowed outside of paragraphs + allowTagsOutside: [] + + ## CONTENT TO PERSISTENCE + HTMLparser_db: + + ## REMOVE OPEN OFFICE META DATA TAGS, WORD 2003 TAGS, LINK, META, STYLE AND TITLE TAGS, AND DEPRECATED HTML TAGS + ## We use this rule instead of the denyTags rule so that we can protect custom tags without protecting these unwanted tags. + removeTags: [link, meta, o:p, sdfield, style, title, font, center] + + ## PROTECT CUSTOM TAGS + keepNonMatchedTags: protect + + # HTML Sanitizer + # `htmlSanitize = false | null` to disable individually + htmlSanitize: + # either preset name as declared in `$GLOBALS['TYPO3_CONF_VARS']['SYS']['htmlSanitizer']` + # or class-name implementing interface `\TYPO3\HtmlSanitizer\Builder\BuilderInterface` + build: default diff --git a/Configuration/Services.php b/Configuration/Services.php new file mode 100644 index 0000000..3911364 --- /dev/null +++ b/Configuration/Services.php @@ -0,0 +1,30 @@ +registerForAutoconfiguration(FinisherInterface::class)->addTag('form.finisher'); + $containerBuilder->addCompilerPass(new PublicServicePass('form.finisher', true)); + + if ($containerBuilder->hasDefinition(ProviderRegistry::class)) { + $container->services()->defaults()->autowire()->autoconfigure()->public() + ->set('lowlevel.configuration.module.provider.formyamlconfiguration') + ->class(FormYamlProvider::class) + ->tag( + 'lowlevel.configuration.module.provider', + [ + 'identifier' => 'formYamlConfiguration', + 'after' => 'eventListeners', + ] + ); + } +}; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml new file mode 100644 index 0000000..afa0857 --- /dev/null +++ b/Configuration/Services.yaml @@ -0,0 +1,40 @@ +services: + _defaults: + autowire: true + autoconfigure: true + public: false + + TYPO3\CMS\Form\: + resource: '../Classes/*' + exclude: + - '../Classes/{Domain/Model}' + - '../Classes/Mvc/Configuration/FormYamlConfiguration.php' + + # Explicitly declared public so that ConfigurationManager can receive it via + # DI autowiring. Populated at container build time via FormYamlCollectorConfigurator. + TYPO3\CMS\Form\Mvc\Configuration\FormYamlCollector: + public: true + configurator: + - '@TYPO3\CMS\Form\DependencyInjection\FormYamlCollectorConfigurator' + - 'configure' + + TYPO3\CMS\Form\SoftReference\FormPersistenceIdentifierSoftReferenceParser: + tags: + - name: softreference.parser + parserKey: formPersistenceIdentifier + + TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter: + tags: + - name: extbase.type_converter + priority: 10 + target: TYPO3\CMS\Form\Type\FormDefinitionArray + sources: string + + TYPO3\CMS\Form\Storage\StorageAdapterFactory: + public: true + arguments: + $adapters: !tagged_iterator form.storage.adapter + + _instanceof: + TYPO3\CMS\Form\Storage\StorageAdapterInterface: + tags: [ 'form.storage.adapter' ] diff --git a/Configuration/Sets/Form/config.yaml b/Configuration/Sets/Form/config.yaml new file mode 100644 index 0000000..24216c7 --- /dev/null +++ b/Configuration/Sets/Form/config.yaml @@ -0,0 +1,2 @@ +name: typo3/form +label: Form Framework diff --git a/Configuration/Sets/Form/labels.xlf b/Configuration/Sets/Form/labels.xlf new file mode 100644 index 0000000..859aef8 --- /dev/null +++ b/Configuration/Sets/Form/labels.xlf @@ -0,0 +1,44 @@ + + + +
+ + + Form + + + Form + + + Templates + + + Translation + + + Path of Fluid Templates for form elements + + + Override the default Fluid template path for all form element rendering (e.g. EXT:my_sitepackage/Resources/Private/Templates/Form/Frontend/) + + + Path of Fluid Partials for form elements + + + Override the default Fluid partial path for all form element rendering (e.g. EXT:my_sitepackage/Resources/Private/Partials/Form/Frontend/) + + + Path of Fluid Layouts for form elements + + + Override the default Fluid layout path for all form element rendering (e.g. EXT:my_sitepackage/Resources/Private/Layouts/Form/Frontend/) + + + Additional translation file for form elements + + + Additional XLF translation file for form element labels (e.g. EXT:my_sitepackage/Resources/Private/Language/Form/locallang.xlf) + + + + diff --git a/Configuration/Sets/Form/settings.definitions.yaml b/Configuration/Sets/Form/settings.definitions.yaml new file mode 100644 index 0000000..2e8c0a2 --- /dev/null +++ b/Configuration/Sets/Form/settings.definitions.yaml @@ -0,0 +1,24 @@ +categories: + form: ~ + form.templates: + parent: form + form.translation: + parent: form + +settings: + form.templates.templateRootPath: + default: '' + type: string + category: form.templates + form.templates.partialRootPath: + default: '' + type: string + category: form.templates + form.templates.layoutRootPath: + default: '' + type: string + category: form.templates + form.translation.translationFile: + default: '' + type: string + category: form.translation diff --git a/Configuration/Sets/Form/setup.typoscript b/Configuration/Sets/Form/setup.typoscript new file mode 100644 index 0000000..c641d6d --- /dev/null +++ b/Configuration/Sets/Form/setup.typoscript @@ -0,0 +1 @@ +@import 'EXT:form/Configuration/TypoScript/setup.typoscript' diff --git a/Configuration/TCA/Overrides/sys_template.php b/Configuration/TCA/Overrides/sys_template.php new file mode 100644 index 0000000..7292bbc --- /dev/null +++ b/Configuration/TCA/Overrides/sys_template.php @@ -0,0 +1,11 @@ + [ + 'title' => 'form.db:form_definition', + 'label' => 'label', + 'crdate' => 'crdate', + 'tstamp' => 'tstamp', + 'versioningWS' => false, + 'default_sortby' => 'label', + 'delete' => 'deleted', + 'rootLevel' => 1, + 'security' => [ + 'ignoreRootLevelRestriction' => true, + ], + 'typeicon_classes' => [ + 'default' => 'content-form', + ], + ], + 'types' => [ + '0' => [ + 'showitem' => ' + --div--;core.form.tabs:general, label, identifier, configuration, + ', + ], + ], + 'columns' => [ + 'label' => [ + 'label' => 'form.db:form_definition.label', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim', + 'readOnly' => true, + 'required' => true, + ], + ], + 'identifier' => [ + 'label' => 'form.db:form_definition.identifier', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,unique', + 'readOnly' => true, + 'required' => true, + ], + ], + 'configuration' => [ + 'label' => 'form.db:form_definition.configuration', + 'config' => [ + 'type' => 'json', + 'readOnly' => true, + 'required' => true, + ], + ], + ], + +]; diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript new file mode 100644 index 0000000..b4b60af --- /dev/null +++ b/Configuration/TypoScript/setup.typoscript @@ -0,0 +1,28 @@ +plugin.tx_form { + view { + templateRootPaths { + 0 = EXT:form/Resources/Private/Frontend/Templates/ + 10 = {$form.templates.templateRootPath} + } + partialRootPaths { + 0 = EXT:form/Resources/Private/Frontend/Partials/ + 10 = {$form.templates.partialRootPath} + } + layoutRootPaths { + 0 = EXT:form/Resources/Private/Frontend/Layouts/ + 10 = {$form.templates.layoutRootPath} + } + } + + mvc { + callDefaultActionIfActionCantBeResolved = 1 + } +} + +# Rendering of content elements +lib.tx_form.contentElementRendering = RECORDS +lib.tx_form.contentElementRendering { + tables = tt_content + source.current = 1 + dontCheckPid = 1 +} diff --git a/Configuration/page.tsconfig b/Configuration/page.tsconfig new file mode 100644 index 0000000..0c38344 --- /dev/null +++ b/Configuration/page.tsconfig @@ -0,0 +1,4 @@ +# Deny creating form_definition records via the "New Record" wizard +# or the "+" button in the record list. Form definitions should only +# be created through the Form Manager module. +mod.web_list.deniedNewTables := addToList(form_definition) diff --git a/Documentation/D/Events/Index.rst b/Documentation/D/Events/Index.rst new file mode 100644 index 0000000..97c3f6f --- /dev/null +++ b/Documentation/D/Events/Index.rst @@ -0,0 +1,171 @@ +.. include:: /Includes.rst.txt + +.. _apireference-events: +.. _apireference-formeditor-events: +.. _apireference-formeditor-hooks-beforeformcreate: +.. _apireference-formeditor-hooks-beforeformcreate-connect: +.. _apireference-formeditor-hooks-beforeformcreate-use: +.. _apireference-formeditor-events-beforeformiscreatedevent: +.. _apireference-formeditor-hooks-beforeformduplicate: +.. _apireference-formeditor-hooks-beforeformduplicate-connect: +.. _apireference-formeditor-hooks-beforeformduplicate-use: +.. _apireference-formeditor-hooks-beforeformdelete: +.. _apireference-formeditor-hooks-beforeformdelete-connect: +.. _apireference-formeditor-hooks-beforeformdelete-use: +.. _apireference-frontendrendering-runtimemanipulation-hooks: +.. _apireference-frontendrendering-runtimemanipulation-hooks-initializeformelement: +.. _apireference-frontendrendering-runtimemanipulation-hooks-initializeformelement-connect: +.. _apireference-frontendrendering-runtimemanipulation-hooks-initializeformelement-use: +.. _apireference-frontendrendering-runtimemanipulation-hooks-beforeremovefromparentrenderable: +.. _apireference-frontendrendering-runtimemanipulation-hooks-beforeremovefromparentrenderable-connect: +.. _apireference-frontendrendering-runtimemanipulation-hooks-beforeremovefromparentrenderable-use: +.. _apireference-frontendrendering-runtimemanipulation-hooks-afterbuildingfinished: +.. _apireference-frontendrendering-runtimemanipulation-hooks-afterbuildingfinished-connect: +.. _apireference-frontendrendering-runtimemanipulation-hooks-afterbuildingfinished-use: +.. _apireference-frontendrendering-runtimemanipulation-hooks-afterinitializecurrentpage: +.. _apireference-frontendrendering-runtimemanipulation-hooks-afterinitializecurrentpage-connect: +.. _apireference-frontendrendering-runtimemanipulation-hooks-afterinitializecurrentpage-use: +.. _apireference-frontendrendering-runtimemanipulation-hooks-aftersubmit: +.. _apireference-frontendrendering-runtimemanipulation-hooks-aftersubmit-connect: +.. _apireference-frontendrendering-runtimemanipulation-hooks-aftersubmit-use: +.. _apireference-frontendrendering-runtimemanipulation-hooks-beforerendering: +.. _apireference-frontendrendering-runtimemanipulation-hooks-beforerendering-connect: +.. _apireference-frontendrendering-runtimemanipulation-hooks-beforerendering-use: +.. _apireference-events-legacy-hooks-buildformvalidationconfiguration: +.. _apireference-events-legacy-hooks-afterformstateinitialized: +.. _apireference-events-legacy-hooks: + +================ +PSR-14 Events +================ + +EXT:form dispatches PSR-14 events at key points in the lifecycle of a form – +both in the backend form editor and during frontend rendering. These events +are the recommended extension point for developers; the legacy +:php:`$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']` hooks have been removed. + +.. seealso:: + The canonical, always-up-to-date reference for all EXT:form events lives + in the TYPO3 Core API documentation: + + `Form `_ + + The extension documentation below provides context, usage notes and + quick navigation; it intentionally avoids duplicating the full API + reference. + +.. contents:: + :depth: 1 + :local: + +.. _apireference-events-backend: + +Backend events (form editor / manager) +======================================= + +These events are dispatched when an editor creates, saves, duplicates or +deletes a form definition in the TYPO3 backend. + +.. _apireference-events-backend-table: + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Event + - When / what can be modified + * - `BeforeFormIsCreatedEvent + `_ + - Modify the form definition array and/or the persistence identifier + before a new form is created in the backend. + * - `BeforeFormIsSavedEvent + `_ + - Modify the form definition array and/or the persistence identifier + before a form is saved in the backend. + * - `BeforeFormIsDuplicatedEvent + `_ + - Modify the form definition array and/or the persistence identifier + of the copy before a form is duplicated. + * - `BeforeFormIsDeletedEvent + `_ + - Dispatched before a form is deleted. Set + :php:`$event->preventDeletion = true` to abort the deletion (the + event implements :php:`StoppableEventInterface`). + +.. _apireference-events-frontend: + +Frontend events (form rendering / runtime) +========================================== + +These events are dispatched during form rendering in the frontend. + +.. _apireference-events-frontend-table: + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Event + - When / what can be modified + * - `AfterFormIsBuiltEvent + `_ + - Modify the :php:`FormDefinition` object after the form factory has + finished building the complete form. + * - `BeforeRenderableIsAddedToFormEvent + `_ + - Modify or replace a renderable (page, section or element) before it + is added to the form tree. + * - `BeforeRenderableIsRemovedFromFormEvent + `_ + - Dispatched before a renderable is removed from the form tree. Set + :php:`$event->preventRemoval = true` to abort the removal (the + event implements :php:`StoppableEventInterface`). + * - `AfterCurrentPageIsResolvedEvent + `_ + - Override :php:`$event->currentPage` after the current page has been + resolved from the request, e.g. to implement conditional page-skip + logic. + * - `BeforeRenderableIsValidatedEvent + `_ + - Modify :php:`$event->value` before property-mapping and validation + run for each submitted form element. + * - `BeforeRenderableIsRenderedEvent + `_ + - Modify the renderable or the :php:`FormRuntime` just before a + renderable is output to the browser. + * - `BeforeEmailFinisherInitializedEvent + `_ + - Modify the options used by the :php:`EmailFinisher` (e.g. recipients, + subject) before they are applied. + * - `AfterFormStateInitializedEvent + `_ + - Enrich components with runtime data after the :php:`FormState` has + been restored from the request (form state and form session are + both available at this point). + * - `AfterFormDefinitionLoadedEvent + `_ + - Dispatched by :php:`FormPersistenceManager` after a YAML form + definition has been loaded from disk. Modify the definition globally + before it reaches the form factory. + * - `AfterFormDefinitionValidationConfigurationIsBuiltEvent + `_ + - Dispatched after the form definition validation configuration has + been built from the form editor setup. Add additional writable + property paths for custom inspector editor implementations. + +.. _apireference-events-register: + +Registering an event listener +============================== + +Register a listener via the :php:`#[AsEventListener]` PHP attribute: + +.. literalinclude:: _codesnippets/_MyFormEventListener.php + :language: php + :caption: EXT:my_extension/Classes/EventListener/MyFormEventListener.php + + +.. seealso:: + :ref:`t3coreapi:EventDispatcher` – TYPO3 Core API documentation on how to + register and implement PSR-14 event listeners. + diff --git a/Documentation/D/Events/_codesnippets/_MyFormEventListener.php b/Documentation/D/Events/_codesnippets/_MyFormEventListener.php new file mode 100644 index 0000000..e489538 --- /dev/null +++ b/Documentation/D/Events/_codesnippets/_MyFormEventListener.php @@ -0,0 +1,20 @@ +form['renderingOptions']['myCustomOption'] = 'value'; + } +} diff --git a/Documentation/D/FormEditor/FormElementModel/Index.rst b/Documentation/D/FormEditor/FormElementModel/Index.rst new file mode 100644 index 0000000..6123355 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/Index.rst @@ -0,0 +1,182 @@ +.. include:: /Includes.rst.txt + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel: +.. _apireference-formeditor-formelementmodel: + +================== +FormElement model +================== + +Every form element in the editor is represented by a **FormElement model** +object. This model is the single source of truth for all element properties +during an editing session; it is separate from the YAML form definition on +disk (which is only written on save). + +.. contents:: + :depth: 1 + :local: + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-property-identifierpath: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-property-parentrenderable: +.. _apireference-formeditor-formelementmodel-structure: + +Model structure +=============== + +A FormElement model carries all YAML properties of the element plus two +internal bookkeeping properties: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Property + - Description + * - :js:`__identifierPath` + - Slash-separated path from the root element to this element + (e.g. :js:`'example-form/page-1/name'`). Used as a unique key + for API lookups. + * - :js:`__parentRenderable` + - Reference to the parent FormElement model (filtered for display). + +Example model in memory: + +.. literalinclude:: _codesnippets/_model-structure.js + :language: javascript + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-get: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-get-propertycollectionproperties: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-get-renderables: +.. _apireference-formeditor-formelementmodel-api-get: + +get() +----- + +Reads a property by its dot-separated path. All intermediate levels must +be objects. + +.. literalinclude:: _codesnippets/_get-simple.js + :language: javascript + +For **property collections** (validators / finishers), whose position in +the array is unknown, use :js:`buildPropertyPath()` first: + +.. literalinclude:: _codesnippets/_get-property-collection.js + :language: javascript + +For **renderables** (child elements), :js:`get('renderables')` returns a +plain array of FormElement models. To access a specific child, use +:js:`formEditorApp.getFormElementByIdentifierPath()` with the full path. + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-set: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-set-propertycollectionproperties: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-set-renderables: +.. _apireference-formeditor-formelementmodel-api-set: + +set() +----- + +Writes a property by its dot-separated path. Every :js:`set()` call +automatically publishes all events registered for that path via +:ref:`on() `, including +the built-in +:ref:`core/formElement/somePropertyChanged `. + +.. literalinclude:: _codesnippets/_set.js + :language: javascript + +To modify property collection properties or add child renderables, use +the dedicated API methods on :js:`formEditorApp` / :js:`getViewModel()` +instead of setting array positions directly: + +- :js:`createAndAddFormElement()` +- :js:`addFormElement()` +- :js:`moveFormElement()` +- :js:`removeFormElement()` + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-unset: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-unset-propertycollectionproperties: +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-unset-renderables: +.. _apireference-formeditor-formelementmodel-api-unset: + +unset() +------- + +Removes a property at the given dot-separated path. + +.. literalinclude:: _codesnippets/_unset.js + :language: javascript + +For property collection properties, use :js:`buildPropertyPath()` in the +same way as for :ref:`get() `. + +To remove a child renderable, call +:js:`formEditorApp.removeFormElement()`. + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-on: +.. _apireference-formeditor-formelementmodel-api-on: + +on() +---- + +Registers an additional publish/subscribe event name that is fired +whenever :js:`set()` is called for a given property path. + +.. literalinclude:: _codesnippets/_on.js + :language: javascript + +By default EXT:form registers +:ref:`core/formElement/somePropertyChanged ` +for every known property path of every form element. + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-off: +.. _apireference-formeditor-formelementmodel-api-off: + +off() +----- + +Removes an event registration created with :js:`on()`. + +.. literalinclude:: _codesnippets/_off.js + :language: javascript + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-getobjectdata: +.. _apireference-formeditor-formelementmodel-api-getobjectdata: + +getObjectData() +--------------- + +Returns a deep-cloned plain object of all properties. Used internally for +Ajax serialisation. Provides read access to data set via :js:`set()` from +outside the model without breaking encapsulation. + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-clone: +.. _apireference-formeditor-formelementmodel-api-clone: + +clone() +------- + +Returns a fully dereferenced clone of the FormElement model. + +.. literalinclude:: _codesnippets/_clone.js + :language: javascript + + +.. _apireference-formeditor-basicjavascriptconcepts-formelementmodel-method-tostring: +.. _apireference-formeditor-formelementmodel-api-tostring: + +toString() +---------- + +Returns the model data as a JSON string. Intended for debugging. + +.. literalinclude:: _codesnippets/_to-string.js + :language: javascript diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_clone.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_clone.js new file mode 100644 index 0000000..6fc0515 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_clone.js @@ -0,0 +1,5 @@ +export function bootstrap(formEditorApp) { + const formElement = formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name'); + const copy = formElement.clone(); +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-property-collection.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-property-collection.js new file mode 100644 index 0000000..5eb188e --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-property-collection.js @@ -0,0 +1,10 @@ +export function bootstrap(formEditorApp) { + const formElement = formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name'); + + const propertyPath = formEditorApp + .buildPropertyPath('options.minimum', 'StringLength', 'validators', formElement); + // propertyPath = e.g. 'validators.0.options.minimum' + + const value = formElement.get(propertyPath); // '1' +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-simple.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-simple.js new file mode 100644 index 0000000..59b5a82 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_get-simple.js @@ -0,0 +1,6 @@ +export function bootstrap(formEditorApp) { + // Returns 'Name' + const placeholder = formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name') + .get('properties.fluidAdditionalAttributes.placeholder'); +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_model-structure.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_model-structure.js new file mode 100644 index 0000000..1ef3513 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_model-structure.js @@ -0,0 +1,19 @@ +// Illustrative snapshot of a FormElement model as it exists in memory at runtime. +// The actual object is managed by the FormElement class – access it via +// formEditorApp.getFormElementByIdentifierPath() and the get()/set() API. +export const formElementSnapshot = { + identifier: 'name', + defaultValue: '', + label: 'Name', + type: 'Text', + properties: { + fluidAdditionalAttributes: { + placeholder: 'Name', + }, + }, + __parentRenderable: 'example-form/page-1 (filtered)', + __identifierPath: 'example-form/page-1/name', + validators: [ + { identifier: 'NotEmpty' }, + ], +}; diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_off.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_off.js new file mode 100644 index 0000000..a3e827a --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_off.js @@ -0,0 +1,5 @@ +export function bootstrap(formEditorApp) { + formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name') + .off('properties.fluidAdditionalAttributes.placeholder', 'my/custom/event'); +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_on.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_on.js new file mode 100644 index 0000000..353c896 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_on.js @@ -0,0 +1,9 @@ +export function bootstrap(formEditorApp) { + const element = formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name'); + + element.on('properties.fluidAdditionalAttributes.placeholder', 'my/custom/event'); + + // The next set() on that path will also publish 'my/custom/event'. + element.set('properties.fluidAdditionalAttributes.placeholder', 'New Placeholder'); +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_set.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_set.js new file mode 100644 index 0000000..f8d3964 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_set.js @@ -0,0 +1,5 @@ +export function bootstrap(formEditorApp) { + formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name') + .set('properties.fluidAdditionalAttributes.placeholder', 'New Placeholder'); +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_to-string.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_to-string.js new file mode 100644 index 0000000..742e5d8 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_to-string.js @@ -0,0 +1,5 @@ +export function bootstrap(formEditorApp) { + const formElement = formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name'); + console.log(formElement.toString()); +} diff --git a/Documentation/D/FormEditor/FormElementModel/_codesnippets/_unset.js b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_unset.js new file mode 100644 index 0000000..64cd795 --- /dev/null +++ b/Documentation/D/FormEditor/FormElementModel/_codesnippets/_unset.js @@ -0,0 +1,5 @@ +export function bootstrap(formEditorApp) { + formEditorApp + .getFormElementByIdentifierPath('example-form/page-1/name') + .unset('properties.fluidAdditionalAttributes.placeholder'); +} diff --git a/Documentation/D/FormEditor/Index.rst b/Documentation/D/FormEditor/Index.rst new file mode 100644 index 0000000..c6c4b94 --- /dev/null +++ b/Documentation/D/FormEditor/Index.rst @@ -0,0 +1,97 @@ +.. include:: /Includes.rst.txt + + +.. _apireference-formeditor: +.. _apireference-formeditor-basicjavascriptconcepts: +.. _apireference-formeditor-basicjavascriptconcepts-events: +.. _apireference-formeditor-stage: + +=========== +Form Editor +=========== + +This chapter is the developer reference for the TYPO3 backend form editor. +It covers the JavaScript extension points and the data model used by the +editor's TypeScript modules. + +.. contents:: + :depth: 1 + :local: + +.. _apireference-formeditor-architecture: + +Architecture overview +===================== + +The form editor consists of four cooperating TypeScript modules, each +responsible for one UI component: + +.. list-table:: + :header-rows: 1 + :widths: 30 35 35 + + * - Module (import path) + - Component + - Responsibility + * - :js:`@typo3/form/backend/form-editor/view-model` + - — + - Central view model; wires DOM events and publishes/subscribes + to all cross-component events. + * - :js:`@typo3/form/backend/form-editor/stage-component` + - **Stage** + - Renders the abstract and preview views of the current form page. + * - :js:`@typo3/form/backend/form-editor/inspector-component` + - **Inspector** + - Renders the property editors for the selected form element. + * - :js:`@typo3/form/backend/form-editor/tree-component-adapter` + - **Structure tree** + - Wraps the TYPO3 backend tree web component and bridges its + events to the publish/subscribe bus. + * - :js:`@typo3/form/backend/form-editor/mediator` + - — + - Wires all publish/subscribe events to view-model actions. + Loaded automatically; replace via + :yaml:`dynamicJavaScriptModules.mediator` only when you need to + completely swap the event-wiring logic. + +All modules communicate exclusively via a **publish/subscribe bus** +(:js:`PublisherSubscriber`). Direct module-to-module calls are avoided +so that extension code can hook into any point without modifying core +files. + +.. _apireference-formeditor-custom-modules: + +Registering a custom JavaScript module +======================================= + +Custom modules must export a :js:`bootstrap` function. The form editor +calls this function once all built-in modules have loaded, passing the +central :js:`FormEditor` application object as the sole argument. + +.. rst-class:: bignums-xxl + +1. Create the JavaScript module + + .. literalinclude:: _codesnippets/_bootstrap.js + :language: javascript + :caption: EXT:my_extension/Resources/Public/JavaScript/backend/form-editor/view-model.js + +2. Register the module in the importmap + + .. literalinclude:: _codesnippets/_JavaScriptModules.php + :language: php + :caption: EXT:my_extension/Configuration/JavaScriptModules.php + +3. Tell the form editor to load the module + + .. literalinclude:: _codesnippets/_prototype-setup.yaml + :language: yaml + :caption: EXT:my_extension/Configuration/Form/MyFormSet/config.yaml + + +.. toctree:: + :maxdepth: 1 + + JavaScriptEvents/Index + StageTemplates/Index + FormElementModel/Index diff --git a/Documentation/D/FormEditor/JavaScriptEvents/Index.rst b/Documentation/D/FormEditor/JavaScriptEvents/Index.rst new file mode 100644 index 0000000..1b4ccd1 --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/Index.rst @@ -0,0 +1,1717 @@ +.. include:: /Includes.rst.txt + +.. _apireference-formeditor-jsevents: + +=================== +JavaScript events +=================== + +The form editor uses a **publish/subscribe bus** for all cross-component +communication. Any custom JavaScript module can subscribe to these events +to extend or react to editor behaviour without patching core files. + +.. note:: + The module system is **ES modules** (ESM). The legacy AMD + :js:`define([…], function() {})` pattern from TYPO3 v11 and earlier is + no longer supported. Custom modules must use :js:`export function bootstrap(formEditorApp)`. + See :ref:`apireference-formeditor-custom-modules`. + +.. contents:: + :depth: 1 + :local: + + +.. _apireference-formeditor-jsevents-pubsub: + +Publish / subscribe basics +========================== + +.. literalinclude:: _codesnippets/_subscribe.js + :language: javascript + :caption: Subscribe to an event + +.. literalinclude:: _codesnippets/_publish.js + :language: javascript + :caption: Publish a custom event from within your module + + +.. note:: + The order in which subscribers receive an event is not guaranteed. + Subscribers cannot pass data to each other. All event handlers must + be designed without assumptions about execution order. + + +.. _apireference-formeditor-jsevents-overview: + +Event quick-reference +===================== + +.. _apireference-formeditor-jsevents-overview-lifecycle: + +Lifecycle +--------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/ready ` + - All modules loaded; editor is fully initialised. + + +.. _apireference-formeditor-jsevents-overview-ajax: + +Ajax / data transfer +-------------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`core/ajax/saveFormDefinition/success ` + - Form definition saved successfully. + * - :ref:`core/ajax/saveFormDefinition/error ` + - Server returned an error while saving. + * - :ref:`core/ajax/renderFormDefinitionPage/success ` + - Preview HTML for the current page returned successfully. + * - :ref:`core/ajax/error ` + - Any Ajax request (save or preview render) failed. + + +.. _apireference-formeditor-jsevents-overview-state: + +Application state +----------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`core/applicationState/add ` + - Undo/redo stack was updated. + * - :ref:`core/currentlySelectedFormElementChanged ` + - The currently selected form element changed. + * - :ref:`core/formElement/somePropertyChanged ` + - A property was written to a FormElement model via ``set()``. + + +.. _apireference-formeditor-jsevents-overview-formelement: + +Form element lifecycle +---------------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/formElement/inserted ` + - A new form element was added to the tree. + * - :ref:`view/formElement/moved ` + - A form element was moved within the tree. + * - :ref:`view/formElement/removed ` + - A form element was deleted. + + +.. _apireference-formeditor-jsevents-overview-collection: + +Collection elements (validators / finishers) +-------------------------------------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/collectionElement/new/added ` + - A validator or finisher was added. + * - :ref:`view/collectionElement/moved ` + - A validator or finisher was reordered. + * - :ref:`view/collectionElement/removed ` + - A validator or finisher was removed. + + +.. _apireference-formeditor-jsevents-overview-insert: + +Insert element / page dialogs +------------------------------ + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/insertElements/perform/before ` + - Insert new element *before* the selected one. + * - :ref:`view/insertElements/perform/after ` + - Insert new element *after* the selected one. + * - :ref:`view/insertElements/perform/inside ` + - Insert new element *inside* the selected composite. + * - :ref:`view/insertElements/perform/bottom ` + - Insert new element at the end of the current page. + * - :ref:`view/insertPages/perform ` + - Insert a new page after the current one. + + +.. _apireference-formeditor-jsevents-overview-header: + +Header buttons +-------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/header/button/save/clicked ` + - "Save" button clicked. + * - :ref:`view/header/button/close/clicked ` + - "Close" button clicked (with unsaved changes guard). + * - :ref:`view/header/button/newPage/clicked ` + - "New page" button clicked. + * - :ref:`view/header/formSettings/clicked ` + - "Form settings" button clicked. + * - :ref:`view/undoButton/clicked ` + - Undo button clicked. + * - :ref:`view/redoButton/clicked ` + - Redo button clicked. + * - :ref:`view/viewModeButton/abstract/clicked ` + - "Abstract view" toggle clicked. + * - :ref:`view/viewModeButton/preview/clicked ` + - "Preview" toggle clicked. + * - :ref:`view/paginationNext/clicked ` + - "Next page" pagination button clicked. + * - :ref:`view/paginationPrevious/clicked ` + - "Previous page" pagination button clicked. + + +.. _apireference-formeditor-jsevents-overview-stage: + +Stage +----- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/stage/abstract/render/template/perform ` + - **Main extension point.** Stage renders a form element that has a + :yaml:`formEditorPartials` entry. + * - :ref:`view/stage/abstract/render/preProcess ` + - Before the abstract stage area is rendered. + * - :ref:`view/stage/abstract/render/postProcess ` + - After the abstract stage area was rendered. + * - :ref:`view/stage/preview/render/postProcess ` + - After the preview stage area was rendered. + * - :ref:`view/stage/element/clicked ` + - A form element in the stage was clicked. + * - :ref:`view/stage/panel/clicked ` + - The stage panel background was clicked. + * - :ref:`view/stage/abstract/button/newElement/clicked ` + - "Add element" button at the bottom of the stage clicked. + * - :ref:`view/stage/abstract/elementToolbar/button/newElement/clicked ` + - Toolbar "add element" / split button on an element clicked. + * - :ref:`view/stage/abstract/dnd/start ` + - Drag started in the stage. + * - :ref:`view/stage/abstract/dnd/change ` + - Drag position changed in the stage. + * - :ref:`view/stage/abstract/dnd/update ` + - Drag ended, model position updated. + * - :ref:`view/stage/abstract/dnd/stop ` + - Drag operation finished. + + +.. _apireference-formeditor-jsevents-overview-inspector: + +Inspector +--------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/inspector/editor/insert/perform ` + - **Extension point for custom inspector editors.** + * - :ref:`view/inspector/collectionElement/new/selected ` + - A new validator/finisher was chosen in the select box. + * - :ref:`view/inspector/collectionElement/existing/selected ` + - An existing validator/finisher section was expanded. + * - :ref:`view/inspector/collectionElements/dnd/update ` + - A validator/finisher was reordered via drag-and-drop. + * - :ref:`view/inspector/removeCollectionElement/perform ` + - Remove a validator/finisher (from RequiredValidatorEditor checkbox). + + +.. _apireference-formeditor-jsevents-overview-structure: + +Structure tree +-------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/structure/root/selected ` + - Root element in the tree was clicked. + * - :ref:`view/structure/button/newPage/clicked ` + - "New page" button in the tree panel clicked. + * - :ref:`view/structure/renew/postProcess ` + - Tree was re-rendered. + * - :ref:`view/tree/node/clicked ` + - A tree node was clicked. + * - :ref:`view/tree/node/changed ` + - A tree node label was edited inline. + * - :ref:`view/tree/render/listItemAdded ` + - Reserved – not yet published by core. (A list item was added to the tree.) + * - :ref:`view/tree/dnd/change ` + - Drag position changed in the tree. + * - :ref:`view/tree/dnd/update ` + - Drag ended, model position updated. + * - :ref:`view/tree/dnd/stop ` + - Drag operation finished. + + +.. _apireference-formeditor-jsevents-overview-modals: + +Dialogs (modals) +---------------- + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Event + - When it fires + * - :ref:`view/modal/close/perform ` + - User confirmed closing the editor with unsaved changes. + * - :ref:`view/modal/removeFormElement/perform ` + - User confirmed deleting a form element. + * - :ref:`view/modal/removeCollectionElement/perform ` + - User confirmed removing a validator/finisher. + * - :ref:`view/modal/validationErrors/element/clicked ` + - A form element was clicked in the validation-error dialog. + + +.. _apireference-formeditor-jsevents-reference: + +Event reference +=============== + + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-ready: +.. _apireference-formeditor-jsevents-view-ready: + +view/ready +---------- + +Published once all additional view-model modules registered via +:yaml:`dynamicJavaScriptModules.additionalViewModelModules` have +bootstrapped. EXT:form uses this event to remove the loading indicator +and finish editor initialisation. This is the earliest safe point to +interact with the fully wired editor. + +:Arguments: none + +.. literalinclude:: _codesnippets/_view-ready.js + :language: javascript + + +.. _apireference-formeditor-basicjavascriptconcepts-events-core-ajax-saveformdefinition-success: +.. _apireference-formeditor-jsevents-core-ajax-savesuccess: + +core/ajax/saveFormDefinition/success +-------------------------------------- + +Published after the form definition was saved successfully. EXT:form +shows a success flash message, updates the in-memory form definition +and re-renders all components. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`{ status: string, formDefinition: object }` + - Response payload; :js:`formDefinition` is the saved definition. + + +.. _apireference-formeditor-jsevents-core-ajax-saveerror: + +core/ajax/saveFormDefinition/error +------------------------------------ + +Published when the save Ajax request returns a server-side error. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`{ status: string, message: string, code: number }` + - Error details from the server. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-core-ajax-renderformdefinitionpage-success: +.. _apireference-formeditor-jsevents-core-ajax-rendersuccess: + +core/ajax/renderFormDefinitionPage/success +------------------------------------------- + +Published after the preview Ajax request returns successfully. EXT:form +uses this to display the rendered form HTML in the preview stage. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Rendered HTML of the current form page. + * - ``args[1]`` + - :js:`number` + - Zero-based index of the rendered page. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-core-ajax-error: +.. _apireference-formeditor-jsevents-core-ajax-error: + +core/ajax/error +---------------- + +Published when any Ajax request (save or preview render) fails at the +HTTP level. EXT:form shows an error flash message and displays the raw +error in the preview area. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - HTTP status text (e.g. ``'Internal Server Error'``). + * - ``args[1]`` + - :js:`string` + - Raw response body. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-core-applicationstate-add: +.. _apireference-formeditor-jsevents-core-applicationstate-add: + +core/applicationState/add +-------------------------- + +Published every time an action (add / remove / move element or +collection element) is pushed onto the undo/redo stack. EXT:form uses +this to enable or disable the undo/redo buttons. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`ApplicationState` + - Snapshot of the application state that was just pushed. + * - ``args[1]`` + - :js:`number` + - Current stack pointer position (0-based). + * - ``args[2]`` + - :js:`number` + - Total number of entries in the undo/redo stack. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-core-currentlyselectedformelementchanged: +.. _apireference-formeditor-jsevents-core-currentlyselectedformelementchanged: + +core/currentlySelectedFormElementChanged +----------------------------------------- + +Published at the end of :js:`formEditorApp.setCurrentlySelectedFormElement()`. +All components that need to react to a selection change (inspector, stage, +tree highlight) subscribe to this event. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`FormElement` + - The newly selected FormElement model. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-core-formelement-somepropertychanged: +.. _apireference-formeditor-jsevents-core-formelement-somepropertychanged: + +core/formElement/somePropertyChanged +-------------------------------------- + +Published by the FormElement model whenever a property is written via +:js:`set()`. EXT:form uses this to keep the tree labels, stage and +inspector in sync. It is also the mechanism behind +:ref:`FormElement.on() `. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Dot-separated property path that was written. + * - ``args[1]`` + - :js:`unknown` + - New value. + * - ``args[2]`` + - :js:`unknown` + - Previous value. + * - ``args[3]`` + - :js:`string | undefined` + - :js:`__identifierPath` of the element whose property changed. + +.. literalinclude:: _codesnippets/_some-property-changed.js + :language: javascript + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-formelement-inserted: +.. _apireference-formeditor-jsevents-view-formelement-inserted: + +view/formElement/inserted +-------------------------- + +Published after a new form element has been added to the form definition +tree. EXT:form selects the new element and re-renders tree, stage and +inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`FormElement` + - The newly inserted FormElement model. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-formelement-moved: +.. _apireference-formeditor-jsevents-view-formelement-moved: + +view/formElement/moved +----------------------- + +Published after a form element has been moved within the tree. EXT:form +does not add additional behaviour here by default. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`FormElement` + - The moved FormElement model. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-formelement-removed: +.. _apireference-formeditor-jsevents-view-formelement-removed: + +view/formElement/removed +------------------------- + +Published after a form element has been removed. EXT:form selects the +parent element and re-renders tree, stage and inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`FormElement` + - The parent FormElement model of the deleted element. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-collectionelement-new-added: +.. _apireference-formeditor-jsevents-view-collectionelement-new-added: + +view/collectionElement/new/added +--------------------------------- + +Published after a new validator or finisher has been created and added to +the form definition. EXT:form re-renders the inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the new collection element (e.g. ``'NotEmpty'``). + * - ``args[1]`` + - :js:`string` + - Collection name: ``'validators'`` or ``'finishers'``. + * - ``args[2]`` + - :js:`FormElement` + - The owning form element. + * - ``args[3]`` + - :js:`object` + - Full configuration object of the added collection element. + * - ``args[4]`` + - :js:`string` + - Identifier of the reference element (inserted before/after). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-collectionelement-moved: +.. _apireference-formeditor-jsevents-view-collectionelement-moved: + +view/collectionElement/moved +----------------------------- + +Published after a validator or finisher has been reordered. EXT:form +re-renders the inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the moved element. + * - ``args[1]`` + - :js:`string` + - Relative position: ``'before'`` or ``'after'``. + * - ``args[2]`` + - :js:`string` + - Identifier of the reference element. + * - ``args[3]`` + - :js:`string` + - Collection name. + * - ``args[4]`` + - :js:`FormElement` + - The owning form element. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-collectionelement-removed: +.. _apireference-formeditor-jsevents-view-collectionelement-removed: + +view/collectionElement/removed +-------------------------------- + +Published after a validator or finisher has been removed from the form +definition. EXT:form re-renders the inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the removed element. + * - ``args[1]`` + - :js:`string` + - Collection name. + * - ``args[2]`` + - :js:`FormElement` + - The owning form element. + + +.. _apireference-formeditor-jsevents-view-insertelements-perform-before: + +view/insertElements/perform/before +------------------------------------ + +Published when the user selects an element type in the "New element" +dialog after clicking the "Before" toolbar option. EXT:form creates the +new element and moves it *before* the currently selected element. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Form element type identifier (e.g. ``'Text'``). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-insertelements-perform-after: +.. _apireference-formeditor-jsevents-view-insertelements-perform-after: + +view/insertElements/perform/after +---------------------------------- + +Published when the user selects an element type after clicking the +"After" toolbar option or the standard toolbar button for non-composite +elements. EXT:form creates the element and moves it *after* the selected +element (as a sibling). + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Form element type identifier. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-insertelements-perform-inside: +.. _apireference-formeditor-jsevents-view-insertelements-perform-inside: + +view/insertElements/perform/inside +------------------------------------ + +Published when the user selects an element type after clicking the +"Inside" toolbar option on a composite element (e.g. Fieldset). EXT:form +creates the element as a *child* of the currently selected composite. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Form element type identifier. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-insertelements-perform-bottom: +.. _apireference-formeditor-jsevents-view-insertelements-perform-bottom: + +view/insertElements/perform/bottom +------------------------------------ + +Published when the user selects an element type after clicking the +"Create new element" button at the very bottom of the stage in abstract +view. EXT:form appends the element as the last child of the current page. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Form element type identifier. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-insertpages-perform: +.. _apireference-formeditor-jsevents-view-insertpages-perform: + +view/insertPages/perform +------------------------- + +Published when the user selects a page type in the "New page" dialog. +EXT:form creates the page *after* the currently selected page. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Form element type identifier (typically ``'Page'``). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-header-button-save-clicked: +.. _apireference-formeditor-jsevents-view-header-save: + +view/header/button/save/clicked +--------------------------------- + +Published when the "Save" button is clicked. EXT:form either opens a +validation-error dialog (if there are errors) or saves the form definition. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-header-button-close-clicked: +.. _apireference-formeditor-jsevents-view-header-close: + +view/header/button/close/clicked +---------------------------------- + +Published when the "Close" button is clicked *and* the form has unsaved +changes. EXT:form opens a confirmation dialog. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-header-button-newpage-clicked: +.. _apireference-formeditor-jsevents-view-header-newpage: + +view/header/button/newPage/clicked +------------------------------------ + +Published when the "New page" icon in the header is clicked. EXT:form +opens the "New page" dialog. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`'view/insertPages/perform'` + - The event to publish once the user picks a page type. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-header-formsettings-clicked: +.. _apireference-formeditor-jsevents-view-header-formsettings: + +view/header/formSettings/clicked +---------------------------------- + +Published when the "Form settings" button is clicked. EXT:form selects +the root form element and renders its settings in the inspector. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-undobutton-clicked: +.. _apireference-formeditor-jsevents-view-undobutton: + +view/undoButton/clicked +------------------------ + +Published when the undo button is clicked. EXT:form steps back one state +in the undo/redo stack and re-renders all components. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-redobutton-clicked: +.. _apireference-formeditor-jsevents-view-redobutton: + +view/redoButton/clicked +------------------------ + +Published when the redo button is clicked. EXT:form steps forward one +state in the undo/redo stack and re-renders all components. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-viewmodebutton-abstract-clicked: +.. _apireference-formeditor-jsevents-view-viewmode-abstract: + +view/viewModeButton/abstract/clicked +-------------------------------------- + +Published when the "Abstract view" toggle in the stage header is clicked. +EXT:form switches to abstract view if not already active. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-viewmodebutton-preview-clicked: +.. _apireference-formeditor-jsevents-view-viewmode-preview: + +view/viewModeButton/preview/clicked +------------------------------------- + +Published when the "Preview" toggle in the stage header is clicked. +EXT:form switches to preview view if not already active. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-paginationnext-clicked: +.. _apireference-formeditor-jsevents-view-pagination-next: + +view/paginationNext/clicked +---------------------------- + +Published when the "next page" arrow in the stage header is clicked. +EXT:form advances to the next form page. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-paginationprevious-clicked: +.. _apireference-formeditor-jsevents-view-pagination-previous: + +view/paginationPrevious/clicked +--------------------------------- + +Published when the "previous page" arrow in the stage header is clicked. +EXT:form goes back to the previous form page. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-render-template-perform: +.. _apireference-formeditor-jsevents-view-stage-abstract-render-template-perform: + +view/stage/abstract/render/template/perform +-------------------------------------------- + +**The primary extension point for custom stage rendering.** + +Published by the Stage component for each form element that has a +:yaml:`formEditorPartials` entry in the prototype configuration. Form +elements *without* a :yaml:`formEditorPartials` entry are rendered +automatically by the +:html:`` web component — no +subscriber is needed for those. + +.. note:: + For most custom form elements the web-component approach (no + :yaml:`formEditorPartials`, no subscriber) is sufficient. + Use this event only when you need fully custom DOM inside the stage + that the built-in web component cannot provide. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`FormElement` + - The FormElement model being rendered. + * - ``args[1]`` + - :js:`HTMLElement` + - Cloned DOM node from the Fluid partial. Populate this via DOM + manipulation. + +**Full example — custom element with a dedicated stage partial:** + +*Fluid partial* (:file:`EXT:my_extension/Resources/Private/Backend/Partials/FormEditor/Stage/MyCustomElement.html`): + +.. literalinclude:: _codesnippets/_stage-template-perform.html + :language: html + +*Prototype YAML configuration:* + +.. literalinclude:: _codesnippets/_stage-template-perform.yaml + :language: yaml + +*JavaScript module:* + +.. literalinclude:: _codesnippets/_stage-template-perform.js + :language: javascript + :caption: EXT:my_extension/Resources/Public/JavaScript/backend/form-editor/view-model.js + + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-render-preprocess: +.. _apireference-formeditor-jsevents-view-stage-abstract-render-preprocess: + +view/stage/abstract/render/preProcess +--------------------------------------- + +Published immediately before the abstract stage area is re-rendered. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-render-postprocess: +.. _apireference-formeditor-jsevents-view-stage-abstract-render-postprocess: + +view/stage/abstract/render/postProcess +---------------------------------------- + +Published immediately after the abstract stage area has been rendered. +EXT:form uses this to re-render the undo/redo buttons and apply validation +error highlights. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-preview-render-postprocess: +.. _apireference-formeditor-jsevents-view-stage-preview-render-postprocess: + +view/stage/preview/render/postProcess +--------------------------------------- + +Published after the preview stage area has been rendered. EXT:form uses +this to re-render the undo/redo buttons. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-element-clicked: +.. _apireference-formeditor-jsevents-view-stage-element-clicked: + +view/stage/element/clicked +--------------------------- + +Published when a form element in the abstract stage is clicked. EXT:form +selects the element, shows its toolbar and re-renders the inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - :js:`__identifierPath` of the clicked element. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-panel-clicked: +.. _apireference-formeditor-jsevents-view-stage-panel-clicked: + +view/stage/panel/clicked +------------------------- + +Published when the stage panel header or background area is clicked +(not on a specific form element). + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-button-newelement-clicked: +.. _apireference-formeditor-jsevents-view-stage-abstract-button-newelement: + +view/stage/abstract/button/newElement/clicked +---------------------------------------------- + +Published when the "Create new element" button at the bottom of the +stage (in abstract view) is clicked. EXT:form opens the "New element" +dialog configured to insert at the bottom of the current page. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`'view/insertElements/perform/bottom'` + - Target publish event for the dialog result. + * - ``args[1]`` + - :js:`object | undefined` + - Optional modal configuration. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-elementtoolbar-button-newelement-clicked: +.. _apireference-formeditor-jsevents-view-stage-abstract-toolbar-newelement: + +view/stage/abstract/elementToolbar/button/newElement/clicked +------------------------------------------------------------- + +Published when the "Add element" button or split-button ("Before", +"After", "Inside") in the per-element toolbar is clicked. EXT:form opens +the "New element" dialog with the appropriate target event. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Target event: ``'view/insertElements/perform/before'``, + ``'…/after'`` or ``'…/inside'``. + * - ``args[1]`` + - :js:`object` + - Modal configuration (``disableElementTypes``, + ``onlyEnableElementTypes``). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-dnd-start: +.. _apireference-formeditor-jsevents-view-stage-dnd-start: + +view/stage/abstract/dnd/start +------------------------------- + +Published when a drag operation begins in the abstract stage. EXT:form +adds CSS classes to highlight the dragged element. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`HTMLElement` + - The dragged element's DOM node. + * - ``args[1]`` + - :js:`HTMLElement` + - The drag placeholder DOM node. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-dnd-change: +.. _apireference-formeditor-jsevents-view-stage-dnd-change: + +view/stage/abstract/dnd/change +-------------------------------- + +Published on each positional change during a drag operation in the stage +(SortableJS :js:`onChange`). EXT:form applies hover CSS classes. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`HTMLElement` + - The drag placeholder DOM node. + * - ``args[1]`` + - :js:`string` + - :js:`__identifierPath` of the potential parent element. + * - ``args[2]`` + - :js:`FormElement` + - Innermost enclosing composite element (if any). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-dnd-update: +.. _apireference-formeditor-jsevents-view-stage-dnd-update: + +view/stage/abstract/dnd/update +-------------------------------- + +Published at the end of a drag operation when the element was dropped in a +new position (SortableJS :js:`onEnd`). EXT:form calls +:js:`moveFormElement()` to persist the new order. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`HTMLElement` + - The dropped DOM node. + * - ``args[1]`` + - :js:`string` + - :js:`__identifierPath` of the moved element. + * - ``args[2]`` + - :js:`string` + - :js:`__identifierPath` of the preceding sibling (empty string if first). + * - ``args[3]`` + - :js:`string` + - :js:`__identifierPath` of the following sibling (empty string if last). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-stage-abstract-dnd-stop: +.. _apireference-formeditor-jsevents-view-stage-dnd-stop: + +view/stage/abstract/dnd/stop +------------------------------ + +Published after the drag operation completes and all model updates are +done. EXT:form re-renders tree, stage and inspector and selects the moved +element. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - :js:`__identifierPath` of the element that was dragged. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-editor-insert-perform: +.. _apireference-formeditor-jsevents-view-inspector-editor-insert: + +view/inspector/editor/insert/perform +-------------------------------------- + +**Extension point for custom inspector editors.** + +Published after each inspector editor has been rendered (both for form +elements and for collection elements). Use :js:`args[0].templateName` to +identify which editor is being rendered and apply custom logic. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`EditorConfiguration` + - Full YAML configuration of the editor (includes :js:`templateName`). + * - ``args[1]`` + - :js:`HTMLElement` + - The rendered DOM node of the inspector editor. + * - ``args[2]`` + - :js:`string` + - Identifier of the active collection element (validator/finisher), + or empty string when rendering a plain element editor. + * - ``args[3]`` + - :js:`string` + - Collection name (``'validators'`` or ``'finishers'``), or empty. + +**Example — register a custom inspector editor:** + +*Prototype YAML:* + +.. literalinclude:: _codesnippets/_inspector-editor-insert.yaml + :language: yaml + +*JavaScript module:* + +.. literalinclude:: _codesnippets/_inspector-editor-insert.js + :language: javascript + :caption: EXT:my_extension/Resources/Public/JavaScript/backend/form-editor/view-model.js + + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-collectionelement-new-selected: +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-collection-new-selected: +.. _apireference-formeditor-jsevents-view-inspector-collection-new-selected: + +view/inspector/collectionElement/new/selected +---------------------------------------------- + +Published when the user selects a *new* validator or finisher from the +select box in the inspector. EXT:form adds the collection element to the +form definition and re-renders the inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the selected collection element. + * - ``args[1]`` + - :js:`string` + - Collection name (``'validators'`` or ``'finishers'``). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-collectionelement-existing-selected: +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-collection-existing-selected: +.. _apireference-formeditor-jsevents-view-inspector-collection-existing-selected: + +view/inspector/collectionElement/existing/selected +---------------------------------------------------- + +Published when the user expands an *existing* validator or finisher row +in the inspector. EXT:form renders that element's sub-editors. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the already-selected collection element. + * - ``args[1]`` + - :js:`string` + - Collection name. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-collectionelement-dnd-update: +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-collection-dnd-update: +.. _apireference-formeditor-jsevents-view-inspector-collection-dnd-update: + +view/inspector/collectionElements/dnd/update +--------------------------------------------- + +Published when a validator or finisher is reordered via drag-and-drop +inside the inspector (SortableJS :js:`onEnd`). EXT:form moves the element +in the form definition. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the moved element. + * - ``args[1]`` + - :js:`string` + - Identifier of the preceding element after the move. + * - ``args[2]`` + - :js:`string` + - Identifier of the following element after the move. + * - ``args[3]`` + - :js:`string` + - Collection name. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-inspector-removecollectionelement-perform: +.. _apireference-formeditor-jsevents-view-inspector-removecollectionelement: + +view/inspector/removeCollectionElement/perform +----------------------------------------------- + +Published by the ``RequiredValidatorEditor`` when its checkbox is +unchecked. EXT:form removes the ``NotEmpty`` validator from the form +definition. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Validator identifier (e.g. ``'NotEmpty'``). + * - ``args[1]`` + - :js:`'validators'` + - Collection name (always ``'validators'`` for this event). + * - ``args[2]`` + - :js:`FormElement | undefined` + - The owning form element, or ``undefined`` for the currently + selected one. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-modal-close-perform: +.. _apireference-formeditor-jsevents-view-modal-close: + +view/modal/close/perform +------------------------- + +Published when the user confirms closing the editor in the "unsaved +changes" dialog. EXT:form clears the unsaved-content flag and navigates +back to the form manager. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-modal-removeformelement-perform: +.. _apireference-formeditor-jsevents-view-modal-removeformelement: + +view/modal/removeFormElement/perform +-------------------------------------- + +Published when the user confirms deleting a form element in the +confirmation dialog. EXT:form removes the element from the form +definition. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`FormElement` + - The form element to be deleted. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-modal-removecollectionelement-perform: +.. _apireference-formeditor-jsevents-view-modal-removecollectionelement: + +view/modal/removeCollectionElement/perform +------------------------------------------- + +Published when the user confirms removing a validator or finisher via its +delete icon. EXT:form removes the collection element from the form +definition. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - Identifier of the collection element to remove. + * - ``args[1]`` + - :js:`string` + - Collection name. + * - ``args[2]`` + - :js:`FormElement` + - The owning form element. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-modal-validationerrors-element-clicked: +.. _apireference-formeditor-jsevents-view-modal-validationerrors-clicked: + +view/modal/validationErrors/element/clicked +-------------------------------------------- + +Published when the user clicks a form element link inside the validation +error dialog. EXT:form selects the element and navigates to it. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - :js:`__identifierPath` of the element with the validation error. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-structure-root-selected: +.. _apireference-formeditor-jsevents-view-structure-root-selected: + +view/structure/root/selected +------------------------------ + +Published when the root element in the structure tree is clicked. EXT:form +selects the root form element and re-renders stage, tree and inspector. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-structure-button-newpage-clicked: +.. _apireference-formeditor-jsevents-view-structure-button-newpage: + +view/structure/button/newPage/clicked +--------------------------------------- + +Published when the "Create new page" button inside the structure tree panel +is clicked. EXT:form opens the "New page" dialog. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`'view/insertPages/perform'` + - Target publish event for the dialog result. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-structure-renew-postprocess: +.. _apireference-formeditor-jsevents-view-structure-renew-postprocess: + +view/structure/renew/postProcess +---------------------------------- + +Published after the structure tree has been fully re-rendered. EXT:form +uses this to apply validation error markers to tree nodes. + +:Arguments: none + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-tree-node-clicked: +.. _apireference-formeditor-jsevents-view-tree-node-clicked: + +view/tree/node/clicked +----------------------- + +Published when a node in the structure tree is clicked. EXT:form selects +the element and re-renders stage and inspector. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - :js:`__identifierPath` of the clicked element. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-tree-node-changed: +.. _apireference-formeditor-jsevents-view-tree-node-changed: + +view/tree/node/changed +----------------------- + +.. versionadded:: 13.4 + This event was previously missing from the documentation. It has been + dispatched since inline label editing in the structure tree was introduced. + +Published when a tree node label is edited inline (inline-rename). EXT:form +writes the new label to the FormElement model and updates the inspector if +the element is currently selected. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - :js:`__identifierPath` of the renamed element. + * - ``args[1]`` + - :js:`string` + - The new label string. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-tree-render-listitemadded: +.. _apireference-formeditor-jsevents-view-tree-listitem-added: + +view/tree/render/listItemAdded +-------------------------------- + +.. note:: + This event is defined in the TypeScript event-map interface but is + **not yet published** by the core tree component. It is reserved for + future use. Subscribing to it will currently have no effect. + +Published by the tree component for each form element as it is added to +the rendered tree. Use this to augment individual tree nodes. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`HTMLElement | null` + - The list item DOM node that was added. + * - ``args[1]`` + - :js:`FormElement` + - The FormElement model for this tree node. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-tree-dnd-change: +.. _apireference-formeditor-jsevents-view-tree-dnd-change: + +view/tree/dnd/change +--------------------- + +Published on each positional change during a drag in the structure tree +(SortableJS :js:`onChange`). EXT:form applies hover CSS classes. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`HTMLElement | null` + - The drag placeholder node. + * - ``args[1]`` + - :js:`string` + - :js:`__identifierPath` of the potential parent element. + * - ``args[2]`` + - :js:`FormElement` + - Innermost enclosing composite element (if any). + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-tree-dnd-update: +.. _apireference-formeditor-jsevents-view-tree-dnd-update: + +view/tree/dnd/update +--------------------- + +Published when a drag in the structure tree ends and the element was +dropped in a new position. EXT:form calls :js:`moveFormElement()`. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`HTMLElement | null` + - The dropped DOM node. + * - ``args[1]`` + - :js:`string` + - :js:`__identifierPath` of the moved element. + * - ``args[2]`` + - :js:`string` + - :js:`__identifierPath` of the preceding sibling. + * - ``args[3]`` + - :js:`string` + - :js:`__identifierPath` of the following sibling. + + +.. _apireference-formeditor-basicjavascriptconcepts-events-view-tree-dnd-stop: +.. _apireference-formeditor-jsevents-view-tree-dnd-stop: + +view/tree/dnd/stop +------------------- + +Published after the tree drag operation completes. EXT:form re-renders +tree, stage and inspector and selects the moved element. + +:Arguments: + +.. list-table:: + :widths: 15 25 60 + :header-rows: 1 + + * - Index + - Type + - Description + * - ``args[0]`` + - :js:`string` + - :js:`__identifierPath` of the element that was dragged. + + + diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.js b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.js new file mode 100644 index 0000000..0e379ff --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.js @@ -0,0 +1,22 @@ +export function bootstrap(formEditorApp) { + formEditorApp.getPublisherSubscriber().subscribe( + 'view/inspector/editor/insert/perform', + (topic, args) => { + const [editorConfiguration, editorHtml] = args; + + if (editorConfiguration.templateName !== 'Inspector-MyCustomEditor') { + return; + } + + // Wire up your custom editor UI inside editorHtml + const input = editorHtml.querySelector('.my-custom-input'); + if (input) { + input.addEventListener('change', (e) => { + formEditorApp + .getCurrentlySelectedFormElement() + .set(editorConfiguration.propertyPath, e.target.value); + }); + } + }, + ); +} diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.yaml b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.yaml new file mode 100644 index 0000000..accbf3f --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_inspector-editor-insert.yaml @@ -0,0 +1,18 @@ +prototypes: + standard: + formEditor: + dynamicJavaScriptModules: + additionalViewModelModules: + 10: '@vendor/my-extension/backend/form-editor/view-model.js' + formEditorPartials: + Inspector-MyCustomEditor: 'Inspector/MyCustomEditor' + formEditorFluidConfiguration: + partialRootPaths: + 100: 'EXT:my_extension/Resources/Private/Backend/Partials/FormEditor/' + formElementsDefinition: + Text: + formEditor: + editors: + 600: + templateName: 'Inspector-MyCustomEditor' + myOption: 'example' diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_publish.js b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_publish.js new file mode 100644 index 0000000..016efdd --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_publish.js @@ -0,0 +1,3 @@ +export function bootstrap(formEditorApp) { + formEditorApp.getPublisherSubscriber().publish('my/custom/event', ['arg1', 'arg2']); +} diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_some-property-changed.js b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_some-property-changed.js new file mode 100644 index 0000000..134dfb7 --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_some-property-changed.js @@ -0,0 +1,11 @@ +export function bootstrap(formEditorApp) { + formEditorApp.getPublisherSubscriber().subscribe( + 'core/formElement/somePropertyChanged', + (topic, args) => { + const [propertyPath, newValue, oldValue, identifierPath] = args; + if (propertyPath === 'label' && identifierPath?.startsWith('my-form/page-1/')) { + console.log('Label changed from', oldValue, 'to', newValue); + } + }, + ); +} diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.html b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.html new file mode 100644 index 0000000..65e815d --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.html @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.js b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.js new file mode 100644 index 0000000..88504df --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.js @@ -0,0 +1,24 @@ +export function bootstrap(formEditorApp) { + formEditorApp.getPublisherSubscriber().subscribe( + 'view/stage/abstract/render/template/perform', + (topic, args) => { + const [formElement, template] = args; + + if (formElement.get('type') !== 'MyCustomElement') { + return; + } + + const labelEl = template.querySelector('[data-identifier="elementLabel"]'); + if (labelEl) { + labelEl.textContent = + formElement.get('label') || formElement.get('identifier'); + } + + const summaryEl = template.querySelector('[data-identifier="elementSummary"]'); + if (summaryEl) { + summaryEl.textContent = + formElement.get('properties.myCustomProperty') ?? ''; + } + }, + ); +} diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.yaml b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.yaml new file mode 100644 index 0000000..173ef7d --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_stage-template-perform.yaml @@ -0,0 +1,11 @@ +prototypes: + standard: + formEditor: + dynamicJavaScriptModules: + additionalViewModelModules: + 10: '@vendor/my-extension/backend/form-editor/view-model.js' + formEditorPartials: + FormElement-MyCustomElement: 'Stage/MyCustomElement' + formEditorFluidConfiguration: + partialRootPaths: + 100: 'EXT:my_extension/Resources/Private/Backend/Partials/FormEditor/' diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_subscribe.js b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_subscribe.js new file mode 100644 index 0000000..a877394 --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_subscribe.js @@ -0,0 +1,11 @@ +export function bootstrap(formEditorApp) { + const ps = formEditorApp.getPublisherSubscriber(); + + // Subscribe – returns a token for later unsubscription + const token = ps.subscribe('view/ready', (topic, args) => { + // args is a typed tuple matching the event signature + }); + + // Unsubscribe + ps.unsubscribe(token); +} diff --git a/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_view-ready.js b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_view-ready.js new file mode 100644 index 0000000..b872891 --- /dev/null +++ b/Documentation/D/FormEditor/JavaScriptEvents/_codesnippets/_view-ready.js @@ -0,0 +1,5 @@ +export function bootstrap(formEditorApp) { + formEditorApp.getPublisherSubscriber().subscribe('view/ready', () => { + // Safe to call any formEditorApp API here. + }); +} diff --git a/Documentation/D/FormEditor/StageTemplates/Index.rst b/Documentation/D/FormEditor/StageTemplates/Index.rst new file mode 100644 index 0000000..3788feb --- /dev/null +++ b/Documentation/D/FormEditor/StageTemplates/Index.rst @@ -0,0 +1,137 @@ +.. include:: /Includes.rst.txt + +.. _apireference-formeditor-stage-commonabstractformelementtemplates: +.. _apireference-formeditor-stagetemplates: + +=============== +Stage templates +=============== + +The **Stage** component renders each form element as an HTML item in the +abstract view. This section explains the two rendering strategies: the +modern web-component approach (recommended) and the legacy Fluid-partial +approach (deprecated). + +.. contents:: + :depth: 1 + :local: + + +.. _apireference-formeditor-stagetemplates-webcomponent: + +Built-in web component (recommended) +===================================== + +When no :yaml:`formEditorPartials` entry exists for a form element type, +the Stage component automatically renders it using the built-in +:html:`` web component. The component +displays the element's label, type icon, validators, select options and +allowed MIME types without requiring any custom JavaScript. + +.. tip:: + For most custom form elements this is the recommended approach. Simply + omit :yaml:`formEditorPartials` from the prototype configuration and the + editor handles the rest. + +Properties set on the web component from the :js:`FormElement` model: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Property + - Source in FormElement model + * - :js:`elementType` + - Form element definition :yaml:`label` + * - :js:`elementLabel` + - :yaml:`label` (falls back to :yaml:`identifier`) + * - :js:`elementIconIdentifier` + - Form element definition :yaml:`iconIdentifier` + * - :js:`validators` + - :yaml:`validators` array (excludes ``NotEmpty``, shown via :js:`isRequired`) + * - :js:`isRequired` + - ``true`` when a ``NotEmpty`` validator is present + * - :js:`options` + - :yaml:`properties.options` (for select-like elements) + * - :js:`allowedMimeTypes` + - :yaml:`properties.allowedMimeTypes` + * - :js:`content` + - :yaml:`properties.text` or :yaml:`properties.contentElementUid` + * - :js:`isHidden` + - ``true`` when :yaml:`renderingOptions.enabled` is ``false`` + + +.. _apireference-formeditor-stagetemplates-fluid: + +Custom Fluid partial (advanced) +================================ + +If you need fully custom stage rendering – for example to display a +proprietary summary of complex properties – you can still provide a Fluid +partial and subscribe to the +:ref:`view/stage/abstract/render/template/perform ` +event to populate it with DOM manipulation. + +The core Fluid partials are located in +:file:`EXT:form/Resources/Private/Backend/Partials/FormEditor/Stage/`. + +.. warning:: + The legacy stage rendering helpers + :js:`renderSimpleTemplateWithValidators()` and + :js:`renderSelectTemplates()` from + :js:`@typo3/form/backend/form-editor/stage-component` are deprecated + since TYPO3 v14.2 and will be removed in TYPO3 v15. Migrate to the + web component approach (omit :yaml:`formEditorPartials`) or implement + custom DOM manipulation in the event subscriber. + +.. _apireference-formeditor-stage-commonabstractformelementtemplates-simpletemplate: +.. _apireference-formeditor-stagetemplates-fluid-simpletemplate: + +Stage/SimpleTemplate (deprecated) +---------------------------------- + +Displays the element :yaml:`label`. When the element has validators, a +validator icon and their labels appear on hover/selection. Rendered via +the deprecated :js:`renderSimpleTemplateWithValidators()`. + +.. deprecated:: 14.2 + Use the :html:`` web component + by omitting :yaml:`formEditorPartials`, or implement custom DOM + manipulation in the + :ref:`view/stage/abstract/render/template/perform ` + subscriber. See Deprecation :issue:`109306`. + +.. _apireference-formeditor-stage-commonabstractformelementtemplates-selecttemplate: +.. _apireference-formeditor-stagetemplates-fluid-selecttemplate: + +Stage/SelectTemplate (deprecated) +---------------------------------- + +Extends ``Stage/SimpleTemplate`` by additionally listing the chosen option +labels from :yaml:`properties.options.*`. Rendered via the deprecated +:js:`renderSelectTemplates()`. + +Example form element using select options: + +.. literalinclude:: _codesnippets/_select-template.yaml + :language: yaml + +The template partial contains a container with the path to read: + +.. literalinclude:: _codesnippets/_select-template-partial.html + :language: html + +For elements using a different array property (e.g. ``FileUpload`` with +:yaml:`properties.allowedMimeTypes`), adjust the :html:`data-template-property` +attribute accordingly: + +.. literalinclude:: _codesnippets/_file-upload-partial.html + :language: html + +The web component handles both cases automatically. + +.. deprecated:: 14.2 + Use the :html:`` web component + by omitting :yaml:`formEditorPartials`. + See `Deprecation: #109306 - Deprecate form editor stage template rendering functions `_. + diff --git a/Documentation/D/FormEditor/StageTemplates/_codesnippets/_file-upload-partial.html b/Documentation/D/FormEditor/StageTemplates/_codesnippets/_file-upload-partial.html new file mode 100644 index 0000000..29b9b3b --- /dev/null +++ b/Documentation/D/FormEditor/StageTemplates/_codesnippets/_file-upload-partial.html @@ -0,0 +1,2 @@ +
diff --git a/Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template-partial.html b/Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template-partial.html new file mode 100644 index 0000000..78c2b8b --- /dev/null +++ b/Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template-partial.html @@ -0,0 +1,2 @@ +
diff --git a/Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template.yaml b/Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template.yaml new file mode 100644 index 0000000..e2d1e93 --- /dev/null +++ b/Documentation/D/FormEditor/StageTemplates/_codesnippets/_select-template.yaml @@ -0,0 +1,7 @@ +type: MultiCheckbox +identifier: multicheckbox-1 +label: 'Multi checkbox' +properties: + options: + value1: label1 + value2: label2 diff --git a/Documentation/D/FormEditor/_codesnippets/_JavaScriptModules.php b/Documentation/D/FormEditor/_codesnippets/_JavaScriptModules.php new file mode 100644 index 0000000..08f6d15 --- /dev/null +++ b/Documentation/D/FormEditor/_codesnippets/_JavaScriptModules.php @@ -0,0 +1,9 @@ + ['form'], + 'imports' => [ + '@vendor/my-extension/' + => 'EXT:my_extension/Resources/Public/JavaScript/', + ], +]; diff --git a/Documentation/D/FormEditor/_codesnippets/_bootstrap.js b/Documentation/D/FormEditor/_codesnippets/_bootstrap.js new file mode 100644 index 0000000..4f89b1f --- /dev/null +++ b/Documentation/D/FormEditor/_codesnippets/_bootstrap.js @@ -0,0 +1,10 @@ +/** + * Custom form editor module for EXT:my_extension. + */ +export function bootstrap(formEditorApp) { + const ps = formEditorApp.getPublisherSubscriber(); + + ps.subscribe('view/ready', () => { + // Editor is fully initialised – set up your custom logic here. + }); +} diff --git a/Documentation/D/FormEditor/_codesnippets/_prototype-setup.yaml b/Documentation/D/FormEditor/_codesnippets/_prototype-setup.yaml new file mode 100644 index 0000000..08d2aa4 --- /dev/null +++ b/Documentation/D/FormEditor/_codesnippets/_prototype-setup.yaml @@ -0,0 +1,6 @@ +prototypes: + standard: + formEditor: + dynamicJavaScriptModules: + additionalViewModelModules: + 10: '@vendor/my-extension/backend/form-editor/view-model.js' diff --git a/Documentation/D/FrontendRendering/Index.rst b/Documentation/D/FrontendRendering/Index.rst new file mode 100644 index 0000000..b07c0c2 --- /dev/null +++ b/Documentation/D/FrontendRendering/Index.rst @@ -0,0 +1,320 @@ +.. include:: /Includes.rst.txt + + +.. _apireference-frontendrendering: + +============================ +Building and rendering forms +============================ + +This chapter explains how EXT:form renders forms in the frontend and how +developers can build forms programmatically or customize the rendering +pipeline. + +For the complete PHP API of every class mentioned here, see +`EXT:form API on api.typo3.org `__. + +.. contents:: + :local: + :depth: 2 + + +.. _apireference-frontendrendering-fluidformrenderer: + +Template resolution (FluidFormRenderer) +======================================== + +The :php-short:`\TYPO3\CMS\Form\Domain\Renderer\FluidFormRenderer` resolves +Fluid templates, layouts and partials through rendering options defined in the +prototype configuration. All options are read from +:php-short:`\TYPO3\CMS\Form\Domain\Model\FormDefinition::getRenderingOptions()`. + +.. _apireference-frontendrendering-fluidformrenderer-options: + +.. _apireference-frontendrendering-fluidformrenderer-options-templaterootpaths: + +templateRootPaths +----------------- + +Defines one or more paths to Fluid **templates**. +Paths are searched in reverse order (bottom to top); the first match wins. + +Only the root form element (type :yaml:`Form`) must be a **template** file. +All child elements are resolved as **partials**. + +.. literalinclude:: _templateRootPaths.yaml + :caption: EXT:my_sitepackage/Configuration/Form/CustomPrototype.yaml + :language: yaml + +With the default type :yaml:`Form` the renderer expects a file named +:file:`Form.html` inside the first matching path. + + +.. _apireference-frontendrendering-fluidformrenderer-options-layoutrootpaths: + +layoutRootPaths +--------------- + +Defines one or more paths to Fluid **layouts**, searched in reverse order. + +.. literalinclude:: _layoutRootPaths.yaml + :caption: EXT:my_sitepackage/Configuration/Form/CustomPrototype.yaml + :language: yaml + + +.. _apireference-frontendrendering-fluidformrenderer-options-partialrootpaths: + +partialRootPaths +---------------- + +Defines one or more paths to Fluid **partials**, searched in reverse order. + +Within these paths the renderer looks for a file named after the +form element type (e.g. :file:`Text.html` for a :yaml:`Text` element). +Use :ref:`templateName ` +to override this convention. + +.. literalinclude:: _partialRootPaths.yaml + :caption: EXT:my_sitepackage/Configuration/Form/CustomPrototype.yaml + :language: yaml + + +.. _apireference-frontendrendering-fluidformrenderer-options-templatename: + +templateName +------------ + +By default the element type is used as the partial file name +(e.g. type :yaml:`Text` → :file:`Text.html`). +Set :yaml:`templateName` to use a different file instead: + +.. literalinclude:: _templateName.yaml + :caption: EXT:my_sitepackage/Configuration/Form/CustomPrototype.yaml + :language: yaml + +The element of type :yaml:`Foo` now renders using :file:`Text.html`. + + +.. _apireference-frontendrendering-renderviewHelper: + +The render ViewHelper +===================== + +.. _apireference-frontendrendering-renderviewHelper-arguments: + +Use :html:`` in a Fluid template to render a form. +The ViewHelper accepts the following arguments: + + +.. _apireference-frontendrendering-renderviewHelper-persistenceidentifier: + +persistenceIdentifier +--------------------- + +Path to a YAML form definition. This is the most common way to render a +form: + +.. literalinclude:: _renderPersistenceIdentifier.html + :caption: EXT:my_sitepackage/Resources/Private/Templates/ContactPage.html + :language: html + + +.. _apireference-frontendrendering-renderviewHelper-overrideconfiguration: + +overrideConfiguration +--------------------- + +A configuration array that is merged **on top** of the loaded form +definition (or passed directly to the factory when no +:yaml:`persistenceIdentifier` is given). +This allows adjusting a form per usage without duplicating the YAML file. + + +.. _apireference-frontendrendering-renderviewHelper-factoryclass: + +factoryClass +------------ + +A fully qualified class name implementing +:php-short:`\TYPO3\CMS\Form\Domain\Factory\FormFactoryInterface`. +Defaults to :php-short:`\TYPO3\CMS\Form\Domain\Factory\ArrayFormFactory`. +Set a custom factory to :ref:`build forms programmatically `. + +.. literalinclude:: _renderFactoryClass.html + :caption: EXT:my_sitepackage/Resources/Private/Templates/ContactPage.html + :language: html + + +.. _apireference-frontendrendering-renderviewHelper-prototypename: + +prototypeName +------------- + +Name of the prototype the factory should use (e.g. :yaml:`standard`). +If omitted the framework looks for the prototype name inside the form +definition; if none is found, :yaml:`standard` is used. + + +.. _apireference-frontendrendering-programmatically: + +Building forms programmatically +=============================== + +Instead of writing YAML, you can create a form entirely in PHP by +implementing a custom :php:`FormFactory`. + +.. rst-class:: bignums-xxl + +1. Create a FormFactory + + Extend :php:`AbstractFormFactory` and implement :php:`build()`. + Use :php:`FormDefinition::createPage()` to add pages, + :php:`Page::createElement()` to add elements, and + :php:`FormDefinition::createFinisher()` to attach finishers. + + .. literalinclude:: _CustomFormFactory.php + :caption: EXT:my_sitepackage/Classes/Domain/Factory/CustomFormFactory.php + :language: php + +2. Render the form + + Reference your factory in a Fluid template: + + .. literalinclude:: _renderFactoryClass.html + :caption: EXT:my_sitepackage/Resources/Private/Templates/ContactPage.html + :language: html + + +.. _apireference-frontendrendering-programmatically-key-concepts: + +Key classes and their responsibilities +-------------------------------------- + +.. _apireference-frontendrendering-programmatically-apimethods-formruntime: + +The following table lists the most important classes you work with when +building or manipulating forms programmatically. Use your IDE's +autocompletion or the +`API documentation `__ +for the full method reference. + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Class + - Purpose + + * - :php-short:`\TYPO3\CMS\Form\Domain\Model\FormDefinition` + - The complete form model. Create pages (:php:`createPage()`), + attach finishers (:php:`createFinisher()`), look up elements + (:php:`getElementByIdentifier()`), and bind to a request + (:php:`bind()`). + + * - :php-short:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime` + - A *bound* form instance (created by :php:`FormDefinition::bind()`). + Provides access to the current page, submitted values + (:php:`getElementValue()`), and the request/response objects. + This is the object available inside finishers and event listeners. + + * - :php-short:`\TYPO3\CMS\Form\Domain\Model\FormElements\Page` + - One page of a multi-step form. Add elements with + :php:`createElement()`, reorder them with :php:`moveElementBefore()` + / :php:`moveElementAfter()`. + + * - :php-short:`\TYPO3\CMS\Form\Domain\Model\FormElements\Section` + - A grouping element inside a page. Same API as :php:`Page` for + managing child elements. + + * - :php-short:`\TYPO3\CMS\Form\Domain\Model\FormElements\AbstractFormElement` + - Base class of all concrete elements. Most element types use + :php-short:`\TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement`; + specialized subclasses include, e.g. + :php-short:`\TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload`. + Set properties (:php:`setProperty()`), add validators + (:php:`createValidator()`), define default values + (:php:`setDefaultValue()`). + + * - :php-short:`\TYPO3\CMS\Form\Domain\Configuration\ConfigurationService` + - Reads the merged prototype configuration. + Call :php:`getPrototypeConfiguration('standard')` to obtain the + full array for a prototype. + + +.. _apireference-frontendrendering-programmatically-initializeformelement: + +Initializing elements at runtime +--------------------------------- + +Override :php:`initializeFormElement()` in a custom form element class to +populate data (e.g. from a database) when the element is added to the form. +At that point the prototype defaults have already been applied; properties +from the YAML definition are applied **afterwards**. + +.. tip:: + If you only need to initialize an element without writing a full custom + class, listen to the :php:`BeforeRenderableIsAddedToFormEvent` PSR-14 + event instead. See :ref:`apireference-events`. + + +.. _apireference-frontendrendering-finishers: + +Working with finishers +====================== + +Custom finishers extend :php-short:`\TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher` +and place their logic in :php:`executeInternal()`. The base class provides: + +:php:`parseOption(string $optionName)` + Resolves a finisher option, applying form-element variable replacements + and TypoScript-style option overrides. Always prefer this over direct + array access. + +The :php-short:`\TYPO3\CMS\Form\Domain\Finishers\FinisherContext` passed to +:php:`execute()` gives access to: + +:php:`getFormRuntime()` + The :php-short:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime` for the current + submission. + +:php:`getFormValues()` + All submitted values (after validation and property mapping). + +:php:`getFinisherVariableProvider()` + A key/value store to **share data between finishers** within the same + request. The returned + :php-short:`\TYPO3\CMS\Form\Domain\Finishers\FinisherVariableProvider` offers: + + :php:`add(string $finisherIdentifier, string $key, mixed $value)` + Store a value under a finisher-specific namespace. + + :php:`get(string $finisherIdentifier, string $key, mixed $default = null)` + Retrieve a previously stored value (returns :php:`$default` if not set). + + :php:`exists(string $finisherIdentifier, string $key)` + Check whether a value has been stored. + + :php:`remove(string $finisherIdentifier, string $key)` + Remove a stored value. + +:php:`cancel()` + Stops execution of any remaining finishers. + +.. seealso:: + :ref:`Accessing finisher options ` | + :ref:`Sharing data between finishers ` + + +.. _apireference-frontendrendering-runtimemanipulation: + +Runtime manipulation +==================== + +.. _apireference-frontendrendering-runtimemanipulation-events: + +EXT:form dispatches PSR-14 events at every important step of the rendering +lifecycle. Use them to modify the form, redirect page flow, or adjust +submitted values – without subclassing framework internals. + +.. seealso:: + :ref:`PSR-14 events overview for EXT:form ` diff --git a/Documentation/D/FrontendRendering/_CustomFormFactory.php b/Documentation/D/FrontendRendering/_CustomFormFactory.php new file mode 100644 index 0000000..ba74c2a --- /dev/null +++ b/Documentation/D/FrontendRendering/_CustomFormFactory.php @@ -0,0 +1,78 @@ +getPrototypeConfiguration( + $prototypeName, + ); + + $form = GeneralUtility::makeInstance( + FormDefinition::class, + 'ContactForm', + $prototypeConfiguration, + ); + $form->setRenderingOption('controllerAction', 'index'); + + // Page 1 – personal data + $page1 = $form->createPage('page1'); + + /** @var AbstractFormElement $name */ + $name = $page1->createElement('name', 'Text'); + $name->setLabel('Name'); + $name->createValidator('NotEmpty'); + + /** @var AbstractFormElement $email */ + $email = $page1->createElement('email', 'Text'); + $email->setLabel('Email'); + + // Page 2 – message + $page2 = $form->createPage('page2'); + + /** @var AbstractFormElement $message */ + $message = $page2->createElement('message', 'Textarea'); + $message->setLabel('Message'); + $message->createValidator('StringLength', ['minimum' => 5, 'maximum' => 500]); + + // Radio buttons + /** @var AbstractFormElement $subject */ + $subject = $page2->createElement('subject', 'RadioButton'); + $subject->setProperty('options', [ + 'general' => 'General inquiry', + 'support' => 'Support request', + ]); + $subject->setLabel('Subject'); + + // Finisher – send email + $form->createFinisher('EmailToSender', [ + 'subject' => 'Contact form submission', + 'recipients' => [ + 'info@example.com' => 'My Company', + ], + 'senderAddress' => 'noreply@example.com', + ]); + + $this->triggerFormBuildingFinished($form); + + return $form; + } +} diff --git a/Documentation/D/FrontendRendering/_layoutRootPaths.yaml b/Documentation/D/FrontendRendering/_layoutRootPaths.yaml new file mode 100644 index 0000000..1449870 --- /dev/null +++ b/Documentation/D/FrontendRendering/_layoutRootPaths.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Layouts/' + 20: 'EXT:my_sitepackage/Resources/Private/Forms/Frontend/Layouts/' diff --git a/Documentation/D/FrontendRendering/_partialRootPaths.yaml b/Documentation/D/FrontendRendering/_partialRootPaths.yaml new file mode 100644 index 0000000..9c74eb1 --- /dev/null +++ b/Documentation/D/FrontendRendering/_partialRootPaths.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + partialRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Partials/' + 20: 'EXT:my_sitepackage/Resources/Private/Forms/Frontend/Partials/' diff --git a/Documentation/D/FrontendRendering/_renderFactoryClass.html b/Documentation/D/FrontendRendering/_renderFactoryClass.html new file mode 100644 index 0000000..c6114a8 --- /dev/null +++ b/Documentation/D/FrontendRendering/_renderFactoryClass.html @@ -0,0 +1,3 @@ + diff --git a/Documentation/D/FrontendRendering/_renderPersistenceIdentifier.html b/Documentation/D/FrontendRendering/_renderPersistenceIdentifier.html new file mode 100644 index 0000000..00a1359 --- /dev/null +++ b/Documentation/D/FrontendRendering/_renderPersistenceIdentifier.html @@ -0,0 +1,3 @@ + diff --git a/Documentation/D/FrontendRendering/_templateName.yaml b/Documentation/D/FrontendRendering/_templateName.yaml new file mode 100644 index 0000000..c68d5a2 --- /dev/null +++ b/Documentation/D/FrontendRendering/_templateName.yaml @@ -0,0 +1,6 @@ +prototypes: + standard: + formElementsDefinition: + Foo: + renderingOptions: + templateName: 'Text' diff --git a/Documentation/D/FrontendRendering/_templateRootPaths.yaml b/Documentation/D/FrontendRendering/_templateRootPaths.yaml new file mode 100644 index 0000000..6330c25 --- /dev/null +++ b/Documentation/D/FrontendRendering/_templateRootPaths.yaml @@ -0,0 +1,8 @@ +prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + templateRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Templates/' + 20: 'EXT:my_sitepackage/Resources/Private/Forms/Frontend/Templates/' diff --git a/Documentation/D/Index.rst b/Documentation/D/Index.rst new file mode 100644 index 0000000..2265530 --- /dev/null +++ b/Documentation/D/Index.rst @@ -0,0 +1,20 @@ +.. include:: /Includes.rst.txt +.. _apireference: + +============================== +For Developers / API Reference +============================== + +This chapter is a complete reference of the API of the form framework. It +mainly addresses your concerns as a developer. + +.. toctree:: + :maxdepth: 1 + + Events/Index + FormEditor/Index + FrontendRendering/Index + +.. seealso:: + All built-in finishers including their options and programmatic usage + is now described in: `Ready-to-use finishers `_. diff --git a/Documentation/E/Accessibility/Index.rst b/Documentation/E/Accessibility/Index.rst new file mode 100644 index 0000000..a2e4c1f --- /dev/null +++ b/Documentation/E/Accessibility/Index.rst @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt + +.. _accessibility: + +============= +Accessibility +============= + +There are numerous accessibility rules when it comes to making a form accessible +to a large number of users. This includes accessibility to groups such as people +with a disability, the elderly, non-native speakers, etc. + +The following should be kept in mind by editors creating forms +in the backend form editor: + +Labels +====== + +Always use clear, descriptive labels in the :guilabel:`Label` field. Simply +putting the label in field :guilabel:`Placeholder` is not +considered accessible. + +Descriptions +============ + +Add an extended description in the field :guilabel:`Description`. + +Placeholder +=========== + +The :guilabel:`Placeholder` field should not contain the label. +It should contain example content to make filling out the field easier for +users. + +Autocomplete +============ + +The autocomplete property should be used whenever a field contains personal +information. This property can then be used by assistive +technology to aid users to fill out forms. Select the desired purpose from the +select :guilabel:`Autocomplete`. See `Input Purposes for User Interface +Components at w3.org `__ for +an explanation of which purposes to use. + +If additional input purposes are needed, your integrator or developer can +:ref:`add additional input purpose options `. diff --git a/Documentation/E/Finishers/Images/form_finishers_overview.png b/Documentation/E/Finishers/Images/form_finishers_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..661d5a427908fc05f8236625d43c7874d2542c80 GIT binary patch literal 69885 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 +* :ref:`Email to receiver (you) ` +* :ref:`Redirect to a page ` +* :ref:`Delete uploads ` +* :ref:`Confirmation message ` + +.. figure:: Images/form_finishers_overview.png + :alt: Form editor - add new finishers. + + Form editor - add new finishers + +.. important:: + + Finishers are executed in the order that they appear in your form definition. + This is particularly important for the ``Redirect finisher``. Make sure + this finisher is the very last one to be executed. The ``Redirect finisher`` + stops the execution of all subsequent finishers in order to perform the redirect. + Finishers defined after the ``Redirect finisher`` will be ignored. diff --git a/Documentation/E/FormElements/Images/form_elements_advancedPassword_1.png b/Documentation/E/FormElements/Images/form_elements_advancedPassword_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0c651aee138d880250b3a587a7e59d07185ae0cc GIT binary patch literal 2089 zcma);cTf`u7RG}S!iofuCQ1-tY08S?5rja1m5zYaASD472oewwkRSv>lonbP0Vz@= zBE2dtR1GyWX+cons3C-Eh_v%=_V#Y~Zg%#cH{Z;g`OTYo?|bh>-!j(aK5_O0007|D z*V8fs0Dz$HI*;>v0DQAj`w9Sn*7dbCEwEJj)SkJ;7+cH6z6tXau3WC+HNVzCl%kU( ze{lBWP=ekQ2gOH)3TM%IuYhoOac)vyzN|TW+Fctm)tTTLOLd0LVxB<+5G|Ji&NE-G zU6#9I{$8b~y(L7wxm-QNH&uC>;mx36*D$ABFdl3gAOHm52N?LjqQ%h9dze^Fgda@} zxsiHpP*y)ON5Ld?5k`a2EJ@iLjQ*bKkLqx^&kyNF$v5WL(r9M!MhX-X z;r6=#Yxf`_XThu(QQl_7ppS|(wrle?uO*f8swa~~2P^UhGpaeS#6dDn1s%HD7WEWh zv^EUzLuX2A?Fm`YJYE!^Cfh=*Crxd&`E6-~Xl%#R2Z+(QP8~y>?*fg-Y)%(;s#ZWU z_lx7vcs{F{7$9>gUS>As*sQgf^Geved;Ybbv1m{1v_ zVT?SUN&??SFRDXpqvtlGu1mS3xc$uwUB)Hw6HdGtb9>oBkUMAu^2&oxy3EBwhmY@2 zCh4(#r1{)4NR+XxNi=X_DL=Qk(sj@o3#KbVrCeygU79 zT!PXSjp|nCdQ}rXoR{KnnQvKbxEzOiT5*xdPDWPA`)Xnk6fF?q+Vsu)-kMYE=(4e( zUxN3sAasXUX{^!H1J52y7kbphq?y=bvZ~7jz22Hyj;()nqgHU^%kp7z{>A8p#*-}5Ki@&>ZnNzof!d$|F51RKM# z@%+|)9*+6udv*Z{hsH{j$&2DjBEE~$5BptUVnK9bdnMT_M;eye$a%#R@~Ml0J5%OZ z^VCFTf;I>qm---mBx>D*c-<5E zL5e%%#~5`i+2(4sF^(3lP|+V;Z*iM=UMShnEFluXsJ@@x1(uROcGDJwelH)lo6xW2 zxqXjVw0mpzQtwi_0bVu>+JJ}Q5ic?9L{RGLpy<>C(J#o z#<5!=rtF2?G71*xBl&~Hs|vW$Pi(R`V7{x8_R$QZImpfLjjshG=OfoY-~u4?vNyIG&Z zOz>x5@M{jWOz1c_Y+uX**1zqSJ&_L5=Q% zC!YFG6!REXRc`O@!zMIKJ!cM1yBHI1j9Up@ob267Zu5MfyJMREdY7!x82-_2IB&cs z8Q(@;RdBTcAx#A!2Y$agp0`Zq+|{&>7rVGY%|PkFu+Af7grP^uJlmkNT|n_DEWNZx zy^z~=mL#*0k&$-pt4z?zlIwF>{{o?Gt>V-`S-g8jEE%uEY{ZmfH`M1|E^r6o+6Y8z zhzgMZZiJ}28(in|!cv&wAfw2v(Dm!KetvMaAy#;#wMltxa^pONL~z>HA9dOr0qQ&svj#6y2th`6xg z7b-jvw!Mf~mVA+`GghSS(=<%|3H7OUSjv=|C+3#vpUsE|SoN}$eZQa4QlNd3FLft2Y9T!rIQ1p^hvk-mf)%k|O*=g<*VI3F z=}%_#cd1YWHB7y;E?$pI$2-P1L=lzf8$tjt?sF8VFf*BZbN literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_advancedPassword_2.png b/Documentation/E/FormElements/Images/form_elements_advancedPassword_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3300850c37200ce37534f55a30f829d5c9728dad GIT binary patch literal 6023 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_all.png b/Documentation/E/FormElements/Images/form_elements_all.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1731b1b89810315eb50113f7654388b8439b40 GIT binary patch literal 23832 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_checkbox_1.png b/Documentation/E/FormElements/Images/form_elements_checkbox_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1b5ec4fe01cf05aa23a9f6d5fccdeb1d6ca921 GIT binary patch literal 766 zcmeAS@N?(olHy`uVBq!ia0y~yU}gidjW~b=!{K$4^%xkKj(WN{hE&{od+V-uFr&<| zkN;K~X$zarjq=m&ZkZN1>4t`mc9Vu?*B2+*M3E~~ytEf>a2829%f#GivU=`R{l((J z!P=M8&Qxx*jh(SK!2IsKTKn+!`#Y;2oZe~a&9Y>Vst>~iMh7+qNrn`xj1TuEdt^(O zivCRQ+Tr}aDz`${)989_s^1O8=7QPpmp}W^|G47gI)@KYdC5&Y6NDsx)b7uW-l3YM zy?7GSIsTM}DJKp*|NXmi*Mi_lX}$b{-`D19Z`(6TEj#Ai8jdrxLoXJYqK@tNYkz1RZCNP zXSZ^-PE~qjT3VXhug_WgRZd2{jrba2^m*Bm7r(0Ar6vU>JYLhYCHf8b>=c8k_cc8Q z%d3ybPTF;9(RXuqRn54onz4tGm_dCup(@bBiY?7ES^t$Eg)&bqH>yf|Fygq&5pVDP6edD?IG&9XjnV1qlG zl;#adi9HWj_3Ec3yw&Az+jdRW=lIi$+x{dT&VCtmG2Qs?=R-Q{=he@xE&H+Ub6(E* zn-zcONpK&QlYDVkF+D2q^Bghb3(KXZZ`Mf946{`x6$)zie| z{3T|mecAZKjQg+}C{Zj4W2^t;bMcgw$4Q<;Yxiq?XpdyqoQW^VIIy9msRK>#i=1!H U-oNPaW>CWRboFyt=akR{0OjynVE_OC literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_checkbox_2.png b/Documentation/E/FormElements/Images/form_elements_checkbox_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc7a81e96d12090cf46ee58d58f0a4a436d08da GIT binary patch literal 2677 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_contentElement_2.png b/Documentation/E/FormElements/Images/form_elements_contentElement_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6dcd6e6730955a8ad16f53003e7126734312503f GIT binary patch literal 2021 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 QKcUGKAFIe0$i8^}KXJ~z^#A|> literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_date_1.png b/Documentation/E/FormElements/Images/form_elements_date_1.png new file mode 100644 index 0000000000000000000000000000000000000000..004c541e9246331a24e63ccbe954f5091fb7a530 GIT binary patch literal 946 zcmeAS@N?(olHy`uVBq!ia0y~yU}grgJve{_L%&_wS)f3rr;B4q#jUq@Uwa29${hIk zZ+UTA<}@YGm9Z{s)`(48ICJ9Gs)eFyfqON$c{-o1HR9$uBJR1}^@-}P8%mp8FT81! z+1$OY#N9Ufxy{=ho?OxI?|%Nf=SJ}j$?A{RH8+pl*sRJl;kJ+)gA_vs!ve+zww8^) zfmf~^`gUReyTf@Lth8JMF#CN3PVvIn46LBD0HU1v*Y* zJM^^g_xekp@63CX!93sivn>$l|1;3?xYVGYd-b~5R_8s@iRJ+UJYsA9Deg15vrR%& zCBxxvRM?C~ahviii~84wepX|$%zXDUtbKD{ZIu1wCLUgmu3c*u=&CI9OB1`R=kd~b zw$b(fd|RI^5&!JEX?AvbeihRBKJ@&Q_v&SYjrMPK+F8u4}M}4^4Si14nQuk@c z7Eff0aeu9>-n;5BFv_F~!hg2RC@Ou|YjPn_QXuI?0ynS2GPZSFwnrZd|9d8H!TvIb zj&;ZQq#As9V`_s*=;b$Jz5PF)Yb)DF4}ec%S3$#&qX(3%1!iFi%*` zxOwO2!;ZGM8UjsUtTcaaZctMf(~@odSTBZ2#hv+D_pI5yVOtmr_kQ(RKjZ#^3w`{D zEUw6wKNLy`H2-iG}-(@V?d;KRr--&mdKI;Vst00(laNdN!< literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_date_2.png b/Documentation/E/FormElements/Images/form_elements_date_2.png new file mode 100644 index 0000000000000000000000000000000000000000..57d032f4d07dc3ffc0afb932b718474874e3f04f GIT binary patch literal 6970 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 CQAa-j literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_email_1.png b/Documentation/E/FormElements/Images/form_elements_email_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5451db012ba9c092923f8f21ea2f2ce8cbbeda83 GIT binary patch literal 1014 zcmeAS@N?(olHy`uVBq!ia0y~yU}gideK~*xgXJw9E1GR*7v+mi1?|(AeW`DQcT_wirw-0eJ z7%`k+P+)H0L1tV#f1t`M(sa|ii<=)UzIwhs_Ua_RpSvq=)HgRK38yH`d!sco;`@u` zcQ2{s2k zt#_s8@t-yEf2G_1m~+LJUal3NyZ#oFf6Wf1-Ye^Nomjf)j9li5_w!P3teEP3u`xpD zTKVy;@NGw#4^0zhb|uIi0q>^QO4j#UJwTLZh zb6MiG{pME}&MkIxeSUK9tt+QCNB!^o_14}n_sWGXnTRd7_HO=^YnY(Vvg^!gX6~XW z-y5Qmf9gKH@%pzQ|Dm+Mf1T<=6>i&kTmGzDH>c4eS4=oA_L)@lyS+A_V8%s52Oig~Y=a1r_p3L(yx8Da|OHr8aRwXTZ|4;Q&ehVA> zev2ow<#lBzW={N*dVF1Kq}PHy(tjde9Wl&gP*VA&ZG3{IdA&>P`(HtmGv4d1J@L)j>&H>Ij~dLC zSN9jM2$tPgb!A`h+(&D3CjY;BP)zsimOy9iO+xhn6B{dcn~VHcxv?Q+Vx#T7Ex&!7 zc&s;nEO^p0tK{AOpA{J|=6g>pS@!LB)NyX3**O8TgWIlDJI%Y+-|Zv4bpoRU8-pZ6 z3Ihfs;N*!H4csX`uOua^zS%usioCmGmZMts46zL_XS$gMn=;?kxWTvKO$Vvxiz5Yq}QB7gdMj4b8yTeNTNeC7XBs;X~!&BM0kHO104 rZ_eGXY1sdhA*Kr@vp}*>L;YV~7e`&Ce|;aWgEF+ItDnm{r-UW|HyYXe literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_email_2.png b/Documentation/E/FormElements/Images/form_elements_email_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3d0dcf54054b1cec53aca22bc86bbbebd6447a GIT binary patch literal 4611 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_fieldset_2.png b/Documentation/E/FormElements/Images/form_elements_fieldset_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1daa01c6f55ecef7eff13a71637119acccedc961 GIT binary patch literal 1880 zcmZ`)4Ny~87S6iE;)>8(w2!*PtT+m7UL+oxpVHh_uPBu z`_8%NA9x(ral_UP2n53MU}$h80`W({X6x452E?fVUK0Xgk2)B+AT#0>K|YPlm`X^H4X!I%j5Jk zlzPlK<5u&zYTX-4GcTu~X3ZP`USc)izur9XYkS)HXe=;ubx3bYresh1EXY)DbUW36``5*xpRTib0gFA|+wHXtA&5{ypq^dxwo^jOJEz(dj zICsUGPXV|F>{Og5dn4Q3ZG$66plx&5B#VIXi5gKsEci*BZepVP#2(I_l8x+LcP9nj z^CKfh-un%;a1Bmh+bsOj^4R|<0rT|2Z+s@uX!G{#Y6(=YA-_$=aZE-8S?GLmt2g&D z<^nFRfj#CIO_9|1F1p#?9YD!2XFm8>|5V}4-s`=4{c<@!vXy>v*K{@C;WUcppcXnT z{YhHLRKCI6OWtiXUU68%YqSOecr+Av?>QUXfS>+7Jp!L(#HW7H+VR!tO1LG3gKTY! zeWB!}*ZG4!%&TWb(GxxWUL4GW-ABDh~<1tKLf<4!LQLj}6$Q8X@H_JZg^@ z1_F1X969QIZmY|V-mLd&`QTBwz1^L2co*e-sviIc0%#~UJ4K)V&Y0wOruR?mDjs{|M@gu!c$nUBznh!iYl9jD0jL5-%lj!JeU}#)Cl2 z?8JZ=Izim!wax3IABDP7C_Rx$Hd26ItLuEJAq?R6t%wYZP*h?i|LW6LNV6JT`^?0# z#bUGp>c{hEjbDgDAs6(IfVnR#Etx?RdfaDaeoRlSZPA1PveA<|VwvT}p`mL7qC?A% zElr9>lStum$Z1QAzK17PfTvsu46C6d3|QJG`ggX}($?OE{$#xU-6DNw#S<&&^DsQ7 zf4lR>RH1$_GAl}o<&aXV?{%q-*s#DGimXt^{}a*S#Ue3{=q;CvtZ^{ zK>FGjW;5RS#cXv^2)>0^#YJZTEjv0dgEgezYdLvx?Yi0R%cbCJU24v1cd~5ym!@R8 R?`q3D7=jCKKJfLo{{e&zwb=jw literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_fieldset_3.png b/Documentation/E/FormElements/Images/form_elements_fieldset_3.png new file mode 100644 index 0000000000000000000000000000000000000000..eddcde9546cb1c8880491b47d80415eee722e556 GIT binary patch literal 1369 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 X4feaTo4WVQ00000NkvXXu0mjfh?q5n literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_fileUpload_2.png b/Documentation/E/FormElements/Images/form_elements_fileUpload_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f73eb20d40d54585c4bd887eb05ddb2b775437 GIT binary patch literal 7902 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_grid_1.png b/Documentation/E/FormElements/Images/form_elements_grid_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8408b59dd861dfc720d686990beca417b243b4 GIT binary patch literal 1314 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 LTA2`xFWveVblF{4 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_grid_3.png b/Documentation/E/FormElements/Images/form_elements_grid_3.png new file mode 100644 index 0000000000000000000000000000000000000000..be5f74d555c966a6a4f4d85dce7543c36d7b98e6 GIT binary patch literal 2365 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_grid_4.png b/Documentation/E/FormElements/Images/form_elements_grid_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d2f8a60df98f235452f86e0a6eb69dc87fda79 GIT binary patch literal 8928 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 U`%St`+h5?z#DJv#l6aH+50}h)y8r+H literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_imageUpload_2.png b/Documentation/E/FormElements/Images/form_elements_imageUpload_2.png new file mode 100644 index 0000000000000000000000000000000000000000..11f29f580ef1d28e420db4254b954c376b67d7d2 GIT binary patch literal 7471 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 SmhJbi5~!-KN|o}Xi2nnGjCk(= literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_multiSelect_1.png b/Documentation/E/FormElements/Images/form_elements_multiSelect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d321a851c24d8842df7ea2149bdca284ccf9e51f GIT binary patch literal 1655 zcmah~eKga182?dIezjxiClfN2!wNTwDe^MIbl8|%mL&6fT#eL~w9BHcS82J*&C7Pu zGIF&@GNZM1P02cOExBC-aW}M-Wa<#Le;jGk3{D? zTaNL|poA#PmH|gwTHGB4-cV4?v~z+t zJO4CFxrG*OQO{EjfGLJD+sgcpq4(sCWLb0P!vU)})6g}Desp_d&GRNRnj^E!n5%&5 z1ts~9*;Pl1Dz~qzY$A`ga@-B_jEO_@Tv8{cJaogmj$PfS|7Y>4hxLl zwvkK}ju@OIma!$z^)-QI8cF*g-Hhb^nHPRwBK7#w%U4OydN87Lt0B1bxxY*%>$_hr ziHQ`XAFSbD{K*1_&yn;ErVMTtPC^7U?53q93ww}=Vm2+)Bi@9!#+fGVO=zuCrVJ?E ztmc>@LRx8CEzy{$4zF&k&43Vc^h&c}KmX22sBW;>KBt&R8ketKkwE0VBw%8wn9ai8 z?b2QeX7#ArtiVueAor@se@}Cc@jpl6*7#VkxiCg5xW7_&{yx+`{0E~=QU>9anT+fQ z@SOQ40_jXNVIur>VRuJ=nO=}^>uY(U(W>H|4z@{oK`tSNcTUk0y^*}XUkY9e1v>!& zB;X&Qrh-qyj1jAL#QKTj?p(aEr0TGXooh^i9WzXLqz#4x-nO8-3KMoOiMrwXD!E}j z)3;_Ns*;B;!iOyq7jR44v5gm&Mw?L5C_5o{6$c?!hie8su4hTwrg|ZIkC_t+U?D zk<#eYi4$&2#dTzFoxPF~|0IXINt4*s&*AI>Sq`w#M{N?R`M|3=hoU6|A>Naawoh!j z7d?LX2E7-x`;vB)zeg$cMUZPVmDCiR4BAl|N_hyUo+>HBsT&WTIRpLN&u(}un&guc z91HT;>tyvtP94;bn$s2}_l?{whr%V(Iz!Iy<5E<5?}C|PMI_Y@jfx=MrXQAZutT^H zUgjqI5)|mA*?Co_Sd;RPEba9uSaRajOom&ztP@9-4vBY;SpLF6`J0(`G>fMu_ap`u zs4y&7ntgZd-QpOVeCCO-OY z@fc$}%%_GrKdv{A1g}-hoG;kRLt@_ec`$Cv$DDFWBhkGqduBj~N_eNHKcyZ8HQ-$cIB00VI*@pIt(}Mk(x#$HwZd2~dn|i#Z3&oem$u#MdWmMW9nz>Ze>WM%1r~S|naJi-CuN^p_e+^{ z*@04c_hUiwIw^en_au`5^#8i-x4yfW8Q1K(mV%ECMZwGqYs?om=2P|3vCSmJ*Zm@B gogx1>5m6`7LSC^jq~-lGxcH;^dJ%B9u;H110XN{^ivR!s literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_multiSelect_2.png b/Documentation/E/FormElements/Images/form_elements_multiSelect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..03e94c1f57282a4372d0535d88a34815f46482cd GIT binary patch literal 8133 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 PDW{5(hGL<@L%;t5*~7Ae literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_password_1.png b/Documentation/E/FormElements/Images/form_elements_password_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c388adab1784055ef10787b35f64d04537c3cf3 GIT binary patch literal 902 zcmeAS@N?(olHy`uVBq!ia0y~yU}grg12}*LL&ENF)<6MYPZ!6Kid%2*dio0|N*pNM zclk_-m2Lp%lxd-g6MdanoF+DB9AOm{4is)G?3RA#cEt3ZoXt#=SB|-ziyRk)PFx!0 zlEHG^PxEs46CeG1FaFfaC-C_{n}23c`}4B`4O>$Um@Y6lFf;Hnm@r^6BGxf34w|HL zwEEJI_0Ru&nesnvR>Vu*6QRALWSA% zvg_0Key-1cu4yM9?rhj=YB+7Ov1I)8pQ;z*m#y6=AYQlhb@0#qOn#qPw(rlh-S5s@s@A(V)?E3bEmxiS zr6cCTqY0S|+WQ%o9t&TrwSD=n^Xf^ww|+Bj&C6N%|Hd2D%6OBiN3%9wHLS67e_g*& zZiZ%Atw?-q7}wY07RJzj-eDUKVr&hFfL z>%!`L=1IrWKigYK3(mi@?&bZbde1-qE()-q&(Eq%_;#k!cE%#c!%x0*ge6F=l>anJeqBL4F6 i9he2Q0wX<#eHLG3vgXFIg_A--8O+nw&t;ucLK6VzP=(_F literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_password_2.png b/Documentation/E/FormElements/Images/form_elements_password_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b1792d5e0bdaeda43441ce6b453a067ce12a54 GIT binary patch literal 4675 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

TyM3E7sBiRMwO{Y%j39eUf~TBbA;^G(1mew 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 avb_^OA}VUk-v8=~sw!zJ7R&$j=Kla3a^*?@ literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_singleSelect_1.png b/Documentation/E/FormElements/Images/form_elements_singleSelect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8ff5e2781df6cda62a640d02452af71fd149f5 GIT binary patch literal 1666 zcmV-|27UR7P)oXm@f7jyQ(g}^4gtUl51=zBeu0qTJA*X;TKDNf8l%@3M+q5A z4?BE7(7e0F$37 zHtw(QW5qXnpH3NSj8Npz&L~yF)*ycXzRaLJQ^>YyVRVOP^S24gQnps5EB$=6MF?PV zw_C5$WvCzQ7EFR2ISAdbL8Kj2`v}5OkLet=+!RsLH3OxA+6-3*JkUbE_o^~Yp%D}OVD6kU>O_`0$z7w0J-#K_ zEG&W-cT-xGexD|Gfyq=AjbnyEDr?*Up*zh>hO^GHcq?@y108HFZ9!V{-xg z+0s-S97|!QK$ZcpH@;A>%NfH&fjk2MKmY&;00031AOHXa0Du4h5CFi62!OI#0A#>M z1qy(&Ow0qwz=VYg5P)rh@^}GOJP$Qt3lM;X^06GiipTmWOP~NexRD#k0_zDFfS1G6 zfE;jM1ONyC0RRF(0Du4x03d+n0r-AOkI|o-B8=(YzkkHbJ;QH#f`+nXEg>$DS^!+V zvBNP?lI>#KNB?U8y;-j??;x!JyctdW*EvIHfH!dj04qO$^lSVU?(rOR_#U}cQL*#O zdYX9Z^l5ieUJ3!smM7^hxcnzeKP1N$KOw|s(xx^tLI9jOH!hcd8miWqP`O~;y(4iN z6A#il1-cq#y6fN{hym=Xo9)zExyuDZJ!x7Y0Pi;^M{Ea6X<=w_bGgz^! zT@0XvC3La*vEE6@V4@H}Ta;F-jf)Zgu5N5k%7rc;sf^(_?M_)}DD!5;@(*K5tx5A( z1Hi|iJd$6`c1D)JdjL=Z2oaGVnYuqW~X42c2!nd5mgmNHl954vkEaIY7^ zzC5$|$ZBvQ0Qfixh#wh=FMp3ypb1^S7{GT+0+==Q@rM!d6lf%Al3(?f3NLJ~y_=9{ z`p3WL^G!5=&o-2?XKOjaUNk?`^GAq>hujDNKD34G`1tIF_XvQkNNam)uh;f7ZvtSe z3Wxi$6NCWhlADz>FH$SVy9{RGDp0TXwxd!1ggsMaA1%k;~JOemdMNJ*Jf;j|v20*5c zYxULmxD1eM000O80096X000C4fB*mx0DxozusLvRM34p65$NW)l*NIY M07*qoM6N<$g6(+aL;wH) literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_singleSelect_2.png b/Documentation/E/FormElements/Images/form_elements_singleSelect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2771f9babc131b844f4b4e6a5fb592b8e49249 GIT binary patch literal 7356 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%0DT=wmVKL6;i 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 Wd>ePlHI_fyl4>AL_1PgQpCYWWwVx{~oG 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 P?LPs(gn~9&T)p*g4>k(_ literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_telephone_1.png b/Documentation/E/FormElements/Images/form_elements_telephone_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c02fbe218b69b514f463a9bde56b9c281b1d314a GIT binary patch literal 1128 zcmeAS@N?(olHy`uVBq!ia0y~yVCDd_gFpns)yZp)Gcd5|d%8G=RNQ)d_iw&%smy`G zf6MFM-&(tOOR4a#v$=B>kw?=~XP%LLefZtJxZ87h#H4#WGk1J{z1-|)%{6#4ad)Rq&)0arbjyS9pH{E(Eq8al|7q@y zvg&^u3%vZUUOD$F>GY(l`p52`4C3hbImw;0zf`~FM$W$Ap8@lPoxd%3|1+j+dezG{ zMPAS5t=+Y*``3I6p%ps>@>;sT_eK3LaN42KwVr?ZmfrHGLB%O~A#G$iShNpQC&W(|5vR&3vZoX=@lR)(CslD9By$2iR z{(s{E88Tt##a#i%)5|`7dl?gNvgx?S9Xr{+Z9UPKcpabJ>tmPd-tOTf3`l)n75bpd^<); zkK;dRGO2-GB5kL@nUpHV4-F-kbcCBGni)qvSUBDAvfE67NonUcHMY;2YCQR=(}{=} z(}Ub=d~OPC`s2tpFCm?iQGumFfWe7@gEYpE`A!DQB0mYvOYof@&2q!XZ!?F%o(&uy tN^Yh;tPJ3&2;g{-h?y;sME*F}GtHmbCzfAgIT2KZc)I$ztaD0e0s!Z?_*DP^ literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_telephone_2.png b/Documentation/E/FormElements/Images/form_elements_telephone_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7273145eadb724c71bdce9d86be31c63a75db4d0 GIT binary patch literal 5062 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_textarea_1.png b/Documentation/E/FormElements/Images/form_elements_textarea_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c831b8e1b86b56350b0cae822d584e5147ea7193 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0y~yU}gof^EiM6L-5rH3xNV{o-U3d6>)EGzxNg{lsWM6 z-}1Y6i~h}e62QHDMZ%PbLVhi+g&JNQyoyt=bX860U`_LyCTTli(FUEvlCrj43ha*z zf-mLVTDNWI@4C&ZPiDFIZ?E1z@7>|=H)sF8b2qP@WlrAl|7;Cw+*uh!8A2EW7#$#t zKWh~(KKPaVW4_?&Ne*VWgAR(u>X(JS_|<)-Q-9yA4wg+3r`%FZceY(pTfuNMZ#LJp z-={wF`E~`attwrnQNQTQ(@(93#k=oL{rkGmHvi3!1r;0hxBq&#%jeFw-L-31m$@@b zD(z(|^uB6c{#t8~BZ*pQ=B<+(CntI+>g>DrLp#!px7h*|%&Q$4EkbKKI~ z?=lpemxK$fyz@D9U)lW4%ewbinrffy)wp<9Of2@)-W}^=dex-LrHU>-kC)EUthX=1;b3e zy-kt%PcMJ`_;EYu#kCp!|3fBNte#tWV_8nf1as}=QcGoN=JjV7x7H(MZj;5u0b3X>U09e$J${^SYm1&Q)733Scz4YgT^T{OT^g z{pm_oKGN@ktkxFHTy7n++H6jNcKIaH6Xx?a^)T`Aj^BL)tk~u3CEb`rw9jH*(`YQVx7A{#3Ck(2&1N*&(4Q19KY3*FfE%=Cfm5_!twlVqAcRN zoGI%cHstW@n71#x?R0R8{I-w;sqSeEo32d~5LDdP@m}%pmemfk9GMFm60%q{MH$Yy hpk)DgUI<|Pz+JI$+AQ((@G4Nw^mO%eS?83{1OSi^lNJB~ literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_textarea_2.png b/Documentation/E/FormElements/Images/form_elements_textarea_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccbee08b90d6713d18949828d27e50019b2fab7 GIT binary patch literal 4566 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 v_1gTe~DWM4fvA(>) literal 0 HcmV?d00001 diff --git a/Documentation/E/FormElements/Images/form_elements_url_2.png b/Documentation/E/FormElements/Images/form_elements_url_2.png new file mode 100644 index 0000000000000000000000000000000000000000..247d3a9774c3093ade697ad4c8c8ed3092737cb0 GIT binary patch literal 4197 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. + +.. figure:: Images/form_elements_text_1.png + :alt: Element 'Text' - preview in the frontend. + + Element 'Text' - preview in the frontend. + +.. figure:: Images/form_elements_text_2.png + :alt: Settings for the 'Text' element. + + Settings for the 'Text' element. + + +.. _form-elements-basic-elements-textarea: + +Textarea +======== + +A multi-line text field, e.g. for the free input of continuous text. This allows +the user to provide a short text such as a message. This element has the +:ref:`basic settings `. + +.. figure:: Images/form_elements_textarea_1.png + :alt: Element 'Textarea' - preview in the frontend. + + Element 'Textarea' - preview in the frontend. + +.. figure:: Images/form_elements_textarea_2.png + :alt: Settings for the 'Textarea' element. + + Settings for the 'Textarea' element. + + +.. _form-elements-basic-elements-password: + +Password +======== + +A single-line text field for entering a password. The browser "hides" the text +input, i.e. the entered characters are not visible. This element has the +:ref:`basic settings `. + +.. figure:: Images/form_elements_password_1.png + :alt: Element 'Password' - preview in the frontend. + + Element 'Password' - preview in the frontend. + +.. figure:: Images/form_elements_password_2.png + :alt: Settings for the 'Password' element. + + Settings for the 'Password' element. + + +.. _form-elements-special-elements: + +Special elements +================ + +Sometimes it is better to use special elements instead of simple text +elements. Mobile devices such as smartphones display on-screen keyboards. If you +use the "Email address" element the form field on the device will contain a +"@" character in a central position and a validator will be triggered +that checks for the input format "firstname.lastname@example.org". + + +.. _form-elements-special-elements-email: + +Email address +============== + +A single-line field for entering an email address. This element has the +:ref:`basic settings `. In addition, the field has an +`Email` validator (this is the only validator available for this form element). + +.. figure:: Images/form_elements_email_1.png + :alt: Element 'E-mail' - preview in the frontend. + + Element 'E-mail' - preview in the frontend. + +.. figure:: Images/form_elements_email_2.png + :alt: Settings for the 'E-mail' element. + + Settings for the 'E-mail' element. + + +.. _form-elements-special-elements-telephone-number: + +Telephone number +================ + +A single-line text field for entering a phone number. This element has the +:ref:`basic settings `. + +.. figure:: Images/form_elements_telephone_1.png + :alt: Element 'Telephone' - preview in the frontend. + + Element 'Telephone' - preview in the frontend. + +.. figure:: Images/form_elements_telephone_2.png + :alt: Settings for the 'Telephone' element. + + Settings for the 'Telephone' element. + + +.. _form-elements-special-elements-url: + +URL +=== + +A single-line text field for entering a URL. A URL is typically an internet +address, such as that of your website. This element has the +:ref:`basic settings ` + +.. figure:: Images/form_elements_url_1.png + :alt: Element 'URL' - preview in the frontend. + + Element 'URL' - preview in the frontend. + +.. figure:: Images/form_elements_url_2.png + :alt: Settings for the 'URL' element. + + Settings for the 'URL' element. + + +.. _form-elements-special-elements-number: + +Number +====== + +A single-line text field for entering a number. A user can increase and decrease +the number in preconfigured steps using visual controls in the browser. +This element has the :ref:`basic settings `. +By default, the field has a `Number` validator. Additional settings: + +- **Step**: Here you can enter a number that defines the step size. The step size + is the amount by which a number is increased or decreased in the frontend. + +.. figure:: Images/form_elements_number_1.png + :alt: Element 'Number' - preview in the frontend. + + Element 'Number' - preview in the frontend. + +.. figure:: Images/form_elements_number_2.png + :alt: Settings for the 'Number' element. + + Settings for the 'Number' element. + + +.. _form-elements-special-elements-date: + +Date +==== + +A single-line text field for entering a date. +`Most modern browsers `_ will also display a calendar from +which the user can select the date. This element has the +:ref:`basic settings `. Additional settings: + +- **Frequency**: default value "1" means that the user can select every day. + +.. figure:: Images/form_elements_date_1.png + :alt: Element 'Date' - preview in the frontend. + + Element 'Date' - preview in the frontend. + +.. figure:: Images/form_elements_date_2.png + :alt: Settings for the 'Date' element. + + Settings for the 'Date' element. + + +.. _form-elements-select-elements: + +Select elements +--------------- + +Select elements (including checkboxes, radio buttons and selectboxes) do not +allow a user to enter text. Instead, they offer a predefined +number of choices, for example, salutation options. + +.. note:: + + Select elements behave differently to text fields if they are marked as + "required".Checkboxes with multiple choices, for example, cannot be + be required fields. This is not supported by the HTML standard. + + +.. _form-elements-select-elements-checkbox: + +Checkbox +======== + +A simple checkbox. This element has the :ref:`basic settings `. + +.. figure:: Images/form_elements_checkbox_1.png + :alt: Element 'Checkbox' - preview in the frontend. + + Element 'Checkbox' - preview in the frontend. + +.. figure:: Images/form_elements_checkbox_2.png + :alt: Settings for the 'Checkbox' element. + + Settings for the 'Checkbox' element. + + +.. _form-elements-select-elements-single-select: + +Single selectbox +================ + +An element to create a drop-down list. This element has the +:ref:`basic settings `. Additional settings: + +- **First option**: Define the "empty option", i.e. the first element of the + selectbox. You can use this to provide additional guidance for the user. +- **Choices**: A tool to insert and manage options. + - **Label**: Name of the option. + - **Value**: Value of the option. The system automatically sets the + "Value" to the "Label". You can leave it like this if you are + unsure of what you are doing. + - **Selected**: Check this to pre-select an option in the frontend. + - **[ + ]**: Adds a new line for a new option. + +.. figure:: Images/form_elements_singleSelect_1.png + :alt: Element 'Single select' - preview in the frontend. + + Element 'Single select' - preview in the frontend. + +.. figure:: Images/form_elements_singleSelect_2.png + :alt: Settings for the 'Single select' element. + + Settings for the 'Single select' element. + + +.. _form-elements-select-elements-radiobutton: + +Radio buttons +============= + +An element to display one or more radio buttons. This element has the +:ref:`basic settings `. Additional settings: + +- **Choices**: A tool to insert and manage the options. + - **Label**: Name of the option. + - **Value**: Value of the option. The system automatically sets the + "Value" to the "Label". You can leave it like this if you are + unsure of what you are doing. + - **Selected**: Check this to pre-select an option in the frontend. + - **[ + ]**: Adds a new line for a new option. + +.. figure:: Images/form_elements_radioBtn_1.png + :alt: Element 'Radio button' - preview in the frontend. + + Element 'Radio button' - preview in the frontend. + +.. figure:: Images/form_elements_radioBtn_2.png + :alt: Settings for the 'Radio button' element. + + Settings for the 'Radio button' element. + + +.. _form-elements-select-elements-multi-checkbox: + +Multi checkbox +============== + +An element to create one or more checkboxes. This element has the +:ref:`basic settings `. Additional settings: + +- **Choices**: A tool to insert and manage the options. + - **Label**: Name of the option. + - **Value**: Value of the option. The system automatically sets the + "Value" to the "Label". You can leave it like this if you are + unsure of what you are doing. + - **Selected**: Check this to pre-select an option in the frontend. + - **[ + ]**: Adds a new line for a new option. + +.. figure:: Images/form_elements_multiCheckbox_1.png + :alt: Element 'Multi checkbox' - preview in the frontend. + + Element 'Multi checkbox' - preview in the frontend. + +.. figure:: Images/form_elements_multiCheckbox_2.png + :alt: Settings for the 'Multi checkbox' element. + + Settings for the 'Multi checkbox' element. + +.. warning:: + + **HTML** does not check that "required" fields are filled out. They + are only checked after a form has been submitted. + + +.. _form-elements-select-elements-multi-select: + +Multi select +============ + +An element to create a multiple selection. This element has the +:ref:`basic settings `. Additional settings: + +- **First option**: Define the "empty option", i.e. the first element of the + select. You can use this to provide additional guidance for the user. +- **Choices**: A tool to insert and manage the options. + - **Label**: Name of the option. + - **Value**: Value of the option. The system automatically sets the + "Value" to the "Label". You can leave it like this if you are + unsure of what you are doing. + - **Selected**: Check this to pre-select an option in the frontend. + - **[ + ]**: Adds a new line for a new option. + +.. figure:: Images/form_elements_multiSelect_1.png + :alt: Element 'Multi select' - preview in the frontend. + + Element 'Multi select' - preview in the frontend. + +.. figure:: Images/form_elements_multiSelect_2.png + :alt: Settings for the 'Multi select' element. + + Settings for the 'Multi select' element. + + +.. _form-elements-select-elements-country-select: + +Country select +============== + +An element to create a country selectbox. This element has the +:ref:`basic settings ` Additional settings: + +- **First option**: Define the "empty option", i.e. the first element of the + select. You can use this to provide additional guidance for the user. +- **Prioritized countries**: A multi-selection of country names, which should + be listed as the top options in the form element. +- **Only countries**: Restrict the countries to be rendered in the selection. +- **Exclude countries**: Define which countries should not appear in the + selection. + + +.. _form-elements-advanced-elements: + +Advanced elements +----------------- + + +.. _form-elements-advanced-elements-file-upload: + +File upload +=========== + +An element to upload a file to the :guilabel:`File > Filelist` module. This element has the +:ref:`basic settings `. Additional settings: + +- **Allowed Mime Types**: Select the allowed file extensions a user is able to + upload. +- **Storage path for uploads**: Select the storage path in your TYPO3 installation. + This is where the uploaded file will be saved. + +.. figure:: Images/form_elements_fileUpload_1.png + :alt: Element 'File upload' - preview in the frontend. + + Element 'File upload' - preview in the frontend. + +.. figure:: Images/form_elements_fileUpload_2.png + :alt: Settings for the 'File upload' element. + + Settings for the 'File upload' element. + +.. error:: + + **Privacy issues**: + Keep in mind that the storage path you choose may not be protected. The path may + be indexed by your search and search engines. If you need to protect sensitive + documents, contact your administrator to create a secure storage path. + + +.. _form-elements-advanced-elements-hidden: + +Hidden +====== + +A field that is not visible in the frontend. The form element is inside the red +rectangle in the image. Such a field might be needed for technical functionality, +e.g. to add hidden values to a form. This element has the +:ref:`basic settings `. Additional settings: + +- **Value**: Here you can set a value for the element. + +.. figure:: Images/form_elements_hidden_1.png + :alt: Element 'Hidden' - preview in the frontend. + + Element 'Hidden' - preview in the frontend. + +.. figure:: Images/form_elements_hidden_2.png + :alt: Settings for the 'Hidden' element. + + Settings for the 'Hidden' element. + + +.. _form-elements-advanced-elements-image-upload: + +Image upload +============ + +An element to upload an image to :guilabel:`File > Filelist`. This element has the +:ref:`basic settings `. Other settings: + +- **Allowed Mime Types**: Select the file extensions a user is allowed to + upload. +- **Storage path for uploads**: Select the storage path in your TYPO3 installation. + This is where the uploaded file will be saved. + +.. figure:: Images/form_elements_imageUpload_1.png + :alt: Element 'Image upload' - preview in the frontend. + + Element 'Image upload' - preview in the frontend. + +.. figure:: Images/form_elements_imageUpload_2.png + :alt: Settings for the 'Image upload' element. + + Settings for the 'Image upload' element. + +.. error:: + + **Privacy issues**: + Keep in mind that the storage path you choose may not be protected. The path may + be indexed by your search and search engines. If you need to protect sensitive + documents, contact your administrator to create a secure storage path. + + +.. _form-elements-advanced-elements-advanced-password: + +Advanced password +================= + +The element is analogous to the `Password` form element. A single-line text +field is displayed for entering a password. The browser "hides" the text input, +i.e. the entered characters are not visible. Another field is displayed below it +so that the user has to repeat the password to prevent typing errors. This field +is useful for registration forms. This element has the +:ref:`basic settings `. Additional settings: + +- **Confirmation label**: Label for the confirmation field. + +.. figure:: Images/form_elements_advancedPassword_1.png + :alt: Element 'Advanced password' - preview in the frontend. + + Element 'Advanced password' - preview in the frontend. + +.. figure:: Images/form_elements_advancedPassword_2.png + :alt: Settings for the 'Advanced password' element. + + Settings for the 'Advanced password' element. + + +.. _form-elements-advanced-elements-static-text: + +Static text +=========== + +A field for static text. This text cannot be formatted, which means you can't +insert links or highlight text. Instead, the text is output in the style of +your website. The settings for this element are: + +- **Heading**: Heading for the element. +- **Text**: Content for the element. + +.. figure:: Images/form_elements_staticText_1.png + :alt: Element 'Static text' - preview in the frontend. + + Element 'Static text' - preview in the frontend. + +.. figure:: Images/form_elements_staticText_2.png + :alt: Settings for the 'Static text' element. + + Settings for the 'Static text' element. + + +.. _form-elements-advanced-elements-content-element: + +Content element +================ + +You can display any content elements that are on your website. The settings for +this element are: + +- **Content element uid**: ID of the content element you want to display. You can + either enter the ID manually or select it via the page tree. + To do this, click on the "Page content" button. +- **[ Page content ]**: Modal which displays the page tree. You can select + a page and the content element. + +.. figure:: Images/form_elements_contentElement_1.png + :alt: Element 'Content element' - preview in the frontend. + + Element 'Content element' - preview in the frontend. + +.. figure:: Images/form_elements_contentElement_2.png + :alt: Settings for the 'Content element' element. + + Settings for the 'Content element' element. + + +.. _form-elements-container-elements: + +Container elements +------------------ + +Fieldset and grid elements are container elements that structure +your form in terms of content or visual appearance. Container elements can +be combined. For example, a fieldset can contain several grids. + + +.. _form-elements-container-elements-fieldset: + +Fieldset +======== + +This container groups form elements based on content. This is +important for screen readers and helps you to improve the accessibility of your form. +For example, in an "Address" fieldset you could have +street, house number, postal code and city form elements. The settings for +this element are: + +- **Field group name**: Heading for the field group, e.g. "Address". + +.. figure:: Images/form_elements_fieldset_1.png + :alt: Element 'Fieldset' - preview in the frontend. + + Element 'Fieldset' - preview in the frontend. + +.. figure:: Images/form_elements_fieldset_2.png + :alt: Element 'Fieldset' - preview in the backend. + + Element 'Fieldset' - preview in the backend. + +.. figure:: Images/form_elements_fieldset_3.png + :alt: Settings for the 'Fieldset' element. + + Settings for the 'Fieldset' element. + + +.. _form-elements-container-elements-grid: + +Grid +==== + +Use this container element to place fields next to each other (create a visual structure). + +**The additional settings apply to the content elements inside the grid**: + +- **Configuration Grid Area**: + - Areas: **xs** (Very small), **sm** (Small), **md** (Medium), **lg** (Large), + **xl** (Extra large), **xxl** (Extra extra large). + - These are the "breakpoints". These are ranges of + resolutions or adaptations to different screen sizes. Smartphones, + for example, have a low resolution range (xs or sm) and desktop monitors + have a high resolution range (lg, xl or xxl). Use this to + abstractly control how many elements are displayed next to each other in + which resolution. +- **Number of columns for grid area "xx"**: + - Enter a number for the selected area. + - The number determines how much space the field takes up on the different + screen sizes and therefore how many elements are displayed next to + each other. + +.. figure:: Images/form_elements_grid_1.png + :alt: Element 'Grid' - preview in the frontend. + + Element 'Grid' - preview in the frontend. + +.. figure:: Images/form_elements_grid_2.png + :alt: Element 'Grid' - preview in the backend. + + Element 'Grid' - preview in the backend. + +.. figure:: Images/form_elements_grid_3.png + :alt: Settings for the 'Grid' element - Part 1. + + Settings for the 'Grid' element - Part 1. + +.. figure:: Images/form_elements_grid_4.png + :alt: Settings for the 'Grid' element - Part 2. + + Settings for the 'Grid' element - Part 2. diff --git a/Documentation/E/Index.rst b/Documentation/E/Index.rst new file mode 100644 index 0000000..f5aa537 --- /dev/null +++ b/Documentation/E/Index.rst @@ -0,0 +1,61 @@ +.. include:: /Includes.rst.txt + +.. _forEditors: + +=========== +For Editors +=========== + +Introduction to forms +--------------------- + +Forms are provided by the **Form TYPO3 extension**. Form is a TYPO3 core +extension which has been available by default since TYPO3 version 8. + +What can Form do? +----------------- + +- TYPO3 core extension +- flexible, extensible and easy to use +- easy to use via drag-and-drop +- live preview +- form reuse +- create templates for new forms +- set mandatory fields +- set finishers (downstream processing) +- automatic spam protection +- multi-step forms + +What can't Form do? +------------------- + +Form has limited: + +- formatting of form labels +- multilingual support +- possibilities for textual design of emails + +When can I use Form? +-------------------- + +- for contact forms +- for application forms +- for simple or complex forms +- for different forms on my pages + +Notes on data protection +------------------------ + +Data submitted in forms is not stored in the TYPO3 backend due to privacy reasons. +There are TYPO3 extensions that retrofit this behavior but we do not recommend using these +extensions. Instead, check if the form data can be transferred directly to your +CRM or similar tools. + +.. toctree:: + :maxdepth: 1 + + FormElements/Index + Validators/Index + Finishers/Index + Accessibility/Index + Tutorials/Index diff --git a/Documentation/E/Tutorials/BasicForm/Images/10_chosenFormInCE.png b/Documentation/E/Tutorials/BasicForm/Images/10_chosenFormInCE.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3b8cbceef451a8a13299c6d58c1c0f1e105752 GIT binary patch literal 69436 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

%duCT7#|-i$#u!?DfC6bZC9 zgY>mnY10&&rr1QWHUYg&Y;zT%-Gq799K}sjY?@*-53-pO`kkEG%#N+C2AihXG{yhe z^s(69uLrhlp?f7GDXzSkRo~ziZW0VuSqht6i$8RZP1?yO180+rw8_gt7RF5m&Ki`u uX^Kr#Y?6^S$w-@Iq)le;e;&!XlOiGb%)t*!281o}Pv(-mWGe2K=l=r#P}Ls* literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/10_elementWizard.png b/Documentation/E/Tutorials/BasicForm/Images/10_elementWizard.png new file mode 100644 index 0000000000000000000000000000000000000000..1c86470537b7d02694178f8bea32e77a4907b172 GIT binary patch literal 60602 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

wW!;>H3(z^vh}4$8&+ORCZ5`6l5a>#*zTreb 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

mRfyj$v6 z8;mzeNO(IOP^sbf-V8>5;pU65wHJrbK2GP$90;jLpss5$pQFK7kbf#k7h;+w_IEwka zyI5_BuAELK3l)9%w?5mxYx=&$s1=POK3UxnRe7lTLfBSU8SfhMtyF`72x3vb<`>Q6 zI|9Ps0Vn$Rxn(S|`wn>-(2rdpWI^8W;u}f(I$n4=Q3Z9)4p2}^iMlZMTVidFC2oIC z8G12U{~Ct~oa!gGOLIe*b9_H&t|8&9QB}e^Vi6%8+7yhYgzrG79Bf~Jc4V-k!MB28 zxqL8ZYdQH1UV2f&b%YpZ9%nhsWjoKo0{HUf$w4_uGjT5hGg~)k_lK(H3THp7%^Y1dk6uBQ5AuVQDeE$v%ij zi{joSNH1cTN!%#$f%I;MEpR>@ir2m*VyEOB#NpDVpnK8U_XgYV8YnmHK(@o1&64Tc zy_J&~X1KF1?LQAs_^M@%6Md(|BZ|x(v-rTFca6$ma7P=Rb{Ou<_IBmLZb;kY49fw` zGYRfTpDoU{WR8x%JHB=LIdUbV*mV=26M<&t?mRTS{9N>lKPSgMX^~YPXD23TU(mQ? zQ0ezRh=4HAS}<#qHFWWy2b_kD@`8&Oj_p{U$IIN#v{r{MNPcX#%Pp$n7VtZsl?x1- z8~{EQ1&d3m7)FdTxI&N(yVtc_Dk8|1!TdHl0eDIp(F>lC@}M_;^oj?)W(czc{wI)C znHQ#`wcl69d|L?hKnbN{saCeTZ}9{YGs5Zv<54|wvM8vM4rpz>iH1C_0;kHEglsSSABr;z>ah~Z)6 z6<^lT=(5aCbE8Dr*R1BbxU9Gz=+tzJ;~Cx{VygobZ_U|qws96<0d#0=R| zXv@4;>2C!MlQM8-=Y^qbgcZc^gY$uA>lq9XB!NaxL@5{^Gy0ef#O0qd2@4Z@$8Vr@ z`|9ft;n#+drf;$5sCDtui<(Y+5va4d!=Y2dt>0FoO$#m{VRB3G&3@v6$8I2sGCPvA z{EDr7S*_qBP*$3dEXP@6l<-{lUM!*89NX$*jHDUri*Bmy@(WeEJv?lDnx{G= zEG0fok=CG_kO}8RmJveoK8mcT&JMzJcI7!>N94E)MW&v5l5>tEa7J%j9qJv*&IIjA zb1&}V=__~oqvj%QtX;kQJeS)T3TyfSs;J7Se-tTHQ=ap@T3)DuvQMlMu)F6y#zF}s zw-HE`Qe~eq-dHW@(1-d#Y!N%M3vr>${gTISG-=&NMGK<6vSEL|9ChEDrZeu*Y6oI- zdW;V|fiLb=k1}Pw>9dlK{aWpde3)K?VO%NKQjXB%yjf^w^aY< z97A6*Je~wM*JP|k@idr*)#K*kw^6eD!}JpbOrp&@#i+z`y2jg{X+00|VbQ;IBihjJX4FH`dpssv55H9 zgg}ttif-<}{NPuJw{CD`x%m%(LRK61OVy76l2BO2kiM65S*d1>n~z;NzAIJ54~K!hn#1f17zxy>s%+D( znHndm@j=U1`9pjik-KA+UI3Exl;H5XZ&+hp2weWB)rLY(EG6ycUSvPGLO>Zsyy>dd zp$tN%yp0Iah+LY_!ip7(jgt=}RtvDTmpTWX24)jyM*BwUbhv+_5BF*qJdj(*CQYdq z$wJjq$Z8l?*PA}4!{;CDeye=jw79IpW7w_5ha&O1qQ- zw0-ZQX?I5pt@?!CKe&4`x^0<+9~^qD%yRuD2pG~mAJ3pDUU%~B|X~1|sqh5@Pv&sK2 zw$kz#;Xs^?zghpCmF)WClYrVtdZIkIGUENb#PvDs3wX3iO^u(u94PJdn_HX!dk32Q zZ`Gjwg`3Pv_E>-L!AE)f_Wb$K|JdT+b1Hrx{;zT1ckBPZ;((r>PdgF#7y8(N4}jmk MfRH^kyW=kW9cecgJOBUy literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/1_newForm.png b/Documentation/E/Tutorials/BasicForm/Images/1_newForm.png new file mode 100644 index 0000000000000000000000000000000000000000..72bc7906661be34a986be927d9a3ca545a1c4220 GIT binary patch literal 20130 zcmeIacT`i`_b-}=5>z1J2+~RHC@M{gv_w&`At)lft5HBhkzNu6MY@$D(nLW)K|~GG zB3-46^b!fuO9&+iq}>(I`Ig^rjC>--_QxpXqR7}!+Vp_ zvDwhMTSxv-Og$=d+6i|s`*gU&*U$q8EGD-`-?K~JhEWrd-snvD=z^2KZq|8O7nQ6KVg+~2oNC*Q)@^#Aa_q}z#c3ATb^Ofu(VI|lnHKiylIzz8 zyNW&f-dTO}zP!A$a@^6;ahXnU`2ONF|Bfo2%O0feQCSie5?l`K3_@?^3~I1TiJ!Wtz&F}NMSKoTL(Y+xK4e4K^uYNwS$6#N7+klxG#WmV^riP zpNVm<7vv2VqunkTX3goVP-%%Bz5%S2rfBvBO#dEkt>I#_diGoR(+D=kk-f8N?GqX6G+Q*y-w z?7tq|^5F##y46rS)lhO_UvypjXe2Rw@vk1rg5j|B;)J7qkrF*@`Fb%U2N!Ff%sW3@ z#!jX*_=IT`>Tt5gaqb?9QgU($Bh_6J_~CwNHaqN*yr<=0l=T>l4?bYHU>kI2)?l|Sx6{taD?tgkon`3a>Sc14PHg=C~TxOA8N)2(Mq6$E{k6)H5`~GL3NM{e5B< z=tKzSv=m}GP1k>(d0Q+`N8yZ|*xK5f-czVf3Upf(bmSK~LtZOmsbDmx`WT;|T}8pn zZPeGgs7E9dlP#i2O7M0D@|dOE&E$%ZnpEfz3x4l3H<;2VVnH?Tu3qj{e5>RB=!=f4 z^K6@2I@D}pmJp*Z{cgUEIglY^iPrQZ$&_;XGmRlx68+8?zD+$Nk*j zizUq=SxW`5M&pRCh|BODFN4tU;M1`Y$G-Nh?^38SyA0WDF*kbcmyFOB1LF?{cgnCQ zF5wlRgsEikE=u&ChL6_=TmY}MMm)PwJ&e^T?{D|omRLBh0S7XreBF~7w@9DuGiRKM z^quLh_iB_+W=%+^ggul&+=+@(;`-;{HO&QTK7YnM5U7ctV7m>eZ%RmIBs?GnE>j!} zSJ(K8h$lz6VP!4}Z?={^EQh}5pkKsZB$cD2sl zSX7+j%i{h}`SOIL^|uvdWf0RLfaz<1>2@+1ZGigawYBEmEjQ)2W; zG5@ay*$=o;M^6vn^V7EYj1C)aSs)qrwDQwa*uh>-T;>z9MO5g+e5ZI}c>Cn! zxiIu@U%_>dcDKE7p(ur*tAjT?O-2Q3_~PWUSJnMkOA~F0KxAF|u|JnGc_CfU5&oYc zBI(zI(=w%7k2WaV?km)=plf!9BFN2iQV1t+fttjy<(!zP-G|n&>W5KhFWa-#;%!Uv_+wY25nAQ=w3lWWgki-3Ry+CB3;xa{kZIYL*$b(f{VZZWA_c>jRc#v8nad5b&p|< z8ikVg0@1mF7%6<^G~-iw@NECaT}9@sXLrVm&|KQ%p}YremR(rqg)_oH$ghNj@GF*h z3)QWMrp+_gE}Wk41aKf5G=94+bl%4T7RmqPORgdkwUQ3lUgT6ATHbH^TE7s7Y+NH$6CzYCZ5I=0-JiIi*sKMH}DUbEkj zV|)_z)WR4;)QtPk?BQCmeEXiCDS_0KwOUCCL=*xz>ap`_c@B$oFZ`6di}4D)`r;cK z3xCMu%uJIU9C*i!!Is+92|&@#^GNy(Do#HnyIHJE*CvdC8c6}crKwjCsb8cJuxL)&C?o@iIxt5yBq??9tSLb-IG&PR5U`YT>gGK ztsGwfQ&%`^M%VF$Mar}hEN~DN6vkdYRIHxDGXO@$mkXbhkY)DLXnsLqOk$BE($e17 zBIMHQ;-qb<%0U^h)7^rRM#zSHzFUv_`}?!&A2>G20i~UA2M%*1989N>;o)qwzXgIz!k%+$J{PSHCh0jblm-`^

APng|sw66#Xk*B=ffC5I!_` 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 Qd{8}k{Oqy9qfWQ}2e^O$VgLXD literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/2_newForm_wizard1.png b/Documentation/E/Tutorials/BasicForm/Images/2_newForm_wizard1.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2fd452f1f5aca94ce2487d8ba45d4b0ec8ddec GIT binary patch literal 25453 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

&>UTK?RM-C`JsjQm~?6Jcif2`z3+ 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 b-4SRB4sGZBPCe#?!#8BFkDqrHJv9A4#@2#d literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/2_newForm_wizard2.png b/Documentation/E/Tutorials/BasicForm/Images/2_newForm_wizard2.png new file mode 100644 index 0000000000000000000000000000000000000000..ec677651cda57ef084cd47bea52ca0c14e9ad13e GIT binary patch literal 25161 zcmeFZcU03|_a_=a2m%5sRS;qYqzVd12~qU1fPkWaQUa);(xlfUAWcNTMwg}nB0@lV zOXx@wq<4fMy@eJa?VkAfyubII`D5;^b??lqbuViH-z4AfIs5Fh_h;9WFay2I`#279 zKp>EPSFc>W34!e4g+Q3e>}=qji^?A15C{x%_2T(kUhfu1O<$OiP!ikMx^764p7Ld7 zTr^a?T*%)1_R@`$gYBl>H!m6%N``H8zSX_ScjEQyD>o|LROGMc54*_cIo)AZXSp|H zm0wZK7P$B69`eUQsJvqM{a2%AHvUW+`NxI_y*v-JH4=}Xe+uK&qHLvAlxOQDm2aIx z>G5kJf3hT+$GU$0O#Vb4r=`%dz98}Nmc;<5m}Jq!gcSsGZAvL+M|Xk@QFwOhlHeYW zJrKy(j|j-OQ0DUi5Qu^SA3J2n0451m#`c_<2`0|5hm{#pjkp1WOlb$CA|MbUNsc}K zev-W4MhMHL0LV)o)~C!&5X)5X%vu`400x0@@v$-^;C$?0aQ}e!2$SSjuU-v&eV}7M zj??s59ufB4S`5?l-KrlLFtHylmMyj)JaFvTvEUVnytRKlG}|7sPsDoWds4pBIBuZ8 zR{uq0WaI4Y!^NQ@X^*8L{tq8MoK{vAsPJ5gM3J`|z9*^Q>(00yyrPol!WhG6b0>Ck zt?ifB-1>yI`5=!`*rsl_o`OY zDLSzShueR;OCN-!p5bFp8qTxQX3)DlT5+#G*ZgoSw8&#+>@Z{9`$UxaXg>aaQoPr0 z!oHYN;|FN7@(r;iBZ3P?n2hBGr$wRX>K$~m5pUXz^;&gD(^No8)WHs}hBS$l1+*#W zrJA{JrPHoHg%b-q0_@GyD_o@_TNCTVu3z!0nh9w7kM6JoRvT_@Z89VHxqi5~ym>Ar zxdZQZuIh!!@&XftBMmXz_U+rZ$sx8XK4|kGJDId%e6-r%5XNT$^Ya*`I?pzfC)dVO zq8L=Pq0$e$fueEC@WlRcaaUwkVIlPga^A0^_q>lwb>dA}4?P{%fEuP&%%RW3AI>wd z@1fB*$We`R4cPYBefyMzLewSMhnAdNjI=k)1W1q2!|gVg&!EJa{LLhJhfFIx9Bh7_ zcL>X~?GVdUs)hh63}E&a7|c5_n}_*lKDm24p#t(8H*JT&TAK=QDVaEmrpoVoFTytJ zUee#jC1i03)=#bQ@X+q2UJ=oif6M&gQToN97s0{Uq6DT+8xKUCZb%{Zj^E-8A-$E8 z+*`9{ijRUI#CFpV1697BFQTFZi>XV)B~4(fOa+)3J7k!t*Dy78e*}k8|DLQV0_7Hc zxD%J3pD!dLB2A&PuKh3!cmf2b0sqOO!XqaeJG#JHJH1KD6oB6LOs1EGG!>T9M~qK7 zqc;TA#zV`Q7AXmPbTZj{(3NMb!sy?ZD3@K6-gm=A*1jsp?BH&8m&kR{4gR z(9494wmG5ehtH@CN6Fc6eUyDakQbuuq{J&A_}IP}%ef$VMrLE+MnLB@Y7a!wc#GM} z&(AL(A!#j83y8eu=2rM%@9Jc@yz*PQ%m~&-}v|ny5#?b3-A zg!X*Mw4L10>AjHlhB{k}cvz(0YQmD%-F2)?T(cd3*P78Z^8^6HX9p$pWCYk5Yy{ZE zKTKn2M7p5q&QL$DuMn}#`1eC5Xv^-1eT3lSu~3FgWPP|t{I>dJy~d|6aNDu?1Hyld zBgnMG@$9>V&bfZ0uZT~w(3YF9cjDCG-2O8UOSo$V;T50PQCAY@@!Nu10(LMio~G5A z%l8T$W&P{l`*U`@QGTXB9woyWG{KFnRXCJ+5Nk(!8zzvc)ia9E;QKV3xnX#Ch_Us3 zEoLx)lsV{Xzxi9>!l9uU|DZL70gKD5waJ>k)~zwJvRl7i390*>ii`wY9OBG(_c959 zoH&~oE}0R{yddTUQ^uN$m;wyU1iun}xe*;$^NRPG3YBXONPAP*$E3#2#h%by0RvGn z$FD|+BCdz-{2`6f>}R+mO}_}fEEg9RWDh6V;X3N-IPD~QMl(0xhcuJrakzSTZx!-7 zw)W>WF38K0uYBxyN-KWEK)`LjK@i#YAf?!0xbH`_papv8R|acst2};Wi+Jzey?lV% z)8w^pCZd`}1_EcQs!EtAUgdu{yYhg5D#5++KYfh^C@KUb3ZC7{!d?Sgem363}OF8>h)OE#Z)?2q&6H969G}#lZIR-e221$03M2 zZ_^Q8KLemXr}i_rG}3nofQ_B^X0S&AFHra1ANPg@+3Q{vv(-)_*L_d%7B_P4E73e~ z?{YRWaol3`ML;g+p3JjPoJ3}s({|}9V4u~+{1mqA2YB%s$^splWc$TCcsQ=oVR({0 zP6P}}5A7EA@$Q!3DMVgzUY3p?pbp5N)hPDZ7rYduJjM-qf|b?@P|z4bg}t=(R?yH8 z1;990iWn$!we?%Afu7dXJlx&g?YueP8`-D-X$X(Oc#=ytgWq=VJwSQ{WC@Rzw|7`G zVP$rEkSciN3ylusEhz<+hem1OU2R3x+$1dq@LJr5)y^PcfXWI%n`Q&GP_fha z81WE$Q{-VgNnX8VjlmlM2BUvbs@bw1WPZ~ z5b?o7rs7%N-xHcT4i%moP3!Hq^dCJKF6n4qq1-6I5hU+4tc(;BRn0rYVnwB> zv6~t{WUF0$GGlyic2_aN+*`)uBX_O%^Bl6BoNF1zPNQeddku%-04`eRMPbe$z1(lB ztw8(AR+`@E!v{Cc1TjoPxI9kCwj((rK0dzGXY=tpHTP2|B_!^-xF~*qckZAQp6b!o z-rg`+U`qh{YJV5DI98>e?6=k|Kz{9#9{4t%b)T{B!y96^dXd3LyibJec8f;hRxfnl zfx34X`tq}}GL!Ort@i~1I1y172V(aHDK5V_TH!TRyRPop$oNfWxN;o1jIG?Ue%@;+ ztc=BL74V>Ns-L)jia;l#mQ;nHo*I1{<5#`MwW5JL`S86xYb^`VCJDWFvk&(LRq9)r zRQb3s4wuLmX_UIn-JFjWlrt~qd-LYaX(grZC&R#EKMu(ATp1exzSqQx=F6M_Io`+E z+SSE69{KMVK2;p33)y#CS@FPdUykXkY=s^*Vw*wJiCSQ(iH(tI_O{0WXANymXcV5^ z5+B(gl@8Y*BO%uYA_Lu1?7mXG9xl*&hQ)@;@oA}E_DwYd_|3Fh41~#lF**k^Q0!pZ z6fT)t55zatMYm$|LZ*f9Qc*~^U^$WwnT4`cJhSey759QATa+HE8vxKCCLERzu!^CI z4x{DUW;_KvF{Z!WFLQo&iDcoHEfH7_Vs^t$+MUkI<1mWEeAb>kJy&9^6V_yX+5G&E z#h!f-OWwCRh)?DSVtv>_BCx5AgeWbsC@q>7@M`+OFnaI4p)g|JQ?Ekqu(#WYyG?eb z>+CDwQFa)*wN2)}?_?=>L$|dRM>L@QwBDCJ#4E%N|IlN{b2XovQOu zkHvxgDbz(<5l0MwHEUq8oEHc3y>@=Z8sAU(yuf!0N)?nddp2C+MEbaOCS@r=Xpds|!LFy+Mv3#k;_(TpTROBpnlxe|G*hQKr zB$N!q$|ma3S(dax*W>!O;OPkFG$j#b`)9x~J-B)FR%;;etv;^yvrb(OFnG#r<>jS{ zTOGVDZ7Rmaqmm@mxqNDG)Y2#XhIJoF|4n5FdpYRCA`X)B$peN2SOqSrvF<|mG4VhW(@Em zBBEisJ@FoZ_}~@wJjH(nW+p(HmFr_T4GTwv_0=lIwkEgU;j;RIl$z5XXH%NX0{G}BJ3 zr;fcKZY~INJQWB=v@ET6l&yN1Sp7qgByWuC`1cq1a|ewrP>(0Z^&7H{bL+FQCv8sl ze7`lDhKQplFb7!kp)A21SLR!pC&0KpZOWg%pZSy$Z(yvrp~jNt_!rBUs1KK;l&jXh z{rGTMX;|;i(r_}o^ES{I_%hW_q}h6^n)F205ZSYW?E)cz1Go}CVJ{ze=b@{BxqwKf z&}4Y~wD_?W@!~(VHs_-o;@QFr*j{IfZ@6&OZ7232QnQ8*99dYir1}7B2{C}9?!wwS zl;gbDdmH1~j4dLFQ*+QNK6a__vlnszG1E82z96v(Kz2)}6KBwlFtbvaj@tJQ-G{2w zYOX!Ix_@Y-$@2C^H6`wgbu^2Mf9Z26*s&jBAZGCH4_i@Yu!WSWV{iOhAajw zm%a*6vF3mQc9umOZx0q>bW@9;9pq*5L6SumnZnF;?cqxvKM14~yPJ+sb)UbbL0PTK zw`osMb(y+igVhJbo%sfZLm;!pNwi2)b$?`m&2ckoE#VT?5tg1eSQ5!U0vOa={Li4V&xvJ?H=L?niEtO_&ggR^7i~4ZohEo^J^zg zMPJKhto5tirus5SHVrp9fq)wr%${y#H7a!%gv@|EeHofB!=kPJta*UP%{^jeetYv3 z6xYKN%#g$cTBI-dWKHrnoKsGCPliGwox)j39 zv};+h4DZ#<`H{7YN_TB}&d#rOOdo+QOc7w28A6h8|L}rsU%SPV^gFIUJ?QA3Wq6iyg zN?hD*`NdB$&_|a-8T0Rl;_mjc-3Ar{qH~uTSphbv+z{GzyfvgSo_#bop!0fI=Vy(F zq}_~6es+Uvm&CSj^6=?d0XD_p2_9cftTsQh_jVr!K~q0b`L097n*(X)-kpvj-Q7U0 z(vR}^W&ORnLds#%HjyB!fBlmh5CE`3A#w4Q$0AE;JRD8&nlER&4L0wQ>659OFu#TG z5pju$b_>f3WPbL}z<(Qsdbs3G>lr=$jt-+ZuoCcmF%|5|8QBvVnZxp91I@}H&!Hy8 zGd(?RJslBf9?O1-XC#&DIehg*&fTKVO9{}{QGmB^%`3*8B~G5S23f=K%!3T4n2}fk z0(V&6ZD2u)i$TlXYqwSmvu+vD_(B{xf*f^%-a{P?*e;20?>-QLK=NLzQ4f=VOymQj z%Gj+hVEk<96B{>Sq8eULoIPrQ)J@KDB`P~SKXy4%W(+&3wy!~e-AQb@{Gz1KPqqgJ zF)YZz5{52ieH;H^>Oh_d6^{f0Ed=D6A+#CS6DI-7oGIJH25BuuMls7U)2BS>{_R}W z3$K}()Rg|{&jUGLqnx`8>a&bJ09&2~LU|e!&f49TD^&Gjt&Jh7qNjD=Wx4xl6u-6X zgx(RJVi5f;lk#Ukd%2`N+8^b9KyC)LmP`llK1N z7vk8Iw9Y5=;I6a=)O^YZBJnq9QNIF>G`Y$VG*zA6%6z1iyk!Ra7{j46-RfUQv|qy8 z*~%OjOF@&n2uGZ}#f5;V2pSq1mTA&A7y1bR!OHLev`nsEqKTP@j88zV*=h?yJL==> zI*Pq@iy)s;ayqx)NtIy74-lH#FIfJXLj6p9_wI%3%y&lA;!6CkzQV|RacWhwKoBv{ zDVpV6_&U-YS5W;NbljZ0Q(h==Nd6N9Sn{AjG9DY9tG=Bl(=mSX^XyAW-N zPyO~GH7+)=>Xv`dI#Y@FF4wA|qke9{OO0PvG)4vogfZ_h+Si>;@P9TmtmG-jO78>;G9QH2K-99CZUA zNm73s%#VNDpWn9gc7TG4ieS?i?(6nXM;#D!x@G*$+pe!bGXV-J{UI&pHcZr)eC_gQ zk}(Wn`^PEVL! zvqy?bX}bf)-(^P7C%0t%mfGT_!=uX9THX++q&MlgzW=#7iQJ9GbNRB&)T$rER_wrS= z8pI4zMCGF1Hewe$mEJiI&va!KfmF#Ceq9Tuzj zOoblVggCQ0jlNG1x)Wco>V_sT*Y& zSNpM4M5&+@FG$^ue$}_SQlYuD5nMN-%YLO|;nXHdmy=dCLm>$CGFXU}MTI&`;4O$;@C zrBd^3A}y{p)LJ|JKy*8{erm*QL<1vBoI8mFtUO}&G`GnL-?%Uk3S@d(?6KkgVWZJb`eWK4i zZ!VMimdPJ(-Z=;zJ10DBnq2!tCHEct7HRC(vWO#btOq|`R$)9@RFz0bn;=h%s~4UU zqtvENuPltzl5dgYS`5DUJaJt_EnORN*c!6UoLoBAQU4)Z5FU8)5L>IK#N^^D+sPjd z4x@r~QSgJIdYKN=^p5rA`a#vTwyt~A;|to(yDg({$?|?4q?O1LU?n}~m%wKq@_l+c zyY6{b2^cT;!KbfPuI&h{+(_)U0M5i!dQvTflI^CV;w2o>7G}Ui1Q|8omkd09BNHSBi$>m z>sLa;M#L+|KgaA@r{ig7@xmWS#_zu_?|3=odIvmNr=)pVZyKyONQRa)H77QsK6$re zm3^;Af8qi}+lXj|_j_uJlFrIP5-J4?R+`cxWVZ^g1}La+`Yb-&-3_t6Pf84{K_{oo z*y~o|jv4WsCBsF-Mx9RLd9qVR4T+QanTc?ZhwIYLRTF0!)lLSu0a2XAA>txRJb2`} zl0yhYZCk?7hCRrRHEt9YIL{J;heMPb(?|y~r?CR;B#_PTG(#GMD>&%v=_qHDDc_WzQx_iCl9qPuR){#ZjGCnSwUoN#taxs~@%?h;mM3?8 z!nG62<5Z(jl+Czk&bg{I?*Ijqi|+`sOkNB&F_4mS&ZSrKnvmjlp^BPB^*bBzI-^psxX5Va%6EDZh4W zSv*2T5Sm;-oSvng#w6646`taqo_1`kzc|#hQ&x(;Z)jb7DHQANs1~VJ_Jka%awyr; z@Jn!6FtHx%| zwf0(ip@Z&DqY0s0Cw6T08@GV;C?CEfd2uKwpmP~@6`nh4mmE&wf%p8o9=c8@;2*{%;N4Eu){qh%Rw4#Y-@0Rlg!Ok6>{j&{H1>GiyUcZ#?}!fTgGI`FR`Hk(gC1;mnpWWIw&VJ5^1B_T}M@!d+atBI3 z_c8|$3a}R#IyI%qe{slvX-!!Fjw|v-NBE~j5s*=(@uMY+Q~Z=X##1z~_&Wg#A}ivb_aq$RchK{FcxndNTO<>s z(;`ol5p@GZbu)$W;n`|i_}F_Js39St1X_!Mz1AIHH2Mv*)mrp`S=PmLMbTko%HzsK zOK#R$$^(f+S=@lNf|;xsFf#2?-12P}rSc)-L!!ROimy*LpKYK<+@^d4$M2m(C5Ny4 z%20KwN?h><>#TP9XP-A8hzdd-+l}ye;ieR`I2^uo)^aT$WdLit-V~O@iT$wroXhn` zA;QbGpMs#&%n+MlpA$mQ&q@SEGK|kLI#z zS(WgPbgT;g{pAFEjv$FB6^kln$WMz-&=}HSn#F?XXRRHvuPpNQqMg>xCWQU>5PM2w z@+Ud0<`I&g-SsredVz9^_QC0-&A~HLyt$&05u8fA#bOmgCClF%DAv!h4Y{E!tq=AE zsd&hkDY_B@RDB(M&_9~y?3}kc59a%P+Bw9&jxFou=fBy8qyDPH3qYa zMlD5P)>b1`&yBX*El}6Z%$m|}hD|i3M0E=~$+o?VivJk`5kaU|ASv$po%1~RwoGorS0e!yArfyadu zu$F@E(?xkP2I=M|8YXoglhk;^3~Sh=1o{z z!-j~ufKK>{B2If|2v>2-?&boEWb7Zy-QF-VG8(7qdpz0O&Hc-vyFy=b?jDYUyWXFW zFOZ6wD`8H{5-_%kOL|_ygE}Ji#UgkDH{rDrf6Uoq(y<-)z?VOy!q_6*JbXcjtKlhp6EL`)XP>;q4j3oYdVTC3(Xq}p zg+6mmebZ5NxZ<4Hq1^9lCMK;D0~M#wCRWndID*Q`21|E$#|9`rYag5oHENi@oD$KW z`%y~}Qk{AOhS&>YAj>?!jr|`Mro*33kni&Cjh+~w8qFy2f!-whKdCdWyg3!?rd5hJ zWyVlY`(4Cb7N_$Q0!8L|U+m%@AdT<;jx4HwCip#Y1(^u1*`H+DWfc*p$g%MnDg;s* z%g_`MJSddf=sO}+F__~Xq7}Tx85yyC=SqF0bIrVDlQGs-uiDbui7lIxBw>iZ%O^$} z-rofTFV&DllomH;87HtHc1!Rk#Y_VO|MmC~aDfZj{><#3m=xKH)fCi+?;=KzKG)7R zYGR3k3wIo@;61o67Rw+q^S{EMe~X0v&%Nw%56GLSj*qKUI;f;%Uall;%WW^|XURrQ z{SzVq)z9rdc-q;=xS!>{g*cS-{!h47CCFZZ6N`013yF_aiXz8*8wfG#r9Sh$rLUFi zCR(zIw?-X|CwntLlaSl=BzS+DZsj=(3hcG7@t<%gnKQ^dQ$hebysx1;=9u$ty@~x5 z?~$)i;~b8F!r@^7cG+Z3j+=jn)ly_(cGJju-x6DEo9Vhzv`^MW0~liFPo(&ug00rt z+o0&yQAu8*J(r`z9Lf!5|ISK}X>C^^6HVO6%a=h&>J0vQ3$Tk=FK!f-dicmFpLq+_ zIZ+Emjwh@iVwdG$v4g$LFFbIh^CyY<|KyvWzXBk$xgaj{7P=(GD|8Xi(4MYgf(OZ5;HDmnWlq~V#l^AbTg>mg_k~D1 z*c82#?J)LH-jfuY1<}fLj{Ejp)A@b#k#1(Ix`F0WkIaI2sQa>6_?vqo9O7~3wHRG` zkW1eR5sc~(xO|?9@P~i+-*n}w&&Td*Lm1UjAw(;^IZcZQD@P4chb}InQHsf0uE%g& z%Wh`Lax?^Jy(B%&1x6*AY?k(1tn|Dvms`M-8OKT#`V@}hbL~-Q+rk@Sbcs{LrAxpA zo4OVNLD?8^24yXjOs2mv=Yw7yk9&?qCQDILhq4L2%8iW?oLhb$R;hD?cH|g~rbd)= zs%84X*TzwYHb!RPQ?4ruOi$B5rp%)LAJIrRKSv6@325kpH?! zzAvG1z-Qa~Bo>1&aMz9sRC@YoGn?0 z6h>QUl_3m~BK($lVw$XCjR}2F4QfgC^&9rOx*d&0b|q?Z`*FKt_8nwnmBVre4J0$C7?bZcI&s7_ntpb@DLCio-X>B zQv32|^~cI$APx~>*0C2F2&o`Z}Sl29t;>$kCO(GZHs&?^8^^VRNc2^VlUojjg^&IrW?k`zLK<( zyT>FF<)lw4jB3v$IK3Ff?%U!DV(TqBIAms3!v)%RYht_uR(s#b7y5P8asy#-dLl+VaLPg463v(wbs zpYX$=l(0r!{)(7&ON2n&B)XX=<^rQKziV6(U@xNM)O}TOZrfSFXZ$@&yy_b_kgYy5 zf(>O(>pq|SK0tKTjAMU$c|?{^Eo4=acLc&^Ly4!wJx_kiNn z{v|kJ_^zhhIl{!Ym;D|5iN>gscqXP+1;EY@ z`}PquODzx%^XPTizfJbb7B%mYcvXsh0o4HZGU~h} zucQ9xbL@s6N8PBL+%HvO`o=XP^e*tQ_QdnCU+$>vxgB7TE6l!r2~k%Y-s_UuE5+3z zmRmt55@nZ2EHRH@96=SHgiRG6vy0A-a?>`plf8NzL53=X3wyZ>L7zGMwX-Z%j*fDX z$=+H1V3REI-L0zSBgdrgD{urwP3|^`c3L*#p=On%cqMjT@3FQv5aR+N0g#Sb*j$g;n`Ad3q294n9S`!8PJ>l zyp1C$lLwCblC4mw<$T&=d)Mn~Zf$4t(B1{YV4YN^#z)PRY=xI;05ajv6OEl3Ik7W0 zV7iU@JUCEX6<}n;Y*=fr{jT3ATw$$Ust|AJ4F@>a$Xd%evr^xFK-3bn!@mR$WCz#X zfG6Z-6~d@zhNAR-3ssCn#QELw4{p=DK2`pUMNKi^oq6; zs1Lv-K>wOj;2oGu9PZ$_s=Bamh1tr_R;RHSp!d)lu)_N$17v5Jt!jFv-24b5w?rw8 z_q!)8S5z`4SIbPD9d9}_7zScZ)U<^p@4RkDJ=D;1!7Nd(2F(Pi*8Gd{L9#S&%XHv9 zVnf96IKz zvZi$1etqtq^XW~L&a&xdQL&d_ILV$;U0hDWZ&5${%7%5ELeXRLoepEh=CpV+c|NvH zKl0?z4(&*y4ILOiSVgP!SarRD!VjT4(&4$yXwU8SA4C!qa{nUW;a>rHPZPM4mHT-3 zzH9WWN;(P!$&Ms%ZF@w`Ra2^uv^pHmEXVT`pkwn-5b*;Z^5pJilq0!+y2QG2c?I(q*!Vx9j zuVdf+nibKh&31RTidz&}(%!7(zuU@*O$qJdXKxjHXiL=mZ->#`cO`+cNee8QbnC9U zkl5swhm5d;$+(KN_aUytKi9+~EJ%U4-0@6{j7E7%Z^^F>8u!*Y`dQu>Ls%t0!F}ak zc#UldIi_YN$&a?P(ksdlq=%O%-|@aa{8t4@ZPPcmm(Zo}G&?`@p&hR;{;+6O0^+9k z51&BdXxza$I!J&eHOAQJ$~C=E_^Mf=FuSHbfuWF7J#%jzqVPlHRBSd$%Hd~h@gzD^ ziM4!JSG|fuyP&_~h4f*!)s?B++zA3FN0&`crg&1_D1ZtLP!7XMs8PJH5B@bwDsLv4 zWjCE&^eoW=M|mJd4FB^5C>(nN?UJ)?dcLL!t%fn&H4s~8#(1OE-P%c_kieV=0eRq* z4WtDe@Bu*wa0OhBOwqf!}W4U&zl7oUyM$ z&Sf4vgTme4+qpa*M*8BM@z>jeqS zRm`%FSyEznnNI8>==8q8sp*chS_&4WRn1&Mxyecn_{g!xGO7viaf(0wuIer5vO8U` zayn$~y$v1jmW4*n(~`iU5u~ZiUICk@J@krpTSgE%8~0Tcu>}Doc z+dY)n?gIRP+YY(*pmM0|sJWZ&)wtD7r4j+?4zj$*IwEkYIB{7gynlH4oZ7i|Z6Lgz zN`Dx)Ce7P5zMg*Gvn7kefiuXXW6%MdQrU?dOGrsu9oa1PS@*FYK}(IrRq!LP$%^|( z@e1HF05Ot>{|umL%96HZAD~=9I>VCIYW-n}E2xlK$scMb@Pg8nUgky6Eiy2146tMa zJ8=gTq#0JSWHDR8t=yt!tNVuc@=d?2X5`31AL5~laD7b2pgYJvuiv)4+M}WGBKwrP zHGIqN_rbfCzs<@^d@<{Vc7NP5HJiKAlnebi7i6THAN*#^Bc7Tg55XFEyx} z3>3JzO%jAO0Jn=ZkYQ^wx{v<+5Cxxa9tc|qe@^2;-Dr%&sUweSIL9%$j0++o974zC zC}d857fBx&8}$l!r9Q8u*ogjE{_j+P;6cvEJB@zGPUk!VGz9WW*YHlu3=@!*zc-6Bi%fe9<95 z!Fxd);*aaTI@sC#1vCoT87Kp+1m_x$Wd+xO24_Rm_C%=p@TR`Jd_t)=6q1TPD=m-^ zz4zLlhYXuwdH??X8($SZ9j1(zxn`!%&CL~ii1}iE6lH;iv~-WEc#&>rYNMO(ts+Uj zA%0L$8%mV{RSTD*Up3#pT`_;u`9-J{MfT|M5UVPkov*(R@uw+zOXup1J-54EbV>V- z;*p$-3I~}E0l}<)&3NXUwew3EPRG&m+cTigS96d!Ul9&3g|k9BFFV#l`FEKcA;65Q>CsTIqJ8P--G5>TjS;2JguisJUzbgI_ik}0)&iF|+ZDY4 z=-r}4hxr)KnB&xhW3ks8f7$8$s*PSyiD?N6zO%RY=#g_GHCbGpU{g-?e9<)Qh}xM0XSc=y0R?~dWs_5(uNJ1)jm7M13`Hxy2N1^N?H z-wZ+*`f{Xy&l5O33GI)$76ex9uoiQNy))?d9cw_^ATO&(WB5a{@KUi@tX^MIi-E6q zQ(+PBbFpvd_k($um-NgTsevg%l8$)2Z!ESkUAlik|G`5=&Km3IBdy?;JUv@+MxFVq z=R{R2aXDSunHXrtS-_id$mWP@1k*Iw7t168cF>S5`-d7zMeJl!_<8~F7{1F-797I` z2IEN%N6^q96qsWF#U$UENs3Gm3EPts{3OTc659f-`Y0u%GLX> zRQ0u8U0bx(T)+wFz@bxvW!+&H=qvZq(PU2cy&L<0sV4(wV%F1aiBcN zE;?|?QQtSYagcjShYgf3ZkZmPx-Di#1-)hWfg5>Fy6(2nA+~u=r2}1tNZ1)TvVAEl zSo`j|m)k?)v^ox?Ff&B*!%(-tV}09iKI%oRwNPPy8_Q8FsFIoyYwGHAj`4<2eI@Y`U`rt-^wq7hTwM~c?O<-$8QdkNv?hAGJn4H zJjIiyOjA6k11my2#BgYjqUayrtT97`+?vnwytX@fzYJi{ec&`O*0)_?a%z7JN5DM4 zz&w84UN94^#qvkHLVn(3AID^pAV!I9)omlF^jmh1as=tWW+@5@Xv!oKb6X~F&9>x55xS>b z-F8>X+gCoz%N?D3!x=qLRCvsxI8n%~SojHgmzbMA16t_1RueoMn#7GW{p6Qisf4>+ z4}JY2W5~DHaUVxBslKJ9(YvIt%T#+JTm_Y+LmEGeKPHUdG9nM}*uGvMnS}R`JfTO) z_f*A9eeuu0X3nHwr^v=t`cQ1i)~1Z#Qf+WLb$FAQ31XG)s*^{%=>O1sfg|V&SK)!c z*ZK#P_~z-FTCh7lv$^F=H-{jOQYrPpUl%h%XOJBs0`xBK#vNDdFm>8zf#%<0$`}Pw6;_tnDeu{UVEu;wPr1tEy zcu+f!Bs?O@Qg4N+m1#dbsf++{_YEze5X|r4$~sqtx5%`urIe;*Z{c zDP>NZmQNeyKJ_`UMPDn@yaFDnFGz1mR91al%oBFrQa-SxI57V0BccN|yO~^K@&h+B zGYc4z?9$czv$C7{2-W)#?JlkhTQ%JAv6oyhvXT#StIF8S{uFE^XOJ8^gOB~FOB9G^ z{$46*cnT~t7nE}YNAA>QDFm=kS~>{`OX;e!dv&*q#B}CEWNGKb&P>&J#1&!t&5izL zBl+~$nTG{P&PBfHZD7xyZHWGZ-^GY$ z2@8#$i+c=K9jHqj2hR_}n&Mh;qjd zNBqsP(4FCf!;jX)`Xs1d(StbwFE{P<$H#NwZ_)*$sU(w=Ane6vHl<*b`w%7;0jtfy z+yWDP`{x4xXwaPr*4jzS^tx;X8Tf4%-kyfDvx&5ZigpjJt6%Kt&WTLslQak0yFIvK zW#g+RK8H0mE@x8{@YblB>2k~1Q)TK$KM`W4|!B^%3sPgo8 zcXt@i(`46MPIBzoUv?QJ#OxV9h4fw6+v6#Hy6rJzlbZI2SE8Oha|1<)-?prR#1Uli z{ZZ_$7msNZ`Pk8;qyNa>auxIWix)3`H2b3`N~}+xJ$rT~|Nkp53qWU{7JXd{`d^mE zhVB1E78FFw@ZzWy7=C?v3;kfUI!J(}Z>-Qp@qv-lVGP-c;5$yXploDn-3ARZzvbZ$ z%$|&;-`5Sx({UiQVK{Q8&CF@DNDijdByrkmXlK4S zHf=Oh(bSqrhn(=HH$N(JlJxp}-PSG3p{ z?%c8@fgfyLryNIbN+bzDF$YsNDi6={T;lm_P7Cz&@cednAg!A!#H)44W%@~Y80N*g zC+%nx^MnL3dmQUM=0r#N-5s^*CyzH1ro%(@G4BzUdHk9}>2we?ffDOW;PA*8wm$s{ z?$^rNIr1qf+F<>cK87U0NlFoK!>myYhljS?F)tq8zD1eV>Z58H>G+r5;gS`@(8%ji zSv04K74@l)vo(^`%K?yIpt=m!V!89Z|Tu9(&=#T6D0>22d_5rMAH;KwIq zf{Zd102OlW=uh5bHpBLt;CmDTbN_R4n0PqLQX%t^({aex7BDwuOQ(FHNkxtzb3D1A zCuJs5KgS<#_@A@o>1G8ZtoJvRGx-prxfnzxa7~-Ot6g2fN9o&@3_oVOu*Mfsj`1vi zHmRY+E9CayZa}n&$woTCEIee8eIpQ;OD;==#D6NuTrPicRGGsqTBTd&2O-s5ldT` z620+3ynzS38o1r9MK$~*pT)0PYccD1nzwxtRqMmr7@ZqvN1Zs0S8Xd$oB~5r2;xmh z`X*AEH+2u-IYXHM>RtSJ`j5Anf#BW0f4>yS*8Fxp|3CS%`J@(gPM<(RuaG9y$9KMK zE|D;F5<#B6CT}?Yfxe6(<0s>#>4q8}Tf^YX$?EaXF*H1-`76#7aP;qZ1bFPPucPTC zjMnd6!q7VCJIPxFak?sc#uF{EsX26xh_&v(?5I1hreK^b7s*((e6a;(C3dq4sKjqO z28`PNSN3a3D}I@)HNJQJX4J>8qN2pq$xF3RinrI|V#$AZ^Ly}(V;hJ56}ObO#!HeMQ%x2I2`>r)qjtjc8!&&9B!fk4A75S^ z5msLq2?H%q&a3^HLv)~FG&ywo#6lQ$bMp5aH2gMwxWaQxb!9Pd~YApB-+h%8hVHEnW*ga?C{J^HaVMOaCWUFpr7H z*%*!mVNF+6?VCMZ9Y;3LRcD$E#_X#jCx#;1ULsLauxe)sSoOQT?BCDLjMy)CGEMAw zsH1k>hS6}^0ybH;FxVEmCrBmj=dXpnp@kIIJxoj)2Y4;N@7Xi+&ec)bv($g}v!aeR>2!7z}!|uy>{9^BBS>IbSKZ3(6CjGNNV5Ecc(WO0{tNp0sltm4qK2Gd|rW= zD6@Q!*Q2V{QU+E(UO*y-zGg}z=>_h!vg)d$oTOPC5nyM3V$II3V9Wf}_4_%M#KdtD zB5qYLpsb3;s%7PdB<#i5)zw`RYAk@4O6;%lqgHsrs`sAwuf1|~)C#t$6<^vghx^Mp-}61+=Q(H2<8#Y%ilom%XBWa4&PA@pnBsgGJ}31zy!D9u zCEiFw(etmN=o3B<1HZp7EOn#xhsXBe-OlGLaRR}E(eRZ}#t~e+7?)mcXL|3UmK>T3 zOc%qO*a5Xlzuy4}QlpN+=f82qvRq!OAnuT1O}7vF>?D&&_k3PT8p~ra+{7f(?T=p? z>M$C?$cYz(~c;}Z%69dCee%=(30m<&qEjanJf?E61wDDUF&WUnw@M)&fB zLD|~eT;()~TiMc|0lmu7#>96yG92|56>jP1?-*14U1}d>S=goc!YSNhC3j;SPsUg! zg;IS0?K(VF^Tm&j#aqD^gOX)=THoQkSh#G;w|t{2`s>P^IT&B+u*5x;X5$UkxmW)= z9f}V*CvSCV2c@C^Wvt%GQ!K{ohYpQkoUFE-N8WVW$jAtZv{UxNoV}Bysr%D2Gc!q~ z_E%r{wdR)g{{8#O=s2JsLWTb?D}sDrFZYs3Ey_H@E3jLy%8=C;iuZp1P?Kj#JeiX6 zXe+}zTyi~)XYL`RC@7`zV%Xgy)}p573)~>X;FWm-ui)pEMj1j401xd7@Ui+65e=$a zMBMHLIB3Yu%>32_Cmf~@X$nu44`l8I7b-%C%!bq(y{ziQaHqotS8i?a^4a#&zp4^= zE7tzF4V3Cgp3Hwf2pxxgXk$^ih+rEU($?I3U}2T5S9Q)?r+@#5=Wc`8SYzp0dV}zn zBk?J)KAb<3la}^P;evscEffl89@CR~=5XEE?>OCEkbD%|CR){~0(01xTGi^|uMpX{zmwhUpP(> z?(<6m7{tvR<*iLkccJ?=PU5?_T>e?GRjG((X8&ot=GxZ+6`% z581nSFM{+WN_5lQRqG|-Flthf`%mg00eoCgX3#|zn;Z&>!&eTSR zhd;P6j_nJ`%F1dfFE4M^>2!PdAV|%74nc!X7k)PA-=*?de>#zlN~)tGNUv&d7}RW` zPzv4#i|19AVRNI}yyaO_V`n;i%J&kZ2*eGs)tn$+nI9KKn|n%%;?1B63E})DFl;r~_-69K>TPa%a`k2u z^@yR}Nr)tULYTna&ZkqU{N7|Jl4r9xh!-W=q z8}JW~1b<{wo^svPKLK|eOH+r13HZ=eaV_{ju7`o?YbN93MW-?eH`L=_!NcE^{l#6H z67m9K192i$g|;C*OXsA+yZ;;uYqOqQASIDJ4^A6CysPwsvY4|Ud$^_MQ7F5w;Ki+j zbYBF~Shmum$ecG&bklEtP}W`tyZqp0Zx8V9oT1U;`&Qe1NXY(V8!HuqrBi%7j$a-M zZh}aQv9aF8jzLjh3x4DM4lgqD&ZiE=RtXK5?-qL@2;v7UZ+a8xKhZo{aZ@P@M+F`r z{>*8pEL$gAH^_Q~tmne|;IKYguFng<{)v(sPy}~r&>7+%0qgVr|HBH$F11OT=0Az? Rwt%+CTW`ij)kUTj{|8YXGCKeO literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/3_createElement_1.png b/Documentation/E/Tutorials/BasicForm/Images/3_createElement_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d7188503c0a225ead2a1c979edc067c13a170d0a GIT binary patch literal 32977 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/3_createElement_2.png b/Documentation/E/Tutorials/BasicForm/Images/3_createElement_2.png new file mode 100644 index 0000000000000000000000000000000000000000..962c22867145ea7abf70265df5244b5d45a5caa1 GIT binary patch literal 43233 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/3_createElement_3.png b/Documentation/E/Tutorials/BasicForm/Images/3_createElement_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f96b7387f902bad915f77dd104e198180c99e09f GIT binary patch literal 92086 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 SyQie!&(_+(D%W!F$$tZ*+qiZB literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/3_newForm_wizard3.png b/Documentation/E/Tutorials/BasicForm/Images/3_newForm_wizard3.png new file mode 100644 index 0000000000000000000000000000000000000000..5adbca7394f57444576a0bb751bbeb8b5f3dbebd GIT binary patch literal 31883 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ℜv-I(`l%_^xw=4!sn-RJ!xbDAQB**+hDAn1 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/4_lastName.png b/Documentation/E/Tutorials/BasicForm/Images/4_lastName.png new file mode 100644 index 0000000000000000000000000000000000000000..38933b0020c737009788fb0cf3d39adcfc6842d7 GIT binary patch literal 77163 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

k?+}D1yK%n-+JvtnLM0?OU@NNqQ?AN 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 U;fstf67X-Yh0QL?PWPz)0a`4xX#fBK literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/6_textarea_1.png b/Documentation/E/Tutorials/BasicForm/Images/6_textarea_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5375a5ded677aaeec98f93d6770ed619aa7646cd GIT binary patch literal 87545 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 Gwf_eM%XA+A literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/6_textarea_2.png b/Documentation/E/Tutorials/BasicForm/Images/6_textarea_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b52821c7e91e1ed76e31eca79156766e655a124 GIT binary patch literal 80251 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

87EehC&hn)Dccjjo%Ct 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 IXwT>x+S2S(@%aWqqSJee7{$ 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 D&-d9v literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_2.png b/Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b513cbfdc513bc7606b4b5d47cfadd8ab540a3 GIT binary patch literal 89549 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 E0kmD~TmS$7 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_3.png b/Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2b505e58cc795e3cfb41b015ac6a49da5adf8196 GIT binary patch literal 17772 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_4.png b/Documentation/E/Tutorials/BasicForm/Images/7_addFinisherEmail_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0eca21dfb8d14964c6757bde5d406fc9d51d4c66 GIT binary patch literal 76547 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%0A|kQ96?4R7&8RLgTn zQ;d+79gg$FNBy@?QmO`Q2hC_X6nMYd$aAyzrbpZ7DeI`@eWa7{cAt^Lgz2%_Rj?5> z;~MFt4HW}sCs(t&y8P6+An?2_v+0P1w81kbS6&Qiii0$apPX&=#v=?s777!rHowJV z8~a3e=yt>~2y&ZsBrY_ z%{aJ{VW>Ptxa*@^lp^k>l&zLL9zdZM$ciNlxIATx5fvOZeQcl@kXI$Zd+f6{t9>=w zbWH3PDTJVWZ^BZ3UT;>N*9P~FuSS4<>bpD*9}_nF+mc!ZpY|vpaJ@rXw z-oyQ#fk^VWO$~vaflScqjMQ6RBp`%mmdxKSr@gzsyTxbyjSwL)Ie^ z{wJJ`3!yX~JfMSr>NFmq3A+UW8{3?n0#6f_z=v3vk1<2Fa1>(c>9lUPKj#v$J?Wca z23xSVVEUnPBC?5$=_kOrRub^LiQNq5R}OfIJ+; z|7AyE$M3IKHiR8p1-IHz0zE0bhGzJ+?4KiJ4^Qn|68PQ1D@_Q2{qMz6ngn3lH0W+w ztQZlI!%Mv&~@&cqXS<4iy5=o5r6R0Ga$3-CL8fyRYg(` zi%$j0V^ObAL*;f+p^TCy$4{SQ0v}eROIZL1H-osJo!aR3ArDk?a{@L`+9g;n{y#%- zm^wl98BK#oP?;Kta}GD!tGDonf|T7WkZ_3udSMiQ#r&b`((sVOZ}5kRa~i4sAfMx1&4$LBy)n@=zb`Uc=|)2e`bi`h@tLqjMS z>uF1@|KpUuJQ_flu=m1Wx;6p)Zw8e=Hwe38V333W+H89u5Y6(28^-jyE~S7=)Ai~+ z%?2q!M`#Y$EvyGAG0f0PP<%_psoR7I^C8(?Tl}iLBnomZtIjm(%syX_oQLh+S%4mk zEF3_4(0WR@5Cp`rX5)i%Yh}m&KIuAxq8tnc-%V{B{KI=|n(Hx0ja z=;v=AryDBiQ^AvX>Xa^0*p3;R%Wx5;#kviX0YKgAUaO8k>blxkxPmYrY+q;NK3UIycuLCi zX<>=ws_sO(OJ76VgWz!(N9J`PS5S2;8r6G8EmdOZdpNUw=(mH($oGGNmQ^ZK@$di@ z!(G!eyM_jHou60XWR0D)cE5L+0%R6w@ivQN_wKwH4K2 zHNlv|ecnqlLmd^S4Zfw&0EeXCZ=3{7Yr_0<2MK!bIf^D)<5~fG^;)V&z@yAl`rS`o zalTgR{fgBugjDc#>a_Q|2z zYH4CUq<4L7g)vK~gPwb(EU*(}lUi~ZIHaz@T{C$Mx!HE1&Yu((men;wHj<_mgY~mc zdkjvJ-^+Cp4YzQ~yIfy+n!GV3W)z$aT zM}{EoCwK8Fo7`4bZ#^~IFcE$K@S92@Q9UHaSsq+=`e9$%>(vLoW`b{DL2(`sKd0RO z`@|c{VOSZqDL`7R05j8MXx$xl*$K2}i2ihh3CpF%fd8{?IN)F9nq_Jt2Q>(=BKC(7 z@=VV!`(uJTuM&d-;N#V2RNL_`R0&zM0%u_P8~29RGKZgFxs)DqiL-AN;VDT)yfs z7kG{Y``N%5sLAQdy?K|arHu?e>iuqUj4{GakZqNztYht$`>I1 zc-w3<{omZ{Uy|kUrU&t&1}nP8uA7}k()SHwX|BqY1f7!qsw-ysN{miOzq<<6Bn_An z=pzco@jqz_QW>OOM$}MBK+I5r7yyYkUsM8)Q#?XVw4OSG zI)_{eM8qzDnJ0Y6AcOO%5i5n3od#*lcy4w|Bv?ooAa#-fI02MHoJ5j3nk!}x=)tq7 ztH@Mx>pgY-PhP{S+j#nW{pKr)BfIk9&@X9y=J23XhDrfFkDxZtJhiglEy*GZck<C9gpZON3nXP8JGDnLp5-Rb2`-rQ`@M=x83C{v- zeLi={`$1Os#$Mw<$Eg{i)ff{!Uc-ZBTCMt`jV|5uY5(Xvm_upP&$fGPM}*f1#fmgc zUe%%vklKTtLg3E;i?TFcVk2riqS#SMl`uy9PzH+4W#n>T>__q1(#XgTJ$mp(wE_?F z?pKu3E`pzl3{{*o+RlXnJUX^={T65UQxL@pxMUOtUB7%m5)olE_f!sh=CfYv)~9uD zMAWq&qk24L4R)FRs`S>EV@wnVS_O($Q>vKE{)S7BD<0F1h3$5hW9al*B3+8x#sT{i zJbn>=JC%NiG(V!yFFJ+el!WKyKs4@`!JuXzp)N@MHf6SuArzD?1fNw4rL*EL@Qw=! zNlvv3Lf0muwG)Q=^7VM)Mei4S17N!@;RO<@I{U~QPStWI-pg`Jd!Y69keptC2I$Nw zRWA<93K0T`&Z7VUx(<4DQW|m3@(mgDf=3takGGNhIiMH)F+m!VS7DZjILqHiY%e9( zUOLGgCd~Ksa<%X%KPNhmH}*zj(Gozht)KQ^GVWbplho#&v!Qy$1P$HWR2jS|9F#d$ z52cu%!mGcga*7#lAghyA+*rcL8+*UT0WORK*;Q}SF>~3RV0GihY~|@kaV>48yQ9=> zH1>m{(`k=n{jQug;jjmj9ZqN;_G#;{`r`^oE0dOk!Oa}s7%+O{e#a7>5EtBOHlHZu zxDxwbj{?8n->MUE+{UcfrGl3~+Js31xngckrGA}4`k}Iem@mUFq&dbt#@tt zBSqbZ2*B#ZmdsdH^CMo*vTT!Y{g2jVt{;G7*+j$sT!ZD0 zsyi;-s=_fD`Di?RPG4R3eNyo?4b4eJBa;NviV*KLuMQtVzNyu{KZ0a6WTVVVcFv?~ zZ$Eot?S}pBx^CuXQ}H3PJg@Zr(r{aBwcenOKs%7O%qs6@$fK)ZN=CTefPIQVsik7n z2mG2xnSyO*e`}E1g3X^|^_+CT=96;N$;toi6mke_=#BlFc4pN5IBL{im~hAuqTP)-4w9F=Kkwk% zc;xegG>jRtPe>ZM_3EVH2&SIry1~$$%WI(`u99&Ev}aR<0_BChr@ZktYflToqo;P* zoSeg<`mnrWVk8b`#kK`4_^w#{Y51rg9O;}NnQ8c(RBy6qd9SWxL>`RW&MCam9s}P^ z6POPfbxL#Z+V!HJU7L`&Z?rDFwBJ?;m>d&Tru>9Fn{GW#0UPpc)Le$Fh%=2|#K(y< z{$X^&Eil~azWU;AX{J+0Zus)Jg9cJ=V@%tfTZuWHu;v;2N0G>BCXrYd-oSqn_a9w?Nn&8mKpk5!yl*GDzx-_C|Do>9<7)1@ z{&D5VDWwiVNt#Oosg!6qjxwb|r8$|J5NQyliKG&xC`l7dB%wlcE`(^12u)}%l{6~V z@4dryx$ftF?&o@5uix{>_b*51bM|KsYp=cbTJQBQAw5~$YFJ&|Hlu8Ds*lBPTG z-*G2zi4sEWA%&e^#e}G(cen=@wDd0V{(d`^vhCZqMvyC$!ivhH?NeIC+Q%g$z7xQDeAi*pfa1bR!(G-S3WO6SwYlG+d!wpW)Ws=$k z;*)cn+e#ygzFX^_Kg*|FRjZX%x6-~UvFhW7*F*EVtCCKOujN#34xJ~b6+WeHxj+-E zuuM62D&d4=H;x8(FfpHFeJjZrerLPnCT-X`67*8 z&=%{FKb$>kD5b@@>cceSl=)2rgtbEkXKMB}VMhq;GzjdBjdJU09zcdl?>u__1AX`OdKz^y-)2a?yko>ZJu4uUfRa$YfRtV6WwZVv?lr-TUf06^s#P z{Ru!cGt=ZwI;dec&#Z2iFAL4l)Nhn#l*Vrf1It)>l!O~Y+II@&Di}sy6+4t}Rn)Mi zc~5of*1+s24U3)c^%UJ5OYa|QN<`7mo&2n>xLwT?JHQ4TFnNtAGK#+@xsp9*&xLS+ zCBVOKc2?LOuZlNDlb%V=A@DtGlrMnoR`m2dSHih-edw_GhwIeA@U*+Z4IA~iJ>81~ zwvWd4yi!7ny~Z3Um$Nk5rKi=B7Qz9QE(T|R_?8I{^#rWDRQ^#nkkOqsvN=S|dpi-P zbPZ$mc#qE;fSunOcu1YXOOJ0C8Yo$G@H}D!<{-4J3cgFbXeM}lEO_F1(f8ArvEv#9 zg}}2G>o#dz_?0^cm$3Z3&yd7ku_peJh4J>IN#e%YoT{mhyo)CG4FNYTN@xl5hX=FT zomN~7dI7$TYc3h~#&P}kP>uGt-MJrMk*qV+RxpGuJ5u z+kCa-hhm$VEN^D~@O1kL{Dp%PG&wYjazj9mg0fnEXP2lKnyRUdwhQa7C#X%SZ6`(# z>L;u^^hraxGxh4`FuD7N7L#AU;i7qzxyt)n@2lYxT213l`c0KBZ78*}@2-oQ$?eVs zQN$k2NAN$XFk4%7t2;K~@-te)axYiF>+&uu@mds2uUs*_q zWXy*SQm$RQ`C9Sd{g3`(66^iU`pg-qj_B9AT9raPW+147$k?CZLKK8-$+pw;yX2+4GS&Wx zRfm1UtRUl}BbViEb*@!a*BzA9%3i%K1LTzJU^I&AUc7GiI?T(`XkOi9HMIt58A`Os zmeJwfl+Go#GWJ1KnLm0ZI*6S8^o&nq8p92?`#BE{x6s2dliy!he&r-xn|ax3z4}Fl z1gmw@l($#CIkl?FNmyxYprdJ)vHs}B{dZn86iHizn;o$K4pY(ceVW1WVh6a%-fb?64^Ys0=^8ag zcEI%y)o50D;Z5hXM4%{nshazjDi zz9kbT*=4}1MAnDQqrLx5F=)z@Ck?}tbYpbs&oA|84yYRIRv<%YBW-por1S+ z__@s{&e`rQ7mP1?+B7EzsT4@c*eh|eL_UdbX`dK&_15mz9ezHrByrFC+58dB>MqZg z?8pw%Q~mtZyZGGX2O$UH`<&N$PVJR6I>B|E{lx>V#;Re$)?MVU3{BtTj-^G7?= zw)mf?8k!@QR-4uR!6i+<`O+WR!PSKE?8Oh>Xgr#_6m-H0OP{rbbDe-U#bR!P*B?8F zsAX2`KcAt}_8#onABd2WR&u}(l5t+RJ>E-H4Zwt%hd^dlYLsnV`J7v(enwhB{Gk8= z_hwlGUF{s+_7th~<+E@9@J`Gpmqde_^h{z4kTRX{Ouv4;Bh2A7HQf*qB}i4Zfvy@||JjSp{!rNWMw(}pQ@LAGbA2B!<%vD)l-H*>$K59fT8(Ez>D}$+;46}t1jOD zxP8&V{EsqcdS6~W^&Ql^!y|FXP)?H6@f;!v;keIxaHoJj>6C@nw-zVhFi4%hf*Ryl z4Ev?2M*!YR>LhI|wSCL>dgEN5XsDh)!xMJWzAC3H2~RVDzTSNrQesoy(137~1Q4)| z1>V_h$LaH!?|$DNf2GJcWBXQrF~xvNgejD&F5c&vl9Ma6BOoD}K{Jbe_s7Xu1)b$^ zVJPN3kUrfAwin4|Co@DDq-3XZQ?Pt~kp8O%`#;IMY=#1;eCJnbd{O+-bCw5C@ zb4rmzM9GHe{yGk(MOZ(Fr*l>?1ei$&ktX)E^n#Q%(&1_AAEh4^ue`oZs^fij8f=uM zy$N%y%JF=rHWgF`69b6O+(&fAO!>)cV4b%CXaR!d)GWio2p~)%nv2v&K7&q0#_ZP4 zp(TSwim#JeKZr(@`}H8Qn;W-#y@@O_>1SxocnD6Qy+mcNK^W}a*AzEIGicwNr$Kk05D|rz39Lr0R)p6Vy>?%$OsqOv}Q^jqYFZe zZwIiqzG1{=RyqMxW>@s)N4(sZ1?o+a>u}V~-4pkX%cg%Pl zg14G}x$4h(1pk_S66D0TcO?04wF*Lv%og2V{B#UI4bU65RTlR1Ask^tEx`dqZ_LIx zbch^Aum626=g~SRq;37UZUN2sBh<~6@B(&5F)LQiV7*1zs%F7G&(EH_?dIL&MZaJv7U-IRmm)eUN1F`AXa) zj*-+jdYVysA`AtRZ}s$yAVXNViHVv>AOvc=-67;*7{0du?m8o`ghS8zNR1(1M@-Dm zEX1h0Ej z?EHcX9k~nhG+(MQ_{|&$gVr3)ix4Xzg(hVP(<&wx_{)EVfCb>ZmBoA?7rp%PJtlMS zhS&g74FnWd;TXmt=5~H8G^Dlq+dO%|ZQ^&J|1-2!Jhc__t{Wk<a-Q^131iPmn_YzJjn^Rsdi1`cc^m(sN-SRT($fOj-b1@>;N zMm;j2OV4gok6Z0}9Yq21T;c+4pN0xnr5R@!E<9;(DEh@Z(o(E(q(mtZ2-d1XPmd_@ zd0z&q@XBp+@A)RYqq&t}i76?K^&g5vQyD;F#`?C(# z-M<~`?6Ve&0|X+p%_-grx_~uS{XEkvc!EO_d9-srkBUSR1vx)693>je&hZRx*7swH zEUCD(QVYhX$msODMxlFM_ka&Hzw{Z$BE=&Kmp1E9dc>@8BS0HPbF-UaTTgZ*oZ^=Z zQTZBR%zZu5DD_fMXl@N~ZT6cV3&sg{y0O(zU=R%Vo2R z;QCE6HD6n9=(j%RDAH*@!$eiD05`(ew~Z7i7*$NnP;=16S@0#9#qW_fq?*7{|6aux zuIoZqlrV@ut%O3Gh{2hoDnXSgvF@9f<$qxutf<^Em|TeRvy;+|-^$&ZK{GQuTVea- z#5*thu74*PA<+SP7n0oVvs2GqDb?&)IeayX%uM^v9%Rw2<-9ZTMo>LyA2Mx3 zr9J%KT)tTcoDvoVB>yXDtnfM1L{r#b$(rd)!Jp^)Y@7?pS@+|WEkjh9dkPK9 z8G|*+lCPxCEJ18YT<~g;o`Y6WnyFYX5~W(&P?XPvdEZc1urTAqDaNCx2|>9QbszlMGtA(y3*m3hsG@ zWg4@vFUeBeK^2Fmov+iZk$B3j*$%|GL`LE0b-qK7Xt!AcsAo=|IYq8o%@G*>y=#KE zgvfENJQloo>c$tbAfeT=mQ$7Vy7nK{_!U(+A#MP&Mw3yPE6>N>qX3$r25?4Ek5R1d&e$x7f| zjt-AVF>rm|tXIz>Qht(pX5AUvss0ehR#A@Noxht8M!Ii_&z9&EnKb)2-rfZXUWcyr z-UBxG-P+BPEBD3l_BLKMXi1G7IiQj1-BED22)?gp#zmvAO@s`055)0iWDGWYq|a%A zzp75)mg7gpQBbQi!{HTSez4$mnvRl?p=diKvuWEIazh?MQuFPXeNgKVP?!m=ax#={ zF4*cBiq}n!%rh+vbNbpou`O_Q8wZKm}{z7MNQVCR=7;*NpFO)6zNblXJ znNw(0agv&Tiob%Kcu!$1*iASwG;lyjgyRn+Lq(x>%dhi_u11x%%r%Vl8ny3umzlC4 zwD66jUVm<^1TA5(vdMJHll!MZ1Iv>5;5g9a-D?b#GKy=!$@QJ9Qc}-SGQ${okp+7z zMV4vU&6#Ka!?A|W_lM6C@}&n(<4)MZ^50m06@5Y6Qq76sI$wD&!t)5cP=U>E7~lOv zC)LIWUKOY&)@Ioo^hK@eu3`6CgvD!vnu*a}F+B?$2-PJwX!4XGQhCXtVSLI>OuXIt z^nCxB{elz2g0%+~3)%w7d7%iM*u40#8-gh-^XwlSpK%9BP$5RYLR8=kP*tL{QBEA72roeK+- zEgFc~Bs%>NURIs7Uv572zBcKVmnm=DU$)tq<%|Hr<06tcMoX5am~ z`~>H+Gc^q-wxtjfN)nTGu`wf?$$A7XP6+|qS6^`us z_Dt7Hh;Ug!ftH$=^oG1vSzwb>IMzsAPh}dzTy<9n3Ok}4QuTvGIT7kALjLBk>u)9) zm~S>ep2G2TRE-i|V_XHr*V0xKvOvR272_`#zPv8CttGisPuNWR$lAr+Ic`v zoyT?YWq1~^@%#%nd%V*Y3R3P6{X#6kcxl+3b0G;oh3>Wj40s!sJJss%k|y4HWp=3Q zLhpRkNS$1EA<%5wwaCd^BHkCQ^$agbY8O#ss$!x^En{@LyE}q@l#@F02 z_2B+eT|peF7iRCfE@C#m?Fz0VQmosq)B6V;MCMaP2yB;q1LB-l@Q%Pw2our;G_i2= zKKk47(t=GIJgTa4pLW`t0L5icQN%aW1=gMtMQ!BG>PW-l|(YTLy zUV`W7fc?<^TO0<5crA1$f%ZG{^|kkm-lb2CeReX6NsyyWztqP9=9R19>0l=2$HdT5 ztdKra@t0j}BgG)X%vNl;_Y#}#c(K(X-elBYZM!Pyx!+)AD8MjTeT|`NyLc@#V#7O@I1qFXf_-BpO z*!kWh1~YSh)br2k?+ZNKu4QjX1;_PqlsNZDX3h$e;8^x#!|~P*^G(uRspx8!nwJWP zuOWJ9@L=;*>>xHw{!;pxN)e%XnDhGe0``X%ecbmn{VWcF)v-JLiOq?FILmRVZLuPH z^FCB`7i>-vKCL}kTs897{U>!y*~Sko{=&TML(W~QXrRy*=qOYts70M7FT52KXcOV9t_()(RzZ~hNV?2ai?{Dx7ZHGap&s*RkT$EJ?J32` zG>n~BU$KH*W`f|RGP`k1-b@QqBeQAVPUvQoCU3(qn<$lFwfcZ)L~8$18y}4D0iKx^ z;po2)n3&YXM};<1={`Y~H^{?X?3JkX^#Q1s)Gi*IV|e%_9zGp$sAL~#K2o{ug*M{h zq`s&MjHMNnG|;$*@TOAM?SI{dK95N6ID(%x{9;Rx1RHV?AFq&toE*OoeH2U9A)h=G z`-O*$i2cd^bOArg?w{ z{{astU4Zy626$c((r0#bN{+ATF3_%8XQzUkemGmwU)ZAtqSL>I7rYSE#xi%8dg=fhC7UIX|{xAJXJ6#FVt<4BQJ$%solgZ%i9qZF7z;=TD=13JgMGouz zb2a?{wB%rwOsa*1`X)^sb#b_a;TkXZpRe(XmOq?`Vn1AH<0xX4S#|GVZ#!ivKm81Mz8|^~)=ogyGU2bPnO`30FMNn!`5`|6Gp* zO@q59aK`F*!E^qUWCl)Uq$r}m*^NsN+MV6E-l37sI< zKJGN-!9aHnyKLL=iy{G)A`(?Blt01t0t+yWIUA?1#i9tJ-F5U&^QRU_VjlP?+B%HZ z+TR3heWkhAfr!j#kFzRYpH@{JxsduZiFHwuA~FD8Zb{y|1h}$89kEELOd8l{*>gao zHB@lj9$4<%Jtn-4BeVP>iBd=~+{9Af2;)jhZk?Z8%wPCbE=PdYsy{Z% z{irJ&0A-cS5xwlRaUg2aO;mcM7saX^b+SL2&-Q|3<%_V7Z;Khd5%gqth^i6sMTbQp z?}()2w7e!hmezN$M*SLGe-tPpXxn35bctGL&hQ}V^YJ;?h)(fG6 zT%`KQd_{g3*>dERownNYhg{x-(!H0oVa5kIDSNiLvb0=%x2780(sj$_;}C)r^YD6O zc8Pzz->B&IQshhKD$Gq-tGrLlEN4P0duPdkM<}aQ*tN|M$)V4}6D_!WiWQmHyLVdCT~-9v86Ad(!@%bUy{mH#J+Ofka2*~ zAAq4erR==;814iaotr#MDf=P9*{UZVk+OKxm^b0{+-$#e3}BN>A69xC=$ssX{_4aP zg|r|&?^_esUxU;1kvXrGw%;YTS09eadHCtmE)6K18L|-My1|}q#JaZx)u2Vkf~PYR zjVH%FwY%?2GpsziSDIJRFHh-?P$6FgvexK#1ynlBoN0-5O&V9{pnG4i%VFDEpgY{g zZnWdliGWh19i2~2N53miD~0ZZonqWk6FTAVg{!^4 z=H1N@uN>2j%|Kevu#tO2P~|{jT$Y6el)$If*mG-O5_j6|;+aq3!>LfFh;kHvSsr#R ze8773RItOErtTpZ4N=cg|DUD}!L|!LG`; z&V;mz6G71y{?GI9k#@yCc7PoDUL1k2isoJuX$cnhnQlb(jWCY|1r! z1g>FuooV&(K9&KP$TBimQZCN4P1l&>(Y!tJs zVEOG*n6&hbbJt=kp}Gh$j{E0v!I=6pwFGNIjMZ6@PAvPU!wlju6w8ZSn`t z&BgfJ;pRXIbW`&85yB~qx}!YTx={ROeQsl2Fg5+GL*J*zx9@)i8}>9`cUEvwh#Sp? z@_!2@(E%lx{5zCI5zv9H6^

    CBudCLI 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

    J>RQxp4M$X8nP3rR! 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 EH;|&b)c^nh literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/8_addFinisherConfirmation_2.png b/Documentation/E/Tutorials/BasicForm/Images/8_addFinisherConfirmation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd10d63ad6864928c27db85f73907789816dc9ae GIT binary patch literal 83017 zcmc$`Wk6Kx7dMKCGN{B5Dj+ph)V|?NFqeJmDp(OE@?LuPg9~njshKspz ze~@2@EFOYTIbC~)cxpv@?cMAJ204NNX(ahIBPl#H>ezM3gT9u+royJ?(z2$evZFGW z#hW81tK73*BPxDAn_fB@qHYsh%-$8o&GjfRR?XEDPV2|6M7ShRaPa7H&OxMbetzU5 zEiNsM>q~2BF(26DXJf#ALoepffv|eX8~`EgjBft_kL6GHLp*SnaoB%8^E=Zk+8nMcSW3YL#PfsGJd3PN1_DWG!DlZRs zUNwXsF4Hgke>%V?Mgg(H)`JyPCrcAuWV_O_pTso~mut~J5b&8<$r?$e-m zg?^3PVqY4o%ToW|`z#H7iDQ-nejM zcUT?M{_palXs)Em?IfZIY&bvC7 z1OFlQd8{Brpo+mnH1oxIQE{oMRPmV1fr649)l`94JrfVv8Nag=@6yk-K#v%(5@qG! zfKHTdS*%Q1w7QPpd+J?XZNSpr>{e>&C+QLRt>NuO{q_>2w!70(SF5aJFb9sC0!fFa zI`~w9v2pgvT>(V)G+%3;!_ec>Bc~FMy&*g&^St{6jMpc7+BKbPbnWVW>UE=^G7>qGCoOxzF-;B+2?fG-N)DTwL1@ia)q0g~UB!TCAtbAA- z?*a9N)DoviBKwKjk`~NrS=V5fMMxMu(i3}*C8h|7c>c8K;R@~A{AYLS`Oll>!s3Un z=I2E|XRd3tu0CIvOYz;WE^lr5VamPWxM>G1Y7Elmgr6}pCLIqR8&Xpkn4$`0ohrR6 z)Qp;XrUhgr?)WMy*_2*C{zA%0*Xs3^9bShYwXCGRmBOMZmOBg~HakRMi zawTcTuQWvL(&*5_E@U`yJ5{bXj8Sl=cG9VrhFxxDsDx9CPiXAJ_d9?01^yp^g}Gj) zRt-MuR`}~%`u#xN5saD zjO?yW&xI@>=bIMp?s92V%Ei@JB&L~o`845GDUGrZ%XofJo@K1{MHGvP3brX2&R%{J z@HdAm)lI6m!nbMCqAlPiF|xPoW!NjCE+W+V;Z_(o%vHg@r!n-Bo6?X$ zO2g*ajo1vLTWr<`H<*+Q8xnmM+*gJh@>CAL(|hpSZ}wv{y1C$MnxBas**Dmf4#ef8 z>PsRu*Pq?GG|ISI!((n@-FQIawvXlx&>C2nU_>)6%%~^WeGcp-{QL38$=F84;l#H; z<2264DPK9Gc5KmD9LS=CM>nyJRtsS|=$!lihxj0m$PFGS{*`G>!*1GAVevz2=+jwZ2 zW1Ier&%tyA4VwHgl3KWjO#P0=OKF5gjf>dJ^rb)MeTi?#CKsQ_El>k$uqsSAQ)Yyu zmzK?|m}QsHaZU<@j6RKST94DWu{jHFN2_dj*H~W~mBk7sMplT`_`kb)){t=O71q) z=RyL_u0jp`s2d=Ygre37!BPa!E@f25_?fqg!0;7JB!aY6Ze$yFha}>Xh zeoT=-)oMc&L>k*fe#lHoq%7+9hI~b$Kz{l(C#nM12v&P~w?+MV*6^I{N~{dYQKr;C zRKr|38+`x~-+D(@pjTyLeN5-GtKo5axbz?;zS6ikEc5DFpYS+8_uH_+j!5dXkvUVp zlf8(!ZEr`f5%QGQ9RwNu{K(9WyLKPr4QR>mmBWVQ>dRYUi;DMdY;&o5FQ z$E=*{7gQV)zjuNigWxWlSiCn(Xmdu!&&;1rwRwyf95_Z^#QmEactXmyPn+XO66Y1I z+RmTn<#hEcJ+nAdiDEp9hb1B+xaPc-o@)ANS9^* zP?R+&cu62hdcbk~z$JQJsOR!YvhrNeN^F_1sw0cA>TH}`R?YoOzccB-q#xcSY_iaa zDpN@^!qV89aUOB570gFiTHO8_97^&-RI;E&E8)0VEsee3JINP8r}BmE)X*BM4_^RJG+J87>pa;OMPi@NcB z+P_%_^^2}?9b(p|UdtMcLFI2SSY~=y7}P!Jh=|p%u{g9=svozYZUhdnCaI!9zL>Fx zj}Dr;e&dqH7Kht-*hJYKMDgwV;E{UYmu8557YXmzxg>a`aNyrkYtcU{M@NU<%PR8k z=_J~Dp*4nUAIOhCzaJ=IH>#xDz7qw_SrfL8;~lF?9=ps1cQbBr?QmW}d&=}P^Lff? zQ63s#7!(eU%?frgGomh=RYkQi_?E)``o#Y}9wnZVee_^9Uu_Jjw&l$b$mq77kyGIE zIdxBN<0fr~rWKai%dev$s#WC#4?)LjPb{`?wju0ufw=Catz#Og{aL=3OQ2FbTD&H{g>@Q8t^wGlDbDg z?iGy`6K&_K9VFF0niCc@>2+v7*=G@-@vt^H#^w+%Uyt)UymaDNBz3fD+YxfELo&f@ zm7Ys#`D1b1N;M|6Y%qbPJDNDS4!9nngG}-$2bblXVeidW^S5KB)Rax`uW{p9=qwS- z{oKOcXBllO1`ZiV`54RDStT_;XKGysD*y8fOV@l%CwM&cJMKu33H^;kP`e@jz{S7u z@QIOgH?zKB<6M;3eEZpnqqNu8gXc_%*YhUE3C@IWW6G>|_ACsqcf5S&g)(m}F3lX)>AY)YYZcHxP^G1?D#WvObMA7Jc1a6@V4fKs?|c_{nZd%*(Q2Q8%<6j!N{5))Ga>73&k{(aZ8Wl( z$l;EAU3#5qWR>}l->}g36uu$Mz-M~CXz-k5a(I*j%Vh^2WTrajtXBU^JG$}8jTh!; z%{sIyyq`;32N$NFN~16-COv=m0SmJ98{+Vc-HSvw*p4>a{dBXdTK7{UsFSM$F8I&Z z+3Kwf<~$X-*}XO_LF@bDOJNnqon&59p7qHFVcBauMr`X7b@BZfV&VHb2bX--DjM#r z4Lywm)ryand|}xs!3K(o+n|mh1wLo_ONN$AX{xIt)Ec(SY>!^667=MGLH;+ z)iavj94Ms-_}Lzg)^N|K5w4sZ7)u*S7riuMIa4Of;pw(Avo_S<9=`4|wez$Uo_s(B z%Exw(B~YjSMM1OC1PK$gIX%h;pKb`+B=EX&sJO@)VoKR$ax&Z}6r)5Iuj{vZx)~6t z&e923#Voy6+iW|k6cP7LHg+%3D=XZIrWJ28$x0J;WNY=@+ZOyRPv@hZ=_g^UlvCwdO|d#s6s-+n&BabiIuq7+NA}D9__Q~n zx%)FP$2Ts2%G%($(0Q$?h0?wvV%j`% z{i$+)s)Rti`f9E&@$sST_KC%16~BzxwA32|viNbSe?1!jIudyOL4H1TR1hq?RF3_a}d%lanxTD)QW#;A{LSuRG_56WAs#siGJGBGR)(tlGu z9NZUBwvRt+tZS;`V+sS-BZZ^A5$L5Rw>1`VuYG|5>qEGyr&ZjgUdQ&6j{_v|Y z+m2R(3p*wEKRqa1)-|*@$6Fgwmt0@c#acE2Bfzgj?%k6u7CQ5@@-_!~|HcDN2SR51nC9PB=wAXh)7A?M07!ZAE)>wjC*VUPih_(y|Nwy(A$C36m=M2BjK( zoLecc9zBNk_A#Z^4JySO?b1~}92@!CNRQ*c&4fK_l|~419X@H1Hou~!*X2+lROngj z?vr>!($^4#BeyOSiDY@l0=Ky#!9xNd%gBX%OZ^tc63Hw zC>uiYf!i|k(#-=U`#E_6hOE_Q9oIdM+XG)KR{S$mkno;M%#o*YOF*O1z)?Njmm2x9 zr+o;JnhOL}iKL3wh-)9(4ZB~v<@91Lshe+HEmdFN&{l$`s3SZ-T0W~yW#4*V zabl*3p(yj8a(btfeb)=sA=-6^YDD1hEs>atL7ffr+Q*6=8k$m#Y(vM^y7Id(;1(aA zNsD^ZervpdtN2q_9%zIQ#!P?t7a*x{^V~k9&u@EI;IMUnqW9ZQNy#>*&S_3gqtLTN zp|Y~_Dn&M?;3&L5O*new%Z_}128qHA0C9G)%b+K87dy^KK9=GnI4ih=`dg7Rs=Ybvznqu|I{HH!S0@U`&6cK4&&7U)1tt`D zFaw#aFlRUpthRbFZRj5s_>&`#0Y~2O7hZtiv4H1CL{R_3>tdhzL`oMo1bG#LrxXM3 zgvT1l^Uv%Ldrm8GCxkj(2Cp9Y;GCh~apB)mm3jdr8ZMjZ&JYub14~#q_wS$J;N>zu zfkY;;)=ATof;%bP)Fk*@nENdN1)x9G*XfY~0Apmn&F)I@Zyxv~$fQs#o|t9tMu2@M zt$pD8ds^^|%VDxOPy?>*+ROf2;8tA3|D}o~+(7MX@01YY#*#>(@uu|SVF(D z0$)B$3?Y#QbM87A>uwLquIXZxEhGcxVzybld1BzUb^49-3ar-NKxN4$p}9mYp&-xVJ0N3hgy! zo($^iG4m34nEa1<|KrvF7}Jv|bxyWeF1$Wo%YllseWe;%DSoQy!ABaV)?GsJF;tCH zXfH=V-{7c4MdGg7=~H?9)zHx!3yhTK6G0#99D1Ji_F1NDk<5<(8R?b@vEX~nS5tG8bO ztWDAt59Fx+aO&d!$o-3?_(<5EK-?M<>?Mbe7vHms?j5<9r>ofeq`0OSbIJ?qoIWei zHM>ZWvk@|KjOj8afyjVfM-c77f3O?JAA?8A4p&|EIw-J+9@zKu(wGn*GUi$Rq34m; zYbWx9$>|$$>G}Q#(MWyfvs*{u)n@cDY5>{gAvxJ@+Gsm+7^-69L0FNKmz@7EZrCxz zs6cJz3u%J{bPR|~#ad0Y<_E4(9$brc!LLgyDS4X^Actx?xNhDkMc;5GQZvBDHUz0l z^Dn&wb`g>!1(&s&mdM#TW2`XrW0~%=-okupgzY5vFjNTgp*;e;W8TJ*-(1-m;;Gp# z>!YNks>72-CCz%?L;TaIfSky)e%{Vs0ly(e$I(s%t#EKr+(}r`>qBA3k)&W|$lzDr zUbEd-g1xz*x>f(0XF*2ia5}oH-8%A-<$!qWhd7gKS57I0L+)^ zddYukUp@rbAaA_9$r`Vh!$SOg!_LANMzwfDpQ}aJ@i;Pon;F)_nfq7k67-pDa6Q5X zi<_l=NS-_a%9pVB56|$6nExOBaX`pmfpT(>WtI=i+E^7YWJC@CWzFvE`Jn4}p(INQ z+Y&TmM1B~132!j|kP^L9*P1ROCm8J1-!UY1MCdMG;}M{9C{^G>?=7Y|_DJK? zXcw;*6c);1J42v5#(tMt`^seeu*?n|7yh=C8WJv?>O6rvP`J_Gk_q&fUhsO&AD6h z7343Rz63Zxe#ML=!ANP;RrkjCw}Jy{r0>*qzGshe|7vv}O7+AwhVRc=fPtobieHgW zsu4uiq{#@r%xZeTlW=P@5|9Dl;e93H2pNR1a41taeYkf|oHbqOXA5DG^H1zqnn7*p#QQoCUfvMgQ^ zj^C=U%>;B@R!!_Fj~lK==-{;bq^fSEQHtBk*^`Y&3pv5GaR7v{W<3IBQI|zzwt_Q^&^a>&FXke|N5>!k^6kx;_^znRIe6JG<-sv0Oj*OkSr) zCu}E{_vm&<0Hp7c`%B{AM2`ca6UEOW+7JW?W_ZJ-gP4B3oqmVL>dvDnr(h$Gg~V;N zmb!UDj#Enx`%p=?A>c?X!MiOCnKnw))Ns$sYkbV`==jIhocXs;FBbRe$jz;8*qww7 z`W?^F1x1I=-Fnc`rK4wT9usx_7M!PP8RoG!s<*IK)t*Fm_M=nQBr?#xO?&Zel;+ac zA$ht)5tqeh!Mo>2&Yi!gFx%$i67XH@>WSA<;5CyNb&11w=*C{2<}NJEDek%3HGUB$ zzzX{x@cUUB_><}53 zEcGU^Yke5NmgZ9)OBvhEvnT!WVzAom-q@bs{e94p$b@9L8;s-<)lV|ohEGUD%4Cy6 z-m$|o=K9FRQ`ZPp*>C0%0||JLe&50D^qQV(&iEd!3y9=FQ2_Yh)3BpD%v|Tlhm5-K zJ!SDR*7KNm>jMT2+FR+KHo-LRF@W!FpRK?6ev*4pT3wenlqst2%d=3Vk(W~GeY^B= z>sn>=ym0%Ws?xV`ytL_Lh!j&)PsAQM|%VyRi^z$Kh(?d$>?8@FoOVbpki6w_~UC{c+DAEyd(PDF^Db1iE2r!epRK6-*=Wum?X4||Fpn=9oppGu*Nx4GaaMkB(Oa4aZtN;W zuBWx3N%ajV)q6))x8GS6M>Gg5+l%Q?)+ZosITw$(#(?907cw7bH9-)0s;z(Dyja45 zxj5@Y4wrjsBif?c z_^2ua1SKksQtR!e4nZpIJmmB>m_XR9+UlR4j23vZg+38RH5~u@A;?HvNCAuFEW?05k>bePZdY?1?$Cc{B zI=lK8>3*k&e0HC1&f1q;uk#8KJ@SVT9;J1k{Em@5psuO-;9-eoR-;#gmRe`%=;-j- zek_l`r+c@zSpKdka0A35S^Cchdz~8ut9Pte$NYKRZ@-U#xWROw1tp)uuki|%yrxoI zjxuxY(M)`3-0Ut0@9Ru6ncV3W`c~V?0IzYMD<^}N#^!pCE4(xEioo2Xeoxw!L{-K9F_o%nCy`swWJyP> zPKOH&IhWv7WUpHn zl^a9{WxQJ|jc(N3dZCf(c{grjv&4|>b_3f(x}*el7`j!x+*Yk-`v)NLNqI(k0decb$-2=M9ROImpr#FEF~%ZJ)Skf&pR=IQiwxECmL zY|lJe?Mxb2Vy?)d7WpHmv>fmNxqtd;s$nBXtDZ>7IRMlv{mfO~ljpo=qQRdu(p1r! z6Ld4?jl8M7RR-EW)~G7Ew$<)!PmhBBYw@P__0yBrf2>%te+Z_?q0*>;J$m)zoQ28m zFfp|N>@Y7{Lg{GmwXNM>qO8OEP+su2mYx2^BiZn)-PkC5fbo|aDOBapl|f1h;i#T>*mUoTBS`n!h~>fpJvvK50#zDtcP=~rHI~e!W zruDyV;ujD$=$sOG`x7X=7v2bEIVFsEzq@r6VI@%(;q_qN_EuRU+qGvMsRti? zO0{Lx5_1}Eu!y0>*V`JVShBVfctCtw=_eF_ii7u+`FDMwHuvo9n<)CsiMg-j@?uW4 z{*XvZ=p0y73~FFt?H7*e$V z^7i{*^}w8da_w&%i%l3eN7ky+M-n)ZNb(vZ^SbO=ad-phwc!=I1Vwz9(!Z+Oq`Bc; zA{6M`>*IDG9fpkLSm$83w$a)!>{pCt<8HX{>akM16bV$+Yu|3=(~CR-P=e7v)o*sM z;JW)<3Y$B{U`ohA4Im|i``$Z}({=KF`r&QU$=;L)+Ai0ZyuH7_#vd+JrM4c*mDQfE z(o+Wnsj5bno3u_uJiYw8bUX*aV<0g=U9{#>g09}-D(R4OvayUfo|36gFVJS(6hRbg z**SzVwQ89Nz|bu39VsbRwxlhdRck;&)tAg;%#r1@pHgnxE>XHTvTBVkj;*yFQ!{9A zF#f;ORu0BzukxC3^(OO1mmck{0?!`0td~;>Mrx^JCto_v!3CvT|3n@V*!>4#0?AWc z-iYD{7OPClO3l1hgCT=WK617Pmlp!0wjg-WocC+Y-2a50v6vq~J0RTfr&k1%1xA|! ziaMHQi&X=w#1JL6y-guVJ&qP}dy{YX6lvM_eS&+Clqv3?G-I|jui_qp0(Vh4>gZ29 z_|tb{VTC8czbJ|jglP}>Jj%Res>LX%n(q*eynt+0x3V|ziR3bYRX=TEPM*z{XJ1M5 zwQ1?P-;+N_LD&5CGbVT&C9#za7h#{`M-kI zN{821_f?&yjQwak9f>v@DP`8*WQGaw)=p_#fZv)6vVbz9etV+k0?bbq+m+^YiK!)G4lsxnkV31k?V0zN& zjUgG}g~B3go1>CTn20d=YJ#kQVKxkzZL_E*}%uJRELXcm#7p3_Os^NWwWlGNlSk=BFnAue|^! zhe`PTJz)Zi`_>?ceh09Lxjt~$iU0sq?NJ$0|C!pc{iQDgIzzBp673SQzfejq1StB1 z93lCoUazo#Tp+eV@=DUbl!!*uZr?OL4!EitcoqYhH1hnl*zf2C07X_P?cYHZ0(u!# zm*|9n6;sFovEL)>e;5za;nWC^++<*M5LklF@1L?^gMicFh$z4UxN!Fn%TYzsMrf$_ zR@dj;di6OHwhMq9&1V-d;P*ekLH1-q`F_^{Z?LkA;uZu?SpcSJ;Oo*8(gUi%+AA!v z3{u%}pah&|xs)tF50bzIp3|*HNCWKVFa0BE4;5fy930S=kdmAAOTjCFC>BI(B7kdU z!vmKw6l=2L!GRa~)jN~21K+>MDP;JaDzgGjx{QUOpZJ0P)LA(jf&VA)><2QcGJsG2 zuh6m5B8daK_-liM1GH&sa|_d6vw$9y06V{|BtRYzY_`8$0@4T^{Ofj+8{qDrrfB%5 zagyPhgY^xAi}76~zszX}kQACJAxaDuJ5;b^(W`>2i=%yverIO=M{SSI9`^H*Kapz0 z+Ro7xehEkdF*w)Z2WG~f!yEo);BYK1Gs}X&0o=eo_hFF^#0+4O=KlX53M54jijnMt z(^+qkC48^cHnZ^WyJ1w!K&`YCG8Pm7kx?~0&*+g@Ls<~1in#RC>%@V!Kx%qpZV_P6 z76FPhN4hy0LZ}q6ou~w^DB&M?$q;h~&@tafDIWCG_iuxB8Sbh>GXZeLJ?s@!G^5<#unaq;1t|VCe5uAnnckU9V3?5>1 zS_}HUOyN@ZWvz-HIV3qOiN|nF>|Vu{0Ji57kb51l!WEE^tA38=mz`Z=1#a;Bg;(E! zRZ8LYsG%}F1_UVW-pcB=@(4c?Q@3$jd6**59No26rJPo2To70uH|FSRVqiKXZ}tVh z+UscA_VtSR16iJz@Lu#udZ~=rkNBDbb+6vLYs)N4;^ZMBfebO&=F2Y>jTtDV0gOyq z_@{)k?*paH1(NUK{rT5rfwNx!YJKjkuzPZ)cO4FhZ(z&bRxMzFlTiJOD48hjx~2~AZ* zT?PA6J}n!|L)ijs#9%e!D%V{cuqlJ3=8tLN*{-E5KOXx>pI-0shQeF{z{3Ydxhd~F ze%`Y8(J(Vzr(+smPR^i8Q3jBO#?t+n77u4IXmed!3@j(*?k#`%RGBSyVqQ>`;%( zGg&o$bej}bi|c24pBfM?gciU%2bq`td~)IPyx95#vnHw(?*zbnJlL&*XbDUg!uJ$2 z)}Ex6A*%Q`h|v6Sd%^ka{u$mkda2yf_ZHu)`GFn2}4Qk=J^i^OwMD7sG707H_PzrL_Ne&l^Sy6@Acg zMP%dUoQkKnM9CHcb=8GpNC=SBj~B)bUk{FOS^S`QZv&LPQ;%kSszI+HP)^bZ<2r=t z7e6qHFZuGwHc5qW42|xJVURJKdg;Vx-a{?|Kx^^v3HNDrxzXssKZ>z}4VPjA7|r)x z(c9g$3HhzzEHHs8CucG|QrT=IY`1YKv$scj_VdJLXlgODj3omJr+FQ+y)ChtPApznAqcWM?e0f)>EK^LWZ=*`wi_BJ}zaGgb}pj z6A#DUR-f(`Np|xO++mEQ5{v`8A4AVKry6V67!zM{`0aUQI4+b9Y*zR3cvLVrU=wf> zX8-$P$dmT(=`Q`Za)-mz#l0W?`2J;{7ED}T?Zk}(OJ1hDF@r6;sf*|h%f&_ViQ zmr&$U$0-0{m2{}zpSoc#?kDP*5Rlu?3-b89t#mxyi?lB!3$br1+3{85CaP9qGc3Vs zjj8XUIU|Sq?Jsy9%Q?XjF;_hM(nUsE>X+Ao#|kv<--SSjL0NRGa zzvC-@MbT8NVcOl$rHaDSWc{{jnZ)5dStHm}i!|D6A`;(4?ks8_NV}O(3)#iIc+lAc zXkiEIgr$$xG~{W__mxNAzR;$!Xu8A<-?_IwU+ANEDC)XAs69sa`183M-g2LlvBTlU zrjz~2wOdFBjNg~}?)U|;9aVnN(xaJCMYBpobh#;s4eN*LIdIb?F*x_FaKyGWU%vnZMdiJ}zu^Y}ypUOo+uvol=}Xyn7M za(@VR^BjNiX-jl1%%%cKj7LvTs)V|DK>=Zfyq{2|jT=asqall$Sf-7{anAgse29Ymdu!H)23VaSi3KLWd38rM{0uaKRP%F`YTJB{QU$!krHun~ zGvQT^-n-r!%I~DNMPyhwf$Bo(P(gq1zSu~x zD&}>xoSltLR@;!~7ky)6Zj4{39JdXsxJ~!$^q^fhdaXbsii|}i26V%oK@=!Tz_p~h zc{le6bCnSGE}*d`ba2<>dV;A0H0QATqpyL9XYmLaul#UlB~6K@vrskdL(6SR$cPm) zO?w-IJ!k;8oMP6T$IX*dAj6y9OJdcYdp3vDo4%HxR(CwB`jh+j-V#gNeR9D%QZ^R< z`=LnAOEm?r4JnK1s8)iVF@6CXqZP?Y$|uxQVMrgE`q+HT*&x_>wIy2FVPu+Kw>qge z;S{NhklW9CG~?l~Ima)HG9a)CEI1iYGOe|Wr7Uyl#VLaHF-h*7QA-9iKC_LgXNWNa z{*!5d)`!;+D-7u;=HZY%M$U{_m44yAeZm)o6f>YRN!$pX#BX9_f49LS=SNO#YWJ> zGRDSit$onI6Fjp?doLnfrvTg(?{nwh$v9*)uG8b~s?6E^5C9yj8)t?SMp;4_cBQY)V*?=Jfl1 zlGvynQIpgCBs{M6q9nS6yzb;-@)l!s?_)*&T0X`YS5O7SViuBu#tRiCV}^wJF{yJD zbtMNDq^WAqRQ3Sm$iyC=7q4QPGRk7@01Q%Cn7DxH{!C9F=bkrNC*LetFe8O?mSuL~ z-ba7V0&wzx(V;pQyK$J_`rUNgk0S2PkpXgqAj;Yg*IJJV2&D28^A?idn7ALEwJ=z#6@grGIbN1<zA_E_IGvQy?|lH#QM^a|`eBbr(bQ-H)qzCehHta^!^-6mQllU+6i7+Hq=O1l zjBKELv+Ns3rC$<@GD+5>1|1`z@fAIkO@8jiNTEhHMmkci*ap?wcFSec&yI1X6^7(j z^}Y*TJ$RmfvpkP9r?De-&BH_jTN1oe%)Sdl576cWhC$rqbym;nQq>$}trDO)U}s9X zkQ7R_R9eIh`TgdA4V2Vt2sn{NIK(YXH86kWd$N&p==csR9dy<0W_)C+a|4Ao$`knB z{q${NA!(p-kK^q-n=V4;Esi9{= zFxTDXAqy{3Nj)RjuXCj2Ujez_&)!O60mT!wN;T`11N0A-k}ZQO)#R~FdsJbM?opcz z-N+gK-Z1*HIAmZA{kS2&7N3#=gMPeZz5fkr;Lz?L!D3D7RurY;4s)qw^@0sCmpUa^ZQ)M&3cverW)C*ZF5k7MjkWFK;)1=KQzG^%& zwgiay!iFnbv~dijrVzCBkw-yUv%2mkNE@wRtpPT`(E3&4?|v3F*ddrEfmSUo+g-GU z*WLIXl&2-8XlDzaPE{2wzLKM|AK9Q4RV{B7;CF7tQw{6sMW2t?SoZSzZe7*~u}S2) zDkD2cgzh?i0Q(5_$2(bP0(7gzOxmHIbCJS7QzKAowKa}$6WdRF1{~!p#^>9PRTj<^ zBZ|ie7U;ac`^RQsm*MHAme=xH1CEvxbGli<;SltAsHPR z6|^^z{4^v(OzZXSmdFzMH)%GXUGanL#gsrLiTSvSXFusJ=hpb>c=Y%c)bxsx%M z&biVhR}<~7t=QJq z`tD}uX&%l7+QwMjNE)*x%mY}_F~Hm~a|m{9&8q|kWG-9=C-ue+B*{69P!hhqgiXai zv&5J|OCOBaTF2i33%zouE4~RPW0_tX?7~wIpYCoRFGnPK{BWl>O6Gk@;jkEQV(vt{iXJFBOh0;N^tmuj1^SKR)^RT z6_~_it@T`}93zWPy>)3Lt#&>%v6I%TJd|hjD8tLuz`ywDimkvB$lTH=KEBoWsDB$* zI|cUj?+gb}1C`itjioxHyC6)5IPNj1J3lZe`e1frm3bNw6Ag}zYVl(b zbxWHTd&A9>gZ4A-xsFIOaW*({>fqBPf$cgla90h|{GwZf^@0yRpB`-r2k3N`c_rA4 zuddptn;eEAE4bKf0ctU8(Srp?u}~pVP1kjR{=bB1yRD+FU5p}!h=8P`pU7>HW8kQ( zsWQ{CJDC*6Ya}P+I`--3o2G15$m71WyJ4!~6ck&GXQN91-`R@|Jp7dE<1J|;5@)+{sN+dGdg2uD92LF zvFjZSfbPrEiJ}Z7aZ;p+V%i_E>#JZMXEpyz% z=@LCM_&weZU<~9(Tr6~b25xw&uR)64;KGM`e$=<@2HRxeS0e342TAb40Fr8OW25%c zPk0Tq2&yk)S%wF&O2YmKF?!@fTt(8Hs`gV)s%Y#cePKs))#=I6(N`g-uLzN)beG{C zwG_Vh`JdKYK$AXRBTo+Oo2z<{$}<2_J_nBuTu}bKVdHOv7Xs;%4OzlY$k_pM%>{p^ zNs1`XFGt{g1z7k>MSKtRr^4udHlF|fr?K%a9z#B6XZo0|E0#DRf z5~4vZJ&`MWxe*|9eLg}>=x~3nrq!L43G`ABF`YwO`E$bR+uA`U02#@h#Qz55EbUOh zg{Kq+K>PVZ6cM&4dmrm1LrUj;!aemYb>xklmHkmo=B+P4Q^$v!7tu@BLHI+N#ar$v5+A-aCx$-!cSE%fnotkbH-WK0%J{o7{D3^@H?gb881iE zXWF`}C0i*lcpd3UUb#-0ZkufJ%-jqkn&xn2iV@A(XLMl>ML?#ay$ryGk$rOGdb^Z# zP$aQnr<8Vvm(n#d>o-6d{*kln&F+M4m0-gp1U>1{%)R#s6sBn`_wB{@olf*8n~ye{ z7lxI2&D*t1IiuhOSk%9iU#9&R)&B=S%?3s(E3t#CmF=gPS`$++4(mLsqjyNFSc!gY zI0W<#yB52b=&|T}_?*L6zb?^*TreT`PADrEXsizEzm5Gr1>TfPEfh5!vE z`TmjuHxP!jf|j0qB==~ZUBsd^L`;{Q4=Hl?$vq^4nLX+@RV=|Q+tLW^PEDw4MQ?^u z7AH(V4^>E!35r0Ka9TIHkcnHxcj^pDUS42_33Mst*_B{>G?*(xlGqSS!uAL}$~o&^ z2N=vkV7rjas;dD~2rvbm174948=K>~(v}TOz&3m48XP5huw0wrM4LTd*I5Ko#>6}@ z62`v10j4&^D*YXL<65gbj*yfhmwCY$Fde?6A#|7g__a zfD60>yywo74sH@Q0sq^G;wWkJLfVMkk*rgJ?=j9aN%Q63fnDq*QdQ+@9pJf{2+
    )#t{ziT|e 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Images/9_selectPageForForm.png b/Documentation/E/Tutorials/BasicForm/Images/9_selectPageForForm.png new file mode 100644 index 0000000000000000000000000000000000000000..286d1eb10224f39be07cab7e7639e3f8b090c4e1 GIT binary patch literal 66064 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
    =-wx+}Mh6|6$7=--U7xSSat;Y=N#mPTr^t64y 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 z zzP^e%5cJH908-QhGJ+3F2L(;>7@bNB4Xf|3k&%}~)XAmCZk^2lc!%F-%v}-h1Z{y9 z5q)N9u>$c$0O!3r=bqJ~%azI?eNWx!=GFU*+(+`36Ox^xRSy9e{85j9?BqXjd>`NN zTia-Ok?yX_R)Mr`5{bIx)svKL(a(u_AZYF(3;;_S&;(i|L2^Ya_l+9fK-bAFTDAA8*TwI@eW737ktF6}@pfF017;wjk`5{e*L&?}pXQ{{`r z$I_GrMH+;Gf2=@)uzv#Z;PD!+a;UDa)z)6bY=V~!c)9Ci*;K>gvLy+BQg0XreZ;Gi z_)+`A!q7muL%H0jac0!MS;%w(PjrE39_5wWSbGWQeq~3vPyT@%kbyNo2sMMu>152$ z_&ejZ7Xz<)gPiCY0h|(vr))N?HyJ9tVC2RD*|sy(0|&jT{CMDl!4f4BFCLigdvd7Y zAyK$_%=mlCp{*9+sB3zHAZ+S#rDhyrkBdz(t2Ux~o&*GwO)G-SK{AU}kZ{O=wp*fG zv2JOcRbRd`XfVVR6v!u?Y-iy@iQ52IvmKA_!qZUzAVXuM)}9}{S=5p%;Oqk~RBbB& zotOdyDqt3?xq}if+dd1ZfjJ(|CaZ!dHHS@8=(+KFpZjPz=ontyU)Im}uxe}0#TQiokjESkH<~ucSnHGW++X7b^7a?&@b z#U=IRwhqtrMm=I;VmAIXHf^3h8~^-*OpmrrAKu^{06{Xe?njx76<6q-E$lP9fRx4^ zSCZ1-{2WuPK16Sk&PvUtF4zUHHmbMBGe+@HqY9__E~;7}=rP>lUI?a9pzBJM3oC-! zJKXYrB#VEJ1JwB+`%9;R4+kx?$_XpvgYXoNr?uJO*!Kd8o7Xt!AesMrYOpdwUmjIh zZ5Hd53xCd4L4yW=hf?Jb@lw4{DMH$9<6#al7Ii0wbjm7I(i&h~(mkv^>S!N}%_e9? zmIG9cZ5?QMnF2(Q0xMS(U$xQPyT=z)dzI9pzDq2ZRQ|)H46*=~BvVlGQIIQC2(_+0 z1c)s9$stvCc){%yHqc7X&_-!~fEF^GEuzw8H{!be64rczDUN;N``sjje*dLKB4<1Q z289^OAKT7P=H)521jW;MDVH=kl&cHYTrC%IqGpgIO# zX);_W!r3hhu)6-b`jbtj6a1Q=9A*< z?*d6XYtDxr%DiXCn@T_!k$z@%(Y_AEr#Fi_i%FfsNBTV<6RCmWLfoS!s*FB zTn6maD3NtgxMP^M9j_N!x_zgz8}v%Qhn@)bZBFk#hwL5%XX9IW{{~<(T_CZYJEpCC z5BukUI(LAsB%5sDLCg&cNa)4FsX`;LS=6dYhK{t9qlR|2Rr%^Z-#XG_=c$Iq_RR_g z1B!{pGmi^Mh7WZ};j8Yw-Ju|XvKK7Rjs+W2s_{aLS zQiD?@F>IMce+~cQ&x+oJ2h!9U@;`56XswFSZJS|MRBUQ&dR-vsmQ!5f)f7VGD{{}X z9IRe zx-Ru4Z2j$C=@^+H5BIy4XMRVZF%UDd`4F^I%KAiw4u}sk=cdsrwwtfLQ1_bO3 zVE`M#_jpsWC+8M0E;Is-lC)({UO+M=J!@ih%a{aHXR~2MO0Jg6UjrNu!E22^J)gQ`iGE#VC@+ZE^7SLAJrL@*ne{sG)GG9e4s4M=) zS*F=F2d+=%7rtc=BKhZ{uExB$c{@1jo%pc_UCLYM^wuBedM%1-(B)jJ(H?W8h%KR= zRHfvwo*tCH=dG953B4}kx4ng%b)IXYUzo0x#y%)%=eO7cs8U%I#@Ze1Xgoz*M6SI0 zea~EHT9g1{m91YQUOSr89T2Lc5`1ex^HL%7?=1_`apPyHF6YAi(jdDwH(Zwb!$uQn z&)+C+v5~Vh2dyY;XEo%G#GB|U(soVRpcjms0ukrF(dS=e(!VAx`^q_=hHOyp6IE5% zVKwn!NS;r^mE8zVtPIQzKf{SDAD@%V0*8|bIHF%r1m&>_K-q!+v^S{WZGkA^8=1)1 zLnTBa>TyeCtoYhn*|NGhhH0Y)3BjX5;x*8hj2|qOZFb*`3ty8DvKDere2dq1>~IA? zgO4SChO$Q{U~{7Rq%O*7%~eA)bc=?t<^7^g0f}sWkvw55wt|VhrTj+@SuCRe`(dg6!rSG<_TbBU%Uj+4c0vZkvb3~ zKpVYj+6u*oM6o_npx{m~;r9AYx{_JmNiFw1tqVvz@aP}E{ec}TA4fb040h*&FMzx% zEHz}RVSWTsFxKgk$*!V3WW}G9`$(_v=Xo-Q%Xmxqh89pJmNxO6HNdvj z5wzA`mj)G;sNLcP?9n97F0yn>TWiC`*26vQ3fZ1k*UF#MrFlC$2yzx^LTh61%Pcga zl#_^WnE)i7$a{B6#X3h`@@r=Tet5A?ZqzE@N!5t?PNVQj{$Om zml28IKLnmPTk0*8H^ zF`r{MQQ){DlUabM0LfQNX<^D*!CISOJ*_cc)d;DX+5G5Sw+R z@7+WxZn}F(gg{&M2mtKru->@jZ+$(bC}3QKe8$N9tDqntQQM0|zb)K6cc->!(|nU1 zP-ng6^`iLob)JW>SI=1eGVwYzo#Go zAl(Zvf81E+c1|X?v@k?419TFbLT>UUN{r zzpM%ddQEgK@OM=Kd_#Z|c#qEy9(Rf2o1NQ+9R#c~7r=YyzahI#@aGIcTY-#_Ww49@ zDIpbJS38K-7HHO)g2BggeD(fgDnYjl3jP}S)}}*r9{l3u6QK_ytOx)j<*D&k{-cQi zex(PLuTH3Cu)ho&cxV{<6%bX4xdt9oG4qz2}8KBYN?c!Ykydpg8{>SIqEk6Jy zT~LdL7zn`=1Vd!P!TWF@gdgkthXwe*wX0y7;1m8Me4J_g_~-%i$)}NK&l=XpXTTlr zNn_LPp5xIL-N*^N^hqRwALMKzKy%4H-STf?rkQhKTI^QXi(79Hi1HwYXjHnX3zUcQ z-sH`{yK}bp4rkkE4)5G)oAE6I3o*~w3zA`F_)#!D@y>j zrfmHZpsK&r@u$B&5g(%2lH#_8kIaHmahN`(M=&5u66=N4C&%!}jkI2{(xTa$i5CChWyi zd0VJo`gC5CWYf0L+lth*p)tRLsJv&c^6pA6e~S|QJP}dX%T>nS&D|!&rAv-3)!q`# zr+O&}2|(|Y!B6c`_+LBM&mOEv6Ec?_a-ayi1X_p1PZz(%q`0>K(-m>KVj!RbT=I@d zp?&_>kWspQu?{wbo+{3v-(qvQ#@T)Qxr6pqHo?c@oih61T%|rw`T%OkF2Vo>FwiQd z$4!3?6p%+j!xTMj1j!AP5e`QK41F7LTwK6G26}Y%&k9117jFF_?$3PrLVH zlserERT>`LR`9mHkQGayG&h{JCx94Iok9)w`Z#R;J?#Uf*oZ?)>-V|LigupgyI^Oa?J!^#_># zaBC2QoqKbRj3M_q z?pPO@B_yL>{>am8*V#&_x~zl2t^Or{sRy37PH8=P5E8;TC!uYWIVu05mZD<2c}p|I zC+<5j^+)()$Y+k2Zjfq%YHlkdIH_~@1gQQpQ6RL5qeHTYBoEoITyZfg?eMCqBu!=X zy#d$=7H_!OB)_(o_(#ni0r7yW8(glGSA(zfVmlw6gI)&~&z%-*soNkKFb}x-`0qnH zjDT5Dior2$e!9r-?HSv)JxTMViJK4fzP0-Eho(THA)QIQ7R+#fv?2S*cS8}t+tBr2 zj35-Evus1ZP|oBvph^IKzSz{Gc;#i_#YZiKllWyDOb7%+0$Hd9D0v)s}1u6)v? zFrduenfLYjJ)5U-NFNo=yjWhgo#%8vlSx7RlqhI7cI)1yR-h&34*{&jf20Bb$nG=< z??RCR-~lJpqFjQ^f`ITTARk{S45qH&>y2AB)oq&19F{dKGGxY#9NnBI6-DN0yv_8C(3_Qu#W;V4S&xC#+W73`$u*O z>=YD2pd5iFSN{_C^V)E8(Wd{8w#%$BRQ}mOtOo%9jvbR-%9B4DkpaJAScw$Kv)rIp zzM01Lm{=^l<7yndG=3#u6c$qej+lG>=C!}VHFp)538le)_~y;c;J#UuBN3JOYyFd> zdn}9lW4}%+RBi!WlY+0=#&+WSX#gAlKex!Z+SkH{@Fq|eamU-&khHG2KZC89uY`ay z;ocFRCkxnJ0Widc79eYb&x+2`8RPqfx!Iq_O}ajrn)kqNOv}yVlVkQy-UT-5Wc4KG zUAb4y{JmyBRZ_;D)$B+-O?4)#r6iJn1q?Ecko6clwb{=&DFx@Er_tfVFQ-FHi$w(% zh41J}P0AkMt)usReGx(+j5l6He;gmM;#v5B->O#M<{{)QV5QOCEl|&R`=Ak|{#3>H z;wDh@fqceIV+Z19l-5eE_G|%8-X)RslU#UsY{O(+9y-2@anvnYZ*_qL3%JG+N_7ev| znmD_G3~ZV(fD>^+)5OH24anpBFrOVys$o`nybrWu<_-qGB`7s?A54GngKmJdpkE}x z`ELhC=m*AjD(y4PcC?ICxaJXkM*VVZ<*l601))!UEVGiP`VTZ&a~D*0YOeG+2rjq#FV`JB4z5QwD#V=T|5=uv(VrLj@*H^1k1|e zx~!T$eO$)e@T&*)F0qSRYLpD#S&z>iAd$qIJv!4&UB{6(nj~!}X^Qj@7Ov;vx+gMZ zhIIxGnQ>=Kl&+F0x4zFs-iA_rfiC!czer^O7$9slv&%~x*@TSuVCoNASU*F*+*7B3 zYo1=_emPk2g|Ppet*l}y>m5ruwwFO{q^#6X8235KtwG#agMEhQGWpS%)4Hg|B(~9J zfH=2H)N{QXmz!X`=O=UdbO2iE{{6^P1Q3|tzdv4(K!e1LWa=kV2}&;o)tEP4yg*P! z3=OI`5XD6O`N3TXG-xoVMG_*Y?+2^;_FjS+NOzqM&@>_>1eng#|Nhue_Jj2oSPSS{ z5LVCxDZtYJ8#6_9%E)#~C4?VLkjM-G=fLMD{`@BBhVnxtC?SrCZauiYwhjy3{ZpYAfWe_Ipr@#2th2%Ow<1P7zbVO?BU*? zOxIo;ykP<>eX*;A#y*3#B+V3~IO9O#Vz_O-sxW`uDo{5;cTu1vQ_ zj%0mQe=HP)20X!?9@?7i#{;*tuqeO_!381dy+RhKfMF`72};f01eXdW)iz^SpARol zNbbad`#BUQuxqaE6Q1j~pL!E)Ac(Y&ZL*ZV*DLfgn2E562udY|_ldBbbf>P^=9As> zQkG!5mH009q;F%@s(I5frW2xYse zJZo?RGH^;;+FbM)&`a+gSYWXmQW*@UCzzpT^1YRQw00o6GfkvjeDY9TbO$XPIB)s7 z(4^>4lG-`dPYdS_>X9EvwXtK~`{RxuiMR;cH+DUN(&}r_^5i;j-Gg*uvLKj{Uxx&} z1V&qGWYRL9>qi1deO&VW0YsMBuh)AxiLu;QeOAN8F}sgyDK=XXm7(_ z8r$}0-m-#s+=-_Tw^vUj`lrR*2L{?xxLN98 z;3}m0-XkL+2rrSm+2gF8u^U?T;w|lHdL#$Z#z*v|>X_>I2j)v4+-z;~{F%;I^E!*J zJuYyFhcT-RSxc|)Q>Ub5ktL2FqDCZD)=&l`D*L3iq9Kv3MB;)%kDgN=YLx!|2d-1#E7p<4l(cCe+u>(ABmL5 zD+-qy#6pvnMItShTXTgk^&uUx4#dgILS-zS4lj*FE`(Kk= zHNrFR>|cLN>3@%)>?~63ds9=>2psi!l3kG0&^EY$FKu1oQA&rC^=@rbf4TqQ797P_JLIjCnM)yAAojbwR}6?N7uyrNaP%UIaAOaLD#oBT+PMfCyj z2cY%o?sHl&VuHqYhKq9*It*&hiePxq^>9>ZznGBJK@$zXh=`|q*;*{~V$vFYohv(| zIl2DbEQ$vW`DLxEJ^FUhXf$arm`|QeO=I)LlOhgDwr!{LlACat4c?-gcP5?u^3-@Q zxJSr#9%*|NnZV*ZH(12p1KXLCccm%oNqNQ6h+!-?+pd9IuBK$V0CBMrN;ryxCV7AZ z-3v#B&&YoJP&p|doW780{HW=5t=`&l+j^zGhw+s20gRSOf^`DZf8eELozxkkUR?fG z5w&o;kB?}-ajS5Xt>WS9sCuJwc8KgSV2ji~&-VO2wGdd0sDCSbf&1$_RVm?pC!s*J zhav+Hq_kR4>K=i#)MPbpUET)9ejuske0Tb_=R~OIDFw*Mcy#3w)2)40D3#?QEWw)H zPlgkCH-S6n#Qc9R!zltHA~|A&i}1qyiF+8>?l-`i03H4 ztibWj{bEJ&`(&La?4@~4ju0Zm4l14)J0QGDqt$-sFVcf4-DE}{(x>Q{2Q}dYCKIS< z*6wcLMAByeP#OP|6lxb?>tgi z^`~05>OO=l8a3#H1dkh*MA)1~POI2%pSBLl+ceajHxHo-;>2Wn4BgWW&|LpPf1Mzc z2pZ&}>ku6Ad%l2U8-!by#{c~ELb(G{$_4RmcapVub`D!c8x(w=w%(3Mby^aa(>FFn z9V9%ITmWWW9Yjzf|5pSB=HQYLyY|!a##zIPJ;=gUVE)ej$(lQUTB)}LB?btVUpuz}Z9`1$h@ zArz$r!cO&DcCx=>O%TO!on_a%S*XBG4zotC|ECVWs|!-692r`4mq1uYl0jynuFx@XyVV$`9p+*!sB2K@jnp z`B5b#rreO#g@r5a14BbxIf~Kb0qDKGy^{D|X+r1~_8$l+zKwKO{Euh|D)ZjpA!cXs zLOBR+&1VpVanueRkkyry1Vg*J=hp@6^a7KhmMGxX7r?boz33a;*Z=(AmbU%?E))-| zs#fh-Fi^|xfiD2Y_En4s8<13plFL(_F7EtC)_kVi7t3Q}d0B@~0VWPk=y0Jt&z>m= zXLLfUfp@O{`I?^kKlAJ-(*{1lP3Jd98G04H0NZJp#M+^s18o69e@jEdG@WGYv&cLO zpcifwHE$Q&R5_Bj+=4bE(QSQyJY9XeM^>?S(b->7mz{CLv(oS9knQU0$$3oE z@|Rg6)j3GjjyZDRgmOW!gdx}q8LNdt+zC)$4m+_v(a$nw2u($6;Y5^h`pqA4x34f1 zTpjy;2xOpb;(mUQ2|7s;WY4>Z2V}G@!gMj(B#7Ni&;q;nY~?%Un2|B`DqFEmBt&fHAy~c=rzf> z_@F^sjQr_JUUma;FJMm+p_nCl2{WeNYn?%ZCaBOwEVJhdr59ci1|Y)9E7p}K;<__dCt0oU5Y9wT~{rsmdy`Cgl&; z-c$!@Vkw4!;Me)1putN)c0C*0b9KGG*xUMbrg1=>AI4!`#+=_ zrRV}ChSIXE>fdOHMSq9UEjJ>wg&?=}_LZWY>CTqik*s6(*QErRRH6!}zzc^{)&UyZ z#V1*vQ=dZ4PgzK^cmo-mP5GWrZ*IpJ@X?gc503@@GBiJuPr*^fyXIBAFfihb>n4cY zJE@Y0_Hi06$iO_P24>J37()%H9tMkF3`%J?wY%;qP#fgqpzJMmQ3#F-&Zx|VrlxZ2 zU*cnksT83(UljY}?L~iD5dYb35{NjsO$}#>1@?8!jR85JlKqUD)vovN{oVoO#B=>T zhR9%xuo0<{<=?jDm9}zLSw5T-V0v z39~W2mMKha;=d1qrYhK)Nzh3}7&r{Xh~0;m$0@We0!O^8S1B2M6dng?R?MwZaanqhq6N3;TuGMEm6~mKSnRYb_v?tq2m?ECWR*t6PKv`*LTL zu@P0EtDNZDkJ)7#y3gJ_%2Q!$ST)!3;=gm|f3enV|6sj>90$S04llHuvqK|6LGKb zvpYCQO>J$&>Pc@N>q0w!Gh;`~m@f_+(rY(y&2cdg(DTPH?nQga0od};o#JQU!hm&RT=0=QKH#>ULIgGtBg=B=aIX6rVHK-sYVl-(i}}sqi2;NZX9S8 z_yUj%;|6TAH~{H%(~(X4fQQyqfZn9&=4WbKJ_>WArQ{|ShJYo~jx*%99xgNvJ>YVj zaM$gQ^y;Y|3QzZ3iy6fu__B@b6$?}7iz;Oge+>fydx)60Zn^Wb z1sy%I!!45~ zNY>b6k)tOC3Hags9i#)WgzNoN$q8k@_7oYY{n$b;N5f&<_}DJj>ip^Evmo3n^eu(; zUke+W-C(%6RI$y<^_lApW7A#bwrlZ2@iW!U48cpd;epxBYq9(D8RohFjZ=mLUlJlC zWTXZ)jgp7Xbf*=;w=wbFXBr3bR1#m<(3v=LaOc=h-BkDMajR}^jM+PY)p@RcTA$56 zqSfWs_biiWlOaHczww|{<2{7ZLG=fyOrX9`;fn-7Wnqi~+9(g&JfI3>UU5xrQM(!j z&gqg*wphd62b?XR?cirCYNE@bEL@NCJ7*isQ;?Xxr4>@g*k_kfcyf3BcAd+wJz z$s>G8IdXT_^tu$p)J$OkK%+DhkKRtdhzG@r-jKNK3WNrC-_OIGe|`@8;1d@uv8ALs zSmUgj2$J1PI{+h0l=OLd$RvbG*UPg}^{0lU&J2k$R1{+wOUW*0{k?D6%HbSV(qx6ZtO96u&SJ#oDxrC zV`GPy;B)v2*hGJ@KO0(wKrfjmX}&dyG2h|~_N`}nev$PD)Ye)!H0AHu%dI003Iz0^_W6#jJaop~EgtXaF` z=_R12d*2P&x;4vow8pcQSUy95mfWW~>~eLSjKD0ebxCsJdL-3q0d(Ki)>gg}kt3C~ z{JXMeAPY={&{FFa2`WoxsK;_?ZQIUbUxdZsJ-4Oa18V_9x9EKOLk-c7nj{@neEQ?; z;Bs1BQs?$ft6l$R0z9B9$P4iXVuUjwKrC~1b!`WTD&v~6so_^ynEnFdN{QWlaO3w` zeLy3Fj&x>9ibJ&ixfX;AEZxV-CQw6c2iLFgPR+lhFEAf02u=j5Q%(-iR_tDlUH!P9 zbj|nrzd8yaIxE~NMNn(ig@)&7yj!BEhiiC8#Jv{t>Q3!e56SIhH6PFZJX(J%JM)=Z z{$!_Mtl|*GlJTZUbwxG{TqiCFfxGCUMB$nG$U7!=pdkIfsKAm8tj8dVJ!eA+I2Y7O zNP|!Q?G!4)S7J6Tb6PwQUhfv5F8G9*rve`xEyT?ti|HnWVdDZTcID0kMI5#_4e{~r zIXNFVOY*-J&~RQAP&d=p#;gi>=HW2p^epzbqUzFMRX1MnVra4gG|3J!0cNBqvEQL` zBonzm2`;AsfV^v|WDGvpCwYC1`xBSEjHM?JT0~~RHBmf-Y37_(b?eWQTb7-iCsixQ zjAXk&y`>d^i9HSh#-1M(U>XAbgcv)P1akPIhG5#sUzQ_PGRTTPnDkg})=u(m?bRy! z9yRas##VMwxi4|Yc6E*2JlL3*#%awYXvtxY5qYOs?bwa&$V7;<28CS%^} zKl^)%fDfd1^_m=*P#LA{6gbLC0T-xu=1vBO!J-x~WWW=DtHf}u^zINJWSq_0qPo4J z@5szbarQ9I5F?h?$RlkmDACZ{(Yunt`QX8!`%9870h#U7HYV4eA354S8-ID!l|J#I z#_5Aq`A*qlo3HPSopS;*5$ioiZQb`CTMqE9vH2OfWgf`J(d31g&S@#!bz0XSV#amR-AJmYLrfoh&}2 zJj4!};(VcpolaSCV?m>(TkG?;lbiyV<>tI_CWm*v9*lip)4_aZK@ZYwa6@=YA4-OB z3>Yv>w!*5$rj+x}vk9?52Ks)wC<93r@!9uhC=$F~STwd%#6@arE!d?n_s1{o(V=o`&So9;S4B$EqSA>m>JOFph=hsErEkV5LhQJs$4ad~6#dv%=6{bPhK&(W`M zg))k<3$j?M3$@SgV%p6f`P6wjU>{NYq@HrLv(s--1HgM|kvy@qtaBmuT-~i^z4@dj zX8psOwXuq$IJ6+$OBJbv&i!H=ch=*v<9K!VPyBPO7?yV$Eob2iK3gyNGx&xiHqMA{ zXFsSooa|02Y!-XK{B}XZqyMjGm!1r*G}3aNXv+!Yw3sZL0uIO!nF6D#cdR z9lf^C=j~%&$kw)LbZ1_UHhQa7A3doyeQ(jQ;;wmDcPkYR#V8*C8vrx+ z)gd8zn7wLD@@askcjn30%Kz1&KfQOv(o>m}6H$LUdNvo(MMgKfM_1}$?~|p`IJdPo zR)S_7vVnMh`P>S(td>MLRf@~cja|{%yTqHxoz}p`(t7o-6yxCRssIqld{Eqc^(do4 z)u$0l?YIIiL@FwO5gX08VOX~gQ~>ogKN*eld9J%!4(rXFjIJe*=QqL0N0$>H+P@z# z7S}AZ^VRe@X!<&PDQAM)_nlqFG3qhmx@-c+&YhElI(J^UkjiH4E24E&znsVg;6!u_FHdhMz`|fvl&aHeaA(n<0B~TvPHBCk{U)RKTqaBE z7y6E(NQNL;@0ZFMUL z&oiZcQi7iPhfH~5`g&_EQR#K^hg0qSQWTlUW z$F>euM_snHV%L2qtx0A1t`Z?!6w1ya>m`f=HOX%mMJG1=+D$_sx_wX%!|tmCBWamK zu6mVM1w?AA!0{LkeP^%Q6hQEF%c!w|D~vl&tSTHfU!jd&<*DxR09mKJ^#8N{_g@^2PMQv3hrVf?c*Wg!?ippkSjc{YX3*ygpn}KudFioT<1@A5^|Nl~A;SHl zsubIzkj}eIaSN(oxxww;Fz43Ho~Tqx12Gv%<&!oZd4(vdxcsS9Q zLhau+cON=Z{8!jQi-9^ysg|n3&oG%vP%nwT5At0cd(WJf4JZN#tboL#qoJ*E^TW-J zBjTgS@J31uYSz%rCTE!2J!4lD;0^)mqc-Yn1hJGt-LB%3rjmBh>4%*qyrW z^ErCht@r-8o|`t`T94Z|qR$CQ8N=$h4+RiyE#pqIBPT4f+BlBK*X4A}Xuwr&ZCsMe z9Xw=A>QeeMx$#%=VD*rhH`tcejvEaD-ikt+*N;};%o`<0%MUjt!30NltxVUc$PnxG zsx!Rylt6WW(%mp6W!WR(cxiwQQ2QK5ZP_X?xg@bWeXp<(auWvO$m@cs4s+$4kWQ~KhQSZOZmv;!w6ccKbl=JnuiY{((q0}0 zcMfiy?9cC=YTQ7?=BY-MpDZZK^EKQyJ#dI!_tuzUX9<&1$Es$SwG;0zMh-?@5~1CL zj01e;FuP#=Ro7qnIxj0I8&H{qg{=d6 zBIi^CLsj`GQ?8q|ZsTudg2ix<+LF2?Wg?)ddDeop{K6p|Ob+i)JEGy|$)1^R{v7Lm zj>^Jeo8_CZwv^c6U9>D4%hAi$(%QMqtwoJ_awV}1nb@x^bfWW&u@`t=)x;bf);@$! zHQ}*3AgOLQQSRZWJM(L%MZrub@o=B9cJaS<7I~*+zB7$(*0GG2(haC($TbV57cm4F zxn{Jw&kKEBAF+|&(VmZs4o2o{n44em3>GdRRF+DF2`aBTj~3AeEwNew|Au?gJVj=I zaRp^pd&9}xn`sET8=uwDiRtH9;eQ8vbws+{ylero$!@Rw6YA+|d*rGlh{UFTSQKP3 zNI&`vQI9Gww;ub|SgZ;HiKJ>mEd1bdOd_nGYrEj3kG$fX2JS`1hlZj~BELwvf zxA8mzR%4g9zSiPE!0!Hztw;yfB7+0mNXg~_i64|dbLRmcZgeu-Yx)wK>*NFDLT5t? zvb(Zbcx_(zsv2nA3YV3iUPJuqPB;LVO#kdsk1PLKpJH6>y{T=$2W)c?$Z1i{7`#+9 zOsy>&hF9Fbh4cpGRoU|%E%a<6lj)@I7YicBocm&GfVMf^ii!2!q`>(r9DUpdR#h^F zhK4JO)*JmD(dS%*vp@ks)z{Y-y0Xbli^j2kpP1mIR;g)1H-FdU$4({!iZ`KZJ3ir1 z>G4FW4tsi3$d8Qkf=rSIBY6Ef%=fU}ST1>Q9WZ-8;1rf#9!8`-NsOBKwR@Gprsd>N z6Nd;Y{cx?HDgUUL%r7kNW{JM;7Wv$7n695O64Ye*zac}I4H)GXoZ?8~YR&CINQPSy zU|K6c3!TP1*xI38d5iW-*AI^R^R{CemA=fBPryAD;M#RvMvRjp?g<|5PfDB z7Iu>*V>4I4^Pno&PoJv%$lm%QxWUqsCTpbR)9pv1UL0LF+h=y2%`+MqGF`rO@a#`~ z1x(wk-xY7Hg}?;M9(wFA8-IS8vcPb8$+&8<0}V1U8rQ3xS@1jwGat@UqeiipL`Cbb z&LPt;W=)98xBq9DWoSV`u2S<+}_C>2`rOiou`HUj0G zI5#rH*F_(%sc2>+=aa+5kBOo(R)C`Wp@fHwv7>{>{CU1%KB|;DNa2D_<8o&=3>)!s zW9wjZ`fEEV#t7f~(U~UyvEW;Q@*AsoCCe}z5c}gZta-w1KwExVdh}VY{^b#c|F&N5 z1%R{~${M5$z4mX-nKoP$80Lc49J%~cg z>Gn}+B|^vRhs2+;Yp-?!|}o|fBYYAWyq1Bj1ZZTk%8xGLxTr5&!wi^tH&X`2nUAmolop~TjVNg zy{Ozd(oAOrt;6}m@_WI7l333E+YZNmV6M&<2!`xWKi0JbS8J|;7gLooTuq(b#L!)0 z@Jp4A-{G(4R7=$!8}{(!6nfNZ=5uawA{!_xJDUijP9$#n-uTr0N+Elj^uGexdo_@# zh%76VOVWa79R60|0Db=;WRLNn!$G#^_TrPa8;@H^rBD-RRA~8W4`;aKgDL2St9j`B zmMlI)V#l9R55JL}SvIEAue#z^A`~aG9lf)HN@Q}od`>gNeLqr9YExeXL zDBJsNrv=8mS%{Af9If&NRi3PXlaxmIp=!#`B$vmpa;qt5Bngt}WK%%opkP?MOugr& z58w@Vq~2&xcz$ngjY1YTyAAOjjuAbp)vI4B`_k|&%&}m_U}Nwe#mKS!dSal@iP3QX z5I6NB$-=G9saX`zsv#x+dR6T0TwfOL;$qk!#&d#wD`P!$K`Mtr^77W3XtJ&oiT(Sr zs{9v34<5!wU6McP#!>3OVH??QXpnE(O8h9v5Mc9C7%+9!tzK}ZgcTEk27T~t=U2{Y z5XSUeN%fngl2~UTV9M|_SM}#Ee~h#8yA#q!X)kWSQ*kEv&&9Oj?Kfwe z3>Wk@odYXm{O!}6C!;l`*HQngDtPQCo7UF)7y;Z>!;C6ZbZgy>Kt();?2L-D=n~$< z90ypwq~EIc@GN_GS1vhPYCpa8IbHa*2L@iFiqcmdht1ePhX%0z*|IPR1CL4QqL_Fp zTx@zIG0c{ykd=sC-zT@SFEd!B>QM*f7iN{#s8ZPV=`V4T4tR@zt2!2tOzMwPyi#U2 zMkq6gim-i9ZH?|#c{eBjiW@hyj zzE!#ZBrXfGPE$@tt8DhZ zo;xCn7HZf}(xDPtp{@Oevg=urhBG13G@>)mSPu#*{kjU2y@x^N+Lr>8uyd3imQ=pQ=ct`A7#GiN#r69!~H?APvc25}Jm|StX9yhTElGk%b0ZWc< z*qcW*Y0aTiXyHru%i#an7Xw3JeXEz-7YsDBbwQ7dwYIia&%1xWXEyJ-*()t#Nq0|5~BQRKXaB@yM!N>~RGKDS!}Z@BPAK zx)(4;wSRv>v~gpl*EhK#xvf`L+-z^P^8te~a0vU=eSylvEaUUrajFbDb06jxsI`Iy4`N<%pul^oB&$t(seHwMr(bMeLL%)de zbq4V!?J)4qqS_JUNIhhN+p9E3MLqb~&%O@}K!de=+ne9|Q2xDERdS+Y=KH8usnsQ`tL|6$rJ zZR)!AnLCma-w0pTKmQ7R2mVG|E!K)FDf=HtpH})t3EP3Hk~&%25@gcNCebNdyR?tx0~W za8#RBcEzJF;Uk_w1|5)r>)ST*A64gF2Iq%n9LS`Xi4Y--9nSg3S0HyIWcxQRp;ur# z1A4|}=J%~$XA6{as;A#OCRkcri#qYbm+Vg}LNiZ!e`Nygh3Go!ndQR;s~u!FxblKn zRa@=Ko$kkVT>5y7si}@-=aX?H9M!cql%-|ft%;4eM8*W#8m&M09j^K~dq(3h{IQ;E zg~!QanB=QpnR#wHnGcl8?C=|aY#aG-xas8i9XC!C^YsD&_;6g{K0qq}8)v-7qjz<~ zm!V3U??F$-3WLE|pGV&Hj7A58_H9UZUuW13{Yy$~a*iG>T<9ShyFalJEFvfZ!M;E5 z$co|%^ZgkHiYwp+Fp~>$AhRW0MskR0sRj~(%sWf?n>Z07zW-S2FR7>TJ=v3S1J z&69Du42kktTtSO8ZAPgveK!WI?vK|rv4@~7dQv0+|77^|I!R-p*^jATA&4r7(`vLu z>2DW9s_X!=p;|qPqRH3ZXV4tf(0Z7W(((Jc_ZXy2IV~1R`{OJq#szj%D}Ls7E6-DZ zIZ6=TYP?xl>YSe_n&=MV(9ZwU-j|0%+5UYaG49Av6e)v931usUnXxyvP*Pb+))HCD zzAqKhB5Rf@B1C1$lKn2(GWMG+$&#hAuZ8D()g9Aw9MAiE|9Ox1c#dQIV-C)_uJig{ z=lNYfpYOQ^588jYaYs|DAha3=Mw!lPi} z7{}n=>rWmo=`n16x|Eb>FLGC!NB)T8oQYRDv(1;MQ~lcpG|_HyVUC@haWe(5?hY?K9OF_YKb! z%CqzU(Z<%%6FDTb(+MfK5eT7GHU9TQXTATwLf;{#It9w16u4{_QPe z&R$g8PzDGuREOyR)bDlFQUrVEVG>qY2IaxNlFh}q|zT%pc z^S9*owwB>K&)M1QObX8K=oRTST*mv^R#7J0TpibqWCerSg@!$U2PAzfI~)32d85?; z7$70++NGR?l;*}u_h>TXndS5c=@rm1l7vAB_q& zZ7X=cD4|e%eA5Xg<%TFoB4wuq#k$3N#jL1QZEDBpmCcH3&eqjWw?5ZXY@9SWN+s!C zQ<;#YRU+@SzNy|tz&)ST;w;hc7?8TM?tNyPk8e}cv4ts9MafQ3B-r)Z?pybAYo^Gnu% ze2ndw;(_a@?*%0dREKka`G8a!wo8fRP0Z{ly(7zL-6*H*HOqH5r!l{*W4;!gCd21R z_H%F)ol=#~R>I58_3xb#x7O z=@v`Mk@&$#pTu=*ur>~_u&!6XASK{eQnU4D)J%9GPYI_3v2r6X?uRHI0ri&9yh$}T zp@_K`(ns{ckLMDl#k(e*q>vV@0f~BF89I!jWYzYM!J+ZZ>Vd^@tm(E;#Xj}j!JSp% z<-7+j%XEy_7Z-4Q?RmrIG_h)rIm3C&1`Fut?6oZJ5-o*cOMk;Xb~H_s*(v?|6tuhD zRYwm0_T=xJgycZxsUR;`;mHqutNEW6C7qhfZ-y7sSkOIygrfAQI??{{&d!3XydUyA znWsG`wn32+S~=$zrzT+ZndLf*@XLF`nqmi@^t8mL;nD26&?9I2B& z+CInWiIoe7=TTb8O-#YWevU`Oi46-3*mzILk)!J~F@%}aM+V(qIyf1u@Pqhi(pf>J zNADg?MMm*BoNB9H2Z;x5&2|o=GBHBr>cnVGJLZ=&i%+DZqf>$*FI||bW+N=)S!!_t zod?e5^^WKc7jXNL3jCg3^**{?vOjgHi3LgXqZsp0QGz~!^cPc+cEl^1m&zWk9Ppd`~>pN;zoO9K4$=*WhB?S#jnMeLGf|f)0Daa z=WHFhW211Q>_M;7a>1O+6Iye!StX|iyB$Na3IPz{&rwmNF!=5+pMPi4!4NwMkC{YO zbeD(Onf2WbPqG2)^z}n1GuAb?!OvGac`h$m(?Zl(5a4n{ifA>Aj#nF5B;8=9ohwM zRyq)F))SUkzR94GwA3Z1UlG&EI|=hGqY&230?FvJ>>6j=C!**EDGO~!6CPvzd+vIGOUjAR|8tKu>ycGwAHWLh7azGa34mR zZavTn>ll~(+kH63($B=!pM;?;am|`F>EjvjkBKK@a^Z;Sz0uMKgf5z{PVtK?ITA*U zw&JTGuff>Hkq-giofDQpTbK5}&?v2UaQRxzy|!45Nozyvm(3=-7_r*T)0sNz_W}O2Ndd)k+ zVNw;PNfrWt#XW0}ZHA^V91piQUM8umJSEJ79jLGNR8Mmg=c&^r^=yv zLJwdwQ6Qxq({&6dnMzr8OpBSlpV)TBR%OI6{P<@UBi;Ec!BN%YnK~=Y*yB~CC}X#$ z=%BGLbx5Kqu6Onc(PAShJ*<8AJx$3V>s_&&0B)C$)SWNQ3H<>sJv;Q_4WiO>aLxjP zIk;VVLCJ}brp`V3^^g4>3ndHdu@)&BHrjJr@XkAB%nsF_SFa!u{I%oc@LMdN9p=*y z-e%03eLfAqOcp_7x=R32s{@cqU77HBN60zHFg3gEclowWs~Ql?H@ERStS<517kB_j z3ik=7d<9ZW5<@-TtX5^wAxvDj2kF=ubJ>~rdt=w zbDaT#5Hx0-VPTQ>{$-n-VnZphXh-U|4jGI3=vup0I8f$Chxbirvi@$`!O>Fr;xE)? zjI`e1SG(-RgFR!|DqAKCAUugO0bxK=9Jla~88eb~m6_gByNo?QWaaDK!+0oi7kzv3ZV38*_yIw3oG+!)IZ(ux`a1*ORZRbad z)_QiWxKmVrQ`2Mu5t3zC{i+j87=RQD!f7X01S^1M=T~B!$1O9Xw@HUdaZc#YQ(N^EcIYqWFWPsJc6L_x-ROxJ;Q_ zN;Z<_u=9rjtszzYAe9$Qzz}d&5xz?D2lv-j$rVX)1&zUL(oXfVUVNHb8w{SXGe^lc z9vNtp_z{5Ba<--2s@mQilZeKvh$=K#SZOs(>=$Li&VkFku*qD&YP=)>ii8GwDgorg1sL@ObvZNS;Mm)1hd(m}PUk zrsK%npfpZ5aPbtz8Ffn9xo-WPko0U}nI$0KSd)W=d=35rJc93=rZ;3`V@a?Kwy`(2 zxM@RWV-XPBCr-3}hS9Im+!hdPn8+Cr+nFdpYtC+^R~NTj#emlnrQZFAS)<(?%@T`| z(&RCPy>BBlRP78p%|x@DBY{8td?bTf6)w$~dv&BY!9pc1X4HCqm9cSELR_`M7#z;l zq6rRg`r9M#lJC`W9Z>tdf6olyCh*mQzyM_tU7=wP%pug%Ahp2 z(4f0C`9*uHQZ2S(+XxNLisqffx`TwQ_!vMjH)!l1LDBfb{(sHXMypX^D5EFwI#iy^ zFV-@!N@tr>WKg1;usC+bbqzshO7i{Tez3qyXx3+vOX$~W4Mcz!i_-B&AMADMVL3YK&<%5q?;|*m2rrp;`)#hT?zv_-2-D_M{P@D(1I9psA zx^?4mscCN^%a#vWwvqli@eFR$HT&woUKpPE2Kcg!$r9n_>!*qj%9fZ!USoV;2wsog z9yy^MU6K;$(9<7c#qq!e_>ifr%jJ=EFCk~ogB-K>ytX3+40yg%y?u2I_?2gJe5xCc zVYw=-5$=rl(c+>YASa-;hxB4->_E*QpNJJ1EjmGvRCQAn-{n6cDg|jW z(IYMTZtg>+BJnSz7fUc7ztlGNGd9S#rEXWyRytm)u=p~9`6|KW$)nH0DB-CiW)nX# zR!h%^zc2aZO=jY`9c+iWl!j+xsS2Gk`@MGbJzkK!@YZH{jYO&_g3`1#Ve%9OI1eXvz7{o3h!njaom1`J2NF<{)KdB~9U0{i?|0I(61ie|nC(-8+a zb23YRd1^vh!S-T3Nz6*vKc3`IuDSR0j^TyDnSHsZorAFB`bP-PEJ$<^O zN!(wyF{?}r`y4y$3It!3jobkkc(nA+PgmYGcrks|`I3PS5G&_aj|y4>Ts< z=2%CNSlmFZ9?K1WQWwsOL9?bbPLZaf86b8Xg$FY^0%B8!0weu7o)%(SY474LpZVIl z7~6m0>T`}ZxdcmAY-;j)nRd;H+vg z8`5!BXusYg1(s<;p(Oi%q!(Ek<0}kTo+qDi50Elbu}a}cQ?x7-<7wepc(LMVLeq3CqOB*QqrIR7PjqQ!m>FFMQfYmE+s0YY|@&E>nL z{6gl#Kepa|#F4ZlC;jG&^qD6Pl8_WjFc{G;l*0p}v$8__jksEH(DM{`AmT>PBP8NW zKykBEKpV@LG`hc&dnO8|bXn3O;CGr0F&KwHKh}Qm!P0F$BZX>cTs>%>iJs6yPSFdQHh>i55Knz;Imzs*Qlx~Ay^AN2bL-J+zxj2TSnN0*v5BjI6HGqX zfUa{U3Af1&S|=FlhEsAQOfT4W=ic zjesybV3(h=xf=OX>zn|RVALjGMkGD)T+oTZmmR)fTk%M2FZmLO1-=_wj)3N)(v?kE z>G1hom8MZgCGQSEI%#Get%q3l6m&(rL%Ycq?sgxUF=PF} z?{p2KiZOa{`IrOr@i@#rL@UC1UJkYUQ*W$xks9C1k0Si!pKP(t4P0sUVvv;H_<4k5 zcG-|;(@gjdGVFEUmE2V?H?y2?ygS_fC141W`w=%#IKgaccwuU?D5S%T+0%0nOt5`x z4D>NN66xVy@fXL@@us(QMBI%+!B!I2C=sy__j06YGHLrwS0*OV9HJ7tf$w?@xu-OtMU@ugkIMA^YixZa(qZ`U}}poIzS0neur z1LS*v8lvDKxqlV2igRHzQMC=ydDg}KKh>5&bUz1e@XC%Im35Eg4Zn;VzCI_%eMPGw zkodr#^l99IXK+aDa9Owf4hyYaj8+B<>U})B#b$1Ef+||xm0Kpj9Ylw-iaID7koblt z+t}UpyXnqi8};yaKUBV1+UVJ4UHuIb`D2#=+lcdI=s1fS7OAg&(fbg$JAi$HB{s3g z&|Jmp#L=g#6?wY`KRE>Nw0`dL=5JEM!<5ZJIbY~7sQ!@Om4MjH^Z#TL3t3Wug3&fTHIUZw-ymCGs1CXE(E;lE*rmui%r zSYZ$+Vh&^_3A4>aS@Jzj(ud9aWO~}3b__tQ!U=hXMYOMrY@W&C2Y|YKXiHwL`lJ+Y z2BI<}VrFFb z9xb|s*wTABePBz!bllj(OQu+`1F)EOS=QV~TSbEyQw-w*XPT66X=#fpnmEFu4~Qd0$TE6A3fB=5?o&A`yjJ^HL0s zn%gjZX^3&n@I|c65mW<4$_QU>1}`T(q>)6XgC=!A&sIGWAN;ZfG?#@5GEFQWGCATq zak8sn%aJ#0a6nn11nH5J-p$DF+X}<<9;coszpEO8MA+;UtCSQ8&n3)L3VJdO+Pc^V z@HTGD4L%vbmyMooUzt6Q3BirjJ`h3-E9NpYqU{u9jb(7(%YWOq+ugPWfv z-U=lS(L(YbX?5)Tl^|NOm(RpqLw+gC_hX;vS$W-SrLWJPIMg-Qe?@xmj^ddtc1D!% zDWrYS(3qGM`9ljLS|A?L0)|`g&}7=&b+oYByrMhax4km)tI)uLcOE*_YsJ9Up}yW5 zxQzleK;eqUohX7hatNm4D*A_{_kpAn(;H65vq0M)q~Cw-OrwJ6hgWvYek7w}C+i<- z9OBb?_(Mf5oobzyYgNf5B}VU$&1hIY92KM~1^cwTN_WVMY=S?KSC-Km+RlQ&^N=p{ zkDqk!qu=eA9oqAi%5`bz{Pg$l)pd&A(Yo71Z*xi>zYV;u(UB2*rI;(QYH@-SE&@`h$AUw$S+_fUVoHX`tU8A*6Wg&}&3XpI9JaVS__i)6IZI+_r9QLGRLY6irppl=8u7$oS-v)ca< zaG$Oh4&7k#juxQj5^yO0c0XgQ4V*yYu-G3QbuLGF`Mph4)-Hk#8L; zr_UjE`E)17sdIGYW$xq789|72*g``}VC&7j{K5#n)cQNLgH>B1EVrrgCDOzJIV$CB z?{uWvIj9Up4cwN^s+TL|AcBwQVc+>dXu;XJ#vz8U0st~Ocn#@{HqC63wTXWUiUa`6rJ6|LimBlGH?S%4!wAu&2u>s@y7iOs0^ zP<`)Tgn_RX0qhEP&nI}_h+A&)jQUZ4H{0qhs(ZI!Cp8NXYDki7KTuI8!YcGkmojr! z`3cGJ{nb4OIm@M~M4nk@BuPyZSm`fxS3C3kNy^Io7i#8kr#tyurq5f6sBtl(L!uI* z82J3rv!x#82UySbd0)L^=(XBex24~5YNaC2sO7H;>n|x&T~R^;Tj`zxd0w?B#a%_7 zHr^(G3(4!8$TokSe`sI#lO%Mlfy>Q{7!lNlKxv_y7O1ITeZheJufFvYQc2Qy82w>a z>%88|on#010FnCO5OY6*I6<77#)jJ=2kXdlelgL1l`SwtG4aUY^2eoJgBRl2WRjnq zGdXfD**$bCll=f4QI|E7-9spJ378C_?L21Bg&8||bX34)?O4YiA(GnY42IzJ6n^wG zo7YDlzS}+PvsX^=>5o)sEB&Y{tP*Fw>f3Ml(0MbFI5b_TI_!Ts1nk?b;cw}(C`oZ0 z&9qC)W)_vPF;Dq@EEtaAtdcwKhFn72&RhS3+X-M*U?Hp(egRtJ-EL@<#199MTA8AY zG=`<@Awgp(o$SvJrqiwk?5&H`s43xrV!aObNB#r<9Q`^$)&Lc^-G$MZi0fpIJ1kW} zOX(1#*_PlbklwZf#6e*8;DfxrTxm!3nSB16u;MT6#< zeGs3`?C|L)^S?jFfR}E$*|OjYOeJVsf4tSjF-^xB9lN&hgJEh&J8TDw<569RpZ(99 zcZ4lB{*Ho99hH>tSZmfBuG-fNy=?ktmvt2UWC;tpyN_|*gie+}IIh8Qgv2cUTV8({ z+;y8~^&AO*n1ViCMPblLF`J$H2-&=l?hmxY+iaoVmLVNFrW((|Ph$-_^@$O67g;`o z%6Bj9^82k%glP}L2Vr6XBQ@;>uuN}14Ooz`T!d>4Fo7nc^$-dJTqjbl5cWH{19B%B z%;mkV+(4fckP9^4;qk#9gmI@my4QgY$P&2?w~#q?sAxPGhH*PvM4*y|A?tQ+vlTa) z2BN(OYDrT!E+73IKI8>_5~D@m0GI@4NO&BX@yC`QhMiXZm&)}OFwt|5--ojL=EBpo zWKn%37YX(rh(z6{g`Fl6K1AxA3!>Z&+-d~p;>?4GU|$>N4#Uac`Fc<j@Tr4E6mz*Eh$sMGM_4E`zy4eD<&cwuj<8^|U65ge^Fv(1l-y%I7y0fZPkGXg!Ll zrI=cZsipXL|2laT|Bez=P=X5bu#FPQQX*MOBuh!3P|_#==DI04J4((D>BUIN*{v6U zD2ZZ9qL@;hpj0O))ro)0_y2pU6SHft9IFeucArEmJJRoor5|VE72D#as7UbaJM}Dj zVyWG*?L>{mV@m_p#WUsTW#>($+CEg&G_)u*2J2H!pjI3q*!J<-3!0+j0;a`jXtQV; zi3T34(d%QVe4~AMBu+&a?4k)Gg(VoNf4l@=>R?)w|9ur0D!Q4GD4ORPQcm>YnMKz& zqR<7bhXRbJmY|IK^G?X+F2Ds&pZ|0PwG)5D?Ha#tHhjtC$j9#+BT%om9||aKofoDF zhOvr*3Vhg)$IH=fZ$5`JAoKk-sT&MC@n(THi+M~@JtLhDXiM1-1$g!NOl(^pftl2W zXVv}i3dQx;PCPU5M<|uA5X_n_Q9cgM*mxXUz%=7W)Ypugz zKL&!C4t#01VN)@adT?ol6b5P354h`?G+YS}U&D7EA-~doFw2R}0bDS)7v>NS7CgMd z^ETOZwBb*Q)8CK!nrvA-f-hmDp*=tY9XZbOr#~dK^PyXI;;XrRX1t%kL@eid*{EsO zL`+e02gq)g1_BY%tdZt7Ma8FoctP6?_jdBE+;~IL;9_XCef{T_4^M7$1YCY6zJyGA zaN{7-aXkkua2Ha?t{wEv1wY0padKlCPv9~1oMrPtg3l!Q_fgXX>DX<&Pb%MkFRTaG zd0MoafDtx@mU#P)t>43UKfH1Mp4-oU%~ajTho^Pdx(>x)lYU+Ja|AdT=~t>*)!?aH z<`^~{FjH`DWKO;^6Z$n%R#?q*bpJ^N28TJ${>B1O#6ejRlubd=3l!Bzu?`diN%0XV zZW6^)q&Ulzc!3f!QKCjl;7rLKP|_!q3=$=YM#&>mQmK?|GMXX+iU?2?5l}<`6)=h} zpooC73Md-^f#*?l!T(wjC_QO>M@2<_U0n&MzX5Fge}g-qU=98o)?ksoL-QO7)pJ^g P3Vzg;wUn~(rhfkgiyR-t literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/BasicForm/Index.rst b/Documentation/E/Tutorials/BasicForm/Index.rst new file mode 100644 index 0000000..b9887e3 --- /dev/null +++ b/Documentation/E/Tutorials/BasicForm/Index.rst @@ -0,0 +1,219 @@ +.. include:: /Includes.rst.txt + + +.. _editors-basicForm: + +=========================== +Create a basic contact form +=========================== + +In this tutorial, you will learn how to create a basic contact form. + +Let's define what we need: + +- contact information from our visitors: first name, last name, email address +- the message from our visitor: a text area where they can enter their message +- an email to us with their message +- a confirmation message to the visitor after the form has been submitted + +All fields will be required fields. + +Let's get started: + +.. rst-class:: bignums-xxl + +#. Create a new form + + Go to the :guilabel:`Web > Forms` module and create a new form by clicking on "Create new form". + + .. figure:: Images/1_newForm.png + :alt: The form module - click the button + + The form module without any forms - click the button to create one. + +#. Choose a name + + Choose a name for your form - something you will recognize later on - and click "Next" + + .. figure:: Images/2_newForm_wizard1.png + :alt: The form creation wizard - step 1 + +#. Click "Next" + + As we are creating a basic form, step 2 is done automatically and we go to step 3. Click "Next" again. + + .. figure:: Images/2_newForm_wizard2.png + :alt: The form creation wizard - step 3 + +#. Create new element + + The form editor view will now display your new form as below. Click on "Create new element" to add a field to your form. + + .. figure:: Images/3_createElement_1.png + :alt: Create New Element Button + +#. Add "First Name" + + Create a simple text field for the first name by clicking on "Text" in "Basic Elements". + + .. figure:: Images/3_createElement_2.png + :alt: Create New Text Element + +#. Set options for "First Name" + + Options for your new text field will be displayed in the inspector panel on the right: + + .. figure:: Images/3_createElement_3.png + :alt: Fields for a simple text field + + Fields for a simple text field. + + 1. Label: Enter a label for your field - in this case "First Name". + 2. Description: Enter a description - something that helps your users to know what they should enter. + 3. Placeholder: Enter an example value for the field - this will be used as placeholder in the frontend. + 4. Required Field: Click the checkbox to make your field required. + 5. Enter an error message for users who forget to fill out the field. + 6. Add a "Non-XML text" validator to only allow simple text input. + +#. Repeat + + Repeat the steps in 6 for the "Last Name" field. + + .. figure:: Images/4_lastName.png + :alt: Fields for the "Last Name" text field. + +#. Add Email address + + Now add an email field. Choose type `email`. Set an error message for if the validation fails. + + .. figure:: Images/5_email.png + :alt: Fields for the email field. + +#. Add textarea for message + + Add a `Textarea` field where the user can enter a message. + + .. figure:: Images/6_textarea_1.png + :alt: Choose textarea field. + + The "Textarea" type in the overview. + +#. Add options for the message field + + Set label, description and error messages. + + .. figure:: Images/6_textarea_2.png + :alt: Configure textarea field. + + Configure the message field. + +#. Send an email on form submit + + When a user submits a form, we want to be sent an email by TYPO3. In a form, + this is what is called "a finisher" as it happens when the form is "finished". + + .. figure:: Images/7_addFinisherEmail_1.png + :alt: Adding a finisher + + Adding a finisher + + 1. Click on the form name on the top left - here you can edit general form settings. + 2. Choose a finisher on the right. To send an email to yourself, choose "Email to receiver (you)". + +#. Configure the email finisher + + Choose a subject, the recipient, name and CC. + + .. figure:: Images/7_addFinisherEmail_2.png + :alt: Configuring the finisher + + .. figure:: Images/7_addFinisherEmail_3.png + :alt: Configuring the finisher - part two + + You can use fields from the form to pre-fill values using the `{+}` button. + Here we configure the sender's name from the first and last names in the form. + +#. Save the form + + Click on "Save" to save the current state of the form. Even if your form + isn't complete, it's a good idea to save your state frequently to minimize + the risk of losing data. + + .. figure:: Images/7_addFinisherEmail_4.png + :alt: Saving the form + +#. Add confirmation finisher + + Add a "Confirmation message" finisher to display a confirmation/ thank you + message to the user after they have submitted the form. + + .. figure:: Images/8_addFinisherConfirmation_1.png + :alt: Choose confirmation finisher + +#. Add confirmation message + + Set a "Thank You" message in the "Confirmation Finisher" options. + + .. figure:: Images/8_addFinisherConfirmation_2.png + :alt: Set a confirmation message + +#. Preview the form + + Your form is now fully configured and ready to be added to website pages. Save it again and let's preview it. + + .. figure:: Images/85_preview.png + :alt: Preview the form + + 1. Click on the preview icon and see a rudimentary preview of your form. Notice the "Step" headline. + +#. Remove the "Step" headline + + The "Step" headline above does not make much sense, as there is only a single + step in our form before a user submits it and the headline should be taken + from the page where we will insert the form. To remove it, leave the preview + and click on "Step" in the tree view on the left side. Delete the word "Step". + +#. Save the form + + Save the form and check everything is ok - now it looks fine. Let's go and insert it on a page. + +#. Choose a page for your form + + Your form can now be added to a web page. Go to the page module and choose a web page. + + .. figure:: Images/9_selectPageForForm.png + :alt: Select a page for your form + + 1. Go to the page module. + 2. Choose a page in the page tree (for example: "Contact" for the Contact form :)). + 3. Click on `+ Content` to create a new content element for your form. + +#. Insert Plugin + + In the content element wizard, choose "Form" (in "Form elements" tab). + + .. figure:: Images/10_elementWizard.png + :alt: Select a page for your form + +#. Choose your form definition + + In the plugin tab, choose the form definition you just created. + + .. figure:: Images/10_chosenFormInCE.png + :alt: Choose the form definition + + Having a separate form definition allows you to insert the form on many web pages. + You can then customize fields, for example, the headline, by using the "normal" TYPO3 + header field to render a headline for your form. + +#. Save the content element and enjoy! + + Save the content element and view your web page. You can now see your completed form. + + .. figure:: Images/11_finishedForm.png + :alt: The finished form + + Depending on your frontend, your form might look different. + + Congratulations! You have created a fully functional contact form. + diff --git a/Documentation/E/Tutorials/Index.rst b/Documentation/E/Tutorials/Index.rst new file mode 100644 index 0000000..f708067 --- /dev/null +++ b/Documentation/E/Tutorials/Index.rst @@ -0,0 +1,13 @@ +.. include:: /Includes.rst.txt + + +.. _editorTutorials: + +========= +Tutorials +========= + +.. toctree:: + + BasicForm/Index + PhotoContest/Index diff --git a/Documentation/E/Tutorials/PhotoContest/Images/10_saveTheForm.png b/Documentation/E/Tutorials/PhotoContest/Images/10_saveTheForm.png new file mode 100644 index 0000000000000000000000000000000000000000..177fb4387a30bfb8f9f83ab73017f38c4dd6ce59 GIT binary patch literal 79277 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

    )VC(Y%rHf>X&B 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

    t!chuL7<|K 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/11_selectPage.png b/Documentation/E/Tutorials/PhotoContest/Images/11_selectPage.png new file mode 100644 index 0000000000000000000000000000000000000000..f55022cf1270685740246e714d2a1e8c01e53db2 GIT binary patch literal 61818 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/13_chooseFormDefinition.png b/Documentation/E/Tutorials/PhotoContest/Images/13_chooseFormDefinition.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa445e0a6dcc92a552b1f4772fb403cdfde4f63 GIT binary patch literal 67407 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/14_frontend_1.png b/Documentation/E/Tutorials/PhotoContest/Images/14_frontend_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3009d0bd173f824e3263f64c0e6f2f3269bc2000 GIT binary patch literal 44597 zcmeFZbySt#)-O&88v#K9Y1oLOG)M^&8FiNO1dN@rMsm&H?Y~8 z`{4JS^9tYhJ!AZSlO@lr^^No#Ay{T;=!_bQAk+&>CSw%9C;c+0$)@ag?eLAPdA zHtB-C>2^GibdJzPM+-8*m!#dtGN6lBVb$xl?`E+V>U$JP)cCM;S*KeyoF5PKOSWp5 z_}yQm#ovkb14H8QN+lR+Ny|m3yAq#Re;aY1t%2F44vCpcZe*5RwkW0Mq$2qGdDhO7 zSC{kO2%P=G-^V~k!-F7Q`w^#pM~I99N4@s&YRn)e9ykksaTNsiLPGiT2aJNoi+t_L z)qpHQFhpGP`>j7m{(ceS1);jJCIrd590d(z67cQ%Uap3L@YYcOHb=OU7ZNqoU80*? z@j^mIasT@qgSUaLKUzfj8?j(W8t&ibfT$s(_?5rZxIrfHUo_Cs-`IjD&H(WWkMYO4 z$w-J7lDEL$=PgLO{Q5CmE%hI!|A*=S znRPcG{orypK3$-K ze<))#R5`OhqTr&fO--p%)J%y$YR4$0zkfZ7Vq|a*e>d+HCv=ovYS(9=*~32BOkUYF z%w?AHr~lbco&?TIB|;`9MUjbDgnd62_=Enbb!g0h-V1r@jP%EA=ha_UD7ERG)(h+@ z*)i-L_@8T=D!lQirzb+Q?P!))q<5`j(NgJyV;m0^i6r=I%VXkQpo1#4@_iI*E1;#z z33^zy#pYhD7iwjpo+`zYk$LAUpcObCS(YPzgW^=`uJS{!cd$<-2OWtDjk=*7{bHPZ zTS`TKOHk;dP}`_jd_fWqe$!Gx12>%-%e=6NmS_JSzj2)C zN4pgB+W-%#dm%O71rzXnQ?Dq_Yx;uT2hFR6Ki&xSXw7v_v|F5@Cp<-Dd-(89iC2;C z%;k@!%PLatC~jK_O*=x0%y#8lr{orVgpV~@ef*Xu-7AH%*?pe~+LNGxN|Dkb(XOV7 zTLuW2&~fVK&j@+`eQzDaxnc6Sj4`H5v4R(C+Niyv={MG=pH=TGHxS)&$JhjGc2yV2 zg$ZaBPhlA{7#*R)FH)z5>qb|zLvmU(i-I>*rn(%7TyG1J`P zSJGG0p99|L=8&1n_fpjAOP%5}LY!(<4a{(jWp3p^*C=W@w%>@$?-vX>nytEHiuvNa zIZgGWc2%C?F|&Q5Z;0>+|6E}p1EP2TG{yQAmwNuI`k_J?B_DX{6WGY4{`EGKW6x1I z$8^yLdrngd4)i%fUZ={}BBONAV{1la)G|jUDGkO2tlY|%WWw%TxQ8Uned+rsK4c`Y zHF)xs*PhtD4Fr14kvBb|%zT_@Z4s?D`>8xjD;d_snY|LLB5-)Y+>NQ|#X9~u0V88~ zmE`?od833P79XN<>C{u9Z*azC;m2U!h}Hm9@d0s40&T=>)ed;M>- z-b-W}kI|nCprT2PK6)%NHEI8DB-%22pI`6WI0K!wB$0^e6B0pN|vc8LRsJ|on`;DPO}^ekxz79BKLQ74Ko0aU@$}|3^YYFXaN^j<0ku+QjyAC`CTgv&@jNoGB-} zmzq;CdBsD)+{1RouiH}ehQ2@jJiglWvcPqgB?uMG3@N(t%?EU3=+tK62EA6i*sx}Lt z(>WW8B6-{*>|DZpt{NRvwIjCa+N~=DORDrLGFgj}w`V+!(&5LW+8LinJ+>OtLQ>3r zMluzxaH~dt>=!vv_|nrNUK_7lr!`dj?dMQ6;qjWni_Hl|k2*B8tCVCUh#}99T5GN3E0afs*W4FC_ zKt(d+@}uMDn^kiHID8n>F~}e9PP z3O!kGI)6OuZXyGhOq5I2UpVH=oH13Aqd82jXi#0{a!N&IwQ;D8;WuO?rI(q>!*-G5VG%u;VdOi%zoIDa?ei$oA$Pd3X3-rgHluz0DOX>V0f~P&knK zl<(Hk!IyI_7p0iU- z4I$pP7_KK%<1m)OIZo(ubyk^?Rxdy9pmQ)vRn3}om(IV)=(e(t4My%l=j`BWwb=x- z$C^P)(WBc9KWj%Iy?sd$CKAigGm(Yg-@z49j!ioV*EPezODP&{J16L0E|o}ZL|RCj zYkHf`WO|3JL!%9@62VD>yp0AZs`BO=-Ksq&4+v$RK>3B6x>tFc>h z4d(_(?RzJ(OuJ=+5L}cLdR}R-DBOyaMC1)nC#=yy$6;Z)%cWelf#%fbOEN1$K*qOk-c6zWk_dg&Wfxz(dr`C_B+of$4_U5&= z3nT=PAI>($3~%a>h*-=GZk#uS_^m@;YeiB;2}^4e};a*Bpc zbgR~Ah}3It^wG&J$AsjoB$P}K;0}+?rfpjfsU`C%nk2p!a9QwDDlrSiW(~G-uCg5d zI=-_?6X{n8anFEA`1NijqFiPw-y;+qYMA6sIr?-rL8lFu{)DAy+AD}D^M+Z^NF%O(5 zKO{kZ>l$76xbtxgt2hF>2ois4&$e_MFGHlCLjXTt0in!o<`BAcgjw=syrw$cMzOq7 ziAf=h4H!t?7_104?G340xiYe&BA1MkM<4&2pELGf#TXs^U^ZRPKHY)P7h?q3+-eDcS_$+4oPvI~YHnibhC4s{jvUADqk<_arFEBciUnZFPPk z6ZQNK9y5;Fe2ZXSHr;-==W7XHUJEjJ7Yxv7Lt^7eS^_r_-Pk_U;TlMqTojnZfK%A-X7#C$U&&mRl0A3S-e91guq0kG zlhnzfKxvmVw6n*J{l$`he-NJ-%R=_sd9uko_;k*`(oPFel!^ooY$*8q3h4vvH5D%pxc~p0vx4QtLh5s(d{zfrZbiD7O1|Ybo{>>uo_gQ^4I4DF#1hU{jde! zYhYk#A^UJXvF5R1_1KiP-({3tVp)0OX=dCb8A}KaKEHr|4c^vUZiBBZc-`n$4J(VUZuNIom{VA;vEh-l&~Kx_Aj7 zpw@g&6-nr zI0^T%M$CP6^5~QD1F}mJG1F+l*{pNI7^|ToGbJj%+*vCkXGhu+>ES}u9p~lzxoQap zEJKkTZ`fL*&@Iru-W2)Jn`eh)K5lgf2fWjZi-!n#Z1LmRhj%FNH`nTfFz$SVOK0EAluqIG(I`&c3bT7-{F( ziVqGx^bL=tx#FpQHWIQA4P@_-DXi2)Nf%$BgJm$Lx36%sX~wlbZL*cjwpF zt6>d;e2;XpUj->|oIE;9_>`zC=<9{z_q|FX4;^dNet@#kAEw#Jzk}2a%fi&&Z0?vh zEQDX`?5&cXiZs@Ej(%om5p&dO)I}EdriTuTj-AyWWwsUFVpYeK?zR^!n?bm#iu-R4ry*{~z7eA5^D0Uym1rFpxOgn`^XACXB`Zt1Db zL2fVLSsb(bEM1L1{cG}i=m+xJnK*5pVtzciRGB48FtO|Vm(b8J#dA<6uYp4h#jhjd z6fe6TCY4(@@l-;yB;OaJ+J@od7M6S+ZB}#CPR*;#B>gm32Cz>EU?2OF4BY5X%DKx7 zuk2mdx9Jfr>Ow)H%eNJ$&DLqU?bcplrY znR)xX&tXhkI7Dc)C@8SJ@S6-3pLWiQR+Ughe{&f|<*qb=JExKZ8mPCvB0_U2*%QSB z_xwRUUq%X*rA+U_T4~W?*T|O=t!{ZKv)E(ej^t$18k)8`hfQ!_si40y{Nm1@8^88Z z#;J=#7{9DW_XEh6Qhkn3OCN7w-d z*p{Zr+A)9NE)F6?y`<7{!V}Zx&SVEaYV+6ll)#GhAFr6caVc(#*)O~dxf3TgQf>Zu z4N5ecM+y!GvLataQ?4+Y?f`NjXYJC!m0l&w3xDAyBmB~UMZzR+owG{zOrh6xW?5Jg zgK$2z@Dh)3-N`dz^rz~h7d4#H;(1E(| zePB2h;0o2Jd`Reid~Qq0`2!p6awdx5FXE&BBEEzK6ywPIRVsFSXVg73C8Qg%q{!@|n> z9Rk6vW86OY$CMoO+s~4l4m-ui94ZPk-;~8`&NV#B=jEcWCg)r|mR;nA5DU~ws)rt% z>}{irxS9)_&bEFP6BQlW>wu}Qt{&qz_z7)1FMp}{F~mTM(3Dp>XOUoP@YETt#LQf* zz)~RnlUCwSUaT*aLMB-8?9(sz-^D9Y1)3+B%peUqUYeH326Qx#(9QMZ9}6Jt3rv+b zUmD^w&lL4NmdwoQ`r`MN4<0l2+t=xr09+$RMeFCs)8`@MYa5U?j6MG%Io0iu=Q&Hh zJY6aAu|bn@3CX)TmTcJRNV=X!C96KUg1)Z39@Pbb!rh1Tc26O?i!vtldR8d2SXpcCMcJ&xHTEZBPew}qmPx!$ z6rk=^iUw-5l<(cp+-T6Rd*&=-;-;s0pz^Ug(HX#*4Ov;cd2-)f_$ZfN=H#oBpJlV| zhd71?Iwr}<$9Hqjwr@5n-kxRTC{q`(ZaO@AUxrtfzA2~v&@b?~dyF!Ag+oP`f zT!&3^HJs!sY9;cn-P_21rBy8mdJB#hfdtg8PAGoea8s=cHH=_$9iimcl*KX)ONXYX z8opfSCY)1zf}gCK;ShA|Uce1Jo!-$dLTw-XOh9I+HplY83N{cJe8R@+JZm!Qj!WsE zx+PoTSi;40GS1$rB3G6pIyFVptaOE1HXjt#oP~{kvDM1HLs_I4ad#p`P}Vgn>IiSRO!KIzcw&OIK2gn7QUT8(KR{|e>8?DeaFeXak0tCj z4jsS+{Mf64P^ul7%SUuZqM@QJB(1ye&_V42cPQo>)Tguq(5S0}xYq}Iv+21g9rR^p zl0#e;W!_|6_7}(wLk;p?ufGmlS=Q%QG=k0yH&Xpo2553il`Kx>q}z!9G2e0j!?aSK7}Z~O0{GtQc@BPv zX>bbqC-z1qu`uO)u&?U<^(UxjXZmQM_MFm3QlEaO$chG4n=A1=5&a*^Fz|PYmJ2r4 zFoDRJAwpW0gs)bTGps^H7;UM(nv9j&@t?f_X$m8_3b{^i8w^(;3IwTz+2^vf@Dm}!)3c9Py)b9({2hMM+u*ypS5$dJj&lJr({>TipPJ`*9wT*hYD zSyW_2?}l{3EB=4P!KowED$IIqQ!x9xLn$9>q4M}Ns%k%axJzAE;h0Rn&_v&7_QrVt)N?v@G z#Yvhh&hL#v67B4Gb5mA$yYoOW6{fG`kaWpccAd>3S*DjY>3od zCX+UaCpD+K`0xbcU%A~mMZt@ZO4JG!v?@LzA~I8*AT3grP1C5dN(VNux`uD+wxf8A zEApZBs&w+RbpO|$SrM-deJQHTYpwJcL7Acr#SePAd9B}2{KjpASNYcl`tf19SunJB z7t@>&e~nMWjluniZ48Q~lknhk026%PR2GA8M=?0U_9gX=u9uF0?{Znqs&M0nUS#Xy zgGQCCMOOwzSvBK66s%wU%d$9H&oYZcEt3JqhPsO_=KFZ*aP4=w_Nqu+?)E9=py7qP zscW$!MF{{(8>_ZoW?E{i6~jh7q(vwRp;L{6n%w7>iKMCK1My?%8SF3sHmOh}z@mq>ClFq7HNYm{-rQLa|bnA$V`GvdqvANs=*c_-|jW#WId zmq0*3CyVe;afQ1#I!L^K+y_JAw(id({?f&Nj0ax#`_Cf(H?hlmodS$qk+%}6xuI0L z@rFB(k7bm+)pSZOLvuCjujU8NiS6(3zln^()tlm^mL;-3`YcT(>Up8j-NCnKjfXRi znNB%mB{Q9D+7K>rs#OUyEw1XParaMK7Z_BsOPnhIJ z*ys*imZ&lfzP|`iiI2|Ln97LJiyY-DaFi_c6BpXIaTqq!$zfxEaHh52L^Eo|*!*#G zGZPvBmy#%B(zOq|zb04mV>@G-;=0u8&;u1$;v$`R>z{QQl8Vo3nIwsl7K92X?sZdM zV1NQ>-}vDKcuHa)P-xO{<%W$6?Jtc##VQ#iVxd!lR*RFrMM&J{+Pd}CT#vqvGY|Dz z^B8LdpeY&KZ>ikW4T--o8u|C5ymPBf^+5Nrj}f*J^B-#_Ay$c1R?)s+kZ2ntbhH~V zaeH7jVD}6U?s{|_&;-68Gj60JRm3c5aig7z_64A|#VK)JR>>6Me6>wZ-tGY{ZP+oa zDzO63$oSw=AJ!Nag&;?}T0$Rabo|Gj*P!WHnqPj*N?Dy&uz6ZT3w?RLw=C`z5S8tZ z`n$s{srWh?+NxN1#PPx3(NCFO!NClWcjzdT?0Adz6t-UBE}y?EY%~quy1_?XfYw1Y zkmcj2PE2q8nQn;-Oi%-9s}l;^s?^7FNjl(f?WxE=$0U;f7L+nuQ0quEYU}B;yf%bv3 z!>-oe!E^cwG;(mySDe!jB)yO2wJ&S?M7a2)Y*{|o0Z!S-k$h?GS;o^e4^g%o;z$kP z@E~VYIrr;3L`I_(_Ck95AgUVU+5rO)+y6^%gxjqTKB~V&z|Pk)!;W$U;dH;GUmf3I z_vgr_5oPV7&5}kf?pdcy!=5;{==>O2&Cl*$I(`^%IJ~R78)%j|Bq71+rn<>SpL?tg zxrmuvkDT;$YC-}6KdzT?C&(?eyA5XO7^0+h+ZAIQ@~P(vGVXphH$)!qC)MSt7#sm@ zo*{S@Z9)Z3679@D$C0|WPq{f_fx z7SFu*SVXV4yIh7XCow=Jjffh{>gD^(zkaRd7Zl(AZ{Obg@i^7k&Q8Iq{y3)LD4Ruk zyXzkK8x}FLPXyu%ROkteCHglm_AmD-Orx{)UZ=e=4Md{;g(GtPguKJC z@UG^I_r^Ow&pN-pr1;g6gEBpUkiU?6~&`gOmpg zLLPisUoQFYQC@7FbXFK%gf~A8#LlZGzjg?5qrW+ZNJI70zq1+a^=krobW_h4N-=4I zORW(se+v|lN@v35qmPNR(vTKtB)A!8tuwq&;_h&18GWJJNfx{D8>IhNoFp#}7@6Cg z?JD^;*?`%k{kVedNA|qJ{jmSYAgsCC-lX-yK0p=OvVWNY@}zOirEwhlJ=5fB!`;l4 zf&`?uj57ga|C;Ofxu;xhaF<*N@MH7f$}um4QSVfwW)*}C!?xsI4&q-8F|3TdsREEM zj5#1@`5RVG=M^AGQtK-c+SNU%XsZOCn{1($V!Vb8e$CI?*-Th&b!47Sy&SOk;ire$ zYS{)A6EA5aye4i)D0)EaG;zT+fwSfcvX9_FnY;)0+m6`$v>rA3TBW1#h8{VMkcd&;t?96k zq;mAd_G`O^!~l_iUmZ2j>f(11e?uL;n!aCgqs}?a@gW2h^{M5Cb>h2HtXa;hpZ`Hu zy9yGn^b2xBQ2ky4YVZ(8#0&4>L&gnl?F5twnD0tkZ@MJ#!>gk;d146cI6e1<>9Dyn z9o%5{f4iC0{?sw1s_Be3p65f^1GTC$PP)$w88T%`1uc)j^D3eEU?8m$ zk?`EH*swPt+pM^nHVQ`~`=*!q+_c;s%gM)A7(~R9pOyw;2OLcTp|pGfFa@!IsQ(@U zw!4`bCJ+|9UzN-L&>p-fK+& zgfx0<>twG`!Pctiw(nqQ>`+d-h@z=%q1);lY9sZn-)Q_FC&tPQ=#B&?UXq2V7i+Or zPtXmyEC%j%2y;N5%nsyz{;Ik&Z^dCcaDLy!qJG1(RI;{@Bv!--_qzw}4=qtf0&xOW z=WogtRV1E9=q-f16Vum2ZU|TgSW5~8?J+!3moRlxNf-I$U)h$G%2l;a$oE)8OY(l4 zH=c3HXVx15O%q@mR$VNO#@cLFNMidDZ{w*X-yu zpJWY8%P{IoM|{mCLUe=yLs2%! zZ~b=y!YwghFhaylnNff(v)?fOe#qg;}9<n)hk!Wets1u=?)3l#?Byj0^gDRI)_8wI$(zcrV3g6`{?_Z!0SG+* z1^_ox@s&%s#^Ya5}NC4slopJ1)ZxZ({u0K(82g3T> z`C)%Iz~@U;m$`G72t3+) znwNka;aLm`=!H?`W`uHMVa`d^6D#um-NqzpdrQ}sVu%szvc}o;(c`M%O!QBugPyy? zC%uA0vCv(mAF0y1{NFgQi8QMa;Dhkd+_Np&W00tGYff+DormV?I_9jDxW1}YR$B^u znJe?PUUB5T(1@u|7d0dfY;1W=WaLEvjmR(mPQ1w$gVfBk=ehary#pdM8znRzdF5Da zELc`Drylq?*GsfpDJ`oseGW(E}_q%Bni1>Fluu(qRU*`ZuoGbL} zUTnozKR;Slb`&*w@p6N=ifR91KdluT%PpuLrs36lpwv%rEORuOI}4oPI9zf3^w{wnrV;Ghdj=P&xMO^A;KE%oyU6?1!neaoJ)v5SI~6&j?og zy<1gWrO{OC%rc8Ld@XR*2Sb;7sQah$Q*~D6>=H&^du04NI7o$McNmd_F6hF(dtF796Jr$f$e)|I^}LCsedHD7Qb3Ly@nFAhHkJp-!n*8RH{X z$_IDB&tjg&y)nM5`i`Vp`3Q5CxD=_mK@jrb**n)526Av#66Ra?dnkUv&v{t>pbg2J zjvC^{`Y7S;Ry47;*LSJNIb>_(5qfH6?g@t&{+a=xw}&wMFU9we0?U-JOCF z5r5}o8CM{NH7m(`{@G`?k$dQK9lBcHkFd4+0Z&@mSnBlXPc^%05%;T;N4pDtc=GHW zj~ZLs=MO8Bm#0k=4L{P@$aGRGjiIk5ptAlJuZ@`{I@vw%&p`%^u~un)`fxBUjswup zP*?6ogu=da@n4LM+XR>PK!99nQSvc4s%NY;0nM@h7JbBlf42ge2+%3QF<_4`vMO)~ zNGUvt|qO3b6ahnH3?ki{>T9Y@&NyxgG;rI zi;lIsF?pfZcFz(XOMgF6ddJf@*gdTOg+edhEjV-6og4^%4jj4vG^0AE0B@vD>W9LsES=`BWBh(l4%c%unMSk{0I=DV4XLuI@)DZ;28FU-KD$SGXzp_Ak|LpgX_= z<76qvTJ_#r1`b~K=5q`9sTHXdCK{;uncVF^&q6=s%A_aSFd_?!v^gm5&J{&sCN5g4 zw&)yIzUfbulNRz~%}(&``Xh|=YWj7RE_#p!7oY=oTiWekXkFh3n3d^wa<}zwa>8Xr z>3`!x9{kT34&*8;{GS1({#3ydb<1jzRK!uv3&g`4&=N$49_wNO*Yl^kRekmqP_}I9 zGP?cymh~r@QNFZSjj)~Cnw^@>sMy$?g5nzbG&wr-Yc3GD1MTO9 zLl?yX1O(sg)+5hhFiyuEjot)K$uSLE=_h27uWm#+Qqtbtu`FgzPAWt!S_(o!-d6}C zCqu$#C146xw_v;lICO4IjLQ9?p7d?cKdsJ{rv<(GGmc>^U+{h_tTV8cKLbcN;0!_-Rr*-APr_!xspEj<)@}>(^{F4$ur2q z1wcWnro667={^2|-Sl5qz5aDJ;2xBr=a4VhodzUXn<1i1YI6^!8l@o&u0WSaede(| z7}@78r9z%av?(nl&MRj5{`GM3^cDb`gC7}^Dg3@%TH0J;uOz&fApU6zW46@W^Ve~E z|L=0wcdvRIiy*aNRdln&k=i!IjHeAx%-0NPk{Kpm{v1OCA7vNP!V({6L~UL;G+#vnWZu^_VTLxnng{EVS4T zVa>y&>(Zd;be+FCE`T4&!ods1lA~H$yKr7!Ff?(GR-M!7-4$Gn&?C=* z<{-bho?&L;0pEmhy}@AMis}D@--Nh=dd9R|rFR=(%>2|4Z@}e90J!0uFE0ayuiNA} zbMLE?(KBmd=(KIWe$@-5nak?cl%b80g0hWxC*o_uty6;q00-&W+3%64=N-N8f)$jM z&^74WZsgxmpRY>Tp;Us!iUms2hGhCP^{Ji+=OWcI+Rc<8jO#o2T=sh~#dA?FyuIg5 zAiU9HO|o}+1Rt-(DPY!kK(9JN*UhwHllqlHqcgC_f@he>!lM=RxPE^Q9n#bRidb(1 z;pL4;>8rH~XQ__r=iLtQrH^w1o`HyNt2afm%|QkmmjmuKZv&z9WyPD?tY)e(sAIwY zwsAei8`EB*DaDf$>ltpNE!?+gAYA?5rgZ5d*3NwsMt1~Ro!#LaW1!uAj>b^_sq>~EPO?w z;Q2t9f|gdwV5QOSWqRbLQ6lf<*j)Y-m*t;=d|8Q9F&=xPLp6?}`UrSi?eSqIwCibm z-8~DgzNa7UOlNw}Qxh*^5e^ZVxy|w}YcWK2jz{tBE}4~;T<-8q?KiLkhUcfjei*3F zc}ElszvD*;S&s#d&n1u8YFOPV#JHC(Gzgjc)*#uP`S!(ND{t`|c;NstjOZS+SY2H@ z*T{6KzI!)lnqh$3-!~Y7zO3ym`wY`V18t5L*;e=P(xj`&9*bSr6nL7Ma|)iKL#fJGtjy z6bKXFF2vP`%aVQGG`_foJJKp#9e;0cFCD61%5LB2tK|@T_@;7t4un0su2y^g)|KMCW`3!tdVH{!EptPSV(iI4I7r&H&i`2hcojM=j zkNEPyKAC3hvOgrkB?0QZZdvdC%PNZd6!+X^0jp-J&^9b3sa`ISKP+;0X+%B*DLp^G zYhSN}`$A%_@VOE8_~j0{eg}F+iu|D_{VESuliANCQ}hj%(!~5K1v-dX8V}RxbI{>!JtO)2)6~Z$L^s z-#B9k8daCM>wB6BAAsVyC?Z@#qg{0OY{3p>uwZm zF#>U6OVjGqPs@a+5)}m2#!;K?D}@p!@Jrz&e7?kbA70>DbmnmXnXUb0jqgwiBt3;V z?JV2^n1p4j742f=o4#65K7XWHv)Agnh%CH>!F@VuKx_h?|5@;N^6T(rV?9;WpZ>zOq-Mp8_KL4 zYk%f-rnd_LSC0;4-z`o=u8IA`3x4O>P3r@ih<*N&<;@+ux>&NfZmbwlluyAYf$yf+ zn@b-Hn;ZI8bNjK6lQ;rj5;5Iuz}uHeS3`AFiSg2({_yFH?MMBeC5t8?2zchE;yCAC zWn{JHe$a0pt2Nvhzj?3j5}RMUsAb48zn>I*ai%#ad3hfbZ}BquNvm6LlPG-3^DH`_ zs3GflKh*#~H?4=|G)%`MHB_Yqt4si=ozron>5QfZo|+7m9xMHLG~N3Cd;~pHOVmrp z84l}j+uX0dT-mLj**R&!Vlfs*_2U@`LD!2ey>%Q5U? z8#uC78>|bo)XqNhW1r53)Tpzp!L5GSSQIi;H_{%+clQfG=lC{PXX$84;K$q{E+RnV zC;KlFWZ=q|gd;-oVVwV^>xcR&5FVw+>04LQ49)1EK_Up0dAE0Jy zg)j@g(L$f+ECZi8b*hAH=REqx9W-U*`~5HuM)!?Un?!R39E(r(bn@kZ_2i4RZkeZB z{u-fw`grfF`o#i<;Hfu|b{9wGmT>nePRxppcvuHzFko;Tefn7O?$Ct)yhX&~EG+N> z-b2BA30E9=gk54bH~p0E+!o#~&|44lN!fs>E0L68lY53mRe?Qlr{;RiqQ70j`ZpIu za_m2Q5Jg z&fB>g7EaUkWIWoqW$i4x)|8ZYAEB+suztIown^{~(<2}1HTEBQmiY*KpqEIpko|sA z2d^5PhEK8-fcVV3WD`LBzSB(`=D@w}i-`yj;L z6ej&ZhShV{I;W57JOR;Dw_(2xGp`;-kg@BqUS4zyxL5XQc!Eu`Q#Q`h8w^#y>NI|= zzZfGEEI8PuwbV9Z;&v%f`4I`PIMF)ZJ^%3m5L)gB$6rTa@YJ=1j95FPLamiKD%p#? zU6-x{w^{cQ5MIMsuT_nP4*%y;x#Q>P<=tGIf4F}u!2ue)IL@h{Dn zSnYP%&>u*8^r1u{65!I^7wNyCpdY8n#;t7WhY$XUV`(L>lmi2oayZ#>mPg`Z!g(rI z%SD2W+Y)m1Eq5L4jn4mWccep;xEYf@8##40ARw)wG>!L#Rc9Ci4#UJl+4(H$^~L#c#Y-~#*&mbv zIE?oX0$`Z1nAk^;{UB|r-@$j|-g}nZ@^X&;93^8p4|9(Yqc6WjL<( z9t%nq@cxt3Z^yB72x$GJt4F#d&(f}@@>g@CZD#Vz(3H^^=Q|0v^m0#c@xznv^cGF! z6FTcT@vz)LyW+kA84DVyvQNT`)nKkb;ac>97pDNwo{H?lgEc?*>Nq@QbjV6{(!6=B zvEZX+z=h)=BXZ_6m8L(}4i0^VI|Ehx%ulu`V;I@1LUxK^tAkXfUnAVc%|(Onq4GVJ zUuL=s<0;Q~Uf3kQ2;bp(fZT$@ zWHv2ymyby`hMO4Yt~#&IOcLvXg=b;>gSm4Sry&D&(SBaF1mMab^~sw&LvWT;DD^6B zV2oE&h2=`2&v<*l2~sm>Cu?_Yu3Xro`yRYZH#*BeQguKv9=K4p4>XoBQqO?-fscS- z-qCe^nw9Jglt=b=Id=Z~+RZ;5*;OU7`H*bC^Bg`d0gthfx7Czi9!Fvg`Nm^zXv z4Z)%z!%xvB=8vZCr48(ZfGZ_32F){w1%+Dn$${j7k4v^rc=tu1$TdXZGeC!MdB7Iz zuDDH-3m!@Cs);xAn()zS8ynS9oZWZ5JZ3JH*IND`Z;LM9&n?#%rwGL%$LD7_Q)w&m zoPEo~(>#kY#4omi)Eum|B__k`6Bwtr_)Rp_I_V%4MdA1L@qewi2NYB0QGbwgb#O~) zq?5Td7}9ISF!i$$TIAthvm)WWfG!EBbE~7zP8^U6B!=9mPoiD*Jnvz~GokL9JKss| zZ8x}K2avBii_j!)wl{#ArRzwz(!@jl;phs!qszIu^sJrZ@4Z;ft zrhdPiD95fG3b2!`Gg0)|jh-phUKt$TmZ{(imB@&1utIg+rl)~s1G=gh1*FO@~V z0QFN2&;Nry^f)6rTZ8RKW#!B<;`|-Mkpkbs?|H-GeyTQ_m`bYkKL6ns%WrtC39u!A z37Dk^%q$As3zGgx-f0`1T>y>QZ>*9xjyrEcj}oKY=eoW2y{-AwA|ls7Ws96=dACSn zcT;Goko<43;87qLzbqT@Y3*~))+b>L06+q@$udYRu?l@$ILdSI!AQAe$-%7@ z{rTx?CIs2H7YvaSKx$&aHlVPC^xH1am)u3y3k0&R*23wNtc31^=rUrMF(mGCGfK%mC8HJ9%wO z)2v{wni7mxZJmV*&-N+%o}{ctd$rC>=651dagZ|BflmNeSFeu z()Gy%s3#jw*c7he181szFCUQol9}*6dB7VfdOOCT=X>*}e{=^#r*7BX>C}UQkO%#p zy+gCp$L2QzQhYrMRKrMjR;E_d}A&@G(Teo(DByZwy`pPV<_F^4GaofC#Aa>5U9&;mHn8vX)I2#vESG{PXB}V8+KM}j*d%4+=S3Fp=_(oQ8 zfRoYL_8}qG#OONR?i}*f{OT#1*qXI@LNQ|_7ith6RU&WKDH>+u)Juse%iSq!%RTM@ zI#+mWhI!`vP3T(3{M}f%`|`W*Ew&8n>Dp+l-`?})caUo=#(BPJ*O|BcnW2Y&SKL#; zNxT~5_LFsxHc_+OBYu0OUc?A4<0s1t`l4c5w2f0foZ2LmZyIxcgK@_z(nEZA)0HyB z*LTLm`3RxC^S)1yx8@&)#qc1MIdiEs1QgTpm;$`XcyLP)?qd#uWB3w%JoX_2P;ak0tY=R6M zsLC6=hz1K>uP%j|r7A`_vioy40u8~i3cZ@qQvqix>8}jlbYLjC-rDX#N1mo%yX5w; zCQpd6hyW;8U8*LqgYyht%p0cAuR?;prPsP3?-Yo3v+e^hM8$bm_YDr6Ah#SV`E>Kb z6~|K{2pkcl9rAvu7MJ310eh?AcsN?$SW3wdBd|l z>pEo*G|P;+ftG$$GhIyLA$BMmzHUKn`&f^aS=GaeUZ^~4*4F#tu5bm-M?JpxJg!*#SS0%;%x1CY-*f~g>7%-eBwOz8Lq&C zKZ@ARU~CXnyOG7UJoNZIEV{Z`k02SNQDt_p@X;3XOlf#EYx&``8etSm4?l-H;+;Zv5kmNc-UEEFu!K=t%)3D;YM$5}7f4hYyKd4>qMkWI5N>dT{K&z4w7q`hNN#Lh`O`g=kYyN>4*%*#_9akO$VPH#x;C3YSy zn+LdXq=Lf+9w^ioBwhBp!J#|?qKrdbT&Q}gA_>SE8Gq{(qK<_6eA=KOEp~$^ihT;a zMy=e4v6nfOsL7%1tNVJLPR^Q2cgNy4=eI;LQ4g+bnQ*k|dsAWG3az+OZhW;g`Be2# z$I>q%o;7o|ef0`FIx)*7Q}WRIG(bPh@VZHkoV8 zZU7`69zD`BtJ{fB@LJDQq9g?dNt2hIrUqj_-B)%Js@ioTzY6Hi-}r_>uXjfo9Wp+c zr*#(v9>*%oRi|c+8A{fW(Mf8BYn!Pl_@=75toE^5{c*ug{fCwksC9N7JAx>{x1g@F zM2N|PECjwAoT%u^epEw@yyR%b3p4XGu4%^_blrm0rw{`x+gyN=WS(r%HW-sGf z-ng(zw^;F-tN92MENJDGs~$7$Tc3_qphv5sb?z;?=3g%4eKf!n>W!wQTO4&nN`l6z z`9$Q{{93)fAV1H<(ZfYHd=-J&?+G5({u=PW*p0=Pu;Z3#z(q|U_3?c(-Z1apt-=2; zgEh60SGaLcfuQ5cDCOaqGTbE#t6Q)y-NT-Z*!eoOlQC98 zDMcwf1G&>NJ)fdIR8zH>`@thTgBYrb+|rP`bIqa)YI<<(!lo??Yf56va(t$M@I4rkO%T^4a&?Zj|Oh2s@K6#iqKs z!GRdZ?x@K6zGK$~Rn&|fgTX8|Uxa|x+#eDa-n)BuQ~e&+EvNCGdN~54Eo!hx?t_GJ z>W9;E4qUIBiZ@2zxxx$T0?a-+L+9#8r)FF7l!~IvbR8zkE|yxM<}dnS@bZ_=os-|4 zmm)A%q?s-!l~80U@LtH{p67wN3y%$W2g*3#Sp|I_6&B0zW9&%0&2D*i);TS85o%$HFqc4NJ#XDS@>`Tgx^sXAc) zd=zOOtuPm5^jyn~<)nHW3%@2ZsvYK9!;Orsk;=2Sd%@1>P!yr0CX=t#79U_)PFk2; zFM;}Kh>zZ~-YY|^ErZT99hWK7%2C)4Iwp1HA5lyO?PulOIHT^nnym1Zwxp9N^{H|i zZF;F@ys9M?wSf1q>tc?M8}fF>U4Zu6fVtvQof|8oS~Gh z_u#qfa`Okl;W9CAm0l1IM_L&!U)iWE^fw8=&m$~Lcl|40h0>ZlB`LmA40;@Hqq(K| znhoMpxwUFL-wt0z(j}!=)D?>$&cgxT=oJ&IBVuAHGTct{{tKUy5RFx+ zyCBz@%@*bqeEC>Kt4oyy_7a7EX4eUx{iU_FndX1Fwzj!R**?WS4DKDhips2?<+O;7 z*F)c0+I2!6DoK#&{rqwCG);XEYpRe*)hBG$KCdfnXZNsNYBOpC2&J=3w`1pxJ{#g6z+{|zX7RMo$wE5T_LhTv3@jwgb zLM)~}=HclIcWm9MZOJO(!N9`yLQ>3p40uBElpYNtdVPqQ2c6e7QWI?(#93vrU08!K zP0_k08F-e^___TFJzUC)nSWmI*pNvQj%*1w};(8uoemIUjtnbbM?VDM^y^`u3@B-?T6Jhe6RK~6h!e9Hm zTf2#_ku`FVXbZwHA5GsFzLRZ_+Pb)|gxw?Q6WP`$K>)mMfL`=*pyA5EF#F3&$>$M~ zhz08=PLxx9itS}Kav>;WDapJ^w>TMVLKpHkv|Q)N$EaW#5X*Ed!A4eUfWD|1S^DPgy><_hdd7IP#)*KJZ&h%hwzLg$kWn;lL z7xA!dk>=9f~(jyr!|8|^6hjwmCk;_*%i~hb9Q)zmq&$Q`9;xV zLUeC|veiLTr3$0s!G)bDv`OvI-_Yf|+m!bIe#ZB6o-7V0E$cv}QgaFLp3&RVZuexa zp1sL2hu8+$jX=xV@15VRK^G@{IySN=r`_sIF?eegJKtq2d{i#PSxMZ3U$5LU_?gS( zX80NC$Sl1>CmJ5anI-IKhE3ahv>&j>VOcVDZYg!aEQ2kV=g3-R5zhsKPkXAB>x}xwk+RiOZv(!Tq39tO?QTE|R@`d~@O}P|c;mv_S6f7By)(yHJ&@HU+()7(DAguFm(h>o@xf-#9#%ls_k1LBQZL2K`>(tVh_P=*}WJ13#h@zKb<|Bs7E|w#v%I9mUr3e8R-a5IP za4dJ%ZfFKQ(`}KL3cqOVDrWNp-V$XR*xr{EM|K+O9xk`nr7n0;wBRY2!z`>L0pq>= zI+EkEyw`5}^}kl26l}??7mh>kn6!M1qd{>d@@Vvd3d}~w#1X3^tD{4O7FbT_qZsoC zpzz1*_!e+X1Tr|irJ`Y!2LSCym2PlRkoUQnRsiObvJ0ROH&sPutx9G6_57^_j)z;8aEONZoFJ#=O72?_aAdM zY6EtY9Bk+3Y{e^T;%}ArwVNLw=2ejxAnRgK(C`3y6GT(WBqTP7*8*3`f8uZenCxR6 zS*I*V6$1V!v8OoA zCEPQB-IB|-K`ADr_xbLFds0uPRR-uQX6 zOyq7j_pUrxw;LGf1RKX`snX4VsqC{nz(L9~g?2bC`+Hhoz1OpcJsB`mru$MeGEs;N zqPp>A{(%RM@{TEV*>pqs@L0oU)o`V~#qux;yozKu%ogOjsFw^g_^?5Xyac#xM(+f&clwrux_`lvt%N6)2dR{weJ4*-CHu|T$6qLCJz_J zEUQXdrcX^JP3cANolEEUh#BV7nHaDb751<(7Uno&$&1KwG2o zn5Z~+3@&(y>yUFq4~)Js?9GrDi?M=EJLyMNq{AJ)eM&V@biyt7h?{5Vp?$7+u+*)CH1FI$7!gAMWbFH3@ij( z%r(-2?rMmoL@#bi40*3%_o60Wg88IqXKkae1>G_RQ6<|biu^W^JFA`-y{pz>x2g@7*sMQbGR{X~( zEOEePfxC+d=0G{?x9@-CWdrz_StrK+W0VkW^&mHCFP*}lXYTLAcQ*=H5_k{MuaRGnq~&l&yK3+ZdXl4KrH%Kv?o$-BTD1#XVt7W;RB@ty*f#M>BP@$aL!Ndt2{ znC+Si@Z;^qyq=4u`ldbA<>`u{Yf&(L6;a<dVLjth)US+`+Repdg}GF4^FGSUBB}2R>qZl1BEY6QB>cJ z@e5n}-MrkDkhsynuelrNQnhjQW}x9I1t4}5S5_#J!iUaCFo(Wq4||%nrzuB<+OazL zV>5#d0ItX`)!{DvwSUxZdmt5W(kp4N!{db&=q5ML$WHhs1LD@aJ@k!v5KsoVBgw zco@VvhcVG^oj<}GSn#!`XqEQ)!>AbL)j1kc&7p8Uc0vSP1HEe8<#4U1>1jPN!Nl&; zp4<`Mt%on`V+~EaE<8jy1)TVC5I*t(vFYeu)-3HC2npG+6%@lqf^8VtEOA8?r^9gX#p*qbt|XUO-nOE+NUO8^#rPQGHMXgmbr{7 z#Vh-Odl-NT3~>H4s)I6zwV93^kV!}hcZ)5lSTbJ6)k;(S4>V>i2<1Gx@vActVu+bB-?i^b*#dWjAyl zp9!!?*)_DWC&ve(8n#a}$r(Fi!uI7r$=5xs@fUkS;>xHy2Ujk?*mVLi=xdrdb`)dm zs(cBqng>Ry755lH%WhVz&0e;~eLLO8ZfAS=OA_0Z2VnrGZ)r4}96KS;yhjv8xXe`W4Tu!ebKRrA{)x?E4lsgXZkiKIcU=I#P zH~Am47h(>$Mq%dAY#o=B*z}C#ll)O`G)W5Q8lTu zp6fo?XDiVLuUZa~tIosumYA9kijc@X5bhVpm_qf4qkWA5hs4zHQ>%EIYFu2J^F|c~G@_$hM#J`bIj;MI6;jTYj}{a`xmvMd zFC;{wXEcW^bdTyt^}0ot<3++-VMoJ&q`~L9!m&M)O0j0uf|e`paT!3@(wJ~jpq2NS z?$ITY1ags)@{UD88KJeQQSzUvFlW2nLB$8T7`2F!ZS>eiwWT>yHQ21I8&e& zhSs+7I%4Q&**T_QZ1W!KJ^(lRD9s#tBEZ51(o;=7Ja@q3Twtfuw-Wgx5c`1&s56%^ zhaTQz>bl5@m9shoLGkA5XKh$&FwE;FS`-;v_S-1duo zzFl+T4)F98+!IUI+bZSW6^4S#wk|f0wtE_H`QXoD%}Y0}T~w#K>W_`q`H0u(97@%CWz2W^jnXcOdLt=+gCg zW?a+KTZV8Dw|hlC7_Z8?vl3k^{Tm|H23+wA=g7A|&E}7JngjDJ-Ok|q9lCM~KYItX zXSSE0{gr|J*N=Wr6aJMC$^)*q{hGvXrvF<*``*wOZ(Vh+zVH1_3b5eyS=;rICkKrXLMx4Nf+p{a)V_czbG+vo zd=@MSp)<`?fnztH3{ZMEHvIqDAFu>)@e=6q7(c+sk<@iJ_D<9c4VeLTflcR592fSa zE{vzgHOEBqjQv1BS$?Y$UwEBIL;E)*^xP|)qpM194eO6XZbNZB`{6aW> zf9RT8UH}ov@d9sF7iM&zYJelF1QlNrJkrmDEK+l_@pbLtbkwh~fjI-E03>*}DedV2 zT2=g!$BL1}c+gZ9n=Rs#c`v9=tRf!KzftLcUh6ncb|3D;U(Vur_*!`&^)a%RQnhrF z+sGtj`k{+5*b1WH(V75c;mYMsKyLf*G(jumJ2UT~KUSNe$h8w^1#KtZDTGVXEd4A8 zV{co<4v=fU^yEg1ncujiG8zTt=hP@u&)cb#h%tjD2InjPXlPX~N=mnVnyI7S!kptk7@A^gDdb%a2-1 zZyg;LunhS!d$Dgg5jgrYCcZIR7G(~Y-Wh4v1_pK-^zC#1V*rrNVSvsHh%O6`A9C959 zaF=&wK#wG(Q?(XAYqXHKrN!y0B3YTs)zZOYwZ;ooy`(IzEDFulOWU0c+8JoqoS7TC z!yJL{d3?n@m3mO`O-EcZeQ~%zyzGml$GMH%6?>3opqx&6ut8(p` zKkXt*K9DX+N;#V#5)snrvhGr3bK5$tU?`#FkYr|0gU$FErpG$`Yf|IRW?uc$Z{)%s zsAjlud6uT~UhVI~uYE<=1L_d#u^v}$sj>z36R-G!c$U-tt_ZH}ZGYS=PKPDJ5yRd; zDUt%36|t-uTB@(|X49BTY*gLH+KPG^5VCfgwsyM6Ut4#l(|S?#b;yaU-fVxduVY(J zT#9wrt&uOIhTnC9->0=pG)31pUl;(GH^8~>Tl%n`WE;uPi?@^eW{zf|KKpa@1T3sF zg*L|PWHs%_NqDu&QF3;a%PoRGpS)8L9SOkq8DhADMW1m4gYN))B5b+hfYhPEhPMN{ zKTP{yIshVT-v`#zD{$BC(tVr9RkaP+CCsd-MOM(8tB?b09nM__kZ%b) zF8oQ%ifC0SD?F6$;D}Gz$2u^_A^Fvc69CJVPUHTG(i~~WrFaLWG9(FFw<=exYdRH^ zo$01N$J=(-g=X}R?R7YnO)H~@U_Jmv4`SPR@V(GP>6gY&k4o-UxDOyc^vad7eXNk< z<2t;2YLr4_>vukEn$WmzDynq6GvnLG6KDc`r{=TRPXNp6DGVgST!U8oL{biyS6Zv3 zOdgcXf>ejw*&9|antcvCz^gR;#l?+DmJa}fid@Qd#m8-3J=%b}k*Tbh^Vy*f&#h@t z9{`B?Re8BE8CnQg`G|%jIJD~Dgih6HG>p2wO;QV6*5la9+MF2@#J(wZqjrgywRY`U z+VFn*)urAn^<8}T!#SzgT&1*bc>{54Nkg?+rID*BawUJX?$LF}ma*6@krX5D=EktP za}OK!M1gq}WsyZ9X1dfZ_9U_da<$q9>K|naJ^=)S{PSL`^2tyB$;K_40LiZp%%KIK zR@(kGok)HNtO5wIWCHB%P1f;V_{SD!xQoW6CfF=fp$v@kxxTA_if?Wdj2#(Ya=cEQ96!4Vi5>sOg)|gDtuA9x(u(G36GS-tjI0%+cQfIWvJJv zh$#k!Gm}5a`FJYaI^zra1-vrP0UD&MTXg9HAnP_PnpVQsqkaf>fM%K@8>Z_*Q9Yi2 zp-$=_NEZwPeqxz9?S0G(z+$}=#(eGMm^u<7qqdEgupP6yAUoT7{ufO9xC)^6X8CoF zU%&U=;JdYb&t6s~DBb<{_oV}YIjnXmhx|Nte~%>K4!}iCEchD`?u@)ctRA&(@vWcf_@6|$NT^5Q|CN< z2!?Q^E<{^Qr3?AVruljItR6c=a#SXM&?cocs7k2%cNh3h<-Zrg^Bqk8ed$w%lg|!u z3Q;G(&{_MXsi!8Mm`-b%OCq|8;&x4;PwN6`6`D^}0@9)xo4wt>Yu9Pe&iF{YZiD}~ zO=_va`QL>u(8Tm4Fz9p1TG%Eb?r;yHw-cWmtU?0VD_TR@xa=U3>Z=|BvD#ds=xL-j zX`Qhh>)UnsFiebFpb2#DiQccR-W5zb=k^y1tJzBwbkP+PEo@rECtl3e*Xj40!z8_n4-D)WrAYG)Xc1?H8_i zu{~lWB-(M{zUG2dPpb1iu{nAWAZh=#lR#=(U18fRM2u5$LYFjRC9|3yi%G*?-TA-+ zJTcs7`0UEHq#7}eh2)5k>ACkpJ3v1gW&dyg|Bq;t$z{zJ!K+w(@MOho%MefPh3x5l ztrYrDdJ7TzEpOhx@!i+D3D)j!v7V1V(%}x?U$PLS5bo=}G_g)_Y5U?`9m1R}OX#^MJgr!VnIca)m)_I1=Yz6KxG+_6q}PNPpm&SF6HH3T{x z_AO>JKTa>k#ZlncA)LQX;AH*`&W40hf%*rEPEZ+e6>f3Wi<0!#CsPoS`b!hEwY9eG z3AJx%2`R>X%k6698UwYS;oBU4sKxe)mL>hV3bX^EdNj6nI~s~*FSem86UIL%!Z*8T zpx0)$7;_e5_|T92j~TjpBl)V}$UNVb+&P&>E=AR+lb>Z9*Sz77|4 zEju^>tg%2~c7YRK@!*u{T3Kw2*G?34C~&+FA+(hlS`D0Bc|8nb37{S^5!YR5mVuLq zcpG9wti;oP@b%g){dysGRRuLk`1n^6EkM5IfxO<+$Dm{oVso_l6rEN>n$^d01?a1u zDNm*AkX9x5rR zwVA@sa4ZPKC`}>zZG>WR0h&~68*gRE(}vA{T+|dEwK-kf5X(QYv9XD{7!$*W+j^hm zN3Ph1U@S5G^*>R+HMF#_F{AK(>-bcCBZOM$_3kA{1_`$N5%Jis0}7NxH39EtR!4f2 zsK-CJKXjRc))WZ`7Ug1}r7kC(282r7E>C-I`q>N6soE%t%lntc!piPTT~NB(OB3Nh zYB2@9Kw3$nhZnUrG3E*?H;vT7^{w5nJGXVOnt&McX6nyW=tJP~MO;K?J;?+*YIEI^ zj-sGzrp8FwVhzUDq}81U{zKibInx=Fvz2d4H6|;Ezbz1al__v85oN(1>gILQa_Cbn zF;zaq7uwY=nx1Ob5m&6h+_;(b71Zk65@>JpUvIteola;#?q%)7nH=Oq*2;6k=P6To6BVKKS_K~A*OxEX7yEk5ya*n`RO>tJ zZgQL|O*tvqune2ol|h+s4|3bU`mPq%IQ8HH0-dX~m4u|~Y%VDz@mD~o(VGK{3OHKx z+LWXH?j{}la|?!I_n0{ws~+4D3q!BtJLeEGNQIf{;f02gjy?9n;IR^{ecL!jn4 zg<*1P5r)mF-iQG&nJ~*+d2Znv;Q{1kH{g(`UWg3~=(HLwcC+a@=qbAh?4q9O&Mg}0 z0O9fH(YZObt>9g@0&oL`?@s{u$JGJ7JiETO*$AQchsw8-)3*yZ$wWx_)F542L^n@@ zgbV0vhxUwI$DFFzXsrsEYf*6&I*!|3Ism1ch_+6s=(iqAv^nZ{Gw}38=^DY*xA!u% zy@-0+7;#T$>quCfBW8SE6k{T}sWI~+RKA6ruBaNbjV6-Dwf*HF=e+`}r5 zuBy^GIzjoGR=N2&wpFFU)AJ_P&gOxa20TkkG*OyL4F~Q2FK)frM!77IziBbO&mqDE z4kx}MeP+AfLMgZACQ?0Dpe8hi3HlY6cME?}n`@2RZD;yA7@zaRHMYVUZqh=eT~Yop z882f$*GxjkkKyZdxLeLNtoatuS64_TBRgHmh6g$6lj~5w1saZbiQa&VNu;jZplj=& z#uh24O$Z*s@T=7q){cOC7D%5V%SaUj@ze0PxuO`1`~>G5&D|Jx5k(qznu;x6lidC* zkl4_mfX}@S9_TA-3G=x}B){-g2v`R0Get%{HJms`dF|(UbA)CZxYleF(c``NeBFN= zK?IuC{zr^L?Gx(=zC!SRtVySC;KBoD^}EJJWbB4w0;V?A#;nax-14XI%qBhx>q{S3 znp#&=IIoB3rA$R9A}&o(o>N*|i>TTK*4t{GK-^6h!6d4EKphdj8M`zj0Fv55+q7U0 z92Qff2lvt0Af}{&wI!+7HrBznU~q0zsus6!V0mfYn{S&PD}p5y`n0?VruCvIW~dma zznNP3-qWwu5!`FiA$GO{lk%8bw1uC(GO@X$?*dA@-b!3x&`$jq!`tiC(#b+mKdb-F zX=oF4Tg}l2ZW<5>CRm)1^i%t9LXc)N}T+X)=5!8{p#q1r^u?YA<(rvlmd?2{+twXtl*Y(Au42`j{cr z3Q2C5{WOO037HPuJ^9M>So7D7CH0_xfmYv%m!}SG9b?Tb!{c9B>9hV%It!fA$5N7o z3OPvSRUB|+o+~J?_cQ+MCN~{6sD6}D{NS$FAuY8;iZX8urbJ)m-2XItg?#ygDb%-z z)1jb+SKFlRT1Ov7;(xOgdmBvIIM4fd6gav~-uFyTJcFLCXu9Dl>Ur3a zwdXeUl8$nT2sxZ-ax)g-ARu{BlqyGX(}W7N+1?QoB~N{L&U5vD3|L$OXJ0wu=}#I! zPK?>K&DjR3aN77fc5{KSTk%D+h;EcTV^j>>UV~7Ifzk4({CWZ=cKbU*0G{CA93;z) z@8Mjr5o?d?jH-qbB!9L;f6@A6Dm&4f$hKe|VKYUgnS6{fRsN zfQ3I`;eQV-DAhRM-?i(&NA0Uu?);SVA58KGll;LXe*(Rq9_a6U<{wP*2b28Nh(DO* zr?32x>Hi~;KLYvR18F~H`v;i)0cL-I*&kr`(+&Rv%osds+qV!_QAmkhz@N63-c_W= H-ADfiu)M>` literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/14_frontend_2.png b/Documentation/E/Tutorials/PhotoContest/Images/14_frontend_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9626df179cbabf1e846f3187b225a7ff25df8874 GIT binary patch literal 307786 zcmeFZbySq^8ZOKX0}MTM3PT7eC5m(m4N9tnbcm>=bTb1(w}7BXqo{O9cZW369n#%> zUiLocJNviw-|vs}eP^v%ti^lJdg`w0zV7FpV0BdmLOfbL3=9lHB}LgM7#I*31_pQq ziVZwzaKx^~z<^^Y$x1zQHQcE22{ZrYv|P2-d)7Y{pu`@=7%g66{Xv7g>;rq0LW!A5 z(CvFMX))}HvH^v$0zN`LbhC2zI|ivGgW1%)WglU5NM@o+Wp_BE1G=8 zRmRV7-)s>n7HPJi5e@Je=D}|_sV}M|Pe!j9| zfYL}wi2jrSPmo9?9|joy=SN)$11x=;nf_17%@YvF?C;BehXFx9k`?-^5ChoQpSuE{ zAZ`O2iwm;*s}KVM3H#f&Fi?-cFxXv^IgG#T83P!Q8uKsP!T`rX;P7Y6jiA2@VX%AH zf6)pCc8sb|9pkfU@n-89A2dK zr-<)!i|kI_*8P10 z?vUE+@R+#Yd-L@@opg)36AZ7b54S~jJdCpHE|S(=j)SDu|1!#rSssvjow6vbjE+wo z#BEQj3AQwn53Ba|M@}mE9HVen){UxSh&DRYeC7TAu-=WAz*bhsZ&fYuob9cOt`<@; zrpioxY?|v{aGcpxSZ&UV=Du{#|8g}xIn(0W`@_l_ zrel|_B*JG$RIvZ*id6i(IpZM9$H})R&*}BG!d52l1>^BxnoGx0@4&8y?dOaGxcG64 z-+{Q-24S64%BAFXR@3(8z*x-L8O~~H@1&Z~P9lzjFny2r@$0j}tcWaO#ykmx;FM=V z#KpGDpvuT%*G1R)*}-C+M{Kf}Lj=*q+V+6>w#Ub-OCKQ_7s*}bDIdQj=a03!qAqQ9 z8C`RqSUn@=pa=bTP!&xCBH32T?rZnC(3Fhc>%%+q{2?~S{=}EGx6b;c&VCS2NsrWV z&c82E0-;vmUPs^Z2cnJeMhNCe+JaZ=0b3c_7Ehp_f0sD7m7kn>Zu_kDB2;#2g7Hh; zWu49Ay@yNG^ z*i&H0tUFt1a?IT$(m4xdIS7{Y4ki*mpci*Ozj{{U8oe^ReDyBEycs!bzQe+8e**GZ zvvdK}c;@Cln;+Sq6pYi-Q%j>R`bYFdnF3}{p4hM&zp|ZtiYeb-oc_>x6 zKaI0`B}$Z;y^%-(v++XL9x9ZnuPwl;@eHej89aY;ew*uEO7@Jkx%fHgxPsr?Z|3sK z>`M1+!^blqqS{DP05yF%G2E#3&U!=#)o9e`rd-Fqteuk?w2llw_U+ls(2`69bZj;Ff47c=cAy)O^4jJ~8?xCYlA8>tPHCHtV>_h`tLa46ot z!$712wYqF|wUOReS#A83INez*S`KJ~wlH zSA1uZ`(S53vd>zZc*Vo#B7eo@`bhBER)9#<+dl(yy((M5Iu^RP*C$!xw6FNU(&!n_ zNi>7#HsI@jC#s(M|ZreJo4x*q)}cr zwEp$Zl){S9<+R{Rlg|OS`=Ykd7X^v4sslkrNqOG!sXNYlNytjnAHg)1bo3Amru(^J zBUyeb<^Ef(7#HiIa7y0}!L8Hr(1S5z4$#~}WPhlSD@QSA!)%Mf%5RT4smwChN#&ph z`LNURk@zU=UF!CT$l~5fg)#|8Q%nXZJ~1Jm&pA3^Ys+wNz?l2VbiilX|6^5m`S(EP!vZB3cewzk#U zs)&K$AFf1bSE!%l3_jQOC!4B6(SwcE^VJXeQ>!kX^~8T#D1{V&ty~ty$PQNO&gsQ3 zLnfM|D@XLzaJ-YR>H1a~x%%&4dmIAlehR3&^RC3 z-%7c-pTw5#=W{}E>s)Bjk8>UuCI8=u2LWJ4sene;5ARj!v)Hfaw^xR~J+)y6r}J$3 zTnDa>T$QQyW%=y0jrS(woCVg9CHuTfz94Q}^%s2q&7)hYa;g3D0H;prU@z5_xapvdr%dBLr>9m}Yy~&yDV;b5S2jz5CyuXNL$xg9h{^awm=y!(zf&J#HU!x6T*yl6=9}injvF!8#FurB0q+fkA0I>quG(HN3XIno z{F18p?};$L@!)v1UWQknUrofbV~KNIefT z2FQfUN#G;ie`g+GhQ!-|uz1mq;g3VWfNn4Y@!DC#BIDbiOMw?W2ZRETiI)HLNF*@j zO-vZfQrk}7l7IRqfGSO_|1n}%HKjTF?6k@dF-rdM6XY+8s|o}5YcM?bisvt@vkCx& z-Re!ke_LD^pp#MaTM@ti`!s;VsegGRBzX7<^Z!oy|AB+ua0ksDju_1l2>w-}iOf66 z$JG{3m#vSLZcJ^92yyxsi@ApnRDVCEdD9~PA}r_zgjNnXsjh!u8W1c23vh&&Y4Pd` ze-Vz}ApOz`Om(rpSny9U0D_DA9)D%|i_q!;Ae@*4aWMQ5KrkRLQGo3~U%5R*@)u$0 z2S8}Og+WgI7yB+oV1OIB4oKIae-Tb714028j1ZhZQXB^AIS{o>DBW?LAb$~BvjM_H zQH+*9iydS=7eFSc4?mvqiM6R-el2p~zr0c?dSnqvkTP}ItWjm(jww~ibgta^hGdLtB@dOh5WdAt1Qh#88M;i@7891vI zZNy~fOhOuSr+V*3$g4>%J`8>t>7Yv`(HyrM`zA;?{C971^%nKi-UW%snW=6arcZKm%wYj^)2WR#`c5|K zNS-j97an^kQ=78&#f*KM{Ybbyf@ChmJ1@GjFrExH`D?YGE)sSpG9jnTw}#=&ZG=FR zpZp)|<{<&B#0eq7a>YRsc>khn`vnApmx1eZI?ByJ0U@;aY*I%V3!UM}OoCONR!-h{ zckq~nm?`3971W_zu?q>=Cfj2rZymVnA-0q7*2bvOZinsVi00exaT2uw((jd|u)Gj;KJPc@-#b&2XOd;6doa0#+@1eQCt~ z=%h8YF1XQ_*SzLMk3ErQFPKWV9aC)AzOYaUm6FVC%HME1^ zAcHyD1QHgEc?G`2LJxRx6UQy_1B~4K3e9DwsZ0<{hyKrm=HNnn0`!K9tWE9UgdZM@N#%Y8QL^w$vgr2 zZO>+fF-qa|l_d0j#hsj}*zLfRo?8-bw{I(vPbCw4VEsU8qK{}l)=Ody`C!f1->W_J zO3n=NpS;SfJ>cF2pzr?Kb+;#k9_@+L`7`%VsnN4kva3AOspyi@ByA~>X%6m-s7i5- zAfm5|YZjVRBtkdwD5VP;r>K_4Zompb&f3js!o%#VS9H={ch4H4yRFJzJGb^RzoYm} zE|zE}B@wcu$}!Ul=tC|{i68tAeUwH4&dZGsPyffd{=G(HEr6d(_?0YE^Ct>H7~=!N zQRz{Rf9m(&!@P_GMt#01JVf`8$^I?;zf%GS`#&>p%CFkLo$kx1dXMS-WSX3Z{drWd zmqjD$um6@HZ#aQcYN3!nt12Mn+!!&X2cgqHoaNt+gW|qPIiaWwp}&lpAa|3K3rEx~ z{vsUx|Id`)kv`WNmAlDV3kp*g0RMMlGH&D)PUw9#upl@iDA{MJBHDv?+RD@@0r-ghmlC}(4=Qchlo73NBjwc^KSb^>m{sTZ% zy$8JId!7YoZWLwxV0N7@QIoJ?S=1kqD?!-!D~(r7A#y71_V;Jc%Flyi9IpvQKWjc* z2Z7SqIOwteF_38F%|H_0Sl~h#uYx5mA^jw~TCe`ND;>sY!CGhsPe&O&^q$M` zemF*Bng4Ak(D)>{0SA=!{b}j4gZ0UEW;(G0Gm;d`Tf_hJVxEkZx}*|LbBiR+W7%e= z2MX_3w3bQsP0ok{1*>_{4|Mt)XxBcBOux#SZBVxqlZc~TWENmeNAc*bC8CcZk+|P1 zl*EIIj+OG_t?3ReS%O@zwBX;y0yb$3IVk=Sz?{VZ$e?NP>>Vak)!O%k%Kd<-2NE+U zj#3-$&8ad(=fSRE^rbRx{6gUI53btI!INF@cUFhyB$Y-9p5g_#6Zxg z*EUiZ_WI%hck}8s=LB++K+oGY4e=jdiW&oOX4?0ZHy-dsEQobq3k01bDnKFz`z~VU zAsLAa-Ie%BJ6k&Z!6B?mg07O+6YY;o(6Gu&4C}@`u%J(eHN{laqVZoeyWTV zec&dQgDj9u83rSdMAX54M5uNxajm-hUv_&B#HlD?A>%+C@v!BOCHfCLEHJxi>#Tk3 zg2OWdK2ks00saX{+Nq#~adgmc$@C0>i9Qe868~9T;*0h8; zD0J)sgN`OLULV16i0Qd zVv|{JL=7xDfR7d2_ya2qqvN~V%+rg}zhQFs+KL4T1%H&l}z9%>@v7V1*c{Gkm7yiao$V zpaUMi3-dxTRQcTx7QD^qt2VSM_mvgJ>{qA+vF<@CPlI_SxGK1rRfOlN(|2{$5bC&c z*5b@c_FxcG zKJafN9`vRvg4xqeUcgT?L%sFdSy5TiCJxjuVmujcKM8Pet#@9~E~VpUj68&(sQ`vN zDB1h2mC3jLd$KNpie1j4D&?hZ?;eil@;&{cRP%yP^M^H?PXIl1!l5_y*?*cMXDASh zII|`DKXxgmda{Q<*0$>z$B@`_>mJJjri%`QvAn!AlN7hC^R?fRi)ybX;CLz zSn+l5@1mKW>Nr#RcNs+z#@>L$0y~a>;NG8qp#fmc>Hgk%?kgfiuAqZ{||Kd zZ-%JeiUeS}^e+9!|0XQGL3P}t8vmT^-=qE?HYLChH?HT`N$80O{MS}1rR>fA*Ij^{ z)BDMfI<8(8fAIX;fEWJrMSj}A-`Ieb8#aK?jvVKoTK`u=yjbz3zCNN|BlwF@@20+{ z#8i0umr?J9-VhL``Ds0W5f=QvJmrM+tk1>lFXf8C)uEbFpTusqhqQ$Ab$fLlD&dob z7ZTTdYT3W+uh)$XjI;ZdJ7XL&J@fpAWTq39+4vbEU-Q$FTuY{XJMY@wH4?7v-#c6y z`QTort3-G55kJXhuY$gJdFODE*GTYAWEVkQo_CDafPC%re7gxC@QJ~D)@%e|d zz4J}yM3JNjN#3ESv&;x zCc5cS@x@|Xc`TsTDMe6sD>4lKj)LL7(Ui+%K*_Z{KLbH<`-5Lz+~(_V&AR#)lskiV z3l`KOi{-!8G3)ucw(Qtu>rxI^eJG_Pu7FbO?p6f`B&c|(8*AfGgN1_ey)9R{1 zI@R*hYJJiV_cOllWYHw2*xP>bxpaH4ccv@RON_ifeD<7t!M-Wbwr;}=7wg8~>*F2) zW*awN{A%PjJB$ogGS?Hc)m$D91&Otdklhy6B4AGr+gJNZJ%9WIgQ;!Th>xQM5p%yp zXI8?}9aAx^YLQk&vS9=qkp1}Hr~)svx>bb!8N$DsV+6 z!wY@D3=c}1+H%j}G06;jO#;j8&f}3s^aZ&59JRy-N#RSLU9a+s_7nd486<5EZjAM~ zXIGkz61ev{^3yK0cUBCEO4~F>DVdoGbIfbL948t+kW{Nwf5MODAY^J=b#2EB`mU2= zrytlMJlc^K)wK z4);Y@uAJFwA?%LJ$rzu48p17D;9-G=)Y&ZXSFKtIV^sYQ1zhODA?R>q3Pnt z%pT9cN(cNzO4z3-bG+}}*tBVW+VAAxLY>22&{`Y5!YmI_h`UE}?)hMO^h_6&_SH-3 zeTYDOpsv{(mX602f3=am4-{%{22Hu4+3THeg7U2)jo-?oCk@0#p?Q04Y!ZbXsZgl9 zX-+sHUp*fCyO^AK6t$2RIjl+j+R4f4rM4X@CSSF!_Ed{q3L9qva5k-Zl=n(Nyi4ra zeGQmWY*9tyy{+{4(89eRf*5qpJwzn=;opuuqwGgR8{)UMo!K*n2Bqn0O6wNgfwQDr zV1{Rs&2EI0K!pasE$0xrPrM|toF`i=QEBX<342(lsoN6KfU9iO}+aT;aG z5LL_V@%)A(ttaL`ZtcSx1I2a&rFH6*n)w>p#^Fd?Sy6eJ#L=v1wpP^~XD2)}uq}29 z7SEdB?DqD_TrwBm-CM@)Wzo=Y0@>F>p@kM{KD{Z7^a<&joTQ8c_lu@!E+oWYA@UEW zZ%9?tn;SqzGY5s)LA+1)A}`Pr)Nl86^Xs*6p;|(UVWvy-Nr@NA^JEYC_#LNAZMLfS z-Vn;LOMi7sqfWli#)ooyPjOJeN{r#0)#Dh+VKr%NZA#DQzwl<)@=^InXo@2*F{!Ow49mz)r%Qp0s)YPW3D-=CCx2)aV#YB?j z5q8|BGJ>wjKYO`dF>9xs&5ZD&wKhv&Uz;k*rX1r&uhlcBjV3Qvv=p_|M~Mri*7sDn z^89PWUnN)i3udx9T$RbCsZT^i&{92S#g83|z`jH#)RFRwSZIbrVYG=*I&OFpj&#|? z=iy1Q?r!cU87*_N4SF5IcOHHlJggQ%H{hC)fEo^Mcj|+^l18s0r|1AWPVv@ZLRfhJ z=-W!KBhSm~@*$(_${c1t-I?tphSFoTT5mZf$Z22jM#Xaw)Ah!vD^y1F+_7$Sx#j=_ zK|dA;zZD1cG$jkfJexJ^lEZZ9C->9C#fxgxvUWhOMrOE(Ub(nP1=L7?-GLn_AW9nUm!LI zqp3CMLPRPfhT@*08>1badeDTC67pUz@5n;ts8^UnMG9zv1*`*dGPj6M}* z-rmcV`z0of>ppGa20MPQNXewEJnT(d_`A!}+(rwj=tAwSyLey1mk575(zk9!j;hc+ zfC+gvlxoyP(0I_8-G)9A!3m;-RVG!iib;C}73{EqeeGgI+RpABC0FHh+#(wnW$r-T zqhSYPHP!OnD0=1v62g%h7vzH-KO~$1YG~X^XSzj0BAaAWEJH~281O{W=TV1Zv#Wh?VD#2`u|h!amiIjC zluy$Vy)18kh9E;)7K>b_`MKGvVyC%MdQn8LxOajwC$B}*%dK%Bys4=-`x~&e$_2z; z>E}OtPxC~dh;C=tE_THIv-oeX*-io_XlNLZKx)eg2}mkTT|xl@5jA-)@(Lt1@_0Jy zwdk^UzFcfrA(d93!MoCe^lw;@k$`&@YFGr@&Pj`eQ0xr-5j@U;h|KQ0IKB_THOsOh z{fC?T+69NdVb~LDo}Zx5C&b+%rSl&Xt<(mh2)(>GAuY|sBawtNb@m40st3aEo-4J( z%eqWb#atpr__Alzde`YVey;FWD47|vacIaMKUn%npq){Pp5g33BYqtZDJ+wK?riRS zJjlS)AWlXm@+mj`g={e#E@YbwhueAk9x^O*>@Yw9Cp>q>$0vb}`hCrXKqx765VQUF z-ZBw*t>wS>fOBzeI59xwl*n(R8}Oh?dn${Fc0z0GAxd$~#mxJDV-lP^zv=Zlo{i$B zadbT3Wu%M}7vzC2CR^SWl&;>GhXvdv0fD9a2g$c@D#H2}p!QI2*#38CheZ6OyKQCX zq5aNt5%2BXgGL3G#>SRIg+(h$oa9W*4|~BY|MO-Xl8g`z*SFt@#t%V82~zJ@;F@B; ztI0HAQe}VhE&D4^b{ybRU6^Bb+h0GdslRRZB)-eMxc=pN8y@eOzG#Fa zsV4i0$|cbqQr!jtG9 z*z5(T4E6W0LlNvV`Fss0$!7-noe4biR&_2R`7AS!ThbhB!%l1n=26CDN{I1=M7?JadBpy+;tCB0p(NcdxUo zx}?(pIGvZ3=BK)$!90v&5BniI0=`jQ*;x@CVhA_(D@?=ugY`_O9&~ahGg_jJHhCVD zRwnWy{MZ;GBJO z3utj}0GCGP;#5pmZV$l19I-U2`AbH^C?0NDZ-{e*kO}K*$mjo@uzZcJ84&ZyQv1xT zwThd)DW(M!M`e~N_Gt3Nrqs*6affB8+AK`15uTb+t(}e*aS}lr$&+@cKJGJ`p#^_S-C*&-;oKi*l{v)0k zECNc{FwduB6VjUG35Iu;iw^LTZ#4yW9T0TorFG=QBT$2cM_27Y$ky0hKcl?YgeU1m z0`4^f9#UTAQ(#{@Keh|riQya^X@lvbb6jvEg$SPv&^U(tt4k^}+Vn>9Ek{$`g{nLT z+~O7Q|I=)YeR$;bc?}<`Hp9iN027~PZ}dM_*Lft(_tTQDQN90*NPAwhnc>x(WyQ-e zrC{aB&@0_&L_WE;3VqBWBiZA-BSQfmR_`lm z_x6XO3RtzyZ0`V>Xtz?CQJCwlv>mqkDER*K*8-e-HV;Q~`_31Gp9V7$S7&-xegeYq zWRF>Eyj{nzWR*(=b&4|;_8m0{M6Z@d&F4Lx-nYw?4|e#G{{H^WmlABsDp^JQ-Vg~wB-l^}dJ9zD3iBT~1)|6X`pOZ1)=&xC;njOaB$3}?stSXBZ5VmLv&6Q13m?i;CX+2S2xoW$GASs1WZA_zWTa>2LdXtR zrX!2TOsldW?shtUQatrpwQZTrL@M$;Hio0W zo-Z_>Q8Vf~iWERIpI>l$Im_3&NVu+;eO|z2{5M@henVioI6^Yc`nuVJ-u3yra`;ga zzQKi#%P?uDfI&=Vi_0?9CGn8wk+?ifNov!NnONY@%D(Xwac&Ax!b}4+t)5WmjV&J^ zyor2xpDTZoRn7bx)q+BN5^cdL#M@IpE$vHKNf?OQv?=CT0DyG{V=p_^7zW)}H91JM z4g?~&;4id1!jVy17qFtq;-J)bG;dHct^k5P^PbHhB%g`MQIOWv@}vq#K&EzOZ}{AX zk6w}U2pq`ftp=((Q(;*mCMd2B^mi}X*;GPRPOQZ@ywqQmlhec=U5t9&K8(Hk)wUv{ zI<_PUg^FCu4A?Stych_un?uKt5ZpJ@n38#tl72oB`Wo=e84Jwn2_=WJtu)z-9M3ccZluydg4 zp}{DDZkunyxJuYDQAB)0%0+VBZY%)8=PLk%jRxJ}qxKu#%j10|`eqAVc!=SI_j}eG zUUzlfLNy|3M7>ST+xdq5QmrP}3$5FnqD{=OSS^tc>X@aZ!}f}L+Zr%YWr&jbU`|o$ z@=td6T8(_^@V0FS)%D`F%5#PuQaq@}0po*hZcCDMdIoQJ)dM#~k1nT02+!9$c5Rfy z+24YslBv@4DPf*OkUFPzel(>2)rvhs0gz?gJ_u=KY-i*k@73)@e7(WFD$||OHN+yf zws8lc6D9$hyu4b7(KUcce{0zm6c)<7;FFPF-@@PnBpw=`4ky2RaQZ!PfGg1n3+sn3 zUN%79ag+btW9##F1PY~F zS$rpB-BjsA{i<=ijJ>?Y&L-0^r(qj%Z1vWRxtw_~^M z3~=~D4i?qu9$nPp@$!ZrmVxDqzE7(XifS80Txuy{JxA;;oxlS46?~UXw3Bj~+Vv)t zjGE5^2}Q-9^Njm9EV&1jSFbOc9yxG#S~-@qqM4=yIN>V-D@6x*-d4&$jcT8p9=FJh znXN24AYZOp`lYu&;IW~jV$EAwL_r$&{eX+2>XX-t9#VmPLlh+ZZO)3icb8s+8h)6F z^x#4-fcn^Klz8}@2E_CmWlSi{7>3Big7o;@f32*q8;u*NNN~=tvndQh`Qydg70qEm zs2U5(19cFuoPOVDBG^Ewv%yb11X;JL6^YTCl(2&!jt5)3aY%UYKxMDrcl*$-50xV` zfW|5a2bQI^>Xp|Mr>5k~^w3<_$Me$E8~fKr7oBx^6OQ!%W^Rpd?g7?Ewc|s7ZC!~< zArR0eY>|q^KE|3ec~fIu7Ov89GdXl{#|{G-jn(d1rPT>}Tq3p9OaJFaYHUb3vfbth z1THQgF+?=_y~sH3$Lct2I^iMEh9!|XN-@|Ab0wf6=aUJ>*AF1vZKpv+=Uf45 zBZWQTIR(t8!{ZjHp(Qg>pe4+r`)NF9fWEhHvI;?h>dAtVK&~Bmm3b!tmqBfw5m$it zX2$FnBhnDEt}3{B#Tmrp&Xg8^H`_Mhi9N`K+*yQ!^xD+xYnx8i2U>OSumIK&rXhKJ zX!1AW1`?1--?q6J>?5HMp}^6Yhm^ywYj!Z0UEQh>$Cuc|m>A;C7A7of+Lv|JNt>JJ z3TmiPTYv+Ap{hKRk}|*36~2=fW)7D2%b3Y*eX0AV$k4Te6zHDe2qnz(pkwhPE3X3y}=;RS3gE zssU9&LSi`1tl`A0qRc{4bKe}Z0zTD8Wvjg9@SBao@;q+|&p9%JvT{B2qS%#Yvv9jDPw{pleW@ zR1n;68N>1Z5Ig=36TzM&9T$yXIsB%Md7{dtARFKnjD$P2-|yXOj8a7|Y+GUu(q1_~ zVbqIb%>G2g$HcTM`QXcdz?TWw+Wu#rQe{!CrF{`oO)G-+eXAM#nbCwOdp&y0`i@Ix zX?qF|z1>6A--x8`Z{=dWA#-pYt}^og>(L_Bgb@DYOAAxNq& zeiva3Le<>=$m3>OSl$i>+cJ&KPiclBXT=CxW!T|%SAM^iD5yGTQ^?3@)r5nY@u3?i zJEvAmDF7%qqV}1{Sv4Gw8B$>0rVFA+$uBEo#9%pviGu08TUB3HuEyFmyU=J6W4hO_(F|xt*eMQ)4ZPKgQ!iujqN<%>;AJuZXEeu)kApxifC-(B*I4z&p zgYtA&6px8uOr5F6r``~%ik&y*1iJ&7~o0nW^*dEACF~dSw#bLGh1| zCd*+_3{TY%QQJcYZqX8TOS*Esq~{g-oIc%mq!3>x_JxRU+Q@rAx5)Sz5}^V%L?l48 zm6N#&vqjin>|;kn_8<7TbyaQ5oOIUmRK9uA%=yJxI@3rS7n%#lP!z6C&tm@&99rAq zAElae!}2i=ViyY-FJ7k`Q0Fk+$zR8ZdaujZbTtB3*b;WNS*eBdkK22wwGfKUAzyma zjQz31u}etI2x$eFFV`68D#gC3w&__-7Ixi>Z2H0}C@Qfea^|(o^o}8`cZ30ae;R;Q zr(d8gt}pY^;% z2jAthWzige17h;hG86$x`52kfwS^x@L}1-;yj(yzOicn;kEyrJzu;ge(DBPwRJ0>= zX6Juluofk+}um9@*CGXH7cz zg3GW}qm>;K%P6W=W^f#RP@zGOE6 zS0lUgW9Xp^Iqber{%}Rn%u8KrMKQL9kO+T2d0zX2c&jV3i2D9QYPX^4qEE}?A zj;PA2zR)X?!}E21Y65BBzQUQt=+CTFJ@7j3cwC~EK5SOHV`SyJ&Yy zPSsC3M$f-YuVH-*3*h<2LKn{Us-$XvXzHA3&5`Qs1Igull4^O^bNN~UcD+Rd2AyY7 zlQ`284a)E2f_^Ebu&51i&u z1s^ng9RP1c)C0v3G8zN?5V!iMGy8)lmh)cXhn=M(e~XMzZS>_@`oqi@VDc29Q@p+J zUwK$q7)~(Xy_aQg!Fr(c8Yf?QE$-zp66$0wQ*Zr{YWz0Ogf1(`c}hM-;_Ud5;s={b z>d9O(4VIi)b|=MVj9xhiy4hUZYCS>uZX7^&@hhIU2*o;Ao&{PRx$jj2yd*nGXi`>7 zVmb2OPi3Sv-G=K=H#@Weo7JU%{FdI-_Un}9;?(%?=Tj**Y5GeacCshOj*IdyT|;TK z>~G;3wJ&w4bDlVhDJw`2NG~()EX0V56&*+CN#fJp=Xr2kV4qudTuK2uA#%FUd`$)+ zn3mUQ zS3m-A6Iv7`)S6&$Vc&~d?Su8lOmK2s5u56z+QA|Qog+&}Q3&LmtJAvNwmWPrMaiaF+?Z9LpUv*6XnBWT;Kn%y8s_pTYhKJXviFy z5p%|jkM44!ml&W<5Qwdhd6{;Jbl}6}&k+LHhGD18D~=aWcIC!7g^8NgmBX5LIbx_# z;;;kAgSjtktw8=~jw~oSXdP5wRo*hO))tiItTRipJBh$On zpDi}*dKiH4_TVx&d>@SJp-Fs$`?Iu3?VyW& zOO{a&yRWdQ%-wHktn(l`g@x!yH#M~XTZx={)z-s9YoWlM{$=uDCO(0p@O0qLfMJeW z35c2ub{`zAn;T!4HDQbesVJpz<=?*xYA7`t(QZ}SbNT2#Q@#*}BYhVh$8I(V_N7qT zsQEx+!NObrqBRH~A2<8B6A>Exm<#?&BlVT14vADXi;nEhC8=0&D;I&XD`N})PhWpO zXBIS#>o&lv%hxyoenD+7Y^NF%I~V)Kvxe1?DFt^14=V8@eXeIAm(C-*tHgdzESJY9 zwZCAwk*fsRx3%^8s2V`&4ak~rpW0+$FrewRl(`a+8S)5WXO_BzMeWi1%k!eL?|ta$ z*cMPzRNBfT3VPGO-|v(t>wTB*F;<(Oa=vsp1~ivfM77o;t?7ARmdxtkw767nT3n2v zS3cHY-fQ4Zgjdn^d8u9gO9_Q~Oh328ZP~-e5&hT+DF?Cm(C&i9*V^+>G4GVq<52z1 zc`F1o1Nh#`PG^(CK0(v8+H-^86GCfeaVj5krKVP$4K7K`4x3fPr{X6oJOi!Hx!^0B zzjrw(Xmk2=&L0J;zNiLE?+LF`85}17txVs&=lv2Z?gTB6?~Xq+Tk|N4O`VF&l<=WX zzEEITosOwTxyy1V>F9sHgs(eBuyfiluv?DRL*f?=agY*rYZEi)X=%{g_HbTPpQ@a4-` z=+$IV_N7xM(y&F%Px3=zb^IKI6avk)|8ieQ?dZQQVy)_pLzj&UEc!t-+( z0!b0;H;RwpIct9Z4ab+05iGsx(%pgw)eNZi?rFYDO4j}EEjdYh_L`++r1it^`T1o& zKWEN8GnGi+?2WBheAL$-k*alBEWSQusWUvUV#N73v37&M>w_>*A0ax3f`E|f9#!-O z)+Sm7=pu({Z_?(5pF7?sH)>G&ZX4!8w>)K4QXN{@sh{$}(eMS-j}n%nIII1nroqgt zH6#HGzyI773rnzBcbilFh5MdY_Aad#sEo$hL9ze_mSZ7+@w^7wI(y zd1z~FL53VN$qJuIpuVkCZ))mqQ>Q-?0^)nys9N&F#3uYLZbP5h6dvqIqHkpII6}fE z1MK@-%h^jjPhT>;8Y2S>A}Mh}J+~YC(0$;%dn9_~!b@NBx^pzDmJ}p4Q>7KQ=Y%Ky z-n9*2h^ASPU;B^D?F=!!ZJR6bbm*xGUypA07i>GgPmFkz3yc1hJ)Q;xUOrKZWO#VO5$N@7ov6a^(h6ps79<(qGA6}H=L6@FI)W@RL4JwmW&@y zyJHj}jl)xZqWOS++=3?Ekfty!GgpoQW=6y`8+JMW-r6~Q);?D%9}BG&L`b#3eOSKJ zu`OHwbpe%HgPA!!j2w|qKUXeVrF*NmW~E)8gM@KDjZfNj?(4v2*{!a$4P`r|BZ1vt zcy_xpEZjj@fQ?~=?{&CGUGBH?-K^W4@52j=#3rmJi(kH+u<80qO)d;Fp+>W%Jmbr) zx;83xighnUredL*`?Rg?k0Wp$NFzUJwWmc*vJb*-fEPXjS9u7y>$=mAQ)#Nup@X1M zoOS+<LrP}QRl{y=Urf5Dk#tdt~`k@E8kRWUosn5IvUl4 z{YqI3mhp%UWtusP8y%`GzyupNjxnGvnfo4IEq`zJi62MeP=vPn4-(ELOFo&hnfEMC z{a}=UV_Qa!t8t4jHJw3myXwe)MxSh9624E+F=QjgW)n7>yKU3nrbC4z6{riWbycZE}czfby^)!dk%Y zAfE#i-Bu!Mh&S(kuj1)~QGli0ug_qZWmTw01sxN1dzK^+SwxigV;#Yyl6_m$GcVP<**J^FEIZ6N{yu9>e<_e+Xw{Ed*hv!&;&4ina3Km=wce6D|M?JBgQ_^!vt*6^ri!Z~F=OYRIPiNb2CUF$EL*znS zvDaQSz62-b-0?r3^nGQ`XUN3=-lcxsVd}Dl`Du5pDPaglood&<81y| zf9N?P>N=@E_Z`O@fq|FYTJ6^~E(f$s1nvWG*mrxPo>o1RZ3`M7zSpK>y38VK5KCxU z5yARxNZwPKoP*Y9nn10sjv^`t9?Li*5r}XP-w+7@h7QfhkI&0ucrQ>oDGF2R=+Ylr5j-x23KA2n> z-Qcj74&H8@m8D-orM4wq7_q`zk}C>#4PT71^|r}N;F?+e)G}bNNZw7oTZyx7*egN2 zd8oUG!8b?5R|walBKf>FoYnI{&M14&=O`0bvR@?d6C+>keSr*KLg1aX zbyLrOy@2rTP|Hix~pC7bgCaZj1&6C<8~Z}wV0mC zYK`U|qaMbZ&MT!M>y--F!kak}RTp|@&pSJ)4>uig0z|-#&j{oNa+txsEZ@VBcR?s| zMbp+WO4WmhKTzG<4zv>IhF0|L9`BX1lLG3?kI>E?4}UPRdD+O(cv$NN)KcU`w>kfy zpf}y@H@9fPv#tN^)QN|+`eWZjBEsn1KJ%3uNm(V>m-TIN8vd$N4UY0W3MNf4Fhx*O%^NIvjEDDcH`>Q}>zjfU|CmHe~zuI`oFX zKkhomF*vuMBA&h}9dCBB7W_D5BXS09!iVc_i&_XUCpOWO{jJwR~6DdhE^6A@| z`_YT*p*X(EKSRY}=t9G^NH=&p4@KdeDdB7JG!+6JCA+Lf^^h}hfu0w-JGVReTbjaG(}6G9r(ZkO_lN1N4#eSMg_|ZpARWm)a4jC`pt`GdD?F3cDM&EP6OO(iX(f_tPUSn#r%9=)~Ug3*_5SP0TlUJwOB5R z^18QHiN2>VwZS+Ed)>G|w zlG0t$NOwp#ICMx!-{a@KzV|=BM{w4<&OX=P`&EaE9=z1t;a773sVxlfeRBn=eYU$l zLVctK(z&;eaxP2xFMnJ6YsTl?-+Z9UHM#F1s_bZO`U(@eh$xYK9VZSa z$$t5SUz&32c5IK8q)OJNVr*W|pr9$mf>e1HF;X~}wt6+>tt0V(>q)ak@-*_N8oYV_Y=3^K zz_K~p)^!5H-yJ++o5gLh-7VRky{l58j*K3Z7uBFswkD!GSP#&KICikXR28sp;J+2! zF7vr(XfTo@&tkX!_pYEvI*cH|Jd2?yUBwq_QGk@ODBF$b{C!gk&)@umDPd4F&&)KG zcf;khO$yfg!72l^x1!xBFhfKTQrN%2+5g{^APIm?37$8}caU0{yllh9z-00o&8^0O z63pwu@18Ve)KN_<+u~$%5jbVHGtK+0BORRa$7n#VPxBVKQ~_}bv<^=h@7&Fjv~2P( zd0n4!D-Vvyfz7ra&*lWbYLbub$jt_uF&C$qN2tO0iuG06`5D8nwyn~SKcmZIqS;9bIb^vBnSqUwKBu43=vRs-a;}AxFUuriwv6p7b{| z(s3HWSWMF@hq}vXmnp+$|tO7RbJQ4_@&}?E3lKWj>)EAw_qsH=ujBmf6c0Qm3&8oJ(7Z7qsGsoOJ zc8SL75abMnNKpXZ5<{7FmNx_$VCuuc8Vq`-}u9n z+w&Q|m-MUdR;^5DbzbiD&pt-aeJy$q=}K3vgL?fO3EU2If+d*p>XhvY;yC!xa#hsm zGmDhu9cs-08kvEz5J@w#yJ>zIIpMF1>G9Lox@{fv0rbuEfc%gM>I8|nPmkTJDl@^X z1JUdgjH_XnyOe|nvc*D_FKoq=B!)TJaA*W^!urz7ysJg+J766~aP^iz z#AOt5eu?{IuI!m#BycN3Z~=C@Q@RGBUFTP?R^4J^e@$$6iI1&dq&N%_bA$1oWs;~v z{%|;T{_!}7CX1mq(jb|0lpoUsn(W14K;u6{X`x76vA-i}I7*-47Lt$bCd9hZz#;p1%QD-y^J6Tcr?8(#m|;mTpa#ZrVVa~j z(MGQ3AZ$CM1Er_v+aygll{27fA8`{M1Go~zjY8p)846wKuSk4~Mj^cKEg+`193z?Ca`Lf3&o#lFVdB3p0*^0U(gx0fqu z>bG_6PAKu;FU5wVj+SY<3vnbzFnXTx;$9On%n4(pGys9bN{Lb*k9JglmJ_&&jIbQV zMZ*T?4}-|w|)p%}k#9-I#dtPts-~ewx?JkVsPB6L&mSQuvs-DDz!qjFmJ9N^Yr$3WWZ zOjd*#jMF4A)a#lZ&Dq8vEu~F{VIUghJ{AT)(W2K_%OUGcbT|Ffr(aJ{B$PXAr+iP2 zWg>?ZjI^VVvM~nkK<`)D82pG1)Y#Q};IcG!_^sb%2!p|IkVeHB>%M$~uR9@i%cZn{ z5~Y}Vow&k_cQwEu%6B{eg`@rxE&0#a42pGS)_S{kY;#teziE+Z`Q4#GF2?z0>M@xGUxPQOLJZ0#|8FJ5E|8 z)OPd3vbL5yz6JTHw#lNOcixh>K`;^82BS_5rkJQ(mfNf}+BP=ZJcJ~u-((Xis;yTr zV+^q&nw(qac4+4aeRnIYt>Y$-FS{G?-f_w9T@Jh$>BBnNQj&i^slHM${dvh&62a$C z{hD6ugFr~@Q=8II1P;2(RU^OHc`(o~PY1)mQ+Buo_XlH1458bdp<-2=z)>UA+J5r2 zJ)ikBmdgn>ow?%m?Rlv91Gfq_^W6t1A*mo zA7xTD z8sY+*n~FF7An6(y6mJ{n{90VhQRykb$W{w3&Q&V?`6Uz&Ze_b>v!K@#j5HG%XI5ZY z-7my3KIhYtMf@}_gNVqxBwhQ>GD{czu}q}pU?3{pA8d$vQrGj^;NP+bxtYcxOKv99(!bPXMaKQE%`X00bIf644A-v4q;;MFnGV4qr39 zOUnsn3PxhNU!$-(&d{5%TfBn|lY~(y(EAx)?bWyDa-Jt@+an%6a={NZD|a_rjNO>- zQooD8+Q5>=bMg`sqUbcy*n`jinYpCU)nz$f`yB*|JcBP!x`oL703@Tpj34owhUQyN zIs%*_67^CkJe)!>S1{a2L;g@#NA8Ln)g;qITz(!Z%zjmeawLlwY~nD13jBc(^uDmw zC->LluWZ>qwDa-W_M^nN&aILa`>Tt;Pl-G1cHS^$&un0rAbkl#M)BO4+@`!$G49We zgT^D=$~YDPPn)l-jp4=JKRCfOG1&VT1#KepIawai*3FRnA_5l13-?&I%7Qsod{E?I zE@2c}-q#T}L=AxW0#wKdQijX+T{Ld<_3d&y)atQt4MF_;iuAFX>Ctcn4PN}*bihp< zD7l^iAN#*8@1OCWm;kor`2&F~OHoy2y1N|hnPkgY^`i*lL$$x7X_`X5*-y&QM}F}g zBvnp(4+$?=9F&ro2HNimwEQuD$43CHOyB00>ceEIF#oCH%fSqg&@g)MENr(nsvY~> z0aN{wIGAjSJ?NA0prI5R=2VB*=74^ag9a5nvpk6c8E_&P#lM z%9@kjw}F<^j0e(P7n#phMnWXSq~!~RsU%zrj$4A~sW39LC~V$QcAnK9vi&O#6Xsg= z^dl73IIMRS5#KWOG(8c977jUEOcS3FuFsxv_tnZ@69hw31=B+K%YcfOIo%de1IgGHpF?;ziLz(2x<>+_~-gFK95TxdqTk9fc)q7z5A zKtD|`;ffM5j;bxTB5WiqKTlZ$aFoIZ9>@*3CDEY6Sh7(kInkKfJb~W8$b}!+qg_$W zeF)+b#6>KgVB5+&C!T+LAnSieOaVJ$cxG@oCq8!{7hlHchPt`BPCt`oF%!JWx1{%a zGB9lzjEqgLG99AtAYuj&GhM+JzQ+9c%U~6mc>6fJtmLZ4;_F&+_)8c9X5 z``TI#*H*1Q-9N21_T>UQH3U6wF*=`rkucCVS}RPXVjHFBUBSM8DO-=sc{?vJJTCZ{G3K0(YxPqmDUu6N~{e30_hjJ~3rh zLM#bwM0AXi=2GgXcTcxT(q{MoiQDRiss8BnVrT1QUtc>Z2%{ix=gaRT#?gkx@1oK> zLEf*_BA|GLg5OdoVgFOdVZsjlGo+6S+=J+MeRNC$GNm2)Ue0@48DPOMWFaAea|#2# zcuVRRnc^_3M+167Wi#Nx%x%9Me+htislj{1c6|s`YH6Q-`8QU0>vF&XB6?DrhcMI) zls>4(9~)%*$I}l+DGpR%`txviQ{g~>56`h)lA(iadCK#{?bX|Ab0cwO%*=C zdUJ;&Pwt~Iwl<@qA-?TiSQUSk+J@r%c`8KwfU_g2HHV*ACMxOO7iGX%ho$#q2m?P( zAX12Z8a)-csl7?=iotnK&+C;{3|QsDZSAH+$B)o8#Xo*9Rehho?7_$CH)LAa^zM%m z5$L-!c%X~2c%lw!s`TOCbWZ%Q%1?-4r|$kiE1y~@r^l0Z>Focs0QG^8L_0L5SWRzX#}ju$Br&j z?RQ%R;Hj)QDi+@B+;~VpmfCBqk;FKQCcrx>pY61x4yZ=}cux5c$n?I`W<4~30JOya zDIJ8r9{1D@1asm9kc3Z{KCT(i0D+0-99Bz8B}%jrB&`oGWGt z0|;hjw=IXRC}tzpiQ}=Qt>V~U7l}=HTJv=FZdyNrP#C}$-Z8OP!p2noo#@&uj#|(+ zZwT*HJp5t>UC?>DTVd>|<(LEJ$l|uy;5XYuO&gB)ulSuu>n#f_21(IjyooUOX5$K)G+~c~iv3nN5Aun3v)O))uE~ zp4Fu%$2X~$zjhuX2-cPJjfAl?wFP)v7MPW;fOPJ&1z!7=t%cA}+^weQW8@4iW4`U9 z_9Tk*R1vvc4UAiIw)v~c;%g) z%xq&A%6FbDE^7px9)QC+~rVuFoi-{^CZF9)73LbFbgAL^J+&PSghh6 zN}x8VHaW3{X)-b5{oa%4Iom6y6d1A^e_>ItZ zo|4d2linLT2Bke8^lu4QK3jLKY%FNC#yzjxm?IuNcDvB9JJrwaPr$Pc+h)9Nu0ALBmEoEg<^3Vd=63jxfy;!hyjHFr{zyzrQqKfXd{JVQG9BEQBPgzZ@%d ze68S;Ux;B?&m>G#W91o~Vr%o^P~KqtZxz=LS+C=?JSMjcqSvlcTE!SXe6JrxRyK?% z%pYrJuHBbW{gqB=Ho!$F+NZZ-foX5!x{BKRs2>87ig~-gQ*$r>MjJ9MBW?gMenf3) zl7gcu3jv*(YJ2(loeZOOo{@QwTeQHZIIE^^__MT&c@aq)DUDTa#g(c-KW+c?PrVW) z#tc=GBE}BmA;B={8%Vh#D(iNR4YhHY$@j=be!dw%2#6896?8O&TaR5W53oSu-4c*0 z*gSs}23FC>WMU@9uw=^y>}3)^p1yChH(XNLV9Z9K0*WQR@4cb%x-`T6LpjcVR`9d) zJU>JvsBIcKl9Ne7KuM&uub{SUVsP)BU-h`J%nXR)kgy;;aM|ncmgAB3iGk z-5jFHTdG}fDnR^UKy5T;*SU16+TEg%G?PyM4PMbRoH67P$gDmn55}l z$dcqW<3w?$=pKm>lkn5IhSpr)jv)is^>_RH zXOEotUQ}WOFQUT$FwEo)`X2JV(WqG#GW~p(sLWIcIikPIBm|jbq@n^fHgO)hVnsHk zifWYwnGXm=vYxyaIyjO=R!6%UOsDqO8r*^?fT^f3J03UEe`bUQ*e0va-G>9-0@{Z8 ztI$#m&_`&jt1lw-l3q9);DD~pe<}SLK|^k!(^BhJxHZB^*cu_Xs&EQWkjNK<(04n|df(SvbcOEJNU^m(`TD|^V(59@rLUBokL%|pGsb(( zzH8lI#aL@9`KJII;*!pkj%O$)1w%Ts9#o&o=j@gqX;1pLe-Mx=k~%HPWF^s`6@>g0 zX*~a40dp=uyq6G6`~p_&x|v~1h~Jh5ls?{@nLhfRE-pnPntXd+PT7v%zn9mS2n5=% z#SF2T_j-8*Q?jnj`=$=1FIjyY2c=zF89dpwNdsh6HN013g5W7YV_5xKlrWAy%Y^b0tk%I!29JcVXsJV`0C z+%NUNU$Bv*=2s(u&CjOfv?J%yD1inuxtZj^c5=Q5O@PEgkqA8)pKdnFfZ1~3>fIQ9 zn{)w*DO?e<>Pm++K(f+j#Kd?g9tg~2p!|jh-`<`@8&z-cZJyrE?G6xlyA;oB{hQ?^rc;GU@$jqno{w)uk8CCMQei#ORP3UK;Q2~Ml>y0q8$xJ-altK#1}Tl9X0eNbY%Yv z)iAXssIpvCA-7%*+__>PD;*;QSWf```^CN0CKcPgZ+=5{N zqB6ngc|eYL*8Ay2-9fz>;mm_$J!ibe)L4lIpxG`~?HTo4lnhQB&7LSJgt5t3s@T^> zYK_@$amd!T!{gc;cIJvfgrB5!yH32qgJ`A`b=Ul7B`_X_w z)KRWK1f9tGyh~bFPej>n11CU@-T46EE#!C*h-$ap?quZLCzS{F*9T14m+nfk@ShaU zmAIE4yBi$TxAZ;%Se^e2+#?-LvZ@4$IZO$`n~)|-uhczuOjluex zD6fwxKw|lGTP-uUD(%?Ugi`qVLvr1OSA@ap%cqeim%Pt8B5$Z+{1!$N4=T=hii ziHQ@1RV(COPO<9XhQx$r_~lKbHg|1xF_O4%$UvE^KBvR3U z_Ep?O%szE6Y9e#zcQ$vS0pV98whki~Umr_{*A=p1Rrc4#j+93YC#x-SAD3H6 zGX&^B6ZF>j^qS923ei(ztYGV)j&aWmKoDQ%z%bFSrW6?rR#=K}{uBAG;k|@}I<@q+ zP0fT%{Bpe&tcRbzXT%(1?Y`H34DppdQO&l zumFAfrMnV1gOVG%GY&QUByrgcz1B;mGp({g8@jlCJ*xusJ+%%~h7Sy{drYuhD|^iA zqAqS-p{DDBsq^yTwdm(h=`XL3o62H-W)Z&@*{Ahe4v)5?R}=Vv7TzDG#P+@c?tl>7g99@j$>e+ ziUQ2N;Dpf=2c3iVPY7++7HSMS4ZcIrG3Wz#7vWIZm61|DwBhOT!~N4D!;h;f1D&=l zjE|yuT9saOE2pwzzd77^owG#ozVc6zwI>anW{x>ZATR@e6pkXB1HCSofB89hzc^LQ zQ+>)F@b_48k@rOUx`C>5B#@Dp{H+DYTupJ%{EHnsThSf%5cDchAdZIe+xf#rQ^A{N z{F_q+Odm0sB9TOvgsB8GeIvfvW}%lVdzqdD_e-a~j>Y4)l-ss@EX6Q2(htbH7$=f^`Uu}2bLSk;tbulqEN1zcN z^hy9<7fb+tww_cUDKusm*JIC(vW}^6erPwo{p%#TVX%sxnf=7I{441v55;*^^|6@c zltk~tLr;^hAn9DLh<8~_SEjzmZRIotBG+KUCLRH@Ptlol#UG6+n#X9TArxhr$MtV{ zEyYs{iL_B?r1YP@&wqTF5*Zt36MS$R@0VCC{WST!kNx^!*@f(g^$)%A_h0?fenN&E z4!f0b0kGAE*S2w+^;|DV#F933TM09NK9ZeF=8E~61;xB!U`&u*x%FPQ2Cd_&|IxY1 zor_M{<`aV}SH_~7B8Ja5(Ivsr(d^tc`Wxra&qE6kO&<%r-ua(v=%_FW<5E|>Ou&4x z^(-^=*a@WPML;3ATmVEe)V`F6XqCHCV0=ZJDsf@BV*)U2lDYg4Arq$ZGAvzili4-q zaE`dzTd}1TtU+i=6fW*SAh`pey}Iqjhm?T?w;yQ=`bN6Wj#?jJaF`{lhug z#QZCL;yO8xwB0jNukO8+Xj>03hA14`_=#1&@_axf;AMJ5$Wxg)?V7$4!1TOXu{d^U zhDCCf}r^;&bdK50#L@8dG(3VFo7q}lidv}QM0ZMfz&IE@NOEPEOl8Wb44^q?G; ziaozQ^%~M>Y;4@)=lLX+qnT9QaVE&Xi-F?XqSv3nZFLZ{X!Oma^Vr}zw$nR1-SO;6 zuhGE?+rVYwU3GTe%XMRvx{3SMRg}`xg#h^q4_^yJvih~J&}?EGQ|XCV`I!x84Vmye zbpcy7bC7?J?;rqxE;f0gNgaod9siQ|a7m5a0<=DSKEPDO>W#MwIaXUZKWkb^o%2o` z$m_B{sr4OOwM0HAOH)ZHCZfm^?>Vl)J|yznCer`3hA3&da2i#$+ClS%c@2#=2zsK>FNf~Kk=X+hV~E{&POA%xE=lf6?S#>C85m=n zRqlR7f!_(Z%F(CJvL@^c{I|w#n72$-=ubILH!3YN=Zkq>R@4@DdSOi9YFK-whKKom*@k>sj3muH&C`3{BN z{jP?SPRior8pAV4Sa%8Nk{4DK_|(R`k#jlnOv2wVb9OX>6ik^j)>o|(**hgb^rW3^ zKvlmJ&?tT)gE|xca%E@Izu8gTv0y`CR8MD4>@t}}U0L7Y*uSP7?=(V0CdCr(NVZhA z$ECwa9PKlVnKzV6V{0r_&EuX+)w%I~m9Aj!lbVCY0-e&{DXCY5tWu=sR{PiAldm(( zrTU$}G}FrGGQNF%nDl5reqLkOm!$mLgK}_F%y$qb_EaF$y!vU*r&N*hX$$2LMeHwp zr`hJ~)J7IWJ~ekCfUlY85f*Kus*};=uHok9c2ii@Q9(ot0#wmpn9*Qxp~Q(qSs{BH zSI&?`vjk1SyI5)qW0+wOMlB<$(!k?>ZVE24FW2k*)upAmPfC(d$IhNAaQC=LdHF{} zN=E&?1fa7_je(nH<4^bb^ZCz?yN=E09c}IOp^BQW$gHtNr=0=R@!~nt9!3}Vo(Q}l zr{@Q^5-Jjqsl zbY5&!*STYszEN7&!D&2h-6mcKcuf_|$R&?sD(KA$&1Paerm*j}!lVZ6>4t$ z2@^cnsF-?x_t0F9l)c!}CHnZ>*zK`;m$yJK9oMS?j{bwV!?r8a6XQ=7@Pgxris)h4 zibKo^$b?K|Cp_0nJv8{i=zqw;UH)%c&_eW7o0Ahoo+A-s{M4h1n$(s0E(hy|sWh%7oOW z2~QI%2eGlv{dNxRUPS80>d8jLNuvWdKQavKn|+L!T6KAD85^+^pIQBdMq&UxyPBqv z#Pbwsiinl0i79%glzIdNZD*U5XybsNt6AR&`N`w~;ll|{dQ>rMi~@{1?bG(aayQ>& z(F*(noU52l736z3u1+xj;_&uWmWn%dgwyZJm5c2^(}Du2<}1Dj2dq{uFwMp$SVquN z$hFs*2ZTn9=kwj;L4>^Z6Y;4}+kX0cA{D45qd&wqE zNq*v9cPjQrx^TioBy~mN9p8LZ)*7v*gvN@G?i;1}0X+hx3dBCRG`PSo_RFYr$^QEDI*9uW@=fZ_W z_bp3iG|g?%@4*;ZF=tSF#5EwSp2*?TAdXgHWC1udTeP4P?A}QfF(L2?d|^&5;C6k5 zn_tOzV&C2SZ+%dkf%q95prE5mF=E<5$i2KZ2{OGq=f6RbbtdVTN2=wGal+YvfPiTk z0;x^mum%mW)XjJ4*-^W(yfc}J$)QVWcJLlh+cdCM@p-hHqrijSHz3S(Vb3-5oj$rw zV#0f9q6Q6bKHKJ%Vyw0w-zSsMr2r-BwVh@ag7a}wZR-=CS3i(u2(;kS0X*f^`2`t= z?`suslQHzYIEGtUh`z$x9mu&a`>l;PjtR7IrK>VbwN-b(X(M~pD-EGb3IiK;ORO4~ z=r}5$>tzfQw3)(JT!N}8MHs%`WQgP{6wKfT2HByZZiW2Fzb{>+*~%JQOZ4aF>FU**q z_9*CbK0Q0ghc`}}h2AW`jn0=dwDbDLs@vnhdt);dR$jz8h=E;aD6BOR2+#L?unXZU z_DYT2vk)rcqxPA=O{__2|MME`GK1#>*droK_0WOV%C}{V2Y~vbU+rb@1N~|nYR-H( znqNi65yXSo7;2qFF)+!hlg6jVj&YHpo;N{_nsQ5VV^~M1(>d5dw_y^B6iebeSk7iJ zmJ~18#<--H0~Jvuw>nw}uJ;r%kUR*Rra>?A9@Q}XMM-q zvomW1A_g+qD?gVm7gDm4GAFJcGHxQp)*UN3z)NHrd^T2U@$=H*JWP@JyLENK!#V#M zkl~Ta2Y-CJe3So{4)^<9KwQs41wPRAk|BRltSwiR9-!DMHmJO~ZPQbJS1ONNU8+H7 zkXXBZmI?a&L&8`APBBsD2RX|-1a^i&g&@mB1jGmNpi^?PvedCcIWQGxPHwU)BAfTY zG}Rs#3H(zUn?c{78!~>kqht_ZZRmZ?50)Xk`BTMM5qw z<*7iL_8SsBgb6OS_4TG+lpi8J07GOKkDRH|eF&ronzU>@?zF>DL3LW!hD+88{Qk@& zeHm{u>z8T2H_PW5D-9AJT+>X16j2~;O%DWLySIsu3AL{4`=l$nNaO`hiMWFJV=vIs zxed?3JRR`%F-xsV!c=}U%2TmvX`%l(CH?BFyAVUsdluZEReCL3pS*+1Oe%wUK4-P8 zx1SExXuNd~9Pnd*UZnLYH)#yDQH{U!EpJBBRjXoNEizs}4Irt$v!unG@ zzXP$amI3w72;eI z;#)a!3|o|v<(jl}$FoM5PAA^A44?74I0&x&>fW*Sge`969kR;j6@+@Q7ji`IhTC*Eg>Ex%0ibv>%V10#y$Jw zxY^~)_!}LdwD?PFfW^tr&+xW4?^}7%VFf1rNBO~b3 zua7MFTXz*$pyaLdW! zW9+^=ZhufD<9oAYMX*f6lYyn$JSbP8)nS9EC9t{)`e8GUc$>bZF zH`$Vofy$45+1N7cD12FMW}A}rIKU$lUn|89KYz-3d(|&R4FE^N^jcu>8Gq#mO`?2l++| zn-5D<2)#+jI(Vb4(QjJrHE^n#IEH{ z{^iU1-Vf;Hmji-^`MAa07ZRFhSxc9P%yD)J&WbWsutVd%q>F?MBYT}iIf&h+ALnPkLR4H2G z{GGy}Q(MA)T@n;5^1+|zMDa?cNcuz6ILS-|m$vb`VeVuJ+8_Mv_nl`gU3{EXZzWNm zwYlCdUnrEb?CP&{gew%&KGM!O9S?G8J9BW0yq)!CqTqqAZ}ecV&#Evz8{S9Vku1nJ zU(+G1>uL+VUly33$jnChm^;nERi?|udsMLijT$Hv z!e^PSo+;UwK_l-6jtEajBHGIW^b;e%Wl%ayryVw!KSh>7I=(>)R%3 zzh31J34y5Np|tBmjxLr{3Kmq5{bm*6fx4D{Ptk6tPx5~X)R}sZugW)W7QXw_+ovU3 zB*L}dX0Re5UH8yrSPkZ6*jWytF73>eNi*^k*>`K!6zUI;b)l*Voi?9DnPsNK9JoT8 zNM`ynPq5^yc7X4wQ2-*+6kYKP&lL@X_QFox2JnYri2mbu&G-*Rd+9|YbRrllb^`Rc zIDmP9Fzcg(8?@~m)L@m-eRY9gPl3NkaJaPGzidb3!08`~+ufeY#TGSo-xV2{wIuhG zsj#4+qLK2ut5?Xv|JnaOkom|(ra)4tM^o<|lsl%5eBp4G*0W^jT;MPGp3Aiyd4fV7 zc&X24AyNfCY|L~XpV1~>WHS=$8)g7F$Z8Q0sV08yqL&Sa9_<7&j4KF<>M_QPo z|0g$8>P;^fa<0+(j+2>P2&QmCZZ>XVP%ehLXIU(m&|>=Yw`Jq|P*qy~fQBxaa`!EP zUwiOFrHTYzmBL}`$IGfJBR7@?E7_0m-7_8R99<>l?LyjysG0GzOt_Ph8oH)l9z1&M zTx7nl+oJp)dn;Q%E-N@o28Z_6E*`d<-WSWl@F+U;l0Q#dKKreoV{!q#eoqgXi#Z=p z?%*EpB61*(iSa>apC|Vpe8UcWF;;)~OjY5Qh!60;hweRA#XTs*={4KobO)XFyVqB5 za!u~m;?;c?6Is9)6Y@IB>F}d$rEG^?ja#t2wr302iWn#)v<8eO4)_Q}v>$z$ZrK%| z`7-?GI{)1f!dmSRate(5d&wU#zP&ysf3CBH6e3R9@ zn~fMlz_c%TGe@kos(Dj@75Po6VKpV=^kw3Zmh54miwIP*E}n{ax3zjCU;4v^%SVu0 zg)rUfui(gJpth<{6(cx3<%?sDZfeu1ZtNsK?vG39i*G_$AQgo-K45<(JvYs1yH#C9 zJkdD7>IoLa4PNo~iI5TY1{L%bvG$j(dE*7_YJg zdO7m6#Vg2~96354cXJ;dB?_An<#&ev0K3@hnDO_-;v&YJM9uklr9buArJ_m4Ya8Fo z)uj_ng+^RDsaHhmZ@ox$8aLS!(8;dSoPUgf6a&7JQr++=(xW!+js%Y@2ioBpM5Djn zlEIHWxR95O#4>-6LPEubFU{_bP}eengoN0eeMd!M0ycIBj_aHbnKa>9jD1*6T~5C0 zzu`ALEy%~@mRGvG8aaF$mH#<>$3GYyTF?05pnqCDnEw68VDj2z5g|y!DSf}i15S9S zK;2xBWpWK`8f^Q3w$fpI8z=D~`EMGG#)WOV#B>U0T=s}?*EFE);D9&yf(t;w_q>eh z{ow)P*tyTmi+mO47LnOzC!+aZyx9(e>LIr%`j38Xn9#pD{*O%{AgRyQG!aP=^8VnajA-wj3bPk;B~aDKD10rTo>Vr!2ss zWjAoaEx>px!!5~;@xG-8v`7_?yHot}IFLP1RAD#61TzE!zHcYn0kQoUcN#U`;t+0? zCleFV=cI62rc*Ou`-U3q-)^6A?j=polX+p>6Ls>7o_b%*+0q|DZ&B(Ip;Hf%&dVKZD)EdhmGY-rGIOMsSB3XYvNEty~Zcbz6je66W% z`*%8AdS&Onhp)R&Rlay|mw1t}r#h(@Fh) z7}Wrir4uJHkN@`~9J89jsx(?p5NHfodISCQ z;ahReH|~Dd?%B%&eu#n3!UtGzlg~$H^xCO&=1mIos*a@ap9>{ACRZ1LqveJcUs0?1 zv4i2P%f=b+I+~h7eui|S2<9t$8!z9^SOFl9Gp+X88ia1%_;U ze*8X)VfS|pC^KmcjWKbV=CP`aa*wi#woSVA7s2pB+;!f#P%%awi^E#TO~7(uYNlw- z=i;|La{$&S5ppy%PvwE6$n*fpecd<66LdoAS$}81Ne}|yt{uFVG)9>!GA2*)nPD{8 zQ{;LavFSq=G~Sox-6fbJnH85>6n@!R$qqSgtu#4jVAok#UpdVIl%AAsLf+g`zn+Md zNuS8SQ}0HK6iU)k&-I}(`K?{5$PBtf#V2dFWlI6n1!h`ZVQaMz)d~}Pcfu;A_rj!Q zOjIDN?7go2OZO?9q5fSUa(`re?ODaWk0FlQg@U{cxNMwQ<86o$TxYz1 z?8!9&pUScLyHnslsfd;`$q2p;mf(8zT$|Cx*jJFh)_uqG_vO!o26$;`|4HQ&4Vi1e z>xh2~^<3Y73w4i{SbhHHqf-1vRhygK^1F*O6zfyTIXG9oe9>@Wkjj{#EnV%I{V#dP zGCSr5CI+u9o=aznJdtm|*o*pOr<5=bZafA^75b_udot=~d%U0sr%Hu|Y4FFKj2$r+ zDn4O~cvdGUIKauPs>QhswJMfrIOQNLk+1E>ABqm&@aTSTgbYbLg!aFeMWLwKEN{QZ;4L#-dNN5eft5u~F>@?cNK8i#omHiBt; z^^fdn3E{ywXvivW38?5UPO+L>ctMxm(h(}-X|?svYU5;9mZd+dy7bx5{6&2q2yD&k z({tXNIWw`+fhOE#eUNAI)MhQ?caxk0G$mv8tP0VK3mdtj8HVP6TzD2$z;#flm?~{m zeqK*e^)E)>@!h&X-=Yy$W7FagNs?((PdVXB0imO#5AU}mkmt$7uu78A7e?^UCVd)l zT>S1vT#%pGsaFhSayf0#wf^o!gz>kRGgJbHxEK861su6RT6h`EQxKd6PU=ENTT7ar zD@r6jZc@*hq~I)gB0HFGHJeoZBt-*xtMfT3gPLe=Oiph|S1~s2ab_J0KxjXQFcqF94RkOl!W+DVjuu4VQaUHA^?j*B5|$W}TA z;Ey9MQC$nK@12Sh|RjQ((N98scFm%rI{{usj|LWM~f56Z*VxZq}!)v2M-^+y+N(w35 z_psj8{jz?z<|K$C;N#=%ji);Z9t%)_K5)~Q`lN#gY>Atr2HS2RKLgPp`<=R5G0^Yw z?Y^)8#N(oZ!=L{G)fXzhmQ3nM%)V0jTIHPNyR4lP|9?Ea1y@_)*0l{GK(G?rJ-9>B zB0-9~ySqzqcefTT#i3X!P~6=qP~4qDad-K0&iS7A7i454d+)W^ysmj8VSygoZ)k## z%_)aB<#CWEu8Q>EFQ=jYicbrn4W{9MfT>)lp%zl9B1oviWzv4FxALnj&{5d=y%N?F zow0sr9Rvk7l8s`QAy%;pE_`J=Hnr-7<#y8@WbmFg^NiNeI-|&@8SyHO@F-ezE3yW= zk8s~7k3LqVMs>|WD}Tx%^5@>9X~G{|*r3bH%YQzhPd0CSnm>#s?K{r(5qL+w(7PI% zif_;rNS2*_l=<~5w(SSwiW?K;?5udW>yhjCgF|$%*J1dsyy;ui!ap?*c~|=Is%cwJ zO@d{!C}lWYSM?gm#cCAeiY6>X3eAx* zCqRa;AUnj>xIR?A{YU3gJUn&k9*c>IGb0>H~i9ggkw%TPRyS38=0DI)=H2d6!qn=F zSAzGK@0V`Ge2hRXfZY4#)k6Vgm2 zK?#8zCs}m#DjmXg)zBjjKtUc;cV})u-fh6ahHWSVrvLJIoX28geEfQs`r(G3&Pl^5 z39ZG%4w0w-ZPd}aL|xTsVUfb%r)(ZF%p9zvG|)Ad;w7{){=7};Wa4UzRJ$uP-VHV+ z93S0XK?#eYQ%h=o)+itTK~09bJnj$^WoJ>vB%pZk89y@!su8SObnBFZmCqLe)D8qP z8G!(H!5fK@2AV$%M!x?lFGYHU{NF1(P!nr!t~nFhGzhC5P27}24l)(%e-r!X;0vV= z&0JT{iHp=Fo*3YFD&bUFA^i455X(cp5ywwZYgsAj{;_}<&uPvKO#q_mvo@|Uq{>mF z(RUXO^*le5(<lCi?b9O2mx%`5WaRxMiE$8GM{>N%boMbx&iaX(<`2diI zS4cU0fx$4m4B*@J2+*t{*kJ(0;Z-r;E8xUfC=ki&p(1=W`(;6mpO~*#395z2p;TsvZxpqLsVG7V zrG~;er(eMUvW=7o6^h|L0$=TE%Cf~czHm^0aaFLghKvM)Lg;GhvIrD zCaNl~jv^1t`gC0^| zn&1W>8Y~DLuLak@p)qsIaXc=i6}+gv z?Q6)o@;>>m>$2oF0N9a5tG8N-p1mKFJXGRy#%?>Z1cgX}3Mz8W_WR8%z8^+8e|&WX z&=`(V4mvav3_)^{w^SAwjm92YlmV8Ej#IfPsXaIx+9UuY8((Rc$sb(C7dk+SxBDSr zw6dadzG@|PdNk^A>5e}oAs&iI$;J53Mq-c524cW=>PBQna11Ma2U-20$B&<@U}IqD zM#5ZnCW&%^5u0427W{iq4fSxvf`$NKsF!n4T^8QsSz(k-kQ{bYpA5dQm6e_b{Et8M zo4*O%0NXO}gX&xM7B5)ycQ&d=wYe&Y&PnpI3-rJ4~(mnBK+ z#BVa!`kB;Js^vY=QdppmDTLXQD@RdFw}nzjJrt6Z#fSHZCSQ4C{G@R~iZL;wCfwq< zx}qIQxXD)KsA=%=bx4(?vy-W6U~=R!{l%8h>e>G0_O9mU>Ze?9Y7Kji-gM>grm(E* z)c)LyDqOVD=wEA6QwLduNbPn%d34{-u4r(nunLwPD(tKHQUsDp+6#;{ZT`+tQ=pdune#&O1i9$L8Z{W= zZtH&e{Sumo_By*cK+gVwb1JEM(bYfQtDmw^>Ts6z7t|WpE15eTl9L~OX72_?pg8$e z&0S^?$!Y!fn@QA?aYJIo$^6avBjKmto*B{k1r+exf6fjlieksh2#7am zNQQL+q~Lx_;Z?UkYaScxbw977JFyw#{1dG!C1WpHr5dTh{#2(WM7q5}#}pwX_`Q4> zSRZashJVGd%bT*YEZ(684K{?I5-*ttL#6Cu_W-G-1ag+}5o*%L<>nsdhT@asY+^#j z*;%Xtr)}>j@YM%C`ReIm8+G_&!7|I_>8PfTo3?@A6d(W|Qnv%l0~#aWvTmUn-vj(Z z;JB7pzJIrtgjcDU+q?4?Pr(JtKRR8(l!eNrL&-)Bhi=|ZJ z@0s>~HD5UYsA9JDGiu2BmiraUBv+YA)U+H331T;o{j&(C7!YoOQ*b8fGJ`Lob z_0QwCVHKx}nd|@l@EN%sIrg#pNK;Z#C5=htqT8}Kyql@#0$F2BQ zq#SszD{oa(!7KXB6hT|1N6A)M1vgLhkX>PG1+iXnX0jrOKJPzlOpyL3^^pROg+MDl9qm| z5Z~Si{x}MG`7qE@C6?rKdl$9Vm9s*4^QX3rG(Z5!KWb^iD^S$4i@u7D_a%L9NW{hv z|J?=YvN64K3oUxz-)~PX|9`|UQr8As?+U=yyZ9k1DB-yU8xzQ!mF#{^qEAWy(`AVMuhn5hQplW7N!BhDbO8eSuF)?C70UxBJS*89#sE zHHbX$-jwB7U%V=Fh}-y?+G$Ns$~Tr4vu@bIN$ww<*nY#9HaJfD;=Iqfx6asy+}P*U zhg8_p0CuOmK{^fE^f;fY2a}CYvTr_K@-RL$AN`cTmH-S?YFASW^Du6@`ubv%934gf zIx&f(tcwsAN%A`t4$0`e#8c%1v&^Kbjw3fUnuhmk>7pbn^aE99bl7oYY7>DiY8Y`* zNi@8|Nma2iDrTrW_YpcA;#BV|XzzWN13pPoPVEm&;pd?|l5^a?2NaLcvG0tAkKfdD*(Q@U++3APF&+Q5_v{LmJgN>m$&QRY zPm`~sTbQs>yT{i&J>L z_k=W;e0aKiM7+t|mFl=7Csr$`-!*m|H&{B<@IYdC0*a1xO5lG-mf`|3B~JhW9y97!}&&ytfho-E{pWH2ms@625gcV%Yn?heKG`mrhli zzJwN%kS=R16O=HE)CQsgHpH5d!@02hIj!H{prZCZeI5-C1MD~D)QOAFC)R8Jlald}&lVk8CyZQEOIf&o?fX(~a$l=FNw5{(1 zBQ*by1z4Ev=Z}pDh4Z$Wl%j|U_vCN(#gf6nqS5}fKpO0lgc2~{iIyQK63u#YtJ6=pFqM6nl!oXFDTPFf zDvn3k=q2CB5-=A!ZsV2Op*RJQO?fI$VZibg7uAOf*~Z%9Q!b?S<%ECD%jU@wBbGT|FbP)gB)ky0p>5PLZQA#_ekfC6Ko>*j%w zwF|dI%PCGf%Hk0cMdC%;(UU|j_FcbiLlc2N_5*NZD8+0mT%xm-5{*66aHGvtzOIJs zj(q0kLvR=>*OTN~vr^p)V?cM(IXA?DU@EpNtD?}8ak}0}%&lO8_3ts`k6b?uJAlTe ztb6F6suxTuRSGLR2x25r&0~t={X8Bb?IITb$?!!^dn$cpr`SDW~CHLGxQmp`s4HyBv^@wTSr$DI!gh0xl}W zm+YP`UE}id@m;LC8xKBQ?IUt5RM56RUyd~&9jL0J3O&ShB`cxct-Vpo&BY$#f>C2W z<<1J%9ks`td`PZbo5YBm5(D)gKDZRq=fk2Cq1YIm9aPr@j%NJf$QYj zP|Dhb>BD>l1G8k0>3sZ^89A{TV z8;kPDS+f)DTT4VYhv*m+P-lcQ2bV2+9#a&!{f3x$Y+4H92UbZGu zG*=;Chmj^%hVskUXp54va#8Y1q;3_OD^~1)7#_yalTSN@keB;NM$+7kVs+HP#MBeX z*yomr)IcwEVMe?}quX03=Ias^l2WWIwIKPWglXgg<==9*6z23qatRk%Qhdhubd5hX zl3{o6LIWmT0e-|`pZPaE#Ark78F_4q7eD_3UM$+we(DR$7lm`C46cPSZSTq~HeYm% z&xE23lm+Q@=;HNI`W@-Mm~$=gOL=ycX);Y4rH;87ezr10|96F2AXZJ}fx(=FNgQ+e zF%M(^WlQOFa^nCyvf%EG>TXc%$Sdh0Tc>vu8|3BdxwiK|vZuxmXaMNRp>hIB#dkNL z5%{v*lkJ(DL9k}Ovk*9%eD#3xXi3rKzpEAh} zj?ORA2bg5-*e>{l@)ObTO|-g)?u9{XXxv=JT#ay$Z)=Zu1ANhae^5W+XMO0WRI=91 z`gnt5Qp;v22d-Fz^}}4)0IT$f;N_}+6Hl~1V|P2DHdM?e4w=g`3Y!oBL!nGG=s{4f z3E-eupYm?FnJGz26}p?gZYs0p`(^T!S)6-I_m#!vi9THH9`;}UMtmi|K1WPWPMV*s z)7mb`@*bmm|s(I`8WwWcG@LMqw4(37co6!h}Q zqYCAC_bi)-K%~wVb#sHEpscWc*>IF!u=(6e{gZtImpXh8Ps3trGueFiA?WZbuP@Bm z8^p+jA%t{!gOvV`Ov23#DW#tf@Q1Jhl)raT#282!-W@AR*_}S0V1wqu>t7)sOa}%? z$#7ko$MCb|iZWB?ElfqY@4FtK7Ku}ydvh--DwLF}vi#jU8wfyl*&8Q<&~Scg7XjkP zrdE2yD=Lg~>JiYWjqv|8?2OlIhz~$>U(_=U+dAq#2aGMS#c`S0zKLjz)A>^&Y`JKp zqC<2K_^>dfRm*?fFmwpEo1MzN0kP%G;0`a)9+n;EU_-QxZE<~Y1;WQ4uItCmMnnX8 z)O5wE-9v1onp6zl7+j|iaqqSB)hoe23uH-(%pr^G++cK6A4tExW>(f`@1pInJ=Q`i zu=2M=Z-`4!yuc*#hWZI@+IDYwDzWdz>>a7T#8=b1(X~_a+exE1HN|St!`2N!VDCiP zH=#XGQ$ml^ma&%qLK~Zn*4D84gB)DgA3v`9a&OFV$e~J7#a?iQ<5Yw4pvv#t$A`zB zDXq!Q6`4qYzx|#n#j(_f!*#VjA#kMA**g^AzUwMuNcW>9qiaok8*H3kyV@yBN#nNX zelfEh<@hXhrd%ms-wK7cYnP*??)V$FOgF6iKRw7jl5 zZdZ|TPq4kcv_JN|mi7gG&^_{W<9UL!e-WGvG5Y1eCEzPv=S`LKiPaDhh1`V%)f`IU zj1%D4W=caUNl2N`dHoPoF)Wg8^JDu?3&mWG%27iT=CKa~Ej32T8T7RE1;qBBC>&Ij{ z$r&OLd0II466F81Am)F;Jh@e%oxnl)(^uFiEwLyfE~aZ0! zSuJv#V|MN4^$Z(yxH9jl?D={cU;5%~jhGAbBVGnQ3I2aZsTd+(y0FAqun1H}@_?!1>qgBk@Y>Zzg8}r)+Y~QFZ}`Z@Z@wwr zVHb<*>E>c3h4&xo*s@Fnx32a}MQ<|hw+Xr!PCyhv&#vwNZmPeyAzQ7;@^V~F657oAO?{yd{G3ZCR;NscjEN?8kBg~YbLnd;#&R74j27It|)y8UbeojDp9x@XR$Q_SP=pnZs6lf z2x{i8i*RCloh7F(5c^Y;AfXF=$F0=h@M4GZ`IJ39!){(xF9>NWHeLnrmYroAO<9yR zm&ExYame*%lvb5YWvcsEtP3RiNqId=^nPul2d7ktsx74_ciN z%KE=vUH1;S^ShnH%{#4kkFg6y(US+_#Oi0?_wK(EpS|Xu^~@-XMx@>F2;KJY+-G+^ zkWf+Cm=VSFLp*y-Wd8b;tKq1y+W|dIZ7R6fnFxd+8waf2Ki^GX^wXf?SD21l$q$Ng zh1{X6ZH4d0ETG6!E}IoEq`OOD2P60H-Pfw2mURixdA@=o3Qd*>Cv{uYaQjpp^M{o% zTVJRXSkkm(_Ac#wa$R&SZ_84tSF3ZTX3y-YT^3*FSWQ(f0;*s;mJj>=MKBg6_007D zIH~Kn|AeDg{|)&Un_CJWlle4)?sAWU-e#xX!JIO$6x%cZCHuK3Vd!YsIUD=_;|2(O zOX*hBOy`Mh-ubvX0$Ss2FyyRafFzuG=!i}Oes7ZTqZE<&7=rv8IZHruX(T;ZC{!nu z=qnmFZVHD?$sppaojTuXUa)>NFiDz}*OQ41cX-+oqqR{V{aq!GB37U3xOy2z7S@dIi^5pIYW z>JFDB?V&3cib7&#ndq?yfrff2QiY6EX#Ad@6b$K=fMAqPSas-9fk9O)aj@>&g0Krk z;5l*-80~J28Q9Z6&>4G^reE>1eGYq@=F3QQ5<*jLtFJuQz?tv<2M(`m29@!hg`krK zm)m1qM%L!Hb)3a6XVu2vH@9aS?BsB1YABId-D&a}11rH+v0rw~#c>^eR*m`Oo0*Is zhF&~hP3~-NNqFCk>uO3*3I<4&OKx8jJ9OzVFlPl8FzkOl3_aVrNQC5b$ifw{N50T>sE=h4$U_riB34uM!clA8(N!7+oIDB)8!egmSRpM$VL zzx5>a0vmrvGO&Pt2+;XPxv*qRKHUq74ooO{99NY-}J~Rm>Mc9ivMXt;e-Wv*eJh2NVwO`-1fOuDm21L z3tA|G*4rDH@6LR+6@<Hrt53Hz(v;8Q? zd1x+<;G94?5dG|7{cPaIUK?hqQjUTrCMBuat^|3~!6vz5j;4XUteZkPx#>resfduT zYPPA06>+cw(FW8$CI)$WDxs4PM9&-s&)D6yBkitJLy{;OBGr;)iIVrI#0D@!L^P3O zpVh768!9e2lAi?6s2n?`aiokyA)t6R#%@O@*Z50Om4(V>0%P%W-3_z}zoO10jIN-K zKy9+U-0}rtDY(^tuQ_9PZPm*gGqnC+y=yBuTP@;Gz$cLMWd3>UqSdY&uG_q?I&)`a zLAxi_d-kJ-L;n|^-FN)O2AvAQ{1`o;mJ^E?3cLv6Wk`k{@ZSL2XT1{1DJ|qR&qTu{ z1k2rh|NNB`_)8_|(>ZeY2V0%1-~}< zpAsb2NqQuwJ2787i{g7KWst1oc(N#i;@&UE*|1o3IJb=GlaZ8(P*P&ye6)IWeA~Mh zWX*D?PAXN%4i}f73zfGHF;V$7JZC0`e!`WdII{lqVw5?@rT3dy?}pfn3ZZ43_+~X4 zDU@OVN~gt@EGt1Vm6>ODInbc1h5F_!!4s`OhExhdP2?munbnfeUnow=!fu=qP_v$A z71}PyF^Wm}4M8-BD78vVZ^e zb!#OFO~iPUF0dQ-EFZEKQ)8{V9~0*Ky%IriINR^H(FjT8x1WLzD7H)Ant~#(`+@6M ziA_85#`n}ejXUD`gszbcTHT1wychhEf8$|U4T|JKTc(rQ-e~}m33b|!*q$FKUQ;re zzYo!0#L$b<6%U3y2(-Vx`d#dPQQn>|fj#rD8H{}PEc>^qNJad?4+cmV-ncXBI5KoQ z(e!3z8gg7o>gu+cul#yOB_=T?gJ9)EG+RsF5d9;PXgciC}2(SCVr=*o6-e3#dL_%?+Sx6#A4i4PTJAIM5AySjCssDzozH(a5+<9b0Dj<@RB$3sOOs|kK15NN6oUm4QRl-&nC7p$vfly^ zt1m9&j0YTirQnWovxw@K>0tl9NFDxg3+jSpB_knr^B)U}u;}9+faPG>#3_(7xL2uN zQrY|5Ym{=1Gi-IWVusGZ`tlt3V_h%hqE=&TH3H2HbU#IdY3}IwagdKMTS_FaFQg=3 z`wogtiTk~->+n0&196glsK)CpP~mJXsr=#NI2#%GGMJTISPFDb42qQCsCrU`5PnXC zgQPCv|Dhy;=~L#sSZIg?U~a;58YdtpXKwEpdk3Z4Q`(&6aZX;Jd6Gyt=1X>7?_Jkj z7fc=497%d53XR0P^0WF#b#DH4owtP(bi*ig|G2P|R=0nie&$c|)2J(?{2IOYPjfOT z?|IjF+i~MYi^@3gMElLyf5A&A#H;<`LrqI-EN0MspZAr1ZubD1^^_ft>)Xf_D*YG6|B=_P7H(`i} zazNI>;){*Tn|Nl^8fi|H__YM+Y9~1VjEo_j-WW&NL`G*77FAStKIw13#fKiPTu5X> zq+M4<3=Q^J>*`4E4S5OBw7dG^}mu8pK4e}zK()EDSEzgYqf%q^vo%z4YCgOhprOnZjO4R2RF))fC z1@95Z9(>)O6J{k?oEvCz%!K7H3};9G?i;3Om<(cR+;wzcBkS#*L|{z0{sxI)bFKLTGU}p|1nj4N(yg(ZUpiGJuSa=h2@QdM z%#gZX)@V!<`=;3o&hHYhD?t}we7LE=_xx4$E*qp#)6$8gT#6w&f>#&f(v3{dj3-uPN0s)ldoWw-<|FJu|Kf)KHcA%0eUCDVvJi^h zc&*y#$9(C=+`Npqx*t>a$M(A$N5~PhvYz4hy>n&RXhk&c2H*6R59M}CvBizV5J9Z> zU5`fb3_3dFrPp7Tp0|~Qbl~nT%!gd=Lc;FT-ku0{b&TIykzM~?3XCf#Qm4fitoopcpxBU!>A+V7^}IL)r^y12*}yTDsAq4su|~mPVR^@0z3Y1uPnn7oIF;gWyd1P*-R=YK-*Lq%aAS5!MAhfH9mC5OYoGaw zcNqxlVNt8c@Lmgf7s2(-#9n=Dk9ESwjihhEKDb;}>BP(~cwMHE8RT z4^rc3;a9#Dt-jvh^P{flj!*uk?rKSl+gBQ!%+6ph(irZ^-w>~3B=QF+15}8KfB6^e zT~HZ27p-em5mY81wRghVS*h!BxE+r#PV)taN8W?(Uvv!gz#H(@r4hp1Uns||^ra^( z+4=}Rkoa%h1yHO%B5WiXznn*%k0=Yp>H&-^x7oX3A4XB^8x*oStbs z&En?opfHb#EFsQuYHZNkV84(&V!7AuZUBMai}IwWW?poP;{iqpuqj){>5T4L7q-T; zv|T4Jb{0piYHRAFTS{KM&l8dg9K%zp8%!i|Z2Dl$A!ZLo@57<_(?u%v{)GM_0)r!x z0IP;j_v&wS8zC0_@d0sY*k^7nlsQ!7LEBiXdPeEkQ8->}5!QJR)NHu|QBO+iG&%U| zw~bAx2|e@;eRjjh9vsB^M;oDe4i(qJ>+18v!w!88y&JoqRk=tAt6BCZ}Xk>A%+*g&yXL!{g=U>CHuu4FR zgg%Nkg^HE$`1gGj%P-&0S*4AoOqsVNW!w>!X;larLoz_2KI8(`_4_eHML#|EU&`}f zYOOO-;9KX*#D~KU+bQ8ECGxjN)(eiKcU0a`RzA>?9 zkq0y*jf1Q6)m+{fz%hjsiAmB>*%rt^Wj~t-1Yis$lJfNjw&8+GA*vkNt@}A0^<0a--6>qcH*AP zsfPSVc-ReSQw%m~hr+lQSj(8|>crM*+u7jZXe`{VS~>L!W%BCqu8HIjmTa-h-X)KM zLaC}V@5NzD9bw+L&w768g30{(g~9n;*zc2nTh%z96^^4kaskD~s9>!ry}uBM?_8fX z6sBZSAW6E;(OFyNQRIX2>>a_#2 zUY>+iPn3}u#^+axXOwqq9tzv;o13Q3tCKIttL~G+i)~(*uLqbx#-r4Nia2+<{E?zh zJEG}%|6*`Q2OKY28FuT;nsu19!+|=2pWyCt+bOuOu5A1Q$}|*bmsx?KsTSaSd5L4oVmyd2koJ%2#PMw|{72ulw_LB``4nz6-8EMKVPHYx~IlbnHYDOv>$t z%h|p0Y@VcB`OTvbnnn{FMzB9({is#{6)5ER{*VX0?YFPuO&>C2D$CSW@Dr8F ze&=^AM3tikUd zQdZV`5inPy#{VKs*=_!9I9fE&ACTlK*K?S+zfa^7O`H_IA^NeZH;9uY9J)uc5WZ;I zZc{8%*zFwdYA=kCCmMgfY6MZo(V4WmcnZ2yeICoZm$fB%KzrNTcRA=5X@AN&>wmkm z??SE9>lJ-Sp%^rNei#a0jsDnc!+S_rDo#V*_sJJf9n|;2kSc70~R*F&5<+!jv5 zKP6rrX$jj13}pMV)aO0@Xjb`p9qDMx9YN7C+Z+JXOn|93($N`T$mY#8dedV$=wM_$ z2{?tB(?|Y;r+MmxH0Nn*6v0V(LHNqcu(ex(MK;{Y@KasUGRZUx8*Zd1I5}%rGJ8oY z2hYZ$`$aaOQKYkRG#|UahL%PcHPe;u90HdlU8pt)tw!hsynnrZs>xkSjX%59LPEy> zi^YYmQI`!OLE>U&E-a?fv0@%@D`DEqyu40uz;E%#YEeUkwG#2Dgg`e}j^VacG;WJx z;PtqttBefxVUy^-*c6EJi>`#PuNs^#11@e@pE_n2%74l-FU~}ssr+xoCb!Rf5I%n_ z_3FO92malMJr6cSis|XQcQ3U&FMm+;3m)D-teLB6e#jVChOmf>ko1#;mZ7=G}ZD2Y@ca!arWRq|P`_z@7) zwq(`XU5AXs*s7`-w0o;gT=nk~rdMwy|3ts$lA-;=VXyfw6`a_Ae(%+VVLpS#(9{m1 zRWIWc7H4rWWQ@U@{!Uc_@psLGg>rvqW}1CYz9y^2-;C^djXg0pc~59##Slji6eb@< zv$8p_ckf;87k>e0YM1|$U3y*8HXgVzk5Xl`z>156osn5VK1fFgPN3hsimG`##~L3$ z>l=`V4V?j)+uCn4LA`gKPaQCM{C>~)^`n7c5In{Gf@sW4sq#+s+a>$Cv*`8A{maG+ znL&peyz)1}2zzaIbD%9b4e-USR5f)VwA&HT^9!9aOzLD}Y(j3A+yB@!QK1fTk-cP$C z`MNo^-<0LU1&2_Zp2i>aC;kCOnx2q7u@^j*zS9qF0m1>?pm5c}qjo+|*&9Oz+><-y zea!77tnP&2f)=2%v?Cw*0g;rNleB1qf@AxStqPXbC&;XlO46VD45J$u(97NXT zb`O2I&UClXgP%0O2pJD##-goh33p*b=>Ct9BTgQWc!I+`$0c$f5|mJT0SP<|dqe(CH{^P- z37>k2C@C&BTd5gOtNtrTgDIr^AIkXnZ%R`1ozb+hLT{6J+jp{iVl5g6jZVel(K}RB z(0^|pPqy^Zx57A@Vko?@VQwHBtluB{mQ^DEJ-Gfp1iu$yuG(GsTiz^-J$cxgL- z?0t3vsiHsquM)_XYYlT4q(c560ye``$7tz@1!hZ#kkm!pxwoYP1oVCSi;iJi$k&tNq1=k2ud+W}2ET9=7W^IGZ3ZK|&)E83jwJ20b?&%+6MjMEA~~8i4F<{!3bR79 zUWwAo#76bhV5F<40B4N9E6GDuyf>c150;&&5ZWKrEMxaA=vc2kG}5jI!)pww_L*{% zJ;&az7o(a&&xv=N1h12My)f#7sQoP9tS<~xgdvA({rWrKma@pB^!<$JtNQZ{#gl3K z^R#w|77ositU_Wb7<|>+I*y4=TKA9f0%B602m|Mze`wj8{k8QBR;vnGT!g57;pXUd zRVbd3NmQgJC6TUNgMX2<*&Y!X_nGvWa38q8Aax70FU%jfEjsVnze6i8HI_5&{=kG{ zp5zdA7r-go@Jd%pJtw2<2aM~b$@}mft%<;!)8T-HDqF~nl zE(wwUyCmdRekBLM&$B913a*FU0_J{cd%I zuEx2|68U*VLSWggTntdW;|QUu`^>qT4naAP+7z{mGBh`BwZ37*JH21s6O9$<=RFN$92pr@vDilDs= zm-{I(7S>}t7k=)XbQVE*)XNq}O{Va4i+B``yYWfcNTU=FqkqfL4dkz<7tM`vE5lY? zpYfb)=PZgsVk9+2alKgww_SJLd>r=BntiVD$^EYMYnnfSDIU)!DFt|uf+(Y}2-wYC zHv&0TNwYJ7LhuGHo_H}j*nxfYJ705U#{|6pm1Gn*e78f(0U;h(b?~Z&a%mf#f84Zj#+xfJ3A5fa@sPp?j1Hm9O_qJ$Z z`6omuPN!UByWW>(@c7;@BG?xc!XF%{v*yT+-YE*Yj=E2|>%h!=IxgM1drTg4GGWdb z=nRktMFP0!mv34>b(o+GEG`1K%^8Wbr_RmoSYqU;=p&;X>*i0yyBog^oeIDwiAMJ? z7AL>k`C=QsgW~_JoY(Ihu-k>|dfplI+{d-RZqOQ<P!O6_sh#Of#4Bugt z{9+!AB?aTjtJXi?Uw*tCvj$GtH4Hp|zB2Yl6EqUg?s$TK5os5vOy-zcM|v;6>%Rb` z))aj#nLqKNiY6{Ck=Zl73!pF0&p5*_Xw<*jUTJ_L^rTp(*2;BeIdDEl=L#Vg( zkHee$9_ACet#h9dMnt5GcEl+O3&Q8VtU|Mw%HH`6YES*hDEX-sjUd;yVg!S1KOH1& z9`w6N14FsrBjAD7h8D@}p95&Xt&+hKA^95=5zvDaln-IdM}o_NHy~hAFxu+^lC2v# z3|=URMgquNWuW{-`wv_Oe1;Le-yxXCMA99sPY4Y^i_)<{T|;gOO;8j;LljXTs?d+= zf51N$#{NIL-YTdKHd-4EAwY05OQZ*&rM(36DstuJ$+p8B)&(7mQs&5te5NQ#eH>UK7*;=#uWUD% z{_QFM==u$YGUI@O?(J+FZ-e4tuwZ`j`~0`zH&{|(SU0LK-Svce?4>5kwu|aKS|bln zMpm9o{nvDE>iBx2>T$8O+p{Fga!D$PMYaU+>9T^0my{vvlwm}}9GI+~?kqs# z+QBwGAsW2*z^Z-G`+EOjYoh)7enR7e;!o+8@)DZRun$ytGN@vIVx+xSDWq`K?z@d( zEUUB<_2+o-t!>fRrKrC%nZ+{Tn^Xm>4%5Udm4#9quS||@r}K= z5vV=o`VxsuBf^l*-cj!n-mQJ2yd@Wlj#~MAe~7SkNt>4iP2D3is>Kq{ao5a-{GEh- zn_j3^#nEOQsDpnW-d21unO3Hb6}+{l>MJ!o<2hxIm_;p-Er{zzi5zs$_*-0CxF%rF zLf`65b4aYU$TGqH-LeU;G*%jjhN&>eI5E%Yc7^q)sNcoD z+GyR-^Y3E!!P8mw`AOsShW8ff-S%MMjqLp#;VXXkx+qaTQQEbGy?ts+24lV-4n-$! z;U50{;=Ek=hDGC#2aivleHH)_mF!s8_^J#)m3<}IPlQGFZ8n%Q%!P&R2$ST7Z7$z1 zjl0hS$ht2H;ABFS*?~&_C%crRglA6_uS>=++O~w$K~P26XqO*3)1@#hXsbzItswr( zFAn#xe9EfI;6W$s#kkFLX?K0$RiVx;7hFhPw4=F*h7`^4yX>%)eXM<=T6rMcgP)r1 zyBX5{S0X(z96#!@vLJ7U!(qhK4m#czDtl8$wD#)bZv%h%jmNY;4lV&eww%-uwbb|8 z8*iM&FX?brp4oAIA^Da7(_-(6yVK(({zqeTs^>p7%}unwXbPma7{!4kK^H0FGOO6H zVNzS|vXoNwa`gTJIUKbREC-C?tD17wJ`*UVcD?FBCe`X09~Iaqe{2 zV&Vs4EgMm7Tp%`{D6C_q*suP0cy3P4kxN$BlB}{IyLflh`K`}Hx)!oIU6Ktz#8nns zcAh@wPBC$s{tjXOWvgY)L!5Z7Zn3jh*MD?J%PoqKB9<^5{#hRJs0qR+Mjb^{eXpY% za7;Wmo-lBLX<}kSRGa^farD^Dcgw}Mj!a%LLD=?A$;;N9DXMgw?ZA+YfNq6;u+OSh z?!Ve9W2}C){9hQ2@{GI>N-V(%{wK9{4PBAF57{5K`dTQo)6k%w#-e9@<~<3XugX=wy>Dai8o-mxXA2fv72p(ewhy__)k z%TQ^Hi{&h@Ai55MUeBP{%luc&9`AE)h@c3HZ~JK&8!&q?Jft5a{#*1)IyM&Lr#0lW zk#3=3(MKrJNH7)ft){jb{}wo!nr{yw9Remr@$Y^}48GjEpL0q!!D!tjqf(t&U1f2P z95vS84XpsVX16_d{H-&e4j?*F!Hcu<7Ob7H`m@qwQa>>E8W{b=bu@X96gd+1fE7~} z$s;8~Hjt7a{$=x}dUIe@{5HMq=rE3mloAI}Qdx;>zDtWE+W-ZN@$n(5vEV_(-Z8VI zHKkhkzW<~xoR&^7MDmrL3?%Q(NtZ&Sx)k&{f=DLft4=?7cPMcQTlS^@PeOWWHrQW*@FudU;cgR~Ks89rvB&e?2+24_s9jFIt0z2Trp+jf( z!wG^NWwwUT14&nujHCv1l=*+>)Cn6TW4R%aUN}h}gmbNt=6ef&{(%@-wU=JykhMTg+BUHc(LSv@0uMi^WF* zl==t1pNt#w{HS(FhBMTWcO+V(Xyal0U)Wu_9n)!L4b$Z>RBw}II$~{k5 zr8E&hX48ji3z{M(CfN(3rc)Qk7!*Xm=Va%puOt^WcK z0R12e+J3}%M!1w1Le8S@Zo}_aAbcj8cYc>4WEzI=X`j(0ct3g2d}JCps>a5mP8uJW zTAm$AyvxN&G!>SQ-bvTRYtR*R)QZKxFmdn(pSL|ZJueu)A~^M2GQ`HCM+=YD7z$q= zS299`xM^0A$SU({oJ{r6;?We?4nwd}*o&*%5vWHxH1P_5wy)SuOiY+;_K2b+TJf4q zZx|9$5QWu#qYzkkW0Xt+W$FFCob7!)H)|YQOw4xbLNI>)(LK;r5LDK?$axdkVR(UK znf{@!9+5uGWE${ z45@O3W&#n8yCS@g0BKLAH1coSs3i}e@KMZ9S8)Lm);*z!7S{aBxHeez#b2u;*k#2Y ze=`s^SCiohEtv#x|4kNuWDp{i%`eHAK7Lx4lcR_vr4qFeY^`iutxCi187F1@nVC09 zw?gTbj0ZYw~y#^)Dw0QflMyW92yB?7cuX=8~UZL=V9 zM=w?Y2}_gZq~o%DPDj-@|05vS38YjKJ~GXZP^ms{G52F=$f03CwMM-%9$_sniV2rs zI2T$^i>Dl_B;#sapb^^7g#Q7*P4zcvbg9Ty1seBJ$uj*S5|D_JSVqwt-XMU|>I-5$ zuP`RZ_mrr}He8Xn6Zho#WQ8fIbYvFRvC)Klyu?8h^)LzfZE^QAwySpFjTI@14^L6l zpYP@7+@;{DigB6*ee5JQIlc}tRn+`x+9J<+lbM6Yxkic@DVIA#=ix~K@?n4DmuR{| zr4IR2#_J#-M3GM}HN!iHmnsL49<@d;7OwEgg=;zT!KeqIx6XH1nmktiG9*tC5s zC8an;ppv*;#AJN?gLKBER=rgTlm>Uyp%9R=!lwCHk@?Q!?yT=;E!iMaz;)w)#J&&4`paG)j>;+tHt7W*v#FETnZIbaVWjGZ!fFJJ zPUWe~{cNY;m9yX_V;F@lN`J`^G_$t)1=g4#^0bDU?B}kZs}`|4%GqxQ*JYFvBzan` z9Ld2cNBU*+6f0P|b0zGHkT{8*{m|#4%F6c{?<__R(PZi=<8Z(7WEJwPU@4}XeEPh7 z`}jwQ^#~1;H8JqLkllhVEd&-uLM_+u4on7XwjzjV_<|$>m&aNw4o8gA4jxk#|r9*fal;Pz5#~iB8HvDFlhx?L!AD0M{l@ai3ZdmBo?5wUJA}r zrn2;Qmpga@^iTIDxv;*&g)Ja#V-^G#oY+im zaG{~0fvbHj-^E59*}77jBzUVi_pP}}Igr}^4gNO&f3*O`qvrX>28kBwn!Z|7M>Ksy z6HbkC)BbEY(n2YqW`dA7&$?_6xskz0S@Zku%{OvawF1xlb*u2{-DIhJ{;x_c<83C= z>8>s-h7g@eo%pJP;z|u1J%+_?RXHi_T#ShFOAWx>u4mM3|DPKW@Rj7jv32!Nj@3c> za9&blq9gJ~7JwjK>(BG@H!hwJ){$sd`ve!Y`A;HZ591$baH5#ab(tco=@E#K)n~pX zVPJz$gjV$}pAS9y9W(!Ma&ofnBz5qmA>t~GM4P}LV4078_jPw~Yzn*R56eg9F_%x0 z3!!_ilHvu{uE!r`GJAO4frGX#yk|Qh3CJrt{R-qXG_~86bS&i`kh35nBJpOq^$4kHU(YqckuXMs&bxZ8XZbf~(Us#*%Ck85)YV)y^k_Kd+mHkbab+}RFlT}R3PjZirZXf(o%SVt?H zMC-1hIzbtUrwaMKo5FQ~&x*lhMe1gf9RbI{6Ye4k(LY6bqDqndqCzRwB7RsPkYQ@V z3f52h0RVF98&XG@iFKlom7mJ8WJeYx`WSya-%LG4dT4-;@uB>U##G+Ls2yN!0~k0K z=<9g8u;gNy&a~@;Liyr?>lV_RZae;W(X`;h!9J*l*pk{}12}Sps8L@u_0-g?-&hF? z=YBeAin7S_39r>*hw1Gww~gBn5d0S8Z0^ z#{PV0{)8+`e^shA*egW@vt_O=SBq_80=6*m3E+nc3kzW{nP#App!Xpd5%CLF6urwr z67Bu!Qg5*4x1d37!?<)6vca)KL7Gd@?dfmElf+*KQz%#mZaQ1;S;NtDHZ#c3J zIgFK&C+nu@HLH+4_ok&k`6|VgYo(qM5xkHP(r~|KQ>fG4w$fC(#SM_Curj_~ZYVW1 ze;S)4D7GK%96v}ESpJS*q`4~TZW2ndiTNH{z<+}*A(@Lkaqo`S@*DzBI z0$PNS?z2`$sPuqUMS9gc>J=z#4Ouw~Lv)!|rP(y$TE#ok`O(Amf;{liVm)40f-t{? zDq%T3y{{cGF`TL;PG%KV4v%c0w&HzJXCzo=_Ri%f^i)WXuzg4Hns($U2d;DtY(^yPlqh!5@w zkSez~X^gxE!hsqD%eAI6Ac!K)E$B(Xsx&4CE+#&13QeSk->GVl+}(*N^ZTbZU{>iJ zlS&{09uH1nd<1_|bxv8i^eqVPRHi z#A*!{P1SHwUAE>6+F8tjB+Sl$P&*nfMaPzUzmeN1l~LE;jEhv$K|;_;eq=zgVkV#L zyHN~filEXiq#89X0?1SZJsdHc^0b|Ju}w{FKd<~M+JzQ0R?tWGyaq%u|5h3k!9qgK zrEtG)bP-xk*1$WBaVP{QEG0Y)OT$57$jU691C*Bxc%=*aYo8b;J%m1VPG5l2m-iBJ z(LLIekhagi=JD6@e#HN7@XVtKKs#l8n9kL98ZV3;!+5#XN;wd}?mM%%5pSLM8H1pa zqTff{fWNU$v&stIpo;;8cpk~`s$<3p{QRornhQ)7AYAR=cwy_MLq;!2OUq;y z9R_|M5r{Mil7+0u1pWn-08!@D)dDmd#^!q~;SNs&$c>Q;w#2lEweee8P+U4*3!O%% z;^KM~H6QXPb?_IawJ8Y^VpB&)lv+Ll+Waq#K^2T(^h)|n8hV_2fima!1tq@bM^9?(;=yq}62z>S&Vko>t1loeGd z$b^S7=PoWP%o)X=B6*Af&ZbXgiE$yZ@WoHu@>5L_f1NaPoa>S%q)wOaNyMF%NRdFw zUZJZ9@A--=(W*ofWyT*fe#wP~j!{%msJ0<{8$5c1(=QB*dN$~y8^;%q7T;N`QEgTq z%+4YAB=zZ2Eg362>K(Zd8tFO_Q?D66?ebc*iy#X#!EZkAuACI54zOe_I(l>{5H76$ zHHL_k7>7K{fSR)6%>m`-0MjWAK?<=V>UDX=rO9VYYMh+z`6|U!e@3(2gx{&a*!5x0Ay=xJ2-z+MYl?j{T}Cz=im|c%h$S- zn!@P%JXG1Xy{~W5B6K+!(L=u!|I<{Kf%wZWyVTDPykBQ@v>E#}#gxgvARa2bd-sK; zR{LxmVcAvHD29gx>24-v21J7>Z+06MNiUo;9pBS+F{_ zv}!f(_s{hr&`n@|Gyw;?9IJZ~3Itc~YVOUsZ!LauVw76t{}0RiZr zy8F+ec9H23q$9Mjy0|L#x>OEhBy4i}pOwh6vOIsbXtcFxu*D|i`5OJ#uaA{5NFNSd z6j*1AI+&UXcQRWW;4nn6939;EeLs~#p9`zRO|zO+wSJIYyw{H+o!w_4TEo;|abQ(a z6AtTU4`pNZX^Dr1f7N-G&FQBTEeBUzMVLD)h9>DpTPKO zb;)IG#`F)W^h7uf5fK?dv?#81153u1x_d!mqegrT-u=uRO-MiD{L(_v$N_e<4?!P# zhlpDR-R=2r+G@-XqOXE!1O&6c*O@;)T8L0D#Z7)|qNtWaT5wsLd2zgPm?9r3a3Zake+|(U~4NmI<*dFpV;}gWIQ?ubE%Au-E${d zx>f&TeMFwDW*_j9!wMV!1L|u#ZTW4XziP;x#7G5oIh?Q1uv8oip?mY76m+|1xw*T8 z-3t^djJdjKZft8t*1Ynh-~&`~#f9F2C*VJLK?)i&TlH1VG4(A28mhtN9ARI*8w#*o zORMLPuEUcfSR`%C0tW!ddfdOyz{bJqgW~xwj(e25oveZtNEM4_5YnR=Hhntc{y{Wu z=8A@mp*T{L0f&o?jgvY>F-FviS|9pJJH06xChPAz-S$I{(MN)VJN89Ji2=S1m zshnZ!o*S&=XRGBCjESi*ta7e?C%)qDX6YQtG5)&WN^^QM>$4cW)38*?(5QOsdd~IU zK+49bM=V2fS90Qb)^rtZ4zJgD)R#s5H;YR`<2xu{OpWW?L5i zXM^=Uf^7gH{IoE5od-y3Ex#0RVrz-KVxZ3Am8_~xy=fCVx*I;elW1gD|N9qy($CUF z1;$dzQBbWLwuYgEI;Q#HpB}d5*80Sq4~Ri7dyq7Cw!knzh=m#{0OvcRBt5)@uD8?a zKmo_CCAETVTmx46YCebPsr0Z@l2+V2&sGjrv=22WGThrYCQ}XjN{D7g2KTlZP0cX_ zMAyQsg2VeGH27MsFUo-+s!6iciciy4A0n6EUZV;X!VlH04IMrOHW079?fHfy_o=fk z+~~sHJpq$%@61A19BFyn-oPYY|A8I_wQo2;&t{j-?hIq2ku`NN zdYrNwn%}gWjWi%?-z4R^w@EPJ+cz2BdBm-2U$r0mruA82%n~jV31l$drOtUt<>vNw zXJDmKVZfo@%*#jJ07)mQ%$r<4)TUX0kB@dSs!8#sy|ovf3=FqM#h_wsd73Q zaM8{Ax~9YybHGPP#oH<7D~H&>iVuaYWr`aglo8@Ff8!9LHb4Yx2L8xdOQVLo@r*d2 zZ!Z&g;yt@ZtyA7r#`7V7D`flqA;gS*eMC3^{%wEDc1nK1YTELTFu}q-G%@FyYiH~5 z^)gx75FPNAw{*Ywl~hCr9gPR@z)CG~9FWzFHVPFi}{r59Rn!DcZy`{f7@N5Qd-Si|pdpY(O zd|jog>Aj@7JrkyyB05r1$RYRkUqF1u!8D{!Nc)BevpWBAw~dWcDyS@mI}befb@|QN zg&rvl5#kN9poy=jK(zT%*7? zC>f@$b>(L87OiBXBmeqTlQmQ+L|{RsDek?=@v)7&yjGi`&+fM*ePi&GmOg_fm3Je` z%Oc=xRm~B!=rki zd~mhFh2!nrvE+3$Af#h~fCOQF)G6v*iDb*!t7$N>QKnj#0f9~7>5kn5a+A@D3 z;MVBFhshtl8DQ5lrk7P8`Q`hrRru+W;K1vCx-=?KH5Kv~ENETgdSA)63~AI0{RdnJ_3BiZOCeCyR&&o)Y^lg5!LUv`7nh3N0Yx)~oAc z8SGy5-gFS9edQV*973FpnSY4C^dx(|4ibA8&*(`vBi=Cz_+E4ah0>+!c1Eg>`i%tvni*ckt>b<91 z%UWC59BK>wzjG)Ao5MQK*e3QSupEft5vkNO7$8a4!S+=%Ce_TRN!i@F8q=$jls`g| zAk>Gp;@}+}4|3_;D8A~))GqF(Y%Uy&;5!Wf71(zN1u&5I%YhU&mqbRr-fLvgasv@< zc&Y^sG!U@OxVbv$qdv#YxCm8t5GD}pXY|qPz@5MHJfKm=Z7Zk4D1EoWf;8C5T)Ig66lj7~{)8%7@_GSL&wUG<; z+cIs!&U|I<_H($HTA#SzA3N+O-#1&HhTU>6-_nfV38#OZGcZF2NGW~Vk>5@7_j z?T>X$tU2Po7`cw87d~srBG(2h7z1>|bOed-x}HRPqlGu`#HdmS;Pc-^dag=26?_NT z1vVpV;#G8%t%yU%qg*TU1m>AZz(0RRZv?Mc$*|-x@sOesQIHLsut~F_-~W7jRg;I= zomQq5@}b$N|OO8;wQT+Em$H^PETQE1SDvJwoEc`OCTh2;d-*n^^PA1 z#>F+av2*%*clq*kNB*Czc-!N1NvYM{hW`$)gv5a1(``|GJ@U33+K~gsg9FTXi%!(z zfsI>CYlDn5Rst~4l&mV8+)<@!6eC5M=zoQ@>YDH(7QV^e#T&)OC-mEXlJ6W|Qzy|rwe2rEd+l1Z)X{bCNdz|MCA@|%WluJ1z&>|-D)T?bRpzVck z>^)}(h7c}-;yO^qLTa@B2Y2Wlh8t{Oze|VV-w|4Tw833!Y+S zC?#6J%v7`3?}lu~n_#wOG&0rmN^$UC6Y@6I$%1mpudS$5UDz`PSJwjYSRBH&EZD;z zvA!w5Z*MvFcI|1$w*>z$Cjh%U$^MgdSbh0V)?wmhBZ(84IwL}mZl%U#l^R{2Cj@SC z@#sIgsR4o!Qz(4iV;>nP5F85~NgGvqyPGy*UvI^=LdqF0iY=)eN`wEqKtZ4fH6XZ( zLrd$=VtiRuoQp2z

    G5@{*HNYT=DJiwSkrjk56vQ2`TaimcZ5I7`7j1@kf9vcAUUw%iVH&hp%~0i!B&AfB(wzlE~7ehD{rX_HU~V*=E|*E0Bhv*p;&r{KMm9OAQO| zv*Udlwq=*E3pt}z`r|+V&%ik1^2FX+#7s1_Hqiv^C}FxP6A_g9)#$$5ZciBSboT~` zzr_%FY_8o7e4S)e-F4kfD;AKO6BXlUxlQz8>HwZrPb&PC;O5}^X@yS>ZIB2-k8_)d zlGF6S;m)jTLxkl8Z0DZ)mBkL5Cx|lSPv63;-(-5I_a#k)q`=Y(<6B_^yh7}1rkc`` zl@)Zzo6|YN7!M*RH`Kw1pmUPJb;NTALS5bze^P(-U~qLenHW=|!Wyincj;?$7y0VS z|5JpfIM@MR46G$XLp_i5*D}5legAu94bA~t>nP)s!}$r$R%z`UjZ^nE23!kG6YAtX z-Y8NwdQ2maVBn)?6EFYHT4rNWFfn;U ziJK@_6UusBDPM1T1BhZ!KN|!(3Ws>|fg{oqKm6Kn3hD@=M7lkdGW(2Slz?m1D7_4_ zpv06=U-8sRWG;%p=kL_LaxB*;8`et2*3lSNPKEYoO=fY5<}H9qV+bAKCGf zrs}Q&T3B^o=#Lj;j3%bLPu#@wPk#Rd$Kaea;3eR(YM$e&yT8Nm%pihbR%s|aR?|bF zv`IF025ByikRMZ5WcUNI1vhe`UCPd+m__IY%K|h6jL5Q!3xyn622XuA;K~l}X_J9} zv4zKKu`@N{zWW9UyAq7bAWC_{`8CRCc`*q9<*o`eD41G~_qadw0~Sf%DZs~24FI}oJ?ep8c6@mLXS^NSdkN>!`e|#A z(0Jg_eHdM4QYzR;EC3CcM?>)Pn7P7BpqbZvX=>dq2S_o$F#f=0%h25eQ(r8Tsi2`@ zY|qUUXd12Xoc(($5t_7+KE2k)HJx&0`6KM8)n=$dx7?b~Iirf@REF+j2$z&OFOo?k8EseOO;sYreeM zdvkJ>c9AY4%%bf&0I>z}4F4}F)*ek1v2<;{$oo%@{<(BVzZx5tTb=V&ug-hlB;dfI z{Z??H88bY$WSl^hbW`w=|F?U24 zPxg*xR2lH|$OBbwKUFHcVd!G}3|6i{d z)o)G4^8#b2-N3JMibY~51H5Bf?3xqYneJGALH7u}*zga7@cY+%h1yCHnm;FN5>r$~{ix7C(Ma zSQe3cY$dMGN9*^F&RFF|K$m+{c<@60^iv@ejNd1*#}7j>7x;VhgOO9Ig5Cc1l0laf zJ=Nf-s^CBKBL4p$ssvVFUp-M4!_(5RFxXLF(vkBek6IMCC7j(W*O|4f4GI*V;G)M$ zahPU95|leloIhtq>#2$iE+Axd9MXkr`51bB*I62QUHVN<;VJ%m{k7qg-^JaV_Gwk& z&);Z%3!x~PcbC>8ZGAOBAioV}yF-#5A_YH?d%njEACgE{Uc{&i!qwH~Y%pE{XHRmB zGxx(wOU-hmn*N~iehHAzGebrIQK7G%V@4{3{OkRJ`BqgPcY=nGi?n6T|#{xMI8MC?CX?{qn9*0>N9wQ;l`WPH2Z zq;A4VGNnQ9?y1K%3PgA6`Nv-sMst6Mbe0Zk9XTMx+J4%6>!Di=e2IDs{^0+ZFC}v6 zw@E+0C?H3ZD_2TizmM5!Jt1eh1k>0Z4$CCOMw(G4;3OzJ2aT6UNN9%*T0pt72bu-Q zQt9Gv6aALSyx`O_x;Fgp*6+iO?-8)~p2lRwLUib&bA^5B-!Ui_kNh2+xhQB-URHA0 zo1yM%0EGrOCDKgDh&mAHG0i=yC%{Cxu0AF>iq(h>w9Fa58YJ~i-VAV}hbOg9FHda0u1f9wb_+_v%4aT~XC29iYf|^33 zDMtrC$$C3BxZ18O5<60o+4(gVWP$$D@gv>Y%&j)7Yfv85=+!_B=MVRJGb$(##2Z_y z65;f;IwLz5UuIw-0y8>w50=e^6*UAR>fnXYEry=^zdgBrI}aHks&MWbnBZ-=WXd8X zxme?w{y~I^hGydCrVhaG@G$WIw;*`^Xn*0e?pDgqHi7)p{5($-SQR#)c;QV}moX_P zRXo=)v$DZrE+!-rRuj*kDI1kRgQ)N%JB1nV$dMmBTb?eM?AULyWX0g3HT1kjGj(G) z6zH>5Ycl-`e?Q;rM}SdFDX{)Z;CK4^noPzT(95+_g{I8`_hLe)g0 zThCMnv^}9BHoO|gPUu7V9m8u)mq0~ODGF10pNyrxR6R=HGUQ>SFIPge_Tx7RX_}se zmq1pn!Hy*X{C;*GN*3s5oO$U`S#rB7vZUt5=0n#AblL8vX{q^t8IaHa!+?MOlVmYHCyg-%wXxYbE>2W8 zjy~OmS$up2t7gQ31XAd-gG74=ghTsB3vta){@*Cjww;4Ub!{W4Hm8lYxD6|yFr>O} z_MOXR_1v$8a39NFF5Amz;|1nABIT>Vdey{Zf9@o84|E5u&v{-!Aj~R$A&+}H35$WD zuwZ;U_3rQ%2bM;xs~kcPSvgcD373$lJSN*eS1uiXI=Xr?eFxI~DN-~YphgOv%zPOd zoG-ukg4XSVYcvNgw!mVyvk8iB_RXs^n}Kl7?YsOZE3KIHL@uT#Se!l2C<;R48?U#m zs0**9Fzzw@`oMJ|sq#X&_YUcPDewvS81ZFhbum2EMJJgKNJ_@YaHCX&Ob7Fv&V!!0 zYi*at!m628(SjDtlEbF#=8H%60MWXBl zx=p-%W_ETsD;|jJxu?L8IoKb04j#B66YbWelS{@%kFk++dmCbDn(M=_AklD>e4xgQ zE}&ix`L@W<#vyw#a3SAq9(^Ku(C*wXBSu5cCy~5a}?IJAXY0+>L9a6CepOpJK2T(w36Va z2%l9A`F$i=uLDgy30DQx>A>`&aAmEC^_qy8lGs`im~qvj5F-3wX(QB32O~Y|39Ar4 z0ytT@_#z)k-M@8cG)#RG!CJ9EDu+2c8JUmaH85owb?}Gw-fC;U^1I5o9`SjCh=nkp zl&4KC`Pbu@z!cD%!X}db>C-4Om1dwb46wy~RIcg%06U6dGHJZ zy6Bhj6jT+_q!Q#;X}TH>)5cYAO$NMboo`-UZ_)+Tt=}Ry`;?6s{Ijx_{4t~e;?@On z;L#JaeZ`geeg@+vIUtz@3ltSoFysV%)?0EP9@mF_^8;1?_nR(78dVnNRbYG0$)J^$ zJzDCP`-OW{ z1Tzb7&E(ydMFLos!A>@&Kdc`aO{JBvb@PG1mCE~d#oB}~n+pO7!Sp}Gbh&C?Qe`@x zY4jCP$v+z0xr!zut-LKUxW3o=AsG(B%2@U>aH_azuv3mh1XAHu({`^p@tJ=1A_*6H z+WK9BA_{@fc}0N~oq8Uuy6(DrS@194&MC#?U_K!7?sX=MMx4KSXDYCTV+zNXK_>Iw zG&UY>@Zh$fyIML3UVf3BAA8xoo!KA*7NnPUN#itli_qIEbGz-)9u@@=7H5P89Ws`v z3%Z^1+1R1&$cK>L+_M^ga!B2FP2{5jgiJA+Md0D)|yHwE3-Qik&%o94@S7`pL~Wx_whRUYR;%p%&?UL z5=)95G%IqfQaj<^bUVmp+HXkKL;`vWK0Go%?{IdLqOvO5{5|e}zDjPw$+!`kh(#MT zv=W6(#R`*Cd7s5bP4D)foHPNra#BE8cF#tFrx-rr(J}A`%UfFj5e`Bh-%c)W5vEx9 z2F$GEzw``E*?;){xW4b&vJQ8-Wp<|qYO2|>rTuMGUS?&F>XD(;eXk&Xi^sjX- zer1pTdAhe3=?TLqytnOu!fNCG>4P8HwCF=s?CjC2?a3)dL0Oq>yt|o$6f};srkCJf zFv%ZxVxpTM7`OU7z(!LD(bLO<`Y|^(FuBkCZHn2lvR5=;k*154VnN7WN3Q%uUxNnG z+qy;Ax_VUQ)=65@g(lr_U3S`+fcYPYBo#3z zdKAVG^21@Z@%-!2Wp2}1S*_Cxuf-v(dhIFidDD9PP|$f*zwpv=wao9kiHQW&u{YNc zZ%qDNuzG*xQ)$6S*70Jf?{8^WYybafarzjrX8<5aI~(j}D-Z!eT8W;lnjp&1aFJ

    mD_>8l5#z?-o`rGvN10Q0DTaZ5e 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

    Idrf6_>U!&&kFLf-nH-=N>$?B2t^ckoeBk~?uN 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

    jp;AoExBM>_r7!!^lxs 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�RCH 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

      U85i;Jywu?oxO$5oP+Es;c8VxvPW9 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 ~A@2-M!>4pMvRe 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 NHw{u6LCq7?uD literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/16_addRedirect_1.png b/Documentation/E/Tutorials/PhotoContest/Images/16_addRedirect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2427d418117740202c48b1ef0fcf23a1f96e72f0 GIT binary patch literal 88045 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/16_addRedirect_2.png b/Documentation/E/Tutorials/PhotoContest/Images/16_addRedirect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..afcd70690b37102a940b2136806a78130f44d86e GIT binary patch literal 60912 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%0AKOFyzcyn#3%;eO$9LVebD+liYuD<1v*^BOF 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 rWy+vr1 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/1_createForm.png b/Documentation/E/Tutorials/PhotoContest/Images/1_createForm.png new file mode 100644 index 0000000000000000000000000000000000000000..51c3b4d8b7a5915ff404593d473fb3c2f527060b GIT binary patch literal 36817 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 z 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

      Q+isltav6F~1>q5j&v7O> zigHy9j*4ypVgi%N16}@f*ddj<*Z@fAx=$P>@_j6EbAw&wrj|`_4L9Hg4Nv9k5Korv zqS+{>_mE6GJ%uaa3Tj+rWix-7OFBEXczp5~0y#SM^-IM$NfYV zfAce+{s$p>7hrl(tRE*i_ic2PxwW36$Bwv_->~y9mb3~E#+(OfKY)5b%OiXg#`udk zgr26umPhgHqJhShp>C+*q)w&j*p6c+$l9q!SC+Hm@_VyYO&tC8lj@H}`fB1Rye-rftaZqth zi_qM_Odl*b(qb0el6W?dF@%p{VjL1p4~$znmm81m(yl)dZIKpDJmr6v=sJy&f8<# zUh{zy>GyD=L?HkQef*ta z8x4##iArj&7Q1E4LwmysP+A=DWH!z7^GUI)ydS&(>`$e2GjWP)hHMGV172}O_c_vT zO}jfV=E*S?#ZV^Zdz{EL|FLXsrrzL{NiE{iwd-#j7ASybGLKT;@!C!V31SSVp#dNV zR0J=a>R=a#p?*IFibv_^d$GE6PO02b&Mjh|YuO%PTXt=*Hh-41R1FQhEGp~e>IX!~ zJrHwHu8!xHL_v?bpl>1D*ilC)5WteIevts!lQDQ?BVLfrnU^B=4%?G{cLT z<*kxUlrD75#i6|y^9=0H(PYwMsZH@nN^#0V36c4606G86#@9k;XYJLxgH`WD-o`4e z&Rp`tOuE{RSFHgwW!vEgZPcbCrZrZt`qrOwI=K4I#Aw3q z;*}q8UTN%U1_51ek>X(ercD&jH(@r=1m(Ml5q1m9;$ewzPS&?KFHILiowNU!^|gkO zi(`8k5qP7iFj|7xDLtZ6BkG|5k`OY*V!L#78slsFVyTuzIzn~2Qm%3#*Zq9QdY7Rp zYIV7@M!4Uv-_O3U+>0fLzg3SAEQP=f`vg1jxzz8VJ~4GC5A2#Lhzq)Gzt_Q83Xu*W zL4Wf*rxY~d<+k#3^k>k5CB4`5ed|^G3w|&+nMll+hGm~)c&U%YSd*;BR0`LYuhl26 z8S>YoKYoy4LFl5M;?T56>0R;RnvzxgDtzRkl#h6ZxK7`i}$THw|y$< z{k*aaufX9k=ONsWSM2jN^{o@=C-%girrgS0erUMh#c^cjb#2-A=}rqH^L(%OyP_lH z`qvg`Fm9D-`&XA%t5}*eYIw!7N=nORZQM^0O9RMLHmMr^-*5Em2d@od)GsS9*;(N| zma@)l+dMXsp?8hd%SzrM*D?UOcV|aS{dBdNOS%dT9HOCgx!oS>MZZDsjcLj%-@1cp zb=5j$nq$`KHQ?)!PHBGPZ_^`5&4JT?%>hSOjTcJG4+aNAqsGOimZ5|6XJwHF?r7ap z-74q%*a05F+Q!x6)9Z3Njjiye`*<+yhU<^k9&rRc<<&E{I3VoZWzW)+Px?hFlP>)l z##xs#rZC}xZNF01G7%-<#t5e(uz7#AnZ>+WiBD$@k4Bu7Qch3SI4L(xs-p-v*%sCr z&d+C8+pRb=yQksQA0PT4zJOEdNA19f$B}OJv?ZrJqvXX_sYskY5!j2aUl=k7yfrtN z7BDsX>7B`tS-beByQPuUR|Y=wWw<|=|CBf)Vv#Ifm(`xMu;oSd;bKb%jW}Pa@V0?2 zyl--z#`>JbbfN`h0>TMxVp52n)zP+fJ}uISx6MhrEb1An6Fum3+<}?78Cp=-%ydj2 zr1zbbe#bXeHD;DS7PLB%cfRU{>>8rP+Ff+FIzGZ42M}h00;o z0Vek&-y-_;J}mLJ*baC!*OrZ^ug^qlu;z3=XNuEUJe!l-3XO`E>LzTV;P@L+n|+iL zDO|sLUr4o95}$_1>!}XETwnM249zCjd@dFMeeWQJjA{;;;rb!E!)-awXQiwBr$#L_EP_;h1Z`On-)G^q854B(Wl;w5 zS>^0%^F$kpd+=N`FHIA*h_9--wQ3veX{%SOufxg((Iq&o)nwQ1ej!ZF*qz#(_u_YG#-}xYaA<)W->#1Df9Gdb6?ftJ96(0Gem3p($_4|E zotbq=HE|bCB&r)%89w?6h*GEGu{hiHj~3NC`hPX~ESlrZ^F^9PYIHA@iVQsS*cZ$} zP~I6%7!%Y}A02mIn35T=HN=32pt~-0l&DmmYOy0Bn|hc}OCfe%ShamQNRPFpj9Jtv zJEixrY+tErud8)Y;*X1yqBA{}XnrEi_xp{YaKiGhoZ*{f6TzbLYi$8YLVJAvm-1KS zhaRg9YBpl(tV56r8oQFa2Dvfi)?Xvv|ESPBrnk7+8xm=Z&~(N}dgjK~Q>$fC^fzSZ zuWz+rMGPz!mn?+6oIjPYw6KKs=Q|#xKPh8%JGu5zY3trRp6B$cvrCZlEiL(ZH5*sp zKk&|l@g7ZMv6e#>!R0I0@Ud3}E*^r6Y#uvSo)EX9hRYH*U}Js>1pqG*7v5pwSP`x@ zxB~UKoX);Vzq!{8gGFV!4whKNu-U>R^>*2|fQMt*svN5MWBDRk?vkkIi!X&A6o1J} zA99-TSs<1BsYP5)YM_|w5ate&?IAzfvVM#g8S6HDpVo1|D9XBV0J`z8A~;k=aFMy~ z==Sdq-O97cb>H@BIZ)on&0;J_=6AS|S@AC|oqKQv12+l2RqlZ#fp1sv>HRCVt$awr zWX~+-CLLCe;_V6V*Q8n)*E}~@6Wax zup(MbGjmqagMCHe1W+^g?;C14usV%f;d89+Im9nQCgdQk&cat&Y#G8Pi-B+^P6&!V zI`0?%g#HG(wa?2rJmLsl^`&|*t1lGTo;dOWS8!#3z>Um8*SANbZ|hnICA;l9H9$x^ z`o;H(mcu#BYi2~l*h3el1B{FaUgIbQGD>jxCV}fPfjb`Ux=?C?WM@X?qUNJF{T@v_ z6`H-zQP16uLxU5GhX)t-jGlwPY8)>gSe$ghDduuxB`?NU1)B0Dng7JTd|co!-O!e? zTs-J^t|fuM&l`9dEZnYRZskx*iB`e%W9RmV5zsCwyrGid^w{30YBR-SmNG;Z)`kz{ zsl<@c&j&IJoX0(b_Ff30yHx4D(7O>7D$#+eNnA?N1V>zdO}Z zx)!pn)~f#}4;hv6ot&({eZzLnNt~+EbqJKvt>isl6M!_jHtt!oGLpG6-#*>Kr^==M zvh<*0lohF4rH||8yZa9o;-3b`5wdby+gEA>e+gd$X%e)?x!piv7w9Y(P4ew7k{%o=Yi0oN>F zoy|WRZ^Tiq>)@|su=?$=TCR#)av5nlO=bz;<6?`W3-(CaQwFxi#tAm??!M_YEO`Kf znZ9v_`noYz^nnets%hs>Ba4dBs5rRLHhPjCi!NHgOInC9p2jeHbbs#|vX{9s-Ey{y z@YFcfhZ1p(FYBuJP&p}_K{l+}Iv#dD~rlLH}iD@>1KD?O{ zg7pV~&gKS7H_k5ru><*_NA-Sl8C9DNyW93Y#dwZ=C1Ax+2hf&n z7Dz&K&h%^+X;iKMp=>bK@0~sA3U0604Q&g#&AEzNg>oSYFJ!CgL8rx$@<-LwXtS1G z1<$PZ_RP@8dfv?8#|$|IXHB=>iq^=m__60y&>deRuk1^K;BwENQ`s4s&3tbMl0AGk zYW0JHixx?ykWlbP_kCbAP=VdO`b7O^>CI;YtqBrx-GNPr^Hb&HdHvx>zdx{b@7vBd zubDm-Lp<>qXnRMf<#tS3qV12GX|@?+Fg$$#cq-Hx;{o&l9!lYCVInEBc-`o9aI) z&cB3NTq5UNR^bX%tB^ZrNIRA!Bt$sZ8Ui?2lRI)571c^5Qasx4l2l&Jaqc?}_qo^u z)H!&J$sXQVjkTrQkGww-v)Y@Cc5ZnS?Zs&ty8u!EHsG>ELJaFTj~>P zW(&efpRe32SnO=3G)u;`owZ`#Q!_hbWB;S8eB_uis5g%Zy?*(3>+i8vcsi^f`J@*t zJVb?ERcVNp6wtpFttct@pT5`!eVpxCpK<9L6>D_Ql+B~NKqZ>-8Fe172t6`*T_7bhkozG9_i4m7kTBMXTPXPM`O^Fa^K{9)J2}vV469| zWOFXUj7-!WRdS`EP0gT$6nBrCQ|$09_i%G@^ZbWR{B<90^_N$Z%d@y|&%Uw^K)EYX zMqcSh-SP9%k*AH~cTHVgJ4F@(R$nwVfBcki=g zD8^?hYi8WZjnUO2m(jVw)6y)Vwr;FrbeZ`**N@4iss4V-j@D;yeEV&KR-$IIYXmFz zs-%riICRL<-v4&)OgGY9EedG7Gjot`)|cLt%>@S`X?9K& zrW$=H&L;+xioc2g9NKP>gdRQRSWQPbNR5b>G1q9Z4X@`;(`YlE*;ZSsS71x*a_6=W zS|G`2IapJcnvJbQ)UWk5^><8+^*q&bU^X1rcCSbcU_2bX4 zg=p5p^9#8?{ni)vSgnpwKPhgG{`L@V6T<;P3n8!7?s0aTS2LUsv$(MhUsTR>9C+w|)j&Pf zgekNI?vqjWX)b3&wMb~%J%H()8>>(Vy#%8CF!bRUeQ4w%e@r=b`&0EZd)c3@+1+3E z9$T)n`#dXqFNTcjEpj{FoHe@jplsuFVXGjbfksy_*qeH`LLvVI2h~>VZHcO|E4{A* zzii_{9!e%MQE{0&ATfIsq<6~%gq~!;#;Glyg`WI<6AUU0-1965(hF!?pUGLnGeD|u zCsT<%x)746j};FzqwKP?qZVi2q8U}0(u*Q{ZvZ>%fD-qtjN2Tv(C(K$$BL}<)} zazxyhvWPOvF+W&Y4`xQn{5j*S+L}$EemXv`fp~f^Y#~AFg;R6dRp<}Seq{6}Bt5H- z^y^bMw}Gn0m!P>|6r|`DYY({J<$lV5opq74GuTDKy^y7g?X(G)e1Dvos@!V-AV+ep zfD&~~et21mro~PNO$YGOVJSxmO97JBF*WAf2=jgqG;i+K40#@^lo9ZD!#lO zY4pC!naSXo-DfQl#76%14@*9<6n#-i4I^+JAZ$?z791cwBQysu7K-ui|0C#{c6u;d zNiCm|!?RAAK`V=q&|xk3he^;(xX48A#h7)JO_l#btsY@Mz9+Iy}`>DLG3IBvFmeX(Wc2aCop5nuP;c2ZOqrWJes zLq(QnL*kX5VyrbF4i{BmG`m>33-9^d>x!Xsh!#nZQxy~chYQfWOKf&GF{IPU7dNb6O5b*PhW@E1a}>4 zp8nCd{e*_qJIn~RWk?m-WZ)3={5wu|G9bHHyRdjw+646!U1`hkelre`-{X(~q<29M z;S4~21xq}O^zqunF1C{ye^8eg3ot-7#!h0IA(}flkx4AHhq*YBj$QY*>+L|sh79ff z;}l4O+~Y$gc7T1!1Svh#<3=n4`{FTus$!WIJDDPQd=rpMD29)_zvtc$i-Bd@g__V2!G>+P zH1XoKibuTy~`CXNZPg>4CC1r5lraQr0g zbJPSu5H8J#)6v>^x<3|a`&Jr1c(}Qd@coPjVBX#iN5Mk1=>A!katRpC#u$5jOXv~M z1%C5d+*H+*vMr3juFxL8iL)8O5UMRY;i8(N+Ax>WGE9Dhaa(En zcEb4ic%5S*n!+HSN0xESG`C>1z68!Ng4=w{zRl65pecMsr>WR(O;HXQO*rTj9sFPz zhS`T3%J12Xvv$G|Mnx^6jGXUJfqJwzy?5;OO@dn^T&lQ?;@a3QO)_=-@$Bu}MdPCZ z;*C>(8uofO^%C(2T!BCkl6iBq->B|F8?*p;uMMN=ik#7c4S1srv$r#4yRo?e5%35* zuOJy|Hid(0@Aemu3j{o!YwM+e@0sgu;!Lv=3LXqItz|G4$fegJq1goYMv|^5T>HP7PQ#(t1 zSq!Wfh7rorX6cPX;6-m?1i^~OS!Lj{)jm&6fJfanCoUUfYPj#@4#-?!F{7! zt{n)K1YyL}s(ouRA>+-^}67m|IBZ5K*Vr-2$Sprl1nm)!?X(3paZ8)5w) z^X@hx7P#}^B!PESj-8XP*BJ@yEx;*6 zY6tDTsIm??X-@z}S7W)Q|G@~?K0@dG3PrHks2=R; z^a%EwRooQ2yLw=dyO~2^PCm*&N`%zuJsl*uIxG|yEifG<9=I&B?%DOiyS>)sy+@pe z%xZ%i2UDDSp`xJY>#><6Y!0u%I$6z_qw47An}oyF(q<<^Ua!J}4d)N*SciaS3=w~| z&xF`T^I_MRO*=hUvJ zCYJ<7!U@utUkxldyGWhTJuPc&=cV~#w7#EqN9%jB(qSe$gL8e>34jZh@bSSP>#RAT+yn(_H!drG zAOG$bt1|ZVYR5UJOT0+J{g|4oy+i$D1eX!MlG7I9ZauZ2I7$(V!3yRdUMyF`PKoP?K;1xbWy7vV5yu_3Avr znAKU~V_pICr?nhvI17WTp9qwg4I_{Q1nI$O5f)w+FHVoucy$S_Y1OALWXo%zmgYAx z6nU^+GJakr;c#{SnUiosd$?iUP35%LTvXklnO3`(`okL_V)Y!PlX!B0zVQ$Qb=)`&eZHol; z;b1JnZY-L|?vas)#cX>j;lE3Zbj&X`<+n|y`qFUuuLppN{2$C4K$_%jQ!QO<$w!G@ z{U2|`V(>xGuN3pZfyv+`{IYk1$<{FeH%lb~pp!joe5~*iz5DRgRR}d=JlldgPLkPq zZsQBEBR1fXQisVB2cbnQ9FuMnN5#~?jfbshF;`Ni#vP5Juc29eZ9%=T0PqDg7&3we zIen)4g@i##UmZ$xI<)*fy`QI6aHUtDytvq@DUto3f=Kk zc)*Vv#(Mx0KD778IISZU3)#9%dq~-Z$fsQo1uxRi-M~Ge`GnS^>Wq<;*YK7F#8l1t z+6(uA>LzUNrx56ZzmuAKW(RuK@n~DB$Gei+9OelIb%!N(^c&_^uk!X{ou#@_U+HiSZeal7Ca`S1LH*SWZ!}%^a5Dj6LfwM;?Syq z$2M_7j4i_oHqC9m5EOzG|F{%lTuQ*<>prl|e1)nt8%920kWnck1W+Y{>6vod`I13KFW-|>Yk2|PP*y-KBtu&XI1DEPVZ05Hl z1n2P6VJ|J3w}Yse!|kmw77|1Vvb(T1Wc2|1I-UXgeeTVlpf8a2P}Tfr&hWSP!n6+K zp6V1+SgBuNf9EE#AF1eY7j}q)89^Gkfa9y_cU+n0wyATbZ(h*jC{HA;&phlNyuvhSVK8`9}}8SR1s*52kF$kr*8c10yARV-odNK zb9D(?4RZ)6x=qmE{1dX$Iv#idNX$%2TyW8X3$ROK1crXnGI9a5dEnXko2k51MGWaA zq`8HhLas}Ul!&qFWYJY%Aw&U>*=rkNb9!58}REST-nEH^O6^6vK=ljkE{q!uia9HSEu5S-{S*~(;%*?`= z{qytAPByPU^Dh^dLAhR|q}^!GZE|k#SeEaLla0JN`c0Z5Ok)~!Ma8LRMXvjB->XE& zBeaY$5aKGaA0HN#afD4x&~oxDhm>sci-Iff&vNjsMBbnw@EbBdgg}L=%XD}~c*o2z z`3OeyZS`YgZ-XCQppfY!K}2p_{f5~SK}4DmZlzR2uwleBdH+fzc9i^#Bf^q%gsfRBad z8Ou9q#{?_vll5N7TpnJV5-eTs@r%rWo9WbvkKTpTspg*iHVxeFB63x#x zfBN^6X^KjPYH?f~EeR?Q&L{X2&r&LFHP5kesWFP@IOC`>H#fxG-F%lmm4I!sqPTaf zpXU(B>B(-bU-(+E_IAwQH*x*}Gw;J?|B`Y$Bz3Z2yt8QxInMJJJ(H!2XqSK%9i3g% zA3iVO4e(!O%YYY_sx=0%eG+WDvr7d}C>3UXa4J%;!*Rt^P|qv!LQmXE?uChxu$P?s zFa4nkS+cZEwW+(qAQL414gJ-L<5QKwI z=E$%KC|%;;yTG#YtS7Z60;^9KW0=DiiETioJ=}b(FHG}2dTJ;y(rNqexO|JcV^&#( z$u!J><~YD!5?w|C~a#j32wrg(SGV?wTh3aA}x7(k$ZuK=>IrI!~|J=-P$BXiVRmX4=AOYJ$lY zm;ICGaVxUSTuxoqkcs(ygkEx@3d?09Z`DP_w0B;VJ#`!;LevyiBMWQN5lGePee3q- z3OYBI_Y=mZ+ckvuNJLC5rW{uJy)`oKG~wn*@#w7k*oBY+;oXP4*6aNW6>Q+c{~1Nc z9FlANNYDaf5@Lc=%E&6;%n8ewhME+g?%YNQPUl#zN@VY#D*brKkI9mT_FV~v-JNS$ zvENqjU#evARH?CG?veWj))J!mfkrN-Lo`)Gvv612@?TZF%z*PFlMajgYofx$=@6LO zN+>OJ&&J7~&znR$9BLl@V|-FMQ57l$lju}US%BymV<7jXIcxrrV2D_=Ye?VgXhkF83(A%sx02$7adm*O^Oec~5jn9SYcsxoEdC^k2u`s~& zv(vXrhfPr3jX_@-@j;PK-QXeSNtQ8gu1MKn>gp6=L45FX&bE`co7deWEcKuoj)U( zQ$O4Q$pHub`<;znury&hJ0mosU_DurA8%r|fBYd$ND{Mi?gOXftYv*0_|pG1TX1IC z|G{+s$A?Hz9fq9$1m=HsX7i!6GL$uONH|!|LZ;IHH7cj5-EsKvAAI`X1>OM7|6O2e zn&)2${#Ql(t0Mkt(|>jF=2HA?}? z{?{k|*C+lr=-9v_82^px{|oxN(X^ZrGs=-TIkX{h$ubuF3r%TDOFHFMS3%U^rG~R zbSZ&*;;wtY{dVvDV}BdWn{(#OnKNhRnP=W`4K;;pS0Gogu&}NvDavVKVO@k^VPPxa zT>}4d9={reg+-60BqyWeWxAeu`R$FbV^5m9^F0%h`kGNWPib1oHNWW4Gq3X1K4^#Q zXz(M$QTiI1*L^?oMzF#(uU`v$6Qmh@Ltf)X?kKUQO^V0&z^3{`?kZPn&%%xMo=vg- z7Mw{5*RGRZlhMO~84+Cx--Ahd{3g9}*^-ikG|e!a(>yI^7s|OHSj$>8SX1$#P``}aDw)jcMO03$)CUO3dTb6TTqiA7%sSo z{Tl19VS}C#KemFhS{SP0fQh7S@#rD4Ay-h8r1W*N|2sA2@vyij$;u@f(3IURezoT> ze@R4hLC(A*mJuS0J@4_KqJrmH7&YMPFac_n8v2e9iuuzl&ZeeY)SoJi2E$J^Y zz(R7kf6YzuZ*wc+T@awWPKsA>;R0S>GG;N$#Q(M!O8nOf=25Syu3!@v-N6QvF(^Po za62}BtMJeHl;xgCKvZzE9x`ABRkA#R6Hpn-nJYe-B>bDc!NbLjuUpBD!p>GF>#M3A zCiK#U9c+68d((v~-Bz>=s^M{d2V>U5e7r#VN{sYvH~$am58yp?VVNG|NcX|SO1UfP)!a5Elf?f3iph9AK9&I#PsM>P+oJk4xoni@+@8^=kbOnH+KK=3DS9H(uth;zz}G(w*y*lPTp` zwz(}d>Le>08SMS69XR(h!g(>|`z8>bA;{OCfYZE;$Psx+HG9QJ$e-Clei zvrx3*+Pt}<`8W(#qW;EpZ|ExGZ}uF7OZ*_F?UT%Cz{$qK2OOfr^mIrGRJ0>M|0|DS zb?kjpZ+XenA1(AIkBM;UV@WZa85E%mt#xXW@o_igYJ69kpq`@F{rT{PrPaY9Q&WNo z_?McslKJih#C!=ELZJD4zj0Au>xHdZ$?H6`C3%6slRn`$`o<`Dc8<_l-&O}%V`!Jj z;zgBj?#Y2x^A9ucte^U2`ngSOv++`V?QZkw{8@AFrvZ9{OGQEtN_yd%BmS~0@iX52lv-j>W`)KyZ^6k)H568xaU@GS)k ziQ?l|IJt#%-YU0SSQ0BuZfqz|XcRWH+dmx}fK{GMy|99fHOZE#-mGQb;_m-xZFIEe zd$ZNzCCk_Fw!kj3$N+n^Y0B484XBkR18=4w-zA!j@=R_zx+Zp}Yr5~zUU6~0n}W_{ z2vHm(kDL zb88EcCc(!gMVy}easN@jC?ta<$a95yuA0Nc*q&oa`cKaZ!&`EBtHZ-ElSk#E#%9>zU>4Rtx zyFprryFj_=Cq#GO-5#Nr#z^Pf(--tEavoHk!M^rX;n{?}x=k5uDueN{nQQYeCrl#= zgI*1|RPLpmxmF#*?Nd?9J>^k++C#fI(z5^QxpZy?Rj;GGR`OE}H3gd6X#|p@I4|xd zsn~_gk|AjR05V|`xy>;5R^-c@?$GCN8;xs>ZsI;W3+WS1J6`B9FzT8?8 z&dMg~Fp=^41E+9Ao2ENUr=DJ}iRf@=rO9-SCF}U-7Zy`hh1}`G1|D%Q@(xi`mOJgf zU4c~xYW8>1CXsKNo6FQ+bt?>`J6?qMC^m+BJMB z0WndoY_#w`4*2o*!r#0x-aYzaU+8Aj$)?LgX@JQ!be*Kd}~0*)@aD9mQ2ewjo#s z&lCGnQn^2cTrSbid@=BViRPT!W%!GF{^8Fui{UZG+bc8so+s0hyj5LnkSXQ2HIbJ> zJ1x2rt5nLXLc3G$EmygXM=dEqH`&xSRF0~b+7m+l^BySj!nV$IPhPK`a3l{c)-LRN z>+EQ$-`WDT=pZgGFYhxFKnK&EO2eY5S46|#n74PGY&B=QJ~g~+Vr0anF1{_dO->@; zf3WfP%I2=wPeH32+DIZi=1ggN)N+mLcv+?yeSmz{$_y{LE+eZvboC?e2~ZGZ^_0)Q zIBD{DCYeg7L9KG1vLx&3G2|Q5SxXv1?IK*m8R<0vDlxuw9(4c6 zfwj_7g}f-=Ku=o_317ME6>do8<&M;8*NxUx&ls4mh}YRs`t`Chg8ojl#W2ge4zYcf zk!#9@H>qvsM7W{P{s@F^}Ou194!~} zCQ&mQmAfQS>)hYkYgmzz5^csvsVWpO1$z2^xGnV&1p#??$~lhl_;69t=Xxp8Qxy}Y7QE<$f0 z3ZMp+gbL2dToc`aH}}3XCGh#6^!e^uBa+efLfvBnRS!kHOgU`P!H>i=k6ZBF3tew3 zrc|6L^w_4&4cVNiPrm;gD*T`4;)%34u5zP7F74jzz~PnKrcrZdvO_mtg>ya)?tmJwm_45#kw#+8A5J602b&vpj^o~K#!tN}$u~)0 z9mq2f9D8kbZy2g`C!pD*tf#1KKXYu^GXPy{!gM{v&y2W5w(3Q9n9|KdlgWn(hTh*t zo$|fs)_c0`3Txu+3LUtsct`oK{VnDI8%?0s z4qL`7QPvAVv!v{HD7XN`SMPqe9^$4-2{}*RU`!ylT?%)clbN^t_{O^m`NNYDvy`No znw^yf_noZ%Qdl$cjnRqWQGd9~6_|T#I;Y5wGs4Qp2JQtLWBz(w%Q(VW$2E@}lHA@E zn}2MA|0A-0j{g~KQ&+=P-nSn-^>VEQS8av@q+-Zf>37!5&JCN+n;yGF9n{POoOI%| zWyF5naHyMN6}0O4A&^*YH=?%rZma3N!_9RRyqlDO5wg2c#m6a}-;{pOnoJrR;o!?l zv(_G2&h8Z*#HJ5@Dy@tMu5}x(%uQ_*p3E1*No~5i1K&U37g%QarxkLtlaDE2?tCK^L5%f%-{43qJl?>IE7RzdR6YuJXHg5hf_#U+i z$l)Xt%?sgP)py;o3_79t_o0`0OA>QsL4==#Y0%MQRwf)NVqseKhF-uK{ z_KbA?b^Ilo6Pp7znWZLXEW1seXFeIu54ry{fB?&|VbfTZfLxQRsC+XTuemf=<7PPF z*sxNdcT|lYs9bSsIx6^<`#s-nyexsczKHS14|x}PCyDCnGuzh{0Umrul>|2}#26u0 z+u|+}KPClY4`!f79kc!O_SM8X8@8J3Eatk7cFP1-?+8Nb?BAK5`A?GCOqBjm8tD%l z)rt0fMWgOW9wafJ(n1v97ipS2aVAXj_ahGSG4%(BQ=Taxa1-1Tb!n=OG3ne+b2Cv*YNvx~SZUySyvuuZQg=x5n?ep2(f z6M0W^JY3}P;f*+cK2>s&>gFhy3;~lA^s)luFbOaMRTjS{Zyek-5AJ6%5WY|@@AUP zH2Ig+ztT88m~hHBs&mvEym*ydairWN|9*uj()DX21Y~I|<1w_jyWd0U4E^UDAX!*E zl|!s#WhbQsZO7VK`&*`JK7FF@hH|SaZ}vTWZT3%zmQ)TmS~*K-ztU@0HbsdETA_;v z*HO#cO1TF0zr4s(D=BxwLz`+d-Fq*(#=n-Bi@A?SHTIL+Ev)1=?VcJ-h*YGV9vlf* z+L|1kN_fV8{la@GrQ@9e62-91O*Ljf-stw?w0Hlqb*tl6?Oi$Z*Kb`xfchWaBeq%s zBE;Cx{vF)@;ujU3TfDTFQKwmeSA$fyg8|%6-6?$iwl5c^m|#(lCEhNg4`;wNH*H%| z2HAVHFg;=x=pQUn=Qw3ppqj>*?SEj9y5hnIao4`LH8w}HR zbd?fd2#cwZYn4`LpW@=Oq$3ayP)HIzMe%=n|554|y!aG;(hzL&-q@A=cCy&n#9dnN z+en-TlLC;Neq~RFxI9h>QrAnB&^xQ@4*7#P(J8JTee(~7y9XP5KWD`mXk_?=<2wB3 z0 zHWdCdwtF_h3%?Aq<7eRFrd%5T6ehkT{%265bd$u!P?yC{*gn>hvGOt6$DsD*kAQH; zHA2B=kj8PTpU-$|ZSX5?S8NF-2%e1zi=H|nQKTNLi^9p;M0d`p#|);EZceQhMovu| zI%KX-+CEPUmJKj;g|lQ2TbpcdcYk-$C^;JT+X$@nsca;tQS^EGx8RMQIOBuRh_N|M z=_B4Gmx`w2SNkKFtW#$vO-0>)T8$4BwW`a$3;Xnofixb#XpswL;51T98PJog`a zwy>se-|<)x=Kp}N?z5-TOdRJs1|O2OX{Sda#-KftmNqV zLB^hH?B62pC(=|T>|bdSDW*QfaGOdi&L-f*uW>Hz)c_MSyF@_wps`>h(tqXUEl%8# zQUmjA?(=a94aqRyw9sUAse@5-y}^QeFATAF)2y?$UAVxW2PKk7LqiDk^-)DF=O;g% zEDNL8cKYUfmc~2GT^Tvkgqc`w<)Y$43a|}V4`aABvNHW+3^K-i2Usa6mPAik=Vd?q z9UB4w7_)Os8}p|@evR^Sr5OVy9bu-7vblkLqnmK8@>}Vo zQ)Nq*BUgXG7w&mg6G!!KS_G{CPZ$P|B z3QG$%kAZDG{IJ~~DgNLfZAio|MXyAjyfJHSZ+(`&;Qrs7CAh~}b1Jw0fM(KFscL5S z;q}#7%IGex3VJH^ClK{(!7!lS1I=)lAj0*~fTM8hjh5-px5cMN2tE1usB7wvlUWX0 zOe@XI9!b?0WXygU@JaUT$vC2Z>Q$I-h`iIRqI@A_$2#MGnEC$fcr8(d zP2x)r5jF`i(A_i28aROnjbrHFj}caoIPPdJ|IfLXg_?)UsFrbSO_k#P`wk9e?Anbw zLwfh`M_z%U^H0S3GR0B`^Mjd|)bR46F>qPOzhaN1BmmEP@U3q2(N&aLrkH1Pt;2*N zo6=f7n+~5zgAO^5Av186Y5S2^0XWHx!Lznu{{~L}>B%f*FuINUH^5Z-E*^k6?_z(1 zf)g-=F%JS7BtNtCf3J|32>>=xB*L;XSlDC=nBnICb+~ZMaN!>WxdDz*iwhPf8wn@C zkDd6Nq5hR5bv?!Cfb#zUlYtJN;XcIxm&Lz;RndO~R_S5b>nKVl`w-ySIR8-TzYh0H zrKCaD`T$?G$7eQ$Ci8fcUjqAP>boKI^S=W|%=QN9fYVvPX{=hS1@KrdmVwgie}gwL zP`ZXBSmVNV6+JB&_+WWMH5vP_#r?iUiip7mUBQQTt5N`nyJ5D~{$G?qECb!SAx#gE zOawl`7483W)0i8Vp6`Mj6A_4<6|qpMA98N7{MQM?;PX^Zq{o3$ z2Fdvsul{4fPq3(d$w3d~zz+VD_*)Tw)*djr?f?*e2M%@+F0eS(TkNX%|Cj^|thOHu zcL2DB)Y>q9vwvA_$1gdsfxy=(ZxrDEQx0iU>@XND2-ahPnFYx_RQ~UkfF*;~UZRf` z2CJ=>k2<>h&(#v&%H5{+_F8>YX+9{9mC~Ege)c%Zcvm16>|!&}ctALc_Mg%RX+awT*c4EyDC~D~y&VkF|inpUTOuvwIb zIJjPfroNQx#h$%5!7O#*oqd#{03*cv_`eMdn7blVP+~;eF^<`REmQaOxEDNfv-b|% zsPj0TBl93&6-tG$@rzaAx7NN(qg!9?f6W4#%!rJ_|CiH7iCs*F7?wofyz6`#zF(-$ zb#cv(hUSFp(pWBkmv&{#vru2IBrN0`EvEj4f4aaGmRM6%s_9}6HTFetq^~j}FZ|28 z@tJ_@(w9yp#7)FP#x4ExxMBrWlYo=g9~W9k%Oxhf|8`Pncm5?hI_{=~a3K{gXC@F} zARB9#=pPGEqzih25G4KoxF#Sx zaKtv4)fjzF1u4&eBvpTWw1DmqU@nByu(sAniteTCKwi6%a-J^bbf^uZ$vcmvXc{r{ z{6JBR+lY;k=9rm_knrGOqFeIy6>*K?3~_EV|N2U|(tb?9pvli$XVB@3I*3Pf?%$^< zJ0C7HQh6clkmtR-D1S3J`u8gFFfmxvO;4GeBFwY~RaQ!en^XCg-O2K4gI!5nmS?9& z1MfVykbCNd7+1PO!oJ{Z{HC4Pa(>RwiO)J(v-MV=mmhk61c@w{k0jT;*DNEo^?o;c zy|SBEeyzEnpp7&?Q`DVvoYL)gy-WHQaJ>&E-(JO*XZfZ81+|{@B#Fbxs-oR+^C%?m zlRi*a9U={zL$i%gI!BpwefV6{^tO$IrJKDiI&$#o#jANBoz_$pv8HP!M~FVAUSsEE z7X33kOXL9Cn06`IGXDj*0H(Ih4?qm;hC3U}7uL2syD+Rx&Ck7gWp+h^SIrp@L>J=y z1i63uv3Sfa`?=^=VFd7-r9Tz0u)t3xg6_;;MZS3(WAwj23~Te6?PUMsVhK_P8(%uq zQMD-td?Kr;xGEv0)-6rFa}lLK`J|0#)Y$1a7l5Q?wwyj|dJYuZqu8>d{tO$6bbvOL z5#noV(4ZnvtD11+Qc2EkOcxPSA6 z8e!mE5HpyDO5@|nu|RH*SzI@$v{33JTVA_8<5y)2(9E5^LG`6X1elxSf^7(>0+6cF zM<3EPBT;A5uL6Zryqkq8V(6qy9h=b}YiObHN`AsxQ@OdSeo4D+O@7}Ahq}&XR4z~6 zePie61ay+drvCf7M`tHn3x!f>n@`!pj|U^UXieqk@{|%R#;a{Gr69wr696j63p_uo z1kfXyanXnbWdB@@@BNRv!<6IA(b~&94bgYeKSY0@9~6iuVBHDR^u+i0?C22@e}_S?DWsw@Mt@O0E2 z-vj%#t#q3TD#SR9ua}VLxxL@n(Nftqk<{rAWPnpES&ZM)&AMiE+3Di#<~aQ8tR1th zkv!k)=Ay+6*M>)nZrG1i=4W_Ldk=5bm)}J?FLWijOu3I3)Y17YzZ`gDuCUg>yV#r1 znZRZgC}K65cy+8^tXa8A-8MHUCs*`ey~eAPM&{Hk~AE= zfxVza5AGATRIU?#u&M>BdwLfy;5}pbwt!Y>4U0g8UuUxtxGaR@`0Ybba_K$9|rvdZhp?XFN~O7k)9Wn z(iNKo*4|2<-oTZ`0b4YS=jDAavYZpl{pO_>szW^KemYfMH}AWSZocM>6eBQHt(o~m zt;51xj8q>)aKyLt#j@7Jg8N(3jgb&1KKtBM>6gyY5(oN6?NVn9UH2}QSn=3$)K~?t z4%0S_{7?_rx$eFEGSo$lja@-*4wiS^m}`0FV^fRl+A{XF09iqe9{xTs&n-xTA5!x? zM$mm#N96o;*JSH!Y7~u_p3a@s{oU;INnIEdB=_g$?^|Db4}>cy!F&b0XBf5xB9;(j z5&{ewidriILcW@o&*BirLQGVR>oJrts84H#3iOrE(7-nmCYWNCRWHPCsb^qtowv7o z(8aX(r|8jqLYeRSr&8dkU4UEdPUO%o9qEzi>uY?y-_Yc@;eyC@)%*CfgDFNIpcn|f zF)vJ|mGo#iH>UPk?u%2-&(8a+U$3Q7`~CQ6U?w&nD?9(Xg)reN-}_rt)MTb+e%sIY zJzM;b_f~d}ma@Ai>s|8|VrX~3iR9qAsns3bn}1kxtG1p0ew(fFb_dI{WBmeoiJO7o zHKAY)c_fF8N88~>-ArwsMR{o(&{7pujj?D--cY;)S)3?^f15jRdd>QK5ES`&4qX1z zqJ4meTTUBb!o7Q){W*MSph+_qR^KN9toY?e6u9y=JaFGPosU}P-uxxa)>*OpcSyrbdQ)7#F#X_vxLV_6YV{%p)7k{O_^kDVsOy9N2m+3QyQ4 zguhVMA}bXV61vtEG#8=3D^vKCFGb(Y_mY~(!j1a1@^{8`F<_lr@8;uG#GS6i+L?y6 zy`D*%{4<(hCj=Lc^V7?U}!?j-}ce%>z!~Z z#m`OF=8|{vZy*l5i=PZ=eFqR+7bneE)jQU#SthVo^Q(h}F)XD~szW0iV^IZxgW3M# zm=)?fhqd`pC#mzYZcNl2@<2Ay^3*<-Y`<>5C!g!@S9d41zMU+l2-n0I$v?77@m2Jb z>UdBIPYU<339pvO)fAjlt^X0rAX^#*>vbFIwiqBApF>@p zVE>d|;bz#~1_~B)N#N7mtNcOEO_zgMEW~GaW!?uo& z*D3^0Bv(y60aHlPc%|B)LWBU;TDp0?$oDX<e}>kHd4Oo3~HyPK0+(%RwU%Vbe3*)&opbFy~!k(*bP#MsSEsgcnd&{RTg%s zToLZisIq;3M_Z5CK<&bV5}nMJ#dRiWINakst!*?2KM!3~OPzZv&2pW+7QUArbp0?i zTRB?94#YH*_+D{*J{r%GRVNNDpuWPZ42+!eJ0=g63tJ*!OnG|`NLechEz{o!I4Qyz&=f>s?4rZ~bXJrWT9tS2;n0hf-3+G;9pP@w@H_+nc zhV~KM6z&nqO5Y!=bDDWSR`PuK`$8J>+Fw`lb@o?q=7}>aU94*|OFj(BQ%yMo8a%!Wzz$L5Hoy?ODLI%A>q$%X41fBwswI)@0 z#Zto+fGvhhSD4$^FC^>Tze>Sd&0J{uyp6q@kgvxE5ZHc&e!zc6@Iu_X0{&Oh8%EIa zZ~$u^XAxNu1SvBThx*At$q&OhZ^$Mg3^~ijBI>3*UI0MT^v}>{l2c50VX!sR=I!*x zSRpKtCgA7yEHR$XovsQOAwFbofCE6v<2+2D)(FMf{vu1%YryM3R~rk5I^6Tf^C#%F zpuY7$`s0F+iNeR|ziPG8dAJd*klUq(tU}t3U8=(+_Hs}d#7tC$BZytzToTs@ivY== zPlP`hBK@2=OtuNcgh#d69c1Kn_S;&aw}38TQgcP6f>dspx~<<2m0|-Je-oYB!?sA- zFWzJbB{PN8Bj-OeksK}j8~30M7tjY0jaOWFxgjT=RQCxJX$(gj4EGu`e7`<>>OTnb z7Y5=a_+F(c`a@|-mGO9hlQCVu`<@hV!Ao0`fSA3#0?wU+_xa;6_&-Ih%rMD)abkoF zvPI%I5aY!XYlwQg@G0B{RmK;g*yv>(V!sD*8)wOu&OoBBB0xCcm39?_&UY~qx1SJ! z;JaVv{|vr0E+IALqMI}vmuqxbP2Ea5sP1=38#T<`cgoCAsIt?LArwHjpB0 zTip25Q1VIHucAiP7iN>MTF%OEDfQ3nCmxo+x*j?_;;GMBk?mUpe^|3NQ+87ApJ`!# zBI92$Pt+gFb-6AnZU0bj73Wif3VR0)**&HWkv~W%1CPmLxmuU_T-}tpu1V+qqsHwfpKZ8Yu9f^jTvQ^IWz50a+FDL; zHTYA*945!=OBYgU@Z93%F{U|F_Qe?T7Ryg zl8IESBtbzz0Sv>-18H4^$L!vv-^U1!{Zc+Rn@WxYvJv`mD3x0-Gm3@6GZt~~{wj{h z9*N>5ylr)Nnv>5EiMnym$(U?mFo02Yq6qIN2_lk$FS%dp+<3U$NZi&TMrDbvv*RU>NRskw( z>*_RVzQcHR++yzw3I_sF;9-8H+Vqq`UyyHN#km7uxenj=jX18$;$h~4WGy}i?_^>rpR5`!b=IbNE zU}uhxlE-)JHOl)$RonV~Y_1070P~XRbf)|58-E`I;Cb>Hi4CFT@u6?5psV$$1MPe} z+q{D3LtCh#u(bo5Qm%L9aTVm@ZgFWYo4P(aQKn;{!r^B*QT0ZL;nAcr0CY<~7gbsP zzAFEM6QmpPpOGU1lFbyAZOxtwLeNpE&1K4+Ce0O6mZA-gEBM$iK@={_lm|lYe}E~E zSpSd-Wep9XpBHDhLao)>w-KXVxNsR+A1`Hk!X}xf{skb$0wfkZ9tc{sA~tcTX|@Nx zC+InTmtGCqsc~N~qlKRwtUu@ju3@b`)lXB$Klx;NK_39bFnH_UB8Ef-xHZIxa6FuZ zzv318SaJ+VD;MGY3%!#DI80m4{97VW0g=OQk~hy4&di^3IwuMHdKh>VUTRj$zSU>} zy>z$xo+Stu^sO#fiV(A#gC7YH@~Q;?GJ{Bf!d%917N2;65poa9tBhXda5Gcw6Uv!u ze44zk24q;cac>wqXa~gd+*>~@MSp1t;GF~*ZT*m?7e+0+YlXoo^5FOTFi%sP3||V` zVFXWCcvV7vJq=fU5(Ue;g84iRblq5mWWjv|fS;&qLO4Kq3>f|Y=DaJ4g8*_?_A@RB z6LCTLft8(7^&)l%1}y?|DqaQO8Zx$u|FTJXcJP;m%Oof+>o9_kEU-)=wk!a2Y%@H1 zia{$toEL-r%hVFZ!1whEsrz6)O-zccl+Z*^OalH_=qAA{Nr#W0wVXD z&letefo;$Qiz>cCkx+I6XihmCy7o-^7zjK_C#&}dOmzhQ^1h3)H!rp?AUiEUEETQT7g7*_R9u$aJ4{XDYYS% z|KTsi{ZPU}EnlbX1%pJeYSf?sccKW6%}opH7q{$&OL6-mepM&n0IKQG25f#X=7Jj7 z>P-?We;`955M6U1j}K2y4up#&iVZI`qrw`1(j$uw1_(J}f$_S8Y4D4yLiK2mq2&g6|%ib`+!Q})E6>kJ) zdpI$hsv`h?$)b>50~#g*fa1`kpfvgjR9vDi2*`r<#etu}p2n&D;ln&mTprr$EP-SlTgqVZo^T(U5`bESTUr9V06^Z$lUi zpB+p9zOM(LlYO5V053(%0>nv#u3W_?0fNJD;~l}kNbo&54L{BwPltm+RH(5+KzOPp z4`_IP`!T`TJUdUM#C3l(@zK#5yuNmgUSktTx!wgIhS81&YCkEV_9xq7<}vjIB4_EzkGL)3z&@i5U)xS*tIhDOS#;c@LwAC z&&O!QcHZDN?f^!OO@PeuhXI1WmSZT&fB|-~5-US(J#tgJRW9YN6#k$^uyssTAQB}V zsG0b@?)nfl40XG~asE@tBFx$}|7~gjlS|CpMG(HH4nmV^A9*j%rN~j76d%qpxwmPUV z-XY*UH?B0WeagUiRWg2~!QpQ8TrGTV1hV zC~)OK(eNVJc0)`(kCbEa4`g2kY-@1*98gsbDSl!K{QbI8nvni{_;j#*WDyU?D5|4P z6!kVU(r=Pi+hfCCn~yDfohLYuk8%9`W#sLy?(VEaHp|CTcE-eEnBv>rR5yT6-N2y# zMP4h^zm`XeIbBcaZ(Ri2A%uH39M)VCwRnrNP68rTIgc#TzcFEoXrJP#$ehuhuBs%Y z8TgX^e%H?3--)}s@66Yvc7B8^Zp9N_9s1-xfaHM(297W>U797VEtD=mAA|geY*Y`< zhun0G1qJg&h}hh(E+pwFV2k{ptk}V{`2e!+-eYFeWVveK(7llhTC&DD`GF^i<=6l0h04ByRq&=oY-qmoaIxC!`1 zQfJ#SJM#(ZUC;2ZTL5@3YQg)9b0HvMF)2hRV$jm)V%PfZwwnt-T8NzJEzQ&N9AfKT zm%8E5yVvmi&tva4kQ?e@2Q>>V{VzXi!gbxJpM(&>|ik z7*%&1@ni;Q5&GFYMt=v``)eY)Lnch!6)VV%^ylLj+LNOmj##XdjplJU_`!s`r}q zUQ+7MlHl1s2Dnt0|KSu{;PGHKcl~Xv9!eX47An!rj+px1BfRqs%ehUcPl@Frp>ui4 z8+wg!TxAXj2A!4eaPKApU05I_qX%dHIP>uvL5RELMfFTV2FRM66?$bzRDY3}s+k#1 z6m*JURjM(Pex%p%xN0Q#hLnSw; z5MU4J{C))09Ei9s>icSDJ^qAmkd_&e)Ks27sKlPF_HQDP!sL!iYD^yNI#n>Jr5YG0A{EVExKCtMZJ7eQ`~;^ z*3oK71>^M+%?hbK#uY4VlIwUZ02YdHyxfu+{J?D*WdVh$KH0?35n4$R0q4P_a?sVw zJD{WMd4j?9pT_(wcyjVN#`1ITy>|uZl-FJQ!(cr9jR2Uj94c6d zkUEYt_WJ(35|Dk~ZGsL0v`-qpdB~*CTA6_NjztN#!G!J6n}Ci=>r1a5oc1~enA3ck z^$<~chThBMI}>G-Ah7=U^x|++EC5UK_uej_WggB1Hj4u$*$#+Hx&e4-?w=~YR$7(k zxix+5XKGLHSe11*V1DPDw@2>)=99k5etwE+<>p9f1~~9ykqOCOB|pDUPbB5 z5)c`!eVy~CW-QClZAeL^ns(kVkbWJ35 zyuNvCC)Iq8-V*GV0B-eeq&gXKGkU{mfiLh#rAU@)Ps+NT+BK?1VG@IxvoV8_AK@jI zz;%LtmYAWt;x#xMqp+Y`-pwadTNa?>DFv0Q&|PWST{-*m@N~Z-FsboioNH~3bD%An zhHJ#w^X(ZF`7tO5(Q5QKMqot zN?qORmpC;37S;9|iSm2!bqRJzA!tb{S^+A6!il4@P`y=8rZo>HjcBAM(Q_2h&0_|c zz@nT-uR*nUcxOXPMQ{RIqA7KwNPO_nuGiKVG^LjLp8p7y!q8mZv%7AizdsA`(tMd8 zT2%C9AfZ9({M2=Aei1<9eOXZG;eBhqHnpMAz>jYnm`HsmEO zeXiZ`fGhfOd0JqXs+8LlU`V?FO09KXmiLTacu`9783$YM&!M&K^V7n82EDDX0fZ8J zUrJXds_sn%DDID0XB*Ik?c+LRwp0Y7?Ns#24XWBiO^l>&U`WJ!uP>rK?^b}~m*H5X zC`Hm|v5o2k_+rt)%l_wW)22v$IN|$9;4)X(VgYR=^id)eqHo|~W@uA|Eo(#5*6Pwl zrn#sL=uTgU{H`a{EMN_1&W*BUuZ;A4;FWhxQu19H?CI@j1w>b)odFK1%>2Rn;UZV6 zJC7d};7&PgYFfG-d$Yo?2HgR{(_CJ!KJgDl%#oV=p;vX63gLk&q6-6;ziR#7fQr17 z{i>Z0X>r!KS0kXQGd<3)&z@#CeN1(x2W7#q8n_O{`C@T6dg4;9aH3&gQ^_?o{KC%9 zq2zE?U7+T(n$%u;R3fMekCWmr2EX>dci=rCD0VN9wQ685pX%0uy$bqq$r=EW)A14$ z;5y&;I@z-IXJ(F70MJ@!ahm~V6>*!8r)OVUEv9U!DwTyK z#O14KHe8hF8h!R{xx}ToLkAL>J1d3AuAIb27`2c%Qk~DYEHxM@Jl($y1fU3 zjkNoTwkP?P9mgMax(he7`gtLtM0AcDUo8p0qfXqn6wwcSzUtoZ1l2~4bY0u#9VN-6 zHx0a&CC;eBaZG@8vVZw8r(#WJK+%wjC2~`yqTMv9!_Q3s`7H50xH2>rR4rJX1e&D`7kRQ1pEQG$$bnBCk8)Oc?N9j`*`Ky8adOz0s;g$ClB>xAMzq}On=$B6E! zdwwO_?~8)%UVz^BwI;r5DM!AlzI8q^bC%pmTe)?+nDLW=XqmX3M)_|pK)mLmmY{FF z%?Sv3I*v6;D^@NWB^cN!AAk;TnH4u=^GRw31-1=2;%InD4_2~q)e<;<3utivSumk% zwiRm1Z?|^+k3UjwWv1h5C4pN$@*3>L)++BhJGqvkP} zeD8>Ep$@GJ;nk6%uF_ExBR%imTR?qQv=5Dk`?31$yZw-;QiUqf%#?@uzJhji2V7<_ z>xO38R0-TlaE`ngF_*v1b;NN@RdV6V<*#g6UW_GfhEh*#3vvTGhR=2GSZ10Kipsw< zs&|o0E5i6W4-rA!tNTmq6TDZatcdJSuyO(rJTt%TMCmTu6@W7W>vK`x|-bcw>t z*#xxWqoNu4u1kH_ynw!7)ef~|R-gl7oub4SYn8}glGiu6#^}Jad|>64|GVDYFOXdc zX4WbrK^$;>INFSqXWF?6S}#c^u$qgfz@V2)C5O?0^fMY9|%Ri&N$&xFGo?$7) zWEemPkY73=MjTu#*r5B8QK%*+pG)ElYZ|M<+6@=0JLvmD)&+V|TDyOm%H=i^7%rLf zW!KUv&v9Q|x|NC>Fvri*k2}B(2~NC35&syp5U3PnVUG}1_#i8w4t)?C?1unMN-2z8^9}LqN5URwI`RaU9Il+c6Y%ACY8rGEt>X zg2Wv4N+G2W z91>H|42^=OZ}fZHLS3DgE*wjzYaQw>VV1Rnjx!0rH}ELWuV6| z$ror5ea?+xutqi@ae>synv8npaML==&_O+C)7WAWQmr|f#B$L zflu)AVycKpK62uCs&WziITQ3PUjgZn7UM^807YnUqn0mMX16?8M=xGSSjDt~HrY?d z3ZwN3xx1!J%PuvZ<%M602OF%Tl9v}&`OH?TMH1Vx!j~s=HJ4mL%S9)q%-X{|6$5&z zJgd)eEDj2WM%GVsj>GXC7-9iJ2XjL5_ee%K1JpRQe3^mwSaP{%lWT91%r~YjhYHLH z19{j^CtDfm(XEuMJFo2bs%<5%O;A&UH-5+_`7*>3Vk;3N6sFU9SKny6R$b+U43b>4 z0*C-JfFk%;NFD`%S2+CX18FbK=|XMmU7EDBH!3cQxR3V$c7CZ@RUn+#ZMC}gep*q= zt~AB&LoKszcf(qaZnxz1v2LM_3g=Zf`GCm602D@A6yBZQu)!^N3FFTJD-0|?KO(XU zO2?+tSwPQ*U`e=l#Q;vh-e+5hvax{YD`F!!MVAMcKeGEEi#F>^F2BB`9y9DawVLO&O<^YJ`=E_;oN6!_4148fsGd9grlh1quv^>v zmFhmTy*2rxCZ|uBY6FH=2eR)jTPvvx69GAhqq>g{gvIAp))xRiEKiS*M5(g_wl5q- z4nV(jpblH)-sK=XJWK$VX4n)3lR|$1U$IO5+6L#AkZZ%VflC>#(MeN&+pQGcd;!~6 zQR|LL2DhiZa*aKw+$%xMWVlmi-Jg{f+8Ur-6(NAmC*1*^;S}hX_fnf&CE~^l`{n@Y zs_uZ9TGH>WkmnTR-RE<4GXZuP{BulwgclmR z<9qpmJaLgYc0M^mCT!wRo5)4#5X4x-c*;3JaDs7?Lx4G>NZ3Q*1Oo4jsSq;9v$OzI z@&hNeF&u_?8&M7V;SJN=Ikz%Wt|+2E_Q_nP8TuyFn?88>@Wdb3dB&tmHxIJVG8F9p zU{Pp}I0&DUDThjx>Qt8eKs;eU+J`5bl-LmSGD4~D#H}fvr`$+kw2B#162GKtHO|+Y zGbD?(=L1?4dAy4%Q5)md+5Yn&NvX5=0TR}-mdAZ!TjDC|qI`AkUTLyNeuq`0csi^> zpak8;-1iD#f4|Y*MtgiY9>|omjYyVN@ncNg;|HLzFPlI)jgmY;Q8m`csqw4m8!f>T zKw*UL^!y}n;mdA1^10oa^PNtP4^TX*?K1{``FhZ?W# ze^yV*lsf%Rv;eZ!dg{Q_ZIPwZRthuy0ktX`zYMXsk_^)qRE zTsLj>BQvvrqkMaCLATO|oPn(oz(BgYSXJV`@LKkj;=yki?&n{8emx8lFaIn}{_d|= z0(CP+abv(WKwTxK&y8!xyr&4%e!^f|rEvV9QM^1EsN~)kS#NLqX7s@Tpfil7@&g=N z0|FrFfydT5zh()G0f%35I0~fQdD+ssAn~|Ez>0RZxM&IcmgzaoaUAg}S*-*(jt(`U903rT0eE9kHrv5^I##~ z7;}9htpg_1jLW0Lz`EcBaxrw3^1I^>Fhgd%<`CRX0NWtp$@DO7r}ee}c!%4dQZD4$ zP1Xc9^}cF}mAnKCKxG<0%3rNNUM(rBFav1H#S;umo0te_Sv-U4;xE-I1Jqn!^dJf_ zeDg4>^5-{iBa^1TheYvEW4e|w*j-x6bl|x^2Q$RZ*4ARENVD?%?4(;$fhMW`u;7Jb zJRN#jp|XWg?1l+603d$?F7t|1VjiVJru^l1+SuFPuUyBj2jY7R|50F>1Tj*##HUhF z3k<`Q43yLNE(V3+=?hX zd>_2oBq5ToX|!u-9;8}8h(T(J#XnyBWQy@`8oyXDL88FGvTy-oTsmFOoY${GYVH)Y zT>C>nc)@h3Zp`Y1YH@Xyll4k<=hOA^ni5^LGXE$_{=0yB#DhWYbVD4D2b(4ZSbHhe zjtU>`0u-q$(Z+6ulN-EE!#?ef^CNat(QUDOD{MMh&;_Fowm9n+3h&omXsPCmBAo%f zkE5Vv2%HyX=GS0v=Z%GtZ%DK8hBLgdox|I1(Yw*fOSp^PhvgoWopacMcRjJ8iZ(E$ zFN0^t4cgEKOBvf2;0o;osTJVNVpjryX;@3>`gYBTsViApAGbUiB1U{iF}PNA5rihz zmWr$S)S@2isYmHnCKz7mu-yTgwRZ%=Dqa)XI8RWQ#Lpn3V)dB33JM#bJea3s_D6Y8 z4jZtzm5c>lG46yIQ2hDXMK*)Mdw@POKw8w!Uxw0hvP0aXHfkr-K*zAw;}}@o5uko0 zd2?bSeUsxfNgcI@@HXR}FNz%?Jr-qR=^ar6?^h|AFm3ed3?`Cak0)hIK^qq49$%YUzXz-@Q{LbWUkEEz3Gk7P}xhq;`auw z#edX=@CR`JuObDsav@unRbkvD4lxDQs9z9Q@aan1zJ4VotH1Lho)0eSB{>f5pZ(@1 z1Bvggoq9LCoLhcgkWPLcx?bL6;xrG=$k_24XBrg6fY--u?8F!z&mAmo1-Dec67#PX zmPdedQC^7z23&wD;Bq;|Aw`3?sINxjWY!AT_0$(+mMf2iSBDU?j%e`&5^bw^#!T|m zRnBw^c!^H0b+DmE09OwW!;B)~g}?k;SO_(xmkx-B2CJGOe80JTmK+YfC%LjdqqsbIZU6<)l)QgV%^V>lz3C0O^gRJcKv+8=n0K zJ4Y^~4mNS*&_x+kKVr88;R64U@Y$iX!WsMdC}`dluzlyFk?#7u+4C2p)KXll&)`)j zvRkb1Xk+zB^jFw(VGmp3Syuk0z~sZfjIR-)LBZcY#GdFrJ15k5O+;fmdH<=9ufl@0 zbaK>mdWn>+XCDvwX3(yHuaqTg3TI@W*P@P5vj9zaQzQH zK>iLb@Ge7*>n|&`DXc$@(Eh1%>%;8GhV3L|u^hl@)KXdMd-_!r#qklF+5- z#gib2;!QyA2zZ;x6oe>8RYKk%MvKRU1cKDuS%_GaOxV*3CqtN!-*S+gRUADfwZ0xK zx`P=vPt(I!WST$ict-=*E{-MsHTz!p{x^vI(n%k`kxwOo!@ClWB zu+Xa zckPFJh4ntM`t+sxcSuwJy7Q^1$dqT*zMRXO27!-c(G*HgyGOa6-X(61C)%q*dlcuC zu09L>TN1fh_Tl*roeLA$^qhkQCQv?<{Jb7UBUxH3uKK}WEHytgj2<^5w!Lplbg3QLph1_?|9B(+ ztAKG^b!1#S*xzG*wDUSz;~9ilSHn&VxSv7}!}(Budt%Sp=Fi`QL$d;jw|5Lx<|LNK z1?ui@9!c4$iW*1KwGcvMm<_Y&p9$wy`#a0|h@~i$*Mh}{jqK}z$uW!FF<_cSWrY0B#Jqc}M^7s0k zTBKA!>X2)cfRFx{)8@G}TM!5x45W^rCi4vw@%F3Ww73FBQo|6@04kgVwTogphSwZ~L)489X@kVwu=QFpGDb>3ulT3e)OZ zNB%rGgc}a&cQKB{uUHN;Jg%6uQ4sC)O^IW>2IAdtN#|of!!3S~tWI@^F1P3A{3N@~ zag0IGFo7nj{C65_)mz%moYtI%@*3~U#jmL@1YSu++W+`2PV!4_!Pfg0sVUV$P1KFh z6xe@3jjy+CCi^pUzcf;xDW*sJ8#VV@q<%Yx)U0ErB%vg)vt`-peCq=4bxQe-4PO?q z`!TU^vdoas>%_xfF)x(QS6B%26`_;UG%t1We-$Y0fBz}Lwa^{#8VUCSTlE?f@G>|biH+k6>?mNIjTiy(p4ApMo_^?H69(O6^7 z8<#ZJ8NkMi5CSiQ2@X=eN=hB_5(b_={~?X-sgu$6Hh`J@3`WjTGJC5XUkQ_J$v0&| zF?Kk+C$Y&0GaY>H`+SJjXIZEayf-Sfb7{R*h+VbsVdvHA&NJYyoPDoWFW11&LUN5G z75fVZY=9i@p_NhZ+Y;mm4%k@uaY9@>%ApT*!ooHY~aB=4eF2N zrU>1-|1RW5trOU_H;~Em3-~Dq`||}jp2n{qooMp?5xt06(e%5V9e?kXk;hnU+M8}o z!y&(eYD1^*Vvc=QnMz%jr&gBRgWs1!C);npL7%$L^?8)nYcVUPbE{(z+WVrP9I*UvLXQs#tfS|ZU|i1V?=?_} zJ1pQ3qP!y)DSbmWdHXSgF`1#Xtwt?UKlO21E-qbQ(pO+V2`5yNNAwuVo0dn1h--M7 z-`saqnck|}Yoo-jBflEXqKNb4%@oW)A_tn;Q30d8jMFychNhw`d1-$Nqp0*o0`DIE z(nVe-i5wIAYlJms@sRm+C1vw3Pp3|joCPOS{V5v|Ks+kMUoX zJ5-9AZX4Kg0*%N$F!M9nWuR^Nuu_4XA(OD#qqVahzrRM^-eHyX{F<`A%FXw40a~Zx zp_nJw(b`jJF5vOjeDa3l++3oBy&#ecs6Q8}-`<7>@d;_tXw59I)%&| zrTE?{cRDRf;uSmWM1`!eS{0>H4OuVM^yz8*d(9$rdS8BFjZNRP@R@Ek;B{03VE;Eh3RXAdJ< zvi_FY*xL1(Ui{1Xch-}T<8m^ru~sLUbzWe1x!xBkQV_3ksYukt_lDfoYwgo^sMp_4 zcFHYO%;bfKC}BKzGhXXyz^<5NJ4uhPoUJN~{jNJu=5Q~cP+-w!Z@sW1W{L|xMTcL?E3c{>!IGU={jGlws?Ve%uE8KRWCGU%Tsrn3~S=r5BfzQ>ibqwBB zzVG_RIMKeQ+tHEU)A?@R!agnuiMmJ?#|Yv=p=E zT@=$LG>ZQu#N6Pul8TuqNLa~Zif})wnbsQJsKevit#-}|ma9hMW%|t{Wpivkc{AZ3 zqcUZkA1j*Yy|*uFeZBt1O!J1@E`%%yQOYFab>AF~uwK%3ij^!i@Dh~GYwAps^2dHA zK5Ms%97@GBos(BKU!{5!N-*X{GfU*r;X6Cy?u28~H5I$MyYwwOX1a2tdtphAT#KY8 z19_Rr6Rc@OW^VmI0aY}dCyl=FqlY6=yhfPuOO(oL@1WPKWu5oL0klkhmD`z(hN^}T zbJxwXSPeg<9#l>1GNd9a(CX3dB1g=!XhU#vt|OX1yMFw*tNL<|vm+yC>sKI^-Ocgb zl@7|Q-+h0`a?YJA_SsnnVbbKW-$J#!??3pSsT1V<&gebkK)$E^l2gE^u5V@|#x zX(qQV;i10@$ru;<3A| zoY%o&c?hd>fSmefh5J0*QcPzZH^Y9c_q`alKHN|G*M=>IDPDt2axsMUVlmUs(6rqbBPSiDIiJS!g} z@Kqi0<3HMB94M z?bRD|G8Fesz(_SdgZkE|Zw{HTo1-k#dce$v5X`XVt0^)h%3sDBZ)2Vj<(xWPK@45* z`O|Gyv%7DM?o4+x0A}t2f{eX4?!6La?vNv$=%33kSNhyq=6jCm7G~Pi$m2Bb=I6KhdX@g+0+?Sj+Os$)ig%c`rN(bPnQ}_?^2j%;>=M%NL((iVrGL^I z)V3*gn(!%4yC8W7ve$Z;agH?7kHETLX;viiz3I@rnNuZ4ji2I4F2O#J(a;&(umbtJ zM#%xJ2lQ8dM-v3ni5JFhZT2=Le;*RNv;-?tD)(zr{Om&QLCxC68P}e(6Mt15$8s>a z*lW`#>6_WAe*Dh(Sn-_?t#QK|b0B+~W_{ZGjvU2Ut?^c_%EC65-4NyPW>Bn0wrJ*LVq7abH z@|RCSVWPJoV~K^vg4T_K5apq-AYfh3eX}L4aC4RM?BDGbu|8~R!dpyu==?8mNoaXS{*(~ z4xK~Ete;+6@( zw}ZKI`n>51V9dm4p@0p%EWY2_NE^zl0!&yxJ(C55X7mAx|1xb>fiS^@UsqR-4X?_-r9$6LKAFw%ro-wWk8f`mAL7*V#p6y`^(}-7(HAV$t9Ou-rs=n7QM-HwWsXW; zdFgG@x}}la1?&R?`{?$Qq?C564tw3+Nfl)4xD3WYRt+Xi{*Sy9Et==WV z&%-lh(}Wd<LF; z5kU`kr@0NG(?GuHm%TNdf3VjJRTw3d(vx?_2uUWV^E^x_z-uEorGle&7$ zym`Pk!J7JbAtd9d7e=`*${3QS1C$v(KKDgwoQmIu_n_W8ocDGl^9Dz|dc)A*y7di< zPGcqWVfA`{COqpF2U_-FnjSkWxO`6;l-qd@2dFaO%b!{w8wJS|H#J^pj}E>qIv|Qr zx1tdi?kkPt7O@N(e2Xko@*EAGb5q&$D%mFFDXYgQi3y1vPzJE6Mx-u01F!vw@Wn|A zLkU;h4xS{5x;rZn88Me%DVo1(x5`$mP}}=a^NugJt9Fbpxn#RvL4-W!dGocO-Cw$N z+8#Txp=`jh%bWy%fHc6QN8W-L8q`IE;3(Ce?wq~pjgUFQ`SdV(`X5yD%0`ZR%$HAy z6lh2eKML2S_9^ZJ5(1a`l%!?ry7!f;X;cgI;;|PkTWC1gPw!aP#FJgI_-(F8dpgyRn8u>Qcn06 zSJAQlY_8ulco)4WTgwz^WKPST)i|Sx79PJ#JDUD}=yzccFSCF5n1hD2&Iu^9xGpQL*}6cCA@e6ED49 zo7DQg`T}A6&y8cb?9_4c{Arq;qb5N^mdO{5CYR5ha#|bK#@t&V>ZWKWaHlV24GpmG zG|sq~X$ocA8a#iihnEsXM?Ryl@6qY=ZCjLQQq820JzB*I-HXDMvh#p~{K+(5il+&C zW~`EdP8ZY$!Wg0EhP!3fk$I!EWUkGo7L>#dZs+Kl&N1icMI!mt?pCW`%T>AWlb3d8 zi^c$M{pxxB=-A#`aIjSh(%Ql);`G5SEQWz8Asfqa0o?QhCaiCjSS^AfcfD9`z1Jc= zFIYKyPNM%oAR_YV+zbLT{VyUw+$S=l7Ru?|D}7(1I4ov+3iWzZ-TEC=vM4p|Z}8`` zKV>B;3{e*1>^Sxu2&9)9FYkzX(&O{IFsEtp$;k@23^8)5nYEtjf|WGHgqQYDF)gQv z34|%3oT5?Jp(@O)ngs9=x!*V0be8D<->=+ zD(#Y+U&#LCwH$?H^cj-$37iBYPSW!AlI(+KGVwP!)%dyI2&eJpD8Q{RaE#A7E~W;a zyw8qa8#J7A;oq^?Zuj`zH!5u6XE*xO;uQePPp%i;jxNVFew$ml8>wtRWM2Hv5GI|F zC4v@Hcf)Qlc-+_bAur;vt8c{RL_cBP!2K|d+#Yy*PKTZ+c|ZAUXGVXY;Q2Yfynf5b zScWGMFI~Meg%GroVADCiPD?B77OcDqrQ|mi75ZpxoiJVkkJ9Kd8om5yg(bHEsNpUe z@*w@+$_Dq?j+r+m#lD0^&%|LkyT;||IaVA2Ri1NtLV(nIz1*D%On5O{X!?xASO=F^ zM~uc#wNKx0tLr|>*^TF^!*I8XM_cw1o$YG%6dJEJVS2Uw9(?L)BqvaBqn9Zdw}5OT;*YZMBgCm;esZeC;0cF$^&li99&$I zaW+4$0zp5&Knl;xxYll?yhrsql<-C^zVZE7Q?79Np9*c8&stxJEuVnCE}OVnIUw+| zQ_zjVZ$8Bi-BVpVHz0dI68QwzESOvp$bTLk24y@ao?;bqVG;C-#Z9!}I=}KBMBj_0 ztP-~m1@u7GGI5Sw|8n(>$RjIe-#@5~USg{iaNApHT_(n}{jREgplp6rF^2Ot(!E@d zB{_t={41ss_d}g*K>YwB)kpy@wK)DL5R$7GH~v>S`H6N0p+xc+ybXXn$Efl)XzvQ} z>Ewmm9<9i|eCv6KF<0)t>&YW;%B`6d%`Xyh?|0RofADEllEn~exYHiG#aT@JOeYS? zK`eETO}TVwU_GQ5I`BE)&?Ev5?c#$Jlwv!xo<{_dQl0*u1RZgu4kXx+ezE|O^VEsB z@IVl|J=qu@@(V?o73>N57MDkuD#aXwJca zr+G8nl10sfhIt~kwF`s$7lt3d$U|8YNsnacvhETmnP^WSc*MWK?zwK@)P4|)d2)0BS*xf$Zl>PWMt{4`X=wAe16M$jRI zRq-moR38|65Yxo4AOt-JsM8XzCoTQKQa>WBTmC<{__v;sD$+wQvPuct^N$}U46hF^ofGA=roEALLZj9Z=^+Ug4I| z*Cq@U-+#bXE2Ifl?R5e-(qO#|^Z@?ag!kv*YfSL9Zy`sD{N?Y$Pf@R4b3pz5EBvT* zZ1-SpfMWH$wh#B>B_Wp2JF@H{v^U9*3*Pfi)g(t>OH+2bjXzKDKmLT6O5~9vdyi7= zR?&UHAxCY&a737x&ZR~f$`eNJq!^Nr#Yiu*?0X{e@R@t}T64F${k*mjIkwu$cQb?U zZlsKAdcK?A8)#i{o$=0nCoXfC1Vz@&$BrwOBBN%%8R?%|$f}c0i&K|x>tU>ZLQbvw z+CSAH>dr}Sd4K2~MxpSrn&^;2he-^`$rdT+rG0 z*S8zKj&sLmy7TjWA{6Ly^oqDxpw-V5G_UU8^^K-wZ!-#jH(@=t&aV~+1jds{rUqQT zU*E&zn#fUPKX}=3IkDZpP-M4wo?dBl2X(XCWoB1s*ya7@c}Who^AFH{ESN#ppSHu$ z6iWtepjRIoo`L%+-l-3zH$B+fpaPg;B29-MXNY-DNA^Pqt~b;}3D@I*p9n-A6g+K# zdq4>(VBHSKU=m(1P-Dc0j?hylz$c0?kWqhCl5a~;%lvT-o_if0_Gh;i-#K}9zrzaV z`?AFkPah{k8}!^#JJx0S`RMyRUW>h5FK;XUw#6nD%raH=ma}EuKAVP{qyqd z@Qt}6Fgw&ZRhZqFDi3mM_KUUtsYK`sO!ZF{{*=M<)K_nQq{owsD_uh_K#l2RM5d-K1~$S4 zj}=;Wcp@AX^;Z~if_CL8wbTx{fJW)i2#mcg3qGXj8%@V9e<#(S4{b|HLJrSJXA}C2 zjGB=LrcoF!C7*f$CP-^}oKxQa<1Rd0WuW{+xCkmS?K}xg(mL{}Wal~Aaq92Rgr0>l zo`rAHke!DMs25yNJ@@wrkiq{2Uwhs6it(Qbc?);bnhUQWqn>1VFjFk6;1Acj4zrZ_ zOhO2*I?nJwDSbeJT>%F0@VX}LVUi<9QFw7=xydkaLmSn>DtKCW=p(52FxmGy1?y=i zi{Ys{=1Sd>55YdPi5dD0A7bSB6$t99f5Ttj$sAF_t9 zJa@EW6#YNS!wvB;5dlF*yYi`qUj<+8ap?}Cc)q{-kT8{)7zJ0RfRQlJE>ED)@aW?H zcB&*O0z7?0{WvTLC~y?4nzKhCbcjomunHhF*E zrfg@P+IN@%&6D-~LM1K6cO`L%vejqaX@cFvbL!17v=?qa+>8!#3FMljS_I=z`e3%O zAqcq4F1SS=oMC~{N%p7JFvB~i_2rpiC)m!u6QjXp!g?qBeBgycL$B*N7OV8N?03b? z_^I;YI0I=H3Kxclgssb;8GB@RdRy)IakE3-KzWZ(6&}bx5lfTs4$R}belCuSFW?6Z zw+an=Ta|obAmMtV_~Y!n3SRH!=oCtmtwx>Cc!@zqq}%xc{P);WW|V0dv<**Y>*SyO zX;XBa7{ZrdB_cB+)k>bS{Uh@;pYc-Ycw#yU2}+;4VAXFovS3!g{&{5{r`l&i?KWSj zM)!}UwI!*96ICFl`f0JGv|7M>gf4{)syfE*TTLc%nV}-T!gM6!bR^eJ#Cn)-6AoB+ znre5O%#xNj2ZdVzxmYAd`eM8%E)89<`{27#Ib^iU*R}YCTh3wqe*GXH8hTKZMqDQ) zjkl&{OG+oV?$5|(Y?Mqtz8^WU*2Q+}J?7uCt^yeNAqD#P>rI}4=0j!gO4E|rFQ)vw@X|L%uDuqfkaC~&+YI*8HFWr^ zK0ipX>>?@R0zS6G@ow7RZJp>U7;vrE4o~#maAVHRpZZowjaf&>>(CH>z8K{Ta%lA$ zTp2$>-jq$Xld{6tDq#Q3P8yfAaC>^|Az{A{P_N~Yk~xL^GI0g-j+DPv+%(|<>+=kp zmSMeq8@!e$LES_3p)mwLxe=2#fN)0^M;L0|Klw(|VhDGTqQ8(`;k;k{;-c(=N2^Vb zZUjRNfvl=lB+SYNgpW|E|}J8p@+WV5>%TsQvw z;0Q-ur}k~f?uP{0Jc*>RgX(rK7qf-Vkd>qOw}wQ?taXu7XEs6!``(qeAvztisrQpR~T$uW+8Kx@6iTiXJtY z9^79q4d%-$JNM=3B1oU|+tvI23LyP#a<#tqKRYkLks?SaV z*Qrc5hpN)<^SyHhb@pEg?@n*H~_D~+(OcArB)eQ&xC#)aA zd6Dz5!e~tD^(+1#zmV9TK#$Hf3eWBoVRwo~gj|;BuQY7(bu8VUMjnxBNl3B!(`Z4e z@Zk7qKY>-i>VD0dc&qMinv41^bNkVbn4BJ6VUHIuxZQllzJ7kM@cHuQW_;PuCVq&= z?s=GL7Qj?O6rvF|Dql+I@xA zLjH-!2{JU_W&zW~kLTdDg?)7739temn#pO)N`m5|hqczN=tqLlciDNzP4<`L>s-2x z81g^|px5Np{=m@Qz+%ltwGcQX*81VPhXf&?DYaq5mIOQ2u7Aisu>eSRn5EE33iPNz z4`>glyMI$NrXAdBantC#JVD3))c@l%wgdMjsv1CGlkST{0Bm2b?K$K_mxalt?PJAc zyvap_>kj8)$FY3>risdcxFw0V^c#eJ@~N=!*y~m8OI|}e#v!c_!b_d%VZygR-2L|K z6`07@2eW5P+9W?IJM#vFAB{8icFp-1jVf2SI}A{8_5 zp~oX>$Q5s6ohtfE`}dKh+d9q<8-qfvRoc3RM0}xiC@!1P@}+S6!tt40!#3Ugd?FGd zN5IBn5u2dS(vxq~6)hMhr_NGO%~mjHT9*aW#-DfJu-wstr>?=RYV?fL%VhVpP926) z>Dqahd_Lc1PPt%*9_yM^2N0>Qcgo(MjNIqhg%vS!|3qPYQ%~pwgiNcbIPZ;0FkNc< z3kS)fQyD}1b0Z$%rW*s9IyW;!$s^D%Tqzdmh zPJjk0nsw`|O3(xtpFfrogi_2MyjENN_E)H{5Eupb>#)05Bmpt1qcGY0oVGMpM8|fp z*}$M91@+kbu2;U8#7C6s`pr9~P;e(Z|Fv{ydy}tgiJr~u;Ksq~jbR|a3X*);h(E8qE;&Z zsF-eUYN3L+780zpLX4RE-@{_WvSy#et`|n0nDeBh9L;Tl@X5%*kcrC|RA*kwE`Ye_ z2?k?#Q}6zl1umZk|lmc9b( z&3x1Gttf2)vve4&jI(t6ejwr8izpV|a|{@-yaBqFW_L!$*!cLPuj*{m#<# zH+PHQbT1cCm!2I82uH<1)(Y0d-p@;;GtqZpqokjAkD~S|F|?gWyDdSP?G_Sd8^c`g z$^S=+k$fDTXtzz@l?%Ztc!G4k3PyTy$3ZrJlENXXD!H-^0 zNDMj@@C5cR9o&7pIChlDz%Ewq z_fzp4%yTj4vp7VaYGQX$SLDP^vcn{~^gYE^T4nGO2NXVcuHdl?5=E8A8C(pofjQ|d z(HKT54h0~I{rNq1f3)B?_Q0tnD^Wv6*k*U(p!#z!r8bhp9|c?c11TglbY`K@PyrEF zwl{;hxxkJyJfBbprXu-cdxr)^lg1_6`3l!TkEYyq2pVU)k{TbP@Nb zLjT4D+&OuOn1>u$U9(4~W2c+ri$@4QnTfyz(P#<$s=_hsjU zYGmgGz;diX+&$wU#v4F@gM=q0CL9V-f&ns+k3WFC;cUUGQwrb921dJDpB7JXn0V9C zx0xko$!~=&wA>veD7Ap!S8dh zGjXzXV-Sh$j29oi%MfWHfdLpi`o9g}*{P6HYy+EPuk-HGN>}M`Qf!Z7_Uc%CtJJ*? z3KQK&;ijGM&Ubfrr9lKcm*WDN6OwvQolHoPuZLlUDx81;+QLtLxD)FBA5R^PV{^Hs z3l{HDuu!dx4H%}0=Bib{g9U+7RqW!&B<#=4p?!lM=k{w_IbFBjKw-rgsT#<_6+8{` zs;RqVx$!VRZfY@q*2h_zk$37mj-|E(ksYf;>^|tJ$1En0`xR$377|RNM8Q4%1-tW2 zMj_dG*s$uUqD&j*Mf!yjy=97t8J1AZxFGgu`B#o`iod*CLU0*~d)rtvP@U4*4r zDxJ4c4Q22k6}jao(>5<=2|G%O0cS0Tc@P=;40#)!vd;p%Tk|AvkDVOmm&cmw2A8B9 zju4og`=QD4GZ3i%N~$!g4+VnCyNi?6AV4!Q3~yx+i1-Or_|K3y(ZeIBJcb}Y*L{H| z(p|9!aVnnnJq}c|t2fJh##Jx~AsPgsBH`a>(o3 z>scJI3y>}h2avLoL0YV{gcRi%TtU1#U}3=TVDFFTiueia|2lxKXkp}#22vmymBT#r za8twKn0NrGMGzDN=@;hU#T7`25WQ(E!^O&MvXtOHo4RofFEL$SSfXq0UEgPhcgS_{ zS)%VocgswB5k)HqI;-J%frDYyA+k^Md%}96%Sg?JM)~Fg${5~x+Xqj`aPx1imxe8k zTG#pQ<)1ZlH!YiZ-}E`c-pj!Ki&%H_zTOtwyx%ZI-LpvV^EO2gp;>bHDv$8_o*bDt z>nlED`Ff)o-fd#Z1HYUQ@*Ri2?2k-5X!BYUWyRJl(PKxKidbt!M=WJ)M%Zz}{^Tb} zBYlx7kW8H2Ath%Tahoa7i5ws5U>R!WgK`H$Tn+>i6-Zlg`v&fIB?!qfLCrd zr3`pl_c+fMLi%(&C&A_~OC8>}F+OzD&x}#qsg(iV>YHuuBTu-4x~s;;Ak-Lhw|B2& z{tO3^b)YSdPlh4aE3v=di{d{;i|dSsP~4e z6fWF|c{Q8>U8f%Fx2GRN;>;E}C0ldQFXTN;VG8`cqF478u<<%7aajJ*t|^S1);so# zPauA#m7Spd&mtjWjYj)xEWM!S82|4SUWM1Q!(a$4zF%(=?wk`yU|^i6ES*s>uXU{w zlO8PbhLU=VaV%rx1-}@JHb@j}rO(vWG22%aN*cFG?i;&u1&G6g{%ljSW^Y5P=x6@3 zivBU@V}*-peE@0D#TAO7^shEmzaAD$jR~=h-E0VlU7bWBG0TJxOxW>bC(z@~?UXZV z*r}mfdpIBt;v<8un@wli%#d*-wy+2Ik^22&Y8-900q&gURcQ{I`Ew-{R3;u4Jx~q{ zlm7lGog#c?;3q8Ls1uD4lnba+ipm_v8c8Y+^qy3gN;F_2YyUc9QVn^YF|n-8=`@4W zjPpTZ`T~gxE&J0@s1n9%WChA2J1CU>#1((}ITBk+w6%)p;lm_&@-LPm1WVB%JTrq) z-FPNeR>pg4EKIJIe2v^$3fljT!)p&2)p+`mOV@OJsqYqYPhe^!Ii-mCrFS`!Re8chs zC}CSsd@*?*Q7bMxZ{4xfV869ymEU-jur)vD*rw}ogz_pxfJl5lC!cBoV~-R2;Ye1j zn~GN$m24%qb_f%|%Uh%34E=m`eZQVH&$V2MQVF`Q!gfZy!LQuMlfUk<2701Wr>*Si zJ1jsxAKl>^OZ`bo?0Vol-{)#F9wzZYod3f^0fwl!Gk)H>p8H$rv6VA;kV6H=z-t7^%p3Z8=9QeQqB-`&vx+GO{YhOK#e4As$EJ#`&c+7MZJ7f`zzxGiy*1VSDx~#GEeqrzbeGL)CZML|HkU9Ph$jMG?SyIp)T8HZ*zVD^{&jG%IwV{)*0Gf>!fr)gH#o-Ihn#SGLCn%TVNgq)=WUlVOW1UDc?ADAhpw?q)Z)N88en;s0 zMLd|vEj_KY00Ixg;i4^Mk)A)&xeUHE_d4uC)GJZ7mTP|k#1*wT%{82!-g-!g^xGXZ z1zLNe#NsK8hLeuEy`aMAYR-2>xTz-GG+k9H0#XqaUh9iE{b3S1#6TOC+8MGg_ZS6_>}I@Qc3BA{AermQ)?BE}b_GS}OZ#Ut3M)JepmK&BGZs=iOM*RWN_yqY1kQ zbsGGbVNSv*xw-;8-O;;R@W4+Ho8n+Ml#S|O|8qD_R-_efs1iW;mpBXzs59FXo#`mN zFh5`ZvGDp0<0m?T8CBEsh@!~n68AAv?^vBn>!kRxsxj?|G0DKZ_8F>m&wRnz>h}dK z>DZg$rTz;*O&oq=V7K)^h8fc$G0_2l z*g0MP+_a9NgS{b!0Mn#ww=;E=LS?@m=Dw_BoCq7Xq7*uc=kW7>Ci?&kkPe3Hr^aK* z=1swJ1Si^0O+iVbV-DX)M%|+i7AT!HQ>fr(TUp!jMs|_?>D7X6o>GksQhfDceJNKa zR#xE9*2ntQ!CdkDn$2~4mFiH#rt)OMwsNjym=wFI@CT%mTYGzh{_r4Z;YfKMy}KY& z_mZQR&FE!Fmf`Ifx%{;;QxTrW{1 z5kOoF(k2;<6jV9S+@BCReH`tTkDK-5GC##6hGSU=%p`7lpAWqg8To1$@YC8ynQ(K1 zfpO-#s7Rk#^Ll~Sl>up^!E-G6n_;bD;h*jt2pLgPpm*%EBR(KqcJ)qYo3f8JSz_Z_ zBUzj~@4{Pw5;wa+eA>)t4<3B5(Ws>y0-&gTTvF?zUaMyuz|m|Iz1n!h^Vn=<6v&XE z-h(H&*DJ16Y6M$<{iFd~!1_N?$J`W-l~0cc$5I@+>^ik|TXLuqzgK!9zEq~cVLOnp zX?&1dYmv~s<4d_SLiOc~Nm0as@t~v3P~@l8{Va9+J-{Q}4Ht5otFdJwlh4B(1YqVa z7A55mz1nqnZVKUX3sbk`bZ$o-Wv~&k#~_6*@Y|?UzsZ>7Q1wHCj92b`5>y{pej7Kx zTtO{Z@eI6{c)&?m@=HBXSg*R-*5jpQ&cuFlhjSX_+Jtw1b7QaFu~5xY`U*`^!Jci?>oO|8mj&7S|);1D}CqZL= zk>7codToQY4i7FzAA?^);jLB`=mFfAMED3)|Ba7;cug2O4Wfm1=7#PaKofpEGjE%8 zoznc!=a2+rkoyxQsMqH6f>ZYbk2Js5A1Vrt@?P6{PN<~)vsNW_&PTaUpfe3}d;fyJ zX0$yX7DKX>wbUh$ZKlfi9^<3vp%5%%XK`**pb+2wKd2U`YjM~i>!c+H{*Q;DhG-1C zVf(bf9VjIeSSmB_kqp2-aV=W7p0D55<4n4oXae566@_>5T7{Owpwj9&+hMwt%`ZvV zDp2kX%U*z>VZoN3b`r=7h1O?E2l*jJ(JQ_d1=n5;C2TTOn(DaYyjS4z<6ch6hOW(Y2P2*gDb0WN6TV##E8iVR*k^wLY!V7Yw=3k;Z%|1- zBezYA3|au5g24dS0N8HSTUaLZH@BWKE8=vG$>YBCfwAV z>292kZk&Rd$G-Q0VZ;v5FoeB#N7J^QGr~$*~x%(2x05p$;IXlAQeRAoLrQ^xW2` z8yNZJ06FJ-*nkjb)*Eo+6e3>vj#U7h-aDeEBdoDr?jRn3L_QZ>m98g4*y-v^aftmX z9u8sR?F%t5iPs>IohY$Eam!(Ae~9-v{fk0ukd6kn%3(?-p(PQi|^c66&b1 z-Yw;O<}o_z>qB;XAW~mMCgEkW*KoetlwQUEV-;9{#Q#pVf;h_?cz~Y)i*QMTo1rpz zF2Yuf&%?1ehdIzIm@h=8#Ok2qba)8s8^*#?z_i#i$f%0-)D6+iGtaMH=Y4si*Gqfs zRB7s4KoG7%jh5!MDcLP3J>>k=p$pOK1*pgrY6zJ_Eaoro0(*HYg(x{qkFQoR_j^!& zvyCxjOOoem_^2VsL)Aw%gwtZ;bRKPjz??lhe04W4uu@LaNuOv$fk0cv6~&ABsDS7=q40zDC1F zBOl`g#kn2(?$aW!i&yNw<$`4@Dfw_Zt_Ws)V*YKid?{idBUX|M>|6%!L&kHn`Xg9n zfNipM#KH3YS1J_-x%i*tiVTAsO|rpagthh@4!y;R4=gY$2t#IVW&~s`z-%@SXfhur zsYbRx8~EY^?=43> zc_{|$QO8Yj(*J-p&~*RG3end7z)xjwqYZGV@j8kZu&S|ufAPW-WcOJK+X9YJ@+P`V z0ji=8VMp{FN3i4*z)ir!d`B_}Bz<3FP6Rm~_#uqTiR3WJ2_%^BFLN;0EwRzNl9mCC zMR|#TW!MrMq1u4Nm%!Z5?Puks!$l*+2j7$5ck8@RLtLe(es(>0@TQva>cl z1+Sv_KHz}KNvB(ArqlzTtnMWcQzy^;eaC-~;ZVT+KTGMfV=VSU8R0;>A-9EG_D{0j zra<}_suQkm=DJc)eIk>A^mQ0<7(gB~Ufl&OBU&mz9(m4f{CD^=Vu$au;4i~d<{?LN z-v1A`4A64QrN(nYkeR7#u^V6WL9!B#2uU+y$8j{n^>Gx*8hm<2Lj1^Kl1{Q>F&w`O zB$>4ZAk9_);u#~koN9585M%MnD^c9``2U1eEcM>~16A00%l-bJkqTh&FZL@m)F04z zfH^%iL8$!-2>81)rTl~cPo%=#z{Fd2geH>5E_ccYV2Y&!PO!^A!<5Z;@6E?&@m_?MOxWTGGKRDH+%K3_HcY6pXDd4A>j~htX z{s10|p#kY;HjOuOB~Pz$14QOAtW>6?TksiIvP%n9PGtxxUEwkly5S0NNI{3jr4!yl ztaOq1e0Oyj*EX*}0`pqGu0f7)jhSsBp{%Q{W;4_pZ_T<^J;`J=%IB%vt*}sU{N?2r zomr*XYyC$G7nbNZj~fL;0w&bU=v-X}8%#c9KL1+21qe(Dm(gegAxaPJeWb>w4ek zeeU~tp8NFs-S4~ZrqVl~)`R%Nr!^5kM)-Fo>=mvpM@6Zn+NKKk{^D#;m0st$0p%?)y{)&z?cr{-37+ zi&(?$u4&`%eH!~Txo2=^UAVrNu4j)~nEus#&wAy9+&MolySC$4mL`F+z$cqwvqG#9G)kyZayjiYm--T!F?LzG(x}i z&2D!v99fdMpE1%>EdS@8Q&apU2iT0OI;@AjaDDtmfbXgrqSH&HMAJ|e9 z7AbjT7=m48giYx${(ohv0~J`>^neg<3o(lx@p(UsjU&L~c%A^f-f<+9&L#ri?t2UF zhPm7IEp|eL1{hhO$kzn2rl=6%D(6$)vuqjjP!WKGT~^Fc%y zjOVK?@c@=j9Y@#&jg#^@#6`a=2JWxCQT&yiRzPoJ7GP1zMzHan$PLJJib z+g$w`O}ZCoH1!wY*~AzZU{p1RP!y0QWYIztV=B5wK6clJ8+rd#ueFMwv-3*FO*Ti$ z(nszR0CKm~^T#E$K+3lLWl9Xn6jazy2`gDxDKUmShFV`y`DPbCe(C+9>~P{v<+8ygp*mChNhBCUhA> zP;`rHGIJP#=QR?54DtsWQl!W`kAk}TBYbX2^4GC+Qg)c@hn4OtDUDj3&2MmWSkOLH z{`HESN9m8Q^~l($%QO75i?m6uAxXF$1;4(>+d3k4gDp2R?d>_8dnMCW`Doj@Xpfb2 zpcN?IF06crf$oM~`k~z%ecd=CR_)Qakr|%k z^(sHqLKgnB=4Yz2dy}fBPx1$2mC<>1xcO@Q+q=KL+V7oN>QB)x_e5!dE1LwFA6J|V^eB3wbcU}i2B+^s`nqQRlCmb)L$Ts!t zl~%e3t9IY^9-ut{qqUoL2p-4BqpZL_vA`|S)lF8K#$UAY-Hn=-i<9Gz9$3q2x#15_BrFx_Dr-WV*dsOEO|Ax~&7-)1uN1BX za-hoF_wo$K#la?zqZZFFg2dab8!OJg|8r&}Ser`G4SvS-i0kzrT4(<^fg zI;y-rSRg!g4eV>ZeY>?kqVs$r(-Va^-N2xYwspLbIIi16OC=BIq1|yb)x{s`=I7}% z-hZXn^Jt_}uUA3KHz0GJw)R*L4#GLiX0Ov6G+{)R`%(bd4j!m3n%*_cVHs>F1xdxc zw4z6)cK3IMs0SB(&^Z0ZHHE+6u76YZlb10SZ3~_I;<#;|$Byx$j{6rg-HTg5)E{o+r;=O~^8%TGUI?Fq)^Z1#bH*fTth}-RW4nhSS zi~$&1xyJ|WY)EVapCKq?6*$9ZJm9)3G8CoG%`!wPxKcMzz6J4@bl-xb81RV#3B-7W zJOF-yn^_c_6Y4DwtDOXM$zjet4BR4$YdtyDA+kJ|>iCTiOp+Tpd;;7;WUvnE8#@b7 zS!q_%_RUP?QPE`rB)~RPqeesTGC)zsRp3_YEnqYtL{F?l9o&^?oHb<=IGqx<*6PeS z^071LGzDGX6h|k}S?LCN*pKdKa%NVf*Th9)AH zu=KIX{@ZZbX!{4X7_<4yy(+7q4+9fiK{EF{XylBGJE%(N$|4Y|5v=*)QKqE{%9C8y@+M}zmFaLApKz)q5FErcj2sf;bWXucE)ar#@eV;=6BA5FJPggolBu;SmUwm*XuBb@UVe*by7rRFGM)?#95bj z;EwvN8P;BY_;LA%;#F(p(?>Io?LQ$IukfHVEGTjn03BmB!%nh4_KLO$kS z#o9S*62*fQn>b*#mE!sV#d!&03>5&IS&(-UWjlt;FRN?>g^Pvf%{Pj-WNShs%LJwd zogIo_f?L``nVFcxl%-(dO8kfn`tGkDF#^Ev9K7Seo-zP^^mdm93G(abez_I}4CrdQJ(cfcTC4eTM7(J?MZ$e*Ir<6V&*8 zWVf)0qt)X{6vAV?(qO2_h=B?fR;hv(+6>|HUOo*I z$PQ^XmHZRxy?gVpi%{fB+!RX8)pwBZSm1LjiWABDS6+1km3|n~u3NAMmxyp6?f=v+XQPBP;9#LIj#ehYG-Q7;emlI9xKZ2yl7<86^ zseu+gaMS||Ctc8?tJ9z{7lC7dD=~tdxx1$QhFm1+z&BY!k(pQufgDjL)_ca2n&Z?9 zu+J%~c}GENMRsGX!G4IqimpDsMT(vdGN)e@*0{!7Yo_6e+6^-2<>o@!{n#u;7=cEKA^gW<0fQ4I-}f_De*uLF&nh{$q7SdAf22)#FNs*7@5%6zw*B4ct9bc z=N~p&k2cr}MOMa5xfU2)uNcz~p{<#g1ZNoJ*PxAr#vHSXjtq6~%9);*9fw2cGseG9TLWF~ZbNQAEOcw{|0t5#K_mJQs z_=`!~3KtFzGtMp84SgSr@0s{1RPzUKre~KJo($Yk5{bA_dH0+?)gTng{v`QNHV3C>J6c?0qs9rxJP?cFeTRd5BvGH>D^1g5D<#m5wvd^8= zyWa97(7k)zWqSX}-fwrM)|4VZz@&=(Et>My;ZKUo(Qj|y;F3MW!DGfbN1y48^u)1^2f7(c@6yJ4aGr;%t^CC6mfH< z|7X2l&xAZCd!P*Ev^KtU9&DyyPrwXO6r@IpuqzZR{(bxK*oXP5CE7K~M~k#!H;u5A z@kU|Sjr-SiMaj8qxY)>}Y)okzpWxu>s^MU0-ImFaEa!9?{&uWCNzGyXwKvz7}{gTrLo$Q?^WG`{SEH6CXF6NdaZDemd&OeikYt= zgZ8ZG>g?9r11E_DF^DlLE@jIyZGyj2N~VHyZV$oVM3C;>SagY2SYc&#Rm0vxBst%( z-fjSH5wNLr@Z&w{bGt{}RFsq!~(eM7kcq}Uk3a!6Sx3(@FS+wdzHslvzkWS-uiOCjzgrg}a|A#MbGIImT z)xKB0br&|PIhouoBypQp#>6!oq2Fe%heUVTl3i!AYa58)m7OiR((70#@2xtC6CGd?Ro z43b|%otOQ1FDb(#(&{W$zzD;sF8bA$}2U? z^^0i`I`}9ikyx~<`g7NhYk#v8+M2lEF|VGsFUm_E@jp$BtTRYNHnz^jYsuY$ zcuKi=96nVbB&6bioNZ^HsT}RCeR_FCz?9v8y`kXeiTUS-$K<{@j(GC}L}tf*o9ErW zlk9E{WT~ZlNI7Y`j~=xMrcS$jcFk+re0_}CobNO35Mo;Y?*G#e>fBU+tv|2&!ac7K zcS7+T$-?8P?Y=P2LO3QEMs>m)E+(i!%VUFQVI)18v(CEhGhWlIt9L zorSu>mW?%VZbqN4At+s4p~+Akj+y%Dpmg_FY4EZw-ELQ4rW2KOxG~p!x2#89+Zirj zK5CwxzMy0r*)bp&CAC1?useJ^)Qjd-z~{}(%2f&}tC5esN25!9=6OL%8u>j(?VqSM z%6dIz4{q>DZ4tIFJic(h5)RE8iivYXK{ER*ZzMULM6rotSfr%k1&bhxSC4mNWkw4VAe$vbB9U)iBfw}K|qNr6{UR396cuz`yy_TZFjw6t7w=HfJe+%bu~GkyW~%6ufx=LJA{&+%3S0v= zh{5%R*Aa5+~-^qVtM`6wmy5f0tBUwJd__Bv)s9luZB!XH)p>_>*Mc79fU zZPR3m+a$YZW9JKrmgFao{%)yK3EA&P!!;BcW&J#^5K>2fY>_01@Bof3zIkt~+c7?A zgNO}MYd#s}H1pxv)<+u4xiv2TjQ|1r`gMCh1VT}foT&9Ws&ZMvlzi{12Zoz81dp6s z71}0sdM{hOS+_uDaIoX>Q`)n()7sLaSep`~?wjNX0YkhducW>0-C7PVGE6Tu({z%L z4=*bHTv-&bJ_{TE-tfx#$YAUE?sl$P)Xwrrn^zK#W&Mw4erF6KJKVo9`=wZcw8MaM z_ZM6IE_eUcTNsHM*ZT`NSFXCI2r-P32)khr?eQCfcGM3cfp#P<pSwy{tHWiVmIo@D_e^`g`L=jB**{V@56&Qb zuo>h+_u@x4Wz!?XB{w6Tx-Yhq9$t0z-wIFRjL-9Gj&Lk)C>v$MVXk8Z!35=z^D zl->Cc zD+0MnC5BagqgADM3m+T@9k}_r1GdB>Z?sE3n6(jgUfRDPG9g)3n{n8a7Dyv`+ad3| ze@B4b?tzx6`PJ@c_Th)SJgfILVKL1ZRMvfQ94GAMhfNEcE^_Qw)N?AA=LtNFA0(JqWI(8ir`PT>pB^cQQU9u!K_*W_mn>7L+@8F z7er~gc;a#rDtt5d7ArWWr>YR0(rg~NDn$;g|WTwJbWOs zO!Hpne?ApB65cjnV%RC!o!srfaRupTc|G_`!19o%(%ai}W4D~~g+ zK`<*XE97k>ac8H*+t5?k0+jLVGNbyydz%`VqF+r!8^1_6Vy8KY>hVJk?F2+5rDbLI z=WBWe1=GF-9!{g8V&6TVk|Zug-;d_q}Njw{kX7 z5vD%#bu%@&LuU7XO0x3}MGt<)H?nYigFeQj}{>!0#N*v$@ETb_J3+)|>Gc;*Fz zUNKW9Qh1{QVvCf8@HS1E4gR(I30=d0v*uW&+WlUr-JmNRT0ZTXc)a-8x4+WhTYP!; z>B~I&Lm#g734Yx1?uw{M^Oc1rX2~-rBFBHynDxeM+=+`TD#ou*AMF6{Z7&%gfxb-nikGw3@K|bV)h-{hf8hb?E()dWI9I>{{C3a@l`n)VPeyPxMwh^oWskPvR%#NWkQ}{;f%_>2!oti7gXJXo=J6q*V zDPxyQ;<9g!pQuJnqBDD%P8oeUOOEeIeV;3{E^C|qlC3Y# z`M+gjcx+_*jL2RLl3q&paA!H*`%OjDR>Xv>a$Dnt^o+j#z@xoH4avztdV*QcWm@k^ zPa`oy>WJ;dzGUDnQ&83SKgF$2zV4P7cVv?`oGjTatDo9(R3?3dO;$9nHk9XcDLm(Y zprWML2NRaa+A5Vll3JEp9ke62Q~x-;(mS}4%G8^Xl^$`cM6TpkuC*1!JHM|@uV567 zSuKQPQH!4=oKI?VnPlsI z#P`i3XXcU|y-U6E-c>NP+6*0?3730TtI6rY!CRA}ZvRhY7~_dXJ>tJv4wW%RWFu>1 z`?nqT>5*uLWmbvr969j zv>~MU^wQ>&owxW*3AS0C>23=pnE_9pk}&Yr0#p6Y^=Zfm;Xsf~(lMpR*$D@=6v|2V`}jJCd3LkKDb5}zIjr{ zA1!$2E&P@_wyn-iPn0;an|G`it9zwOe)a|oPPlao*c`3ZCx3iSW2?&KJ>gmfT)|=C zWKB5yx`q2E@l^b=S_dw@eD&DnfdZN##zcT)%uy8bVvHkf2-qN=*B5tg^K)%9<$nFV zFf!6{O6r-k-{NHPvUCHt0cO?raqHcuU`qcU)f*V&t}W?QPMz>kRAuMSjP0&8E5&9n zG2%6;<@A5XS46DZ<+2c=S6^{4gVsp>fP?wubnD(_tCPds__v|>>FqTEMMAPv@F!oZ zY`WErS`R+CT-QUNL@EvxF!?R9=+)SCC&BN?9n8fC73*FEa1b394!S_h2dO2e98m>u>e3N8x!Tkr& zRm2kWK^78EptX~Zw|sw&Z%q`xl1kcB8sS?}>9<=M63!6n z5Dj;_`{Qodvk9yH)IpJ*1TQtE1@$gZKQBA70p7pq5Kah`QhW5;oi{i|6%~ECI{2B< z`D&|0gF-DoS>r^wuXiaj+h9R98h&03BFwd`SIzpvp4!}K^zE)}3kM_C&M!N7wyBHP zzjGXI`u6Ije-t1=4vTGxxG%UDZXM(12g+R!XdG*t7OHx7Dxpy48Q_Cu;IN9!`FP&we$>ONGy?&?TaBA-&~N*=1N zuFghOJ%FnHv<9yHm&>xn_l@h z*z}M1llKu8^%ebB)b}wN0AL^U<6)7@{{`|@h{Qso@Gl-%Rxn^$!J+(btgvBy!-%xO z)v5=E_#=f%6Qb03OZ^hAFG17sR`-vPzw`e$^j!piSoI+{kuUZv4-utFiTAVq7BgdC z3F*TAE2Gw$lNyGDF~0Gh49- z{MY|+LRi@#T1iKiQZNaZRQ#{+=(au|;CCkq;n3ld5vT%PNT8kn7anj+hOjEl`fmN0 zn-cYGKR-XiDfYSDD^7?j{Cmxj?!n?He%Hs2Hn$3~lY&UVNgLv}2mi8448=2eVhmSj zBwt%cr%rd9yc~agSornzn2bePQIoyocAIv~+iOKt?n0^lYYI|cr9rK&I}e2R-i^#3 zhO~DD=F5(tnPkRi1Va>#0WUVi3Y7nak?+X4Umyk%?dx0VC2bw4&9&45 zITgSLEyW{Xd?dR@CZbi}Tk*_H|hkfH@Bkz+)BLu5)pDXMUmmMyn5%sA>He zxoYz@{OH}~#4$4NI2=@^$^-q-|CZ+*M?6(#$fSE`eYTbBwpRq~EdBlv5C^Q1@{lVJRD)$QBJ2GJ7UMQRY3lq9-Fejogxp2}9hdtx(n;q``Czud7 z$G$Kdw~eBz*@};q@@Q6pd(m(c?uzsihVDxCom6Ywc6#^7rQ{LM)w24CASG882s%gQ z>OW-+sKtj{%$X=mhobCv8=6eaJ(s31Rvtl!1Lj0#_-bEq?ygh$QyY?Zb@qDmu4mXZ-G6x#xP9aECO3 zIbQR|+5U&q1$UGitq_Y638b|7K&CH(% zk@I9KSHV7GhLM~9vX26cZ662Nd**ONhKzSPHo&b4IM|Bo$yIuOrN7zVdl^LCx5f%| zu)=&mkgzRPJ{XwnK0h1aTwxuhQ+79FwbEzvUaG8rT~D^WeDOC)y8?}L36y1C<5<0m z5QDTw%y8N5?e{dbngFZhl931%_h1P36v+fRju0^U0^f_)9J z#*T|D?4<%UX;1K()nzrAP#@Fi=X&%fA29eRk*uRQi$A>J4d6#YDbUyP?tyqI@|>tS zc(sW6k5>)D|Nmbld$oA)&t8E47X@UAhzXxrq|Mt$7krhQzCFF#)x1B&H||)i(d*{g zbT|AQAC^2Gb}W0eF-waL20Hs2)6>^my;cT!V&`V>lu(lP_Z4IZ@nQ=TO;Z8e8kjS5 z@jTHxo=fr94xgb(VOA-xAA(#PYg9w}K`@#WB_N=fgTU2!)>b=gsVjaidRnqJKMPZu4;IpG1`BmAF6Sj%@U}Dhmp1M6t8D>ryt^-GPi%dcfZ(UO zxA}7{MxL*ce&271lwCQJmIa@|L;J1H&oxEMjq69>tG7mNvr{D`zuY-L>Qp~z{W<5x zg(C&%6&UPKVKM=3y!%n6CQD4VLIz4_nszn)8wRc1ecPpZUP`#th1S>zt1LQ{;j;$? z`Y0U}b`y!Vw{MdJ??q@U#^7hIA*mAZ#x{t4q_>)a%9EaQPkWso9D8jn{ zMJ+i9YKx>3z55PtdmEJYxFjb%;*UXLXlE`8!N0twGW*9(pa`MlNFk<)x}`Q$;g^k5 z4jriCRWcRvkZVe4O8xSs_M0xWx|h@60_Awd`E~JN@#k!GGN>ZTs0AVLCSq6=)v1!; z&Wo>Ac_6ixC(O#(BL=-b=6VI1i36H40^6UZS4-KF&Am)I2cDk1M9wU9j6}ovR-_La z60+g43yl%q3h!+v-FA)@>$@(-*6ZAQ;zem++0p*q@pj*$ z+4Gz34NIu!muA_buAy#SHM}{--9DftZ!R$%u+2G7h73Bj=l%mW3(p2oPSC;*LC7P# z846@?$edcW;Lg(*UmtU0qeftQg0h0WrUSh}rH|J%wO~t??WKN7(~oz=zW$_akmfyy z?_Vm>0mqx|CV>lnQM(l8ygfTBldrvF2agT5-w#`=9jH;SEXF93#0DSFGNC5)U)m3X zJj?-F=)CsA|MJ;RfxLLES3~(dDOSh`nE^|=r5{i5$?dM%;BBFxP2%{QvH?FI^l^07 zFC0P^6OAll#d@#3uP!g|6dy5TFf9=M$?BOtRzLu=^O?X7 zxYI&1+$ZdbntEs&1Gw>MVQY09rtdWTE(~qi(*Q%ODrsDn+a1))Gbl0CNOM;4!B*38qlzl5M7E(&Cp{zimng{bitp)XHx*wxjhVcpnE8Wd}XEUEV^> zP%~dk(6Dmtg7J$4yG(Rf=JeU=KHPEn)Uz=!!V#X5Hkb-#sM7JQ*arcNTJ3y3;CUb4YikHOzvYJFV6Gv zzjOmeg+@auI-jU7OLjar%AP$#hN6#$&A@GUZG41)kB@TK)fS3&nyy>?-X}EvQqqtf zCBmdUAOHLrqay{dv23>{9~l7!bmoO*p7@t3zBm%*5B5GO9F`Ttq&S?0w-s(&8v7$a zhA9HEysT^*qL7O>Lxntq->5Ldf4gL*)6DaXiUNsE;cvX@1FRRdXGdG~%3c+p5t^ok zL;cn;h@<`>gQrW>>_q*kSIR_ngfwEkfGM0y)u3Sn_3USeK^5g@M|SfUvW!^k!P%WG zUB>e&O}cC~QOMJD#6Zv2VB!GTSWUmHziOs_{2j9tg#fjw%+;LLqM{*-V95jTqR0S{Z~^bQg9g+RG?ESZ z0kzwiQ6)C-!`lLIF$c!wZko?*k_S?wR*x<6Qt~xd2|Ibm9Zh$RK*G}J9%@aA8nZ<8 zL3+WxPu2*kVT|VV+)(s?5aA!JA;TrV??)B9rL%)}$Um~V;!oRCQqf{>?T|u@p?%8e z`9}_y#|BD7-$m`KD#!&+kGM@FPV6jgoL&U&OJ)eSUkI`1)V9YgN#b&?OUe&5E%bm! zwjZ2dl_L<=iEv{n(x6IziIulkcq_Kd=c$l}D$8$K_uSyGr3Q+`FBl2&L3aK3vqBDK zyc=te-o(Ai9^Wo|L3FKx@=5csn%=kF7>bG#vi1OV$AlM*7tu$2_A8BIPbLFt)yu=- z`*N}1oH(!b>f@Ujy9`aD=)^b|TR!=Sr4D++m^1W#fUPxZr z?0+E%EPEOO2o&@*F~+^Mk)dV4l*t2uDf;AR_c$ZM0N4*THhpn7J+1uVZob;ajN`4{ zHBI+@v0nDlFlr=(ycFf}A)Nfa`HpUC1$k|Dz}Bs#!Tq$`FBFx* zmF$)K&D0y7ZK_iT+TjkJYsk2!FH>_b)iaqBzYflqD4H?)XjSfEXIme1^m#<4PwuD` zkx*y>nJ&^ZNf&; zx>_PCe?dJ?Pmsyzr4x|?vj8570vWVW;*zrKR-h)c+P3-hZJ#l=9;VL}axE+PQAC@n z$&+heE>a^C-_@n~>i7G75TSutiFng_{t;Z~ae>tE)#>8wd`5Z}Wh{L271^lq;rJ8A z8CJ3a#Ew|OwJG7Bboe$P7F}TjK`kk&vS#0a-obc`?!$neS;ow7+BYYXcW{3PdjzUE zxG;1$y+@r{{U=Zc5_Ze`fpLymNH7^K6frB-3@-F=~d)@r}*s6pq>qnsCsXU zGmS~X=3Vc}oCiFlA@@MU|C~cv7RYEn!3P$8GGtz}!;JC!{$A#+;n^7~WqH?~5Jco+ zOD@eHPE8w^ngxPiY-V=m4t9Lqze?IXH`#sl!;6EH`^47$JVxQ1hW@9HD|QDLJHKp( zwyAW=M#XoNEOEPt4__uq+9D&s+U8$oB1Dz-kK7{a|B;qFzJh$RXAX>s+kN#XUG_Ix z{h{TzGQ9|Ia-Cx%9!c(Fl2LZ{Yhn55r_l`GL@1%*N_&Zs2{k;U3-( zu}P$~XYtPWQN6J`r`zgA7gn(fbiX%)r`dmB&^YOr0Y-6Z_b$HD-DeOlVP5-qFk#V2 zA1d5uB+WUev!=V_zBe)+hH4lSf^KfRQx=C#7`@P;D$0{xJ^C_$QzK zvi3ZdWmn?DK%?GD1EyCmZ*?`V1qofp6oy~jvvX8=U7kGZ4jYcGpG)Z8Eu?L((#pJ& zy7r~I(o7B3It0LAV`NEh#-GRgGZDtYUFQ6C6+tXKMNZVf3-?={R`GJwpR{ZyEH9_EF4HPKs1KJtmT6ERPqDmGc3By5JM6pZ*0)1&JgD zfdC}*QbkO{VBJh4;*zLW*G*;Ld!0I@Al8QChA3H8lX&(o ze+Z`fxN;a5nnGzj#PS)r~3qCwT53Fi82uA3xl}gf{>uz?+^(nVFwa>pKs(t z-k>nS1EU-U+E?NtP0wSD`R}e6P=Kd7$~fIa6l^HL5_^ZDGQSJ}0GvocI9dY*wol_88;Ci{Kh7$oxeLIa(K?MLK^t6{Qb%G5V6x25l0q|Ma?A! zJ%F=$4B+uggfT0>*bw6bPW3^E{5+`WQGi-PO3ueS++;7o$`ix@qBF(9(^a~Wl)tnz zg5x2AKZ$-9XoNjjq_oYzw)Yv>LH(FQL;)DHSO7lV{@stsn+f98exsBFa9cV6FoWNU zuVW@72j_z^+kv7dw-or03*`a!;v zaw=|p@i)mJp^KHl0~9?B#?^qK&x#WO@v2xB@K)6jpCf=_8_vabeut$Yx!^K5os?)v zf&a1whh?uIu_`eIKZ?!$I7xn$!}6UwX@!3gf`{b|LF5de!+^4I)MG%y$VmJgC+H8P zNRjrm$5sCLt9AhejF>C`4PmGP29)kl-wy)sBmlnY^ydl?zyK?0$yL%ofkzdK`?-Da zz+O8Jt_=`={%zdPvVa<1K>chZzNOwUVL;%Soy}TyFG~y_mc&wAE3o)6z>E)Hz<#&3 zsfYoFr5Qz6f-v6|2uGVn#wqhxFcyKqXO932KLg;A`Ug>Af?oo|%>te#{MHWza*qYN zsOxjp3n>6Y`R-Dup2sT&?^Q|ap8TirM*Sq0_gh30|&dL8o5Ol9s=a$VuuG% z0~n|y(GtQTzlv2Mcwlc%A6HrkIKVaV;s*i3^N$`9pkiNxrBsN)wx)&=uD|^JU#yQd z5)d);YNbbN6a08)$$F9C903#yr1D|q`k_J|R^AVZ#N^hy@N|;zxg|!hC3Of2HmgRnZaK()lzry&*3WV}*z~O^)nC`tCjoTL zmvV^xF1Wd1D@m8Ij5-CL_@o-ej&~1~dm=B3GXQaA0e}0SF%$MIz=ut>4>&A1phuK| z9U>mL*?ZO#!?r&$q0VCY7-clbMvf#j^?e$L&Bb9tq@h67>A@iaL*z&Fi z*p2Ww1#S$j2XlB^&IfMG{~*%K*jm$cn#jFhcSisR{Eno_13Rv8lBq)NJxP(W6Rgj+?_Z|XHvVo#VJ?<}Q)|Upy&Z`jK z4pnF*#8z)X(*Y&c&)wqe2VQOzfkx(*m-iYS6;UIbr<&o1C+p6Z@wsGp{eXm&I%=yX zvO)`Rsugqp``D3?oWH2#t*^TymdRPN{;EY5$*b;P!SXhs*Ldqf;S6l{TYW2k!RUkb zCl#IICqZ17rMGZ>9apqtM=au<1CLbkK_$a{H_}7as<5Lp+B%*w9f~s`Z3T;xQtXDF zX4omtJ!&uL`plSAR)^6F@~#jXrh4=cduh{!+(2#;QWc6UJ}3B^dXWCoDY6crC~jil zI&X3Q=;EvR1^o82v~0Frtr~ZJeXxSAg3T&LcMhJ1F|GwZL{QYmJ~A(JbRR{*aq+?Dt(a_%PEwUe=_PLZyH4p5n8)e}|j1TD4?q&(2X9fLi8}p5;l3==;jz&hm96Lcy{8oj?&DX z)T^-wsC|E`bS5_*|Ef2!60m2q&tL>Fyv}w%T)nSEH;(n{|QaYJbMjhVIN4sx#p{0AjuvG^&SOJ<{~njQ=jxP7@BcB|fbvfu5ws3ul) zUtl$dEf*^(kMVd_p%>?=Y+zP`pt&Zz?fXF^nklqD=Q^GnP+m9h-voGJmgY+PH=DM5 z%B|G@E;rh?7p>9J4Mx9&p-SeRB zA`xKCt)-~SmX;}kzFYB}A2}fgqNgVt!N~xkHoz(*WrNS*a)DZfMRTN2rhISBws)j(!D+x*R}xfwJJ^tT2FyH+@4gsQ%yoyiaiypaO|EH7~#N)-c5IBzNt z^w)h}Uf=E!Gof@pbzYxn=&yA!>U-AC2?@O?&D^B&$3IFtG`m%qMh2JJbG5i`Y;oMZbX^T-O&(Tj1T0N~*1RL{ z;D8v=GkSc!5ds-;a&NM>dh)zYA(H!2h&~1P6U3lo-;HvB^$yVoy}^=^1A(D?G5K%G zL0>;y&}(B#Rt;+Z_#3s68H>Q}I{pKV7no4q6X=*|)ZlU=pHZ6r+H;|nYX)Ic-05dW zt!I1=Fe{2S?X9bEB+T0LcyY`S@v#Yu5et8(IX)EAgG|q16SsB-?~a@sp>qIlh{M(& zzK3apKwgaQoNacX*IeKLGafTpl){T}c!dhwJKB^p*?O?5@)_LwF>2(k@E$WQgE0Wk zzg>AaMy7H;ME6-+@YxY)%xwi}w>6`XA#~-cAaeb4g0$v+jrWsnv@Bq)JQ$Ss37y#e zj+b}eUm`1*s3u3IWq}!^#Rxg&vt_N|xOS%CiCohS!1)E_2xxI#Y_R=SY)~=>v>*XY zo8976Pr1_{S6iCT#N;`sV-g#}OB*eJ>a%^bZ`G}U0N+k#T6HyLM>xZz`hIF43m9X% zJ&4>KGP3NP^qv+VmEDOs-UvR6M@o!!G~H#8a?9NT4WWcgR~w34?f_|Xkh{^knB{-z zY%x1{YH)4PW0vTp0A*!Ke|7Ij&t}Rrdi!cFL zm$z|R&@meNI@!g7EC6)FiI%DN;&q*r(Qe*`Mu#E(QvN(0Xo zxKDVFm_K(8iy%`W3Q?s%9!?ysTAq!ma3@+wh<}M_lRy4Ox`k#sQGp{N9KuRL_ zV8HTrF2K_lUYHexuUa`{egameaBEa}c~0(V90>&#OUyDf>BMbkyP0%|7y@=MfB}k z#na>MyJuV{t+&}E>PPQi6=Rw&q8Ku7r<=69JKpf~kroTV2lX5jm=OfM-xoRH2lgD= zycmFQqHlAq^d07#>G6BGkKSX0ypMn%p%gZ*E^?Jiw}48YaKaZwsNt$5+qNJqM;C@> zBtrMyI9!4v(Jug z*{1ao%PhRSH3_51mO*x!&cl+f5SD_zY`>+5=F$hphpQE`dIj%m)@t+b?!U;m?pqaG z1G!u1qUzb3=2!00E54FJV zRLi+ReG=prM(g6PNZ|Q$7u2p>5bn}(!oWew$R$UYNpn%b;K0oeIB2rNA=t=sj>d`lkc|jVlGvV zgPHj(CHe#J^`K)Io`RaqJhkMsMU6xg2#YtU?B1Wd&w`=NcdGDLCJn|cZr;;$8TLis z<)|7U_Xe67cN6Tv%tFT@TyvlxQ@4)?5-q!Dyv-6T`&fB(bt?97VSB4vD7jnkwK}wT z(04vQfY-{?qRVhZiA|~OYmL(q{sUf>+KkgybaEGLvOs;Hba&2aG4Gwu_=CDognCys z`Rqf5Wdi+lghz{om+i&T9?puwnVES4Br9NW@P2Gu=cDa7UHeFmztA z%hS+sxNS|g#*GIN*Z9sn`rs$grqgd$vxN3OhPJ$|wxgE5m@e%kpV(tC6-YxB5zarD zH9XSX`JI^2b}pZ>4KYIa&X?P)>bNm%9r=G`$DeIN@+4y#Co1q%ImI1NS z=A*&yhoG-(p0x!y%qGH1=82V#Mis50kF>h&cS5VP;Fw7;anWCH{+e@g++z*QmUo4c z%5ls3??G*dp221E?~U!y_l&9rLsI_v`fSj=+pTx8ZH4q1;zN57GWwE8BU! z1M5$gsgS(P1{WKJCaZO{-t5KY9I$7%nCLeYVTyb8eQb{)vBhDXh?Pd!C1tdp0og|F zhy^^$9v09-45GR|pPpJ%Lcsk&&pI8XbHjpWs8^D~!4kD+ijb#tB!XVlT7{Ajal~r~ zl^!UX+?PRBnr5GilXrnxg^1sTa-MPCe+*D!2~6SH3kOJ!sd%BlUF(9oAp4a_{}a0&_H|G z%H)R)4Z-32mfv#W(?579m62CoUQYPtCJGZ#2Rx7@2xDN|OlLopw~q^$RDH~QW$7&a zmh;rvZGKC#D^;3R%WKu_?W6q-7uNH@!FXW@o@`xZ?(fURcfrxO+`-MT3Qb#inM3Cr zKIi#gD|Q?r{h%LYuRnW%#_SHOnYgaOzVub$I}aCGY{T1bdic`gE`u!E@fvU^>`KtF z8e4{B>ZH3$Xc<)Odx3$o{o9wt6rik-l5cXhQ7nYHH=tw4c+cYA1fu;@Bp6~;%1CrE zor0fRp!BwwpG?8pjP{v=V0i$!E=5MQr^>BOOt)ob-2lC?@)X5fPeE*KB~tYE342B| zVu!M*;CZ2o#V*W-+9OEG>Pua-Gb1R5$%V~FoOXK-P|sMc`YLfArm9tlbtQC#Zq=YCxSU)=?gDL7<9Qk$MWr7@9PZ)JqJoPX4OwL{L;Ur;Hcsuh6_MX z4;;+J65K_rbMtGnCFzulGug-1?ONWYoy&;IeShz+rHOf2+rd zHh13*KtzdcCN(G`Nhd&IFpd)g}vhjxnmvQauI_cwRreRi0&7thLw3gx>xb zu`X`6A6I##dC`Ot0I1JErrDrml@drroTnLPH@+&@uV}PGMuY74Qr@R-+)xFh=#}J1 zFEERnIeg+Rt|Zr!M=sU{*D4tvc)1pGBfL#mzlb=*gG}WS=yX9;yt1~EHVo4N=n#++ zK~o4BdOUc(amr`*GPbWK;BEOY#7#!6-2aDo3vW^}8TiOW1piw8GjPCJ7w1p;KR$~z z6eZk*+Bdqj=w&x+z9M#8smVl&*_Z?`s;>!ptkfjchhbikdQ|%NBj|u{-re7eH{IuI z=#4+fh^{R1NIMm!E5Wv|1A)Gf0spXk8tV5de7j#!b>}O!ti}O0;LvdcpPCR=Dn%TF z+C$H?AwSdVZK46Mav77e4NRzxhnDGNg*NFO*KEczPwXJvLA(6vT@r6hp`7hub%bgl ziRValfs6}?VzMhrg`>#1FdN)AcwAs zkkWeN#fY#{LXXh;3pHx$IkRyHx#S3t_oLjVfshkkn9bFcMTSHgN51YuS@hEWnM zWNg@+gITYG3ldtRXaX{(Dj=Qi&)bGdjM8OKHRTShDZd4P+@cG_j%qshd8^A?PyHG| zTZYZJQ@!|BnNfvBYWhcC)#?b*6J5dskgcZcmA$XYT#Xu(@T6yhM+*B>FoM$K{qO0H zRnN%7z#y5V-B4p+UJzpYvm$9{(9xQ0S~`fNq%OgOD|B7vI$}Bf%%(FO7&2ey+d4#K zWbr#`)slePar{2$327G|JZ}TFcg3KT?l(b{&Nkbb(nHOl&9}AU4Cx9p)&iiSI%j=D zG+#|m!I-Cr&hvo+ElKhpek$6@g61%-!Qp0z0m15_l-7tK^l4Yn#XDYPg(O&r%GmZk zVMq-HH#-EKVgyjOk2nbMsTBg{94b_03i)!nm>?FRH~YVL%B$-C-25Y zGLg#39ozj$ZlAjv%-y5|>5?lps6d7Rnl(S1vef-I=nO?nkqt3oW0OK+3E3v@6~P%vY-KjfLkS~f3#vZII5tE$zIiI&};7|1A<2Gclp!=)xy zZpvG6f5>PDFy|bAq&U5uXzB2nnK=dg!Wg``c_I|Zkcana?tVBQvbhYy|0Cd3%eio|qli=~D0GRs`O>)tVoOf94 z+wn#!sA2;k9ty@M=JJ7(#i{=ZW2Ob>s<|%z2ge)=xJ-_0xu!#aTM4LZi%9PU=o}fI z>h2@X4>5&Azk$c_1aK9)8PJOWC0D=Gn;~`IA#1)nS$V=u(Otl_MtJ<&;Ly;4Jrib$ znDPnpf0|6lxB;wO>Eku{YmN%oM+IoURVFP501__&;;l>1qaP|<34w;UfuTO3jbf+9 z<@~DE^4C>Wz!p5gLghbk#X$KOz=337IOA6lZ)fT4UExz-9SYn^G9NHFr#7Ya z<^3If=*lwy(q>6C4x2ip>gmKHIV@GBA1astDeH~^MF(tYg83rYn3j3q0;m{>;DsYf zQ}V1?6Jg8(zyrc&0V+6ed3H!sRT<~3zJPm<6gVGe;$H+5dVm*IE$=RX7H=4K&Wl51 z?2!Ttj~9II1v|qHrrlVsvNducF5=z-K#=-Mm+&uDBnyuK%;Sx#!ItyS1JM^R6?Io< z2!TFp0|1S{a~JHV3iJvlM*t8yLgg6veLmST2@8;=OE?A8 zDzgC7R|DKt-n`oCZ;1#3bZu3fV*}UR4+?K7S+)0a4PeX~AYe1Wjxm8Y1s74$=CjkI z8D(e-u!wFSsf{|!y(ewI6QE_I{#ZxriZ!F`4; zElk7-Gyl4)aG($(_i~`%s`R0NI3*#Wcr`vOaT~2?7T_BKGzU8aTCy0&SKpqB+V!)8 zkW=r5$AM<%a95-JEP(hwwFW7nsh>7j=NPTjoH~QfNV?_1sw(AZMo!bulUYU|a@|p; z-XOmcwi~k$)gIS_11s*!jVTOVG4@~xx99gM(P91uu8Gi+`RVVOfER?I8AdZzlw*e$ z+sF7&Ap@@tc-4$a7Ram_;o+l)TDW->$gvXu>~RB;&R$f>@|htV1*4&XNL`zpEa^-> zl+INQjZLPE_nrWxHp)L5?mdTckA_!3t*L!Tum5=X%${C8C}21%YJ1^RJm?sG2foap z?qPA5BBqL|3;cWoU!14p<`$R&mKbuvo6kPoDd^c)2beTJ#_p)HbtJpC6+n^(00v{< zOW*Nq*WoVuKkU6{Sd`1MHmo=ZiX;(*AqoN#Bsm1h2n-S=h$KlWAOiwQR-%A{B0~_# zQHG=>k)VQriV_tWaui9DbCUelqkFBr_W91a&UOBO|3;a4p6=@E>Z-f$s)iY;nKAxG zN+G{Vd%6@CYL|p)vI6@dK2QXsbr&>B_1mBzfz9M070 z3li_KqKgMWyU^9%W87eEa=!A@GoNh$n(ANJjis7kenthG4}S|$i+VqB)$suI5y90!o|EzWrthRFo22v(}=b<%( z{4YJmauImj-K%T%A2=9yz%alR)>QUE?>9(Y>`1pIr$VogJo3-p!#aJ=*;h`4-~^6c z!#x=O@gcA{oh_L*%$A;lo8hdSUg9U^Bc#J%`N9Wu%lr zEMMH^BBj5i@(AEw*R2TVc>9NH&hj7XH;17~a-mta2GqrLrw97Ik$6hq-96YC&>5?p! zKju6eIgvLacJ1|qt16#V-F3F*UV>AiLs_KPe5E1AZ4&^%FRo)Uqd_%SNd}!SUqISm zoj(zD?a!30;JuO0G7t-N7|B^*jf}s(N&bloT@z81z8DuQWh3S?eXHtbYn}y>;f9R4 z+p>zVXY}5WKx)my8}*T#oQ&!P7gP)B@;N6XuOh~1N1F-$Aq+aRHmopZOLc|HTOYYsiIn@40h9@RU&gW0I2+2h{>10vE z=q@3Lpfy*#stPUq_6SKO91a01ir_V}BgXPqd>iNQ{lubE}ps z^y=)C=|uc4*q;~(U|*j%yl)HBe+!R%EAgAk@ei+sorVh}^b})DK|%}ZcP#434LCiY zAX!^x5f zj)@8Xth6f)KLaiP!!KPlJOIW91)*_OVwRuaX&dCI1Ri zL20>OvlMAJo+9e6Xrx+AS83zS4byp%pUa~|4O<%29y}BlvD0L%{2y*Gkdr+)`B$|L z%>_|^YMbV#Y;N;mIL##v5%E83kJRUhKE(iFetEzDu*wKUrSpqCg6sigZ#Bd2L6zt1+hDQ$E+}GJ({RN2UKF z1`am6*px>~(6EsP|J;cC;32Sg`~JDYFW7ZTaLjT1=}zk~W&X8T)-z0~(GQ$xAZr%! z&GB$E()!!c;~}c3r(r&OLsJ=pa6uj>fIg4(zjYY{8y`W>Z=j6#U;Cp{p(scR3Ig#b z1)*b&68=^odgZh`P~oRaP!hd@H4vZEAN?M7(b#L2D5=3ZxTx^fh~h+~)K^wKy{l^M z9lrlkET^A~yX?-#RHKeC$E)w6nkZ@=@x2Qr(O(Y{;NV)ChAZd(g2s!zv+h_mZN zqgqd)2R*0HOtyTeEOOBoWQqzx2t~RmyPG%1pg?quijJM?rtzP+mG!WCItvhfowS_wnh)&l=)bUPgM=(nr|rv}951 z5c}$#wW_%g(^f?9|ZN0iT5ec6fkK`)CCbFc$#MR9E}XhC?d^;<3{y%Mo&Fv?FSsw-8~;u~dCahJo^ z2mPww{ThDkJmA*#=&&X|ezO8VxxQ_$`jf$N6-$s6s^mrJaGa+Hbi=h2ZTpZK3RAZZ zeP^P|iFk6gaq9> zUU-3%S!q$a*ti093rSoo`lqH?9r=b<=%&x7>t=q3w>~|)bHzGQU4|adcXD9q(pHxS zoE&XMw$){Gj5bM;tHlmYEMhss%a8^BO5X0RoA~xrTG=zhmJ8ZK#GF~9cw0`jwqNUC z*qh;VeGULFobSX2t){?H|Dxqb4yjwK!bhF@*+r@2pZ5I@5l%F+90)IYT@B3uX z@B?K6{>c~mqVX7igF9DsGDM5=`_ z`cQ}@*8?!*5juXQ{G0*DirLW+{sQ5#B;9A5zaU}BY-D=eYfne$KMoRvC-ue8&>Oba z&(%cp&CT0LD$bSZYodg9nB*`yv1@9x6ylnLFSM`0`6PAd*cmjLC(FU8;A^hgT8882 zMW&}XBCv33K1i}{(S3{+Y8VgObeS7xh{d@!%2?Z|;6&0Fp=_w(OPez^F{XjfE7XzyD7^+ zi5NymSWTwuT0BNl!#7M4t}C+vT)Zb5CxL3zV1J35@$LTV+_fm(&|A8ntZK>R?oKV| zXt!6@5u?aqnjAS2AWY2isk$+QItaz$+UuGCsnqP~%&C7#i+{_(HQ;xSkCx&Q_VvCF zar=Zf()v<{Q$PV-N-YM8P<8DW8f4MYpaIK;N7F?pJwz<;D~urr4?p$(vjGZAzjF)) z_XdIfm-`d)==WLtwin}-w3CLl``ofPE7mn#S%vkWdR9-M7wPNciS<4Rr4tk9p*)-w`=$}?J3s+QStI3n{O#Msx>N7t%03?DSPMpvq^zqoaT7Bh#g|oqp@j#U(-K= zP240f`_KG1l((%bu|d|DH@om0WV!8^E6>`sieD%2s3jMaR5ScM;C~0EFfybmL_@Be zc14Atj`hL=-Jhn|^nuH4cpUT+a;R%mk&QHNi&(u6$e8guZ|Hf9R9}~Sm$3~?ak!O8 zx^CTc(&OE{Ej~|{nc;O|2Aj)-Fm1hJF^4O4<1vXy4O`DQVtfIxZ6f>2A336kaT8*4S=0BknYc102jy6enJR{R&A3ADWPP;ifrC{mg!s22BIPE0`MpP1*S0 z%2EQ3mO8f`k+EaqIKI4UO_)KpUR(aM!QvZW(pWuGJ7cqcAHoP}>xCa5m=8vE%2U-+ z`immo8Lga|5<9?CG6zq?WpLs$`ar{2ncrock zeUmr0pM7f`dJL@Mi{iaF&dHW%O22AxU?v{ke-Bg>YXnsKQTnC;a6gTU7cZI)s6inD zQtkyzugB?IdG16UCxb(I$y{naZ74K8`Wk|B4XJe+scnc9^WC~;nT;#~<_z7^7e>A}B-u?{vh zloH1(f;qh~$9*1Oq9xHslBm&5&7ep>9xaYU$tl+&@iebL(gS($nG#l*15K!=y^L|} zEY3!V56YMqw@VC-hH{*Bg*X|Rsv==k8pzJtz}GC)p@@$N?$mCJeiY7?PIsd#TRZhj zO33D~2A)&_WP3%m+m7!-@-T%jf6yyg%ApAuivz(=VLcF}_bn&VyaQ;?T0e4r_ssCm zf~OG&>G{yBUy~1Gqw!*!^iC3djE03*tWS-+=*U%BH{t>ipdLd8a2CAyhkiM3Mb-Zj zvU#2Wi8d~8^(ux&82;2x4(14<{1Gg8>G39OQ(Rx|Zg$mU@phqh)wQ)Hww#QH`A>j$ z(^xTI8H@|{<+Y_HQGvs3Qz`g&>JoY6Fv6aT68BMj&$C~dpsjNZf{I3<#4_w0&B671 z=H_c+EFG4A##f?ivM%;T_Es|HTebTQ`i`?GTdruRJ*GLG0325~DP@AZ7BXpe8hDOn zQpqF*i5$$|Cm@{xTrqdh(uvsj4{P&Z$NVfUP4~LqyJ9=bYk%0Sh6;bPHA^hP=`%FN zTI;*T`5!_*iQaKaKZY27NqE>u#zhO71z6q*x?`W=|6ajdu+=C&^lM#W_q)4+xV(I^ z0Fl;*SX$#!=S;Ok^P=kyG?m~h5hdjR66XK*z#Mnto%j36>W4o+K2TT##ja7sVIj5O z`|K@YkS}zp1Brpx@^H)|*Y68FFQjhIE@+EOye002al1l&k63dRli)NKLNDsp3wgQ& zw3)Xv=@{gF-@OAC+>He3*^;OujH0JHc{$NLLs-n_h%zr?%AFAWQZ2EH{YMl?lIL^? z>?3O)o!N9JFiTIg(Vk~?o=HJER7M2D(RM9>1oMz9I!Y(Ubsf)4~72? zfI;v=dF{pHC-}$YfcfLE5AdcES-ZKKcN14uhiaCadgYUq{sEtm{{lk{Buzf*9n&)Vh=;Y1 zBpZ8{s*!mrok-2w_>1f6SVD~a@Iy{3a6-lO^;;?dEal!5dYHG|S7>-nI)+OlCN8+b zZTdLiO9>dY6wj&W?;=ApC%Vp63&Y8v)RKQ<#o5>5VR3;OknaxD-)wb^kn6{POAynT znws)nozy2M8eydP5Hj<>afT3tiJZbB21f1<=nO4>@w?MX42s0y(^!Z>$rIu^0~7b2 zSJuXn5u41{tuytmPR)-uC*Mq1h$?43^{RyhKgk^EHPc-8uA6L9qP~}&9}UborM9nG ziH>~D^E)dn(ElJ+Zs3C1j4t^ZoPM7Bc#l}SI4VQ44fJ9 zT`Nv)7+Tp>{)-DBSTXZNOsw!B_VrV}p>a)*GWnaX!`FgYZhZd{$|RwM^v_#fzLDq< zLzikXWWz<6%YPA|rnE zxz}-@+9!8+wwgp#*#@j;pm1aU;MBQ8lGGYbyWbn704&i`bH^UHs|4yA!(vV>-nnGw zScu&U|Mqq$KR#U~&+76|MP))v_<2a!F3Uq1awC8GH)w4mjG(+=EO4h*Ap$s6FSiijzg}Fk6kh z9!#5NJe4kTxWOnC7m5sz0?OwOkcG^3H2o%SYLVnZk3!g+1v%@%08AT({CnrCAZ>$q zn_t)-fiA+~*a4=91j6lEn<{K@p91*xfq!A32;tkv7cpo92R+dich zBuPC~ddTFw{10f5m3hGj&R$4e*Iv)jB_lZm)exEs!LtymtpZFswVjVVbQ!Js1)_-`s9n;g>$3O-yl|6;r5=d;l5n zt}8ds&_!+lCD^95v@K4G<$*m^4yz>#{>naD4gd`1JQ|L%5IDvJjxu+!M_h)%XB22! zhXeVfXWHaN&q;KbGG?mtzzOp^&mu#RP`2b|S2MXvG$$01SAU&HoZ96IDAtwAwqM~# z576S9FJPlX%L~KI`A$%G`}w&@<(X$_#ZDDI^Xx6Gjw-;}eorOm<4M4QZWB4F ztG>FY8BjF}#$42~XDm4x9quYyq9o)lKE1C{@UZTQYs>=nF)dz-D;f`XNze>@{IF4( zI(d*5k7R7w%qL=(z2tW!!CRrlE6y`E0vNeSb2<^1H@(f-b7Mp&#ONaC*@$Dx!9M2BMJidCdJv zS4i2?-jCJw7#ZqC^_%qO|@VF8$1*vN4UU{H{Fs!6JlL1$Q+W*zV+MxsC zPXgCuL~jN?_A@$VnOdP#tL>RH5g&XM@5Rg$%kr|yd$;?XbKCNPu{TXY^_!{Tu`Z6D zf_rzUq)ZB?`9&w6@>`i2FsWz5E2I zyg#&pgBT}50Vwol(`!pV*ixFMz3K7Vrf+V@bKqTN7Jm+Is^_lpqbXGRjx!P`T&~gJ z~AQI@%?lMfVGI0Kcp5xCG>^}V6j zO?`WH#9#M2KTd)KNb7Sw9(jH5XhqECN9B_z{2@|#>qw5jx(yj|$Bf}%HeX!GWQr{` zxrqddPwX?Tg#ew$H=eFJf>JIRR?;dGe@n2F+|$;I`1RirjHkcIM{ zMh9wrjG^X21F0fBb7CePc!MTf_7yFaD=vWw^7<|t}2ac&$NS$bF-lv5wprWMK0+G2d<>Bw%2 z#`nr?ZrV%P8vvQBOv~q?<#V&Z!RM{$>d;<2qjG8+bIAxfTFY^$uZn z#QV-}i!HTb?@1BlDexUVjOj)9{o3jKq0!3bXBF6jPmiBOfJ3Ywzrk0)`_dh|oLbd* zAmEifB0NB0R_vFwL}XJ_M>0V5+%%7Y-t=qSa?egHPSACOHso#Z0zbNV9cLeU`U@RV za)!FAK~VI$qQI1Oqx;j>m=_{8$|J((w#v;iM#wHwKRxMI-eUHCc>n}*1C_e$9Md*fp_iS!q+R!H zvH{qJ3Q_HL9-lJxj_r=i??plkDbV)1tmpMDiyr6~a&{S-kl?>CmwU`Rj;41Ko6Z;v zkX#zim_2>KW~xM5O0RCc+cG@97AhmS!O#g&4g^u_0<6uKak;P@)|fwSw1En zKyW!*Xg1)`bJz3h=Rvdc5Z!<)QS=Zi&)ep{07rRp6kmx2!GbvPR@L$((P+H3@AT;d z8Cu_b^G}x35{ zF|K!hd%Ncz+yJW5t50c$d(Arn$;$$#xRTc)WSO@(J(dKUkvK^GU*ur89mkuW@;{otg<9?Qzt$>2F-aYxUut4M_S~L8Si5 z`Sam;DTjn3%#y+(KW%}@_3$171AGF5qOO*iQYGk)J@z8BtqIE^HJ0pq&+G!G_p}=R z-b#7DXv<-3eyIVsq!FhsHx2diZzhg!GijeUSDtpO;$wBVpH(gW08E{N4roqo4hP!J z`SsrPx20dXc-}7sJu!UgMT*=7Jp|nfmbKtw6+xj0sU5ONe*5xLy$j$TlwW@utgxS? zLlC{pa*)8=F$Wj%+>H)`Iz2yYSh;5P8uu*9>7#ctwfvy{OMK-~x4}9n-n)ZEm#d^+ z)bGShAdP|O{BtaGk&eVN(t24ASC*mrr{~mHle%o$2=q>lm%5ZnPFBquAiqqG3cXth zh_7B763BI!qQDgHu+!pY#OQ&~VsxbRW4co!0(g8))PNrJnB07N{ZQSI+76Ca>Rclr z#Ool$wY5G38hLX3qz*7X2=cBEu_Ck~d?QIuzOk&1_kR-+B<5JYfyntRh3#)N9cVs= zos>hGr0X8pI)@=as?L6#m=jn&^0ZpbY}}0^Oz06U{zi*&w$|f^DeSW&!f|3-ik&u8 zQ6gkDrsB$I){*wf00~l3651RL5qdU(bGTrYHrcirP~&5KHz!@Q(3JOES&FnzZx+9_ zU*Q&$onN`dv*k2~zOpT0hVf^j&5L7@*sd{6B6}lAeS;|8zojtc`&4}R70m&!m!S@- zdL@-qfy6q89#iJZ)=r4Mb~SnXFQm1qASpy^zyhKnsQXm*6Cl9SklNnfgT(H4v_T*ns_Fe}sjR@mMxdm@bHB zw||s_{d7{-E&R8^Rg1mSb@Q9EZg*2`eAcGNG@vN0)8+17N@aB6w<}Fl{=ivLhrZ{5 zdqc*Z8ige-TR)>$TlZ*l2jxA5-scGg)Yd8z5)4WSBHqu-cGul1q|r>XPrsBqN>cAf zU7>h-9K(9nId6ii{g%}3nTx6&6Rdb`x%K&_sfmA##3dx2$OrPZjyWrNa0LJEGd=$t* zg2D>`wMPMR=O}V??vrc_6wQL!y)@$b;j`7fhu)wu+`Lb}7wTG=3MMP(_FIypn^xB{ zB?7P(d<`=2v;FJvvw>VjP8h5N@-c^wpv+!$@0+6Kbrh8VJgLalSxD*>ZY4cblVm@N z=Jq9cc*83Z9DG!OkNzAY%BWUy8cY^(xcePEVfjg(p)?A=`a+^u1q5J!lpR;{934u! zALR`nSDq()A>B_~bPfmLSv=A_=(^XN_vh7l(zHvxp?u7$HA8JuYjmQQqI=gYZT}{u zcBPB=s?oR-hyVgOgi){nX<4uoVrOL9u>1T! z!bmB2vJRjc>Dh4tU5Vdm6xb{FDO$QqH!FikXmHvfR$2LGL_yH-v{&LZ3!3n#V(86* zk~x0+ByJ@x_4&zr`$$Sp#7R0`A3C_%@{Z4Zlcp9jsP*^uA9yj5B1fx`R!aiOlqm2W zW!h@adm-KmnVo%IJMBwkjT&DGpGMIB^&W}etDKx2pSk{jdL+RG) zrEYw}`Ykd;$k?P+ft!xP4)MBHI!?;Z9J24Y|5)=a=F3t*OR`7+C8 zSKtd%OTv;U8ggU?%*YC%Ucd_Hsi*kTf@zeUqUV`z^NjYpV_pfbyX=c|Li$CrmF;|t~^ z2SF6%C{Jde6(ZS779&E zA{eW{k^i#&Kq(@{?%mUaziCB3{=lJg6E^Xc*whA~e3C>ThKV<7kHf?j^7ct1^7zL< zKfzyNj{mzTVTK2O3(^1tc}1Vo4E4q6T2Y4ai82!4JLxF|Pmn>ef_SHyw``u?&KSQm201TpDeN zKlsE@I$mlVboR97Jr?`}VyiGo52$HzpA$C;`BQ#S-U5kAWW$rc5lLB+uM0{<12cyt1wkFPFPV(e#iA3^ua~!wKK45 zP^BhtBkH?Zhg(q)9+}BOy|T2i_CY+%=*=mex-{MCV!IB$csZZ)PzI577aPm|xw-}G zuiO(9T^>UpA2>rMTm$^1@#bhqdAgZ%__SS=Xb2#s7;V?nrgS%kYfC?y2_{!T=w`LM zz2V$xY@?>C8k}eP_7cLtMv~Id%9*r+u|{a1hoLKs)v{N#F3~B-4=%HaZ2+$!U?3$c zwaBuryu_Q4pX58}w5Q1x?w_yV1Ze88oFQ-5c;A(_h;X-|DpnV%>;FM5iZ`#`>?j-s zB##r9*Y(P#49<*43TA<|69u&p%L|gDB<#CsP+o8m&g4>Y3_n^k;b`q_L_0get%(lz z9_36{B%G_#Rlt2zbg^9tq316*IuS} zsm$#k_mJ+eOR0MssY_9*+sbk)&!`&`zproyVC9Y@D^E(|Mv1PGrg7^^ull$y-=6xl zl11z#6I@m}9`SyhwCd|ur16>9!;KL7Tc?O$I!Ca3xhqNH}H&Mpz?VIpWArG zA=aU_KTg=PP1ls6^15H5B^s(Au6vIdu8UY7_o zQv3Z<+UTy6>zsXq1m!Fq{U>kTsbLBjbm)I0^5)Ad09aMq(DRkzd#bFL`%9(~po2}z z43=d3XU`S915*5$KN)L;E&qFQy>oS5uC zWQobZj0YW1aM6?o`FG8{!o+GzP@tio2zurnX2?nshnb(;8-+z(&Q5t-!4BTR`Dg~q zS=i(^4V}3|?-i3&9mH=cYYv=QM2haA1#{;sIkf;R;EClXUnAJw zf(`z`F=|31umu=drciJHBgS%MA98RS`j;QX6U}_JVY9sEk&?*Wfc$FU)k}M_9^mST z%e+obi)6u9`A)^1Ajt=FV8Y~tBFO|v#%O5;le0(YB06cYJ7zH|v^y*m5M1p&=aNdn zx}7dDFb^CNrRO&wG27H%_3N`xqY}03DfCfR)Q7F;d)v>KfHSRwBriVu{t7jtX_ zYLQMR1&}fNK^`c8pIr3TW=LGXiR zahh&w)pPB&ZBT8-`!PeYa`r#Zrf!5X-yMzou)|I*HIbHftMZui_De>Wu-$9(-*#ud zDetvpUOO#>oL&VaZimq|Vqq0**ZQLft4RxE#3Au7vQ(>;r?iu`(3qgDhvs1{z6q`s z+Q~mz@oqcqXK$T=MK{YiYMGY|zR#?B^L^Ue1|W9gu?zx1iPdLCcVpad*XAxD2xCwb zHt&77R1Uv<(_$+D(#ryp?~Gf16{qfKeutcjME)|5+~T2)&8}+Jey<|qmYmqD7Pmi; zI)A@A-Vj^8ZEe#E+98k6vHKJ;uexx3gJq{TFU{mK;bdEQq^7b|4JYB~kR`ve)a3vo+W+)L~*nwnXX zray5}FLm?jc8&aY;Jb0zdETs-B_Xh#B@vZTh-Bb^ovj64vOAZ}M?rAl%5}JEA^PI` zVcC)+@fl%JjXmTHivaC4L0V$$Y^_rZhJUZ{D8$w03=PZgw8=NDSFOw5o%b4K5;*8G z{|UOV%5{%PI*-;jtE6kkc537S@T^75z6Dur**hVnRV&xd0{EP2KTs}4PP1wqPzwMJ z*PWxQ5P<|#t(r$dm+<&d7HM&EW;c5X&Gz}1!y(dH3RgFP@IfpkZ>2)>|1#RD@6YYG z2*eJ!{Yswq&bF1s2)Ap*QcKUg{2@ul?F;p5^D?)f@xt#eFHGMTg4iD>iQP1~EmZfW z>)qXDDYm)RnUpYsYB<&T+SgU9`OWz!4u*nsMtK!l;Q9E&)b#=zG^dRQcH@{4H-wfBj5b#Pm__55P)HeL4*xgE?3OBpP&6hO;8_ zyoe@*Axo{cOpU!W*M!AG!$lBJTO4N7t3z6gxInImU$4S`_1Qkf7uEg=e{lf_4^*yQ zAZMrH|1lj_`=aS$i;)}Y1lxX;DGh9=nTd%A;Fys~kKRRuV|^HST^camw!5Vl6RHlO z+i*?-BwXMu$Dl4skh8ax!S?98UqnfRIX90w?6*2M&{z0Tgb4yX z^Q$1LSBU3=vAr}^bQF`tJ%U1ooPemIWCnC_n34X{%Hw?`Rd9lA znqT{AC=G+_jZQkm`6Ca0Qk-e|1Kfan%dj5Ju@Q&hV2)Au{(DrPV8pLPL2c+kZ4CK7OG3c6 ze-A{olgoP+tfMqy9diy46xb!;o&Be6$@ilU!=4jhi2I3r6@^9uCrLzFh`D?0l&O#6 zql4HnG$o8yfjtw(rY=l{*j}3Yi!f6Obu>H`RSuJS#r_|$Hy{*m-avT*ti36y>k^5G z48;D3m($ZKavL>_#FmVRF@;(1M_*4ug!I>Ocke$=?86G=YVZOA_*jFt)?LL%}6*>1X)f zx=vn-2NpiGtUW7qy%$lJzmbT3khp8MLFh66a>NhwAr-}&q&jAfmLsVKoSDP^=&_W55q%=~LA=hDxCk;mUWrnBMYnhF1hm+J@l z=&vPbbffSnyjtg>I`F<1LH?ha+76Ipg099iUbKPj8w3Jjx|0M4U+J+N(V5&=^QS&@ z<4)l;Uuj7KM)9|uISt#h=(3}f(msE2Sf{@CBbQM$IhhL4*DRuaczDGT89#CRC<12S z9XxWecIBSJb9i5-a~mTGc?l?0_d(Wdj(ZAcNYM{`4iuUT^{p{qaA?h`be|(iIuH#u zCU32~GB%aac{L@sk#V6dOb6ApPW>N7QhZf-HcW|fC4?NVn5C>nI93qlCD8nemI-{~atIX?mxxx$e1E%Gzw7q1v7+DCa8uL`QCHDC1cyFvL>O{%Im&j6DBVwZD83 zqZ|BAiiDthJXG?M3_*v+T~&WPS7qhco6hdDB392IUtV5v+Zz2spq^x2%HJ!~5Zr7K zCyKAozYf&ddbjXY{*i3Ix~|ws-TpWyRPC-PWg+Cu7gs)Z9h5 zE8j_dmHATCPY`*G9!JcnJ6Nk;eQIo=0yvNL=ixjsgiT`hy#3}#D8ye1S_f)^yJjdq zDlJ!}%Dh#TTg{S>{I)x?#_k&0m)tFYYyVCdAMFrQBzWC?ImhWpkEtcSKa?E$uWf?+ zRbo4$(GoYPo@=LS>3cSf3$!;)2G(LJZ}O1;C(yJ<&n0O9tOO&T_huhsdH6y6&_HO` z+bzGnOXE8yR@dvO&Rr<*TTs~;T%RSUYH((BT}hJJ#P>b2{rNtu_Q>NvJ#|{p_%ihU zLo`gKN-f>$!aMWevm`nl1UJ|a_I_2V&Clat+OL>02LS#L}(uHN5eT-ZaDfzBfDn(dVBEm75S22)3xH+2NqJvs?~V#FDJhD<~2PuA;mjU z{dAthVx1hECtZE{Ls;+|#;t&`{(@~Z;fIfZ76{^?I*vcdsiOz4SwB2DbxqjI;v9`B zw@+`Jc@e~`!8M^Qp0~%NlA~mfV52{32U4Y4vL1{o9mJ7-+?klytoZrr);eG9Lm$Kl z1RXfqd=>=N&aP}RyjbpVW&}7=lj`}Bk!@;_=n}9&SuiC7|z%IISg&_!FgaHt!@i91@ z6{P%cC|a6ou%&jZI&P&NkoMEJYWd4TVv<|7v}VqDTx4rsiMt^!oS6J(y)Y>2<0vcs z`5Q?FFgB;bAuBp|LrRey2`8n5!XO(k1<%ec&b9$RLNBeOE#2g+y3#vrtVZy+uOP(S zs;J$RG?C}W>JYzm7gTxEQ18a5Klm49DprTd+reut;(l-=0r9aEDikeS{UQAjZRf)b zG!BPPwEy!iTX?sl$#pXWx4ZZ)Ei1wzFxFkK??qli7q4yJ2#kx1?Bc3F(2jh}?|kbUpQ zE7f8rKfaoRp3|^nyCNA8D+bw;{r|-7k!(q>F#`(vQ@7<>AY$x@N+T9{3Zs$JGZ&V@ z;9Rp(ngUFY#K{&7!-U~~i9YLO`Ntsn2O+;XLlsbKziL!!7p)0#uH;>4a3ktI(``@5 zC3&+c<_yAgGKO~Z3tgiPQFKWis}TkxUkTyufy0o~sz-tXLoKw@zoHyl$l?8QNhAx% z0&4Am`+?Y!iYc|0?n>4QkNKE$EAVwOE5X}K7JIcY#6ab2&#nPbHyu-u2TqnDb= zQewZR%laInph&NnKrG1of}_d#ONYf_C-)lB*Me3$!J|6zDE@PJaRRu|xnIz01{a&= zR3C9NIaVU^c#SmsYUP{cCkW`wU+{)w&4YXN$ogNvvlZM{{=3&N^ph3>KHZ^mQ{-NS zq;thC=d&DqI2~09hqMVKLrukrrFS8_->|*0Joc(dFp5Rmy`B&*cjcG$sJo9R1Lgm4 zJmo$=rf4ZPw=xAeH-gzJ_U$lDDmN%&_9QyO~6;E5AH&$%42gFeL&FgbM*q zW;^6-(<}bWdc}rvpP1>psTa8c)hn%Y4=7GF0#SI7Q8eK;5p|zC)U?9gA$Ad4$3~@o zu>}{P+@?xMWg^XW&v(TJ-rEBS?RLd6O8vbN#XxiNvKIbR)kKV2aPE6zhv!zV2@fR) zXX(2W)yz=NDRmA=mPFR~l}EC9o@;=xnymA0#k&{JYoMy{OVm9B6(6a`#e zCmiA?NQ;L{&%F^G%5D}yn?qAA{D-jGg=V!10||oSe+LfGz}g+(|DVDEMF{d^qB=x~ z<(PIFVhOtuoK{sRjYh7aWAA=UfhNTA1aD~`#WW{~<(km+OkJ8!-5%vJJO2?|H_g>c zjEz44LQb{D2L8!5QXm#X;IPtpB&~?N?%@CTb@PS{a-sliu>^46Z`%@?8f)RkX@chU zyAW4StSe8rdtk~Aqet8^*vyZXEnAvP@Gv`M&#q>B{GIAV;zUcaXb!lPAlZBeOj1d1 z3JSl0!b5kMDd#^a0h!DzUbb%GSV}Ph^>w5yFs?;tdka@@6!&$k`{y`L*sk`b z;A|L^g=qwCj{h!nQz8F9P3Q{`uHB0v;m1Xj_GEmnVIdW|OCy_%nl)+jd7EcJ&||>1 zWyNRpvYE_Y4a_`m>kU67bO=4WDR35z9E=D4nWKa=v*aL%kME$8lL1({f>zo;-WMFL zR)`7WtAh(x5Ua;7co9&70?4NRcV-Ff#)seO);!Qh<1tBUe-e-$#U}(m`eS*TKjCRH z+*!j4s3dZs8#pvc#&zp2I#-TSG_yt^PziibFH}VMS9tCOW=AFSL#;! z%Cx+Krp5eTi)zN+J%8tA%C4q!^S%}~^4dFf>KpQdyXD?fXH%(tt4B}lo%WOS!3t+_ z05GF6)hZ5-_}@pI!gbJ%PnVeicccg3%Rq16Usfg29b@;)qi+2c<-Ko7&SlJd*(1&r z=+dvZaT^3SZ*6Rt6bJe7uKXP#<88lN6eL=7+~0SiKEGO899!~V-U~=u?BJ@t*(F$g zT)r4N-ws2LT!1Dvi?$wt^7O-&;ZU)Mcfb0)R{`{jzG=XP}h9XLexg$@WfqpVeqi&Deu{lTjtM zjXSp=9>kYh7J1Bncdm`MQLEnF8H*g;zEbAcBQT10iLT(39x%$hur8UxZHGuE zK?mCII$_|z1~|Y7FZ-{}au2UKLdsUDv%53M8a>2`Jvj8NYPXIz`=I~u2HVCPX5Ud= z#fe{^Lh44%=4A_;wr*snr{u=UO;3MvqLUK(Oyw@L`@_qbm@P+VdY**}J-Ad>Y&8}# zCVIQ&N7^li)U?IY)#fm4wcOShBo+qM66lQWq^&;%GJ1rM0vVBjj1IT-5RE9MDm{6w z-fYQfk*^+aW?z{es0e4?3L2^C=K-YKd%c9Zes61tgLwN=V9kwn*CX?|?V93mu7}v% zR7dWzZNKc_7-4IKZqos4C4K-AVCUslGy!5#2M<}`LA(~t1(K1SRrQg0{2u$6_DPtruZEovuZ(O+xKKgQZkiy$C?ug`EiC8T;0 zoB#Wvx2S4!2nFD5)KHwmb1w@Ug4%t1a1r+8dA+~y0~6XGNTvn(qF z;my%sflM*d^DSNa@tr?l?S$48^tQVIICDw+!2blY{yi$35Np3EJH}lCzET|~d0;&v2? z2wg8tCX8Lq9jN}TM=rO3WYCAS6N09vp;x(b?1G5?;yH%>bzn(n`Pkv11T+38M0TB9 zAb8KN)E+P7%)h1^f0QHz#8G9?Z4y?My&Me9;hKOVo0KzEytnXOx$XhAIul&KR1Jy6 zQQ!+jeDnT!b_rT=H9^t#C|qUn6k0T)s<)tyh|Lw@pOe-xdrmw%`g&S~Stmisz>8(zT`P-1<{Jtw^A0 zSDBdHNO5ve!+$yS9Sm--{&i57)gP_46`iNSS3tZ(w-@3r`42!sXBxkpqFsPpv{))? z*MgfHT5Hhuy|gq)K^I;?{TO z`*^RlnMwD%ZWvs<&Mjz?M=4a@`EsH6W??k6uM#6aNf^ppD->dRyfFan#sU}PUB1B$ z6N2)IWtue4EjyAE(B6W^uQJXmSa;oM;xd{(fQVfFe-n8*9cJo+SbJOYy&;wd=-SDq z8Ra9v9_4)^o@{k*SnxNL!HndShBR(8l1*?{2ftZ?GmjW7S< ziGDxvYJdfgcUO;DiA-Y(Mzx~wduxdnjUuYmTAc-E{EtrvIWk~&fdUX^v$v3x#zBD^~D{Hgywzby~fDo zfBDNm0W{E3fqgT=#P^NSjz@BWg`mI=uB94f|Ew4lwxcAo?YM{upZTC6~eYp;hQN|p~uKFx? z@MbN*ZQ3orK2iwP10(1A+iCH4O$$IE2{iRt?MR>Z8DSbEm)Zt02{+OdPg=Sfc;ePT z3;OWwtNZDxuv%OT?jv@m!d7n!xmJ4&LZeuOID*^~f>@lX-8|!*BPjm_kbh@Ji)OJL z?3UH%VrNy}yCJ7L-vw}TkkdVa3wPPSBiEOopUpxLB3cRsg920D5$+@b%i5HQ6FLpW zCvk{py-&xYyn=W?th{fr-{l)U-Dc$o%RG62!txf}mvTzdT&Whho5n>oeNLy{#BSm( z(U6cPvR#!zc$RHz;pYL@vbY7|Z8!Pvo@-?R$|nS4J4g4uhg27Kkgw63W&uF}6MB#S z%R{iDMC)H0FFUjJ$#M^UFEsTR_oVdImll%rUm$!=O%v%233{;E3S4Gfdv^A8!N&#b zF3+aJl_)QuY9)V2KNyIXsU7er(rwA{nJ7@9JeCSQBn2y2FZ%Tc2PNBX=3Z56df!^(=eas4Zl!SUc$G(Lv)z`~!v1hE|@%{qEL9`e(zX+ zOu4sILl~A4O;F72;R2hIvC~te&PYnK3dd-kc7D9=MQ|!_UczNPx<>|Y=s2buSPKpI zFF+yFFKMb$Q?k3>pyJCqUkWK9fdE;6C2{-imbVllvthLv)X{3r;k6SYPSWV8wb(&* z0zk4C0J@4(eq>2=`vRQL&#sGHM%f_%!&j24s{avZe>sl9dhiAXs?g2gfr>Vk+2#Z^ z@8$XOX~B4LhXmx(k*0kk0kso)*@X3n_HN;|H+FhTuP{=Q?82F}X<>Q82nk4AXyV{cG8p6xOUq6sZ#m!!F^QW zI!ZM_;_+Z~?YHiB-2_PaMldPj4VdhoxkGqM00QB z(R&Y9Xm%a_4=7rerx6RaIgvo34`k|)OFp8Qb`eG>zW*Exm|;kR3gF8%RQm~$UV5E7 ztjQo*@#hDv(TYsg^_`G71bo~92K?z4@~SNg^U%*rok zX~uIv4}JTJGw9!_B7(9JhmBCoka2TOyKsbdKMHZi?T(X3!@WP*hSjJ5jchfvMc@Bx z@5{rfUcbJx+ht3Ml-NPI_}#5V7!Ero;{Bq0sChWd^;8x**m6I* zvQgEvb?uXsA6NilP`_O^i@F1cjMI&6elvW&9ftB$4r(0w6nA~{kJ*OP zp?fJ8x#JugIk8iYmcA60kjt2$^3T}scVGSWZ2#vI=WXGX>5JF1xBeO(qRY>$<4@pu zThU>68hHWTUZvK6i6`PKfABF!`or^WdG~8UT%-3&8&IcVQpH%WVOJ*L6i*D3fy>Eu z3EHD8=lc)LzrBi!p5>8;0OLq0836pC_KkN1mr%Gcb^Htm8ZOq_ z8L#X#eD}8hgV7o3le2C!ThBz$#&n6-{B_M_ zxit}SGTI@jvRhlFP=UygU`+aVaM3pfIZ!B%uCdBjMgVkJQSnwt`!W+`IjNKIliHb)R%5Fsm8l zJbN0NF8$sASBnz0!PmZlS6Gp-KSi~v9REIwqy#LNI0@^SF-aWV09zyOz-3?HbEy6k zURS`A{s!8yd|iO0+vLEYOd%HgHenLwJz7q}!AAH+@>7S||G{tJWhy2i5+kx`dOitL zZ-e|Kt^O-OK5oy>A99p{uqmdVeO2~IwUUy4!L7`ce;LpnrM_l#Zc0EAH8C)00`)C_O$S(qQYs*@Yw6=y@JySCWx z>G}gtiXPu}k;Y&E-cCXA`}bTIRwN8u(OcvHvKSfyxH-f7wxGc+Pb#JG18he+D{m3x zGUn+cGrm{?kh@*f&EM#tyU9!osz(*)2GeLR&o{-6>4=uh1SEQ@~8~f8}t4Ld<`= zPuPF%iwAJAPiFn0aNxu1M>39YbTR-=ZbPM`5Y&4}d2VtpDF4%Aa~`dcR)9Hv##esc zpN;born)zj51D@LHw~B36mdQ;EWe)xKVjCrnkdbwgvH0axgH)qp#gk%V8>84YCb;Y z(-fZT(3=fblq9>x%$E&Ec@)?3sD9qBHPQrZuEaCdukQPM?sLwOKtAv(@)LQ?Ds5Zdnn(v#g`p#aQ?>n{kqe*fL z9C*=LE9@qhb~k3F5vrlrP4(GsX|{DKi{y2`j#F}K*MBmajf}J>$b&qp;-oxPNM}$$Zi#xjjZVrM`P?(eE_*VBtrnAld9pDw;T^6Z!t}mP1AOPFXd$~T|R8>fRf23`5 zjxi|`e6I$D_6TI)o!eo**|(&WH3I$Jr0!&2d)ry-YP9E!7 zdw54fhC^@1!7xwD4(;6BJ~xRT<*|UO-ly*!UJdrSZOT<`X*%uscB21$caqPS8Sx{p zVfA(0@Wn`;-u~Wb-ALwlWPj5BSLzC1KYt3kQr(wsRTkUweAy;deuD1@c>hg>UOI3e z4O-T`J`LEij^fd3)H)mjw#{d7rxz(qFqcyV*$6<|dGSae^Sa(9lI<{P5*)cy*zipT z_nFAVd(SwP=e|4#wW9reSKM7XeUR2>PxhxgAf#x09hFBL z+xA!@X+e{JaTxCQIkT&b4z43v3E?3dyLyp>P?NzgEm_9wE=Jw%JL#_{adG@Y> z8z#ZA99orwW>mE#Jr$672V+U2>Uy4IQah`)Yf2W>`b&lfoCv84%!n~(CirpF`)B)W zNruarPc=2!M=4Hk3^pp5F@@eAJo%NG+=yeCcA3ZUyJb_Ur%1ecV@N9BV}ye)@ z?wmO09M#Bv8`{+62kisZ=}IxmaqFVPSXSJ7;XxL)|Ly*SLrBvsU_;uki!?4U+FTaf z9Tt9ue)tMp2(`!?QprlmjSg#$vdaS;vhwFzo4mu*q)FW83h#d4h0Dk2GUKOW-IOI3 zZ&J_Ogf|vQg!H;@Gr3NX{O85av}L6cF#p2s$$QrGUVD_yEXLhViLRQm=A4FIE^1+U z@sA_R`;_<9F^BUwRe0aYRe4nxC4Lgz%Cy>%V5at-aXEeKmBBcP?tFDknjy@8D_0*u z6J@-z%jn=9fA7;c4kQiyrAa2%01P;nc&!RIrpj1fWn+(1yTqPfF zyG#mWZP;oybamg$nGlT?nJBVzD{BR6AkLEbObRWQBJ-v+qI;ORY#Oxz zzJXJgr(YAnTj+5Yr69*IuMjudGSUR7lBZ45eO^&c998(_*#Lv|Absf31n}a%NAP%2 zS!TYz=^K-iVhN`uuV?_Av0uhrH(6ZilJ>Q&cXqsR?Ok1|m+XM&9R{8JCSG(XeBWv< zl`C-Z`~*y-z;vIv3|?5j7VB|zFCjvU3M5IwpjEwd-rIqs;+fDahI{&zkvy6}l1KNF z>w~Ow%Xj_&-NS5|@m|`h_&~%mgYj&sb0bp6MXz7}))u{wq``8Ux7nKCM-FRPPi=Jq z!~y`$MCM*a5`(^n!S`j})8RqeFozAJb}ip>5DV0JV}|IO$R5(AuA2A|)Jv$&PAMh; zfQ4HaMF*vn=-Ny9!pZhJiKqFc9e62iF!_SJ*4x7%G{*c%XHB#uBcPo}jK}c0oCkUM z2_6noaG3rN5I*lfwHBN`*Knh3cz8HhJd{s3L>d9D8MSVR4)y zR!?$+c-%bCOp+#hkMHrvM(wip^~0gC;|~$reuH%ADOJq#m#TB2jF-e<>P0zkvNaX( z+cx=1ZoErB1x=PeNC{+3#8geTx_ksVhBN?9?HbZIAWz!hqKm^@e1l$9=uJK$dE+v82t16Rq>+;Reiiws*JM zGj{#o!a%(V7uu#~-B5h_GIhdi_xEa{$knayE@OF6`?6jZFMk&I?3l=9>)>7!U{$zF zfK|!k!X_1e`jEl57Ru>j!zoeRC~YHp5ZP-_z@2*Qc=R9vxk#Kz!T+rvJylhKxT={C zJO8N(P>L@WTe-7X!sdstQ-x<@|2W;7e^*e2#KbRm&F7*!wxwK`KB8f>?moP1U&bBxNzVA>2ATsb*scN*j11zx9|bSC)Xn_a{#KI|8_^Mt;@=|D&8!gHx{V40iln5m#snKPY~=n)x7oDdG-?I#b4M zLipyrjDq+FZrQE-BQCX)qDy)LD{srhDfHIOBAs%z28e3ONYSMm z7lfF1jFL4FNS1nnjYP@i6V-SOHt{7;c4%NQYYMYa!vBR^y{ zkKGYQ@!Kim^^O$CY+d8(!N&}?T(5_@1XQNr@bgPAstK}a;+j3DXou#JgJWO4ocQ=T zddTUwPMJjKm;KnOR^q}8JF{U`9unm^E!*8lY1|!1B(l!5J|v-LF6oEcxj^#^x1n1R zjZ50q2ai>S#HMx_zcKhdgELUgJb3h&g3(G}&PG7tTsr!ERX^_>zLYzBsq_UB;w~NE zNovoB^}`_N1& z6X6sOqp~pNa+YtM<78qI!SG+1L7VM(XWUF+sVP@2pb3j*s|n${O&C)_dG=m-4Vj z*Bu2qk0kUq_Ie&nD_d7zQ}&MBYYie7DSWP()4^TxRosD#+%Ko{XFDkh4|T}*4T5vJ z%OxZAgu5zcNHM?oz3Yh56g#Fq^J)ufzAi@e^4&XoR0vm#j8S`2-!zbVVr=zzEs?J% z-LrtM|D|(l?xeaJH>O;tWAR04pXbOGJDIo9n0ZY$B+|FAu~@lGb(OD( zzqLVjcp-_Ca8Es&=y+RZF|`vetfBAX<%QcIt<^UhbObnJCXiEPN6uR(J`rK}TanUs zn&yYZTe?gJ6*8{mm*I23KdTGF0JWC`s zD|H(rv#k>x8Cli+G4a%4t|9O*FGB9n8P%_!R6~HX*^W9DlDMU{3faP!t+)Ho z=fIU8*IJg<#y(q-J6xicU=>%@G3V=tIY;yKM<+dt3VnsU!psKW4WpIsH|J|Z1FAkg zJJ)i!XSZh5sI%onIQ|GIM}<4@+)T5;Fh>+#3Pnut)xcWJ z@Ogl9o;xafCk_-N94HQ5)wgA=$|5gETS@8>2=yUN^SiUHSvzxBP}z90)yTizne z{9NNTw$-)rQd3o%jO`T7oKNAs)R2`cGM(yn%!^a{(wB3BK3OBesS#*26NB64@D~s6 zH(i@-Q`RtA-k>UDS99&~BV(~I*kpAlq4H<2E$cxp$7qurzhr=cSLiurIEfzB$eI-u zGUbx?mAm0^t$No;jmhpb8Siz{i zS57O=6wzZAGso756zA^_Q=VMVcf(QVaEH_K{5?wa{FauT%j`TWlHCWVF*A*9G@y_M zppfcJMK%6l5l(?`c`h?xV;THm+HwaQ@s)_b7|V8GekY+rB@|-j8@|SrZi?xSmnO>p z!!p6qnx&$v^R_}mn=UE3w|5DozrJF*1NAaLjy&Xw$MkjA*JNy~vd)797zk)dh1)&n z$vsGTI=*b%%@(vV=iSGUtaBZLcFEbiipGTFW8v`Q5WG`c<9fN|NP&C^N>#D!a)#fO zn({HL?faohjU10?sCGS#gAIBZ{qM8^aP%i0avY#a*mx`U)y-e!%d=G9|9brltLaR! zeOr%eNQUU%Y%6p?8fJ|&Il80%b03U)_}{F{b{DeDQj3z}DHcU`l=*>MHv@{v3L9>@ z+YTxQcX+sc*$;~2U0@U3U82CRk!OTivDALsm&Zj9mo!~)RNN}=nDUkws()j~Awiv+ z3m)Ew9g8#5Jm4bpxc3x%Pj0i1G%ToTL^K++4r)iJc%0LTFkg%SdK|6kl^x(-QYJY2 zU9f6fHQ>V7VX-oeR%rOMU)aJnp6&Mv%7^nox`8eq}GvvKt-aw@0L23Uvsw!J1$k{b4%s(+j+nI+m zWJ!YO*kMB8TNSlj}y)HY8FF@gqpb&`tgIeN?BH1EVz1w-29_(rYmDBu?EPcFL-PKwc-JVXmeb)Cni5>zE_A8^&QMHaz z!%Kj4_q>~$58>#LaUXhLwfbM%z8mH+AFLAnXf!7UegJJg+vs;IyI2*_LK?mVy|(Y> zM02&5TZr8QJ_z=bUTjm@d8g_$+ha?e#I`C@?uPjR2HlCoJ;S%1%MaSX#J;_B%6KFo zAs#EL&1MT>Ohx}!PPYa+hBub@I3x6B6lx~XLJNOrA=EoJA|>dzuFGR5^+{2a+y|4Q z%1>7;=RzLn57rx1^lU6vG?^92LkuwI*jbJwr0tHYoW854iU}(KK0uz`8x~vFs0Zkx4hmB3de8*8_$=2DB7?f$2Mt-GOAo zB$6Vyr{*P6V_}raV6uyF~r5^v3+JEkU4vM zd!RD|&yVrV{T?mfkBo%!3+tqH(ORAz<}Rx%zn#408XnY&mgn)AhSzC7yuJi@CPIQy z9!U(?126M9jDRA3Z-5)wR-^^{dDw#y>?6q-FG66CuwMglbnIbv%%IqIzEdlju_7U*;ROAV7qRfHTwI|)|dz-S8cIKaW znZAlgVYP;z;9RNfzH?4aPSjoz;E9N!OZLht*^wMvl!SQM01!nH>Ko4Q$%YCm0xiRl z7INxC317I^Tz}Ul#J1_4Li?(kPiN+?Y9%BHOSh+@EmRMcIrRQz?Vw9f!ybM3jDH1k3p*H_199&sG)?-GX*cOEq$iV$r*GB`5WD+L1QKRomT%gy_v3)>SN zdLN+%&<>GH0UJye52;qS`O}8gbw|p0 ze5SxhPd&t0)jT>5S2+s}USY>sD`ewsOjT!%2yx}sbjpuS?yy{~>NOHt8RGe+&rxvj zif2Lp@;Iq6zb;GT+~s|4>ZT;-Dxwv5T4@F1tGboF5*{6cA)bMcvSXUhju;E6NPfQJ zY2P_$+2BTB78c_9_PT3gl(fGw}s7}GVD zTTIJ=b{H|(@aCv@F68e^b#N%zRX_M=u&bPLM8}yw4^8gJ->XCZ;F#x~cMBgSCb0L$ zFP1ab|NEPtU~#YSNdMhE4H={^XKOWXH%{+H&5qx51v;t+Zh|lpqM3A{ZJp2xyUPur zIK6KeEMYY5v#jgK*6S_E|2qv`9`)+OZ+R1oxo1kA2Sui8+Hg7Ve?1fKQ(+MsR>^DS z1zQ^51oOqjJ*Bsg(%u;W z3faAT;~g9WnI>ulfr#}WxV*_`57ET6V)`+W(tGWXWTgXazii_{dHBc8=LuJC_}t4T zdquK$WQ0db3-cBjzY*@yo|Aq6#270?w1KVz0RL`zMp$C|vsb=Zmk~}kc44I|UO@@@ z0WHgwcQEal2GRxFarhN%J0Gew@8^ahIzNc;p7dtCot=TARY$}{3y-^HDoKr0yzeGH zEx{lSZE@nXFbUDU6tiYUrm)dybq>5wJ*t=NENx%_OTuLD2i`q>(sDHQQdm_Ffk)C{DI_1S=fCoN0tsr$O5R`7*mCl>_R_1@AaD z>e|hiT*2|6RQ86&8OJb#}}@urB;_wwfoqdkzKQ0 zrVY04$!x=uF9o_><1e)HELw?A}^G8+jG0d!JZQwkv}fwV-^T2#nZU#a^6DvRnQZb?jaIB8S#E^o5$u~*UcrKpAC zZrjJS33p^#`AtlH8S$_lM#4+mHT-6ZXrBwcKKr)wA3g1f>Vmi0CD-lCeJ=T6Bj+mQjK4%;Vbs9|yVX_5eUbi} zH{L8|s_j%d%A*RsfKxRy0!KK@FMe;r>&T(bpN zp}TR)=Y;sM@1E{XZ-0>-<0q_;^gd%$fGNPE!HKiLhR7i3?CO8NtVR#|r~2ZI7q_+O zAVF002tV0$fUXeAWQ!7FeaK83(j?G~B^nS?h51n!)}67tGh;$_fBu1y%; zc{Wh?aTAH{!}f)i1gwr^;*Axt9kA!?a5~uXpQ$8if7Cbv|HxTA8M(I-u*Fhh1t(A7 zAnwLC{BEZ4+EU2Ef|r zbMr_60n5Wu*`{LT24x59MT0PiR4j53#xwdCp*we`F#Ue>J$~Ikkn@^*^9&}?#j8QH z*0-AfONqUw=%yIm^-dC;mBTd%#Di**k0UENRKy51kHCDI=`_+s$f+Af?eM5@oo|i1}+5*;)Bp@%}a_u zL)!H4`jxWQ+&-7dPCar>2oB~BtnmI_ibU9WV+|v3Mt&e9WMHa)jPe0tlWc1f)a2}& zBsN{wxnX#!hX^GfFd-bjgFSvxL~=Awz#&}|XC#^nUgq7S1KsOSg4snX-fOIj!1(_s z;sq?;9|PH-^}fEU8(XwJHxTgbaHn;`u%KwuiN7Mabc*O1V=Ql$2rjZ%8JN?y!a*#!GCfElV^acu(i0Jc+c`1y&5gfTD|N6f4R*mH!i*pIse4t(T1^^muV zT;%13EjOp`!2O@o-2;9gLBbposMp3t0fcJwkl=Z)A(d57J##Xd7I2Nb9YyQ)h_d zE0-D8NMD+S$(6W#k%ze9KbQi@5u=OOD{hgTxP2xb&DDd^g0{pO_iDCV@M<_tU0na0FiSR5y#dxFsg zZFiVYi6(ZX#(GU;Fd$fGe#!eXn^nl{*RD1DkG9A!jNO0bL0}hxMmT=iCxkLq;^U{P zYfGsIaC{VVo!f&mc|X?S!O0G?<5`ir@WUx?)*uds^H`NlZMzbj30_1yI#e7)c~Ci~ ztM(Ax#3+Nvot?oBx?prVc8|{f7B*o0iX}k$e>pbZYcMSWGmc&b2oB54jo19fEA$%% zkX8jnofxpivh+8}jfX@hO=k<#j|d^?w?C32;s1{fmDeBnA+zgF(D0|XMWhTf3cH?Z ze^x%CjN?qkxwGnJe7#-P`iWC#zjHeo3cjjVf@TpFTTcpDtC^deBTPnXut)++bw=5n zX$v`4?5c7Jb;E--6b9H8duK!~zK% ze^n5%xLQj|E~EN>_ug{bQnq!Q`N^Ge(L{nw(X{ z^l?%>%KYvI=Gyq9DO=Svg;dO2<}_4 z^3J2vGmDT1w&viT0c3-KE6#pG_hqLFEg8#F;f((3?OFYWyBl)6>Mll1g|Mk?KC5sD z%DdfIE0p&q4JsH#$gv2cA(*acnNhDS6m{QR{(Yr(;?_9B z^1j*r<&9;`O2? zP1-EP)L4~`OC_b+34&8zy>^)|#zjZ$r^4>OMMHEYa0H#Hx5^ttWhAZq>Rqkt1d$8> z{!A#+JmMWSqcUnNWEyRicsp1BHrD#?m%aedDXWQcBc`_lJJcz9Bb&PrL78N0}bY2VOO?yq{e zlLRRy8vV zW3!FL?udLExk21sa$ioz^-HVs3#==zKbf(02VeTb35Q)d{p(^(o)WhANYhHoz=o}Q^M05PdTXF%wBT*EUa0gM0oxR8n*bxsy!sB z?_5^fnR8rBuu8GrV@jc)5dX?Vg(uOKnX9B5Jkx{U%sxpUcOrt~L0ERj2Aieut}iMp zPe|y6%MDsF?^{R37>?#tUz|hv;jR31UucJLq0_$4I#iIH-3ak);q;%*CYb*Yh_9}L z@Kj%~(wWZj7J52dYA!$fptZt%*JE~y=Q-?cv9#A~zvnoF1wdo}N_>FS;pRr8OZ(wC z059g@BO8y72(^D4VoCddi;Ir)`H_Q;kT=O(FTAAK`RAA5kbZ^MzqwfW;SqkAG1D7%;ZN9c7qV0gL)I*k21&zL`$1~*8?PFg#WtJ4ba8Tej0(5p zM#adt)Rh<#Vm>C>ho4-OHn$jh|LVpw@qdBU0Y!m4o0Q7iJDb>wK=uX!f4L6v+U`d? zEpSdn=K=F%f%--4YmHAxll>>a&tDtS4w1aDyi|UblO-PsZAa>GG-{2Z(BBi>8U_E` z{9)1CMAT`uOZ0b_$?twTy#wZMw!9y*E$&VKmEmh*5Tf-QtoJ~&SXR*F;Wo5eybuJ= z9^;*aJv!Y`7y%j+NYvpC8e%>_oy>nH1wYMNkijGNIOX5V%g-kvVAbfTJb*pzhd6{( z*zYE2jNsM67{O172_bz4cl*CP>3{i>Q;1DK|L;8c4N$%xCP?`Qii|rZcbrc!C5P&N zu-PL`0#L1-&uvoLSiG#_QBiA{9a) zhIZ+%CIWhF79vJ~&LkmF2enE|l?NNHl{mtOolX!)yb>kzz&nYQA9me|wb;?@v~jXe zckm}DSTQ*o>+af^kH432S4ypA&X@O`gcN#r(>>P%edU^2sh0(%D7sh_#SLN;PyV!U z$5Ea`D;ad@^|H6zBW~ox?`=;7GWbQJxvzU))SP{pvl2Ta6OE!P-hrb|!m|XldhAJ9 zNp6YaB6T=90kkpbCxsvZABCw>Z6@ zmHlu8Y~S5-d+uIT_40i0>2xJ?{Kn?df)zP)?cG~uZSVPF(INWsXdc+VTTz=f2q%DZ zXej}O#Je?iwW3_}UitM$H0BtLb7V0vtB((0`u-BVAk+p~j`DpI1T;G{UNM$`{&a4Ec58pUm&bmgWG*RZ z;luHT8fsBZq8rEO1J6XgYT*Rd-)9?4>rQZqlo%2=lishfV{9UtEwXE$Gx|h&4{4?` zUGof>-8p ze2AV+WQ&InyrST?F5k1|VD)UVXer@gdbkCIS{4j^)O7DcW42RJFb zJR- z#zy<~3fdPuD<55y3Z(Ii`&K>OhsxK?oWQYX=$_R@p|sJBh4D&)vKG%B*7TM?4k)Nl zk#w@S;jJ=G!?c_;pGlWgi;6yOVfeeNOxSf_yzV2x2!?(t8FJs1V+E_nuW-~#$+5gr z7N;akIMETWw0zrEA-1EcrSD|1P0gJPz#wyRhQ67*B(qZA^p#6W1j(EPS2;2rcQS>i zsP=CwydIyHJJx;Q^;L7IoSs74`BLAEV-d^tJt#NO3%`O8F|Rsd;vrQ;Zu`qq{!L+# zy>rdX%M7^>i6LHe0lue!hF&3UI%0>0eoJm6T=E59AHGxp7HZi0Kh4?S*e#-=q5g@) z6S^AL$5H&dcb!2H;$Oorz(2Z97>)^^{aJi~aR$Z+o6XQH5#RqOZr|U)zu)oJzpmDP z=hpRRkt`<=Ao`F?`0CrQi)-9)EcI#^Q~BN#+KNjXW%$@4^5ayCCA7Vbi%Z?JVUG0W zJk;Uku*b2Jy=VbHK`-F?onS`CQIMx8%FV&?41ZHzvanJuk0d_@o-V3lyPp(NngwQl zq#dTs`Ih{reiB?Aowi&JxMs9_{k#sbZCH_{8Eu&8og_k)c51n4FSK;Flr;b9yjf__ ze%+JR>;@&c=^;zEi}8!;oB`8>KA4z6^Xjv&KJ^J`yd{Ig)~{={59CL>A*(Z49+A9B zgdFC4NWt%Hp!iPSI-i>$@%Uu|8Dx^0IPbUq0}YDSzatzWd}nCH1pb+Z+ZsVIsWQr7 z+@F2!<4tn-1q6=IMFi`I+kq$lN6|#6r@zA`z^MG+442%TOb6rq73bQ^MD?UB*bmx% zOGV_w^Uo5WtB;j3Ps~X{WN8@N`?U2PBUHtk{vb2*+PKkL_8@$NWt$M)-b}6CVZiVkVxZ}q5Sz% zX*(*R+e~8qcbRl zQR53I<{&mbyFyr=vk&a2$KU{pj{RC)-FuhhMxhn~Y7m%8_|5r^bk~-5VW+C6?ZsK< z#1!OZv4{gj?v7IPz}UZpUtCurrM_^sn-0Nt0Rwdb7$|MLX6YhoKHGMs`Y$~x&;Dwj z0~A9c_v80``+t&r{-E0ja^?Y+B@W1cyys_NFHZ$u8QuHf58nNR)VJfK^dahALcDbA zz;Yuz3UX-R=p>YaG$J>`K3_N7A^eMM{3qa$t%&?sB1a1rXa`^0HjdoCIIrXc5X;f$ znpz8J`Yn*1U`$s+_D~zFvAtTw%HI~|_e`!Ifo?2Um8=yZ`Tz5^lwkr3_vssub#ijT zxrzRk5gw@xFx8DgoSbG|DJBG-LR)aTo-Dc#M)02@?q88dOr)ugBBwvtlzTP~p-w?` zz53c|OmJbSULcpv2Zq1e_j;;(%^I8#5Wnfvt|B?!Qye>ceV#~;KR>xW_}uyFTtXr% zUZr1FTu>*YBt9!NbkXWlGMS-~ch1jkYkm>b{mlFG6WzJac3t%cyFEQUb9+s4?_RlE z{mJ!8&7Jz}!OOkdx?D{neD7!VH#X;v-OfOrO@qN9)W^6qurCfw^=37uIU%2dL z4?|WnK-jtzwPT;}Lm}^wHy|3aC62^%dZuhP+ySp4=jNWw9#wnQL8N9f164+>9P6xO z_U+i{wr@11zNM@`ttR?j%|+*Q7a^ZUb@N#~_NWK1ytI>WgGkFwx>vP4Yuq@IjasYK zHv7Bn>f1?4oN%n5_EYj9okm ziw|>EEnzULmE4rXS;&N@oKI?Px&IE`L!<=AyQ?TVqsXtmL(fW>HxM^MrfmF@`C6uFs!kd%S+Cy)WD@-egI zM+#=yGa-ftfyN#D++iZ_7L^q2C1z9m)pLCK@zwr&iyM_~Tdh}+}?NMEQONwnv6G{nJHykKhTB7>p zL!h#6!9Y%ZZqL23uDbe`y;(V+z4_A>gfs?4du!@)v|e~N)^CmR{ldS!z**f~$T5YR z@`6V5f8qB)oyIGF(z~qv4_*dlzJpS(-ZD^o2=aRAR($4OJuq@JUA$K88g;=i4zZ?iZk_n+upH(BL7^ z{M(8vbZO@$8O&gnoui^G?{Pl#RV@gM))V;ptra{-ei-HVH5(1Q{~7#3B`C&QwZpMQ zcGlFV)v-0%&kv%ss~jq^KIrVVeWz|dD*INh=dM?3!Nc`e6OBzrXS9;!4QJ!Q=dC@n zyJsEkju>cC$}X=xaZhed;lEcy7F8Nhyg&VV`F_xY6E|certDi<@P!2O_ekxwq3-mp=R*dEV@Au}yR+AU9%v5_0 zg0#qZmsE5Z%XPGI`-#TDe4P&(E!DYE4uBSj=lt1_EuB7AxGQr?%3S7dtA-Kh_V6=` zr{i-*Iv>{Dt$)Vl|Kjr!v$Mx({-+b%7Wy2(UOr%HV~HRiFJ1dm>=;?YJQts}SEZk0 zS^zV=mG-$Vjb5K7sEU-58Aa7A=viq(^(%PcVe}~nB%hN+lvj+6`xneP0m){kooSua4esq)Ppt$k!(g(fUqNp@p2Jc43 zMyt<*3QSSyro2u%g-BaR!C> z@Ij@{F=?FjU*pCmbVxE&S16!kgH!yK#te%G+S5W-(B}XksroK)?B=0atLqu*{dzO? z>*KHVLYaZqb4Pc^SaN;5ZrY&T*A#mLyX+9taFvb?OWurEHl{~$GG{r%Y^(_eQf{rp;Q-FYzd-Nc{VRD>2 z!d4`Gl_N}YE-NxH530p(Fzd@m*QKIz_?k9nbjwwxUap6o@HdI@H*)3SHR^Yl5cI>cV?qVZnb&a%3^z2OrY zWSQCFw{{NCL|HE_u1X(2vx2^9VJ4>!1518J%}9)c;$POz`(2@^n|JW1s=};<^`A=S-VS^64nKL^MZMr^-p2(`A9uh@Nv&xO^_8rw!`B*_{i=O zXD}7HskCBDYw6M+S6m(Q(z)j(bR(p}vXZd6n5s^+tr8@TXCep1ky{wjl+k)lTWr+k zRGn8m$+0RylrO!d`g3Pr1OMPk3O_f^pMQLoG6ynPj}=&)w_8nG2t^B_JOxR#=@R=v zSNH}M&#gSajty$LxISGJ!vr+J9wh+8nY#1dU8l-m_bs3GM;k9A;TAOM{(l@eHI@5N zRCy?XE#75@wXA)o9-X7{)^1=~IV~eXfi(H6iG5u4b2uoApqS2w^{in)GhU=s?1S{|fb?9h9nY4Y zosgba9EVnNP_AOm^;?o^x8dJyV*4Vfudy5-EUh?++$I>IX`D}tGEK@Fr zWz+zJLe)SAL^+Ig$zr|0cU}ZOrf~5-h7=TA2?nc2;=ynvV*iPW+aR_(oHVy=Gs{YN z@moa-b?j&qZL905{ z4pbM>!EvOk`;LR%y9DpD^!MXdUK!`3j|XENjBJoZ zKD6U)18E<%D9KpsJvzU)=F(+%!EyIJQ5RMI) zorOV3;CQ6*3NB_ac`i7LK!;!oWOW;_BtvA9=bW7|jgf$@C4y1Yco!OD^*tU8Xp%}q zSEZw`yYa0>t71o-W>KhO_=33j0BF@Af6x;<4vm|w=gnG(2dmO0QU$P#!CLj=K0_GJ zXQ4U{A~?2aI-D0D`taq^?ZfkZUZ7JiVwL|G=W`ZPvz8UYPd4ZPzB3@2#G+7TreRmm zPek*!Q;%s_`i%2gh(DdzG7=}vO~$77eVP$~Lmk7W$JjmlwTOmT&H#*>`rGNxh=w3- ztjwm(N2~m5nNv6@L3k{P-wo?erAc6pC0C9M6lXEc!|K|*Lty)9EMw8N?jV*shV^A~ zHxU%79KNGV!-o-k7`yF$F3%Qyx2>8D*PbC|_&!*@pcj2IjgAuNH=l>Ch} zCyIJhG6pyue|mZ?E{HUD0xPhpZ3iaVA7k_1l=k-5BF0TPrlILWo?3?)(~d|O<71rJ z2tm5hVS?gBH2;%~#uMXwo?!S-PAao|CxAJgIorFCpYh|gxV?sD6}P)$K#P%sVR@Z! zfuL|uE}?1hWB4$JFMlym(K3@m-{tmBoyRh}h67+)SsPZCafTd1V}D4T8Rz4NwemZ$ za}iY$wyDuS*`~(|t{%7}%8Jy$$`{Lqa27}Jwz^rGK^UlP2{B_#KLaoL*bPinpwTO2y>V!LhP)3o zEyT*pJG+(sT*SO>81;1W(!Y<3zmJQ*kBc8?{@=&N-^az@$Hm{r#oyk=-`>UF-o@YE q#oyk=-`>UF!KnYO!Kl2i}$wed~MQzvq7L*YEZ8*O=yW<~rB8w)gwG&V=h|DPOt(xqydigb+L=2*anyMSrKFq_jd~ zUDBmtCf-Pm)r{5->$^s-39V`DC)S-BcPBI46QZ;@J#`+OxG+$O%HCilq#36`s}NYe zg~PoS&uYrOS@Nv&EMM9zF4=e?IoId;twhQ5tG~Z*R>9))@v-_lhr2&Nvo{-qe-UO} z@!Q+^5GGU*9sv~Z43Rt@KKY}6Ubb8cB!pX4mBV3(DP^bs`M;+h417o~4?{30!>!XDbAyZ|`hws@U2Vy1BWv93LIbybC;=x=4!(#v?#e z0gYP!=dHyO<4=8#NpYFNsOsw{Y;JE$lHH0ZC2N2{AnD3hR=FG9UF}kytBIat-dt2i zxpCx=FqScD6VcshrdClp7Ds1?7<@v%0v(A1Dxs<@8U!bC{ z9_i-kDfJlJm0#iVjd|D~|GRAgMOa~?;_P}0B(ULi zFv*U5_2;4&TsLMrD{Q+muPVi!2htJYqzjBthgFlva#DqCwSAgssA#HG5LEP%$`|xIKrQA{Z!ee6R z_FTC}b)#pr41xW;Wz^Gmvc&KCz1Ehk+t>_mkM&JZhH;v1O5EWTV|NKP7*gAhbqTFByR;Oz-l`LQui=s4url?Td0@*RINWw%X_qXwDlN## z=U%K0Yh;b_NMAf0ru{0e1G}um;^DMH8&vAHRAeEN5!WY?tdxZfpa>s9$hh9G~@%!4F&!w3*O>jA>&Ojv7cePf;zOM+)ez3ig zz?Jo|CoVi+@RIpZqn}ivuCcp8F$w-x7M<&8-Day=z88rkypWX4KAs0$q*2yY!`tHl z_u@Ja2x&6+cNdi5xlr|60bUNT4n3^Iv0e{bH~D&ea>7{|yk14<*O)-=Ni&due9V2`RI=*}CPny*${{-L2!%x;ap8HS>1k%f`J= zRNB(IM$wCu_9%Y8h5VHGB{%~|mP`0U>ynmaU*=@Fbhk`%pMB)u!Q|QXPfHfTP0E6M zE#a(YYe}KcrOaJ66Gfop^np5P?3##OnVW(clfiWAx?_0}rLX{6m&`-L#b7U?&d3SE z+U4ZTo9(kUEm-Siy5Jn2`7l@2$Z^H2ZFR1K4I+B1R}?usX6>;rx`L$ns?-)VAx7^%YSrQz?qfvaVQqp>(M8j!-Sr zD>t8aIb!~ZC$N8uPk03TMDrrk9O}u`6J9^wpKnJHVOpI&g;9ur@LPe6GPR_}7VU|a zfQ*E4{r)bnqBEe2gE@{WbXc{{#g>U!AO5yGmt&$CAJKr?6lUq)bOutc z-FU9cY)2}Z?7-(|GwsY)zs$#Z^jVjr?y)gJpCOP{_maGHm8QPG56b8*tZ^JRsvyf` z{TZb`-IMcdCXmY_p(Fxf%twJL*Os}^K@7}982nLT5eeRkyprCC2&F8y1JkqO51Uor(pAb8 z%rZ(f+1GiRF!NSjI|1w4FQJEBx*!0_P*I}d^nT@R=N52ID|L#{?CVyOlTZee%^Ypq zYDUFsprVLoiq_f)kH8crT>tULTSiAZ`=VBYKn)5a4#*MH;bf8^cSbgASE92}lEuNu z1J@f?xm7SRHK1BnnP&AALvf~sm82RU-?PeMgpT8zSQ*!?Wi}e&x38>T@dq5e5p|#+ z;>$|&g%e)C+}{1UhBS_AOuVt9?yvXk|CExyPB+kiTqPHoe$6(T4Nr8vawI?WJ-@}< z0g2S1#?5Q%5j1?ff?MBYpoYlOTlLk}qJHfKF+xcmTqGP2#?}G7w}*8zosAsbrTzQ< zJ7c-!2JopLkIi53tLY09+Yu1_#Tn~>MY2LZi^5upFo-#_+egW~tXXHEh2U?fAkRqks@ZC28%e@TpO6?Osq{Dup;?AD zAbW*f0;Ov--j?qk1*+L*i}8)f;q7r2{(Pk=YYDwcxB0-(cH||$_FO~Q1KCrd`Bh&s1yG%x(f5{bHZ^uL(xA+EmlY>geV=aE zvQf4FJZw$NshDf|S%lD(x^uH^lYwf`{mt&4ee^|l1w8z(9FNRj2s+#UhF#Dmf}SfY z^TuMF0(9qoNVdbMcE+AV$2EJT{8Tg99nVJ z$_rmdgQipHqqF2Y8I14~thap&RUJOx-8)hrR=^K5r;@)q>*KY+@Y}^j*<-~fygm?f zwE!EqmE3ZzOM1%J#Pw#CKUt7&Yti`+Z&I|DG9!KB-SV>;0z%(+P@9}QlGY^;S@k13 zU}Z4#V6x0yZuyWb68h@R&YeE)FY1C6-n)19f&?yS%(=&?#C*JMK^uc?Ypj0dCb`_f zW@$n6gc4;UL2~yU6AFbA+008|XdS3^d{!A{Dnx_&I+TmmNZ;uc=UtP?Y44ZbZ{EM` z?b!7*Ov5tukX`al^;^$<^1-9N4ZTC9E>#id_XNVWCd~c^JlEO9p z6C9e`#8A3Qxsc7@)oY*|l}f@rgVv%7fREglj7%!;YNB<9hlg!Co(g{nylRnBt-Eu# zFTjwSN%rA@YFU4#jIT8=8@f!wvDJ$fsQhh*zM$K%hGgAEh!=hp)AaJtMtAt_Ww{xX zi|Y@19$<@m>s;%cd8#e8dlrMvlePVr7z=$Lwkb3v*f$ukxcSX@X5yITuNVxxkT$y#*|y46|fKX=>v$7`0JQTopXnCdIi z{LZxDh?GwctgWBB-P>Ao^0bbzA z;bwg#w9i!B-tBulhx)@y9YJKWH-$~RjTJa3i@DQ)I=P3( zot)l3GoF$@`Wb;__+fsoIK^!rKWwr{)vwMs>$Tf{o_EFV8!UvCmYLf#6jH2}XmQO! zMzsfv@sFh9DX=$FdLL>1Mk%q-z^ZUe>NVR4*+X-o#$EK=W1m3|TmJ~2XLmudhhBf( zFZuD^(i6KTnuXRL$OKaGme|WRZ%dyAjwYp8QXI4dIk`N|FOqeAWQBp1m5m;fXYz>x z#Y-opWPMU@rFVD>b;5+O8=sz#SugL6QOWIsHp?|$ySW-*XvW+-19HNhLZ{VT*TsZc zfmq`8YU!ER{*nuuTE+*~b47x^geiw^L*48L`?-Q#o&IGS^cBN)Wk;3z@mr=E)I5av z<&-~61yRT-8sT6NPX4YwTp|%ldhJD+orX0(5w{}ZbaLf3$H9tbx?)hQVogf!3CbX6 zazdHZ+^9dtFbgGcYVt)*bwS7hHnqJnJd@!$rdq{J4fq#> zEcsjE81^3s3e-^MMj=zuIep%>uU>DSEBH5-DtTbMd)#=i10DuqC&wJZpI;bIqf`rw zRnDTxBbBBeZ4VytE?QYOvefgfNThz!$k8A&;MB3#M!>CXJo5g@u?j?9;TY34Or&64 zi%HtykVBb7JoZRJ-%@|jYrU0As_dnCt%!=JV*XdfJ5^(unM_JRb%w0a-oc6#1|&#_WW@XEll{1`ph39iXXok z*|&4Y17;<_M&AolsdLV2LySJhTHIjFN7Y%I=F%C8*jsbb0tw`B5?Db(k@xJSIW1)i zH<<_Pufy8;>aB)Su&d5S+sI7{pt`=HGOTF9-P+CBT*n^4;prWr)SI1QLE0WfpH%R$ zSJ*Tn{-Hl;h!P`^efPpJQ$IFgcDL$YX8Go}A(EmXEXC>{wyNv|iR7VK1mq}+&!VK* zB2A>D^SXHC@;F)f>s-r`OR*3A&cA@skp5Ndw&>Qq zX>oSa@H00>FJV6u%JhTk#%#E>^LA>VSe2@Njml^Ge66l%af%kwKq7)RRfONlgZ2S- zDSV5H8^7%^@CytL{EuGw*;l@4&dJ?k*t;pd zA)&WVd3KVhOLy{84YS(}frDYPw53jCCOwGj+H6^c+XZ~_B5 zdgQ-z8Tk(-JnZ~MeU>=E+)NRhh^ne86;IEawRr^UF9vC^R}2!a@G-BcOUdfzKWf<% zS;ym{g(qJ%3qaV!LIKk#Pe`0diJJ9hgOFA}l9_upidwb7)$w(K>Sga4kC_pW61|p4P=i(Xh-L_5WXjo4zsLWCcLRs!*OtKAZIP#6{4;tnw9#+0n$i;dc$B!!VMW>~4&|bqOch zr9kBqShHS2>)`T}1Pe~8*xyod0;#6n7yf}$c$vv2JDX+JzICBtE+o!QxYSQTUVz zcusq+Ms?#m!h3IpZT&>LB3J&frx($Fa2J(mE9Th(v|ieWB0vkfE8YnDn?tWk6c!dGX5HS{=>(tS;km!_sCV1-yIsw&{DC4wl= z0w!WXUZjklwbx<0SUz04Tq!`cWxL_)>|C}{DZ6Rwx4F4VvTK}0zY(|g9c^-phibWdp!0|E?oK)hWTnn);jR*y~s;P6_%26KnThSrgN{Qb?X&vyga(KK04zp z+4LO#OwRqLuJv?(vQ~1ACdzgAnpDQjphw0`vh{F#-RtGdF)O75VIN{CIqxbzUL)-+ z>8kGYj{UvQNG~VHEnW0z()i%&XUqwzH7!!lEy-5xD}&RA!-Jzzj~22qAvZ?1mvYX> zNBs@+B%#^Z$Tm0x2-+cv@Tt)2G>nA$YUD%S+l;F`@k#qb zBds6P&kR?WIh#}?&S^1V4Z`kkLNt>e_@t_+9u0;`v)vf|@Wq+Q^HaX@ll&CxkYP@-zf$gC7IyjT(?n#|xnbrpaRYXU=5&^E$}&>kY8PZa48&6_+i%-ABEfukS2o@^!*sJ&Xb1>)1_pBMQ^fKD`C zSID;uBW`0=8-_sH!^pOg8vP78q9C;IgTw2ULsY#Y1ur(P%_qTgC8!Hb(YmdWz?~j5 zW$SHXf%T4AQd_!L{l}3OYb-*GJZ2P8Z5crM}46uegeRb4(ZQhRS+wTSE$gkW&+-qB2 zmEjZ!qMxDdT1&RQ?wQD-veOun|6~>fzl*+d`<+w>*#1JjZ|!TlYwCp?51M+YPJ>L5 zz-f@NZqG)`&~;{_>K;!9JBI${07VOnCE|QoJ{z1)9PybzYGCFC_jPWF@u1MU^?wP` zcrf1+@!$Q9?#(jfZ*=~~y_Y3gpP`?x&KU7mTOS8zmS9nDAZoyO?zSh^KeVoCsx*4_ z#*=&j$k8k@8{~BcuSomWt=^~lh3zZYd1cd(bS>*Yh?o;3#;5XnB)F5KJp*Uc$H(Vk ze}vSS$bNE9&s52Z$E0Y~V6d=kIA!oUR=Uux;PoXCNByK-u}kc8t^*qTv+w<$H7wbz zom+4(ipY|_qhyuecz{B>rC9CoOv6~|e-{M8AW>pS5+`vdvI$;`&_H8vfG?*eRcqn= zY6=UvCpP$ZTnDF83QXgH%v(2r0g70FJ6)R47bQ@m0Pb(=^y|C`e&?}6&>5Yz<;NLc ztRPs>4R!uy;3Gv42D8E+0V}xqxBfxkUO#=eJP$asd>uIVUQwnhLhwj>C-{mlgo&%a z8?&cgw2PY->0JrYx3cuLwY2aGIa#lD?3v>hW6*x#EFA*?+ zMGrLyfNx^rGyg2gjC(hVLk1AxJ)k;zTKY3v6es*WQm|REY&XzLJ1x`$&2jJkb!CA7 zZ0QC*i_#Q+?Rw<{n~`i0nZ*&FC8OgTOylVvEPC0A^3w4rP&~}pc%6zc!beJae}JYA z2lz7Hzyb&`t5u>W)F|4Pul?GIj5Q-XF{JVZWv|-<`;~?Y-P`%dMtNdb>6e`T!cHK8 z3t)Hid9I^{HFFir{y7e2U>VnN9SV670!m60FH3+xeX=>{#mQt8t%X2;7qyAA>X(bh zn?9)=pz(4dHl%MeMp6O^JdT8DWNcVR7gmCrq*KAAti~#OD$Ml0;iA; zvj3(gr~XGjLUevI9F(xzE!P zf^(p5_TQ(mm3AjNq$L$6Z(d&jjdYCo@AfMH0VXN$gw zy>h3OPb4T-Ix5fjBoEZS%V&iTwk=I>>jY zx#Yr;9UVw4D4?P01R{Kp3_pl%bes(RzIK+;;+F>>%@6oO26KhK=vP$27?BR9xS%6K zi5(6^MtzB;{3Ese2=F`?s(fjj=KTmN_#ku&MAJ`kp(QBtzZvcC7)A;V&z}?jcPRRW zpg=E^S=q16 zh8!uk3axtm8VrNzv!>V8)miVXjsh<76TGdL{}NjSafG13op&bcA6HE}cjHRt+9LIB_J-YrSpkB3B4n6KfhvZOLeBou4M-{E zsE*Uu#GtU?BuYWEkS7Dd_-i+36k!F<8c2#i{sTqFN#G9jUj+zLhmE=QYW55cnp6wq zB2e*sWpDL3HJ<8-F#5tmn6=p%XP2YfAoRUOy3XrQ_Rg~(kiEH2RSud9Auu%$0S&?65P0^CsX zJQ%9lH3>wLbVaBC%D=e%^MC`$Yta(~7<>)rZ%g*EiP(iRFd4MU9Px_~ZGrcM}=M9vuOYcP)L@3H^{VO-TfZPErH<6;I#DPy*HN7@{L z_7Rw8PIaod;iRD3Y0sWfpoF`K;8q>-JfM6!ttieAeFFA;5S3Spg<`s{3N;PVn-)I$z#gM*qWn(Qu%AJ{=!QMQ98`{AE;~ zIiOT}scwP!r^9B;LnW*O92Syg6NdS*+(P`vcH@CjYeewRfP>xAg6d)iw%V**UmPHz zgMeq*;ZZ$Fk{3|QUG3eS5efi2Nv{DMh9T(To&7QKaXlqqFQo^xg2#6;*C)#!QU0c6 zT4aEvtD#Rx!J?w9v2T!l{^#OQz#BUWN;GK#^S~663BW5J^9}+K&y^vLtldvs)_dzS zXC>?Gzm~*vp+a-eTq#1PRVtH${iB!RR!^}kWWUc=3^?Y-?^=lp^|?+e-*@U-u+c#h z_y%jjG`&hCs228S>6{N930iotHtsUkYXuPDAF$?f2ZLSHStom0GtpA3v4A({yvQ=! zQ^^ad99n%E8gp7Zg9K3wM(#A4uXYmwI}IhEq(WJ|AeHk`S9+49H037Y@KeK%{vOTO zpCSB~uS@?LWPc=YMDz)CaW{>39QxWD%!j_TGok!ddcBm3q*3i&Ol1Dz|-QfpdV%ch`beqFttsFI7wqYO?kSF-gUt++|Z9d_A&{K*)V3NBMKx zsKfjZhR2f~hpSu3{C}LKlXNTU_3~R?J2_s9lyp5Z)nndilXWD*s7Fmh{G4SIXDt#_gTg z$CvvYht`)YPwKic-W#)*$X^v`C1`I9seeMfISLKfJ-;`5y~*Ue)dt_^8ixKKl`(%@ zIuY2BwG(c0Dk1Wu@Z7NUMwMi(<-|*TnKTj(CH>-0{ZRc&FHpHb)kl;>3GK)0{2KIKuTQi($|(Tj18-nt};QIIoGdL-+0z3 zo3g$Bz|->5b9$#YIZ)?OJ2m1SHS>)J*SmkA$4Bx$xZ2^`C+M&#tUqmhDu(oqk=X{UQDJ?Sg&nM^T3JYDZzvM=%#sIt zGyM6H1pd@U5Q@k0!BzM2NVT@;DKuUh&M6S{Y9GQQe;C2^%>awmML*I5aerS6s|v zZbReh?(W{YI$Cct`6)a+F>B{WFE1piKIJ=a&D(yz$FCdGP1-ji)-TqP<%N@MrqSL_ ztu%uXwoWO->YDRusd{BULL-nbK8ddF5dF^ReIP5BU+yagVYui#ew>mOxr$2!;^692 zC#v8gl*{yA&lu$R3d}sr(AdkNpV?Tlk~E`{Rs9A#TTwH;3W%pwE)+zp5Hdzd_Vc6+ zv14OnZ%TxC3(L!O5m8qr;BhYJxMFFr;!Y#tT=p*en+w77vYznFg$CcI8*IaqlqgQu z@;;{M)fRcFp>n;J53wT&RF2(`9n81wULtB+$ zri^PTQ5knFG1(NL%$D9>>2Em~IE0hPp;(!Au6i|qqqCSxMMV* zi6xCR^{6}fWNhCGe=b2I?N|Bi^4}F;g*wQuqvg3Xpk}Be#u@1J9YZ$A)(G;zU}4p1 zfr!$?^^0x zFnn%AqxDp5@*WngbZ+yT!+f&CrlP~ zXym*88 zMXo{t{wIPkr~o)L7S9tCLeKRclL*-OP4Nv z>Ds?4x70M71KqSe7&rfrqmQ#?)>G;GZmFu-n|zHzlJt1=+{jKNC~Z34w>MJ0MNIjF z3X5dVjf>>HvhumYrk(O0i_-6YGhX06+mFF6|8H?otD#_!>we#kP5u+BqqyA9xTV{0 zXjbuGXeUsVJ!bpEP?4+PFowb#>Pw&~6AgTaF3+hoH2ty%=SC`L9;Y%aEptCh3B%|h zTNAJ0QUD3}e}!8&VIhu<7uwX~b=wiZs5Kg;Pw6Wdpi1e~|0Zm~Y5nFOL0DIz4J-*q zG>roOkVC0X8b~{9>-OJ14o<5M6ZB2~-6{Bj|KY*@8zcin7Y;q)dIi7XXAAD;fM7_R z7C835$v?ndkOR~v@dwoX>N@^s0_}eRK7T_p9MN^&UH~%wa6{93CdoMO`Ex#7>jf<) zBABRXYjI&FZvvNgsjBB2Is3;MYJQa8kADzHSi7r2qYuu4*#iAg+-!j%^r}3}C`YRV zoGI@qE2p3L4gE7tnJG?ROF}8+5`8jr(I)$K0#Xok%NqAf%)KUpMHi@cltEXmSQ~$Y zSymzLg&^@KmjEba$#t>Y4v=IQfCCvm(x4$HQUjH8;!U64ep8t2X1Aj2Y^rSmExEvR zUwj-{!f#TM$I0+ZzO&@tkBRUi^8iL%JPJgWV{!%sM^ik7bWYmqAw_l;}j&v`z^~D+D>#hMV z&qz7b102$y&DH@rxufgVFAj*E4qsP}8(~KSNG+LlqaeH;Wl?T@Wg}vEgB*a(jNU`Q z`SJj^5nf?~A1va!!g3#@Pnm@TYa;kj_LY3YB={5(c>na6!(peL3Do-SikZxR9B$EOPueD>1695$YXd@Ja$M58?lRKI0_UpB8( z?aXBb7~u`XqzFOJ!+@*z$%{l!6P#IS}Te%b3(0 z$MV2L>%8UhjHUJJNNwQm%5aT#^^y;Y%?Fpj^fj`I+gW0gGS}!AR zQ@NwjpV!IqFNnX{zMj*@Nky;@2MW!?YSbgEcCyVHd|r2C$&J$eJ==>qPaKG@*sRgaLWD*^C0bd;J5R&{33~$c+T7b*`n{ z@-Vq;17K*!GEp)Y&Y?&!&-!qI`%mF$5C>|ph*wmlycfZ|vBFNU&_jjeqw$jl);KkF z#RhnUlxZ_uT+p)7e6@b9@k39=moHj-;J$+~ot*#MUI41z{-D2!ln=J?0{U#fF6V5mJq!r0z|Z%nUjaKp5B;Y6yp zK=VN(QLhl$W}^Tp@T zkZtVjOocMeHHb+`acRz76B>)`Q^ANn^Jt^%{VdVlro`=|Btwb4+5Z6bKat`cHS8EJ8$7vgmpZF{l_m?pJv96nIm#=H zdIzxSUj22PQE2!_6#;l%q>Ud3x6-i=!(@L_u`C1LvPb6)x3c^c*1*yjZVF@G>{!DU z+!SmGYIY*v_&W-gf3b2H-aejJmUBfje2!-1yLg%Z zzW>Q2Z4fTn1J0qX4jl zT*USL+C#W}nk(-bR$Ns{Wr29$ zMZ<9`X`e^dJlt}(vC(2Uh+xwnhJjvVGaovQ7Yv@RpnP6n>&9YPe0Nrp0K$Po`oT=b zi_6^tiihT@G^i;LSr)m59d9{5_DcjJVE*H2Eeqe^cm6O$?`|Gx5DyKD&Eo4Fn};}F z;J^foMPwahn``6z^G55be}W3$H%8p^mcnX`D{f;5s$2K^9s8eCn8IO%spo#?YaSd? z6cqZC29>vO)w9=*Fucyav~_Zss?}?Mp|HIp^;(9_H=l(rUIulg14`_byPp!;skV** zQF&b~5fHToDetNshx1;()J#iDqbz>&{JFZv+L*w~%1UEfR|YbDC$6i-n{%Z6!87Tf zy}tR{$`YF&eNb=#+X-$czsWl91DFHs$}Qfp}l9x zq@j_tLdnd>KSG1^bG^mSiMN>-8;-%onO#J9cAE8SyW z;dqKcR<-l^D#O#+xwaJK+ug2dj0vmI(e4~NvWSsKyrTspixtNx%0~0>*LxH$q$Df_ z@XMWKgdz8?kus*F(4M3orXIds6BYb>{;mT;n?!>xipQGk+T>>G7j}w>?Hrq~a`XDq zajT0tNT*Vj$eu>6bv{T?AB6$TesEQP@Z%UW?JYN5tlnJZ7fE%uwcfRdb5dHgU{p$W zO_ryB#9{lW@Vw1@d@7D@3O-^8y3gV$j?2j(wpyf&C9ue2%d6_UE8Y!&P(r_y=ve4l zrRrVb_FpOf``mO>!#thiJ&!Ih_+*+h)NkWoD z2xNY|{dOBUGS#A_Th9H>0`)+SHOoX?%R^E(RM2i7Hg;rgIrurnhW2EPR=~RmDiXAv zwMqU1V9xmzgZ*9`(BaEs7wF&%EMlh4yZ_I(4n$^&)kSl3DY_nXsm9+cFzKOzU7tvx| zaGmTdKy~99HGj$}e?VWZH*9BL)F<_Z#?BrDVFTq~{;J1bGbw=45rRq9SU&6(YPEDQ zF9x@Y2Q&Rg?#gn6`3gQniC|2uqigvW@=z5a!1-)Xi5gm1ZE!kRo&i+0li4bC-W=pO zXPb4u+bu-Y$9$#mlhv&76^dv@mHt#)o9D4tf|Lg(McU zJ^!Vu7tzuypqDd3a2SCZcBet z0NW1l_z>628mwsjI36kk5Mvnd4l4g3*XxC%gq_O!Qy|ZD5E3PF;VMY##xM-`W{cS+ zfGECZYcQJp+U8yNX}jxyWjBVEh`(Jbt;au8zgY5I+Q#aOk`)xe9wN_4%+3PolHTZ$ z=ilt4M+=jSbb$%2c@iF$@lyrf_)ohrp+dE%2nmsV?a5cSVy-SN6~vy<8kboJaAml~ zo4YjAh`7z`48C?qIb2U^N@SGsXbGmZ;07@~qQU6`=+2-iim0*kG_CWcy1j|%9UmACG!IL5ZtZG@MBKqH(}M( z)HHdQfuyHEg-_=HU?9gur3?6QD{7zVmxO0lW9)SbqF+#gD%@HVwkTeFPveG2n#BFx zA9rdGR_nq2EX$O3p(b-Jxg$61&i2m8gBVabX6@{lG?*YgSBVJ#W_RP?s-(RN==nkl z#tx~#Jh&CP(+oV<`{SLq%BHO-R*3OS(-~^It!H`ya{%%2xLuFFj@Wlxb@tz&_dYoo z7qa>sy@l!#fQUXk8uMLCde9|fJTyEUl06yodln$Srlw{d+uO^wiX#vn_RndBsSu;0 zqYPP3alu{J0QmpJR?0^3+=g@U{@qzHyZADei}fO^!Obsg#unkCiw72dC&M85F(1t< zUt9}Z;Z}BxIx=~eoYa5IGh<$XYPO*^JPfucT2@-;^F8pqbS_6jj~$a#MbA;ArRDW_ zg8;EIp_{Md!42L;_&u$3aqL3OxODF1RByZ$S)vBAkNEluCP8O=2``G=RPKi|^xER0t#b(>#Sk8dis_ew^YiypbOe~So`$0s^1 z+VPiz90K&4C$f2o@)G3r(84Otd`hq(5#6TRzI+B8>%7sK-6&?=Lhij-T$s+g;*7WA zEV0txQBzoe;=E8^Utj+tzYjVub)xHFowK_4*O>IY#kIR8!PW2iGsMQ#lGWCjKC4m0CAIY)^5S>WGfBBV z0MoE%leLzZ-DqBT>^J!CNUrqv!%ilfBQqL!w>%pF9bQuBW~wyDQFE zzs5}xOu-8+jZ${^(HOyo+KWe@0D!vN&q?oxfEiukf?J7kioDcFmj4FNJr4E%{_c!z z?K)s!B9gV9Ydl;o|D29`zNMMto26(*TBnrL?>gfuqH9Sn<5R^Z+)%1EQ`;_9p>qH( zYBUTv?3d^ngBpRJQl?y6Xtb<+$QRbQH~Vb8jjt?B%}9_a5A{fG7uP%C)Xp?dC~yhr zBalkkXMcAzK}FrV7%$I&qd?M;8v5{DlkFEW!XHFR0J4F(zOlJ=9NubPNC6sf9h#;P zb3c3&a@5@^>wGJr;`?jk^OsSGPjq_)3!2ooC0yo`#$-g2SRpIbyT#)%$SSf7?Djx= z;mVQY7x5_)t~%XdOHs0*;^XCf#P7xiG}a&Agc22USClkJ*gXk2<{GwW!Mzxajr+x! zyw3|QH2`<1EpvQ?yEhk zyp%1Ek^Ju8)j6ISrGLVEYBtNY}u|6XA$_mHuwYwdF0{dx!=KUkXcO@tv8tYW= zG?@GRNr_7mCCb#ZR=;q|eP?W`puwV0OW8#7<@2W_2l-3B8?Nz{JxnMNDh1wp_PZ`e zCKNsw-Y8-t0R%q4-)~v8GbmKlV1)0lSjQmhM_kd^haV-t;Djx+;tr?_-y*t`)YewD z^Ysh0#U}`CnN##;lFTF>N%OHD&w8Ja`htA=?S%GSZ9q>wlLB8g93z#*M|giLH9rvK zTK8JlTK%jBtv4547poRf4b~=El_?&^lJ2Ix&pslT^Ly*$A_o%?y(lir&j41g7!{UeMD zn9;M^$2`IHGA2N)@S_VGEx}@hJh+&BaSVhPo82E1?#-_+XDGqGJ(hI;XHH@rSJIG! z9S9NVaY4Y1CCe&hD+~EvG9v5LcOYYDd2N7f&*s4k3@-HAYrqlXC>bz!1_ci)Amad% zRk;SfJ54#XS^>%d-sGVRyOIVboX)T+{qyOk0K-}ls<{9*t&`~9aJ41~QgE`Xnv;u* zi}9oNp6b57^<|R);chmE!^w+y!HR}1T&8rt$0Yt<=>{Ote@z`gg9&igG1kT!(C4E# zT|~vi+UBvj`LADpHU1ffuzadQ5V#21Nk%E2@vm7R33=*+zvRYEcQAm}#hs>cw|#WN z0i{IAVi78TiO5<3)(9v%o7O10Yls4^4AZkd3ni3)4{Dxn8aylyHj;WCw^lq$_tm={ zS4e|YLj>|~Kw*JG{y!sgHugKOY+b!VgDTAMNV9cc`t~v*M=?}QU0r>&9RV)8(y5*{ zKu?9ykpYc_#qt6$M3LPH826i&Q<~1#Za~2;^cnb6y2OKN5U^kRf>DQ#7ER@AzvmZ< z_`qXz5GP46Yw|ZGR(t{9pLiO`KPR&mmzkMamx2mIG*xE0{n>Q34>+2yR+^gN1pI&& zzx8|d4o8u<#3M(l9nB~VW!5cHwCc-hAI$BePbMRU+GKV{^b@y1bL~O$?Ij1Z8mA=i z^8_m3_i)PA?K6n5H}=Hfi=cXz;r;NTPwFiYVN&sF;b zT4Jp<#^w{tKZ{akzj6%Br9aRzgy()M>qjd^vZ8WYmoKA~W0;a?_>5W-dGxJuzYGEH zxNmlI>+Dz!R@jtR1>gAHy#NQX59~da_}7sDiamr6oCYN*9jCwzTDGR673cQqm5=&2v7yJ5+O3it2ZmtlP{CE-I)(YK&l7pMLUt+;t zS#V;x_QyAgv_OrKPA7pAc^C9*HWkBR{S-pp&f@H}%eQ!^|Zb(tY){zV+&d~_l z?dWfSTdSQW1ux?_vC7OeqYkdi1LayG0@`#a`s;%6NQ1p1N36?Jz%8Q7d#tD2{~RCr zwLn-n1~AE=N2DTfqinJKfvO3dNiP6mbyj;$!FxU}-&)l^mE3dis~SmGrBVm$aVWSO;ajOT{yyw!$p`x*sDmDV7%OlA1Ei zdo9Y-fSRo-LiXj)IDC8IvQ7qp6+!7uBv%~vA|EIk8uY*{lKd!`+Du!z5lJ z>I{5DsiFs@ffVlySjEu1mpwV$n0b6r@P`auQnJ>w$CxNOHu~#Mo3Gu5Zq>&5?Y~VC zhn1CCG}LiFj|*_Z-qd0$K|Wlqol9?kb}C#$Xp|UyUHWiQ$c;VUOs!;~Pdz`6k+^tV z>$ySSoM_kjOnb&*8(b+j`s0V-i}|&+bl7>{**NllWCX3C-xHu-z!^n^aBWG|NW@Bo zV2;=Un_^WvAjeO2cZRd zBj6dVsC^&M$NyCy{RxNHh}ES)WUl}PEzETfs0}h6VFxN*a@kLR{>FVajVV-DQ1Q-zG#sGDQFJAik3^6I=SeYP?u!*ZE&!y}A zvxt4)lT|(xp{RlHPB}Rycf}3+0ZL2Lvz>GemH-X7^3tu^uS{xbX^C64F>r+!m6k?J zqek|q)Bkg}zUJDiK+w?SKz0r#QblGt6MiunMGC3a*7ru(7&U#W#ak<{j8Q@WZ`uEw zFevPX?$^f5POZ!c=6@E4E~33_4LE^({9BL$JbHm)BIi(p@J^WgQQqS>q?znEYq1AJ zV@^DAyEpiz0y@o})cPNCp(|2w8_DS4f{X5V(Qki0h&y}%Ze2@el)A6^h=RGz0MS3h z9RKGHSUh2PrcO~CA!0H=cmw7UWg&-Ms_)+a8P)f7gUpZo)-d2(-#sSrm6!9&X_T11 zV8mI~jOr+j&n+1XRmNnTHa^hYEk$CXarf}Rj-ZCB+gH2 z&B*5eT?cmpz}dj%qWbUBEPT-fQ251xbq}j$og=*z5R?(Z0yb+cS>D<4ax zTFSil`F&N9Rh@vt1iR-{!<<_);R7O}Xb<0OlL9bs@vPUuo;tbn%13+)VC2@Hvjo(8 z1hH4clD9}+22@dSMB@@$0H5lOUDJ4BCIjH zRpWyu&wRgxI~Dl-=_V}9vBmmKCfg65`*(mI=E(V1jRzp$Ia{Bp4S~fo@_T5=nU1#1?giG}Ra~alnlq01?5tsRa zx1kIYj>-^anKkY|Y5b)sYQ-O`7JFvwUkBV>81}DaVTWNe$(<&lQXCSqR zeL!syo?!5J01N6|^FT`u|7@p0a56@0Ix*N>Jqv^GnHx}ZYOwo6S9&8`pNLI)F&uyy zGgU|PHk>rQf1%{oCpOh+K^mIpAu<~o#=w*ixz%@OLJW7iYX)2gawF0*Gn=R)=QEV9 zYQ~Dh#l`J%p`QxX7zkE$bI>1TEEu8ROf4ESR^mAq=dvM+`3Uv z_#SkflU{HQ(ZPVBA$AB-muAFv3qW$e^^`4 zN@r~n0X{O@X|IehX~Zov=@ZR+0`{V?g0uS2ZlchN&e;bZ454nL|#%&Zvj6 z=?5;X1SExHRj$jUDG}=7CY8=jCN6`|@+l~mFP>pAyP_UDk6bN4CugsihR*4~AU53KcqY@rJ z@0!!JIrW-MRE3QFPEO>o#In|zGtWhe-@Cxe2*Tbi&|rBAFrJe;y<@y;dhun^7~spI<1%4#&#E;vMhJ&jog$&#u3r@L~bo#jE%i3WqFTt@Sdx41DF+oA_(4 z0Ner=6kmuW{1JT^&;{v~;p<7+VA7;~-KcSAwQ8wwUP^CN(bFAP(qS7K+oKxs)R}YA zsN#XKmT1XMA)6B^pYAL|f%=|TDaG@Hl>l`S1fTVA*AtXNn!zC|rMOrO7^5^!-aBjF zW)Cl~`DT~g?Yz??yBMf(-gBq^T+LS(y8T1|CJz1`pYIn~C}3XsflW&IXfZgl`Gha$ zZq4&z2yNonJa@99y*}l*Kc2Bvx*RL7w!(oYHYl(G_wI}j1W_u8WHUp5w{V4!82H&o zPNRyyXs4^s*kS~0R(r0t1$Mc;U4f9rf*NO3GruqM&LJ+f=U-+IXOh)%{(jKRW|=MV?m|bt9Prbj(@PNKRy{eNadv9cwD@j za)SKbrDRh@i)>0A&F2__*p^?}I~5du#9?rO#KTVcL7mP~I zO3TUoJ`H?M`c?&Cax)hIzqYZCX1NVEP%XTwT{#o?Ra$H*V z*GH!gD5zF+KDX?z;27+(h*Gy*M<^OkAB|oe-nc^Su&IUVx;wq(Qa#X8SN$$)Y7^Mu z##q0agS}&eZq`h%c7S!|7{wMd1Nllcg~ykD>IxZ|?Sr=?Y8iw&&uwWY^AFAq<(c~# z-}@l8^lQ2OHvhW^LU62iEZtsC-K6ng)t@a|3Uu5OwD=}n89~=>n{mJlvu_Id>VM5k^051 zbnprXb9KkBW!as3#O;t+jp#dBYRkuQ65rD7Fxd$8_3~G7Aj^(!ex>j>;5ax}X9iHt z_wpb8wq#v*nuR;Mq5{UnuTHx@8+#m0<^SVn+48d|YOCMyWaGvltzmGE2$5x9LCCm! zNRP9Hk`b{=T+`99oE7=;03?D`&pTckMIGyL;;?T#!Zh^onKC^K`?65{_WYIf3uv3T z0WGhzgpxk6Kb*U0q&u|rmj)hp?{09joadmzrnRA|^(}j=dpvp}aS4ae)oNFNfv+Ib zhda}fkXgpL#AO?AgIGOTxOznne+)9fm*DRhuDfF~f5F9-i4rMe0=jOMChY)P`?W zM1PO9`EcBF%cQeU%O8rMsbig>MDJa)sx)QS1HJtW`gTNn-Xb4LEJ;AJI!db2RS|qV zqCUK$O%EV@?#%Hg=t+5kK;Nelnc5t{x$DFa-LBq~{01zLN;2d*_RBmo>ik4j3BaOV z2XHvVEUk}_iXbZFm>2jLs|sH>W^!}W=f^8@O(9{!+~W?qDpEo5(6Ho|AzRQb*L0e) zX!Ojz+u$*9N-xya#Iz+ExDV{)=fLabns~|h@+q)RHRj*n3bLft`(sbpP<)FW8*ee_ ze!JqecM9h@9V#`scVoTLAUTk!w1svu0@9=oLE6lX6p<~TVlp3kM>xx zmV31_u;^&--JEjFv?P{1U#WDghin*@Xdi&=D>rl4~Cs(u0ZlLmA}%0 z=t6ilE;K1Tzw(6pGB#F+|4*EL4^G6GQz9r}f!ufq#}oTLMbVk3@Pq7#30MWD#N4L5 zZT7>u3F9@@F%@^Grkp#$v!lTEjcJ-~;=S~H3+349&dZI1szrnD^frd$OO=lODQglx z>*sCDFY3+Kd~OM;13vHA7$lO0XLUN$&2~0=mzp%Z3b3uW4#p=*2L9EDe*^SCD4Hu3 z2_(lB` z1%9U^vhaz2c*iNo+nJ19ux0sz=*+Fy{#!x)K82CzE~Q;X{_flNQ~oIDVEsPQ3P?X{ zNQGNmiPHX)XTkMy7Fkfj>P5$aBfp4aA0Sx8!D9(~Q(k0Mm>MVwAjcfP$$Ni$sV3*3Zx1MhfJRzmw&hB+}8* z(<2cF8a!m`I(vFJp|;)R*LdNm7aK|p7xsjgcGYUr9+XQHKBOjp1{|JniZygUu?#%x z#KBEkk^SketXMa~$4hXq!15^su3~qK1L|KlHtz8qJ(yyMo<5ZbK-y^vRxU9hKZ}Gq z{<&H9_!?6IG7t|$Iy4$R`b0Vb=Bh(OPPXB8f6+nW^X(USf6DKWx=x1Z&}y@y3eQ|B z0&|hw2l>~*2V+hNTaBei`LOR1n9ZBlLOsq>5htM__ODr?ffez`W4#ryrkl4Lv1fM4 z@Z(mG{?BtyDGT%VOO1z$L=0ADHqW*JUv4qhWBJ25;BA|R<>cfTY$}>l2Kf0f@j5}x zwi!5rBiw>_=?9p7!@^!XL0HXT><-xi!rgveZl3-Io|fidmm0dHBq%hHpb^>=^|fH) z%k2rG{is|@&cgagnDTnl5nn0F#+TTtskFG1!otE?${>{3r5s?S#hfvhXL|JVIy3Oc znO#Sz#K$6aZuI4u(|o=JMdrBIfU+ZS`Ln}9ReAk-lB@q^eK21z{g`h`4$WUKKmy+5R!En@~rZvV3qeUI!%>1nQlzz*jb3N;~HeTNdQy3{Kys?-aR^YvL$klmyS7JwB z?(LU--&tq<2cjb@d5Wm6viW$~9nXPhoib?wFA8YBJ6hZG3)?w2hF4cX1EzZ=+klmM z=V!x={8=~w|8mPQu^~4e$%T`GowGQ^bSmL`k^FI+1kS!p^d4YT?8#F$a`{bXsfZJC zq$7b+P4YCJs4CJwx3%N7mb5q4EWW4!h=BoiekOX3Rje(g$FgFv@m@XGW5gY5Zy79R z>wbLx!Z0)+3IvAemjT9=&ab4le~v5xdzN+0F9_SZMcMf#V7C~qE&X2*1pXmr>-x#* zDUO7`xj3rPR$FqbRu}E{>svc*2R3EIuYG9F*09)&XdtdFd_#fIPIVEzL8@4wNxH<3 zvSS&;Gq25ko=}i+c62;%XavUDi{IYkRdYwm90N<6)p0+bW~t>mv!X`m1ezN~cR4+I z7ydhnyA5T=ORSW2M`ppbp8Yh67Jb1=$8iAUN~)$@-HhuYmg*XL^OZXG^Auh_v^Ubf zQDsIvzxmK-`=tx7*+L=Vrf?{??7@f#8kcEus>e^>=$t@u?t9~{ftERd8NN|wr3_Hp zrP?0_0rr2QgY+nlEO@O+PMj%*%#`-g_r@^x0*`eE@y*#n1U4{aG}zd zYZa)*V6q(&C5b1VSt?AC5GGDGzPtHpZg!aan*zt#+S4uiulU$en|QW37k&^S+6bk! z81Ab25^2n*91o>=dBtfi;O$qZyVWDV0x?JGS}2aCi@X6sZ9^a&vQ8wr=gbb2>v%24 z4WFNCz@6fXHg*U^x*z~F%Bdl>sPG~lF4nE!sxFD1S2LeAdQzCdV@Ya#G@`(M1T(P? zY~S|6qrB3qALhVV@{slA^4NC4O$0wc$lc-`6W~ee#KtW)91GU0z_t*97z8Pobhe4M zoxcd$e54*E!zYS+MEB?*cPZ(hSPdbM%Ct`*+!U8L}_J)KW=m4TY zz=#T3X6la$F=RADMz1SMP7jJj^%RLt{*x-5V9zR_uS@TxXtBtI+oJNfWJ76OEz(VE zJmq;^ONh&^uqssxcbXlg5uvD>uDm?&OV*s{Skb}%WtE$B`T}~oz!GQRXvX_V_eX-; zG_dP1lDI>aK#(;UTFr5x;YgAot9NZAy?|EKl5JRc zfd7@VlCg~^&|{ylOFJcXPj`PiiOQ=M6mYzYNR73O?6MJw>GFO@aNLe%Evl zRR}@sC_t{a0)T{0VxZ&f{JitK6pYlgCH~~9RV9N?Zs1MySYOzaaq-f=uHoKXvjyck zg!@CuW8IPE(>1AvGwPD_osYPRBf6+Jz(QLkY}@jqBuWWJfdzDbemEAb6}~alHRI4C$1a7N zbezclJkmB375QUFwb+6xwe6EGT*X<;3?3f?%bmu&zgl;sB zcd8a2u`kbB_VIG)U7y~@xw#4?$T&`h7LpqIkAamp!}^5Gvx<1A?R8eTqA6rh^ zscKD-Jm+9?;v>kpKpVjT@|4Mw)H^F0I~?AdrQUp8iTAHh=JbpV2)GD6K49n$2yK58I#6|E^abYEl%7pfVbi3kjNLJZ{3QKP>8ml-3?D8Crve$C z;#vMF19kMvRp*;w)MOWROZydjr#9X=}A!ssX5Ode@KpK^ZFuJzDgr02kEmC8B*O>Ar`x}TR>wOHu0 zXk5=l7Dm#SoTx0KiGl^9i|ao)dKukcwKYq8{$ufAM-7zlM2A;=5)oW8x3Bu@?Q%uX z3DZ2N&?=wbB;29oQjh0G%q~Vx*8cRrcP(Ul8@a&q6m%8eAeXgbAzM==(rOQ~JIM6O?!ZG=r%>+n)^?D>*Y+aQ3~>Nip)JIZv+(~j;c5r7q| zUfyeb?=tbq{?w(4hBR%%d7-1|2Xot-3odMUr%y?@O_Eg?TDM+$mI2jo?DO#U4<8xp zxYmQIhk`|V-;TeE-ed>K(vBIRijpk_aYEBuVOGQpf)Uh; zJwG%m4%RD0v(6mstO!@4unN40?jM_px&Uyr(+|TV?5IIc;;>NJ7n1Z>#*mIUKw8|C zpL&D5>!DnfqJ{W1#FQid{7d1ZR5<&<$V<#iD|MCg-4=MQ6_>4&!A8ZaB9mmwgKa*_sg$}*aK9T{ z&GDf<_6JgZK`J$lLh9@~MY+8CD=(uxSrB#Hl9B{Kg{^#|?Yd!5<7NT%8Doj!quf1*OeC(o{fg{S8mtzQ+e~w&G`k*u1f&SyqAo= z{B)Ug^xWpwP>`wInGmH(mUI@ma&5U`h6fC+vMOFXW)vo@ikEexNVmE>-GTGWZkkccFl? zE!q*;U5{;YGa6s2b)l{tN0ek~o3Q)`nbR27`aWv~j=hVgnoS+oFDD0VQ0uc59_I&; zR?M=I7dY=gM#HbsoBD13FtJYwIVA;3FGpr>F1(Q3=-raU3pbn9-5SSj>;N@4ZbUr` zk;?#1vCAY(wju4{M?qT_PCGlhj;=0UF($(tL=Say^RFJtzusi(qNyekE7aRX5xG%0 zKS2kz7uD(K4l8xp0#-#M6-RW1HoqUF7ADwzY!ux*LwB`pvVGq2eq(*s}b=-Q^btTBuYgKychGKf51?J>npHz(itBucZ2!?@)xB(DdGY0T^$*@cd@o z(5bFjecPRC=ckIIAs>uaV<%p0p9$p=g;OSmo)>ipFh+zO;^&8nVATwki&Z2f=4Ej; zO|fzsKReim*V36;Fr^rq@&fnZ^X<|_)kkxg?3D>yQQ(80DO21i9ni;UP_MmEt9d3ULI9tx86#;8Y8F8s|tA7wB$3jbD zO^eHS%nLrW2rKh2=GoI-g@!!!^5z9$$Ne`R$|>y1$1`O#)|ATYBJpR~?${l?>)jP4 zTbv&ETe&{JnCb*u!45Dl+m@t$R!YQ+YgXCz3JX5}=49r1_TMSj<$q~bc9N=>eS2Q= zQg0u)Flu`A1U=;e`G>wLI({kwD!=L!@M-ETSlo3{GYK{E&Qk4r&yu=z1#M&cyMms1 z*F>@RY;@^ee{%E~iY~QB?nTsj7Pce$bf<-@^}inXnh`HDYnP5+u9=AU+@7s&Uod%^ zx>jSguq9P%wQzW0Vct`nCX&8Rk0fnoA92!VEbtWIl!)ETq2{2yzK7ry_#T=pX$I7X z@9nH!CRLN=j@|QJ1s!`g`BgQk0rQWZM~%~5*D7Ryk>49i4uGFK{K?#_qhS|V5C;;$ zTUXA?qm2w{9~1=mOpz%@=t3!L1$%Y>-X5jD-&?nz$W39+AnBa_M8>$KJC+JjE*;xj zPO$_c=I)=1Bcf!|SSWDaxp`Z0A0SVs6IVE-xd$9SE3>)xnvLcs3m%RF%o<} zZ%5Dw@9syr{+Ay`?Cz(82m5#n{^VwF(yRa=l0`*l#NW!J$9*sn7^*W{$yk!ZM67&B zi5}%OPu&YK!p5g}M<(Y=Vi|zLpJ8O|aw!+Zz*2yi1U0R#%+oQE7hkXV;Z<}4Fw|~E zuO94~A;7?Yg$G&n#X1%*y#o-U52%}1cmIIgFxbP}k&MJi4S}W<29h-96PNMw=-7`0 zI~te@J=XJ>vrVhS$!(cKghy;DG}+)=D}EM!aoQIL9cF2R%-MCq87d z%VK%Gk?}ypqU_RZM^6@%$tx*)xO+;V7}syg`pp)+L&g2S}i9K#&FVNMywSdWY`yhAR%4I`|T2z_R=GDDYsiNGt@Wl9lY_l)s*bK8SUs zX=E4&Y>LA$^#c5dSTFc6;;`*mgJ;#aItBL`C{gL;QbB{g1&MqwIgC&MemVPdi zW>>%sfyAbr+NtB+m+H`ugX|xs1pm##8BW!*W9Tga8MK~qM<Szf`S8{MY#DbK!k<{16A3l?o_Oz8UY%yT4X8?|q0p*f-`j1CQ z#;7J|W^}-RL%-0fUGPrmS?NLTIAJO{g~WwakPSyJAO^2x$$`P><8 zUDYUl`n!&90I^=$Hhnf2Rb5?e1K6ewbXb~(Hkf)#%WBS|kIV`Rg>#t8F>9&0z4niW zCBHtT?gBLC!C<1>ZoOTS`5*&{4D7TG-OCP(k6^3CX}_#cB>W<1ZHF};CMh`{N+ICz z@MZAH8N#vYpcsF-gc)|#c;mx+PaZ7eM-eJfK>z+INB-msbv{?^wPW4_tAS5cObW{w z!`Vc}PWmb_dpZKqXC{L5MU>wLb_H%7GKOctUI~tlMr(vI{I=1%34mUWj%&BPN0@Pg z?hDoXf^SrwXAY$QkIw~ey*zNJDQvTCl3b02O0Lq`wAL-_po*bZBJ z(rIJn_m&qlDDxtGTJXZW8>T?zyQXh8z*ix9#sjB(Y49xno>ehU00X)!`BxXGobg)D z*PGi^1-R<)THXtQ&pJ#y~1DgXq zsT6WMU;H z`acD0jMTnB8aRx=DmULCapi!oJX}48-(VHF0x*2da+I{xF!U)jIKxFK&K@7x;2?3z zp?FEMcNkW~(^qGH|IyxP_%D+jrhIoq=C5IGLWN7(nzg$6v3BWM?s=^}u9v>)>6@eq z*8IHg1c<&QmFR_e)!nhbf$3L=r!tp3_07+R2WE%oLO()t4FKi9jhk|>!8;#w_-VK( zhrR+Kg{y$5AY!w)w$vh&g?Q3jjz2G)T;e#@@#Vl5M4_VoWbp$f&i`BXtHRxJxDVKW zR<>*iV*B7U4&Diy(EUReG;MC78i?5&`*?!xj--ED;IW&)el!j_)5#@at%JAH!32@FS%4FH}hZvv9zX<)%<6!V=V_EkA)Pi$bB>_l#(VE#IJ)oUQs z(1YVtFYG1*tOy{s?`c_5HKD}0)odZYKO1c>HJxGDO2(^fsEPKZ+<73G7vKH*_L{zh z0U8SFDotYg#`cQehuRV(yN{k5NCpjOkX%uKvMXrX_29q{PcUN>Kv3aK#4=<0>tp6) zH9eK5SC8de1dDUhX_%%by1lGe=}_&?Gp~D)Tih77lLRIEijC>4?f@$G2hSC3~CvPq`}qWyJ=z z2k8@AzLpE_2-zz4JgyR~{pBDAEN5*S#q@6KjC-ECNdoNh$wmTo*&&&98Vck8E+3N5{iK3z(ni|ymp01SF`_hk#%Pmpy|mV^Euh*5R<+( z?7ic&$}(chlQZ!P)OCIfDrO=R#iI)+_!d5EAj?yhk?o-mJuFXpStDe5D*v`w{bzZm zq&>lW63g&cGLT67M5LqTahrHCluEa~fjc+UH(`F}>)J^HqZ7K9Rq5$B)8cL)a@LXg z(P!}{xc>WmL;UHq7*=HCG7;$piQL*6exd7NmlOVV?50c^oFrFz!CpDPi^c|0FOGUrbNg1WWC9vF}!4V&$no#8cRCa@7 z%!3ziOAiN7|&rYYiNkiVSIjRss0@Jlg@oAgZ8sE*{jOfN^xQo=+{ksop4njU=#xixfq8dAQThmm`Eysp`8tZnJXg^e7c}SG z?34M(Y^=l?wIjbr#9&++W%(iCe56UKLwg5W616I5@=39^MHV@RcCg`8pgDyPyZxy^ z5eEc{qx2#Vmk?@EM&xU-NA3PG_jxzF3juripr8Yk+(|G@9`$;-Yn9j|_kPY=$!68S z5jBdTcJV&%DWtHK_iS?h)ufIKL9(QPAt881(jx?;ato^X(~&yrUnd>sc~1`KsfUFt zp`F=6EtM=Bx0T*sAMnJ~DQy$hu#tT!As|6}8KEwbsgqH)um=v5$NTP+Q;}dujVW;s zYzpdujcshE2*2ee2a9Cp*zmIgd-fTyC3{BKdoh^=7XBd?ee^>pMR5?k#-8Eq@xmLg zY3bR2tqdTxFHQN$-*wW*P@ZP*(Ri&y^;c#@b^?)W)#htcaQzcnxhLju?6@irreI}x z9A$pmlc7*D!@je0m(F!6y=Z2Y!*h}=yJhohx_ZNE4E~7mbsppiQA>e$CG+~ z6|OmKYX@1cyd1KlHTRSMgp6|1-M@(fXkKubqF*RoB{u*q4AxxB;n72E>%rigI9APc zWfgGDJMj%j&MlomXDRz0Lty3SAom(tm8|#WReafymvB52P z*zJK&0$dQzJ^mSx>q){LJ(sahOD_2gteCf&JwsIZ{2w558Y6}I55Tl=k$tsyj1}MG zdmJui)rYFRFpkUc_ifRkz~%;Uj+jL6`)54h3B--3x+#zyB}*Q@pEMl)CWaANqkn$- z4sExHNe>|K+(i@M;(i-k?_hH&_dOL%_KE2I(idK$m_xvF(MDz<;%^YNe7>8 z&TYGpahq5MCir3?itq03){{I;;v*L+XJ(dURO?k83o?0uy9Ug~*Q`E9l1`g4^VE%s zke^2)iCa@h!jS>&^L&!VBYS;$;mNX6Oy&*#T~=>)8^3bQmx1)rF~*l5XMS0aI~7eR zcBSrlEPm0AJ49}9hEUZyNl)SobJVXzhKCoMMNY{=L52OkNK1-xqG4|y&`%jDN&b@e z_mI%SZyRZn%ENDGBREV6n)HCL2mJPW*{8lkM688g0C+^fzXB^U4QB7G=YddJxV(aa zD!;yWZ#$B~^Kiqs8HN9GuiZnk4WGH8qbdT6^9igS{zM*W`Q$4wg+_}fCC=mXHRBx* z{G*;Y1lxw6lsy4rkVIfTx)~XC*a*Vflr2{J`ysFt0E2-B7Q3(u?AJwjzW1W3O5|N& z?`godEl;L|rhO98w)=|+U?Il}zu|u^1u%)%I`DTIhgFR}!0WA~|M>eMzqyn@fxi0( zlHf-Ay4+7&A@?Uf#Zg{x|6oK9(COrTLUWjsR@jhcBMAHdo0ihcDXh zV*2|by94!aagFydX0+{*OstxGuu5M2Jj}>IG~ia3*i{1T4uU_77VU#Db$ECU_+n`R zervI4WF_|h#G3D7I)g zR&3Rts4H%dw7BralOJJ{GQcs2Ydg8PSj~g7pPv3Gizehg7VAM-sJ%o38tZy^(m$Ux zb+8QVPp#^nAulrvi>@f0R)NHq78%rt{{b!~2bcO}JJ|C6S=qZE`)?Md57H>bx!Vs5 zaqSAy1WKBZd+MLL15;kYNlT7{upWQM`tr(@*OUlI2de)oBKE)E{AUvXceMXsUSVK~ z1}*|w?(^kb+^rzz%tBmljlxX5x15UaFJ3P;uRGxM)&Jy6V4d7x%F?M)3HSd=mT3n!FvEsy{Wm9Ci? zvm{DKKjARq)DG&@Q_@YsvLV$Y8TBsov&CxdGtzuk-1s_AKn zbF#0KWEpd}mplyz&#RjsVre!LqvF5j11&Edq*AGnHKYMy^Tl{;3<2(C)RA=nXEFiR zDiter9A3heG2)C8Fkq@=;s(`0&Dn%I=JjWdM;RO*%H+e5_Zn{Yv_4WZMX%} zeBPa=%!q}Tv-viLdyM4|5s*gGu-zf^ts*r(i38lvS1m%n608{Vdj|&@XMG~|S7e?# zeArl>=?0ew#;Wwqo(_?X;sJuz=r^F2W=9E`F)_@^0GG8}ONp^NJjh7U=0b+$=mKQ3 zdlxYy6i>AUP{qn!795@l99NdxsQO_%)?uiY?Flrbm*AM^r@51wu*rcMEA30#=t}Q` zI#Txp80B6PPh)KLr|TSl3pKjmvl^-NT926FvU566(v?o_{=^H;j1Z$*NVwk+XC?&| z$_4vNJv4^dwK;~Vlo;|uQo1@c-hG44Kf@I=6^BJsf)K-&H}gsYoCL|U2-LWDNoVP4 zb4vrWw^SdIZb;m4sP%;v+-}scs<`B`^?cP7Fky4MtdU<62@U-~~cY*QAp|2S(5 z_9D_1B@3hinYrFuGdAGX^Qucxruk0k*cLihgkuP-ObFwEaNMq1#5h3%@w9`4IWfz3 zSO(oE$Bc23iZ;f7uF|}4A6vYzNA24)AHgX@lC=0CIEc8g>=a>J3lOQGR>;XU1#BlH zEX{hZGfsi-mu^c~g#ZeP(6Mq&aZK;_!G@Xud7UU!fU3|of zTI&$>dnKC%?C9U}`uEh|_0Y{a8Ffm8QYa>U;pvty=#)l{F$EFH@`LDv<*lbqddc#x zujD9u1{pFp^q48V&j{9Mo(p~|q|PzDd8ygnPQhYv#*c~h8UzbS36GK+G3DXN6LXx2 z#r_&vt4S9u`|^M`6KPfRYEziADbLx?QHf{^PDoi`gT1Y|H6puBFsg90wyi=pls^sD znmAp%9vv4m41KFENF65xts;$R1UT&%r%VVEA(LW8KM)bQuG!DGC%b^q{9t>bY$Ukn zc1IauZo^Z+!l@Gb8I>k>@sG4Pp6g2%HqxEWW|31d+2RoFA484{v81q_oU1nd;0 z(x`9_c0K9pT#TP?uXS0|E48R95SClQNTmQHL+Vl^Nbbb!6v;nLi!(n+OMBJ+p`tT1 zjZbxYC&5cQqF|AJRwUS%z2I_6!mkm1Q->gTfb-w%ScyvvT31O4PoG74tk_PZZzn1@ zoH^HI4y`0!8Gm!WfpH0I?sW*Vf|gMNB}8YHSqIGfzWR@*4 ze8}Oq3I}aZOA?Wl5=kW5-(_4yA8MKmmb`q9|D%Gb=TbzH?(nbib7WEs7><}mX{uWe zqKlAPcNT?h?kT1YGz?Zxrx(%)s`#)86SH?MD>B|2EEkTIm0Ieu9XjRepY--s>Wg`y z`JZkpu^dE$QKF0Y6&fUzLw0;CgsUIuI}qC{U(kqQ#`pg#FDwAU|3!+0o=zpgYEESt zdX?&1#yi!{n_zHgw?GvG_Nd7B8Y);AID<=~FlFvWhErq$Z8;|Z>w$GjpYExv#Qr^) zlOyHPB1e(ekA!gD;F!LfzYjFGAW+F<^39Lq}0rIJ&%Olf12D5swX;e;DK-N`R1BB1LAOW`bq-$BwXNR`vCMq<|3v5w&4gu39tiC{A5$idAkjrJji^;b&2a-DfRB02ut;y^%K*%Mku zLQ^nCzyfimuPCCq{rrv*JQOqG?#^p68A|fLyTj(rKR(=N`;(8BK`*mOOhN!C&hCal z3RE3SWxsDX!z=(U9dj&FQvUO#Pmr|n5qmZAp8+s&B3vxjptmf+U$KcEjMcc#|Fe1! zbO3e?2>QE&86~?CrQI)aTmYnC59yE7XYPN$Cgw1z+&ws$Ku_@>PV(PWhQCE<&~s4( z1lL?0H+J^i#Yaa}lIZl26NTFcf#Cc$S3{U(W$xVpQ^H2<9^WMxvlc7kZgOC5DT^Na zyLTy-HC}_@%ys#unEf|}(~?i`@1l6&KC>x9V4@xiqNs6mDqKt$aSzEDWR6koWiP4z z0Oo&QoFz2ThYxQLx)hs_$rq-mM|L|h?WYWF&j*>R0-E-9xFE|lB;TO1{y- zJ9IElhWFtI%{D6T>pmzueJ+2Y?>Pt*qdGF;&!=X;a$-5BD@6^UyG7OqF zIP#b@`?ZY=L{hT<%w+k=f=YF+bXm9}yEUbOoPT^LacmM3a8(~W|HbDTs;QTarEd71 zlNV5pVgU>7TcMZR9zrV2I?(9?xEX-*J@?W?2LhDzAL%?EG&n>@05^T+MiMxOBo}=( zc_isPs|f`Uikh`aLdbyy=6kKe({P*HUiPy}bj3(7HL`CO;o7LFo@hb8a>6hDH6Dv? zXgYZ%xB5q{#P`?xx}nONg9&Dcah1}a;IY5>S`SWeeLkfDN@XN5x3c+L6a7Dtg}!EC zPweFu634tsCCoa*X&&3ru@Jx>Osd7$QzaOky-DBR?Rsf|@-B2NA$B*zz)<3b+F_Heo#wo7ahGfK2wdy_BiG1G(V{4k z?eN&?0*wVMqU7>3@&9Vk3+mZp!Pi1goy$2*t9aze{h-Q)>m9)u`jPwwCLNJ_FkqIt z)=Oa0sHglCWBDIn8Q?ToGWhoB=cGpuBGW+6^j}N^E$-{%cgmiti<4-)J<>ZYO`&6- zX*e{}++;%$@Y)OEUC_bheomXtw?{r%@HRPDg3I9eUGX~BCy0XHQ1ixO=fM!lp_o8L zir*!+QO;3%sbHD#{Cnbyi$IU6_N){`zkV#oLSZu(C>_#?ZOB|6!Q)2Ht z(Lmx`^8q-QZzkM9nzYEHublO-Vr~Q`*ui8pK5W%o{&`6n=`B-ciBhCwfv7{Kzt>Ud zBewG08Crw~r6qTUa}qt4R91mUk!cYkedTg2y6FVj9K2yr%s!&Y6Z8Cx_ogl`E)9fE zdnkVVC}7vR@dadc2ZETmPy~&H;30M-M*fUzSOI_amk1&kb&hZWl2xdrMln(D8-+r) z$KgS~+$wxd#Wb%IR4cQ<#aQB8=iNGW&mph?c{7F-c3DS=DvPAIXn6_4qtErLN}S4Hmi z6`uCG#}pLvm3>o8I5yN6jn{OM2jje?REPp<$a`mNU)q%c;Te97gxlv5L+(9~XSoJG zp@a|JtY^tbSwdI+?1EXb+El)rPwM|xf(71M)CXxHVu9~n@(LD;)a@_K5!Pc$tc%hJ zSZ1UhIEqS<*&v3@i+V^BxkVPi8dw)dEw;sRvff@SZ{zq;l3Qj+E0OF zWd81b3B}3ioLubU^@l%kNF> zC`FOx*wE`n3U?Ppyw8r^7yE)zHp2aoMsJT3@u4f0MSm1Sosqr>u z-7+$up)5M!eTet3kvBP*m=?HHr?^q8#zz*&BgI}!sH|AI4g@Pphu{m&R281@*Ffhv zdp}m_&8CfCQY{7#&trYn{4?s?{9uQa1Txz4Dl|TqBgcDkC|dS!(^eQ|IM#``5A~ zqGum<;WcDFN`q|sjdbmbpbC`?o7CvV#2T^`59P?s$JY7Bhs@c|aZ@bhouFr5YwWBP zu47go+X0s$pI_YO(lKz7ALM}~R*cnF!TCqCszP%1shCq6&x&M<)ItZ%>?Mo7DG+A& zbS?|uo}XT&96FlT>kH|Eqp7NFxRUk}w+~InR0CD!-*Bx>ggZM3306m~#D;pj#SfiEuU7xvJmOAp5IMcD681>t3V@Zf7HR2jvm-WLwkZMnF%^;4te_OTl+fJ)k{}+s88E=Drb2PpND`-y~NfeSU-=ZJ<9! z2Yra|B6LrGUMhA{5y*jV`dF@~<^*7^m(Y(E0GYac>Xpj<#HL>%)Lup< zk9*}heyO?L*RHI+$ib;Y>=R6!4E7W-SWoS}TKEQ`2it8}EAc~}#13xL61|7_S*{^9 zWAcyqad`a;oDNzteNFji!<@g4beN~4NuugRSb0%(6k$Y*OKM9`BA$O8aj;jCComsh zCF}4%e3F+6N0cE*o|I&CDaO7OKlKFRhrcU)QV(F*#GC$)%eu}>O++ovt9t`ax9FtT zt)X$3o=y(np45LIfSbCmA>1)3d z@ffA_k$D`Q=f~%XNg_LSOI3rx^<`!O#h>$s<`+Wo3Kkv17X#|sWCt(zlHv13Epi~m ziUnArZ=gS-JRRP2`$W%aB3%^D&C0^~bO)2?(~`@D1Yv8X8{yv%Gj~eO=G9$)|Ki;X z7k_^jTr#Vp<|{d3550sHK&e~I6-jHqf*$iy6Y&>E+MnE(z)iE9He66X=A&*5z3|3BJ^11=NpOxYl6?XG+N?+ez@aB9r>k^ zJw$hT{KH`{ua;^x?-c^`{}vxKwGU1TJ$k#WwNTdGkhCgrNFlW4qJP1! zfsp!V;|r7mjjO?`o}-cSDW=@foCze~trPzr_TDnA%C&75RYb+2C5F;1p_G)A z(kY;HDK!ugX=wqK2I-QJ5ReiCq!CeCa3B&=N=T=4?&}%qob!FZ_xslRv45<6?DfyX zL&sBhUFUVi6G&* zu~EvJI)g!tEVJFEYdB<_x_sX(%P?8`ETZ#~St?p@jw!?DD3zeaS9b38=g^TQ(W$hb zBJ-h*5aDu0+k&Ui$ZejV=?(7FwVs8X&%`^sTR%x?j-{u(lJL1eM9CFmrDC1?M`w8eo3q`;k2MilG4kWj)0TVR|+?YS99$1~+?-VEBoW-@KD> zs+&C?F+Egk*LJw3N4jxF@6?pb@N~{+|Hko@a%3?>uL!VOgDe3d3wjh@+Tw@iI3^`R zKnUrA zW@{{8fGwOAD!Se$)q-|D>fd3G)O-LPn6;7dJI!e`)ftas{g@PRR!+SJVf{-$y)3Am zJ^`<5qrA(-4S5heq30Z&N3pj~h+0!Z#GwsbEw#;-sqY4n5 zYI#Xf+{2Hv48h8wYHi`uKsc4J*_Lv>dz?Vij$nCVVWFLk4#mrmei*kE;Q*xA-eiDkA$RnxAkfN? za`Vw$77V&ez?$wlF4VO|q|*&rzn*c*Y96@A|DDX>e<&!C%H;pk`jB6Y2R1+KfXV)^ z`kudZMX#VEhFL#JWW)eNZjTLQd%(Yt7sA$FQjZZD(!d40S7I-r+f_gep9(2~RR>|i znMXDpE&ojvL=#M@g8SWmcZ5KEO9oWNri2#)_N$1lV`xRzR2sG4t7XZSH$v?}J=AEJvk4V$E` z4#Nr3A~-vRJQHRF8O|?$+%LI_e`DVJxtiL0n7+@S(}6FZwY{@5|5(a2gy|AQAVH?$ z4gPzB<+>EFeiQ3oiK+XH7RwN0A)0eSj&i7fGH3GO@pJ+p+K@-;Z++~VzC48*7~hh z!S=iULCAQ^1+S$Fj7i`W<9ZoN?&Pyk4hUe4fObnD0>cFHMBoDJ>K8;w$B6eT9fJh& z{?^H0vAzGFUO9moW%PGL`AMojCZW$MCc7XIBMjjlAPI+dPgyRk6j-99%ze-p9eLGj_(OnmW6T^48X+oSIFkF6|ww^wWK`S!(|M3Gmj8`rFmLFQ7ixWiFw{Gc-b4f@s zu!H#89|oeS;U5+VFut)YzrWc)OvLwZ@|}$M-FBA+YRem^%Z>A%-Rf$K=G}r5**^nV zlCvSbt4mmcb1{UH_eCiQw+ed36ZB(9gF5qFT9JmA>)gjgf!qO`I*+%uvr8MoYmv-c zLq-oKEmo%<2=)?ZQ5sxJMKo|B93t`qzeI6eO@3&l&Or9Ryw`xLtxp!B*6%d++z(%{ zc<{>?{%^ByYUZu;8T#a9v(i`8XHplZDbB{g*%>JNKc-4TMcu1)Pqmj1#khQxUGj!0^L7?KzZ0NB0ToO_I<7(^rqLRk$&U89Eb zX=;n4QI}V~k=2}1KUK#golfnxy*fS9d9d5*JM?7b!0vpNe|cJ(EnvF!zV}BBrH5a4 zeJPa~Bm@m;S`j*J^|&_yUEE`CO8MurK!E?wC=i-k0Uu9^H~j z+^-3Ni)b1UX+`&q{&1|c$*SNo;2I^J9s~{iCl()e%VtGVkE=gMcP}H2%|1ysFB+@w zT2lH+PJESuMj*4{0&uqS2Ip;SU}mI?XM*+{n0jnLNCncTwuU!$yl!S@8Pg zp_@-O*6|2)EQS+F}#h(BZ1YK`HD*E7BuV2S-+{xG8!Y(dcz^dh|3?MSA0F&O2^ly( z2fr;pk8=}7pr&L+0ym;qGbeRM7{-Jl3mu6sqzpkdanfYvF0dd??5$LPz||0z;lxU& zGu}8b^4lMOY?UbslBv*fj)@&4@h8U(WCV)wGy=IwYbMmLAVXw4AoeoheHh)C%sWKv zzybv0&UD2u^gWGm;cbmO3d?N$v<44 zUG?nJb{QxQsxe403yyu9&feRDAmKBqh(f}yyo((-7$!%^lFpYtNYHW`4sZw{2|;|jDnYs44U)cYNP~L` zIb~$sw-Lk?!4YMtUB(|SW)b;xfoA1z0QD1N;oG(We2n%&1jqnPi9%`%!(h7Z_uu~w z%2p1Zn9x}Sj&SGo2z=aicw$p^WOruugNb^+VD;o-1{_QAPpC6jq4CD2%oj*XnnP=^ zed;KYyIo8uCxr?ydFa8tsmf*Z0cH<~n*+ z4nZO1Yn3@tTPyZuVBp-U5M&)We&p{haZ;Eu&?3&NHs#<{99W|am2T92Z61P^#6Y2x zZ|J@({pIs#l5uJ()x}j(>hBxS%6+*|cd(xt1}g%q=sHv!B=$}&A7B8l1j>X5^9W2Z z*$Z==6A5Un?DcCegwV`;ZxgzHUfCVa$x23zGZ#)_rk$*qwuhmQUGS*)7m`=o#69Pb zTL$lh>uQ0|!zzS8x?&Rp(U;kxZtLZz5}ILSVma|o%4aCezfnHxk7FJTSii{uYvCM_ z5wO4Qkh5+Zv zaT?WDGm%TboQfNMFc$KyZv$Fulz4=c8;G7I^e)Z)w}-vaCxUA4r|9x2c+uY|Idn!* zmgtG?*mQaZV$4TtRJwWEh@IPSC;!fZCcjD&JyRh%O7C#9et4|ht(-*9{%WyzKXrd( zxYvMFpJSIi%h8{_9OY*FffAz7^f~S?!$~~W6L<-)kU=LbOnkpw7<%bGi?HbKynG2O ze^?9|;r$>`qaX?L^>y`6PE(GO>8F8z@iUfJZX5SXJ$9V6Y!tP53Mw zrjaGr!j3Yt$TKAPexS-eI;%^g_B`K;a^o#|jTl$OII-hch(HZ|Ehg8*R6cIt^IjiC;oVSz zgCF-2v7h}-zF|O%?|dz>oPiYqMN9cPkW}a-N7bP<+o>h|niAQppL0L}={p%)7KtW} zM|rd?TM~u1I;YR!1g+ACcR z8mv;v#9;PX;5jjBQIG9aiGo>!s_z4&&82qk!YX{s`DZOjl6qG}rA+qCKt9n-!_P_g z?bu;0sj&?C$nI20-@%6pQ83d5aL4WQp1Di%xoW5rTY@7`x;XD!X$mxO~SfZ%D(7;NgS-Tu!gGBQx#0R`9kIts- z@l~_v-xINQ(WTSPhxp3&RC>KIrjSoI3*J9Qh@^(*<^BhW&C02JO-q%S2z?`(q515( zFnIC0pw|5T;(`7GN=rx+=tdYf1kN&#B`jfW%6y(*ZK5S@B69r&z4QnHx4YL>B7Rp{ z;|DCp&r;DFt5bknP0Svrejowo&x_@<>D8lBCacsTc1dz1E-f7$OAvjy9elC{{mj;7 zdS~#%5OCOHi-NPvv}y^zp4P^Wmx=O{b}g63Hte)U1Jz=y&+x^G3=0Fw{RmsW3eA^% zJ_dTF;dJh5&Efs^Hw17A{hi2^U8y9`?dhE>*Bf65q3tr4;^m?vda_{E-sF9Vf zT60F+QCOZ&K?&out(`N+*xr@pnH_Y6kYzW+V2{+O=2UQ&%A&y}3=6(AZc7jUyT~CV zeLu(S=QduaP=J6iOFB?+vaZR}9AlXOnjbwyv3=t6cm7VGU>#6tO>WE4Flk+Vs|-7U zz^qI+?DW4R?B=9+H)Lq@mvT60kF_elb;4wmRDminMB3z@9N%3&WUFR@ts1@BT|&PF z(x$VA@NjUL;1Of+VhdoQoCH`P=_1_;31eF9$a)9+=HqSfO^cndD|jqHkNf}`CNA?) zUKmG7c^MVRqmD;=KU{=QT&oqg3$+so+!FX`JpNn%Uf|#OY#MVKrx6j~SW2hcMmQYu zeugNLgs#1S<2h`V4li!tf-O!rqJKN$@Z^z1Jp7`z930^s=^$wHEj~P<$czLj zAuH&9iY`T!Iz#?V4KA*+5WJm}X_%E3$p4fPmx^z$T3{F-aL7&Fv4sgeiUi$KE@A4bC9wm{b4a4 z`mH&aV}a!#X@?|}#griZktx;rUpU+!$YKf3n!g2A*RR0)2j@s4oKmDS5m@)Bo(QDh z8N66z31MAd$Af?Ii{rI~AX=Z_MQGZ?t?cE9{`rw#IMn|Us;qyN1+g<)AX*~Yr!j94 zN%wD)qR*Et4Fvvso1(u#J#``=eyp#rzx;hl%xDb=Lf#>%wDHon`a9rj41OCT_Obsv zoV+-(a|IBGL~D$wtVBy`iSbIH=Gcor{cEcJA-MlTFZK##$(RCH!ZWy_XO;0{#`$kw z_Z$>$CArj62-D62QT*sg%Kv45auF_5!^$8JdlVUbVqI<0t3HQB;L3;(8MqAn-z#Gc zgZ}T^{y%JlndgET4f_`eXzB*a;}@`XDdxXtzXplknF}==hWsXtr}-gak>6qJlSjdD ztw&WQz^L7T#dL$tryHWbe6%m$?MsD-v#b2K-aRT?u7>2%J0L+1=-t@Z$OUao4iI#5 zL6D(G<=CzEctTc|5RGt>Npe*>dH}=MHA?F~Opnq?AHDkbVn_)XjfwU{>G}+!yVCFS z6#1S|PCXNe9_3f~!vzRvKo2JsfL>HcW9k%+0v#&;DB&waD*P^O{4_*0kevVcXB~bh z5r7y2=@w59dHDQ5Y<3{h^+LG%mVxtEOg7Uk8ylMicL?|G4JV={gpJ))?0ZMtwFq81qc`w6P5njt-V>1!=^nB_5k)5=hzFcoEeoq zURoYh<@Y=$Jd#CK(|)q!CM4on%L@wKp%N{)OOI;sxwH^x{~(V<^@vvEMrN!qM7g|2rjX%Jm&KigiZ0=EaQ+|3c#B9606+QD>?6k}x zI%-CC@i^NENq+^v-Nv#en{uz`&MWPJ{jRw5t)~v)1H{i$uqq0H@n>sT(#gu~LgrS2 z+j^7Yl`;rlAuRpc1VSQQQrP|EjiIV8a;iT{o(-gw7i50WA+LZ8aEqkh+Hk%waKqx} z_&I)1dN)|iQFr*WtZ%7YFm)k5O?{{sn{KE76$0CUS;fV-rxo8V7LLp`ff*EfHcz>{%wHy4 z5s4`Kg2)=a^)2}vJ=MK6nKDAemqvu?vyHfa_}2mStt6c6-Hu1Zi5hEf+1!PN|y3K2LZ%`A`F z1*`}nGL7zQy*i;Z@@_7V3j@X|J;iko&Br6 zkg4nF`tgWF1wF)~vB6+6#V~)1a;KuxgDY;p_BOAsBBx6O&*fIO=_!Zvs$0W=vOMSu zi554&Lty$txJq!m0y|5{wSOqV1LeW%BfpPXQP1f5X;JAs3W|9MOa2J1;UGy=I`p-8 z6x#U1Z^^3~hK7=}U~p}29FobrRgNn^Hp4KAXsLY9c{K%KpxmEsE`QH>u|?p*Tvu5* zRS0oPt*p7esA;gEcWzS;N1F9m+~fG>IQg_9s>NrYQ_O!KUCmS*hLe*TzqHoA|6$~v;^Q9H#=Cb#dvNq+eh1M?ReX^ZO zZ~DHmYHPG*`0R=@18Quv*QA+yQVUn<(+U40 zp6P>}jqvCf=F%Rkeyxbr1Ps(RLL-dC*`}4xT1mS*Fo#n>Vte0fd#==F%bxI{pC&VTK?gt zhhvY-s4;?fy0bk(@%FZuj2ULQiJ{~_iclsa)U?P@{QXMY!Uz>MSZ?<`Ugah zU;j?!-1X+lO}*rqJTtS+!veZu3f15Jh8g8smpYUxWVXMS+nU^8Y|8MfceoR&#W%Ao z29DTg`Yb6ujTKRtI7Z8Kf@OII`#qhU-(O0Z0f9e_E+Ljwz;%9Q?P3VrCEX@`i8beGh*3M^Z@G(orSqYq)C#BU{<;Oe~zrp8=>=vH(GJM&?)~70I@n@W|5V+#17dMy)H}9}}Z1*EBQ9 zE^5vMutZhPa%Fai6mHs1A(2-SDo8sXc-YyX8qa9G4`j7FE8{IW1rzkhHfn}|Sn{#8 zbWbCp3bOZk{Yob(4RiJUBR~f>Rg4>+)cC0FS8tB$^;3J4s9W`HCW~&tRKiC}K}a3v zibOvXc6@p5EbR?|c(kA}Gh$aXR6!=1LG9uCzZ^BJ@vi)A*YmM$3f(+4;!g4inVfla z@V=2erR~q+d!KK#@9)$d=qaa&iGC^7hpS7ZD#0M;neGz6wS$}dfopM#7txymnL{E~ z5C>Md7~{G5kVWS~!OZ=w6d_@Q^Ny}SCqIdRkca3E;Nb}Uk$#fye>f%1F)!sB)i6;w z&j*G%b}?p(t#fB`Rm$ZQnap?iO~I#b1We;{!8ju%+ucCCe~8deyd}ushB!**YRMp@ z#KRvSJYnU&EjNu22g@r@P~V~_pXj9XGd=&X4e9CMK!Dsc7BaA|C;Z0TijKf=$0ubo z^Z(PJe3kgNHQMdySlynU-Lu69O?p1dslIc+?*LxnWzUm`kY?B~MX$rD-!P$5DFi=Y z&0BGKh&NkQ*H1PsdWlzj=WeQIq972Y9Xq6tkGw!?xL?o zepma|%(S=FaMS%8GkWLx-BRdljJnTG{aO#8NVD*a1zJxxYY+>lth~Pn6_wxKeE-E^@ZkQ#pt@?cvQ4q`>Dry$Ft0p( z!`IB=d+TGN8hR??278@(I;GuN)4s)G31UZ@>!`fxdyc1t3n56$f9=7R|Ai+;eUll* zUZw((4b6VJD-@yEkQ*>-a-lsu3;0TK?3Et-MsC>WCgqBu=P%D%aPq+$fkl_&615vvhc{*XC>S z**+F>AhP^eyT!ttc83^i2Y$EfE}a&PZ3S45E?DxC;i|)e{sMR6tr;{qkZhG4v>5pH zpTxwSJWHO*i14{5E)~UQfZFqgv zVjS0`1I{mRcgbtdHZ({m-d&!OGXJ$|j1q#vCkSp!$ z$yGT;UuyZ8*>S$K_a%El`Bkv~EGk|Rg>cH57`=OHT1FnFDDK-*x5i?=*xWj-I~$~q|@EslDBNasp3j0x|_!sYVjjq^*y&H z?!d-hzd;xx#1hf;5fMzK0)Yjp?|ac}lgp6)oYx_;SncsHP><%1iY)E^$YKkNo(RR4 zj-+LuWz~ZcM=4!XlVL4gB8@UMsme-_Ka`zi9&NrLwo$M3Zx7$B$&Dd&Z0 z{U^IKTKRs}Kw%g?I`-Y~O{iR*(4D9gPn4|N$U*=CIpfJqR~IGc`XQi+F(y8Ow_5vl ztX6mx7pR#E>-H-v5B7I_lV0fT52(CU+egH#s5O+!OW-}F?8yF}eW<*X04is;%6M>q_>1ls*P zFVT10SZxbBC`5)F=01??2dovm->6H1gePzDGVr zzoN_?yMAhWhERZC5p1}y-_EM^#K8GS*D&?;_XNJYIY}(;WaC^h+ zL6b=L3Y$iEWD`xH*mjd13a!KAx;iECsEJAh-0u`o&rrVbEx?KgHkjmEme{7 zV&%@OA>E!X7LL{Q7KL4`l?02}a=_uHu!e~HK$-~H7(I0`D*5`;h7U-CriAe)iOH>2 zV^OxVwIl~B_ACn?pjVhfpBK2N|DvS0AS@&O^R`8Ka=O~`z`~?MiFL_6c!6p-LL_`# zD!Y~%`Pyd>Bk&Tz3}QhPJn96%>(pkdtBR(TYr z(iYkz7`1okTn#=3T{ey^9l^=6 zh_7m^Zn$GwU5a$ZX@jDxXDa3|JHD;iV17}w{PbG))4Btjn9bIns3?UJ2M^Er%(v$x$Xibr+<%uoMDm9b2s5Z*V|r>IwW zR`+*Es@#gJLFS*MtJJd#G@)G6I5hm$DYn2)1s zVuHv*Y*ooSz*|Ur>Wag?Z8ALIwgzd0lORE4$F97R*+wUz^Xz5Q+lQ7qm&%Rs9y>S6 zGMQC5`l9DnH9C?vln?g7eo{k`9_ox;IB2crCYz2S-li;%Zz%M0p(b)FT?}>Z{QxuG z#(9;%Aog5vGBQ#0D%XEyEcvR9XIhS01og8$Zu~Mflmkk8Bu-DpIv9Oe;Kx;Q3N_QS4JsPE7 z%U*bSfn``ec{)^>AE9)+tCHW+O$Xo0FYpW94LFDQY{i&2#WX)$${lJjPTO#dB$y?* zvh*-Pz-CyC;D-MKb+DK}{et9KV!uIEuEEQ$VFgPb6zLlegT%g5 zH=e;zz-=PUY8&g8_FFhQAHo`PTxlu^($q$LRSw>uF%Cyymx$qU~rn7Z@~b+0^0DbAfN1EMhqwd7~j zE;G+EfFjG5=Z3hXVPmhA(8o}jz1PNY#5m$~%E=W~S`y^8;`V^5Z96&(uK8Z+H5ea@B88Ja4=YLXVT~BORwQ-j-hh~v+uV3-R$fm9(7&%+9J+i%nhs$ zx%{budH9GysNNrIYBxexkAN4P5@;;BFS>k%kx7V#BS7=%e?(Ql`T0r?kgK>=#iifa zN@kEIy`J4eRKqReA>dzpunIn4%0?CHdo54S1bp1?ykcKyyxUgS-sMQwTUji&s?vbP zig!j1Y9m;PW`~~0)4r?feMgYPhC4_jA|DapYLO&XrZ*mUxiF0WXU0XmaXRdA*CqQi zl4mbr0jJ!K;Bp+CXxK9~L#s;;Ta$-mGO08X%E^Q8#_iTyw=d2zqBPcqMrh^?qr`Xe zbt3yrdn+bi8ju@iZ(DS#eBmUQl)w|L6Juq-Rrs}+Fp>EIwaHrsfgvh)8EwE%H9bGN zg_<1e4agUSh^9z%nbT}P%@*eFf%E~MY2F5kEKo9U;Uu@z zQo^pn>|7KL@D4+e*{zf#-^~QGJND%lF-ycq$deO~_$x%P5D}qmh?4(>bs)o&oQPy;Xg!j!nu5;maOJZ+yHXCIE+l4Yz zNO!MBw_t?eMkf`XK)GaUs?LqAj=sZQ>HEgoiYlCXcjSOdeDKvRZ{sL&uLqMN%2(4k zagPzc^1%M0{I6fkqc#CO6xNej-@wiuvJrswGfyH2>;tR=@-K^&d8x5)V14jPWC4#c zy}7ZxH}N=iwv%POphu-VYsq7B542((HNU5=Z>k8jkokfendYE^wZqJF| zWyRF7LufMldxPJ=b-UYux}8UOV;R>U^>e@jdCmM1W2xg~A4u&(Kx6&6%TVnSY!5BM z5xV~P8>dSPLZf(*gy>V=Ww>|sXrfNxTqc706vjLwUAFYMU`pO@aP8~<^!(aD%!|92 zP4G3y{SZW+3l_4D3oyih9o)}%)Bh+O_2b~EfBW0%s8vbhxK}7Um927;haUF2Dpceq{q7F zlYghW%*fS##&1L)*Ky{fM~TEdJVpD76{dzvbfT#N^4OW`Nn?2+JmHT2ohs8&Z+8@O zFMel2(VU-nImR?Q*15Cu#lLD1pK&ZzVA!8Lc&xFMdZl>sRl^KkH1|2Vw@=pUM`+GG zdk~tT|9%@Fvc?nD<%^c#6kJByR}r87UOzEm&g#XAN$OHg2X>;p!qNB(v?zwrh=H$AO3+mo-cx3?$6n@Wk>%0Mey^V_FdYnWDEv`{zGwQl*$m$kjc zTuHCZYjZaX!>Dpye|*GZQ1d9E;%y4bA`I>w0~!Uk{eAT6>T9tr`X0z0Q#(mCRMR)z zSF)R^swf=pM8d4pH<=u)woF0hX-Db?SG5KWe#k8lY!yKRr-&uwT=IS5pFcarX$CcT z=0lZdSvU?~O+`3#XV|YxZQT6B1rVIB{N*^-C8hHQtwh4mE0L;(OYNqVqi1t-=3swh zyyRf6Gpcebt;P#qtX%DZ9JY_7fmaTF74=0p)SqxVEW@Nf82X+sZFzGnY(!S6ktzw; z4m)C1s5Mb~@B$p{P#ls4_n4)p@t{L0D+R`@6%U6(|A)S)FLKGX2vto}ZDskFM(~(C z0s}I|3#xnzmtAlDFkqvqBDG+@RundWHuyO8)Pr}A2mq8jgfoxaLc_a-yw@EkLrH89 z??FBxjvpoN-Cf*R*Glu*sn@k)7f?pf@;EGVeobu#vBe`u2jztB1%)%KM{cK$xPf=; zI+z`Lh~)H7*9)|}0wm%I<8#|e0v9~$5%fv^mwoyutG6HZ*DBxTgT1u}6lOG_}U4^maQ{GfJ(neignS zLl}yDI)a22p4ZW)JA2qJ+^9Vv9 z;PIJp^@&3;RGyGOF-~*VcIA-7-u)Oj`ADCaSxka>iR>^zD=?bNN*{(myhkUR$RHu~ zUY4_=%uc{SJ_U=q@{EceJghrB>4lWODD&{ig)<>k$OEc*%8J!q(9s!IvorcK* zO!xqah4W`2DWXb-6-$`#zC52(rOk6P--zPD-uu8at0$T*N#h>$qDZWj9Yw5xt{mNl zmgV(M(T!(aa9e~=Oqzc}M?Fl2QzbI__Q&@ishvY4wRJL5ePAFW;}sYRD|w9RZ6R-( z{rj+UEr&%O0YN~G&+_h1PSqz%zuIVbaiDT4*7*bu?1#MR0niJ|kT)V^^@nwg_9>Zz zFP1g=O~6}Z5g_zfPQ{L&7Z2><*OvVD%q5+$9Y}y*)42IBa3N&3r-0-CYjPH-o*+yx zJsg*e^Xm@j^jY?Z&*Edja2L<)Q33uLNFzal7CcYG`~R~*hXRAXDTLR^j5D(PLS2?B zvpXltJZPqB1RU~~F|v^Z0otVXtZCuD%`9mlf-2ndfBYpf9K{$`#~<+uNp1z|b~YbW z3dMJC73xPpS3adh3zSFjnf5oFXTmqI_m=t{ndB*lGGLlSAtq-iUEwDZ$e`YxyK5DI zF3G2VuOZ@{m7;m4ha(dJ|C;A{x|!Xr z3jlUJlue?BG$CNd{#U`;!?y(n3Sijy)*t}V#T8mWZ!r5s3pz1%d)6y&Y4)ZJ>sd!5 z{ya7i0Zoo+>jPC_lR2P|zp+oR(L(YvA_In-F*g-#S*5FA!(- z)j$54J+#*kA&rq3PQ7lh-|8mZa>KqB2*{ipuF$e3+_CslpaGk zZ&7R-H-HXxlMT!rb#af`^rzu(zda7U<+0hP*P^!f7NdnXzrmf1w@@X<>%ZN;1d{yX z6RT@$Icu}Mx&5y#VnuJg-(dpUkVZRi0|0k#SedbI{HQ$(q4y_naLhM>jfXU zg<`X|ZqV-qDfoH9EPg9Vvzv-4wlmwl3}!G)8+Pr>iJw<}s~wqU83_2l-uTN*@Fspg zDhQi?_fZ0S2IPJFLmd`ETX?zrO8hFPHf4bM?t&s~*|F9{(uPr{x)% zI4|fwFh1zclsMHk#g9NxMM9p9Oo^ewa$Jc2NFZoivL+6!#}BEYEx}a zrur%z_mg9z;yyw_46ov#uEsv3G?(?<()DRA!G{x?sUKnj^N(JXkYK01F7-~DmiUz= z4&T0|hEG7iCu1qx@F1cJM&`7m)r`?JkBn&_UT2gzJVBgI_Tk~Y?88>+^l9F$+ z&RZXyIvnzAdcV$I{#jtbqC8;Vldx9XDPrHz-x;qM-$a0-LGrP#f9!;wYW7a~2^=x+ z;<5Cgv}Lf8=S@#f{{g}~zJYsH^As6iUCIZ7HeSe4ybKJ%g1iQ#=^?MzweYpnDrENn z&Q<~-?Hh`-xZ7X+;RKKHpB0*disqu8W7^e9D;ysy@Yq(ALvnG zz^Br$Kw<`uVd75R%;G|AbvU1R!nsrPWCz3vx^P=BRKes~PC*+8>@>F^R*yfgu0tzxytq#!*B>w7=!T^3nQLzna+jtDnRQFuk?Q@L9F(>8&+L z2}?v$-}NDK&3yEI0G*$%&Ryk+^9`HYC1^FS0*Joiz8MmxPq51Ma@K0&Qqg@?e%#hj z0^rGI45aL@vM`JY;9psKTl<=5fGlM1f|02VLt0S+w-h_!6wm|Y4jw+_!I2*6yP#-v zQ`mqwWTkNj(u)*l-T;d?0a{bLD`o)?NlrTG7`2_3;3I857g#lHF?cXtX=@9@>wR>l+(_UeJ&Yy!B#t)tf>S zp@EZd1YgkDI42_?TJl}bz}C2C@mhoDJoS2Q32p9OE80i+`VY~&s^QYqUt@#M>ZHxp zn&zxP(dkB$0G^08(_oYiN>5MWy5oq0g=56>Pe^(Ha^B&SWJ?y9j)^CN`Gn|}@bbKk*Ex*b8*d3Mn4oJn zgk>-fKxxf#w0t~5vHhG)^(`lu)`pUSfifbw;~?bAs2B?siEuJ~61Xd2X(9fVl6^&J z$6UjcHKv!l={&D_kJi`VSa1)l6ljq4G_C~!xcZ`_TlB@X41@S0=GR8!Og89=ekAXZ zr>Zfe!7F{LalCVUbBQO#1&orxxcfx7@}Im zDN(mP?x}JwO2A7;F^g#u$W4qko8v=v&U}qeUpXIJ zu`}q|J~tUSenqKHzKUganNGa0dE@bwi~Xkr72gvOzuE6qpd_bP>DmrmrR#TkyKWhv zyzLiFRpzxZyK|Yw`9aTndcpE@DDaVfeav$+864kGcU^X)uSmnd9f&cx(3kqWN=O&mUF#98|O(pK}nCwjQ zr^j*k!AwC-Rm)$QuQid5onic3=g7gnvpx7pCWeQHXRtPawIA)z$xhW_(ys!yR`l+< zyq>&h6Di=h5+Q)rtZXKxt`L|#(5&qfu-A0jRIi`E2^nt&U+;`u|5~%65BB!&!Z)QI z`pm|P-7Uagqa~03;7m5nMP5`Q&4#a($rmDduL|gHwhK)@GXdTD2UGL(Xk$%RC9nXa zJhvY#Gfe}LiqrFFX7;_Vi<4~Kn@D4K7#HZLSDfQzGO|=0e${%8XUp~J<>Xz@WLaW) zHz)ma4})PeV#M|Xay^vqw{1oU)V-4)Caemc>pdRNZQ{jE>vpxZ&lL*kh;pVB2*hLC zLeX3IPwH-&icdBgH&fbA*juz4bje+PyFHvvhJe6KZeqjAx=HFZG0p zj)$zLWH&5b;=_Zri;Lm22X-xWTBG-mzBy1l^rny}y-3c6(%rg$`MD%tpnhbb?|PKE z7UM}tqOgL~tFX-6?oE~umE+STVx70H+gmp=SN+;q(H1{XJmr~&N%D?oM(vr6ILSN3 zpdECy!`bTcBFWQim*PfGCgJM$qj?=H1kKGt(B1ts%`Y3^Blb1e{(mnRzq# zW$&54rnsS$$=Ic(f!rS{;2JZGP{WrB9crX|r|HNn&Rj z5li-bnyRrDsv~wDU{c%^yqi?!mHe^ZT5ZL|2eS4*dnCZRc}H?@;Ydey3q`E{OjwV!C_H9G%YDY2$?76uch9C zlJkjo?`C2#UC5Q*$EN?_q`Ar@gr8K{9U)t1(rFG)7zG|A1cU6upng9$sM4M|($ZDJdq zUNT0S;*s%h_qHp8={Djo_m->=E;FWKqA&PnBwoC;OKH5na>JRjY-jB)Rp$ba`G%_q zvnmh+7>Gx~DCg3fAtyZ^cHM=d*L&H@Lf^C*~)m%lnxy zE8K2ZU$@_n%GXD{mxt{v*~uq_g~GRBg_mC^THi2mNSW{Ci|VYHZ?-qJT!W3MF8b2y zM7G;Z>E7@T*z8)09W|cmp6efkTk! z6dVrY%|gOTD03G$q`kK4&PFY5TMccOd$^Q~RbH zU*(wma5F+XGFi7N8EfLovhUxt%N)5#IB3gZ{Z&+D=*s*#W4FF11IaZixM4#^Jl37k z8$uA0Zdp3B!Oy@s`LfaG^jNxF!5+SE(ZI>R^{#c2j}Z;(N8Y^H@3r0X(iNAV-Pzwb zRVSV?zlh#A5iL4B$j$6lRB4i#%i9~Y8cyFELq${6iRO40XoX-*q~Kn~p%6SvM=0o> zHp;T(AWW5f3^Uah?P)_gZy35huFd8dp80wIM8}GrMgO(;$;2~Uk&$Lmu;018%e&HM zpu%?G99z6ag)xX=^Rq{+-c3}J%GyrtI&E{N|5R;v9ErBnF z)*$rV1x1-*Ny7}=3^CpmF0UQ9esqhbg!4@+EUioX%>4sw?7V_6&g!%m`|y_ zt7@xy?)dt9hYE|Q=yqX)A)^<2Tb*9RdBBnme?)IN*GuYB8}c!QYQ`q~8_lz^KpL%+ zl}1OpRFc-4(!4zCo&~MOd-lehWiuOX77=?H2hKaAm0l4Q1D!*htaCAx_eP3FG3z5G z8d*DQ97pfz0)cXLNT6Lp)zfulKbESZ22skJn!h5fYdXa!8%yEkCHkZLL+~Xy6Hx zqkOTKmw)t$rDB692RT)3;PbGsH1WbmD|;rJf%h%skorc-MD7bC8Q^M=+|u~z!qqE; ztn#T-1Pe?wP4oQ3{*rw7k)C?=AClC@JE_kzhn2V?=^E|5D*Xb1TgefgUuZGfFRT~# zE*_Q|TdJWOUshYAu4~X3?I<8-6#)lBgL$EGAYF|^_on??fE6tv3k^Ri-48y3bxez z8xszHc3;Il=n+6IpHOdHmVCI3!8J=JVuzyn2!_IHBH$dfdZABHbfWdj5u7uCJzU1C z`XNh)vO1>p6GOs^)Ub!7Ot3ZV;YL}KC>NQ$U#}!Dn&lp#JSX6lFth$VjmHOW!+o@K z2{ezKVqSOPrz zZKmsRMxaIY78==rYd_~tpq)4BG9&(&^h}rT4GO;g*&&ih<<$55{xQg_Z7x5Ivj%WL zPiJ`!O9>}J2D=Agakpe-WD*qOCnabFyrEKv1Lj>KcpHw_X0@K8q`BFZk^l0P>|aE4D%rD4Sr0&qWf+U+xVrPdfhVc|OvL}zvx8m!>LnN4@e zbN2zS{SPHxv(_k0yW8$1K1qH*7~gI-p9pLdmQM{__D0W{_R?9xa5xOZ;TY{tyx%Jt z$KWg=0pBC&u;3%MSMZ4%zO~z&3+UQXfsCx??9sxd4*yH;R4nmjIO=1S*}o8SQRLi+ zm8(l=!yj)UL6}crcF#=X`OAp@!-ruN`AcYV0ep4~aO)>n*+80_4vhrgg?}Vwroup1 zlcto%!6C#0buRbYG(uwBI81gH0hE!y+&K~GoA49J8nU5r0`{GcfRId~De8X=2jLqf zhay!tHiQ=2JCQ(y{mIyrT0$gvNqdbJ36G0jgTF5J0k1FYzdD42qy*lK3TOO(+WYRH zsP;8m#TFYxX%G;Q90Vjoi;{Cok{}9_OigI=L4u+Pf+(>?a*}Y!D4s$4&wN^J3g*peq3(8m5yEJu-mY5*6>rhd~&t(I<-b)9T<4aydgWdvhAl$AMkr zr0`J+G@g)PcwO#_F8V-Agqg|Se;@XZOS7T8_v?F#5aHWP1tfH^1$?kg` zd9uG>h0hcQ6fex~3_ZQ3uu+N--B(0rKovB4f6e9p(@l#ao&ql#%WG8cLLvX9~^GB&2PHXZcRnU=@LjoBQBhi&8n@Rx49FNV%rrOf&Q{=8(M8 zE3A2ek=Q%7UB8Ag5|$g=pN*BUe|k{w1DD+^fRBuG(ZA+q@*{O%uRGN7B4Q5{(RWM1 zQFJI2jM%MpZ^RV3ldA(3&&xv(yS$v7TmbVRU2q!Ot?&NRl2eZ-hv6yF56wM$p@;jP3Wj3Cb^AS%iHXv z={~S=`A?`M=7qrr^TTO#!$bF3+&o{RNIpr>+3M7ka$}09!A+2`3?8`YgI@E(7 zI=`zx0v1*l0CbwLjmx<^< zznJuGBpiq10?m|LmRL{-d)=O;9@PH)T};cTD61XU1OR)-QL4#DfN#%kGZ#G!L?^bk zgGk5iZnlgB#2G^Y)liBF_C4^s;iXgn;8s;D8$$?ybV~=6NZQYaaXSJrY6hts$ku*5 z*~XZH^s@gL9ynXqIyP4HeKtSkHx|GjWEk7&L~fsfbyt^{3N5=SfT3=lgiuhQL7||= z`%4;tG=B03&#MBXR#TvDS^V5hr3ujrYSqBpF8!&*877AIH_Cr&#SNhP{#%O-AY#9L;kkSj~1G^s7`+GeBYKj znpiW5&0m?s^BU&msGNQ=)MKKafo>JZG1IxTY`6lA?iDQ(dj2g&tw{Bwr2#nbE(*#< z=+#0#_p+9`n$yS^%^lqKfF_zdWl&YBDSsg9=C(4%WDO?rn8C}EphAa80>i^K9opbl zIu=&-#2p&f5}Duxma--hj9wvW@wJ!3G>eCG$SIJ1l>JnB=4nXll7ZzuEv#SV4C35r zWZS`)=9=08T-X&6m)d_dERpCN(FBR}0!4}r_FGo2ZVgb~|bxi6%Ava@RID^uvY z*Am#J`@KJzm53Zeohm<~nQG=iF{UG6!aPfE{@sPsXUU?}rM8UK5lX#n;sP|}dq8_r ze5i1RSi{eJY2miVR!Z-t-iB9Y-6Xix(Wvm!w1P33Wg$i7m<4VNc<=vZHnRF}`FHoR zXZ5Rd1EV1Mh26PV3OlpSr9XL+i3A$--hg!CTzpzFCayz1sZf~1aHp0B1hMrgV1W?m z016w0JFU>l{L$IGknJgcf|=;&sgwE+Mli#VB9=P)rB%anKcdEppVKGNkPT`ATO1^> z_$6CJy}k^jeeJ4U5Zyl9f0Gtgv;4=SCa%MkWs%ct>y-?fK-OkRG09{D`bHt<%}G@^ty z3hsbB@bWt|Ut9T*VP$o}xOCTz=pFL8vZP21BQmibm@WyBbQ~O2a8G%Eh z!7&n-x?OZfS9AT1)l*hGD*B$Eok$^%O_4?0NK|GAWqemmOOvz!$$&g26=saLce15i zb1fn0V*Q3(%`B3_n>^lTP4b&6f*l#rvvHMSBcDW>_QLd?2PrD;0#ZD$(7l>bPH$k^ z6p8DiZvf<#dMt=Y-2;Nw%mAN(_=T1H9*gD-D8@XVvuD(IHc=CiGfSe6u>C1a$m|cA z35ZSf^D7vvfOd~ORZHw#)bl1ufZ}NfUS+8fRd25Kf0JPzt8~a04lJ>5l}+v>TiB%d z6JbvuL6b~N1WE4hG{_xeK?lw{q%#8;#^jANRr;IxC3SUj6aDuoxXFMn)wu_@eNy~t zpF;PB}ixBTgNT9nWtGt}WW3 zrOmo6r{@R~=P3tsZFs?LtWS$$LRrJ&bYl(5XN&<&(~eU{+sK}{-0&LUdJy;ipsn0y zs+0Zh9+}mzekJ~E>0zTi#QHuGU}ocu<)E18EkH-D80@qvRwTsWf_iiI#i*K@4xeo} zY|jxZ&U~eRV!dJN_5tc3>%kj@60}gq=0VJl98b-692(XiFRpx1JM=T6hb?b~=D5yB zfLz68U08$s&rh9Py(ZY6QcS^e`@Fiu-RH6ci~@NoK<9?tXTs+cMDr)3rB@@{2?<%| z?~+%dovvpudx@J;yMI7LFLE?3VOZi`iFskZyMIf&!9z*o44&6LKLdC+o$X*gIGC=9 zY71+=5a5gwQl5;)S-$RfXq}RHdR8a*@>q0-W|EDiFz34wN_V}T8a1k^e{-aCtGKbE?PBVr1$6s+v_fUkr5ZZRX&^QYSC|h`l z4{TqkCIIxBZ1-yN)zyS6E`zJw!l#1NwHH(L)ctp*kq;Bp^#_t*;RQ^Bry>6!?51*V z`Drd)Cv5NkZHIVFYW^BfoZGA~c{E1L>;7Wd4d9D|B02RwR{LgHfU}igR6P(bllfi`@(1%NQ?HOk{mZtRuHrZ zaziwLPJIFi6WvK@qZI9?MG1hL8=YsW_$*o%JF1s|LBD~6s7v`|jYcRRRyX4s3X=V} zrql`evl&QXj0!h`dbkGYCp6int!~UBTFBSDn=HFufIO@UtiU@56k9h(v2tJQQ;YKVu4{C zeH;n%#a>zL)5casW`!LA?~z?I7LD){Tm=sscU@Ol7%eKmw_NqD_G_8r%EEM|eI=;1 z{uoX7OpDkfQcwls_m9CyG@&F-l9j-mIU5sgWPB}`&gNlNGinJQVA>mXA+>@b92;oIU z=|Bj&mGzqGFBMXj=LARz;kd&EY+>O3aMiX){s0T^ze|}^4J;4`a5CGNhXc_lB&Ip3 zX%KpiAh9*ZMj08!2)TIZd*2fL5!uAzbX(#2t>6LD9%s-B)?kHEJ7LO@yGsYp?#mbX z2i)j+>8{v~{R3I!qMF)a=nGFklAwmSmjB5IVB!f3yLpfYWbkc-y)%Q3pj^AoGhyrj z5vmJ(VaYD{ppo46;-frG>t`&qJ_mWK^?g8wh_J&kN780U$T-OR{Z1Rk8&wcqK1)?57i zoMEV!?#R1sI`0U{JLjivEWDmG{4`F^8rFvKVyKjB9MZzFIW=+rb*%?nP)paN2G;`o zrwIgX9$f<}F@{=|>mk}$wr7ove_e~DO>r_mFyNsgnL};~C9yC#(%1uuGq~_yJK|UV zK*Jj@=qMl6hkfu6rn&Bf=L2FW1blH?Bj`Qklx@tvC7)p(+(1G;+E+vH^A&h%eg&_E zIDz6FZ}et@SNwODVDsz#mFD?ZUTeb%fjt9D<$qZs?_VDb+6@1rQ?>scXIN?c5d^%W zHXoLf`T@zo%eiDsSRTW?%6Y~3@ zkNVOd(3Yy<4e8Ews|v^M+g2EZ7Op8m`M+H-M&(@nLZdY89!qOJB+aJ%$ELvvt_KU^ z1GWadP1xzZ&l4^9O@RZaoTWb7WA`QxkK_AC{-c0Ii^tvCi;*X`gMC zo7Fd-zjTTNu~58=>fSZbH7;6lZE-^bFxRVqmRFU zxcFBuzxhsy);D`wEUIeb-Z)WAZY^EWtv1e5vzukUsCwGHd6VJuuLL_d^x#H~IyEL@ z2neOR?CVPPB6spw)V-3>p5YAJuTdqWIUV~eAlZynUu-dnyXFunk-_8RX<@@0_Q+nb znrOF1<>4E8n2~&)^!0;l4IQKN5!7IFb90J$Vbq{EB#3UNiXEV;0{R#4c&4EIq2j>B z5-f?D-*IO4UJEl(cj2|#9~XanVUDmspsK0@o|P5+e3g{>LL2d{YLpt!x!PbyGXQGy zb0r4Sb*o7hh5D^PzH|zoOjpNxK6#Ce$$3rA?cve7_Wr#@-6`loxARhTr;v19Y71}F z$@Zt-a?r`;4Pp=p+PjZvi{uPpMK2&x(PPN0U)4a|q}f06PoNV33o3D4x+on=YyR`l zxrw!o9g$)zJBP#f8fi5Mvak~UM$h%ec?UUWD-U>esXmXyt*fcOl*=JkjYQdm;!RH< zLnA%4;P=9?sc8`ZOmY2S*@m?iduy|T>;)w?uzvs zh;N6-z6kKf&p{6807$KU5en-ZX7csujQ{HSc(zwo#Lv(J0H_&OkARY^Si%W94h|ZOe}n9Hqbb@$6tgCXZFNutHfp z4%VAKMP(6rYd?={2VCQI3<2SkQS9|q7h?gU z!A#O-44B~?mmu&fD;WoT(aMR zhwBim(An3I|DnW~vr)ST(mC3SOS3LeKDhl??Y?Vnp_yZUvL>H33>U%h$VWI|KElig z?+yQ63)SAD!YK%OAx+uIb-tPZ($%;KC4`JHK@pJPHZ4)pWO_dy>#G{+L%A9$w)DZG z@c3MbeVPzWZ=!F6v?ig7Iwi9no}CJ(&My0!>m>yVDku1gzcQF{Nzif$$+sf(x#CwDidQupIOuUj(6g zhV7Su_DcKR%cGd@bQ>@G^JNzu{JEBsb^t~cruSqL-#n6;&_g^Mr{9YjRPkiPn{rmE z(0zU=yop~K_0U~6`)I739#-J<_L%W zv_PkndUMC#D1r*8QocMs0W`$^jw6smMO4VU-vb@-(p)%{0$ObSM-oR@esmrJ<+Fha z3h<_~cv4xMc}(qQ00A+^|gcN`r3c#TovC2!D* zMKYo;J$hrGhfK1aUux=Mubi94nrx~x?l&1*w`@f;V=3ZBfiSW*@Y6l^OATgBJ9})O z&6yj9d`SNDOp=~II7A)S_nsmkz3;LelBXW^K{9$jJ2}Pj65H8lmCyIU0vTo{MzI0g z>ql@&qt|6?G}P4eu#rX$ze*q!S8s4AQ<>|bs(5||+D!&rZWlzfe-dxYIDtVXnn~SV zgU=r3>DFCsH+Y?PcpX^~lzg)>(e4sC(_ltAwy#3Xwv9#10xM-(-NglpT{V;+(k|zq z!Nsen`?a5Wx}LWy7xk#57TpuHbP{ zI03{mmp$tjM^6h^%{_B zalBUG`tpZE4=nTQe5^x9PFUK#5&sFr)3-KC?gNJbD`=i<-FCDds<;QoUp?}9nKXDA z%qWrL8e;o1g*%f<8SSf_D7`zpX4_?Q+`R)rHLr^PPFFi~&|t45@0=VRE>RDXi-C+Lm5B+!|Bwfkl?ld^cX=LO)s*co^_ zvbHmUhu`pp!(8qo`#RLVdlEYyX5kx}U7C#Hm`P(GY^V8z95Xii1R%Bd8GNlg-0EW+A{7s{g^T%{yi zS%x>=Z?fE&?6Fsv{+AGNMp0eOEKE~#%En9Y9 z*VoZJUPe7MG(DCZW85^NFOrdf6(2G^RhW6{j{n!vhwVU7FZ;c#@cyMUePlQYp6%E6 z!H7Z{?qnvvB;p3@K~gjC^xqBwI~F1UkPEnP@LzOT^hqPI{CRes_`@W_FWK0pSghjC z%5w#`W#o)FPkdM@b}WsJ=v=5>SFz(qB(Cnb;!*lhu|#p^kxQpNmfCVhI5}MBYUV!7 zOt-{~q*uDWz3DFz);e6QRqsmS;$0LNK7f9K*c?x4IAU`Uk)+8bjNOrqGffTIs~7w8 zfwZ_H$+EVBX-5Y_7Oy4kcA+=9xizruQ0m_&(~(L(98E~L(>(bRq@g9e=A2}9Q=Xft zNy~E_!QtA0Eij(S=utafAe1TJsS>}+Ai{^Z-tO>n?jPkC_6ka z8@S@lOpb0&Bo8*1{2|xuj%3I*92zn`g(e?dVw&LK5?X%KVwmLCYPg2<{E576tB-;; zX{b!)A$lwy;r30KcG8^~clUDa-dJ!3zJOPiI>32_PV{pC2vX$lz82e;mw^;}Ic%V* z(8y7dvdv-T3O}{Pp2Jl@g}Shho15Cm7XjBXD;uwm%JvlRF+z4GeZ z1O=qx;;z#w^SWAusF5z%SemzZ$wUY zmoENK`)YO&)ZMWEuA-txEesI*?<|0&{R=?%7px8erA-uz{-8Ysacbs$w;-HqJlYi+REA%v2`0+Ka%FwBLoRTner z8R9TkNa+Ar?*)>758BnTk%h_35%}-!LcOli9hwj0LV_U7hro+A648&5zvwSD5v z-43A5v2Kaja2V6#H3o(RolW{o$f8 zAp{k=8KDGEK!|%6uWyL_6N+58rEP!Tlw8bQ50R1-{7-NbIpGyuLk)YtB`AcS%65Tq zj3B}#`?{4SW+(aNZH^0n-FJgCeZSE%Tx$u})>-?{>_#Xt#%5UPK^GRicQ4}2ZQd6L z@38M_yEZ&xH=GfE_s8wZ-q2~PFg%}QDBCh zrbnMB2*mii^=yAD%!2|2Y$-SP!!hvJN`PPOOFb4(FhYEp6L*73{uO`yA7zFAtpO*4 zAgB7uckK#?Hntytwq#$NN3?)dHGZYu5POBvc*05q#9}GOA&=XO%}3O_moKNgSLv@w z1`U6aTWnYr{M6QfKn5^ZpY*~K`$>;RAw|wJW;Ym$i$JbLG=#i*jljjM_P71SKx2W8 zv}bubW`GlCFLl$wb`z0j4MT|2j!49JAysR9k!z4CIJsewrU{)bAJ%w5n$Y3X*3GT6 z7438T2?QyZLcDGP!lYxkF}msI1}EUp2`X0_ho9DiMe6 zwPK1~0>ohBPLNn;ld?^z^`Rt2gA)?gun=@4UM3jH^bior9sVvAS{hwA zBci(K*C}Upb5+?#5rEf%J~RLCZ@`3yUtM`b<=GOikj_MAH`AnpbQKy1BV<#KVbG{G zaMp_M9?FYoB8~LO#ha;3brN*26BCT~zY``J%fQ8BZLcG=TM6AHmEnlPFCP@70W%Kz zl}(2ybP~7`=)sBaq-|%1@%3&#CRu(CL(+lMJMA=@Hxq}*Xp)RHfLYO=)K*9p>zVOR zz5JOJ>d}aAbN+r2`PQc}C$yH#G$B`I!*OkYmD5ZzMB4Mc4LG|gvp>21fQ;@S__jRW6iy*w5 zdhZI=wHaskF2wEE3}XnvPilR?wgZ)}%@6SR=97$NGITlXp z+pu!IdWl5{pWuY}AF@c+)tqkY0O(%gPFX1zN?UZYM` z5*P!g^K*hIB=H09R5_W5@5Wv2A-9(Rb0qOHrjFkf9)g!VY2!{Bn;8!@EVfe|UspE7 z3hcF!Y?ui11aQcmAA*V-%MYCl*cw9qSxWbqW?R19CsD&fJ96_{^rtyGBtD|RIJ-5_ z>TC%vg%vpK8woqXs?|vM!gz%pTLv_h#w^Nn{E$k=9iI4V`V|x!&Q3rBu@las?+(CSE`80~&nawknrrDid0i#P z%#$}lQeFq|#wvIUnGPlNPa8E!jsnR){nV3=$WZ*C7bUmz7GRUQ7+^}}Z~N2#%Kfsw zYg~0aI2wC%>fl-fb=^+1-6gs#N{3Y@NA}Knrj4!vR#bP=F{cg>E+MW8HBaH(6>64J jDUAT40f~WLi1n@MBVC8LPq**h0{`jj8tas4oeB9jDM6T= literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/4_createImageUpload_2.png b/Documentation/E/Tutorials/PhotoContest/Images/4_createImageUpload_2.png new file mode 100644 index 0000000000000000000000000000000000000000..05688ee3573e49594040cbed246eac6787a8c1c6 GIT binary patch literal 82150 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�H8iY&^>(L?!_0bs((P;PKu={gg>&fP$BB7{jy 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 ff3x@f!<<9DbA4l)dYkbAjiHbJpO+G$jC#< literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/5_createStaticText_1.png b/Documentation/E/Tutorials/PhotoContest/Images/5_createStaticText_1.png new file mode 100644 index 0000000000000000000000000000000000000000..28218e23296080521a66ccad1f379368f5c6d561 GIT binary patch literal 93066 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

      `PEB5is?%>~M#p)H_U3FI`I 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 Lj@HGN9{c_S^<7`* literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/5_createStaticText_2.png b/Documentation/E/Tutorials/PhotoContest/Images/5_createStaticText_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5aa82f75361bf1776a0cd46d6bbd95385d839b GIT binary patch literal 78943 zcmce;cT^Ne)9{Okf?@y!fdPpMNE8@AGRQFGoRJ^`GGxgaL`33{b9Ts*1csbcBqKOP z$*bfnS@PH8`n>P%vwQA6_nv$1e;#M(uCA`GuKHE=gs3XZT)zsrii3l5T}~FJj)QXv zf`fArMQ|DX53P;$6&xHo966Yzrn}Kv`jsTo;o*1v4=TDCShFMzh{91XYrnlzP*vTT zzezzd%ly*%uGL*uD=0%qI~mzfe|m5OOA3W_ECLozC~H9Qk}C9jDc#Eo$eR>^$8m*zN;P!CP~e!Ue=!VGh&O=DH~G_Wr;k^+QqtR?b)~PA8f_*iCo6NKp=sG zOY{NCtuj5W>@zS5mpw*v|{;R09y#YLtW9pPv+5|NEc({%ciA zJR&6hC^3eDgl?D~JJ$aW8+YY`8_YEMT9^s;KV`39fSGpYK7zi+lXdy)*T9EYNWN%V zl7;R&o{N8Y^Mwou}Mvh-HO8vWx zPa@m#Oa_5;sxH_?CsP0GqJwd~pa}#bQ;%?P$rNxf6pog}Ncs!vcm7w~f6l8e{iLX* zn&folYk4->c0xOa&-z(=i`6izUWHi*yY4#)vGWtBowiFC2sFvDQtiS2O)B$8FGL|b zT%Y=cH`#^P(XnW&Vfm3_J=5lqQbV?sh|#A)H-~Yv!L-kTp~vxhO^;b1 z_@DU2enV0qVEl8-xjGz-xcmxdr!ZYu{!!-p|{n^{JZPv zrwF4t(&Pu$IcqbnQm1vL`*88&XzD4xgV|=gONj`mZD?$EnKldF-%KR#!i9YVdn18i zgKPZ7nPFsM(uaQp+zhpRDFnonC%}rSsfj8#4BH#XZnavj zYl9p*%atg4mU%og^AlcqJZ2llSK(=h^sXun={26dyR&ILZAtIcTzDNy$apHm8C7Q} zEcEGVBMKuZF?h~t-#ssi-;=q15&nluoZquKlctAjKb@Prokt7F6A2+^rU7OrM)6WvlsBG>5iI5?MY2bmo1%V z+o|l?xtexKD!8Q&aHIkyRDq3WeKMGD4Q_7|E=kDTc&EOxucPQs@04@^j0c8WJgOs!jSm#`5~pFIpQZ zUE7#%gggVPZ4;5?x^;`9Br2E!#^*46&(Jn@!DWgL<=FY`>`!FhSQv!(%Q90-QsuEC=mtuJiGPS7fs#nweR=iT~#CHy4l7LI;RieKh zAuUBZ4lgLMzqV)bYb|nI$@1{{mxlwne2=yYvLi_1V?38>!dZ!14i{3>T8E)l@rn8o zgus1?V3$2=brShAxV6jaT^_J()zlq)?xOgD|xN=m#y@gnX7{KE%P47 zWBcdh3R5X5ipdAc#w;oN>8qaGrwfh)w<11YA?$q`fDmaByEg{o6UsGhVxQRKkTF9^ zHOgtHi<*Dvxnr(Vr{+mBsKn%l&Tq`9a(g=aVeU5a`uzcLgxyH98X}0j@2q6AH_V5l zc7ye8WDB+RH$vw6q)=XYKDOI>P8%)e-wpvot$GW|opV|Gj+*GOFrBvb4 zLO3PwL!?kAO7%AGeR@?slvEN;vIi{A)7WJjsB|a<;a%({anRXFq}*`ve!=Z#?Zy z;@+P2+MK7(%2O>fY|y6h*~R>1B9`vyTd%#kv19yG^ckrX>N-K3us;fxJp;8YbCmSQ zBlD>C$=B5k(d9&`-E>{9bg{E6m~HuasO{LZN@by%UagaE;P|B?ZK?FQzuj?uNV^&H zEUf)-nN!p33aB@GZ-i2jV~ ztB+if2%AQv_N&v&hR|-QtZ)L-dyrUazjBp4qryR3E2|u*SSD1t-)9iA3?J=PXu`xE z*C;2H_NS+$**8me2poMecl>VW;z8VeqNhRm^T%sZ@*0~at^jb zNd=to_yn}jz+qtr3$`igHtak$W&hpH-L_B%?Z2c zU&?|Trv%u;a_9p+B_mp&D0@7w*iD}-GdYLLu+}L+`7^=}u6&I>7G*xYN}xMKC@cAQ zH;2HTZsCj560Jus8y#n%wsNLc=H5!}`0?Zf{A@Gk zk0z&H9<0Ngr`i#SIlF1|P^7&d4-y7XO<~sy%B~%ZPhW09juQ}dkvAc1h~8AfyU!xh z=53b89^MftBjxi`rDm4*dr*GnyaE5Vz32Byv5PuiSyP6q~pc+ntJ6K`f^O9L9hzyw`W~if+xTs1IS$WamdFXAV-sS;6-j^h| z1W%?9zI~tHL1^5X$tSz^d@+sWCz=swONi*ie7TNONcEtj&EdS8;eC96^eq;7=#l8p zwju-7Cz8?`wlm4Br+;Lgvo~2;o5$uUo- z;?A=`@Nd%CpeXsad1rEiJ{UN(k-_DKxZ;DzjoeK>Xxhg&LWUoje0-HQHI%PpFB|Vl z&MpsybbaN%Wfn^YoAp!-l}+DRxGK>lWLCw#A$0kIzxx$UGy+YGoU*nyUq$lAXmdQ4 z528KS)#lQ_8)odS#y{p}EOpSZJZRoFUbVfP!ndvbzMwq|Rj$xbwVfGzo6KN%zQ}6s zy%&Fcf5OPK?u;?7z;KZ#t%b%tI-|0QR1@SjVSl}+enow%NfHBI(6`0MQ=7iz58tX~ zQ|>`mvNmN1ZxIQ8dv$BBVe=|}2jcPZW=jjT-^rHV=V{N?5+0`oMRCI}rc@gSw;3O| z=?dgN!WnkuHX~$by^@QSKbJmLNk;1xg0y4bV0<)^+`#Au^+n@%EO`ELL}17AI9%%8 zY)hPNMilwq7Dg+9*o}WFi#McNif$WsjMS%Zxb6KCwggn%&Q8+Xk9W zQ(o3|eqE;O(Hg9{=}|X(&Jle<+`w`rL%0q(DO@D|!IkCj$qCr3J-lw)$o8xXZso25 z@0Y=F4!>!S#Soe&*`pr=3FlL+OSgQA4vCRtNIo0G;dfP9c9@^0dS9Nu$oG1HyqSn0 z*;~f2LMlJep)d#f>O{B+5^5-JIqx>#N3)9QzQ=vSxjvQ8l1=Qn5m7eiE+#mC-}%H0 zkGOHIReU2l?;VbFUrW-~Y4yR?x=!Ncq{zi)H#;U;-v;`(YCRj{CdgtV9Y&|-t}~CA z)knsE3B$4f98k_0@`CF7`kI?g#;A473b^R^*fk$6F!_voSdQ-s%y?`382J$^v_34G zV4z9t{u8&ZF`q_%{5jvaj(9`7x7uqY>JBmT(r7d;(R1uc$rD65#QN+S(jAkzWiPA3U-2%0rtf=Hr1H}Z9|~!+-O5<$8|%!A4a&)-Ao6>7 z?U{G$8}5e2<)!>B%h4R=4$qpsu--t^49np*Lmx-CUB0Xy6K_BvS6IR1om{B+TA{6mS^#@<0UuipG|kAuZJ zLn_~i4d(G^Pt({XgOU!zX;Dg8cIJHUwZBI=;n*`HBqQMc^ZD{{kEsiWk4|^ zE3-tq=a!7$>T$EDjk43>`k?LHG2hti!IXryWIlz#U3>Eoc;Y8so{DUC_cQIoqD6cQ zhs1*vdQ^F>OaAS@=|I)a3%U}zL=%)P6S-gYko7L1G~tmIi_Dvn>T&rSf^$TA)i!$C zSClqsxSzgS{J^)_bdVwF1AIq~-O$@SugE*X)tIEmHFg{td5Y2f;^!j0&kG4J5X4b} z@W&LQof_GmUfQ%F7kn3maM zJtpLXO;rA#%O}ccJ=L@$y(`^V-~Jz3f`c0`k!7%tpnmu~>l(#__v8aXG@h~<9!&P# z$z`tFWDqDKYG`Dn8`42}*@#*3czr3uYlE9OVt)X=TxC7logFE*QgfwS5(gW@#vv3P z?Mz@9UTMDrn*lg1Wq7FbEm%-tuy?gxI=i8si)#~_ zICwtBFLYvr!Vn0%I8hB09@DxdtTEVk?HL^oIwT5ImL#S>=BhD$-lf9(T6^14YG|HD zTwLjf72jz1=wXv(*Osm`o#mCkE)68aTX?0-M^;YnLYp+Zn|22j7FzJBpT8)Wt4z#T z!v<{RGs%%D!kdkiYvmm@72b#2ipzs4;)bphwgR+OROFc84sO$SGaAJ3+jtP$N=^G7 zucOAZNdPx##(OIdZ7;uO0?UqA{3zBlU+kkzNbb2XKrvBoJXU?A+8#m2oV$|A~3LduGO-#xaLxc(6hyJ2JT4 zuIJ7%Uwxj{V6L(5w94$kkn!(8p%6Kww-DV1snGu zRQpnEwONvrd@QCxRL(5t7P3GvrUf?lDjXe9RWXQ-@>u z*#{H}(v`wuv+|Mhlxd*Iu^MmPw|H%Cx%PJEhdm67CR}5YT#gyz>~;OF`skdzzg3zgYG*!M7o~Ju{x7nqN#U=)j?vwq z;6r-O_#DK$u8((h$Fup!2w0Jt?ks$spRjL1*?U%N435Y z`kNC3!Nwf@dm3ch42>sbPg!`~Y+r9k)9O^e!L@`%qe&C^hmp{$@Y8|QJ76Y5QmjQXU3KU)aT#VeQ8uzAkHD)yAuBt(9X&6jTa~{+|%TKhKMQC>@rs zhGWs+e`!G?OOfE6jA=4EUMui;>c1G~GT@#6V3-mw0kq+k{OXKlly|Tv<(|yHG0J-k zKoR$FRce5>wf(X-{r~r@7Qof6M-Q$MNYGXNg0MIK4Z_})1-iQRN=XOII82PC!;b$p zqbdXL8b+7lhcmcdG}-+t$dP0U86lE%H~oR*_=x{E*Yex>=Y-;*xV3uPo)iV*pvv{N zQ#}3-NwL~x4FVrIj>IHu5&@-L;$YJFdj^C>?wVJ?NAc{?K}9Uwtse=){Bs;Sx|fJK z&KDAtKxYZxP!I0@*ZINDwGBRV43NmW23Tv)b2SR!W&aW92E#Wl5ab|%;I?e-?*9ep zu@@U1D%uMN*IX6{qx(ASW7I!KAnF8G(0Lu#pXcri1beHriR@p!?r+u5LF(}7qWFOY zqf01e1OJxv{TlMcFG1qy!Gb9{uS&iA=QrrMF2EQC2=Kb2fCjIT2hxK(^1o+#ftaIt zAu$f1?O^rOaPohAj&p$lD~RfAU>@eREZ6?)cEe8U-v~aNq$6UH0>bhbkiPyqJ^u5q z|D_X4P=!#O2<0~V7uAP`BSaKvlK5e+HVOED3Yw7P zTH#8EwySM-T8o;G7|C?yBA;bNu5%bG-X1&7ir?-hjEGT)M&=q>9I0S0pYGe?-~P=q zxI^IaQ5M~4MRu{3s05^+JIsiRZo5{>5zsGd9#xveCSQ}P{O&#}vu|IU9mnxbeY2b$ zxb_Eh=8u~5yH4{&N3&@KC%$v~OKbyObn)iP{L2bI5(le6t4{zV6y~ z;$qHVw$D7;E)wjZMVC7W2hI@D>HXP0~{0D4*TrLrfV9 zC(M+T)Dje!ejkbNPjLNm<0m z4N;m{gBwTk7cX#)QRJFwUJh=DPF@Ko{^xiXnEm5I+h6-Y78_aDC;aGrK3fhRfs|>1 zJ+5iO+AMnqZ-p-C0}IVS{vltN%KQ6N*$Ls`REqt}x(8(Ga#7{q-X}JVcMgp5Q;(y( zcyCN9SNJ~D$Un^#QUbBK{hWIESe~j(Jm-4aMPg*GuG-OGDd_L>O?SB`~N< z#A^RMR5<=T;GnWsUNU(|1j-=rjf?-bAb6H6#yvsgfo<^G*WN{EozKz72jbeL2YP8w zi3(hSF5M++6R7u!c?bQtz1l_4r=yw|t6@q6u8a zoI8vCiEUxzGJGfSbu_4o?Xr~?xvY*1`UqY7zo$=tpYVMP=iD?x;L zXg$KdJW`Ts)3^mfdCRs?G9I@LgXOVG3-q#*;s!CU=|3H8{MRIl-1}s%f1x z=h>So(C_VDfZ{A&-5WJd6g`;aEnUbhEmcn7c+7N1$T_&=CgeX=udIh)JHFSd5#pAU z5HLVyeYwkSDWM{D{RbZ6(M9Rw%88uMtuTf(E7U!Z`^;77E8oQv+8p~m4kj+Q`{pBB zA(2xpEC2d`jDP{$TH!=YN|JP}VAulLfg4~DS6n#)LYQfzn;eNX#pbmbOVRtva=WoG z+TeDx4F%8NS2iBl)ob$M+eET2fJ?v7>3jjWua^=eA8|1hny_0~pcZ4nA{iheei|uat>#aVz zvH0O~2DgE!V9?MOCJObD~NX>+uFenhqO%vN!e&%-sv7=lhji_US!uRV^ zxVp=@AZMZXznkIrG88V}UlMxs;^K`5{bi{(6>@qpDlbcvMP$V@y|+WKm5CoIf=+o$ zGX++4FP~p+y&K{ivvd(dvA~)2d*A8AfUL%aubbWHk*%?eYayXpO?u=tFqr=SjGy1~XqoW` zvA;SBRT8j}m?!xf1ar($Ifx;F_M>O+yGxjDEMB?MyGeC<1bdz(hVWwC&q5TStYMA` zNV#_$cOhClH|_`xP4csn@S!mGtDz{ho~2yOo7^a*iufsd`TR%g&B&wuKC3e75vgpK z&6aatMlbQRpQenS$Ggj>?S-qT?~R}a&0{%`)41LE#Q-#6(1S8wiRHl;shjcp>l3M) zi@nK=vCJy`=i;ZkgYyZG?V`m`zTM22Bu17`M?imfKCq-nFk&9=eMN@Zv4@8G(C89N z^P(^KYu=JohYCr~hx)SbzNR03M=1hw>=C>Zk@J%UftF~10eKaC5qOg?E?iV3O@P}i zHhd>Vj+gmHW%sYLS~Qk|Y`05rF)h{u5ynv+#a3F&u#Ywox5=&*+}_K^gw`wja?anP+AcneN|1kmK)22H=7Kfz(xCsUK?)Vt41U6yX>ekcpZp;?#H=6a-+@(FAB_3m9gnWwe37WD%~r* zqfW(%OX?|3@3_`tF> ze`RTDR}!}=EHK+>JTWmG4ux+`$Wi@yclj@YbDwP?A4Wu=1kzUs{dI8e$sT1zCpRBs2(ipxZiH;@6&as) z4>??|yv?EC3Cf`6-EsF9xF2^+)zVh`E+&>4l=?dNvQp4`|B$RSGAhKdQuRNay~fz6 zX;b)oSBNf;s3V?DhyUqzHti|PszngBV=%SrR};q%m&ncXvOli&aJ4|sYbGsvljx1T zw*nghu&o$W7Va`nG)y47F6i+6Q}GdNc=~D*+taF{)i)n?vLW$R@CepTgP^S?Q7=%w zRVXcJ_jbY{;7WLRnxPO&jo668-y5&HhX5<-w_Xr8F=E1`y7wx zp#JK?aOBg6=O;U&9T`KZnP2`ufQ!B0A+B$xUs{D4{hY$-F59Hzp5am!N11e|R>%GK zS929tskJsvjz(MfpDG-b4f?F@dM%2*>>Dz+HP#4-6xr^C4|H-(yc5t8i|DIvs^0t} z=(ap?&zit!{;ET78;puGPH5e%Xhs|m9?H5U8y#AWD}@8PT=7ki^t$!xiDx59ZRuA> z0FQt#zt1(gc}FKoqdDyJtB3P(8fHTUYR$*$TZn__&eH_J?eAKWhkkb(eUbtjeN#t2 zP=WoF!@!qP(b`mmKr5knJji?YZ>8v0kErgbWQx@c~F=-1gj@h z%l+)+kjX`p@!MpyyE0{AOcB7ua9zFRf=JY}eAt3CE?5H;hqDN4z2qr32fqGShzAQt;R zLroj{fJVC(4!Sn)KcFD11U|EJtf8OgGOy#DETgX0gSWxGE{ETi+F%o5tl$m^cIhQI zbdE-(yn`#POb6}%L3(hO;;QVsvB%;&pS>hAs(8@DzW*R8(b#vabL0Uziu;=A%I^g3 zJ0qaIlg@M2&2aRIJ)`;Xgvv3iHQ}B|*4ZmTP6AC{|61wn8G^K&nG?;O6kaz1iT9~5 zXz!zP|P18HE1eE3~f$%U0&&*TproD zs1W08*I)CR^^Znn(tUj{rNB`s`Nq;m)H~eeYOg&h!Z*qa3Rn9`T@Oqi)G#sk5)7`H~&EDEztU%Vr4;LFL}a+>Y z1TwY)CTt8Brw&bUd;f4v9=3bsCe3TwGMR2C=L6b9?32C zrGGxi^x02V%n%v#F8k;+ixlV!xq(?)EJgh;+|YU8mWRR9)rrP}5sGI_SsmMqL^TNK zz9dmdkNqhnF&^DJe+haM;!AAU9L}jm4RKwI-|8(I&W0^_qLv3d4Sf&i9mg&6lhLNB zVs|!WTdOw0#i~$iAUHUfLeMKWQ?aUku@|qu?Ru_gtKL=?+F`If&}VnL|EA0>!)IR) z!=ly%?FPs0_+Zocd3|vE%i#aiDp{`he}&B+Z6?Z3#ZmFbZnIGlBk$GSTtfE}!0tnK zl$371kc1|TednbHJS^;mu?g|z$Euhl`{NLU*&m^|Z}Kj%tT27h?x4(}jdyAC+~XNc z1u@@dfHCS1wH1C4_VJF~J(5G+gqbEayr}#VuCciZv463bhR(%9b%0w-bELrAWi42L8B=ojZqS|k=MkEdr!}h*Rr5Hkc4`mqS)2zCg=}8Tt=v`?# zIWV@eT%*Yk-W%B3%diYx$RaI>)(^D)ucLL<3n(>MM4d$GYB`L_&^@ekS*H_6rgrv3 zr!S$1X7a`S(u^_lv8(fww_Yd{2AeV?&IdM z*zM_n@NI4-N%q~>LWK-xoD1xsy_?Kzj(w$a=04>2kjYfX3qV#bUsCWOctsC#45>(< ze~EklnbP$CX38(9@-NL{sS(~Bym^nztFmT9Ap$wd4R~*2UqlC{&sTPE#y!p`Qz@TT zEt3?{#}ueVH{D~rXDjbIF*ZgVEqOr$tdt03Ru-RA?oHLZ#3BWzYm-W^j_8#?4eU)9 z*74k5(|gB$37g8ml(ORb9UKns@DY@&K(67Vawf7U4c&=2?4UjXY7QCJ* zNUxPPH8f0Te_Y+$8vtqp_q<*H1vU@t~S8tAzPmEv|BJd z|KTLj6^}3x3s|;N%Jc)af&75t2jHn6WeoydIB-4a)2`hF5oSp~zB*qkO!Qhip`xn~ELgo+lH%deiBpm%n*9=xe9cCAfT$4z+v_XrCsn57edap5E zMPMVng>j)w+fuyG3cAy~BLkVM&u~-%2RFTyfy=_Re>A7a3V?CBJ9i1?64p#4FnIja z?z5;>_1{P<>M|~yHt529K*@;Z2^AoLW)CxeLPXTb1RzTUu&aSbIH2h%{%P7TBU5Du za+l8)-~+JE=>Hy7E|(fn(Pe+GMq0Faw&`a!HE_vel?0 zRQtzw9=>0x$O9~`B)|@La*Kc+aw?E+sD8(b2-!xGXLJwL5wr)ac*qGf`N0t8 zWn7g3zX%tM@!%I!ro$t-h4jS_{1v*yD*~9_Rn#*{r>X}Aj<3q-1@%NQIOGfyJ34gA0MdMXkiTY~$AB^p3c$o%0bhaS_8IA>gA(dWu?$N5eKaTmeH3l`&=VvPh4_eTH@3WI+)6o_Fi3B%c|b=H3@S5(KmlkVa-MlE1@o_MB?ToNU3S40aAt?Gl^b@Qiqoph zn0`(62gsT`)3Mw4Ui<B0);x zzx)OKhUI}yO4#}v>7%e5Y`27x@t61ae*$Fr;I0M%OR&Rz1Ck$sqq-BA#JKC#O^kcv zB=;Wm@>KiqPNPij;`^}EYe76jEM8!M3S)-L1Q!UPU=JMGer3ZFxj-cCqpQ5)1Uaei zUtS`dn~fAt08K+3JfNi|wHrj?YL6oaR#(t+RV}9qSK6`3hQVshk!S7*mM zujS|l&vnP`@(jm0S{Q6X-1*yOkHh?qIc~v-19LQ zmaP`sH?&;5)cO7Zmy9kd7P!w;>`NpVh!s9pxtS9*kjp8OL zV8KwtX~YpD>tLp7pv7^=MMnH`uA~RS9QK0U0R9cc_vOwHAhQHbp*rTknZHE5NO^4X3JN??-VF;MDUXgiRE;k@jLs9 zR5HaJx7z9tpPaFkgKUfgg;{&!ZWh#gfy2lP8aicTepy`l;`_3EnVOR0`@%eM~5wDc$GSDPEQ4of^tdEl-mqPqM>VYv=?Y^ zOQ^P;VDf6M^Gp?Tc}xBL{e|yFqj&MOZkWnCHt$~g-+P!y_U45a(6N4gw%yCyZ>H3H zSQ$u2E`PkgF3Oydgt!(ex)BV&qw+x`Un;oWGkWZ~P?c+fAdHFSO1Bi9xPO84?CHUb zF{$HJZ1}HuNetJL9O-JuI<`?edjlYiq-%GCG(iLCGYo-DlRPm-_bTS++3{v-T?>G= z&$zn5Ld4iA1}g?S_+09#2l9I)x8qwW+!Mf|`Hnp_iDj81#=eKQ@52UNhsHVfw`;FjiSePFd{GZ0EzBWATn=O|mITPE5h~A4#SW zSD#lpMpOU$=>sS2+MBvxZ#MT66mA$eGi&NB(fl|>^@B1du-1toYQq> z=)MBf>eV+b9m9K{Q~1J8^S&%e#`{8SlVK~n<5kv5Z}&lAAmy!;ecb2sv(57aD5{*g zo#^wj=T&$Jp*8$HwDNWe7BF%I6GGVcwjFdSoQX`kQD& znS6H`wB4seQ|CC40n)@kIrR#y$k|n34)%Qm+!g^QYmyIy-XRzuMXRq(s)yz1I59uV z{7%`pzO>#DX5VoyN2#47teo*Pd$ksudWwr8C30cVmF~~UyfP7DM~KQ`F#~u!*ddb0$?HGJgS#w?R|Hsb{_SwI_4ALTMExi6`BsTJ_m5vVn1+gs=-Z7UEQ zTDL(tMW=eo_3b)dJJwe!nx*@jIYEbS1 z1WV_mS;woh-oz2yCfQ@G^dPeX?~Y10o8Hkwisqg@O^H_kil%s_D~3Uw2T$y$`SrE} zI7~XAF!L^`4t)pNU9LlV|H{#F0Zqh%XT20-CP8;XX)=7?6gc(9%d0uhYQB=VLZBIg z7+Rb*KKV`#e^j_zf%_%29cboYJAn2?0vYqe@)PfCuU{@>-AIbMgsz(@&*i z?BkLxq_28Y8?!hOa6_nb=y)O3e(tMjWPE<6@3<3RI*J=HacCC_y7xb%HI@u$9u)Le ziK~?IL-!0iyhrpbC{0$I9q*t`rL&tQMi#${pC9%ww6Y%L1~pBB*2jwFywsE+$8?6$ z$U5oS$M#L;C}`98unU#2Yw^jNg?NvwYJ7MLXtEEd*iY#Ig$+deTOK~0xt7E=_77#u zhQN0d6SKHsmV9kXgG|Rp2lrjd#l%-)wsW@9%6a zCB$ei-4^Ct2alvcr?w&X84_HruzM|5Ma(izDBb?fdTo`@XU)NzKXx5Ut8_?h(lBYn zr=A!^JUmu;=;e7yKy{zSm1*NTgtQj`s>lQ0P}z68w2)32RDT7$9ECY^7(Q-4WRUKt z`OH7@io^>5`$!ml5u?=O3@YwM+G@ zy3_1^Um+KR^KsT(#cm~umCd6o{yx=Z)S&%NxC{uO4iOYFCof0RoU3JMVxC4a9 z+svwcC`|W5bF3(M5m#dn+*{6}-Gc<++$Y5>#f2PQR#mw_ z%tGsPFh=0beq=!d$ALHc`su|~`+y~bQ|rh2 zI^xU2T#Na&>B4SyXqkx7+Nn$mA@RVf%P>q~JO z<3B-X=I5QfZgyl;!^w6JuVW=BV}NZw%?@f=+HvR37g!a6;;QDpg&!{)MS99t?F>N8 zd;)To2bBvKNs;;Kt|^C6oirb__gpq*eWYCG<8`{pbPVVrS}Tp)a$@o2LR{uWtEgy{ z_VaQ6-HQ*&a`ctYH>_zDki(E^l^dooDhGa+@SX|AGC)OG%RfF>V6>mS3DeZ$N60a%M!nZ_j z#yJ%g-bTv3kcKizCX02aOBkTaRbkolDErp|;8_?t6I7P(e=j~6930w}4rultRWVr4 z4?Vi9G8jBXjO2gBt>bYZbUQSdeJEpOw5iJ`G?>>>LtNT9UwM@ff;4kX7!^2&&}T<3 z(^&IYsGpZ5=EF`MK zApNb{0l#5`?L;*;`jV@$n^H`Egu+A=CRI04fU{=ryxYSux9w2r_4qB?XD(XC48&KK zng-(UF-^>Shw6)#2Oph7;bc*)7pD?I4TSlLm)sZc7!?)$Apvtp$%m~yoKe(ptybwCF!v@)r>5Q^R`au10^C8I8bkr<(P+K+w)_-RN2h`DQlQ zl}@EnDZ|*Z91jQKxLWq&?jNy?ks<@seFNpD9dHFrS*Sjy8ng{O3xOl)4qIu@o@AWw zN?j@Isbij1;A)Bs$zi_>X+^K|MLcrqb(>jnIs>oBpD&Zw9L4=1AFH%INSGP@4;>Us}C}3cUU(s>#=}0^|!@O zkBO0eQWnl4eJX0{g@YTK&lwcHZ89%DQwC z+WyYgYf2xK^?Yvhkew#3Ca{0%7}*I`+~rMtDxFQ1`9OC%Lk^1y zY9pgv8xG{)8sl$LP9G_^(##ign-Ha(@{&FR6SdE0r1FAns++@f$_qMvI1aUUiz^Uz z8RvjZ&9_oNOWv57UZD_0fyn)in^5I7X}aqu?oofPz+c%}An220L~$GAFlY3u?=BLGbI*6e@6f|dpRJjYuUOiE<%bE zMhDR}^{B$fklgi%4L0YQwk8?Va$=-wBwQ(dj}K9>|V_~fxn zf6wzrXhz=2#LU?Utc%ZndXlspwbgo49LlV{YWca3O>v@b!|Ze-8$Wv~16^+p!a+|+)xP25$EnE~ z-5Ta^nN1q9iFQu;S2J3bQu*USx04x}Q^t#RkuU9`@G|Zn#elUXBJ)3)curb9e5VjNdjLiHfmt-6KzzA=? zevqZ`=$%5_m50irdzzKZ-z@XfpS3rGjF!rw)_v<~taizPU!1y-^)*2i3)B2%D19x@$8B}8mp%4Bpm=*+Heqn<`Brx-N5Mf2Je2R zB*zvsya7Y3lg@V3h~@|B%q_kA?LMEv7ehB)ZwM`A!6Pk)((H^jiv^sQRO`UDN~`qT z7<4V=8OWig{Qj)til&lV52p?9Fkfy=@>TVD#>{43LgC) z&U5)$R=YmWUmD;0GGrwhsJ<$CyjBT+bsYkg1wT|Ha?6}NZ~c*VY2gH9s=$k?dApkp z?n(n5Ic|flG0h0TlhRDjwtKjc=s`pWNa0!*a-L1q8Z%P!olbRO>0M9rkfa&zH46R1rIb?Z(;I4))E;h#y4@ z-rK`IJ7Q8wF{9t*ef_A{gBrZtHU6s zKtQ{XH}MxzbS)Rmbn=xYE$*-+9S30b+5x{<{R;_du&)lPxk>;z{!gbVE4F;{l030c zGV3Fj@!LoygZ5K^L!qE3GM5KXTX*t%kfpGKGA!@0Y=^_L(;t&{PUawM-yinAPK<1R zs78Pr0MkA${SS~zw@<5pMjcJ)N=TtmVg`Tx*t67R4Yg=wIoG{A5?MJwoO^95i@(N+ z!U0Bw8-;CSEug@KLA86;d7|YRq7s7Jy-^N7{`jyxq@hAj#kSmT#!2)8R0Zd%vD4%D z%VWjaC41%zgpUIwstx3D5WrwrB(T{l%xQE*+9i+p;m#^wuHkjZgY7WTdF}A4Rw<#0 z{c?299W0XqyHjKmpKQ89kRu1h8l|2$*n5r?q4nn1*C@YR-@(F8=5%Lu?Xj*{=2TJ} zADfk-LLSdugymR8ZrMKeM~FTFSWLlXtpBSs%zprQ!35vy6rhk6MFW(*TTI4S!hmZ@ zf;8&c2EeLk)YvcGW2xz2`j$9qYd+C9p{TT8exrVsv$7-G2=tRShlEm#dAl>9)Q(42 zUlMW#&qov$6~*rKiyLF#G|JHWIJ5hFVZn<57o%bfzt5kGx(`;OAek-(_6ZH_CeLM_ z!cF=X@X*u1d%+#&8|+$6U5(Yh&|IF4K%i}lY=+3q8`dhq0DJ`v+gCf@NCkDTja4d< zpC0Y?5Xf1O&Vk?HNegjD6Gz#OqoaXKoF1ygL>pa8Qy-L9E)&};594b7>a9l)nR~4{ z=00Yg7?PK``L6YbUVeOQ>&tM`?Q?Lb8A})W?{jZD` z_`&V&V}n9?p$tTch?9+mO*8BhJaBS9IT=jYR3a5K#SHmD$og^?T(@ZLkyA?0-D7>W z#|9~R(EEQ#d(W__vUOWn5i?4XR0tB33j5#4Krl#xKa~nEhplBe6i5 zgwv-#{rGc(XnJ^if5p-oq_)$%&}Nqq%L=Kg$QxHUpFj+l|-dkhtvG z#_$$9EIl1-hKkZqrAq9uh49XWAOct^M?^S+!(&k@~acOJ|oRpo-d={a`A^5Iz0c-{f0okYZG} zI}Rn%qM%eBsUw~pgW;55XSGFz>>DkF&J*;*>DjnM+>&$C;m`ia)y4G^LLo($3sFe{7_hLB7hl^FoTXr7jTp2 z{?k9}5Dh^U-}QOu0`|AdfK84VEX0uMr4BcY4pew!joh1cYUN`{ZA7odob`RUDGp||ouLY0DEYns3+ zPQuTkxt1Mat8Axy?Tk{Rd?~6V=l2|ov`Nbf@-w#=&7j4xF-yD&=Rlg+I|l`K?w+Wh zuNcqzoP64<`9=kL*{x3Z=>IV9<&axoP(ndDKO1NYg{NraxYNUAwE%p`z>D&i8WG5e zbEx}OrdjMIZx*}qq_3UsuUXxF=qZSCPuBaBhnaI#vN6@Dm4v3B!S;d zK^9GThjI=*3}C{L*BN=4rM^G~F=1YM;QTaazNz$W2$w&#fb?rXaq!;m8);G{z!cn8 z+FAP}8K?-(1Sw1)W*X`AMn;)4)5ybj1y8KqC-*toeH?KplL*MuN-gY^$oqvLEdS{y=e zQ;S~d-t65yvcg+tGNI%@cdRp; zF<%OMFRD>hA$eyf+h}|feNwbu_9_?IKfK2OBQ!+gJ@)CF3>Aq9in)uXO_2%5n!a;P zex@tMuF?9l32o`Q*?m%5T?W!%JcITz==09xB^91NodLRfE*zrlQ-MaN- zx54pfQgIoeLt|b~<<`ub9gnG<4x+t=jT~{GyjJP-Y41MuTS}a!0Hdw01ia9<1y_Fh z$WFn|(CaV|qW-fuNb9i!d6R#q$P)2|_W1#gKA2{9{WFmQ?ej+`3p4s#F@PwMe{+#E zTNfQlFUVHBW%fCA3IpHKl1&|vpFnh5z&FN-*z~78=eYTYj8;b~I)r5(1O=)z&)p5L zoO8wyi=!oYps=p1kop8T1h)t`g$$zgM47cF$3k%fpKQV!-Bz~{a;8B=K(F-%Hus}s zT@yDsqo~SS>jFy5E^$`>oPKE##v-FgFxNcyzj{=F3N5rt1Z(-| zrJGaI;tn_HD&Me15Zh-GW&|R3hZ0SDS%oU)*gepCUBLe-cWfMN&bXYA;0H5i9 z-R}*wS~zRD)T_Y^!3)&52fb2E!Qy!+;_d6MhDTK!e)A3ccu=-!vsoF*Jmt`|`m0*L za)uf=^x;z=wZ*@}DWow*iG$91%)_!l%jrU}e$8u-q0gNl#BW%34nQ3lsU@}#UiJcr z`!WH86QYdhXgyU9g)uEZ@(Xs%j?u-Q(69s%w=z3mN2%+g4#iKp1Avx6snZww@hYA>dBOn?M|sA-GNWu^n9-HQOezc%Y`!=a9< zYivU#CuA!ju8Ll0xgr38WBkc;{HR-(nRsH>M@Q%+f5+KM42O9e@k%i+YIP`f6jY2v zeXH~fOfYEX$8CZf7CR8@bwq^nP}Kptk)5$LRI&zYLAvu<7u%w|@`_Y1B?ke&*Ul|# zZ{h9wl9|tOa?$YUvSn!QC#^plj+T6&(J=G!B()HUh-t5-z{yP8*(nv_&7TXimr$k2 zQE{RXz3PUMiom8ea~}u|M*tBDlJGCrc(JB8!!F2}EWiKR@u7fnf`KLvj)66+MhVs_ zS;81w6c~spmYEp4?|MI8>^Gy=#6u#e=~h@P5MA9SOT9lb<9zjAeSXdHN)OOOoKY@N z0AUJKlERTXVa{cT^t58wB&J3o>Nn9q4{ccwODS`xcorr9%hMuCZwmC)`+Hfk5yj z-P?x!8)>=BctMNPjgNjqUMRek=x}OZXMVjJuC47Gs1P;eY_X6>V-#PPv49x{^)Szx zvp&uBm#efha_qxn9RQr1gGIWo!3KPz1VI7fEI?W{pLOh=e@%r`i_7TBJ;9Gb&u6rE zv~ur_;2jcd%dF1@&Yi<`e2*FhUJM6k;-eQ%%OitN?b&aLh!|XO%}_I}+y&l~m=gEp z`RP=xK_uwkqY{)wtQsN#8-UIIl8^wp0u7`j!HsI4M|oWLEbRy1i~gNE;Kg1r_7tB8 zHNC^UTIT`hoQjes7*A!M^(kDMqQdPw$znq#WeuTd7)0@c`e|vqVz(~cXC=|ZxPrlla;VUqGx)uG*(#0~AKp9HWcRhm{=`2RM<_KRe!m9Wt1SQR*Y?l$ z1;d0lW(VKL#NgeI-Vf$4n$Mx{y<9C7_Baf~OJz%|mVY2=FDhr&us<&-cw!PI`h^}^f8L@f;#XAC~Ra*8kjti12Iem zj|FxPj1pXS0jbN-mpM@lP209)9M6qWM{V+(-JcUvu#f3g7^Jg4UA-u07V^j%;9uZ% zR;e;Mh_gpOE)%a>b(}Betn`#hw^;XioWWJH`&5#E+UrN!H0e^jP+f^>Q{lgI%mfJ~S=dhf2~|``vlY?Pl4Ola z(wEzI4kJRDtbn@~A(v!lUOzxl&PBhp)3hc(=A@)F91|54&=_my81E~43W64Gz+qIb z!XLcPaLOV#T_3naP6QM$aeY=aBvNHM5w{=;Y=t_Qd2_@i;)~Xvcnk;*RiO*_0XxJp zY*(E(s2vQL6E1QR1Tq6`vX&qkUMj{e00F&CPv$36@HR+Gt4T zI5g()D+%_sl%w@LiYGULGt#nQT-7^H?@%{qT4$n@o^Mi&aT#?Ua2gK*%|IGCS((4F z!2iP+O#@0H9Hg!}F`5=JUI9H-&I|ZmIke?>B6jn3Z=T&+(ecCcn;pFmM(qs`>6% z8b?WajL}|OU;T@qa>h{=fkE5V)u6Mon&s%^nJm)6mE$f`65W8=DMobbMq=jQ$iB4T zy$`Ic8j3(P>3{F`v(2Qh!6cyZSB4s|euCrDh>zi>=C7@Zurn^W0EA}y$rE2<{Q7Bz znhirWCp*6IOLeR}A_5!G*kY({sdE?>jOJZ{%3%^+1pT>p0}R?5Lopzk1_okvzG4gB zebk)7n_z_cpRq6W=e^#X=>UsZ7g=(`8xI>{?@f*qaW;(PEfUQ}BJv|{dB+Lf&mlIS zL_#S9T1~&Fl!YCER2g?yXYe+`l+u+D;jmZbj1kH=tQ%YWE-z>H>6P_a5>`kR_Wrtw z-kFf&M$DZeQl?T&sAc&ZfNVrgt{{jDFCkI4*GV1p@<>fJIxBCKg;6A1FnbTh*qx3u zH!4>{q^iHa-xa_M?z~NtKXDEKptIymc;W?4C8VCAfFMp4ht`fBPJsuPzOD&mH7;?u z?KS08yu*O8iy$$il+iYFFh}s=Pzh7kXaZ3Qv$xq^K6c~3JoW$fE@ef68e>e{n>mwq z?t{veZ0hPcNaVi3T7)F$P~xhWc^LcpmGUqmqG{?j>i4uW7hJI;uSD~RAvPeW32ZTH zSSzh=HsDA<$FBJUwJ41G_rhL;94Pjp?aqtm>d5gXmt4GJ`V#4Zv!Xo1@leA0>n)-B^>c$zvb~Syy z#9nKuLl|-&BDS&AroSn7us9G)CKvfJO6_iUn&RqwPC>l&GE}gH?tXYKmjRSkf5!jq zB7lfIz7W{{9Wn<`K|?9*Jm5>>8Y3c}mZd;7&1$C>h_&svKZdZX7^jpoH?UB|%9aK< z?(gj?OIyz#Ezw{q$D*@(&Jv%DtbA^**&Lz9<|R5OdO#!b$i1|8J|Dn_$sLq=0_O0J zQEsFM63&9EZWJQ4JN@0X*s}fp)MlT)X|u8G=%qY^(g*~@W>9Wt?DXtN~>5qS~0KlZ3-tQ92f(YbJS9*5UHGH87dj5M^N^A5PDq^fM zI{Vt%N7a=5Q6E2Su9c@&KJF%E+v(Enn_iG_nolYqYTPBFwPVOue z#Ap&QB2+FWH#8RJg6BZ&I!?^u$nmq0z&B}z3T5$5xqUAL@DG?50Pi#c;X5XJ{;B|o z){z}&yp&}>{l3LxG~HkWl8uP3_5N1V+2Jv2#{|d6!qFE>u{yP&J5U5<`JY*|@4`Qv z`EmkUm-IiP-#j@=@s3SEzXTr@(vdY(1l8k~pqITf6ui7iB-+pNFObYlaXO1Dn7@%k z^@tza{E`&r#&7(}%ZJYsT6KWay)p`|L*2yj-8sns>{F22$MpgzX47lOA^JLcnlpWF zcL((rih$RNKsbZr%tbQ(?4V}5OXJ|!@fr%;^*~K#l9M1wLfo2st&V6c+*8<`?^A~D zEL90mmxfbk>hQ#L4I4%tRG9cQeeq@dsY_OC@m>cFbf)x!na(4W{&vL77g|$LR-&zu zBjDId@R~AA-TP~f>2B2v^S7Z3^pKrVx2)=ObisSvq|;cDL@3<%RbiLBXCNn%P=J^@I9csJ!>L^ZXsXIZU+M9Mg+qIF1LGpYS*BmDE)kaVvY%;-Gz_IbAC^89s52wC zx54Pt7Yv7pHYy2o>A|_gy)ld!E$Su(kk&#BObB;CJG7^5lZV;I2wY|fbTll_%Jw#~ zLFR?{n=XZUu-}TH{BZDL6l?)IXpVp5gzSXguMOHL^6E+bbc>?##KC0D4M=arr*C=5 z6QXrBK_#Ltx9O(q{JUC)?y}Dz3=`Zx-?O1?Nz(=rM^`&B=S?90L<9?_Y2xfo&X3r4 z^Dar4y15z@#^^X5v@wae0hd%X=>0E%Mhj6!N<1rQQrfG;MU<@SP2~#T=xOfYmW>+t zCw-i?{3W{DI~b#l9un#Q?3}l*nq#tatb6&jHM=^0=gP$A1fk^>Y&F!m&m3PT-Lk-- zqwN7TE6(K7!j01dAM^LI46GVSN4-{}Z*J~SD%^6Uxs~~w{+@@2XC7B5@eQlL$;8xs z?Ch-Q=0bsVzHvPZARBJ60$+4H#asss0g1lT=`;UYv)ko%N!I{A8qj$0O%EOEw~Me` z*i9^tAI{4Fk6+mswvT}V{S(nQDd~u^ueTh5Mp-molhNgS-|R>yk@vy7+r-&xWQ`cv z=^&R9k6YPj4-hC7&Kl`hnWn;3ws-_$R0oi7S2e!E1kfy)YZ9OF79y+N&6>~B?Z2Rh z)`EERuNW;&=+Ppw5J(?5-jhOvs)3twiGK0CZ5{01uwfsk#oB}oW=)QcnyWS4DM<@C z>uajGW%aoc0uj?JN6CGsZ7*e70-APV*r$JcA8)%SRHdE^aTWTYF>3sa2+a_NX@2%$ zPzk2DlH8~H5@)FiWP4V1a(UnN(e8?Jo1JU+zRSP`W?`%YrSVD@s81@gua-#Aqs1?U97|u)?+#Z1sI+P}M!RY#^QM)%V=aLEQAzg!tBN#1 zsP{6zb#q@85$b2E+yZ)m$ZLsEEZ^3`L=I#F4swKLT>5VMeDkKs0HghTR-{^_R_g_= z2WR>a;fNL3Y*D=V@4MHWx9<5jL*XYFyXI`A&Bb+?ksC{HwhbLs#=yoK-CYZ>7yv#~ z@G|*V-Xhw0zbZ1ksH&bHfuy9Af`x`<;X%hvsgnDNGexlhDoWuSvCGAhA zMm_Fqt0rv(@%2_3Fk~K2{~}bT8dV1V;W42}9#jGHMO-jA33l%FGwCLxc;YgrwfbT^ z^i?SFWyvwAy&H~!7_AJSUmQx7-+S+tM)2lwep%SR*I)wToo^N^XOhKp7NlYqNMUAx z*U+_e`yCPa5`bfN7h9<_0IGSAPGA5!4Yct+6*32daze``6QQd!lFP5Oz1Dffe|!K5 zE8h<*Pp*^jkcoU#Q;#W&p?Tp_hbe#3>mfa0-M3SHf2vy8d1yHWyQ$q4BmPya2uX3h zX5T&=b~dE&;8I0tXAoZDuFIQ!!D4D$1F&re3x4qWoDeA!77hsCV?T8BktzZ3@=NS5 zfR)?4*0Vi0!;UIlHv+7kS%-F_bISEmVWlbP9uP?=R z>V3j^Z*H>n-jxQa2~as<#cP(kR!l}Hhv?`uk7eufvY*opogFLM`N?1Q<>N1v@^ej> z823ON4LTnYnwJQ6if>|C8rYAYMQ7B{%g;MGY)X`hf`{yYMCER1)Zm>u zK-h&cx4Ke<(1a{YYbTEFfK`+wRFgu@$XD!)%o|^%hpt;nWL%fBtXJ3y93uX(_33s9g zuA@amvG1qjZQA^)d4w%HlliqX)Y|z9PrVLhk_@VK)8U?T-loA-E;DAB_X>$d5TkFQ z)3?R)i#{jwek&}pT9T^1FGna#D{_GB7jJm=YTai2l|L@K-Jfn}>eraMOovba*n%z( zKg0|Okt%VZB+GWa*S_S(%+_7-TCZ)}eUQ($wb80ky#IH2!<%_+21FhhC2uCUFwN;) z73;!V6S~{GlsUZ+LbX2RUl{8Z0p`1>I+($xwEsHVE&yA?-MewlBZ>ocXW>1%dj&|< zF;BS%z)j(>Z8XiZks+6BxA1`vdrt!)tuAj$#$Im1PlQJg?RRGitUNm)t6p_{_t^-; z0<5dXiVOM~7jLFs#5+71e?1j@At_R%ero*k>yw?h7{#6o0`Ajq)oGW;g?+B$Il<&BNgO?fGjJVb|_ta0YOK6gd!2D{g?=qPd4+e`No z`+z?>Yrno8x%Bk7%eKwiN8D;j0&QH&R4$zZ&^lFu{Oa4XfcA;hYS;Iaj%pSjR7!<;y_XznZfn?3{YRAE5?G>8 z9X=3&naT6RuAL0JFAt1OT3?(J>@#39RAbwGjVva{_cz4YX=JwkKBBF%sj|?Q6N8Wj zPCL&#mHhRHS(p@Ck`ef?q(sk+LCecd!<=|Qtu=Hsi?^Ko#GC4autev{ zrWa6v*!HKw`D$gT2CdPaxtU;^!jpG^K=y`4t_vNGjB8T--1&*9S4f?~OnRO)ITp?B zeC?bAPE$blF|*Z#I25Ac&_evV5 z6jaa;&=XB&`4P;+OHg^1U`N^Bli}_w48*Wg54Y@E9$+Y`!z-E@9XFz=e+D$}WHyxn zqb-NI_s&{W&$DskvC36iN~rtPm}brRJoo!MV`&GDq5S5>3FxWvBz$Q3UMCh#!c?Al z@HYs~?zux^jwn1SFv5!0(cDA_J!#GZxQ2-U2$>-gWn>CgFDF#RMlZI;ToxOCIyGw@5@%9q>uwDL2rONuhOxj|PVK-IHqmecDLsz2zm zJR;8PJk@cv;lwM(v#adq z9+!UAN2+CCC^Ta^@hiVoGFsN$3o~Q5hxNv~G8=&qvaBB8WfEp` zMEJ;$*%|t`6(^rwan1jgs?FI0*j4wTfX3N4D2sGMYkJncfdXbq5u)r29~SzCyYQ4b z9o$vr*1PvsXu`7@KNxtFDHbkyCB6ViL{G^b+9vOK7=uk`ZYfI{N{mWXcA zxU9-v_CmFsoZ-sd=UEwM-8CUgSCgzi4`tY0zrQKnMn}ZHow{(a^*JQ+F?nOs$K3PN zohkO8GCH!p6apN1Bkr=Z!Dh71;fKDN7O8wu;U2a@|5^^NBg9!wi=neU;LRUz`EJ;( z@uH+arTZdEvg*3%iIziIJwHve!tCVGt2PXrNccC=h~qsq^X^`KQ1-1$V8qUY1-k0x z`+yyFn(~{&2_0!@ZZq=jxqQei(NK?EDVuT&L_*X`>I<}v+-`5hH4k`Ir zZV=H|?vbeXDm!2VfSScG6U$5?a+=B*crxCEu^!%eXv+_@(WEv+&kmc6J*sGT6v0F6I2)X@f<#l3K#FwmR}`O%8wiiabRea zn-Envhr81_zD^#9ic&Bl5HB7H2&{7m2>(kxoZcaZf|AMnHPcjevXFCb`PlN~s?NFP z`KjfF)fbP|@;0?+j@l<@KZy3|-O@NqBI>Oogkl^;+mdqyhcsHsO=Reob*l7E8e0P8y*3sE}qRPFShu zH(aZ%N|4!-^?c`691jWkgUP1wz!G(KFog@?ZHV-2C?9!(2WwCldN{+71{cwQwf_p= z$IjwfF=>Otf$bZ!TzJhiLZ!~zaIDkO2YFHkh#`LMjqH*L>DkCT*&LqnIyb^PirH*?10_(J|H5W!R4`%3<->ltxjsMN(% z_grFNOyOs?11estttO9Q+j8UT+R5{&?kSwoS5Yc2p{hw4@&*@x9r2jeCX-pZ#L z6MBZ+njwlojr>Yk*cK3cIAO=kvqW&+4B{ z3WB4oYR~IY;;y_d@zLVSg_Pr!`7UuGwe-{3?0vUV92T7F<*$3+hUH&(5TU}gM)PYU zJ#A2pw7h%MQKR^&NjhiHZwXR~{jG^Uz)R{U>;PFT>+H23ALKM&24d#qDq8C@6Qn6| zf%wkcLY~0JgT3(sT~OlJhY=S|Aq4@LW{N@goIGhN9FrtZ^MlBYzC;XV$f|-U;nz_u zxd~9|@15TqAMjj-Tz{K|h0b|xaZtGD*|lG-ru+Dfk;k2FhjL-|)4{K~u^NvaPc{@| z3X$v4(&KZmM~a*cm|t6eQ9vu*Y3_gA8Jf$9dTVRQr^M)3_U78O5Q8fbUFAG9>b{sv zq%U)>BHmsM!EBOY7zi~>BTwx*I>{sm#2-S=OL;w-m129ocs5c#lDNP|JO@v_XlY6gHXJ%tVs0T9{a2SapM_x4s=_YYC{92BexDnxF%ziCHNdZ{K=A`Qsj*xYWrP`);_%$1drt1ObjxP2m^3W?2;DSMEKr#|uueSTtRK zQ^9KQ#Ml~LP!PorR#b6nD7Ni|kmqEQtgbv^3``0$(oC2sZdtRs8kuZEktPdFS~)cg?V-x{e(RXP_6}TohRmL|bEnj1CS=UU>S8>uUsr%Rqk+KG-6hM1GpskM zQ?_32x90vj?cP;pUw`|)GeD^4>uW5At3nHk&i+Tb+E-7a zvv+H9BS6wvI1p5@5Eu*Sz!S+`-2tcDqRvtr(#WU52J548!HpA42R)}idk}_w)Mdos z7XOl*P;*^&3%?y(u3Rr1pCe18{p4Ohe1<$QSca39RzI5Wb#zDnvMFrh4!@410}}I@ zgdtV+qWMY6>(=H2APrgSBs82TkB)a38V-Hi3GKMP4(Z$&A~tObs@0~i9hdKpkjZ@g zQC_#F8mu1o`eCJ=C0`j9eS`nuLW#L(z#-8ay;mxr?TKa=6U}=>r}!`}k9X!}0~8uG zcVoU)-~~G*)C|z4iXk8^k2i}a#|x@fmHa_?X+r2mh`^smkho94UaTPU7?qqFI>ax0 zUx1Fhz?fFtge8lxb2(dRqb5UC@MyWD8oPqLTnp`4!zRUD z(2e1j@oAjs7+yAQQFeJt8RgJObqn2c=ZT9Y7t7|>#1xb6{4CzHnBORepn->#^3VrYRG`B~jgtb4Fnrp^CM#EgXya@@2s^WD- zg*Jp!wnG4*x3AOMA~Kk7S7zB;N>_d!FDURY@pf4hJdgEnNcSNUrIe|?-SGnx96*mm zL(f9#Dnp#kNPqux!Dis7LIh0{U~oBXX`*B)<;{3=36`8go^p8;$*1X^Sc6Jz%GAqw zP?v&<(aIQFU)vhzav8>Z=j72rP9^0w{-Y91mk7itTbFdJb3}U4=n6cM2LDm(EE8R` zzB;-kdMa~7Ud3y>)imG2waRd=z05(Jju+ls>*p~E+oE$8h82`=?umI1GvK<@M^gfH zUb|U)T`s(0Nbo6BYc-mD%1Vj1RCePXZ+}+>1+vU;jz8E%g#51z>c+5L@!*{?NE`2* zADmn>JqFx*(Jm-XZrsRmz3yKlHJG@>=`5cu|Hs1!p$Lh@+iM{h{mH(GwZl|wc?UFo)2U-O^L^t|rTdjdx8Dn zSoq6D$$Zl~FD3K4gb+-)$Hw`z{E<)mR6Hu^s=c_&IM1BN1j7uU4(vlTts%N)!-3LL z=$2c2C9s^(@uzK|Oe#L=BDK5`ZBA{v8~vy{e{e|PyXOSsxCX?c+Uex4iC3{*sYBwp zWd_``c$nSOMUlV3|CrBx~z-1%hw^=sh>&uib`{|t5i z*)G-xO^2sW>M6*tophS-RRsTgdmVcGqP{M8L6_4yu!*TSe>ByTbB=MGLGU*UFFxoQ z+PpcqU=RjLxorvg7@&`FAyYF zFJtOvM2sm1?6CyWTYm(~u+Ua3wD=>=#^M0q_=F&<4WN(wFo~5PUfv+UDJ|>c{^*aV zO2H_N90a8)yARL)la3lgde|3hP6;2BhxRs~Qrd4JDDPD`_tBTr+fG1N9r6~l6|*KX zB}5SFW2(@l6Ok~_#%bNcI z*FL`t9c$CcIYeSl_9}8GM@YmG^4>iSWJC!CT)*ifToE7$rf{L!rk=~l^Ge_yKv~D| z5D+OQgAqxjRS^~pvNu>DS`L5vXZdR3aXiB_Oc8V8EH?p1BM@uuE6ZX<+JtSpBTEnL z8VaDqG=2LY*N6MCIYi*hOC|2Y;05uYMy7i;w6JCirNz6VOC3s&hD!t8! z`nS$Jn=1S+d|w;ZRrMY+b_-;<;MuerlqV>#p>QQ}yWR&d4W>}UOE(XP&3!N#Cx*O; z1Ng$e*@qJdETjVd&OLcz5)m`pebWt6LA6VR9~_h(2>(*^j@{{4>u$Pcif?i`_LLPo)y_0jTXWkvB) zOrA>z3D(0rs>lKQ_nAO`N*i{&3W7n$Q*vcvkvzE%QiFLl$F9`t51^Ft016?Y$9%Nn zU;!=ts&trGQOY!G9KWrK20V)IDLNl8-~jn0-VT=)ZomKgGSIZ{^Y~svcgj$@Zl#g2 z54xwh%x;sE=4Ktym+*pChq;>`fsXvibM*+2SmOrV1l6%9Zos7Y!lC1PdLmAi;bi0; zbWlK|v}aWnl%ac((6sRfjf+}9<43=ag%7|aSOL@kyaFXa1?oxsQh|nV6S7)rN9x~Y ztERRA5&mJ#B0>q7Yy13GIcA;*V5-{s#?DdNVRwZ8!2(3&4JcmY)z8;K6ixa7`AKCX z9Oxi#ee;V7G}DbiS0)?KrJC7tJP_x<47~BLeTVGFr?4hFZ0dE$-ydNg++l)s_bv*; zFgn-R_G5&C6c|B3D4*lI6o_I!fPrm+a%99W%s@B}f2&)G`E$w<>9bdiBo@Hv?9bB% zC6qT+kgy(c3qy%00i#n!d)0Mb59#IIN^%*po-b+@&>r9Ja5bB;|Yge8*fmiWxdY16G2JDblATuUE)z2OY%8Vjos;`>(t4a>P~ zye&?+kNnwIy@9064l%6ceWdi{Wj&W|sA^>%fW_27^i$S$$9MY6Nj~2dI#uoZ-GtX> zD9YVs`16Hl?(36> z)DI$W%R#RDCXMxk?BCyE-|-!VBP2^B2eA^@fzpCBtaMk=cV5$NCH@4W0Q<*fsQl@g z?#=7lP<4$e@jaVESdFEB7hkAOeE;1pscb4Gz;%_}%Q^c#`EKtzWt%3Qj|jP$LWJsdDS z1o^t}|6rH3xKPfNBAw*0Iy_?XhaP^?c}lM0-^Wtd|148)ai=unliIuIh_k0|Y%8ZX zTcV9r)5oEXSK8|V=z{fI9K%E!T)OG&cI;50FipEh{+E)5u@dW^2XPVU@0&v+7nR(O zk9^<>oRo{Ymdu_`{)6F??yF&pD$aKR4_PWLV@Mi(hb;Zk|6(gb;cvrIhRfU|Q8_d^CB z^jb;(j1wJxw`5yS6_T3Q1LAFVOSy95o0|KM(_>D?>X5i>L0#UsRW`E7F}8eg^`Sj{ zKK{~?meFbciPvNb&0dkhmuxAA;4r!vW{fUPs$W}qnOwJaPg&9WCs4djUL&U>(r@!B zT@RMMBTq0Fd$zY=s*e!F`v4uEUrc}Lu>%yH9>9Q^oeQTxdg8D%AQI=k$6qr?ulB(y zWO>E!ogLf=T3C0We55A@b;G3(!+2ut?Z$Q^zuoMP^c$T+jFCn8nREiQAq zIeJGMuM1$@04X-?X*u~OK*;T5*|mhA%ZD#)8E2V3>+J-Nw&$x-4h1$)HcHM6=3?|gLQkZ+%;Qg;Sq{XE zrWVB)$m%~7dz~8w&QL$)?a*u>8%mxp6lelg(p6zi^*~Op;$T$ua4gPDESQpJyTPfJ zm{|t$=a`!lzr&@sm%y%bd5c&H4aEgT%puA}&M@14R_5m94f<`PeX@w*97fwxfu$Gs z?t^FN0J9NyH=X*#Cw2`{BDPbyg#ovM)vRI$FR{RGOJV^UfLrw!dKEd7(k?#>Z%v>4 zM%SzXaBVZLZg;~Bi{T-8I%D`hREk$Yq`!v712p62;h6Qu^_P#i+o(Q35i6jYHFr8s z8l<>*@A1O31B;#gl&`KzJU z*$B63E+4Y<{mKfr|xuoUe7j8 zHTjmF9+7J}N`Aw0cX(WHdX*an?=5Ba>K2@GnP1&_pp@(RXk-JJ=Vg5Qhf^A4@~P&70H27FIh)V z(`F*S=5l%+*r%D7qlQ49%z4EfuPG3?Gc-`EC$@O7Q*e;&1&cplOt%n-8GIoH`UK8x zf}b;?8I{JT9O#B@xd3Fa2_pjy63C?ic{Wx86m(^uBH_V`wFWyc+*__fOioHsFhMX+Nmo_MIQ#*E7V0JW%Cwyy-q2~zls7UzffS}+I z5l_oQaRNgS#1wJGvucPCvGj3yU5@?u<{MDmdIH{$yZJfU&?%-*H6|E@0M-YD@6_`9 zt(6AX5TBNf=(zSZ3ERU@bi!rbLeHAz@OfVgZmfJflMP@{T~nnGpoR`=!ny_TSA(RV zg&rqyI5D|r<$Yoe0EZ26T4_a?4JN0q>k>JIpdr`N^cgt76{CZJo!5SbjLjnoaC1;% zIp6569*Z3*vIv$=SYaIB^4kF!gsfU9C}2>ReUYV#42PgQMAJeI&Hxc2v0&!wjiyQ@ zZnQW@lfi!_7&=NDx=A`vv+e!+FCX3UTF;!I=Wb$(sUdhxyMW|tZbb-xxsR@HOJ3ye zheLgUY^jlQhZ2C&MM6^pQkt6w^p-wCP)@h%P(wPrPSIuu`+GJzQ!dtn_xJwxA?K-V ze++P>9aiGWBcrUch(|rjczn!G4 zF5Gqw%556zev^=n3U(6jJ&d{pNy+WO)GH3K#IJsvawhP*GI@;7lzv6dm4LvhN(>JK z9TKa&WOHo4r&-I{0!vMTX*#?{r?Be@Isfi zggqcFl4X!5{4gzj5akZ|(e(}U?F)$fsh+?5#ql@(%-M);i1UZT$1?#9Qg(9STSIUk zke!{T@#bF2m^5>-v*)jB#2A)6jH{Ky40(PF}lZ6R3vr|Pk5BR8S z5NkJ1DmK^@j#*q;F~EcBGl;%XaaCg{oA9go#+Jvtg%HM&cvV{-BJJ&ahUtjE>=a_S zPm2Gm7IPvp7-}B`qmNuxt1Z4}zc+RelFURZ2zDTCH9ejY6)BMN}KGKW=8J!pWNT-E&Kv6jUC5n?;G&*>D1D4W)eo$FbIo_&YLHo5s(gL zlH?Uen&zUgUH>VcXrF=y(|Q@MD4R+J_ZoFV_%)Iny;6q%Y~<&A9daWY$c=KhNbc@z zBl*6S5j_nlOBd)$hwJ{&^!+PbBlqk-X(lpNR2DD{?5F<>75UH11wIFPFwk@hHNM_| zN0EsL)xWLpoJ5xW2?TCyK`9-`-!N?LUzt0k(pP>@|2zTrVSW#>ThIS5WeND)nctt2 z&4>} zW!O~dC*L_&Svw(f*x=u2PeNHT|90Vx)8%0JNvYm17PYbk=U$w;QS)f}4jPqwkEFQ4 z!XU>)o*3J^6U3hJI!Hg!Wt9bG$aGVykjf6KdO0BF(}aknvv)bcN|XRF=8Mn`6cTzN zwJEs%P=!I1xnhfNCcd!wQ4Z#@tzHTGLHXc{mU>oNKOMes<-r4&y@cr3K{SA0%;h?K z_%gh4lXpGbuqR026;gL)lE4xlA_;_Jlr6hGZFx;CNkZgNP9f>_$&cT?HYJ(D5XIO2 zx}hmm+OZG@;WaB<(ItzVpO6DP4Z=a3=kKiX*wn)bp{9OzuV4w+v+~M>J?kK{^>Rq0Yc2I%>Bb?S()$jP=T1oc2NFBFdPI zhb{nSPy&!dLl2Wg?`MD%$UGEk>_1D-D&G%t9;t9}=dB7P)EqTw6qtx|VA!|m&(%aE zJ0foTH4sBnq-L(r`mM|o34Nd|EW%4oyKY#$L=Rh%xRJZ>wM!uu=Yd+$eO`{|9*mCVTad6A4OYGqDw6W80p<#cYxTWZvS7cjJHrwV;#_OAP-4_(N}g0R3K)T zPrf?$gm#ZV?~)M%HcV0h?bkdI98&Gb4N)iun0Nd z*{{9iU8_JfS{o;UJgKAd-w*?92Q-#_g$ZS$C~?QMd5EmBBSwm}7jquE5fuc!+)$Gv z)U5aQo*8you)7|;YPsvgPQ=P78xgUmne@@|{39EQK4qbPff$e7VoLF%qY|@?Sm97= zwX4^qpdKP&w>jofAn`4Ly%#9ic<~mqafwl`(?n+1S6roLNs(Bxc+*#CVWGl1M6A6} zv|IdA&$6DW2ct)CLW`}PAJMh;CzErJs@UA3Y_o*znv|jey2>zN$?Ry`=Fbq}j!cWX z7Wz>MOOt!UDGPyKuUQlNIsqMFcaUjuR~I~BuH#yqBxw+!Y-c%50x&WobKukz!eA|= zhArjIG-&Z9c4az4QX(z)i^`ovgS>hles(v!JrUIC&VbA3B4d0;1zj}1X7dqHZzu@EgQ;O(7$=M zt8iFMo2bwUfQUO%JF^4>CFKnp!edrrJLrrJAU8}%iGF(aFgX}R=F}btce>8Oo74Vc zkpB|rF+bFM#MJZ=gNE%k;^t-6o~sH)47VfWQ}@q z1j={Qe9D`@RP;?w219EOj2ZPtpX&_vN%Oe)VlfFcq)N(*hd+wXjwo)1V7?*>o^!dF zW~XcLNTt|fi&XK`-OHa9hESTzL^^Ccb+l`m3xg_}x3lAq>!jKlbE+sp~IU z1NGoJh;hoShE*_x5~}rd19r}~rMlIjv2N?r=;FT8v87hb%P)q}?d?tL0zQTIWziet z*M7+M!T1CIu!owLpi?v3Vq?f$$zUvS+|^Fh!6V_ph+&4R0DC7HZQWUuIA~}c<@bJe@;JJS=5QuYv z{y}*a7TC{C2&q#UNS)pR@IA`kq|P6ZO3reU{^yaUB*u=-;{kNcf<%~n*1%R_gKjZ~ zR9+C~cz~nHPz(>|#kHMPe2^c_my9kL^5d|$4Hdr4yjdS2m-$QJ*bMo;2%L53C6Dz#-+(lqC z!teSc7{nsudL(nK0&VzSFvU6Uo6AW`8ukz^j{X*SP})VGg2*xk7O1Z9o;eL-(jNVY zlOR2XU@1B8{^$A>R^V4)!h#+UnRR1~90TXO-v%cKkQ2EkZkJ#+Ge@36k*g2dB^e!8 zCqiToCydRfTb$4V|MsM!)m0a7KK}UfWYtcE!vu*u zAv{Dmnokq(FAVs?J70QzWJ%$roOs1W;+>1EHiz0X*sR5{$n6m}dCW+IsTWpu74*O8 zO@D`?s)<)M`ES3I)lY^*a|q~qx?TO&%^THFZ+(yiGYm?~oQEP)K(=Imgw`P(6J|SqhW?5yr0&iSpj%i)ZoLVTfn9awGQy8hQtl=3(2SuH zd;%Qp^5$qV!y2%S-P1@#u`%pIffp3uUfOYYj+einyq+2h_u3G`NDx5i#LY+A)>t&y zkUjnvkShOu^j72uywtcK)NjflS}zqRXbSDa@!we#Mp@((C(e8+FqKImTg?j75UZzQ_`gWw`n9TMU>-4-_w?Ct_Zq`&hZjw>bb8WWV4y!h2?esU}oLI}Vv z&{{gYOtiQak9 z9h7(-+bX{KUd|8=MdWMmlCJw4n_Fto>@Wy%#1PiDA@@IK$uTq$z7mW*C&)Dzx7tMC z_GCU!Rv(RG@PH!EOH23ka=bMINgrfXxps?jZlUmAAD=((2bzc_uvylMSzw?1+l)LV zaxnx&WMS<>Me+Oq9m973G_!`wFmmbh!*Dfa^w12CQk`Y1a|F;?44Bb%YkFw@o2gas zSbaDt;ZCICAL>)z1xFM5fc>!Hk6*tFBe-Po@QD?9GcEAP?@De(_+g*Iu<0A+j-1>m zWBhe1eU7RCYbeKc!N>SW|7&1(SO~SpMS&a;WryBFC(Ohdu@Q~x zU-FY*frYF@wNi**Y)M@jvRo($z<6AX2;@#_eo{n>6BR4g zm8{WKYXxmJxL1*HZG5NUG~RyqT+rx*4k$bl)&Hwqyhh}DJ24_*JHC3&Zlod})_WF! zI^!e=$|v7`T!P;$^0eh-As|}@9R1QNr`-SLCsczmu8d_R_I7`lWgW8sa&ynFT92bM zQg&hVuuL{Xa?s=cZy?XMMLZy@6INSGkA-FnF#wKzabG6huO(FRbsoQ&BTv%dV*wS{u}Yf)0t3~$cAbT z$MBUrxJe2HD5(j`R{*%!5|$|8(k&_Q12(WocfYYQ_C$nqn;8+gv^4GhKla`;EUK;9 z8dXF$C@M*WR)Qc&L5Er*FjRGVGP5uSa2 z)h-LDx8r=Ej;|)6;h!IiHLDeRzI{RzI-KX#<;Fl2I2F_twNbWl5;!$2j9nx0j20zJ zYQ5&Q&ISmOdRiO|XXJiKO0BNZAVI&c~W z#Np=fSqMyz7!Jg=BXw;FF|8yPH)c zkv?v&>CG}1=i-^RH%8Q{cCZXR%*$vr9stEXb%4KT1{_P9k|D zGwq0cU$3An*`y>drKgW5QuNFOZa$=T6Nd~6Y|s@_mv)Z)G%(~Zs3;7E_BSl##&H4% z%aK&}FgIJ=tLpRi@@#S3vnP89B2~N`@dQ2becY7l`!IvXlF9fg27i1 zTR$xumRVipFf{ZU(vz)_h62DoJ%aU+BT&;J?%GRCEMOYG;w=YZf$+fs$$}n;!&W(4 z(+kIQDE;_6prcXxz80@0fV4vqv&TTI2mb-DJ%?`txK@acPZLwl>X0BMG0 zU{`7v^BI;2c2MHVs&;VB=WBmQmU9XSSKio7aVF%R$Zk*r+TlHzu#2zQEL2PqbmCM* z7lPrq)fQrP0$*=L_9bX>P3n~u3H8fzplh{4MkF211?k^`MA*wNR{8QWLEY5y;s|rt9Hra#}nFIy5lUNPInhX4JLtQ{nV+{ z`s%HD8m`0>m`9`0qibZ|`kGToQoY>QrLp;s{cC^0nUS1?<=3f(4Oh2+PsSz>XQywF z3)j$c`tf-!@-lwo3caInwxdCu^9NsSF2GlK`t9Wn#UNF$%2CPq z8cpo|EI{Q=!m*Mmp7-{VByQ{GyJZ>#+9jVGfWx#ARXua}bau2bAQ7oK0pfNNstGSS zcC>a?!EVVs)o84QeL2+hrUWZu~!=nI^{7(YT@2>f#1c-4V zmeppKNYdN<=~cO?w?B#=*75|KePOm@T~OMR56~qV7S<^kY7Zs@5iwz{@KVuc5B};%oy7XZD=fNt?`;!r!pIS^Gg}CPCR2f!UL!dT({^@ySIc-qD z>oA|n<=TJ@o1Rdys*tI|yQ$01bjWq4q6wV3L7hIa!B(_09Upr{;|UD$PoL;5?*C1g zhOd#QU$wDM;JbNLNd9zT_a=eWv335H;MsQNgx^nLt zY?OT9Q|pcweuuuc=vW>*NgVCEWe*zl7xN(FV?sTznN3?irS@~jNb@BrC#c!V6G9!b zKZcy9q{1tQQ|yb{ZEUzzcr=8#M%aq34k^*(v?gT6%3Yr%eTy?=WyQ?okj?x+@@$v@ z-=5&>OAYn8jSSSJ6WYU9EvBrS3ZEE6f2Ub{oAcYFVOXF>RVn@9Jl}d`%5h@srho_G zq8NY>3YsOsWmqla*p*;t1wn7+MaTec!~k4ml^$Tj~|Mcu-)=4odm`ZYG=0+L5PRFcI9|>dxqIA+VVkFVeB~+xdub2_q<%YS zcKp{IiU2UQGFpTiI`BP83RZy9;BQ?-|M&&s!UAWbK&S zb%xvUbOgV&KDWR(>JY-XdDU4>obL1EinHvNeB3OUz(E-=Z&L!5L*xXAY_)E`1$~kj^xQ9Vv+&)5lMl$Zmy;z9-o8QfjnwY)`G>{7dfe zd>-pY3hTxXIfhi$qfw?GLKo;2Y!kZFj*S4GTTT{}cVuLFG}dZc@65734>-Jt5*lk< z{DtDiXYRR%G3RKlJ(9xWgMu?!4amOdTdQ}s1zG|adeo^Q{+Uo(pY4nTFMsHV>X*|q zGdd=h__SDC2$5I1fE`ra+zw^ZBtQceXfm3M6pINi+n(-q_--HeU2Q40u*d3P5mR+K zX(0Xa5KG!zXOY^%SOfZ+^9cvn9m7T&M+|y^=Z6}G{}qe=xlJ@w`<=iXiOc&IcVRyC z$-^gbfRcx^$ORpX57riJ0(fnG;SGQ><`M^))sMF88CUdSX8MQm7Q*R{!fz@3m@~fh zruB?Zmphns#XK=v5a^2icsZZfpN=25x!UMz&Vs35zNK@g@j^pJi-5n9^W;^bpMh)& z%|~P3=|1-f9kw-eJeIG)y<~pzkdPpO+oICKB1UkwOE<`hW+dN!z1hlqoj?^>)zN+S&Q_4??t2^DnI7)Gi%vz)H1cTit8#j)q1k>ETZ0YloluT z;fEG}US=S?tV-cYszpau7t&n-jYP*ps#E!j>%ShLbsYj?M|g<*8U_|5&dA!v`dePl zYmDpNA7$$V^a`pZXA&#~*PX;r1KLHT4JVe8+hgss3UF#_^ugX)>F@*UE*q z+j>a*ixsrL#3do#^or$xrSSlK=OPu+ug5h&yIR-~_#h?63eG1acj5pM1*~6|hjFw( z9)jdOL5ZYO2v|!nnXBIkCMXRE7zwqbsJ^2CYsmm9t&yW6(C^2&e)#p~V zFWfR(emT@n#r@ccIoXxez?@Vsdyu6bO9%a^l&4heX`rAZJp+igiM;}``gCI`wG?t% zBkl|cSlK{Y%qG7GjKWjj zv=9p!h{&i{ZD`dfb+V6GL1A)(==yZIl#Ycz1F)76aPL}-sIzs<0h-fIHg)R~J@02M zBP_4b*LXzo>f$mQQ?DkcL6^~~j22MgQU{fpvMu?3LHtJrn#5E?i;hwRQw~38(h4=< z%%0#zXz4p!y&yk(OyUbU#~GMmOWmq!IWXoM-@Zay^B`YjL*oCEu(gV_glH-+hqTYM z%rM#>rv=3e&H1NwfgOUq_bwkJ7)>5~YM74&Bp|Mx9u9MwUu&iidXyf4P#dJIb7*EP zX}fOBn#wpvqQWcl9#A^d42=DLAqXdnDKzQ`#mivr<=b_h z8|6;Pt)hfh4wV+c2vB>KxX^-kaZRG3KOnDV{(#g^*xXT@FNTR=bZZ~Wh}0Wz<)G8@ z1@A?a3Np{b6!nP16bZl-Weru0%OOxub2%S3Nf0312};WUGDToWUYCtaju1GOW@eh8 z%n)truf1ju5=T9~L}tU<*9b=bJq?#kaoFyj^7`}j%iu{X|9219LgCkZ7s^cE$9vPI zP(`gfd#TF~7hhu@l=V*Oxly`c=wj(^$OXPMtSwRwVc^_V60;}wCTgv7|5JblGUzP5 z-TFf0sL6PI%va`La{rYN;NhF~oKko6*<3tSLZA8SA<$%1x z37;js&AUnZC!XOxB=cUrH^O#3LMzh`j^l%7XN+pPC~u#KQ0fZ&QjSt4N#zV0$LGK< z@z^?e9s1ACSV2^bV5op+=T!4t7;98Va{AYk!#)C@%q&Usiw(Smc<4Tw3O!gl@8hw6 z84+jt9U#|onD`F7-AXqp6{ux!K}8yuDLw(6Xds=#3{Dca(@uLA(eI>&@MlcquqE&c zamhk@$_3fLe6k&aPF(-1=E?M29R~Ow=V5srm6MtW4d=-@P*w5O$IrJBIwlCgRjv){ z0YCMBd?*XJlv9-_0n%)3uz#i-^oH3qz-_GIC zp@vgE=_Y;%eUp~j1DHI-U@X}@2rVOC4r-(EXXh6YSq#31K~yhr;z!QxJMb$(!p#ky z1DE-8XEMZ@Af>B8`zKlC<8wH@iNl|1es90<6WBb9QqeBx@gBphWefe+NF84F!P`7& z$S7O3!$<$)knhd=l@;OwC z_PMx;h%GR}eN4(6Fu9kW_!nVL`%B8MQ1lJHFK)$}(Mep&ZaKsyBi zW`Ws6%pV0UCgEjX)DD6S?*=-h=#)Wa|L4R@sAfU%E%|3<|K8Z&M)#7^CLFz(=O`gO zFKXCRO$Lrl@3+Sc}4QU4<*4IMBt>6a4*V1 z`?_zJfYABhN%nsd%luk80D4JDo75M0xDc2p4Wwl%30CGy;(Z6Ezz!8*PQU~H9Yg-3 zz~`50@&EH+?1(!;SOb$iPC<;^3&K*`Jv34~n7Z9`hx79`xFFgQHo{Hl=(7Cw# zZ~W@-uio?Gub%R+8mLT!TYxXX4<)ck2P2kG{KAF&3Hggf39Ww#O8%ZSuxWn z#XteG%duDBb+CO%ODOAnaK+CI1NZwvYQc{zUfbX3Q3sSo4i=-x++sobem<&OJqhM)v zePuSL=H_@pCyaGwNDvaGOA|`2n!tc~-T6U(5v(YYbxW!g`WSI`#Bp;II3f{7IuFu`BWl@ec&WwX2*erf?c~|- zw4ktQ^>}9!L2v{gO3q3Rv~$QliKw|0i;7P!A3b5^Xnh)lW@NA7|wU6cK|h9gCmGzkGn4{D*k9QtW2?&#iJ?x(^8VyU?|v>HdAd5~M-K@-C>ts`wl|+pggN3D~Xi&iw%6Ju5HgJ?oK^zj%dwJBikpz>R`55RHM{;XS9 zRX-W;RsYskzBrm&ea6z~L2w73T7dsWaxZv!v`;AY(Pl9m17@?$d*|^HwENs{3gaW* z4`JIl`#ofG6_7o}*a_c%xdFtaU7^C>@$Oe>=iLc zLE`S$&L(OtcwG$2>KV$CVhJt(iI0)`PDi*gJkD#2+%zNFJuv^Wdmta~LbDH6#tIK) zKcZ~Uy7Tr#vsN^kDutMR#*JSo#M+e ze@ZUAAS|OSOSe#37a(_gBcqXd#nrN-GSUaj81bB z75o?lM~|WlJ_P#Y8f&cK)wQRTB{Zn%SxSIzFWUUN5k&R~BDekvM0PQU2dzr!iMGC? z4x^ML+I56K}{^{xTPKqD;%OuYluTbJK3ER^gA^0 zh33~Xm)G;}I^N7aA|x}f&x%?2=w(Tb09X%rbw8mYJOt~~IQk#A^ve7j+R)SR2A4jh z%>AzSQ$u3qcR4gFV$=lsQ`$L~jh{D06m$?yDg{CdaV9%>Lxl%O_dIli9`tHJ6jw&8 zYdP)*kl}o&OA+lM%?HF|G-#Qd29SQKZ@3fiQ#=tfCcd`fyndesfEWC@N_Gm0 z5XHxd2xLEI0h6Sp5ZQ#8&ToM^Q1;jl}rR6oEwP4+a%&WE`S zKcrrWbegYmIGy49D!3@j<;pl2(O&l3!-IfS?XJ^<)+RFspa%KiEuAPT(h^O1;C>3&}2RSCVuC%1+Jc*D*5&9&&JkT8#aJc;Ux zQ-Z^EpPc(dnll0w*Zg$T6{*bR?!kMI-8-G~63yU0zCv~;mq?k;e|YI(kBVr$P! zwxYVO8Q)>QMgB0a7Ze=XN}p~$uRBm{gr$2fA=e-5$~H8Yp3{K1=Wn?9v`FvjrFvDz znsqGI_KaPnnR(6m!U_r!X@-r_LTndzFjg?45r_D*FruF@qR;*(_&E^in)Fd^5R)=G zf8PcOhanrVQGXyNS`_rPUqdSBUP6KO97FdS@8&jI$*W?!LqEJEtA1-LZDpI_b-ByH z%txNTpNBxJCQ3>`y;$4wOw^Ht)oZ8&D4BI-OI4|A+l@C#7#^=>>4i;Em~}*ovbH5l zSGo<*GFk&J182@o8O(I&6>WevT0BAkyPl0ibs?xX{uWiwp+8*APUoj%c7>k5lEXQ4 zQJT6%)~y`0kKR=J(#5+b)r9l;JJR{4F99X=^;N|SiK*I!HbtDK*LLXW!th|dPaf}< z5a$Hx0f@Re_QON>$dmw^coICr)p@b6fWeZ#O)Kq7`>N9KSSS~PV^965c!CF|6rAdd zoDBiYVhMY#=J8rxi_{SA2Ijp|MBb;d{;fw&bU~IzASOZ}F*35kXgJRP*5kz7vrEG( zNn)#QUbukJ`LMa0S$Ce$MDdj(u_hk{y1-oSvVtmu6_ucv3%>l0MDza4fCk73>4qhz zlwuT=K7(ql+hnGrplEvecc3nUO}#98$-|6%WfR&jR`Z#7h#0V&6=tFOZWS!U7?=+}mZCH;rpE0TR!8$>;(4<+pzo5}5 zcU|CUrHt5p`)4)pf`phajEL2kTdxZc<)lhUB{ow%H`Uvzw{Cl7LlaUFLt!Y_^Ly(B z)%6%a)#MM64<=VI!&M(rmWR9I0?vV_qV@n5-jMQBqvK*OPU)S%mnfBrCp$mgZoFDo z`dOnPJm}?Y(bStTFI<5u+}9>T$9T{)(@XCCPTy{)9mfA=gM6nj87_+W$v`wq0W~%8P0jw$^c(hN!M_nY z_ZzI9zWFB>Kx7h~DXR~|5MAzkkojB41!XmTA@B2!8RL`P+(Ks<-;*$7)+sS2Qe=p& zq|=Wt9m0!X{=XKBk z0kec^y#Q7D=>kPTe$mO3a^m^YXSIs1IRoOZNXN?2I!ODZqx^8Zqfc%jS(3`JjK#hb zGttaLyEQzsgEbindrzhEgCty=#^pL{SedB5U*XV~>HV_6Xn45qna<_dhhQTv5BsO} zd0cRE0D#>^jDgrpz(A4|#c5J-3ORi#h*lSIq_~dWXCrg}xRZ~H^1>CW+-Ml)Kl~p` zPFF(n(E(WxttfgEhlk>N@KDt$93+sIhuCY8YL{gErCha}*!9&>f=M{s-MBf?4Be{> zA!w??qnXGN+l}wkewglP*n&2R|21dsU<#S(|M4*UJx9HeRrAcl2~cs(wuoK6z_#Y` zM=uX(R|~h>f+yO{N;V{UjB+OD|FAT`(BhMG282qG&fDF#Q*DJ-hHa30tt&9k)GpB+ zxCU()qtjw)CjP3i{m&1K$6^LQWio2*yNWx+Oe=LCq~ospG-NmMH@x3)S{Og405gQ0 zXcj=B$~25BM^{0K+zWy{TDl{9VKN)hDx8X?eEqZhWl277FW>Qx4N?ibV0 zPM|4MYM(cC(EO;#>U%^2EZr>Ca)FbKEFb#_YR8Azc8jwJeKZg%Ut1p`$i->6CNLvg zm}k;4x#DMP)*8d;y|~}~He>_TP`1bYKCHVCmS=TwdT@Kz0~{^x;;4(`Ch<|oh8B~E zQaoW^k=%GHA7lt8%Qa^TU+~)dY7Lp0>RD_?@-_@z&AWr{&zDw9*w?K$C+#?G<}>i{ z6U|azWLD+*7~o6V4HiM$m?d_zAL2|(a2tE?eYyxl^xq@u@X4E|0W?p+hY-hj;d1=C z-k;4JaSm_?rI_Y#%3J*Shf=t3)5`(w=|1#`%L}&_5 zlbw0=!-~$^>tc?A=Hr+EyZbD;GQt6N%yc7SEI)jk`1OaKDZH2Av4N>?9wcx_X^oee z&>FlVDUKoKe68I5+@-$#J8tuemT}`nsp6ZJe-_T<1J9TtKGAWE4B^pnc;U&UCJVW=AyG^w}vINrh6mChk>}T@1oNHKSBY4C3mev+7 z2WX!l2g|Akd}JDw~f8i73YW2I&MYUavX3^fEoBxQ)&ZjWG8Qw z0=%edB6xL(DLKv#=YzkgAUjDdbbk0}u=2{q&SofL{bN*li>@4`w*E1w{7=f(KLo}9 z-@*Ta=kLEQSyJJVR}A=07FjF*fM$*AR^5g^ppfJt}87KBi@a(>6(v3YJm} zd0uj;(Msy_e*44$hm5=6_0_og>++dkk^Q0nLmd|&1($)ZmV!I{Q-5j@zVQEf0_$IC z@g0)wFysn&GXqdpX*W68R()C)LBX@#_~=Q3P_FFL z2mQNf*uN8b&iC!)6`*ev@7@$Fsk<8ZDm<$U91{Po1A%9mhwFxj?Q|FAKq?cfx^-j+ z08VqGJeF6FDjX{Nz*Fym-!sIO)Ba1Y2BMQZ zxb8ZR!5#l4cGLn~wzW%2BsXtku^UR;<5NeA7D;K^usjL0A~oRejeUtWsd z$k!}%k(~}V0mgC4jA9xD;z9EC--c53s zvHS8&%2o=lGp5ixnjfj9AdK5QB_Qdsox;VA4B0~%nFbvg!k_7E0JRT4fj(!n*PE{h zUwMk7@Z6K>!cG$hB25Q_{Zz)j+RET`)5(>0s!(U(*H&~i`>xx-9HwRN8a?d(4fa|Z zb~WQ?*2{D~lcUmo^V;Ek!$~t~^@4(5<@lao^u|5PkA9c?r8Ur36}m3J_*{!cM)?=m zhsg}Cl}p+JDY56MP^o${$9Syx*7U108%~0G^=kBY>HF8jOxoxUr(a`k+_%^%>pa7UD_CY_s*vZZ@AifUP3 z)WxGFLy7y@1Kq__VXl3sv?){ve%6VlxNg^G~=oueVg3U z_=d`IeB_|*drE$$h_5C+e`+Pxo-D5)c1nytqQLOzO(-M$6z!ZkPm%ihlN#q<9fNd4~T$V&ui_ zy?DuQN08|_TIYornKRl}Mh9(9bU3^&j@C-n-WsUS6MaVCotSTSf#YgZbuAAl(Pfpi z4#rI1q_Qvj8QMQta6r)Lf~LjmcOpRdX^PI=aPglhc$2q19M+S%*TO=L&)m_`zNvTn zol$&$zInH+?&@!5l^E7|-n$##d8%JTxw}ibcL+#A~r9)5dD^DYNbNT?n z%j0sI5USTgmiERLEq}$|uHgt&RZbgxRS1dI&E%l4SHKoo>sng z*>+K&*%vinv@&SGk9mP}3qSouJ;YgAxGF1*yCx~>U_@|3DYh#T%-wYIDQ>lnLg@*XV)jy;f{$?81tv0=IRf!>M$oy&ZerK4TO(@YLJzk07qy0d0Y z8qVK!i3f{KMAP*T2tenJRd)PaVT+8`bKBdPb9e3~%Pc6UVm-7tbR~zD`-CR5=&pdI zZdTbXop_6rm>GG=6?vR76)hhe$0%*Xo+Rv{C*?y zx%c^vWQm^K!jZ0qNh|&hQ&P?x>=+YU381xO=C(KQD&^g+2$2L;r}uht+12tai<0KG z7krl6C*H0i`^#5kOBQ9?pW7$CIr&l28G|EiecE+~URpcbMkwIk z1g_dh{uwJb?2;o8G@f?#4b%B+hjT~U77hEH1U`7iN3(aP^+l9X{-pWFZJ!qzRih7S zauS7V^?806{MXq+6VT;Hrb7%SP zpM6A;1oSz>3rJ2ZwBmTSoT1I&Sn-6MNiYAo`dX_o!|sFKMcR>Vn%~h<%4fprPxVQ1 zPZ@qr*qVtwfeFM*dsPnKXr_c?lnbn&`Kp(6G=J?{DIDNnrS>%DLKKrkily}P!!+ET zvhFHbJ5ND!-A<6T!kV2#Z>9ZjzV*rGJCTP6a@*@15I#4{m zC+=9i>`CoTTjOGLethz=CHf^RN!@FzP;i1r5=D>nIfyP8b%-LC(A!U*LV_NNs2&TC z^ob<*6ej)$R4y45#LA9R(VLqd3p^JnuF ztMGCNRKfHdD9)7^aZh-!gJMnAyxgu`2;HjB0R@u~aJL!mP5IbG{ zARA9^^t+sDD_kNQ@#dbL6G2A91R;=Xn{&jWRK?LvKm0ZSD;5P)6)2XG$LUhb2JN`I zKXEpHi^y_-29ECTN0rZEFUllVq~AI`xyIs{#CA-IFZ$15tiA;<6Z=ntF>$6}sH9Bf zh|;$2wD+Z70??*YaL?D!hiB)A18Y7Y51n@YtE#~cY7dpg z`$?FWz*w1MU{Ex$rD-T99YzsS8^o>YxX3WjI#4!;dA?s2+I0j4wz2NIo#ZL-)bTN~ z7KILOG0zb0*G*iOSmsqC5=>~czncY$Lf1ea_Ya}{UlmaP z?{ON<=)dse|8FAWKT-Qv3>-^l@_SkVX_D-5@L0PkmDywlD2i_mvx}(=Rr#xzI4pVh z8r&!`=<(_0-D@Ssq?9F%9kmVP;Xy{71-7m`7{^1L4Y6XK2Y(5CmH{@I-|#k!2AJ^5 zCK=DFKO$nG77O5LQ-pwsIw=sHWaNZ|#gVQpQ0`s}*?sRdKMwM+${n{{OAw14bMe8w z*jQh#2-LI&sS?{j`zPY%E;3^sXj>>eX-V_r>6fPH_)kgEd?p>88>7GgVdaQygf5!h%)iw&WR7Uyixu$zG>g!>PK$vl4m5^i{N)u z>A>hkC}{^s1QY${2+SnMngrRvn;~(825Yh}=GHkU&c2_!RN|-kxbM2URwB>|GEkw< zW+E{(zh^%;^Eh;{ZvBCp_!fa$pbcG)ji#tz*OLQB&s^)cX{B&5gU+8K>IK25`^BXs zrPUH+C70P{K@hyxj9|Mw4-#8#vsV~_iJMkm;Y)bKGV+m+#?Oh5UPdh@C|JH8n8i|M zW)HedDh&)*jODcOUZT*j<}OsQi|V28S#s3l5KE*fU36e!6$t`9Sv4kHc)fyD9cl3PwLz1@RM6J7Ot=Ln=na;LuOv_>C@to%8w0B!An*k zGnoe9?OWU$*$MUGZ#%q8LgYtNqquuO3$@6k>se@6^2Xiv*KgltRg|S&zv}U6jli@W z%LAg`H*CT=0l(92kfyQ&JYt1|02iGtTNFUzD&I?c{eXQ1yfdLu(~ApJ&*7H~lxfpD zV|&+5D3^7lOU4(QT{vw;I3hZ~2C9$hps-*!6DdW(Ha}KYau6@s0QygH&(41%Vg1(N zl>=s^*av1`1W?2Ie&|+~FeRr^EP}^&8wz7AZ9qo%F5v+XTT_7TTA=0noyHjd^~%Y* zc2gFmNBP%_hbS~yAJ)~)o^@UIIh01>hcmb$VrTM>`(3Z7)S>VN9)M}f2|4cFyEIs8 zNb9W}IG_aT4>l9ctk(FVs1n0(NW61Lbh)o9+>dW_dNz~$as6zJ!(?i>TW&`k)H(NP zfHp#o`NPL=0|E@p!hd?31`qU1shoV!q#1Idb0N0}JGJB+5v{!KJoNa6m@4@%fJwkS z{H`zxWw0urW;n8oAxza8WNNULzlCH3oBXuPxt{p;r470AaNP2TATbxbH7sgN~ep1s&S^mh1>ZtNYbb+ zYm#_JtVi3IfKFEag&02hZ~LMqI0p{c%hSYYRH#VBw+3hL*+nmU7S^0Bb2w+|{4AW$ zHEv6A)zlkd^-Z%346)&-r3GK71GXx6wX4xZfG3{U)J8B6gpD@89W7G^MBE$wJF;~} zwlisp=La7Pbea2s(h`W{n#$nyiWa;h2u6mc0(Xwte(<5k3rAe7WOJIC^%K!vod%63 zmHC{Ngh0jSp79y(HglYANu9EBM{vFbzN^m$6pEsX%R;phOF8KH07+^9}pTaiEEG{HB~&1x>lckK+;|_0($!Ic zIKET7#TIsv`9|F!|7SxJO(H9t!}I#f?QhWl*k>P)#viq=)KyMOHnp@ZP?Tefuf|$6 z#NIOp?puvej#L21ZI2$PmCwn!9S;pZW{NJ=_1`y>OTonvs?S@M>eF7W**M0h=hZNe z`d^6%Kl5uaBBS)n-jY8iv83-iFR~8PsP=_6uhAK6MWJJ1$hFV;R`0C-4Yll&Qd1fg zJ`Af>i|>`n+x!BXT?2(2CS7NS4D0|$+8X1#6P7=B1<$lmz?9|3M&1A}$^gBu|xnnN|&TINv=NSz18ng1Oqx%eb>-=$HQNNa=EG(pfA zO|DY^OGumfo(20hUE*2)k97zu z^z|e1h2MZgaiW>;`VfiQfdu?K7>#qfTP+# z3eW`F=ut^2>5_AthS*W(a#cBUbV&Y3PvTz+G~|8<+sj)|_@^NC7)?$M188qo3|%mw zy`B1-o2fgB?I5a~2Drg0jAO~ie52f+;H{g4mp78J@EWNRN2O^{cMcux?!qjc-uJ7N z4;&^R8krh|$v@ci>TJuuDZ-={b?}%#3erb0qw0dF(%zX+5o_ae`g(Me> zK%E$|yRa;}C~i+#+osP%L*Gf3{Zhv=`#zplwdl&$*AxJKk82i%qF>#B*<{U6 zB{f$cEmCZINH+(cTx>njjPnZ5=tq4jLK66rU^^{hJ38Z{=R3dp=_%Ec#&gvbKf!)w zq)`f7H_&q=l4NY_nJZAfPTI-#amLGOJZA&~9QllQA&KP6o&g}2bSH@{FH-+_g=cSn8z zY~!z#3KP<7(YriUPqGGbZ+-`>M{!Y z(?A~VyjK64vvDfga`|6@tE#%b$>2Es>Wk=)PgIl8_N8^R1jw9|(2gN7Byt|GV0z%z=J?GjL;000==`~95Ood9uqotX7M73>aLyaMrG{>Bc2F>h zGv&KMBQ4RSscYhdPUE?Jh1g3l{IDiPJT{3Fx>syl{Tve88XByEJ9}FE^swk8+X9K2 zgRU!fu7XapD=xFoUEZ%j*TzptxyAPeKhA}^u7+M-d#rPc;nst}Cklh1TaIf5Jp~pP zTeHALEQv65Ue1Z>yXdN}%D}zaY$di@qjZRIYtBxI(UR{&j&My|sh-z1uO33W%e|8Jc#`&6(iAPPGa9*v}hM0uhi#yiH zH_CrP=!i1b7W3YWDn(hGaDy$kW$RgG-)x;DfbKkDsSRCT<7zD)(E0gD?B^ppmt>u_ zD9@O+)?|S);U6{ZF}>6dV9K-4zsr>!;N3h_2~zFW58!AikT_7_GF4#iVmS1D8}*)i zyUNuz(VvSe65H&wU27fm->CK{n|Pm~bbf0!W_#6Ob5T9LF-myF!&S*uMX3G(@Mh|d zOOMIrB(696nTlZnR!%UCMj$6 ziAkv8$01K)?kfA>vZvvyHyhdmNy(YsCc(WG%uFa~;cCZ8NBD?{y$^6;zDV*c*iwNAsp@LIZapEoaAkd4~_) zR>K$c(sj-HsndY;Ncn0s!H~RT133(@J?hUMLC|D2iB)KxSJs^;i zlzdzcoS=HYE&eH(&x=^!D{kenM%E-G+XuShqSX^*Jp8x5F@ST0=J4`Sr-fPD_PJprE;D$`UTuB)#vl92uxNji|`S~+nrIVvbVS30pSi$yKEwtd@k*B{>`6>S9?gpmg_KNl? z8l*Sww?}BEWWm_vYVc^*ym5xmDG$Dr_Kokf`x|&9ttyKJbSb$0=~@d*xYYEKxu@_; zadDWGa%Ephw{q>>Qt^)@+~D_#u+$TWGvr_r0^!HM-VnaSFOI(R3cmB|8xI-WSpbc} z{qHM@3rYK?sYiyEc$qRbLH^Sv)ad(OO_#TN(M}Zy3r!Rveo(u5V8??zcK%%0x4VAu&?{$yE>M%)a;bRu7;xjbKL<^z}aPy0!6qJ@1&H zIT^G^?ltgRB<(9Gffi75XG^dbAyA9x=${WMAoCYp8}ILcex{-~OB`&h`alxVQ<}kE z4@R#JEmT1zP`k5ty}h8+2Fb8`0vG-uG%fx%ng=?y2aybPe@FAViSEVVH&;5oJDLqF zRQ5+0$nhs-V)5a;Gv{W`IwzJSiTFEn+p~2n244)ED(z6E;S5|1&Xx&F;D3H!>DB~U zLJo}7nxTbG{?^3BB&)*NJnPYxF8E7ba!yRCVDm~fq2s%))*6HC0L#SsS?9*Y%*D;n z(!(nyA*EFeiV47t&b*w1lUgYQiJ;I9g#KY<8m*$tNI2VXo!+APpbsf^7JPVOT& z(tt1WZZ_mB7B@ISfQ5GLtNo5g{H8{9Sz%H5LS*tR_&&Y+5ionMJ9zJ1?ixhgG=5iI zoGfVKBEY|h-+npY|Jum<9$LLhuzJr@QBlxR`yJZ7nt$`{#BOjSy>|#@upVY8wQ>OfJv6`fy2W4!DCl zp>t3o3;y>b1O^q-dgTo8s3J+`jl`4GMp;IY^Nt@UCRfmYjYaP|2C@ml2L66ke$_D%=D>*R(>#mf*F zU?)+44L~z)x#cmq>!-A455E?}8g`OW~G;VJE?d z3RNanFq0=?%i=J_XGp{2DygxtHWiEeNDYA-@qpsYB16U|3aPHUbIz8C65idFq+tP5 zdb3 z4lq(ik$?%^DRV8&uR!6c7!%uG9bBI2kvluGdXS_Sq%|vw2R6SCLQ|iE(@A~YJIgEI zkzpF*4F?$hl7Zp82mJS-r-=#BNB(%>7@u<+wxZDg@Gz8eTFEyzo_J2{l_P(rB(}LY z=YH5JHjuufupS=AyHY4e0PM>Qtf!};kxPlaEz$r}3!-lBF$pV5b;&wQLh9T~>*`n5zU@4qqx<7+Q(GF|SD>IDn%RC0g7!~Wp+7I+oMtI2FXs)8N0T%-mw83sEZZCyM~6b4Hs zj7h{}m;2|vV5ynly(2{&Z7qcl$U~H^STMDuD5bkGoQ$kwXzcDKBH}f0JIkSk^y*Bp zM(Io^Ss*T@_+uiEd)n+(JcSupdSiF6KPp_D1Tg zEW&!4K5HfX26p}%5;C}xI}rdi)%jE-Cr~={YzgtW`kgc1@_-VA;fhK48JyJ6-BucA zFr+xRmXy6nWH}Zr3M*&_K~AZ-PmIxfpq9>6v-qd`8-FGc*>Pd6+Mgfg3Vz{T$*anK zYvHKtkE0Q;8}5uh-R%!+{xp{w`dCiKAhzRl_{$w(B@*+&TjhV`aNPYk+~T-*w1itZ z2CXrZcN)6U<>698sI4ej*`iz-7Is(uh*ylzR&ubzWv0U;bG;}tqTuOF-^6O!dU2WX z#<#Ou-{yb|t8YIVe)y>>b_<;u=Y|87qHjDnh3U9>WGW-k=w@TLEEqp6L{`VSMudpC zV6RaBlux~zC}+okf!yh-12GyBYPJh~-jyw;V@>QBJ67FOy9XAcS4jJdb*vr0_VX<)^9V9rWx#j2ugv#0DJ z>K|EVza{9pAb7ZJo~taI^Gyr;w#$&9%TPm6*=j`D1*aB4=axBq*%H2j9nRAAQ^ke} z+b)Ysw|+jk)wzD9WU;Q%WjUt;WvYUY#6pBhf2@cO(ks0i%v|byDq7FmaV-m>z>~H znJn4jyH3`UW6}FAD@@G!qjikEgKc)-kqY5^F-A969Ib2b?(BV66Z$U09O=VK`LgC9 zFB4E7`Xls*T*?Y1c&o!4>E`>(Ei` z0bv^b#(_3n@5*Z-GolAydWfxEdEaMX8&gya#OEYaxtNRcw~Cd78O~ztroM}gymM?Q zRhpnbyZp?hXl|VSfL-HxZH^?y-L8=I^=NedZdKtawlO%U%edY-cU5fZYQ-LiM?FqI z+m5b{UvM4ek14#0jm{li2W@bLtamxGijclx7kHwhIW;bNhz=%sYw(!MVO`C$!O5xb zuVJ5UEt5J9g0aUKksV9^Kteu#16-ly&wK{hW@rVE1yV50;lSE)bX7;+;Rz24=%>A_ z7uAywJNvB?CWfSj2t;Np(^~dF`&UZs7HY~agCD_vu($4qX<*;946+^o{caD}?G;x> zmv8JYcXqNe3hqGBZR}em9wyiv+GMC18W}A;=kLlq4@*h30^9iGBDJ5L@Wjk^aa`7> z@67XE?rY#?m-G$39fJSTKQ{Ft#vq^hr^mv+P>$$9qg$l%t8!)6rKH1S8P;@pCZyB+ zUE_ZITuQ}mc)I@d9271c67HYVEloYXS~9R+Qty8;W--2{n2`czNv^De=g6a~?dGLd z@Dq@m>N4+tU$|QGyjbbrcbAo+?<>;Z*IV`GyH|9-xvm$u7I$_0V2l!7i|;KycUJrT z`86s(b~=|1JLk~2ta^(v;o@+#znE?)cQWiIx(<%%wQqe>26#xkQs)*ZQDaYb=OVcM!C9B#3nF6=2rspTx8lo+`DVwbQm5rynbG$o>kF$

      Gc! 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_1.png b/Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_1.png new file mode 100644 index 0000000000000000000000000000000000000000..faface840f941b628cd7d1cb8e38565dacb9d371 GIT binary patch literal 83118 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

      4@knEV-y!4 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 CD#LsL literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_3.png b/Documentation/E/Tutorials/PhotoContest/Images/7_createSummary_3.png new file mode 100644 index 0000000000000000000000000000000000000000..70b0d4dc54579eb656849a71ef303f57fc19a482 GIT binary patch literal 61819 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 z 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/8_preview.png b/Documentation/E/Tutorials/PhotoContest/Images/8_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..23c71fc87d6d952905c3d957b89bdb99fdef68f6 GIT binary patch literal 59130 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

      }QecL`)BK&;tzD(1c{)_NO!bn+%Jtn62d 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 Ip0y164@x3%umAu6 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_1.png b/Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_1.png new file mode 100644 index 0000000000000000000000000000000000000000..544a5602a9a1bcdc34a67656f54645b46a379ec4 GIT binary patch literal 82196 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

      + + Loop through all available options (e.g., male, female, diverse) + + + Set ARIA attributes for accessibility + + + + + Add error indication to the first radio button if validation fails + + + + + Individual radio button container +
      + +
      + +
      + +
      + + Display validation errors + + + + + + {formvh:translateElementError(element: element, error: error)} + +
      +
      + +
      +
      + + + + + + + + diff --git a/Documentation/I/HowTos/Index.rst b/Documentation/I/HowTos/Index.rst new file mode 100644 index 0000000..438934f --- /dev/null +++ b/Documentation/I/HowTos/Index.rst @@ -0,0 +1,16 @@ +.. include:: /Includes.rst.txt + +.. _howtos: + +======== +How-To's +======== + +This section provides step-by-step tutorials for common tasks when working +with the TYPO3 Form Framework. + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + CustomFormElement/Index diff --git a/Documentation/I/Images/basic_code_components.png b/Documentation/I/Images/basic_code_components.png new file mode 100644 index 0000000000000000000000000000000000000000..7e6612f9d21bedc1a42ca1359bf3b2e96787ed41 GIT binary patch literal 124554 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 Bq!9oB literal 0 HcmV?d00001 diff --git a/Documentation/I/Images/javascript_module_interaction.png b/Documentation/I/Images/javascript_module_interaction.png new file mode 100644 index 0000000000000000000000000000000000000000..1b133d67d7ef418a487a4e4e1bdea4821100ef10 GIT binary patch literal 54086 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

      i#v=2A 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 literal 0 HcmV?d00001 diff --git a/Documentation/I/Index.rst b/Documentation/I/Index.rst new file mode 100644 index 0000000..ece52bc --- /dev/null +++ b/Documentation/I/Index.rst @@ -0,0 +1,16 @@ +.. include:: /Includes.rst.txt + + +.. _forIntegrators: + +=============== +For Integrators +=============== + +.. toctree:: + :maxdepth: 1 + + Concepts/Index + Config/Index + HowTos/Index + FAQ/Index diff --git a/Documentation/Images/InstallActivate.png b/Documentation/Images/InstallActivate.png new file mode 100644 index 0000000000000000000000000000000000000000..af3214bdc6b06ceadf29da052c4a139effba2a3d GIT binary patch literal 19382 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 bav3jCJ_S7|zSgOQzEwKz?CDf?H1Nj1Ha_?D literal 0 HcmV?d00001 diff --git a/Documentation/Images/SiteSet.png b/Documentation/Images/SiteSet.png new file mode 100644 index 0000000000000000000000000000000000000000..5f00e72c5b5f667fff370618365397367e20211e GIT binary patch literal 47194 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 literal 0 HcmV?d00001 diff --git a/Documentation/Includes.rst.txt b/Documentation/Includes.rst.txt new file mode 100644 index 0000000..2362507 --- /dev/null +++ b/Documentation/Includes.rst.txt @@ -0,0 +1 @@ +.. You can put central messages to display on all pages here diff --git a/Documentation/Includes/_NoteFinisher.rst b/Documentation/Includes/_NoteFinisher.rst new file mode 100644 index 0000000..7d80571 --- /dev/null +++ b/Documentation/Includes/_NoteFinisher.rst @@ -0,0 +1,7 @@ +:orphan: + +.. important:: + + Finishers are executed in the order defined in your form definition. + + See `Finisher execution order `_. diff --git a/Documentation/Index.rst b/Documentation/Index.rst new file mode 100644 index 0000000..e3a52ea --- /dev/null +++ b/Documentation/Index.rst @@ -0,0 +1,56 @@ +.. include:: /Includes.rst.txt +.. _start: + +========== +TYPO3 Form +========== + +:Extension key: + form + +:Package name: + typo3/cms-form + +:Version: + |release| + +:Language: + en + +:Author: + TRITUM GmbH & TYPO3 contributors + +:License: + This document is published under the + `Open Content License `__. + +:Rendered: + |today| + +---- + +This is a flexible TYPO3 frontend form framework that allows editors, +integrators and developers alike to create all kinds of forms. + +---- + +**Table of Contents:** + +.. toctree:: + :maxdepth: 2 + :titlesonly: + + Introduction/Index + Installation/Index + QuickStartForEditors/Index + QuickStartForIntegrators/Index + D/Index + I/Index + E/Index + +.. Meta Menu + +.. toctree:: + :hidden: + + Sitemap diff --git a/Documentation/Installation/Index.rst b/Documentation/Installation/Index.rst new file mode 100644 index 0000000..17e0a23 --- /dev/null +++ b/Documentation/Installation/Index.rst @@ -0,0 +1,52 @@ +.. include:: /Includes.rst.txt + +.. _installation: + +============ +Installation +============ + +This extension is part of the TYPO3 Core, but not installed by default. + +.. contents:: Table of contents + :local: + +Installation with Composer +========================== + +Check whether you are already using the extension with: + +.. code-block:: bash + + composer show | grep form + +This should either give you no result or something similar to: + +.. code-block:: none + + typo3/cms-form v12.4.11 + +If it is not installed yet, use the ``composer require`` command to install +the extension: + +.. code-block:: bash + + composer require typo3/cms-form + +The given version depends on the version of the TYPO3 Core you are using. + +Installation without Composer +============================= + +In an installation without Composer, the extension is already shipped but might +not be activated yet. Activate it as follows: + +#. In the backend, navigate to the :guilabel:`System > Extensions` + module. +#. Click the :guilabel:`Activate` icon for the Form extension. + +.. figure:: /Images/InstallActivate.png + :class: with-border + :alt: Extension manager showing Form extension + + Extension manager showing Form extension diff --git a/Documentation/Introduction/Images/introduction_form_editor.png b/Documentation/Introduction/Images/introduction_form_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed471625139e352cf6de5e827eebc0775d5b522 GIT binary patch literal 65639 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

      *SMq}3r+_Y(w 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 and join the + channel `#ext:form`. + * Use the "Edit on Github" function. + + +.. _what-does-it-do: + +What does it do? +================ + +The :composer:`typo3/cms-form` extension is a system extension that provides a +flexible, extendable, and easy-to-use form framework. It incorporates interfaces +and functionality that allow editors, integrators and developers to build forms. + +Non-technical editors can use the :guilabel:`Content > Forms` backend module. +They can create and manage forms using a simple drag and drop interface. +Forms can be previewed instantly. + +Experienced integrators can build ambitious forms which are +stored in a site package. These forms can use powerful finishers and ship +localization files. + +Developers can use the PHP API to create interfaces with conditional +form elements, register new validators and finishers, as well as create +custom form elements. Plenty of hooks allow form creation +and processing to be manipulated. + +.. figure:: Images/introduction_form_editor.png + :alt: The form creation wizard + + Form editor displaying a new form in the abstract view + +.. _features_list: + +Features list +============= + +Here are some of the features of the form framework: + +* form editor + + * fully customizable editor for building complex forms + * replaceable and extendable form editor components + * JS API to extend form editor + +* PHP API + + * entire forms via API + * own renderers for form and/ or form elements + * conditional steps, form elements and validators based on other form + elements + +* configuration + + * YAML as configuration and definition language including inheritance + and overrides + * file based + * behaviour and design of the frontend, plugin, and form editor can be + adapted for individual forms + * 'prototypes' can be used as boilerplate + +* form elements + + * own form elements possible + * uploads handled as FAL objects + +* finishers + + * ships built-in finishers, like email, redirect, and save-to-database + * own finishers possible + * finisher configuration can be overridden in the form plugin + +* validators + + * own validators possible + +* miscellaneous + + * multiple languages support + * multiple steps support + * multiple forms on one page + * built-in spam protection (honeypot) diff --git a/Documentation/QuickStartForEditors/Index.rst b/Documentation/QuickStartForEditors/Index.rst new file mode 100644 index 0000000..84fd1ec --- /dev/null +++ b/Documentation/QuickStartForEditors/Index.rst @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + + +.. _quickstartEditors: + +======================= +Quick Start for Editors +======================= + +Are you an editor, the form extension has already been installed by your admin and you want +to get started quickly? Follow these steps: + +.. rst-class:: bignums-xxl + +1. Create a new form + + Go to the ``Forms`` module and build a form using the form editor. With the + form editor you can quickly build appealing forms. + +2. Insert the form on a page + + The next step is inserting the form on the desired page(s). + + #. Open the page module in the backend. + #. Go to your desired page. + #. Create a new content element of type "Form". You can find this + under the "Form Elements" tab. + #. Select your form on the "Plugin" tab. + #. Save the form content element. + #. Repeat steps 2 to 5 to insert the form on further pages. + +View your form on your web site. Enjoy! diff --git a/Documentation/QuickStartForIntegrators/Index.rst b/Documentation/QuickStartForIntegrators/Index.rst new file mode 100644 index 0000000..011569e --- /dev/null +++ b/Documentation/QuickStartForIntegrators/Index.rst @@ -0,0 +1,76 @@ +.. include:: /Includes.rst.txt + +.. _quickstartIntegrators: + +=========================== +Quick Start for Integrators +=========================== + +Are you an integrator, you or your admin have already installed the form extension +and you want to get started quickly? Just follow these steps: + +.. rst-class:: bignums-xxl + +#. Include a site set + + .. versionadded:: 13.3 + EXT:form contains a site set that can be included as described here. + :ref:`quickstartIntegrators-typoscript-includes` are still possible + for compability reasons but not recommended anymore. + + Include the "Form Framework" site set in the :ref:`site + configuration ` or as a dependency in a custom + :ref:`site package `. + + .. figure:: /Images/SiteSet.png + + Add the site set "Form Framework" + +#. Create a new form + + Go to the ``Forms`` module and create a new form using the form editor. With + the form editor you can quickly build appealing forms. + +#. Move the form definition + + If required, :ref:`move the form definition into a dedicated + extension`. + +#. Provide a translation + + Create a + :ref:`translation` + of your form if required by registering the .xlf file in your YAML configuration. + +#. Insert your form on a page + + The final step is inserting the form on the desired page(s). + + #. Open the page module in the backend. + #. Go to the desired page. + #. Create a new content element of type "Form". You can find this + on the "Form Elements" tab. + #. Select your new form on the "Plugin" tab. + #. Select "Override finisher settings" on the + "Plugin" tab if necessary. Save the form content element. + #. Repeat steps 2 to 5 to insert the form on further pages. + +View your form in the frontend. Enjoy! + +.. _quickstartIntegrators-typoscript-includes: + +Legacy TypoScript includes +========================== + +.. versionchanged:: 13.3 + It is recommended to include the TypoScript via site set. The legacy way + of using TypoScript includes, in the past also called "TypoScript sets" + is still possible for compatibility reasons but not recommended anymore. + + +Open the ``TypoScript`` module in the backend and edit your root +TypoScript record. Under the tab "Includes", ensure that "Fluid Content +Elements" (`fluid_styled_content`) and "Form" (`form`) are among the selected +items. Save the record. + +Then continue with the steps above. diff --git a/Documentation/Sitemap.rst b/Documentation/Sitemap.rst new file mode 100644 index 0000000..09d3c6f --- /dev/null +++ b/Documentation/Sitemap.rst @@ -0,0 +1,9 @@ +:template: sitemap.html + +.. include:: /Includes.rst.txt + +======= +Sitemap +======= + +.. The sitemap.html template will insert here the page tree automatically. diff --git a/Documentation/guides.xml b/Documentation/guides.xml new file mode 100644 index 0000000..ee61d25 --- /dev/null +++ b/Documentation/guides.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..3639c79 --- /dev/null +++ b/README.rst @@ -0,0 +1,11 @@ +======================== +TYPO3 extension ``form`` +======================== + +This is a flexible TYPO3 frontend form framework that allows editors, +integrators and developers alike to create all kinds of forms. + +:Repository: https://github.com/typo3/typo3 +:Issues: https://forge.typo3.org/ +:Read online: https://docs.typo3.org/c/typo3/cms-form/main/en-us/ +:Packagist: https://packagist.org/packages/typo3/cms-form diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/CheckboxEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/CheckboxEditor.fluid.html new file mode 100644 index 0000000..468550e --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/CheckboxEditor.fluid.html @@ -0,0 +1,14 @@ + +

      +
      + +
      +
      + + +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/CollectionElementHeaderEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/CollectionElementHeaderEditor.fluid.html new file mode 100644 index 0000000..ae3ca41 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/CollectionElementHeaderEditor.fluid.html @@ -0,0 +1,8 @@ + +

      +
      +
      +
      +
      +

      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySelectEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySelectEditor.fluid.html new file mode 100644 index 0000000..0f41d9f --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySelectEditor.fluid.html @@ -0,0 +1,16 @@ + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySingleSelectEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySingleSelectEditor.fluid.html new file mode 100644 index 0000000..d887dc1 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/CountrySingleSelectEditor.fluid.html @@ -0,0 +1,16 @@ + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/DateEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/DateEditor.fluid.html new file mode 100644 index 0000000..bd72333 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/DateEditor.fluid.html @@ -0,0 +1,14 @@ + +
      +
      + +
      +
      + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/FinishersEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/FinishersEditor.fluid.html new file mode 100644 index 0000000..e13d71c --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/FinishersEditor.fluid.html @@ -0,0 +1,16 @@ + +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/FormElementHeaderEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/FormElementHeaderEditor.fluid.html new file mode 100644 index 0000000..0e135ba --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/FormElementHeaderEditor.fluid.html @@ -0,0 +1,5 @@ + +
      +

      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/GridColumnViewPortConfigurationEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/GridColumnViewPortConfigurationEditor.fluid.html new file mode 100644 index 0000000..1bfbb4e --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/GridColumnViewPortConfigurationEditor.fluid.html @@ -0,0 +1,25 @@ + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/MaximumFileSizeEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/MaximumFileSizeEditor.fluid.html new file mode 100644 index 0000000..29276e8 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/MaximumFileSizeEditor.fluid.html @@ -0,0 +1,10 @@ + + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/MultiSelectEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/MultiSelectEditor.fluid.html new file mode 100644 index 0000000..74980cf --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/MultiSelectEditor.fluid.html @@ -0,0 +1,16 @@ + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/PropertyGridEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/PropertyGridEditor.fluid.html new file mode 100644 index 0000000..b1dd48f --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/PropertyGridEditor.fluid.html @@ -0,0 +1,25 @@ + +
      +
      + +
      +
      + + + + +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/RemoveElementEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/RemoveElementEditor.fluid.html new file mode 100644 index 0000000..ce26e9b --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/RemoveElementEditor.fluid.html @@ -0,0 +1,8 @@ + +
      + +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/RequiredValidatorEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/RequiredValidatorEditor.fluid.html new file mode 100644 index 0000000..f5b8643 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/RequiredValidatorEditor.fluid.html @@ -0,0 +1,22 @@ + +
      +
      + +
      + + +
      +
      +
      + +
      +
      + +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/SingleSelectEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/SingleSelectEditor.fluid.html new file mode 100644 index 0000000..e12ae36 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/SingleSelectEditor.fluid.html @@ -0,0 +1,16 @@ + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/TextEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/TextEditor.fluid.html new file mode 100644 index 0000000..b5b7d34 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/TextEditor.fluid.html @@ -0,0 +1,17 @@ + +
      +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/TextareaEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/TextareaEditor.fluid.html new file mode 100644 index 0000000..5b6d4e2 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/TextareaEditor.fluid.html @@ -0,0 +1,14 @@ + +
      +
      + +
      +
      + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/Typo3WinBrowserEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/Typo3WinBrowserEditor.fluid.html new file mode 100644 index 0000000..6065db8 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/Typo3WinBrowserEditor.fluid.html @@ -0,0 +1,21 @@ + +
      +
      + +
      +
      + + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/ValidationErrorMessageEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/ValidationErrorMessageEditor.fluid.html new file mode 100644 index 0000000..7f4faee --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/ValidationErrorMessageEditor.fluid.html @@ -0,0 +1,15 @@ + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Inspector/ValidatorsEditor.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Inspector/ValidatorsEditor.fluid.html new file mode 100644 index 0000000..cefe929 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Inspector/ValidatorsEditor.fluid.html @@ -0,0 +1,18 @@ + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      +
      + diff --git a/Resources/Private/Backend/Partials/FormEditor/Modals/InsertElements.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Modals/InsertElements.fluid.html new file mode 100644 index 0000000..e3dd87b --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Modals/InsertElements.fluid.html @@ -0,0 +1,9 @@ + + + diff --git a/Resources/Private/Backend/Partials/FormEditor/Modals/InsertPages.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Modals/InsertPages.fluid.html new file mode 100644 index 0000000..7701748 --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Modals/InsertPages.fluid.html @@ -0,0 +1,9 @@ + + + diff --git a/Resources/Private/Backend/Partials/FormEditor/Modals/ValidationErrors.fluid.html b/Resources/Private/Backend/Partials/FormEditor/Modals/ValidationErrors.fluid.html new file mode 100644 index 0000000..df3901b --- /dev/null +++ b/Resources/Private/Backend/Partials/FormEditor/Modals/ValidationErrors.fluid.html @@ -0,0 +1,18 @@ + +
      +
      +
      +
      +

      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html b/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html new file mode 100644 index 0000000..2bab789 --- /dev/null +++ b/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html @@ -0,0 +1,7 @@ + + + + + diff --git a/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/BlankForm.yaml b/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/BlankForm.yaml new file mode 100644 index 0000000..d1297b6 --- /dev/null +++ b/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/BlankForm.yaml @@ -0,0 +1,8 @@ +type: 'Form' +identifier: 'blankForm' +label: '[Blank Form]' +renderables: + - + type: 'Page' + identifier: 'page-1' + label: 'Step' \ No newline at end of file diff --git a/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml b/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml new file mode 100644 index 0000000..2614720 --- /dev/null +++ b/Resources/Private/Backend/Templates/FormEditor/Yaml/NewForms/SimpleContactForm.yaml @@ -0,0 +1,86 @@ +identifier: ext-form-simple-contact-form-example +label: 'Simple Contact Form' +type: Form + +finishers: + - + identifier: EmailToReceiver + options: + subject: 'Your message: {subject}' + recipients: + your.company@example.com: 'Your Company name' + senderAddress: '{email}' + senderName: '{name}' + replyToRecipients: {} + carbonCopyRecipients: {} + blindCarbonCopyRecipients: {} + format: 'html' + attachUploads: 'true' + translation: + language: '' + title: 'Confirmation of your message' + +renderables: + - + identifier: page-1 + label: 'Contact Form' + type: Page + + renderables: + - + defaultValue: '' + identifier: name + label: 'Name' + type: Text + properties: + fluidAdditionalAttributes: + placeholder: 'Name' + autocomplete: name + required: required + validators: + - + identifier: NotEmpty + - + defaultValue: '' + identifier: subject + label: 'Subject' + type: Text + properties: + fluidAdditionalAttributes: + placeholder: 'Subject' + required: required + validators: + - + identifier: NotEmpty + - + defaultValue: '' + identifier: email + label: 'Email' + type: Email + properties: + fluidAdditionalAttributes: + placeholder: 'Email address' + autocomplete: email + required: required + validators: + - + identifier: NotEmpty + - + identifier: EmailAddress + - + defaultValue: '' + identifier: message + label: 'Message' + type: Textarea + properties: + fluidAdditionalAttributes: + placeholder: '' + required: required + validators: + - + identifier: NotEmpty + + - + identifier: summarypage + label: 'Summary page' + type: SummaryPage diff --git a/Resources/Private/Frontend/Partials/AdvancedPassword.fluid.html b/Resources/Private/Frontend/Partials/AdvancedPassword.fluid.html new file mode 100644 index 0000000..51a20c8 --- /dev/null +++ b/Resources/Private/Frontend/Partials/AdvancedPassword.fluid.html @@ -0,0 +1,55 @@ + + + + + + + + + + +
      + + + + {formvh:translateElementProperty(element: element, property: 'passwordDescription')} + +
      +
      + + + + +
      + + + + {formvh:translateElementError(element: element, error: error)} +
      +
      +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/Checkbox.fluid.html b/Resources/Private/Frontend/Partials/Checkbox.fluid.html new file mode 100644 index 0000000..5f01cf8 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Checkbox.fluid.html @@ -0,0 +1,28 @@ + + + + + + + + + + {f:if(condition: '{validationResults.errors}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')} + + +
      + + +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/ContentElement.fluid.html b/Resources/Private/Frontend/Partials/ContentElement.fluid.html new file mode 100644 index 0000000..4f9efe4 --- /dev/null +++ b/Resources/Private/Frontend/Partials/ContentElement.fluid.html @@ -0,0 +1,27 @@ + + + + +
      + + + + + + + + +
      +
      + + +
      + {element.properties.contentElementUid} +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/CountrySelect.fluid.html b/Resources/Private/Frontend/Partials/CountrySelect.fluid.html new file mode 100644 index 0000000..f6bf9f4 --- /dev/null +++ b/Resources/Private/Frontend/Partials/CountrySelect.fluid.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Date.fluid.html b/Resources/Private/Frontend/Partials/Date.fluid.html new file mode 100644 index 0000000..97da612 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Date.fluid.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Email.fluid.html b/Resources/Private/Frontend/Partials/Email.fluid.html new file mode 100644 index 0000000..55aadb2 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Email.fluid.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Field/Field.fluid.html b/Resources/Private/Frontend/Partials/Field/Field.fluid.html new file mode 100644 index 0000000..dcf6d1c --- /dev/null +++ b/Resources/Private/Frontend/Partials/Field/Field.fluid.html @@ -0,0 +1,43 @@ + + + + +
      + {formvh:translateElementProperty(element: element, property: 'label')} + + + + + +
      +
      + +
      + + + + +
      +
      +
      +
      + + + {elementContent} + + + + {formvh:translateElementError(element: element, error: error)} +
      +
      +
      +
      + + {formvh:translateElementProperty(element: element, property: 'elementDescription')} + +
      + diff --git a/Resources/Private/Frontend/Partials/Field/Required.fluid.html b/Resources/Private/Frontend/Partials/Field/Required.fluid.html new file mode 100644 index 0000000..50e5d30 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Field/Required.fluid.html @@ -0,0 +1,3 @@ + +* + diff --git a/Resources/Private/Frontend/Partials/Fieldset.fluid.html b/Resources/Private/Frontend/Partials/Fieldset.fluid.html new file mode 100644 index 0000000..087fcb9 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Fieldset.fluid.html @@ -0,0 +1,19 @@ + + + + + + + + + +
      f:format.raw()}> + + {formvh:translateElementProperty(element: element, property: 'label')} + + + + +
      +
      + diff --git a/Resources/Private/Frontend/Partials/FileUpload.fluid.html b/Resources/Private/Frontend/Partials/FileUpload.fluid.html new file mode 100644 index 0000000..13af954 --- /dev/null +++ b/Resources/Private/Frontend/Partials/FileUpload.fluid.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + +
        + +
      • + {file.originalResource.originalFile.name} + + + +
      • +
        +
      +
      + +
      + {resource.originalResource.originalFile.name} + + + +
      +
      +
      +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/Form/Navigation.fluid.html b/Resources/Private/Frontend/Partials/Form/Navigation.fluid.html new file mode 100644 index 0000000..d8c04b4 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Form/Navigation.fluid.html @@ -0,0 +1,17 @@ + + + diff --git a/Resources/Private/Frontend/Partials/GridColumn.fluid.html b/Resources/Private/Frontend/Partials/GridColumn.fluid.html new file mode 100644 index 0000000..c6d5302 --- /dev/null +++ b/Resources/Private/Frontend/Partials/GridColumn.fluid.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Resources/Private/Frontend/Partials/GridRow.fluid.html b/Resources/Private/Frontend/Partials/GridRow.fluid.html new file mode 100644 index 0000000..a0813cc --- /dev/null +++ b/Resources/Private/Frontend/Partials/GridRow.fluid.html @@ -0,0 +1,13 @@ + + +
      + + +
      + +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/Hidden.fluid.html b/Resources/Private/Frontend/Partials/Hidden.fluid.html new file mode 100644 index 0000000..c1af855 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Hidden.fluid.html @@ -0,0 +1,10 @@ + + + + + diff --git a/Resources/Private/Frontend/Partials/Honeypot.fluid.html b/Resources/Private/Frontend/Partials/Honeypot.fluid.html new file mode 100644 index 0000000..aae3f35 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Honeypot.fluid.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/ImageUpload.fluid.html b/Resources/Private/Frontend/Partials/ImageUpload.fluid.html new file mode 100644 index 0000000..c30aa12 --- /dev/null +++ b/Resources/Private/Frontend/Partials/ImageUpload.fluid.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + +
      + + + + + + +
      +
      + + + + + + + diff --git a/Resources/Private/Frontend/Partials/MultiCheckbox.fluid.html b/Resources/Private/Frontend/Partials/MultiCheckbox.fluid.html new file mode 100644 index 0000000..bf3e5a8 --- /dev/null +++ b/Resources/Private/Frontend/Partials/MultiCheckbox.fluid.html @@ -0,0 +1,44 @@ + + + + + {f:if(condition: '{validationResults.errors}', then: '{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')} + +
      + + + + + + + + +
      + +
      +
      +
      + + + + {formvh:translateElementError(element: element, error: error)} +
      +
      +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/MultiSelect.fluid.html b/Resources/Private/Frontend/Partials/MultiSelect.fluid.html new file mode 100644 index 0000000..b70fe09 --- /dev/null +++ b/Resources/Private/Frontend/Partials/MultiSelect.fluid.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Number.fluid.html b/Resources/Private/Frontend/Partials/Number.fluid.html new file mode 100644 index 0000000..16631f5 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Number.fluid.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Page.fluid.html b/Resources/Private/Frontend/Partials/Page.fluid.html new file mode 100644 index 0000000..487abdf --- /dev/null +++ b/Resources/Private/Frontend/Partials/Page.fluid.html @@ -0,0 +1,10 @@ + + + +

      {formvh:translateElementProperty(element: page, property: 'label')}

      +
      + + + +
      + diff --git a/Resources/Private/Frontend/Partials/Password.fluid.html b/Resources/Private/Frontend/Partials/Password.fluid.html new file mode 100644 index 0000000..a0e8b50 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Password.fluid.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/RadioButton.fluid.html b/Resources/Private/Frontend/Partials/RadioButton.fluid.html new file mode 100644 index 0000000..13ea136 --- /dev/null +++ b/Resources/Private/Frontend/Partials/RadioButton.fluid.html @@ -0,0 +1,43 @@ + + + + + + {f:if(condition: '{validationResults.errors}', then: '{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')} +
      + + + + + + + + +
      + +
      +
      +
      + + + + {formvh:translateElementError(element: element, error: error)} +
      +
      +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/SingleSelect.fluid.html b/Resources/Private/Frontend/Partials/SingleSelect.fluid.html new file mode 100644 index 0000000..b01ee7a --- /dev/null +++ b/Resources/Private/Frontend/Partials/SingleSelect.fluid.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/StaticText.fluid.html b/Resources/Private/Frontend/Partials/StaticText.fluid.html new file mode 100644 index 0000000..5ee9aac --- /dev/null +++ b/Resources/Private/Frontend/Partials/StaticText.fluid.html @@ -0,0 +1,12 @@ + + +
      + +

      {formvh:translateElementProperty(element: element, property: 'label')}

      +
      + + {formvh:translateElementProperty(element: element, property: 'text') -> f:sanitize.html() -> f:transform.html()}
      + + +
      + diff --git a/Resources/Private/Frontend/Partials/SummaryPage.fluid.html b/Resources/Private/Frontend/Partials/SummaryPage.fluid.html new file mode 100644 index 0000000..ca04e9b --- /dev/null +++ b/Resources/Private/Frontend/Partials/SummaryPage.fluid.html @@ -0,0 +1,79 @@ + + +
      + + {formvh:translateElementProperty(element: page, property: 'label')} + +
      + + + + +

      {formvh:translateElementProperty(element: formValue.element, property: 'label')}

      +
      + +
      +
      {formvh:translateElementProperty(element: formValue.element, property: 'label') -> f:sanitize.html() -> f:transform.html()}
      +
      + + + + + + +
        + +
      • + +
      • +
        +
      +
      + + + +
      +
      + + + +
        + +
      • {value.originalResource.originalFile.name}
      • +
        +
      +
      + + {formValue.processedValue} + +
      +
      + + + +
        + +
      • {value}
      • +
        +
      +
      + + {formValue.processedValue} + +
      +
      +
      +
      + + - + +
      +
      +
      +
      +
      +
      +
      +
      +
      + diff --git a/Resources/Private/Frontend/Partials/Telephone.fluid.html b/Resources/Private/Frontend/Partials/Telephone.fluid.html new file mode 100644 index 0000000..8fa830c --- /dev/null +++ b/Resources/Private/Frontend/Partials/Telephone.fluid.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Text.fluid.html b/Resources/Private/Frontend/Partials/Text.fluid.html new file mode 100644 index 0000000..8f6e435 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Text.fluid.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/Textarea.fluid.html b/Resources/Private/Frontend/Partials/Textarea.fluid.html new file mode 100644 index 0000000..abb00bd --- /dev/null +++ b/Resources/Private/Frontend/Partials/Textarea.fluid.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Partials/UnknownElement.fluid.html b/Resources/Private/Frontend/Partials/UnknownElement.fluid.html new file mode 100644 index 0000000..ffa1faf --- /dev/null +++ b/Resources/Private/Frontend/Partials/UnknownElement.fluid.html @@ -0,0 +1,3 @@ + + + diff --git a/Resources/Private/Frontend/Partials/Url.fluid.html b/Resources/Private/Frontend/Partials/Url.fluid.html new file mode 100644 index 0000000..a319d26 --- /dev/null +++ b/Resources/Private/Frontend/Partials/Url.fluid.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/Resources/Private/Frontend/Templates/Finishers/Confirmation/Confirmation.fluid.html b/Resources/Private/Frontend/Templates/Finishers/Confirmation/Confirmation.fluid.html new file mode 100644 index 0000000..374ea00 --- /dev/null +++ b/Resources/Private/Frontend/Templates/Finishers/Confirmation/Confirmation.fluid.html @@ -0,0 +1,5 @@ + +
      + {message -> f:sanitize.html() -> f:transform.html()} +
      + diff --git a/Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.html b/Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.html new file mode 100644 index 0000000..ecf1d5f --- /dev/null +++ b/Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.html @@ -0,0 +1,53 @@ + + +{title} + + {messageBefore -> f:sanitize.html() -> f:format.html()} + + + + + + + + + + + + + + + +
      {formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey)}{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey) -> f:sanitize.html() -> f:transform.html()} + + + + + + + + + + +
      {value}
      +
      + + + + + +
      {formValue.processedValue}
      +
      +
      +
      + + - + +
      +
      +
      + {messageAfter -> f:sanitize.html() -> f:format.html()} +
      + diff --git a/Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.txt b/Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.txt new file mode 100644 index 0000000..17ab3c9 --- /dev/null +++ b/Resources/Private/Frontend/Templates/Finishers/Email/Default.fluid.txt @@ -0,0 +1,19 @@ + +{title} + +{messageBefore -> f:format.stripTags()} + + + + + *** {formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey)} ***{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey) -> f:format.stripTags()}: - {singleValue} + + + + *** {formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey)} ***{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey) -> f:format.stripTags()}: {formValue.processedValue -> f:format.raw()}- + + + + +{messageAfter -> f:format.stripTags()} + diff --git a/Resources/Private/Frontend/Templates/Finishers/Error.fluid.html b/Resources/Private/Frontend/Templates/Finishers/Error.fluid.html new file mode 100644 index 0000000..892f9e4 --- /dev/null +++ b/Resources/Private/Frontend/Templates/Finishers/Error.fluid.html @@ -0,0 +1,3 @@ + +

      {message}

      + diff --git a/Resources/Private/Frontend/Templates/Form.fluid.html b/Resources/Private/Frontend/Templates/Form.fluid.html new file mode 100644 index 0000000..c9f570e --- /dev/null +++ b/Resources/Private/Frontend/Templates/Form.fluid.html @@ -0,0 +1,21 @@ + + + + +
      + +
      +
      +
      + diff --git a/Resources/Private/Frontend/Templates/Render.fluid.html b/Resources/Private/Frontend/Templates/Render.fluid.html new file mode 100644 index 0000000..674d3fa --- /dev/null +++ b/Resources/Private/Frontend/Templates/Render.fluid.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/Resources/Private/Language/Database.xlf b/Resources/Private/Language/Database.xlf new file mode 100644 index 0000000..7a30149 --- /dev/null +++ b/Resources/Private/Language/Database.xlf @@ -0,0 +1,1337 @@ + + + +
      + + + Form manager + + + Default + + + [Empty] + + + Form definition + + + General + + + Please select a form definition + + + Override finisher settings + + + There are no finishers or finisher options in the current form definition. + + + No form selected. + + + Invalid form "%s". + + + "%s" (no read access). + + + The form "%s" does not exist. + + + "%s" (Invalid ext:form configuration). + + + Invalid ext:form configuration in form "%s": %s + + + Invalid configuration. + + + Confirmation + + + Text + + + Record + + + Email to sender (form submitter) + + + Subject of the email + + + Recipients + + + Recipient + + + Email Address + + + Name + + + Email address of the sender + + + Human-readable name of the sender + + + Reply-To Recipients + + + Reply-To Recipient + + + CC Recipients + + + CC Recipient + + + BCC Recipients + + + BCC Recipient + + + Add HTML mail part + + + Translation language + + + Auto + + + EN + + + Message + + + Title + + + Email to receiver (you) + + + Subject of the email + + + Email addresses and human-readable names of the recipients + + + Email address of the sender + + + Human-readable name of the sender + + + Reply-To Recipients + + + CC Recipients + + + BCC Recipients + + + Add HTML part + + + Translation language + + + Auto + + + EN + + + Message + + + Title + + + Redirect + + + Page + + + Additional link parameter + + + Add fragment to the redirect link + + + Delete error + + + The form "%s" could not be deleted. + + + Form Management + + + Create new form + + + Form name + + + Integrity + + + Location + + + References + + + Options + + + Edit this form + + + Duplicate this form + + + Delete this form + + + No forms exist + + + Once created, forms will be displayed here. + + + There are currently no forms found containing the search term "%1s". + + + Remove search term + + + Invalid form definition + + + Read only + + + Duplicate identifier + + + form + + + forms + + + Standard + + + Blank form + + + Simple contact form (ext:form example) + + + Show History + + + Form editor + + + Loading... + + + Loading... + + + Save + + + Edit form properties + + + Undo + + + Redo + + + Toggle structure + + + Toggle inspector + + + Show inspector + + + Hide inspector + + + Create new step + + + Previous step + + + Next step + + + Step name is not set + + + Preview mode + + + Edit mode + + + Structure + + + Insert elements + + + Required + + + Not a number + + + Invalid email address + + + Invalid form element + + + Invalid file size format, valid e.g. "10B|K|M|G" + + + Invalid date format. Use Y-m-d (e.g. 2018-03-17) or a relative expression (e.g. today, -18 years) + + + Invalid pattern + + + Not all items are numbers + + + Invalid number of items. Minimum is {0}, maximum is {1} + + + Basic elements + + + Special elements + + + Select elements + + + Advanced elements + + + Container elements + + + Step types + + + Form name + + + Save + + + The form has been successfully saved. + + + Save + + + The form could not be saved: + + + Alert + + + Some elements are not configured properly. Please check the following elements: + + + OK + + + New element + + + New step + + + Remove element? + + + Remove this element? + + + Remove + + + Cancel + + + Error + + + There must be at least one step within your form. + + + You currently have unsaved changes. Closing the form will discard them. Continue? + + + Quit without saving? + + + Discard changes + + + Keep editing + + + Step {0} of {1} + + + Minimum + + + Maximum + + + Placeholder + + + Default value + + + Pattern + + + Additional client-side validation as JavaScript regular expression + + + Step + + + Validators + + + Add validator + + + Alphanumeric + + + Non-XML text + + + String length + + + Email + + + Integer number + + + Floating-point number + + + Number + + + Number range + + + Regular expression + + + Number of submitted values + + + Alphanumeric + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Non-XML text + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + String length + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Email + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Integer number + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Floating-point number + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Number + + + Number range + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Regular expression + + + Regular expression + + + Enter a valid PHP PCRE regular expression here. + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Number of submitted values + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + First option (empty value) + + + If set, this label will be shown as first option. + + + Choices + + + Validators + + + Add validator + + + Uploads save path + + + Validators + + + Add validator + + + File size + + + Number of files + + + File size + + + Number of uploaded files + + + Submit label + + + Submit + + + Finishers + + + Add finisher + + + Email to sender (form submitter) + + + Email to receiver (you) + + + Redirect to a page + + + Delete uploads + + + Confirmation message + + + Email to sender (form submitter) + + + Subject + + + Message + + + Optional custom message. Use {formValues} as a placeholder to include the submitted form data at that position. If empty, only the form data table will be shown. + + + Recipients + + + The email addresses and names of the website visitors to which the email should be sent. + + + Email Address + + + Name + + + Sender address + + + The email address of the sender (e.g. your company's email address) which appears in the website visitor email client. + + + Sender name + + + The name of the sender (e.g. your company's name) which appears in the website visitor email client. + + + Reply-To Recipients + + + CC Recipients + + + BCC Recipients + + + Add HTML part + + + If enabled, the email will contain a plaintext and an HTML part, otherwise only a plaintext part. + + + Attach uploads + + + Translation language + + + Auto + + + EN + + + Title + + + The title, being shown in the Email. The title is rendered in the header section right above the email body. Do not confuse this field with the subject of your email. + + + Email to receiver (you) + + + Subject + + + Message + + + Optional custom message. Use {formValues} once as a placeholder to include the submitted form data at that position (only the first occurrence is replaced). If empty, only the form data table will be shown. + + + Recipients + + + The email addresses and names of the recipients to which the email should be sent (e.g. your company's email addresses). + + + Sender address + + + The email address of the sender which appears in your email client. Use the "insert formelement identifier" dropdown if you need to select a form element which contains the website visitor's email address instead. + + + Sender name + + + The name of the sender which appears in your email client. Use the "insert formelement identifier" dropdown if you need to choose one or more form elements which contain the website visitor's name + + + Reply-To Recipients + + + CC Recipients + + + BCC Recipients + + + Add HTML part + + + If enabled, the email will contain a plaintext and an HTML part, otherwise only a plaintext part. + + + Attach uploads + + + Translation language + + + Auto + + + EN + + + Title + + + The title, being shown in the Email. The title is rendered in the header section right above the email body. Do not confuse this field with the subject of your email. + + + Redirect to a page + + + Page + + + Page + + + Additional parameters + + + URL fragment + + + Page Content + + + You can use a content element identifier as URL fragment or set a custom fragment identifier. + + + Delete uploads + + + Confirmation message + + + Content element uid + + + Page Content + + + Text + + + Will be ignored if "Content element" is set + + + Execute a closure + + + Flash message + + + Save the mail to the Database + + + Label + + + Label + + + Description + + + Field visible + + + Autocomplete + + + None + + + off - disable the autocomplete functionality + + + name - Full name + + + Prefix or title (e.g., "Mr.", "Ms.", "Dr.") + + + given-name - first name + + + additional-name - middle name + + + family-name - last name + + + honorific-suffix - Name suffix (e.g., "Jr.", "II") + + + Nickname, screen name + + + organization-title - Job title + + + username + + + organization - Company name + + + address-line1 - Street address, line 1 + + + address-line2 - Street address, line 2 + + + address-level1 - State, Canton etc + + + address-level2 - City + + + country-name + + + postal-code - ZIP + + + tel - Full telephone number + + + impp - URL representing an instant messaging protocol endpoint + + + sex - Gender identity + + + language - Preferred language + + + street-address + + + tel-country-code - Country code component of the telephone number + + + tel-national - Telephone number without the county code + + + tel-area-code - Area code component of the telephone number + + + tel-local - Telephone number without the country code and area code component + + + tel-extension - Telephone number internal extension code + + + url - Home page + + + new-password - A new password to create / change + + + current-password - Current password for the selected username + + + bday-day - Day component of birthday + + + bday-month - Month component of birthday + + + bday-year - Year component of birthday + + + photo + + + email + + + bday - Birthday + + + country - Country code + + + Field required + + + Custom error message + + + Error message which is shown if the validation does not succeed + + + Date range + + + Grid viewport configuration + + + Extra small + + + Small + + + Medium + + + Large + + + Extra large + + + Extra extra large + + + Numbers of columns for viewport "{@viewPortLabel}" + + + Leave empty for auto calculation + + + Step + + + A form step that can be customized with various elements + + + Step name + + + Previous button label + + + Previous step + + + Next button label + + + Next step + + + Summary step + + + A form step that displays all entered values for review before submission + + + Step name + + + Previous button label + + + Previous step + + + Next button label + + + Next step + + + Fieldset + + + A container used to group related form elements, improving accessibility and providing content-based structure + + + Fieldset name + + + Grid: Column + + + A container element for arranging fields, providing visual structure + + + Name (not visible within frontend) + + + Grid: Row + + + A container element for arranging fields side by side, providing visual structuring + + + Row name (not visible within frontend) + + + Text + + + A single-line text field + + + Email address + + + A text field for inputting an email address + + + Telephone number + + + A text field for inputting a phone number + + + URL + + + A text field for inputting a URL + + + Number + + + A text field for inputting numbers, with browser controls to adjust the value in predefined steps + + + Number + + + Date + + + A text field for inputting a date in a single line + + + A date in format Y-m-d (e.g 2018-03-17) + + + Specify the number of days between each occurrence of this event. + + + Frequency + + + Date range + + + Date range + + + Minimum date + + + Maximum date + + + Password + + + A text field for entering a password + + + Advanced password + + + A text field for entering and confirming a password + + + Confirmation label + + + Confirmation + + + Textarea + + + A multi-line text field for entering extended or continuous text + + + Checkbox + + + An element for creating a single checkbox + + + Country select + + + An element to select a country + + + Multi checkbox + + + An element for creating multiple checkboxes + + + Multi select + + + An element for creating a field that allows multiple selections + + + Radio button + + + An element for displaying one or more radio buttons + + + Single select + + + An element for creating a dropdown list for selecting a single option + + + Date/time + + + Static text + + + A field for displaying text content + + + Header + + + Text + + + Hidden + + + A field that is not displayed in the frontend + + + Value + + + Content element + + + A field for displaying any content element from your website + + + No content element selected + + + Content element uid + + + Page Content + + + File upload + + + An element for uploading a file + + + Allowed file mime types + + + +Your servers' maximum upload file size is {0}. Be aware setting higher values can result in errors when submitting the form. +If you need higher values contact your administrator for help. + + + + Documents (doc) + + + Documents (docx) + + + Documents (xls) + + + Documents (xlsx) + + + Documents (pdf) + + + Documents (odt) + + + Documents (ods) + + + Allow multiple upload + + + Allow removal of uploaded files + + + Image upload + + + An element for uploading an image + + + Allowed file mime types + + + Images (jpg) + + + Images (png) + + + Images (bmp) + + + Country Select + + + Prioritized countries + + + Only countries + + + Exclude countries + + + Default value + + + Ensure the selected country is not excluded by the configured country filters. + + + Unknown element + + + Create new element + + + Remove + + + Insert formelement identifier + + + Remove this Element + + + Add a new row + + + Remove this row + + + Move this row + + + Label + + + Value + + + Selected + + + Unfortunately no element type matches your query, please try a different one. + + + Search for any element type + + + Unfortunately no step type matches your query, please try a different one. + + + Search for any step type + + + Database + + + Store the form as a record in the database. Recommended for most use cases, because it treats forms as user-generated content and allows integrated versioning. + + + Extension + + + Store the form inside an extension. Such forms are then not meant for editing, but provided as-is. + + + + diff --git a/Resources/Private/Language/Modules/form_editor.xlf b/Resources/Private/Language/Modules/form_editor.xlf new file mode 100644 index 0000000..ba7e023 --- /dev/null +++ b/Resources/Private/Language/Modules/form_editor.xlf @@ -0,0 +1,17 @@ + + + +
      + + + Form Editor + + + Build and customize forms using the visual form editor. Add fields, configure validations, and set up finishers. + + + Edit forms + + + + diff --git a/Resources/Private/Language/Modules/form_manager.xlf b/Resources/Private/Language/Modules/form_manager.xlf new file mode 100644 index 0000000..a1bd5a4 --- /dev/null +++ b/Resources/Private/Language/Modules/form_manager.xlf @@ -0,0 +1,17 @@ + + + +
      + + + Form Manager + + + Manage and organize all forms. Create, edit, duplicate, and delete forms. + + + Manage forms + + + + diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf new file mode 100644 index 0000000..fde8d4d --- /dev/null +++ b/Resources/Private/Language/locallang.xlf @@ -0,0 +1,155 @@ + + + +
      + + + Uploaded image + + + This field is mandatory. + + + This field is mandatory. + + + This field is mandatory. + + + This field is mandatory. + + + You must enter a valid date. + + + You can only enter letters or digits. + + + You can only enter non formatted text without any markup (e.g without XML tags). + + + You can only enter non formatted text without any markup (e.g without XML tags). + + + You can only enter non formatted text without any markup (e.g without XML tags). + + + Your text must be a minimum of %s characters in length and no longer than %s. + + + You must enter text which is longer than %s characters. + + + You must enter text which is no longer than %s characters. + + + You must enter a valid email address. + + + You must enter a valid number. + + + You must enter a valid floating point number. + + + You must enter a valid number. + + + You must enter a valid number between %s and %s. + + + You must enter a valid value. Please refer to the description of this field. + + + You must enter a countable subject. + + + You must select between %s to %s elements. + + + You must enter an instance of \TYPO3\CMS\Extbase\Domain\Model\FileReference or \TYPO3\CMS\Core\Resource\File. + + + You entered an incorrect media type, "%s" is not allowed for this file. Please refer to the description of this field. + + + The file extension provided "%s" does not match to expected media types. Please refer to the description of this field. + + + You must NOT fill this field. + + + You must enter an instance of \TYPO3\CMS\Extbase\Domain\Model\FileReference or \TYPO3\CMS\Core\Resource\File. + + + You must select a file that is larger than %s in size. + + + You must select a file that is no larger than %s. + + + You must enter an instance of \DateTime. + + + You must select a date before %s. + + + You must select a date after %s. + + + This field cannot be validated due to a configuration error. Please contact the website owner. + + + Password does not match confirmation + + + Form + + + A form that allows website users to submit messages. + + + Maximum file size exceeded. + + + Upload failed. The file was only partially uploaded, please try again. + + + No file was uploaded. + + + Upload failed. + + + Remove + + + Form: YAML Configuration + + + Your form could not be submitted due to a technical issue. It might be a temporary issue, but can also be related to your input. + + + Previous + + + Next + + + First + + + Last + + + Forms + + + Page + + + Refresh + + + + diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf new file mode 100644 index 0000000..03a5ebd --- /dev/null +++ b/Resources/Private/Language/locallang_db.xlf @@ -0,0 +1,20 @@ + + + +
      + + + Form definition + + + Name + + + Identifier + + + Configuration + + + + diff --git a/Resources/Private/Language/locallang_formEditor_failSafeErrorHandling_javascript.xlf b/Resources/Private/Language/locallang_formEditor_failSafeErrorHandling_javascript.xlf new file mode 100644 index 0000000..1ad5bf5 --- /dev/null +++ b/Resources/Private/Language/locallang_formEditor_failSafeErrorHandling_javascript.xlf @@ -0,0 +1,17 @@ + + + +
      + + + The form editor has stopped working. + + + Please contact your administrator. + + + Technical Reason: + + + + diff --git a/Resources/Private/Language/locallang_formManager_javascript.xlf b/Resources/Private/Language/locallang_formManager_javascript.xlf new file mode 100644 index 0000000..bfcaa63 --- /dev/null +++ b/Resources/Private/Language/locallang_formManager_javascript.xlf @@ -0,0 +1,161 @@ + + + +
      + + + Name + + + Enter a meaningful and descriptive name for the form. The name is displayed only in the TYPO3 backend. + + + New form name + + + Location + + + Select the location where the form will be saved. + + + Form prototype + + + Template + + + Select a template for building your new form. + + + General + + + Copied form + + + Cancel + + + Delete + + + Confirm deletion + + + Delete form "{0}"? Forms saved as files are permanently deleted and cannot be restored from the Recycler. + + + Create new form + + + Mode + + + Choose + + + You do not have permission to create forms. Please contact your administrator. + + + Settings + + + Ready? + + + Check + + + Just check and confirm the settings you have entered. Done? Then you are ready to go. + + + Check and confirm + + + Create + + + The form could not be saved + + + Storage location + + + Choose how the form should be saved: + + + Storage + + + Storage + + + Duplicate form "{0}" + + + Ready? + + + Check + + + Check and confirm + + + Just check and confirm the settings you have entered. Done? Then you are ready to go. + + + Duplicate + + + The form could not be saved + + + There are no references yet. + + + Control + + + Uid + + + Title + + + Edit + + + Form: {0} + + + References to this item + + + Blank form + + + Start fresh + + + Create a new form from scratch. + + + Predefined form + + + Use a form template + + + Create a new form and use an existing form template for it. + + + Form created + + + The form has been successfully created. Click "Finish" to be redirected to the newly created form. + + + + diff --git a/Resources/Private/Language/locallang_form_editor_javascript.xlf b/Resources/Private/Language/locallang_form_editor_javascript.xlf new file mode 100644 index 0000000..fbdd8be --- /dev/null +++ b/Resources/Private/Language/locallang_form_editor_javascript.xlf @@ -0,0 +1,32 @@ + + + +
      + + + Insert elements + + + Create new element + + + Create new element after + + + Create new element before + + + Remove + + + Step name is not set + + + Has validation errors + + + Contains elements with validation errors + + + + diff --git a/Resources/Private/Language/locallang_relative_date_editor.xlf b/Resources/Private/Language/locallang_relative_date_editor.xlf new file mode 100644 index 0000000..96db9e5 --- /dev/null +++ b/Resources/Private/Language/locallang_relative_date_editor.xlf @@ -0,0 +1,44 @@ + + + +
      + + + No value + + + Today + + + Absolute date + + + Relative date + + + past + + + future + + + {count, plural, one {Day} other {Days}} + + + {count, plural, one {Week} other {Weeks}} + + + {count, plural, one {Month} other {Months}} + + + {count, plural, one {Year} other {Years}} + + + Custom relative expression + + + e.g. "sunday next month" + + + + diff --git a/Resources/Private/Language/module.xlf b/Resources/Private/Language/module.xlf new file mode 100644 index 0000000..e595b3c --- /dev/null +++ b/Resources/Private/Language/module.xlf @@ -0,0 +1,17 @@ + + + +
      + + + Build custom forms + + + This module ships a flexible and user-friendly form editor. It allows you to build and create versatile forms for your frontend. Your forms can easily be added to any page by using the content element "Form". Within this element, finishers can be overridden. + + + Forms + + + + diff --git a/Resources/Private/Partials/Backend/FormManager/Pagination.fluid.html b/Resources/Private/Partials/Backend/FormManager/Pagination.fluid.html new file mode 100644 index 0000000..caa3d0f --- /dev/null +++ b/Resources/Private/Partials/Backend/FormManager/Pagination.fluid.html @@ -0,0 +1,90 @@ + + + diff --git a/Resources/Private/Templates/Backend/FormEditor/Index.fluid.html b/Resources/Private/Templates/Backend/FormEditor/Index.fluid.html new file mode 100644 index 0000000..5003bb0 --- /dev/null +++ b/Resources/Private/Templates/Backend/FormEditor/Index.fluid.html @@ -0,0 +1,110 @@ + + + + + +
      +
      + +
      +
      +
      + + +
      +
      +
      + + +
      +

      +
      + + +
      +
      +
      + + +
      +
      +
      +
      +
      +
      + + +
      +
      +
      + +
      + + +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + + diff --git a/Resources/Private/Templates/Backend/FormManager/Index.fluid.html b/Resources/Private/Templates/Backend/FormManager/Index.fluid.html new file mode 100644 index 0000000..df8253f --- /dev/null +++ b/Resources/Private/Templates/Backend/FormManager/Index.fluid.html @@ -0,0 +1,333 @@ + + + + + + + + + + + +

      + +
      +
      +
      + +
      + + +
      +
      +
      +
      +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + {f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels._CONTROL_')} +
      + + + + + {form.name} + + + + + + + + + + + {form.name} + + + + {form.name} + + + + + + {form.storageLocation} + + + + + + + + + + + + + + + + + + {form.referenceCount} + + + - + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + + + {totalAmountOfPaginatedItems} + {totalAmountOfPaginatedItems} + +
      +
      + +
      + + +

      + + + +
      +
      + + +

      + +
      +
      +
      +
      + + + + + + diff --git a/Resources/Public/Css/form.css b/Resources/Public/Css/form.css new file mode 100644 index 0000000..ba20dff --- /dev/null +++ b/Resources/Public/Css/form.css @@ -0,0 +1,108 @@ +/*! + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +.formeditor{--formeditor-module-gap:var(--module-body-padding-x);--formeditor-module-inspector:400px;--formeditor-inspector-color:var(--typo3-text-color-base);--formeditor-inspector-bg:var(--typo3-surface-container-low);--formeditor-inspector-border-width:var(--typo3-component-border-width);--formeditor-inspector-border-color:color-mix(in srgb,var(--formeditor-inspector-bg),var(--formeditor-inspector-color) var(--typo3-border-mix));--formeditor-inspector-border-radius:var(--typo3-component-border-radius);--formeditor-inspector-box-shadow:var(--typo3-component-box-shadow);--formeditor-stage-element-padding-y:.5rem;--formeditor-stage-element-padding-x:.75rem;--formeditor-stage-element-validator-width:100px;--formeditor-stage-spacing:1rem;--formeditor-stage-element-border-width:var(--typo3-component-border-width);--formeditor-stage-element-border-radius:var(--typo3-component-border-radius);--formeditor-stage-element-border-color-state:initial;--formeditor-stage-element-bg:var(--typo3-surface-bright);--formeditor-stage-element-color:var(--typo3-component-color);--formeditor-stage-element-border-color:var(--typo3-component-border-color);--formeditor-stage-element-hover-border-color:var(--typo3-component-hover-border-color);--formeditor-stage-element-active-border-color:var(--typo3-component-active-border-color);--formeditor-stage-element-hidden-bg:var(--typo3-surface-bright);--formeditor-stage-element-hidden-color:var(--typo3-component-color);--formeditor-stage-element-hidden-border-color:var(--typo3-component-border-color);position:relative} +[data-module-name=form_editor]{overflow-x:clip} +@media (max-width:949px){ +body:has(.formeditor-inspector-expanded){max-height:100dvh;overflow:hidden}} +.formeditor-loader{align-items:center;display:flex;flex-direction:column;gap:.25rem;inset:0;justify-content:center;overflow:hidden;position:absolute} +.formeditor-module,.formeditor-stage-container{flex-grow:1;min-height:0;min-width:0} +.formeditor-stage-container{position:relative} +.formeditor-stage-container-inner{position:relative;width:100%} +.formeditor-stage-container-inner>:last-child{margin-bottom:0} +.formeditor-header{align-items:center;display:flex;gap:1rem;justify-content:space-between;margin-bottom:var(--typo3-spacing)} +.formeditor-header h1{margin:0} +.formeditor-header-actions{align-items:center;display:flex;gap:.5rem} +.formeditor-inspector{border:var(--formeditor-inspector-border-width) solid var(--formeditor-inspector-border-color);color:var(--formeditor-inspector-color);display:flex;flex-direction:column;height:calc(100dvh - var(--module-docheader-height) - var(--module-body-padding-y));inset-inline-end:calc(var(--module-body-padding-x)*-1);position:absolute;top:calc((var(--module-body-padding-y) + var(--formeditor-inspector-border-width))*-1);width:calc(100% + var(--module-body-padding-x));z-index:var(--typo3-zindex-header);-webkit-border-end:0;background:var(--formeditor-inspector-bg);border-inline-end:0;border-radius:var(--formeditor-inspector-border-radius) 0 0 var(--formeditor-inspector-border-radius);box-shadow:var(--typo3-component-box-shadow-flyout);isolation:isolate;overflow:hidden;transform:translateX(100%);transition:transform .3s ease-out} +.formeditor-inspector.formeditor-inspector-expanded{transform:translateX(0)} +.formeditor-inspector-inner{flex-grow:1;min-height:0;overflow:auto;padding:var(--module-body-padding)} +.formeditor-inspector-collapse{display:flex;justify-content:flex-end;margin-bottom:calc(var(--typo3-spacing)/2)} +.formeditor-inspector-expand{display:inline-flex} +.formeditor-inspector-content .input-group{flex-wrap:nowrap} +.formeditor-inspector-content .input-group>:first-child{flex-grow:1} +.formeditor-inspector-content .input-group>:first-child>*{border-end-end-radius:0;border-start-end-radius:0} +.formeditor-inspector-content .input-group .input-group-btn .btn-group .btn{border-end-start-radius:0;border-start-start-radius:0} +.formeditor-inspector-content>.formeditor-inspector-element-remove-button{border-top:1px solid var(--module-docheader-border-color);padding-top:1rem} +.formeditor-inspector-content>.formeditor-inspector-element-remove-button .btn{width:100%} +.formeditor-inspector-element:last-child>:last-child{margin-bottom:0} +.formeditor-inspector-element-headline{border-bottom:1px solid color-mix(in srgb,transparent,currentColor 15%);margin-bottom:1.5rem;padding-bottom:1rem} +.formeditor-inspector-element-headline h2{align-items:center;display:flex;font-family:inherit;font-size:var(--typo3-font-size);font-weight:700;gap:.25rem;margin:0} +typo3-form-form-element-stage-item-toolbar{display:block} +.formeditor-stage{border:1px dotted color-mix(in srgb,var(--module-bg),currentColor 30%);border-radius:var(--formeditor-stage-element-border-radius);margin-bottom:var(--typo3-spacing);overflow-x:auto;overflow-y:hidden;padding:var(--module-body-padding)} +.formeditor-stage typo3-form-form-element-stage-item,.formeditor-stage typo3-form-page-stage-item{display:block} +.formeditor-stage .formeditor-page-title{cursor:pointer;font-size:.875rem;font-weight:700;margin:0 0 var(--typo3-spacing)} +.formeditor-stage .formeditor-page-title:empty:before{content:attr(data-empty-message);opacity:.75} +.formeditor-stage .formeditor-page-title:hover{text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb,currentColor,transparent 50%);text-decoration-color:color-mix(in srgb,currentColor,transparent 50%);text-underline-offset:.1em} +.formeditor-stage-section{background-color:var(--typo3-surface-container-base);border-radius:calc(var(--formeditor-stage-element-border-radius) - 3px)} +.formeditor-stage-heading{margin-bottom:var(--formeditor-stage-spacing)} +.formeditor-stage-area{padding:var(--formeditor-stage-spacing)} +.formeditor-list,.formeditor-stage-list{display:grid;gap:var(--formeditor-stage-spacing);grid-template-columns:minmax(0,1fr);list-style:none;margin:0;padding:0} +.formeditor-element{background-color:var(--formeditor-stage-element-bg);border:var(--formeditor-stage-element-border-width) solid var(--formeditor-stage-element-border-color-state,var(--formeditor-stage-element-border-color));border-radius:var(--formeditor-stage-element-border-radius);color:var(--formeditor-stage-element-color);display:flex;flex-direction:column;overflow:hidden} +.formeditor-element.formeditor-element-hidden:not(.formeditor-element.selected){background-color:var(--formeditor-stage-element-hidden-bg);border:var(--formeditor-stage-element-border-width) dashed var(--formeditor-stage-element-hidden-border-color);opacity:.5;transition:opacity .3s ease-in-out} +.formeditor-element.formeditor-element-hidden:not(.formeditor-element.selected):focus-within,.formeditor-element.formeditor-element-hidden:not(.formeditor-element.selected):hover{opacity:1} +.formeditor-element typo3-form-form-element-stage-item,.formeditor-element typo3-form-form-element-stage-item-toolbar{display:block} +.formeditor-element .formeditor-element-toolbar{align-items:center;display:flex;gap:.5rem;padding:var(--formeditor-stage-spacing)} +.formeditor-element .formeditor-element-toolbar-left,.formeditor-element .formeditor-element-toolbar-right{flex-shrink:0} +.formeditor-element .formeditor-element-toolbar-title{flex:1 1 0;font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.formeditor-element .formeditor-element-toolbar-label{font-weight:700} +.formeditor-element .formeditor-element-body{background-color:var(--formeditor-stage-element-bg);border-radius:calc(var(--formeditor-stage-element-border-radius) - var(--formeditor-stage-element-border-width));border-start-end-radius:0;border-start-start-radius:0;color:var(--formeditor-stage-element-color);display:flex;overflow:hidden;position:relative} +.formeditor-element .formeditor-element-info{display:flex;gap:var(--formeditor-stage-spacing);height:100%;padding:var(--formeditor-stage-spacing);position:relative;width:100%} +.formeditor-element .formeditor-element-info>*{flex:0 0 50%} +.formeditor-element .formeditor-element-info-label{align-items:flex-start;display:flex;font-weight:700;position:relative} +.formeditor-element .formeditor-element-info-content{align-items:center;display:flex;flex-flow:row wrap} +.formeditor-element .formeditor-element-validator{background-color:var(--typo3-component-hover-bg);border-start-start-radius:var(--formeditor-stage-element-border-radius);color:var(--typo3-component-hover-color);display:flex;height:100%;inset-inline-end:0;overflow:hidden;position:absolute;top:0;-webkit-margin-end:calc(var(--formeditor-stage-element-validator-width)*-1);margin-inline-end:calc(var(--formeditor-stage-element-validator-width)*-1);transition:margin .15s ease-in-out;z-index:2} +.formeditor-element .formeditor-element-validator:has(.formeditor-element-validator-icon:empty){display:none} +.formeditor-element .formeditor-element-validator-icon{height:100%} +.formeditor-element .formeditor-element-validator-icon .icon,.formeditor-element .formeditor-element-validator-icon typo3-backend-icon{height:100%;margin-inline:var(--formeditor-stage-element-padding-x);z-index:1} +.formeditor-element .formeditor-element-validator-list{align-items:center;display:flex;flex-flow:row wrap;gap:1px;height:100%;padding:var(--formeditor-stage-element-padding-y) var(--formeditor-stage-element-padding-x);-webkit-padding-start:0;font-size:var(--typo3-font-size-small);padding-inline-start:0;transition:margin .15s ease-in-out;width:var(--formeditor-stage-element-validator-width)} +.formeditor-element .formeditor-element-validator-list:hover{-webkit-margin-end:0;margin-inline-end:0} +.formeditor-element .formeditor-element-validator-list-item{opacity:.75;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%} +.formeditor-element:hover{--formeditor-stage-element-border-color-state:var(--formeditor-stage-element-hover-border-color)} +.formeditor-element:focus-visible{outline:var(--typo3-outline-width) var(--typo3-outline-style) color-mix(in srgb,var(--typo3-state-default-focus-border-color),transparent 25%);outline-offset:0} +.formeditor-element.selected{--formeditor-stage-element-border-color-state:var(--formeditor-stage-element-active-border-color);outline:2px solid var(--formeditor-stage-element-active-border-color);outline-offset:-1px} +.formeditor-element:has(+.formeditor-list){border-end-end-radius:0;border-end-start-radius:0} +.formeditor-element:has(+.formeditor-list) .formeditor-element-body{border-end-end-radius:0;border-end-start-radius:0} +.formeditor-element+.formeditor-list:not(:empty){border:var(--formeditor-stage-element-border-width) solid var(--formeditor-stage-element-border-color-state,var(--formeditor-stage-element-border-color));border-end-end-radius:var(--formeditor-stage-element-border-radius);border-end-start-radius:var(--formeditor-stage-element-border-radius);border-top:none;padding:var(--formeditor-stage-spacing)} +.formeditor-element.formeditor-element-hidden+.formeditor-list:not(:empty){background-color:var(--formeditor-stage-element-hidden-bg);border:var(--formeditor-stage-element-border-width) dashed var(--formeditor-stage-element-hidden-border-color);border-top:none;opacity:.5;transition:opacity .3s ease-in-out} +@container (min-width: 500px){ +.formeditor-element-validator:hover{-webkit-margin-end:0;margin-inline-end:0}} +typo3-form-form-element-stage-item[invalid] .formeditor-element-info-label{color:var(--typo3-text-color-danger)} +.formeditor-element:has(>[invalid]){--formeditor-stage-element-border-color:var(--typo3-state-danger-border-color);--formeditor-stage-element-hover-border-color:var(--typo3-state-danger-hover-border-color);--formeditor-stage-element-active-border-color:var(--typo3-state-danger-focus-border-color)} +.formeditor-sortable-handle{cursor:pointer} +.formeditor-sortable-ghost{outline:1px dashed var(--typo3-state-success-border-color)!important;outline-offset:-1px!important} +.formeditor-is-dragging .formeditor-new-element-placeholder{display:none} +.formeditor-new-element-placeholder{align-items:center;display:flex;justify-content:center;list-style:none} +.formeditor-new-element-container{align-items:center;border:var(--typo3-component-border-width) dashed color-mix(in srgb,transparent,currentColor 25%);border-radius:var(--typo3-component-border-radius);display:flex;justify-content:center;margin-top:var(--typo3-spacing);padding:.75rem .5rem} +.property-grid .form-control{min-width:auto} +.property-grid .table-fit{box-shadow:none;margin-bottom:0} +.property-grid-editor__entries{background-color:var(--typo3-component-border-color);border:var(--typo3-component-border-width) solid var(--typo3-component-border-color);border-radius:var(--typo3-component-border-radius);display:grid;gap:1px} +.property-grid-editor__entries+.property-grid-editor__actions{margin-top:calc(var(--typo3-spacing)/2)} +.property-grid-editor__entry{background-color:color-mix(in srgb,var(--typo3-component-bg),var(--typo3-component-color) 3%);display:flex;flex-direction:row;gap:var(--typo3-spacing);padding:var(--typo3-spacing);position:relative} +.property-grid-editor__entry:is(.dragging,.moving):after{border:2px dashed var(--typo3-state-primary-border-color);border-radius:calc(var(--typo3-component-border-radius) - var(--typo3-component-border-width));content:"";display:block;height:calc(100% - 2px);left:1px;position:absolute;top:1px;width:calc(100% - 2px)} +.property-grid-editor__entry-inputs{flex:1} +.property-grid-editor__entry-inputs div:last-child{margin-bottom:0} +.property-grid-editor__entry-buttons{display:flex;flex-direction:column;gap:.25rem} +.formeditor-module-viewmode-preview .formeditor-inspector-expand,.formeditor-module-viewmode-preview~.formeditor-inspector{display:none} +@media (min-width:950px){ +.formeditor-module-viewmode-preview~.formeditor-inspector{display:flex;transform:translateX(100%);-webkit-margin-start:calc(var(--formeditor-module-inspector)*-1 - var(--formeditor-module-gap));margin-inline-start:calc(var(--formeditor-module-inspector)*-1 - var(--formeditor-module-gap));opacity:0}} +.formeditor-module-viewmode-preview .formeditor-stage select[multiple=multiple]{height:auto;min-height:32px} +.formeditor-module-viewmode-preview .formeditor-stage textarea{min-height:100px} +.formeditor-module-viewmode-preview .formeditor-stage .container{width:auto} +.formeditor-module-viewmode-preview .formeditor-stage .form-navigation .btn-group button,.formeditor-module-viewmode-preview .formeditor-stage .form-navigation .btn-group span{display:inline-flex;-webkit-margin-end:1em;margin-inline-end:1em} +.formeditor-module-viewmode-preview .formeditor-stage .formeditor-element-preview{display:inline-block;position:relative;width:100%} +.formeditor-module-viewmode-preview .formeditor-stage .formeditor-new-element-container{display:none} +@media (min-width:950px){ +.formeditor-inner{align-items:flex-start;display:flex;gap:var(--formeditor-module-gap)} +.formeditor-stage-container{overflow:visible} +.formeditor-stage-container-inner{margin-inline:auto;max-width:800px} +.formeditor-inspector{border-radius:var(--formeditor-inspector-border-radius);flex-shrink:0;height:auto;inset:auto;max-height:calc(100dvh - var(--module-docheader-height) - var(--module-body-padding-y)*2);position:-webkit-sticky;position:sticky;top:calc(1rem + var(--module-docheader-bar-height));width:var(--formeditor-module-inspector);-webkit-border-end:var(--formeditor-inspector-border-width) solid var(--formeditor-inspector-border-color);border-inline-end:var(--formeditor-inspector-border-width) solid var(--formeditor-inspector-border-color);box-shadow:var(--formeditor-inspector-box-shadow);transform:none;transition:transform .3s ease-out,opacity .3s ease-out,margin .3s ease-out} +.formeditor-inspector-collapse,.formeditor-inspector-expand{display:none}} \ No newline at end of file diff --git a/Resources/Public/Icons/Extension.svg b/Resources/Public/Icons/Extension.svg new file mode 100644 index 0000000..bcacef1 --- /dev/null +++ b/Resources/Public/Icons/Extension.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/Public/JavaScript/backend/form-editor-tree-container.js b/Resources/Public/JavaScript/backend/form-editor-tree-container.js new file mode 100644 index 0000000..201eca3 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor-tree-container.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{LitElement as c,html as f}from"lit";import{query as p,customElement as h}from"lit/decorators.js";import"@typo3/backend/tree/tree-toolbar.js";import"@typo3/form/backend/form-editor-tree.js";var l=function(i,e,t,n){var a=arguments.length,r=a<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(i,e,t,n);else for(var d=i.length-1;d>=0;d--)(s=i[d])&&(r=(a<3?s(r):a>3?s(e,t,r):s(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r};const m="typo3-backend-navigation-component-formeditortree";let o=class extends c{async setNodes(e){await this.updateComplete,this.tree&&this.tree.setNodes(e)}setSelectedNode(e){this.tree&&this.tree.setSelectedNode(e)}search(e){this.tree&&this.tree.search(e)}setNodeValidationError(e,t=!0){this.tree&&this.tree.setNodeValidationError(e,t)}setNodeChildHasError(e,t=!0){this.tree&&this.tree.setNodeChildHasError(e,t)}clearAllValidationErrors(){this.tree&&this.tree.clearAllValidationErrors()}createRenderRoot(){return this}render(){return f``}firstUpdated(){this.toolbar&&this.tree&&(this.toolbar.tree=this.tree),this.dispatchEvent(new CustomEvent("typo3:tree-container:ready",{bubbles:!0,composed:!0}))}};l([p("typo3-backend-navigation-component-formeditor-tree")],o.prototype,"tree",void 0),l([p("typo3-backend-tree-toolbar")],o.prototype,"toolbar",void 0),o=l([h("typo3-backend-navigation-component-formeditortree")],o);export{o as FormEditorTreeContainer,m as navigationComponentName}; diff --git a/Resources/Public/JavaScript/backend/form-editor-tree-events.js b/Resources/Public/JavaScript/backend/form-editor-tree-events.js new file mode 100644 index 0000000..c687725 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor-tree-events.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +const e={NODE_CLICKED:"typo3:form-editor-tree:node-clicked",NODE_EDIT:"typo3:form-editor-tree:node-edit",NODE_DELETE:"typo3:form-editor-tree:node-delete",DND_UPDATE:"typo3:form-editor-tree:dnd-update",DND_CHANGE:"typo3:form-editor-tree:dnd-change"};export{e as FORM_EDITOR_TREE_EVENTS}; diff --git a/Resources/Public/JavaScript/backend/form-editor-tree.js b/Resources/Public/JavaScript/backend/form-editor-tree.js new file mode 100644 index 0000000..8bb3c06 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor-tree.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{customElement as T}from"lit/decorators.js";import{Tree as _}from"@typo3/backend/tree/tree.js";import{TreeNodePositionEnum as d}from"@typo3/backend/tree/tree-node.js";import{DataTransferTypes as b}from"@typo3/backend/enum/data-transfer-types.js";import y from"@typo3/backend/severity.js";import{FORM_EDITOR_TREE_EVENTS as N}from"@typo3/form/backend/form-editor-tree-events.js";import g from"~labels/form.form_editor_javascript";var P=function(h,e,t,r){var s=arguments.length,i=s<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(h,e,t,r);else for(var n=h.length-1;n>=0;n--)(a=h[n])&&(i=(s<3?a(i):s>3?a(e,t,i):a(e,t))||i);return s>3&&i&&Object.defineProperty(e,t,i),i};const w=0,I=1;let E=class extends _{constructor(){super(),this.nodeMetadata=new Map,this.validationErrors=new Set,this.childValidationErrors=new Set,this.settings.showIcons=!0,this.settings.defaultProperties={hasChildren:!1,nameSourceField:"label",type:"form_element",prefix:"",suffix:"",locked:!1,loaded:!0,overlayIcon:"",selectable:!0,expanded:!1,checked:!1},this.settings.dataUrl="",this.settings.filterUrl="",this.allowNodeEdit=!1,this.allowNodeDrag=!0,this.allowNodeSorting=!0}setNodes(e){this.syncExpandedStates(),this.nodeMetadata.clear();const t=this.convertToTreeNodes(e);this.nodes=this.enhanceNodes(t),this.applyValidationState(),this.requestUpdate()}setSelectedNode(e){const t=this.nodes.find(r=>r.identifier===e);t&&this.selectNode(t,!1)}setNodeValidationError(e,t=!0){t?this.validationErrors.add(e):this.validationErrors.delete(e),this.applyValidationState(),this.requestUpdate()}setNodeChildHasError(e,t=!0){t?this.childValidationErrors.add(e):this.childValidationErrors.delete(e),this.applyValidationState(),this.requestUpdate()}clearAllValidationErrors(){this.validationErrors.clear(),this.childValidationErrors.clear(),this.applyValidationState(),this.requestUpdate()}applyValidationState(){for(const e of this.nodes)e.statusInformation=[],e.overlayIcon=e.overlayIcon==="overlay-missing"?"":e.overlayIcon,this.validationErrors.has(e.identifier)?(e.overlayIcon="overlay-missing",e.statusInformation.push({label:g.get("formEditor.validation.hasError")||"Has validation errors",icon:"actions-exclamation-circle",overlayIcon:"",severity:y.error,priority:2})):this.childValidationErrors.has(e.identifier)&&e.statusInformation.push({label:g.get("formEditor.validation.childHasError")||"Contains elements with validation errors",icon:"actions-dot",overlayIcon:"",severity:y.warning,priority:1})}search(e){this.filter(e)}filter(e){if(typeof e=="string"&&(this.searchTerm=e),this.searchTerm){const t=this.searchTerm.toLowerCase();this.nodes.forEach(r=>{this.nodeMatchesSearchTerm(r,t)?(r.__hidden=!1,this.showParentNodes(r)):r.__hidden=!0})}else this.nodes.forEach(t=>{t.__hidden=!1});this.requestUpdate()}nodeMatchesSearchTerm(e,t){return e.name.toLowerCase().includes(t)||e.identifier.toLowerCase().includes(t)||e.note&&e.note.toLowerCase().includes(t)}async loadData(){this.loading=!1}async fetchData(){return[]}async loadChildren(e){e.loaded=!0}hideChildren(e){e.__expanded=!1,this.saveNodeStatus(e),this.dispatchEvent(new CustomEvent("typo3:tree:expand-toggle",{detail:{node:e}})),this.requestUpdate()}async showChildren(e){e.__expanded=!0,await this.loadChildren(e),this.saveNodeStatus(e),this.dispatchEvent(new CustomEvent("typo3:tree:expand-toggle",{detail:{node:e}})),this.requestUpdate()}selectNode(e,t=!0){super.selectNode(e,t),this.requestUpdate(),this.dispatchEvent(new CustomEvent("typo3:form-editor-tree:node-clicked",{detail:{identifierPath:e.identifier},bubbles:!0,composed:!0}))}async moveNode(e,t,r){const s=e.identifier,i=t.identifier,a=e.parentIdentifier,n=this.getParentNode(e);let l,o;r===d.INSIDE?(l=i,o=t):(l=t.parentIdentifier,o=this.getParentNode(t));const f=Array.from(this.nodes),c=f.indexOf(t);let p="",u="";r===d.BEFORE?(c>0&&(p=f[c-1].identifier),u=i):r===d.AFTER&&(p=i,c-1&&this.nodeMap.splice(v,1),e.parentIdentifier=l,o?e.depth=o.depth+1:e.depth=0,n&&this.getNodeChildren(n).length===0&&(n.hasChildren=!1,n.__expanded=!1),o&&(o.hasChildren||(o.hasChildren=!0,o.__expanded=!0),o.__expanded||await this.showChildren(o));let m=this.nodes.indexOf(t);(r===d.INSIDE||r===d.AFTER)&&m++,this.nodeMap.splice(m,0,e),this.requestUpdate(),D?this.dispatchEvent(new CustomEvent("typo3:form-editor-tree:dnd-change",{detail:{itemIdentifierPath:s,parentIdentifierPath:l,position:r,previousIdentifierPath:p,nextIdentifierPath:u},bubbles:!0,composed:!0})):this.dispatchEvent(new CustomEvent("typo3:form-editor-tree:dnd-update",{detail:{movedIdentifierPath:s,previousIdentifierPath:p,nextIdentifierPath:u},bubbles:!0,composed:!0}))}async firstUpdated(){await super.firstUpdated()}handleNodeDrop(e){const t=super.handleNodeDrop(e);return this.cleanDrag(),t&&(this.nodeDragMode=null,this.nodeDragPosition=null,this.refreshDragToolTip(),window.dispatchEvent(new DragEvent("dragend",{bubbles:!0,cancelable:!1}))),t}handleNodeDoubleClick(e,t){e.preventDefault(),e.stopPropagation(),this.dispatchFormEditorEvent(N.NODE_EDIT,{identifierPath:t.identifier,currentLabel:t.name})}handleNodeDelete(e){this.dispatchFormEditorEvent(N.NODE_DELETE,{identifierPath:e.identifier})}handleNodeMove(){}handleNodeDragStart(e,t){if(t.depth===0){e.preventDefault();return}super.handleNodeDragStart(e,t)}createDataTransferItemsFromNode(e){return[{type:b.treenode,data:this.getNodeTreeIdentifier(e)}]}handleNodeDragOver(e){if(!super.handleNodeDragOver(e))return!1;const r=this.getNodeFromDragEvent(e);return!r||!this.draggingNode?!1:this.isDropAllowedForFormEditor(this.draggingNode,r,this.nodeDragPosition)?!0:(this.nodeDragMode=null,this.nodeDragPosition=null,this.refreshDragToolTip(),this.cleanDrag(),!1)}isDropAllowedForFormEditor(e,t,r){if(e===t||e.depth===w)return!1;const s=this.getFormElementByNode(e);if(s?.isTopLevel&&r===d.INSIDE)return!1;const i=this.getTargetDepthAfterDrop(t,r);if(s?.isTopLevel&&i!==I)return!1;if(i===I){const a=this.getFormElementByNode(e);if(a&&!a.isTopLevel)return!1}if(r===d.INSIDE){const a=this.getFormElementByNode(t);if(a&&!a.isComposite||a?.isTopLevel&&s?.isTopLevel)return!1}return!this.isNodeDescendantOf(t,e)}getTargetDepthAfterDrop(e,t){return t===d.INSIDE?e.depth+1:e.depth}getFormElementByNode(e){const t=this.nodeMetadata.get(e.identifier);return t?{identifier:e.identifier,identifierPath:e.identifier,label:e.name,type:e.recordType,iconIdentifier:e.icon,isComposite:t.isComposite,isTopLevel:t.isTopLevel,enabled:!e.overlayIcon?.includes("hidden")}:null}isNodeDescendantOf(e,t){return e.__treeParents.includes(t.__treeIdentifier)}dispatchFormEditorEvent(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}syncExpandedStates(){this.nodes&&this.nodes.length>0&&this.nodes.forEach(e=>{this.saveNodeStatus(e)})}showParentNodes(e){e.__treeParents&&e.__treeParents.length>0&&e.__treeParents.forEach(t=>{const r=this.getNodeByTreeIdentifier(t);r&&(r.__hidden=!1,r.__expanded=!0)})}convertToTreeNodes(e,t="",r=0){const s=[];return e.forEach(i=>{this.nodeMetadata.set(i.identifierPath,{isComposite:i.isComposite,isTopLevel:i.isTopLevel});const a={type:"form_element",identifier:i.identifierPath,parentIdentifier:t,recordType:i.type,name:i.label,note:i.type?i.type:"",prefix:"",suffix:"",tooltip:`identifier=${i.identifier}`,depth:r,hasChildren:i.isComposite&&!!i.children&&i.children.length>0,loaded:!0,editable:!1,deletable:!1,icon:i.iconIdentifier,overlayIcon:i.enabled===!1?"overlay-hidden":"",statusInformation:[],labels:[],nameSourceField:"label",locked:!1,selectable:!0};if(s.push(a),i.children&&i.children.length>0){const n=this.convertToTreeNodes(i.children,i.identifierPath,r+1);s.push(...n)}}),s}};E=P([T("typo3-backend-navigation-component-formeditor-tree")],E);export{E as FormEditorTree}; diff --git a/Resources/Public/JavaScript/backend/form-editor.js b/Resources/Public/JavaScript/backend/form-editor.js new file mode 100644 index 0000000..39a9175 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor.js @@ -0,0 +1,16 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import y from"@typo3/backend/notification.js";import*as a from"@typo3/form/backend/form-editor/core.js";import{cloneDeep as d}from"lodash-es";import m from"~labels/form.form_editor_fail_safe_error_handling_javascript";const n=a.assert;class c{constructor(t,e,r){this.isRunning=!1,this.unsavedContent=!1,this.configuration=t||{},this.mediator=e,this.viewModel=r}getPublisherSubscriber(){return a.getPublisherSubscriber()}undoApplicationState(){this.getApplicationStateStack().incrementCurrentStackPointer()}redoApplicationState(){this.getApplicationStateStack().decrementCurrentStackPointer()}getMaximalApplicationStates(){return this.getApplicationStateStack().getMaximalStackSize()}getCurrentApplicationStates(){return this.getApplicationStateStack().getCurrentStackSize()}getCurrentApplicationStatePosition(){return this.getApplicationStateStack().getCurrentStackPointer()}setFormDefinition(t){n(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "formDefinition"',1519855175),this.getApplicationStateStack().setCurrentState("formDefinition",this.getFactory().createFormElement(t,void 0,void 0,!0))}getRunningAjaxRequest(t){return n(this.getUtility().isNonEmptyString(t),'Invalid parameter "type"',1475378543),a.getRunningAjaxRequest(t)}getUtility(){return a.getUtility()}assert(t,e,r){this.getUtility().assert(t,e,r)}buildPropertyPath(t,e,r,i,o){this.getUtility().isUndefinedOrNull(i)&&(i=this.getCurrentlySelectedFormElement());const l=this.getRepository().findFormElement(i);return this.getUtility().buildPropertyPath(t,e,r,l,o)}addPropertyValidationValidator(t,e){this.getPropertyValidationService().addValidator(t,e)}validateCurrentlySelectedFormElementProperty(t){return this.validateFormElementProperty(this.getCurrentlySelectedFormElement(),t)}validateFormElementProperty(t,e){const r=this.getRepository().findFormElement(t);return this.getPropertyValidationService().validateFormElementProperty(r,e)}validateFormElement(t){const e=this.getRepository().findFormElement(t);return this.getPropertyValidationService().validateFormElement(e)}validationResultsHasErrors(t){return this.getPropertyValidationService().validationResultsHasErrors(t)}validateFormElementRecursive(t,e){const r=this.getRepository().findFormElement(t);return this.getPropertyValidationService().validateFormElementRecursive(r,e)}setUnsavedContent(t){n(typeof t=="boolean",'Invalid parameter "unsavedContent"',1475378544),this.unsavedContent=t}getUnsavedContent(){return this.unsavedContent}getRootFormElement(){return this.getRepository().getRootFormElement()}getCurrentlySelectedFormElement(){return this.getRepository().findFormElementByIdentifierPath(this.getApplicationStateStack().getCurrentState("currentlySelectedFormElementIdentifierPath"))}setCurrentlySelectedFormElement(t,e){e=!!e;const r=this.getRepository().findFormElement(t);this.getApplicationStateStack().setCurrentState("currentlySelectedFormElementIdentifierPath",r.get("__identifierPath")),e||this.refreshCurrentlySelectedPageIndex(),this.getPublisherSubscriber().publish("core/currentlySelectedFormElementChanged",[r])}getFormElementByIdentifierPath(t){return n(this.getUtility().isNonEmptyString(t),'Invalid parameter "identifierPath"',1475378545),this.getRepository().findFormElementByIdentifierPath(t)}isFormElementIdentifierUsed(t){return this.getRepository().isFormElementIdentifierUsed(t)}createAndAddFormElement(t,e,r){const i=this.addFormElement(this.createFormElement(t,r),e,r);return i.set("renderables",i.get("renderables")),i}addFormElement(t,e,r){this.saveApplicationState(),this.getUtility().isUndefinedOrNull(e)&&(e=this.getCurrentlySelectedFormElement());const i=this.getRepository().findFormElement(e);return n(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "formElement"',1475434337),this.getRepository().addFormElement(t,i,!0,r)}createFormElement(t,e){n(this.getUtility().isNonEmptyString(t),'Invalid parameter "formElementType"',1475434336);const r=this.getRepository().getNextFreeFormElementIdentifier(t),i=this.getFormElementDefinitionByType(t,void 0);return this.getFactory().createFormElement({type:t,identifier:r,label:i.label||t},void 0,void 0,void 0,e)}removeFormElement(t,e){this.saveApplicationState();const r=this.getRepository().findFormElement(t),i=r.get("__parentRenderable");return this.getRepository().removeFormElement(r,!0,e),i}moveFormElement(t,e,r,i){this.saveApplicationState();let o=this.getRepository().findFormElement(t);const l=this.getRepository().findFormElement(r);return n(e==="after"||e==="before"||e==="inside",'Invalid position "'+e+'"',1475378551),o=this.getRepository().moveFormElement(o,e,l,!0),i=!!i,i||o.get("__parentRenderable").set("renderables",o.get("__parentRenderable").get("renderables")),o}getPropertyCollectionElementConfiguration(t,e,r){let i,o;this.getUtility().isUndefinedOrNull(r)&&(r=this.getCurrentlySelectedFormElement());const l=this.getRepository().findFormElement(r);n(this.getUtility().isNonEmptyString(t),'Invalid parameter "collectionElementIdentifier"',1475378555),n(this.getUtility().isNonEmptyString(e),'Invalid parameter "collectionName"',1475378556);const p=this.getFormElementDefinitionByType(l.get("type"),void 0);return this.getUtility().isUndefinedOrNull(p.propertyCollections)?{}:(i=p.propertyCollections[e],n(!this.getUtility().isUndefinedOrNull(i),'Invalid collection name "'+e+'"',1475446108),o=this.getRepository().findCollectionElementByIdentifierPath(t,i),d(o))}getIndexFromPropertyCollectionElement(t,e,r){this.getUtility().isUndefinedOrNull(r)&&(r=this.getCurrentlySelectedFormElement());const i=this.getRepository().findFormElement(r);return n(this.getUtility().isNonEmptyString(t),'Invalid parameter "collectionElementIdentifier"',1475378557),n(this.getUtility().isNonEmptyString(e),'Invalid parameter "collectionName"',1475378558),this.getRepository().getIndexFromPropertyCollectionElementByIdentifier(t,e,i)}createAndAddPropertyCollectionElement(t,e,r,i,o){return this.addPropertyCollectionElement(this.createPropertyCollectionElement(t,e,i),e,r,o)}addPropertyCollectionElement(t,e,r,i){let o;this.saveApplicationState(),this.getUtility().isUndefinedOrNull(r)&&(r=this.getCurrentlySelectedFormElement());const l=this.getRepository().findFormElement(r);return n(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "collectionElement"',1475443301),n(this.getUtility().isNonEmptyString(e),'Invalid parameter "collectionName"',1475443300),this.getUtility().isUndefinedOrNull(i)&&(o=l.get(e),Array.isArray(o)&&o.length>0&&(i=o[o.length-1].identifier)),this.getRepository().addPropertyCollectionElement(t,e,l,i,!1)}createPropertyCollectionElement(t,e,r){return n(this.getUtility().isNonEmptyString(t),'Invalid parameter "collectionElementIdentifier"',1475378559),n(this.getUtility().isNonEmptyString(e),'Invalid parameter "collectionName"',1475378560),(typeof r!="object"||r===null||Array.isArray(r))&&(r={}),this.getFactory().createPropertyCollectionElement(t,r,e)}removePropertyCollectionElement(t,e,r,i){this.saveApplicationState(),this.getUtility().isUndefinedOrNull(r)&&(r=this.getCurrentlySelectedFormElement());const o=this.getRepository().findFormElement(r);n(this.getUtility().isNonEmptyString(t),'Invalid parameter "collectionElementIdentifier"',1475378561),n(this.getUtility().isNonEmptyString(e),'Invalid parameter "collectionName"',1475378562),this.getRepository().removePropertyCollectionElementByIdentifier(o,t,e,!0),i=!!i,i||this.getPublisherSubscriber().publish("core/formElement/somePropertyChanged",["__fakeProperty"])}movePropertyCollectionElement(t,e,r,i,o,l){this.saveApplicationState(),o=this.getRepository().findFormElement(o),n(typeof t=="string",'Invalid parameter "collectionElementToMove"',1477404352),n(typeof r=="string",'Invalid parameter "referenceCollectionElement"',1477404353),n(e==="after"||e==="before",'Invalid position "'+e+'"',1477404354),n(this.getUtility().isNonEmptyString(i),'Invalid parameter "collectionName"',1477404355),this.getRepository().movePropertyCollectionElement(t,e,r,i,o,l)}getFormElementDefinitionByType(t,e){n(this.getUtility().isNonEmptyString(t),'Invalid parameter "elementType"',1475378563);const r=this.getRepository().getFormEditorDefinition("formElements",t);if(e!==void 0){const i=r[e];return i!==null&&typeof i=="object"?d(i):i}return r!==null&&typeof r=="object"?d(r):r}getFormElementDefinition(t,e){return t=this.getRepository().findFormElement(t),this.getFormElementDefinitionByType(t.get("type"),e)}getFormEditorDefinition(t,e){return this.getRepository().getFormEditorDefinition(t,e)}getFormElementPropertyValidatorDefinition(t){n(this.getUtility().isNonEmptyString(t),'Invalid parameter "validatorIdentifier"',1475672362);const e=this.getRepository().getFormEditorDefinition("formElementPropertyValidators",t);return d(e)}getCurrentlySelectedPageIndex(){return this.getApplicationStateStack().getCurrentState("currentlySelectedPageIndex")}refreshCurrentlySelectedPageIndex(){this.getApplicationStateStack().setCurrentState("currentlySelectedPageIndex",this.getPageIndexFromFormElement(this.getCurrentlySelectedFormElement()))}getCurrentlySelectedPage(){const t=this.getRepository().getRootFormElement().get("renderables")[this.getCurrentlySelectedPageIndex()];return n(typeof t=="object"&&t!==null&&!Array.isArray(t),"No page found",1477786068),t}getLastTopLevelElementOnCurrentPage(){const t=this.getCurrentlySelectedPage().get("renderables");if(!this.getUtility().isUndefinedOrNull(t))return t[t.length-1]}getLastFormElementWithinParentFormElement(t){return t=this.getRepository().findFormElement(t),t.get("__identifierPath")===this.getRootFormElement().get("__identifierPath")?t:t.get("__parentRenderable").get("renderables")[t.get("__parentRenderable").get("renderables").length-1]}getPageIndexFromFormElement(t){return t=this.getRepository().findFormElement(t),this.getRepository().getIndexForEnclosingCompositeFormElementWhichIsOnTopLevelForFormElement(t)}renderCurrentFormPage(){this.renderFormPage(this.getCurrentlySelectedPageIndex())}renderFormPage(t){n(typeof t=="number",'Invalid parameter "pageIndex"',1475446442),this.getDataBackend().renderFormDefinitionPage(t)}findEnclosingCompositeFormElementWhichIsNotOnTopLevel(t){return this.getRepository().findEnclosingCompositeFormElementWhichIsNotOnTopLevel(this.getRepository().findFormElement(t))}findEnclosingGridRowFormElement(t){return this.getRepository().findEnclosingGridRowFormElement(this.getRepository().findFormElement(t))}getNonCompositeNonToplevelFormElements(){return this.getRepository().getNonCompositeNonToplevelFormElements()}isRootFormElementSelected(){return this.getCurrentlySelectedFormElement().get("__identifierPath")===this.getRootFormElement().get("__identifierPath")}getViewModel(){return this.viewModel}saveFormDefinition(){this.getDataBackend().saveFormDefinition()}run(){if(this.isRunning)throw"You can not run the app twice (1473200696)";try{this.bootstrap(),this.isRunning=!0}catch(t){if(!(t instanceof Error))throw t;console.error("Form editor error:",t),y.error(m.get("formEditor.error.headline"),m.get("formEditor.error.message")+`\r +\r +`+m.get("formEditor.error.technicalReason")+`\r +`+t.message)}return this}saveApplicationState(){this.getApplicationStateStack().addAndReset({formDefinition:this.getApplicationStateStack().getCurrentState("formDefinition").clone(),currentlySelectedPageIndex:this.getApplicationStateStack().getCurrentState("currentlySelectedPageIndex"),currentlySelectedFormElementIdentifierPath:this.getApplicationStateStack().getCurrentState("currentlySelectedFormElementIdentifierPath")})}getDataBackend(){return a.getDataBackend()}getFactory(){return a.getFactory()}getRepository(){return a.getRepository()}getPropertyValidationService(){return a.getPropertyValidationService()}getApplicationStateStack(){return a.getApplicationStateStack()}dataBackendSetup(t,e,r){n(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "endpoints"',1475379748),n(this.getUtility().isNonEmptyString(e),'Invalid parameter "prototypeName"',1475927876),n(this.getUtility().isNonEmptyString(r),'Invalid parameter "formPersistenceIdentifier"',1475379749),a.getDataBackend().setEndpoints(t),a.getDataBackend().setPrototypeName(e),a.getDataBackend().setPersistenceIdentifier(r)}repositorySetup(t){n(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "formEditorDefinitions"',1475379750),this.getRepository().setFormEditorDefinitions(t)}viewSetup(t){n(typeof this.viewModel.bootstrap=="function",'The view model does not implement the method "bootstrap"',1475492374),this.getUtility().isUndefinedOrNull(t)&&(t=[]),this.viewModel.bootstrap(s,t)}mediatorSetup(){n(typeof this.mediator.bootstrap=="function",'The mediator does not implement the method "bootstrap"',1475492032),this.mediator.bootstrap(s,this.viewModel)}applicationStateStackSetup(t,e){n(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "rootFormElement"',1475379751),typeof e!="number"&&(e=10),this.getApplicationStateStack().setMaximalStackSize(e),this.getApplicationStateStack().addAndReset({currentlySelectedPageIndex:0,currentlySelectedFormElementIdentifierPath:t.identifier},!0),this.getApplicationStateStack().setCurrentState("formDefinition",this.getFactory().createFormElement(t,void 0,void 0,!0))}bootstrap(){this.mediatorSetup(),this.dataBackendSetup(this.configuration.endpoints,this.configuration.prototypeName,this.configuration.formPersistenceIdentifier),this.repositorySetup(this.configuration.formEditorDefinitions),this.applicationStateStackSetup(this.configuration.formDefinition,this.configuration.maximumUndoSteps),this.setCurrentlySelectedFormElement(this.getRepository().getRootFormElement()),this.viewSetup(this.configuration.additionalViewModelModules)}}let s=null;function h(g,t,e){return s===null&&(s=new c(g,t,e)),s}export{c as FormEditor,h as getInstance}; diff --git a/Resources/Public/JavaScript/backend/form-editor/component/date-editor.js b/Resources/Public/JavaScript/backend/form-editor/component/date-editor.js new file mode 100644 index 0000000..477a1de --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/component/date-editor.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{LitElement as v,html as d,nothing as p}from"lit";import{property as g,state as r,customElement as $}from"lit/decorators.js";import o from"~labels/form.relative_date_editor";var n=function(u,t,e,s){var h=arguments.length,a=h<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,e):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")a=Reflect.decorate(u,t,e,s);else for(var m=u.length-1;m>=0;m--)(l=u[m])&&(a=(h<3?l(a):h>3?l(t,e,a):l(t,e))||a);return h>3&&a&&Object.defineProperty(t,e,a),a};class c extends Event{static{this.eventName="typo3:backend:form-editor:component:date-editor:change"}constructor(t){super(c.eventName),this.value=t}}let i=class extends v{constructor(){super(...arguments),this.mode="no",this.absoluteDate="",this.direction="-",this.amount=0,this.unit="years",this.customValue="",this.value="",this._absoluteDateRegex=null}get absoluteDateRegex(){return this._absoluteDateRegex||(this._absoluteDateRegex=new RegExp(this.absolutePattern)),this._absoluteDateRegex}firstUpdated(){if(!this.absolutePattern)throw new Error("typo3-form-date-editor: absolute-pattern attribute is required.");this.parseValue(this.value)}createRenderRoot(){return this}render(){return d`
      ${this.mode==="absolute"?this.renderAbsolute():p} ${this.mode==="relative"?this.renderRelative():p} ${this.mode==="custom"?this.renderCustom():p}`}renderAbsolute(){return d`
      `}renderRelative(){return d`
      `}renderCustom(){return d`
      `}parseValue(t){if(!t){this.mode="no";return}if(t.toLowerCase()==="today"){this.mode="today";return}if(this.absoluteDateRegex.test(t)){this.mode="absolute",this.absoluteDate=t;return}const e=t.match(/^([+-]?)\s*(\d+)\s+(days?|weeks?|months?|years?)$/i);if(e){this.mode="relative",this.direction=e[1]==="+"?"+":"-",this.amount=parseInt(e[2],10);const s=e[3].toLowerCase();this.unit=s.endsWith("s")?s:`${s}s`;return}this.mode="custom",this.customValue=t}composeValue(){switch(this.mode){case"today":return"today";case"absolute":return this.absoluteDate;case"relative":return this.amount===0?"":`${this.direction}${this.amount} ${this.unit}`;case"custom":return this.customValue.trim();default:return""}}emitChange(){const t=this.composeValue();this.value=t,this.dispatchEvent(new c(t))}handleModeChange(t){const e=t.target.value;if(e==="custom"&&this.mode==="relative"){const s=this.composeValue();s&&(this.customValue=s)}this.mode=e,this.mode==="relative"&&this.amount===0&&(this.amount=1),this.emitChange()}handleAbsoluteChange(t){this.absoluteDate=t.target.value,this.emitChange()}handleDirectionChange(t){this.direction=t.target.value,this.emitChange()}handleAmountChange(t){this.amount=parseInt(t.target.value,10)||0,this.emitChange()}handleUnitChange(t){this.unit=t.target.value,this.emitChange()}handleCustomChange(t){this.customValue=t.target.value,this.emitChange()}};n([g({type:String,attribute:"absolute-pattern"})],i.prototype,"absolutePattern",void 0),n([r()],i.prototype,"mode",void 0),n([r()],i.prototype,"absoluteDate",void 0),n([r()],i.prototype,"direction",void 0),n([r()],i.prototype,"amount",void 0),n([r()],i.prototype,"unit",void 0),n([r()],i.prototype,"customValue",void 0),i=n([$("typo3-form-date-editor")],i);export{i as DateEditor,c as DateEditorChangeEvent}; diff --git a/Resources/Public/JavaScript/backend/form-editor/component/form-element-selector.js b/Resources/Public/JavaScript/backend/form-editor/component/form-element-selector.js new file mode 100644 index 0000000..203ebad --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/component/form-element-selector.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{property as m,customElement as u}from"lit/decorators.js";import{LitElement as f,html as p,nothing as b}from"lit";var d=function(r,e,n,i){var s=arguments.length,t=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,n):i,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(r,e,n,i);else for(var c=r.length-1;c>=0;c--)(l=r[c])&&(t=(s<3?l(t):s>3?l(e,n,t):l(e,n))||t);return s>3&&t&&Object.defineProperty(e,n,t),t};class a extends Event{static{this.eventName="typo3:backend:form-editor:component:form-element-selector:selected"}constructor(e){super(a.eventName),this.value=e}}let o=class extends f{constructor(){super(...arguments),this.elements=[],this.size=""}createRenderRoot(){return this}render(){return this.elements?.length?p` `:p`${b}`}renderEntry(e){return p`
    1. this.onSelect(e.value)} href=# class=dropdown-item data-formelement-identifier=${e.value}> ${e.label}
    2. `}onSelect(e){this.dispatchEvent(new a(e))}};d([m({type:Array,attribute:"elements"})],o.prototype,"elements",void 0),d([m({type:String})],o.prototype,"size",void 0),o=d([u("typo3-form-element-selector")],o);export{o as FormElementSelector,a as FormElementSelectorSelectedEvent}; diff --git a/Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item-toolbar.js b/Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item-toolbar.js new file mode 100644 index 0000000..b741f20 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item-toolbar.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{LitElement as f,nothing as b,html as p}from"lit";import{property as n,customElement as v}from"lit/decorators.js";import c from"~labels/form.form_editor_javascript";import"@typo3/backend/element/icon-element.js";var o=function(l,e,r,a){var s=arguments.length,i=s<3?e:a===null?a=Object.getOwnPropertyDescriptor(e,r):a,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(l,e,r,a);else for(var m=l.length-1;m>=0;m--)(d=l[m])&&(i=(s<3?d(i):s>3?d(e,r,i):d(e,r))||i);return s>3&&i&&Object.defineProperty(e,r,i),i};let t=class extends f{constructor(){super(...arguments),this.active=!1,this.iconIdentifier="",this.elementType="",this.elementIdentifier="",this.isHidden=!1,this.isInvalid=!1}createRenderRoot(){return this}render(){return this.active?p`
      ${this.elementType}
      `:b}handleNewElementBefore(e){e.preventDefault(),this.dispatchEvent(new CustomEvent("toolbar-new-element-before",{bubbles:!0,composed:!0}))}handleNewElementAfter(e){e.preventDefault(),this.dispatchEvent(new CustomEvent("toolbar-new-element-after",{bubbles:!0,composed:!0}))}handleRemoveElement(e){e.preventDefault(),this.dispatchEvent(new CustomEvent("toolbar-remove-element",{bubbles:!0,composed:!0}))}};o([n({type:Boolean,reflect:!0})],t.prototype,"active",void 0),o([n({type:String,attribute:"icon-identifier"})],t.prototype,"iconIdentifier",void 0),o([n({type:String,attribute:"element-type"})],t.prototype,"elementType",void 0),o([n({type:String,attribute:"element-identifier"})],t.prototype,"elementIdentifier",void 0),o([n({type:Boolean,attribute:"is-hidden"})],t.prototype,"isHidden",void 0),o([n({type:Boolean,attribute:"is-invalid"})],t.prototype,"isInvalid",void 0),t=o([v("typo3-form-form-element-stage-item-toolbar")],t);export{t as FormElementStageItemToolbar}; diff --git a/Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item.js b/Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item.js new file mode 100644 index 0000000..9a7a911 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/component/form-element-stage-item.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{LitElement as c,html as s,nothing as f}from"lit";import{property as n,customElement as u}from"lit/decorators.js";import"@typo3/backend/element/icon-element.js";import"@typo3/form/backend/form-editor/component/form-element-stage-item-toolbar.js";import{stripTags as v}from"@typo3/form/backend/form-editor/utility/string-utility.js";var o=function(d,e,i,r){var a=arguments.length,l=a<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,i):r,m;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")l=Reflect.decorate(d,e,i,r);else for(var p=d.length-1;p>=0;p--)(m=d[p])&&(l=(a<3?m(l):a>3?m(e,i,l):m(e,i))||l);return a>3&&l&&Object.defineProperty(e,i,l),l};let t=class extends c{constructor(){super(...arguments),this.elementType="",this.elementIdentifier="",this.elementLabel="",this.elementIconIdentifier="",this.isRequired=!1,this.isHidden=!1,this.invalid=!1,this.validators=[],this.options=[]}createRenderRoot(){return this}render(){return s`
      ${v(this.elementLabel)} ${this.isRequired?s`*`:f}
      ${this.renderInfoContent()}
      ${this.renderValidators()}
      `}renderInfoContent(){const e=this.renderContentItems();return e.length?s`
      ${e}
      `:f}renderContentItems(){const e=[];if(this.content&&e.push(s`
      ${v(this.content)}
      `),this.options?.length){const i=this.options.map(r=>({label:r.label,className:r.selected?"selected":void 0}));e.push(this.renderMultivalue(i))}if(this.allowedMimeTypes?.length){const i=this.allowedMimeTypes.map(r=>({label:r}));e.push(this.renderMultivalue(i))}return e}renderMultivalue(e){return s`
      ${e.map(i=>s`
      ${i.label}
      `)}
      `}renderValidators(){return this.validators?.length?s`
      ${this.validators.map(e=>s`
      ${e.label}
      `)}
      `:f}};o([n({type:String,attribute:"element-type"})],t.prototype,"elementType",void 0),o([n({type:String,attribute:"element-identifier"})],t.prototype,"elementIdentifier",void 0),o([n({type:String,attribute:"element-label"})],t.prototype,"elementLabel",void 0),o([n({type:String,attribute:"element-icon-identifier"})],t.prototype,"elementIconIdentifier",void 0),o([n({type:Boolean,attribute:"is-required"})],t.prototype,"isRequired",void 0),o([n({type:Boolean,attribute:"is-hidden"})],t.prototype,"isHidden",void 0),o([n({type:Boolean,reflect:!0})],t.prototype,"invalid",void 0),o([n({type:Array})],t.prototype,"validators",void 0),o([n({type:Array})],t.prototype,"options",void 0),o([n({type:Array})],t.prototype,"allowedMimeTypes",void 0),o([n({type:String})],t.prototype,"content",void 0),t=o([u("typo3-form-form-element-stage-item")],t);export{t as FormElementStageItem}; diff --git a/Resources/Public/JavaScript/backend/form-editor/component/page-stage-item.js b/Resources/Public/JavaScript/backend/form-editor/component/page-stage-item.js new file mode 100644 index 0000000..d393b27 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/component/page-stage-item.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{LitElement as f,html as c}from"lit";import{property as s,customElement as g}from"lit/decorators.js";import u from"~labels/form.form_editor_javascript";var a=function(o,e,r,p){var i=arguments.length,t=i<3?e:p===null?p=Object.getOwnPropertyDescriptor(e,r):p,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(o,e,r,p);else for(var m=o.length-1;m>=0;m--)(l=o[m])&&(t=(i<3?l(t):i>3?l(e,r,t):l(e,r))||t);return i>3&&t&&Object.defineProperty(e,r,t),t};let n=class extends f{constructor(){super(...arguments),this.pageTitle=""}createRenderRoot(){return this}render(){const e=this.pageTitle||u.get("formEditor.step.name.empty");return c`

      ${e}

      `}};a([s({type:String,attribute:"page-title"})],n.prototype,"pageTitle",void 0),n=a([g("typo3-form-page-stage-item")],n);export{n as PageStageItem}; diff --git a/Resources/Public/JavaScript/backend/form-editor/component/property-grid-editor.js b/Resources/Public/JavaScript/backend/form-editor/component/property-grid-editor.js new file mode 100644 index 0000000..9024963 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/component/property-grid-editor.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{LitElement as f,html as d,nothing as h}from"lit";import{repeat as v}from"lit/directives/repeat.js";import{classMap as g}from"lit/directives/class-map.js";import{live as b}from"lit/directives/live.js";import{property as s,state as u,customElement as y}from"lit/decorators.js";import"@typo3/backend/element/icon-element.js";import"@typo3/form/backend/form-editor/component/form-element-selector.js";var a=function(p,e,t,l){var i=arguments.length,o=i<3?e:l===null?l=Object.getOwnPropertyDescriptor(e,t):l,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(p,e,t,l);else for(var c=p.length-1;c>=0;c--)(r=p[c])&&(o=(i<3?r(o):i>3?r(e,t,o):r(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o};class m extends Event{static{this.eventName="typo3:backend:form-editor:component:property-grid-editor:update"}constructor(e){super(m.eventName),this.data=e}}let n=class extends f{constructor(){super(...arguments),this.entries=[],this.formElements=[],this.labelLabel="Label",this.labelValue="Value",this.labelSelected="Selected",this.labelAdd="Add",this.labelRemove="Remove",this.labelMove="Move",this.enableAddRow=!1,this.enableDeleteRow=!1,this.enableSelection=!0,this.enableMultiSelection=!1,this.enableSorting=!1,this.enableLabelAsFallbackValue=!1,this.enableLabelFormElementSelectionButton=!1,this.enableValueFormElementSelectionButton=!1,this.draggedEntry=null,this.movedEntry=null,this.activeElementRef=null}createRenderRoot(){return this}updated(e){if(this.activeElementRef&&(this.activeElementRef.focus(),this.activeElementRef=null),e.has("entries")){const t=e.get("entries");t!==void 0&&JSON.stringify(t)!==JSON.stringify(this.entries)&&this.dispatchEvent(new m(this.entries))}}render(){return d`
      ${this.entries?.length?d`
      ${v(this.entries,e=>e.id,e=>this.renderEntry(e))}
      `:h} ${this.enableAddRow?d`
      `:h}
      `}renderEntry(e){return d`
      this.handleDragOver(t)} @dragenter=${t=>this.handleDragEnter(t,e)} @drop=${t=>this.handleDrop(t)} @dragend=${t=>this.handleDragEnd(t)}>
      this.handleChange(t,"label",e)} @keyup=${t=>this.handleChange(t,"label",e)} @focusout=${()=>this.handleFocusOut(e)} .value=${b(e.label)}> ${this.renderFormElementSelectionButton(this.enableLabelFormElementSelectionButton,"label",e)}
      this.handleChange(t,"value",e)} @keyup=${t=>this.handleChange(t,"value",e)} .value=${b(e.value)}> ${this.renderFormElementSelectionButton(this.enableValueFormElementSelectionButton,"value",e)}
      ${this.enableSelection||this.enableMultiSelection?d`
      this.handleChange(t,"selected",e)} .checked=${b(e.selected)}>
      `:h}
      ${this.enableSorting||this.enableDeleteRow?d`
      ${this.enableSorting?d``:h} ${this.enableDeleteRow?d``:h}
      `:h}
      `}renderFormElementSelectionButton(e,t,l){return!e||!this.formElements?.length?d`${h}`:d`this.handleFormElementSelection(i,t,l)} elements=${JSON.stringify(this.formElements)} size=small>`}handleFormElementSelection(e,t,l){const i=l[t];i?this.setEntryProperty(l,t,`${i} {${e.value}}`):this.setEntryProperty(l,t,`{${e.value}}`)}handleFocusOut(e){this.enableLabelAsFallbackValue&&e.value===""&&this.setEntryProperty(e,"value",e.label)}handleChange(e,t,l){const i=e.target,o=i.type==="checkbox"?i.checked:i.value;this.setEntryProperty(l,t,o)}handleRemove(e){this.entries=this.entries.filter(t=>t!==e)}handleCreate(){const e={id:"fe"+Math.floor(Math.random()*42)+Date.now(),label:"",value:"",selected:!1};this.entries=[...this.entries,e]}handleDragStart(e,t){e.stopImmediatePropagation(),this.draggedEntry=t,e.dataTransfer?.setData("text/plain","dragging"),e.dataTransfer?.setDragImage(new Image,0,0)}handleDragOver(e){e.preventDefault(),e.stopImmediatePropagation()}handleDragEnter(e,t){if(e.preventDefault(),e.stopImmediatePropagation(),!this.draggedEntry||this.draggedEntry===t)return;const l=[...this.entries],i=l.indexOf(this.draggedEntry),o=l.indexOf(t);l.splice(i,1);const r=(i=i.length)return;i.splice(o,1);const c=(oc===i?o:{...r,selected:!1});return}this.entries=this.entries.map((r,c)=>c===i?o:r)}};a([s({type:Array,attribute:"entries"})],n.prototype,"entries",void 0),a([s({type:Array,attribute:"form-elements"})],n.prototype,"formElements",void 0),a([s({type:String,attribute:"label-label"})],n.prototype,"labelLabel",void 0),a([s({type:String,attribute:"label-value"})],n.prototype,"labelValue",void 0),a([s({type:String,attribute:"label-selected"})],n.prototype,"labelSelected",void 0),a([s({type:String,attribute:"label-add"})],n.prototype,"labelAdd",void 0),a([s({type:String,attribute:"label-remove"})],n.prototype,"labelRemove",void 0),a([s({type:String,attribute:"label-move"})],n.prototype,"labelMove",void 0),a([s({type:Boolean})],n.prototype,"enableAddRow",void 0),a([s({type:Boolean})],n.prototype,"enableDeleteRow",void 0),a([s({type:Boolean})],n.prototype,"enableSelection",void 0),a([s({type:Boolean})],n.prototype,"enableMultiSelection",void 0),a([s({type:Boolean})],n.prototype,"enableSorting",void 0),a([s({type:Boolean})],n.prototype,"enableLabelAsFallbackValue",void 0),a([s({type:Boolean})],n.prototype,"enableLabelFormElementSelectionButton",void 0),a([s({type:Boolean})],n.prototype,"enableValueFormElementSelectionButton",void 0),a([u()],n.prototype,"draggedEntry",void 0),a([u()],n.prototype,"movedEntry",void 0),n=a([y("typo3-form-property-grid-editor")],n);export{n as PropertyGridEditor,m as PropertyGridEditorUpdateEvent}; diff --git a/Resources/Public/JavaScript/backend/form-editor/core.js b/Resources/Public/JavaScript/backend/form-editor/core.js new file mode 100644 index 0000000..de0b17a --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/core.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import D from"@typo3/core/ajax/ajax-request.js";import{AjaxResponse as P}from"@typo3/core/ajax/ajax-response.js";import{cloneDeep as R}from"lodash-es";function a(c,e,t){if(typeof c=="function"&&(c=c()!==!1),!c)throw e=e||"Assertion failed",t&&(e=e+" ("+t+")"),typeof Error<"u"?new Error(e):e}class O{assert(e,t,r){a(e,t,r)}isUndefinedOrNull(e){return e==null}isNonEmptyArray(e){return Array.isArray(e)&&e.length>0}isNonEmptyString(e){return typeof e=="string"&&e.length>0}canBeInterpretedAsInteger(e){if(typeof e=="number")return!0;if(typeof e!="string")return!1;const t=e;return(t*1).toString()===t.toString()&&t.toString().indexOf(".")===-1}buildPropertyPath(e,t,r,i,n){let o="";return n=!!n,this.isNonEmptyString(t)||this.isNonEmptyString(r)?(a(this.isNonEmptyString(t),'Invalid parameter "collectionElementIdentifier"',1475412569),a(this.isNonEmptyString(r),'Invalid parameter "collectionName"',1475412570),o=r+"."+C.getIndexFromPropertyCollectionElementByIdentifier(t,r,i)):o="",this.isUndefinedOrNull(e)||(a(this.isNonEmptyString(e),'Invalid parameter "propertyPath"',1475415988),this.isNonEmptyString(o)?o=o+"."+e:o=e),n||a(this.isNonEmptyString(o),"The property path could not be resolved",1475663210),o}convertToSimpleObject(e){a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1475377782);const t={},r="getObjectData"in e&&typeof e.getObjectData=="function"?e.getObjectData():e,i=r.renderables;delete r.renderables;for(const[n,o]of Object.entries(r))n.match(/^__/)||(o!==null&&typeof o=="object"&&!Array.isArray(o)?t[n]=this.convertToSimpleObject(o):typeof o!="function"&&typeof o<"u"&&(t[n]=o));if(Array.isArray(i)){t.renderables=[];for(let n=0,o=i.length;n-1||(i[o]=n[r][o]);n[r]=i,u().setCurrentState("propertyValidationServiceRegisteredValidators",n)}removeAllValidatorIdentifiersFromFormElement(e){a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1475668189);const t={},r=u().getCurrentState("propertyValidationServiceRegisteredValidators");for(const i of Object.keys(r||{}))i===e.get("__identifierPath")||i.indexOf(e.get("__identifierPath")+"/")>-1||(t[i]=r[i]);u().setCurrentState("propertyValidationServiceRegisteredValidators",t)}addValidator(e,t){a(l.isNonEmptyString(e),'Invalid parameter "validatorIdentifier"',1475669143),a(typeof t=="function",'Invalid parameter "func"',1475669144),a(typeof this.validators[e]!="function",'The validator "'+e+'" is already registered',1475669145),this.validators[e]=t}validateFormElementProperty(e,t){let r;a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1475676517),a(l.isNonEmptyString(t),'Invalid parameter "propertyPath"',1475676518);const i=e.get("__identifierPath"),n=[],o=u().getCurrentState("propertyValidationServiceRegisteredValidators");if(r={propertyValidatorsMode:"AND"},!l.isUndefinedOrNull(o[i])&&typeof o[i][t]=="object"&&o[i][t]!==null&&!Array.isArray(o[i][t])&&Array.isArray(o[i][t].validators)){r=o[i][t].configuration;const s=o[i][t].validators,d=[],p=[];let y=0;for(let I=0,h=s.length;I0&&d.length!==y||n.push(...d),n.push(...p)}return n}validateFormElement(e){a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1475749668);const t=e.get("__identifierPath"),r=[],i=u().getCurrentState("propertyValidationServiceRegisteredValidators");if(!l.isUndefinedOrNull(i[t]))for(const n of Object.keys(i[t]))r.push({propertyPath:n,validationResults:this.validateFormElementProperty(e,n)});return r}validationResultsHasErrors(e){a(Array.isArray(e),'Invalid parameter "validationResults"',1478613477);for(let t=0,r=e.length;t0)return!0;return!1}validateFormElementRecursive(e,t,r){if(a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1475756764),t=!!t,r=r||[],r.push({formElementIdentifierPath:e.get("__identifierPath"),validationResults:this.validateFormElement(e)}),t&&this.validationResultsHasErrors(r))return r;const i=e.get("renderables");if(Array.isArray(i)){for(let n=0,o=i.length;no===null||typeof o!="object"))c.on(t,"core/formElement/somePropertyChanged"),c.set(t,e,r);else for(const o of Object.keys(i)){const s=t===""?o:t+"."+o;c.on(s,"core/formElement/somePropertyChanged"),i[o]!==null&&(typeof i[o]=="object"||Array.isArray(i[o]))?S(c,i[o],s,r):c.set(s,i[o],r)}}}class N{constructor(){this.objectData={},this.publisherTopics={}}get(e){let t,r;for(a(l.isNonEmptyString(e),'Invalid parameter "key"',1475361755),r=this.objectData;e.indexOf(".")>0;){if(t=e.slice(0,e.indexOf(".")),e=e.slice(t.length+1),!(t in r))return;r=r[t]}return r[e]}set(e,t,r){let i,n,o,s,d;a(l.isNonEmptyString(e),'Invalid parameter "key"',1475361756),r=!!r;const p=this.get(e);for(d=this.objectData,i=e;i.indexOf(".")>0;)n=i.slice(0,i.indexOf(".")),i=i.slice(n.length+1),isNaN(Number(n))||(n=parseInt(n,10)),s=i.indexOf("."),o=s===-1?i:i.slice(0,s),typeof d[n]>"u"?isNaN(Number(o))?d[n]={}:d[n]=[]:isNaN(Number(o))&&Array.isArray(d[n])&&(d[n]={...d[n]}),d=d[n];if(d[i]=t,!l.isUndefinedOrNull(this.publisherTopics[e])&&!r)for(let y=0,g=this.publisherTopics[e].length;y0?(i=e.split("."),n=i.pop(),i=i.join("."),r=this.get(i),typeof r<"u"&&delete r[n]):a(!1,"remove toplevel properties is not supported",1489319753),!l.isUndefinedOrNull(this.publisherTopics[e])&&!t)for(let s=0,d=this.publisherTopics[e].length;st!==r))}getObjectData(){return R(this.objectData)}toString(){const e=this.getObjectData(),{renderables:t,__parentRenderable:r,...i}=e,n=t||null;let o=null;l.isUndefinedOrNull(r)||(o=r.getObjectData().__identifierPath+" (filtered)");const s=i;if(o!==null&&(s.__parentRenderable=o),n!==null&&Array.isArray(n)){const d=[];for(let p=0,y=n.length;p{a(typeof g=="object"&&g!==null&&!Array.isArray(g),'Invalid parameter "formElement"',1475364961),a(l.isNonEmptyString(I),'Invalid parameter "pathPrefix"',1475364962);const h=g.get("__identifierPath"),f=I+"/"+g.get("identifier"),v=u().getCurrentState("propertyValidationServiceRegisteredValidators");l.isUndefinedOrNull(v[h])||(v[f]=v[h],delete v[h]),u().setCurrentState("propertyValidationServiceRegisteredValidators",v),g.set("__identifierPath",f,i);const m=g.get("renderables");if(Array.isArray(m))for(let b=0,F=m.length;b{a(typeof r=="object"&&r!==null&&!Array.isArray(r),'Invalid parameter "formElement"',1475364961);const i=this.getFormEditorDefinition("formElements",r.get("type"));!i._isTopLevelFormElement&&!i._isCompositeFormElement&&e.push(r);const n=r.get("renderables");if(Array.isArray(n))for(let o=0,s=n.length;o{let n;if(i.get("identifier")===e&&(t=!0),!t&&(n=i.get("renderables"),Array.isArray(n)))for(let o=0,s=n.length;o0&&(F=p[f][m-1].identifier),C.addPropertyCollectionElement(L,f,h,F,!0),++m}}if(Array.isArray(s.editors))for(const f of s.editors)f.propertyPath&&h.on(f.propertyPath,"core/formElement/somePropertyChanged");if(i&&Array.isArray(s.editors))for(let f=0,v=s.editors.length;f{if(_.saveForm!==e)return;_.saveForm=null;const r=await t.resolve();r.status==="success"?A.publish("core/ajax/saveFormDefinition/success",[r]):A.publish("core/ajax/saveFormDefinition/error",[r])}).catch(async t=>{if(t instanceof P){const r=await t.resolve();A.publish("core/ajax/error",[t.response.statusText,r])}})}renderFormDefinitionPage(e){a(!isNaN(Number(e)),'Invalid parameter "pageIndex"',1475377781),a(l.isNonEmptyString(this.endpoints.formPageRenderer),'The endpoint "formPageRenderer" is not configured',1473447677),_.renderFormDefinitionPage&&_.renderFormDefinitionPage.abort();const t=new D(this.endpoints.formPageRenderer);_.renderFormDefinitionPage=t,t.post({formDefinition:JSON.stringify(l.convertToSimpleObject(u().getCurrentState("formDefinition"))),pageIndex:e,prototypeName:this.prototypeName,formPersistenceIdentifier:this.persistenceIdentifier}).then(async r=>{if(_.renderFormDefinitionPage!==t)return;_.renderFormDefinitionPage=null;const i=await r.resolve();A.publish("core/ajax/renderFormDefinitionPage/success",[i,e])}).catch(async r=>{if(r instanceof P){const i=await r.resolve();A.publish("core/ajax/error",[r.response.statusText,i])}})}}class x{constructor(){this.stackSize=10,this.stackPointer=0,this.stack=[]}add(e,t){a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "applicationState"',1477847415),t=!!t,Object.assign(e,{propertyValidationServiceRegisteredValidators:R(this.getCurrentState("propertyValidationServiceRegisteredValidators")??{})}),this.stack.splice(0,0,e),this.stack.length>this.stackSize&&this.stack.splice(this.stackSize-1,this.stack.length-this.stackSize),t||A.publish("core/applicationState/add",[e,this.getCurrentStackPointer(),this.getCurrentStackSize()])}addAndReset(e,t){a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "applicationState"',1477872641),this.stackPointer>0&&this.stack.splice(0,this.stackPointer),this.stackPointer=0,this.add(e,!0),t||A.publish("core/applicationState/add",[this.getCurrentState(),this.getCurrentStackPointer(),this.getCurrentStackSize()])}getCurrentState(e){if(e===void 0)return this.stack[this.stackPointer]||void 0;if(a(e==="formDefinition"||e==="currentlySelectedPageIndex"||e==="currentlySelectedFormElementIdentifierPath"||e==="propertyValidationServiceRegisteredValidators",'Invalid parameter "type"',1477932754),!(typeof this.stack[this.stackPointer]>"u"))return this.stack[this.stackPointer][e]}setCurrentState(e,t){a(e==="formDefinition"||e==="currentlySelectedPageIndex"||e==="currentlySelectedFormElementIdentifierPath"||e==="propertyValidationServiceRegisteredValidators",'Invalid parameter "type"',1477934111),this.stack[this.stackPointer][e]=t}setMaximalStackSize(e){a(typeof e=="number",'Invalid parameter "size"',1477846933),this.stackSize=e}getMaximalStackSize(){return this.stackSize}getCurrentStackSize(){return this.stack.length}getCurrentStackPointer(){return this.stackPointer}setCurrentStackPointer(e){a(typeof e=="number",'Invalid parameter "size"',1477852138),e<0?this.stackPointer=0:e>this.stack.length-1?this.stackPointer=this.stack.length-1:this.stackPointer=e}decrementCurrentStackPointer(){this.setCurrentStackPointer(--this.stackPointer)}incrementCurrentStackPointer(){this.setCurrentStackPointer(++this.stackPointer)}}function M(c){return a(l.isNonEmptyString(c),'Invalid parameter "ajaxRequestIdentifier"',1475358064),_[c]||null}const l=new O,W=new E,_={},j=new k,q=new x,A=new T,C=new w,J=new U;function H(){return l}function G(){return W}function K(){return j}function u(){return q}function Q(){return A}function X(){return J}function Y(){return C}export{x as ApplicationStateStack,E as DataBackend,U as Factory,N as Model,k as PropertyValidationService,T as PublisherSubscriber,w as Repository,O as Utility,a as assert,u as getApplicationStateStack,G as getDataBackend,X as getFactory,K as getPropertyValidationService,Q as getPublisherSubscriber,Y as getRepository,M as getRunningAjaxRequest,H as getUtility}; diff --git a/Resources/Public/JavaScript/backend/form-editor/helper.js b/Resources/Public/JavaScript/backend/form-editor/helper.js new file mode 100644 index 0000000..616961a --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/helper.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{merge as E}from"lodash-es";let d=null,r=null;const p={domElementClassNames:{active:"active",buttonCollectionElementRemove:"formeditor-inspector-collection-element-remove-button",buttonFormEditor:"formeditor-button",disabled:"disabled",hidden:"hidden",icon:"formeditor-icon",sortableHover:"sortable-hover"},domElementDataAttributeNames:{elementIdentifier:"data-element-identifier-path",identifier:"data-identifier",template:"data-template-name",templateProperty:"data-template-property"},domElementSelectorPattern:{bracesWithKey:"[{0}]",bracesWithKeyValue:'[{0}="{1}"]',class:".{0}",id:"#{0}",keyValue:'{0}="{1}"'}};function s(){return d}function l(){return s().getUtility()}function a(e,n,t){return s().assert(e,n,t)}function b(e){return a(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "partialConfiguration"',1478950623),r=E({},p,e),this}function c(e,n){let t;a(!l().isUndefinedOrNull(r.domElementSelectorPattern[e]),'Invalid parameter "patternIdentifier" ('+e+")",1478801251),a(Array.isArray(n),'Invalid parameter "replacements"',1478801252),t=r.domElementSelectorPattern[e];for(let m=0,f=n.length;mnull),ge={domElementClassNames:{buttonFormElementRemove:"formeditor-inspector-element-remove-button",collectionElement:"formeditor-inspector-collection-element",finisherEditorPrefix:"t3-form-inspector-finishers-editor-",inspectorEditor:"formeditor-inspector-element",inspectorInputGroup:"input-group",sortable:"sortable",validatorEditorPrefix:"formeditor-inspector-validators-editor-"},domElementDataAttributeNames:{contentElementSelectorTarget:"data-insert-target",finisher:"data-finisher-identifier",validator:"data-validator-identifier",randomId:"data-random-id",randomIdTarget:"data-random-id-attribute",randomIdIndex:"data-random-id-number",maximumFileSize:"data-maximumFileSize"},domElementDataAttributeValues:{collapse:"actions-view-table-expand",editorControlsInputGroup:"inspectorEditorControlsGroup",editorWrapper:"editorWrapper",editorControlsWrapper:"inspectorEditorControlsWrapper",formElementHeaderEditor:"inspectorFormElementHeaderEditor",formElementSelectorControlsWrapper:"inspectorEditorFormElementSelectorControlsWrapper",formElementSelectorSplitButtonContainer:"inspectorEditorFormElementSelectorSplitButtonContainer",formElementSelectorSplitButtonListContainer:"inspectorEditorFormElementSelectorSplitButtonListContainer",iconNotAvailable:"actions-close",inspector:"inspector","Inspector-CheckboxEditor":"Inspector-CheckboxEditor","Inspector-CollectionElementHeaderEditor":"Inspector-CollectionElementHeaderEditor","Inspector-FinishersEditor":"Inspector-FinishersEditor","Inspector-FormElementHeaderEditor":"Inspector-FormElementHeaderEditor","Inspector-PropertyGridEditor":"Inspector-PropertyGridEditor","Inspector-RemoveElementEditor":"Inspector-RemoveElementEditor","Inspector-RequiredValidatorEditor":"Inspector-RequiredValidatorEditor","Inspector-SingleSelectEditor":"Inspector-SingleSelectEditor","Inspector-MultiSelectEditor":"Inspector-MultiSelectEditor","Inspector-GridColumnViewPortConfigurationEditor":"Inspector-GridColumnViewPortConfigurationEditor","Inspector-TextareaEditor":"Inspector-TextareaEditor","Inspector-TextEditor":"Inspector-TextEditor","Inspector-Typo3WinBrowserEditor":"Inspector-Typo3WinBrowserEditor","Inspector-ValidatorsEditor":"Inspector-ValidatorsEditor","Inspector-ValidationErrorMessageEditor":"Inspector-ValidationErrorMessageEditor","Inspector-DateEditor":"Inspector-DateEditor",inspectorFinishers:"inspectorFinishers",inspectorValidators:"inspectorValidators",viewportButton:"viewportButton"},domElementIdNames:{finisherPrefix:"t3-form-inspector-finishers-",validatorPrefix:"t3-form-inspector-validators-"},isSortable:!0};let j=null,U=null;function v(){return U}function D(){return v().getViewModel()}function o(e){return d().isUndefinedOrNull(e)?M.setConfiguration(j):M.setConfiguration(e)}function d(){return v().getUtility()}function p(e,t,r){return v().assert(e,t,r)}function Ae(){return v().getRootFormElement()}function E(){return v().getCurrentlySelectedFormElement()}function w(){return v().getPublisherSubscriber()}function N(e,t){return v().getFormElementDefinition(e,t)}const Ie={ALLOWED_TAGS:["abbr","b","br","code","em","i","kbd","span","strong","u"],ALLOWED_ATTR:["class","title","role"]},Se={ALLOWED_TAGS:["a","abbr","blockquote","b","br","code","em","i","kbd","li","p","pre","span","strong","u","ul","ol"],ALLOWED_ATTR:["class","href","title","target","role","rel"]};function P(e,t){e&&(e.innerHTML=_.sanitize(t,Ie))}function q(e,t){e&&(e.innerHTML=_.sanitize(t,Se))}function G(e,t,r,l){switch(e.templateName){case"Inspector-FormElementHeaderEditor":J(e,t);break;case"Inspector-CollectionElementHeaderEditor":Q(e,t,r,l);break;case"Inspector-MaximumFileSizeEditor":X(e,t);break;case"Inspector-TextEditor":Z(e,t,r,l);break;case"Inspector-FinishersEditor":W("finishers",e,t);break;case"Inspector-ValidatorsEditor":W("validators",e,t);break;case"Inspector-ValidationErrorMessageEditor":C(e,t);break;case"Inspector-RemoveElementEditor":pe(e,t,r,l);break;case"Inspector-RequiredValidatorEditor":ae(e,t,r,l);break;case"Inspector-CheckboxEditor":se(e,t,r,l);break;case"Inspector-CountrySelectEditor":H(e,t,r,l);break;case"Inspector-CountrySingleSelectEditor":ee(e,t,r,l);break;case"Inspector-SingleSelectEditor":te(e,t,r,l);break;case"Inspector-MultiSelectEditor":re(e,t,r,l);break;case"Inspector-GridColumnViewPortConfigurationEditor":ne(e,t);break;case"Inspector-PropertyGridEditor":le(e,t,r,l);break;case"Inspector-TextareaEditor":oe(e,t,r,l);break;case"Inspector-Typo3WinBrowserEditor":ie(e,t,r,l);break;case"Inspector-DateEditor":ue(e,t,r,l);break;default:break}w().publish("view/inspector/editor/insert/perform",[e,t,r,l])}function Te(e,t,r){const l=new URLSearchParams({mode:e,fieldReference:t,allowedTypes:r});V.advanced({type:V.types.iframe,content:TYPO3.settings.FormEditor.typo3WinBrowserUrl+"&"+l.toString(),size:V.sizes.large})}let z=!1;function Oe(){z||(z=!0,window.addEventListener("message",function(e){if(!Ee.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;if(e.data.actionName==="typo3:elementBrowser:elementAdded"){if(typeof e.data.fieldName>"u")throw"fieldName not defined in message";if(typeof e.data.value>"u")throw"value not defined in message";const t=e.data.value.split("_"),r=document.querySelector(o().getDomElementDataAttribute("contentElementSelectorTarget","bracesWithKeyValue",[e.data.fieldName]));if(r){const l=t.pop()??"",n=Number(r.dataset.maxItems??1);if(n===1)r.value=l;else{const s=r.value.split(",").filter(c=>c!=="");l!==""&&!s.includes(l)&&s.length0){let m=a?.id??"";m||(m="validation-error-"+Math.random().toString(36).substring(2,9),a&&(a.id=m)),a&&(a.innerHTML=' '+n[0]+"",a.setAttribute("role","alert")),i&&(i.setAttribute("aria-invalid","true"),i.setAttribute("aria-describedby",m)),D().setElementValidationErrorClass(L(t),"hasError")}else a&&(a.innerHTML="",a.removeAttribute("role")),i&&(i.removeAttribute("aria-invalid"),i.removeAttribute("aria-describedby")),D().removeElementValidationErrorClass(L(t),"hasError");n=v().validateFormElement(E()),l=e.split("."),l=l[0]+"."+l[1],r=!1;for(let m=0,u=n.length;m0){r=!0;break}r?D().setElementValidationErrorClass(c):D().removeElementValidationErrorClass(c)}function Y(e,t){p(Array.isArray(e),'Invalid configuration "errorCodes"',1489932939),p(Array.isArray(t),'Invalid configuration "propertyData"',1489932940);for(let r=0,l=e.length;r0&&s.editors[0].identifier==="header"&&(l=document.createElement("div"),l.classList.add("panel-body"),r=document.createElement("div"),r.classList.add("panel-collapse","collapse"),r.id=R(e,t),r.appendChild(l));for(let i=0;i0&&r?l.append(y):c.append(y),$(y),G(s.editors[i],y,t,e)}(a===2&&s.editors[0].identifier==="header"&&s.editors[1].identifier==="removeButton"||a===1&&s.editors[0].identifier==="header")&&c.querySelector(o().getDomElementDataIdentifierSelector("collapse"))?.remove(),j.isSortable&&n&&Ne(n,e)}function W(e,t,r){let l,n,s;p(d().isNonEmptyString(e),'Invalid configuration "collectionName"',1478362968),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorConfiguration"',1475423098),p(typeof r=="object"&&r!==null&&!Array.isArray(r),'Invalid parameter "editorHtml"',1475423099),p(d().isNonEmptyString(t.label),'Invalid configuration "label"',1475423100),p(Array.isArray(t.selectOptions),'Invalid configuration "selectOptions"',1475423101),e==="finishers"?(n=x(),l=Ae().get(e)):(n=F(),l=E().get(e)),n?.replaceChildren();const c=o().getTemplatePropertyElement("label",r);P(c,t.label);const a=o().getTemplatePropertyElement("selectOptions",r),i=!d().isUndefinedOrNull(l)&&l.length>0;if(i)for(let m=0,u=l.length;ma.remove());const n=o().getTemplatePropertyElement("numbersOfColumnsToUse",t)?.cloneNode(!0);o().getTemplatePropertyElement("numbersOfColumnsToUse",t)?.remove();const s=L(t),c=function(a){o().getTemplatePropertyElement("numbersOfColumnsToUse",t)?.replaceChildren(),o().getTemplatePropertyElement("numbersOfColumnsToUse",t)?.remove();const i=n?.cloneNode(!0);K(t)?.after(i),i?.querySelector("input")?.focus();const m=o().getTemplatePropertyElement("numbersOfColumnsToUse-label",i);m&&P(m,e.configurationOptions.numbersOfColumnsToUse.label.replace("{@viewPortLabel}",a.dataset.viewPortLabel??""));const u=o().getTemplatePropertyElement("numbersOfColumnsToUse-description",i);u&&q(u,e.configurationOptions.numbersOfColumnsToUse.description);const y=e.configurationOptions.numbersOfColumnsToUse.propertyPath.replace("{@viewPortIdentifier}",a.dataset.viewPortIdentifier??""),b=o().getTemplatePropertyElement("numbersOfColumnsToUse-propertyPath",i);if(b){let f=function(){(this.value===""||isNaN(Number(this.value)))&&(this.value=""),E().set(y,this.value)};b.value=E().get(y)??"",b.addEventListener("keyup",f),b.addEventListener("paste",f),b.addEventListener("change",f)}};for(let a=0,i=e.configurationOptions.viewPorts.length;a{a.addEventListener("click",function(){s.querySelectorAll("button").forEach(i=>i.classList.remove(o().getDomElementClassName("active"))),this.classList.add(o().getDomElementClassName("active")),c(this)})})}function le(e,t,r,l){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1475419226),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1475419227),p(typeof e.enableAddRow=="boolean",'Invalid configuration "enableAddRow"',1475419228),p(typeof e.enableDeleteRow=="boolean",'Invalid configuration "enableDeleteRow"',1475419230),p(typeof e.isSortable=="boolean",'Invalid configuration "isSortable"',1475419229),p(d().isNonEmptyString(e.propertyPath),'Invalid configuration "propertyPath"',1475419231),p(d().isNonEmptyString(e.label),'Invalid configuration "label"',1475419232),P(o().getTemplatePropertyElement("label",t),e.label),I(e,t);const n=(()=>{const y=v().buildPropertyPath(void 0,r,l,void 0,!0);return d().isNonEmptyString(y)?y+".":y})(),s=d().isUndefinedOrNull(e.multiSelection)?!1:!!e.multiSelection,c=d().isNonEmptyArray(e.gridColumns)?e.gridColumns.some(y=>y.name==="selected"):!0,a=(()=>{const y=E().get(n+"defaultValue");return d().isUndefinedOrNull(y)?{}:s?y:{0:y}})(),i=(()=>{const y=E(),b=n+e.propertyPath,f=y.get(b)||{};let A;return Array.isArray(f)?A=f.map((h,S)=>({id:"fe"+Math.floor(Math.random()*42)+Date.now(),label:d().isUndefinedOrNull(h._label)?h:h._label,value:d().isUndefinedOrNull(h._label)?S:h._value,selected:!1})):typeof f=="object"&&(A=Object.entries(f).map(([h,S])=>({id:"fe"+Math.floor(Math.random()*42)+Date.now(),label:S,value:h,selected:!1}))),A.map(h=>{for(const S of Object.keys(a))if(a[S]===h.value){h.selected=!0;break}return h})})(),m=d().isUndefinedOrNull(e.useLabelAsFallbackValue)?!0:e.useLabelAsFallbackValue,u=t.querySelector("typo3-form-property-grid-editor");u.enableAddRow=e.enableAddRow,u.enableSelection=c,u.enableMultiSelection=s,u.enableSorting=e.isSortable??!1,u.enableDeleteRow=e.enableDeleteRow??!1,u.enableLabelAsFallbackValue=m,u.entries=i,d().isNonEmptyArray(e.gridColumns)&&e.gridColumns.forEach(y=>{y.name==="label"&&(u.labelLabel=y.title,u.enableLabelFormElementSelectionButton=y.enableFormelementSelectionButton),y.name==="value"&&(u.labelValue=y.title,u.enableValueFormElementSelectionButton=y.enableFormelementSelectionButton),y.name==="selected"&&(u.labelSelected=y.title)}),(u.enableLabelFormElementSelectionButton||u.enableValueFormElementSelectionButton)&&(u.formElements=me()),u.addEventListener(fe.eventName,y=>{const b=y.data,f=[],A=[];for(const h of b){const S=h.label,O=h.value===""?h.label:d().canBeInterpretedAsInteger(h.value)?parseInt(h.value,10):h.value;h.selected&&f.push(O),A.push({_label:S,_value:O})}s?E().set(n+"defaultValue",f):E().set(n+"defaultValue",f[0]??"",!0),E().set(n+e.propertyPath,A),g(n+e.propertyPath,t)}),g(n+e.propertyPath,t)}function ae(e,t,r,l){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1475417093),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1475417094),p(d().isNonEmptyString(e.validatorIdentifier),'Invalid configuration "validatorIdentifier"',1475417095),p(d().isNonEmptyString(e.label),'Invalid configuration "label"',1475417096);const n=e.validatorIdentifier;P(o().getTemplatePropertyElement("label",t),e.label);let s,c,a;d().isNonEmptyString(e.propertyPath)&&(c=v().buildPropertyPath(e.propertyPath,r,l)),d().isNonEmptyString(e.propertyValue)?s=e.propertyValue:s="";const i=v().buildPropertyPath(e.configurationOptions.validationErrorMessage.propertyPath),m=o().getTemplatePropertyElement("validationErrorMessage",t),u=m?.cloneNode(!0);m?.remove();const y=function(){const f=u?.cloneNode(!0);K(t)?.after(f),P(o().getTemplatePropertyElement("validationErrorMessage-label",f),e.configurationOptions.validationErrorMessage.label),q(o().getTemplatePropertyElement("validationErrorMessage-description",f),e.configurationOptions.validationErrorMessage.description),a=E().get(i),d().isUndefinedOrNull(a)&&(a=[]);const A=Y(e.configurationOptions.validationErrorMessage.errorCodes,a),h=o().getTemplatePropertyElement("validationErrorMessage-propertyPath",f);!d().isUndefinedOrNull(A)&&h&&(h.value=A),h?.addEventListener("keyup",S),h?.addEventListener("paste",S);function S(){let O=E().get(i);d().isUndefinedOrNull(O)&&(O=[]),E().set(i,B(e.configurationOptions.validationErrorMessage.errorCodes,O,this.value))}},b=t.querySelector('input[type="checkbox"]');v().getIndexFromPropertyCollectionElement(n,"validators")!==-1&&(b&&(b.checked=!0),y()),b?.addEventListener("change",function(){o().getTemplatePropertyElement("validationErrorMessage",t)?.replaceChildren(),o().getTemplatePropertyElement("validationErrorMessage",t)?.remove(),this.checked?(y(),w().publish("view/inspector/collectionElement/new/selected",[n,"validators"]),d().isNonEmptyString(c)&&E().set(c,s)):(d().isNonEmptyString(c)&&E().unset(c),w().publish("view/inspector/removeCollectionElement/perform",[n,"validators"]),a=E().get(i),d().isUndefinedOrNull(a)&&(a=[]),E().set(i,B(e.configurationOptions.validationErrorMessage.errorCodes,a,"")))})}function se(e,t,r,l){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1476218671),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1476218672),p(d().isNonEmptyString(e.label),'Invalid configuration "label"',1476218673),p(d().isNonEmptyString(e.propertyPath),'Invalid configuration "propertyPath"',1476218674),P(o().getTemplatePropertyElement("label",t),e.label),I(e,t);const n=v().buildPropertyPath(e.propertyPath,r,l),s=E().get(n),c=e.propertyPath==="renderingOptions.enabled"&&d().isUndefinedOrNull(s),a=t.querySelector('input[type="checkbox"]');(c||typeof s=="boolean"&&s||s==="true"||s===1||s==="1")&&a&&(a.checked=!0),a?.addEventListener("change",function(){E().set(n,this.checked)})}function oe(e,t,r,l){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1475412567),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1475412568),p(d().isNonEmptyString(e.propertyPath),'Invalid configuration "propertyPath"',1475416098),p(d().isNonEmptyString(e.label),'Invalid configuration "label"',1475416099);const n=v().buildPropertyPath(e.propertyPath,r,l);P(o().getTemplatePropertyElement("label",t),e.label),I(e,t);const s=E().get(n),c=t.querySelector("textarea");if(!c)throw new Error("Textarea element not found in editor HTML");c.value=s;const a=e.rteOptions||{};if(e.enableRichtext===!0&&a&&typeof a=="object"&&Object.keys(a).length!==0){const u=c.parentElement;if(!u)throw new Error("Textarea wrapper element not found");if(Pe){const y=c.id,b=y?y+"ckeditor5":"",f=document.createElement("typo3-rte-ckeditor-ckeditor5");b&&(f.id=b);const A=JSON.stringify(a);f.setAttribute("options",A),c.setAttribute("slot","textarea"),f.appendChild(c),u.innerHTML="",u.appendChild(f),f.options=a}}g(n,t);const i=e.enableRichtext===!0?["change"]:["keyup","paste"],m=u=>{const y=u.target;E().set(n,y.value),g(n,t)};i.forEach(u=>{c.addEventListener(u,m)})}function ie(e,t,r,l){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1477300587),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1477300588),p(d().isNonEmptyString(e.label),'Invalid configuration "label"',1477300589),p(d().isNonEmptyString(e.buttonLabel),'Invalid configuration "buttonLabel"',1477318981),p(d().isNonEmptyString(e.propertyPath),'Invalid configuration "propertyPath"',1477300590),P(o().getTemplatePropertyElement("label",t),e.label),P(o().getTemplatePropertyElement("buttonLabel",t),e.buttonLabel),I(e,t);const n=t.querySelector("form");n&&(n.name=e.propertyPath),T.getIcon(e.iconIdentifier,T.sizes.small).then(function(m){const u=o().getTemplatePropertyElement("image",t);if(u){const y=document.createElement("div");y.innerHTML=m,u.append(y.firstElementChild??y)}}),o().getTemplatePropertyElement("onclick",t)?.addEventListener("click",function(){const m=Math.floor(Math.random()*1e5+1),u=this.closest(o().getDomElementDataIdentifierSelector("editorControlsWrapper"))?.querySelector(o().getDomElementDataAttribute("contentElementSelectorTarget","bracesWithKey"));u&&u.setAttribute(o().getDomElementDataAttribute("contentElementSelectorTarget"),String(m)),Te("db",String(m),e.browsableType)}),Oe();const s=v().buildPropertyPath(e.propertyPath,r,l),c=E().get(s);g(s,t);const a=o().getTemplatePropertyElement("propertyPath",t);if(a){a.value=c??"";const m=d().isUndefinedOrNull(e.maxItems)?1:e.maxItems;a.dataset.maxItems=m.toString()}a?.addEventListener("keyup",i),a?.addEventListener("paste",i);function i(){E().set(s,this.value),g(s,t)}}function pe(e,t,r,l){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1475412563),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1475412564);const n=t.querySelector("button");d().isUndefinedOrNull(r)?n?.classList.add(o().getDomElementClassName("buttonFormElementRemove"),o().getDomElementClassName("buttonFormEditor")):n?.classList.add(o().getDomElementClassName("buttonCollectionElementRemove")),n?.addEventListener("click",function(){d().isUndefinedOrNull(r)?D().showRemoveFormElementModal():D().showRemoveCollectionElementModal(r,l)})}function ce(e,t,r){p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "editorConfiguration"',1484574704),p(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "editorHtml"',1484574705),p(d().isNonEmptyString(r),'Invalid parameter "propertyPath"',1484574706);const l=t.querySelector("typo3-form-element-selector");if(l)if(e.enableFormelementSelectionButton===!0)l.elements=me(),l.addEventListener(he.eventName,n=>{let s;s=E().get(r)||"",s.length===0?s=`{${n.value}}`:s=`${s} {${n.value}}`,E().set(r,s);const c=o().getTemplatePropertyElement("propertyPath",t);c&&(c.value=s),g(r,t)});else{l.remove();const n=t.querySelector('[data-identifier="inspectorEditorControlsGroup"]');n&&n.classList.remove("input-group")}}function me(){return v().getNonCompositeNonToplevelFormElements().map(t=>({icon:N(t,"iconIdentifier"),label:t.get("label"),value:t.get("identifier")}))}function de(e){d().isUndefinedOrNull(e)&&(e=E()),p(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1478967319);let t;e.get("type")==="Form"?t=e.get("type"):t=N(e,"label")?N(e,"label"):e.get("identifier");const r=document.createElement("span");return r.textContent=t,r}function ue(e,t,r,l){p(typeof e=="object"&&e!==null,'Invalid parameter "editorConfiguration"',1740000001),p(typeof t=="object"&&t!==null,'Invalid parameter "editorHtml"',1740000002),p(d().isNonEmptyString(e.propertyPath),'Invalid configuration "propertyPath"',1740000003);const n=v().buildPropertyPath(e.propertyPath,r,l);P(o().getTemplatePropertyElement("label",t),e.label||""),I(e,t);const s=t.querySelector("typo3-form-date-editor"),c=TYPO3.settings.FormEditor.dateEditor;p(d().isNonEmptyString(c.absolutePattern),"Missing required TYPO3.settings.FormEditor.dateEditor.absolutePattern",1740000004),s.setAttribute("absolute-pattern",c.absolutePattern),s.value=E().get(n)||"",g(n,t),s.addEventListener(ve.eventName,a=>{const i=a.value;if(E().set(n,i),!d().isUndefinedOrNull(e.additionalElementPropertyPaths)&&Array.isArray(e.additionalElementPropertyPaths))for(let m=0,u=e.additionalElementPropertyPaths.length;m{e().onViewReadyBatch()}),r().subscribe("core/applicationState/add",(i,[t,o,s])=>{e().disableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderRedo"))),s>1&&o<=s?e().enableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderUndo"))):e().disableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderUndo")))}),r().subscribe("core/ajax/saveFormDefinition/success",(i,[t])=>{n().setUnsavedContent(!1),e().setPreviewMode(!1),e().showSaveSuccessMessage(),e().showSaveButtonSaveIcon(),n().setFormDefinition(t.formDefinition),e().addStructureRootElementSelection(),n().setCurrentlySelectedFormElement(a()),e().setStructureRootElementTitle(),e().setStageHeadline(),e().renderAbstractStageArea(),e().renewStructure(),e().renderPagination(),e().renderInspectorEditors()}),r().subscribe("core/ajax/saveFormDefinition/error",(i,[t])=>{e().showSaveButtonSaveIcon(),e().showSaveErrorMessage({message:t.message})}),r().subscribe("core/ajax/renderFormDefinitionPage/success",(i,[t,o])=>{e().renderPreviewStageArea(t)}),r().subscribe("core/ajax/error",(i,[t,o])=>{e().showErrorFlashMessage(t,o),e().renderPreviewStageArea(o)}),r().subscribe("view/header/button/save/clicked",()=>{n().validationResultsHasErrors(n().validateFormElementRecursive(a(),!0))?e().showValidationErrorsModal():(e().showSaveButtonSpinnerIcon(),n().saveFormDefinition())}),r().subscribe("view/header/formSettings/clicked",()=>{e().setPreviewMode(!1),e().addStructureRootElementSelection(),n().setCurrentlySelectedFormElement(a()),e().renderAbstractStageArea(),e().renewStructure(),e().renderPagination(),e().showInspectorSidebar(),e().renderInspectorEditors()}),r().subscribe("view/header/button/newPage/clicked",(i,[t])=>{n().isRootFormElementSelected()&&e().selectPageBatch(0),e().showInsertPagesModal(t)}),r().subscribe("view/header/button/close/clicked",()=>{e().showCloseConfirmationModal()}),r().subscribe("view/undoButton/clicked",()=>{e().disableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderUndo"))),e().disableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderRedo"))),n().undoApplicationState(),e().getPreviewMode()?n().renderCurrentFormPage():e().renderAbstractStageArea(),n().setUnsavedContent(!0),e().renewStructure(),e().renderPagination(),e().renderInspectorEditors()}),r().subscribe("view/redoButton/clicked",()=>{e().disableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderUndo"))),e().disableButton(document.querySelector(d().getDomElementDataIdentifierSelector("buttonHeaderRedo"))),n().redoApplicationState(),e().getPreviewMode()?n().renderCurrentFormPage():e().renderAbstractStageArea(),n().setUnsavedContent(!0),e().renewStructure(),e().renderPagination(),e().renderInspectorEditors()}),r().subscribe("view/stage/element/clicked",(i,[t])=>{e().getPreviewMode()||l().get("__identifierPath")!==t&&(n().setCurrentlySelectedFormElement(t),e().selectStructureNode(),e().renewStructure(),e().refreshSelectedElementItemsBatch(),e().addAbstractViewValidationResults(),e().showInspectorSidebar(),e().renderInspectorEditors(),e().focusFirstInspectorInput())}),r().subscribe("view/stage/abstract/elementToolbar/button/newElement/clicked",(i,[t,o])=>{n().isRootFormElementSelected()&&e().selectPageBatch(0),e().showInsertElementsModal(t,o)}),r().subscribe("view/stage/abstract/button/newElement/clicked",(i,[t,o])=>{n().isRootFormElementSelected()&&e().selectPageBatch(0),e().showInsertElementsModal(t,o||void 0)}),r().subscribe("view/stage/abstract/dnd/start",(i,[t,o])=>{e().onAbstractViewDndStartBatch(t,o)}),r().subscribe("view/stage/abstract/dnd/stop",(i,[t])=>{n().setCurrentlySelectedFormElement(t),e().renewStructure(),e().setPreviewMode(!1),e().renderAbstractStageArea(),e().refreshSelectedElementItemsBatch(),e().addAbstractViewValidationResults(),e().renderInspectorEditors()}),r().subscribe("view/stage/abstract/dnd/change",(i,[t,o,s])=>{e().onAbstractViewDndChangeBatch(t,o,s)}),r().subscribe("view/stage/abstract/dnd/update",(i,[t,o,s,c])=>{e().onAbstractViewDndUpdateBatch(t,o,s,c)}),r().subscribe("view/viewModeButton/abstract/clicked",()=>{e().getPreviewMode()&&(e().setPreviewMode(!1),e().renderAbstractStageArea())}),r().subscribe("view/viewModeButton/preview/clicked",()=>{e().getPreviewMode()||(e().setPreviewMode(!0),n().renderCurrentFormPage())}),r().subscribe("view/paginationPrevious/clicked",()=>{e().selectPageBatch(n().getCurrentlySelectedPageIndex()-1),e().getPreviewMode()?n().renderCurrentFormPage():e().renderAbstractStageArea()}),r().subscribe("view/paginationNext/clicked",()=>{e().selectPageBatch(n().getCurrentlySelectedPageIndex()+1),e().getPreviewMode()?n().renderCurrentFormPage():e().renderAbstractStageArea()}),r().subscribe("view/stage/abstract/render/postProcess",()=>{e().renderUndoRedo(),e().addAbstractViewValidationResults()}),r().subscribe("view/stage/preview/render/postProcess",()=>{e().renderUndoRedo()}),r().subscribe("view/tree/node/clicked",(i,[t])=>{l().get("__identifierPath")!==t&&(n().setCurrentlySelectedFormElement(t),e().setPreviewMode(!1),e().renderAbstractStageArea(),e().renderPagination(),e().addAbstractViewValidationResults(),e().showInspectorSidebar(),e().renderInspectorEditors(),e().focusFirstInspectorInput())}),r().subscribe("view/tree/node/changed",(i,[t,o])=>{const s=n().getFormElementByIdentifierPath(t);s.set("label",o),e().getStructure().setTreeNodeTitle(null,s),l().get("__identifierPath")===t&&e().renderInspectorEditors(t)}),r().subscribe("view/structure/root/selected",()=>{n().isRootFormElementSelected()||(e().addStructureRootElementSelection(),n().setCurrentlySelectedFormElement(a()),e().setPreviewMode(!1),e().renderAbstractStageArea(),e().renewStructure(),e().renderPagination(),e().renderInspectorEditors())}),r().subscribe("view/structure/button/newPage/clicked",(i,[t])=>{n().isRootFormElementSelected()&&e().selectPageBatch(0),e().showInsertPagesModal(t)}),r().subscribe("view/tree/dnd/stop",(i,[t])=>{n().setCurrentlySelectedFormElement(t),e().renewStructure(),e().renderPagination(),e().setPreviewMode(!1),e().renderAbstractStageArea(),e().addAbstractViewValidationResults(),e().renderInspectorEditors()}),r().subscribe("view/tree/dnd/change",(i,[t,o,s])=>{e().onStructureDndChangeBatch(t,o,s)}),r().subscribe("view/tree/dnd/update",(i,[t,o,s,c])=>{e().onStructureDndUpdateBatch(t,o,s,c)}),r().subscribe("view/structure/renew/postProcess",()=>{e().addStructureValidationResults()}),r().subscribe("view/inspector/removeCollectionElement/perform",(i,[t,o,s])=>{e().removePropertyCollectionElement(t,o,s||void 0)}),r().subscribe("view/inspector/collectionElement/new/selected",(i,[t,o])=>{e().createAndAddPropertyCollectionElement(t,o)}),r().subscribe("view/inspector/collectionElement/existing/selected",(i,[t,o])=>{e().renderInspectorCollectionElementEditors(o,t)}),r().subscribe("view/inspector/collectionElements/dnd/update",(i,[t,o,s,c])=>{s?e().movePropertyCollectionElement(t,"before",s,c):o?e().movePropertyCollectionElement(t,"after",o,c):w(!1,"Next element or previous element need to be set.",1477407673)}),r().subscribe("core/formElement/somePropertyChanged",(i,[t,o,s,c])=>{t!=="renderables"&&(!n().isRootFormElementSelected()&&t==="label"?e().getStructure().setTreeNodeTitle():(!n().getUtility().isUndefinedOrNull(c)&&a().get("__identifierPath")===c&&(e().setStructureRootElementTitle(),e().setStageHeadline()),e().renewStructure()),e().getPreviewMode()?n().renderCurrentFormPage():e().renderAbstractStageArea(),e().addStructureValidationResults()),n().setUnsavedContent(!0)}),r().subscribe("view/formElement/removed",(i,[t])=>{n().setCurrentlySelectedFormElement(t),e().renewStructure(),e().renderAbstractStageArea(),e().renderPagination(),e().renderInspectorEditors()}),r().subscribe("view/formElement/inserted",(i,[t])=>{n().setCurrentlySelectedFormElement(t),e().renewStructure(),e().renderAbstractStageArea(),e().renderPagination(),e().renderInspectorEditors()}),r().subscribe("view/collectionElement/new/added",()=>{e().renderInspectorEditors()}),r().subscribe("view/collectionElement/moved",()=>{e().renderInspectorEditors()}),r().subscribe("view/collectionElement/removed",()=>{e().renderInspectorEditors()}),r().subscribe("view/insertElements/perform/bottom",(i,[t])=>{const o=n().getLastTopLevelElementOnCurrentPage();o?!n().getFormElementDefinition(o,"_isTopLevelFormElement")&&n().getFormElementDefinition(o,"_isCompositeFormElement")?e().createAndAddFormElement(t,n().getCurrentlySelectedPage()):e().createAndAddFormElement(t,o):e().createAndAddFormElement(t,n().getCurrentlySelectedPage())}),r().subscribe("view/insertElements/perform/before",(i,[t])=>{let o;o=e().createAndAddFormElement(t,void 0,!0),o=e().moveFormElement(o,"before",n().getCurrentlySelectedFormElement()),r().publish("view/formElement/inserted",[o])}),r().subscribe("view/insertElements/perform/after",(i,[t])=>{let o;o=e().createAndAddFormElement(t,void 0,!0),o=e().moveFormElement(o,"after",n().getCurrentlySelectedFormElement()),r().publish("view/formElement/inserted",[o])}),r().subscribe("view/insertElements/perform/inside",(i,[t])=>{e().createAndAddFormElement(t)}),r().subscribe("view/insertPages/perform",(i,[t])=>{e().createAndAddFormElement(t)}),r().subscribe("view/modal/close/perform",()=>{n().setUnsavedContent(!1),e().closeEditor()}),r().subscribe("view/modal/removeFormElement/perform",(i,[t])=>{e().removeFormElement(t)}),r().subscribe("view/modal/removeCollectionElement/perform",(i,[t,o,s])=>{e().removePropertyCollectionElement(t,o,s)}),r().subscribe("view/modal/validationErrors/element/clicked",(i,[t])=>{l().get("__identifierPath")!==t&&(n().setCurrentlySelectedFormElement(t),e().getPreviewMode()&&e().setPreviewMode(!1),e().renderAbstractStageArea(),e().renderPagination(),e().renderInspectorEditors())})}function p(i,t){m=i,b=t,u.bootstrap(m),v()}export{p as bootstrap}; diff --git a/Resources/Public/JavaScript/backend/form-editor/modals-component.js b/Resources/Public/JavaScript/backend/form-editor/modals-component.js new file mode 100644 index 0000000..afe1a44 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/modals-component.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import*as y from"@typo3/form/backend/form-editor/helper.js";import{merge as A}from"lodash-es";import d from"@typo3/backend/modal.js";import h from"@typo3/backend/severity.js";let w=null;const M={domElementClassNames:{buttonDefault:"btn-default",buttonInfo:"btn-info",buttonWarning:"btn-warning"},domElementDataAttributeNames:{elementType:"element-type",fullElementType:"data-element-type"},domElementDataAttributeValues:{rowItem:"rowItem",rowLink:"rowLink",rowsContainer:"rowsContainer",templateInsertElements:"Modal-InsertElements",templateInsertPages:"Modal-InsertPages",templateValidationErrors:"Modal-ValidationErrors"}};let D=null;function f(){return D}function r(e){return p().isUndefinedOrNull(e)?y.setConfiguration(w):y.setConfiguration(e)}function p(){return f().getUtility()}function u(e,t,n){return f().assert(e,t,n)}function i(){return f().getRootFormElement()}function b(){return f().getPublisherSubscriber()}function m(e,t){return f().getFormElementDefinition(e,t)}function I(e,t){const n=[];u(p().isNonEmptyString(e),'Invalid parameter "publisherTopicName"',1478889049),u(Array.isArray(t),'Invalid parameter "formElement"',1478889044),n.push({text:m(i(),"modalRemoveElementCancelButton"),active:!0,btnClass:r().getDomElementClassName("buttonDefault"),name:"cancel",trigger:(o,l)=>{l.hideModal()}}),n.push({text:m(i(),"modalRemoveElementConfirmButton"),active:!0,btnClass:r().getDomElementClassName("buttonWarning"),name:"confirm",trigger:(o,l)=>{b().publish(e,t),l.hideModal()}}),d.show(m(i(),"modalRemoveElementDialogTitle"),m(i(),"modalRemoveElementDialogMessage"),h.warning,n)}function C(e,t,n){if(u(p().isNonEmptyString(t),'Invalid parameter "publisherTopicName"',1478910954),typeof n=="object"&&n!==null&&!Array.isArray(n))for(const o of Object.keys(n)){if(o==="disableElementTypes"&&Array.isArray(n[o]))for(let l=0,E=n[o].length;la.classList.add(r().getDomElementClassName("disabled")));o==="onlyEnableElementTypes"&&Array.isArray(n[o])&&e.querySelectorAll(r().getDomElementDataAttribute("fullElementType","bracesWithKey")).forEach(l=>{const E=l.getAttribute(r().getDomElementDataAttribute("elementType"));n[o].some(c=>c===E)||l.classList.add(r().getDomElementClassName("disabled"))})}[...e.children].forEach(o=>o.addEventListener("typo3:form:insert-element-click",function(l){b().publish(t,[l.detail.item.identifier])}))}function S(e,t){let n,o;u(Array.isArray(t),'Invalid parameter "validationResults"',1479161268);const l=r().getDomElementDataIdentifierSelector("rowItem"),E=e.querySelector(l)?.cloneNode(!0);e.querySelectorAll(l).forEach(a=>a.remove());for(let a=0,c=t.length;a0){v=!0;break}if(v){n=f().getFormElementByIdentifierPath(t[a].formElementIdentifierPath),o=E?.cloneNode(!0);const s=o?.querySelector(r().getDomElementDataIdentifierSelector("rowLink"));s&&(s.setAttribute(r().getDomElementDataAttribute("elementIdentifier"),t[a].formElementIdentifierPath),s.replaceChildren(N(n)));const g=e.querySelector(r().getDomElementDataIdentifierSelector("rowsContainer"));g&&o&&g.append(o)}}e.querySelectorAll("a").forEach(a=>{a.addEventListener("click",function(){b().publish("view/modal/validationErrors/element/clicked",[a.getAttribute(r().getDomElementDataAttribute("elementIdentifier"))]),e.querySelectorAll("a").forEach(c=>c.replaceWith(c.cloneNode(!0))),d.currentModal.hideModal()})})}function N(e){u(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1479162557);const t=document.createElement("span");return t.textContent=e.get("label")?e.get("label"):e.get("identifier"),t}function T(e){I("view/modal/removeFormElement/perform",[e])}function B(e,t,n){u(p().isNonEmptyString(e),'Invalid parameter "collectionElementIdentifier"',1478894420),u(p().isNonEmptyString(t),'Invalid parameter "collectionName"',1478894421),I("view/modal/removeCollectionElement/perform",[e,t,n])}function P(){const e=[];e.push({text:m(i(),"modalCloseCancelButton"),active:!0,btnClass:r().getDomElementClassName("buttonDefault"),name:"cancel",trigger:(t,n)=>{n.hideModal()}}),e.push({text:m(i(),"modalCloseConfirmButton"),active:!0,btnClass:r().getDomElementClassName("buttonWarning"),name:"confirm",trigger:(t,n)=>{b().publish("view/modal/close/perform",[]),n.hideModal()}}),d.show(m(i(),"modalCloseDialogTitle"),m(i(),"modalCloseDialogMessage"),h.warning,e)}function R(e,t){const n=r().getTemplateElement("templateInsertElements");if(n){const o=document.importNode(n.content,!0);C(o,e,t),d.advanced({title:m(i(),"modalInsertElementsDialogTitle"),size:d.sizes.large,content:o})}}function k(e){const t=r().getTemplateElement("templateInsertPages");if(t){const n=document.importNode(t.content,!0);C(n,e),d.advanced({title:m(i(),"modalInsertPagesDialogTitle"),size:d.sizes.small,content:n})}}function F(e){const t=[];t.push({text:m(i(),"modalValidationErrorsConfirmButton"),active:!0,btnClass:r().getDomElementClassName("buttonDefault"),name:"confirm",trigger:function(o,l){l.hideModal()}});const n=r().getTemplateElement("templateValidationErrors");if(n){const o=document.importNode(n.content,!0);S(o,e),d.show(m(i(),"modalValidationErrorsDialogTitle"),o,h.error,t)}}function q(e,t){return D=e,w=A({},M,t??{}),y.bootstrap(D),this}export{q as bootstrap,P as showCloseConfirmationModal,R as showInsertElementsModal,k as showInsertPagesModal,B as showRemoveCollectionElementModal,T as showRemoveFormElementModal,F as showValidationErrorsModal}; diff --git a/Resources/Public/JavaScript/backend/form-editor/stage-component.js b/Resources/Public/JavaScript/backend/form-editor/stage-component.js new file mode 100644 index 0000000..70901dd --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/stage-component.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import*as L from"@typo3/form/backend/form-editor/helper.js";import{merge as G}from"lodash-es";import J from"sortablejs";import"@typo3/form/backend/form-editor/component/form-element-stage-item.js";import"@typo3/form/backend/form-editor/component/form-element-stage-item-toolbar.js";import"@typo3/form/backend/form-editor/component/page-stage-item.js";import Q from"~labels/form.form_editor_javascript";const X={domElementClassNames:{formElementIsComposit:"formeditor-element-composit",formElementIsTopLevel:"formeditor-element-toplevel",noNesting:"no-nesting",selected:"selected",sortable:"sortable",previewViewPreviewElement:"formeditor-element-preview"},domElementDataAttributeNames:{abstractType:"data-element-abstract-type",noSorting:"data-no-sorting"},domElementDataAttributeValues:{abstractViewToolbarNewElement:"stageElementToolbarNewElement",abstractViewToolbarNewElementSplitButton:"stageElementToolbarNewElementSplitButton",abstractViewToolbarNewElementSplitButtonAfter:"stageElementToolbarNewElementSplitButtonAfter",abstractViewToolbarNewElementSplitButtonInside:"stageElementToolbarNewElementSplitButtonInside",abstractViewToolbarRemoveElement:"stageElementToolbarRemoveElement",buttonHeaderRedo:"redoButton",buttonHeaderUndo:"undoButton",buttonPaginationPrevious:"buttonPaginationPrevious",buttonPaginationNext:"buttonPaginationNext",formElementIcon:"elementIcon",iconValidator:"form-validator",multiValueContainer:"multiValueContainer",paginationTitle:"paginationTitle",stageHeadline:"formDefinitionLabel",stagePanel:"stagePanel",validatorsContainer:"validatorsContainer",validatorIcon:"validatorIcon"},isSortable:!0};let N=null,F=null,d=null;function s(){return F}function l(e){return b().isUndefinedOrNull(e)?L.setConfiguration(N):L.setConfiguration(e)}function b(){return s().getUtility()}function v(){return s().getViewModel()}function w(e,t,n){return s().assert(e,t,n)}function T(){return s().getRootFormElement()}function O(){return s().getCurrentlySelectedFormElement()}function p(){return s().getPublisherSubscriber()}function c(e,t){return s().getFormElementDefinition(e,t)}function Y(e,t){p().publish("view/stage/abstract/render/template/perform",[e,t])}function Z(e,t){const n=document.createElement("li");n.setAttribute("data-no-sorting","true"),n.classList.add("formeditor-new-element-placeholder");const o=Q.get("formEditor.stage.toolbar.new_element"),i=document.createElement("button");i.type="button",i.title=o,i.classList.add("btn","btn-sm","btn-default");const r=document.createElement("typo3-backend-icon");return r.setAttribute("identifier","actions-plus"),r.setAttribute("size","small"),i.append(r,document.createTextNode(" "+o)),i.addEventListener("click",function(u){u.stopPropagation(),s().setCurrentlySelectedFormElement(e),t==="inside"?p().publish("view/stage/abstract/elementToolbar/button/newElement/clicked",["view/insertElements/perform/inside",{disableElementTypes:[],onlyEnableElementTypes:[]}]):p().publish("view/stage/abstract/elementToolbar/button/newElement/clicked",["view/insertElements/perform/after",{disableElementTypes:[],onlyEnableElementTypes:[]}])}),n.append(i),n}function U(e){let t;const n=document.createElement("li");c(e,"_isCompositeFormElement")||n.classList.add(l().getDomElementClassName("noNesting")),c(e,"_isTopLevelFormElement")&&n.classList.add(l().getDomElementClassName("formElementIsTopLevel")),c(e,"_isCompositeFormElement")&&n.classList.add(l().getDomElementClassName("formElementIsComposit"));let o;try{o=l().getTemplateElement("FormElement-"+e.get("type"))}catch{o=null}const i=o===null,r=document.createElement("div");r.setAttribute(l().getDomElementDataAttribute("elementIdentifier"),e.get("__identifierPath")),o&&r.append(document.importNode(o.content,!0));const u=c(e,"_isCompositeFormElement");u&&r.setAttribute(l().getDomElementDataAttribute("abstractType"),"isCompositeFormElement");const E=c(e,"_isTopLevelFormElement");if(E?r.setAttribute(l().getDomElementDataAttribute("abstractType"),"isTopLevelFormElement"):(r.classList.add("formeditor-element"),r.setAttribute("tabindex","0"),r.setAttribute("role","button"),r.setAttribute("aria-label",(e.get("label")||e.get("identifier"))+" ("+c(e,"label")+")")),e.get("renderingOptions.enabled")===!1&&r.classList.add("formeditor-element-hidden"),!E&&!i&&!r.querySelector("typo3-form-form-element-stage-item-toolbar")){const f=document.createElement("typo3-form-form-element-stage-item-toolbar");f.iconIdentifier=c(e,"iconIdentifier")||"",f.elementType=c(e,"label")||"",f.elementIdentifier=e.get("identifier")||"",f.isHidden=e.get("renderingOptions.enabled")===!1,f.active=!0,r.prepend(f)}if(n.append(r),E&&i?j(e,r):i?M(e,r):Y(e,r),E||u){t=document.createElement("ol"),t.classList.add(l().getDomElementClassName("sortable")),t.classList.add("formeditor-list");const f=e.get("renderables"),g=Array.isArray(f)&&f.length>0;if(g||t.append(Z(e,"inside")),g)for(let A=0,k=f.length;Adocument.querySelector(l().getDomElementDataIdentifierSelector(i));v().enableButton(t("buttonPaginationPrevious")),v().enableButton(t("buttonPaginationNext")),s().getCurrentlySelectedPageIndex()===0&&v().disableButton(t("buttonPaginationPrevious")),(e===1||s().getCurrentlySelectedPageIndex()===e-1)&&v().disableButton(t("buttonPaginationNext"));const n=s().getCurrentlySelectedPageIndex()+1,o=t("paginationTitle");o&&(o.textContent=c(T(),"paginationTitle").replace("{0}",n.toString()).replace("{1}",e))}function re(){const e=t=>document.querySelector(l().getDomElementDataIdentifierSelector(t));v().enableButton(e("buttonHeaderUndo")),v().enableButton(e("buttonHeaderRedo")),s().getCurrentApplicationStatePosition()+1>=s().getCurrentApplicationStates()&&v().disableButton(e("buttonHeaderUndo")),s().getCurrentApplicationStatePosition()===0&&v().disableButton(e("buttonHeaderRedo"))}function W(){return d?d.querySelectorAll(l().getDomElementDataAttribute("elementIdentifier","bracesWithKey")):document.querySelectorAll(".formeditor-element-none")}function _(e){w(typeof e=="number",'Invalid parameter "pageIndex"',1478721208);const t=document.createElement("ol");return t.classList.add("formeditor-stage-list"),t.append(U(T().get("renderables")[e])),t}function H(e){return e.parentElement?.closest("li")?.querySelector(l().getDomElementDataAttribute("elementIdentifier","bracesWithKey"))??null}function R(e){return H(e)?.getAttribute(l().getDomElementDataAttribute("elementIdentifier"))??""}function K(e){return e.querySelector(l().getDomElementDataAttribute("elementIdentifier","bracesWithKey"))}function P(e){return K(e)?.getAttribute(l().getDomElementDataAttribute("elementIdentifier"))??""}function V(e,t){b().isUndefinedOrNull(t)&&(t="prev");const n=P(e),o=t==="prev"?e.previousElementSibling:e.nextElementSibling;if(!o)return"";const i=l().getDomElementDataAttribute("elementIdentifier");return o.querySelector(l().getDomElementDataAttribute("elementIdentifier","bracesWithKey")+":not("+l().getDomElementDataAttribute("elementIdentifier","bracesWithKeyValue",[n])+")")?.getAttribute(i)??""}function oe(e){let t;return typeof e=="string"?t=e:b().isUndefinedOrNull(e)?t=O().get("__identifierPath"):t=e.get("__identifierPath"),d?d.querySelector(l().getDomElementDataAttribute("elementIdentifier","bracesWithKeyValue",[t])):null}function le(e,t){if(b().isUndefinedOrNull(t)&&(t=O()),e.querySelector("typo3-form-form-element-stage-item")||c(t,void 0)._isTopLevelFormElement)return;let i=e.querySelector("typo3-form-form-element-stage-item-toolbar");if(!i){const r=document.createElement("typo3-form-form-element-stage-item-toolbar");e.prepend(r),i=r}i.dataset.eventsWired||(i.dataset.eventsWired="true",i.addEventListener("toolbar-new-element-before",()=>{p().publish("view/stage/abstract/elementToolbar/button/newElement/clicked",["view/insertElements/perform/before",{disableElementTypes:[]}])}),i.addEventListener("toolbar-new-element-after",()=>{p().publish("view/stage/abstract/elementToolbar/button/newElement/clicked",["view/insertElements/perform/after",{disableElementTypes:[]}])}),i.addEventListener("toolbar-remove-element",()=>{v().showRemoveFormElementModal(t)})),i.active=!0}function ae(e,t){b().isUndefinedOrNull(e)&&(e=s().getCurrentlySelectedPageIndex()),d.replaceChildren(_(e)),d.addEventListener("click",function(n){const o=n.target.closest(l().getDomElementDataAttribute("elementIdentifier","bracesWithKey"))?.getAttribute(l().getDomElementDataAttribute("elementIdentifier"));b().isUndefinedOrNull(o)||!b().isNonEmptyString(o)||p().publish("view/stage/element/clicked",[o])}),d.addEventListener("keydown",function(n){const o=n.target.closest(".formeditor-element[tabindex]");o&&(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),o.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0})))}),N.isSortable&&$(),typeof t=="function"&&t()}function se(e){w(b().isNonEmptyString(e),'Invalid parameter "html"',1475424409),d.replaceChildren(),d.innerHTML=e,d.querySelectorAll("input, select, textarea, button").forEach(t=>{t.disabled=!0,["click","dblclick","select","focus","keydown","keypress","keyup","mousedown","mouseup"].forEach(n=>{t.addEventListener(n,o=>o.preventDefault())})}),d.querySelector("form")?.addEventListener("submit",t=>t.preventDefault()),W().forEach(function(t){const n=s().getFormElementByIdentifierPath(t.dataset.elementIdentifierPath);c(n,"_isTopLevelFormElement")||t.setAttribute("title","identifier: "+n.get("identifier")+" (type: "+n.get("type")+")"),c(n,"_isTopLevelFormElement")&&t.classList.add(l().getDomElementClassName("formElementIsTopLevel")),c(n,"_isCompositeFormElement")&&t.classList.add(l().getDomElementClassName("formElementIsComposit"))})}function j(e,t){w(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1768924251);const n=document.createElement("typo3-form-page-stage-item");n.pageTitle=e.get("label")||"",t.replaceChildren(n)}function M(e,t){w(typeof e=="object"&&e!==null&&!Array.isArray(e),'Invalid parameter "formElement"',1768924252);const n=document.createElement("typo3-form-form-element-stage-item");n.elementType=c(e,"label"),n.elementIdentifier=e.get("identifier"),n.elementLabel=e.get("label")||e.get("identifier"),n.elementIconIdentifier=c(e,"iconIdentifier"),n.isHidden=e.get("renderingOptions.enabled")===!1;const o=e.get("validators"),i=[];let r=!1;if(Array.isArray(o)&&o.length>0)for(let a=0,m=o.length;a0&&(n.allowedMimeTypes=D),n.isHidden&&n.classList.add("formeditor-element-hidden");const C=s().validateFormElement(e);let q=!1;for(let a=0,m=C.length;a0){q=!0;break}n.invalid=q,n.addEventListener("toolbar-new-element-before",()=>{p().publish("view/stage/abstract/elementToolbar/button/newElement/clicked",["view/insertElements/perform/before",{disableElementTypes:[]}])}),n.addEventListener("toolbar-new-element-after",()=>{p().publish("view/stage/abstract/elementToolbar/button/newElement/clicked",["view/insertElements/perform/after",{disableElementTypes:[]}])}),n.addEventListener("toolbar-remove-element",()=>{v().showRemoveFormElementModal(e)}),t.replaceChildren(n)}function de(e,t,n){return F=e,w(typeof t=="object"&&t!==null&&!Array.isArray(t),'Invalid parameter "appendToDomElement"',1478992119),d=t,N=G({},X,n??{}),L.bootstrap(F),this}export{de as bootstrap,B as buildTitleByFormElement,le as createAndAddAbstractViewFormElementToolbar,oe as getAbstractViewFormElementDomElement,P as getAbstractViewFormElementIdentifierPathWithinDomElement,K as getAbstractViewFormElementWithinDomElement,R as getAbstractViewParentFormElementIdentifierPathWithinDomElement,H as getAbstractViewParentFormElementWithinDomElement,V as getAbstractViewSiblingFormElementIdentifierPathWithinDomElement,W as getAllFormElementDomElements,ee as getStageDomElement,ne as getStagePanelDomElement,ae as renderAbstractStageArea,_ as renderFormDefinitionPageAsSortableList,M as renderFormElementStageItem,ie as renderPagination,se as renderPreviewStageArea,j as renderTopLevelStageItem,re as renderUndoRedo,te as setStageHeadline}; diff --git a/Resources/Public/JavaScript/backend/form-editor/tree-component-adapter.js b/Resources/Public/JavaScript/backend/form-editor/tree-component-adapter.js new file mode 100644 index 0000000..863482d --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/tree-component-adapter.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import*as B from"@typo3/form/backend/form-editor/helper.js";import{FORM_EDITOR_TREE_EVENTS as p}from"@typo3/form/backend/form-editor-tree-events.js";import{stripTags as G}from"@typo3/form/backend/form-editor/utility/string-utility.js";import"@typo3/form/backend/form-editor-tree-container.js";let b=null,i=null,o=null;function a(){return b}function d(){return a().getPublisherSubscriber()}function y(){return a().getRootFormElement()}function h(){return a().getCurrentlySelectedFormElement()}function u(e,t){return a().getFormElementDefinition(e,t)}function w(e){const t=e.get("label")||e.get("identifier"),n={identifier:e.get("identifier"),identifierPath:e.get("__identifierPath"),label:G(t),type:u(e,"label"),iconIdentifier:u(e,"iconIdentifier"),isComposite:u(e,"_isCompositeFormElement"),isTopLevel:u(e,"_isTopLevelFormElement"),enabled:e.get("renderingOptions.enabled")!==!1,children:[]},r=e.get("renderables");return Array.isArray(r)&&r.length>0&&(n.children=r.map(l=>w(l))),n}function K(){const e=y(),t=w(e);return t.expanded=!0,[t]}function E(e){if(!i)return;const t=K();requestAnimationFrame(async()=>{await i.setNodes(t);let n=e;if(!n)try{n=h()}catch{n=null}if(n){const r=n.get("__identifierPath");i.setSelectedNode(r)}d().publish("view/structure/renew/postProcess")})}function N(e){if(!i)return;let t=e;if(!t)try{t=h()}catch{return}i.setSelectedNode(t.get("__identifierPath"))}function F(e,t){if(!t)try{t=h()}catch{return}e&&t.set("label",e),E(t)}function D(e){let t;if(typeof e=="string")t=e;else{let n=e;if(!n)try{n=h()}catch{return null}t=n.get("__identifierPath")}return o?o.querySelector(`[data-id="${t}"]`):null}function S(){return o?o.querySelectorAll(".tree-item"):document.querySelectorAll(".tree-item-none")}function I(e,t=!0){i&&i.setNodeValidationError(e,t)}function A(e,t=!0){i&&i.setNodeChildHasError(e,t)}function C(){i&&i.clearAllValidationErrors()}function _(){return o}function L(e){const t=document.createElement("span");t.textContent=e.get("label")?e.get("label"):e.get("identifier");const n=document.createElement("small");return n.textContent="("+u(e,"label")+")",t.appendChild(n),t}function q(e){return e?e.querySelector(".tree-item-content"):null}function x(e){return e?.closest("[data-id]")?.getAttribute("data-id")??""}function O(e){const t=e?.parentElement?.closest("li[data-id]");return t?t.querySelector(".tree-item-content"):null}function R(e){return e?.parentElement?.closest("li[data-id]")?.getAttribute("data-id")??""}function W(e,t="prev"){const n=e?.closest("li[data-id]");return n?(t==="prev"?n.previousElementSibling?.matches("li[data-id]")?n.previousElementSibling:null:n.nextElementSibling?.matches("li[data-id]")?n.nextElementSibling:null)?.getAttribute("data-id")??"":""}function V(){return document.createElement("div")}function v(){return window.parent.document.querySelector("typo3-backend-navigation-component-formeditortree")}function M(){const e=v();return e?Promise.resolve(e):new Promise(t=>{const n=()=>{clearTimeout(r),window.parent.document.removeEventListener("typo3:tree-container:ready",n);const l=v();t(l)};window.parent.document.addEventListener("typo3:tree-container:ready",n);const r=window.setTimeout(()=>{window.parent.document.removeEventListener("typo3:tree-container:ready",n),console.warn("[FormEditor Tree Adapter] Tree container not found within timeout"),t(null)},5e3)})}function H(e,t){return b=e,o=t,i=v(),i?k():M().then(n=>{n&&(i=n,k(),b&&y()&&E())}),{renew:E,selectTreeNode:N,setTreeNodeTitle:F,getTreeNode:D,getAllTreeNodes:S,setNodeValidationError:I,setNodeChildHasError:A,clearAllValidationErrors:C,getTreeDomElement:_,buildTitleByFormElement:L,getTreeNodeWithinDomElement:q,getTreeNodeIdentifierPathWithinDomElement:x,getParentTreeNodeWithinDomElement:O,getParentTreeNodeIdentifierPathWithinDomElement:R,getSiblingTreeNodeIdentifierPathWithinDomElement:W,renderCompositeFormElementChildsAsSortableList:V,bootstrap:H}}function k(){i&&(i.addEventListener(p.NODE_CLICKED,e=>{const t=e,{identifierPath:n}=t.detail;try{d().publish("view/tree/node/clicked",[n])}catch{}}),i.addEventListener(p.NODE_EDIT,e=>{const t=e,{identifierPath:n}=t.detail;d().publish("view/tree/node/clicked",[n])}),i.addEventListener(p.DND_UPDATE,e=>{const t=e,{movedIdentifierPath:n,previousIdentifierPath:r,nextIdentifierPath:l}=t.detail,m=o?o.querySelector(`[data-id="${n}"]`):null;d().publish("view/tree/dnd/update",[m,n,r,l]),d().publish("view/tree/dnd/stop",[n])}),i.addEventListener(p.DND_CHANGE,e=>{const t=e,{itemIdentifierPath:n,parentIdentifierPath:r,position:l,previousIdentifierPath:m,nextIdentifierPath:P}=t.detail,g=o?o.querySelector(`[data-id="${n}"]`):null,$=a().findEnclosingCompositeFormElementWhichIsNotOnTopLevel(r);d().publish("view/tree/dnd/change",[g,r,$]);let s,c;l==="inside"?(s="inside",c=r):P?(s="before",c=P):m?(s="after",c=m):(s="inside",c=r);try{const f=a().moveFormElement(n,s,c,!1),T=f.get("__identifierPath");f&&g!==null&&g.setAttribute(B.getDomElementDataAttribute("elementIdentifier"),T),d().publish("view/tree/dnd/stop",[T])}catch(f){console.error("[FormEditor Tree] Failed to move element:",f)}}))}export{H as bootstrap,L as buildTitleByFormElement,C as clearAllValidationErrors,S as getAllTreeNodes,R as getParentTreeNodeIdentifierPathWithinDomElement,O as getParentTreeNodeWithinDomElement,W as getSiblingTreeNodeIdentifierPathWithinDomElement,_ as getTreeDomElement,D as getTreeNode,x as getTreeNodeIdentifierPathWithinDomElement,q as getTreeNodeWithinDomElement,V as renderCompositeFormElementChildsAsSortableList,E as renew,N as selectTreeNode,A as setNodeChildHasError,I as setNodeValidationError,F as setTreeNodeTitle}; diff --git a/Resources/Public/JavaScript/backend/form-editor/utility/string-utility.js b/Resources/Public/JavaScript/backend/form-editor/utility/string-utility.js new file mode 100644 index 0000000..a9da742 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/utility/string-utility.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +function n(t){if(!t)return t;const e=document.createElement("div");return e.innerHTML=t,e.textContent||e.innerText||""}export{n as stripTags}; diff --git a/Resources/Public/JavaScript/backend/form-editor/view-model.js b/Resources/Public/JavaScript/backend/form-editor/view-model.js new file mode 100644 index 0000000..3187a87 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-editor/view-model.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{cloneDeep as de}from"lodash-es";import*as k from"@typo3/form/backend/form-editor/tree-component-adapter.js";import*as B from"@typo3/form/backend/form-editor/modals-component.js";import*as F from"@typo3/form/backend/form-editor/inspector-component.js";import*as me from"@typo3/form/backend/form-editor/stage-component.js";import*as N from"@typo3/form/backend/form-editor/helper.js";import y from"@typo3/backend/icons.js";import w from"@typo3/backend/notification.js";import{loadModule as ue}from"@typo3/core/java-script-item-processor.js";const O={domElementClassNames:{formElementIsComposit:"formeditor-element-composit",formElementIsTopLevel:"formeditor-element-toplevel",hasError:"has-error",selectedCompositFormElement:"selected",selectedFormElement:"selected",selectedRootFormElement:"selected",selectedStagePanel:"t3-form-form-stage-selected",sortableHover:"sortable-hover",viewModeAbstract:"formeditor-module-viewmode-abstract",viewModePreview:"formeditor-module-viewmode-preview"},domElementDataAttributeNames:{abstractType:"data-element-abstract-type"},domElementDataAttributeValues:{buttonHeaderClose:"closeButton",buttonHeaderPaginationNext:"buttonPaginationNext",buttonHeaderPaginationPrevious:"buttonPaginationPrevious",buttonHeaderRedo:"redoButton",buttonHeaderSave:"saveButton",buttonHeaderUndo:"undoButton",buttonHeaderViewModeAbstract:"buttonViewModeAbstract",buttonHeaderViewModePreview:"buttonViewModePreview",buttonFormSettings:"formSettings",buttonToggleStructure:"formeditorStructureToggle",buttonExpandInspector:"formeditorInspectorExpand",buttonCollapseInspector:"formeditorInspectorCollapse",buttonNewPage:"newPage",iconMailform:"content-form",iconSave:"actions-document-save",iconSaveSpinner:"spinner-circle",inspectorSection:"inspectorSection",moduleLoadingIndicator:"moduleLoadingIndicator",moduleWrapper:"moduleWrapper",stageArea:"stageArea",stageContainer:"stageContainer",stageContainerInner:"stageContainerInner",stagePanelHeading:"panelHeading",stageSection:"stageSection",structure:"structure-element",structureSection:"structureSection",structureRootContainer:"treeRootContainer",structureRootElement:"treeRootElement"}};let W=!1,I=null,_=null,j=null,z=null,K=null;function u(){return a().getRootFormElement()}function E(e,t,n){return a().assert(e,t,n)}function m(){return a().getUtility()}function v(){return a().getCurrentlySelectedFormElement()}function s(){return a().getPublisherSubscriber()}const ce=/^([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])$/i;function V(e){return ce.test(e)}function $(e){const t=e.trim();return t.length>0&&!V(t)}function fe(){a().addPropertyValidationValidator("NotEmpty",function(e,t){const n=e.get(t);if(!n||n===""||Array.isArray(n)&&!n.length)return a().getFormElementPropertyValidatorDefinition("NotEmpty").errorMessage||"invalid value"}),a().addPropertyValidationValidator("Integer",function(e,t){const n=e.get(t);if(n===""||n===null||isNaN(Number(n)))return a().getFormElementPropertyValidatorDefinition("Integer").errorMessage||"invalid value"}),a().addPropertyValidationValidator("IntegerOrEmpty",function(e,t){if(!m().isUndefinedOrNull(e.get(t))&&e.get(t).length>0&&isNaN(Number(e.get(t))))return a().getFormElementPropertyValidatorDefinition("Integer").errorMessage||"invalid value"}),a().addPropertyValidationValidator("NaiveEmail",function(e,t){if(!m().isUndefinedOrNull(e.get(t))&&!e.get(t).match(/\S+@\S+\.\S+/))return a().getFormElementPropertyValidatorDefinition("NaiveEmail").errorMessage||"invalid value"}),a().addPropertyValidationValidator("NaiveEmailOrEmpty",function(e,t){if(!m().isUndefinedOrNull(e.get(t))&&e.get(t).length>0&&!e.get(t).match(/\S+@\S+\.\S+/))return a().getFormElementPropertyValidatorDefinition("NaiveEmailOrEmpty").errorMessage||"invalid value"}),a().addPropertyValidationValidator("FormElementIdentifierWithinCurlyBracesInclusive",function(e,t){if(m().isUndefinedOrNull(e.get(t)))return;const r=/\{([a-z0-9-_]+)?\}/gi.exec(e.get(t));if(r&&(r[1]&&r[1]!=="__currentTimestamp"&&!a().isFormElementIdentifierUsed(r[1])||!r[1]))return a().getFormElementPropertyValidatorDefinition("FormElementIdentifierWithinCurlyBracesInclusive").errorMessage||"invalid value"}),a().addPropertyValidationValidator("FormElementIdentifierWithinCurlyBracesExclusive",function(e,t){if(m().isUndefinedOrNull(e.get(t)))return;const r=/^\{([a-z0-9-_]+)?\}$/i.exec(e.get(t));if(!r||r[1]&&r[1]!=="__currentTimestamp"&&!a().isFormElementIdentifierUsed(r[1])||!r[1])return a().getFormElementPropertyValidatorDefinition("FormElementIdentifierWithinCurlyBracesInclusive").errorMessage||"invalid value"}),a().addPropertyValidationValidator("FileSize",function(e,t){if(!m().isUndefinedOrNull(e.get(t))&&!e.get(t).match(/^(\d*\.?\d+)(B|K|M|G)$/i))return a().getFormElementPropertyValidatorDefinition("FileSize").errorMessage||"invalid value"}),a().addPropertyValidationValidator("RFC3339FullDate",function(e,t){if(m().isUndefinedOrNull(e.get(t)))return;const n=e.get(t);if(!V(n)&&!$(n))return a().getFormElementPropertyValidatorDefinition("RFC3339FullDate").errorMessage||"invalid value"}),a().addPropertyValidationValidator("RFC3339FullDateOrEmpty",function(e,t){if(m().isUndefinedOrNull(e.get(t)))return;const n=e.get(t);if(n.length>0&&!V(n)&&!$(n))return a().getFormElementPropertyValidatorDefinition("RFC3339FullDate").errorMessage||"invalid value"}),a().addPropertyValidationValidator("RegularExpressionPattern",function(e,t){const n=e.get(t);let r=!0;if(!m().isNonEmptyString(n))return a().getFormElementPropertyValidatorDefinition("RegularExpressionPattern").errorMessage||"invalid value";try{const i=n.match(/^\/(.*)\/[gmixsuUAJD]*$/);i!==null?new RegExp(i[1]):r=!1}catch{r=!1}if(!r)return a().getFormElementPropertyValidatorDefinition("RegularExpressionPattern").errorMessage||"invalid value"}),a().addPropertyValidationValidator("ItemCount",function(e,t){if(m().isUndefinedOrNull(e.get(t)))return;const r=e.get(t).split(",").filter(c=>c!==""),{minItems:i,maxItems:l}=ge(e,t);if(i>0&&r.length1&&r.length>l)return pe(i,l)}),a().addPropertyValidationValidator("IntegerList",function(e,t){if(m().isUndefinedOrNull(e.get(t)))return;const r=e.get(t).split(",").filter(i=>i!=="");for(const i of r)if(isNaN(Number(i)))return a().getFormElementPropertyValidatorDefinition("IntegerList").errorMessage||"invalid value"})}function ge(e,t){const r=a().getFormElementDefinition(e,"editors").find(i=>i.propertyPath===t);return{minItems:r?.minItems??0,maxItems:r?.maxItems??1}}function pe(e,t){const n=a().getFormElementPropertyValidatorDefinition("ItemCount").errorMessage;return n?n.replace("{0}",String(e)).replace("{1}",String(t)):"invalid value"}function Ee(e){let t=[];if(typeof e=="object"&&!Array.isArray(e))for(const r of Object.keys(e))t.push(e[r]);else t=e;if(!Array.isArray(t)){s().publish("view/ready");return}const n=t.length;if(n>0){let r=0;for(let i=0;idocument.querySelector(o().getDomElementDataIdentifierSelector(t));e("buttonHeaderSave")?.addEventListener("click",function(){s().publish("view/header/button/save/clicked",[])}),e("buttonToggleStructure")?.addEventListener("click",function(){e("structureSection")?.classList.toggle("formeditor-inspector-expanded")}),e("buttonExpandInspector")?.addEventListener("click",function(){e("inspectorSection")?.classList.add("formeditor-inspector-expanded")}),e("buttonCollapseInspector")?.addEventListener("click",function(){e("inspectorSection")?.classList.remove("formeditor-inspector-expanded")}),e("buttonFormSettings")?.addEventListener("click",function(){s().publish("view/header/formSettings/clicked",[])}),e("buttonNewPage")?.addEventListener("click",function(){s().publish("view/structure/button/newPage/clicked",["view/insertPages/perform"])}),e("buttonHeaderClose")?.addEventListener("click",function(t){a().getUnsavedContent()&&(t.preventDefault(),s().publish("view/header/button/close/clicked",[]))}),e("buttonHeaderUndo")?.addEventListener("click",function(){s().publish("view/undoButton/clicked",[])}),e("buttonHeaderRedo")?.addEventListener("click",function(){s().publish("view/redoButton/clicked",[])}),e("buttonHeaderViewModeAbstract")?.addEventListener("click",function(){s().publish("view/viewModeButton/abstract/clicked",[])}),e("buttonHeaderViewModePreview")?.addEventListener("click",function(){s().publish("view/viewModeButton/preview/clicked",[])}),e("structureRootContainer")?.addEventListener("click",function(){s().publish("view/structure/root/selected")}),e("buttonHeaderPaginationNext")?.addEventListener("click",function(){s().publish("view/paginationNext/clicked",[])}),e("buttonHeaderPaginationPrevious")?.addEventListener("click",function(){s().publish("view/paginationPrevious/clicked",[])})}function a(){return I}function o(e){return m().isUndefinedOrNull(e)?N.setConfiguration(O):N.setConfiguration(e)}function g(e,t){return a().getFormElementDefinition(e,t)}function Ce(){return de(O)}function ye(){return W}function we(e){W=!!e}function f(){return _}function L(){f().renew(),s().publish("view/structure/renew/postProcess")}function Pe(e){f().selectTreeNode(e)}function G(e){f().getTreeNode(e)?.classList.add(o().getDomElementClassName("selectedFormElement"))}function Ae(e){f().getTreeNode(e)?.classList.remove(o().getDomElementClassName("selectedFormElement"))}function J(){const e=f().getTreeDomElement();e&&e.querySelectorAll(o().getDomElementClassName("selectedFormElement",!0)).forEach(t=>t.classList.remove(o().getDomElementClassName("selectedFormElement")))}function M(){return document.querySelector(o().getDomElementDataAttribute("identifier","bracesWithKeyValue",[o().getDomElementDataAttributeValue("structureRootContainer")]))}function Q(){return document.querySelector(o().getDomElementDataAttribute("identifier","bracesWithKeyValue",[o().getDomElementDataAttributeValue("structureRootElement")]))}function X(){M()?.classList.remove(o().getDomElementClassName("selectedRootFormElement"))}function Y(){M()?.classList.add(o().getDomElementClassName("selectedRootFormElement"))}function Z(e){if(m().isUndefinedOrNull(e)){const n=document.createElement("span");n.textContent=u().get("label")?u().get("label"):u().get("identifier"),e=n.textContent}const t=Q();t&&(t.textContent=e)}function Fe(){f().clearAllValidationErrors();const e=a().validateFormElementRecursive(u());for(let t=0,n=e.length;t0){r=!0;break}if(r){const i=e[t].formElementIdentifierPath;f().setNodeValidationError(i,!0);const l=i.split("/");for(;l.pop();){const c=l.join("/");c&&f().setNodeChildHasError(c,!0)}}}}function D(){return j}function Ne(e){m().isUndefinedOrNull(e)&&(e=v()),D().showRemoveFormElementModal(e)}function Ie(e,t,n){m().isUndefinedOrNull(n)&&(n=v()),D().showRemoveCollectionElementModal(e,t,n)}function Ve(){D().showCloseConfirmationModal()}function Le(e,t){D().showInsertElementsModal(e,t)}function Me(e){D().showInsertPagesModal(e)}function Re(){const e=a().validateFormElementRecursive(u());D().showValidationErrorsModal(e)}function R(){return z}function H(e){R().renderEditors(e)}function He(){const e=document.querySelector(o().getDomElementDataIdentifierSelector("inspectorSection"));e&&e.querySelector("input, select, textarea")?.focus()}function Te(){document.querySelector(o().getDomElementDataIdentifierSelector("inspectorSection"))?.classList.add("formeditor-inspector-expanded")}function Ue(e,t){R().renderCollectionElementEditors(e,t)}function d(){return K}function ee(e){d().setStageHeadline(e)}function te(){d().getStagePanelDomElement()?.classList.add(o().getDomElementClassName("selectedStagePanel"))}function ne(){d().getStagePanelDomElement()?.classList.remove(o().getDomElementClassName("selectedStagePanel"))}function T(){d().renderPagination()}function xe(){d().renderUndoRedo()}function oe(){P(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderViewModeAbstract"))),x(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderViewModePreview"))),document.querySelector(o().getDomElementDataIdentifierSelector("moduleWrapper"))?.classList.add(o().getDomElementClassName("viewModeAbstract")),document.querySelector(o().getDomElementDataIdentifierSelector("moduleWrapper"))?.classList.remove(o().getDomElementClassName("viewModePreview"));const e=n=>{d().renderAbstractStageArea(void 0,n)},t=()=>{const n=g(v(),void 0);d().getAllFormElementDomElements().forEach(function(r){r.addEventListener("mouseenter",function(){d().getAllFormElementDomElements().forEach(i=>{i.parentElement?.classList.remove(o().getDomElementClassName("sortableHover"))}),r.parentElement?.classList.contains(o().getDomElementClassName("formElementIsComposit"))&&!r.parentElement?.classList.contains(o().getDomElementClassName("formElementIsTopLevel"))&&r.parentElement?.classList.add(o().getDomElementClassName("sortableHover"))})}),n._isTopLevelFormElement&&!n._isCompositeFormElement&&a().isRootFormElementSelected(),U(),s().publish("view/stage/abstract/render/postProcess")};e(function(){s().publish("view/stage/abstract/render/preProcess"),t(),s().publish("view/stage/abstract/render/postProcess")})}function qe(e){P(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderViewModePreview"))),x(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderViewModeAbstract"))),document.querySelector(o().getDomElementDataIdentifierSelector("moduleWrapper"))?.classList.add(o().getDomElementClassName("viewModePreview")),document.querySelector(o().getDomElementDataIdentifierSelector("moduleWrapper"))?.classList.remove(o().getDomElementClassName("viewModeAbstract")),d().renderPreviewStageArea(e),s().publish("view/stage/preview/render/postProcess")}function ke(){const e=a().validateFormElementRecursive(u());for(let t=0,n=e.length;t0){r=!0;break}if(r&&t>0){const i=d().getAbstractViewFormElementDomElement(e[t].formElementIdentifierPath),l=i.querySelector("typo3-form-form-element-stage-item");l&&"invalid"in l&&(l.invalid=!0),ae(i)}}}function Be(e,t,n){const r=a().createAndAddFormElement(e,t);return n||s().publish("view/formElement/inserted",[r]),r}function S(e,t,n,r){const i=a().moveFormElement(e,t,n,!1);return r||s().publish("view/formElement/moved",[i]),i}function Oe(e,t){let n;return m().isUndefinedOrNull(e)&&(e=v()),g(e,"_isTopLevelFormElement")&&g(e,"_isCompositeFormElement")&&u().get("renderables").length===1?w.error(g(u(),"modalRemoveElementLastAvailablePageFlashMessageTitle"),g(u(),"modalRemoveElementLastAvailablePageFlashMessageMessage"),2):(n=a().removeFormElement(e,!1),t||s().publish("view/formElement/removed",[n])),n}function We(e,t,n,r,i,l){a().createAndAddPropertyCollectionElement(e,t,n,r,i),l||s().publish("view/collectionElement/new/added",[e,t,n,r,i])}function _e(e,t,n,r,i,l){m().isUndefinedOrNull(i)&&(i=v()),a().movePropertyCollectionElement(e,t,n,r,i,!1),l||s().publish("view/collectionElement/moved",[e,t,n,r,i])}function je(e,t,n,r){let i,l;a().removePropertyCollectionElement(e,t,n);const c=a().getPropertyCollectionElementConfiguration(e,t);if(Array.isArray(c.editors)){for(let p=0,se=c.editors.length;p{n.parentElement?.classList.remove(o().getDomElementClassName("selectedCompositFormElement"))}),!e._isTopLevelFormElement&&e._isCompositeFormElement&&t?.parentElement?.classList.add(o().getDomElementClassName("selectedCompositFormElement"))}}function re(e){E(typeof e=="number",'Invalid parameter "pageIndex"',1478651732),E(e>=0,'Invalid parameter "pageIndex"',1478651733),E(ee.classList.remove(o().getDomElementClassName("selectedFormElement"))),ne(),d().getAllFormElementDomElements().forEach(e=>e.parentElement?.classList.remove(o().getDomElementClassName("sortableHover")))}function ze(){ee(),Z(),oe(),L(),Y(),H(),T(),le(document.querySelector(o().getDomElementDataIdentifierSelector("moduleLoadingIndicator"))),h(document.querySelector(o().getDomElementDataIdentifierSelector("moduleWrapper"))),h(document.querySelector(o().getDomElementDataIdentifierSelector("inspectorSection"))),h(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderSave"))),h(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderClose"))),h(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderUndo"))),h(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderRedo"))),P(document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderViewModeAbstract")))}function Ke(e,t){t?.classList.remove(o().getDomElementClassName("sortableHover"))}function $e(e,t,n){d().getAllFormElementDomElements().forEach(r=>{r.parentElement?.classList.remove(o().getDomElementClassName("sortableHover"))}),n&&d().getAbstractViewParentFormElementWithinDomElement(e)?.parentElement?.classList.add(o().getDomElementClassName("sortableHover"))}function Ge(e,t,n,r){let i,l;r?i=S(t,"before",r):n?i=S(t,"after",n):(l=d().getAbstractViewParentFormElementIdentifierPathWithinDomElement(e),l?i=S(t,"inside",l):E(!1,"Next element, previous or parent element need to be set.",1472502237)),d().getAbstractViewFormElementWithinDomElement(e)?.setAttribute(o().getDomElementDataAttribute("elementIdentifier"),i.get("__identifierPath"))}function Je(e,t,n){f().getAllTreeNodes().forEach(r=>r.parentElement?.classList.remove(o().getDomElementClassName("sortableHover"))),d().getAllFormElementDomElements().forEach(r=>r.parentElement?.classList.remove(o().getDomElementClassName("sortableHover"))),n&&(f().getParentTreeNodeWithinDomElement(e)?.parentElement?.classList.add(o().getDomElementClassName("sortableHover")),d().getAbstractViewFormElementDomElement(n)?.parentElement?.classList.add(o().getDomElementClassName("sortableHover")))}function Qe(e,t,n,r){let i,l;r?i=S(t,"before",r):n?i=S(t,"after",n):(l=f().getParentTreeNodeIdentifierPathWithinDomElement(e),l?i=S(t,"inside",l):a().assert(!1,"Next element, previous or parent element need to be set.",1479048646)),f().getTreeNodeWithinDomElement(e)?.setAttribute(o().getDomElementDataAttribute("elementIdentifier"),i.get("__identifierPath"))}function Xe(){const e=document.querySelector(o().getDomElementDataIdentifierSelector("buttonHeaderClose"));document.location.href=e?.href??""}function ae(e,t){a().getUtility().isUndefinedOrNull(t)?e?.classList.replace("panel-default","panel-danger"):e?.classList.add(o().getDomElementClassName(t))}function Ye(e,t){a().getUtility().isUndefinedOrNull(t)?e?.classList.replace("panel-danger","panel-default"):e?.classList.remove(o().getDomElementClassName(t))}function h(e){e?.classList.remove(o().getDomElementClassName("hidden")),e&&(e.style.display="")}function le(e){e?.classList.add(o().getDomElementClassName("hidden")),e&&(e.style.display="none")}function Ze(e){e&&(e.disabled=!1),e?.classList.remove(o().getDomElementClassName("disabled"))}function et(e){e&&(e.disabled=!0),e?.classList.add(o().getDomElementClassName("disabled"))}function P(e){e?.classList.add(o().getDomElementClassName("active"))}function x(e){e?.classList.remove(o().getDomElementClassName("active"))}function tt(){y.getIcon(o().getDomElementDataAttributeValue("iconSaveSpinner"),y.sizes.small).then(function(e){const t=document.querySelector(o().getDomElementDataIdentifierSelector("iconSave"));if(t){const n=document.createElement("div");n.innerHTML=e,t.replaceWith(n.firstElementChild??n)}})}function nt(){y.getIcon(o().getDomElementDataAttributeValue("iconSave"),y.sizes.small).then(function(e){const t=document.querySelector(o().getDomElementDataIdentifierSelector("iconSaveSpinner"));if(t){const n=document.createElement("div");n.innerHTML=e,t.replaceWith(n.firstElementChild??n)}})}function ot(){w.success(g(u(),"saveSuccessFlashMessageTitle"),g(u(),"saveSuccessFlashMessageMessage"),2)}function rt(e){w.error(g(u(),"saveErrorFlashMessageTitle"),g(u(),"saveErrorFlashMessageMessage")+" "+e.message)}function it(e,t){w.error(e,t,2)}function at(e,t){I=e,N.bootstrap(I),ve(),be(),De(),Se(),he(),fe(),Ee(t)}export{ke as addAbstractViewValidationResults,te as addStagePanelSelection,Y as addStructureRootElementSelection,G as addStructureSelection,Fe as addStructureValidationResults,at as bootstrap,Xe as closeEditor,Be as createAndAddFormElement,We as createAndAddPropertyCollectionElement,et as disableButton,Ze as enableButton,He as focusFirstInspectorInput,Ce as getConfiguration,a as getFormEditorApp,g as getFormElementDefinition,o as getHelper,R as getInspector,D as getModals,ye as getPreviewMode,d as getStage,f as getStructure,M as getStructureRootContainer,Q as getStructureRootElement,le as hideComponent,S as moveFormElement,_e as movePropertyCollectionElement,$e as onAbstractViewDndChangeBatch,Ke as onAbstractViewDndStartBatch,Ge as onAbstractViewDndUpdateBatch,Je as onStructureDndChangeBatch,Qe as onStructureDndUpdateBatch,ze as onViewReadyBatch,U as refreshSelectedElementItemsBatch,ie as removeAllStageElementSelectionsBatch,J as removeAllStructureSelections,x as removeButtonActive,Ye as removeElementValidationErrorClass,Oe as removeFormElement,je as removePropertyCollectionElement,ne as removeStagePanelSelection,X as removeStructureRootElementSelection,Ae as removeStructureSelection,oe as renderAbstractStageArea,Ue as renderInspectorCollectionElementEditors,H as renderInspectorEditors,T as renderPagination,qe as renderPreviewStageArea,xe as renderUndoRedo,L as renewStructure,re as selectPageBatch,Pe as selectStructureNode,P as setButtonActive,ae as setElementValidationErrorClass,we as setPreviewMode,ee as setStageHeadline,Z as setStructureRootElementTitle,Ve as showCloseConfirmationModal,h as showComponent,it as showErrorFlashMessage,Le as showInsertElementsModal,Me as showInsertPagesModal,Te as showInspectorSidebar,Ie as showRemoveCollectionElementModal,Ne as showRemoveFormElementModal,nt as showSaveButtonSaveIcon,tt as showSaveButtonSpinnerIcon,rt as showSaveErrorMessage,ot as showSaveSuccessMessage,Re as showValidationErrorsModal}; diff --git a/Resources/Public/JavaScript/backend/form-manager.js b/Resources/Public/JavaScript/backend/form-manager.js new file mode 100644 index 0000000..5132ea5 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-manager.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +function n(r,t,i){if(typeof r=="function"&&(r=r()!==!1),!r)throw t=t||"Assertion failed",i&&(t=t+" ("+i+")"),typeof Error<"u"?new Error(t):t}class s{constructor(t,i){this.isRunning=!1,this.configuration=t,this.viewModel=i}assert(t,i,e){n(t,i,e)}getPrototypes(){return Array.isArray(this.configuration.selectablePrototypesConfiguration)?this.configuration.selectablePrototypesConfiguration.map(t=>({label:t.label,value:t.identifier})):[]}getTemplatesForPrototype(t){if(n(typeof t=="string",'Invalid parameter "prototypeName"',1475945286),!Array.isArray(this.configuration.selectablePrototypesConfiguration))return[];const i=[];return this.configuration.selectablePrototypesConfiguration.forEach(e=>{Array.isArray(e.newFormTemplates)&&e.identifier===t&&e.newFormTemplates.forEach(a=>{i.push({label:a.label,value:a.templatePath})})}),i}getAccessibleStorageAdapters(){return Array.isArray(this.configuration.accessibleStorageAdapters)?this.configuration.accessibleStorageAdapters:[]}getAccessibleStorageLocationsForAdapter(t){const i=this.configuration.accessibleStorageAdapters?.find(e=>e.typeIdentifier===t.typeIdentifier);return!i||!i.options?.allowedStorageLocations?[]:i.options.allowedStorageLocations}getAjaxEndpoint(t){return n(typeof this.configuration.endpoints[t]<"u","Endpoint "+t+" does not exist",1477506508),this.configuration.endpoints[t]}run(){if(this.isRunning)throw"You can not run the app twice (1475942618)";return this.bootstrap(),this.isRunning=!0,this}viewSetup(){n(typeof this.viewModel.bootstrap=="function",'The view model does not implement the method "bootstrap"',1475942906),this.viewModel.bootstrap(this)}bootstrap(){this.configuration=this.configuration||{},n(typeof this.configuration.endpoints=="object",'Invalid parameter "endpoints"',1477506504),this.viewSetup()}}let o=null;function f(r,t){return o===null&&(o=new s(r,t)),o}export{s as FormManager,n as assert,f as getInstance}; diff --git a/Resources/Public/JavaScript/backend/form-manager/main.js b/Resources/Public/JavaScript/backend/form-manager/main.js new file mode 100644 index 0000000..a06ccab --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-manager/main.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import t from"@typo3/core/document-service.js";import o from"@typo3/core/event/regular-event.js";class a{constructor(){t.ready().then(()=>{const e=document.getElementById("search_field");if(e!==null){const r=e.value!=="";new o("search",()=>{e.value===""&&r&&e.closest("form").requestSubmit()}).bindTo(e)}})}}var n=new a;export{n as default}; diff --git a/Resources/Public/JavaScript/backend/form-manager/view-model.js b/Resources/Public/JavaScript/backend/form-manager/view-model.js new file mode 100644 index 0000000..0e359f6 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-manager/view-model.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import l from"@typo3/backend/modal.js";import h from"@typo3/backend/severity.js";import v from"@typo3/backend/icons.js";import b from"@typo3/backend/notification.js";import z from"@typo3/core/security-utility.js";import M from"@typo3/core/ajax/ajax-request.js";import{AjaxResponse as L}from"@typo3/core/ajax/ajax-response.js";import{SeverityEnum as w}from"@typo3/backend/enum/severity.js";import{topLevelModuleImport as y}from"@typo3/backend/utility/top-level-module-import.js";import{html as k}from"lit";import t from"~labels/form.form_manager_javascript";const u=new z;var f;(function(e){e.newFormModalTrigger='[data-identifier="newForm"]',e.duplicateFormModalTrigger='[data-identifier="duplicateForm"]',e.removeFormModalTrigger='[data-identifier="removeForm"]',e.showReferences='[data-identifier="showReferences"]',e.referenceLink='[data-identifier="referenceLink"]'})(f||(f={}));function S(e){document.querySelectorAll(f.newFormModalTrigger).forEach(r=>{r.addEventListener("click",async c=>{c.preventDefault(),await y("@typo3/form/backend/form-wizard/form-wizard.js");const n=k``;l.advanced({title:t.get("formManager.newFormWizard.step1.title"),content:n,severity:w.notice,size:l.sizes.medium,staticBackdrop:!0,buttons:[]})})})}function T(e){document.querySelectorAll(f.removeFormModalTrigger).forEach(r=>{r.addEventListener("click",async c=>{const n=[];c.preventDefault(),n.push({text:t.get("formManager.cancel"),active:!0,btnClass:"btn-default",name:"cancel",trigger:function(i,o){o.hideModal()}}),n.push({text:t.get("formManager.remove_form"),active:!0,btnClass:"btn-danger",name:"createform",trigger:function(i,o){new M(e.getAjaxEndpoint("delete")).post({formPersistenceIdentifier:r.dataset.formPersistenceIdentifier}).then(async s=>{const d=await s.resolve();d.status==="success"?document.location=d.url:b.error(d.title,d.message),o.hideModal()})}}),l.show(t.get("formManager.remove_form_title"),t.get("formManager.remove_form_message",{0:r.dataset.formName}),h.error,n)})})}function x(e){document.querySelectorAll(f.duplicateFormModalTrigger).forEach(r=>{r.addEventListener("click",async c=>{c.preventDefault(),await y("@typo3/form/backend/form-wizard/form-wizard.js");const n={name:r.dataset.formName,persistenceIdentifier:r.dataset.formPersistenceIdentifier},i=k``;l.advanced({title:t.get("formManager.duplicateFormWizard.step1.title",{0:r.dataset.formName}),content:i,severity:w.notice,size:l.sizes.medium,staticBackdrop:!0,buttons:[]})})})}function I(e){document.querySelectorAll(f.showReferences).forEach(r=>{r.addEventListener("click",c=>{c.preventDefault();const n=e.getAjaxEndpoint("references")+"&formPersistenceIdentifier="+r.dataset.formPersistenceIdentifier;new M(n).get().then(async i=>{const o=await i.resolve();let s;const d=[];d.push({text:t.get("formManager.cancel"),active:!0,btnClass:"btn-default",name:"cancel",trigger:function(a,m){m.hideModal()}});const E=o.references.length,F=await v.getIcon("actions-open",v.sizes.small);if(E>0){s='

      '+t.get("formManager.references.headline")+'

      ";for(let a=0,m=o.references.length;a";s+="
      '+t.get("formManager.table.field.title")+""+t.get("formManager.table.field.uid")+''+t.get("formManager.table.field.control")+"
      '+o.references[a].recordIcon+''+u.encodeHtml(o.references[a].recordTitle)+""+u.encodeHtml(o.references[a].recordUid)+'
      "}else s="

      "+t.get("formManager.references.title",{0:u.encodeHtml(o.formPersistenceIdentifier)})+"

      "+t.get("formManager.no_references")+"
      ";const g=document.createElement("template");g.innerHTML=s;const p=g.content;p.querySelectorAll(f.referenceLink).forEach(a=>{a.addEventListener("click",m=>{m.preventDefault(),l.currentModal.hideModal(),document.location=m.currentTarget.href})}),l.show(t.get("formManager.references.title",{0:r.dataset.formName}),p,h.notice,d)}).catch(i=>{i instanceof L&&b.error(i.response.statusText,String(i.response.status),2)})})})}function j(e){T(e),S(e),x(e),I(e)}export{j as bootstrap}; diff --git a/Resources/Public/JavaScript/backend/form-wizard/finisher/create-form-submission-service.js b/Resources/Public/JavaScript/backend/form-wizard/finisher/create-form-submission-service.js new file mode 100644 index 0000000..d220a82 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-wizard/finisher/create-form-submission-service.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import o from"@typo3/core/ajax/ajax-request.js";import s from"~labels/form.form_manager_javascript";class a{constructor(e){this.context=e}async execute(){const e=this.context.getDataStore(),r=this.context.formManager.getAjaxEndpoint("create"),t=await(await new o(r).post({formName:e.settings.formName,templatePath:e.settings.template,prototypeName:e.settings.prototype,storage:e.storage.typeIdentifier,storageLocation:e.settings.storageLocation})).resolve();return t?.status==="success"?{success:!0,finisher:{identifier:"redirect",module:"@typo3/backend/wizard/finisher/redirect-finisher.js",data:{url:t.url},labels:{successTitle:s.get("formManager.finisher.redirect.success.title"),successDescription:s.get("formManager.finisher.redirect.success.description")}}}:{success:!1,errors:[t?.message]}}}export{a as CreateFormSubmissionService}; diff --git a/Resources/Public/JavaScript/backend/form-wizard/finisher/duplicate-form-submission-service.js b/Resources/Public/JavaScript/backend/form-wizard/finisher/duplicate-form-submission-service.js new file mode 100644 index 0000000..d75869c --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-wizard/finisher/duplicate-form-submission-service.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import i from"@typo3/core/ajax/ajax-request.js";import r from"~labels/form.form_manager_javascript";class o{constructor(e,s){this.context=e,this.formPersistenceIdentifier=s}async execute(){const e=this.context.getDataStore(),s=this.context.formManager.getAjaxEndpoint("duplicate"),t=await(await new i(s).post({formName:e.settings.formName,storage:e.storage.typeIdentifier,storageLocation:e.settings.storageLocation,formPersistenceIdentifier:this.formPersistenceIdentifier})).resolve();return t?.status==="success"?{success:!0,finisher:{identifier:"redirect",module:"@typo3/backend/wizard/finisher/redirect-finisher.js",data:{url:t.url},labels:{successTitle:r.get("formManager.finisher.redirect.success.title"),successDescription:r.get("formManager.finisher.redirect.success.description")}}}:{success:!1,errors:[t?.message]}}}export{o as DuplicateFormSubmissionService}; diff --git a/Resources/Public/JavaScript/backend/form-wizard/form-wizard.js b/Resources/Public/JavaScript/backend/form-wizard/form-wizard.js new file mode 100644 index 0000000..e580c74 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-wizard/form-wizard.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import"@typo3/backend/wizard/wizard.js";import{state as d,property as l,query as S,customElement as w}from"lit/decorators.js";import u from"@typo3/form/backend/form-wizard/steps/settings-step.js";import{LitElement as g,html as f}from"lit";import c from"~labels/form.form_manager_javascript";import{StepSummaryEvent as h}from"@typo3/backend/wizard/events/step-summary-event.js";import{DuplicateFormSubmissionService as v}from"@typo3/form/backend/form-wizard/finisher/duplicate-form-submission-service.js";import y from"@typo3/form/backend/form-wizard/steps/mode-step.js";import{CreateFormSubmissionService as z}from"@typo3/form/backend/form-wizard/finisher/create-form-submission-service.js";import{FormManager as M}from"@typo3/form/backend/form-manager.js";import{AutoAdvanceEvent as F}from"@typo3/backend/wizard/events/auto-advance-event.js";import{StorageStep as b}from"@typo3/form/backend/form-wizard/steps/storage-step.js";var a=function(o,t,e,s){var n=arguments.length,i=n<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,e):s,m;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(o,t,e,s);else for(var p=o.length-1;p>=0;p--)(m=o[p])&&(i=(n<3?m(i):n>3?m(t,e,i):m(t,e))||i);return n>3&&i&&Object.defineProperty(t,e,i),i};let r=class extends g{constructor(){super(...arguments),this.steps=[],this.errorMessage=null,this.duplicateForm=null}connectedCallback(){super.connectedCallback(),this.addEventListener(h.eventName,this.handleStepSummary)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(h.eventName,this.handleStepSummary)}firstUpdated(t){if(super.firstUpdated(t),this.formManager.getAccessibleStorageAdapters().length<1){this.errorMessage=c.get("formManager.newFormWizard.step1.noStorages");return}const e={wizard:this.wizard,formManager:this.formManager,getStoreData:this.wizard.getStoreData.bind(this.wizard),setStoreData:this.wizard.setStoreData.bind(this.wizard),clearStoreData:this.wizard.clearStoreData.bind(this.wizard),getDataStore:this.wizard.getDataStore.bind(this.wizard),dispatchAutoAdvance:()=>this.wizard.dispatchEvent(new F)};this.duplicateForm!=null?(this.steps=[new b(e),new u(e)],this.submissionService=new v(e,this.duplicateForm.persistenceIdentifier)):(this.steps=[new y(e),new b(e),new u(e)],this.submissionService=new z(e))}createRenderRoot(){return this}render(){return this.errorMessage?this.wizard.renderError(this.errorMessage):f``}handleStepSummary(t){this.duplicateForm!==null&&(t.detail.summaryData=[{label:c.get("formManager.form_copied"),value:f`${this.duplicateForm.name}`},...t.detail.summaryData])}};a([d()],r.prototype,"steps",void 0),a([d()],r.prototype,"submissionService",void 0),a([d()],r.prototype,"errorMessage",void 0),a([l({type:M,attribute:!1})],r.prototype,"formManager",void 0),a([l({type:Object,attribute:!1})],r.prototype,"duplicateForm",void 0),a([S("typo3-backend-wizard")],r.prototype,"wizard",void 0),r=a([w("typo3-backend-form-wizard")],r);export{r as FormWizard}; diff --git a/Resources/Public/JavaScript/backend/form-wizard/steps/mode-step.js b/Resources/Public/JavaScript/backend/form-wizard/steps/mode-step.js new file mode 100644 index 0000000..88fa609 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-wizard/steps/mode-step.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{html as s}from"lit";import{live as l}from"lit/directives/live.js";import{unsafeHTML as c}from"lit/directives/unsafe-html.js";import t from"~labels/form.form_manager_javascript";var a;(function(i){i.Blank="blank",i.Predefined="predefined"})(a||(a={}));class n{constructor(e){this.context=e,this.key="mode",this.title=t.get("formManager.newFormWizard.step1.progressLabel"),this.autoAdvance=!0,this.selectedMode=null,this.modes=[{key:a.Blank,label:t.get("formManager.blankForm.label"),description:t.get("formManager.blankForm.description"),iconIdentifier:"apps-pagetree-page-default"},{key:a.Predefined,label:t.get("formManager.predefinedForm.label"),description:t.get("formManager.predefinedForm.description"),iconIdentifier:"form-page"}]}isComplete(){return this.getValue()!==null}render(){return this.getValue()==null&&this.modes.length>0&&this.setValue(this.modes[0].key),s`
      ${this.modes.map(e=>s`
      this.setValue(e.key)}>
      `)}
      `}reset(){this.setValue(null),this.context.clearStoreData(this.key)}getValue(){return this.selectedMode}setValue(e){this.selectedMode=e,this.context.wizard.requestUpdate()}beforeAdvance(){this.context.setStoreData(this.key,this.getValue())}getSummaryData(){const e=this.context.getStoreData(this.key);if(!e)return[];const r=this.modes.find(o=>o.key===e);return r?[{label:t.get("formManager.newFormWizard.step.modes.summary.title"),value:s`${r.label}`}]:[]}}export{a as MODE,n as ModeStep,n as default}; diff --git a/Resources/Public/JavaScript/backend/form-wizard/steps/settings-step.js b/Resources/Public/JavaScript/backend/form-wizard/steps/settings-step.js new file mode 100644 index 0000000..2eae5b8 --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-wizard/steps/settings-step.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{html as r,nothing as i}from"lit";import{MODE as m}from"@typo3/form/backend/form-wizard/steps/mode-step.js";import o from"~labels/form.form_manager_javascript";class c{constructor(e){this.context=e,this.key="settings",this.title=o.get("formManager.newFormWizard.step2.title"),this.autoAdvance=!0,this.data={formName:"",storageLocation:"",prototype:"",template:""},this.reset()}isComplete(){return this.getValue()?.formName!==""}render(){return r`${this.renderPredefinedFormFields()} ${this.renderSavePath()} ${this.renderFormNameInput()}`}reset(){this.setValue({formName:"",storageLocation:""}),this.setPrototype(this.context.formManager.getPrototypes()[0]?.value??""),this.context.clearStoreData(this.key)}getValue(){return this.data}setValue(e){this.data={...this.data,...e},this.context.wizard.requestUpdate()}beforeAdvance(){this.context.setStoreData(this.key,this.getValue())}getSummaryData(){const e=this.context.getStoreData(this.key),a=this.context.formManager.getPrototypes().find(s=>s.value===e.prototype)?.label,n=this.context.formManager.getTemplatesForPrototype(e.prototype).find(s=>s.value===e.template)?.label,l=this.context.getStoreData("mode")===m.Predefined,t=this.context.getStoreData("storage"),g=(t?this.context.formManager.getAccessibleStorageLocationsForAdapter(t):[]).find(s=>s.value===e.storageLocation)?.label??e.storageLocation;return[...l?[{value:a,label:o.get("formManager.form_prototype")},{value:n,label:o.get("formManager.form_template")}]:[],{value:e.formName,label:o.get("formManager.form_name")},{value:g,label:o.get("formManager.form_storageLocation")}]}renderSavePath(){const e=this.context.formManager.getAccessibleStorageLocationsForAdapter(this.context.getStoreData("storage"))??[];return e.length<=1?(this.setValue({storageLocation:e[0]?.value??""}),i):(!this.data.storageLocation&&e.length>0&&this.setValue({storageLocation:e[0].value}),r`
      ${o.get("formManager.form_storageLocation_description")}
      `)}renderFormNameInput(){return r`
      ${o.get("formManager.form_name_description")}
      this.setValue({formName:e.target.value})}>
      `}renderPredefinedFormFields(){const e=this.context.formManager.getPrototypes()??[];if(this.context.getStoreData("mode")!==m.Predefined||e.length<1)return i;const a=this.data.prototype,n=this.context.formManager.getTemplatesForPrototype(a);let l=i;return n.length>0&&(l=r`
      `),r`
      ${l}`}setPrototype(e){const a=this.context.formManager.getTemplatesForPrototype(e);this.setValue({prototype:e,template:a[0]?.value??""})}}export{c as SettingsStep,c as default}; diff --git a/Resources/Public/JavaScript/backend/form-wizard/steps/storage-step.js b/Resources/Public/JavaScript/backend/form-wizard/steps/storage-step.js new file mode 100644 index 0000000..1870c4d --- /dev/null +++ b/Resources/Public/JavaScript/backend/form-wizard/steps/storage-step.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{html as s}from"lit";import{live as o}from"lit/directives/live.js";import{unsafeHTML as n}from"lit/directives/unsafe-html.js";import a from"~labels/form.form_manager_javascript";class r{constructor(e){this.context=e,this.key="storage",this.title=a.get("formManager.newFormWizard.step.storages.progressLabel"),this.autoAdvance=!0,this.hasDispatchedAutoAdvance=!1,this.selectedStorage=null}isComplete(){return this.getValue()!==null}render(){const e=this.context.formManager.getAccessibleStorageAdapters();let i=!1;return this.getValue()==null&&e.length>0&&(this.setValue(e[0]),e.length===1&&(i=!0)),i&&!this.hasDispatchedAutoAdvance?(this.hasDispatchedAutoAdvance=!0,this.context.dispatchAutoAdvance(),this.context.wizard.renderLoader()):s`

      ${a.get("formManager.newFormWizard.step.storages.title")}

      ${a.get("formManager.newFormWizard.step.storages.description")}

      ${e.map(t=>s`
      this.setValue(t)}>
      `)}
      `}reset(){this.setValue(null),this.context.clearStoreData(this.key)}getValue(){return this.selectedStorage}setValue(e){this.selectedStorage=e,this.context.wizard.requestUpdate()}beforeAdvance(){this.context.setStoreData(this.key,this.getValue())}getSummaryData(){const e=this.context.getStoreData(this.key);return e?[{label:a.get("formManager.newFormWizard.step.storages.summary.title"),value:s`${e.label}`}]:[]}}export{r as StorageStep,r as default}; diff --git a/Resources/Public/JavaScript/backend/helper.js b/Resources/Public/JavaScript/backend/helper.js new file mode 100644 index 0000000..43eac5b --- /dev/null +++ b/Resources/Public/JavaScript/backend/helper.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +import{loadModule as a}from"@typo3/core/java-script-item-processor.js";import r from"@typo3/core/document-service.js";class l{static dispatchFormEditor(o,t){r.ready().then(()=>{Promise.all([a(o.app),a(o.mediator),a(o.viewModel)]).then(e=>((d,i,n)=>{window.TYPO3.FORMEDITOR_APP=d.getInstance(t,i,n).run()})(...e))})}static dispatchFormManager(o,t){r.ready().then(()=>{Promise.all([a(o.app),a(o.viewModel)]).then(e=>((d,i)=>{window.TYPO3.FORMMANAGER_APP=d.getInstance(t,i).run()})(...e))})}}export{l as Helper}; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3559407 --- /dev/null +++ b/composer.json @@ -0,0 +1,64 @@ +{ + "name": "typo3/cms-form", + "type": "typo3-cms-framework", + "description": "TYPO3 CMS Form - Flexible TYPO3 frontend form framework that comes with a backend editor interface.", + "homepage": "https://typo3.community/", + "funding": [ + { + "type": "membership", + "url": "https://typo3.org/membership" + } + ], + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "support": { + "issues": "https://forge.typo3.org/issues/", + "forum": "https://talk.typo3.org/", + "source": "https://github.com/TYPO3/typo3/", + "docs": "https://docs.typo3.org/c/typo3/cms-form/main/en-us/", + "rss": "https://news.typo3.com/rss/", + "chat": "https://typo3.community/meet/slack/", + "security": "https://typo3.org/security/" + }, + "config": { + "sort-packages": true + }, + "require": { + "psr/http-message": "^1.1 || ^2.0", + "symfony/expression-language": "^7.4.8", + "typo3/cms-core": "15.0.*@dev", + "typo3/cms-frontend": "15.0.*@dev" + }, + "suggest": { + "typo3/cms-filelist": "Listing of files in the directory", + "typo3/cms-impexp": "Import and Export of records from TYPO3 in a custom serialized format (.T3D) for data exchange with other TYPO3 systems.", + "typo3/cms-lowlevel": "To display the YAML configuration in the configuration module" + }, + "conflict": { + "typo3/cms": "*" + }, + "extra": { + "branch-alias": { + "dev-main": "15.0.x-dev" + }, + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "form" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Form\\": "Classes/" + } + } +} diff --git a/ext_localconf.php b/ext_localconf.php new file mode 100644 index 0000000..1dafd0d --- /dev/null +++ b/ext_localconf.php @@ -0,0 +1,37 @@ +beforeAddSysFileRecordOnImport'; +} + +// Register RTE presets for form extension +// form-label: Simple formatting for labels (bold, italic, link) +if (empty($GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['form-label'])) { + $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['form-label'] = 'EXT:form/Configuration/RTE/FormLabel.yaml'; +} +// form-content: Extended formatting for content fields (includes lists) +if (empty($GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['form-content'])) { + $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['form-content'] = 'EXT:form/Configuration/RTE/FormContent.yaml'; +} + +// Deny direct DataHandler write access to form_definition: only DatabaseStorageAdapter may persist form definitions +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['form'] = FormDefinitionDataHandlerHook::class; +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['form'] = FormDefinitionDataHandlerHook::class; + +// Add validation call for input which contains email or form element identifier +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tce']['formevals'][EmailOrFormElementIdentifier::class] = ''; + +// Register FE plugin +ExtensionUtility::configurePlugin('Form', 'Formframework', [FormFrontendController::class => ['render', 'perform']], [FormFrontendController::class => ['perform']]); diff --git a/ext_tables.sql b/ext_tables.sql new file mode 100644 index 0000000..5de234c --- /dev/null +++ b/ext_tables.sql @@ -0,0 +1,9 @@ +CREATE TABLE sys_refindex ( + # EXT:form BE module related DatabaseService needs this index for "form usage count" lookups + # @todo: Solve differently somehow. It is essentially needed because not all form.yaml + # are FAL resources, but can be provided by extensions, too. See the registered + # softref parser for more details, too. + KEY lookup_string (ref_string(191)), + # Prevent full table scan for queries like "WHERE softref_key='formPersistenceIdentifier' and ref_uid > 0" + KEY idx_softref_key (softref_key,ref_uid) +);
        + +
      • + + + + + + +
      • + +

      AR{w41y1(vQ-tcDl{_^&_~Gfp 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 JuFA#h{~u-h3Bv#Y literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_2.png b/Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a60ea106c6aa9dfe78f148bfd4ecc15883412a1f GIT binary patch literal 82606 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 wgpTGSoNEl*>>CFfB;dYG6D_vsU4 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 gXLkVWvxTyj#Ed)eBLAZ3>I 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_4.png b/Documentation/E/Tutorials/PhotoContest/Images/9_missingEmail_4.png new file mode 100644 index 0000000000000000000000000000000000000000..147a3c91c01308f41e434c5e56b1b42b145221df GIT binary patch literal 82403 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Index.rst b/Documentation/E/Tutorials/PhotoContest/Index.rst new file mode 100644 index 0000000..2872d88 --- /dev/null +++ b/Documentation/E/Tutorials/PhotoContest/Index.rst @@ -0,0 +1,255 @@ + +.. include:: /Includes.rst.txt + + +.. _editors-photoContest: + +=========================== +Create a photo contest form +=========================== + +In this tutorial, you will learn how to create a photo contest with the form framework. + +Let's define what we need: + +- contact information from our visitors: name and email address +- a photo upload for our visitors +- an email to us with the participation +- terms and conditions for our contest +- a thank you page after submitting the form + +Let's get started: + +.. rst-class:: bignums-xxl + +#. Create a new form + + Go to the ``Forms`` module and create a new form by clicking on "Create new form". + + .. figure:: Images/1_createForm.png + :alt: The form module - click the button + + The form module with one form - click the button to create a new one. + +#. Choose a name + + Choose a name for your form - something you will recognize later on - and click "Next" + + .. figure:: Images/2_wizard_1.png + :alt: The form creation wizard - step 1 + +#. Click "Next" + + As we are creating a basic form, step 2 will be automatically done and we directly see step 3. Click "Next" again. + + .. figure:: Images/2_wizard_2.png + :alt: The form creation wizard - step 3 + +#. Create new element + + You will now see the form editor view for your new form. Click on "Create new element" to add a field to your form. The first field we want to create is the "Name". Choose "Text" from "Basic Elements" to create a simple text field for the first name. + + .. figure:: Images/3_createElement_1.png + :alt: Create New Element Button + +#. Set options for "Name" + + After selecting the "Text" type, we get new options in the inspector panel: + + .. figure:: Images/3_createElement_2.png + :alt: Fields for a simple text field + + Fields for a simple text field. + + 1. Label: Enter a label for your field - in this case "Name". + 2. Placeholder: Enter an example value for the field - this will be used as placeholder in the frontend. + 3. Add a validator "Non-XML text" to only allow simple text input. + +#. Create image upload field + + Similar to the previous field, add an image upload field. Choose type `Image Upload`. + + .. figure:: Images/4_createImageUpload_1.png + :alt: Create Image Upload + +#. Configure image upload field + + Set options for the image upload - for example choose specific image formats or enter a max file size. + + .. figure:: Images/4_createImageUpload_2.png + :alt: Configure Image Upload + + The options of the image upload. + +#. Create "Terms and Conditions" + + To display terms and conditions for our contest, we want to add a simple static text to the form. Choose "Static Text" from the available element types. + + .. figure:: Images/5_createStaticText_1.png + :alt: The static text type + + Choose "Static Text". + +#. Enter "Terms and Conditions" + + Fill the text box with the terms and conditions for your contest. + + .. figure:: Images/5_createStaticText_2.png + :alt: Set options for Static Text + + Set options for static text. + +#. Change the headline and buttons + + We want to have a nice headline for the form and the next button should read "Summary". To do that, click on "Step" (1) in the form tree and set the fields (2,3) on the right. You don't need to change the previous label, as we are on the first page and there is no previous in this case. + + .. figure:: Images/6_setOptionsForStep.png + :alt: Set options for step + +#. Create a summary page + + We want to create a summary page where the user can confirm his or her data again. Click on "Create new step" on the left to create a new page/step in the form. + + .. figure:: Images/7_createSummary_1.png + :alt: Create new step + + Create a new step in a form. + + .. figure:: Images/7_createSummary_2.png + :alt: Create new step - choose summary + + Choose summary as type for your new step + + .. figure:: Images/7_createSummary_3.png + :alt: Create new step - configure summary + + Configure the summary headline and button labels. + +#. Preview the form + + Click on the preview button to preview the form. + + .. figure:: Images/8_preview.png + :alt: Preview the form + + Preview the form. + + Oh no! We forgot to create the email field. Let's do that next. + +#. Add an email field + + Go back to editing the form (1) and click on "Create new element" (2). + + .. figure:: Images/9_missingEmail_1.png + :alt: Switch to editing and Create new element + + Switch to editing and create new element + + .. figure:: Images/9_missingEmail_2.png + :alt: Choose "email address" + + The "email address" type + + .. figure:: Images/9_missingEmail_3.png + :alt: Configure the email address field + + Configure the email address field. + + .. figure:: Images/9_missingEmail_4.png + :alt: Move the email address field + + Move the email address field to a better position via drag and drop. + +#. Save the form + + Your form is now fully configured and ready to be inserted on pages. + + .. figure:: Images/10_saveTheForm.png + :alt: Save the form + + Save the form. + + You can save the form and do another review - now it looks fine. Let's go and insert it on a page. + +#. Choose a page for your form + + The form you configured can now be inserted on any page you want. Go to the page module and choose one. + + .. figure:: Images/11_selectPage.png + :alt: Select a page for your form + + 1. Go to the page module. + 2. Choose a page in the page tree (for example: "Contest"). + 3. Click on `+ Content` to create a new content element. + +#. Insert Plugin + + From the content element wizard, choose "Form" (in "Form elements" tab). + + .. figure:: Images/12_chooseForm.png + :alt: Choose form as type + +#. Choose your form definition + + In the plugin tab, choose the form definition you just created. You can also use the "normal" TYPO3 fields like header to render a headline for your form. + + .. figure:: Images/13_chooseFormDefinition.png + :alt: Choose the form definition + + Having a separate form definition allows you to insert the form on many pages, customizing for example the headline in each case. + +#. Save the content element + + Save the content element and go and view your web page. You can now see your finished form. + + .. figure:: Images/14_frontend_1.png + :alt: The finished form - Step 1 + + Depending on your frontend, your form might look different. + + .. figure:: Images/14_frontend_2.png + :alt: The finished form - Step 2 + + Depending on your frontend, your summary page might look different. + + When testing your form, you might notice that it doesn't do anything yet when we fill it. That's bad. Let's change that. + +#. Add email finisher + + Everytime someone fills the form we want to receive an email with the contest picture. Let's add an email finisher for that: + + .. figure:: Images/15_addEmail.png + :alt: Add email finisher + + Configure the email finisher + +#. Add redirect to "Thank You" page + + After submitting the form we want to redirect the user to a thank you page. There's a ready-made finisher for that, too - the "Redirect to a page" finisher: + + .. figure:: Images/16_addRedirect_1.png + :alt: Redirect Finisher Options + + Redirect finisher with options. + + Choose "Redirect to a page" from the finisher menu. Click on the "Page" button to open the page browser. + + .. figure:: Images/16_addRedirect_2.png + :alt: Page browser of redirect finisher. + + Page browser. + + Choose your thank you page. + + .. attention:: + + Make sure that the redirect finisher is the last finisher - after the redirect no other finishers will be executed. + +#. Test again - Enjoy! + + Save the form and reload the frontend. Now you can test the form again. After submitting you will now be redirected to the thank you page. + + .. figure:: Images/17_thankYouPage.png + :alt: Thank you page. + + Depending on your frontend, your page might look different. diff --git a/Documentation/E/Validators/Images/form_validators.png b/Documentation/E/Validators/Images/form_validators.png new file mode 100644 index 0000000000000000000000000000000000000000..25da0c1d1565590c483bdcc810c3394f84c2c64f GIT binary patch literal 1233 zcmV;?1TOoDP)q?cqs-4w=5(M38>WR6qu#BDq6<%<+<~Uy?e6uuKuB<5JHyO2=iUlGq}XZCm$VOPAsoM{lPmT)MGgz3*Og(pSU^G!i?10(RWsbpO1dt zAo`i>rP-|!63vxomD;88rehNIVEcTfHt`u!w`j@!p6bBbb8qAz@Dn;SU)vvizqPA( z(XV!1`k8P^(_Z4}(a^;`B$3vq^-pS+FYI>u(rD*0O;_xjCh!yc`{fWFV@mOhYL9q< z6raE2nf?)_(uS*%{u>))3PUup({}77V#O)f^OeS(zTjWWt{BTCucGmlx zjFBzkMN6b{E`Dsz9b48o9^Np@9Zp8A+ZdFqcHY31oyC*ceHS*G*}NvvPn=EWHSygk zXgq;pvs?HP#b5fh?OwUiQboX)$kaKlzy2Zzf2a+g`;^1FRJ8vGj86-Dl>F?WYd_mD zKJuOD=bk-u;QNXRr=R{K3OjbS=;ae$>1P!HoqX20_;HnQty%LM;0N*nfCz$tvQ_3PN}aDJw$ z?#6n9qcRz3a%l4wwQxgcZU)U))L?_^py(&gh7!iP`uD~t#a(-jhQFm4@m@bC;1s@D z`Z)@lT`#?vs3unVy~>7)W3#GDgd0pBe#2v3Vscs6+GfE|oK1cim)W%|+fowKJG@n% z)WLhPAN>CSKkx%T2>ieg{J;+aKk$31{YVR(-H3-h1f*<&S9|V5j v2Y%oOfgkvRANWDw2Y%oOeh~P9-~Zpg$Fxz^@q*!T00000NkvXXu0mjfaI<~b literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_alphanumeric.png b/Documentation/E/Validators/Images/form_validators_alphanumeric.png new file mode 100644 index 0000000000000000000000000000000000000000..141d16b19595033f372d1bced0b87f18568c7410 GIT binary patch literal 3288 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 RsD7U;PgJy&%M{In{|B%|8sGo` literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_dateRange.png b/Documentation/E/Validators/Images/form_validators_dateRange.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca114be8d6b94fd9e7d0d8c2de97af290cacd11 GIT binary patch literal 5597 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_dateTime.png b/Documentation/E/Validators/Images/form_validators_dateTime.png new file mode 100644 index 0000000000000000000000000000000000000000..de89a25d17e140f575b925dc7ec9edf93e4a07c3 GIT binary patch literal 3134 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_email.png b/Documentation/E/Validators/Images/form_validators_email.png new file mode 100644 index 0000000000000000000000000000000000000000..6f147694b1cee24ea2e29c7469e7773e6e7ac80c GIT binary patch literal 2958 zcmZvec{CLK8pqMA#%>TZ_AJ>d%LuRRF@;2tiVAG#G?NjO#VBj#mX?T}` zff0Ig{s=fJ4Au;(84L_;_lynotpX^klPp%eDA991ML?@R0`py`tLv+(CXv&3QO_oW zy^2;TWB&BjZ3-vL98WY%;ys^HzAJS&e^A2J_&nOW^M!Dj-U|smp zN)!pio>{pQN&LQiD?RR4q%=YqYECeq#(u-;HgB2?ZO4D$Vjvb#C$-_5AD*(2BImF* z6@_2K7)U6)%g^aLkP!Z0HmDqu+!K+J>cqy`y>zs@b6|16_%ODV=)Wd_IQ%qjTMVVw z*feF<8`W(|8h6PAY^}422}66w4xN(hVB1tPtmR6+2d>UL0mGl%8=yd;_<)bNM3rn1 z!Zg>1v9?Z^LyMDF?T4&)wtHhl&q9#_XK>CW#u-`C_#~vdp~*}>+3i4cFqos7I(qYoxs2H>9NRxuGleuU5lT7(gZG1Z?(e?EzvRZQ^t8NeM%;t#@i? z19Ny_TFyQ!Ftmy`RZVLK&9UUR zhbH9`a@y91-g>L!+VGt5&ryl@Ld%0RV=T)2(bE1)caU7R4juu0>3Y|kNraRmyYfYh zIEV0`o>*Tv`eJy&1!~vdIjJ5*NGIJkZO?mc9OOf_-6oN58?wL zei4>yG?y8Cm>;<4UAVMpOe4VdxnD-A9(_%2T;de~OIy zvg=3wY4@HEoX_Cg`ax%35RFr(H?(D_xv9l#9Mk2v8Uvs;N4`Okh|AD^bb$QqRQN|m zC^;d|#`x1xfj7$Rn(aCN~jP%7v+@ZG?Z;sxW@*{%D`7TD| zkb~bSepJ)$?dLO)qc326=9m=-B-dd=5wb)3>=B03s2g>pUCT4ZFJL<{+c#q6%ptJ0 zQM=yNcJ{@ulxCkdpn;oe#i=wNVuezIr%3euX#A1tY2WXv}S|@4C`cQuiKHJlkI`V28WMbNM_%TO)Nj&Gv_uf zrJoS+Z|D7=dP>)ScrjEG%ftagKi%k*N&98T$}B)L>xy{JT}$CVy?KMKu+=WE-dW}c z!@k!T_Jv`;tErs2S3}}u;FT?HJsf%jh)0;Mwbz~hzE+d|lAOBipQGrqvxAds(H24$ zc;@RI<@yr$@mC@10`mizUQ@NcYrO3AUB7cr@evw3$*$c9yaYl z+xuB(;{tzJBRm|w%O}^S2C}cgO?#%l@pdzNdW;}cZf5conkW5~x<62&<7DAd5ii%x zT9%Z2HZ0U&O?lK%yUm0-AfYy2)1o<%3^Os4l0y<@-p5b5Lbunp87~~x=-WOy+7W|u z6g-GjHVg#JB26mQ7o+q-?Ro%E)utSC`R2APXUp}U8s9@!?r!L5!3|O3A=j^4npa?a zU5*7;_P?#tFku|_h!6c)KcOmTslx_V!G2vRVdLWwtxf} zL2|)wv6E#+?fl~7C~sQ&R_s#R;?z8r%U4F%zx%76?G(Zr@IX-|t1 zJRra2-Q|IBd%-)x(kr#WUhUxdcHevZ0zx^{(@`1=eADEa-MT#$GvU%A$?B|&h2Bbc z7OjT`oE_PDmnn!dq0XCq>x*7lDNGazlEc!(;?qmjNFOd+c{-@GYjFjmKYyR>%D10y z{81$Q*{$`9_ul50q&mZ<3yUr!_%HuUxSe1#e`RwjzmZ!>62l0FvP&im1u>@2}Lqdp@|^lq$6`N{; zTJ}lT#&MIVpsq^H_`1s0`jPv(d}R3@sj9Ny^Zd%jwW{3IccUeq06n~r705CDqzza<4LzX> zSRanB(b#oC(b{Z}S3h=2Wy4#XvQNSHzvBLTG$=rciFjGrfYhh>_|=r-e<1tcki+fJ b;JvFGjWuQ_M3{U(4cf*=w+%}T9K!w$#5a(y literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_fileSize.png b/Documentation/E/Validators/Images/form_validators_fileSize.png new file mode 100644 index 0000000000000000000000000000000000000000..169b68198fcbc3973cb3a6d458f1839983445761 GIT binary patch literal 1903 zcmZ{lc{JN;7sqv4OVu_MGgOq66w^*6w3ehAv6K?qp!TX=^u*SoKRewlFSS)Ev6ZCM zE|h7gHPzZ8_OX;{D?%*eM^wrT+Mf5kf4u+PbD!Q8tI{b3!P+5MVQlXpW^k$LgG$~Av4gW60VAj08+X@ zKD;kns||)kvyiAdW zK%}(W1$VbrQK_{^S?W6H%N8%Yd6muHo~G)?eBoS=<^l%eAfN~XEes4|OoljusyXMu z&WEX2_Q(4R1u%(3eht6kxswkIyw2)k?+tq^Yv?k5PKb7La8o1u9RUUI4OA}5`&|YL z#&Da-jn`a8-L}&vwud$eOE*nYG+(FnW?7)y-(zIh;&)u&Q7D(`s;u(H$0jhKX$L^( zBo?;TEcS9DvNH|ErY!jE{t z6TJv(%>t)gcKSt@Of@wc^3T!IwKQ1P)CVA-t0wgxGh2mUcs@To%R#i(&Yb`>=R;^> zI(!;~*n$48E)VZCgVmikegQqy8h3SS;vJW;DQ#A|l5?HuFW4eUbQM%KXk|K#4d<4k z1j8;#^=TSAVO`!Ml`s`lne;OfJc4In)gh5OL)W|$2AS##uL>H8^z5*X4fG#T@Ia{n zj%d^jHt-)}>L;L|b)F)yH(-y7Gu)s&5kH|LZSfr&>jpzN?sjp1 zHn1{JYMkSNit=w8Kt*mUbVmt+1zwfFbsqdLhn(=D4iSoj{BY>-?MM4MgV3S)$|hC> zcF`>)I5-A^S;-seRDyfi?N^juy7=2t=7MM@)iu zJeQ(rJ#?pI_LSen8H=FJ{r)}(Fy&O-IHyjKpC=>9km<(1E5$I8!+W0P&JNsw7R6ep zd3B?AnA!ALsm1>-jnPMXcY8)fXPw`WNG!i%Mr_Pkor5S}C<^IaNsyNUctGC;dxGfC zv}A3*qzZKg@oi3K@v6jnd) zB(0<}7NehX4)3iO?DMEjX;EFRT*N6ynzX21#-}G~4gGKR!YHsLpSF}rDvCzwULi-V{V>0ii1vmsvrT0tfrc7#P-I>R) z3~7-G@LOm>kmR(AnpShuPyPhp1HFZk!@ghcTg!V3*sY8J-)hm~UE?GvA)A8DVScq^ zIK#qy1mymgj=Nv6h=G7WqO-%S#jbFM;UD?-jQtys^kF_8RRXQ%-K_T#C)(* zwL^?M^9ej~dH22lT3*|%Z0Ph;+t%Sa$C|bhCvL$0;9S~qw@MTCc5!Iv)p|@B@QKjy z<$}kvze@3}hO1=YmbfNp5888*jb-^haB^!;1~dpQEsX&2kJoE6;}TRT5+gpFlge-g z`5QDs|pBs$%?fH;CW9AlG(-8$e`SEIh}0C z$gjk8aC3WaD@I_!k}>Ce^!qPdHMZzFa%m^IX!Y!&Y4PFy{;jXt zFxdL4`D_H_?9M6{JO~r~M#~}Fa)V2DC{RX!)&i92nzZ=;nDn{`t4jR^@R7d> g(l@30ijhx`4&Fwg)DWROcA%t2`dGb6-5at00*A!70ssI2 literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_floatingPointNumber.png b/Documentation/E/Validators/Images/form_validators_floatingPointNumber.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3fd74d2c26a68e971fe24ff744f650bfec587d GIT binary patch literal 3509 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 literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_integerNumber.png b/Documentation/E/Validators/Images/form_validators_integerNumber.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b7b72a7508151f815feadf6e868d3ed089ffb5 GIT binary patch literal 3245 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 E3(;7_o&W#< literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_numberOfSubmittedValues.png b/Documentation/E/Validators/Images/form_validators_numberOfSubmittedValues.png new file mode 100644 index 0000000000000000000000000000000000000000..41c323bb8ba4d5f57464a525468bb9404d14ac8a GIT binary patch literal 3281 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 J!sJTye*t(PP)Gm( literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_numberRange.png b/Documentation/E/Validators/Images/form_validators_numberRange.png new file mode 100644 index 0000000000000000000000000000000000000000..1a580810df950495b45667df3484e5253005cb79 GIT binary patch literal 2869 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 E9|Ox;3IG5A literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_regularExpression.png b/Documentation/E/Validators/Images/form_validators_regularExpression.png new file mode 100644 index 0000000000000000000000000000000000000000..46e099d4c4dd2005e76b5160e47ee3211e767fba GIT binary patch literal 3480 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 Q^wpv>(l>+Qb)Dk=4~rYiYybcN literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Images/form_validators_stringLength.png b/Documentation/E/Validators/Images/form_validators_stringLength.png new file mode 100644 index 0000000000000000000000000000000000000000..3643316c22843c8b77b45ba5b5b0cbcc4e11b4ac GIT binary patch literal 2866 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 KoX$OYDdJyOSI!*( literal 0 HcmV?d00001 diff --git a/Documentation/E/Validators/Index.rst b/Documentation/E/Validators/Index.rst new file mode 100644 index 0000000..e1b4062 --- /dev/null +++ b/Documentation/E/Validators/Index.rst @@ -0,0 +1,333 @@ +.. include:: /Includes.rst.txt + + +.. _validators: + +========== +Validators +========== + + +.. _validators-introduction: + +Introduction +------------ + +Validators can be added to all form elements to check user input for "validity" - +i.e. existence, meaningfulness and correctness. For example, you can +determine whether a field has been filled out or if the user has entered a +valid email address. You can also **define** your own **error messages**. +These messages can be edited in the **form editor**. + +This chapter **describes** the individual validators and their +**function**. + +.. figure:: Images/form_validators.png + :alt: In the Inspector - adding validators. + + In the Inspector - adding validators. + + +.. _validators-overview-of-validators: + +Overview of validators +---------------------- + + +.. _validators-alphanumeric: + +Alphanumeric +============ + +This validator checks whether the field contains an alphanumeric string. +"Alphanumeric" means a combination of alphabetic and numeric characters. No +special characters can be entered, only characters from **[A-Z] and [0-9]**. +The settings of the validator are as follows: + +- **Custom error message**: Custom error message that will be shown if the + validator fails. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Textarea"` +- :ref:`"Password"` +- :ref:`"Advanced password"` + +.. figure:: Images/form_validators_alphanumeric.png + :alt: In the Inspector - Settings of the "Alphanumeric" validator. + + In the Inspector - Settings of the "Alphanumeric" validator. + + +.. _validators-string-length: + +String length +============= + +This validator uses *minimum* and *maximum* values to check how many +characters can be **entered**. The settings of the validator are as follows: + +- **Minimum**: Minimum amount of characters the field can contain. +- **Maximum**: Maximum amount of characters the field can contain. +- **Custom error message**: Custom error message that will be shown if the + validator fails. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Textarea"` +- :ref:`"Password"` +- :ref:`"Advanced password"` + +.. figure:: Images/form_validators_stringLength.png + :alt: In the Inspector - settings of the validator "String length". + + In the Inspector - settings of the validator "String length". + + +.. _validators-email: + +Email +===== + +This validator checks whether an entered value is a **valid email address**. +International characters and multiple occurrences of the **@ sign** +are allowed by default. The settings of the validator are as follows: + +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Email address"` (validator is + automatically active) +- :ref:`"Password"` +- :ref:`"Advanced password"` + +.. figure:: Images/form_validators_email.png + :alt: In the Inspector - Settings of the 'Email' validator. + + In the Inspector - Settings of the 'Email' validator. + + +.. _validators-integer-number: + +Integer number +============== + +The validator checks whether an entered value is a **valid integer**. Numbers +with commas are not allowed. The settings of the validator are as +follows: + +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Textarea"` +- :ref:`"Password"` +- :ref:`"Advanced password"` + +.. figure:: Images/form_validators_integerNumber.png + :alt: In the Inspector - settings of the validator 'Integer number'. + + In the Inspector - settings of the validator 'Integer number'. + + +.. _validators-floating-point-number: + +Floating-point number +===================== + +The validator checks whether an entered value is a **valid floating-point +number**. Only numbers with commas can be entered. The settings of the +validator are as follows: + +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Textarea"` +- :ref:`"Password"` +- :ref:`"Advanced password"` + +.. figure:: Images/form_validators_floatingPointNumber.png + :alt: In the Inspector - Settings of the 'Floating-point number' + validator. + + In the Inspector - Settings of the 'Floating-point number' validator. + + +.. _validators-number: + +Number +====== + +The validator checks whether the entered value is a **valid number**. Numbers with +commas are not allowed. The settings of the validator are as +follows: + +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Number"` (validator is + automatically active) + +.. figure:: Images/form_validators_number.png + :alt: In the Inspector - Settings of the 'Number' validator. + + In the Inspector - Settings of the 'Number' validator. + + +.. _validators-number-range: + +Number range +============ + +The validator checks if an entered number is within a +**specified number range**. The settings of the validator are as follows: + +- **Minimum**: The minimum value that can be accepted. +- **Maximum**: The maximum value that can be accepted. +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Textarea"` +- :ref:`"Password"` +- :ref:`"Advanced password"` +- :ref:`"Number"` + +.. figure:: Images/form_validators_numberRange.png + :alt: In the Inspector - Settings of the 'Number range' validator. + + In the Inspector - Settings of the 'Number range' validator. + + +.. _validators-regular-expression: + +Regular expression +================== + +The validator checks whether an **entered value** matches a +**specific regular expression**. The settings of the validator are as follows: + +- **Regular expression**: The regular expression used for validation. +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +Imagine that you want users to specify a domain name. The +resulting value of the field should contain only the domain, for example, "docs.typo3.org" +instead of "https://docs.typo3.org". The regular expression for this +would be **/^[a-z]+.[a-z]+.[a-z]$/**. + +**The validator is available for the following form elements**: + +- :ref:`"Text"` +- :ref:`"Textarea"` +- :ref:`"Password"` +- :ref:`"Advanced password"` +- :ref:`"Telephone number"` +- :ref:`"URL"` + +.. figure:: Images/form_validators_regularExpression.png + :alt: In the Inspector - Settings of the 'Regular Expression' validator. + + In the Inspector - Settings of the 'Regular Expression' validator. + + +.. _validators-date-range: + +Date range +========== + +This validator checks whether an entered value is within a specific +**date range**. The range can be defined by specifying a **start** and/ or +**end date**. The settings of the validator are as follows: + +- **Start date**: The beginning of the date range (input: YYYY-MM-DD). +- **End date**: The end of the date range (input: YYYY-MM-DD). +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Date"` + +.. figure:: Images/form_validators_dateRange.png + :alt: In the Inspector - Settings of the 'Date range' validator. + + In the Inspector - Settings of the 'Date range' validator. + + +.. _validators-number-of-submitted-values: + +Number of submitted values +========================== + +The validator checks whether an entered value contains a specific number of +elements. The settings of the validator are as follows: + +- **Minimum**: The minimum number of values submitted. +- **Maximum**: The maximum number of submitted values. +- **Custom error message**: Custom error message that will be shown if the + validation fails. + +**The validator is available for the following form elements**: + +- :ref:`"Multi checkbox"` +- :ref:`"Multi select"` + +.. figure:: Images/form_validators_numberOfSubmittedValues.png + :alt: In the Inspector - Settings of the validator 'Number of + submitted values'. + + In the Inspector - Settings of the validator'Number of submitted values'. + + +.. _validators-file-size: + +File size +========= + +The validator checks the file size of a **file resource**. The settings of the +validator are as follows: + +- **Minimum**: The minimum acceptable file size (default: 0B). +- **Maximum**: The maximum acceptable file size (default: 10M). + +Use the format **B | K | M | G** (byte | kilobyte | megabyte | gigabyte) when +entering file sizes. For example: **10M** means **10 megabytes**. Please note +that the maximum file size also depends on the settings of your server +environment. + +**The validator is available for the following form elements**: + +- :ref:`"File upload"` +- :ref:`"Image upload"` + +.. figure:: Images/form_validators_fileSize.png + :alt: In the Inspector - Settings of the 'File size' validator. + + In the Inspector - Settings of the 'File size' validator. + + +.. _validators-date-time: + +Date/ Time +========== + +The validator checks if an entered value is a valid **date and/ or time**. +The settings of the validator are as follows: + +- **Custom error message**: Custom error message that will be shown if the + validation fails. diff --git a/Documentation/I/Concepts/Autocomplete/Index.rst b/Documentation/I/Concepts/Autocomplete/Index.rst new file mode 100644 index 0000000..c3e2d78 --- /dev/null +++ b/Documentation/I/Concepts/Autocomplete/Index.rst @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +.. _concepts-autocomplete: + +============ +Autocomplete +============ + +The :guilabel:`Autocomplete` select in the form editor can be used to +define :html:`autocomplete` properties for input fields. This extension +predefines the most common of the input purposes that are widely +recognized by assistive technologies and +`recommended by the W3C `__. The +HTML standard allows arbitrary values. + +If you need to provide additional fields, you can reconfigure the autocomplete +field with additional select options: + +.. _concepts-autocomplete-add-options: + +Add Autocomplete options to the backend editor +============================================== + +Create a form set in your extension and add a :file:`config.yaml` with the +additional autocomplete options. The file is auto-discovered — no PHP or +TypoScript registration is required. + +.. code-block:: none + :caption: Required directory layout + + EXT:my_sitepackage/ + Configuration/ + Form/ + SitePackage/ + config.yaml + +.. literalinclude:: _config.yaml + :language: yaml + :caption: EXT:my_sitepackage/Configuration/Form/SitePackage/config.yaml diff --git a/Documentation/I/Concepts/Autocomplete/_CustomFormSetupAutoCompleteOption.yaml b/Documentation/I/Concepts/Autocomplete/_CustomFormSetupAutoCompleteOption.yaml new file mode 100644 index 0000000..34e5a65 --- /dev/null +++ b/Documentation/I/Concepts/Autocomplete/_CustomFormSetupAutoCompleteOption.yaml @@ -0,0 +1,12 @@ +prototypes: + standard: + formElementsDefinition: + Text: + formEditor: + editors: + 600: + selectOptions: + # Choose an index that is not in use yet + 12345: + value: 'cc-name' + label: 'cc-name - Full name as given on the payment instrument' diff --git a/Documentation/I/Concepts/Autocomplete/_config.yaml b/Documentation/I/Concepts/Autocomplete/_config.yaml new file mode 100644 index 0000000..fa4c2ce --- /dev/null +++ b/Documentation/I/Concepts/Autocomplete/_config.yaml @@ -0,0 +1,17 @@ +name: my-sitepackage/form +label: 'My Sitepackage — Form Configuration' +priority: 200 + +prototypes: + standard: + formElementsDefinition: + Text: + formEditor: + editors: + 600: + selectOptions: + # Choose an index that is not in use yet + 12345: + value: 'cc-name' + label: 'cc-name - Full name as given on the payment instrument' + diff --git a/Documentation/I/Concepts/Configuration/Index.rst b/Documentation/I/Concepts/Configuration/Index.rst new file mode 100644 index 0000000..28de24c --- /dev/null +++ b/Documentation/I/Concepts/Configuration/Index.rst @@ -0,0 +1,379 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-configuration: + +Configuration +============= + + +.. _concepts-configuration-whysomuchconfiguration: + +A lot of configuration. Why? +---------------------------- + +Building forms in a declarative and programmatic way is complex. Dynamic forms need +program code that is as generic as possible. But generic +program code means a lot of configurative overhead. + +Having so much configuration may seem overwhelming, but it has a lot of +advantages. Many aspects of EXT:form can be manipulated purely +by configuration and without having to involve a developer. + +The configuration in EXT:form is mainly located in places which make sense to a +user. However, this means that certain settings have to be +defined in multiple places in order to avoid unpredictable behaviour. There is +no magic in the form framework - it is all about configuration. + + +.. _concepts-configuration-whyyaml: + +Why YAML? +--------- + +Previous versions of EXT:form used a subset of TypoScript to describe form definitions and +form element behavior. This led to a lot of confusion among integrators because the +definition language looked like TypoScript but did not behave +like TypoScript. + +Form and form element definitions had to be declarative, so YAML was chosen as it is +a declarative language. + +.. _concepts-configuration-yamlregistration: + +YAML registration +----------------- + +YAML configuration files are discovered automatically — no PHP or TypoScript +registration is required. + +Place your YAML files in :file:`EXT:my_extension/Configuration/Form//` and +add a :file:`config.yaml` with a unique set name. TYPO3 scans all active +extensions and loads the files automatically for both frontend and backend. + +.. tip:: + + For debugging purposes or to get an overview of the configuration + use the :guilabel:`System > Configuration` module. Select + the :guilabel:`Form: YAML Configuration` item in the menu to display + parsed YAML form setup. Make sure you have the lowlevel + system extension installed. + +.. tip:: + + We recommend using a `site package `_. + This will make your life easier if you need to do a lot of customization of EXT:form. + + +.. _concepts-configuration-yaml-autodiscovery: +.. _concepts-configuration-yamlregistration-frontend: +.. _concepts-configuration-yamlregistration-backend: +.. _concepts-configuration-yamlregistration-backend-addtyposcriptsetup: + +Auto-discovery directory convention +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: none + + EXT:my_extension/ + Configuration/ + Form/ + MyFormSet/ + config.yaml + +The sub-directory name (``MyFormSet``) is arbitrary. An extension may ship +multiple sets in separate sub-directories. + +.. code-block:: yaml + :caption: EXT:my_extension/Configuration/Form/MyFormSet/config.yaml + + name: my-vendor/my-form-set + label: 'My Custom Form Set' + # Load order: lower = loaded first. Core base set uses priority 10. + # Extension sets should use > 10 (default: 100) to overlay the base. + priority: 200 + + # Form configuration goes directly below the metadata: + persistenceManager: + allowedExtensionPaths: + 10: 'EXT:my_extension/Resources/Private/Forms/' + + +.. _concepts-configuration-yamlloading: + +YAML loading +------------ + +TYPO3 uses a ':ref:`YAML loader`' for handling +YAML, based on the Symfony YAML package. This YAML loader is able to resolve +environment variables. In addition, EXT:form comes with its own YAML loader, but it +has some restrictions, especially when resolving environment +variables. This is for security reasons. + +EXT:form differentiates between :ref:`form configuration and form definition`. +A form definition can be :ref:`stored` +in the file system (FAL) or can be shipped with an extension. The type of YAML loader +used depends on the setup. + +.. t3-field-list-table:: + :header-rows: 1 + + - :a: YAML file + :b: YAML loader + + - :a: YAML configuration + :b: TYPO3 core + + - :a: YAML definition stored in file system (default when using the ``form editor``) + :b: TYPO3 Form Framework + + - :a: YAML definition stored in an extension + :b: TYPO3 core + + +.. _concepts-configuration-configurationaspects: + +Configuration aspects +--------------------- + +Four things can be configured in EXT:form: + +- frontend rendering, +- the ``form editor``, +- the ``form manager``, and +- the ``form plugin``. + +All configuration is placed in a single :file:`config.yaml` per form set and +is loaded for both frontend and backend. It is up to you whether you want to +keep all configuration in one set or spread it across multiple form sets with +different priorities. + + +.. _concepts-configuration-inheritances: + +Inheritance +----------- + +The final YAML configuration does not produce one huge file. Instead, it is +a sequential compilation process: + +- Registered configuration files are parsed as YAML and + are combined according to their order. +- Finally, all configuration entries with a value of ``null`` are deleted. + +Instead of inheritance, you can also extend/override the frontend configuration +using TypoScript: + +.. code-block:: typoscript + + plugin.tx_form { + settings { + yamlSettingsOverrides { + ... + } + } + } + +.. note:: + + TypoScript overrides like this are ignored by the backend ``form editor``. + +.. note:: + + This process makes life easier. If you are working + with your :ref:`own configuration files `, + you only have to define things that are different to what was in the previously + loaded configuration files. + +An example of overriding the EXT:form Fluid templates. Place the configuration +in :file:`EXT:my_site_package/Configuration/Form/SitePackage/config.yaml` +(auto-discovered, no PHP or TypoScript registration required): + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + templateRootPaths: + 20: 'EXT:my_site_package/Resources/Private/Templates/Form/Frontend/' + partialRootPaths: + 20: 'EXT:my_site_package/Resources/Private/Partials/Form/Frontend/' + layoutRootPaths: + 20: 'EXT:my_site_package/Resources/Private/Layouts/Form/Frontend/' + +The values in your own configuration file will be merged on top of the EXT:form +base set (:file:`EXT:form/Configuration/Form/Base/config.yaml`). + +.. _concepts-configuration-prevent-duplication: + +Prevent duplication +^^^^^^^^^^^^^^^^^^^ + +You can avoid duplication in your YAML files by using anchors (&), aliases (*) and overrides (<<:). + +.. code-block:: yaml + + customEditor: &customEditor + 1761226183: + identifier: custom + templateName: Inspector-TextEditor + label: Custom editor + propertyPath: custom + + otherCustomEditor: &otherCustomEditor + identifier: otherCustom + templateName: Inspector-TextEditor + label: Other custom editor + propertyPath: otherCustom + + prototypes: + standard: + formElementsDefinition: + Text: + formEditor: + editors: + <<: *customEditor + 1761226184: *otherCustomEditor + + +.. _concepts-configuration-placeholders: + +Referencing values with placeholders +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to anchors and aliases, the TYPO3 YAML loader supports ``%...%`` +placeholders. Unlike anchors, they work *across* imported files, because they +are resolved *after* all files have been parsed and merged. + +A placeholder is a dot-separated path into the merged configuration. The +referenced value is looked up and substituted: + +``%path.to.value%`` + +How the result is inserted depends on where the placeholder is used: + +* **Whole value** – if the placeholder is the *only* content of a value, it is + replaced by the referenced value as-is. This may be a scalar **or a complete + array/subtree**. + +* **Inside a string** – if the placeholder is embedded in a larger string, the + referenced value must be scalar (string or numeric) and is interpolated. + +Placeholders can be nested and are resolved recursively. If a referenced path +does not exist, the placeholder is left unchanged. + +Reusing a single value from an existing form element works the same way – here +the new ``CustomText`` element takes over the label of the core ``Text`` +element: + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + CustomText: + formEditor: + label: '%prototypes.standard.formElementsDefinition.Text.formEditor.label%' + + +.. _concepts-configuration-inherit-across-files: + +Inheriting a complete element across files +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Because a whole-value placeholder substitutes a complete subtree, it can be used +to base a new form element on the complete configuration of an existing (core) element and +override only a few properties. + +A placeholder is resolved *after* parsing and replaces a whole value. The +inheritance and the overrides therefore live in two files: the imported file +copies the complete element subtree, the importing file merges its overrides on +top. + +Imported file, copies the whole ``Text`` element to ``CustomText``: + +.. code-block:: yaml + :caption: EXT:my_extension/Configuration/Form/CustomElement/CustomTextInherit.yaml + + imports: + - { resource: 'EXT:form/Configuration/Form/Base/FormElements/Text.yaml' } + + prototypes: + standard: + formElementsDefinition: + CustomText: '%prototypes.standard.formElementsDefinition.Text%' + +Importing file, overrides only single properties: + +.. code-block:: yaml + :caption: EXT:my_extension/Configuration/Form/CustomElement/config.yaml + + imports: + - { resource: 'EXT:my_extension/Configuration/Form/CustomElement/CustomTextInherit.yaml' } + + prototypes: + standard: + formElementsDefinition: + CustomText: + formEditor: + label: 'Custom Text' + group: custom + iconIdentifier: form-text + +``CustomText`` now inherits the complete configuration of the core ``Text`` +element, while only the listed properties are overridden. + + +.. _concepts-configuration-prototypes: + +Prototypes +---------- + +Most of the form framework configuration is defined +in ``prototypes``. ``standard`` is the default prototype in EXT:form. Prototypes +contain form element definitions - including frontend rendering, ``form editor`` +and ``form plugin``. When you create a new form, your form *definition* references +a prototype *configuration*. + +This allows you to do a lot of clever stuff. For example: + +- depending on which prototype is referenced, the same form can load different + + - ...templates + - ...``form editor`` configurations + - ...``form plugin`` finisher overrides + +- in the ``form manager``, depending on the selected prototype + + - ...different ``form editor`` configurations can be loaded + - ...different pre-configured form templates (boilerplates) can be chosen + +- prototypes can define different/ extended form elements and + display them in the frontend/ ``form editor`` + +The following use case illustrates the prototype concept. Imagine that two +prototypes are defined: "noob" and +"poweruser". + +.. t3-field-list-table:: + :header-rows: 1 + + - :a: + :b: Prototype "noob" + :c: Prototype "poweruser" + + - :a: **Form elements in the ``form editor``** + :b: Just Text, Textarea + :c: No changes. Default behaviour. + + - :a: **Finisher in the ``form editor``** + :b: Only the email finisher is available. It has a field for setting + the subject of the email. The rest of the fields are hidden and filled + with default values. + :c: No changes. Default behaviour. + + - :a: **Finisher overrides in the ``form plugin``** + :b: It is not possible to override the finisher configuration. + :c: No changes. Default behaviour. diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/Index.rst b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/Index.rst new file mode 100644 index 0000000..f9bc9e4 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/Index.rst @@ -0,0 +1,268 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-customfinisherimplementations: + +=============== +Custom finisher +=============== + +.. include:: /Includes/_NoteFinisher.rst + +.. contents:: Table of contents + :local: + +.. _concepts-finishers-custom-howtowrite: + +Write a custom finisher +======================= + +To make your finisher configurable by users in the backend form editor, see +:ref:`here `. + +Add a new finisher to the form configuration prototype by defining a +`finishersDefinition`. Set the `implementationClassName` property to your new implementation class. + +.. literalinclude:: _codesnippets/_finishersDefinition.yaml + :caption: EXT:my_site_package/Configuration/Form/CustomFormSetup.yaml + +`Register `_ +your custom form definition. + +Add options to your finisher with the `options` property. Options +are default values which can be overridden in the `form definition`. + +.. _concepts-finishers-custom-default-value: + +Define default values +--------------------- + +.. literalinclude:: _codesnippets/_CustomFinisher.yaml + :caption: EXT:my_site_package/Configuration/Form/CustomFormSetup.yaml + +.. _concepts-finishers-custom-option-override: + +Override options using the `form definition` +-------------------------------------------- + +.. literalinclude:: _codesnippets/_my_form.yaml + :caption: public/fileadmin/forms/my_form.yaml + +A finisher must implement :php-short:`TYPO3\CMS\Form\Domain\Finishers\FinisherInterface` +and should extend :php-short:`TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher`. +In doing so, in the logic of the +finisher the method `executeInternal()` will be called first. + +.. _concepts-finishers-customfinisherimplementations-accessingoptions: + +Accessing finisher options +========================== + +If your finisher class extends :php-short:`TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher`, +you can access the option values in the finisher using method `parseOption()`: + +.. code-block:: php + + $yourCustomOption = $this->parseOption('yourCustomOption'); + +`parseOption()` looks for 'yourCustomOption' in your +`form definition`. + +.. literalinclude:: _codesnippets/_CustomFinisher.yaml + :caption: EXT:my_site_package/Classes/Domain/Finishers/CustomFinisher.yaml + +If it can't find it, `parseOption()` checks + +1. for a default value in the `prototype` configuration, + +2. for `$defaultOptions` inside your finisher class: + + + +If it doesn't find anything, `parseOption()` returns `null`. + +If it finds the option, the process checks whether the option value will +access :ref:`FormRuntime values `. +If the `FormRuntime` returns a positive result, it is checked whether the +option value :ref:`can access values of preceding finishers `. +At the end, it :ref:`translates the finisher options `. + +.. _concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor: + +Accessing form runtime values +============================= + +You can populate finisher options with +submitted form values using the `parseOption()` method. +You can access values of the `FormRuntime` and therefore values in every +form element by encapsulating option values with `{}`. Below, if there is a +form element with the `identifier` 'subject', you can access the value +in the finisher configuration: + +.. literalinclude:: _codesnippets/_my_form_extended.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. code-block:: php + + // $yourCustomOption contains the value of the form element with the + // identifier 'subject' + $yourCustomOption = $this->parseOption('yourCustomOption'); + +You can use `{__currentTimestamp}` as an option value to return the +current UNIX timestamp. + +.. _concepts-finishers-customfinisherimplementations-finishercontext: + +Finisher Context +================ + +The :php-short:`TYPO3\CMS\Form\Domain\Finishers\FinisherContext` class takes care of +transferring a finisher context to each finisher. If your finisher class extends +:php-short:`TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher` the +finisher context will be available via: + +.. code-block:: php + + $this->finisherContext + +The `cancel` method prevents the execution of successive finishers: + +.. code-block:: php + + $this->finisherContext->cancel(); + +The method `getFormValues` returns the submitted form values. + +.. code-block:: php + + $this->finisherContext->getFormValues(); + +The method `getFormRuntime` returns the `FormRuntime`: + +.. code-block:: php + + $this->finisherContext->getFormRuntime(); + +.. _concepts-finishers-customfinisherimplementations-finishercontext-sharedatabetweenfinishers: + +Share data between finishers +============================ + +The method `getFinisherVariableProvider` returns an +object (:php-short:`TYPO3\CMS\Form\Domain\Finishers\FinisherVariableProvider`) which allows you +to store data and transfer it to other finishers. The data +can be easily accessed programmatically or inside your configuration: + +.. code-block:: php + + $this->finisherContext->getFinisherVariableProvider(); + +The data is stored in :php-short:`TYPO3\CMS\Form\Domain\Finishers\FinisherVariableProvider` and is accessed +by a user-defined 'finisher identifier' and a custom option value path. The +name of the 'finisher identifier' should consist of the name of the finisher +without the 'Finisher' appendix. If your finisher class extends +:php-short:`TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher`, the finisher +identifier name is stored in the following variable: + +.. code-block:: php + + $this->shortFinisherIdentifier + +For example, if the name of your finisher class is 'CustomFinisher', this +variable will contain 'Custom'. + +There are 4 methods to access and manage data in the `FinisherVariableProvider`: + +* Add data: + + .. code-block:: php + + $this->finisherContext->getFinisherVariableProvider()->add( + $this->shortFinisherIdentifier, + 'unique.value.identifier', + $value + ); + +* Get data: + + .. code-block:: php + + $this->finisherContext->getFinisherVariableProvider()->get( + $this->shortFinisherIdentifier, + 'unique.value.identifier', + 'default value' + ); + +* Check the existence of data: + + .. code-block:: php + + $this->finisherContext->getFinisherVariableProvider()->exists( + $this->shortFinisherIdentifier, + 'unique.value.identifier' + ); + +* Delete data: + + .. code-block:: php + + $this->finisherContext->getFinisherVariableProvider()->remove( + $this->shortFinisherIdentifier, + 'unique.value.identifier' + ); + +In this way, finishers can access `FinisherVariableProvider` data programmatically. +However, it is also possible to access `FinisherVariableProvider` data using form configuration. + +Assuming that a finisher called 'Custom' adds data to a `FinisherVariableProvider`: + +.. code-block:: php + + $this->finisherContext->getFinisherVariableProvider()->add( + $this->shortFinisherIdentifier, + 'unique.value.identifier', + 'Wouter' + ); + +other finishers can access the value 'Wouter' by setting +`{Custom.unique.value.identifier}` in the form definition file. + + +.. literalinclude:: _codesnippets/_my_form_custom.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _concepts-finishers-customfinisherimplementations-extend-gui: + +Add finisher to backend UI +========================== + +After registering a new finisher in the yaml form definition file, you can also +add it to the backend form editor for your backend users ( `formEditor:` +section below) to work with in the GUI: + +.. literalinclude:: _codesnippets/_backend-ui.yaml + :caption: EXT:my_site_package/Configuration/Form/CustomFormSetup.yaml + :linenos: + +.. important:: + + Make sure to define an `iconIdentifier` in the `finishersDefinition` of your + finisher, otherwise the button to remove the finisher from the + form will not be visible. + +.. _concepts-finishers-custom-extend-gui-configuration: + +Configuration registration +-------------------------- + +Place your YAML files in a form set directory — no PHP registration needed: + +.. code-block:: none + + EXT:my_extension/ + Configuration/ + Form/ + MyFinisher/ + config.yaml + +.. seealso:: + + :ref:`concepts-configuration-yaml-autodiscovery` diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.php b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.php new file mode 100644 index 0000000..687b3a4 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.php @@ -0,0 +1,18 @@ + 'Olli', + ]; + + // ... + protected function executeInternal() + { + // TODO: Implement executeInternal() method. + } +} diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.yaml b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.yaml new file mode 100644 index 0000000..7b91423 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_CustomFinisher.yaml @@ -0,0 +1,7 @@ +prototypes: + standard: + finishersDefinition: + CustomFinisher: + implementationClassName: 'MyVendor\MySitePackage\Domain\Finishers\CustomFinisher' + options: + yourCustomOption: 'Ralf' diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_backend-ui.yaml b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_backend-ui.yaml new file mode 100644 index 0000000..5fb9d7f --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_backend-ui.yaml @@ -0,0 +1,64 @@ +prototypes: + standard: + formElementsDefinition: + Form: + formEditor: + editors: + 900: + # Extend finisher drop down + selectOptions: + 35: + value: 'CustomFinisher' + label: 'Custom Finisher' + propertyCollections: + finishers: + # add finisher fields + 25: + identifier: 'CustomFinisher' + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: "Custom Finisher" + # custom field (input, required) + 110: + identifier: 'customField' + templateName: 'Inspector-TextEditor' + label: 'Custom Field' + propertyPath: 'options.customField' + propertyValidators: + 10: 'NotEmpty' + # email field + 120: + identifier: 'email' + templateName: 'Inspector-TextEditor' + label: 'Subscribers email' + propertyPath: 'options.email' + enableFormelementSelectionButton: true + propertyValidators: + 10: 'NotEmpty' + 20: 'FormElementIdentifierWithinCurlyBracesInclusive' + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + finishersDefinition: + CustomFinisher: + formEditor: + iconIdentifier: 'form-finisher' + label: 'Custom Finisher' + predefinedDefaults: + options: + customField: '' + email: '' + # displayed when overriding finisher settings + FormEngine: + label: 'Custom Finisher' + elements: + customField: + label: 'Custom Field' + config: + type: 'text' + email: + label: 'Subscribers email' + config: + type: 'text' diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_finishersDefinition.yaml b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_finishersDefinition.yaml new file mode 100644 index 0000000..8523595 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_finishersDefinition.yaml @@ -0,0 +1,6 @@ +prototypes: + standard: + finishersDefinition: + CustomFinisher: + implementationClassName: 'MyVendor\MySitePackage\Domain\Finishers\CustomFinisher' + diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form.yaml b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form.yaml new file mode 100644 index 0000000..d41c036 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form.yaml @@ -0,0 +1,13 @@ +identifier: sample-form +label: 'Simple Contact Form' +prototype: standard +type: Form + +finishers: + - + identifier: CustomFinisher + options: + yourCustomOption: 'Björn' + +renderables: + # ... diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_custom.yaml b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_custom.yaml new file mode 100644 index 0000000..1a3b601 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_custom.yaml @@ -0,0 +1,15 @@ +identifier: sample-form +label: 'Simple Contact Form' +prototype: standard +type: Form + +finishers: + - + identifier: Custom + options: + yourCustomOption: 'Frans' + + - + identifier: SomeOtherStuff + options: + someOtherCustomOption: '{Custom.unique.value.identifier}' diff --git a/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_extended.yaml b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_extended.yaml new file mode 100644 index 0000000..38f39f8 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/CustomFinisherImplementations/_codesnippets/_my_form_extended.yaml @@ -0,0 +1,16 @@ +identifier: simple-contact-form +label: 'Simple Contact Form' +prototype: standard +type: Form + +finishers: + - + identifier: Custom + options: + yourCustomOption: '{subject}' + +renderables: + - + identifier: subject + label: 'Subject' + type: Text diff --git a/Documentation/I/Concepts/Finishers/Index.rst b/Documentation/I/Concepts/Finishers/Index.rst new file mode 100644 index 0000000..48c99a5 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/Index.rst @@ -0,0 +1,40 @@ +:navigation-title: Finishers + +.. include:: /Includes.rst.txt +.. _concepts-finishers: + +============================================ +Finishers: post-submission actions for forms +============================================ + +When a form has been submitted in TYPO3, finishers decide what happens +next - sending an email, redirecting to another page, or showing a +confirmation message. This page gives you a quick tour of built-in finishers. +For more details, see :ref:`Finisher Options `. + +There is also a dedicated chapter on +:ref:`translations of finisher options `. + +.. toctree:: + :maxdepth: 2 + :titlesonly: + + ReadyToUseFinishers/Index + CustomFinisherImplementations/Index + +.. _concepts-finishers-execution-order: + +Finisher execution order +======================== + +.. important:: + Finishers are executed in the order that is defined in your form definition. The + `Redirect finisher `_ + terminates all finishers. + +If you are using the `redirect finisher `_, make sure it is the last finisher +that is executed. The redirect finisher stops the +execution of all subsequent finishers in order to perform a redirect. Finishers +that are defined after a redirect finisher will be ignored. + +.. literalinclude:: ReadyToUseFinishers/RedirectFinisher/_codesnippets/_example-redirect.yaml diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/Index.rst new file mode 100644 index 0000000..cb19fde --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/Index.rst @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-closurefinisher: + +================ +Closure finisher +================ + +The "Closure finisher" can only be used in programmatically-created forms. It allows +you to execute your own finisher code without implementing/ declaring a finisher. + +.. contents:: Table of contents + +.. include:: /Includes/_NoteFinisher.rst + +.. _apireference-finisheroptions-closurefinisher-options: + +Closure finisher option +======================= + +.. _apireference-finisheroptions-closurefinisher-options-closure: + +.. confval:: closure + :name: closurefinisher-closure + :required: true + :type: `?\Closure` + :default: `null` + + The name of the field as shown in the form. + +.. _apireference-finisheroptions-closurefinisher: + +Using the closure finisher programmatically +=========================================== + +This finisher can only be used in programmatically-created forms. It allows +you to execute your own finisher code without implementing/ declaring a finisher. + +Code example: + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + +This finisher is implemented in :php:`TYPO3\CMS\Form\Domain\Finishers\ClosureFinisher`. diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..d719cde --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ClosureFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,20 @@ +setOption('closure', function ($finisherContext) + { + $formRuntime = $finisherContext->getFormRuntime(); + // ... + }); + $formDefinition->addFinisher($closureFinisher); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/Index.rst new file mode 100644 index 0000000..c90678d --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/Index.rst @@ -0,0 +1,109 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-confirmationfinisher: +.. _finishers-confirmation-message: + +===================== +Confirmation finisher +===================== + +A basic finisher that outputs a text or content element. + +.. contents:: Table of contents + +.. include:: /Includes/_NoteFinisher.rst + +.. _apireference-finisheroptions-confirmationfinisher-options: + +Confirmation finisher options +============================= + +This finisher outputs a text or a content element after the form has been submitted. + +The settings of the finisher are: + +.. _apireference-finisheroptions-confirmationfinisher-options-message: + +.. confval:: message + :name: confirmationfinisher-message + :type: string + :default: `The form has been submitted.` + + Displays this text if the `contentElementUid` is not set. + +.. confval:: contentElementUid + :name: confirmationfinisher-contentElementUid + :type: int + :default: 0 + + Renders the content element with the supplied ID. + +.. confval:: translation.propertiesExcludedFromTranslation + :name: confirmationfinisher-translation-propertiesExcludedFromTranslation + :type: array + :default: `[]` + + Defines a list of finisher option properties that should be excluded from + translation. + + When specified, the listed properties are not processed by the + :php-short:`\TYPO3\CMS\Form\Service\TranslationService` during translation + of finisher options. This prevents their values from being replaced by + translated equivalents, even if translations exist for those options. + + This option is usually generated automatically as soon as FlexForm overrides + are in place and normally does not need to be set manually in the form + definition. + + See `Skip translation of overridden form finisher options `_ + for an example. + +.. _concepts-finishers-confirmationfinisher-yaml: + +Confirmation finisher in the YAML form definition +================================================= + +A basic finisher that outputs text or a content element. + +Outputs text ``message``: + +.. literalinclude:: _codesnippets/_form_with_confirmation_finisher.yaml + :caption: public/fileadmin/forms/my_form.yaml + +Outputs content element with id 42: + +.. literalinclude:: _codesnippets/_form_with_confirmation_content_element.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _concepts-finishers-confirmationfinisher-yaml-propertiesExcludedFromTranslation: + +Skip translation of overridden form finisher options +==================================================== + +The following is an example of the `translation.propertiesExcludedFromTranslation `_ +option being used to exclude three properties (subject, recipients and +format) from translation. + +Using this translation option, the properties can only be overridden by a FlexForm, not by the +:php-short:`\TYPO3\CMS\Form\Service\TranslationService`. + +This option is automatically generated as soon as FlexForm overrides are in place. + +The following syntax is only documented for completeness. Nonetheless, it can +also be added to a form definition YAML file. + +.. literalinclude:: _codesnippets/_form_with_propertiesExcludedFromTranslation.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _apireference-finisheroptions-confirmationfinisher: + +Using the confirmation finisher in PHP code +=========================================== + +Developers can use the finisher key `Confirmation` to create +confirmation finishers in their own classes: + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + +Th confirmation finisher is implemented in +:php:`TYPO3\CMS\Form\Domain\Finishers\ConfirmationFinisher`. diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..fab31ad --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,19 @@ +createFinisher('Confirmation', [ + 'message' => $message, + ]); + } + private function addConfirmationnFinisherWithContentElement(FormDefinition $formDefinition, int $contentElementUid) + { + $formDefinition->createFinisher('Confirmation', [ + 'contentElementUid' => $contentElementUid, + ]); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_content_element.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_content_element.yaml new file mode 100644 index 0000000..2114b63 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_content_element.yaml @@ -0,0 +1,10 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: Confirmation + options: + contentElementUid: 42 + #... diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_finisher.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_finisher.yaml new file mode 100644 index 0000000..e343b0c --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_confirmation_finisher.yaml @@ -0,0 +1,10 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: Confirmation + options: + message: 'Thx for using TYPO3' + # ... diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_propertiesExcludedFromTranslation.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_propertiesExcludedFromTranslation.yaml new file mode 100644 index 0000000..43bd226 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/ConfirmationFinisher/_codesnippets/_form_with_propertiesExcludedFromTranslation.yaml @@ -0,0 +1,17 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + options: + identifier: EmailToSender + subject: 'Email to sender' + recipients: + recipient@example.org: 'Some Name' + translation: + propertiesExcludedFromTranslation: + - subject + - recipients + - format + # ... diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/Index.rst new file mode 100644 index 0000000..6e05a11 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/Index.rst @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-deleteuploadsfinisher: +.. _finishers-delete-uploads: + +======================= +DeleteUploads finishers +======================= + +The "DeleteUploads finisher" removes files that have been submitted. You can use this +finisher after the email finisher if you do not want to keep the files +in your TYPO3 installation. + +.. note:: + + Finishers are only executed when a form is successfully submitted. If a user uploads + a file but does not finish filling out the form, the uploaded files will not + be deleted. + +.. contents:: Table of contents + +.. include:: /Includes/_NoteFinisher.rst + +.. _concepts-finishers-deleteuploadsfinisher-yaml: + +DeleteUploads finisher in the YAML form definition +================================================== + +Use this finisher after the email finisher if you do not want to keep the files +in your TYPO3 installation. + +Finishers are executed in the order they are listed in the form definition +YAML file: + +.. literalinclude:: _codesnippets/_form.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _apireference-finisheroptions-deleteuploadsfinisher: + +Using the DeleteUploads finisher in PHP code +============================================ + +Developers can use the finisher key `DeleteUploads` to create +deleteuploads finishers in their own classes: + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + +This finisher is implemented in :php:`TYPO3\CMS\Form\Domain\Finishers\DeleteUploadsFinisher`. diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..4416c8a --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,11 @@ +createFinisher('DeleteUploads'); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_form.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_form.yaml new file mode 100644 index 0000000..3e8b2fe --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/DeleteUploadsFinisher/_codesnippets/_form.yaml @@ -0,0 +1,13 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: EmailToSender + options: + subject: 'Your Message: {message}' + - + identifier: DeleteUploads + # Define the delete uploads finisher AFTER the email finisher +# ... diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/Index.rst new file mode 100644 index 0000000..cf0ecdd --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/Index.rst @@ -0,0 +1,325 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-emailfinisher: + +============== +Email finisher +============== + +The EmailFinisher sends an email to one recipient. EXT:form has two +EmailFinishers with the identifiers EmailToReceiver and EmailToSender. + +.. contents:: Table of contents + +.. include:: /Includes/_NoteFinisher.rst + + +.. _concepts-finishers-emailfinisher-backend: +.. _finishers-email-to-sender: +.. _finishers-email-to-receiver: + +Using email finishers in the backend form editor +================================================ + +Editors can use two email finishers in the backend form editor: + +Email to sender (form submitter) + This finisher sends an email with the contents of the form to the user + submitting the form . + +Email to receiver (you) + This finisher sends an email with the contents of the form to the owner of the + website. The settings of this finisher are the + same as the "Email to sender" finisher + +.. _apireference-finisheroptions-emailfinisher-options: + +Options of the email finisher +============================= + +.. _apireference-finisheroptions-emailfinisher-options-subject: + +.. confval:: Subject [subject] + :name: emailfinisher-subject + :type: string + :required: true + + Subject of the email. + +.. _apireference-finisheroptions-emailfinisher-options-recipients: + +.. confval:: Recipients [recipients] + :name: emailfinisher-recipients + :type: array + :required: true + + Email addresses and names of the recipients (To). + + **Email Address** + Email address of a recipient, e.g. "some.recipient@example.com" + or "{email-1}". + **Name** + Name of a recipient, e.g. "Some Recipient" or "{text-1}". + +.. _apireference-finisheroptions-emailfinisher-options-senderaddress: + +.. confval:: Sender address [senderAddress] + :name: emailfinisher-senderAddress + :type: string + :required: true + + Email address of the sender, for example "your.company@example.org". + + If `smtp `_ + is used, this email address needs to be allowed by the + SMTP server. Use `replyToRecipients` if you want to enable the receiver to + reply to the message. + +.. _apireference-finisheroptions-emailfinisher-options-sendername: + +.. confval:: Sender name [senderName] + :name: emailfinisher-senderName + :type: string + :default: `''` + + Name of the sender, for example "Your Company". + +.. _apireference-finisheroptions-emailfinisher-options-replytorecipients: + +.. confval:: Reply-to Recipients [replyToRecipients] + :name: emailfinisher-replyToRecipients + :type: array + :default: `[]` + + Email address which will be used when someone replies to the email. + + **Email Address**: + Email address for reply-to. + **Name** + Name for reply-to. + +.. _apireference-finisheroptions-emailfinisher-options-carboncopyrecipients: + +.. confval:: CC Recipient [carbonCopyRecipients] + :name: emailfinisher-carbonCopyRecipients + :type: array + :default: `[]` + + Email address to which a copy of the email is sent. The information is + visible to all other recipients. + + **Email Address**: + Email address for CC. + **Name** + Name for CC. + +.. _apireference-finisheroptions-emailfinisher-options-blindcarboncopyrecipients: + +.. confval:: BCC Recipients [blindCarbonCopyRecipients] + :name: emailfinisher-blindCarbonCopyRecipients + :type: array + :default: `[]` + + Email address to which a copy of the email is sent. The information is not + visible to any of the recipients. + + **Email Address**: + Email address for BCC. + **Name** + Name for BCC. + +.. _apireference-finisheroptions-emailfinisher-options-addhtmlpart: + +.. confval:: Add HTML part [addHtmlPart] + :name: emailfinisher-addHtmlPart + :type: bool + :default: `true` + + If set, emails will contain plaintext and HTML, otherwise only plaintext. + In this way, HTML can be disabled and plaintext-only emails enforced. + +.. _apireference-finisheroptions-emailfinisher-options-attachuploads: + +.. confval:: Attach uploads [attachUploads] + :name: emailfinisher-attachUploads + :type: bool + :default: `true` + + If set, all uploaded items are attached to the email. + +.. _apireference-finisheroptions-emailfinisher-options-title: + +.. confval:: Title [title] + :name: emailfinisher-title + :type: string + :required: false + :default: `undefined` + + The title shown in the email. + +.. _apireference-finisheroptions-emailfinisher-options-translation-language: + +.. confval:: Translation language [translation.language] + :name: emailfinisher-translation-language + :type: string + :required: false + :default: `undefined` + + If not set, the finisher options are translated depending on the current + frontend language (if translations exist). This option allows you to force + translations for a given language isocode, e.g. `da` or `de`. + See :ref:`Translate finisher options`. + +.. _apireference-finisheroptions-emailfinisher-options-options: + +Additional email finisher options +================================= + +Additional options can be set in the form definition YAML and +programmatically in the options array but **not** in the backend editor: + +.. _apireference-finisheroptions-emailfinisher-options-translation-propertiesExcludedFromTranslation: + +.. confval:: Properties excluded from translation [translation.propertiesExcludedFromTranslation] + :name: emailfinisher-translation-propertiesExcludedFromTranslation + :type: array + :required: false + :default: `undefined` + + If not set, the finisher options are translated depending on the current frontend language (if translations exists). + This option allows you to force translations for a given language isocode, e.g 'da' or 'de'. + See :ref:`Translate finisher options`. + It will be skipped for all specified finisher options. + +.. _apireference-finisheroptions-emailfinisher-options-translation-translationfiles: + +.. confval:: translation.translationFiles + :name: emailfinisher-translation-translationFiles + :type: array + :required: false + :default: `undefined` + + If set, this translation file(s) will be used for finisher option + translations. If not set, the translation file(s) from the `Form` element + will be used. + Read :ref:`Translate finisher options`. + +.. _apireference-finisheroptions-emailfinisher-options-layoutrootpaths: + +.. confval:: layoutRootPaths + :name: emailfinisher-layoutRootPaths + :type: array + :required: false + :default: `undefined` + + Fluid layout paths. + +.. _apireference-finisheroptions-emailfinisher-options-partialrootpaths: + +.. confval:: partialRootPaths + :name: emailfinisher-partialRootPaths + :type: array + :required: false + :default: `undefined` + + Fluid partial paths. + +.. _apireference-finisheroptions-emailfinisher-options-templaterootpaths: + +.. confval:: templateRootPaths + :name: emailfinisher-templateRootPaths + :type: array + :required: false + :default: `undefined` + + Fluid template paths; all templates get the current :php:`FormRuntime` + assigned as :code:`form` and the :php:`FinisherVariableProvider` assigned + as :code:`finisherVariableProvider`. + +.. _apireference-finisheroptions-emailfinisher-options-variables: + +.. confval:: variables + :name: emailfinisher-variables + :type: array + :required: false + :default: `undefined` + + Associative array of variables which are available inside the Fluid template. + +.. _concepts-finishers-emailfinisher-yaml: + +Email finishers in the YAML form definition +=========================================== + +This finisher sends an email to one recipient. +EXT:form has two email finishers with identifiers +`EmailToReceiver` and `EmailToSender`. + +.. literalinclude:: _codesnippets/_form.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _apireference-finisheroptions-emailfinisher: + +Using Email finishers in PHP code +================================= + +Developers can create a confirmation finisher by using the key `EmailToReceiver` +or `EmailToSender`. + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + +This finisher is implemented in :php:`TYPO3\CMS\Form\Domain\Finishers\EmailFinisher`. + +.. _concepts-finishers-emailfinisher-bcc-recipients: + +Working with BCC recipients +=========================== + +Email finishers can work with different recipient types, including Carbon Copy +(CC) and Blind Carbon Copy (BCC). Depending on the configuration of your server +and TYPO3 instance, it may not be possible to send emails to BCC recipients. +The :php:`$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_sendmail_command']` +configuration value is important here. As documented in :ref:`CORE API `, +TYPO3 recommends using the parameter :php:`-bs` (instead of :php:`-t -i`) with +:php:`sendmail`. The parameter :php:`-bs` tells TYPO3 to use the SMTP standard +so that BCC recipients are properly set. `Symfony `__ +also mentions the :php:`-t` parameter problem. Since TYPO3 7.5 +(`#65791 `__) +the :php:`transport_sendmail_command` is automatically set from the PHP runtime +configuration and saved. If you have problems sending emails to BCC +recipients, this could be the solution. + +.. _concepts-finishers-emailfinisher-fluidemail: + +About FluidEmail +================ + +.. versionchanged:: 12.0 + The :php:`EmailFinisher` always sends email via :php:`FluidEmail`. + +The FluidEmail finisher allows emails to be sent in a standardized way. + +The finisher has an :yaml:`option` property :yaml:`title` that adds an email title to the default +FluidEmail template. Variables can be used in options using the bracket syntax. +These variables can be overwritten by FlexForm configuration in the form plugin + +Use these options to customize the fluid templates: + +* :yaml:`templateName`: The template name (for both HTML and plaintext, without the + extension) +* :yaml:`templateRootPaths`: The paths to the templates +* :yaml:`partialRootPaths`: The paths to the partials +* :yaml:`layoutRootPaths`: The paths to the layouts + +.. note:: + The field :yaml:`templatePathAndFilename` is no longer evaluated. + +Here is an example finisher configuration: + +.. literalinclude:: _codesnippets/_example-email.yaml + :caption: public/fileadmin/forms/my_form_with_email_finisher.yaml + +These template files must exist: + +* :file:`EXT:my_site_package/Resources/Private/Templates/Email/ContactForm.html` +* :file:`EXT:my_site_package/Resources/Private/Templates/Email/ContactForm.txt` diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_example-email.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_example-email.yaml new file mode 100644 index 0000000..2a49694 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_example-email.yaml @@ -0,0 +1,15 @@ +identifier: contact +type: Form +prototypeName: standard +finishers: + - + identifier: EmailToSender + options: + subject: 'Your Message: {message}' + title: 'Hello {name}, your confirmation' + templateName: ContactForm + templateRootPaths: + 100: 'EXT:my_site_package/Resources/Private/Templates/Email/' + partialRootPaths: + 100: 'EXT:my_site_package/Resources/Private/Partials/Email/' + addHtmlPart: true diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..10ea676 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,19 @@ +createFinisher('EmailToReceiver', [ + 'subject' => 'Your message', + 'recipients' => [ + 'your.company@example.com' => 'Your Company name', + 'ceo@example.com' => 'CEO' + ], + 'senderAddress' => $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress'], + 'senderName' => $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName'], + ]); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_form.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_form.yaml new file mode 100644 index 0000000..7a88334 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/EmailFinisher/_codesnippets/_form.yaml @@ -0,0 +1,14 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: EmailToReceiver + options: + subject: 'Your message' + recipients: + your.company@example.com: 'Your Company name' + ceo@example.com: 'CEO' + senderAddress: 'form@example.com' + senderName: 'form submitter' diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/Index.rst new file mode 100644 index 0000000..f2d8313 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/Index.rst @@ -0,0 +1,116 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-flashmessagefinisher: + +===================== +FlashMessage finisher +===================== + +The "FlashMessage finisher" is a basic finisher that adds a message to the +FlashMessageContainer. + +.. contents:: Table of contents + +.. note:: + + This finisher cannot be used in the backend form editor. It can only be used + in a form definition YAML file or programmatically. + +.. include:: /Includes/_NoteFinisher.rst + +.. _apireference-finisheroptions-flashmessagefinisher-options: + +FlashMessage finisher options +============================= + +The following options can be set (in the form definition YAML or +programmatically): + +.. _apireference-finisheroptions-flashmessagefinisher-options-messagebody: + +.. confval:: messageBody + :name: flashmessagefinisher-messageBody + :type: string + :required: true + + The flash message. May contain placeholders like `%s` that + are replaced with `messageArguments`. + +.. _apireference-finisheroptions-flashmessagefinisher-options-messagetitle: + +.. confval:: messageTitle + :name: flashmessagefinisher-messageTitle + :type: string + :default: `''` + + If set, is the flash message title. + +.. _apireference-finisheroptions-flashmessagefinisher-options-messagearguments: + +.. confval:: messageArguments + :name: flashmessagefinisher-messageArguments + :type: array + :default: `[]` + + If `messageBody` contains placeholders (like `%s`), they will be replaced + by these. + +.. _apireference-finisheroptions-flashmessagefinisher-options-messagecode: + +.. confval:: messageCode + :name: flashmessagefinisher-messageCode + :type: ?int + :default: `null` + + A unique code to identify the message. By convention, the + unix time stamp at the time when the message is created is used, + for example `1758455932`. + +.. _apireference-finisheroptions-flashmessagefinisher-options-severity: + +.. confval:: severity + :name: flashmessagefinisher-severity + :type: :php:`\TYPO3\CMS\Core\Type\ContextualFeedbackSeverity` + :default: `ContextualFeedbackSeverity::OK` + + The severity influences the display (color and icon) of the flash message. + +.. confval:: translation.propertiesExcludedFromTranslation + :name: flashmessagefinisher-translation-propertiesExcludedFromTranslation + :type: array + :default: `[]` + + Defines a list of finisher option properties to be excluded from + translation. + + If set, these properties will not be processed by the + :php-short:`\TYPO3\CMS\Form\Service\TranslationService` during translation + of finisher options. This prevents their values from being replaced by + translated equivalents, even if translations exist for those options. + + This option is usually generated automatically as soon as FlexForm overrides + are in place and normally does not need to be set manually in the form + definition. + + See `Skip translation of overridden form finisher options `_ + for an example. + +.. _concepts-finishers-flashmessagefinisher-yaml: + +FlashMessage finisher in a YAML form definition +=============================================== + +.. literalinclude:: _codesnippets/_form.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _apireference-finisheroptions-flashmessagefinisher: + +Using FlashMessage finishers in PHP code +======================================== + +Developers can use the finisher key `FlashMessage` to create +flash message finishers in their own classes: + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + +This finisher is implemented in :php:`TYPO3\CMS\Form\Domain\Finishers\FlashMessageFinisher`. diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..d17ff71 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,18 @@ +createFinisher('FlashMessage', [ + 'messageTitle' => 'Merci', + 'messageCode' => 201905041245, + 'messageBody' => 'Thx for using %s', + 'messageArguments' => ['TYPO3'], + 'severity' => ContextualFeedbackSeverity::OK, + ]); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_form.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_form.yaml new file mode 100644 index 0000000..a6c2900 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/FlashMessageFinisher/_codesnippets/_form.yaml @@ -0,0 +1,14 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: FlashMessage + options: + messageTitle: 'Merci' + messageCode: 201905041245 + messageBody: 'Thx for using %s' + messageArguments: + - 'TYPO3' + severity: 0 diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/Index.rst new file mode 100644 index 0000000..1e3224b --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/Index.rst @@ -0,0 +1,62 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-ready-to-use: +.. _apireference-finisheroptions: + +====================== +Ready-to-use finishers +====================== + +The TYPO3 Form Framework provides several built-in finishers that can be +used out of the box. These handle common post submission tasks such as +sending emails, showing confirmation messages, and saving data. + +In addition, third-party extensions may provide further finishers, which +can be found in the `TYPO3 Extension Repository (TER) `_. + +.. card-grid:: + :columns: 1 + :columns-md: 2 + :gap: 4 + :class: pb-4 + :card-height: 100 + + .. card:: `Closure finisher `_ + + Executes a custom PHP closure after a successful submission—use + for ad-hoc logic without creating a full class. + + .. card:: `Confirmation finisher `_ + + Renders a confirmation/thank-you message (or view) once the form + is submitted. + + .. card:: `DeleteUploads finisher `_ + + Removes files uploaded during the submission—useful if after + emailing them you don’t want to keep the files on the server. + + .. card:: `Email finisher `_ + + Sends an email with the submitted data; supports Fluid + templates and placeholders for field values. + + .. card:: :doc:`Flash message finisher ` + + Shows a flash message to the user after submit (e.g., success or + info notice). + + .. card:: `Redirect finisher `_ + + Redirects to another page or route after submit; must be last + finisher since it stops subsequent finishers. + + .. card:: `SaveToDatabase finisher `_ + + Persists submitted form values to a database table according to + your mapping/configuration. + +.. toctree:: + :hidden: + :glob: + + */Index diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/Index.rst new file mode 100644 index 0000000..7787102 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/Index.rst @@ -0,0 +1,135 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-redirectfinisher: +.. _finishers-redirect: + +================= +Redirect finisher +================= + +This finisher redirects the user to a particular page after the form has been submitted. +Parameters can be added to the URL. + +.. contents:: Table of contents + +.. important:: + + Finishers are executed in the order defined in your form definition. + This finisher stops the execution of all subsequent finishers in order to perform + the redirect. Therefore, this finisher should always be the last finisher to be + executed. Finishers placed after this one in the form definition will be ignored. + +.. _apireference-finisheroptions-redirectfinisher-options: + +Redirect finisher options +========================= + +.. _apireference-finisheroptions-redirectfinisher-options-pageuid: + +.. confval:: Page: [pageUid] + :name: redirectfinisher-pageUid + :type: int + :required: true + :default: `1` + + ID of the page to redirect to. Button :guilabel:`Page` can be used to select + a page from the page tree. + +.. _apireference-finisheroptions-redirectfinisher-options-additionalparameters: + +.. confval:: Additional parameters: [additionalParameters] + :name: redirectfinisher-additionalParameters + :type: string + :required: false + :default: `''` + + URL parameters which will be appended to the URL. + +.. _apireference-finisheroptions-redirectfinisher-options-fragment: + +.. confval:: URL fragment: [fragment] + :name: redirectfinisher-fragment + :type: string + :required: false + :default: `''` + + ID of a content element identifier or a custom fragment + identifier. This will be appended to the URL and used as section anchor. + + Adds a fragment (e.g. :html:`#c9` or :html:`#foo`) to the redirect link. + The :html:`#` character can be omitted. + +.. _apireference-finisheroptions-redirectfinisher-options-additional: + +Additional redirect finisher options +==================================== + +These options can be set in the form definition YAML or +programmatically in the options array. They cannot be set in the backend form editor: + +.. _apireference-finisheroptions-redirectfinisher-options-delay: + +.. confval:: delay + :name: redirectfinisher-delay + :type: int + :required: false + :default: `0` + + The redirect delay in seconds. + +.. _apireference-finisheroptions-redirectfinisher-options-statuscode: + +.. confval:: statusCode + :name: redirectfinisher-statusCode + :type: int + :required: false + :default: `303` + + The HTTP status code for the redirect. Default is "303 See Other". + +.. confval:: translation.propertiesExcludedFromTranslation + :name: redirectfinisher-translation-propertiesExcludedFromTranslation + :type: array + :default: `[]` + + Defines a list of finisher option properties to be excluded from + translation. + + If set, these properties are not processed by the + :php-short:`\TYPO3\CMS\Form\Service\TranslationService` during translation. + This prevents their values from being replaced by + translated equivalents, even if translations exist for those options. + + This option is usually generated automatically shen FlexForm overrides + are in place and normally does not need to be set manually in the form + definition. + + See `Skip translation of overridden form finisher options `_ + for an example. + +.. _concepts-finishers-redirectfinisher-yaml: + +Redirect finisher in a YAML form definition +=========================================== + +.. literalinclude:: _codesnippets/_form.yaml + :caption: public/fileadmin/forms/my_form.yaml + +.. _concepts-finishers-redirectfinisher-last: + +Example: Load the redirect finisher last +======================================== + +.. literalinclude:: _codesnippets/_example-redirect.yaml + :caption: public/fileadmin/forms/my_form_with_multiple_finishers.yaml + +.. _apireference-finisheroptions-redirectfinisher: + +Using a Redirect finisher in PHP code +===================================== + +Developers can use the finisher key `Redirect` to create redirect finishers in their own classes: + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + +This finisher is implemented in :php:`TYPO3\CMS\Form\Domain\Finishers\RedirectFinisher`. diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_example-redirect.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_example-redirect.yaml new file mode 100644 index 0000000..c47c2c1 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_example-redirect.yaml @@ -0,0 +1,17 @@ +identifier: contact +type: Form +prototypeName: standard +finishers: + - + identifier: EmailToSender + options: + subject: 'Your Message: {message}' + ## ... + - + identifier: DeleteUploads + - + # Attention! The Redirect finisher stops the execution of all finishers + identifier: Redirect + options: + pageUid: 1 + additionalParameters: 'param1=value1¶m2=value2' diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..8db0dad --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,14 @@ +createFinisher('Redirect', [ + 'pageUid' => 1, + 'additionalParameters' => 'param1=value1¶m2=value2', + ]); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_form.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_form.yaml new file mode 100644 index 0000000..36f6056 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/RedirectFinisher/_codesnippets/_form.yaml @@ -0,0 +1,10 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: Redirect + options: + pageUid: 1 + additionalParameters: 'param1=value1¶m2=value2' diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/Index.rst b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/Index.rst new file mode 100644 index 0000000..d2093e1 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/Index.rst @@ -0,0 +1,245 @@ +.. include:: /Includes.rst.txt +.. _concepts-finishers-savetodatabasefinisher: + +======================= +SaveToDatabase finisher +======================= + +The "SaveToDatabase finisher" saves data from a submitted form into a +database table. + +.. contents:: Table of contents + +.. note:: + + This finisher cannot be used in the backend form editor. It can only be + used in a form definition YAML file or programmatically. + +.. include:: /Includes/_NoteFinisher.rst + +.. _apireference-finisheroptions-savetodatabasefinisher-options: + +SaveToDatabase finisher options +=============================== + +The finisher options can be set in the form definition YAML file or +programmatically: + +.. _apireference-finisheroptions-savetodatabasefinisher-options-table: + +.. confval:: table + :name: savetodatabasefinisher-table + :type: string + :required: true + + Insert or update values in this table. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-mode: + +.. confval:: mode + :name: savetodatabasefinisher-mode + :type: string + :default: `'insert'` + + `insert` + will create a new database row with the values from the submitted form + and/or some predefined values. See also :confval:`savetodatabasefinisher-elements` and + :confval:`savetodatabasefinisher-databaseColumnMappings`. + + `update` + will update a database row with the values from the submitted form + and/or some predefined values. In this case :confval:`savetodatabasefinisher-whereClause` is required. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-whereclause: + +.. confval:: whereClause + :name: savetodatabasefinisher-whereClause + :type: array + :required: true (if mode = update) + :default: `[]` + + The ``where`` clause for a database update action. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-elements: + +.. confval:: elements + :name: savetodatabasefinisher-elements + :type: array + :required: true + + Use `options.elements` to map form element values to database columns (they must exist). + Each key in `options.elements` has to match a form element identifier. + The value of each key in `options.elements` is an array containing additional information. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-elements-mapondatabasecolumn: + +.. confval:: elements..mapOnDatabaseColumn + :name: savetodatabasefinisher-elements-mapOnDatabaseColumn + :type: string + :required: true + + The value from the submitted form element with the identifier + `` will be written into this database column. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-elements-skipifvalueisempty: + +.. confval:: elements..skipIfValueIsEmpty + :name: savetodatabasefinisher-elements-skipIfValueIsEmpty + :type: bool + :default: `false` + + Set this to true if the database column should not be written if the value from the + submitted form element with the identifier `` is empty + (e.g. for password fields). Empty means strings without content, whitespace is valid content. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-elements-hashed: + +.. confval:: elements..hashed + :name: savetodatabasefinisher-elements-hashed + :type: bool + :default: `false` + + Set this to true if the value from the submitted form element should be hashed before + writing into the database. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-elements-savefileidentifierinsteadofuid: + +.. confval:: elements..saveFileIdentifierInsteadOfUid + :name: savetodatabasefinisher-elements-saveFileIdentifierInsteadOfUid + :type: bool + :default: `false` + + By default, the uid of the FAL object will be written into the database column. + Set this to true if you want to store the FAL identifier + (e.g. `1:/user_uploads/some_uploaded_pic.jpg`) instead. + + This only applies for form elements which create a FAL object like + `FileUpload` or `ImageUpload`. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-elements-dateformat: + +.. confval:: elements..dateFormat + :name: savetodatabasefinisher-elements-dateFormat + :type: string + :default: `'U'` + + If the internal datatype is :php:`\DateTime` (true for the form element type + :yaml:`Date`), the object needs to be converted into a string. + This option defines the format of the date. You can use any format accepted by + the PHP :php:`date()` function. + Default is `'U'` (Unix timestamp). + +.. _apireference-finisheroptions-savetodatabasefinisher-options-databasecolumnmappings: + +.. confval:: databaseColumnMappings + :name: savetodatabasefinisher-databaseColumnMappings + :type: array + :default: `[]` + + Use this to map database columns to values. + Each key within `options.databaseColumnMappings` has to match an existing database column. + Each value in `options.databaseColumnMappings` is an array with + additional information. + + This mapping is done *before* :confval:`savetodatabasefinisher-elements` are mapped. + If you map both, the value from :confval:`savetodatabasefinisher-elements` will override the + :confval:`savetodatabasefinisher-databaseColumnMappings-value`. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-databasecolumnmappings-value: + +.. confval:: databaseColumnMappings..value + :name: savetodatabasefinisher-databaseColumnMappings-value + :type: string + :required: true + + The value which will be written to the database column. + You can also use the :ref:`FormRuntime accessor feature + ` + to access properties from the `FormRuntime`, e.g. `{}`. + +.. _apireference-finisheroptions-savetodatabasefinisher-options-databasecolumnmappings-skipifvalueisempty: + +.. confval:: databaseColumnMappings..skipIfValueIsEmpty + :name: savetodatabasefinisher-databaseColumnMappings-skipIfValueIsEmpty + :type: bool + :default: `false` + + Set this to true if the database column should not be written if the value from + :confval:`savetodatabasefinisher-databaseColumnMappings-value` is empty. + +.. confval:: translation.propertiesExcludedFromTranslation + :name: savetodatabasefinisher-translation-propertiesExcludedFromTranslation + :type: array + :default: `[]` + + Defines a list of finisher option properties to be excluded from + translation. + + If set, these properties are not processed by the + :php-short:`\TYPO3\CMS\Form\Service\TranslationService` during translation. + This prevents the values from being replaced by + translated equivalents, even if translations exist for those options. + + This option is usually generated when FlexForm overrides + exist and normally does not need to be set manually in the form + definition. + + See `Skip translation of overridden form finisher options `_ + for an example. + +.. _concepts-finishers-savetodatabasefinisher-yaml: + +SaveToDatabase finisher in a YAML form definition +================================================= + +This finisher saves data from a submitted form into a database table. + +.. literalinclude:: _codesnippets/_form.yaml + :linenos: + :caption: public/fileadmin/forms/my_form.yaml + +.. _concepts-finishers-savetodatabasefinisher-example-news: + +Example: adding uploads to ext:news (fal_related_files and fal_media): +====================================================================== + +.. literalinclude:: _codesnippets/_example-fal-uploads_news.yaml + :linenos: + :caption: public/fileadmin/forms/my_form_with_multiple_finishers.yaml + +.. _apireference-finisheroptions-savetodatabasefinisher: + +Using a SaveToDatabase finisher in PHP code +================================================ + +Developers can use the finisher key `SaveToDatabase` to create +flash message finishers in their own classes: + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + :linenos: + +This finisher is implemented in :php:`TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher`. + +.. _concepts-finishers-savetodatabasefinisher-multiple: + +Multiple database operations +============================ + +You can use options to perform multiple database operations. + +Example form definition file (performs inserts): + +.. literalinclude:: _codesnippets/_example-fal-uploads_news.yaml + :linenos: + :caption: public/fileadmin/forms/my_form_with_multiple_finishers.yaml + +Using PHP code (performs an update): + +.. literalinclude:: _codesnippets/_finisher.php.inc + :language: php + :linenos: + +You can access inserted UIDs with '{SaveToDatabase.insertedUids.}'. +If you perform an insert operation, the inserted values will be stored in the FinisherVariableProvider. + references the numeric options.* key. diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_example-fal-uploads_news.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_example-fal-uploads_news.yaml new file mode 100644 index 0000000..3e2d6a2 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_example-fal-uploads_news.yaml @@ -0,0 +1,73 @@ +- + identifier: SaveToDatabase + options: + - + table: tx_news_domain_model_news + mode: insert + elements: + my-field: + mapOnDatabaseColumn: bodytext + imageupload-1: + mapOnDatabaseColumn: fal_media + fileupload-1: + mapOnDatabaseColumn: fal_related_files + databaseColumnMappings: + pid: + value: 3 + tstamp: + value: '{__currentTimestamp}' + datetime: + value: '{__currentTimestamp}' + crdate: + value: '{__currentTimestamp}' + hidden: + value: 1 + - + table: sys_file_reference + mode: insert + elements: + imageupload-1: + mapOnDatabaseColumn: uid_local + skipIfValueIsEmpty: true + databaseColumnMappings: + tablenames: + value: tx_news_domain_model_news + fieldname: + value: fal_media + tstamp: + value: '{__currentTimestamp}' + crdate: + value: '{__currentTimestamp}' + showinpreview: + value: 1 + uid_foreign: + value: '{SaveToDatabase.insertedUids.0}' + - + table: sys_file_reference + mode: insert + elements: + fileupload-1: + mapOnDatabaseColumn: uid_local + skipIfValueIsEmpty: true + databaseColumnMappings: + tablenames: + value: tx_news_domain_model_news + fieldname: + value: fal_related_files + tstamp: + value: '{__currentTimestamp}' + crdate: + value: '{__currentTimestamp}' + uid_foreign: + value: '{SaveToDatabase.insertedUids.0}' + - + table: sys_file_reference + mode: update + whereClause: + uid_foreign: '{SaveToDatabase.insertedUids.0}' + uid_local: 0 + databaseColumnMappings: + pid: + value: 0 + uid_foreign: + value: 0 diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher-multiple.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher-multiple.php.inc new file mode 100644 index 0000000..bc04812 --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher-multiple.php.inc @@ -0,0 +1,30 @@ +createFinisher('SaveToDatabase', [ + 1 => [ + 'table' => 'my_table', + 'mode' => 'insert', + 'databaseColumnMappings' => [ + 'some_column' => ['value' => 'cool'], + ], + ], + 2 => [ + 'table' => 'my_other_table', + 'mode' => 'update', + 'whereClause' => [ + 'pid' => 1, + ], + 'databaseColumnMappings' => [ + 'some_other_column' => ['value' => '{SaveToDatabase.insertedUids.1}'], + ], + ], + ]); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher.php.inc b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher.php.inc new file mode 100644 index 0000000..cbff43e --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_finisher.php.inc @@ -0,0 +1,31 @@ +createFinisher('SaveToDatabase', [ + 'table' => 'fe_users', + 'mode' => 'update', + 'whereClause' => [ + 'uid' => 1, + ], + 'databaseColumnMappings' => [ + 'pid' => ['value' => 1], + ], + 'elements' => [ + 'textfield-identifier-1' => ['mapOnDatabaseColumn' => 'first_name'], + 'textfield-identifier-2' => ['mapOnDatabaseColumn' => 'last_name'], + 'textfield-identifier-3' => ['mapOnDatabaseColumn' => 'username'], + 'advancedpassword-1' => [ + 'mapOnDatabaseColumn' => 'password', + 'skipIfValueIsEmpty' => true, + 'hashed' => true + ], + ], + ]); + } +} diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form-multiple.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form-multiple.yaml new file mode 100644 index 0000000..62597fe --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form-multiple.yaml @@ -0,0 +1,22 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: SaveToDatabase + options: + 1: + table: 'my_table' + mode: insert + databaseColumnMappings: + some_column: + value: 'cool' + 2: + table: 'my_other_table' + mode: update + whereClause: + pid: 1 + databaseColumnMappings: + some_other_column: + value: '{SaveToDatabase.insertedUids.1}' diff --git a/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form.yaml b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form.yaml new file mode 100644 index 0000000..b7bc3ec --- /dev/null +++ b/Documentation/I/Concepts/Finishers/ReadyToUseFinishers/SaveToDatabaseFinisher/_codesnippets/_form.yaml @@ -0,0 +1,28 @@ +identifier: example-form +label: 'example' +type: Form + +finishers: + - + identifier: SaveToDatabase + options: + table: 'fe_users' + mode: update + whereClause: + uid: 1 + databaseColumnMappings: + tstamp: + value: '{__currentTimestamp}' + pid: + value: 1 + elements: + textfield-identifier-1: + mapOnDatabaseColumn: 'first_name' + textfield-identifier-2: + mapOnDatabaseColumn: 'last_name' + textfield-identifier-3: + mapOnDatabaseColumn: 'username' + advancedpassword-1: + mapOnDatabaseColumn: 'password' + skipIfValueIsEmpty: true + hashed: true diff --git a/Documentation/I/Concepts/FormConfigurationFormDefinition/Index.rst b/Documentation/I/Concepts/FormConfigurationFormDefinition/Index.rst new file mode 100644 index 0000000..3eb7ba6 --- /dev/null +++ b/Documentation/I/Concepts/FormConfigurationFormDefinition/Index.rst @@ -0,0 +1,113 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-formdefinition-vs-formconfiguration: + +Form configuration vs. form definition +====================================== + +Up to this point, we have mainly looked at form framework configuration. +In short, **form configuration** is based on *prototypes* and allows you to define: + +- which form elements, finishers, and validators are available to the system, +- how they are pre-configured, +- how they are displayed in the frontend and backend. + +However, a second important part of the form framework is **form definition**, +which is configuration but for *specific* forms, for example the ones users define. Form +definition includes: + +- form elements and their validators, +- the order of the form elements on the form +- the finishers that are fired when the form is submitted +- values of form element properties. + + +In other words, a ``Text`` form element would be defined in **form configuration** +but a ``Text`` form element located on page 1 at position 1 of a specific form +would be defined in a **form definition**. A **form definition** might also define +a placeholder (HTML attribute) with a value of "Your name +here" in a form element. Form definitions are created by the backend ``form editor``. + +Example form definition (for a specific form) +--------------------------------------------- + +.. code-block:: yaml + + identifier: ext-form-simple-contact-form-example + label: 'Simple Contact Form' + prototype: standard + type: Form + + finishers: + - + identifier: EmailToReceiver + options: + subject: 'Your message' + recipients: + your.company@example.com: 'Your Company name' + ceo@example.com: 'CEO' + senderAddress: '{email}' + senderName: '{name}' + + renderables: + - + identifier: page-1 + label: 'Contact Form' + type: Page + + renderables: + - + identifier: name + label: 'Name' + type: Text + properties: + fluidAdditionalAttributes: + placeholder: 'Name' + defaultValue: '' + validators: + - + identifier: NotEmpty + - + identifier: subject + label: 'Subject' + type: Text + properties: + fluidAdditionalAttributes: + placeholder: 'Subject' + defaultValue: '' + validators: + - + identifier: NotEmpty + - + identifier: email + label: 'Email' + type: Text + properties: + fluidAdditionalAttributes: + placeholder: 'Email address' + defaultValue: '' + validators: + - + identifier: NotEmpty + - + identifier: EmailAddress + - + identifier: message + label: 'Message' + type: Textarea + properties: + fluidAdditionalAttributes: + placeholder: '' + defaultValue: '' + validators: + - + identifier: NotEmpty + - + identifier: hidden + label: 'Hidden Field' + type: Hidden + - + identifier: summarypage + label: 'Summary page' + type: SummaryPage diff --git a/Documentation/I/Concepts/FormEditor/Index.rst b/Documentation/I/Concepts/FormEditor/Index.rst new file mode 100644 index 0000000..199071c --- /dev/null +++ b/Documentation/I/Concepts/FormEditor/Index.rst @@ -0,0 +1,579 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-formeditor: + +Form editor +=========== + + +.. _concepts-formeditor-general: + +What does it do? +---------------- + +The ``form editor`` is a powerful graphical user interface in the TYPO3 backend +which allows editors to create ``form definitions`` without writing a single line +of code. These ``form definitions`` are used by the frontend process to +render beautiful forms. + +The ``form editor`` is a modular interface which consists of the following +components: + +- Stage: main visual component of the backend ``form editor`` where displaying + form elements in an abstract view or a frontend preview (in the middle of the ``form editor``) +- Tree: displays the structure of the form as a tree (on the left) +- Inspector: context specific toolbar which displays + form element options and where options can be edited (on the right) +- Core: core functionality of the ``form editor`` +- ViewModel: defines and controls the visual display +- Mediator: delegates component events +- Modals: processes modals +- FormEditor: provides API functions +- Helper: helper functions for the manipulation of DOM elements + +The ``Modals``, ``Inspector``, and ``Stage`` components +can be modified by configuration. The ``Inspector`` component +is modular and extremely flexible. Integrators can add +``inspector editors`` (input fields of different types) +to allow backend editors to alter form element +options. + +The diagram below shows Javascript module interaction between the form editor and the +core, viewmodel and mediator. + +.. figure:: ../../Images/javascript_module_interaction.png + :alt: JavaScript module interaction + + JavaScript module interaction + +The ``form editor`` configuration is under the following configuration path: + +.. code-block:: yaml + + prototypes: + standard: + formEditor: + +Here you can configure different aspects of the ``form editor`` under the following +configuration paths: + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + : + formEditor: + finishersDefinition: + + formEditor: + validatorsDefinition: + + formEditor: + + +.. _concepts-formeditor-components-in-detail: + +Form editor components in detail +-------------------------------- + + +.. _concepts-formeditor-stage: + +Stage +^^^^^ + +The ``Stage`` is the central visual component of the form editor and it +can display form elements in two different modes: + +- abstract view: all the form elements on a ``Page`` (a step) presented in an + abstract way, +- frontend preview: renders the form as it will be displayed in + the frontend (to render the form exactly the same as in the frontend, make sure + your frontend CSS is loaded in the backend) + +By default, the frontend templates of :t3ext:`form` are based on `Bootstrap`_. +Since the backend of TYPO3 CMS also depends on `Bootstrap`_, +the corresponding CSS files will already loaded in the backend. +Nevertheless, some CSS is overridden and extended in order +to meet the specific needs of the TYPO3 backend, meaning frontend preview +(in the backend) could differ compared to the "real" frontend. + +If your frontend preview requires additional CSS or a CSS framework +then go ahead and configure a specific ``prototype`` accordingly. + +Beside the frontend templates, there are also templates for the abstract +view, i.e. you can customize the rendering of the abstract view for each +form element. If you have created your own form elements, in most cases you +will fall back to the already existing Fluid templates. But remember, you +are always able to create your own Fluid templates and adapt the abstract view +to suit your needs. + +For more information, read the following chapter: ':ref:`Common abstract view form element templates`'. + +.. _Bootstrap: https://getbootstrap.com/ + + +.. _concepts-formeditor-inspector: + +Inspector +^^^^^^^^^ + +The ``Inspector`` is on the right side of the ``form editor``. It is a modular, +flexible, and context-specific toolbar +and depends on which form element is currently selected. The ``Inspector`` +is where you can edit form element options using ``inspector editors``. +The interface is easily customized by YAML configuration. You can define form element +properties and how they can be edited. + +You can edit form element properties (like ``properties.placeholder``) +as well as ``property collections``. They are defined at the form element level +in the YAML configuration file. There are two types of ``property collections``: + +- validators +- finishers + +``Property collections`` are also configured by ``inspector editors`` and this +allows you to do some cool stuff. Imagine that you have a "Number range" validator with +two validator options "Minimum" and "Maximum" and two form elements, "Age +spouse" and "Age infant". You could set the validator for both form elements, +but make "Minimum" non-editable and pre-fill "Maximum" with a value for the "Age +infant" form element only and not the "Age spouse" form element. + +.. _concepts-formeditor-translation-formeditor: + +Translation of the form editor +------------------------------ + +All option values below the following configuration keys can be translated: + +.. code-block:: yaml + + prototypes: + standard: + formEditor: + formElementsDefinition: + : + formEditor: + finishersDefinition: + + formEditor: + validatorsDefinition: + + formEditor: + +The ``form editor`` translation files are loaded as follows: + +.. code-block:: yaml + + prototypes: + standard: + formEditor: + translationFiles: + # custom translation file + 20: 'EXT:my_site_package/Resources/Private/Language/Database.xlf' + +Option values are searched for in the defined +translation files. If a translation is found, the translated option value +will be used. + +As an example, if the following option is defined: + +.. code-block:: yaml + + ... + label: 'formEditor.elements.Form.editor.finishers.label' + ... + +The translation key ``formEditor.elements.Form.editor.finishers.label`` +is first searched for in the file +``20: 'EXT:my_site_package/Resources/Private/Language/Database.xlf'`` +and then in the file ``10: 'EXT:form/Resources/Private/Language/Database.xlf'`` +(loaded by default by EXT:form). If nothing is found, the option value will be +displayed unmodified. + + +.. _concepts-formeditor-customization-formeditor: + +Customization of the form editor +-------------------------------- + +The form editor can be customized by YAML +configuration in the configuration. The configuration is not stored in one central configuration +file. Instead, configuration is defined for each form element (see +`EXT:form/form/Configuration/Yaml/FormElements/`). In addition, +the :yaml:`Form` element itself (see `EXT:form/Configuration/Yaml/FormElements/Form.yaml`) +has some basic configuration. + +A common customization is to remove form elements from the form +editor. Unlike other TYPO3 modules, the form editor cannot be configured +using backend user groups and `Access Lists` - it can only be done by YAML configuration. + +Quite often, integrators tend to unset form elements as shown below. +In this example, the :yaml:`AdvancedPassword` form element is completely removed from +the form framework. Integrators and developers will no longer be able to use +the :yaml:`AdvancedPassword` element in their YAML form definitions or via API. + +.. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + prototypes: + standard: + formElementsDefinition: + AdvancedPassword: null + + +The correct way is to unset the :ref:`group property `. +This property defines which group in the ``form editor`` "new Element" +modal the form element should belong in. Unsetting this property will remove the +form element safely from the form editor: + +.. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + prototypes: + standard: + formElementsDefinition: + AdvancedPassword: + formEditor: + group: null + + +.. _concepts-formeditor-extending: + +Extending the form editor +------------------------- + +Learn :ref:`here ` +how to make finishers configurable in the backend form editor. + + +.. _concepts-formeditor-basicjavascriptconcepts: + +Basic JavaScript concepts +------------------------- + +The form framework was designed to be as extendable as possible. Sooner or +later, you will want to customize ``form editor`` components using +JavaScript. This is especially true if you want to create your own +``inspector editors``. In order to achieve this, you can implement your own +JavaScript modules. Those modules will include the required algorithms for +the ``inspector editors`` and the ``abstract view`` as well as your own +events. + + +.. _concepts-formeditor-basicjavascriptconcepts-registercustomjavascriptmodules: + +Register custom JavaScript modules +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can use the following configuration YAML to register your JavaScript module. + +.. code-block:: yaml + + prototypes: + standard: + formEditor: + dynamicJavaScriptModules: + additionalViewModelModules: + 10: '@my-vendor/my-site-package/backend/form-editor/view-model.js' + +.. code-block:: php + + # Configuration/JavaScriptModules.php + ['form'], + 'imports' => [ + '@myvendor/my-site-package/' => 'EXT:my_site_package/Resources/Public/JavaScript/', + ], + ]; + +In the configuration above, the JavaScript files have to be in the folder +``my_site_package/Resources/Public/JavaScript/backend/form-editor/view-model.js``. + +The following example module is a template you can use containing the recommended setup. + +.. code-block:: javascript + + /** + * Module: @my-vendor/my-site-package/backend/form-editor/view-model.js + */ + import * as Helper from '@typo3/form/backend/form-editor/helper.js' + + /** + * @private + * + * @var object + */ + let _formEditorApp = null; + + /** + * @private + * + * @return object + */ + function getFormEditorApp() { + return _formEditorApp; + }; + + /** + * @private + * + * @return object + */ + function getPublisherSubscriber() { + return getFormEditorApp().getPublisherSubscriber(); + }; + + /** + * @private + * + * @return object + */ + function getUtility() { + return getFormEditorApp().getUtility(); + }; + + /** + * @private + * + * @param object + * @return object + */ + function getHelper() { + return Helper; + }; + + /** + * @private + * + * @return object + */ + function getCurrentlySelectedFormElement() { + return getFormEditorApp().getCurrentlySelectedFormElement(); + }; + + /** + * @private + * + * @param mixed test + * @param string message + * @param int messageCode + * @return void + */ + function assert(test, message, messageCode) { + return getFormEditorApp().assert(test, message, messageCode); + }; + + /** + * @private + * + * @return void + * @throws 1491643380 + */ + function _helperSetup() { + assert('function' === typeof Helper.bootstrap, + 'The view model helper does not implement the method "bootstrap"', + 1491643380 + ); + Helper.bootstrap(getFormEditorApp()); + }; + + /** + * @private + * + * @return void + */ + function _subscribeEvents() { + getPublisherSubscriber().subscribe('some/eventName/you/want/to/handle', function(topic, args) { + myCustomCode(); + }); + }; + + /** + * @private + * + * @return void + */ + function myCustomCode() { + }; + + /** + * @public + * + * @param object formEditorApp + * @return void + */ + export function bootstrap(formEditorApp) { + _formEditorApp = formEditorApp; + _helperSetup(); + _subscribeEvents(); + }; + + +.. _concepts-formeditor-basicjavascriptconcepts-events: + +Events +^^^^^^ + +Event handling in :t3ext:`form` is based on the ``Publish/Subscribe Pattern``. +To learn more about this terrific pattern, see: https://addyosmani.com/resources/essentialjsdesignpatterns/book/. +Please note that the processing sequence of the subscribers cannot be +influenced. Furthermore, there is no information flow between the +subscribers. All events are asynchronous. + +For more information, head to the API reference and read the section about +':ref:`Events`'. + + +.. _concepts-formeditor-basicjavascriptconcepts-formelementmodel: + +FormElement model +^^^^^^^^^^^^^^^^^ + +In the JavaScript code, each form element is represented by a +``FormElement model``. This model can be seen as a copy of the ``form definition`` +enriched with some additional data. The following example shows +you a ``form definition`` and, below it, the debug output of ``FormElement model``. + +.. code-block:: yaml + + identifier: javascript-form-element-model + label: 'JavaScript FormElement model' + type: Form + finishers: + - + identifier: EmailToReceiver + options: + subject: 'Your message: {subject}' + recipients: + your.company@example.com: 'Your Company name' + ceo@example.com: 'CEO' + senderAddress: '{email}' + senderName: '{name}' + replyToRecipients: + replyTo.company@example.com: 'Your Company name' + carbonCopyRecipients: + cc.company@example.com: 'Your Company name' + blindCarbonCopyRecipients: + bcc.company@example.com: 'Your Company name' + addHtmlPart: true + attachUploads: 'true' + translation: + language: '' + title: '' + renderables: + - + identifier: page-1 + label: 'Contact Form' + type: Page + renderables: + - + identifier: name + label: Name + type: Text + properties: + fluidAdditionalAttributes: + placeholder: Name + defaultValue: '' + validators: + - + identifier: NotEmpty + +.. code-block:: javascript + + { + "identifier": "javascript-form-element-model", + "label": "JavaScript FormElement model", + "type": "Form", + "prototypeName": "standard", + "__parentRenderable": null, + "__identifierPath": "example-form", + "finishers": [ + { + "identifier": "EmailToReceiver", + "options": { + "subject": "Your message: {subject}", + "recipients": { + "your.company@example.com": "Your Company name", + "ceo@example.com": "CEO" + }, + "senderAddress": "{email}", + "senderName": "{name}", + "replyToRecipients": { + "replyTo.company@example.com": "Your Company name" + }, + "carbonCopyRecipients": { + "cc.company@example.com": "Your Company name" + }, + "blindCarbonCopyRecipients": { + "bcc.company@example.com": "Your Company name" + }, + "addHtmlPart": true, + "attachUploads": true, + "translation": { + "language": "" + }, + "title": "" + } + } + ], + "renderables": [ + { + "identifier": "page-1", + "label": "Contact Form", + "type": "Page", + "__parentRenderable": "example-form (filtered)", + "__identifierPath": "example-form/page-1", + "renderables": [ + { + "identifier": "name", + "defaultValue": "", + "label": "Name", + "type": "Text", + "properties": { + "fluidAdditionalAttributes": { + "placeholder": "Name" + } + }, + "__parentRenderable": "example-form/page-1 (filtered)", + "__identifierPath": "example-form/page-1/name", + "validators": [ + { + "identifier": "NotEmpty" + } + ] + } + ] + } + ] + } + +For each form element which has child elements, there is a property +called ``renderables``. ``renderables`` are arrays of ``FormElement models`` +of child elements. + +The ``FormElement model`` is therefore a combination of the +of ``form definition`` data and some additional information: + +- __parentRenderable +- __identifierPath + +The following methods can be used to access ``FormElement model`` data: + +- get() +- set() +- unset() +- on() +- off() +- getObjectData() +- toString() +- clone() + +Head to the API reference to read more about +the :ref:`FormElement model`. diff --git a/Documentation/I/Concepts/FormFileStorages/Index.rst b/Documentation/I/Concepts/FormFileStorages/Index.rst new file mode 100644 index 0000000..08bf8d6 --- /dev/null +++ b/Documentation/I/Concepts/FormFileStorages/Index.rst @@ -0,0 +1,78 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-form-file-storages: + +Form/ File storage +================== + +Form definitions can also be stored in and shipped with your own +extensions and backend users can then +embed your forms. Furthermore, you can configure that your form +definitions: + +- can be edited in the ``form editor``, +- can be deleted with the ``form manager``. + +By default, all these options are turned off because dynamic content inside an +extension - possibly version-controlled - is not a good idea. There is also no +ACL system available. + +**File uploads** are saved in file mounts. They are handled +as FAL objects. The file mounts for file uploads can be configured. +When adding/ editing a file upload element, backend users can select the +storage for the uploads. + +Add your extension path as an additional file mount for form definitions as follows: + +.. code-block:: yaml + + persistenceManager: + allowedExtensionPaths: + 10: EXT:my_site_package/Resources/Private/Forms/ + +Allow backend users to **edit** forms stored in your extension as follows: + +.. code-block:: yaml + + persistenceManager: + allowSaveToExtensionPaths: true + +Allow backend users to **delete** forms stored in your extension as follows: + +.. code-block:: yaml + + persistenceManager: + allowDeleteFromExtensionPaths: true + +The following YAML shows the default file mount setup for file (and image) uploads. + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + FileUpload: + formEditor: + predefinedDefaults: + properties: + saveToFileMount: '1:/user_upload/' + editors: + 400: + selectOptions: + 10: + value: '1:/user_upload/' + label: '1:/user_upload/' + properties: + saveToFileMount: '1:/user_upload/' + ImageUpload: + formEditor: + predefinedDefaults: + properties: + saveToFileMount: '1:/user_upload/' + editors: + 400: + selectOptions: + 10: + value: '1:/user_upload/' + label: '1:/user_upload/' diff --git a/Documentation/I/Concepts/FormManager/Index.rst b/Documentation/I/Concepts/FormManager/Index.rst new file mode 100644 index 0000000..d1144ea --- /dev/null +++ b/Documentation/I/Concepts/FormManager/Index.rst @@ -0,0 +1,133 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-formmanager: + +Form manager +============ + + +.. _concepts-formmanager-general: + +What does it do? +---------------- + +You will find the ``form manager`` in the backend :guilabel:`Web > Forms` backend +module. Editors can use the ``form manager`` to administer forms stored on file +mounts that they have access to. The ``form manager``: + +- lists all forms +- allows users to create, edit, duplicate, and delete forms +- identifies the storage folder +- gives an overview of which pages the forms are on. + +Creation and duplication of forms is made easier by a ``form wizard``. +The wizard guides the editor through form creation and offers a +variety of settings, such as the file +mount, the prototype, and start templates. + +.. figure:: ../../Images/form_manager.png + :alt: The form manager + + TYPO3 Backend with opened module 'Forms' displaying the form manager. + + +.. _concepts-formmanager-starttemplate: + +Start templates +--------------- + +Editors can select a ``Start template`` when they are creating a new form. A +``Start template`` is a ``form definition`` which hasn't been assigned a +``prototypeName`` (the ``prototypeName`` property is normally used as the +foundation of a new form). + +An integrator can create as many ``Start templates`` as they wish for a particular +``prototype``. After the ``Start templates`` have been defined the integrator can then: + +- open :guilabel:`Web > Forms` +- create a new form by clicking on the appropriate button +- enter the 'Form name' and click the 'Advanced settings' checkbox +- select a ``Start template`` during the next steps + +Integrators have to define ``Start templates`` so that they can be selected +by editors. Also, the same ``Start template`` +can be used for several ``prototypes``. To do this, make sure the +``start template`` form elements are defined in the corresponding ``prototypes``. + +For example, imagine an integrator has :ref:`configured` +a prototype called 'routing' which contains a form element of type +```` 'locationPicker'. The element is only +defined in this prototype. The integrator has created a ``Start template`` +which contains the 'locationPicker' form element. A backend editor could now +select and use this ``Start template`` with the 'locationPicker' form element, +as long as the ``prototype`` is 'routing'. If the integrator +adds this form element to another ``prototype``, the process would +crash. The 'locationPicker' form element is only known to the 'routing' +``prototype``. + +The following example shows a ``Start template``. A +``Start template`` requires at least the root form element +('Form') and a 'Page'. + + +.. code-block:: yaml + + type: 'Form' + identifier: 'blankForm' + label: '[Blank Form]' + renderables: + - + type: 'Page' + identifier: 'page-1' + label: 'Page' + +The ``form manager`` form wizard displays +a list of all :ref:`pre-configured` +``Start templates``.When a backend editor creates a form using a +``Start template``, a new ``form definition`` is generated based on that +``Start template``. The ``form definition`` ``propertyName`` will be that of the +chosen ``prototype``.The ``identifier`` of the root form element ('Form') is set +to the entered "Form name". This name is also used for the +property `` label`` of the 'Form' element. Finally, the ``form editor`` is +loaded and displays the newly created form. + + +.. _concepts-formmanager-translation-starttemplate: + +Translation of the form manager +------------------------------- + +All option values below the ``form editor`` key in the form configuration can be +translated: + +.. code-block:: yaml + + formManager: + +The ``form manager`` translation files are loaded as follows: + +.. code-block:: yaml + + formManager: + translationFiles: + # custom translation file + 20: 'EXT:my_site_package/Resources/Private/Language/Form/Database.xlf' + +The process searches for each option value within all of the defined +translation files. If a translation is found, the translated option value +will be used in preference. + +For the following option value: + +.. code-block:: yaml + + ... + label: 'formManager.selectablePrototypesConfiguration.standard.label' + ... + +the process searches for the translation key ``formManager.selectablePrototypesConfiguration.standard.label`` +in the file under key 20 ``20: 'EXT:my_site_package/Resources/Private/Language/Form/Database.xlf'`` +and then the file in EXT:form ``10: 'EXT:form/Resources/Private/Language/Database.xlf'`` +(loaded by default). If nothing is found, the option value will be +displayed unmodified. diff --git a/Documentation/I/Concepts/FormPlugin/Index.rst b/Documentation/I/Concepts/FormPlugin/Index.rst new file mode 100644 index 0000000..b5b6e2c --- /dev/null +++ b/Documentation/I/Concepts/FormPlugin/Index.rst @@ -0,0 +1,100 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-formplugin: + +Form plugin +=========== + + +.. _concepts-formplugin-general: + +What does it do? +---------------- + +The ``form plugin`` allows you to assign a form to a page and view it in the +frontend. The form can have been created via the ``form editor`` or shipped with +your extension. Forms can be re-used throughout the TYPO3 installation and backend editors +can override form definitions. At the moment, only finisher options can be overridden but the +possibilities depend on the configuration of the underlying prototype. + +Imagine that your form contains a redirect finisher. The redirect target is set +globally and valid for the whole ``form definition``. When they are adding the form +to a page, a backend editor can define a redirect target that is different to the +'global' form definition. This setting is only valid on the page containing the plugin. + +Read more about changing :ref:`general` +and :ref:`specific form plugin configuration`. + + +.. _concepts-formplugin-exclude-override: + +Exclude options from overrides +------------------------------ + +Sometimes it is useful to prevent options from being overridden by the +form plugin. You can do this by unsetting the options in your +general forms configuration YAML. To unset options use the YAML NULL (:yaml:`~`) value. + +In this example, four ``EmailToReceiver`` finisher fields are unset. The +options will be removed from the form plugin but not the form editor. + +.. code-block:: yaml + + prototypes: + standard: + finishersDefinition: + EmailToReceiver: + FormEngine: + elements: + senderAddress: ~ + senderName: ~ + replyToRecipients: ~ + translation: ~ + + +.. _concepts-formplugin-translation-formengine: + +Translation of form plugin +-------------------------- + +All option values under the following configuration keys can be +translated: + +.. code-block:: yaml + + prototypes: + standard: + finishersDefinition: + + formEngine: + +``Form plugin`` translation files are loaded as follows: + +.. code-block:: yaml + + prototypes: + standard: + formEngine: + translationFiles: + # custom translation file + 20: 'EXT:my_site_package/Resources/Private/Language/Database.xlf' + +Each option value is searched for in the defined +translation files. If a translation is found, the translated option value +will be used. + +Imagine that the following option value is defined: + +.. code-block:: yaml + + ... + label: 'tt_content.finishersDefinition.EmailToReceiver.label' + ... + +The translation key +``tt_content.finishersDefinition.EmailToReceiver.label`` is first searched for in the file +``20: 'EXT:my_site_package/Resources/Private/Language/Database.xlf'`` and +then in the file 10: 'EXT:form/Resources/Private/Language/Database.xlf' +(loaded by EXT:form by default). If nothing is found, the option value will be +displayed unmodified. diff --git a/Documentation/I/Concepts/FrontendRendering/Index.rst b/Documentation/I/Concepts/FrontendRendering/Index.rst new file mode 100644 index 0000000..ac7f804 --- /dev/null +++ b/Documentation/I/Concepts/FrontendRendering/Index.rst @@ -0,0 +1,937 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-frontendrendering: + +================== +Frontend rendering +================== + +.. _concepts-frontendrendering-templates: + +Templates +========= + +Fluid templates in the form framework are based on `Bootstrap`_. + +.. _Bootstrap: https://getbootstrap.com/ + +.. _concepts-frontendrendering-templates-customtemplates: + +Custom templates +---------------- + +In order to use your own Fluid templates for frontend forms, +register your own template paths via YAML in the form configuration +(here under the default ``standard`` prototype). + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + templateRootPaths: + 100: 'EXT:my_site_package/Resources/Private/Frontend/Templates/' + partialRootPaths: + 100: 'EXT:my_site_package/Resources/Private/Frontend/Partials/' + layoutRootPaths: + 100: 'EXT:my_site_package/Resources/Private/Frontend/Layouts/' + +If your `form definition` then references the `standard` prototype, the form +framework will look for Fluid templates in +:directory:`EXT:my_site_package/Resources/Private/Frontend/[*]`. + +The `Form` element is the 'main' element. The framework will look for +:file:`Form.html` in :directory:`templateRootPaths`. For all other elements, +it will look in :directory:`partialRootPaths`. A partial has the same name +as the `formElementTypeIdentifier` property, for example, +a `Text` template will be in a partial named :file:`Text.html` in +:directory:`partialRootPaths`. + + +.. _concepts-frontendrendering-templates-singlevalues: + +Form element values in finisher templates +----------------------------------------- + +Use the :php:`RenderFormValueViewHelper` to access form element values in your +finisher templates. This ViewHelper accepts a single form +element and renders it. The following example shows the :php:`RenderFormValueViewHelper` +being called with two parameters (`renderable` and `as`) to output the value of a +`message` field. The value :fluid:`{formValue.processedValue}` can then +be manipulated with Fluid, styled, etc. + +.. code-block:: html + + + {formValue.processedValue} + + +Names of your form elements can be found in your form definition (in your +individual YAML files or in the :guilabel:`System > Configuration` module if you +have the lowlevel extension installed). Or use the debug ViewHelper in Fluid to +list all the form elements. + +.. code-block:: html + + {page.rootForm.elements} + + +.. _concepts-frontendrendering-translation: + +Translation +=========== + +.. _concepts-frontendrendering-translation-formdefinition: + +Translate form definition +------------------------- + +Translation of `form definitions` works differently to the usual translation +of the backend. Currently, there is no graphical user interface +for this translation process. + +If `form definition` properties were translated in the same way as the rest of the backend, +a backend editor using the `form editor` to edit a form they would see long +unwieldy translation keys. In order to avoid this, form element *properties* are translated +instead of their values. The form framework does not look for translation keys +in a translation file. Instead, the system searches for translations +of the form element properties independent of their property values. The +property values are ignored if an entry is found in a +translation file. The form element property values are overridden by the +translated values. + +This approach is a compromise between two scenarios: creating forms using the `form editor` +or creating `form definitions` (which could later be edited in the +`form editor`). An editor can create forms just using the `form editor` where +form element property values are displayed in the default language. An integrator +can provide additional language files which translate the form depending on the +prototype. + +Add additional translation files to the form configuration as follows: + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + translation: + translationFiles: + # custom translation file + 20: 'EXT:my_site_package/Resources/Private/Language/Form/locallang.xlf' + +The translationFiles array is processed from the highest key to the lowest, i.e. your +translation file with key `20` is processed before translation files with key +'10' in EXT:form. If no key is found in the translation files, a +property value will be displayed unmodified. + +The following properties can be translated: + +* label +* defaultValue (scalar values only; array values, e.g. for :yaml:`MultiCheckbox`, are not translated) +* properties.[*] +* properties.options.[*] +* properties.fluidAdditionalAttributes.[*] +* renderingOptions.[*] + +The translation keys are put together based on a specific pattern and there is a +order (fallback chain) for the translations that depends on translation scenarios. +These are the translation scenarios: + +* translation of a form element property for a specific form (`formDefinitionIdentifier) and form + element (`ElementIdentifier`) +* translation of a form element property for a specific form element (`formElementIdentifier`) and + various forms +* translation of a form element property for an element type (`elementType`) and various + forms, e.g. the `Page` element + +The look-up process searches for translation keys in all given translation +files based on the following order (the same order as the translation scenarios above): + +* `.element..properties.` +* `element..properties.` +* `element..properties.` + +Translation of options (`properties.options`) in form elements, like the +`Select` element, have the following look-up order: + +* `.element..properties.options.` +* `element..properties.options.` + +.. _concepts-frontendrendering-translation-formdefinition-example: + +Example Form Definition +~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: yaml + + identifier: ApplicationForm + type: Form + prototypeName: standard + label: 'Application form' + + renderables: + - + identifier: GeneralInformation + type: Page + label: 'General information' + + renderables: + - + identifier: LastName + type: Text + label: 'Last name' + properties: + placeholder: 'Please enter your last name.' + defaultValue: '' + - + identifier: Software + type: MultiSelect + label: 'Known software' + properties: + options: + value1: TYPO3 + value2: Neos + +In order to translate the form element `LastName`, the process will look for the following +translation keys in the translation files: + +* `ApplicationForm.element.LastName.properties.label` + (*.element..properties.*) +* `element.LastName.properties.label` + (*element..properties.*) +* `element.Text.properties.label` + (*element..properties.*) + +If none of these keys exist, 'Last name' will be displayed. + +The :yaml:`defaultValue` of `LastName` can be translated with the same fallback chain, +using ``properties.defaultValue`` as the property name: + +* `ApplicationForm.element.LastName.properties.defaultValue` +* `element.LastName.properties.defaultValue` +* `element.Text.properties.defaultValue` + +In order to translate the form element `Software`, the process will look for the following +translation keys in the translation files: + +* `ApplicationForm.element.Software.properties.label` + (*.element..properties.*) +* `element.Software.properties.label` + (*element..properties.*) +* `element.MultiSelect.properties.label` + (*element..properties.*) + +If none of the these keys exist, 'Known software' will be +displayed. The option properties lookup process is as the following: + +* `ApplicationForm.element.Software.properties.options.value1` + (*.element..properties.options.*) +* `element.Software.properties.options.value1` + (*element..properties.options.*) +* `ApplicationForm.element.Software.properties.options.value2` + (*.element..properties.options.*) +* `element.Software.properties.options.value2` + (*element..properties.options.*) + +If none of the these keys exist, 'TYPO3' will be displayed as +label for the first option and 'Neos' for the second option. + +.. _concepts-frontendrendering-translation-validationerrors: + +Translation of validation messages +---------------------------------- + +The translation of validation messages is similar to the translation of +`form definitions` abpve. The same translation files can be used. If the look-up +process does not find a key within the files, an Extbase message will be displayed. +EXT:form translates validators by default. + +The same as for `form definitions`, the translation keys are put together based on a +specific pattern. There is also a fallback chain. + +The following translation scenarios are possible: + +* translation of validation messages for a specific validator of a specific + form element (`elementIdentifier`) and specific form (`formDefinitionIdentifier`) +* translation of validation messages for a specific validator of various + form elements within a specific form (`formDefinitionIdentifier`) +* translation of validation messages for a specific validator of a specific + form element (`elementIdentifier`) in various forms +* translation of validation messages for a specific validator in various + forms + +In Extbase, validation messages are identified by numerical codes (UNIX +timestamps). Different codes can be used for the same validator. Read more about +:ref:`concrete validator configurations `. + +The look-up process searches for translation keys in the translation +files in the following order (the same order as the translation scenarios above): + +* `.validation.error..` +* `.validation.error.` +* `validation.error..` +* `validation.error.` + +.. _concepts-frontendrendering-translation-validation-example: + +Example Form Definition with Validator +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: yaml + + identifier: ContactForm + type: Form + prototypeName: standard + label: 'Contact us' + + renderables: + - + identifier: Page1 + type: Page + label: 'Page 1' + + renderables: + - + identifier: LastName + type: Text + label: 'Last name' + properties: + fluidAdditionalAttributes: + required: required + validators: + - + identifier: NotEmpty + + +If a user submits this form without providing a last name, the `NotEmpty` +validator (at the bottom of the example above) fails and +sends 1221560910 as a ``. The system looks through the +translation keys in the following order searching for the `NotEmpty` validator for form element `LastName`: + +* ContactForm.validation.error.LastName.1221560910 (*.validation.error..*) +* ContactForm.validation.error.1221560910 (*.validation.error.*) +* validation.error.LastName.1221560910 (*validation.error..*) +* validation.error.1221560910 (validation*.error.*) + +As mentioned above, if no translation key is available, +a default Extbase framework message is displayed. + +.. _concepts-finishers-translation: +.. _concepts-frontendrendering-translation-finishers: + +Translation of finisher options +------------------------------- + +The translation of finisher options is similar to the translation of +`form definitions` above. The same translation files can be used. If the look-up +process does not find a key in the provided translation files, the property value +will be displayed unmodified. + +The same as for `form definitions`, the translation keys are put together based on a +specific pattern. There is also a fallback chain. + +The following translation scenarios are possible: + +* translation of finisher options for a specific finisher (`finisherIdentifier`) of a specific form (`formDefinitionIdentifier` below) +* translation of finisher options for a specific finisher (`finisherIdentifier`) of various forms + +The look-up process searches for translation keys in all the translation +files based on the following order (the same order as the translation scenarios above): + +* `.finisher..` +* `finisher..` + +The translation order is as follows: + +1. Default value from form definition +2. Overridden value from a FlexForm (if any) +3. Localized value provided by translation files (if any) + +The :yaml:`translation.propertiesExcludedFromTranslation` option skips the +third step so that the translation resolves to a FlexForm value if one exists. +For an example see +`Skip translation of overridden form finisher options `_. + +.. _concepts-frontendrendering-translation-finishers-example: + +Example Form Definition with Finisher +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: yaml + + identifier: ContactForm + type: Form + prototypeName: standard + label: 'Contact us' + + finishers: + - + identifier: Confirmation + options: + message: 'Thank you for your inquiry.' + + renderables: + ... + +The look-up process searches for the following translation keys for the +'Confirmation' finisher message option: + +* `ContactForm.finisher.Confirmation.message` (*.finisher..*) +* `finisher.Confirmation.message` (*finisher..*) + +If no translation key exists, the message 'Thank you for your inquiry.' will +be displayed. + + +.. _concepts-frontendrendering-translation-arguments: + +Form element translation arguments +================================== + +Form element property translations and finisher option translations can have +placeholders to output translation arguments. Translations can be enriched with +variable values by passing arguments to form element properties. This +feature was introduced in :issue:`81363`. + +.. _concepts-frontendrendering-translation-properties: + +Form element properties +----------------------- + +In the YAML form configuration you can add simple literal values: + +.. code-block:: yaml + + renderables: + - identifier: field-with-translation-arguments + type: Checkbox + label: This is a %s feature + renderingOptions: + translation: + translationFiles: + 10: path/to/locallang.xlf + arguments: + label: + - useful + +This will produce the label: `This is a useful feature`. + +Alternatively, you can use :typoscript:`formDefinitionOverrides` in TypoScript to set +translation arguments. One use case is a checkbox for +user confirmation which links to further information. Here it makes sense to use +YAML hashes (key value pairs) instead of YAML lists so that sections have keys. This simplifies +references in TypoScript since named keys are easy to read and can easily be reordered. With lists and numeric +keys the TypoScript setup would also need to be updated in this case. + +In the following form configuration example the list of :yaml:`renderables` has been replaced with +a hash of :yaml:`renderables`, and the field :yaml:`field-with-translation-arguments` +now has a named key :yaml:`fieldWithTranslationArguments`. This key can be anything +as long as it is unique at its level in the YAML - here just the :yaml:`identifier` +in another form: + +.. code-block:: yaml + + renderables: + fieldWithTranslationArguments: + identifier: field-with-translation-arguments + type: Checkbox + label: I agree to the terms and conditions + renderingOptions: + translation: + translationFiles: + 10: path/to/locallang.xlf + +If the label contains HTML markup - like in the above example - it must +be wrapped in `CDATA` tags in the :directory:`path/to/locallang.xlf` translation file, +to prevent analysis of character data by the parser. Also, the +label should be rendered using the :fluid:`` +ViewHelper in fluid templates, to prevent escaping of HTML tags: + +.. code-block:: xml + + + terms and conditions]]> + + +The TypoScript below can use the :typoscript:`fieldWithTranslationArguments` key to refer +to the field and adds a page URL as a translation argument for the link in the label: + +.. code-block:: typoscript + + plugin.tx_form { + settings { + formDefinitionOverrides { + { + renderables { + 0 { + # Page + renderables { + fieldWithTranslationArguments { + renderingOptions { + translation { + arguments { + label { + 0 = TEXT + 0.typolink { + # Terms and conditions page, could be + # set also via TypoScript constants + parameter = 42 + returnLast = url + } + } + } + } + } + } + } + } + } + } + } + } + } + +The :yaml:`Page` element of the form definition is not registered with a named key so a numeric +key :yaml:`0` is used which, as mentioned above, is prone to errors when more pages are added +or reordered. + +.. important:: + + There must be at least one translation file with a translation for the + form element property. Arguments are not inserted into default + values in a form definition. + +Finishers +--------- + +The same mechanism (YAML, YAML + TypoScript) works for finisher options: + +.. code-block:: yaml + + finishers: + finisherWithTranslationArguments: + identifier: EmailToReceiver + options: + subject: My %s subject + recipients: + your.company@example.com: 'Your Company name' + ceo@example.com: 'CEO' + senderAddress: bar@example.org + translation: + translationFiles: + 10: path/to/locallang.xlf + arguments: + subject: + - awesome + +This will produce `My awesome subject`. + +.. _concepts-frontendrendering-basiccodecomponents: + +Basic code components +===================== + +.. figure:: ../../Images/basic_code_components.png + :alt: Basic code components + + Basic code components + +.. _concepts-frontendrendering-basiccodecomponents-formdefinition: + +TYPO3\\CMS\\Form\\Domain\\Model\\FormDefinition +----------------------------------------------- + +The class :php:`TYPO3\CMS\Form\Domain\Model\FormDefinition` encapsulates +a complete `form definition`, with all of its + +* pages, +* form elements, +* validation rules, and +* finishers which are executed when the form is submitted. + +The FormDefinition domain model is not modified when the form is executed. + +.. _concepts-frontendrendering-basiccodecomponents-formdefinition-anatomy: + +The anatomy of a form +~~~~~~~~~~~~~~~~~~~~~ + +A `FormDefinition` domain model consists of multiple `Page` objects. +When a form is displayed, only one `Page` is visible at a time. +However, you can navigate back and forth between the pages. A +`Page` consists of multiple `FormElements` which represent input +fields, textareas, checkboxes, etc, on a page. The `FormDefinition` +domain model, `Page` and `FormElement` objects have `identifiers` +which must be unique for each ``, +i.e. the `FormDefinition` domain model and a `FormElement` object may +have the same `identifier` but two `FormElement` objects cannot have the same +identifier. + +.. _concepts-frontendrendering-basiccodecomponents-formdefinition-anatomy-example: + +Example +""""""" + +You can create a :php:`FormDefinition` domain model by calling the API methods +on it, or you can use a :php:`FormFactory` to build the form from a different +representation format such as YAML. The example below calls API methods to +add a page to a :php:`FormDefinition` and then to add an element to the page: + +.. code-block:: php + + $formDefinition = GeneralUtility::makeInstance(FormDefinition::class, 'myForm'); + + $page1 = GeneralUtility::makeInstance(Page::class, 'page1'); + $formDefinition->addPage($page); + + // second argument is the of the form element + $element1 = GeneralUtility::makeInstance(GenericFormElement::class, 'title', 'Text'); + $page1->addElement($element1); + +.. _concepts-frontendrendering-basiccodecomponents-formdefinition-createformusingabstracttypes: + +Creating a form using abstract form element types +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can use the :php:`TYPO3\CMS\Form\Domain\Model\FormDefinition::addPage()` +and :php:`TYPO3\CMS\Form\Domain\Model\FormElements\Page::addElement()` methods as above +and create the `Page` and `FormElement` objects manually, but it is often +better to use the corresponding *create* methods (:php:`TYPO3\CMS\Form\Domain\Model\FormDefinition::createPage()` +and :php:`TYPO3\CMS\Form\Domain\Model\FormElements\Page::createElement()`). +You only need to pass them an abstract `` such as `Text` +or `Page` and EXT:form will resolve the classname and set default values. + +The :ref:`simple example ` +shown above can then be rewritten as follows: + +.. code-block:: php + + // we will come back to this later on + $prototypeConfiguration = []; + + $formDefinition = GeneralUtility::makeInstance(FormDefinition::class, 'myForm', $prototypeConfiguration); + $page1 = $formDefinition->createPage('page1'); + $element1 = $page1->addElement('title', 'Text'); + +You might wonder how the system knows that the element `Text` is +implemented with a `GenericFormElement`. This is configured in the +:php:`$prototypeConfiguration`. To make the example from above actually work, +we need to add some meaningful values to :php:`$prototypeConfiguration`: + +.. code-block:: php + + $prototypeConfiguration = [ + 'formElementsDefinition' => [ + 'Page' => [ + 'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\Page' + ], + 'Text' => [ + 'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement' + ], + ], + ]; + +For each abstract ``, we have to add some +configuration. In the snippet above, we only define the `implementation +class name`. Apart from that, it is always possible to set default values +for all configuration options of such elements, as the following example +shows: + +.. code-block:: php + + $prototypeConfiguration = [ + 'formElementsDefinition' => [ + 'Page' => [ + 'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\Page', + 'label' => 'This is the label of the page if nothing else is specified' + ], + 'Text' => [ + 'implementationClassName' => 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement', + 'label' = >'Default Label', + 'defaultValue' => 'Default form element value', + 'properties' => [ + 'placeholder' => 'Text that is shown if element is empty' + ], + ], + ], + ]; + +.. _concepts-frontendrendering-basiccodecomponents-formdefinition-preconfiguredconfiguration: + +Using pre-configured $prototypeConfiguration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Often, it does not make sense to manually create the $prototypeConfiguration +array. Bigger parts of this array are pre-configured in the extensions's +YAML settings. The :php:`TYPO3\CMS\Form\Domain\Configuration\ConfigurationService` +contains helper methods which return the ready-to-use :php`$prototypeConfiguration`. + +.. _concepts-frontendrendering-basiccodecomponents-formdefinition-rednering: + +Rendering a FormDefinition +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To trigger the rendering of a :php:`FormDefinition` domain model, the current +:php:`TYPO3\CMS\Extbase\Mvc\Web\Request` needs to be bound to the +`FormDefinition`. This binding results in a :php:`TYPO3\CMS\Form\Domain\Runtime\FormRuntime` +object which contains the `Runtime State` of the form. Among other things, +this object includes the currently inserted values: + +.. code-block:: php + + // $currentRequest needs to be available. + // Inside a controller, you would use $this->request + $form = $formDefinition->bind($currentRequest); + // now, you can use the $form object to get information about the currently entered values, etc. + +.. _concepts-frontendrendering-basiccodecomponents-formruntime: + +TYPO3\\CMS\\Form\\Domain\\Runtime\\FormRuntime +---------------------------------------------- + +This class implements the runtime logic of a form, i.e. the class + +* decides which page is currently shown, +* determines the current values of the form +* triggers validation and property mappings. + +You generally receive an instance of this class by +calling :php:`TYPO3\CMS\Form\Domain\Model\FormDefinition::bind()`. + +.. _concepts-frontendrendering-basiccodecomponents-formruntime-render: + +Rendering a form +~~~~~~~~~~~~~~~~ + +Rendering a form is easy. Just call :php:`render()` on the :php:`FormRuntime`:: + +.. code-block:: php + + $form = $formDefinition->bind($request); + $renderedForm = $form->render(); + +.. _concepts-frontendrendering-basiccodecomponents-formruntime-accessingformvalues: + +Accessing form values +~~~~~~~~~~~~~~~~~~~~~ + +In order to get the values the user has entered into the form, you can +access the :php:`FormRuntime` object like an array. If a form element with the +identifier `firstName` exists, you can use :php:`$form['firstName']` to +retrieve its current value. You can set values the same way. + +.. _concepts-frontendrendering-basiccodecomponents-formruntime-renderinginternals: + +Rendering internals +~~~~~~~~~~~~~~~~~~~ + +The :php:`FormRuntime` inquires the :php:`FormDefinition` domain model regarding +the configured renderer (:php:`TYPO3\CMS\Form\Domain\Model\FormDefinition::getRendererClassName()`) +and then triggers :php:`render()` on this Renderer. + +This allows you to declaratively define how a form should be rendered. + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + Form: + rendererClassName: 'TYPO3\CMS\Form\Domain\Renderer\FluidFormRenderer' + +.. _concepts-frontendrendering-basiccodecomponents-fluidformrenderer: + +TYPO3\\CMS\\Form\\Domain\\Renderer\\FluidFormRenderer +----------------------------------------------------- + +This class is a :php:`TYPO3\CMS\Form\Domain\Renderer\RendererInterface` +implementation which used to render a :php:`FormDefinition` domain model. It +is the default :t3ext:`form` renderer. + +Learn more about +the :ref:`FluidFormRenderer Options`. + +.. _concepts-frontendrendering-codecomponents-customformelementimplementations: + +Custom form element implementations +----------------------------------- + +PSR-14 events are available at crucial points in the life cycle of a +`FormElement`. Most of the time, own class implementations are therefore +unnecessary. A custom form element can be defined by: + +* writing some configuration, and +* utilizing the standard implementation of :php:`TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement`. + +.. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + CustomFormElementIdentifier: + implementationClassName: 'TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement' + +With the provided PSR-14 events, this `FormElement` can now be manipulated at runtime. + +.. seealso:: + * :ref:`PSR-14 events overview for EXT:form ` – + tables of all events and registration instructions + * :ref:`Runtime manipulation events ` + +If you insist on your own implementation, the abstract class :php:`TYPO3\CMS\Form\Domain\Model\FormElements\AbstractFormElement` +offers a perfect entry point. In addition, we recommend checking-out :php:`TYPO3\CMS\Form\Domain\Model\Renderable\AbstractRenderable`. +All of your own form element implementations must be programmed to the +interface :php:`TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface`. +It is a good idea to derive your implementation from :php:`TYPO3\CMS\Form\Domain\Model\FormElements\AbstractFormElement`. + +.. _concepts-frontendrendering-renderviewHelper: + +"render" viewHelper +=================== + +The `RenderViewHelper` is the actual starting point for form rendering and +not the typical Extbase Controller as you may know it. + +For more technical insights read more about the viewHelper's :ref:`arguments`. + +.. _concepts-frontendrendering-fluidtemplate: + +Render through FLUIDTEMPLATE (without controller) +------------------------------------------------- + +.. code-block:: typoscript + + tt_content.custom_content_element = COA_INT + tt_content.custom_content_element { + 20 = FLUIDTEMPLATE + 20 { + file = EXT:my_site_package/Resources/Private/Templates/CustomContentElement.html + settings { + persistenceIdentifier = EXT:my_site_package/Resources/Private/Forms/MyForm.yaml + } + extbase.pluginName = Formframework + extbase.controllerExtensionName = Form + extbase.controllerName = FormFrontend + extbase.controllerActionName = perform + } + } + +``my_site_package/Resources/Private/Templates/CustomContentElement.html``: + +.. code-block:: html + + + +.. _concepts-frontendrendering-extbase: + +Render within your own Extbase extension +---------------------------------------- + +It is straight forward. Use the `RenderViewHelper` like this and you are +done: + +.. code-block:: html + + + +Point the property `controllerAction` to the desired action name and +provide values for the other parameters displayed below (you might need +those). + +.. code-block:: yaml + + type: Form + identifier: 'example-form' + label: 'TYPO3 is cool' + prototypeName: standard + renderingOptions: + controllerAction: perform + addQueryString: false + argumentsToBeExcludedFromQueryString: [] + additionalParams: [] + + renderables: + ... + +.. note:: + + In general, you can override each and every `form definition` with the help + of TypoScript (see ':ref:`TypoScript overrides`'). + + When using the `RenderViewHelper`, there is a second way: + The ':ref:`overrideConfiguration`' parameter. + This way, you can override the form definition within your template. + Provide an according array as shown in the example below. + + .. code-block:: html + + + +.. _concepts-frontendrendering-programmatically: + +Build forms programmatically +============================ + +To learn more about this topic, head to the chapter ':ref:`Build forms programmatically`' +which is part of the API reference section. + +.. _concepts-frontendrendering-runtimemanipulation: + +Runtime manipulation +==================== + +.. _concepts-frontendrendering-runtimemanipulation-hooks: + +:t3ext:`form` implements a decent amount of events that allow the manipulation of +your forms during runtime. In this way, it is possible to, for example, + +* ... prefill form elements with values from your database, +* ... skip a whole page based on the value of a certain form element, +* ... mark a form element as mandatory depending of the chosen value of another + form element. + +Please check out the :ref:`PSR-14 events overview ` +for more details. + +.. _concepts-frontendrendering-runtimemanipulation-typoscriptoverrides: + +TypoScript overrides +-------------------- + +Each and every `form definition` can be overridden via TypoScript if the +:php:`FormFrontendController` of :t3ext:`form` is used to render the form. Normally, +this is the case if the form has been added to the page using the form +plugin or when rendering the form via :ref:`FLUIDTEMPLATE `. + +The overriding of settings with TypoScript's help takes place after the :ref:`custom finisher settings` +of the form plugin have been loaded. In this way, you are able to manipulate +the `form definition` for a single page. In doing so, the altered +`form definition` is passed to the :php:`RenderViewHelper` which then +generates the form programmatically. At this point, you can still change the +form elements using the above-mentioned concept of :ref:`hooks`. + +.. code-block:: typoscript + + plugin.tx_form { + settings { + formDefinitionOverrides { + { + renderables { + 0 { + renderables { + 0 { + label = TEXT + label.value = Overridden label + } + } + } + } + } + } + } + } diff --git a/Documentation/I/Concepts/Index.rst b/Documentation/I/Concepts/Index.rst new file mode 100644 index 0000000..6bce50a --- /dev/null +++ b/Documentation/I/Concepts/Index.rst @@ -0,0 +1,26 @@ +.. include:: /Includes.rst.txt + +.. _concepts: + +======== +Concepts +======== + +Within this chapter, you will learn the basic concepts of the form framework. +It addresses your concerns as backend editor and integrator. Some of the +chapters also cover topics for developers. + +.. toctree:: + + TargetGroupsAndMainPrinciples/Index + Configuration/Index + FormConfigurationFormDefinition/Index + FormFileStorages/Index + FrontendRendering/Index + Variants/Index + Validators/Index + Finishers/Index + FormManager/Index + FormEditor/Index + FormPlugin/Index + Autocomplete/Index diff --git a/Documentation/I/Concepts/TargetGroupsAndMainPrinciples/Index.rst b/Documentation/I/Concepts/TargetGroupsAndMainPrinciples/Index.rst new file mode 100644 index 0000000..da01410 --- /dev/null +++ b/Documentation/I/Concepts/TargetGroupsAndMainPrinciples/Index.rst @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-introduction: + +Target groups and main principles +================================= + +As :ref:`we saw in the introduction`, the ``form`` extension is a +framework where editors, integrators, and developers can +create and manage forms with different interfaces and functionality. + +The most important part of EXT:form is the backend ``form editor``. Different types of users +can use the ``form editor`` for different things. Integrators can manage HTML +class attributes, developers can create +complex ``form definitions`` and editors can edit properties. + +The form extension tries to find a compromise between these things. The +``form editor`` is mainly designed for editors, so simple, easy-to-edit properties are +displayed. However, the ``form editor`` can be easily extended by YAML configuration. + +And should this is not enough for your specific project, you can +integrate your own JavaScript code using the JavaScript API. + +You can create and define forms globally in the :guilabel:`Web->Forms` module or you can load forms +from inside extensions, for example, the ``Mail form`` content element. + +Some parts of a form can be overridden in the form plugin. This means you can +reuse the same form on different pages with a different configuration. + +The information in this chapter will show you that there are many ways to +customize the form framework, depending on your use case. Be creative and share +your solution with the TYPO3 community! + +This chapter describes the basics of the form framework. Check +out the reference and the examples to get a deeper understanding of +the framework. diff --git a/Documentation/I/Concepts/Validators/Index.rst b/Documentation/I/Concepts/Validators/Index.rst new file mode 100644 index 0000000..113091d --- /dev/null +++ b/Documentation/I/Concepts/Validators/Index.rst @@ -0,0 +1,294 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-validators: + +Validators +========== + +The form framework ships a set of server-side validators (derived from Extbase +validators) which you can use in form elements. Some validators can only +be used for certain elements, e.g. the "Date range validator" can only be used for +"Date" elements. Some form elements +(like "Email") come with validators. + +You can define your own validation error messages using the ``validationErrorMessages`` +property. These error messages can also be set in the form editor. + + +.. _concepts-validators-client-side-validation: + +Client-side validation +---------------------- + +In the form framework, HTML 5-based frontend validation can be added to form +elements, but JavaScript validation is not included. The TYPO3 core have no plans to +add this functionality at the current time. However, you can +add it yourself if required. Examples of reliable and well-maintained projects are +`Parsley `_ +and `jQuery Validation `__. + + +.. _concepts-validators-localization-client-side-validations: + +Localization of client side validation +"""""""""""""""""""""""""""""""""""""" + +Display of validation messages is browser-specific and not generated by TYPO3 so +these messages cannot easily be changed. However, you can use JavaScript to change +validation messages. See `Stack Overflow `__ +for more information. + + +.. _concepts-validators-server-side-validation: + +Server-side validation +---------------------- + + +.. _concepts-validators-alphanumeric: + +Alphanumeric validator (:yaml:`Alphanumeric`) +""""""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Alphanumeric validator"` +checks for alphanumeric strings. Alphanumeric is defined as a combination of +alphabetic and numeric characters `[A-Z + 0-9]`. + + +.. _concepts-validators-count: + +Number of submitted values validator (:yaml:`Count`) +"""""""""""""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Number of submitted values validator"` +checks if a value contains a specific number of elements. The +validator has two options: + +- Minimum [:yaml:`options.minimum`]: The minimum count to accept. +- Maximum [:yaml:`options.maximum`]: The maximum count to accept. + + +.. _concepts-validators-date_range: + +Date range validator (:yaml:`DateRange`) +"""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Date range validator"` +checks if a value is a valid DateTime object and within a specified +date range. The range can be defined by providing a minimum and/or maximum date. +The validator has two options: + +- Format [:yaml:`options.format`]: The format of the minimum and maximum option. + Default: [:yaml:`Y-m-d`]. +- Minimum date [:yaml:`options.minimum`]: The minimum date formatted as `Y-m-d`. +- Maximum date [:yaml:`options.maximum`]: The maximum date formatted as `Y-m-d`. + +The options :yaml:`minimum` and :yaml:`maximum` must have the format 'Y-m-d' which +represents the `RFC 3339 `__ +'full-date' format. + +The input must be a DateTime object. This input can be tested against a minimum +date and a maximum date. The minimum date and the maximum date are strings. The minimum +and maximum date can be configured through the validator options. + + +.. _concepts-validators-date_time: + +Date/time validator (:yaml:`DateTime`) +""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Date/time validator"` +checks if a value is a valid DateTime object. The date string is +expected to be formatted according to the `W3C standard `__ +which is `YYYY-MM-DDT##:##:##+##:##`, for example `2005-08-15T15:52:01+00:00`. + + +.. _concepts-validators-email: + +Email validator (:yaml:`EmailAddress`) +"""""""""""""""""""""""""""""""""""""" + +The :ref:`"Email validator"` +checks if a value is a valid email address. The format of a valid email +address is defined in `RFC 3696 `__. +This standard allows international characters and multiple +`@` signs. + + +.. _concepts-validators-filesize: + +File size validator (:yaml:`FileSize`) +"""""""""""""""""""""""""""""""""""""" + +The :ref:`"File size validator"` +validates the size of a file resource. The validator has two options: + +- Minimum [:yaml:`options.minimum`]: The minimum file size. Use the + format `B|K|M|G`. For example: `10M` is 10 Megabytes. +- Maximum [:yaml:`options.maximum`]: The maximum file size. Use the + format `B|K|M|G`. For example: `10M` is 10 Megabytes. + +Use the format `B|K|M|G` for file size, for example, `10M` +is 10 megabytes. Note: the maximum file size also depends on the :file:`php.ini` +settings of your environment. + + +.. _concepts-validators-floating_point: + +Floating-point number validator (:yaml:`Float`) +""""""""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Floating-point number validator"` +checks if a value is of type float or a string matching the regular +expression `[0-9.e+-]`. + + +.. _concepts-validators-integer: + +Integer number validator (:yaml:`Integer`) +"""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Integer number validator"` +checks if a value is a valid integer. + + +.. _concepts-validators-empty: + +Empty validator (:yaml:`NotEmpty`) +"""""""""""""""""""""""""""""""""" + +The :ref:`"Empty validator"` +checks if a value is not empty (i.e. equal to NULL, empty string, empty array or empty +object). + + +.. _concepts-validators-number: + +Number validator (:yaml:`Number`) +""""""""""""""""""""""""""""""""" + +The :ref:`"Number validator"` +checks if a value is a number. + + +.. _concepts-validators-number_range: + +Number range validator (:yaml:`NumberRange`) +"""""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Number range validator"` +checks if a value is a number in a specified range. The validator has +two options: + +- Minimum [:yaml:`options.minimum`]: The minimum value. +- Maximum [:yaml:`options.maximum`]: The maximum value. + + +.. _concepts-validators-regular_expressions: + +Regular expression validator (:yaml:`RegularExpression`) +"""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"Regular expression validator"` +checks if a value matches a specified regular expression. Delimiters +or modifiers are not supported. The validator has one option: + +- Regular expression [:yaml:`options.regularExpression`]: The regular expression + to use for validation, used as given. + +As an example, a user submits a domain name and the submitted value should only +contain the second and the top level domain, i.e. "typo3.org" instead of +"https://typo3.org". The regular expression for this would be :code:`/^[-a-z0-9]+\.[a-z]{2,6}$/`. + +.. _concepts-validators-string_length: + +String length validator (:yaml:`StringLength`) +"""""""""""""""""""""""""""""""""""""""""""""" + +The :ref:`"String length validator"` +checks if a value is a valid string and its length is within a specified +range. The validator has two options: + +- Minimum [:yaml:`options.minimum`]: The minimum length of a valid string. +- Maximum [:yaml:`options.maximum`]: The maximum length of a valid string. + + +.. _concepts-validators-text: + +Non-XML text validator (:yaml:`Text`) +""""""""""""""""""""""""""""""""""""" + +The :ref:`"Non-XML text validator"` +checks if a value is a valid piece of text (containing no XML tags). This basically +means that tags are stripped out. In this special case quotes are not encoded +(see `filter_var() `__ for more information. + +Be aware that the value of this check entirely depends on the output +context. The validated text is not expected to be secure. +If you want to be sure of that, use a customized regular expression or filter on +output. + + +.. _concepts-validators-validation-message-translation: + +Translation of validation messages +---------------------------------- + +To learn more about this topic, see :ref:`here`. + + +.. _concepts-validators-customvalidatorimplementations: + +Custom validator implementations +-------------------------------- + +Validators belong to configuration ``prototypes`` in a ``validatorsDefinition``. +Set the ``implementationClassName`` property of the ``prototype`` to your +own validator classes. + +.. code-block:: yaml + + prototypes: + standard: + validatorsDefinition: + Custom: + implementationClassName: 'VENDOR\MySitePackage\Domain\Validation\CustomValidator' + +Add ``options`` to your validator and provide a default value ``yourCustomOption``: + +.. code-block:: yaml + + prototypes: + standard: + validatorsDefinition: + Custom: + implementationClassName: 'VENDOR\MySitePackage\Domain\Validation\CustomValidator' + options: + yourCustomOption: 'Jurian' + +You can override the default value in your ``form definition``: + +.. code-block:: yaml + :emphasize-lines: 13 + + identifier: sample-form + label: 'Simple Contact Form' + prototype: standard + type: Form + + renderables: + - + identifier: subject + label: 'Name' + type: Text + validators: + - + identifier: Custom + options: + yourCustomOption: 'Mathias' + +As mentioned above, EXT:form uses Extbase validators. That said, +your own validators should extend :php:`\TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator`. +Read more in "TYPO3 Explained": +:ref:`t3coreapi:extbase_domain_validator`. diff --git a/Documentation/I/Concepts/Variants/Index.rst b/Documentation/I/Concepts/Variants/Index.rst new file mode 100644 index 0000000..ea3d385 --- /dev/null +++ b/Documentation/I/Concepts/Variants/Index.rst @@ -0,0 +1,686 @@ +.. include:: /Includes.rst.txt + + +.. _concepts-variants: + +Variants +======== + + +.. _concepts-variants-basics: + +Basics +------ + +A variant is an "alternative" form definition section that allows you to change +properties of form elements, validators, and finishers. Variants are activated +by conditions. This allows you to: + +* translate form element values depending on the frontend language +* set and remove validators from one form element depending on the + value of another form element +* hide entire steps (form pages) depending on the value of a form + element +* set finisher options depending on the value of a form element +* hide a form element in particular finishers and on the summary step + +Form element variants can be defined statically in +form definitions or created programmatically through an API. The +variants defined in a form definition are applied to +a form based on their conditions at runtime. Programmatically defined variants +can be applied at any time. + +Variant conditions can be evaluated programmatically +at any time. However, some conditions are only available at runtime, +for example, checking a form element value. + +Custom conditions and operators can be easily added. + +Only the form element properties listed in a variant are applied to the +form element, all other properties are retained. An exception to this +rule are finishers and validators. If finishers or validators are +**not** defined in a variant, the original finishers and validators +will be used. If at least one finisher or validator is defined in a +variant, the original finishers and validators are overwritten +by the finishers and validators in the variant. + +Variants defined in a form definition are **all** processed and +applied in the order of their matching conditions. This means if +variant 1 sets the label of a form element to "X" and variant 2 sets +the label to "Y", then variant 2 is applied, i.e. the label will be "Y". + +.. note:: + Currently it is **not** possible to define variants in + the backend form editor. + + +.. _concepts-variants-enabled-property: + +Rendering option ``enabled`` +---------------------------- + +The rendering option :yaml:`enabled` is available for all finishers and +form elements except the root form element and the first form +page. The option accepts a boolean value (:yaml:`true` or :yaml:`false`). + +Setting a form element to :yaml:`enabled: true` renders it in the +frontend and enables processing of its values, including property mapping +and validation. Setting :yaml:`enabled: false` disables it in the frontend. All +form elements and finishers except the root form element and the first form page can be enabled +or disabled. + +Setting a finisher to :yaml:`enabled: true` executes it when +the form is submitted. Setting :yaml:`enabled: false` skips the finisher. + +By default, :yaml:`enabled` is set to :yaml:`true`. + +See :ref:`examples` +below to learn more. + + +.. _concepts-variants-definition: + +Definition of variants +---------------------- + +Variants are defined at the form element level in YAML. Here is an example of a text +form element variant: + +.. code-block:: yaml + + type: Text + identifier: text-1 + label: Foo + variants: + - + identifier: variant-1 + condition: 'traverse(formValues, "checkbox-1") == 1' + # If the condition matches, the label property of the form + # element is set to the value 'Bar' + label: Bar + + +The :yaml:`identifier` must be unique at the form element level. + +Each variant has a single :yaml:`condition` which applies the variant if the +condition is satisfied. The +properties in the variant are applied to the form element. In the +example above the label of :yaml:`text-1` is +changed to ``Bar`` if the checkbox :yaml:`checkbox-1` is checked. + +The following properties can be overwritten by :yaml:`Form` (the topmost element) +variants: + +* :yaml:`label` +* :yaml:`renderingOptions` +* :yaml:`finishers` +* :yaml:`rendererClassName` + +The following properties can be overwritten by all other form element variants: + +* :yaml:`enabled` +* :yaml:`label` +* :yaml:`defaultValue` +* :yaml:`properties` +* :yaml:`renderingOptions` +* :yaml:`validators` + +.. note:: + Unset individual list items in select option variants by marking the values with + :code:`__UNSET`. See :ref:`example ` below. + +.. _concepts-variants-conditions: + +Conditions +---------- + +The form framework uses the Symfony component `expression language `_ +for conditions. An expression is a one-liner that returns a boolean value, for example, +:yaml:`applicationContext matches "#Production/Local#"`. For further information see +the `Symfony docs `_. +The form framework extends the expression language with variables to access +form values and environment settings. + +.. _concepts-variants-conditions-formruntime: + +``formRuntime`` (object) +^^^^^^^^^^^^^^^^^^^^^^^^ + +You can access every public method of :php:`\TYPO3\CMS\Form\Domain\Runtime\FormRuntime`. +Learn more :ref:`here`. + +For example: + +:yaml:`formRuntime.getIdentifier() == "test"`. + +.. _concepts-variants-conditions-renderable: + +``renderable`` (VariableRenderableInterface) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`renderable` contains the instance of renderable that the condition +is applied to. This can be used e.g. to access the identifier of the +current renderable without having to duplicate it. + +For example: + +:yaml:`traverse(formValues, renderable.getIdentifier()) == "special value"`. + +.. _concepts-variants-conditions-formvalues: + +``formValues`` (array) +^^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`formValues` holds all the submitted form element values. Each +key in the array represents a form element identifier. + +For example: + +:yaml:`traverse(formValues, "text-1") == "yes"`. + +.. _concepts-variants-conditions-stepidentifier: + +``stepIdentifier`` (string) +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`stepIdentifier` is set to the :yaml:`identifier` of the current +step. + +For example: + +:yaml:`stepIdentifier == "page-1"`. + +.. _concepts-variants-conditions-steptype: + +``stepType`` (string) +^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`stepType` is set to the :yaml:`type` of the current step. + +For example: + +:yaml:`stepType == "SummaryPage"`. + +.. _concepts-variants-conditions-finisheridentifer: + +``finisherIdentifier`` (string) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`finisherIdentifier` is set to the :yaml:`identifier` of the +current finisher or an empty string (if no finishers are executed). + +For example: + +:yaml:`finisherIdentifier == "EmailToSender"`. + +.. _concepts-variants-conditions-site: + +``site`` (object) +^^^^^^^^^^^^^^^^^ + +You can access every public method in :php:`\TYPO3\CMS\Core\Site\Entity\Site`. +The following are the most important ones: + +* getSettings() / The site settings array +* getDefaultLanguage() / The default language object for the current site +* getConfiguration() / The whole configuration of the current site +* getIdentifier() / The identifier of the current site +* getBase() / The base URL of the current site +* getRootPageId() / The ID of the root page of the current site +* getLanguages() / An array of available languages for the current site +* getSets() / Configured site sets of a site (new in TYPO3 v13+) + +For example: + +:yaml:`site("settings").get("myVariable") == "something"`. +:yaml:`site("rootPageId") == "42"`. + +More details on the `Site` object can be found in +:ref:`Using site configuration in conditions `. + +.. _concepts-variants-conditions-sitelanguage: + +``siteLanguage`` (object) +^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can access every public method in :php:`\TYPO3\CMS\Core\Site\Entity\SiteLanguage`. +The most important ones are: + +* getLanguageId() / The sys_language_uid. +* getLocale() / The language locale, for example 'en_US.UTF-8'. +* getTypo3Language() / The language key for XLF files, for example, 'de' or 'default'. +* getTwoLetterIsoCode() / Returns the ISO-639-1 language ISO code, for example, 'de'. + +For example: + +:yaml:`siteLanguage("locale").getName() == "de-DE"`. + +.. _concepts-variants-conditions-applicationcontext: + +``applicationContext`` (string) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`applicationContext` is set to the application context +(@see GeneralUtility::getApplicationContext()). + +For example: + +:yaml:`applicationContext matches "#Production/Local#"`. + +.. _concepts-variants-conditions-contentobject: + +``contentObject`` (array) +^^^^^^^^^^^^^^^^^^^^^^^^^ + +:yaml:`contentObject` contains the data of the current content object +or an empty array if no content object is available. + +For example: + +:yaml:`contentObject["pid"] in [23, 42]`. + + +.. _concepts-variants-programmatically: + +Working with variants programmatically +-------------------------------------- + +Create a variant with conditions through the PHP API:: + + /** @var TYPO3\CMS\Form\Domain\Model\Renderable\RenderableVariantInterface $variant */ + $variant = $formElement->createVariant([ + 'identifier' => 'variant-1', + 'condition' => 'traverse(formValues, "checkbox-1") == 1', + 'label' => 'foo', + ]); + + +Get all the variants of a form element:: + + /** @var TYPO3\CMS\Form\Domain\Model\Renderable\RenderableVariantInterface[] $variants */ + $variants = $formElement->getVariants(); + + +Apply a variant to a form element regardless of its conditions:: + + $formElement->applyVariant($variant); + + +.. _concepts-variants-examples: + +Examples +-------- + +Here are some more complex examples to show you what is possible with the +form framework. + + +.. _concepts-variants-examples-translation: + +Translation of form elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, form, page and text elements have variants so that they are translated differently depending on +the frontend language (whether it is German or English). + +.. code-block:: yaml + :emphasize-lines: 9,10,24,25,40,41 + + type: Form + prototypeName: standard + identifier: contact-form + label: Kontaktformular + renderingOptions: + submitButtonLabel: Senden + variants: + - + identifier: language-variant-1 + condition: 'siteLanguage("locale").getName() == "en-US"' + label: Contact form + renderingOptions: + submitButtonLabel: Submit + renderables: + - + type: Page + identifier: page-1 + label: Kontaktdaten + renderingOptions: + previousButtonLabel: zurück + nextButtonLabel: weiter + variants: + - + identifier: language-variant-1 + condition: 'siteLanguage("locale").getName() == "en-US"' + label: Contact data + renderingOptions: + previousButtonLabel: Previous step + nextButtonLabel: Next step + renderables: + - + type: Text + identifier: text-1 + label: Vollständiger Name + properties: + fluidAdditionalAttributes: + placeholder: Ihre vollständiger Name + variants: + - + identifier: language-variant-1 + condition: 'siteLanguage("locale").getName() == "en-US"' + label: Full name + properties: + fluidAdditionalAttributes: + placeholder: Your full name + + +.. _concepts-variants-examples-validation: + +Adding validators dynamically +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the :yaml:`email-address` field has a variant that adds validators +if :yaml:`checkbox-1` is checked. + + +.. code-block:: yaml + :emphasize-lines: 18,19 + + type: Form + prototypeName: standard + identifier: newsletter-subscription + label: Newsletter Subscription + renderables: + - + type: Page + identifier: page-1 + label: General data + renderables: + - + type: Text + identifier: email-address + label: Email address + defaultValue: + variants: + - + identifier: validation-1 + condition: 'traverse(formValues, "checkbox-1") == 1' + properties: + fluidAdditionalAttributes: + required: required + validators: + - + identifier: NotEmpty + - + identifier: EmailAddress + - + type: Checkbox + identifier: checkbox-1 + label: Check this and email will be mandatory + + +.. _concepts-variants-examples-hide-form-elements: + +Hide form elements +^^^^^^^^^^^^^^^^^^ + +In this example, the form element :yaml:`email-address` has +been enabled explicitly but this can be left out as this is +the default state. The form element :yaml:`text-3` has been disabled +to (temporarily) remove it from the form. The +field :yaml:`text-1` has a variant that hides it in all finishers and on the summary step. +The :yaml:`EmailToSender` finisher contains form values (:yaml:`email-address` +and :yaml:`name`). The :yaml:`EmailToSender` finisher is only enabled if +:yaml:`checkbox-1` has been checked by the user, otherwise it is skipped. + +.. code-block:: yaml + :emphasize-lines: 15,19,23,32,36,39,42,51 + + type: Form + prototypeName: standard + identifier: hidden-field-form + label: Hidden field form + finishers: + - + identifier: EmailToReceiver + options: + subject: Yes, I am ready + recipients: + your.company@example.com: 'Your Company name' + senderAddress: tritum@example.org + senderName: tritum@example.org + - + identifier: EmailToSender + options: + subject: This is a copy of the form data + recipients: + {email-address}: '{name}' + senderAddress: tritum@example.org + senderName: tritum@example.org + renderingOptions: + enabled: '{checkbox-1}' + renderables: + - + type: Page + identifier: page-1 + label: General data + renderables: + - + type: Text + identifier: text-1 + label: A field hidden on confirmation step and in all mails (finishers) + variants: + - + identifier: hide-1 + renderingOptions: + enabled: false + condition: 'stepType == "SummaryPage" || finisherIdentifier in ["EmailToSender", "EmailToReceiver"]' + - + type: Text + identifier: email-address + label: Email address + properties: + fluidAdditionalAttributes: + required: required + renderingOptions: + enabled: true + - + type: Text + identifier: text-3 + label: A temporarily disabled field + renderingOptions: + enabled: false + - + type: Checkbox + identifier: checkbox-1 + label: Check this and the sender gets an email + - + type: SummaryPage + identifier: summarypage-1 + label: Confirmation + + +.. _concepts-variants-examples-hide-steps: + +Hide steps +^^^^^^^^^^ + +In this example, the second step (:yaml:`page-2`) has a variant that disables it +if :yaml:`checkbox-1` is checked. :yaml:`checkbox-1` has a variant which +disables it on the summary step. + +.. code-block:: yaml + :emphasize-lines: 17, 21,22,24,27,31,32,34 + + type: Form + prototypeName: standard + identifier: multi-step-form + label: Muli step form + renderables: + - + type: Page + identifier: page-1 + label: First step + renderables: + - + type: Text + identifier: text-1 + label: A field + - + type: Checkbox + identifier: checkbox-1 + label: Check this and the next step will be skipped + variants: + - + identifier: variant-1 + condition: 'stepType == "SummaryPage"' + renderingOptions: + enabled: false + - + type: Page + identifier: page-2 + label: Second step + variants: + - + identifier: variant-2 + condition: 'traverse(formValues, "checkbox-1") == 1' + renderingOptions: + enabled: false + renderables: + - + type: Text + identifier: text-2 + label: Another field + - + type: SummaryPage + identifier: summarypage-1 + label: Confirmation + + +.. _concepts-variants-examples-finisher: + +Set finisher values dynamically +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, the form has a variant so that the finisher has different values +depending on the application context. + +.. code-block:: yaml + :emphasize-lines: 9,12,13,18 + + type: Form + prototypeName: standard + identifier: finisher-condition-example + label: Finishers under condition + finishers: + - + identifier: Confirmation + options: + message: I am NOT a local environment. + variants: + - + identifier: variant-1 + condition: 'applicationContext matches "#Production/Local#"' + finishers: + - + identifier: Confirmation + options: + message: I am a local environment. + renderables: + - + type: Page + identifier: page-1 + label: General data + renderables: + - + type: Text + identifier: text-1 + label: A field + + +.. _concepts-variants-examples-remove-options: + +Remove select options +^^^^^^^^^^^^^^^^^^^^^ + +In this example, a select form element has a variant which removes an option for +a specific locale. + +.. code-block:: yaml + :emphasize-lines: 13,24,25,28 + + type: Form + prototypeName: standard + identifier: option-remove-example + label: Options removed under condition + renderables: + - + type: Page + identifier: page-1 + label: Step + renderables: + - + identifier: salutation + type: SingleSelect + label: Salutation + properties: + options: + '': '---' + mr: Mr. + mrs: Mrs. + miss: Miss + defaultValue: '' + variants: + - + identifier: salutation-variant + condition: 'siteLanguage("locale").getName() == "zh-CN"' + properties: + options: + miss: __UNSET + + +.. _concepts-variants-custom-language-providers: + +Adding your own expression language providers +--------------------------------------------- + +You can extend the expression language with your own custom functions. For more +information see the official `docs `__ +and the appropriate :ref:`TYPO3 implementation details`. + +Register your own expression language provider class in +:file:`Configuration/ExpressionLanguage.php` and create it, making sure it +implements :php:`Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface`. + +.. code-block:: php + :caption: EXT:some_extension/Configuration/ExpressionLanguage.php + + return [ + 'form' => [ + Vendor\MyExtension\ExpressionLanguage\CustomExpressionLanguageProvider::class, + ], + ]; + +.. _concepts-variants-custom-language-variables: + +Adding your own expression language variables +--------------------------------------------- + +You can extend the expression language with your own variables. These +variables can be used in conditions. + +Register your own expression language provider class in +:file:`Configuration/ExpressionLanguage.php` as above and +and create it as follows: + +.. code-block:: php + :caption: EXT:some_extension/Classes/ExpressionLanguage/CustomExpressionLanguageProvider.php + + class CustomExpressionLanguageProvider extends AbstractProvider + { + public function __construct() + { + $this->expressionLanguageVariables = [ + 'variableA' => 'valueB', + ]; + } + } diff --git a/Documentation/I/Config/Index.rst b/Documentation/I/Config/Index.rst new file mode 100644 index 0000000..32966c2 --- /dev/null +++ b/Documentation/I/Config/Index.rst @@ -0,0 +1,17 @@ +.. include:: /Includes.rst.txt + + +.. _configurationreference: + +======================= +Configuration Reference +======================= + +This chapter is a complete reference of the possible configuration settings. +It addresses your concerns as and integrator and developer. + +.. toctree:: + + persistenceManager/Index + proto/Index + formManager/Index diff --git a/Documentation/I/Config/formManager/Index.rst b/Documentation/I/Config/formManager/Index.rst new file mode 100644 index 0000000..8181cd3 --- /dev/null +++ b/Documentation/I/Config/formManager/Index.rst @@ -0,0 +1,410 @@ +.. include:: /Includes.rst.txt + + +.. _formmanager: + +============= +[formManager] +============= + + +.. _formmanager-properties: + +Properties +========== + + +.. _formmanager.dynamicjavascriptmodules.app: + +dynamicJavaScriptModules.app +---------------------------- + +:aspect:`Option path` + formManager.dynamicJavaScriptModules.app + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + dynamicJavaScriptModules: + app: TYPO3/CMS/Form/Backend/FormManager + viewModel: TYPO3/CMS/Form/Backend/FormManager/ViewModel + +:aspect:`Description` + Internal setting. ES6 module specifier for the form manager JavaScript app. + + +.. _formmanager.dynamicjavascriptmodules.viewmodel: + +dynamicJavaScriptModules.viewModel +---------------------------------- + +:aspect:`Option path` + formManager.dynamicJavaScriptModules.viewModel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + dynamicJavaScriptModules: + app: '@typo3/form/backend/form-manager.js' + viewModel: '@typo3/form/backend/form-manager/view-model.js' + +:aspect:`Description` + Internal setting. ES6 module specifier for the form manager JavaScript view model. + + +.. _formmanager.stylesheets: + +stylesheets +----------- + +:aspect:`Option path` + formManager.stylesheets + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + stylesheets: + 100: 'EXT:form/Resources/Public/Css/form.css' + +:aspect:`Description` + Internal setting. Path for the form manager CSS file. + + +.. _formmanager.translationfiles: + +translationFiles +---------------- + +:aspect:`Option path` + formManager.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + translationFiles: + 10: 'EXT:form/Resources/Private/Language/Database.xlf' + +:aspect:`Good to know` + :ref:`Translate "Start template" options` + +:aspect:`Description` + The translation file(s) which should be used to translate parts of the form manager. + + +.. _formmanager.selectableprototypesconfiguration: + +selectablePrototypesConfiguration +--------------------------------- + +:aspect:`Option path` + formManager.selectablePrototypesConfiguration + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + 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 + +:aspect:`Good to know` + - :ref:`"Start templates"` + - :ref:`Translate "Start template" options` + +:aspect:`Description` + Array with numerical Keys. Configure the ``Start template`` selection list within the ``form manager`` "Advanced settings" step. + + +.. _formmanager.selectableprototypesconfiguration.*.identifier: + +selectablePrototypesConfiguration.*.identifier +---------------------------------------------- + +:aspect:`Option path` + formManager.selectablePrototypesConfiguration.*.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes ` + +:aspect:`Good to know` + - :ref:`"Start templates"` + +:aspect:`Description` + Reference to a ``prototype`` which should be used for the newly created form definition. + + +.. _formmanager.selectableprototypesconfiguration.*.label: + +selectablePrototypesConfiguration.*.label +----------------------------------------- + +:aspect:`Option path` + formManager.selectablePrototypesConfiguration.*.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Good to know` + - :ref:`"Start templates"` + - :ref:`Translate "Start template" options` + +:aspect:`Description` + The ``Form prototype`` selectlist label for this ``prototype`` within the ``form manager`` "Advanced settings" step. + + +.. _formmanager.selectableprototypesconfiguration.*.newformtemplates: + +selectablePrototypesConfiguration.*.newFormTemplates +---------------------------------------------------- + +:aspect:`Option path` + formManager.selectablePrototypesConfiguration.*.newFormTemplates + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + 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 + +:aspect:`Good to know` + - :ref:`"Start templates"` + - :ref:`Translate "Start template" options` + +:aspect:`Description` + Array with numerical Keys. Configure the ``Start templates`` selectlist for this ``prototype`` within the ``form manager`` "Advanced settings" step. + + +.. _formmanager.selectableprototypesconfiguration.*.newformtemplates.*.templatepath: + +selectablePrototypesConfiguration.*.newFormTemplates.*.templatePath +------------------------------------------------------------------- + +:aspect:`Option path` + formManager.selectablePrototypesConfiguration.*.newFormTemplates.*.templatePath + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Good to know` + - :ref:`"Start templates"` + - :ref:`Translate "Start template" options` + +:aspect:`Description` + The filesystem path to the `Start template`` YAML file. + + +.. _formmanager.selectableprototypesconfiguration.*.newformtemplates.*.label: + +selectablePrototypesConfiguration.*.newFormTemplates.*.label +------------------------------------------------------------ + +:aspect:`Option path` + formManager.selectablePrototypesConfiguration.*.newFormTemplates.*.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Good to know` + - :ref:`"Start templates"` + - :ref:`Translate "Start template" options` + +:aspect:`Description` + The ``Start template`` selectlist label for this ``Start template`` within the ``form manager`` "Advanced settings" step. + + +.. _formmanager.controller: + +controller +---------- + +:aspect:`Option path` + formManager.controller + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + controller: + deleteAction: + errorTitle: formManagerController.deleteAction.error.title + errorMessage: formManagerController.deleteAction.error.body + +:aspect:`Description` + Internal setting. Configure the ``form manager`` flash message texts. + + +.. _formmanager.controller.deleteaction.errortitle: + +controller.deleteAction.errorTitle +---------------------------------- + +:aspect:`Option path` + formManager.controller.deleteAction.errorTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + controller: + deleteAction: + errorTitle: formManagerController.deleteAction.error.title + errorMessage: formManagerController.deleteAction.error.body + +:aspect:`Description` + Internal setting. Configure the ``form manager`` flash message texts. + + +.. _formmanager.controller.deleteaction.errormessage: + +controller.deleteAction.errorMessage +------------------------------------ + +:aspect:`Option path` + formManager.controller.deleteAction.errorMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + controller: + deleteAction: + errorTitle: formManagerController.deleteAction.error.title + errorMessage: formManagerController.deleteAction.error.body + +:aspect:`Description` + Internal setting. Configure the ``form manager`` flash message texts. diff --git a/Documentation/I/Config/persistenceManager/Index.rst b/Documentation/I/Config/persistenceManager/Index.rst new file mode 100644 index 0000000..acc111f --- /dev/null +++ b/Documentation/I/Config/persistenceManager/Index.rst @@ -0,0 +1,198 @@ +.. include:: /Includes.rst.txt + + +.. _persistencemanager: + +==================== +[persistenceManager] +==================== + + +.. _persistencemanager-properties: + +Properties +========== + +.. _persistencemanager.allowSaveToExtensionPaths: + +allowSaveToExtensionPaths +------------------------- + +:aspect:`Option path` + persistenceManager.allowSaveToExtensionPaths + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + persistenceManager: + allowSaveToExtensionPaths: false + +:aspect:`Good to know` + :ref:`Form/ File storages` + +:aspect:`Description` + Set this to ``true`` if you want to allow backend users to **edit** forms stored within your own extension. + + +.. _persistencemanager.allowDeleteFromExtensionPaths: + +allowDeleteFromExtensionPaths +----------------------------- + +:aspect:`Option path` + persistenceManager.allowDeleteFromExtensionPaths + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + persistenceManager: + allowDeleteFromExtensionPaths: false + +:aspect:`Good to know` + :ref:`Form/ File storages` + +:aspect:`Description` + Set this to ``true`` if you want to allow backend users to **delete** forms stored within your own extension. + + +.. _persistencemanager.sortByKeys: + +sortByKeys +----------------------------- + +:aspect:`Option path` + persistenceManager.sortByKeys + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + + persistenceManager: + sortByKeys: ['name', 'fileUid'] + +:aspect:`Good to know` + :ref:`Form/ File storages` + +:aspect:`Description` + The keys by which the forms should be sorted in the Form module and in the form plugin select. + + Valid keys, by which the forms can be sorted, are: + + ``name`` + The forms name. + + ``identifier`` + The filename. + + ``fileUid`` + The files uid. + + ``persistenceIdentifier`` + The files location. + + Example: ``1:/form_definitions/contact.form.yaml`` + + ``readOnly`` + Is the form readonly? + + ``removable`` + Is the form removable? + + ``location`` + Either `storage` or `extension` + + ``invalid`` + Does the form have an error? + + +.. _persistencemanager.sortAscending: + +sortAscending +----------------------------- + +:aspect:`Option path` + persistenceManager.sortAscending + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form manager) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + + persistenceManager: + sortAscending: true + +:aspect:`Good to know` + :ref:`Form/ File storages` + +:aspect:`Description` + If set to ``true``, the forms will be sorted in ascending, otherwise in descending order. + + +.. _persistencemanager.allowedExtensionPaths: + +allowedExtensionPaths +--------------------- + +:aspect:`Option path` + persistenceManager.allowedExtensionPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form manager/ form editor/ plugin) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + :ref:`Form/ File storages` + +:aspect:`Description` + Define the paths to folders which contain forms within your own extension. + For example: + + .. code-block:: yaml + + allowedExtensionPaths: + 10: EXT:my_site_package/Resources/Private/Forms/ diff --git a/Documentation/I/Config/proto/Index.rst b/Documentation/I/Config/proto/Index.rst new file mode 100644 index 0000000..48b2e3d --- /dev/null +++ b/Documentation/I/Config/proto/Index.rst @@ -0,0 +1,96 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes: + +============ +[prototypes] +============ + + +.. _prototypes-properties: + +Properties +========== + +.. _prototypes-properties-_prototypes: + +prototypes +---------- + +:aspect:`Option path` + prototypes + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form manager/ form editor/ plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + prototypes: + standard: + [...] + +:aspect:`Good to know` + - :ref:`"Prototypes"` + - :ref:`"Form configuration vs. form definition"` + +:aspect:`Description` + Array which defines the available prototypes. Every key within this array is called the ``prototypeIdentifier``. + + +.. _prototypes.prototypeIdentifier: + +prototypeIdentifier +--------------------- + +:aspect:`Option path` + prototypes. + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form manager/ form editor/ plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`"formManager.selectablePrototypesConfiguration.*.identifier"` + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + prototypes: + standard: + [...] + +:aspect:`Good to know` + - :ref:`"Prototypes"` + - :ref:`"Form configuration vs. form definition"` + +:aspect:`Description` + This array key identifies the `prototype``. Every ``form definition`` references to such a ```` through the property ``prototypeName``. + + +Subproperties +============= + +.. toctree:: + + form/Index + formElements/Index + finishersDefinition/Index + validatorsDefinition/Index + formEditor/Index + formEngine/Index diff --git a/Documentation/I/Config/proto/finishersDefinition/Index.rst b/Documentation/I/Config/proto/finishersDefinition/Index.rst new file mode 100644 index 0000000..922df2d --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/Index.rst @@ -0,0 +1,395 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition: + +===================== +[finishersDefinition] +===================== + + +.. _prototypes.prototypeIdentifier.finishersdefinition-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition-properties-finishersdefinition: + +[finishersDefinition] +--------------------- + +:aspect:`Option path` + prototypes..finishersDefinition + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + prototypes: + : + finishersDefinition: + [...] + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + Array which defines the available finishers. Every key within this array is called the ````. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier: + + +-------------------- + +:aspect:`Option path` + prototypes..finishersdefinition. + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + + prototypes: + standard: + Closure: + [...] + Confirmation: + [...] + EmailToSender: + [...] + EmailToReceiver: + [...] + DeleteUploads: + [...] + FlashMessage: + [...] + Redirect: + [...] + SaveToDatabase: + [...] + +:aspect:`Related options` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.formelementtypeidentifier.formEditor.propertyCollections.finishers.[*].identifier"` + - :ref:`"[FinishersEditor] selectOptions.[*].value"` + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + This array key identifies a finisher. This identifier could be used to attach a finisher to a form. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier-commonproperties: + +Common properties +============================================= + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition..implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.options: + +options +------- + +:aspect:`Option path` + prototypes..finishersDefinition..options + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Depends (see :ref:`concrete finishers configuration `) + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + Array with finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.translation.translationFiles: + +translation.translationFiles +---------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition..translation.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Filesystem path(s) to translation files which should be searched for finisher translations. + If the property is undefined, - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Form.renderingOptions.translation.translationFiles"` will be used. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.formeditor: + +formEditor +---------- + +:aspect:`Option path` + prototypes..finishersDefinition..formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Array with configurations for the ``form editor`` + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition..formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition..formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition..formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: properties/predefinedDefaults.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.formengine: + +FormEngine +---------- + +:aspect:`Option path` + prototypes..finishersDefinition..FormEngine + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Array with configurations for the ``form plugin`` + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.FormEngine.label: + +FormEngine.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition..FormEngine.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: properties/formEngine/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier.FormEngine.elements: + +FormEngine.elements +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition..FormEngine.elements + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete finishers configuration `) + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: properties/formEngine/elements.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.finisheridentifier-concreteconfigurations: + +Concrete configurations +======================= + +.. toctree:: + + finishers/Closure + finishers/Confirmation + finishers/EmailToReceiver + finishers/EmailToSender + finishers/DeleteUploads + finishers/FlashMessage + finishers/Redirect + finishers/SaveToDatabase diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/Closure.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/Closure.rst new file mode 100644 index 0000000..a9d5c51 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/Closure.rst @@ -0,0 +1,186 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.closure: + +========= +[Closure] +========= + + +.. _prototypes.prototypeIdentifier.finishersdefinitionclosure-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.closure.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Closure.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Closure: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ClosureFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.closure.options.closure: + +options.closure +--------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Closure.options.closure + +:aspect:`Data type` + \Closure + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + null + +.. :aspect:`Good to know` + ToDo + - :ref:`"Closure finisher"` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + The closure which is invoked if the finisher is triggered. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.closure.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Closure.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Closure: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Closure.editor.header.label + predefinedDefaults: + options: + closure: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.closure.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Closure.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Closure: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Closure.editor.header.label + predefinedDefaults: + options: + closure: '' + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.closure.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Closure.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Closure: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Closure.editor.header.label + predefinedDefaults: + options: + closure: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/Confirmation.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/Confirmation.rst new file mode 100644 index 0000000..b93e86b --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/Confirmation.rst @@ -0,0 +1,377 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation: + +============== +[Confirmation] +============== + +.. _prototypes.prototypeIdentifier.finishersdefinitionconfirmation-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Confirmation: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ConfirmationFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.message: + +options.message +--------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.message + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + The form has been submitted. + +:aspect:`Good to know` + - :ref:`"Confirmation finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + The text which is shown if the finisher is invoked. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.contentelementuid: + +options.contentElementUid +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.contentElementUid + +:aspect:`Data type` + integer + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Description` + The option "contentElementUid" can be used to render a content element. + If contentElementUid is set, the option "message" will be ignored. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.typoscriptobjectpath: + +options.typoscriptObjectPath +---------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.typoscriptObjectPath + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + 'lib.tx_form.contentElementRendering' + +:aspect:`Description` + The option "typoscriptObjectPath" can be used to render the content element (options.contentElementUid) through a typoscript lib. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.variables: + +options.variables +----------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.variables + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Description` + Variables which should be available within the template. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.templatename: + +options.templateName +-------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.templateName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + 'Confirmation' + +:aspect:`Description` + Define a custom template name which should be used. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.templaterootpaths: + +options.templateRootPaths +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.templateRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + Confirmation: + options: + templateRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Templates/Finishers/Confirmation/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Layout/Finishers/Confirmation/' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Frontend/Partials/Finishers/Confirmation/' + +:aspect:`Description` + Used to define several paths for templates, which will be tried in reversed order (the paths are searched from bottom to top). + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.translation.propertiesExcludedFromTranslation: + +options.translation.propertiesExcludedFromTranslation +----------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.translation.propertiesExcludedFromTranslation + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Confirmation finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Localization from translation files will be skipped for all specified finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.options.translation.translationfiles: + +options.translation.translationFiles +------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.options.translation.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Confirmation finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If set, this translation file(s) will be used for finisher option translations. + If not set, the translation file(s) from the 'Form' element will be used. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Confirmation: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Confirmation.editor.header.label + predefinedDefaults: + options: + message: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Confirmation: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Confirmation.editor.header.label + predefinedDefaults: + options: + message: '' + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.confirmation.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Confirmation.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Confirmation: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Confirmation.editor.header.label + predefinedDefaults: + options: + message: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt + diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/DeleteUploads.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/DeleteUploads.rst new file mode 100644 index 0000000..05a6855 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/DeleteUploads.rst @@ -0,0 +1,114 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.deleteuploads: + +=============== +[DeleteUploads] +=============== + +.. _prototypes.prototypeIdentifier.finishersdefinitiondeleteuploads-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.deleteuploads.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.DeleteUploads.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + DeleteUploads: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\DeleteUploadsFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + Array which defines the available finishers. Every key within this array is called the ```` + + +.. _prototypes.prototypeIdentifier.finishersdefinition.deleteuploads.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.DeleteUploads.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + DeleteUploads: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.DeleteUploads.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.deleteuploads.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.DeleteUploads.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + DeleteUploads: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.DeleteUploads.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToReceiver.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToReceiver.rst new file mode 100644 index 0000000..f27c8d2 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToReceiver.rst @@ -0,0 +1,813 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver: + +================= +[EmailToReceiver] +================= + +.. _prototypes.prototypeIdentifier.finishersdefinitionemailtoreceiver-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + EmailToReceiver: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.subject: + +options.subject +--------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.subject + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Subject of the email. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.recipients: + +options.recipients +------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.recipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email addresses and names of the recipients (To). + + The form editor in the backend module provides a visual UI to enter an arbitrary + amount of recipients. + + This option must contain a YAML hash with email addresses as keys and + recipient names as values: + + .. code-block:: yaml + + recipients: + first@example.org: First Recipient + second@example.org: Second Recipient + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.senderaddress: + +options.senderAddress +--------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.senderAddress + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email address of the sender/ visitor (From). + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.sendername: + +options.senderName +------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.senderName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty string + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Human-readable name of the sender. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.replytorecipients: + +options.replyToRecipients +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.replyToRecipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email addresses of to be used as reply-to emails. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.carboncopyrecipients: + +options.carbonCopyRecipients +---------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.carbonCopyRecipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email addresses of the copy recipient. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.blindcarbonCopyrecipients: + +options.blindCarbonCopyRecipients +--------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.blindCarbonCopyRecipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email address of the blind copy recipient. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.addhtmlpart: + +options.addHtmlPart +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.addHtmlPart + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + true + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + If set, mails will contain a plaintext and HTML part, otherwise only a + plaintext part. That way, it can be used to disable HTML and enforce + plaintext-only mails. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.attachuploads: + +options.attachUploads +--------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.attachUploads + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + true + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + If set, all uploaded items are attached to the email. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.title: + +options.title +------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.title + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + The title, being shown in the email. The templates are based onFluidEmail. + The template renders the title field in the header section right above the + email body. Do not confuse this field with the subject of the email. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.translation.language: + +options.translation.language +---------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.translation.language + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If not set, the finisher options are translated depending on the current frontend language (if translations exists). + This option allows you to force translations for a given language isocode, e.g 'da' or 'de'. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.translation.propertiesExcludedFromTranslation: + +options.translation.propertiesExcludedFromTranslation +----------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.translation.propertiesExcludedFromTranslation + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Localization from translation files will be skipped for all specified finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.translation.translationfiles: + +options.translation.translationFiles +------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.translation.translationFiles + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If set, this translation file(s) will be used for finisher option translations. + If not set, the translation file(s) from the 'Form' element will be used. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.partialrootpaths: + +options.partialRootPaths +------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.partialRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + +:aspect:`Description` + Fluid partial paths. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.layoutrootpaths: + +options.layoutRootPaths +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.layoutRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + +:aspect:`Description` + Fluid layout paths. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.options.variables: + +options.variables +----------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.options.variables + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + +:aspect:`Description` + Associative array of variables which are available inside the Fluid template. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + EmailToReceiver: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + EmailToReceiver: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + 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: 'default' + title: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.formengine.label: + +FormEngine.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.FormEngine.label + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + EmailToReceiver: + FormEngine: + label: tt_content.finishersDefinition.EmailToReceiver.label + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: ../properties/formEngine/label.rst.txt + + +@ToDo +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtoreceiver.formengine.elements: + +FormEngine.elements +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToReceiver.FormEngine.elements + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + EmailToReceiver: + FormEngine: + label: tt_content.finishersDefinition.EmailToReceiver.label + elements: + subject: + label: tt_content.finishersDefinition.EmailToReceiver.subject.label + config: + type: input + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + label: tt_content.finishersDefinition.EmailToSender.recipients.name.label + config: + type: input + senderAddress: + label: tt_content.finishersDefinition.EmailToReceiver.senderAddress.label + config: + type: input + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + 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 + title: + label: tt_content.finishersDefinition.EmailToReceiver.title.label + config: + type: input + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: ../properties/formEngine/elements.rst.txt diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToSender.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToSender.rst new file mode 100644 index 0000000..537cf73 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToSender.rst @@ -0,0 +1,812 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender: + +================= +[EmailToSender] +================= + +.. _prototypes.prototypeIdentifier.finishersdefinitionemailtosender-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + EmailToSender: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.subject: + +options.subject +--------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.subject + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Subject of the email. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.recipients: + +options.recipients +------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.recipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email addresses and names of the recipients (To). + + The form editor in the backend module provides a visual UI to enter an arbitrary + amount of recipients. + + This option must contain a YAML hash with email addresses as keys and + recipient names as values: + + .. code-block:: yaml + + recipients: + first@example.org: First Recipient + second@example.org: Second Recipient + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.senderaddress: + +options.senderAddress +--------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.senderAddress + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email address of the sender/ visitor (From). + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.sendername: + +options.senderName +------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.senderName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty string + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Human-readable name of the sender. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.replytorecipients: + +options.replyToRecipients +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.replyToRecipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email addresses of to be used as reply-to emails. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.carboncopyrecipients: + +options.carbonCopyRecipients +---------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.carbonCopyRecipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email addresses of the copy recipient. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.blindcarboncopyrecipients: + +options.blindCarbonCopyRecipients +--------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.blindCarbonCopyRecipients + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Email address of the blind copy recipient. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.addhtmlpart: + +options.addHtmlPart +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.addHtmlPart + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + true + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + If set, mails will contain a plaintext and HTML part, otherwise only a + plaintext part. That way, it can be used to disable HTML and enforce + plaintext-only mails. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.attachuploads: + +options.attachUploads +--------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.attachUploads + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + true + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + If set, all uploaded items are attached to the email. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.title: + +options.title +------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.title + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + The title, being shown in the email. The templates are based onFluidEmail. + The template renders the title field in the header section right above the + email body. Do not confuse this field with the subject of the email. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.translation.language: + +options.translation.language +---------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.translation.language + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If not set, the finisher options are translated depending on the current frontend language (if translations exists). + This option allows you to force translations for a given language isocode, e.g 'da' or 'de'. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.translation.propertiesExcludedFromTranslation: + +options.translation.propertiesExcludedFromTranslation +----------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.translation.propertiesExcludedFromTranslation + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Localization from translation files will be skipped for all specified finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.translation.translationfiles: + +options.translation.translationFiles +------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.translation.translationFiles + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If set, this translation file(s) will be used for finisher option translations. + If not set, the translation file(s) from the 'Form' element will be used. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.partialrootpaths: + +options.partialRootPaths +------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.partialRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + +:aspect:`Description` + Fluid layout paths. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.layoutrootpaths: + +options.layoutRootPaths +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.layoutRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + +:aspect:`Description` + Fluid partial paths. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.options.variables: + +options.variables +----------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.options.variables + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Email finisher"` + +:aspect:`Description` + Associative array of variables which are available inside the Fluid template. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + EmailToSender: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.EmailToSender.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + EmailToSender: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.EmailToSender.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + 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 + translation: + language: 'default' + title: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.formengine.label: + +FormEngine.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.FormEngine.label + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + EmailToSender: + FormEngine: + label: tt_content.finishersDefinition.EmailToSender.label + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: ../properties/formEngine/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.emailtosender.formengine.elements: + +FormEngine.elements +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.EmailToSender.FormEngine.elements + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + EmailToSender: + FormEngine: + label: tt_content.finishersDefinition.EmailToSender.label + elements: + subject: + label: tt_content.finishersDefinition.EmailToSender.subject.label + config: + type: input + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + label: tt_content.finishersDefinition.EmailToSender.recipients.name.label + config: + type: input + senderAddress: + label: tt_content.finishersDefinition.EmailToSender.senderAddress.label + config: + type: input + required: true + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + 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: + label: tt_content.finishersDefinition.EmailToSender.recipients.email.label + config: + type: email + required: true + name: + label: tt_content.finishersDefinition.EmailToSender.recipients.name.label + config: + type: input + addHtmlPart: + label: tt_content.finishersDefinition.EmailToSender.addHtmlPart.label + config: + type: check + default: 1 + translation: + language: + label: tt_content.finishersDefinition.EmailToSender.language.label + config: + type: select + renderType: selectSingle + minitems: 1 + maxitems: 1 + size: 1 + items: + 10: + - tt_content.finishersDefinition.EmailToSender.language.1 + - default + title: + label: tt_content.finishersDefinition.EmailToSender.title.label + config: + type: input + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: ../properties/formEngine/elements.rst.txt diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/FlashMessage.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/FlashMessage.rst new file mode 100644 index 0000000..2557fe7 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/FlashMessage.rst @@ -0,0 +1,372 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage: + +============== +[FlashMessage] +============== + +.. _prototypes.prototypeIdentifier.finishersdefinitionflashmessage-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + FlashMessage: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\FlashMessageFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.messagebody: + +options.messageBody +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.messageBody + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + null + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + The flash message body TEXT. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.messagetitle: + +options.messageTitle +-------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.messageTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty string + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + The flash message title. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.messagearguments: + +options.messageArguments +------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.messageArguments + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty array + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + The flash message arguments, if needed. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.messagecode: + +options.messageCode +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.messageCode + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + null + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + +:aspect:`Description` + The flash message code, if needed. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.severity: + +options.severity +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.severity + +:aspect:`Data type` + Enum<\TYPO3\CMS\Core\Type\ContextualFeedbackSeverity>|int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + :php:`\TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::OK` (0) + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + +:aspect:`Description` + The flash message severity code. + See :t3src:`core/Classes/Type/ContextualFeedbackSeverity.php` cases for the codes. + + Important: in YAML-based form definitions, the PHP enums cannot be used. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.translation.propertiesExcludedFromTranslation: + +options.translation.propertiesExcludedFromTranslation +----------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.translation.propertiesExcludedFromTranslation + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Localization from translation files will be skipped for all specified finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.options.translation.translationfiles: + +options.translation.translationFiles +------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.options.translation.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"FlashMessage finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If set, this translation file(s) will be used for finisher option translations. + If not set, the translation file(s) from the 'Form' element will be used. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + FlashMessage: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.FlashMessage.editor.header.label + predefinedDefaults: + options: + messageBody: '' + messageTitle: '' + messageArguments: '' + messageCode: 0 + severity: 0 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + FlashMessage: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.FlashMessage.editor.header.label + predefinedDefaults: + options: + messageBody: '' + messageTitle: '' + messageArguments: '' + messageCode: 0 + severity: 0 + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.flashmessage.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.FlashMessage.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + FlashMessage: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.FlashMessage.editor.header.label + predefinedDefaults: + options: + messageBody: '' + messageTitle: '' + messageArguments: '' + messageCode: 0 + severity: 0 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/Redirect.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/Redirect.rst new file mode 100644 index 0000000..62b600a --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/Redirect.rst @@ -0,0 +1,450 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect: + +========== +[Redirect] +========== + +.. _prototypes.prototypeIdentifier.finishersdefinitionredirect-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Redirect: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\RedirectFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.pageuid: + +options.pageUid +--------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.options.pageUid + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + 1 + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Redirect to this page uid. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.additionalparameters: + +options.additionalParameters +---------------------------- + +:aspect:`Option path` + prototypes.prototypeIdentifier.finishersDefinition.Redirect.options.additionalParameters + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty string + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Additional parameters which should be used on the target page. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.fragment: + +options.fragment +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.options.fragment + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty string + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Add a fragment (e.g. :html:`#c9` or :html:`#foo`) to the redirect link. + The :html:`#` character can be omitted. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.delay: + +options.delay +------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.options.delay + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + 0 + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + The redirect delay in seconds. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.statuscode: + +options.statusCode +------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.options.statusCode + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + 303 + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + The HTTP status code for the redirect. Default is "303 See Other". + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.translation.propertiesExcludedFromTranslation: + +options.translation.propertiesExcludedFromTranslation +----------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.options.translation.propertiesExcludedFromTranslation + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Localization from translation files will be skipped for all specified finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.options.translation.translationfiles: + +options.translation.translationFiles +------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.options.translation.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Redirect finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If set, this translation file(s) will be used for finisher option translations. + If not set, the translation file(s) from the 'Form' element will be used. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Redirect: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Redirect.editor.header.label + predefinedDefaults: + options: + pageUid: '' + additionalParameters: '' + fragment: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Redirect: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Redirect.editor.header.label + predefinedDefaults: + options: + pageUid: '' + additionalParameters: '' + fragment: '' + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Redirect: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.Redirect.editor.header.label + predefinedDefaults: + options: + pageUid: '' + additionalParameters: '' + fragment: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.formengine.label: + +FormEngine.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.FormEngine.label + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Redirect: + FormEngine: + label: tt_content.finishersDefinition.Redirect.label + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: ../properties/formEngine/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.redirect.formengine.elements: + +FormEngine.elements +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.Redirect.FormEngine.elements + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Redirect: + FormEngine: + label: tt_content.finishersDefinition.Redirect.label + elements: + pageUid: + label: tt_content.finishersDefinition.Redirect.pageUid.label + config: + type: group + allowed: pages + size: 1 + minitems: 1 + maxitems: 1 + fieldWizard: + recordsOverview: + disabled: 1 + additionalParameters: + label: tt_content.finishersDefinition.Redirect.additionalParameters.label + config: + type: input + fragment: + label: tt_content.finishersDefinition.Redirect.fragment.label + config: + type: input + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + .. include:: ../properties/formEngine/elements.rst.txt + diff --git a/Documentation/I/Config/proto/finishersDefinition/finishers/SaveToDatabase.rst b/Documentation/I/Config/proto/finishersDefinition/finishers/SaveToDatabase.rst new file mode 100644 index 0000000..2520ec8 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/finishers/SaveToDatabase.rst @@ -0,0 +1,580 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase: + +================ +[SaveToDatabase] +================ + +.. _prototypes.prototypeIdentifier.finishersdefinitionsavetodatabase-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + SaveToDatabase: + implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher + +:aspect:`Good to know` + - :ref:`"Custom finisher implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.table: + +options.table +------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.table + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + null + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Insert or update values into this table. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.mode: + +options.mode +------------ + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.mode + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + 'insert' + +:aspect:`Possible values` + insert/ update + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + ``insert`` will create a new database row with the values from the submitted form and/or some predefined values. @see options.elements and options.databaseFieldMappings + + ``update`` will update a given database row with the values from the submitted form and/or some predefined values. 'options.whereClause' is then required. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.whereclause: + +options.whereClause +------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.whereClause + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes, if mode = update + +:aspect:`Default value` + empty array + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + This where clause will be used for a database update action. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.elements: + +options.elements +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.elements + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + empty array + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Use ``options.elements`` to map form element values to existing database columns. + Each key within ``options.elements`` has to match with a form element identifier. + The value for each key within ``options.elements`` is an array with additional informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.elements..mapondatabasecolumn: + +options.elements..mapOnDatabaseColumn +------------------------------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.elements..mapOnDatabaseColumn + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + The value from the submitted form element with the identifier ```` will be written into this database column. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.elements..savefileidentifierinsteadofuid: + +options.elements..saveFileIdentifierInsteadOfUid +------------------------------------------------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.elements..saveFileIdentifierInsteadOfUid + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + false + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Set this to true if the database column should not be written if the value from the submitted form element with the identifier + ```` is empty (think about password fields etc.). + + This setting only rules for form elements which creates a FAL object like ``FileUpload`` or ``ImageUpload``. + By default, the uid of the FAL object will be written into the database column. Set this to true if you want to store the + FAL identifier (1:/user_uploads/some_uploaded_pic.jpg) instead. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.elements..skipifvalueisempty: + +options.elements..skipIfValueIsEmpty +------------------------------------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.elements..skipIfValueIsEmpty + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + false + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Set this to true if the database column should not be written if the value from the submitted form element with the identifier + ```` is empty (think about password fields etc.). Empty means strings without content, whitespace + is valid content. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.elements..hashed: + +options.elements..hashed +------------------------------------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.elements..hashed + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + false + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Set this to true if the value from the submitted form element should be hashed before writing into the database. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.elements..dateformat: + +options.elements..dateFormat +--------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.elements..dateFormat + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + 'U' + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + If the internal Datatype is \DateTime which is true for the form element type "Date", + the object needs to be converted into a string value. + This option allows you to define the format of the date. + You can use every format accepted by PHP's date() function (https://php.net/manual/en/function.date.php#refsect1-function.date-parameters). + The default value is "U" which means a Unix timestamp. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.databasecolumnmappings: + +options.databaseColumnMappings +------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.databaseColumnMappings + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + empty array + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Use this to map database columns to static values. + Each key within ``options.databaseColumnMappings`` has to match with an existing database column. + The value for each key within ``options.databaseColumnMappings`` is an array with additional informations. + + This mapping is done *before* the ``options.element`` mapping. + This means if you map a database column to a value through ``options.databaseColumnMappings`` and map a submitted + form element value to the same database column through ``options.element``, the submitted form element value + will override the value you set within ``options.databaseColumnMappings``. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.databasecolumnmappings..value: + +options.databaseColumnMappings..value +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.databaseColumnMappings..value + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + The value which will be written to the database column. + You can also use the :ref:`FormRuntime accessor feature` to access every getable property from the ``FormRuntime`` + In short: use something like ``{}`` to get the value from the submitted form element with the identifier ````. + + If you use the FormRuntime accessor feature within ``options.databaseColumnMappings`` the functionality is nearly equal + to the ``options.elements`` configuration variant. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.databasecolumnmappings..skipifvalueisempty: + +options.databaseColumnMappings..skipIfValueIsEmpty +---------------------------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.databaseColumnMappings..skipIfValueIsEmpty + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + +:aspect:`Description` + Set this to true if the database column should not be written if the value from `options.databaseColumnMappings. + .value` is empty. Empty means strings without content, whitespace is valid content. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.translation.propertiesExcludedFromTranslation: + +options.translation.propertiesExcludedFromTranslation +----------------------------------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.translation.propertiesExcludedFromTranslation + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + Localization from translation files will be skipped for all specified finisher options. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.options.translation.translationfiles: + +options.translation.translationFiles +------------------------------------ + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.options.translation.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"SaveToDatabase finisher"` + - :ref:`"Accessing form runtime values"` + - :ref:`"Translate finisher options"` + +:aspect:`Description` + If set, this translation file(s) will be used for finisher option translations. + If not set, the translation file(s) from the 'Form' element will be used. + Read :ref:`Translate finisher options` for more informations. + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SaveToDatabase: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label + predefinedDefaults: + options: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + SaveToDatabase: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label + predefinedDefaults: + options: { } + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.finishersdefinition.savetodatabase.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..finishersDefinition.SaveToDatabase.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + SaveToDatabase: + formEditor: + iconIdentifier: form-finisher + label: formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label + predefinedDefaults: + options: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/finishersDefinition/properties/formEngine/elements.rst.txt b/Documentation/I/Config/proto/finishersDefinition/properties/formEngine/elements.rst.txt new file mode 100644 index 0000000..6bf46f1 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/properties/formEngine/elements.rst.txt @@ -0,0 +1,6 @@ + + +Every array key must match to the related finisher option name. +For example, the - :ref:`"[Redirect] finisher"` has the option - :ref:`"pageUid"`. +If you want to make the ``pageUid`` overwritable within the ``form plugin``, then an array key ``pageUid`` has to exists within ``prototypes.prototypeIdentifier.finishersDefinition.finisheridentifier.FormEngine.elements``. +The configuration within ``prototypes.prototypeIdentifier.finishersDefinition.Redirect.FormEngine.elements.pageUid`` must follow the TCA syntax. diff --git a/Documentation/I/Config/proto/finishersDefinition/properties/formEngine/label.rst.txt b/Documentation/I/Config/proto/finishersDefinition/properties/formEngine/label.rst.txt new file mode 100644 index 0000000..05727e6 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/properties/formEngine/label.rst.txt @@ -0,0 +1,5 @@ + + +Finisher options are overwritable within the ``form plugin``. +If the "Override finisher settings" checkbox is selected within the ``form plugin``, every finisher who has a - :ref:`"FormEngine"` configuration, is shown in a separate tab. +``label`` is the label for such a tab. diff --git a/Documentation/I/Config/proto/finishersDefinition/properties/iconIdentifier.rst.txt b/Documentation/I/Config/proto/finishersDefinition/properties/iconIdentifier.rst.txt new file mode 100644 index 0000000..f897f29 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/properties/iconIdentifier.rst.txt @@ -0,0 +1,4 @@ + + +An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. +This icon will be shown within the - :ref:`"Inspector [CollectionElementHeaderEditor]"` if the finisher is selected. diff --git a/Documentation/I/Config/proto/finishersDefinition/properties/implementationClassName.rst.txt b/Documentation/I/Config/proto/finishersDefinition/properties/implementationClassName.rst.txt new file mode 100644 index 0000000..dca14af --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/properties/implementationClassName.rst.txt @@ -0,0 +1,3 @@ + + +Classname which implements the finisher. diff --git a/Documentation/I/Config/proto/finishersDefinition/properties/label.rst.txt b/Documentation/I/Config/proto/finishersDefinition/properties/label.rst.txt new file mode 100644 index 0000000..9b71591 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/properties/label.rst.txt @@ -0,0 +1,3 @@ + + +This label will be shown within the - :ref:`"Inspector [CollectionElementHeaderEditor]"` if the finisher is selected. diff --git a/Documentation/I/Config/proto/finishersDefinition/properties/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/finishersDefinition/properties/predefinedDefaults.rst.txt new file mode 100644 index 0000000..3221d31 --- /dev/null +++ b/Documentation/I/Config/proto/finishersDefinition/properties/predefinedDefaults.rst.txt @@ -0,0 +1,3 @@ + + +Defines predefined defaults for finisher options which are prefilled, if the finisher is added to a form. diff --git a/Documentation/I/Config/proto/form/Index.rst b/Documentation/I/Config/proto/form/Index.rst new file mode 100644 index 0000000..18a1b07 --- /dev/null +++ b/Documentation/I/Config/proto/form/Index.rst @@ -0,0 +1,325 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form: + +====== +[Form] +====== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.translation.translationfiles: +.. include:: renderingOptions/translation/translationFiles.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.templaterootpaths: +.. include:: renderingOptions/templateRootPaths.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.partialrootpaths: +.. include:: renderingOptions/partialRootPaths.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.layoutrootpaths: +.. include:: renderingOptions/layoutRootPaths.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.addquerystring: +.. include:: renderingOptions/addQueryString.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.argumentstobeexcludedfromquerystring: +.. include:: renderingOptions/argumentsToBeExcludedFromQueryString.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.additionalparams: +.. include:: renderingOptions/additionalParams.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.controlleraction: +.. include:: renderingOptions/controllerAction.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.httpmethod: +.. include:: renderingOptions/httpMethod.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.httpenctype: +.. include:: renderingOptions/httpEnctype.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.fluidadditionalattributes: +.. include:: renderingOptions/fluidAdditionalAttributes.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions._iscompositeformelement: +.. include:: renderingOptions/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions._istoplevelformelement: +.. include:: renderingOptions/_isTopLevelFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.honeypot.enable: +.. include:: renderingOptions/honeypot/enable.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.honeypot.formelementtouse: +.. include:: renderingOptions/honeypot/formElementToUse.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.submitbuttonlabel: +.. include:: renderingOptions/submitButtonLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.renderingoptions.skipunknownelements: +.. include:: renderingOptions/skipUnknownElements.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor: +.. include:: formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.editors.100: +.. include:: formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.editors.200: +.. include:: formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.editors.300: +.. include:: formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.editors.900: +.. include:: formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.predefineddefaults: +.. include:: formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor._iscompositeformelement: +.. include:: formEditor/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor._istoplevelformelement: +.. include:: formEditor/_isTopLevelFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.savesuccessflashmessagetitle: +.. include:: formEditor/saveSuccessFlashMessageTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.savesuccessflashmessagemessage: +.. include:: formEditor/saveSuccessFlashMessageMessage.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.saveerrorflashmessagetitle: +.. include:: formEditor/saveErrorFlashMessageTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.saveerrorflashmessagemessage: +.. include:: formEditor/saveErrorFlashMessageMessage.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalvalidationerrorsdialogtitle: +.. include:: formEditor/modalValidationErrorsDialogTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalvalidationerrorsconfirmButton: +.. include:: formEditor/modalValidationErrorsConfirmButton.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalinsertelementsdialogtitle: +.. include:: formEditor/modalInsertElementsDialogTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalinsertpagesdialogtitle: +.. include:: formEditor/modalInsertPagesDialogTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalclosedialogmessage: +.. include:: formEditor/modalCloseDialogMessage.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalclosedialogtitle: +.. include:: formEditor/modalCloseDialogTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalcloseconfirmbutton: +.. include:: formEditor/modalCloseConfirmButton.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalclosecancelbutton: +.. include:: formEditor/modalCloseCancelButton.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalremoveelementdialogtitle: +.. include:: formEditor/modalRemoveElementDialogTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalremoveelementdialogmessage: +.. include:: formEditor/modalRemoveElementDialogMessage.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalremoveelementconfirmbutton: +.. include:: formEditor/modalRemoveElementConfirmButton.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalremoveelementcancelbutton: +.. include:: formEditor/modalRemoveElementCancelButton.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalremoveelementlastavailablepageflashmessagetitle: +.. include:: formEditor/modalRemoveElementLastAvailablePageFlashMessageTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.modalremoveelementlastavailablepageflashmessagemessage: +.. include:: formEditor/modalRemoveElementLastAvailablePageFlashMessageMessage.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.paginationtitle: +.. include:: formEditor/paginationTitle.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.iconidentifier: +.. include:: formEditor/iconIdentifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10: +.. include:: formEditor/propertyCollections/finishers/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.identifier: +.. include:: formEditor/propertyCollections/finishers/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.100: +.. include:: formEditor/propertyCollections/finishers/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.200: +.. include:: formEditor/propertyCollections/finishers/10/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.350: +.. include:: formEditor/propertyCollections/finishers/10/editors/350.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.500: +.. include:: formEditor/propertyCollections/finishers/10/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.600: +.. include:: formEditor/propertyCollections/finishers/10/editors/600.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.750: +.. include:: formEditor/propertyCollections/finishers/10/editors/750.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.850: +.. include:: formEditor/propertyCollections/finishers/10/editors/850.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.950: +.. include:: formEditor/propertyCollections/finishers/10/editors/950.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.1050: +.. include:: formEditor/propertyCollections/finishers/10/editors/1050.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.1100: +.. include:: formEditor/propertyCollections/finishers/10/editors/1100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.1200: +.. include:: formEditor/propertyCollections/finishers/10/editors/1200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.1400: +.. include:: formEditor/propertyCollections/finishers/10/editors/1400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.10.editors.9999: +.. include:: formEditor/propertyCollections/finishers/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20: +.. include:: formEditor/propertyCollections/finishers/20.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.identifier: +.. include:: formEditor/propertyCollections/finishers/20/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.100: +.. include:: formEditor/propertyCollections/finishers/20/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.200: +.. include:: formEditor/propertyCollections/finishers/20/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.350: +.. include:: formEditor/propertyCollections/finishers/20/editors/350.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.500: +.. include:: formEditor/propertyCollections/finishers/20/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.600: +.. include:: formEditor/propertyCollections/finishers/20/editors/600.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.750: +.. include:: formEditor/propertyCollections/finishers/20/editors/750.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.850: +.. include:: formEditor/propertyCollections/finishers/20/editors/850.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.950: +.. include:: formEditor/propertyCollections/finishers/20/editors/950.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.1050: +.. include:: formEditor/propertyCollections/finishers/20/editors/1050.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.1100: +.. include:: formEditor/propertyCollections/finishers/20/editors/1100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.1200: +.. include:: formEditor/propertyCollections/finishers/20/editors/1200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.1400: +.. include:: formEditor/propertyCollections/finishers/20/editors/1400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.20.editors.9999: +.. include:: formEditor/propertyCollections/finishers/20/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30: +.. include:: formEditor/propertyCollections/finishers/30.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30.identifier: +.. include:: formEditor/propertyCollections/finishers/30/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30.editors.100: +.. include:: formEditor/propertyCollections/finishers/30/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30.editors.200: +.. include:: formEditor/propertyCollections/finishers/30/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30.editors.300: +.. include:: formEditor/propertyCollections/finishers/30/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30.editors.400: +.. include:: formEditor/propertyCollections/finishers/30/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.30.editors.9999: +.. include:: formEditor/propertyCollections/finishers/30/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.40: +.. include:: formEditor/propertyCollections/finishers/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.40.identifier: +.. include:: formEditor/propertyCollections/finishers/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.40.editors.100: +.. include:: formEditor/propertyCollections/finishers/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.40.editors.9999: +.. include:: formEditor/propertyCollections/finishers/40/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.50: +.. include:: formEditor/propertyCollections/finishers/50.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.50.identifier: +.. include:: formEditor/propertyCollections/finishers/50/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.50.editors.100: +.. include:: formEditor/propertyCollections/finishers/50/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.50.editors.200: +.. include:: formEditor/propertyCollections/finishers/50/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.50.editors.300: +.. include:: formEditor/propertyCollections/finishers/50/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.50.editors.9999: +.. include:: formEditor/propertyCollections/finishers/50/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.60: +.. include:: formEditor/propertyCollections/finishers/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.60.identifier: +.. include:: formEditor/propertyCollections/finishers/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.60.editors.100: +.. include:: formEditor/propertyCollections/finishers/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.60.editors.9999: +.. include:: formEditor/propertyCollections/finishers/60/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.70: +.. include:: formEditor/propertyCollections/finishers/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.70.identifier: +.. include:: formEditor/propertyCollections/finishers/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.70.editors.100: +.. include:: formEditor/propertyCollections/finishers/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.70.editors.9999: +.. include:: formEditor/propertyCollections/finishers/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.80: +.. include:: formEditor/propertyCollections/finishers/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.80.identifier: +.. include:: formEditor/propertyCollections/finishers/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.80.editors.100: +.. include:: formEditor/propertyCollections/finishers/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.form.formeditor.propertycollections.finishers.80.editors.9999: +.. include:: formEditor/propertyCollections/finishers/80/editors/9999.rst.txt diff --git a/Documentation/I/Config/proto/form/formEditor.rst.txt b/Documentation/I/Config/proto/form/formEditor.rst.txt new file mode 100644 index 0000000..6a04ebe --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor.rst.txt @@ -0,0 +1,472 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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 + modalCloseCancelButton: formEditor.modals.close.cancelButton + modalRemoveElementDialogTitle: formEditor.modals.removeElement.dialogTitle + modalRemoveElementDialogMessage: formEditor.modals.removeElement.dialogMessage + modalRemoveElementConfirmButton: formEditor.modals.removeElement.confirmButton + modalRemoveElementCancelButton: formEditor.modals.removeElement.cancelButton + modalRemoveElementLastAvailablePageFlashMessageTitle: formEditor.modals.removeElement.lastAvailablePageFlashMessageTitle + modalRemoveElementLastAvailablePageFlashMessageMessage: formEditor.modals.removeElement.lastAvailablePageFlashMessageMessage + 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 + description: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.description + 1100: + identifier: attachUploads + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.attachUploads.label + propertyPath: options.attachUploads + 1200: + identifier: language + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.label + propertyPath: options.translation.language + selectOptions: + 10: + value: default + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.1 + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToSender.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.description + 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 + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + 400: + identifier: fragment + templateName: Inspector-Typo3WinBrowserEditor + label: formEditor.elements.Form.finisher.Redirect.editor.fragment.label + buttonLabel: formEditor.elements.Form.finisher.Redirect.editor.fragment.buttonLabel + browsableType: tt_content + iconIdentifier: mimetypes-x-content-text + propertyPath: options.fragment + description: formEditor.elements.Form.finisher.Redirect.editor.fragment.description + 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 + iconIdentifier: mimetypes-x-content-text + 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 + description: formEditor.elements.Form.finisher.Confirmation.editor.message.description + 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 diff --git a/Documentation/I/Config/proto/form/formEditor/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/form/formEditor/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..0e37510 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/_isCompositeFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isCompositeFormElement +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + _isCompositeFormElement: false + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/form/formEditor/_isTopLevelFormElement.rst.txt b/Documentation/I/Config/proto/form/formEditor/_isTopLevelFormElement.rst.txt new file mode 100644 index 0000000..d1a7fad --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/_isTopLevelFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isTopLevelFormElement +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor._isTopLevelFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + _isTopLevelFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element must not have a parent form element. diff --git a/Documentation/I/Config/proto/form/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..e9480a9 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/form/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/form/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..9e0830b --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.BaseFormElementMixin.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/form/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/form/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..5176740 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/editors/300.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 300: + identifier: 'submitButtonLabel' + templateName: 'Inspector-TextEditor' + label: 'formEditor.elements.Form.editor.submitButtonLabel.label' + propertyPath: 'renderingOptions.submitButtonLabel' diff --git a/Documentation/I/Config/proto/form/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/form/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..ace1ffb --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/editors/900.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[FinishersEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..df50a94 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + iconIdentifier: content-form + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/form/formEditor/modalCloseCancelButton.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalCloseCancelButton.rst.txt new file mode 100644 index 0000000..9a95ac4 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalCloseCancelButton.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalCloseCancelButton +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalCloseCancelButton + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalCloseCancelButton: formEditor.modals.close.cancelButton + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalCloseConfirmButton.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalCloseConfirmButton.rst.txt new file mode 100644 index 0000000..a9bca9b --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalCloseConfirmButton.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalCloseConfirmButton +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalCloseConfirmButton + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalCloseConfirmButton: formEditor.modals.close.confirmButton + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalCloseDialogMessage.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalCloseDialogMessage.rst.txt new file mode 100644 index 0000000..46a5a46 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalCloseDialogMessage.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalCloseDialogMessage +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalCloseDialogMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalCloseDialogMessage: formEditor.modals.close.dialogMessage + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalCloseDialogTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalCloseDialogTitle.rst.txt new file mode 100644 index 0000000..f541676 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalCloseDialogTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalCloseDialogTitle +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalCloseDialogTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalCloseDialogTitle: formEditor.modals.close.dialogTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalInsertElementsDialogTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalInsertElementsDialogTitle.rst.txt new file mode 100644 index 0000000..b06df4f --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalInsertElementsDialogTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalInsertPagesDialogTitle +-------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalInsertPagesDialogTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalInsertElementsDialogTitle: formEditor.modals.insertElements.dialogTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalInsertPagesDialogTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalInsertPagesDialogTitle.rst.txt new file mode 100644 index 0000000..10ff90c --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalInsertPagesDialogTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalInsertPagesDialogTitle +-------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalInsertPagesDialogTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalInsertPagesDialogTitle: formEditor.modals.newPages.dialogTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalRemoveElementCancelButton.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementCancelButton.rst.txt new file mode 100644 index 0000000..764d459 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementCancelButton.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalRemoveElementCancelButton +----------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalRemoveElementCancelButton + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalRemoveElementCancelButton: formEditor.modals.removeElement.cancelButton + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalRemoveElementConfirmButton.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementConfirmButton.rst.txt new file mode 100644 index 0000000..c82b093 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementConfirmButton.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalRemoveElementConfirmButton +------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalRemoveElementConfirmButton + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalRemoveElementConfirmButton: formEditor.modals.removeElement.confirmButton + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogMessage.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogMessage.rst.txt new file mode 100644 index 0000000..59a1e8e --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogMessage.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalRemoveElementDialogMessage +------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalRemoveElementDialogMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalRemoveElementDialogMessage: formEditor.modals.removeElement.dialogMessage + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogTitle.rst.txt new file mode 100644 index 0000000..0568ae4 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementDialogTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalRemoveElementDialogTitle +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalRemoveElementDialogTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalRemoveElementDialogTitle: formEditor.modals.removeElement.dialogTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageMessage.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageMessage.rst.txt new file mode 100644 index 0000000..8c09c0e --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageMessage.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalRemoveElementLastAvailablePageFlashMessageMessage +----------------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalRemoveElementLastAvailablePageFlashMessageMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalRemoveElementLastAvailablePageFlashMessageMessage: formEditor.modals.removeElement.lastAvailablePageFlashMessageMessage + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageTitle.rst.txt new file mode 100644 index 0000000..3c3651c --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalRemoveElementLastAvailablePageFlashMessageTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalRemoveElementLastAvailablePageFlashMessageTitle +--------------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalRemoveElementLastAvailablePageFlashMessageTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalRemoveElementLastAvailablePageFlashMessageTitle: formEditor.modals.removeElement.lastAvailablePageFlashMessageTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalValidationErrorsConfirmButton.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalValidationErrorsConfirmButton.rst.txt new file mode 100644 index 0000000..b8e8342 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalValidationErrorsConfirmButton.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalValidationErrorsConfirmButton +--------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalValidationErrorsConfirmButton + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalValidationErrorsConfirmButton: formEditor.modals.validationErrors.confirmButton + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/modalValidationErrorsDialogTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/modalValidationErrorsDialogTitle.rst.txt new file mode 100644 index 0000000..c3e639d --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/modalValidationErrorsDialogTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.modalValidationErrorsDialogTitle +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.modalValidationErrorsDialogTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + modalValidationErrorsDialogTitle: formEditor.modals.validationErrors.dialogTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/paginationTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/paginationTitle.rst.txt new file mode 100644 index 0000000..87b153f --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/paginationTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.paginationTitle +-------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.paginationTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + paginationTitle: formEditor.pagination.title + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/form/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..47f6d0a --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Form: + formEditor: + predefinedDefaults: + renderingOptions: + submitButtonLabel: 'formEditor.elements.Form.editor.submitButtonLabel.value' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10.rst.txt new file mode 100644 index 0000000..8bc1eba --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10.rst.txt @@ -0,0 +1,167 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.10 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + 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 + description: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.description + 1100: + identifier: attachUploads + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.attachUploads.label + propertyPath: options.attachUploads + 1200: + identifier: language + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.label + propertyPath: options.translation.language + selectOptions: + 10: + value: default + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.1 + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToSender.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/100.rst.txt new file mode 100644 index 0000000..9407c54 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1050.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1050.rst.txt new file mode 100644 index 0000000..0440fec --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1050.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.1050 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.1050 + +:aspect:`Data type` + array/ :ref:`[CheckboxEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToSender.editor.addHtmlPart.description + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1100.rst.txt new file mode 100644 index 0000000..25a1aa5 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1100.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.1100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.1100 + +:aspect:`Data type` + array/ :ref:`[CheckboxEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 1100: + identifier: attachUploads + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.attachUploads.label + propertyPath: options.attachUploads + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1200.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1200.rst.txt new file mode 100644 index 0000000..61c7c33 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.1200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.1200 + +:aspect:`Data type` + array/ :ref:`[SingleSelectEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 1200: + identifier: language + templateName: Inspector-SingleSelectEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.label + propertyPath: options.translation.language + selectOptions: + 10: + value: default + label: formEditor.elements.Form.finisher.EmailToSender.editor.language.1 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1400.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1400.rst.txt new file mode 100644 index 0000000..9e896a7 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/1400.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.1400 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.1400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToSender.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/200.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/200.rst.txt new file mode 100644 index 0000000..4305115 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.200 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/350.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/350.rst.txt new file mode 100644 index 0000000..c76c23b --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/350.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.350 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.350 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 350: + identifier: recipients + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.label + propertyPath: options.recipients + propertyValidators: + 10: NotEmpty + description: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/500.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/500.rst.txt new file mode 100644 index 0000000..65d74d0 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/500.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.500 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/600.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/600.rst.txt new file mode 100644 index 0000000..0ef5d42 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/600.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.600 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.600 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToSender.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/750.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/750.rst.txt new file mode 100644 index 0000000..8e7089a --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/750.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.750 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.750 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/850.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/850.rst.txt new file mode 100644 index 0000000..9239dcf --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/850.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.850 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.850 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/950.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/950.rst.txt new file mode 100644 index 0000000..5c59ae1 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/950.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.950 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.950 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/9999.rst.txt new file mode 100644 index 0000000..3171d7d --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.10.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/identifier.rst.txt new file mode 100644 index 0000000..b49c318 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.10.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20.rst.txt new file mode 100644 index 0000000..a2edeb9 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20.rst.txt @@ -0,0 +1,167 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.20 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + 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 + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.description + 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 + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/100.rst.txt new file mode 100644 index 0000000..30f73a2 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1050.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1050.rst.txt new file mode 100644 index 0000000..e406a11 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1050.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.1050 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.1050 + +:aspect:`Data type` + array/ :ref:`[CheckboxEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 1050: + identifier: addHtmlPart + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.label + propertyPath: options.addHtmlPart + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.addHtmlPart.description + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1100.rst.txt new file mode 100644 index 0000000..c1162b2 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1100.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.1100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.1100 + +:aspect:`Data type` + array/ :ref:`[CheckboxEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 1100: + identifier: attachUploads + templateName: Inspector-CheckboxEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.attachUploads.label + propertyPath: options.attachUploads + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1200.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1200.rst.txt new file mode 100644 index 0000000..a591a4d --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.1200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.1200 + +:aspect:`Data type` + array/ :ref:`[SingleSelectEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1400.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1400.rst.txt new file mode 100644 index 0000000..72ac2b9 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/1400.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.1400 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.1400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 10: + identifier: EmailToSender + editors: + 1400: + identifier: title + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.label + propertyPath: options.title + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.title.description + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/200.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/200.rst.txt new file mode 100644 index 0000000..46d1e23 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.200 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/350.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/350.rst.txt new file mode 100644 index 0000000..b389b31 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/350.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.350 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.350 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 350: + identifier: recipients + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.label + propertyPath: options.recipients + propertyValidators: + 10: NotEmpty + description: formEditor.elements.Form.finisher.EmailToReceiver.editor.recipients.description + isSortable: true + enableAddRow: true + enableDeleteRow: true + useLabelAsFallbackValue: false + gridColumns: + - + name: value + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.value.title + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/500.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/500.rst.txt new file mode 100644 index 0000000..00e4303 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/500.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.500 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/600.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/600.rst.txt new file mode 100644 index 0000000..492c9b7 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/600.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.600 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.600 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 600: + identifier: senderName + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.EmailToReceiver.editor.senderName.label + propertyPath: options.senderName + enableFormelementSelectionButton: true + propertyValidators: + 10: FormElementIdentifierWithinCurlyBracesInclusive + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/750.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/750.rst.txt new file mode 100644 index 0000000..b303514 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/750.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.750 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.750 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/850.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/850.rst.txt new file mode 100644 index 0000000..bb4e160 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/850.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.850 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.850 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/950.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/950.rst.txt new file mode 100644 index 0000000..a2f340a --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/950.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.950 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.950 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 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 + enableFormelementSelectionButton: true + - + name: label + title: formEditor.elements.Form.finisher.EmailToSender.editor.recipients.gridColumns.label.title + enableFormelementSelectionButton: true + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/9999.rst.txt new file mode 100644 index 0000000..763411e --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.20.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/identifier.rst.txt new file mode 100644 index 0000000..4edc5af --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/20/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.20.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.20.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 20: + identifier: EmailToReceiver + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30.rst.txt new file mode 100644 index 0000000..1a0cbbe --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30.rst.txt @@ -0,0 +1,61 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.30 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 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 + 400: + identifier: fragment + templateName: Inspector-Typo3WinBrowserEditor + label: formEditor.elements.Form.finisher.Redirect.editor.fragment.label + buttonLabel: formEditor.elements.Form.finisher.Redirect.editor.fragment.buttonLabel + browsableType: tt_content + iconIdentifier: mimetypes-x-content-text + propertyPath: options.fragment + description: formEditor.elements.Form.finisher.Redirect.editor.fragment.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/100.rst.txt new file mode 100644 index 0000000..64cafb5 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.30.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 30: + identifier: Redirect + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.Redirect.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/200.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/200.rst.txt new file mode 100644 index 0000000..3cd48a8 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/200.rst.txt @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.30.editors.200 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30.editors.200 + +:aspect:`Data type` + array/ :ref:`[Typo3WinBrowserEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 30: + identifier: Redirect + editors: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/300.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/300.rst.txt new file mode 100644 index 0000000..603346a --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/300.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.30.editors.300 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 30: + identifier: Redirect + editors: + 300: + identifier: additionalParameters + templateName: Inspector-TextEditor + label: formEditor.elements.Form.finisher.Redirect.editor.additionalParameters.label + propertyPath: options.additionalParameters + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/400.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/400.rst.txt new file mode 100644 index 0000000..6c42288 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/400.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.30.editors.400 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 30: + identifier: Redirect + editors: + 400: + identifier: fragment + templateName: Inspector-Typo3WinBrowserEditor + label: formEditor.elements.Form.finisher.Redirect.editor.fragment.label + buttonLabel: formEditor.elements.Form.finisher.Redirect.editor.fragment.buttonLabel + browsableType: tt_content + iconIdentifier: mimetypes-x-content-text + propertyPath: options.fragment + description: formEditor.elements.Form.finisher.Redirect.editor.fragment.description diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/9999.rst.txt new file mode 100644 index 0000000..a8abb15 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.30.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 30: + identifier: Redirect + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/identifier.rst.txt new file mode 100644 index 0000000..1d9f595 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/30/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.30.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.30.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 30: + identifier: Redirect + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40.rst.txt new file mode 100644 index 0000000..2de95de --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.40 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/100.rst.txt new file mode 100644 index 0000000..c7ce719 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.40.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 40: + identifier: DeleteUploads + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.DeleteUploads.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/9999.rst.txt new file mode 100644 index 0000000..e5e2082 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.40.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.40.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 40: + identifier: DeleteUploads + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/identifier.rst.txt new file mode 100644 index 0000000..69cf82a --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/40/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.40.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 40: + identifier: DeleteUploads + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50.rst.txt new file mode 100644 index 0000000..cc517c6 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.50 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.50 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 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 + iconIdentifier: mimetypes-x-content-text + 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 + description: formEditor.elements.Form.finisher.Confirmation.editor.message.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/100.rst.txt new file mode 100644 index 0000000..ce26db5 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.50.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.50.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 50: + identifier: Confirmation + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.Confirmation.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/200.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/200.rst.txt new file mode 100644 index 0000000..83aba2e --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/200.rst.txt @@ -0,0 +1,42 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.50.editors.200 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.50.editors.200 + +:aspect:`Data type` + array/ :ref:`[Typo3WinBrowserEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 50: + identifier: Confirmation + editors: + 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 + iconIdentifier: mimetypes-x-content-text + propertyPath: options.contentElementUid + propertyValidatorsMode: OR + propertyValidators: + 10: IntegerOrEmpty + 20: FormElementIdentifierWithinCurlyBracesExclusive + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/300.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/300.rst.txt new file mode 100644 index 0000000..f3bc93d --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/300.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.50.editors.300 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.50.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextareaEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 50: + identifier: Confirmation + editors: + 300: + identifier: message + templateName: Inspector-TextareaEditor + label: formEditor.elements.Form.finisher.Confirmation.editor.message.label + propertyPath: options.message + description: formEditor.elements.Form.finisher.Confirmation.editor.message.description + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/9999.rst.txt new file mode 100644 index 0000000..d80cbd7 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.50.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.50.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 50: + identifier: Confirmation + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/identifier.rst.txt new file mode 100644 index 0000000..02099ba --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/50/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.50.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.50.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 50: + identifier: Confirmation + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60.rst.txt new file mode 100644 index 0000000..3b186e7 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.60 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/100.rst.txt new file mode 100644 index 0000000..52a835e --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.60.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 60: + identifier: Closure + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.Closure.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/9999.rst.txt new file mode 100644 index 0000000..d955f67 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.60.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.60.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 60: + identifier: Closure + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/identifier.rst.txt new file mode 100644 index 0000000..0c190ac --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/60/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.60.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 60: + identifier: Closure + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70.rst.txt new file mode 100644 index 0000000..b8ff527 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.70 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/100.rst.txt new file mode 100644 index 0000000..b56f535 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.70.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 70: + identifier: FlashMessage + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.FlashMessage.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/9999.rst.txt new file mode 100644 index 0000000..2a3f1b5 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.70.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 70: + identifier: FlashMessage + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/identifier.rst.txt new file mode 100644 index 0000000..8a8d0c1 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/70/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.70.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 70: + identifier: FlashMessage + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80.rst.txt new file mode 100644 index 0000000..bf88a2e --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.80 +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Form: + formEditor: + propertyCollections: + finishers: + 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 + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/100.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/100.rst.txt new file mode 100644 index 0000000..4f0cfe9 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.80.editors.100 +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 80: + identifier: SaveToDatabase + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.Form.finisher.SaveToDatabase.editor.header.label + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/9999.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/9999.rst.txt new file mode 100644 index 0000000..1b0a992 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.finishers.80.editors.9999 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.80.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Form: + formEditor: + propertyCollections: + finishers: + 80: + identifier: SaveToDatabase + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/identifier.rst.txt b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/identifier.rst.txt new file mode 100644 index 0000000..7b26f07 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/propertyCollections/finishers/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.finishers.80.identifier +------------------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.propertyCollections.finishers.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Form: + formEditor: + propertyCollections: + finishers: + 80: + identifier: SaveToDatabase + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageMessage.rst.txt b/Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageMessage.rst.txt new file mode 100644 index 0000000..772bdf7 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageMessage.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.saveErrorFlashMessageMessage +--------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.saveErrorFlashMessageMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + saveErrorFlashMessageMessage: formEditor.elements.Form.saveErrorFlashMessageMessage + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageTitle.rst.txt new file mode 100644 index 0000000..13f96ed --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/saveErrorFlashMessageTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.saveErrorFlashMessageTitle +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.saveErrorFlashMessageTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + saveErrorFlashMessageTitle: formEditor.elements.Form.saveErrorFlashMessageTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageMessage.rst.txt b/Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageMessage.rst.txt new file mode 100644 index 0000000..8973f75 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageMessage.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.saveSuccessFlashMessageMessage +----------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.saveSuccessFlashMessageMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + saveSuccessFlashMessageMessage: formEditor.elements.Form.saveSuccessFlashMessageMessage + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageTitle.rst.txt b/Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageTitle.rst.txt new file mode 100644 index 0000000..7dd43b0 --- /dev/null +++ b/Documentation/I/Config/proto/form/formEditor/saveSuccessFlashMessageTitle.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.saveSuccessFlashMessageTitle +--------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.formEditor.saveSuccessFlashMessageTitle + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Form: + formEditor: + saveSuccessFlashMessageTitle: formEditor.elements.Form.saveSuccessFlashMessageTitle + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Internal setting. diff --git a/Documentation/I/Config/proto/form/renderingOptions/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..666deff --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/_isCompositeFormElement.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions._isCompositeFormElement +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 17 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/form/renderingOptions/_isTopLevelFormElement.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/_isTopLevelFormElement.rst.txt new file mode 100644 index 0000000..ed1cff1 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/_isTopLevelFormElement.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions._isTopLevelFormElement +--------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions._isTopLevelFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 18 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element must not have a parent form element. diff --git a/Documentation/I/Config/proto/form/renderingOptions/addQueryString.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/addQueryString.rst.txt new file mode 100644 index 0000000..81cae91 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/addQueryString.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.addQueryString +------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.addQueryString + +:aspect:`Data type` + bool/string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 11 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Corresponds to the Fluid ``f:form`` ViewHelper option ``addQueryString``. diff --git a/Documentation/I/Config/proto/form/renderingOptions/additionalParams.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/additionalParams.rst.txt new file mode 100644 index 0000000..a4bee38 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/additionalParams.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.additionalParams +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.additionalParams + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 13 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Fluid f:form viewHelper option ``additionalParams``. diff --git a/Documentation/I/Config/proto/form/renderingOptions/argumentsToBeExcludedFromQueryString.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/argumentsToBeExcludedFromQueryString.rst.txt new file mode 100644 index 0000000..a9794e9 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/argumentsToBeExcludedFromQueryString.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.argumentsToBeExcludedFromQueryString +----------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.argumentsToBeExcludedFromQueryString + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 12 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Fluid f:form viewHelper option ``argumentsToBeExcludedFromQueryString``. diff --git a/Documentation/I/Config/proto/form/renderingOptions/controllerAction.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/controllerAction.rst.txt new file mode 100644 index 0000000..b167476 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/controllerAction.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.controllerAction +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.controllerAction + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 14 + + Form: + 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 + +:aspect:`Good to know` + - :ref:`"Render within your own Extbase extension"` + +:aspect:`Description` + Fluid f:form ViewHelper option ``action``. This is useful if you want to render your form within your own extbase extension. diff --git a/Documentation/I/Config/proto/form/renderingOptions/fluidAdditionalAttributes.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/fluidAdditionalAttributes.rst.txt new file mode 100644 index 0000000..be3f1c6 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/fluidAdditionalAttributes.rst.txt @@ -0,0 +1,22 @@ +.. include:: /Includes.rst.txt + +renderingOptions.fluidAdditionalAttributes +------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.fluidAdditionalAttributes + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Good to know` + - :ref:`"Translate form definition"` + +:aspect:`Description` + The values within this array are directly used within the form element ViewHelper's property ``additionalAttributes``. diff --git a/Documentation/I/Config/proto/form/renderingOptions/honeypot/enable.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/honeypot/enable.rst.txt new file mode 100644 index 0000000..88e6b3a --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/honeypot/enable.rst.txt @@ -0,0 +1,90 @@ +.. include:: /Includes.rst.txt +renderingOptions.honeypot.enable +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.honeypot.enable + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 20 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Enable or disable the honeypot feature. + +.. attention:: + + If you want to use a (static) site caching - for example EXT:staticfilecache - + you should disable the automatic inclusion of the honeypot. + + Within your form definition: + + .. code-block:: yaml + + type: Form + identifier: fooForm + label: 'foo' + renderingOptions: + honeypot: + enable: false + renderables: + ... + + Within your form setup: + + .. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + honeypot: + enable: false + + See forge issue `#83212 `_ for more + information. diff --git a/Documentation/I/Config/proto/form/renderingOptions/honeypot/formElementToUse.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/honeypot/formElementToUse.rst.txt new file mode 100644 index 0000000..0f50534 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/honeypot/formElementToUse.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.honeypot.formElementToUse +------------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.honeypot.formElementToUse + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 21 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Define which ```` should be used to render the honeypot. diff --git a/Documentation/I/Config/proto/form/renderingOptions/httpEnctype.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/httpEnctype.rst.txt new file mode 100644 index 0000000..66f7a98 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/httpEnctype.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.httpEnctype +---------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.httpEnctype + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 16 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Fluid f:form viewHelper option ``enctype``. diff --git a/Documentation/I/Config/proto/form/renderingOptions/httpMethod.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/httpMethod.rst.txt new file mode 100644 index 0000000..03f6350 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/httpMethod.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.httpMethod +--------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.httpMethod + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 15 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Fluid f:form viewHelper option ``method``. diff --git a/Documentation/I/Config/proto/form/renderingOptions/layoutRootPaths.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/layoutRootPaths.rst.txt new file mode 100644 index 0000000..c7b8786 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/layoutRootPaths.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.layoutRootPaths +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.layoutRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 9-10 + + Form: + 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 + +:aspect:`Good to know` + - :ref:`"Custom templates"` + +:aspect:`Description` + Please read the section :ref:`layoutRootPaths`. diff --git a/Documentation/I/Config/proto/form/renderingOptions/partialRootPaths.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/partialRootPaths.rst.txt new file mode 100644 index 0000000..9b2a7c8 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/partialRootPaths.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.partialRootPaths +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.partialRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 7-8 + + Form: + 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 + +:aspect:`Good to know` + - :ref:`"Custom templates"` + +:aspect:`partialRootPaths` + Please read the section :ref:`templateRootPaths`. diff --git a/Documentation/I/Config/proto/form/renderingOptions/skipUnknownElements.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/skipUnknownElements.rst.txt new file mode 100644 index 0000000..640ce2e --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/skipUnknownElements.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.skipUnknownElements +------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.skipUnknownElements + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 23 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + If set, every unknown ```` will not be rendered. If set to false an exception will be thrown. diff --git a/Documentation/I/Config/proto/form/renderingOptions/submitButtonLabel.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/submitButtonLabel.rst.txt new file mode 100644 index 0000000..7e89b50 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/submitButtonLabel.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.submitButtonLabel +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.submitButtonLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 22 + + Form: + 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 + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + The submit Button label. diff --git a/Documentation/I/Config/proto/form/renderingOptions/templateRootPaths.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/templateRootPaths.rst.txt new file mode 100644 index 0000000..2c4275b --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/templateRootPaths.rst.txt @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt +renderingOptions.templateRootPaths +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.templateRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5-6 + + Form: + 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 + +:aspect:`Good to know` + - :ref:`"Custom templates"` + +:aspect:`Description` + Please read the section :ref:`templateRootPaths`. diff --git a/Documentation/I/Config/proto/form/renderingOptions/translation/translationFiles.rst.txt b/Documentation/I/Config/proto/form/renderingOptions/translation/translationFiles.rst.txt new file mode 100644 index 0000000..1dad0d3 --- /dev/null +++ b/Documentation/I/Config/proto/form/renderingOptions/translation/translationFiles.rst.txt @@ -0,0 +1,58 @@ +.. include:: /Includes.rst.txt +renderingOptions.translation.translationFiles +--------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Form.renderingOptions.translation.translationFiles + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Form: + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Filesystem path(s) to translation files which should be searched for form element property translations. + If ``translationFiles`` is undefined, - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Form.renderingOptions.translation.translationFiles" ` will be used. diff --git a/Documentation/I/Config/proto/formEditor/Index.rst b/Documentation/I/Config/proto/formEditor/Index.rst new file mode 100644 index 0000000..a8939eb --- /dev/null +++ b/Documentation/I/Config/proto/formEditor/Index.rst @@ -0,0 +1,710 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formeditor: + +============ +[formEditor] +============ + + +.. _prototypes.prototypeIdentifier.formeditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formeditor.translationfiles: + +translationFiles +---------------- + +:aspect:`Option path` + prototypes..formeditor.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + formEditor: + translationFiles: + 10: 'EXT:form/Resources/Private/Language/Database.xlf' + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Filesystem path(s) to translation files which should be searched for form editor translations. + + +.. _prototypes.prototypeIdentifier.formeditor.dynamicjavascriptmodules.app: + +dynamicJavaScriptModules.app +---------------------------- + +:aspect:`Option path` + prototypes..formeditor.dynamicJavaScriptModules.app + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + formEditor: + dynamicJavaScriptModules: + app: TYPO3/CMS/Form/Backend/FormEditor + mediator: TYPO3/CMS/Form/Backend/FormEditor/Mediator + viewModel: TYPO3/CMS/Form/Backend/FormEditor/ViewModel + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + ES6 module specifier for the form editor JavaScript app. + + +.. _prototypes.prototypeIdentifier.formeditor.dynamicjavascriptmodules.mediator: + +dynamicJavaScriptModules.mediator +--------------------------------- + +:aspect:`Option path` + prototypes..formeditor.dynamicJavaScriptModules.mediator + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + formEditor: + dynamicJavaScriptModules: + app: TYPO3/CMS/Form/Backend/FormEditor + mediator: TYPO3/CMS/Form/Backend/FormEditor/Mediator + viewModel: TYPO3/CMS/Form/Backend/FormEditor/ViewModel + + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + ES6 module specifier for the form editor JavaScript mediator. + + +.. _prototypes.prototypeIdentifier.formeditor.dynamicjavascriptmodules.viewmodel: + +dynamicJavaScriptModules.viewModel +---------------------------------- + +:aspect:`Option path` + prototypes..formeditor.dynamicJavaScriptModules.viewModel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + formEditor: + dynamicJavaScriptModules: + app: TYPO3/CMS/Form/Backend/FormEditor + mediator: TYPO3/CMS/Form/Backend/FormEditor/Mediator + viewModel: TYPO3/CMS/Form/Backend/FormEditor/ViewModel + + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + ES6 module specifier for the form editor JavaScript view model. + + +.. _prototypes.prototypeIdentifier.formeditor.dynamicjavascriptmodules.additionalviewmodelmodules: + +dynamicJavaScriptModules.additionalViewModelModules +--------------------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.dynamicJavaScriptModules.additionalViewModelModules + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (prototype 'standard')` + undefined + +:aspect:`Good to know` + - :ref:`"Form editor"` + - :ref:`"Register custom JavaScript modules"` + +:aspect:`Description` + Array with ES6 module specifiers for custom JavaScript modules. + + +.. _prototypes.prototypeIdentifier.formeditor.addinlinesettings: + +addInlineSettings +----------------- + +:aspect:`Option path` + prototypes..formeditor.addInlineSettings + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (prototype 'standard')` + undefined + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + Adds Javascript Inline Setting. This will occur in TYPO3.settings - object. + + +.. _prototypes.prototypeIdentifier.formeditor.maximumundosteps: + +maximumUndoSteps +---------------- + +:aspect:`Option path` + prototypes..formeditor.maximumUndoSteps + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + formEditor: + maximumUndoSteps: 10 + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + Define the maximum possible undo steps within the form editor. + + +.. _prototypes.prototypeIdentifier.formeditor.stylesheets: + +stylesheets +----------- + +:aspect:`Option path` + prototypes..formeditor.stylesheets + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + formEditor: + stylesheets: + 200: 'EXT:form/Resources/Public/Css/form.css' + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + The CSS files to be used by the ``form editor``. + + +.. _prototypes.prototypeIdentifier.formeditor.formeditorfluidconfiguration: + +formEditorFluidConfiguration +---------------------------- + +:aspect:`Option path` + prototypes..formeditor.formEditorFluidConfiguration + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + formEditor: + formEditorFluidConfiguration: + templatePathAndFilename: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Partials/FormEditor/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Layouts/FormEditor/' + +:aspect:`Good to know` + - :ref:`"Form editor"` + - :ref:`"view/inspector/editor/insert/perform"` + +:aspect:`Description` + Basic fluid template search path configurations. + + +.. _prototypes.prototypeIdentifier.formeditor.formeditorfluidconfiguration.templatepathandfilename: + +formEditorFluidConfiguration.templatePathAndFilename +---------------------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.formEditorFluidConfiguration.templatePathAndFilename + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + formEditor: + formEditorFluidConfiguration: + templatePathAndFilename: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Partials/FormEditor/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Layouts/FormEditor/' + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + Internal setting. Template which render the inline HTML templates which are used by the form editor JavaScript. + + +.. _prototypes.prototypeIdentifier.formeditor.formeditorfluidconfiguration.partialrootpaths: + +formEditorFluidConfiguration.partialRootPaths +--------------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.formEditorFluidConfiguration.partialRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4-5 + + formEditor: + formEditorFluidConfiguration: + templatePathAndFilename: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Partials/FormEditor/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Layouts/FormEditor/' + +:aspect:`Good to know` + - :ref:`"Form editor"` + - :ref:`"view/inspector/editor/insert/perform"` + +:aspect:`Description` + Array with fluid partial search paths for the inline HTML templates which are used by the form editor JavaScript. + + +.. _prototypes.prototypeIdentifier.formeditor.formeditorfluidconfiguration.layoutrootpaths: + +formEditorFluidConfiguration.layoutRootPaths +-------------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.formEditorFluidConfiguration.layoutRootPaths + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6-7 + + formEditor: + formEditorFluidConfiguration: + templatePathAndFilename: 'EXT:form/Resources/Private/Backend/Templates/FormEditor/InlineTemplates.fluid.html' + partialRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Partials/FormEditor/' + layoutRootPaths: + 10: 'EXT:form/Resources/Private/Backend/Layouts/FormEditor/' + +:aspect:`Good to know` + - :ref:`"Form editor"` + - :ref:`"view/inspector/editor/insert/perform"` + +:aspect:`Description` + Internal setting. Array with fluid layout search paths. + + +.. _prototypes.prototypeIdentifier.formeditor.formeditorpartials: + +formEditorPartials +------------------ + +:aspect:`Option path` + prototypes..formeditor.formEditorPartials + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + formEditor: + formEditorPartials: + Modal-InsertElements: Modals/InsertElements + Modal-InsertPages: Modals/InsertPages + Modal-ValidationErrors: Modals/ValidationErrors + 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 + +:aspect:`Good to know` + - :ref:`"Form editor"` + - :ref:`"Common Abstract view formelement templates"` + - :ref:`"available inspector editors"` + - :ref:`"view/inspector/editor/insert/perform"` + +:aspect:`Description` + Array with mappings for the inline HTML templates. The keys are identifiers which could be used within the JavaScript code. The values are partial paths, relative to :ref:`"prototypes.prototypeIdentifier.formeditor.formEditorFluidConfiguration.partialRootPaths"`. + The partials content will be rendered as inline HTML. This inline HTML templates can be identified and used by such a key (e.g. "Inspector-TextEditor") within the JavaScript code. + + +.. _prototypes.prototypeIdentifier.formeditor.formelementpropertyvalidatorsdefinition: + +formElementPropertyValidatorsDefinition +--------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.formElementPropertyValidatorsDefinition + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + formEditor: + 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 + RegularExpressionPattern: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.RegularExpressionPattern.label + ItemCount: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.ItemCount.label + IntegerList: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.IntegerList.label + +:aspect:`Related options` + - :ref:`"[TextEditor] propertyValidators"` + - :ref:`"[Typo3WinBrowserEditor] propertyValidators"` + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + Some inspector editors are able to validate it's values through a JavaScript methods. + ``formElementPropertyValidatorsDefinition`` define basic configurations for such JavaScript validators. + This JavaScript validators can be registered through ``getFormEditorApp().addPropertyValidationValidator()``. The first method argument is the identifier + for this validator. Every array key within ``formElementPropertyValidatorsDefinition`` must be equal to such an identifier. + + +.. _prototypes.prototypeIdentifier.formeditor.formelementpropertyvalidatorsdefinition..errormessage: + +formElementPropertyValidatorsDefinition..errorMessage +--------------------------------------------------------------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.formElementPropertyValidatorsDefinition..errorMessage + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4, 6, 8, 10, 12, 14 + + formEditor: + 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 + RegularExpressionPattern: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.RegularExpressionPattern.label + ItemCount: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.ItemCount.label + IntegerList: + errorMessage: formEditor.formElementPropertyValidatorsDefinition.IntegerList.label + +:aspect:`Related options` + - :ref:`"[TextEditor] propertyValidators"` + - :ref:`"[Typo3WinBrowserEditor] propertyValidators"` + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + The error message for an inspector editor property validator which is shown if the validation fails. + + +.. _prototypes.prototypeIdentifier.formeditor.formelementgroups: + +formElementGroups +----------------- + +:aspect:`Option path` + prototypes..formeditor.formElementGroups + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + formEditor: + 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 + +:aspect:`Related options` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.AdvancedPassword.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Checkbox.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.ContentElement.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Date.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Email.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Fieldset.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.FileUpload.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.GridRow.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Hidden.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.ImageUpload.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.MultiCheckbox.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.MultiSelect.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Number.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Page.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Password.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.RadioButton.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.SingleSelect.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.StaticText.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.SummaryPage.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Telephone.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Text.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Textarea.formEditor.group"` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Url.formEditor.group"` + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + Every form element can be placed within a group within the ``form editor`` "new Element" modal. + Every form element which should be shown within such a group, must have a ``group`` property. The form element ``group`` property value + must be equal to an array key within ``formElementGroups``. + + +.. _prototypes.prototypeIdentifier.formeditor.formelementgroups..label: + +formElementGroups..label +---------------------------------------------------- + +:aspect:`Option path` + prototypes..formeditor.formElementGroups..label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4, 6, 8, 10, 12 + + formEditor: + formElementGroups: + input: + label: formEditor.formElementGroups.input.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 + +:aspect:`Good to know` + - :ref:`"Form editor"` + +:aspect:`Description` + The label for a group within the ``form editor`` "new Element" modal. diff --git a/Documentation/I/Config/proto/formElements/Index.rst b/Documentation/I/Config/proto/formElements/Index.rst new file mode 100644 index 0000000..66239b8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/Index.rst @@ -0,0 +1,828 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition: + +======================== +[formElementsDefinition] +======================== + + +.. _prototypes.prototypeIdentifier.formelementsdefinition-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition-properties.formelementsdefinition: + +[formElementsDefinition] +------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + prototypes: + : + formElementsDefinition: + [...] + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + +:aspect:`Description` + Array which defines the available form elements. Every key within this array is called the ````. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier: + + +--------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition. + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + + prototypes: + standard: + Form: + [...] + Page: + [...] + SummaryPage: + [...] + Fieldset: + [...] + GridRow: + [...] + Text: + [...] + Password: + [...] + AdvancedPassword: + [...] + Textarea: + [...] + Honeypot: + [...] + Hidden: + [...] + Email: + [...] + Telephone: + [...] + Url: + [...] + Number: + [...] + Date: + [...] + Checkbox: + [...] + MultiCheckbox: + [...] + MultiSelect: + [...] + RadioButton: + [...] + SingleSelect: + [...] + StaticText: + [...] + ContentElement: + [...] + FileUpload: + [...] + ImageUpload: + [...] + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + +:aspect:`Description` + This array key identifies a form element. This identifier could be used to attach a form element to a form. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier-commonproperties: + +Common properties +============================================= + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.defaultValue: + +defaultValue +------------ + +:aspect:`Option path` + prototypes..formElementsDefinition..defaultValue + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + undefined + +:aspect:`Description` + If set this string/ array will be used as default value of the form + element. Array is in place for multi value elements (e.g. the + ``MultiSelect`` form element). + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.implementationclassname: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + +:aspect:`Description` + Classname which implements the form element. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.renderingoptions.translation.translationfiles: + +renderingOptions.translation.translationFiles +--------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..renderingOptions.translation.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Filesystem path(s) to translation files which should be searched for form element property translations. + If ``translationFiles`` is undefined, - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.Form.renderingOptions.translation.translationFiles"` will be used. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.renderingOptions.translation.translatePropertyValueIfEmpty: + +renderingOptions.translation.translatePropertyValueIfEmpty +---------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..renderingoptions.translation.translatepropertyvalueifempty + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + true + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + If set to ``false``, the form element property translation will be skipped if the form element property value is empty. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.renderingoptions.templatename: + +renderingOptions.templateName +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..renderingOptions.templateName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + (see :ref:`concrete element configuration `) + +:aspect:`Default value` + undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"templateName"` + +:aspect:`Description` + Set ``templateName`` to define a custom template name which should be used instead of the ````. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.properties: + +properties +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition..properties + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Array with form element specific properties. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.properties.elementDescription: + +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.properties.fluidadditionalattributes: + +properties.fluidAdditionalAttributes +------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition..properties.fluidAdditionalAttributes + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + The values within this array are directly used within the form element ViewHelper's property ``additionalAttributes``. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.properties.gridcolumnclassautoconfiguration: + +properties.gridColumnClassAutoConfiguration +------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..properties.gridColumnClassAutoConfiguration + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Undefined + +:aspect:`Related options` + - :ref:`"GridRow viewPorts"` + +:aspect:`Description` + If the form element lies within a GridRow you can define the number of columns which the form element should occupy. + Each ``viewPorts`` configuration key has to match with on ofe the defined viewports within ``prototypes..formElementsDefinition.GridRow.properties.gridColumnClassAutoConfiguration.viewPorts`` + + .. code-block:: yaml + :linenos: + + gridColumnClassAutoConfiguration: + viewPorts: + lg: + numbersOfColumnsToUse: '2' + md: + numbersOfColumnsToUse: '3' + sm: + numbersOfColumnsToUse: '4' + xs: + numbersOfColumnsToUse: '5' + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.label: + +label +----- + +:aspect:`Option path` + prototypes..formElementsDefinition..label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + The label of the form element. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor: + +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No (but recommended) + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Array with configurations for the ``form editor`` + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections: + +formEditor.propertyCollections +------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Array with configurations for ``property collections`` for the form element. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections.validators: + +formEditor.propertyCollections.validators +----------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections.validators + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Array with configurations for available validators for a form element. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections.validators.*.identifier: + +formEditor.propertyCollections.validators.[*].identifier +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections.validators.[*].identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections.validators.*.editors: + +formEditor.propertyCollections.validators.[*].editors +----------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections.validators.[*].editors + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Array with available ``inspector editors`` for this validator. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections.finishers: + +formEditor.propertyCollections.finishers +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections.finishers + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Array with configurations for available finisher for a form definition. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections.finishers.*.identifier: + +formEditor.propertyCollections.finishers.[*].identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections.finishers.[*].identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the finisher which should be attached to the form definition. Must be equal to an existing ````. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.propertycollections.finishers.*.editors: + +formEditor.propertyCollections.finishers.[*].editors +---------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.propertyCollections.finishers.[*].editors + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Array with available ``inspector editors`` for this finisher. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.group: + +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formElementGroups ` + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.groupsorting: + +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formEditor.editors-tree: + +formEditor.editors +------------------ + +.. toctree:: + + formEditor/Index + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier-concreteconfigurations: + +Concrete configurations +======================= + +.. toctree:: + + formElementTypes/AdvancedPassword + formElementTypes/Checkbox + formElementTypes/ContentElement + formElementTypes/Date + formElementTypes/Email + formElementTypes/Fieldset + formElementTypes/FileUpload + formElementTypes/GridRow + formElementTypes/Hidden + formElementTypes/Honeypot + formElementTypes/ImageUpload + formElementTypes/MultiCheckbox + formElementTypes/MultiSelect + formElementTypes/Number + formElementTypes/Page + formElementTypes/Password + formElementTypes/RadioButton + formElementTypes/SingleSelect + formElementTypes/StaticText + formElementTypes/SummaryPage + formElementTypes/Telephone + formElementTypes/Text + formElementTypes/Textarea + formElementTypes/Url diff --git a/Documentation/I/Config/proto/formElements/formEditor/Index.rst b/Documentation/I/Config/proto/formElements/formEditor/Index.rst new file mode 100644 index 0000000..40bd317 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/Index.rst @@ -0,0 +1,111 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors: + +================================================== +[][formEditor][editors] +================================================== + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors-properties-editors: + +.formEditor.editors +---------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.editors + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Array with numerical keys. Each arrayitem describes an ``inspector editor`` which is used to write values into a form element property. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*-commonproperties: + +Common [][formEditor][editors][*] properties +======================================================================= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier: +.. include:: inspectorEditors/properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename: + +templateName +------------ + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.editors.*.templateName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: inspectorEditors/properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label: +.. include:: inspectorEditors/properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath: +.. include:: inspectorEditors/properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formEditor.editors-availableinspectoreditors: + +available inspector editors +--------------------------- + +.. toctree:: + + inspectorEditors/CheckboxEditor + inspectorEditors/CollectionElementHeaderEditor + inspectorEditors/FinishersEditor + inspectorEditors/FormElementHeaderEditor + inspectorEditors/GridColumnViewPortConfigurationEditor + inspectorEditors/MultiSelectEditor + inspectorEditors/PropertyGridEditor + inspectorEditors/RemoveElementEditor + inspectorEditors/RequiredValidatorEditor + inspectorEditors/SingleSelectEditor + inspectorEditors/TextareaEditor + inspectorEditors/TextEditor + inspectorEditors/Typo3WinBrowserEditor + inspectorEditors/ValidatorsEditor + inspectorEditors/ValidationErrorMessageEditor diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CheckboxEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CheckboxEditor.rst new file mode 100644 index 0000000..3a8a499 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CheckboxEditor.rst @@ -0,0 +1,60 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.checkboxeditor: + +================ +[CheckboxEditor] +================ + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.checkboxeditor-introduction: + +Introduction +============ + +Shows a checkbox which write 'true' or 'false' within the form definition for a form element property. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.checkboxeditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-checkboxeditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.\.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-CheckboxEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-checkboxeditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-checkboxeditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-checkboxeditor: +.. include:: properties/PropertyPath.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CollectionElementHeaderEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CollectionElementHeaderEditor.rst new file mode 100644 index 0000000..10e47c6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/CollectionElementHeaderEditor.rst @@ -0,0 +1,57 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.collectionelementheadereditor: + +=============================== +[CollectionElementHeaderEditor] +=============================== + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.collectionelementheadereditor-introduction: + +Introduction +============ + +This is not really an editor because this editor don't write values into the form definition. +This editor show the header area for collection elements (finishers/ validators) with it's icon and label. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.collectionelementheadereditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templateName-collectionelementheadereditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.\.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-CollectionElementHeaderEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-collectionelementheadereditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-collectionelementheadereditor: +.. include:: properties/Label.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FinishersEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FinishersEditor.rst new file mode 100644 index 0000000..8954657 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FinishersEditor.rst @@ -0,0 +1,105 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.finisherseditor: + +================= +[FinishersEditor] +================= + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.finisherseditor-introduction: + +Introduction +============ + +Shows a select list with finishers. If a finisher is already added to the form definition, then this finisher will be removed from the select list. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.finisherseditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-finisherseditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-FinishersEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-finisherseditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-finisherseditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.value-finisherseditor: + +selectOptions.[*].value +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`"[finishersDefinition]"` + + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Has to match with a ``prototypes..finishersdefinition`` configuration key. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.label-finisherseditor: + +selectOptions.[*].label +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label which is shown within the select field. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FormElementHeaderEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FormElementHeaderEditor.rst new file mode 100644 index 0000000..915e245 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/FormElementHeaderEditor.rst @@ -0,0 +1,53 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.formelementheadereditor: + +========================= +[FormElementHeaderEditor] +========================= + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.formelementheadereditor-introduction: + +Introduction +============ + +This is not really an editor because this editor don't write values into the form definition. +This editor show the header area for the form element with it's icon and label. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.formelementheadereditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-formelementheadereditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.\.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-FormElementHeaderEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-formelementheadereditor: +.. include:: properties/Identifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/GridColumnViewPortConfigurationEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/GridColumnViewPortConfigurationEditor.rst new file mode 100644 index 0000000..1e05a28 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/GridColumnViewPortConfigurationEditor.rst @@ -0,0 +1,175 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.gridcolumnviewportconfigurationeditor: + +======================================= +[GridColumnViewPortConfigurationEditor] +======================================= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.gridcolumnviewportconfigurationeditor-introduction: + +Introduction +============ + +Shows a viewport selector as buttons and an input field. With this editor, you can define how many columns per viewPort an form element should occupy. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.gridcolumnviewportconfigurationeditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templateName-gridcolumnviewportconfigurationeditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.\.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-GridColumnViewPortConfigurationEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-gridcolumnviewportconfigurationeditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-gridcolumnviewportconfigurationeditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.configurationOptions.viewPorts.*.viewPortIdentifier-gridcolumnviewportconfigurationeditor: + +configurationOptions.viewPorts.[*].viewPortIdentifier +----------------------------------------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`"properties.gridColumnClassAutoConfiguration"` + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Has to match with a ``prototypes..formElementsDefinition..properties.gridColumnClassAutoConfiguration.viewPorts`` configuration key. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.configurationOptions.viewPorts.*.label-gridcolumnviewportconfigurationeditor: + +configurationOptions.viewPorts.[*].label +---------------------------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the viewport button. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.configurationOptions.numbersOfColumnsToUse.label-gridcolumnviewportconfigurationeditor: + +configurationOptions.numbersOfColumnsToUse.label +------------------------------------------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the "Numbers of columns" input field. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.configurationOptions.numbersOfColumnsToUse.propertyPath-gridcolumnviewportconfigurationeditor: + +configurationOptions.numbersOfColumnsToUse.propertyPath +------------------------------------------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The path to the property of the form element which should be written. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.configurationOptions.numbersOfColumnsToUse.description-gridcolumnviewportconfigurationeditor: + +configurationOptions.numbersOfColumnsToUse.description +--------------------------------------------------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A text which is shown at the bottom of the "Numbers of columns" input field. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/MultiSelectEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/MultiSelectEditor.rst new file mode 100644 index 0000000..f7d42e5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/MultiSelectEditor.rst @@ -0,0 +1,108 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.multiselecteditor: + +=================== +[MultiSelectEditor] +=================== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.multiselecteditor-introduction: + +Introduction +============ + +Shows a multiselect list with values. If one or more selectoptions are selected, then the option value will be written within a form element property which is defined by the "propertyPath" option. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.multiselecteditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-multiselecteditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-MultiSelectEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-multiselecteditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-multiselecteditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-multiselecteditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.value-multiselecteditor: + +selectOptions.[*].value +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The value which should be written into the corresponding form elements property. + The corresponding form elements property is identified by the ``propertyPath`` option. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.label-multiselecteditor: + +selectOptions.[*].label +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label which is shown within the select field. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/PropertyGridEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/PropertyGridEditor.rst new file mode 100644 index 0000000..ae277a5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/PropertyGridEditor.rst @@ -0,0 +1,207 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertygrideditor: + +==================== +[PropertyGridEditor] +==================== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertygrideditor-introduction: + +Introduction +============ + +Shows a grid which allows you to add (and remove) multiple rows and fill values for each row. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertygrideditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-propertygrideditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-PropertyGridEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-propertygrideditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-propertygrideditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-propertygrideditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.issortable-propertygrideditor: + +isSortable +---------- + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to 'false' the rows are not sortable. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.enableaddrow-propertygrideditor: + +enableAddRow +------------ + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to 'false' the "add new row" button is disabled. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.enabledeleterow-propertygrideditor: + +enableDeleteRow +--------------- + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to 'false' the "delete row" button is disabled. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.multiselection-propertygrideditor: + +multiSelection +-------------- + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to 'false' only one row can be marked as preselected. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.removelastavailablerowflashmessagetitle-propertygrideditor: + +removeLastAvailableRowFlashMessageTitle +--------------------------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + There must be at least one existing row within this ``inspector editor``. If the last existing row is tried to be removed a flash message is shown. + This property defines the title for the flash message. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.removelastavailablerowflashmessagemessage-propertygrideditor: + +removeLastAvailableRowFlashMessageMessage +----------------------------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + There must be at least one existing row within this ``inspector editor``. If the last existing row is tried to be removed a flash message is shown. + This property defines the text for the flash message. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RemoveElementEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RemoveElementEditor.rst new file mode 100644 index 0000000..acd5a26 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RemoveElementEditor.rst @@ -0,0 +1,52 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.removeelementeditor: + +===================== +[RemoveElementEditor] +===================== + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.removeelementeditor-introduction: + +Introduction +============ + +This editor show a button which allows you to remove the form element or the collection element (finishers/ validators). + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.removeelementeditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-removeelementeditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-RemoveElementEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-removeelementeditor: +.. include:: properties/Identifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RequiredValidatorEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RequiredValidatorEditor.rst new file mode 100644 index 0000000..1b4b9f3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/RequiredValidatorEditor.rst @@ -0,0 +1,127 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.requiredvalidatoreditor: + +========================= +[RequiredValidatorEditor] +========================= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.requiredvalidatoreditor-introduction: + +Introduction +============ + +Shows a checkbox. If set, a validator ('NotEmpty' by default) will be written into the ``form definition``. In addition another property could be written into the ``form definition``. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.requiredvalidatoreditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-requiredvalidatoreditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-RequiredValidatorEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-requiredvalidatoreditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-requiredvalidatoreditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validatoridentifier-requiredvalidatoreditor: + +validatorIdentifier +------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + The ```` which should be used. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-requiredvalidatoreditor: + +propertyPath +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + An property path which should be written into the `form definition`` if the checkbox is set. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertyvalue-requiredvalidatoreditor: + +propertyValue +------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + The value for the property path which should be written into the `form definition`` if the checkbox is set. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/SingleSelectEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/SingleSelectEditor.rst new file mode 100644 index 0000000..acfbe47 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/SingleSelectEditor.rst @@ -0,0 +1,110 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.singleselecteditor: + +==================== +[SingleSelectEditor] +==================== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.singleselecteditor-introduction: + +Introduction +============ + +Shows a single select list with values. If a selectoption is selected, then the option value will be written within a form element property which is defined by the "propertyPath" option. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.singleselecteditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-singleselecteditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-SingleSelectEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-singleselecteditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-singleselecteditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-singleselecteditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.value-singleselecteditor: + +selectOptions.[*].value +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The value which should be written into the corresponding form elements property. + The corresponding form elements property is identified by the ``propertyPath`` option. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.label-singleselecteditor: + +selectOptions.[*].label +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label which is shown within the select field. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextEditor.rst new file mode 100644 index 0000000..3a66cf1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextEditor.rst @@ -0,0 +1,205 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.texteditor: + +============ +[TextEditor] +============ + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.texteditor-introduction: + +Introduction +============ + +Shows a single line textfield. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.texteditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-texteditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-TextEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-texteditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-texteditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-texteditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.donotsetifpropertyvalueisempty-texteditor: + +doNotSetIfPropertyValueIsEmpty +------------------------------ + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to true then the property which should be written through this ``inspector editor`` will be removed within the ``form definition`` if the + value from the ``inspector editor`` is empty instead of writing an empty value ('') for this property. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertyvalidators-texteditor: + +propertyValidators +------------------ + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Related options` + - :ref:`"formElementPropertyValidatorsDefinition"` + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + This ``inspector editors`` is able to validate it's value through JavaScript methods. + This JavaScript validators can be registered through ``getFormEditorApp().addPropertyValidationValidator()``. + The first method argument is the identifier for such a validator. + Every array value within ``propertyValidators`` must be equal to such an identifier. + + For example: + + .. code-block:: yaml + + propertyValidators: + 10: 'Integer' + 20: 'FormElementIdentifierWithinCurlyBracesExclusive' + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertyvalidatorsmode-texteditor: + +propertyValidatorsMode +---------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value` + AND + +:aspect:`possible values` + OR/ AND + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to 'OR' then at least one validator must be valid to accept the ``inspector editor`` value. If set to 'AND' then all validators must be valid. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.description-texteditor: + +description +-------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + A text which is shown at the bottom of the ``inspector editor``. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.additionalelementpropertypaths-texteditor: + +additionalElementPropertyPaths +------------------------------ + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + An array which holds property paths which should be written in addition to the propertyPath option. + + For example: + + .. code-block:: yaml + + additionalElementPropertyPaths: + 10: 'properties.fluidAdditionalAttributes.maxlength' diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextareaEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextareaEditor.rst new file mode 100644 index 0000000..c221cf6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/TextareaEditor.rst @@ -0,0 +1,158 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.textareaeditor: + +================ +[TextareaEditor] +================ + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.textareaeditor-introduction: + +Introduction +============ + +Shows a textarea. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.textareaeditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-textareaeditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-TextareaEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-textareaeditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-textareaeditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-textareaeditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.enablerichtext-textareaeditor: + +enableRichtext +-------------- + +:aspect:`Data type` + boolean + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + false + +:aspect:`Description` + If set to true, the textarea will be rendered as a rich text editor using CKEditor 5. + This allows for formatted text input with features like bold, italic, links, and lists. + + The RTE configuration is loaded from the global TYPO3 RTE presets defined in the + system configuration. Use the ``richtextConfiguration`` option to specify which + preset should be used. + +.. :aspect:`Example` + .. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + StaticText: + formEditor: + editors: + 100: + identifier: text + templateName: Inspector-TextareaEditor + label: formEditor.elements.StaticText.editor.text.label + propertyPath: text + enableRichtext: true + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.richtextconfiguration-textareaeditor: + +richtextConfiguration +--------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + 'form-label' + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.enablerichtext-textareaeditor` + +:aspect:`Description` + Defines which RTE preset configuration should be used when ``enableRichtext`` is true. + The preset name must correspond to a preset defined in the global TYPO3 RTE configuration. + + Common preset names include: + + - ``form-label`` - Simple formatting for labels and short texts (bold, italic, link) - default + - ``form-content`` - Extended formatting for content fields (includes lists) + - ``default`` - The default TYPO3 RTE configuration + - ``minimal`` - A minimal configuration with basic formatting + - ``full`` - A full-featured configuration with all available features + + If the specified preset does not exist, the system will fall back to the 'form-label' preset. + +.. :aspect:`Example` + .. code-block:: yaml + + prototypes: + standard: + formElementsDefinition: + Form: + formEditor: + propertyCollections: + finishers: + 50: + identifier: Confirmation + editors: + 300: + identifier: message + templateName: Inspector-TextareaEditor + label: formEditor.elements.Form.finisher.Confirmation.editor.message.label + propertyPath: options.message + enableRichtext: true + richtextConfiguration: form-label + diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/Typo3WinBrowserEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/Typo3WinBrowserEditor.rst new file mode 100644 index 0000000..b0cb2a7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/Typo3WinBrowserEditor.rst @@ -0,0 +1,278 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.typo3winbrowsereditor: + +======================= +[Typo3WinBrowserEditor] +======================= + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.typo3winbrowsereditor-introduction: + +Introduction +============ + +Shows a popup window to select records (e.g. pages or tt_content records) as you know it from within the form engine. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.typo3winbrowsereditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-typo3winbrowsereditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-Typo3WinBrowserEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-typo3winbrowsereditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-typo3winbrowsereditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-typo3winbrowsereditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.buttonlabel-typo3winbrowsereditor: + +buttonLabel +----------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + The label for the button which opens the popup window. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.browsabletype-typo3winbrowsereditor: + +browsableType +------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + The allowed selectable record types e.g 'pages' or 'tt_content'. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.iconidentifier-typo3winbrowsereditor: + +iconIdentifier +-------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + The icon to use for the button which triggers the record browser. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertyvalidators-typo3winbrowsereditor: + +propertyValidators +------------------ + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Related options` + - :ref:`"formElementPropertyValidatorsDefinition"` + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + This ``inspector editors`` is able to validate it's value through JavaScript methods. + This JavaScript validators can be registered through ``getFormEditorApp().addPropertyValidationValidator()``. + The first method argument is the identifier for such a validator. + Every array value within ``propertyValidators`` must be equal to such an identifier. + + For example: + + .. code-block:: yaml + + propertyValidators: + 10: 'IntegerList' + 20: 'FormElementIdentifierWithinCurlyBracesExclusive' + + When :ref:`minItems` + or :ref:`maxItems` + is configured, the ``ItemCount`` validator is added automatically and does + not need to be listed in ``propertyValidators``. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertyvalidatorsmode-typo3winbrowsereditor: + +propertyValidatorsMode +---------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value` + AND + +:aspect:`possible values` + OR/ AND + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + If set to 'OR' then at least one validator must be valid to accept the ``inspector editor`` value. If set to 'AND' then all validators must be valid. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.description-typo3winbrowsereditor: + +description +-------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + A text which is shown at the bottom of the ``inspector editor``. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.maxItems-typo3winbrowsereditor: + +maxItems +-------------- + +:aspect:`Data type` + integer + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Maximum number of records. Defaults to 1. When set, the number of selected + records is validated automatically through the ``ItemCount`` validator. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.minItems-typo3winbrowsereditor: + +minItems +-------------- + +:aspect:`Data type` + integer + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Minimum number of records. Defaults to 0. When set, the number of selected + records is validated automatically through the ``ItemCount`` validator. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidationErrorMessageEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidationErrorMessageEditor.rst new file mode 100644 index 0000000..0ec0c7e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidationErrorMessageEditor.rst @@ -0,0 +1,84 @@ +.. include:: /Includes.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validationerrormessageeditor: + +============================== +[ValidationErrorMessageEditor] +============================== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validationerrormessageeditor-introduction: + +Introduction +============ + +Shows a textarea. It allows the definition of custom validation error messages. Within the form editor, one can set +those error messages for all existing validators. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validationerrormessageeditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-validationerrormessageeditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-ValidationErrorMessageEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-validationerrormessageeditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-validationerrormessageeditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.propertypath-validationerrormessageeditor: +.. include:: properties/PropertyPath.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.description-validationerrormessageeditor: + +description +-------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +.. :aspect:`Related options` + @ToDo + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + A text which is shown at the bottom of the ``inspector editor``. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidatorsEditor.rst b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidatorsEditor.rst new file mode 100644 index 0000000..fb2e2ce --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/ValidatorsEditor.rst @@ -0,0 +1,104 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validatorseditor: + +================== +[ValidatorsEditor] +================== + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validatorseditor-introduction: + +Introduction +============ + +Shows a select list with validators. If a validator is already added to the form element, then this validator will be removed from the select list. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.validatorseditor-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.templatename-validatorseditor: + +templateName +------------ + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`prototypes.prototypeIdentifier.formEditor.formEditorPartials ` + +:aspect:`value` + Inspector-FinishersEditor + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + .. include:: properties/TemplateName.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.identifier-validatorseditor: +.. include:: properties/Identifier.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.label-validatorseditor: +.. include:: properties/Label.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.value-validatorseditor: + +selectOptions.[*].value +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Related options` + - :ref:`"[validatorsDefinition]"` + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Has to match with a ``prototypes..validatorsDefinition`` configuration key. + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.formelementtypeidentifier.formeditor.editors.*.selectoptions.*.label-validatorseditor: + +selectOptions.[*].label +----------------------- + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +.. :aspect:`Related options` + @ToDo + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label which is shown within the select field. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Identifier.rst.txt b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Identifier.rst.txt new file mode 100644 index 0000000..2d69d5e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Identifier.rst.txt @@ -0,0 +1,25 @@ + +identifier +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.editors.*.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + +:aspect:`Description` + Identifies the current ``inspector editor`` within the current form element. + The identifier is a text of your choice but must be unique within the optionpath ``prototypes.prototypeIdentifier.formElementsDefinition.formelementtypeidentifier.formEditor.editors``. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Label.rst.txt b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Label.rst.txt new file mode 100644 index 0000000..68f95b9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/Label.rst.txt @@ -0,0 +1,25 @@ + +label +----- + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.editors.*.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + The label for this ``inspector editor`` which is shown within the ``inspector component``. diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/PropertyPath.rst.txt b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/PropertyPath.rst.txt new file mode 100644 index 0000000..f219ebf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/PropertyPath.rst.txt @@ -0,0 +1,26 @@ + +propertyPath +------------ + +:aspect:`Option path` + prototypes..formElementsDefinition..formEditor.editors.*.propertyPath + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"JavaScript FormElement model"` + +:aspect:`Description` + The path to the property of the form element which should be written by this ``inspector editor``. + diff --git a/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/TemplateName.rst.txt b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/TemplateName.rst.txt new file mode 100644 index 0000000..2d97fe7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formEditor/inspectorEditors/properties/TemplateName.rst.txt @@ -0,0 +1,4 @@ + + +The inline HTML template which is used for this inspector editor. +Must be equal to an existing array key within ``prototypes..formEditor.formEditorPartials`` and must be started with 'Inspector-' by convention. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword.rst b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword.rst new file mode 100644 index 0000000..c2f45d4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword.rst @@ -0,0 +1,190 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword: + +================== +[AdvancedPassword] +================== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.implementationclassname: +.. include:: AdvancedPassword/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.properties.containerclassattribute: +.. include:: AdvancedPassword/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.properties.elementclassattribute: +.. include:: AdvancedPassword/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.properties.elementDescription: +.. include:: AdvancedPassword/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.properties.elementerrorclassattribute: +.. include:: AdvancedPassword/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.properties.confirmationlabel: +.. include:: AdvancedPassword/properties/confirmationLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.properties.confirmationclassattribute: +.. include:: AdvancedPassword/properties/confirmationClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor: +.. include:: AdvancedPassword/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.100: +.. include:: AdvancedPassword/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.200: +.. include:: AdvancedPassword/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.230: +.. include:: AdvancedPassword/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.300: +.. include:: AdvancedPassword/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.400: +.. include:: AdvancedPassword/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.700: +.. include:: AdvancedPassword/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.800: +.. include:: AdvancedPassword/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.900: +.. include:: AdvancedPassword/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.editors.9999: +.. include:: AdvancedPassword/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.predefineddefaults: +.. include:: AdvancedPassword/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.10: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.10.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.10.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.10.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.20: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/20.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.20.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/20/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.20.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/20/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.20.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/20/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.30: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/30.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.30.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/30/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.30.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/30/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.30.editors.200: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/30/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.30.editors.300: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/30/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.30.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/30/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.40: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.40.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.40.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.40.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/40/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.50: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/50.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.50.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/50/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.50.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/50/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.50.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/50/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.60: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.60.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.60.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.60.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/60/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.70: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.70.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.70.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.70.editors.200: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/70/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.70.editors.300: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/70/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.70.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.80: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.80.identifier: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.80.editors.100: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.80.editors.200: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.propertycollections.validators.80.editors.9999: +.. include:: AdvancedPassword/formEditor/propertyCollections/validators/80/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.label: +.. include:: AdvancedPassword/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.group: +.. include:: AdvancedPassword/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.groupsorting: +.. include:: AdvancedPassword/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.advancedpassword.formeditor.iconidentifier: +.. include:: AdvancedPassword/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor.rst.txt new file mode 100644 index 0000000..193a896 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor.rst.txt @@ -0,0 +1,241 @@ + +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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 + compatibilityPropertyPath: properties.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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.AdvancedPassword.label + group: custom + groupSorting: 500 + iconIdentifier: form-advanced-password diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..c0efeba --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ + + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..dbf1fdd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..5cae377 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ + +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..e4ae44f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/300.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 300: + identifier: confirmationLabel + templateName: Inspector-TextEditor + label: formEditor.elements.AdvancedPassword.editor.confirmationLabel.label + propertyPath: properties.confirmationLabel diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..27121c3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/400.rst.txt @@ -0,0 +1,35 @@ + + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..7635cca --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/700.rst.txt @@ -0,0 +1,49 @@ + +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..dc9b8be --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ + + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..0d3ca00 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/900.rst.txt @@ -0,0 +1,54 @@ + + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 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 + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..d9902b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/editors/9999.rst.txt @@ -0,0 +1,31 @@ + + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + AdvancedPassword: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/group.rst.txt new file mode 100644 index 0000000..d651cf3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/group.rst.txt @@ -0,0 +1,31 @@ + +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + AdvancedPassword: + formEditor: + group: custom + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..9223436 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ + +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + AdvancedPassword: + formEditor: + groupSorting: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..9fc3f72 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + AdvancedPassword: + formEditor: + iconIdentifier: form-advanced-password + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/label.rst.txt new file mode 100644 index 0000000..4556865 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/label.rst.txt @@ -0,0 +1,30 @@ + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + AdvancedPassword: + formEditor: + label: formEditor.elements.AdvancedPassword.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..1021ae1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + AdvancedPassword: + formEditor: + predefinedDefaults: + properties: + confirmationLabel: formEditor.element.AdvancedPassword.editor.confirmationLabel.predefinedDefaults + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..c476d14 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,36 @@ + + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..d9b7d9c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..fac9f0b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..552fa3e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20.rst.txt new file mode 100644 index 0000000..fb4d63e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20.rst.txt @@ -0,0 +1,36 @@ + + +formEditor.propertyCollections.validators.20 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.20 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/100.rst.txt new file mode 100644 index 0000000..9baa68b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.20.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.20.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/9999.rst.txt new file mode 100644 index 0000000..04872be --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.20.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.20.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/identifier.rst.txt new file mode 100644 index 0000000..3e68505 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/20/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.20.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.20.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30.rst.txt new file mode 100644 index 0000000..5e14e8a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30.rst.txt @@ -0,0 +1,54 @@ + + +formEditor.propertyCollections.validators.30 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.30 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/100.rst.txt new file mode 100644 index 0000000..6a322f1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.30.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.30.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/200.rst.txt new file mode 100644 index 0000000..cfd4121 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/200.rst.txt @@ -0,0 +1,38 @@ + + +formEditor.propertyCollections.validators.30.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.30.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.minlength diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/300.rst.txt new file mode 100644 index 0000000..5d87845 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/300.rst.txt @@ -0,0 +1,38 @@ + + +formEditor.propertyCollections.validators.30.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.30.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.maxlength diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/9999.rst.txt new file mode 100644 index 0000000..b2816f8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.30.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.30.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/identifier.rst.txt new file mode 100644 index 0000000..2bb529b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/30/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.30.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.30.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40.rst.txt new file mode 100644 index 0000000..2d6c477 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40.rst.txt @@ -0,0 +1,36 @@ + + +formEditor.propertyCollections.validators.40 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/100.rst.txt new file mode 100644 index 0000000..5627a6a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.40.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/9999.rst.txt new file mode 100644 index 0000000..fb52af7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.40.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.40.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/identifier.rst.txt new file mode 100644 index 0000000..ca5d3cf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/40/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.40.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50.rst.txt new file mode 100644 index 0000000..13d04c1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50.rst.txt @@ -0,0 +1,36 @@ + + +formEditor.propertyCollections.validators.50 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.50 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/100.rst.txt new file mode 100644 index 0000000..86dc3a7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.50.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.50.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/9999.rst.txt new file mode 100644 index 0000000..a10dd54 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.50.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.50.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/identifier.rst.txt new file mode 100644 index 0000000..e9e8727 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/50/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.50.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.50.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60.rst.txt new file mode 100644 index 0000000..6de4730 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60.rst.txt @@ -0,0 +1,36 @@ + + +formEditor.propertyCollections.validators.60 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/100.rst.txt new file mode 100644 index 0000000..3c757db --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.60.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/9999.rst.txt new file mode 100644 index 0000000..c02b7c1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.60.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.60.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/identifier.rst.txt new file mode 100644 index 0000000..13721b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/60/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.60.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70.rst.txt new file mode 100644 index 0000000..4db55a1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70.rst.txt @@ -0,0 +1,54 @@ + + +formEditor.propertyCollections.validators.70 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/100.rst.txt new file mode 100644 index 0000000..0ae15e0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.70.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/200.rst.txt new file mode 100644 index 0000000..5effaea --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/200.rst.txt @@ -0,0 +1,38 @@ + + +formEditor.propertyCollections.validators.70.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.70.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/300.rst.txt new file mode 100644 index 0000000..68fe775 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/300.rst.txt @@ -0,0 +1,38 @@ + + +formEditor.propertyCollections.validators.70.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.70.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/9999.rst.txt new file mode 100644 index 0000000..1e65c52 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.70.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/identifier.rst.txt new file mode 100644 index 0000000..bc7fc89 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/70/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.70.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..0e83bbd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,45 @@ + + +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..c67ff09 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,33 @@ + + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..66135b3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,38 @@ + + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/9999.rst.txt new file mode 100644 index 0000000..1907b0e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/editors/9999.rst.txt @@ -0,0 +1,32 @@ + + +formEditor.propertyCollections.validators.80.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.80.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..c359123 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ + +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/implementationClassName.rst.txt new file mode 100644 index 0000000..c5c25d4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/implementationClassName.rst.txt @@ -0,0 +1,35 @@ + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + AdvancedPassword: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\AdvancedPassword + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationClassAttribute.rst.txt new file mode 100644 index 0000000..00b085e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationClassAttribute.rst.txt @@ -0,0 +1,40 @@ + +properties.confirmationClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.properties.confirmationClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 7 + + AdvancedPassword: + properties: + containerClassAttribute: input + elementClassAttribute: input-medium + elementErrorClassAttribute: error + confirmationLabel: '' + confirmationClassAttribute: input-medium + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the password confirmation form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationLabel.rst.txt new file mode 100644 index 0000000..7e9966f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/confirmationLabel.rst.txt @@ -0,0 +1,40 @@ + +properties.confirmationLabel +---------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.properties.confirmationLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + AdvancedPassword: + properties: + containerClassAttribute: input + elementClassAttribute: input-medium + elementErrorClassAttribute: error + confirmationLabel: '' + confirmationClassAttribute: input-medium + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the password confirmation form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..1ee8fbd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/containerClassAttribute.rst.txt @@ -0,0 +1,40 @@ + +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + AdvancedPassword: + properties: + containerClassAttribute: input + elementClassAttribute: input-medium + elementErrorClassAttribute: error + confirmationLabel: '' + confirmationClassAttribute: input-medium + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..b9f6d01 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementClassAttribute.rst.txt @@ -0,0 +1,40 @@ + +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + AdvancedPassword: + properties: + containerClassAttribute: input + elementClassAttribute: input-medium + elementErrorClassAttribute: error + confirmationLabel: '' + confirmationClassAttribute: input-medium + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementDescription.rst.txt new file mode 100644 index 0000000..2b649ce --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ + +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..df58b1a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/AdvancedPassword/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,40 @@ + +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.AdvancedPassword.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + AdvancedPassword: + properties: + containerClassAttribute: input + elementClassAttribute: input-medium + elementErrorClassAttribute: error + confirmationLabel: '' + confirmationClassAttribute: input-medium + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox.rst new file mode 100644 index 0000000..d19fdf0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox.rst @@ -0,0 +1,68 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox: + +========== +[Checkbox] +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.implementationclassname: +.. include:: Checkbox/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.properties.containerclassattribute: +.. include:: Checkbox/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.properties.elementclassattribute: +.. include:: Checkbox/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.properties.elementDescription: +.. include:: Checkbox/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.properties.elementerrorclassattribute: +.. include:: Checkbox/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.properties.value: +.. include:: Checkbox/properties/value.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor: +.. include:: Checkbox/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.editors.100: +.. include:: Checkbox/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.editors.200: +.. include:: Checkbox/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.editors.230: +.. include:: Checkbox/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.editors.700: +.. include:: Checkbox/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.editors.800: +.. include:: Checkbox/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.editors.9999: +.. include:: Checkbox/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.predefineddefaults: +.. include:: Checkbox/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.label: +.. include:: Checkbox/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.group: +.. include:: Checkbox/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.groupsorting: +.. include:: Checkbox/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.checkbox.formeditor.iconidentifier: +.. include:: Checkbox/formEditor/iconIdentifier.rst.txt + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor.rst.txt new file mode 100644 index 0000000..aa8c1f9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor.rst.txt @@ -0,0 +1,74 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: { } + label: formEditor.elements.Checkbox.label + group: select + groupSorting: 100 + iconIdentifier: form-checkbox diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..4e87005 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Checkbox: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..aef4a31 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Checkbox: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..55db3d6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..38f5d2e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Checkbox: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..d0b30be --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Checkbox: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..f588ed4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Checkbox: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/group.rst.txt new file mode 100644 index 0000000..99d48a0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Checkbox: + formEditor: + group: select + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..3eb28b1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Checkbox: + formEditor: + groupSorting: 100 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..d1ff1b5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Checkbox: + formEditor: + iconIdentifier: form-checkbox + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/label.rst.txt new file mode 100644 index 0000000..5753a88 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Checkbox: + formEditor: + label: formEditor.elements.Checkbox.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..4975859 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Checkbox: + formEditor: + predefinedDefaults: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/implementationClassName.rst.txt new file mode 100644 index 0000000..4d2807e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Checkbox: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..55de358 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/containerClassAttribute.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Checkbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: add-on + elementErrorClassAttribute: error + value: 1 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..2552753 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementClassAttribute.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Checkbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: add-on + elementErrorClassAttribute: error + value: 1 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementDescription.rst.txt new file mode 100644 index 0000000..6dab5c8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..c218598 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Checkbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: add-on + elementErrorClassAttribute: error + value: 1 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/value.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/value.rst.txt new file mode 100644 index 0000000..557ad42 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Checkbox/properties/value.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +properties.value +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Checkbox.properties.value + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Checkbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: add-on + elementErrorClassAttribute: error + value: 1 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The value of the checkbox which should be sent to the server. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement.rst b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement.rst new file mode 100644 index 0000000..b7e1efb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement.rst @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement: + +================ +[ContentElement] +================ + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.implementationclassname: +.. include:: ContentElement/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.properties.contentelementuid: +.. include:: ContentElement/properties/contentElementUid.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor: +.. include:: ContentElement/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.editors.100: +.. include:: ContentElement/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.editors.300: +.. include:: ContentElement/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.editors.700: +.. include:: ContentElement/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.editors.9999: +.. include:: ContentElement/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.predefineddefaults: +.. include:: ContentElement/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.label: +.. include:: ContentElement/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.group: +.. include:: ContentElement/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.groupsorting: +.. include:: ContentElement/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.contentelement.formeditor.iconidentifier: +.. include:: ContentElement/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor.rst.txt new file mode 100644 index 0000000..ae0271c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor.rst.txt @@ -0,0 +1,70 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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 + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + contentElementUid: '' + label: formEditor.elements.ContentElement.label + group: custom + groupSorting: 700 + iconIdentifier: form-content-element diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..172c7f8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ContentElement: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..ab6d24d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[Typo3WinBrowserEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ContentElement: + formEditor: + editors: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..e4522ec --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ContentElement: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..c961839 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ContentElement: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/group.rst.txt new file mode 100644 index 0000000..4c29173 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ContentElement: + formEditor: + group: custom + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..c5b3720 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ContentElement: + formEditor: + groupSorting: 700 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..adee9bd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ContentElement: + formEditor: + iconIdentifier: form-content-element + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/label.rst.txt new file mode 100644 index 0000000..5b3975e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ContentElement: + formEditor: + label: formEditor.elements.ContentElement.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..c051dda --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + ContentElement: + formEditor: + predefinedDefaults: + properties: + contentElementUid: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/implementationClassName.rst.txt new file mode 100644 index 0000000..5d46903 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + ContentElement: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/properties/contentElementUid.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/properties/contentElementUid.rst.txt new file mode 100644 index 0000000..f2c1471 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ContentElement/properties/contentElementUid.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +properties.contentElementUid +---------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ContentElement.properties.contentElementUid + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ContentElement: + properties: + contentElementUid: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The uid of the content element which should be rendered. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Date.rst new file mode 100644 index 0000000..0de1dd3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date.rst @@ -0,0 +1,236 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date: + +============ +[Date] +============ + +The form framework contains a form element called 'Date' which is technically an HTML5 'date' form element. + +The ``DateRange`` validator is the server side validation equivalent to the client side validation through the ``min`` +and ``max`` HTML attribute and should always be used in combination. If the ``DateRange`` validator is added to the +form element within the form editor, the ``min`` and ``max`` HTML attributes are added automatically. + +Browsers which do not support the HTML5 date element gracefully degrade to a text input. The HTML5 date element always +normalizes the value to the format Y-m-d (RFC 3339 'full-date'). With a text input, by default the browser has no +recognition of which format the date should be in. A workaround could be to put a pattern attribute on the date input. +Even though the date input does not use it, the text input fallback will. + +By default, the HTML attribute ``pattern="([0-9]{4})-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])"`` is rendered on the +date form element. Note that this basic regular expression does not support leap years and does not check for the +correct number of days in a month. But as a start, this should be sufficient. The same pattern is used by the form +editor to validate the properties ``defaultValue`` and the ``DateRange`` validator options ``minimum`` and ``maximum``. + +Read more: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date#Handling_browser_support + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.implementationclassname: +.. include:: Date/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.properties.containerclassattribute: +.. include:: Date/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.properties.displayFormat: +.. include:: Date/properties/displayFormat.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.properties.elementclassattribute: +.. include:: Date/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.properties.elementerrorclassattribute: +.. include:: Date/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.properties.fluidAdditionalAttributes.pattern: +.. include:: Date/properties/fluidAdditionalAttributes/pattern.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor: +.. include:: Date/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.100: +.. include:: Date/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.200: +.. include:: Date/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.230: +.. include:: Date/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.500: +.. include:: Date/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.550: +.. include:: Date/formEditor/editors/550.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.700: +.. include:: Date/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.800: +.. include:: Date/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.900: +.. include:: Date/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.editors.9999: +.. include:: Date/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.predefineddefaults: +.. include:: Date/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10: +.. include:: Date/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10.identifier: +.. include:: Date/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/10/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10.editors.250: +.. include:: Date/formEditor/propertyCollections/validators/10/editors/250.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10.editors.300: +.. include:: Date/formEditor/propertyCollections/validators/10/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.10.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.20: +.. include:: Date/formEditor/propertyCollections/validators/20.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.20.identifier: +.. include:: Date/formEditor/propertyCollections/validators/20/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.20.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/20/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.20.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/20/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.20.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/20/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30: +.. include:: Date/formEditor/propertyCollections/validators/30.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30.identifier: +.. include:: Date/formEditor/propertyCollections/validators/30/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/30/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/30/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30.editors.300: +.. include:: Date/formEditor/propertyCollections/validators/30/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30.editors.400: +.. include:: Date/formEditor/propertyCollections/validators/30/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.30.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/30/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.40: +.. include:: Date/formEditor/propertyCollections/validators/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.40.identifier: +.. include:: Date/formEditor/propertyCollections/validators/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.40.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.40.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/40/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.40.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/40/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.50: +.. include:: Date/formEditor/propertyCollections/validators/50.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.50.identifier: +.. include:: Date/formEditor/propertyCollections/validators/50/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.50.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/50/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.50.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/50/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.50.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/50/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.60: +.. include:: Date/formEditor/propertyCollections/validators/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.60.identifier: +.. include:: Date/formEditor/propertyCollections/validators/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.60.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.60.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/60/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.60.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/60/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70: +.. include:: Date/formEditor/propertyCollections/validators/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70.identifier: +.. include:: Date/formEditor/propertyCollections/validators/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/70/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70.editors.300: +.. include:: Date/formEditor/propertyCollections/validators/70/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70.editors.400: +.. include:: Date/formEditor/propertyCollections/validators/70/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.70.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.80: +.. include:: Date/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.80.identifier: +.. include:: Date/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.80.editors.100: +.. include:: Date/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.80.editors.200: +.. include:: Date/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.80.editors.300: +.. include:: Date/formEditor/propertyCollections/validators/80/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.propertycollections.validators.80.editors.9999: +.. include:: Date/formEditor/propertyCollections/validators/80/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.label: +.. include:: Date/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.group: +.. include:: Date/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.groupsorting: +.. include:: Date/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.date.formeditor.iconidentifier: +.. include:: Date/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor.rst.txt new file mode 100644 index 0000000..31eeff8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor.rst.txt @@ -0,0 +1,119 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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 + 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' + description: 'formEditor.elements.Date.editor.step.description' + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + 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: + ... + label: formEditor.elements.Date.label + group: html5 + groupSorting: 500 + iconIdentifier: form-date-picker diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..efe3b46 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..3104a2c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..9fe009b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..7fb7bb1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/500.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/550.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/550.rst.txt new file mode 100644 index 0000000..a9f8e2d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/550.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.550 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.550 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 550: + identifier: step + templateName: Inspector-TextEditor + label: formEditor.elements.Date.editor.step.label + description: formEditor.elements.Date.editor.step.description + propertyPath: properties.fluidAdditionalAttributes.step + propertyValidators: + 10: integer diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..cf3916c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..2f2a6db --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/800.rst.txt @@ -0,0 +1,44 @@ +.. include:: /Includes.rst.txt +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + errorCodes: + 10: 1221560910 + 20: 1221560718 + 30: 1347992400 + 40: 1347992453 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..a627c27 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/900.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.DatePicker.editor.validators.EmptyValue.label + 20: + value: DateTime + label: formEditor.elements.DatePicker.editor.validators.DateRange.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..b3cdb8e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/group.rst.txt new file mode 100644 index 0000000..4348842 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Date: + formEditor: + group: html5 + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..f46b9f5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Date: + formEditor: + groupSorting: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..c7fa43d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Date: + formEditor: + iconIdentifier: form-date-picker + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the ``\TYPO3\CMS\Core\Imaging\IconRegistry``. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/label.rst.txt new file mode 100644 index 0000000..3892959 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Date: + formEditor: + label: formEditor.elements.Date.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..ff656f1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Date: + formEditor: + predefinedDefaults: + defaultValue: + properties: + fluidAdditionalAttributes: + min: + max: + step: 1 + +:aspect:`Good to know` + The properties ``defaultValue``, ``properties.fluidAdditionalAttributes.min``, + ``properties.fluidAdditionalAttributes.max`` must have the format 'Y-m-d' which represents the RFC 3339 + 'full-date' format. + + Read more: https://www.w3.org/TR/2011/WD-html-markup-20110405/input.date.html + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..f27f273 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,66 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + 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 + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + 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 + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..0645a36 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 10: + identifier: DateRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.DatePicker.validators.DateRange.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/200.rst.txt new file mode 100644 index 0000000..9877100 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10.editors.200 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 10: + identifier: DateRange + editors: + 200: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.Alphanumeric.editor.validationErrorMessage.description + errorCodes: + 10: 1521293685 + 20: 1521293686 + 30: 1521293687 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/250.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/250.rst.txt new file mode 100644 index 0000000..685a102 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/250.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.250 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10.editors.250 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 10: + identifier: DateRange + editors: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/300.rst.txt new file mode 100644 index 0000000..d5865d4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 10: + identifier: DateRange + editors: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..57e66b3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 10: + identifier: DateRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..baf4968 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 10: + identifier: DateRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20.rst.txt new file mode 100644 index 0000000..71a0592 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.20 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.20 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + errorCodes: + 10: 1221565786 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/100.rst.txt new file mode 100644 index 0000000..b409839 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.20.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/200.rst.txt new file mode 100644 index 0000000..e2b9acd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/200.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.20.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.20.editors.200 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 200: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.Text.editor.validationErrorMessage.description + errorCodes: + 10: 1221565786 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/9999.rst.txt new file mode 100644 index 0000000..6716f82 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.20.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/identifier.rst.txt new file mode 100644 index 0000000..0f7ed2d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/20/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.20.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.20.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30.rst.txt new file mode 100644 index 0000000..95b66ef --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30.rst.txt @@ -0,0 +1,65 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.30 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + errorCodes: + 10: 1238110957 + 20: 1269883975 + 30: 1428504122 + 40: 1238108068 + 50: 1238108069 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/100.rst.txt new file mode 100644 index 0000000..0e7ff37 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/200.rst.txt new file mode 100644 index 0000000..9f877e3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.minlength diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/300.rst.txt new file mode 100644 index 0000000..dc87ee4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.maxlength diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/400.rst.txt new file mode 100644 index 0000000..3b973dc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/400.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.30.editors.400 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30.editors.400 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 400: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.StringLength.editor.validationErrorMessage.description + errorCodes: + 10: 1238110957 + 20: 1269883975 + 30: 1428504122 + 40: 1238108068 + 50: 1238108069 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/9999.rst.txt new file mode 100644 index 0000000..b82145a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/identifier.rst.txt new file mode 100644 index 0000000..80223d1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/30/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.30.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.30.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40.rst.txt new file mode 100644 index 0000000..c6204b0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + errorCodes: + 10: 1221559976 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/100.rst.txt new file mode 100644 index 0000000..e5e5d63 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/200.rst.txt new file mode 100644 index 0000000..2a0927c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/200.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.40.editors.200 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 200: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.EmailAddress.editor.validationErrorMessage.description + errorCodes: + 10: 1221559976 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/9999.rst.txt new file mode 100644 index 0000000..1be0499 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.40.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/identifier.rst.txt new file mode 100644 index 0000000..0666619 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/40/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50.rst.txt new file mode 100644 index 0000000..d903d94 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.50 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.50 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + errorCodes: + 10: 1221560494 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/100.rst.txt new file mode 100644 index 0000000..b1742f9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.50.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/200.rst.txt new file mode 100644 index 0000000..466d07b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/200.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.50.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.50.editors.200 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 200: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.Integer.editor.validationErrorMessage.description + errorCodes: + 10: 1221560494 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/9999.rst.txt new file mode 100644 index 0000000..437b330 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.50.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/identifier.rst.txt new file mode 100644 index 0000000..d1effaf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/50/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.50.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.50.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60.rst.txt new file mode 100644 index 0000000..6e1314f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + errorCodes: + 10: 1221560288 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/100.rst.txt new file mode 100644 index 0000000..4041903 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/200.rst.txt new file mode 100644 index 0000000..4320628 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/200.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.60.editors.200 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 200: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.Float.editor.validationErrorMessage.description + errorCodes: + 10: 1221560288 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/9999.rst.txt new file mode 100644 index 0000000..3d404f9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.60.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/identifier.rst.txt new file mode 100644 index 0000000..8364859 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/60/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70.rst.txt new file mode 100644 index 0000000..3832a2b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70.rst.txt @@ -0,0 +1,62 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + errorCodes: + 10: 1221563685 + 20: 1221561046 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/100.rst.txt new file mode 100644 index 0000000..cdc966f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/200.rst.txt new file mode 100644 index 0000000..c97a7e3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/300.rst.txt new file mode 100644 index 0000000..b527123 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/400.rst.txt new file mode 100644 index 0000000..593df9c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70.editors.400 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70.editors.400 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 400: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.NumberRange.editor.validationErrorMessage.description + errorCodes: + 10: 1221563685 + 20: 1221561046 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/9999.rst.txt new file mode 100644 index 0000000..45a4195 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/identifier.rst.txt new file mode 100644 index 0000000..f776a25 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/70/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..70b32fe --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,52 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Date: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..706683a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..7c905e1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/300.rst.txt new file mode 100644 index 0000000..814339e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/300.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.80.editors.300 + +:aspect:`Data type` + array/ :ref:`[ValidationErrorMessageEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 300: + identifier: validationErrorMessage + templateName: Inspector-ValidationErrorMessageEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.validationErrorMessage.description + errorCodes: + 10: 1221565130 + propertyPath: properties.validationErrorMessages diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/9999.rst.txt new file mode 100644 index 0000000..c83885d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.80.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Date: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..c669441 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/implementationClassName.rst.txt new file mode 100644 index 0000000..98e0609 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Date: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..5e001fe --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/containerClassAttribute.rst.txt @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Date: + 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])' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/displayFormat.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/displayFormat.rst.txt new file mode 100644 index 0000000..9b75fb6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/displayFormat.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.displayFormat +------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.properties.displayFormat + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Date: + 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])' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The display format defines the display format of the submitted value within 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 and + can not be defined! + + Read more: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date#Value diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..780d5dc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementClassAttribute.rst.txt @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Date: + 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])' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..83620e6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Date: + 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])' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/fluidAdditionalAttributes/pattern.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/fluidAdditionalAttributes/pattern.rst.txt new file mode 100644 index 0000000..d4bb5de --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Date/properties/fluidAdditionalAttributes/pattern.rst.txt @@ -0,0 +1,41 @@ +.. include:: /Includes.rst.txt +properties.fluidAdditionalAttributes.pattern +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Date.properties.fluidAdditionalAttributes.pattern + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8 + + Date: + 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])' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Pattern to be matched by the form control's value. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Email.rst new file mode 100644 index 0000000..b4dbb37 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email.rst @@ -0,0 +1,85 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email: + +======= +[Email] +======= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.implementationclassname: +.. include:: Email/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.properties.containerclassattribute: +.. include:: Email/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.properties.elementclassattribute: +.. include:: Email/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.properties.elementDescription: +.. include:: Email/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.properties.elementerrorclassattribute: +.. include:: Email/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.validators: +.. include:: Email/validators.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor: +.. include:: Email/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.100: +.. include:: Email/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.200: +.. include:: Email/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.230: +.. include:: Email/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.400: +.. include:: Email/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.500: +.. include:: Email/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.700: +.. include:: Email/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.800: +.. include:: Email/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.900: +.. include:: Email/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.editors.9999: +.. include:: Email/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.predefineddefaults: +.. include:: Email/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.propertycollections.validators.40: +.. include:: Email/formEditor/propertyCollections/validators/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.propertycollections.validators.40.identifier: +.. include:: Email/formEditor/propertyCollections/validators/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.propertycollections.validators.40.editors.100: +.. include:: Email/formEditor/propertyCollections/validators/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.label: +.. include:: Email/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.group: +.. include:: Email/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.groupsorting: +.. include:: Email/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.email.formeditor.iconidentifier: +.. include:: Email/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor.rst.txt new file mode 100644 index 0000000..a06aa5e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor.rst.txt @@ -0,0 +1,111 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + label: formEditor.elements.Email.label + group: html5 + groupSorting: 100 + iconIdentifier: form-email diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..1c6136f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/100.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..9cb07bc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/200.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..55c45a5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..2f3be99 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..93b1bd4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/500.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..e7e91c3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/700.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..97d494b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..7d71d07 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/900.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 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 + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..fa057c9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Email: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/group.rst.txt new file mode 100644 index 0000000..476bce9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/group.rst.txt @@ -0,0 +1,28 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Email: + formEditor: + group: html5 + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..a6b2bf5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Email: + formEditor: + groupSorting: 100 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..f6b4e40 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Email: + formEditor: + iconIdentifier: form-email + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/label.rst.txt new file mode 100644 index 0000000..576f7bc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Email: + formEditor: + label: formEditor.elements.Email.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..91f6acf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Email: + formEditor: + predefinedDefaults: + defaultValue: '' + validators: + - + identifier: EmailAddress + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40.rst.txt new file mode 100644 index 0000000..cd79df1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.propertyCollections.validators.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Email: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/editors/100.rst.txt new file mode 100644 index 0000000..ff9d840 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.propertyCollections.validators.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Email: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/identifier.rst.txt new file mode 100644 index 0000000..1bd9d43 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/formEditor/propertyCollections/validators/40/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.formEditor.propertyCollections.validators.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Email: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/implementationClassName.rst.txt new file mode 100644 index 0000000..06ede1e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Email: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..8a6643c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Email: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..3168d28 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Email: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementDescription.rst.txt new file mode 100644 index 0000000..516de3f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..ea1d504 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Email: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Email/validators.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Email/validators.rst.txt new file mode 100644 index 0000000..d7d8c4c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Email/validators.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +validators +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Email.validators + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Email: + validators: + - + identifier: EmailAddress + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Predefined validators. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset.rst new file mode 100644 index 0000000..a8567f1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset.rst @@ -0,0 +1,58 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset: + +========== +[Fieldset] +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.implementationclassname: +.. include:: Fieldset/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.properties.elementclassattribute: +.. include:: Fieldset/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.properties.elementerrorclassattribute: +.. include:: Fieldset/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.renderingoptions._iscompositeformelement: +.. include:: Fieldset/renderingOptions/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor: +.. include:: Fieldset/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.editors.100: +.. include:: Fieldset/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.editors.200: +.. include:: Fieldset/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.editors.700: +.. include:: Fieldset/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.editors.9999: +.. include:: Fieldset/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.predefineddefaults: +.. include:: Fieldset/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.label: +.. include:: Fieldset/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.group: +.. include:: Fieldset/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.groupsorting: +.. include:: Fieldset/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor.iconidentifier: +.. include:: Fieldset/formEditor/iconIdentifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fieldset.formeditor._iscompositeformelement: +.. include:: Fieldset/formEditor/_isCompositeFormElement.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor.rst.txt new file mode 100644 index 0000000..4a5788c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor.rst.txt @@ -0,0 +1,63 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: { } + label: formEditor.elements.Fieldset.label + group: container + groupSorting: 100 + _isCompositeFormElement: true + iconIdentifier: form-fieldset diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..a915a54 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/_isCompositeFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isCompositeFormElement +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Fieldset: + formEditor: + _isCompositeFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..cf61f66 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Fieldset: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..e8a6e86 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Fieldset: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.Fieldset.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..f3799ab --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Fieldset: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..3602628 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Fieldset: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/group.rst.txt new file mode 100644 index 0000000..7bfc551 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Fieldset: + formEditor: + group: container + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..4706f95 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Fieldset: + formEditor: + groupSorting: 100 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..0fab81b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Fieldset: + formEditor: + iconIdentifier: form-fieldset + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/label.rst.txt new file mode 100644 index 0000000..368d04d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Fieldset: + formEditor: + label: formEditor.elements.Fieldset.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..1ce5f9e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Fieldset: + formEditor: + predefinedDefaults: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/implementationClassName.rst.txt new file mode 100644 index 0000000..61d45b8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Fieldset: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Section + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..19e84a3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Fieldset: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..8a9fb0a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Fieldset: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/renderingOptions/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/renderingOptions/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..34e8f80 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Fieldset/renderingOptions/_isCompositeFormElement.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +renderingOptions._isCompositeFormElement +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Fieldset.renderingOptions._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + AdvancedPassword: + renderingOptions: + _isCompositeFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload.rst b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload.rst new file mode 100644 index 0000000..f3af492 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload.rst @@ -0,0 +1,97 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload: + +============ +[FileUpload] +============ + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.implementationclassname: +.. include:: FileUpload/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.properties.containerclassattribute: +.. include:: FileUpload/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.properties.elementclassattribute: +.. include:: FileUpload/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.properties.elementDescription: +.. include:: FileUpload/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.properties.elementerrorclassattribute: +.. include:: FileUpload/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.properties.savetofilemount: +.. include:: FileUpload/properties/saveToFileMount.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.properties.allowedmimetypes: +.. include:: FileUpload/properties/allowedMimeTypes.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor: +.. include:: FileUpload/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.100: +.. include:: FileUpload/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.200: +.. include:: FileUpload/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.230: +.. include:: FileUpload/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.300: +.. include:: FileUpload/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.400: +.. include:: FileUpload/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.700: +.. include:: FileUpload/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.800: +.. include:: FileUpload/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.900: +.. include:: FileUpload/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.editors.9999: +.. include:: FileUpload/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.predefineddefaults: +.. include:: FileUpload/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.propertycollections.validators.10: +.. include:: FileUpload/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.propertycollections.validators.10.identifier: +.. include:: FileUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.propertycollections.validators.10.editors.100: +.. include:: FileUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.propertycollections.validators.10.editors.200: +.. include:: FileUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.propertycollections.validators.10.editors.300: +.. include:: FileUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.propertycollections.validators.10.editors.9999: +.. include:: FileUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.label: +.. include:: FileUpload/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.group: +.. include:: FileUpload/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.groupsorting: +.. include:: FileUpload/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.fileupload.formeditor.iconidentifier: +.. include:: FileUpload/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor.rst.txt new file mode 100644 index 0000000..5c33d06 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor.rst.txt @@ -0,0 +1,151 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.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 + predefinedDefaults: + properties: + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - application/pdf + label: formEditor.elements.FileUpload.label + group: custom + groupSorting: 100 + iconIdentifier: form-file-upload diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..2296aef --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..ea52182 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..93827c3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..096e600 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/300.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[MultiSelectEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..7a08b00 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[SingleSelectEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + 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/' diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..a279e95 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/700.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..d244960 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..78c022e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/900.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + editors: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..f2c88c1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/editors/9999.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + FileUpload: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/group.rst.txt new file mode 100644 index 0000000..f654959 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + FileUpload: + formEditor: + group: custom + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..e4b0ca5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + FileUpload: + formEditor: + groupSorting: 100 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..e845a1d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + FileUpload: + formEditor: + iconIdentifier: form-file-upload + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/label.rst.txt new file mode 100644 index 0000000..7104ac3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + FileUpload: + formEditor: + label: formEditor.elements.FileUpload.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..359cec2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + FileUpload: + formEditor: + predefinedDefaults: + properties: + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - application/pdf + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..a48c6d9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + FileUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..8ec514d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + FileUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt new file mode 100644 index 0000000..b35df44 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + FileUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: FileSize diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt new file mode 100644 index 0000000..38ac5db --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + FileUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: FileSize diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..9321f1f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + FileUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..09e5cf6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + FileUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/implementationClassName.rst.txt new file mode 100644 index 0000000..0c90d4d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + FileUpload: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/allowedMimeTypes.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/allowedMimeTypes.rst.txt new file mode 100644 index 0000000..4f5b97e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/allowedMimeTypes.rst.txt @@ -0,0 +1,44 @@ +.. include:: /Includes.rst.txt +properties.allowedMimeTypes +--------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.properties.allowedMimeTypes + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 7- + + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The allowed mime types for the file uploads. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..b473e61 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/containerClassAttribute.rst.txt @@ -0,0 +1,44 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..cd73c5b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementClassAttribute.rst.txt @@ -0,0 +1,44 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementDescription.rst.txt new file mode 100644 index 0000000..6764231 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..68cedb4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,44 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/saveToFileMount.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/saveToFileMount.rst.txt new file mode 100644 index 0000000..178114f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/FileUpload/properties/saveToFileMount.rst.txt @@ -0,0 +1,48 @@ +.. include:: /Includes.rst.txt +properties.saveToFileMount +-------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.FileUpload.properties.saveToFileMount + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + 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 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The location (file mount) for the uploaded files. + If this file mount or the property "saveToFileMount" does not exist + the folder in which the form definition lies (persistence identifier) will be used. + If the form is generated programmatically and therefore no persistence identifier exist + the default storage "1:/user_upload/" will be used. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow.rst b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow.rst new file mode 100644 index 0000000..3f55583 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow.rst @@ -0,0 +1,76 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow: + +========= +[GridRow] +========= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.implementationclassname: +.. include:: GridRow/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.properties.containerclassattribute: +.. include:: GridRow/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.properties.elementclassattribute: +.. include:: GridRow/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.properties.elementerrorclassattribute: +.. include:: GridRow/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.properties.gridcolumnclassautoconfiguration.gridsize: +.. include:: GridRow/properties/gridColumnClassAutoConfiguration/gridSize.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.properties.gridcolumnclassautoconfiguration.viewports: +.. include:: GridRow/properties/gridColumnClassAutoConfiguration/viewPorts.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.properties.gridcolumnclassautoconfiguration.viewports.*.classpattern: +.. include:: GridRow/properties/gridColumnClassAutoConfiguration/viewPorts/classPattern.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.renderingoptions._iscompositeformelement: +.. include:: GridRow/renderingOptions/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.renderingoptions._isgridrowformelement: +.. include:: GridRow/renderingOptions/_isGridRowFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor: +.. include:: GridRow/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.editors.100: +.. include:: GridRow/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.editors.200: +.. include:: GridRow/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.editors.700: +.. include:: GridRow/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.editors.9999: +.. include:: GridRow/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.predefineddefaults: +.. include:: GridRow/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor._iscompositeformelement: +.. include:: GridRow/formEditor/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor._isgridrowformelement: +.. include:: GridRow/formEditor/_isGridRowFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.label: +.. include:: GridRow/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.group: +.. include:: GridRow/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.groupsorting: +.. include:: GridRow/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.gridrow.formeditor.iconidentifier: +.. include:: GridRow/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor.rst.txt new file mode 100644 index 0000000..4934188 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor.rst.txt @@ -0,0 +1,64 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: { } + label: formEditor.elements.GridRow.label + group: container + groupSorting: 300 + _isCompositeFormElement: true + _isGridRowFormElement: true + iconIdentifier: form-gridrow diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..bd7069b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isCompositeFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isCompositeFormElement +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + formEditor: + _isCompositeFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isGridRowFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isGridRowFormElement.rst.txt new file mode 100644 index 0000000..bdb1256 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/_isGridRowFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isGridRowFormElement +-------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor._isGridRowFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + formEditor: + _isGridRowFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + todo diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..099d858 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + GridRow: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..5491815 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + GridRow: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.GridRow.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..caa397a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + GridRow: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..4b5b0ae --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + GridRow: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/group.rst.txt new file mode 100644 index 0000000..8e1d641 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + formEditor: + group: container + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..a0f4784 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + formEditor: + groupSorting: 300 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..c7ebdf7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + formEditor: + iconIdentifier: form-gridrow + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/label.rst.txt new file mode 100644 index 0000000..fbda95d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + formEditor: + label: formEditor.elements.GridRow.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..3369ed1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + GridRow: + formEditor: + predefinedDefaults: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/implementationClassName.rst.txt new file mode 100644 index 0000000..c06b4df --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + GridRow: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GridRow + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..71375b3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/containerClassAttribute.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + properties: + containerClassAttribute: input + elementClassAttribute: row + elementErrorClassAttribute: error + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..7acfdcb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementClassAttribute.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + GridRow: + properties: + containerClassAttribute: input + elementClassAttribute: row + elementErrorClassAttribute: error + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..d2fce2f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + GridRow: + properties: + containerClassAttribute: input + elementClassAttribute: row + elementErrorClassAttribute: error + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/gridSize.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/gridSize.rst.txt new file mode 100644 index 0000000..5ba53fc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/gridSize.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +properties.gridColumnClassAutoConfiguration.gridSize +---------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.properties.gridColumnClassAutoConfiguration.gridSize + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 7 + + GridRow: + properties: + containerClassAttribute: input + elementClassAttribute: row + elementErrorClassAttribute: error + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The grid size of the CSS grid system (bootstrap by default). diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts.rst.txt new file mode 100644 index 0000000..6d7b99c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +properties.gridColumnClassAutoConfiguration.viewPorts +----------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.properties.gridColumnClassAutoConfiguration.viewPorts + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + GridRow: + properties: + containerClassAttribute: input + elementClassAttribute: row + elementErrorClassAttribute: error + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + +:aspect:`Related options` + - :ref:`"properties.gridColumnClassAutoConfiguration"` + +:aspect:`Description` + Each configuration key within `properties.gridColumnClassAutoConfiguration.viewPorts` represents an viewport of the CSS grid system (bootstrap by default). diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts/classPattern.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts/classPattern.rst.txt new file mode 100644 index 0000000..f16bf1e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/properties/gridColumnClassAutoConfiguration/viewPorts/classPattern.rst.txt @@ -0,0 +1,53 @@ +.. include:: /Includes.rst.txt +properties.gridColumnClassAutoConfiguration.viewPorts.[*].classPattern +---------------------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.properties.gridColumnClassAutoConfiguration.viewPorts..classPattern + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 10, 12, 14, 16 + + GridRow: + properties: + containerClassAttribute: input + elementClassAttribute: row + elementErrorClassAttribute: error + gridColumnClassAutoConfiguration: + gridSize: 12 + viewPorts: + xs: + classPattern: 'col-{@numbersOfColumnsToUse}' + sm: + classPattern: 'col-sm-{@numbersOfColumnsToUse}' + md: + classPattern: 'col-md-{@numbersOfColumnsToUse}' + lg: + classPattern: 'col-lg-{@numbersOfColumnsToUse}' + +:aspect:`Related options` + - :ref:`"properties.gridColumnClassAutoConfiguration"` + +:aspect:`Description` + Defines the CSS class pattern for the CSS grid system. + Each viewport `classPattern` will be wrapped around a form element within a grid row. + The `{@numbersOfColumnsToUse}` placeholder will be replaced by the number of columns which the respective form element should occupy. + The number of columns which the respective form element should occupy has to defined within the respective form elements within a GridRow. + If a form element has no number of columns defined, the ``{@numbersOfColumnsToUse}`` are calculated automatically. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..ec3be60 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isCompositeFormElement.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +renderingOptions._isCompositeFormElement +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.renderingOptions._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + GridRow: + renderingOptions: + _isCompositeFormElement: true + _isGridRowFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isGridRowFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isGridRowFormElement.rst.txt new file mode 100644 index 0000000..ceae6e9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/GridRow/renderingOptions/_isGridRowFormElement.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +renderingOptions._isGridRowFormElement +-------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.GridRow.renderingOptions._isGridRowFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + GridRow: + renderingOptions: + _isCompositeFormElement: true + _isGridRowFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden.rst new file mode 100644 index 0000000..ffa1099 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden.rst @@ -0,0 +1,59 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden: + +======== +[Hidden] +======== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.implementationclassname: +.. include:: Hidden/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.properties.containerclassattribute: +.. include:: Hidden/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.properties.elementclassattribute: +.. include:: Hidden/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.properties.elementerrorclassattribute: +.. include:: Hidden/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor: +.. include:: Hidden/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.editors.100: +.. include:: Hidden/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.editors.200: +.. include:: Hidden/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.editors.300: +.. include:: Hidden/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.editors.700: +.. include:: Hidden/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.editors.9999: +.. include:: Hidden/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.predefineddefaults: +.. include:: Hidden/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.label: +.. include:: Hidden/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.group: +.. include:: Hidden/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.groupsorting: +.. include:: Hidden/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.hidden.formeditor.iconidentifier: +.. include:: Hidden/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor.rst.txt new file mode 100644 index 0000000..2594dcd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor.rst.txt @@ -0,0 +1,68 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + defaultValue: '' + label: formEditor.elements.Hidden.label + group: custom + groupSorting: 300 + iconIdentifier: form-hidden diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..7db2fe5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Hidden: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..266c1dc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Hidden: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..4e022c6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/300.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Hidden: + formEditor: + editors: + 300: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.Hidden.editor.defaultValue.label + propertyPath: defaultValue diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..ffe570e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Hidden: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..84f87fe --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Hidden: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/group.rst.txt new file mode 100644 index 0000000..64bd3b3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Hidden: + formEditor: + group: custom + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..85d17f6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Hidden: + formEditor: + groupSorting: 300 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..a0b5f55 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Hidden: + formEditor: + iconIdentifier: form-hidden + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/label.rst.txt new file mode 100644 index 0000000..c2edf2b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Hidden: + formEditor: + label: formEditor.elements.Hidden.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..68fe787 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Hidden: + formEditor: + predefinedDefaults: + defaultValue: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/implementationClassName.rst.txt new file mode 100644 index 0000000..ee14127 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Hidden: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..79b7ddb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Hidden: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..7ea7a46 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Hidden: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..eaa6bcd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Hidden/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Hidden.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Hidden: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot.rst new file mode 100644 index 0000000..465902f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot.rst @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot: + +========== +[Honeypot] +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot.implementationclassname: +.. include:: Honeypot/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot.properties.containerclassattribute: +.. include:: Honeypot/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot.properties.elementclassattribute: +.. include:: Honeypot/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot.properties.elementerrorclassattribute: +.. include:: Honeypot/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot.properties.renderashiddenfield: +.. include:: Honeypot/properties/renderAsHiddenField.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.honeypot.properties.styleattribute: +.. include:: Honeypot/properties/styleAttribute.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/implementationClassName.rst.txt new file mode 100644 index 0000000..08c6945 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Honeypot.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Honeypot: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..66a74a7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/containerClassAttribute.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Honeypot.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Honeypot: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + renderAsHiddenField: false + styleAttribute: 'position:absolute; margin:0 0 0 -999em;' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..37d2875 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementClassAttribute.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Honeypot.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Honeypot: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + renderAsHiddenField: false + styleAttribute: 'position:absolute; margin:0 0 0 -999em;' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..a1a2acd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Honeypot.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Honeypot: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + renderAsHiddenField: false + styleAttribute: 'position:absolute; margin:0 0 0 -999em;' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/renderAsHiddenField.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/renderAsHiddenField.rst.txt new file mode 100644 index 0000000..54692f8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/renderAsHiddenField.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +properties.renderAsHiddenField +------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Honeypot.properties.renderAsHiddenField + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Honeypot: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + renderAsHiddenField: false + styleAttribute: 'position:absolute; margin:0 0 0 -999em;' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + By default the honeypot will be rendered as a regular text form element (input type "text"). ``renderAsHiddenField`` renders the honeypot as a hidden form element (input type "hidden"). diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/styleAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/styleAttribute.rst.txt new file mode 100644 index 0000000..c633d00 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Honeypot/properties/styleAttribute.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt +properties.styleAttribute +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Honeypot.properties.styleAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 7 + + Honeypot: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + renderAsHiddenField: false + styleAttribute: 'position:absolute; margin:0 0 0 -999em;' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + By default the honeypot will be rendered as a regular text form element (input type "text"). The ``styleAttribute`` is written to the honeypot form element to make it "invisible" for humans. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload.rst b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload.rst new file mode 100644 index 0000000..b915df3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload.rst @@ -0,0 +1,106 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload: + +============= +[ImageUpload] +============= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.implementationclassname: +.. include:: ImageUpload/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.containerclassattribute: +.. include:: ImageUpload/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.elementclassattribute: +.. include:: ImageUpload/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.elementDescription: +.. include:: ImageUpload/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.elementerrorclassattribute: +.. include:: ImageUpload/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.savetofilemount: +.. include:: ImageUpload/properties/saveToFileMount.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.allowedmimetypes: +.. include:: ImageUpload/properties/allowedMimeTypes.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.imagelinkmaxwidth: +.. include:: ImageUpload/properties/imageLinkMaxWidth.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.imagemaxwidth: +.. include:: ImageUpload/properties/imageMaxWidth.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.properties.imagemaxheight: +.. include:: ImageUpload/properties/imageMaxHeight.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor: +.. include:: ImageUpload/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.100: +.. include:: ImageUpload/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.200: +.. include:: ImageUpload/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.230: +.. include:: ImageUpload/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.300: +.. include:: ImageUpload/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.400: +.. include:: ImageUpload/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.700: +.. include:: ImageUpload/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.800: +.. include:: ImageUpload/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.900: +.. include:: ImageUpload/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.editors.9999: +.. include:: ImageUpload/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.predefineddefaults: +.. include:: ImageUpload/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.propertycollections.validators.10: +.. include:: ImageUpload/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.propertycollections.validators.10.identifier: +.. include:: ImageUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.propertycollections.validators.10.editors.100: +.. include:: ImageUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.propertycollections.validators.10.editors.200: +.. include:: ImageUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.propertycollections.validators.10.editors.300: +.. include:: ImageUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.propertycollections.validators.10.editors.9999: +.. include:: ImageUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.label: +.. include:: ImageUpload/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.group: +.. include:: ImageUpload/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.groupsorting: +.. include:: ImageUpload/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.imageupload.formeditor.iconidentifier: +.. include:: ImageUpload/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor.rst.txt new file mode 100644 index 0000000..9f35f61 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor.rst.txt @@ -0,0 +1,139 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.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 + predefinedDefaults: + properties: + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + label: formEditor.elements.ImageUpload.label + group: custom + groupSorting: 400 + iconIdentifier: form-image-upload diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..255efdb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..1e1887f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..16bcaa1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.230 + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..32796a2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/300.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..c6b05ad --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/400.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[SingleSelectEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + 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/' + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..517666d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..a13ce5b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..e8f97b4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/900.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + editors: + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..822dc3e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + ImageUpload: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/group.rst.txt new file mode 100644 index 0000000..ea8dd9c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ImageUpload: + formEditor: + group: custom + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..5456e8d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ImageUpload: + formEditor: + groupSorting: 400 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..90c57ea --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ImageUpload: + formEditor: + iconIdentifier: form-image-upload + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/label.rst.txt new file mode 100644 index 0000000..11de493 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ImageUpload: + formEditor: + label: formEditor.elements.ImageUpload.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..7ea7afd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + ImageUpload: + formEditor: + predefinedDefaults: + properties: + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..f6cd1af --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + ImageUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..7bfb433 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + ImageUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt new file mode 100644 index 0000000..5fc9abd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/200.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + ImageUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: FileSize diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt new file mode 100644 index 0000000..1598ce8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/300.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + ImageUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: FileSize diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..8670d67 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + ImageUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..aef94fd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + ImageUpload: + formEditor: + propertyCollections: + validators: + 10: + identifier: FileSize + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/implementationClassName.rst.txt new file mode 100644 index 0000000..3be183d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + ImageUpload: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\FileUpload + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/allowedMimeTypes.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/allowedMimeTypes.rst.txt new file mode 100644 index 0000000..ffc3c14 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/allowedMimeTypes.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.allowedMimeTypes +--------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.allowedMimeTypes + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 7-10 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The allowed mime types for the image uploads. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..17b937d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/containerClassAttribute.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..72aa9c8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementClassAttribute.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementDescription.rst.txt new file mode 100644 index 0000000..79d1b86 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..1fe2d18 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageLinkMaxWidth.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageLinkMaxWidth.rst.txt new file mode 100644 index 0000000..b9b9797 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageLinkMaxWidth.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.imageLinkMaxWidth +---------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.imageLinkMaxWidth + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 11 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The max width for the uploaded image preview link. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxHeight.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxHeight.rst.txt new file mode 100644 index 0000000..c8d2a5d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxHeight.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.imageMaxHeight +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.imageMaxHeight + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 13 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The max height for the uploaded image preview. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxWidth.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxWidth.rst.txt new file mode 100644 index 0000000..1ab22cf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/imageMaxWidth.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt +properties.imageMaxWidth +------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.imageMaxWidth + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 12 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The max width for the uploaded image preview. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/saveToFileMount.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/saveToFileMount.rst.txt new file mode 100644 index 0000000..4b5ed54 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/ImageUpload/properties/saveToFileMount.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +properties.saveToFileMount +-------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.ImageUpload.properties.saveToFileMount + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + ImageUpload: + properties: + containerClassAttribute: input + elementClassAttribute: lightbox + elementErrorClassAttribute: error + saveToFileMount: '1:/user_upload/' + allowedMimeTypes: + - image/jpeg + - image/png + - image/bmp + imageLinkMaxWidth: 500 + imageMaxWidth: 500 + imageMaxHeight: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The location (file mount) for the uploaded images. + If this file mount or the property "saveToFileMount" does not exist + the folder in which the form definition lies (persistence identifier) will be used. + If the form is generated programmatically and therefore no persistence identifier exist + the default storage "1:/user_upload/" will be used. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox.rst b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox.rst new file mode 100644 index 0000000..2bf46be --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox.rst @@ -0,0 +1,88 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox: + +=============== +[MultiCheckbox] +=============== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.implementationclassname: +.. include:: MultiCheckbox/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.properties.containerclassattribute: +.. include:: MultiCheckbox/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.properties.elementclassattribute: +.. include:: MultiCheckbox/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.properties.elementDescription: +.. include:: MultiCheckbox/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.properties.elementerrorclassattribute: +.. include:: MultiCheckbox/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor: +.. include:: MultiCheckbox/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.100: +.. include:: MultiCheckbox/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.200: +.. include:: MultiCheckbox/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.230: +.. include:: MultiCheckbox/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.300: +.. include:: MultiCheckbox/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.700: +.. include:: MultiCheckbox/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.800: +.. include:: MultiCheckbox/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.900: +.. include:: MultiCheckbox/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.editors.9999: +.. include:: MultiCheckbox/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.predefineddefaults: +.. include:: MultiCheckbox/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.propertycollections.validators.10: +.. include:: MultiCheckbox/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.propertycollections.validators.10.identifier: +.. include:: MultiCheckbox/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.propertycollections.validators.10.editors.100: +.. include:: MultiCheckbox/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.propertycollections.validators.10.editors.200: +.. include:: MultiCheckbox/formEditor/propertyCollections/validators/10/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.propertycollections.validators.10.editors.300: +.. include:: MultiCheckbox/formEditor/propertyCollections/validators/10/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.propertycollections.validators.10.editors.9999: +.. include:: MultiCheckbox/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.label: +.. include:: MultiCheckbox/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.group: +.. include:: MultiCheckbox/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.groupsorting: +.. include:: MultiCheckbox/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multicheckbox.formeditor.iconidentifier: +.. include:: MultiCheckbox/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor.rst.txt new file mode 100644 index 0000000..dd5c507 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor.rst.txt @@ -0,0 +1,122 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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 + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.MultiCheckbox.label + group: select + groupSorting: 400 + iconIdentifier: form-multi-checkbox diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..2ec405b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..8349e51 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..2e39857 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..0501655 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 300: + identifier: options + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.SelectionMixin.editor.options.label + propertyPath: properties.options + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + multiSelection: true diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..7e38913 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..e6df211 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..27fb532 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/900.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 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 + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..7a4f3c4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiCheckbox: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/group.rst.txt new file mode 100644 index 0000000..7a068ea --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiCheckbox: + formEditor: + group: select + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..79d9d50 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiCheckbox: + formEditor: + groupSorting: 400 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..ab92ee3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiCheckbox: + formEditor: + iconIdentifier: form-multi-checkbox + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/label.rst.txt new file mode 100644 index 0000000..1d14898 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiCheckbox: + formEditor: + label: formEditor.elements.MultiCheckbox.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..f08fadc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + MultiCheckbox: + formEditor: + predefinedDefaults: + properties: + options: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..fcc4646 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + MultiCheckbox: + formEditor: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..0e08597 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiCheckbox: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/200.rst.txt new file mode 100644 index 0000000..b51708c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/200.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiCheckbox: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/300.rst.txt new file mode 100644 index 0000000..9b3b972 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/300.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiCheckbox: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..2bb1537 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiCheckbox: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..30c7d4b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + MultiCheckbox: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/implementationClassName.rst.txt new file mode 100644 index 0000000..b526da7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + MultiCheckbox: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..0101d2e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiCheckbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..841024a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + MultiCheckbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementDescription.rst.txt new file mode 100644 index 0000000..1508442 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..af30c32 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiCheckbox/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiCheckbox.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + MultiCheckbox: + properties: + containerClassAttribute: 'input checkbox' + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect.rst b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect.rst new file mode 100644 index 0000000..ca0d496 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect.rst @@ -0,0 +1,97 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect: + +============= +[MultiSelect] +============= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.implementationclassname: +.. include:: MultiSelect/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.properties.containerclassattribute: +.. include:: MultiSelect/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.properties.elementclassattribute: +.. include:: MultiSelect/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.properties.elementDescription: +.. include:: MultiSelect/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.properties.elementerrorclassattribute: +.. include:: MultiSelect/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.properties.prependOptionLabel: +.. include:: MultiSelect/properties/prependOptionLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.properties.prependOptionValue: +.. include:: MultiSelect/properties/prependOptionValue.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor: +.. include:: MultiSelect/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.100: +.. include:: MultiSelect/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.200: +.. include:: MultiSelect/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.230: +.. include:: MultiSelect/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.250: +.. include:: MultiSelect/formEditor/editors/250.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.300: +.. include:: MultiSelect/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.700: +.. include:: MultiSelect/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.800: +.. include:: MultiSelect/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.900: +.. include:: MultiSelect/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.editors.9999: +.. include:: MultiSelect/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.predefineddefaults: +.. include:: MultiSelect/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.propertycollections.validators.10: +.. include:: MultiSelect/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.propertycollections.validators.10.identifier: +.. include:: MultiSelect/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.propertycollections.validators.10.editors.100: +.. include:: MultiSelect/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.propertycollections.validators.10.editors.200: +.. include:: MultiSelect/formEditor/propertyCollections/validators/10/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.propertycollections.validators.10.editors.300: +.. include:: MultiSelect/formEditor/propertyCollections/validators/10/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.propertycollections.validators.10.editors.9999: +.. include:: MultiSelect/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.label: +.. include:: MultiSelect/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.group: +.. include:: MultiSelect/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.groupsorting: +.. include:: MultiSelect/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.multiselect.formeditor.iconidentifier: +.. include:: MultiSelect/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor.rst.txt new file mode 100644 index 0000000..6555052 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor.rst.txt @@ -0,0 +1,131 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + 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 + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + doNotSetIfPropertyValueIsEmpty: true + 300: + identifier: options + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.SelectionMixin.editor.options.label + propertyPath: properties.options + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.MultiSelect.label + group: select + groupSorting: 500 + iconIdentifier: form-multi-select diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..2034bbe --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..a77d795 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..64fa7b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/250.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/250.rst.txt new file mode 100644 index 0000000..749ceda --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/250.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.250 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.250 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 250: + identifier: inactiveOption + templateName: Inspector-TextEditor + label: formEditor.elements.SelectionMixin.editor.inactiveOption.label + propertyPath: properties.prependOptionLabel + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + doNotSetIfPropertyValueIsEmpty: true diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..2920b46 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 300: + identifier: options + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.SelectionMixin.editor.options.label + propertyPath: properties.options + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + multiSelection: true diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..706c496 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..afb79e1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..4261a3d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/900.rst.txt @@ -0,0 +1,40 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 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 + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..e5bfe21 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + MultiSelect: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/group.rst.txt new file mode 100644 index 0000000..bf29e08 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiSelect: + formEditor: + group: select + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..711f7ca --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiSelect: + formEditor: + groupSorting: 500 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..7001c63 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiSelect: + formEditor: + iconIdentifier: form-multi-select + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/label.rst.txt new file mode 100644 index 0000000..416e597 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiSelect: + formEditor: + label: formEditor.elements.MultiSelect.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..bce6455 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + MultiSelect: + formEditor: + predefinedDefaults: + properties: + options: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..2c2e143 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + MultiSelect: + formEditor: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..43f9e8d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiSelect: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/200.rst.txt new file mode 100644 index 0000000..6c85709 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/200.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiSelect: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/300.rst.txt new file mode 100644 index 0000000..74662d3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/300.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiSelect: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..2fd25a7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + MultiSelect: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..f274f97 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + MultiSelect: + formEditor: + propertyCollections: + validators: + 10: + identifier: Count + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/implementationClassName.rst.txt new file mode 100644 index 0000000..b55f171 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + MultiSelect: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..ad1dd13 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + MultiSelect: + properties: + containerClassAttribute: input + elementClassAttribute: xlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..1e5bf0b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + MultiSelect: + properties: + containerClassAttribute: input + elementClassAttribute: xlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementDescription.rst.txt new file mode 100644 index 0000000..98b90a7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..62e7127 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + MultiSelect: + properties: + containerClassAttribute: input + elementClassAttribute: xlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionLabel.rst.txt new file mode 100644 index 0000000..0c61ae1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionLabel.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +properties.prependOptionLabel +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.properties.prependOptionLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + undefined + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + If set, this label will be shown as first select-option. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionValue.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionValue.rst.txt new file mode 100644 index 0000000..01b1b42 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/MultiSelect/properties/prependOptionValue.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +properties.prependOptionValue +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.MultiSelect.properties.prependOptionValue + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + undefined + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + If set, this value will be set for the first select-option. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Number.rst new file mode 100644 index 0000000..a0f27fb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number.rst @@ -0,0 +1,106 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number: + +======== +[Number] +======== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.implementationclassname: +.. include:: Number/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.properties.containerclassattribute: +.. include:: Number/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.properties.elementclassattribute: +.. include:: Number/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.properties.elementDescription: +.. include:: Number/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.properties.elementerrorclassattribute: +.. include:: Number/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.validators: +.. include:: Number/validators.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor: +.. include:: Number/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.100: +.. include:: Number/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.200: +.. include:: Number/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.230: +.. include:: Number/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.400: +.. include:: Number/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.500: +.. include:: Number/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.550: +.. include:: Number/formEditor/editors/550.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.700: +.. include:: Number/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.800: +.. include:: Number/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.900: +.. include:: Number/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.editors.9999: +.. include:: Number/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.predefineddefaults: +.. include:: Number/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.60: +.. include:: Number/formEditor/propertyCollections/validators/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.60.identifier: +.. include:: Number/formEditor/propertyCollections/validators/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.60.editors.100: +.. include:: Number/formEditor/propertyCollections/validators/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.70: +.. include:: Number/formEditor/propertyCollections/validators/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.70.identifier: +.. include:: Number/formEditor/propertyCollections/validators/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.70.editors.100: +.. include:: Number/formEditor/propertyCollections/validators/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.70.editors.200: +.. include:: Number/formEditor/propertyCollections/validators/70/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.70.editors.300: +.. include:: Number/formEditor/propertyCollections/validators/70/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.propertycollections.validators.70.editors.9999: +.. include:: Number/formEditor/propertyCollections/validators/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.label: +.. include:: Number/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.group: +.. include:: Number/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.groupsorting: +.. include:: Number/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.number.formeditor.iconidentifier: +.. include:: Number/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor.rst.txt new file mode 100644 index 0000000..ba58cbf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor.rst.txt @@ -0,0 +1,152 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Number: + 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: IntegerOrEmpty + 550: + identifier: step + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.step.label + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label + 60: + value: Number + label: formEditor.elements.Number.editor.validators.Number.label + 80: + value: NumberRange + label: formEditor.elements.TextMixin.editor.validators.NumberRange.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + defaultValue: '' + properties: + fluidAdditionalAttributes: + step: 1 + validators: + - + identifier: Number + propertyCollections: + validators: + 60: + identifier: Number + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Number.editor.header.label + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Number.label + group: html5 + groupSorting: 400 + iconIdentifier: form-number diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..4b993b4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/100.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..a4955cb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/200.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..51e1073 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..226a8fc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..6da2e6d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/500.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/550.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/550.rst.txt new file mode 100644 index 0000000..b696d05 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/550.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.550 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.550 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 550: + identifier: step + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.step.label + propertyPath: properties.fluidAdditionalAttributes.step + propertyValidators: + 10: Integer + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..3b36558 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..624b6d0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..88b2bdb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/900.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label + 60: + value: Number + label: formEditor.elements.Number.editor.validators.Number.label + 80: + value: NumberRange + label: formEditor.elements.TextMixin.editor.validators.NumberRange.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..50324d6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Number: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/group.rst.txt new file mode 100644 index 0000000..5dae9cd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/group.rst.txt @@ -0,0 +1,28 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Number: + formEditor: + group: html5 + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..b4db99a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Number: + formEditor: + groupSorting: 400 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..87d5c3a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Number: + formEditor: + iconIdentifier: form-number + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/label.rst.txt new file mode 100644 index 0000000..2b17e51 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Number: + formEditor: + label: formEditor.elements.Number.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..a7576c5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Number: + formEditor: + predefinedDefaults: + defaultValue: '' + properties: + fluidAdditionalAttributes: + step: 1 + validators: + - + identifier: Number + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60.rst.txt new file mode 100644 index 0000000..a8050ea --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Number: + formEditor: + propertyCollections: + validators: + 60: + identifier: Number + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Number.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/editors/100.rst.txt new file mode 100644 index 0000000..8036662 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Number: + formEditor: + propertyCollections: + validators: + 60: + identifier: Number + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Number.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/identifier.rst.txt new file mode 100644 index 0000000..d798170 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/60/identifier.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Number: + formEditor: + propertyCollections: + validators: + 60: + identifier: Number + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Number.editor.header.label + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70.rst.txt new file mode 100644 index 0000000..06352be --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Number: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/100.rst.txt new file mode 100644 index 0000000..69b7303 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Number: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/200.rst.txt new file mode 100644 index 0000000..1b7ddbb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.70.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Number: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/300.rst.txt new file mode 100644 index 0000000..392ef9d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.70.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Number: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/9999.rst.txt new file mode 100644 index 0000000..866cc9c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Number: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/identifier.rst.txt new file mode 100644 index 0000000..e5ba789 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/formEditor/propertyCollections/validators/70/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.formEditor.propertyCollections.validators.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Number: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/implementationClassName.rst.txt new file mode 100644 index 0000000..e5083ce --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Number: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..be89d27 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Number: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..d7c41d4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Number: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementDescription.rst.txt new file mode 100644 index 0000000..d740fbd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..7e5e31c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Number: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Number/validators.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Number/validators.rst.txt new file mode 100644 index 0000000..f345021 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Number/validators.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt +validators +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Number.validators + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Number: + validators: + - + identifier: Number + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Predefined validators. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Page.rst new file mode 100644 index 0000000..baa9275 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page.rst @@ -0,0 +1,67 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page: + +====== +[Page] +====== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.implementationclassname: +.. include:: Page/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.renderingoptions._iscompositeformelement: +.. include:: Page/renderingOptions/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.renderingoptions._istoplevelformelement: +.. include:: Page/renderingOptions/_isTopLevelFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.renderingoptions.nextbuttonlabel: +.. include:: Page/renderingOptions/nextButtonLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.renderingoptions.previousbuttonlabel: +.. include:: Page/renderingOptions/previousButtonLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor: +.. include:: Page/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.editors.100: +.. include:: Page/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.editors.200: +.. include:: Page/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.editors.300: +.. include:: Page/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.editors.400: +.. include:: Page/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.editors.9999: +.. include:: Page/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.predefineddefaults: +.. include:: Page/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor._iscompositeformelement: +.. include:: Page/formEditor/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor._istoplevelformelement: +.. include:: Page/formEditor/_isTopLevelFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.label: +.. include:: Page/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.group: +.. include:: Page/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.groupsorting: +.. include:: Page/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.page.formeditor.iconidentifier: +.. include:: Page/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor.rst.txt new file mode 100644 index 0000000..627bbb5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor.rst.txt @@ -0,0 +1,56 @@ +.. include:: /Includes.rst.txt + +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Page: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.Page.editor.label.label + propertyPath: 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' + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..d71a53a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isCompositeFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isCompositeFormElement +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Page: + formEditor: + _isCompositeFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isTopLevelFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isTopLevelFormElement.rst.txt new file mode 100644 index 0000000..5838c76 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/_isTopLevelFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isTopLevelFormElement +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor._isTopLevelFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Page: + formEditor: + _isTopLevelFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element must not have a parent form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..4529bdd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Page: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..5cec555 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Page: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.Page.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..f8a87b0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/300.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 300: + identifier: 'previousButtonLabel' + templateName: 'Inspector-TextEditor' + label: 'formEditor.elements.Page.editor.previousButtonLabel.label' + propertyPath: 'renderingOptions.previousButtonLabel' diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..bdd0350 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/400.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 400: + identifier: 'nextButtonLabel' + templateName: 'Inspector-TextEditor' + label: 'formEditor.elements.Page.editor.nextButtonLabel.label' + propertyPath: 'renderingOptions.nextButtonLabel' diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..a6eb982 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Page: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/group.rst.txt new file mode 100644 index 0000000..62b6b20 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Page: + formEditor: + group: page + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..a08ed34 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Page: + formEditor: + groupSorting: 100 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..af57d34 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Page: + formEditor: + iconIdentifier: form-page + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/label.rst.txt new file mode 100644 index 0000000..6c56e24 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Page: + formEditor: + label: formEditor.elements.Page.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..4a9a720 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Page: + formEditor: + predefinedDefaults: + renderingOptions: + previousButtonLabel: 'formEditor.elements.Page.editor.previousButtonLabel.value' + nextButtonLabel: 'formEditor.elements.Page.editor.nextButtonLabel.value' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/implementationClassName.rst.txt new file mode 100644 index 0000000..a650336 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Page: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Page + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..714dc12 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isCompositeFormElement.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions._isCompositeFormElement +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.renderingOptions._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Page: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: true + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isTopLevelFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isTopLevelFormElement.rst.txt new file mode 100644 index 0000000..e612adc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/_isTopLevelFormElement.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions._isTopLevelFormElement +--------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.renderingOptions._isTopLevelFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Page: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: true + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element must not have a parent form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/nextButtonLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/nextButtonLabel.rst.txt new file mode 100644 index 0000000..81d2d7e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/nextButtonLabel.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions.nextButtonLabel +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.renderingOptions.nextButtonLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Page: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the "next page" Button. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/previousButtonLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/previousButtonLabel.rst.txt new file mode 100644 index 0000000..de05ca8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Page/renderingOptions/previousButtonLabel.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions.previousButtonLabel +------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.Page.renderingOptions.previousButtonLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Page: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the "previous page" Button. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Password.rst new file mode 100644 index 0000000..69002bd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password.rst @@ -0,0 +1,184 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password: + +========== +[Password] +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.implementationclassname: +.. include:: Password/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.properties.containerclassattribute: +.. include:: Password/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.properties.elementclassattribute: +.. include:: Password/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.properties.elementDescription: +.. include:: Password/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.properties.elementerrorclassattribute: +.. include:: Password/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor: +.. include:: Password/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.100: +.. include:: Password/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.200: +.. include:: Password/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.230: +.. include:: Password/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.400: +.. include:: Password/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.500: +.. include:: Password/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.700: +.. include:: Password/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.800: +.. include:: Password/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.900: +.. include:: Password/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.editors.9999: +.. include:: Password/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.predefineddefaults: +.. include:: Password/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.10: +.. include:: Password/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.10.identifier: +.. include:: Password/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.10.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.10.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.20: +.. include:: Password/formEditor/propertyCollections/validators/20.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.20.identifier: +.. include:: Password/formEditor/propertyCollections/validators/20/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.20.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/20/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.20.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/20/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.30: +.. include:: Password/formEditor/propertyCollections/validators/30.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.30.identifier: +.. include:: Password/formEditor/propertyCollections/validators/30/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.30.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/30/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.30.editors.200: +.. include:: Password/formEditor/propertyCollections/validators/30/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.30.editors.300: +.. include:: Password/formEditor/propertyCollections/validators/30/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.30.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/30/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.40: +.. include:: Password/formEditor/propertyCollections/validators/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.40.identifier: +.. include:: Password/formEditor/propertyCollections/validators/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.40.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.40.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/40/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.50: +.. include:: Password/formEditor/propertyCollections/validators/50.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.50.identifier: +.. include:: Password/formEditor/propertyCollections/validators/50/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.50.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/50/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.50.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/50/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.60: +.. include:: Password/formEditor/propertyCollections/validators/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.60.identifier: +.. include:: Password/formEditor/propertyCollections/validators/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.60.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.60.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/60/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.70: +.. include:: Password/formEditor/propertyCollections/validators/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.70.identifier: +.. include:: Password/formEditor/propertyCollections/validators/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.70.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.70.editors.200: +.. include:: Password/formEditor/propertyCollections/validators/70/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.70.editors.300: +.. include:: Password/formEditor/propertyCollections/validators/70/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.70.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.80: +.. include:: Password/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.80.identifier: +.. include:: Password/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.80.editors.100: +.. include:: Password/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.80.editors.200: +.. include:: Password/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.propertycollections.validators.80.editors.9999: +.. include:: Password/formEditor/propertyCollections/validators/80/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.label: +.. include:: Password/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.group: +.. include:: Password/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.groupsorting: +.. include:: Password/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.password.formeditor.iconidentifier: +.. include:: Password/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor.rst.txt new file mode 100644 index 0000000..5b71bc8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor.rst.txt @@ -0,0 +1,240 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Password: + 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 + compatibilityPropertyPath: properties.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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Password.label + group: input + groupSorting: 300 + iconIdentifier: form-password diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..74d75b4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..c103bbf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/200.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..d34b46a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..cb3b050 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..99a8b5f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/500.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..777bd9b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..2d8df5f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..f2d4392 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/900.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 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 + 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 + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..89da0f9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Password: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/group.rst.txt new file mode 100644 index 0000000..a288563 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Password: + formEditor: + group: input + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..4d8a835 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Password: + formEditor: + groupSorting: 300 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..90ef86a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Password: + formEditor: + iconIdentifier: form-password + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/label.rst.txt new file mode 100644 index 0000000..b4ac401 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Password: + formEditor: + label: formEditor.elements.Password.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..c3fb54f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Password: + formEditor: + predefinedDefaults: + defaultValue: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..b095c17 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..4ef2712 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..df490c5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..32b0dc0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20.rst.txt new file mode 100644 index 0000000..6fc020b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.20 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/100.rst.txt new file mode 100644 index 0000000..01ecd9b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.20.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/9999.rst.txt new file mode 100644 index 0000000..4192a78 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.20.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/identifier.rst.txt new file mode 100644 index 0000000..b8880a5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/20/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.20.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.20.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30.rst.txt new file mode 100644 index 0000000..90065cf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.30 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/100.rst.txt new file mode 100644 index 0000000..5333467 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.30.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/200.rst.txt new file mode 100644 index 0000000..8370c71 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.30.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.minlength + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/300.rst.txt new file mode 100644 index 0000000..2c2aac4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.30.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.maxlength + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/9999.rst.txt new file mode 100644 index 0000000..89bb2bf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.30.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/identifier.rst.txt new file mode 100644 index 0000000..9ef4659 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/30/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.30.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.30.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40.rst.txt new file mode 100644 index 0000000..85fc0f6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/100.rst.txt new file mode 100644 index 0000000..6f91a12 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/9999.rst.txt new file mode 100644 index 0000000..c145c16 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.40.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/identifier.rst.txt new file mode 100644 index 0000000..e4e3470 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/40/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50.rst.txt new file mode 100644 index 0000000..7c3ad19 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.50 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/100.rst.txt new file mode 100644 index 0000000..311431c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.50.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/9999.rst.txt new file mode 100644 index 0000000..e799b6c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.50.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/identifier.rst.txt new file mode 100644 index 0000000..b6ce551 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/50/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.50.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.50.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60.rst.txt new file mode 100644 index 0000000..7d8c130 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/100.rst.txt new file mode 100644 index 0000000..4444a6c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/9999.rst.txt new file mode 100644 index 0000000..21530c0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.60.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/identifier.rst.txt new file mode 100644 index 0000000..8886ce9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/60/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70.rst.txt new file mode 100644 index 0000000..2b595b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/100.rst.txt new file mode 100644 index 0000000..a8361d8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/200.rst.txt new file mode 100644 index 0000000..1746fad --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.70.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/300.rst.txt new file mode 100644 index 0000000..e8d7ea0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.70.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/9999.rst.txt new file mode 100644 index 0000000..d924daa --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/identifier.rst.txt new file mode 100644 index 0000000..d6646ec --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/70/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..8f8472d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Password: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..ef3f2c0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..ea37f80 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/9999.rst.txt new file mode 100644 index 0000000..002de6b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.80.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Password: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..be9fccf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Password: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/implementationClassName.rst.txt new file mode 100644 index 0000000..611c455 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Password: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..023645e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Password: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..e0aac0d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Password: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementDescription.rst.txt new file mode 100644 index 0000000..06a87cb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..5a46915 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Password/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Password.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Password: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton.rst b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton.rst new file mode 100644 index 0000000..36c5406 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton.rst @@ -0,0 +1,67 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton: + +============= +[RadioButton] +============= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.implementationclassname: +.. include:: RadioButton/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.properties.containerclassattribute: +.. include:: RadioButton/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.properties.elementclassattribute: +.. include:: RadioButton/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.properties.elementDescription: +.. include:: RadioButton/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.properties.elementerrorclassattribute: +.. include:: RadioButton/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor: +.. include:: RadioButton/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.100: +.. include:: RadioButton/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.200: +.. include:: RadioButton/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.230: +.. include:: RadioButton/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.300: +.. include:: RadioButton/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.700: +.. include:: RadioButton/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.800: +.. include:: RadioButton/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.editors.9999: +.. include:: RadioButton/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.predefineddefaults: +.. include:: RadioButton/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.label: +.. include:: RadioButton/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.group: +.. include:: RadioButton/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.groupsorting: +.. include:: RadioButton/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.radiobutton.formeditor.iconidentifier: +.. include:: RadioButton/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor.rst.txt new file mode 100644 index 0000000..2895039 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor.rst.txt @@ -0,0 +1,87 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + RadioButton: + 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 + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + multiSelection: false + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + options: { } + label: formEditor.elements.RadioButton.label + group: select + groupSorting: 300 + iconIdentifier: form-radio-button diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..eb188f5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + RadioButton: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..e808e57 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + RadioButton: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..e95a98b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..2f09272 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + RadioButton: + formEditor: + editors: + 300: + identifier: options + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.SelectionMixin.editor.options.label + propertyPath: properties.options + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + multiSelection: false diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..a120c79 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + RadioButton: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..9bb00cd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + RadioButton: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..1b2ce61 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + RadioButton: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/group.rst.txt new file mode 100644 index 0000000..8d798ef --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + RadioButton: + formEditor: + group: select + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..7b1d1a9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + RadioButton: + formEditor: + groupSorting: 300 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..6e67ba3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + RadioButton: + formEditor: + iconIdentifier: form-radio-button + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/label.rst.txt new file mode 100644 index 0000000..8cdecca --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + RadioButton: + formEditor: + label: formEditor.elements.RadioButton.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..667c95f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + RadioButton: + formEditor: + predefinedDefaults: + properties: + options: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/implementationClassName.rst.txt new file mode 100644 index 0000000..1da723e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + RadioButton: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..ef38157 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + RadioButton: + properties: + containerClassAttribute: input + elementClassAttribute: xlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..6182175 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + RadioButton: + properties: + containerClassAttribute: input + elementClassAttribute: xlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementDescription.rst.txt new file mode 100644 index 0000000..cda6c1c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..071fa3d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/RadioButton/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.RadioButton.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + RadioButton: + properties: + containerClassAttribute: input + elementClassAttribute: xlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect.rst b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect.rst new file mode 100644 index 0000000..0bdf400 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect.rst @@ -0,0 +1,76 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect: + +============== +[SingleSelect] +============== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.implementationclassname: +.. include:: SingleSelect/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.properties.containerclassattribute: +.. include:: SingleSelect/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.properties.elementclassattribute: +.. include:: SingleSelect/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.properties.elementDescription: +.. include:: SingleSelect/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.properties.elementerrorclassattribute: +.. include:: SingleSelect/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.properties.prependOptionLabel: +.. include:: SingleSelect/properties/prependOptionLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.properties.prependOptionValue: +.. include:: SingleSelect/properties/prependOptionValue.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor: +.. include:: SingleSelect/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.100: +.. include:: SingleSelect/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.200: +.. include:: SingleSelect/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.230: +.. include:: SingleSelect/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.250: +.. include:: SingleSelect/formEditor/editors/250.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.300: +.. include:: SingleSelect/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.700: +.. include:: SingleSelect/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.800: +.. include:: SingleSelect/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.editors.9999: +.. include:: SingleSelect/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.predefineddefaults: +.. include:: SingleSelect/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.label: +.. include:: SingleSelect/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.group: +.. include:: SingleSelect/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.groupsorting: +.. include:: SingleSelect/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.singleselect.formeditor.iconidentifier: +.. include:: SingleSelect/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor.rst.txt new file mode 100644 index 0000000..c1d7583 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor.rst.txt @@ -0,0 +1,94 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + SingleSelect: + 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 + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + doNotSetIfPropertyValueIsEmpty: true + 300: + identifier: options + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.SelectionMixin.editor.options.label + propertyPath: properties.options + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + multiSelection: false + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + options: { } + label: formEditor.elements.SingleSelect.label + group: select + groupSorting: 200 + iconIdentifier: form-single-select diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..a907692 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..66dcc4c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..049afb2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/250.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/250.rst.txt new file mode 100644 index 0000000..580c15f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/250.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.250 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.250 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 250: + identifier: inactiveOption + templateName: Inspector-TextEditor + label: formEditor.elements.SelectionMixin.editor.inactiveOption.label + propertyPath: properties.prependOptionLabel + description: formEditor.elements.SelectionMixin.editor.inactiveOption.description + doNotSetIfPropertyValueIsEmpty: true diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..503a5d1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[PropertyGridEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 300: + identifier: options + templateName: Inspector-PropertyGridEditor + label: formEditor.elements.SelectionMixin.editor.options.label + propertyPath: properties.options + isSortable: true + enableAddRow: true + enableDeleteRow: true + removeLastAvailableRowFlashMessageTitle: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageTitle + removeLastAvailableRowFlashMessageMessage: formEditor.elements.SelectionMixin.editor.options.removeLastAvailableRowFlashMessageMessage + multiSelection: false diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..63493c8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..6849fab --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/800.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..03ba3b9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SingleSelect: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/group.rst.txt new file mode 100644 index 0000000..fd8e389 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SingleSelect: + formEditor: + group: select + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..3ca63c2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SingleSelect: + formEditor: + groupSorting: 200 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..7fb81da --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SingleSelect: + formEditor: + iconIdentifier: form-single-select + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/label.rst.txt new file mode 100644 index 0000000..16c7293 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SingleSelect: + formEditor: + label: formEditor.elements.SingleSelect.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..dd1c61a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + SingleSelect: + formEditor: + predefinedDefaults: + properties: + options: { } + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/implementationClassName.rst.txt new file mode 100644 index 0000000..6a8629e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + SingleSelect: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..b6cbc24 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SingleSelect: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..5b25028 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + SingleSelect: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementDescription.rst.txt new file mode 100644 index 0000000..45c3d0d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..278ce12 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + SingleSelect: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionLabel.rst.txt new file mode 100644 index 0000000..ea14137 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionLabel.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +properties.prependOptionLabel +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.properties.prependOptionLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + undefined + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + If set, this label will be shown as first select-option. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionValue.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionValue.rst.txt new file mode 100644 index 0000000..ccec179 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SingleSelect/properties/prependOptionValue.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +properties.prependOptionValue +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SingleSelect.properties.prependOptionValue + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + undefined + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + If set, this value will be set for the first select-option. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText.rst b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText.rst new file mode 100644 index 0000000..e60377d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText.rst @@ -0,0 +1,52 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext: + +============ +[StaticText] +============ + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.implementationclassname: +.. include:: StaticText/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.properties.text: +.. include:: StaticText/properties/text.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor: +.. include:: StaticText/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.editors.100: +.. include:: StaticText/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.editors.200: +.. include:: StaticText/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.editors.300: +.. include:: StaticText/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.editors.700: +.. include:: StaticText/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.editors.9999: +.. include:: StaticText/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.predefineddefaults: +.. include:: StaticText/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.label: +.. include:: StaticText/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.group: +.. include:: StaticText/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.groupsorting: +.. include:: StaticText/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.statictext.formeditor.iconidentifier: +.. include:: StaticText/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor.rst.txt new file mode 100644 index 0000000..c4b9d8c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor.rst.txt @@ -0,0 +1,70 @@ +.. include:: /Includes.rst.txt + +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + StaticText: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.ReadOnlyFormElement.editor.label.label + propertyPath: label + 300: + identifier: staticText + templateName: Inspector-TextareaEditor + label: formEditor.elements.StaticText.editor.staticText.label + propertyPath: properties.text + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + properties: + text: '' + label: formEditor.elements.StaticText.label + group: custom + groupSorting: 600 + iconIdentifier: form-static-text diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..1e7d374 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + StaticText: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..735aee4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + StaticText: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.ReadOnlyFormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..fdb88b8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/300.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextareaEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + StaticText: + formEditor: + editors: + 300: + identifier: staticText + templateName: Inspector-TextareaEditor + label: formEditor.elements.StaticText.editor.staticText.label + propertyPath: properties.text diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..42fec99 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/700.rst.txt @@ -0,0 +1,50 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + StaticText: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..4ef1245 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + StaticText: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/group.rst.txt new file mode 100644 index 0000000..4dd901e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + StaticText: + formEditor: + group: custom + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..c33982c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + StaticText: + formEditor: + groupSorting: 600 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..f5502c1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + StaticText: + formEditor: + iconIdentifier: form-static-text + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/label.rst.txt new file mode 100644 index 0000000..bed77c1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + StaticText: + formEditor: + label: formEditor.elements.StaticText.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..bdd8e62 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + StaticText: + formEditor: + predefinedDefaults: + properties: + text: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/implementationClassName.rst.txt new file mode 100644 index 0000000..9a36810 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + StaticText: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/properties/text.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/properties/text.rst.txt new file mode 100644 index 0000000..ede3983 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/StaticText/properties/text.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +properties.text +--------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.StaticText.properties.text + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + StaticText: + properties: + text: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The text to display. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage.rst b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage.rst new file mode 100644 index 0000000..c8e6fda --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage.rst @@ -0,0 +1,67 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarysummarypage: + +============= +[SummaryPage] +============= + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarysummarypage-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.implementationclassname: +.. include:: SummaryPage/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.renderingoptions._iscompositeformelement: +.. include:: SummaryPage/renderingOptions/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.renderingoptions._istoplevelformelement: +.. include:: SummaryPage/renderingOptions/_isTopLevelFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.renderingoptions.nextbuttonlabel: +.. include:: SummaryPage/renderingOptions/nextButtonLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.renderingoptions.previousbuttonlabel: +.. include:: SummaryPage/renderingOptions/previousButtonLabel.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor: +.. include:: SummaryPage/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.editors.100: +.. include:: SummaryPage/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.editors.200: +.. include:: SummaryPage/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.editors.300: +.. include:: SummaryPage/formEditor/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.editors.400: +.. include:: SummaryPage/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.editors.9999: +.. include:: SummaryPage/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.predefineddefaults: +.. include:: SummaryPage/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor._iscompositeformelement: +.. include:: SummaryPage/formEditor/_isCompositeFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor._istoplevelformelement: +.. include:: SummaryPage/formEditor/_isTopLevelFormElement.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.label: +.. include:: SummaryPage/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.group: +.. include:: SummaryPage/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.groupsorting: +.. include:: SummaryPage/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.summarypage.formeditor.iconidentifier: +.. include:: SummaryPage/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor.rst.txt new file mode 100644 index 0000000..eb6d0d1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor.rst.txt @@ -0,0 +1,56 @@ +.. include:: /Includes.rst.txt + +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + SummaryPage: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.SummaryPage.editor.label.label + propertyPath: 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' + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..746d00b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isCompositeFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isCompositeFormElement +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + SummaryPage: + formEditor: + _isCompositeFormElement: false + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isTopLevelFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isTopLevelFormElement.rst.txt new file mode 100644 index 0000000..412ed63 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/_isTopLevelFormElement.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor._isTopLevelFormElement +--------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor._isTopLevelFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + SummaryPage: + formEditor: + _isTopLevelFormElement: true + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element must not have a parent form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..5642347 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SummaryPage: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..e913f04 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SummaryPage: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.SummaryPage.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/300.rst.txt new file mode 100644 index 0000000..0233413 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/300.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.300 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 300: + identifier: 'previousButtonLabel' + templateName: 'Inspector-TextEditor' + label: 'formEditor.elements.SummaryPage.editor.previousButtonLabel.label' + propertyPath: 'renderingOptions.previousButtonLabel' diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..e0ba2af --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/400.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Form: + formEditor: + editors: + 400: + identifier: 'nextButtonLabel' + templateName: 'Inspector-TextEditor' + label: 'formEditor.elements.SummaryPage.editor.nextButtonLabel.label' + propertyPath: 'renderingOptions.nextButtonLabel' diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..5ee1891 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + SummaryPage: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/group.rst.txt new file mode 100644 index 0000000..667cbda --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SummaryPage: + formEditor: + group: page + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..2cca72a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SummaryPage: + formEditor: + groupSorting: 200 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..5a7f00f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SummaryPage: + formEditor: + iconIdentifier: form-summary-page + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/label.rst.txt new file mode 100644 index 0000000..7640e6b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SummaryPage: + formEditor: + label: formEditor.elements.SummaryPage.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..3a2fce2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + SummaryPage: + formEditor: + predefinedDefaults: + renderingOptions: + previousButtonLabel: 'formEditor.elements.SummaryPage.editor.previousButtonLabel.value' + nextButtonLabel: 'formEditor.elements.SummaryPage.editor.nextButtonLabel.value' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/implementationClassName.rst.txt new file mode 100644 index 0000000..973ff69 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + SummaryPage: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Page + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isCompositeFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isCompositeFormElement.rst.txt new file mode 100644 index 0000000..755a9e7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isCompositeFormElement.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions._isCompositeFormElement +---------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.renderingOptions._isCompositeFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + SummaryPage: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element contains child form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isTopLevelFormElement.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isTopLevelFormElement.rst.txt new file mode 100644 index 0000000..072d9e4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/_isTopLevelFormElement.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions._isTopLevelFormElement +--------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.renderingOptions._isTopLevelFormElement + +:aspect:`Data type` + bool + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + SummaryPage: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Internal control setting to define that the form element must not have a parent form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/nextButtonLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/nextButtonLabel.rst.txt new file mode 100644 index 0000000..df492d3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/nextButtonLabel.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions.nextButtonLabel +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.renderingOptions.nextButtonLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + SummaryPage: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the "next page" Button. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/previousButtonLabel.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/previousButtonLabel.rst.txt new file mode 100644 index 0000000..e31d6c7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/SummaryPage/renderingOptions/previousButtonLabel.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +renderingOptions.previousButtonLabel +------------------------------------ + +:aspect:`Option path` + prototypes..formElementsDefinition.SummaryPage.renderingOptions.previousButtonLabel + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + SummaryPage: + renderingOptions: + _isTopLevelFormElement: true + _isCompositeFormElement: false + nextButtonLabel: 'next Page' + previousButtonLabel: 'previous Page' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The label for the "previous page" Button. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone.rst new file mode 100644 index 0000000..e42af76 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone.rst @@ -0,0 +1,88 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone: + +=========== +[Telephone] +=========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.implementationclassname: +.. include:: Telephone/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.properties.containerclassattribute: +.. include:: Telephone/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.properties.elementclassattribute: +.. include:: Telephone/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.properties.elementDescription: +.. include:: Telephone/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.properties.elementerrorclassattribute: +.. include:: Telephone/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.validators: +.. include:: Telephone/validators.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor: +.. include:: Telephone/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.100: +.. include:: Telephone/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.200: +.. include:: Telephone/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.230: +.. include:: Telephone/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.400: +.. include:: Telephone/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.500: +.. include:: Telephone/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.700: +.. include:: Telephone/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.800: +.. include:: Telephone/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.900: +.. include:: Telephone/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.editors.9999: +.. include:: Telephone/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.predefineddefaults: +.. include:: Telephone/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.propertycollections.validators.80: +.. include:: Telephone/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.propertycollections.validators.80.identifier: +.. include:: Telephone/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.propertycollections.validators.80.editors.100: +.. include:: Telephone/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.propertycollections.validators.80.editors.200: +.. include:: Telephone/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.label: +.. include:: Telephone/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.group: +.. include:: Telephone/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.groupsorting: +.. include:: Telephone/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.telephone.formeditor.iconidentifier: +.. include:: Telephone/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor.rst.txt new file mode 100644 index 0000000..90b1e23 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor.rst.txt @@ -0,0 +1,112 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Telephone: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + predefinedDefaults: + defaultValue: '' + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + label: formEditor.elements.Telephone.label + group: html5 + groupSorting: 200 + iconIdentifier: form-telephone diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..8e584b3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/100.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..41dd184 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/200.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..947b2a2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..eb42a13 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..57ed066 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/500.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..0f9960b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/700.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..bc22c80 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..bb93189 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/900.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..676247e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Telephone: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/group.rst.txt new file mode 100644 index 0000000..f879c04 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/group.rst.txt @@ -0,0 +1,28 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Telephone: + formEditor: + group: html5 + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..28d373d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Telephone: + formEditor: + groupSorting: 200 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..15b8a90 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Telephone: + formEditor: + iconIdentifier: form-telephone + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/label.rst.txt new file mode 100644 index 0000000..70a06e4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Telephone: + formEditor: + label: formEditor.elements.Telephone.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..ed0e9a0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Telephone: + formEditor: + predefinedDefaults: + defaultValue: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..16c9c6b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Telephone: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..e7bdf3c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..b28d456 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Telephone: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..158458e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Telephone: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/implementationClassName.rst.txt new file mode 100644 index 0000000..1d6119d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Telephone: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..397822f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Telephone: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..618293b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Telephone: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementDescription.rst.txt new file mode 100644 index 0000000..8dea7f2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..432543e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Telephone: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/validators.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/validators.rst.txt new file mode 100644 index 0000000..e0772b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Telephone/validators.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +validators +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Telephone.validators + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Telephone: + validators: + - + identifier: RegularExpression + options: + regularExpression: '/^.*$/' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Predefined validators. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Text.rst new file mode 100644 index 0000000..32f4bc7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text.rst @@ -0,0 +1,184 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text: + +====== +[Text] +====== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.implementationclassname: +.. include:: Text/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.properties.containerclassattribute: +.. include:: Text/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.properties.elementclassattribute: +.. include:: Text/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.properties.elementDescription: +.. include:: Text/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.properties.elementerrorclassattribute: +.. include:: Text/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor: +.. include:: Text/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.100: +.. include:: Text/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.200: +.. include:: Text/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.230: +.. include:: Text/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.400: +.. include:: Text/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.500: +.. include:: Text/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.700: +.. include:: Text/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.800: +.. include:: Text/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.900: +.. include:: Text/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.editors.9999: +.. include:: Text/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.predefineddefaults: +.. include:: Text/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.10: +.. include:: Text/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.10.identifier: +.. include:: Text/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.10.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.10.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.20: +.. include:: Text/formEditor/propertyCollections/validators/20.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.20.identifier: +.. include:: Text/formEditor/propertyCollections/validators/20/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.20.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/20/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.20.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/20/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.30: +.. include:: Text/formEditor/propertyCollections/validators/30.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.30.identifier: +.. include:: Text/formEditor/propertyCollections/validators/30/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.30.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/30/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.30.editors.200: +.. include:: Text/formEditor/propertyCollections/validators/30/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.30.editors.300: +.. include:: Text/formEditor/propertyCollections/validators/30/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.30.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/30/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.40: +.. include:: Text/formEditor/propertyCollections/validators/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.40.identifier: +.. include:: Text/formEditor/propertyCollections/validators/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.40.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.40.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/40/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.50: +.. include:: Text/formEditor/propertyCollections/validators/50.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.50.identifier: +.. include:: Text/formEditor/propertyCollections/validators/50/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.50.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/50/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.50.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/50/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.60: +.. include:: Text/formEditor/propertyCollections/validators/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.60.identifier: +.. include:: Text/formEditor/propertyCollections/validators/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.60.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.60.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/60/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.70: +.. include:: Text/formEditor/propertyCollections/validators/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.70.identifier: +.. include:: Text/formEditor/propertyCollections/validators/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.70.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.70.editors.200: +.. include:: Text/formEditor/propertyCollections/validators/70/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.70.editors.300: +.. include:: Text/formEditor/propertyCollections/validators/70/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.70.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.80: +.. include:: Text/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.80.identifier: +.. include:: Text/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.80.editors.100: +.. include:: Text/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.80.editors.200: +.. include:: Text/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.propertycollections.validators.80.editors.9999: +.. include:: Text/formEditor/propertyCollections/validators/80/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.label: +.. include:: Text/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.group: +.. include:: Text/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.groupsorting: +.. include:: Text/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.text.formeditor.iconidentifier: +.. include:: Text/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor.rst.txt new file mode 100644 index 0000000..79047ad --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor.rst.txt @@ -0,0 +1,240 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Text: + 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 + compatibilityPropertyPath: properties.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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Text.label + group: input + groupSorting: 100 + iconIdentifier: form-text diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..36c96f5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/100.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..b3a24a5 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/200.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..9caea2b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..82f1123 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..3818c3e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/500.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..2d743f1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/700.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..94a8d38 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/800.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..56c82dd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/900.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 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 + 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 + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..f835d04 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Text: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/group.rst.txt new file mode 100644 index 0000000..a088b7b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Text: + formEditor: + group: input + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..e5d1156 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Text: + formEditor: + groupSorting: 100 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..fd98e59 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Text: + formEditor: + iconIdentifier: form-text + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/label.rst.txt new file mode 100644 index 0000000..34be80b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Text: + formEditor: + label: formEditor.elements.Text.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..7d105e6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Text: + formEditor: + predefinedDefaults: + defaultValue: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..bc079f2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..6b8eae0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..16b7052 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..034cfdc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20.rst.txt new file mode 100644 index 0000000..7fea11a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.20 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/100.rst.txt new file mode 100644 index 0000000..d967d1e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.20.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/9999.rst.txt new file mode 100644 index 0000000..f255ddd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.20.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/identifier.rst.txt new file mode 100644 index 0000000..2ce70e4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/20/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.20.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.20.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30.rst.txt new file mode 100644 index 0000000..96c1ed4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.30 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/100.rst.txt new file mode 100644 index 0000000..9e36552 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.30.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/200.rst.txt new file mode 100644 index 0000000..b0dfc06 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.30.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.minlength + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/300.rst.txt new file mode 100644 index 0000000..cf32b81 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.30.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.maxlength + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/9999.rst.txt new file mode 100644 index 0000000..8b330c7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.30.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/identifier.rst.txt new file mode 100644 index 0000000..dbc6d76 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/30/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.30.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.30.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40.rst.txt new file mode 100644 index 0000000..97c9f20 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/100.rst.txt new file mode 100644 index 0000000..637f895 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/9999.rst.txt new file mode 100644 index 0000000..d4dc9a1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.40.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/identifier.rst.txt new file mode 100644 index 0000000..f4a1c04 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/40/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50.rst.txt new file mode 100644 index 0000000..b2eb23a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.50 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/100.rst.txt new file mode 100644 index 0000000..e2f5dee --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.50.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/9999.rst.txt new file mode 100644 index 0000000..e6935a8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.50.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/identifier.rst.txt new file mode 100644 index 0000000..fc846b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/50/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.50.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.50.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60.rst.txt new file mode 100644 index 0000000..bd17447 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/100.rst.txt new file mode 100644 index 0000000..010c71a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/9999.rst.txt new file mode 100644 index 0000000..7d99e0d --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.60.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/identifier.rst.txt new file mode 100644 index 0000000..044a5c0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/60/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70.rst.txt new file mode 100644 index 0000000..e9af9db --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/100.rst.txt new file mode 100644 index 0000000..caf4228 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/200.rst.txt new file mode 100644 index 0000000..362a381 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.70.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/300.rst.txt new file mode 100644 index 0000000..f235705 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.70.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/9999.rst.txt new file mode 100644 index 0000000..a6bbc62 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/identifier.rst.txt new file mode 100644 index 0000000..33da6a9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/70/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..ce6d535 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Text: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..e7bdf3c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..251e38f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/9999.rst.txt new file mode 100644 index 0000000..c4377e3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..46ecb23 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Text: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/implementationClassName.rst.txt new file mode 100644 index 0000000..29446fd --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Text: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..71481d8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Text: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..288b99f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Text: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementDescription.rst.txt new file mode 100644 index 0000000..cd68a17 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..c51e6c0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Text/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Text: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea.rst new file mode 100644 index 0000000..73a078a --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea.rst @@ -0,0 +1,184 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textareaarea: + +========== +[Textarea] +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textareaarea-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.implementationclassname: +.. include:: Textarea/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.properties.containerclassattribute: +.. include:: Textarea/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.properties.elementclassattribute: +.. include:: Textarea/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.properties.elementDescription: +.. include:: Textarea/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.properties.elementerrorclassattribute: +.. include:: Textarea/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor: +.. include:: Textarea/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.100: +.. include:: Textarea/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.200: +.. include:: Textarea/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.230: +.. include:: Textarea/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.400: +.. include:: Textarea/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.500: +.. include:: Textarea/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.700: +.. include:: Textarea/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.800: +.. include:: Textarea/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.900: +.. include:: Textarea/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.editors.9999: +.. include:: Textarea/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.predefineddefaults: +.. include:: Textarea/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.10: +.. include:: Textarea/formEditor/propertyCollections/validators/10.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.10.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/10/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.10.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/10/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.10.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/10/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.20: +.. include:: Textarea/formEditor/propertyCollections/validators/20.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.20.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/20/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.20.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/20/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.20.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/20/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.30: +.. include:: Textarea/formEditor/propertyCollections/validators/30.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.30.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/30/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.30.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/30/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.30.editors.200: +.. include:: Textarea/formEditor/propertyCollections/validators/30/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.30.editors.300: +.. include:: Textarea/formEditor/propertyCollections/validators/30/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.30.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/30/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.40: +.. include:: Textarea/formEditor/propertyCollections/validators/40.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.40.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/40/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.40.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/40/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.40.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/40/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.50: +.. include:: Textarea/formEditor/propertyCollections/validators/50.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.50.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/50/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.50.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/50/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.50.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/50/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.60: +.. include:: Textarea/formEditor/propertyCollections/validators/60.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.60.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/60/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.60.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/60/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.60.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/60/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.70: +.. include:: Textarea/formEditor/propertyCollections/validators/70.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.70.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/70/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.70.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/70/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.70.editors.200: +.. include:: Textarea/formEditor/propertyCollections/validators/70/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.70.editors.300: +.. include:: Textarea/formEditor/propertyCollections/validators/70/editors/300.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.70.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/70/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.80: +.. include:: Textarea/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.80.identifier: +.. include:: Textarea/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.80.editors.100: +.. include:: Textarea/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.80.editors.200: +.. include:: Textarea/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.propertycollections.validators.80.editors.9999: +.. include:: Textarea/formEditor/propertyCollections/validators/80/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.label: +.. include:: Textarea/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.group: +.. include:: Textarea/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.groupsorting: +.. include:: Textarea/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.textarea.formeditor.iconidentifier: +.. include:: Textarea/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor.rst.txt new file mode 100644 index 0000000..bccb407 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor.rst.txt @@ -0,0 +1,237 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Textarea: + 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 + compatibilityPropertyPath: properties.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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 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 + 40: + value: StringLength + label: formEditor.elements.TextMixin.editor.validators.StringLength.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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + label: formEditor.elements.Textarea.label + group: input + groupSorting: 200 + iconIdentifier: form-textarea diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..ff8f768 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/100.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..91ac17c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/200.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..95b0584 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..bdc3c0c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/400.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..580d795 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/500.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..e1db991 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/700.rst.txt @@ -0,0 +1,49 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..66a6531 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..0c9fc4b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/900.rst.txt @@ -0,0 +1,54 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 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 + 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 diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..5b101b4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/editors/9999.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Textarea: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/group.rst.txt new file mode 100644 index 0000000..15057d3 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/group.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Textarea: + formEditor: + group: input + +:aspect:`Default value` + Depends (see :ref:`concrete element configuration `) + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..cdd744f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Textarea: + formEditor: + groupSorting: 200 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..ff59652 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Textarea: + formEditor: + iconIdentifier: form-textarea + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/label.rst.txt new file mode 100644 index 0000000..e430a14 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Textarea: + formEditor: + label: formEditor.elements.Textarea.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..17fcb0b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Textarea: + formEditor: + predefinedDefaults: + defaultValue: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10.rst.txt new file mode 100644 index 0000000..8b92666 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.10 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/100.rst.txt new file mode 100644 index 0000000..eecdae1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.10.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Alphanumeric.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/9999.rst.txt new file mode 100644 index 0000000..3460796 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.10.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.10.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/identifier.rst.txt new file mode 100644 index 0000000..4041dbb --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/10/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.10.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.10.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 10: + identifier: Alphanumeric + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20.rst.txt new file mode 100644 index 0000000..96c66d2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.20 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/100.rst.txt new file mode 100644 index 0000000..5748148 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.20.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Text.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/9999.rst.txt new file mode 100644 index 0000000..ba29173 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.20.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.20.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/identifier.rst.txt new file mode 100644 index 0000000..240f236 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/20/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.20.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.20.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 20: + identifier: Text + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30.rst.txt new file mode 100644 index 0000000..c6d97aa --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.30 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/100.rst.txt new file mode 100644 index 0000000..cd9aa07 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.30.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.StringLength.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/200.rst.txt new file mode 100644 index 0000000..a116105 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.30.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.minlength + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/300.rst.txt new file mode 100644 index 0000000..93be83c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/300.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.30.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.maxlength + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/9999.rst.txt new file mode 100644 index 0000000..75d0606 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.30.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.30.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/identifier.rst.txt new file mode 100644 index 0000000..5864358 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/30/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.30.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.30.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 30: + identifier: StringLength + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40.rst.txt new file mode 100644 index 0000000..2722657 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.40 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/100.rst.txt new file mode 100644 index 0000000..80e1d36 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.40.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.EmailAddress.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/9999.rst.txt new file mode 100644 index 0000000..c5ea81e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.40.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.40.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/identifier.rst.txt new file mode 100644 index 0000000..dab4c24 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/40/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.40.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.40.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 40: + identifier: EmailAddress + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50.rst.txt new file mode 100644 index 0000000..eb726c2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.50 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/100.rst.txt new file mode 100644 index 0000000..7ffd242 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.50.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Integer.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/9999.rst.txt new file mode 100644 index 0000000..71596be --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.50.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.50.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/identifier.rst.txt new file mode 100644 index 0000000..5787275 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/50/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.50.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.50.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 50: + identifier: Integer + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60.rst.txt new file mode 100644 index 0000000..1f03a61 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.60 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/100.rst.txt new file mode 100644 index 0000000..cfa7a44 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.60.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.Float.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/9999.rst.txt new file mode 100644 index 0000000..a7978d4 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.60.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.60.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/identifier.rst.txt new file mode 100644 index 0000000..04bf871 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/60/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.60.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.60.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 60: + identifier: Float + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70.rst.txt new file mode 100644 index 0000000..44eb3d2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70.rst.txt @@ -0,0 +1,55 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.70 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 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 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/100.rst.txt new file mode 100644 index 0000000..db0bd3f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.70.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.NumberRange.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/200.rst.txt new file mode 100644 index 0000000..9e1b29b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/200.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.70.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 200: + identifier: minimum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.minimum.label + propertyPath: options.minimum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.min diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/300.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/300.rst.txt new file mode 100644 index 0000000..57ac0da --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/300.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.300 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.70.editors.300 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 300: + identifier: maximum + templateName: Inspector-TextEditor + label: formEditor.elements.MinimumMaximumEditorsMixin.editor.maximum.label + propertyPath: options.maximum + propertyValidators: + 10: Integer + additionalElementPropertyPaths: + 10: properties.fluidAdditionalAttributes.max diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/9999.rst.txt new file mode 100644 index 0000000..2c9aa8e --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.70.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.70.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/identifier.rst.txt new file mode 100644 index 0000000..46ca243 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/70/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.70.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.70.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 70: + identifier: NumberRange + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..a05daa8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Textarea: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..ed83564 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..f5d05c0 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/9999.rst.txt new file mode 100644 index 0000000..5f7220f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/editors/9999.rst.txt @@ -0,0 +1,33 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.9999 +--------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.80.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Textarea: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..2dac627 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Textarea: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/implementationClassName.rst.txt new file mode 100644 index 0000000..231ac7f --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Textarea: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..3d9bddc --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Textarea: + properties: + containerClassAttribute: input + elementClassAttribute: xxlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..ddf7b91 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Textarea: + properties: + containerClassAttribute: input + elementClassAttribute: xxlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementDescription.rst.txt new file mode 100644 index 0000000..8e173ca --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..ee71162 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Textarea/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Textarea.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Textarea: + properties: + containerClassAttribute: input + elementClassAttribute: xxlarge + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url.rst b/Documentation/I/Config/proto/formElements/formElementTypes/Url.rst new file mode 100644 index 0000000..16c823b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url.rst @@ -0,0 +1,88 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url: + +===== +[Url] +===== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.implementationclassname: +.. include:: Url/implementationClassName.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.properties.containerclassattribute: +.. include:: Url/properties/containerClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.properties.elementclassattribute: +.. include:: Url/properties/elementClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.properties.elementDescription: +.. include:: Url/properties/elementDescription.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.properties.elementerrorclassattribute: +.. include:: Url/properties/elementErrorClassAttribute.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.validators: +.. include:: Url/validators.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor: +.. include:: Url/formEditor.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.100: +.. include:: Url/formEditor/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.200: +.. include:: Url/formEditor/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.230: +.. include:: Url/formEditor/editors/230.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.400: +.. include:: Url/formEditor/editors/400.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.500: +.. include:: Url/formEditor/editors/500.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.700: +.. include:: Url/formEditor/editors/700.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.800: +.. include:: Url/formEditor/editors/800.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.900: +.. include:: Url/formEditor/editors/900.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.editors.9999: +.. include:: Url/formEditor/editors/9999.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.predefineddefaults: +.. include:: Url/formEditor/predefinedDefaults.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.propertycollections.validators.80: +.. include:: Url/formEditor/propertyCollections/validators/80.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.propertycollections.validators.80.identifier: +.. include:: Url/formEditor/propertyCollections/validators/80/identifier.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.propertycollections.validators.80.editors.100: +.. include:: Url/formEditor/propertyCollections/validators/80/editors/100.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.propertycollections.validators.80.editors.200: +.. include:: Url/formEditor/propertyCollections/validators/80/editors/200.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.label: +.. include:: Url/formEditor/label.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.group: +.. include:: Url/formEditor/group.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.groupsorting: +.. include:: Url/formEditor/groupSorting.rst.txt + +.. _prototypes.prototypeIdentifier.formelementsdefinition.url.formeditor.iconidentifier: +.. include:: Url/formEditor/iconIdentifier.rst.txt diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor.rst.txt new file mode 100644 index 0000000..88b7de9 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor.rst.txt @@ -0,0 +1,110 @@ +.. include:: /Includes.rst.txt +formEditor +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2- + + Url: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + label: formEditor.elements.Url.label + group: html5 + groupSorting: 300 + iconIdentifier: form-url diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/100.rst.txt new file mode 100644 index 0000000..92a8ad8 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/100.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.100 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.100 + +:aspect:`Data type` + array/ :ref:`[FormElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/200.rst.txt new file mode 100644 index 0000000..3b15876 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/200.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.200 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 200: + identifier: label + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.label.label + propertyPath: label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/230.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/230.rst.txt new file mode 100644 index 0000000..f1e6212 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/230.rst.txt @@ -0,0 +1,29 @@ +.. include:: /Includes.rst.txt +formEditor.editors.230 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.230 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Date: + formEditor: + editors: + 230: + identifier: elementDescription + templateName: Inspector-TextEditor + label: formEditor.elements.FormElement.editor.elementDescription.label + propertyPath: properties.elementDescription diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/400.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/400.rst.txt new file mode 100644 index 0000000..39f4978 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/400.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.400 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.400 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 400: + identifier: placeholder + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.placeholder.label + propertyPath: properties.fluidAdditionalAttributes.placeholder + compatibilityPropertyPath: properties.placeholder + doNotSetIfPropertyValueIsEmpty: true + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/500.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/500.rst.txt new file mode 100644 index 0000000..b1a96d6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/500.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.500 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.500 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 500: + identifier: defaultValue + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.editor.defaultValue.label + propertyPath: defaultValue + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/700.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/700.rst.txt new file mode 100644 index 0000000..eaca620 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/700.rst.txt @@ -0,0 +1,51 @@ +.. include:: /Includes.rst.txt +formEditor.editors.700 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.700 + +:aspect:`Data type` + array/ :ref:`[GridColumnViewPortConfigurationEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 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' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/800.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/800.rst.txt new file mode 100644 index 0000000..bec34b2 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/800.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.800 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.800 + +:aspect:`Data type` + array/ :ref:`[RequiredValidatorEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 800: + identifier: requiredValidator + templateName: Inspector-RequiredValidatorEditor + label: formEditor.elements.FormElement.editor.requiredValidator.label + validatorIdentifier: NotEmpty + propertyPath: properties.fluidAdditionalAttributes.required + propertyValue: required diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/900.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/900.rst.txt new file mode 100644 index 0000000..74c171c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/900.rst.txt @@ -0,0 +1,37 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.900 +---------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.900 + +:aspect:`Data type` + array/ :ref:`[ValidatorsEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 900: + identifier: validators + templateName: Inspector-ValidatorsEditor + label: formEditor.elements.TextMixin.editor.validators.label + selectOptions: + 10: + value: '' + label: formEditor.elements.TextMixin.editor.validators.EmptyValue.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/9999.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/9999.rst.txt new file mode 100644 index 0000000..73bbf06 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/editors/9999.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt + +formEditor.editors.9999 +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.editors.9999 + +:aspect:`Data type` + array/ :ref:`[RemoveElementEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +.. :aspect:`Related options` + @ToDo + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4- + + Url: + formEditor: + editors: + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/group.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/group.rst.txt new file mode 100644 index 0000000..4053af6 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/group.rst.txt @@ -0,0 +1,28 @@ +.. include:: /Includes.rst.txt +formEditor.group +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.group + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Url: + formEditor: + group: html5 + +:aspect:`Description` + Define within which group within the ``form editor`` "new Element" modal the form element should be shown. + The ``group`` value must be equal to an array key within ``formElementGroups``. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/groupSorting.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/groupSorting.rst.txt new file mode 100644 index 0000000..3203940 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/groupSorting.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.groupSorting +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.groupSorting + +:aspect:`Data type` + int + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Url: + formEditor: + groupSorting: 300 + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + The position within the ``formEditor.group`` for this form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/iconIdentifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/iconIdentifier.rst.txt new file mode 100644 index 0000000..549a84b --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/iconIdentifier.rst.txt @@ -0,0 +1,36 @@ +.. include:: /Includes.rst.txt +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Url: + formEditor: + iconIdentifier: form-url + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. + This icon will be shown within + + - :ref:`"Inspector [FormElementHeaderEditor]"`. + - :ref:`"Abstract view formelement templates"`. + - ``Tree`` component. + - "new element" Modal diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/label.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/label.rst.txt new file mode 100644 index 0000000..4be5595 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/label.rst.txt @@ -0,0 +1,30 @@ +.. include:: /Includes.rst.txt +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Url: + formEditor: + label: formEditor.elements.Url.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + This label will be shown within the "new element" Modal. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/predefinedDefaults.rst.txt new file mode 100644 index 0000000..e7d2bf7 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/predefinedDefaults.rst.txt @@ -0,0 +1,31 @@ +.. include:: /Includes.rst.txt +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Url: + formEditor: + predefinedDefaults: + defaultValue: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Defines predefined defaults for form element properties which are prefilled, if the form element is added to a form. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80.rst.txt new file mode 100644 index 0000000..a65b3c1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80.rst.txt @@ -0,0 +1,43 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80 +-------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.propertyCollections.validators.80 + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5- + + Url: + formEditor: + propertyCollections: + validators: + 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 + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/100.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/100.rst.txt new file mode 100644 index 0000000..e7bdf3c --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/100.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.100 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Text.formEditor.propertyCollections.validators.80.editors.100 + +:aspect:`Data type` + array/ :ref:`[CollectionElementHeaderEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Text: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 100: + identifier: header + templateName: Inspector-CollectionElementHeaderEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.header.label + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/200.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/200.rst.txt new file mode 100644 index 0000000..9c2ea09 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/editors/200.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt + +formEditor.propertyCollections.validators.80.editors.200 +-------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.propertyCollections.validators.80.editors.200 + +:aspect:`Data type` + array/ :ref:`[TextEditor] ` + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 8- + + Url: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + editors: + 200: + identifier: regex + templateName: Inspector-TextEditor + label: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.label + description: formEditor.elements.TextMixin.validators.RegularExpression.editor.regex.description + propertyPath: options.regularExpression + propertyValidators: + 10: NotEmpty + 20: RegularExpressionPattern + diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/identifier.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/identifier.rst.txt new file mode 100644 index 0000000..b7780cf --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/formEditor/propertyCollections/validators/80/identifier.rst.txt @@ -0,0 +1,34 @@ +.. include:: /Includes.rst.txt +formEditor.propertyCollections.validators.80.identifier +------------------------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.formEditor.propertyCollections.validators.80.identifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 6 + + Url: + formEditor: + propertyCollections: + validators: + 80: + identifier: RegularExpression + +:aspect:`Good to know` + - :ref:`"Inspector"` + - :ref:`"\"` + +:aspect:`Description` + Identifies the validator which should be attached to the form element. Must be equal to an existing ````. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/implementationClassName.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/implementationClassName.rst.txt new file mode 100644 index 0000000..1e285a1 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/implementationClassName.rst.txt @@ -0,0 +1,35 @@ +.. include:: /Includes.rst.txt +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + No + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Url: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Classname which implements the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/containerClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/containerClassAttribute.rst.txt new file mode 100644 index 0000000..921dd35 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/containerClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.containerClassAttribute +---------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.properties.containerClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Url: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is typically wrapped around the form elements. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementClassAttribute.rst.txt new file mode 100644 index 0000000..48f6063 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementClassAttribute +-------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.properties.elementClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Url: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class written to the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementDescription.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementDescription.rst.txt new file mode 100644 index 0000000..3ee2dfa --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementDescription.rst.txt @@ -0,0 +1,32 @@ +.. include:: /Includes.rst.txt +properties.elementDescription +----------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.properties.elementDescription + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`Form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + Undefined + +:aspect:`Good to know` + - :ref:`"Custom form element implementations"` + - :ref:`"Translate form definition"` + +:aspect:`Description` + Set a description of the form element. By default, it is displayed + below the form element. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementErrorClassAttribute.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementErrorClassAttribute.rst.txt new file mode 100644 index 0000000..f061fac --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/properties/elementErrorClassAttribute.rst.txt @@ -0,0 +1,38 @@ +.. include:: /Includes.rst.txt +properties.elementErrorClassAttribute +------------------------------------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.properties.elementErrorClassAttribute + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + No + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 5 + + Url: + properties: + containerClassAttribute: input + elementClassAttribute: '' + elementErrorClassAttribute: error + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + A CSS class which is written to the form element if validation errors exists. diff --git a/Documentation/I/Config/proto/formElements/formElementTypes/Url/validators.rst.txt b/Documentation/I/Config/proto/formElements/formElementTypes/Url/validators.rst.txt new file mode 100644 index 0000000..a781964 --- /dev/null +++ b/Documentation/I/Config/proto/formElements/formElementTypes/Url/validators.rst.txt @@ -0,0 +1,39 @@ +.. include:: /Includes.rst.txt +validators +---------- + +:aspect:`Option path` + prototypes..formElementsDefinition.Url.validators + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Overwritable within form definition` + Yes + +:aspect:`form editor can write this property into the form definition (for prototype 'standard')` + Yes + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Url: + validators: + - + identifier: RegularExpression + options: + regularExpression: '/^.*$/' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Predefined validators. diff --git a/Documentation/I/Config/proto/formEngine/Index.rst b/Documentation/I/Config/proto/formEngine/Index.rst new file mode 100644 index 0000000..d82c8e5 --- /dev/null +++ b/Documentation/I/Config/proto/formEngine/Index.rst @@ -0,0 +1,46 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.formengine: + +============ +[formEngine] +============ + + +.. _prototypes.prototypeIdentifier.formengine-properties: + +Properties +========== + +.. _prototypes.prototypeIdentifier.formengine.translationfiles: + +translationFiles +---------------- + +:aspect:`Option path` + prototypes..formEngine.translationFiles + +:aspect:`Data type` + string/ array + +:aspect:`Needed by` + Backend (plugin) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + formEngine: + translationFiles: + 10: 'EXT:form/Resources/Private/Language/Database.xlf' + +:aspect:`Good to know` + - :ref:`"Translate form plugin settings"` + +:aspect:`Description` + Filesystem path(s) to translation files which should be searched for form plugin translations. diff --git a/Documentation/I/Config/proto/validatorsDefinition/Index.rst b/Documentation/I/Config/proto/validatorsDefinition/Index.rst new file mode 100644 index 0000000..00bfe69 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/Index.rst @@ -0,0 +1,297 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition: + +====================== +[validatorsDefinition] +====================== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition-properties-validatorsdefinition: + +[validatorsDefinition] +---------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + .. code-block:: yaml + :linenos: + + prototypes: + : + validatorsDefinition: + [...] + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + Array which defines the available serverside validators. Every key within this array is called the ````. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier: + + +--------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition. + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + + prototypes: + standard: + NotEmpty: + [...] + DateTime: + [...] + Alphanumeric: + [...] + Text: + [...] + StringLength: + [...] + EmailAddress: + [...] + Integer: + [...] + Float: + [...] + NumberRange: + [...] + RegularExpression: + [...] + Count: + [...] + FileSize: + [...] + +:aspect:`Related options` + - :ref:`"prototypes.prototypeIdentifier.formElementsDefinition.formelementtypeidentifier.formEditor.propertyCollections.validators.[*].identifier"` + - :ref:`"[ValidatorsEditor] selectOptions.[*].value"` + - :ref:`"[RequiredValidatorEditor] validatorIdentifier"` + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + This array key identifies a validator. This identifier could be used to attach a validator to a form element. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier-commonproperties: + +Common properties +======================================= + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition..implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete validators configuration `) + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier.options: + +options +------- + +:aspect:`Option path` + prototypes..validatorsDefinition..options + +:aspect:`Data type` + array + +:aspect:`Needed by` + Frontend/ Backend (form editor) + +:aspect:`Mandatory` + Depends (see :ref:`concrete validators configuration `) + +:aspect:`Default value` + Depends (see :ref:`concrete validators configuration `) + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + Array with validator options. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier.formeditor: + +formEditor +---------- + +:aspect:`Option path` + prototypes..validatorsDefinition..formEditor + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Recommended + +:aspect:`Default value` + Depends (see :ref:`concrete validators configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + Array with configurations for the ``form editor`` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier.formeditor.iconidentifier: + +formeditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition..formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete validators configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier.formeditor.label: + +formeditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition..formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value` + Depends (see :ref:`concrete validators configuration `) + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier.formeditor.predefineddefaults: + +formeditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition..formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value` + Depends (see :ref:`concrete validators configuration `) + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: properties/predefinedDefaults.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.validatoridentifier-concreteconfigurations: + +Concrete configurations +======================= + +.. toctree:: + + validators/Alphanumeric + validators/Count + validators/DateRange + validators/DateTime + validators/EmailAddress + validators/FileSize + validators/Float + validators/Integer + validators/NotEmpty + validators/Number + validators/NumberRange + validators/RegularExpression + validators/StringLength + validators/Text diff --git a/Documentation/I/Config/proto/validatorsDefinition/properties/iconIdentifier.rst.txt b/Documentation/I/Config/proto/validatorsDefinition/properties/iconIdentifier.rst.txt new file mode 100644 index 0000000..852ef1a --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/properties/iconIdentifier.rst.txt @@ -0,0 +1,4 @@ + + +An icon identifier which must be registered through the :php:`\TYPO3\CMS\Core\Imaging\IconRegistry`. +This icon will be shown within the - :ref:`"Inspector [CollectionElementHeaderEditor]"` if the validator is selected. diff --git a/Documentation/I/Config/proto/validatorsDefinition/properties/implementationClassName.rst.txt b/Documentation/I/Config/proto/validatorsDefinition/properties/implementationClassName.rst.txt new file mode 100644 index 0000000..0ffd182 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/properties/implementationClassName.rst.txt @@ -0,0 +1,3 @@ + + +Classname which implements the validator. diff --git a/Documentation/I/Config/proto/validatorsDefinition/properties/label.rst.txt b/Documentation/I/Config/proto/validatorsDefinition/properties/label.rst.txt new file mode 100644 index 0000000..06b681f --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/properties/label.rst.txt @@ -0,0 +1,3 @@ + + +This label will be shown within the - :ref:`"Inspector [CollectionElementHeaderEditor]"` if the validator is selected. diff --git a/Documentation/I/Config/proto/validatorsDefinition/properties/predefinedDefaults.rst.txt b/Documentation/I/Config/proto/validatorsDefinition/properties/predefinedDefaults.rst.txt new file mode 100644 index 0000000..394da22 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/properties/predefinedDefaults.rst.txt @@ -0,0 +1,3 @@ + + +Defines predefined defaults for validator options which are prefilled, if the validator is added to a form element. diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/Alphanumeric.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/Alphanumeric.rst new file mode 100644 index 0000000..7ef8202 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/Alphanumeric.rst @@ -0,0 +1,123 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.alphanumeric: + +============== +[Alphanumeric] +============== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.alphanumeric-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221551320` +- Error message: `The given subject was not a valid alphanumeric string.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.alphanumeric-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.alphanumeric.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Alphanumeric.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Alphanumeric: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\AlphanumericValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.alphanumeric.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Alphanumeric.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Alphanumeric: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Alphanumeric.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.alphanumeric.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Alphanumeric.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Alphanumeric: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Alphanumeric.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/Count.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/Count.rst new file mode 100644 index 0000000..ae00d48 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/Count.rst @@ -0,0 +1,210 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count: + +======= +[Count] +======= + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1475002976` +- Error message: `You must enter a countable subject.` + +- Error code: `1475002994` +- Error message: `You must select between %s to %s elements.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Count.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Count: + implementationClassName: TYPO3\CMS\Form\Mvc\Validation\CountValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count.options.minimum: + +options.minimum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Count.options.minimum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The minimum count to accept. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count.options.maximum: + +options.maximum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Count.options.maximum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The maximum count to accept. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Count.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Count: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Count.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Count: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.MultiSelectionMixin.validators.Count.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.count.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Count.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + Count: + formEditor: + predefinedDefaults: + options: + minimum: '' + maximum: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/DateRange.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/DateRange.rst new file mode 100644 index 0000000..fd5f5a4 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/DateRange.rst @@ -0,0 +1,242 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange: + +=========== +[DateRange] +=========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1521293685` +- Error message: `You must enter an instance of \DateTime.` + +- Error code: `1521293686` +- Error message: `You must select a date before %s.` + +- Error code: `1521293687` +- Error message: `You must select a date after %s.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Count: + implementationClassName: TYPO3\CMS\Form\Mvc\Validation\DateRangeValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.options.format: + +options.format +-------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.options.format + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + + DateRange: + options: + format: Y-m-d + +:aspect:`Description` + The format of the minimum and maximum option. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.options.minimum: + +options.minimum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.options.minimum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The minimum date formatted as Y-m-d. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.options.maximum: + +options.maximum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.options.maximum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The maximum date formatted as Y-m-d. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + DateRange: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FormElement.validators.DateRange.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + DateRange: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FormElement.validators.DateRange.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.daterange.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateRange.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + DateRange: + formEditor: + predefinedDefaults: + options: + minimum: '' + maximum: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/DateTime.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/DateTime.rst new file mode 100644 index 0000000..feed5ce --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/DateTime.rst @@ -0,0 +1,123 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.datetime: + +========== +[DateTime] +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.datetime-validationerrorcodes: + +validation error codes +====================== + +- Error code: `1238087674` +- Error message: `The given subject was not a valid DateTime. Got: '%s'` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.datetime-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.datetime.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateTime.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + DateTime: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\DateTimeValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.datetime.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateTime.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + DateTime: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.DatePicker.validators.DateTime.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.datetime.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.DateTime.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + DateTime: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.DatePicker.validators.DateTime.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/EmailAddress.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/EmailAddress.rst new file mode 100644 index 0000000..5a89788 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/EmailAddress.rst @@ -0,0 +1,126 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.emailaddress: + +============== +[EmailAddress] +============== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.emailaddress-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221559976` +- Error message: `The given subject was not a valid email address.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.emailaddress-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.emailaddress.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.EmailAddress.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + EmailAddress: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.emailaddress.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.EmailAddress.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + EmailAddress: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.emailaddress.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.EmailAddress.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + EmailAddress: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/FileSize.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/FileSize.rst new file mode 100644 index 0000000..357e49c --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/FileSize.rst @@ -0,0 +1,211 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize: + +========== +[FileSize] +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1505303626` +- Error message: `You must enter an instance of \TYPO3\CMS\Extbase\Domain\Model\FileReference + or \TYPO3\CMS\Core\Resource\File.` + +- Error code: `1505305752` +- Error message: `You must select a file that is larger than %s in size.` + +- Error code: `1505305753` +- Error message: `You must select a file that is no larger than %s.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.FileSize.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + FileSize: + implementationClassName: TYPO3\CMS\Form\Mvc\Validation\FileSizeValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize.options.minimum: + +options.minimum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.FileSize.options.minimum + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The minimum filesize to accept. Use the format `B|K|M|G`. For example: `10M` means 10 Megabytes. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize.options.maximum: + +options.maximum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.FileSize.options.maximum + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The maximum filesize to accept. Use the format `B|K|M|G`. For example: `10M` means 10 Megabytes. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.FileSize.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + FileSize: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.FileSize.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + FileSize: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FileUploadMixin.validators.FileSize.editor.header.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.filesize.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.FileSize.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + FileSize: + formEditor: + predefinedDefaults: + options: + minimum: '0B' + maximum: '10M' + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/Float.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/Float.rst new file mode 100644 index 0000000..fb6184c --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/Float.rst @@ -0,0 +1,123 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.float: + +======= +[Float] +======= + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.float-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221560288` +- Error message: `The given subject was not a valid float.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.float-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.float.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Float.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Float: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\FloatValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.float.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Float.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Float: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Float.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.float.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Float.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Float: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Float.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/Integer.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/Integer.rst new file mode 100644 index 0000000..a25e3f8 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/Integer.rst @@ -0,0 +1,123 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.integer: + +========= +[Integer] +========= + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.integer-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221560494` +- Error message: `The given subject was not a valid integer.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.integer-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.integer.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Integer.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Integer: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\IntegerValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.integer.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Integer.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Integer: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Integer.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.integer.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Integer.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Integer: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Integer.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/NotEmpty.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/NotEmpty.rst new file mode 100644 index 0000000..a7b01ff --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/NotEmpty.rst @@ -0,0 +1,132 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.notempty: + +========== +[NotEmpty] +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.notempty-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221560910` +- Error message: `The given subject was NULL.` + +- Error code: `1221560718` +- Error message: `The given subject was empty.` + +- Error code: `1347992400` +- Error message: `The given subject was empty.` + +- Error code: `1347992453` +- Error message: `The given subject was empty.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.notempty-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.notempty.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NotEmpty.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + NotEmpty: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.notempty.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NotEmpty.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + NotEmpty: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FormElement.editor.requiredValidator.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.notempty.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NotEmpty.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + NotEmpty: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.FormElement.editor.requiredValidator.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/Number.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/Number.rst new file mode 100644 index 0000000..eb7fb1c --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/Number.rst @@ -0,0 +1,124 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.number: + +======== +[Number] +======== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.number-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221563685` +- Error message: `The given subject was not a valid number.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.number-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.number.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Number.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Number: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NumberValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.number.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Number.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Number: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Number.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.number.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Number.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Number: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Number.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/NumberRange.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/NumberRange.rst new file mode 100644 index 0000000..a954814 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/NumberRange.rst @@ -0,0 +1,210 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange: + +============= +[NumberRange] +============= + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221563685` +- Error message: `The given subject was not a valid number.` + +- Error code: `1221561046` +- Error message: `The given subject was not in the valid range (%s - %s).` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NumberRange.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + NumberRange: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NumberRangeValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange.options.minimum: + +options.minimum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NumberRange.options.minimum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The minimum value to accept. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange.options.maximum: + +options.maximum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NumberRange.options.maximum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The maximum value to accept. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NumberRange.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + NumberRange: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.NumberRange.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NumberRange.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + NumberRange: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.NumberRange.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.numberrange.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.NumberRange.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + NumberRange: + formEditor: + predefinedDefaults: + options: + minimum: '' + maximum: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/RegularExpression.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/RegularExpression.rst new file mode 100644 index 0000000..94694ce --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/RegularExpression.rst @@ -0,0 +1,182 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression: + +=================== +[RegularExpression] +=================== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221565130` +- Error message: `The given subject did not match the pattern.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.RegularExpression.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + RegularExpression: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\RegularExpressionValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression.options.regularExpression: + +options.regularExpression +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.RegularExpression.options.regularExpression + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + The regular expression to use for validation, used as given. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.RegularExpression.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + RegularExpression: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.RegularExpression.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.RegularExpression.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + RegularExpression: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.RegularExpression.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.regularexpression.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.RegularExpression.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + RegularExpression: + formEditor: + predefinedDefaults: + options: + regularExpression: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/StringLength.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/StringLength.rst new file mode 100644 index 0000000..213c5e0 --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/StringLength.rst @@ -0,0 +1,219 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength: + +============== +[StringLength] +============== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1238110957` +- Error message: `The given object could not be converted to a string.` + +- Error code: `1269883975` +- Error message: `The given value was not a valid string.` + +- Error code: `1428504122` +- Error message: `The length of the given string was not between %s and %s characters.` + +- Error code: `1238108068` +- Error message: `The length of the given string is less than %s characters.` + +- Error code: `1238108069` +- Error message: `The length of the given string exceeded %s characters.` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.StringLength.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + StringLength: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\StringLengthValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength.options.minimum: + +options.minimum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.StringLength.options.minimum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + Minimum length for a valid string. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength.options.maximum: + +options.maximum +--------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.StringLength.options.maximum + +:aspect:`Data type` + int + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + undefined + +:aspect:`Description` + Maximum length for a valid string. + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.StringLength.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + StringLength: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.StringLength.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.StringLength.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + StringLength: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.StringLength.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.stringlength.formeditor.predefineddefaults: + +formEditor.predefinedDefaults +----------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.StringLength.formEditor.predefinedDefaults + +:aspect:`Data type` + array + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + No + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3- + + StringLength: + formEditor: + predefinedDefaults: + options: + minimum: '' + maximum: '' + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/predefinedDefaults.rst.txt diff --git a/Documentation/I/Config/proto/validatorsDefinition/validators/Text.rst b/Documentation/I/Config/proto/validatorsDefinition/validators/Text.rst new file mode 100644 index 0000000..88917cf --- /dev/null +++ b/Documentation/I/Config/proto/validatorsDefinition/validators/Text.rst @@ -0,0 +1,123 @@ +.. include:: /Includes.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.text: + +====== +[Text] +====== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.text-validationerrorcodes: + +Validation error codes +====================== + +- Error code: `1221565786` +- Error message: `The given subject was not a valid text (e.g. contained XML tags).` + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.text-properties: + +Properties +========== + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.text.implementationClassName: + +implementationClassName +----------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Text.implementationClassName + +:aspect:`Data type` + string + +:aspect:`Needed by` + Frontend + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 2 + + Text: + implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\TextValidator + +:aspect:`Good to know` + - :ref:`"Custom validator implementations"` + +:aspect:`Description` + .. include:: ../properties/implementationClassName.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.text.formeditor.iconidentifier: + +formEditor.iconIdentifier +------------------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Text.formEditor.iconIdentifier + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 3 + + Text: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Text.label + +.. :aspect:`Good to know` + ToDo + +:aspect:`Description` + .. include:: ../properties/iconIdentifier.rst.txt + + +.. _prototypes.prototypeIdentifier.validatorsdefinition.text.formeditor.label: + +formEditor.label +---------------- + +:aspect:`Option path` + prototypes..validatorsDefinition.Text.formEditor.label + +:aspect:`Data type` + string + +:aspect:`Needed by` + Backend (form editor) + +:aspect:`Mandatory` + Yes + +:aspect:`Default value (for prototype 'standard')` + .. code-block:: yaml + :linenos: + :emphasize-lines: 4 + + Text: + formEditor: + iconIdentifier: form-validator + label: formEditor.elements.TextMixin.editor.validators.Text.label + +:aspect:`Good to know` + - :ref:`"Translate form editor settings"` + +:aspect:`Description` + .. include:: ../properties/label.rst.txt diff --git a/Documentation/I/FAQ/Index.rst b/Documentation/I/FAQ/Index.rst new file mode 100644 index 0000000..4de27f9 --- /dev/null +++ b/Documentation/I/FAQ/Index.rst @@ -0,0 +1,248 @@ +.. include:: /Includes.rst.txt + + +.. _faq: + +=== +FAQ +=== + + +.. _faq-override-frontend-templates: + +How do I override EXT:Form frontend templates? +============================================== + +There are three ways to override the frontend templates. + + +Override template paths via site set settings (recommended) +----------------------------------------------------------- + +The simplest approach: configure the template paths in the site settings of +your site package. The settings are applied to the Extbase plugin view and +the form element rendering. + +.. code-block:: yaml + :caption: config/sites/my-site/settings.yaml + + form.templates.templateRootPath: EXT:my_site_package/Resources/Private/Templates/Form/Frontend/ + form.templates.partialRootPath: EXT:my_site_package/Resources/Private/Partials/Form/Frontend/ + form.templates.layoutRootPath: EXT:my_site_package/Resources/Private/Layouts/Form/Frontend/ + form.translation.translationFile: EXT:my_site_package/Resources/Private/Language/Form/locallang.xlf + +Alternatively, edit the settings in the :guilabel:`Site Settings` backend +module under :guilabel:`Form Framework > Templates`. + +.. note:: + + Site set settings are resolved in the **frontend** only. The backend form + editor preview uses the YAML prototype defaults. If you need the backend + preview to use custom templates, use a form set (see below). + + +Add fluid search paths via a form set +------------------------------------- + +Create a form set in your site package. The YAML files are picked up +automatically for **both** frontend and backend — no PHP or TypoScript +registration is required. + +1. Create the directory and a :file:`config.yaml` with the template paths: + + .. code-block:: none + + EXT:my_site_package/ + Configuration/ + Form/ + SitePackage/ + config.yaml + + .. code-block:: yaml + :caption: EXT:my_site_package/Configuration/Form/SitePackage/config.yaml + + name: my-site-package/form + label: 'My Site Package — Form Configuration' + priority: 200 + + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + templateRootPaths: + 20: 'EXT:my_site_package/Resources/Private/Templates/Form/Frontend/' + partialRootPaths: + 20: 'EXT:my_site_package/Resources/Private/Partials/Form/Frontend/' + layoutRootPaths: + 20: 'EXT:my_site_package/Resources/Private/Layouts/Form/Frontend/' + +.. note:: + + Forms can be previewed in the backend form editor. The preview uses the + same frontend templates. Your customized templates are automatically used + in the preview as well. + +See :ref:`concepts-configuration-yaml-autodiscovery` for the full directory +convention. + + +Add fluid search paths via TypoScript ``yamlSettingsOverrides`` +--------------------------------------------------------------- + +For quick, per-site overrides without creating a full form set, you can use +:typoscript:`plugin.tx_form.settings.yamlSettingsOverrides`: + +.. code-block:: typoscript + + plugin.tx_form.settings.yamlSettingsOverrides { + prototypes { + standard { + formElementsDefinition { + Form { + renderingOptions { + templateRootPaths { + 20 = EXT:my_site_package/Resources/Private/Templates/Form/Frontend/ + } + } + } + } + } + } + } + +.. note:: + + TypoScript ``yamlSettingsOverrides`` are evaluated in the **frontend only** + and are ignored by the backend form editor. + + +.. _faq-prevent-double-submissions: + +How do I prevent multiple form submissions? +=========================================== + +A user can submit a form twice by double-clicking the submit button. This means +finishers could be processed multiple times. + +At the current time, there are no plans to integrate a function to prevent this behaviour, +especially not server side. An easy solution would be the integration of a +JavaScript function to stop the behaviour. TYPO3 itself does not take care of +any frontend integration and does not want to ship JavaScript solutions for +the frontend. Therefore, integrators have to implement a solution themselves. + +One possible solution is the following JavaScript snippet. It can be added to your +site package. Please note, the selector (here :js:`myform-123`) has to be updated +to the id of your form. + +.. code-block:: js + + const form = document.getElementById('myform-123'); + form.addEventListener('submit', function(e) { + const submittedClass = 'submitted'; + if (this.classList.contains(submittedClass)) { + e.preventDefault(); + } else { + this.classList.add(submittedClass); + } + }); + +You could also style the submit button to provide visual feedback to the user. +This will help make it clear that the form has already been submitted and thus +prevent further interaction by the user. + +.. code-block:: css + + .submitted button[type="submit"] { + opacity: 0.6; + pointer-events: none; + } + + +.. _faq-user-registration: + +Is it possible to build frontend user registration with EXT:form? +================================================================= + +Possible, yes. But we are not aware of an implementation. + + +.. _faq-export-module: + +Is there an export module for saved forms? +========================================== + +Currently there are no plans to implement such a feature in the core. There +are concerns regarding data privacy when it comes to storing user data in +your TYPO3 database permanently. The great folks of Pagemachine created an +`extension `_ for this. + + +.. _faq-honeypt-session: + +The honeypot does not work with static site caching. What can I do? +=================================================================== + +If you want to use static site caching - for example using the +staticfilecache extension - you should disable the automatic inclusion of the +honeypot. Read more :ref:`here`. + + +.. _faq-form-element-default-value: + +How do I set a default value for my form element? +================================================= + +You can set default values for most form elements (not to be confused with +the placeholder attribute). This is easy for text fields and textareas. + +Select and multi-select form elements are a bit more complex. These form elements +can have :yaml:`defaultValue` and :yaml:`prependOptionValue` settings. The +:yaml:`defaultValue` allows you to select a specific option as a default. This +option will be pre-selected when the +form is loaded. The :yaml:`prependOptionValue` defines a +string which will be the first select option. If both settings exist, +the :yaml:`defaultValue` is prioritized. + +Learn more :ref:`here` +and see forge issue `#82422 `_. + + +.. _faq-form-element-custom-finisher: + +How do I create a custom finisher for my form? +============================================== + +:ref:`Learn how to create a custom finisher here.` + +If you want to make the finisher configurable in the backend form editor, read :ref:`here`. + + +.. _faq-form-element-custom-validator: + +How do I create a custom validator for my form? +=============================================== + +:ref:`Learn how to create a custom validator here.` + + +.. faq-form-proposed-folder-structure: + +Which folder structure do you recommend? +======================================== + +When shipping form configuration, form definitions, +form templates, and language files in a site package, we recommend the following +structure: + +* Form configuration: :file:`EXT:my_site_package/Configuration/Form/` +* Form definitions: :file:`EXT:my_site_package/Resources/Private/Forms/` +* Form templates: + * Templates :file:`EXT:my_site_package/Resources/Private/Templates/Form/` + * Partials :file:`EXT:my_site_package/Resources/Private/Partials/Form/` + * Layouts :file:`EXT:my_site_package/Resources/Private/Layouts/Form/` + * Keep in mind that a form comes with templates for both the frontend + (this is your website) and the TYPO3 backend. Therefore, we recommend + splitting the templates into subfolders called :file:`Frontend/` and + :file:`Backend/`. +* Translations: :file:`EXT:my_site_package/Resources/Private/Language/Form/` diff --git a/Documentation/I/HowTos/CustomFormElement/Index.rst b/Documentation/I/HowTos/CustomFormElement/Index.rst new file mode 100644 index 0000000..eae4788 --- /dev/null +++ b/Documentation/I/HowTos/CustomFormElement/Index.rst @@ -0,0 +1,173 @@ +.. include:: /Includes.rst.txt + +.. _howtos-custom-form-element: + +============================== +Creating a custom form element +============================== + +This tutorial shows you how to create a custom form element for the TYPO3 Form +Framework. We'll create a "Gender Select" element as an example. + +.. contents:: Table of Contents + :depth: 2 + :local: + +Prerequisites +============= + +Before you start, make sure you have: + +* Basic knowledge of YAML configuration +* A sitepackage where you can add configuration files + +Step 1: Create the configuration files +====================================== + +Create a form set directory in your extension. The sub-directory name is +arbitrary — we use ``CustomElement`` here. + +File location +------------- + +Create the following structure in your extension: + +.. code-block:: none + + EXT:my_extension/ + Configuration/ + Form/ + CustomElement/ + config.yaml + +Configuration structure +----------------------- + +Here's the complete configuration for our Gender Select element: + +.. literalinclude:: _CustomFormSetup.yaml + :language: yaml + :caption: EXT:my_extension/Configuration/Form/CustomElement/config.yaml (after metadata) + +Common inspector editors +~~~~~~~~~~~~~~~~~~~~~~~~ + +Here are some commonly used inspector editors (:ref:`Inspector `) you can add to your form elements: + +**Inspector-FormElementHeaderEditor** (100) + Shows the element header in the inspector panel + +**Inspector-TextEditor** (200-300) + A simple text input field for properties like label and description + +**Inspector-PropertyGridEditor** (400) + A grid editor for managing key-value pairs (like options) + +**Inspector-GridColumnViewPortConfigurationEditor** (700) + Controls responsive behavior and column widths for different screen sizes + +**Inspector-RequiredValidatorEditor** (800) + Adds a checkbox to make the field required + +**Inspector-ValidationErrorMessageEditor** (900) + Allows customizing validation error messages + +**Inspector-RemoveElementEditor** (9999) + Shows a button to remove the element from the form + +Step 2: Register the configuration +=================================== + +No PHP or TypoScript registration is needed. TYPO3 discovers YAML files +automatically from any extension that follows the directory convention. + +Create a form set with a single :file:`config.yaml`: + +.. code-block:: none + + EXT:my_extension/ + Configuration/ + Form/ + CustomElement/ + config.yaml ← set metadata + all configuration + +Set the ``priority`` in :file:`config.yaml` to a value greater than ``10`` +(the EXT:form core base set) so your configuration is merged on top: + +.. code-block:: yaml + :caption: EXT:my_extension/Configuration/Form/CustomElement/config.yaml + + name: my-vendor/custom-element + label: 'My Custom Form Element' + priority: 200 + + # Form element configuration goes here: + prototypes: + standard: + ... + +Step 3: Clear Caches +==================== + +After adding the configuration, you must clear all TYPO3 caches. + +Step 4: Using your custom element +================================== + +Now you can use your custom element in the form editor: + +1. Open the Form Editor user interface (:guilabel:`Forms > [Your Form] > Edit`) +2. Look for "Gender Select" in the form element browser. +3. Add the element to the form. +4. Configure the element using the inspector panel on the right. +5. Save your form. +6. Add a form content element to a page and select the form you just edited. +7. Preview the page in the frontend. + +The element will now be available in your forms and will render using the +RadioButton template in the frontend. + +Step 5: Customizing frontend output (optional) +=============================================== + +If you want to use a custom template instead of reusing an existing one, follow +these steps: + +Create custom template +---------------------- + +Create your own Fluid template: + +:file:`EXT:my_extension/Resources/Private/Partials/Form/GenderSelect.fluid.html` + +.. literalinclude:: _GenderSelect.fluid.html + :language: html + :caption: EXT:my_extension/Resources/Private/Partials/Form/GenderSelect.fluid.html + + +Update configuration +-------------------- + +Update your YAML configuration to use the custom partial template: + +.. code-block:: yaml + :caption: EXT:my_extension/Configuration/Form/CustomElement/config.yaml + :emphasize-lines: 3-7, 10 + + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + partialRootPaths: + 1732785721: 'EXT:my_extension/Resources/Private/Partials/Form/' + GenderSelect: + renderingOptions: + templateName: 'GenderSelect' + + +Further reading +=============== + +* :ref:`Form Configuration ` +* :ref:`Register a custom stage template ` \ No newline at end of file diff --git a/Documentation/I/HowTos/CustomFormElement/_CustomFormSetup.yaml b/Documentation/I/HowTos/CustomFormElement/_CustomFormSetup.yaml new file mode 100644 index 0000000..12c0ec2 --- /dev/null +++ b/Documentation/I/HowTos/CustomFormElement/_CustomFormSetup.yaml @@ -0,0 +1,82 @@ +prototypes: + standard: + formElementsDefinition: + GenderSelect: + implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement + renderingOptions: + templateName: 'RadioButton' + properties: + options: + f: 'Female' + m: 'Male' + d: 'Diverse' + formEditor: + label: 'Gender Select' + group: select + groupSorting: 9000 + iconIdentifier: form-single-select + editors: + 100: + identifier: header + templateName: Inspector-FormElementHeaderEditor + 200: + identifier: label + templateName: Inspector-TextEditor + # Labels are retrieved from the default language file "EXT:form/Resources/Private/Language/Database.xlf" + # The most keys follow the pattern: formEditor.elements.FormElement.editor.[identifier].[key] + # In this example: "formEditor.elements.FormElement.editor.label.label" + 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 + 50: + viewPortIdentifier: xl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xl.label + 60: + viewPortIdentifier: xxl + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.xxl.label + numbersOfColumnsToUse: + label: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.label + propertyPath: 'properties.gridColumnClassAutoConfiguration.viewPorts.{@viewPortIdentifier}.numbersOfColumnsToUse' + description: formEditor.elements.FormElement.editor.gridColumnViewPortConfiguration.numbersOfColumnsToUse.description + 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 + description: formEditor.elements.FormElement.editor.requiredValidator.validationErrorMessage.description + errorCodes: + 10: 1221560910 + 20: 1221560718 + 30: 1347992400 + 40: 1347992453 + 9999: + identifier: removeButton + templateName: Inspector-RemoveElementEditor diff --git a/Documentation/I/HowTos/CustomFormElement/_GenderSelect.fluid.html b/Documentation/I/HowTos/CustomFormElement/_GenderSelect.fluid.html new file mode 100644 index 0000000..cc3bcbb --- /dev/null +++ b/Documentation/I/HowTos/CustomFormElement/_GenderSelect.fluid.html @@ -0,0 +1,105 @@ + + + + Custom form element template for a gender selection field. + + + + + Render the field wrapper with optional fieldset and legend + + + + + Apply error class if validation errors exist + + {f:if( + condition: '{validationResults.errors}', + then: 'is-invalid' + )} + + + Radio button group container +

      Ud`MSmolboe2!%N~0$F(RYK2E4H4 z^*VIT@L`PQif}=YC7mIse`Rfagx6c$On&_<^0?qmv{hU-tLE@J7IAm?K4rt&LG2t zrMnjgQ3Mp8;9hu-8YUwO2_U{0vxT4*U&A z=zrmfi=u?0Zt=Ej0tTKfsMKQ~no*v|kWtSIfI81Z#0G+40ED{M2k$2ND|-TnhQ#D0 zOd8ac(9gnYtrt~y^CK`NAAQ%qgN6EnTK7x;;ldrwhi8p}-{U{erl<3P{AC)Ycj~|OE{oDT1aH(AWCN@x}@KQW@Fu*oiUiDXk>CMyPBlS+Z77Qp%Xdz84ydG08BQ zG2=b&w(pVW+j0DkvQ^W=v4-G$1+5d9WxqO{(mfXvq>7;&*7Z@cuH(6d zGJmNbuV437hpHzi+PwDjRl=mfxkW3E>zshv_UkEL*OY|FVm)WdLiH6Y7~;Kokw`l8 z#tkt5&DeFz+ZLU;lYhM7&Dc}Oi`R5NJKYBeoh;S_)Df*0>3r?3B=-pXvLx~Ig64|F zZ^zi77n6W=#%G_C{Ht5Mx}J=vpDB4?d6fEA?w!~0T$zRE2+m`ioaKeapKIbPx$E#NbHCD+jc3Dg%Z*Qndx z#h1ETmftzp0vv)~5JlWr@kED!z)=PpGJBFh^T#pnzGiT9t~XaoQ@{BHKPcVi#~8Tw z6#KMm{@~4ya*+zC~$?(%m`ej*O7@aW1bxgZY-TT$4;}yRwC7CH@ zE%kAipy+3X?(rx8@O?-;m-U&)DNl2sm_3JMyt#VnDE;ibsEaw2G>IXbI={jC>j2ua z%%ZK~wq75iL5yzB8Z##}j&WisEyrl&1kW77$gs{W0C7A6V|nEC$1#!gv3CbRyT`2P z9^p{))X`lpjA>i1b7IbFQv&zeW94FihZ&&`;-`+rcYxg>MGii50?0Q4AJaqO@%A9gIDunt=bMx$ygK8 zSw5l|j@8HIK=>DpMwm_Y!lg${K-D%BpyvUD`8?ZNbdjgc8IBP^wyx%|=I&?qjHCD0 zqK6N$2nQaG%<%%n=7@sOYM|D zPMSmj$)sBFdTsL3Y%bKLwtZ;YN+URTd{(90j=CL23b`8uD559ARPy+GYIi| zr#c#9PKq$jI6^uVwP%BDS=cdF$!q8YrZd3qA{OCP2a4r-ZA_#O^fx>`cW2C;G!{a4 zjP`r_Xl3y|e7?Q~EjVJlKrkDhpQ|}wkKR!cTflj>O6BJoDK{w4@>Qn}jwYZDA6rlox*|D6FEyv@IzDnq?(P77_phzhN^D0#PF(2d9Jj|3 zjCcugyZB|R+oBsdI%c`lYuJFOMuf>WR?AeQcKF4q%cio%DUJGKJ6KmG$8%@bs!K9> zh5CktDOO~kwr4GL*|J)Xh{t1B#i6lbk-|^u`4SHXo3upC7$zhUO9l;LF(eCfcJDzp z1wS8Y?a8dy{mbi)xM3t4x~aB5jrTLc`HyhO*CiK@*Y#(3U96SIo0(j7n;zj*=fGa> zA6mRkz!oYcZ)H`s8vlIA&n=ZG4l#o@wnt3xIf9%&XO$xIuT9$tHsmj=a-vq?{tJti zznlILD6vB&!`EqG?*}A<$CsuWOm8y@2@TRHq-<0(5*M!c`TAe`w%q?hTqxJ2*8{-l zyHMQS4H>QklxJ)HPGpA!QBIsi(yQMQ%Scn@Zi7KLqHB%iFai^cWXCSO0wwUYtSn{4 zwclgIr63~|_WyFL!5qE+@_2-ja7TKcED?*OaJ!G${|5E_=9m`5lSwK8#&Vf(v29=9 zr+@iN6iE!rNoOdCO2ShfUKV8hS`dEO9g$Db#zGtdG2IG{xX5XTA1o14zLNcw@3Wsn zFs?kQmVSQvYYcb7TXv-y9a!>EsCNV2zWk)-@bqgS>6?Lt#JQo*8OV<-ZZEtGYUc;E zng0kucwS#RZD{QTL9bvWWx1A}!w@v{C4XKWVfwgw4rDv&oRJiD zs4@c^&iv(n(L$L6Mp!O4iV}Pz4@Wc+o8f6m4v4t!LvPbJyz)c!A_->loXVabQz->M z7fIT3PS->9E!_I8un;u*DPatu=#uECn{wu!)`X7-eE&v(!!{RkuiiH!#3E`vf2#^M}O%Xs5l6p8stnI)X^% zKTc{Ff#?qo)tBSG{~0+`dJ9-*Sg3rh!);5Tr%-~Afoeif&o}4(g#a5U#MBmG0)a@- z&v0@AN$w|=@WXf2-PU#-Msn{*4#4Bvp0}?eD#PQC3EgV@b^KciZEguMLdiaMsYwJ= z5bY6Ok$$X;+l#Ul^7aJ2uXEA?IV+*{|TcdyBSFWzcA z?KqpF7E;iT(08iO!jw{t3YsTiixfNrHWdCkc$|diaIm{Z#7|X;e<(r_0U%kW=e%Ry zsbl}v=!soYy{E1S!FHzrU_5w>vg0=FR*%;D#~!iUi79F~Gru6_-&@hD3jw?+OsD`!NfO#i~IeP2L%p>gG31uC8RrYzdwl2_V}H<}f*NTT@f< zL9%aWZ!UqCSqj(_?^XPsRa5H}j4yv4+pc{v=tn zuEY}keW9V{ae=$T;m!pqX5PFyGEt38X^-noz91cUTiNt zI(!v@YM5~+^G&&aph*1YvdrdQgf0Pf3VW@9VP(QZjpL1R7l;P`9&6aAxV?!!8e8>V zrvgy5f5RE+D5ufLPuHy-AW&+>{iI91fZE!`47sy{Lo-<188aEFtmn)h3fd&#Dg?1f zy%*``3Qlf&!-}6YIkz~bOkj`F-3Ck5A3F~5jKBcs2E0a)-PIDH z;(=iPg?w3`g_pgM2FP$=|DE&mg010`4N(|(v#t1((BC7Sr9njfd1c0nMY>N31`)NA z?%d=RkY(o06Plk$dqDo@;!@{ld#;5XCAG;eUjaaRkn22u4R7F1^Z{;2Ez=2y4}yI{QvhiXo4Gdv+5UE4M(vN=Wv!uXaZY zMYwkkhl?vH{aSArH0)Mq`uo)BcG`C+BG97 z?!*O_W4dS2z}nFX-NeAdS&uB0D+LOqgJ@lDmi8y5TNpL6=9otGIPzAG062BS!{K;BT!=a zQUz>vkHYrDwG+&3%-d5Ska|APO^4I35HvLMN~uF(A#=+QvZ36N01(6XR^R(T2FZFf z=;K{D8_D7A&agAodt3CDGyns7?A!y9r$RZiocrp#()_8S*{A>NtLC9ldUSJ*S5LS(vw5XbdI$Qcxv$KV4EQ^L;`zQPxaE zdSj(v1biZ83$YWHvL%I`iSt$jCq21B;`5{T9lSU(jy;1CRELPlHMBHl6!g`rbyUtFk z%Y#lW8wZ;%-pQ^8iiU$@gLMQlOa zyOs%eVw|i^p3p5M(Sgj6c~yslA6fHBDsSH?vl!?3E?+7&x12M`A)8Lol04AS@Ku@) zza_d;4PjI8MF86;k1C3Bx)o&wJeeR!_cZBl>9}(%q%F2Ufx2RlFw9}H9lB`brhcY_ zQBTg4O)H-pQT2i`xth2@;@)n|uok6xN!!$DaG_BT0SIP;T~n-#?3iWbn&+;XEuZj; zvLRM2re$4I!vV`KRRw*evV(g+oG(nuvEM!9@zlh5TOzV!cd0qYAL1l#ap=^ZDh+DU z($WsPvtamzkf$Lf|Ds) zHe{z}qOU8ZXu!~!TN)Ir#Ur$eM=DOvp=EzFOr@cdD$-6~(*cwx?DK&9V zyiRC-1o-o_J%5<7adU*wfe1|6K=LqkM3zk@F2@^YP_&vl_P;S&J(7w@yiqO3CV^D$tmv1+M&z| zZP_U{nqb=jP^3_1f&(t9(_hmEZM~}8+c|XAYjZZ-va~dEHJ95V`BuiJ@OG1Pbq0$#-~0?dQEzpTVY3Po?~apz{<#s zQr}=|D2u~e1x;}uEo8Q+)_C+a_KP=9hJbsl);C(%)tZu^Stc{xV zJ2S0$n9|Hl)d-LYZSo&rrFSLQZl4Mp4Z##}4GU^2EBG9Gc8mcTEy6VVyqOu&sm2s+0{ch|6$zi zatJq@*k10qvpO%WGujqLRD~AQx_!48U!WwS3R2LALhWe4V>-}9&YsfBKjN-iaTlKu zb`t{GlQgLkv&E-l9sOI%Cs~`?gJ49*jpPf)c9L_YlzC!(=C~KyM=8xZ1P-QiJgRHp z^s!I4L&KwE^Bb1;ydM~FS3^W=2!JKmS@%5)PfqS^9(>H0WDl z7#1cp&eG;mFSX4vy?U6a)A#2j|kK$~Zv0 z*h|*o4(*NX0`erCnS~Oq7K62u&#xHvKokQ=*S^(PCu9VEbh}0HmSm(yN{ROC=8F1qqn_QDDQg-{bw^=0w;eOJEe!Q6 ziDH$pJKHoHH6yAL4FYGw>VaCWoPyteyLPcy(S9O}G;-MQq!#jLFl4tcGR&+`LLZp7 zlS8eNgRYonTpj2w`}X71T=B>PBGziQku#&Cy zhGtagJmON+I$2!!pvt!a49nI6LGj21*A|_;NE*Rv=o*KEv@JYohiH}D!`yI^x1(CF zBKG?;mz%(vzxsYd9IOd9(=5kj1TEyC@v|QkuKsbYvM8)uSgp@%BC6(m zn3RT&=)amQ3itiRI8T@8w&|E|Erj3p!)r&osC>$)LqWRD&2! z8WFtLdE>{m53#Us&KjtUStq;r%&0Tmj#^@gIVX5%p#WESoh(~oH29|vyajc5ENTOU z2!(JGY4z?r@vJ1D;2i=7Ov%zOfoM&(3m-P@%w!-ckHMjBIny*y5xH3-6W*ECu5-C^ z1X}#+G0Wnc55O*=f=HBa!ZxO#6x)Q0P{*UIoeqKB0HX@?Zm^ z!h&_OR~HU4Pzk1BHC5MSgYQN}=Eb+(C_~Ftt-i<#5WyammX{5G|2^j+G(-42GqXw3 z64O{qX8mZz&mr+hXq_zj0I8fD4bM3kdoR@LN6&wl%2FRo+5gvC1F^3zL~E%?phk>5 z=(yH~{{1R&;cnvi!+e*dpkwqJf)9N1t^yspIadMOy88tpa369cxF= zo)rG^{-2GtwCe^OqJuUF)@1^3ZG)_-qU%>B#S??1ks5S`Jr5N8_SH5>!C3jxuJ8X@ zBvl05k-Y#)w8X5m=vNdINrnTn;iLyu( z1-H*TcNl6G-FCt%yz0uA7U2C>cPY3=DYOkE)-3b!v@_;SbZ4-Kz` z=n}8@r=GwY=LkLk%Vw@Qc5qsIDlZyu!^*+!($W#ve`_hs$vfdB%Ber~1l~9wwP&d% zX0Pen(rN7pUy2w#C7h(TQCwlkG-n&YUNBew4?Tf5E)u=BHU*z`>vqtzQ8-%>G5R0e zd`=+3c!B;OdIE1;A!lh0Gh9V&^!Ir(TfhP_`hQX~Ql7 zG5XAa{ezol2CU%BfSp-kXI9vm6&5=a5(vzM1T!)0|E-YVmXe6mtXYfkI}P>rV8dtP zS;3ijcIE&!a{!yk7+_~I1~VB0(U}z2Oh_;j63ESj1T!JQOh_;j63i44Q2!qxfwb`C ZoFq4|-rmCX7iPh~okkXhIr>hg{s+VjXLA4m literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/2_wizard_1.png b/Documentation/E/Tutorials/PhotoContest/Images/2_wizard_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7f53345e3a1e514cfd52b1087d8990a8eb71bfe3 GIT binary patch literal 46044 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 UHw*1kc^H7e)78%fc=kpU073kBdjJ3c literal 0 HcmV?d00001 diff --git a/Documentation/E/Tutorials/PhotoContest/Images/2_wizard_2.png b/Documentation/E/Tutorials/PhotoContest/Images/2_wizard_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3388775c6f6b6a317b0d77acc1028123883cdc4b GIT binary patch literal 43802 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