TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:24 +02:00
commit aad9daaefd
1506 changed files with 94005 additions and 0 deletions
@@ -0,0 +1,14 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-check form-switch" data-identifier="inspectorEditorControlsWrapper">
<input class="form-check-input" data-random-id data-random-id-attribute="id" data-random-id-number="1" type="checkbox" />
<label class="form-check-label" data-random-id data-random-id-attribute="for" data-random-id-number="1"></label>
</div>
</div>
</div>
</html>
@@ -0,0 +1,8 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<h3 class="panel-heading">
<div class="panel-heading-row" data-template-property="panel-heading-row">
<div class="panel-icon" data-template-property="panel-icon"></div>
<div class="panel-title" data-template-property="panel-title"></div>
</div>
</h3>
</html>
@@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap">
<div data-identifier="inspectorEditorControlsWrapper">
<f:form.countrySelect data="{template-property: 'selectOptions', random-id: '', random-id-attribute: 'id', random-id-number: '1'}" class="form-select" multiple="multiple" sortByOptionLabel="1"></f:form.countrySelect>
</div>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap">
<div data-identifier="inspectorEditorControlsWrapper">
<f:form.countrySelect data="{template-property: 'selectOptions', random-id: '', random-id-attribute: 'id', random-id-number: '1'}" class="form-select" sortByOptionLabel="1" prependOptionLabel="" prependOptionValue=""></f:form.countrySelect>
</div>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,14 @@
<html data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div data-identifier="inspectorEditorControlsWrapper">
<typo3-form-date-editor></typo3-form-date-editor>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group" data-template-property="select-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-control-wrap">
<select data-random-id data-random-id-attribute="id" data-random-id-number="1" data-template-property="selectOptions" class="form-select"></select>
</div>
</div>
<div class="form-group" data-template-property="label-no-select">
<legend class="form-label" data-template-property="label"></legend>
</div>
</div>
<div class="formeditor-inspector-collection panel-group" id="t3-form-inspector-finishers" data-identifier="inspectorFinishers"></div>
</html>
@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element formeditor-inspector-element-headline">
<h2 data-template-property="header-label" data-identifier="inspectorFormElementHeaderEditor"></h2>
</div>
</html>
@@ -0,0 +1,25 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group" data-identifier="editorWrapper">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-control-wrap">
<div class="btn-group d-flex flex-wrap" data-identifier="inspectorEditorControlsWrapper">
<button type="button" class="btn btn-default" data-identifier="viewportButton"></button>
</div>
</div>
</div>
<div class="form-group" data-template-property="numbersOfColumnsToUse">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="numbersOfColumnsToUse-label"></span>
</label>
<div class="form-description" data-template-property="numbersOfColumnsToUse-description"></div>
<div class="form-control-wrap">
<div data-identifier="numbersOfColumnsToUse-inspectorEditorControlsWrapper">
<input data-random-id data-random-id-attribute="id" data-random-id-number="1" type="number" value="" data-template-property="numbersOfColumnsToUse-propertyPath" class="form-control">
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,10 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:if condition="{formvh:be.maximumFileSize()} > 0">
<div data-template-property="header-label">
<div class="form-description" data-template-property="label" data-maximumFileSize="{formvh:be.maximumFileSize()}"></div>
</div>
</f:if>
</html>
@@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap">
<div data-identifier="inspectorEditorControlsWrapper">
<select data-random-id data-random-id-attribute="id" data-random-id-number="1" data-template-property="selectOptions" class="form-select" multiple="multiple"></select>
</div>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,25 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group property-grid">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap" data-editor="new-property-grid" data-template-property="newPropertyPath">
<typo3-form-property-grid-editor
label-label="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.entry.label')}"
label-value="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.entry.value')}"
label-selected="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.entry.selected')}"
label-add="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.grid.add')}"
label-remove="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.grid.remove')}"
label-move="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.grid.move')}"
>
</typo3-form-property-grid-editor>
</div>
<div data-editor="property-grid" data-template-property="propertyPath" class="t3-form-grid"></div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,8 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element formeditor-inspector-element-remove-button">
<button class="btn btn-default" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.formelement.remove')}">
<core:icon identifier="actions-delete" alternativeMarkupIdentifier="inline" />
<span class="btn-label">{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.formelement.remove')}</span>
</button>
</div>
</html>
@@ -0,0 +1,22 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group" data-identifier="editorWrapper">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-check form-switch" data-identifier="inspectorEditorControlsWrapper">
<input class="form-check-input" data-random-id data-random-id-attribute="id" data-random-id-number="1" type="checkbox" />
<label class="form-check-label" data-random-id data-random-id-attribute="for" data-random-id-number="1"></label>
</div>
</div>
<div class="form-group" data-template-property="validationErrorMessage">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="2">
<span data-template-property="validationErrorMessage-label"></span>
</label>
<div class="form-description" data-template-property="validationErrorMessage-description"></div>
<div class="form-control-wrap" data-identifier="inspectorEditorControlsWrapper">
<input data-random-id data-random-id-attribute="id" data-random-id-number="2" type="text" value="" data-template-property="validationErrorMessage-propertyPath" class="form-control">
</div>
</div>
</div>
</html>
@@ -0,0 +1,16 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap">
<div data-identifier="inspectorEditorControlsWrapper">
<select data-random-id data-random-id-attribute="id" data-random-id-number="1" data-template-property="selectOptions" class="form-select"></select>
</div>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,17 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="input-group form-control-wrap" data-identifier="inspectorEditorControlsGroup">
<div data-identifier="inspectorEditorControlsWrapper">
<input data-random-id data-random-id-attribute="id" data-random-id-number="1" type="text" value="" data-template-property="propertyPath" class="form-control">
</div>
<typo3-form-element-selector></typo3-form-element-selector>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,14 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap" data-identifier="inspectorEditorControlsWrapper">
<textarea data-random-id data-random-id-attribute="id" data-random-id-number="1" data-template-property="propertyPath" class="form-control"></textarea>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</html>
@@ -0,0 +1,21 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="form-control-wrap" data-identifier="inspectorEditorControlsWrapper">
<input data-random-id data-random-id-attribute="id" data-random-id-number="1" type="text" value="" data-template-property="propertyPath" class="form-control" data-insert-target="">
<div class="form-text">
<a href="#" data-template-property="onclick" class="btn btn-default">
<span class="t3js-icon icon icon-size-small icon-state-default icon-mimetypes-x-content-text" data-identifier="mimetypes-x-content-text" aria-hidden="true">
<span class="icon-markup" data-template-property="image"></span>
</span> <span data-template-property="buttonLabel"></span>
</a>
</div>
<div class="form-text" data-template-property="validationErrors"></div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,15 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-description" data-template-property="description"></div>
<div class="input-group form-control-wrap" data-identifier="inspectorEditorControlsGroup">
<div data-identifier="inspectorEditorControlsWrapper">
<input data-random-id data-random-id-attribute="id" data-random-id-number="1" type="text" value="" data-template-property="propertyPath" class="form-control">
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,18 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="formeditor-inspector-element">
<div class="form-group" data-template-property="select-group">
<label class="form-label" data-random-id data-random-id-attribute="for" data-random-id-number="1">
<span data-template-property="label"></span>
</label>
<div class="form-control-wrap">
<div id="t3-form-add-validator" class="t3-form-add-collection-element" data-template-property="selectOptionsContainer">
<select data-random-id data-random-id-attribute="id" data-random-id-number="1" data-template-property="selectOptions" class="form-select"></select>
</div>
</div>
</div>
<div class="form-group" data-template-property="label-no-select">
<legend class="form-label" data-template-property="label"></legend>
</div>
</div>
<div class="formeditor-inspector-collection panel-group" id="t3-form-inspector-validators" data-identifier="inspectorValidators"></div>
</html>
@@ -0,0 +1,9 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<typo3-backend-new-record-wizard
storename="form-elements"
displaymenu="false"
categories="{elementsCategoriesJson}"
searchplaceholder="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.modals.insertElements.filter.placeholder')}"
searchnothingfoundlabel="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.modals.insertElements.filter.noResults')}"
></typo3-backend-new-record-wizard>
</html>
@@ -0,0 +1,9 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<typo3-backend-new-record-wizard
displaymenu="false"
displayfilter="false"
categories="{pagesCategoriesJson}"
searchplaceholder="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.modals.newPages.filter.placeholder')}"
searchnothingfoundlabel="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.modals.newPages.filter.noResults')}"
></typo3-backend-new-record-wizard>
</html>
@@ -0,0 +1,18 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div id="formeditor-validation-errors-panel">
<div class="t3-form-x-component-inner-wrapper">
<div class="row">
<div class="col-sm-12">
<p><f:translate key="LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.modals.validationErrors.dialogMessage" /></p>
</div>
<div class="col-sm-12">
<dl data-identifier="rowsContainer">
<dt data-identifier="rowItem">
<span class="text-danger" aria-hidden="true"><core:icon identifier="actions-exclamation-triangle" size="small" /></span> <a data-identifier="rowLink"></a>
</dt>
</dl>
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,7 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<f:for each="{formEditorPartials}" key="formEditorTemplateName" as="formEditorPartial">
<template data-template-name="{formEditorTemplateName}">
<f:render partial="{formEditorPartial}" arguments="{elementsCategoriesJson: elementsCategoriesJson, pagesCategoriesJson: pagesCategoriesJson}" />
</template>
</f:for>
</html>
@@ -0,0 +1,8 @@
type: 'Form'
identifier: 'blankForm'
label: '[Blank Form]'
renderables:
-
type: 'Page'
identifier: 'page-1'
label: 'Step'
@@ -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
@@ -0,0 +1,55 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:render partial="Field/Field" arguments="{element: element, renderFieldset: '{element.properties.renderFieldset}', doNotShowLabel: 1}" contentAs="elementContent">
<div class="{element.properties.containerClassAttribute}">
<label class="{element.properties.labelClassAttribute}" for="{element.uniqueIdentifier}">{formvh:translateElementProperty(element: element, property: 'label')}
<f:if condition="{element.required}">
<f:render partial="Field/Required" arguments="{element: element}"/>
</f:if>
</label>
<f:form.password
property="{element.identifier}.password"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}{f:if(condition: '{validationResults.errors}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
<f:if condition="{formvh:translateElementProperty(element: element, property: 'passwordDescription')}">
<span class="{element.rootForm.renderingOptions.fieldProperties.descriptionClassAttribute}">{formvh:translateElementProperty(element: element, property: 'passwordDescription')}</span>
</f:if>
</div>
<div class="{element.properties.containerClassAttribute}{f:if(condition: '{validationResults.errors}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}">
<f:if condition="{formvh:translateElementProperty(element: element, property: 'confirmationLabel')}">
<label class="{element.properties.labelClassAttribute}" for="{element.uniqueIdentifier}-confirmation">{formvh:translateElementProperty(element: element, property: 'confirmationLabel')}
<f:if condition="{element.required}">
<f:render partial="Field/Required" arguments="{element: element}"/>
</f:if>
</label>
</f:if>
<f:form.password
property="{element.identifier}.confirmation"
id="{element.uniqueIdentifier}-confirmation"
class="{element.properties.confirmationClassAttribute}{f:if(condition: '{validationResults.errors}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</div>
<f:if condition="{validationResults.errors} && {element.properties.renderFieldset} == '1'">
<span id="{element.uniqueIdentifier}-errors" class="{element.rootForm.renderingOptions.fieldProperties.errorMsgClassAttribute}" role="alert">
<f:for each="{validationResults.errors}" as="error">
<f:format.htmlspecialchars>{formvh:translateElementError(element: element, error: error)}</f:format.htmlspecialchars>
<br/>
</f:for>
</span>
</f:if>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,28 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:variable name="errorClass">{f:if(condition: '{validationResults.errors}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}</f:variable>
<f:render partial="Field/Field" arguments="{element: element, doNotShowLabel: 1}" contentAs="elementContent">
<div class="{element.properties.labelClassAttribute}{errorClass}">
<f:form.checkbox
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
value="{element.properties.value}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
<label class="{element.properties.labelTextClassAttribute}" for="{element.uniqueIdentifier}">{formvh:translateElementProperty(element: element, property: 'label') -> f:sanitize.html() -> f:transform.html() -> f:format.stripTags(allowedTags: '<a><br><i><strong>')}<f:if condition="{element.required}"><f:render partial="Field/Required" arguments="{element: element}"/></f:if></label>
</div>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,27 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:if condition="{element.rootForm.renderingOptions.previewMode}">
<f:then>
<div class="{element.properties.outerContainerClassAttribute}">
<f:if condition="{element.properties.contentElementUid}">
<f:then>
<formvh:be.renderContentElementPreview
contentElementUid="{element.properties.contentElementUid}"
formPersistenceIdentifier="{element.rootForm.renderingOptions.formPersistenceIdentifier}" />
</f:then>
<f:else>
<f:translate key="LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.elements.ContentElement.selectContentElement" />
</f:else>
</f:if>
</div>
</f:then>
<f:else>
<f:if condition="{element.properties.contentElementUid}">
<div class="{element.properties.outerContainerClassAttribute}{f:if(condition: element.properties.elementClassAttribute, then: ' {element.properties.elementClassAttribute}')}">
<f:cObject typoscriptObjectPath="lib.tx_form.contentElementRendering">{element.properties.contentElementUid}</f:cObject>
</div>
</f:if>
</f:else>
</f:if>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,47 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:if condition="{element.properties.prependOptionLabel}">
<f:then>
<f:form.countrySelect
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
prependOptionLabel="{formvh:translateElementProperty(element: element, property: 'prependOptionLabel')}"
prependOptionValue="{formvh:translateElementProperty(element: element, property: 'prependOptionValue')}"
sortByOptionLabel="true"
prioritizedCountries="{element.properties.prioritizedCountries}"
onlyCountries="{element.properties.onlyCountries}"
excludeCountries="{element.properties.excludeCountries}"
aria="{aria}"
/>
</f:then>
<f:else>
<f:form.countrySelect
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
sortByOptionLabel="true"
prioritizedCountries="{element.properties.prioritizedCountries}"
onlyCountries="{element.properties.onlyCountries}"
excludeCountries="{element.properties.excludeCountries}"
aria="{aria}"
/>
</f:else>
</f:if>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textfield
type="date"
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,23 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textfield
type="email"
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,43 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{renderFieldset} == 1">
<f:then>
<fieldset class="{element.properties.fieldsetClassAttribute}{f:if(condition: '{validationResults.errors.0}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}">
<legend class="{f:if(condition: '{doNotShowLabel} == 1', then: ' {element.rootForm.renderingOptions.fieldProperties.visuallyHiddenClassAttribute}')}">{formvh:translateElementProperty(element: element, property: 'label')}
<f:if condition="{element.required}">
<f:render partial="Field/Required" arguments="{element: element}"/>
</f:if>
</legend>
<f:render section="Element" arguments="{_all}"/>
</fieldset>
</f:then>
<f:else>
<div class="{element.properties.containerClassAttribute}{f:if(condition: '{validationResults.errors.0}', then: ' {element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}">
<f:if condition="{doNotShowLabel} != 1">
<label class="{element.properties.labelClassAttribute}{f:if(condition: '{doNotShowLabel} == 1', then: ' {element.rootForm.renderingOptions.fieldProperties.visuallyHiddenClassAttribute}')}" for="{element.uniqueIdentifier}">{formvh:translateElementProperty(element: element, property: 'label')}
<f:if condition="{element.required}">
<f:render partial="Field/Required" arguments="{element: element}"/>
</f:if>
</label>
</f:if>
<f:render section="Element" arguments="{_all}"/>
</div>
</f:else>
</f:if>
</f:form.validationResults>
<f:section name="Element">
<f:format.raw>{elementContent}</f:format.raw>
<f:if condition="{validationResults.flattenedErrors} && {renderFieldset} != 1">
<span id="{element.uniqueIdentifier}-errors" class="{element.rootForm.renderingOptions.fieldProperties.errorMsgClassAttribute}" role="alert">
<f:for each="{validationResults.errors}" as="error">
<f:format.htmlspecialchars>{formvh:translateElementError(element: element, error: error)}</f:format.htmlspecialchars>
<br/>
</f:for>
</span>
</f:if>
<f:if condition="{element.properties.elementDescription}">
<span id="{element.uniqueIdentifier}-desc" class="{element.rootForm.renderingOptions.fieldProperties.descriptionClassAttribute}">{formvh:translateElementProperty(element: element, property: 'elementDescription')}</span>
</f:if>
</f:section>
</html>
@@ -0,0 +1,3 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<span class="{element.rootForm.renderingOptions.fieldProperties.requiredMarkClassAttribute}">*</span>
</html>
@@ -0,0 +1,19 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:variable name="fluidAdditionalAttributes" value="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"/>
<f:variable name="additionalAttributes" value="" />
<f:if condition="{fluidAdditionalAttributes}">
<f:for each="{fluidAdditionalAttributes}" as="value" key="key">
<f:variable name="additionalAttributes" value='{additionalAttributes} {key}="{value}"' />
</f:for>
</f:if>
<fieldset id="{element.uniqueIdentifier}" class="{element.properties.elementClassAttribute}" {additionalAttributes -> f:format.raw()}>
<f:if condition="{element.label}">
<legend>{formvh:translateElementProperty(element: element, property: 'label')}</legend>
</f:if>
<f:for each="{element.elements}" as="element">
<f:render partial="{element.templateName}" arguments="{element: element}" />
</f:for>
</fieldset>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,67 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<formvh:form.uploadedResource
property="{element.identifier}"
as="resource"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
accept="{element.properties.allowedMimeTypes}"
aria="{aria}"
multiple="{element.properties.multiple}"
>
<f:if condition="{resource}">
<f:if condition="{element.properties.multiple}">
<f:then>
<ul id="{element.uniqueIdentifier}-preview" class="form-element-fileupload-list">
<f:for each="{resource}" as="file" iteration="iterator">
<li class="form-element-fileupload-item">
<span class="form-element-fileupload-name">{file.originalResource.originalFile.name}</span>
<f:if condition="{element.properties.allowRemoval}">
<label class="form-element-fileupload-remove">
<formvh:form.uploadDeleteCheckbox
property="{element.identifier}"
fileReference="{file}"
fileIndex="{iterator.index}"
/>
<f:translate key="upload.remove" domain="form" default="Remove" />
<span class="visually-hidden">{file.originalResource.originalFile.name}</span>
</label>
</f:if>
</li>
</f:for>
</ul>
</f:then>
<f:else>
<div id="{element.uniqueIdentifier}-preview" class="form-element-fileupload-preview">
<span class="form-element-fileupload-name">{resource.originalResource.originalFile.name}</span>
<f:if condition="{element.properties.allowRemoval}">
<label class="form-element-fileupload-remove">
<formvh:form.uploadDeleteCheckbox
property="{element.identifier}"
fileReference="{resource}"
fileIndex="0"
/>
<f:translate key="upload.remove" domain="form" default="Remove" />
<span class="visually-hidden">{resource.originalResource.originalFile.name}</span>
</label>
</f:if>
</div>
</f:else>
</f:if>
</f:if>
</formvh:form.uploadedResource>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,17 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<nav class="{form.renderingOptions.formNavigation.navigationClassAttribute}" aria-label="{form.renderingOptions.formNavigation.navigationAriaLabelAttribute}">
<f:if condition="{form.previousEnabledPage}">
<f:form.button property="__currentPage" value="{form.previousEnabledPage.index}" formnovalidate="formnovalidate" class="{form.renderingOptions.formNavigation.btnPreviousClassAttribute}">{formvh:translateElementProperty(element: form.currentPage, renderingOptionProperty: 'previousButtonLabel')}</f:form.button>
</f:if>
<f:if condition="{form.nextEnabledPage}">
<f:then>
<f:form.button property="__currentPage" value="{form.nextEnabledPage.index}" class="{form.renderingOptions.formNavigation.btnNextClassAttribute}">{formvh:translateElementProperty(element: form.currentPage, renderingOptionProperty: 'nextButtonLabel')}</f:form.button>
</f:then>
<f:else>
<f:form.button property="__currentPage" value="{form.pages -> f:count()}" class="{form.renderingOptions.formNavigation.btnSubmitClassAttribute}">
{formvh:translateElementProperty(element: form, renderingOptionProperty: 'submitButtonLabel')}
</f:form.button>
</f:else>
</f:if>
</nav>
</html>
@@ -0,0 +1,7 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:for each="{element.elements}" as="element">
<f:render partial="{element.templateName}" arguments="{element: element}" />
</f:for>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,13 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<div class="{f:if(condition: element.properties.elementClassAttribute, then: '{element.properties.elementClassAttribute}')}">
<f:for each="{element.elements}" as="element">
<f:if condition="{element.enabled}">
<div class="{formvh:gridColumnClassAutoConfiguration(element: element)}">
<f:render partial="{element.templateName}" arguments="{element: element}" />
</div>
</f:if>
</f:for>
</div>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,10 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.hidden
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
/>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,10 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{element.properties.renderAsHiddenField}">
<f:then>
<f:form.hidden property="{element.identifier}" id="{element.uniqueIdentifier}" data="{id: element.identifier}" />
</f:then>
<f:else>
<f:form.textfield property="{element.identifier}" id="{element.uniqueIdentifier}" class="{element.properties.elementClassAttribute}" data="{id: element.identifier}" additionalAttributes="{aria-hidden: 'true'}" tabindex="-1" style="{element.properties.styleAttribute}" />
</f:else>
</f:if>
</html>
@@ -0,0 +1,71 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<formvh:form.uploadedResource
property="{element.identifier}"
as="image"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
accept="{element.properties.allowedMimeTypes}"
aria="{aria}"
multiple="{element.properties.multiple}"
>
<f:if condition="{image}">
<f:if condition="{element.properties.multiple}">
<f:then>
<ul id="{element.uniqueIdentifier}-preview" class="form-element-imageupload-list">
<f:for each="{image}" as="singleImage" iteration="iterator">
<li class="form-element-imageupload-item form-element-imageupload-item-{singleImage.originalResource.extension}">
<a href="{f:uri.image(image: singleImage, maxWidth: element.properties.imageLinkMaxWidth)}" class="form-element-imageupload-link">
<f:image image="{singleImage}" maxWidth="{element.properties.imageMaxWidth}" maxHeight="{element.properties.imageMaxHeight}" alt="{singleImage.originalResource.originalFile.name}" class="form-element-imageupload-thumbnail"/>
</a>
<f:if condition="{element.properties.allowRemoval}">
<label class="form-element-imageupload-remove">
<formvh:form.uploadDeleteCheckbox
property="{element.identifier}"
fileReference="{singleImage}"
fileIndex="{iterator.index}"
/>
<f:translate key="upload.remove" domain="form" default="Remove" />
<span class="visually-hidden">{singleImage.originalResource.originalFile.name}</span>
</label>
</f:if>
</li>
</f:for>
</ul>
</f:then>
<f:else>
<div id="{element.uniqueIdentifier}-preview" class="form-element-imageupload-preview">
<a href="{f:uri.image(image: image, maxWidth: element.properties.imageLinkMaxWidth)}" class="form-element-imageupload-link">
<f:image image="{image}" maxWidth="{element.properties.imageMaxWidth}" maxHeight="{element.properties.imageMaxHeight}" alt="{image.originalResource.originalFile.name}" class="form-element-imageupload-thumbnail"/>
</a>
<f:if condition="{element.properties.allowRemoval}">
<label class="form-element-imageupload-remove">
<formvh:form.uploadDeleteCheckbox
property="{element.identifier}"
fileReference="{image}"
fileIndex="0"
/>
<f:translate key="upload.remove" domain="form" default="Remove" />
<span class="visually-hidden">{image.originalResource.originalFile.name}</span>
</label>
</f:if>
</div>
</f:else>
</f:if>
</f:if>
</formvh:form.uploadedResource>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,44 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:render partial="Field/Field" arguments="{element: element, renderFieldset: '{element.properties.renderFieldset}', doNotShowLabel: '{element.properties.legendVisuallyHidden}'}" contentAs="elementContent">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:variable name="errorClass">{f:if(condition: '{validationResults.errors}', then: '{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}</f:variable>
<div id="{element.uniqueIdentifier}" class="{errorClass}" role="radiogroup" aria-label="{element.label}">
<f:for each="{element.properties.options}" as="label" key="value" iteration="idIterator">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors} && {idIterator.isFirst}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<div class="{element.properties.containerClassAttribute}">
<label class="{element.properties.labelClassAttribute}" for="{element.uniqueIdentifier}-{idIterator.index}">
<f:form.checkbox
property="{element.identifier}"
multiple="1"
id="{element.uniqueIdentifier}-{idIterator.index}"
class="{element.properties.elementClassAttribute}"
value="{value}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
<span class="{element.properties.labelTextClassAttribute}">{formvh:translateElementProperty(element: element, property: '{0: \'options\', 1: value}')}</span>
</label>
</div>
</f:for>
</div>
<f:if condition="{validationResults.flattenedErrors} && {element.properties.renderFieldset} == '1'">
<span id="{element.uniqueIdentifier}-errors" class="{element.rootForm.renderingOptions.fieldProperties.errorMsgClassAttribute}" role="alert">
<f:for each="{validationResults.errors}" as="error">
<f:format.htmlspecialchars>{formvh:translateElementError(element: element, error: error)}</f:format.htmlspecialchars>
<br/>
</f:for>
</span>
</f:if>
</f:form.validationResults>
</f:render>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,44 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:if condition="{element.properties.prependOptionLabel}">
<f:then>
<f:form.select
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
options="{formvh:translateElementProperty(element: element, property: 'options')}"
multiple="multiple"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
prependOptionLabel="{formvh:translateElementProperty(element: element, property: 'prependOptionLabel')}"
prependOptionValue="{formvh:translateElementProperty(element: element, property: 'prependOptionValue')}"
aria="{aria}"
/>
</f:then>
<f:else>
<f:form.select
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
options="{formvh:translateElementProperty(element: element, property: 'options')}"
multiple="multiple"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:else>
</f:if>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textfield
type="number"
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,10 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{page}">
<f:if condition="{page.label}">
<h2>{formvh:translateElementProperty(element: page, property: 'label')}</h2>
</f:if>
<f:for each="{page.elements}" as="element">
<f:render partial="{element.templateName}" arguments="{element: element}" />
</f:for>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,23 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.password
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,43 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:render partial="Field/Field" arguments="{element: element, renderFieldset: '{element.properties.renderFieldset}', doNotShowLabel: '{element.properties.legendVisuallyHidden}'}" contentAs="elementContent">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:variable name="errorClass">{f:if(condition: '{validationResults.errors}', then: '{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}')}</f:variable>
<div id="{element.uniqueIdentifier}" class="{errorClass}" role="radiogroup" aria-label="{element.label}">
<f:for each="{element.properties.options}" as="label" key="value" iteration="idIterator">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors} && {idIterator.isFirst}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<div class="{element.properties.containerClassAttribute}">
<label class="{element.properties.labelClassAttribute}" for="{element.uniqueIdentifier}-{idIterator.index}">
<f:form.radio
property="{element.identifier}"
id="{element.uniqueIdentifier}-{idIterator.index}"
class="{element.properties.elementClassAttribute}"
value="{value}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
<span class="{element.properties.labelTextClassAttribute}">{formvh:translateElementProperty(element: element, property: '{0: \'options\', 1: value}')}</span>
</label>
</div>
</f:for>
</div>
<f:if condition="{validationResults.flattenedErrors} && {element.properties.renderFieldset} == '1'">
<span id="{element.uniqueIdentifier}-errors" class="{element.rootForm.renderingOptions.fieldProperties.errorMsgClassAttribute}" role="alert">
<f:for each="{validationResults.errors}" as="error">
<f:format.htmlspecialchars>{formvh:translateElementError(element: element, error: error)}</f:format.htmlspecialchars>
<br/>
</f:for>
</span>
</f:if>
</f:form.validationResults>
</f:render>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,41 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:if condition="{element.properties.prependOptionLabel}">
<f:then>
<f:form.select
property="{element.identifier}"
id="{element.uniqueIdentifier}"
options="{formvh:translateElementProperty(element: element, property: 'options')}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
prependOptionLabel="{formvh:translateElementProperty(element: element, property: 'prependOptionLabel')}"
prependOptionValue="{formvh:translateElementProperty(element: element, property: 'prependOptionValue')}"
aria="{aria}"
/>
</f:then>
<f:else>
<f:form.select
property="{element.identifier}"
id="{element.uniqueIdentifier}"
options="{formvh:translateElementProperty(element: element, property: 'options')}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:else>
</f:if>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,12 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<div class="{element.properties.containerClassAttribute}">
<f:if condition="{element.label}">
<h2>{formvh:translateElementProperty(element: element, property: 'label')}</h2>
</f:if>
<f:if condition="{element.properties.text}">
<div{f:if(condition: element.properties.elementClassAttribute, then: ' class="{element.properties.elementClassAttribute}"')}>{formvh:translateElementProperty(element: element, property: 'text') -> f:sanitize.html() -> f:transform.html()}</div>
</f:if>
</div>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,79 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{page}">
<fieldset>
<f:if condition="{page.label}">
<legend>{formvh:translateElementProperty(element: page, property: 'label')}</legend>
</f:if>
<div class="{page.renderingOptions.listClassAttribute}">
<formvh:renderAllFormValues renderable="{page.rootForm}" as="formValue">
<f:if condition="{formValue.isSection}">
<f:then>
<p><b>{formvh:translateElementProperty(element: formValue.element, property: 'label')}</b></p>
</f:then>
<f:else>
<dl class="{page.renderingOptions.listRowClassAttribute}">
<dt class="{page.renderingOptions.labelWrapperClassAttribute}">{formvh:translateElementProperty(element: formValue.element, property: 'label') -> f:sanitize.html() -> f:transform.html()}</dt>
<dd class="{page.renderingOptions.valueWrapperClassAttribute}">
<f:if condition="{formValue.value}">
<f:then>
<f:if condition="{0: formValue.element.type} == {0: 'ImageUpload'}">
<f:then>
<f:if condition="{formValue.isMultiValue}">
<f:then>
<ul class="image-upload-preview">
<f:for each="{formValue.value}" as="value">
<li class="image-{value.originalResource.extension}">
<f:image image="{value}" maxWidth="{formValue.element.properties.imageMaxWidth}" maxHeight="{formValue.element.properties.imageMaxHeight}" alt="{formvh:translateElementProperty(element: formValue.element, property: 'altText')}"/>
</li>
</f:for>
</ul>
</f:then>
<f:else>
<f:image image="{formValue.value}" maxWidth="{formValue.element.properties.imageMaxWidth}" maxHeight="{formValue.element.properties.imageMaxHeight}" alt="{formvh:translateElementProperty(element: formValue.element, property: 'altText')}"/>
</f:else>
</f:if>
</f:then>
<f:else if="{0: formValue.element.type} == {0: 'FileUpload'}">
<f:if condition="{formValue.isMultiValue}">
<f:then>
<ul class="file-upload-preview">
<f:for each="{formValue.value}" as="value">
<li class="file-{value.originalResource.extension}">{value.originalResource.originalFile.name}</li>
</f:for>
</ul>
</f:then>
<f:else>
<f:format.nl2br>{formValue.processedValue}</f:format.nl2br>
</f:else>
</f:if>
</f:else>
<f:else>
<f:if condition="{formValue.isMultiValue}">
<f:then>
<ul>
<f:for each="{formValue.processedValue}" as="value">
<li>{value}</li>
</f:for>
</ul>
</f:then>
<f:else>
<f:format.nl2br>{formValue.processedValue}</f:format.nl2br>
</f:else>
</f:if>
</f:else>
</f:if>
</f:then>
<f:else>
-
</f:else>
</f:if>
</dd>
</dl>
</f:else>
</f:if>
</formvh:renderAllFormValues>
</div>
</fieldset>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textfield
type="tel"
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,23 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}" />
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}" />
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textfield
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,25 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textarea
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
rows="{element.properties.rows}"
cols="{element.properties.cols}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,3 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}"> </formvh:renderRenderable>
</html>
@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{element}">
<f:form.validationResults for="{element.rootForm.identifier}.{element.identifier}">
<f:if condition="{element.properties.elementDescription}">
<f:variable name="aria" value="{describedby: '{element.uniqueIdentifier}-desc'}"/>
</f:if>
<f:if condition="{validationResults.errors}">
<f:variable name="aria" value="{invalid: 'true', describedby: '{element.uniqueIdentifier}-errors'}"/>
</f:if>
<f:render partial="Field/Field" arguments="{element: element}" contentAs="elementContent">
<f:form.textfield
type="url"
property="{element.identifier}"
id="{element.uniqueIdentifier}"
class="{element.properties.elementClassAttribute}"
errorClass="{element.rootForm.renderingOptions.fieldProperties.errorClassAttribute}"
additionalAttributes="{formvh:translateElementProperty(element: element, property: 'fluidAdditionalAttributes')}"
aria="{aria}"
/>
</f:render>
</f:form.validationResults>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<div id="{form.identifier}">
{message -> f:sanitize.html() -> f:transform.html()}
</div>
</html>
@@ -0,0 +1,53 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers">
<f:layout name="SystemEmail" />
<f:section name="Title">{title}</f:section>
<f:section name="Main">
<f:if condition="{messageBefore}">{messageBefore -> f:sanitize.html() -> f:format.html()}</f:if>
<f:if condition="!{hideFormValues}">
<table>
<formvh:renderAllFormValues renderable="{form.formDefinition}" as="formValue">
<tr>
<f:if condition="{formValue.isSection}">
<f:then>
<td colspan="2"><b>{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey)}</b></td>
</f:then>
<f:else>
<td valign="top" align="left">{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey) -> f:sanitize.html() -> f:transform.html()}</td>
<td valign="top" align="left">
<f:if condition="{formValue.value}">
<f:then>
<f:if condition="{formValue.isMultiValue}">
<f:then>
<table cellspacing="0" border="0">
<f:for each="{formValue.processedValue}" as="value">
<tr>
<td>{value}</td>
</tr>
</f:for>
</table>
</f:then>
<f:else>
<table cellspacing="0" border="0">
<tr>
<td><f:format.nl2br>{formValue.processedValue}</f:format.nl2br></td>
</tr>
</table>
</f:else>
</f:if>
</f:then>
<f:else>
-
</f:else>
</f:if>
</td>
</f:else>
</f:if>
</tr>
</formvh:renderAllFormValues>
</table>
</f:if>
<f:if condition="{messageAfter}">{messageAfter -> f:sanitize.html() -> f:format.html()}</f:if>
</f:section>
</html>
@@ -0,0 +1,19 @@
<f:layout name="SystemEmail" />
<f:section name="Title">{title}</f:section>
<f:section name="Main">
<f:if condition="{messageBefore}">{messageBefore -> f:format.stripTags()}
</f:if><f:if condition="!{hideFormValues}"><formvh:renderAllFormValues renderable="{form.formDefinition}" as="formValue"><f:spaceless>
<f:if condition="{formValue.isMultiValue}">
<f:then>
<f:if condition="{formValue.isSection}"><f:then>*** {formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey)} ***</f:then><f:else>{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey) -> f:format.stripTags()}: <f:for each="{formValue.processedValue}" as="singleValue">- {singleValue}
</f:for></f:else></f:if>
</f:then>
<f:else>
<f:if condition="{formValue.isSection}"><f:then>*** {formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey)} ***</f:then><f:else>{formvh:translateElementProperty(element: formValue.element, property: 'label', languageKey: languageKey) -> f:format.stripTags()}: <f:if condition="{formValue.processedValue}"><f:then>{formValue.processedValue -> f:format.raw()}</f:then><f:else>-</f:else></f:if></f:else></f:if>
</f:else>
</f:if>
</f:spaceless>
</formvh:renderAllFormValues></f:if><f:if condition="{messageAfter}">
{messageAfter -> f:format.stripTags()}</f:if>
</f:section>
@@ -0,0 +1,3 @@
<html data-namespace-typo3-fluid="true">
<p>{message}</p>
</html>
@@ -0,0 +1,21 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<formvh:renderRenderable renderable="{form}">
<formvh:form
object="{form}"
action="{form.renderingOptions.controllerAction}"
method="{form.renderingOptions.httpMethod}"
id="{form.identifier}"
section="{form.identifier}"
enctype="{form.renderingOptions.httpEnctype}"
addQueryString="{form.renderingOptions.addQueryString}"
argumentsToBeExcludedFromQueryString="{form.renderingOptions.argumentsToBeExcludedFromQueryString}"
additionalParams="{form.renderingOptions.additionalParams}"
additionalAttributes="{formvh:translateElementProperty(element: form, property: 'fluidAdditionalAttributes')}"
>
<f:render partial="{form.currentPage.templateName}" arguments="{page: form.currentPage}" />
<div class="{form.renderingOptions.formNavigation.navigationWrapperClassAttribute}">
<f:render partial="Form/Navigation" arguments="{form: form}" />
</div>
</formvh:form>
</formvh:renderRenderable>
</html>
@@ -0,0 +1,6 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{formConfiguration}">
<formvh:render overrideConfiguration="{formConfiguration}" />
<f:flashMessages />
</f:if>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/Modules/form_editor.xlf" date="2026-01-30T13:37:37Z" product-name="form">
<header/>
<body>
<trans-unit id="title">
<source>Form Editor</source>
</trans-unit>
<trans-unit id="description">
<source>Build and customize forms using the visual form editor. Add fields, configure validations, and set up finishers.</source>
</trans-unit>
<trans-unit id="short_description">
<source>Edit forms</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/Modules/form_manager.xlf" date="2026-01-30T13:37:37Z" product-name="form">
<header/>
<body>
<trans-unit id="title">
<source>Form Manager</source>
</trans-unit>
<trans-unit id="description">
<source>Manage and organize all forms. Create, edit, duplicate, and delete forms.</source>
</trans-unit>
<trans-unit id="short_description">
<source>Manage forms</source>
</trans-unit>
</body>
</file>
</xliff>
+155
View File
@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/locallang.xlf" date="2016-10-09T03:38:32Z" product-name="form">
<header/>
<body>
<trans-unit id="element.ImageUpload.properties.SummaryPage.altText">
<source>Uploaded image</source>
</trans-unit>
<trans-unit id="validation.error.1221560910">
<source>This field is mandatory.</source>
</trans-unit>
<trans-unit id="validation.error.1221560718">
<source>This field is mandatory.</source>
</trans-unit>
<trans-unit id="validation.error.1347992400">
<source>This field is mandatory.</source>
</trans-unit>
<trans-unit id="validation.error.1347992453">
<source>This field is mandatory.</source>
</trans-unit>
<trans-unit id="validation.error.1238087674">
<source>You must enter a valid date.</source>
</trans-unit>
<trans-unit id="validation.error.1221551320">
<source>You can only enter letters or digits.</source>
</trans-unit>
<trans-unit id="validation.error.1221565786">
<source>You can only enter non formatted text without any markup (e.g without XML tags).</source>
</trans-unit>
<trans-unit id="validation.error.1238110957">
<source>You can only enter non formatted text without any markup (e.g without XML tags).</source>
</trans-unit>
<trans-unit id="validation.error.1269883975">
<source>You can only enter non formatted text without any markup (e.g without XML tags).</source>
</trans-unit>
<trans-unit id="validation.error.1428504122">
<source>Your text must be a minimum of %s characters in length and no longer than %s.</source>
</trans-unit>
<trans-unit id="validation.error.1238108068">
<source>You must enter text which is longer than %s characters.</source>
</trans-unit>
<trans-unit id="validation.error.1238108069">
<source>You must enter text which is no longer than %s characters.</source>
</trans-unit>
<trans-unit id="validation.error.1221559976">
<source>You must enter a valid email address.</source>
</trans-unit>
<trans-unit id="validation.error.1221560494">
<source>You must enter a valid number.</source>
</trans-unit>
<trans-unit id="validation.error.1221560288">
<source>You must enter a valid floating point number.</source>
</trans-unit>
<trans-unit id="validation.error.1221563685">
<source>You must enter a valid number.</source>
</trans-unit>
<trans-unit id="validation.error.1221561046">
<source>You must enter a valid number between %s and %s.</source>
</trans-unit>
<trans-unit id="validation.error.1221565130">
<source>You must enter a valid value. Please refer to the description of this field.</source>
</trans-unit>
<trans-unit id="validation.error.1475002976">
<source>You must enter a countable subject.</source>
</trans-unit>
<trans-unit id="validation.error.1475002994">
<source>You must select between %s to %s elements.</source>
</trans-unit>
<trans-unit id="validation.error.1471708997">
<source>You must enter an instance of \TYPO3\CMS\Extbase\Domain\Model\FileReference or \TYPO3\CMS\Core\Resource\File.</source>
</trans-unit>
<trans-unit id="validation.error.1471708998">
<source>You entered an incorrect media type, "%s" is not allowed for this file. Please refer to the description of this field.</source>
</trans-unit>
<trans-unit id="validation.error.1613126216">
<source>The file extension provided "%s" does not match to expected media types. Please refer to the description of this field.</source>
</trans-unit>
<trans-unit id="validation.error.1476396435">
<source>You must NOT fill this field.</source>
</trans-unit>
<trans-unit id="validation.error.1505303626">
<source>You must enter an instance of \TYPO3\CMS\Extbase\Domain\Model\FileReference or \TYPO3\CMS\Core\Resource\File.</source>
</trans-unit>
<trans-unit id="validation.error.1505305752">
<source>You must select a file that is larger than %s in size.</source>
</trans-unit>
<trans-unit id="validation.error.1505305753">
<source>You must select a file that is no larger than %s.</source>
</trans-unit>
<trans-unit id="validation.error.1521293685">
<source>You must enter an instance of \DateTime.</source>
</trans-unit>
<trans-unit id="validation.error.1521293686">
<source>You must select a date before %s.</source>
</trans-unit>
<trans-unit id="validation.error.1521293687">
<source>You must select a date after %s.</source>
</trans-unit>
<trans-unit id="validation.error.1748345955">
<source>This field cannot be validated due to a configuration error. Please contact the website owner.</source>
</trans-unit>
<trans-unit id="validation.error.1556283177">
<source>Password does not match confirmation</source>
</trans-unit>
<trans-unit id="form_new_wizard_title">
<source>Form</source>
</trans-unit>
<trans-unit id="form_new_wizard_description">
<source>A form that allows website users to submit messages.</source>
</trans-unit>
<trans-unit id="upload.error.150530345">
<source>Maximum file size exceeded.</source>
</trans-unit>
<trans-unit id="upload.error.150530346">
<source>Upload failed. The file was only partially uploaded, please try again.</source>
</trans-unit>
<trans-unit id="upload.error.150530347">
<source>No file was uploaded.</source>
</trans-unit>
<trans-unit id="upload.error.150530348">
<source>Upload failed.</source>
</trans-unit>
<trans-unit id="upload.remove">
<source>Remove</source>
</trans-unit>
<trans-unit id="form.configuration.module.provider">
<source>Form: YAML Configuration</source>
</trans-unit>
<trans-unit id="form.finisher.error">
<source>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.</source>
</trans-unit>
<trans-unit id="pagination.previous">
<source>Previous</source>
</trans-unit>
<trans-unit id="pagination.next">
<source>Next</source>
</trans-unit>
<trans-unit id="pagination.first">
<source>First</source>
</trans-unit>
<trans-unit id="pagination.last">
<source>Last</source>
</trans-unit>
<trans-unit id="pagination.forms">
<source>Forms</source>
</trans-unit>
<trans-unit id="pagination.page">
<source>Page</source>
</trans-unit>
<trans-unit id="pagination.refresh">
<source>Refresh</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/locallang_db.xlf" date="2026-01-13T15:39:14Z" product-name="form">
<header/>
<body>
<trans-unit id="form_definition">
<source>Form definition</source>
</trans-unit>
<trans-unit id="form_definition.label">
<source>Name</source>
</trans-unit>
<trans-unit id="form_definition.identifier">
<source>Identifier</source>
</trans-unit>
<trans-unit id="form_definition.configuration">
<source>Configuration</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/locallang_formEditor_failSafeErrorHandling_javascript.xlf" date="2019-04-27T03:38:32Z" product-name="form">
<header/>
<body>
<trans-unit id="formEditor.error.headline">
<source>The form editor has stopped working.</source>
</trans-unit>
<trans-unit id="formEditor.error.message">
<source>Please contact your administrator.</source>
</trans-unit>
<trans-unit id="formEditor.error.technicalReason">
<source>Technical Reason:</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/locallang_formManager_javascript.xlf" date="2016-10-09T03:38:32Z" product-name="form">
<header/>
<body>
<trans-unit id="formManager.form_name">
<source>Name</source>
</trans-unit>
<trans-unit id="formManager.form_name_description">
<source>Enter a meaningful and descriptive name for the form. The name is displayed only in the TYPO3 backend.</source>
</trans-unit>
<trans-unit id="formManager.new_form_name">
<source>New form name</source>
</trans-unit>
<trans-unit id="formManager.form_storageLocation">
<source>Location</source>
</trans-unit>
<trans-unit id="formManager.form_storageLocation_description">
<source>Select the location where the form will be saved.</source>
</trans-unit>
<trans-unit id="formManager.form_prototype">
<source>Form prototype</source>
</trans-unit>
<trans-unit id="formManager.form_template">
<source>Template</source>
</trans-unit>
<trans-unit id="formManager.form_template_description">
<source>Select a template for building your new form.</source>
</trans-unit>
<trans-unit id="formManager.form_headline_general">
<source>General</source>
</trans-unit>
<trans-unit id="formManager.form_copied">
<source>Copied form</source>
</trans-unit>
<trans-unit id="formManager.cancel">
<source>Cancel</source>
</trans-unit>
<trans-unit id="formManager.remove_form">
<source>Delete</source>
</trans-unit>
<trans-unit id="formManager.remove_form_title">
<source>Confirm deletion</source>
</trans-unit>
<trans-unit id="formManager.remove_form_message">
<source>Delete form "{0}"? Forms saved as files are permanently deleted and cannot be restored from the Recycler.</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step1.title">
<source>Create new form</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step.modes.summary.title">
<source>Mode</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step1.progressLabel">
<source>Choose</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step1.noStorages">
<source>You do not have permission to create forms. Please contact your administrator.</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step2.title">
<source>Settings</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step3.title">
<source>Ready?</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step3.progressLabel">
<source>Check</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step3.message">
<source>Just check and confirm the settings you have entered. Done? Then you are ready to go.</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step3.check">
<source>Check and confirm</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step4.errorTitle">
<source>Create</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step4.errorMessage">
<source>The form could not be saved</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step.storages.title">
<source>Storage location</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step.storages.description">
<source>Choose how the form should be saved:</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step.storages.progressLabel">
<source>Storage</source>
</trans-unit>
<trans-unit id="formManager.newFormWizard.step.storages.summary.title">
<source>Storage</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step1.title">
<source>Duplicate form "{0}"</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step2.title">
<source>Ready?</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step2.progressLabel">
<source>Check</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step2.check">
<source>Check and confirm</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step2.message">
<source>Just check and confirm the settings you have entered. Done? Then you are ready to go.</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step3.errorTitle">
<source>Duplicate</source>
</trans-unit>
<trans-unit id="formManager.duplicateFormWizard.step3.errorMessage">
<source>The form could not be saved</source>
</trans-unit>
<trans-unit id="formManager.no_references">
<source>There are no references yet.</source>
</trans-unit>
<trans-unit id="formManager.table.field.control">
<source>Control</source>
</trans-unit>
<trans-unit id="formManager.table.field.uid">
<source>Uid</source>
</trans-unit>
<trans-unit id="formManager.table.field.title">
<source>Title</source>
</trans-unit>
<trans-unit id="formManager.btn.edit.title">
<source>Edit</source>
</trans-unit>
<trans-unit id="formManager.references.title">
<source>Form: {0}</source>
</trans-unit>
<trans-unit id="formManager.references.headline">
<source>References to this item</source>
</trans-unit>
<trans-unit id="formManager.blankForm.label">
<source>Blank form</source>
</trans-unit>
<trans-unit id="formManager.blankForm.subtitle">
<source>Start fresh</source>
</trans-unit>
<trans-unit id="formManager.blankForm.description">
<source>Create a new form from scratch.</source>
</trans-unit>
<trans-unit id="formManager.predefinedForm.label">
<source>Predefined form</source>
</trans-unit>
<trans-unit id="formManager.predefinedForm.subtitle">
<source>Use a form template</source>
</trans-unit>
<trans-unit id="formManager.predefinedForm.description">
<source>Create a new form and use an existing form template for it.</source>
</trans-unit>
<trans-unit id="formManager.finisher.redirect.success.title">
<source>Form created</source>
</trans-unit>
<trans-unit id="formManager.finisher.redirect.success.description">
<source>The form has been successfully created. Click "Finish" to be redirected to the newly created form.</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/locallang_form_editor_javascript.xlf" date="2026-01-26T11:12:56Z" product-name="form">
<header/>
<body>
<trans-unit id="formEditor.insert_elements">
<source>Insert elements</source>
</trans-unit>
<trans-unit id="formEditor.stage.toolbar.new_element">
<source>Create new element</source>
</trans-unit>
<trans-unit id="formEditor.stage.toolbar.new_element.after">
<source>Create new element after</source>
</trans-unit>
<trans-unit id="formEditor.stage.toolbar.new_element.before">
<source>Create new element before</source>
</trans-unit>
<trans-unit id="formEditor.stage.toolbar.remove">
<source>Remove</source>
</trans-unit>
<trans-unit id="formEditor.step.name.empty">
<source>Step name is not set</source>
</trans-unit>
<trans-unit id="formEditor.validation.hasError">
<source>Has validation errors</source>
</trans-unit>
<trans-unit id="formEditor.validation.childHasError">
<source>Contains elements with validation errors</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/locallang_relative_date_editor.xlf" date="2025-02-25T00:00:00Z" product-name="form">
<header/>
<body>
<trans-unit id="mode.no">
<source>No value</source>
</trans-unit>
<trans-unit id="mode.today">
<source>Today</source>
</trans-unit>
<trans-unit id="mode.absolute">
<source>Absolute date</source>
</trans-unit>
<trans-unit id="mode.relative">
<source>Relative date</source>
</trans-unit>
<trans-unit id="direction.past">
<source>past</source>
</trans-unit>
<trans-unit id="direction.future">
<source>future</source>
</trans-unit>
<trans-unit id="unit.days">
<source>{count, plural, one {Day} other {Days}}</source>
</trans-unit>
<trans-unit id="unit.weeks">
<source>{count, plural, one {Week} other {Weeks}}</source>
</trans-unit>
<trans-unit id="unit.months">
<source>{count, plural, one {Month} other {Months}}</source>
</trans-unit>
<trans-unit id="unit.years">
<source>{count, plural, one {Year} other {Years}}</source>
</trans-unit>
<trans-unit id="mode.custom">
<source>Custom relative expression</source>
</trans-unit>
<trans-unit id="custom.placeholder">
<source>e.g. "sunday next month"</source>
</trans-unit>
</body>
</file>
</xliff>
+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:form/Resources/Private/Language/module.xlf" date="2026-11-10T13:37:37Z" product-name="form">
<header/>
<body>
<trans-unit id="short_description">
<source>Build custom forms</source>
</trans-unit>
<trans-unit id="description">
<source>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.</source>
</trans-unit>
<trans-unit id="title">
<source>Forms</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,90 @@
<f:if condition="{paginator.numberOfPages} > 1">
<nav class="pagination-wrap">
<ul class="pagination">
<f:if condition="{pagination.previousPageNumber} && {pagination.previousPageNumber} >= {pagination.firstPageNumber}">
<f:then>
<li class="page-item">
<f:link.action action="index" arguments="{page: 1, searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}" title="{f:translate(key:'pagination.first')}" class="page-link">
<core:icon identifier="actions-view-paging-first" />
</f:link.action>
</li>
<li class="page-item">
<f:link.action action="index" arguments="{page: pagination.previousPageNumber, searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}" title="{f:translate(key:'pagination.previous')}" class="page-link">
<core:icon identifier="actions-view-paging-previous" />
</f:link.action>
</li>
</f:then>
<f:else>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
</f:else>
</f:if>
<li class="page-item">
<span class="page-link">
<f:translate key="pagination.forms" /> {pagination.startRecordNumber} - {pagination.endRecordNumber}
</span>
</li>
<li class="page-item">
<span class="page-link">
<f:translate key="pagination.page" />
<form
class="form-inline"
data-global-event="submit"
data-action-navigate="$form=~s/$value/"
data-navigate-value="{f:uri.action(action:'index', arguments:'{page: \'$[value]\', searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}')}"
data-value-selector="input[name='paginator-target-page']">
<input
min="{pagination.firstPageNumber}"
max="{pagination.lastPageNumber}"
data-number-of-pages="{paginator.numberOfPages}"
name="paginator-target-page"
class="form-control form-control-sm paginator-input"
size="5"
value="{paginator.currentPageNumber}"
type="number"/>
</form>
/ {pagination.lastPageNumber}
</span>
</li>
<f:if condition="{pagination.nextPageNumber} && {pagination.nextPageNumber} <= {pagination.lastPageNumber}">
<f:then>
<li class="page-item">
<f:link.action action="index" arguments="{page: pagination.nextPageNumber, searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}" title="{f:translate(key:'pagination.next')}" class="page-link">
<core:icon identifier="actions-view-paging-next" />
</f:link.action>
</li>
<li class="page-item">
<f:link.action action="index" arguments="{page: pagination.lastPageNumber, searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}" title="{f:translate(key:'pagination.last')}" class="page-link">
<core:icon identifier="actions-view-paging-last" />
</f:link.action>
</li>
</f:then>
<f:else>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
</f:else>
</f:if>
<li class="page-item">
<f:link.action action="index" arguments="{page: paginator.currentPageNumber, searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}" title="{f:translate(key:'pagination.refresh')}" class="page-link">
<core:icon identifier="actions-refresh" />
</f:link.action>
</li>
</ul>
</nav>
</f:if>
@@ -0,0 +1,110 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<div class="formeditor">
<div class="formeditor-loader" data-identifier="moduleLoadingIndicator">
<core:icon identifier="spinner-circle" size="medium" />
<div><f:translate key="LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.loading" /></div>
</div>
<div class="formeditor-inner">
<div class="formeditor-module hidden" data-identifier="moduleWrapper">
<f:format.raw>{formEditorTemplates}</f:format.raw>
<section class="formeditor-stage-container" data-identifier="stageContainer">
<div class="formeditor-stage-container-inner" data-identifier="stageContainerInner">
<f:render section="Header" />
<f:render section="Stage" />
</div>
</section>
</div>
<section class="formeditor-inspector hidden" data-identifier="inspectorSection">
<div class="formeditor-inspector-inner">
<div class="formeditor-inspector-collapse">
<button
type="button"
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.button_collapse_inspector')}"
data-identifier="formeditorInspectorCollapse"
>
<core:icon identifier="actions-panel-expand-start" size="small" />
</button>
</div>
<f:render section="Inspector" />
</div>
</section>
</div>
</div>
</f:section>
<f:section name="Header">
<div class="formeditor-header">
<h1 data-identifier="formDefinitionLabel"></h1>
<div class="formeditor-header-actions">
<button
type="button"
class="btn btn-sm btn-default"
title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.edit_button')}"
data-identifier="formSettings"
>
<core:icon identifier="actions-open" />
{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.edit_button')}
</button>
<button
type="button"
class="btn btn-sm btn-default formeditor-inspector-expand"
title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.button_expand_inspector')}"
data-identifier="formeditorInspectorExpand"
>
<core:icon identifier="actions-panel-collapse-start" size="small" />
</button>
</div>
</div>
</f:section>
<f:section name="Stage">
<div class="formeditor-stage" data-identifier="stagePanel">
<div class="formeditor-stage-inner">
<div class="formeditor-stage-heading" data-identifier="panelHeading">
<div class="panel-heading-row panel-heading-row-spread">
<div class="panel-heading-column">
<div class="btn-group btn-group-sm">
<button class="btn btn-default" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.preview_mode_button')}" data-identifier="buttonViewModePreview"><core:icon identifier="actions-view" alternativeMarkupIdentifier="inline" /></button>
<button class="btn btn-default" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.edit_mode_button')}" data-identifier="buttonViewModeAbstract"><core:icon identifier="actions-open" alternativeMarkupIdentifier="inline" /></button>
</div>
</div>
<div class="panel-heading-column">
<span class="panel-label" data-identifier="paginationTitle"></span>
<div class="btn-group btn-group-sm">
<button class="btn btn-default" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.previous_step_button')}" data-identifier="buttonPaginationPrevious"><core:icon identifier="actions-view-paging-previous" alternativeMarkupIdentifier="inline" /></button>
<button class="btn btn-default" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.next_step_button')}" data-identifier="buttonPaginationNext"><core:icon identifier="actions-view-paging-next" alternativeMarkupIdentifier="inline" /></button>
</div>
<button
type="button"
class="btn btn-sm btn-default"
title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.new_page_button')}"
data-identifier="newPage"
>
<core:icon identifier="actions-plus" />
{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.new_page_button')}
</button>
</div>
</div>
</div>
<div class="formeditor-stage-section" data-identifier="stageSection">
<div class="formeditor-stage-area" data-identifier="stageArea"></div>
</div>
</div>
</div>
</f:section>
<f:section name="Inspector">
<div class="formeditor-inspector-content" data-identifier="inspector"></div>
</f:section>
</html>
@@ -0,0 +1,333 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/form/backend/form-manager/main.js"/>
<f:for each="{stylesheets}" as="stylesheet">
<f:asset.css href="{stylesheet}" identifier="{stylesheet}"/>
</f:for>
</f:section>
<f:section name="Content">
<h1><f:translate key="form.database:formManager.headline" /></h1>
<f:if condition="{hasForms}">
<form
class="form-inline"
data-global-event="submit"
data-action-navigate="$form=~s/$value/"
data-navigate-value="{f:uri.action(action:'index', arguments:'{searchTerm: \'$[value]\', orderField: orderField, orderDirection: orderDirection}')}"
data-value-selector="input[name='searchTerm']"
>
<div class="form-row">
<div class="form-group">
<label for="search_field" class="form-label">
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.label.searchString"/>
</label>
<div class="input-group">
<input
type="search"
autocomplete="off"
id="search_field"
name="searchTerm"
class="form-control"
value="{searchTerm}"
/>
<button class="btn btn-default" type="submit" name="search">
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.title.search"/>
</button>
</div>
</div>
</div>
</form>
</f:if>
<f:if condition="{paginator.paginatedItems}">
<f:then>
<div class="table-fit">
<table id="forms" class="table table-striped table-hover">
<thead>
<tr>
<th class="col-50 col-responsive" colspan="2">
<f:render section="listHeaderSorting" arguments="{field: 'name', label: 'formManager.form_name', searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}"/>
</th>
<th class="col-path">
<f:render section="listHeaderSorting" arguments="{field: 'storageLocation', label: 'formManager.location', searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}"/>
</th>
<th class="col-state">
<f:render section="listHeaderSorting" arguments="{field: 'duplicateIdentifier', label: 'formManager.integrity', searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}"/>
</th>
<th class="col-state">
<f:render section="listHeaderSorting" arguments="{field: 'referenceCount', label: 'formManager.references', searchTerm: searchTerm, orderField: orderField, orderDirection: orderDirection}"/>
</th>
<th class="col-control">
<span class="visually-hidden">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels._CONTROL_')}</span>
</th>
</tr>
</thead>
<tbody>
<f:for each="{paginator.paginatedItems}" as="form">
<tr>
<td class="col-icon">
<span title="identifier={form.identifier}"><core:icon identifier="content-form" overlay="{f:if(condition: form.invalid, then: 'overlay-missing', else: '{f:if(condition: form.readOnly, then: \'overlay-locked\')}')}" /></span>
</td>
<td class="col-50 col-responsive">
<f:if condition="{form.invalid} || {form.readOnly}">
<f:then>
{form.name}
<f:if condition="{form.invalid}">
<span class="badge badge-danger">
<f:translate key="form.database:formManager.invalid" />
</span>
</f:if>
</f:then>
<f:else>
<f:if condition="{form.editUrl}">
<f:then>
<a href="{form.editUrl}" title="{f:translate(key: 'form.database:formManager.edit_form')}">
{form.name}
</a>
</f:then>
<f:else>
{form.name}
</f:else>
</f:if>
</f:else>
</f:if>
</td>
<td class="col-50 col-path">
{form.storageLocation}
</td>
<td class="col-state">
<f:if condition="{form.invalid}">
<f:then>
<span title="{f:translate(key: 'form.database:formManager.invalid')}">
<core:icon identifier="status-dialog-error" />
</span>
</f:then>
<f:else if="{form.duplicateIdentifier}">
<span title="{f:translate(key: 'form.database:formManager.duplicate_identifier')}">
<core:icon identifier="status-dialog-error" />
</span>
</f:else>
</f:if>
</td>
<td class="col-state">
<f:if condition="{form.referenceCount}">
<f:then>
<a href="#" data-identifier="showReferences" data-form-persistence-identifier="{form.persistenceIdentifier}" data-form-name="{form.name}">
{form.referenceCount}
</a>
</f:then>
<f:else>-</f:else>
</f:if>
</td>
<td class="col-control">
<div class="btn-group" role="group">
<f:if condition="{form.invalid} || {form.readOnly}">
<f:then>
<span class="btn btn-default disabled" aria-hidden="true"><core:icon identifier="empty-empty" /></span>
</f:then>
<f:else>
<f:if condition="{form.editUrl}">
<f:then>
<a href="{form.editUrl}" class="btn btn-default" title="{f:translate(key: 'form.database:formManager.edit_form')}">
<core:icon identifier="actions-open" />
</a>
</f:then>
<f:else>
<span class="btn btn-default disabled" aria-hidden="true"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
</f:else>
</f:if>
<f:if condition="{form.removable} && ({form.invalid} == '0') && ({form.referenceCount} == '0')">
<f:then>
<a
href="#"
class="btn btn-default"
data-bs-original-title="{f:translate(key: 'form.database:formManager.delete_form')}"
data-identifier="removeForm"
data-form-persistence-identifier="{form.persistenceIdentifier}"
data-form-name="{form.name}"
title="{f:translate(key: 'form.database:formManager.delete_form')}"
>
<core:icon identifier="actions-edit-delete" />
</a>
</f:then>
<f:else>
<span class="btn btn-default disabled" aria-hidden="true"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
</div>
<div class="btn-group dropdown" role="group">
<f:if condition="{form.invalid}">
<f:then>
<span class="btn btn-default disabled" aria-hidden="true"><core:icon identifier="empty-empty" /></span>
</f:then>
<f:else>
<a
href="#actions-{form.identifier}"
class="btn btn-default dropdown-toggle dropdown-toggle-no-chevron"
data-bs-toggle="dropdown"
data-bs-boundary="window"
aria-expanded="false"
>
<core:icon identifier="actions-menu-alternative" />
</a>
<ul id="actions-{form.identifier}" class="dropdown-menu">
<li>
<a
href="#"
class="dropdown-item dropdown-item-spaced"
data-bs-original-title="{f:translate(id: 'form.database:formManager.duplicate_this_form')}"
data-identifier="duplicateForm"
data-form-persistence-identifier="{form.persistenceIdentifier}"
data-form-name="{form.name}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-{cacheAction.severity}">
<core:icon identifier="actions-duplicate" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate id="form.database:formManager.duplicate_this_form" />
</span>
</span>
</a>
</li>
<f:if condition="{form.actions.recordHistoryUrl}">
<li>
<a class="dropdown-item dropdown-item-spaced"
href="{form.actions.recordHistoryUrl}"
title="{f:translate(id: 'form.database:formManager.showHistory')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon">
<core:icon identifier="actions-document-history-open" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate id="form.database:formManager.showHistory" />
</span>
</span>
</a>
</li>
</f:if>
</ul>
</f:else>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
<tfoot>
<tr>
<td colspan="6">
<f:variable name="totalAmountOfPaginatedItems" value="{paginator.paginatedItems -> f:count()}" />
<f:if condition="{paginator.paginatedItems -> f:count()} > 1">
<f:then>{totalAmountOfPaginatedItems} <f:translate key="form.database:formManager.table.amount.forms" /></f:then>
<f:else>{totalAmountOfPaginatedItems} <f:translate key="form.database:formManager.table.amount.form" /></f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:render partial="Backend/FormManager/Pagination" arguments="{_all}" />
</f:then>
<f:else if="{hasForms}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'form.database:formManager.forms_not_found.title')}"
>
<p><f:translate key="form.database:formManager.forms_not_found_by_search_term.message" arguments="{0: searchTerm}" /></p>
<a class="btn btn-primary" href="{f:be.uri(route:'web_FormFormbuilder')}">
<f:translate key="form.database:formManager.remove_search_term"/>
</a>
</f:be.infobox>
</f:else>
<f:else>
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'form.database:formManager.forms_not_found.title')}"
>
<p><f:translate key="form.database:formManager.forms_not_found.message" /></p>
<a class="btn btn-primary" href="#" data-identifier="newForm"><f:translate key="form.database:formManager.create_new_form" /></a>
</f:be.infobox>
</f:else>
</f:if>
</f:section>
<f:section name="listHeaderSorting">
<div class="dropdown dropdown-static">
<button class="dropdown-toggle dropdown-toggle-link" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<f:translate key="form.database:{label}"/>
<f:if condition="{orderField} === {field}">
<f:then>
<div class="text-primary">
<f:if condition="{orderDirection} === 'asc'">
<f:then>
<core:icon identifier="actions-sort-amount-up" />
</f:then>
<f:else>
<core:icon identifier="actions-sort-amount-down" />
</f:else>
</f:if>
</div>
</f:then>
<f:else>
<div>
<core:icon identifier="empty-empty" />
</div>
</f:else>
</f:if>
</button>
<ul class="dropdown-menu">
<li>
<a
class="dropdown-item"
href="{f:uri.action(action:'index', arguments:'{searchTerm: searchTerm, orderField: field, orderDirection: \'asc\'}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{orderField} === {field}">
<f:if condition="{orderDirection} === 'asc'">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}
</span>
</span>
</a>
</li>
<li>
<a
class="dropdown-item"
href="{f:uri.action(action:'index', arguments:'{searchTerm: searchTerm, orderField: field, orderDirection: \'desc\'}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{orderField} === {field}">
<f:if condition="{orderDirection} === 'desc'">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}
</span>
</span>
</a>
</li>
</ul>
</div>
</f:section>
</html>
+108
View File
@@ -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}}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#3B7EB0" d="M0 0h64v64H0z"/><path fill="#FFF" d="M14 14h32v36H14z"/><path fill="#3B7EB0" d="M22 42h8v4h-8z"/><path fill="#3B7EB0" d="M32 42h8v4h-8z" opacity=".5"/><path fill="#3B7EB0" d="M22 18h14v2H22zM22 32h2v2h-2zM22 36h2v2h-2z"/><path fill="#3B7EB0" d="M26 32h16v2H26zM26 36h16v2H26zM22 22h20v8H22z" opacity=".5"/><path fill="#3B7EB0" d="M14 14h4v4h-4z"/><path fill="#3B7EB0" d="M16 14h2v36h-2z" opacity=".5"/></svg>

After

Width:  |  Height:  |  Size: 492 B

@@ -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`<typo3-backend-tree-toolbar .tree=${this.tree} .showRefresh=${!1} id=typo3-formeditortree-toolbar></typo3-backend-tree-toolbar><typo3-backend-navigation-component-formeditor-tree id=typo3-formeditortree-tree></typo3-backend-navigation-component-formeditor-tree>`}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};
@@ -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};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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`<div class=mb-2><select class=form-select @change=${this.handleModeChange} .value=${this.mode}><option value=no ?selected=${this.mode==="no"}>${o.get("mode.no")}</option><option value=today ?selected=${this.mode==="today"}>${o.get("mode.today")}</option><option value=absolute ?selected=${this.mode==="absolute"}>${o.get("mode.absolute")}</option><option value=relative ?selected=${this.mode==="relative"}>${o.get("mode.relative")}</option><option value=custom ?selected=${this.mode==="custom"}>${o.get("mode.custom")}</option></select></div>${this.mode==="absolute"?this.renderAbsolute():p} ${this.mode==="relative"?this.renderRelative():p} ${this.mode==="custom"?this.renderCustom():p}`}renderAbsolute(){return d`<div class=mb-2><input type=date class=form-control .value=${this.absoluteDate} @change=${this.handleAbsoluteChange}></div>`}renderRelative(){return d`<div class=input-group><select class=form-select .value=${this.direction} @change=${this.handleDirectionChange}><option value=- ?selected=${this.direction==="-"}>${o.get("direction.past")}</option><option value=+ ?selected=${this.direction==="+"}>${o.get("direction.future")}</option></select> <input type=number min=1 class=form-control style=max-width:80px .value=${this.amount.toString()} @input=${this.handleAmountChange}> <select class=form-select .value=${this.unit} @change=${this.handleUnitChange}><option value=days ?selected=${this.unit==="days"}>${o.get("unit.days",{count:this.amount})}</option><option value=weeks ?selected=${this.unit==="weeks"}>${o.get("unit.weeks",{count:this.amount})}</option><option value=months ?selected=${this.unit==="months"}>${o.get("unit.months",{count:this.amount})}</option><option value=years ?selected=${this.unit==="years"}>${o.get("unit.years",{count:this.amount})}</option></select></div>`}renderCustom(){return d`<div class=mb-2><input type=text class=form-control placeholder=${o.get("custom.placeholder")} .value=${this.customValue} @input=${this.handleCustomChange}></div>`}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};
@@ -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`<span class=input-group-btn role=group data-identifier=inspectorEditorFormElementSelectorControlsWrapper> <span class=btn-group data-identifier=inspectorEditorFormElementSelectorSplitButtonContainer><button type=button class="btn btn-default dropdown-toggle${this.size==="small"?" btn-sm":""}" data-bs-toggle=dropdown aria-expanded=false title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formEditor.inspector.editor.formelement_selector.title')}"><typo3-backend-icon identifier=actions-variable-select></typo3-backend-icon><span class=visually-hidden>Toggle Dropdown</span></button> <ul class="dropdown-menu dropdown-menu-right" data-identifier=inspectorEditorFormElementSelectorSplitButtonListContainer>${this.elements.map(e=>this.renderEntry(e))}</ul> </span> </span>`:p`${b}`}renderEntry(e){return p`<li><a @click=${()=>this.onSelect(e.value)} href=# class=dropdown-item data-formelement-identifier=${e.value}> <span class=dropdown-item-columns><span class="dropdown-item-column dropdown-item-column-icon"> <typo3-backend-icon identifier=${e.icon} size=small></typo3-backend-icon> </span> <span class="dropdown-item-column dropdown-item-column-text">${e.label}</span> </span> </a></li>`}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};
@@ -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`<div class=formeditor-element-toolbar><div class=formeditor-element-toolbar-left><typo3-backend-icon identifier=${this.iconIdentifier} size=small overlay=${this.isHidden?"overlay-hidden":this.isInvalid?"overlay-missing":""}></typo3-backend-icon></div><div class=formeditor-element-toolbar-title>${this.elementType}</div><div class=formeditor-element-toolbar-right><div class=btn-toolbar><div class="btn-group btn-group-sm" role=group><a class="btn btn-default btn-borderless" href=# title=${c.get("formEditor.stage.toolbar.new_element.before")} @click=${this.handleNewElementBefore}> <typo3-backend-icon identifier=actions-form-insert-before size=small></typo3-backend-icon> </a> <a class="btn btn-default btn-borderless" href=# title=${c.get("formEditor.stage.toolbar.new_element.after")} @click=${this.handleNewElementAfter}><typo3-backend-icon identifier=actions-form-insert-after size=small></typo3-backend-icon> </a> <a class="btn btn-default btn-borderless" href=# title=${c.get("formEditor.stage.toolbar.remove")} @click=${this.handleRemoveElement}><typo3-backend-icon identifier=actions-edit-delete size=small></typo3-backend-icon> </a></div></div></div></div>`: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};
@@ -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`<typo3-form-form-element-stage-item-toolbar active icon-identifier=${this.elementIconIdentifier} element-type=${this.elementType} element-identifier=${this.elementIdentifier} ?is-hidden=${this.isHidden} ?is-invalid=${this.invalid}></typo3-form-form-element-stage-item-toolbar><div class=formeditor-element-body><div class=formeditor-element-info><div class=formeditor-element-info-label><span>${v(this.elementLabel)}</span> ${this.isRequired?s`<span>*</span>`:f}</div>${this.renderInfoContent()}</div>${this.renderValidators()}</div>`}renderInfoContent(){const e=this.renderContentItems();return e.length?s`<div class=formeditor-element-info-content>${e}</div>`:f}renderContentItems(){const e=[];if(this.content&&e.push(s`<div class=formeditor-element-info-text>${v(this.content)}</div>`),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`<div class=formeditor-element-info-multivalue>${e.map(i=>s`<div class=formeditor-element-info-multivalue-item${i.className?` ${i.className}`:""}>${i.label}</div>`)}</div>`}renderValidators(){return this.validators?.length?s`<div class=formeditor-element-validator><div class=formeditor-element-validator-icon><typo3-backend-icon identifier=form-validator size=small></typo3-backend-icon></div><div class=formeditor-element-validator-list>${this.validators.map(e=>s`<div class=formeditor-element-validator-list-item>${e.label}</div>`)}</div></div>`: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};
@@ -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`<h2 class=formeditor-page-title>${e}</h2>`}};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};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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;m<f;++m)t=t.replace("{"+m+"}",n[m]);return t}function o(e,n){return a(!l().isUndefinedOrNull(r.domElementSelectorPattern[e]),'Invalid parameter "selectorIdentifier" ('+e+")",1478372374),c(e,n)}function y(e,n){let t;return a(!l().isUndefinedOrNull(r.domElementClassNames[e]),'Invalid parameter "classNameIdentifier" ('+e+")",1478803906),t=r.domElementClassNames[e],n&&(t=o("class",[t])),t}function D(e,n){let t;return a(!l().isUndefinedOrNull(r.domElementIdNames[e]),'Invalid parameter "domElementIdNames" ('+e+")",1479251518),t=r.domElementIdNames[e],n&&(t=o("id",[t])),t}function u(e){return a(!l().isUndefinedOrNull(r.domElementDataAttributeValues[e]),'Invalid parameter "dataAttributeValueIdentifier" ('+e+")",1478806884),r.domElementDataAttributeValues[e]}function i(e,n,t){return a(!l().isUndefinedOrNull(r.domElementDataAttributeNames[e]),'Invalid parameter "dataAttributeIdentifier" ('+e+")",1478808035),l().isUndefinedOrNull(n)?r.domElementDataAttributeNames[e]:(t=t||[],o(n,[r.domElementDataAttributeNames[e]].concat(t)))}function N(e){return i("identifier","bracesWithKeyValue",[u(e)])}function v(e){return l().isUndefinedOrNull(r.domElementDataAttributeValues[e])||(e=u(e)),document.querySelector(i("template","bracesWithKeyValue",[e]))}function g(e,n){return n.querySelector(i("templateProperty","bracesWithKeyValue",[e]))}function h(e){d=e}export{h as bootstrap,c as buildDomElementSelectorHelper,y as getDomElementClassName,i as getDomElementDataAttribute,u as getDomElementDataAttributeValue,N as getDomElementDataIdentifierSelector,D as getDomElementIdName,o as getDomElementSelector,v as getTemplateElement,g as getTemplatePropertyElement,b as setConfiguration};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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};
File diff suppressed because one or more lines are too long
@@ -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};
@@ -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};
@@ -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`<typo3-backend-form-wizard .formManager=${e}></typo3-backend-form-wizard>`;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`<typo3-backend-form-wizard .formManager=${e} .duplicateForm=${n}></typo3-backend-form-wizard>`;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='<h2 class="h3">'+t.get("formManager.references.headline")+'</h2><div class="table-fit"><table id="forms" class="table table-striped table-hover"><thead><tr><th class="col-icon"></th><th class="col-recordtitle">'+t.get("formManager.table.field.title")+"</th><th>"+t.get("formManager.table.field.uid")+'</th><th class="col-control nowrap"><span class="visually-hidden">'+t.get("formManager.table.field.control")+"</span></th></tr></thead><tbody>";for(let a=0,m=o.references.length;a<m;++a)s+='<tr><td class="col-icon">'+o.references[a].recordIcon+'</td><td class="col-recordtitle"><a href="'+u.encodeHtml(o.references[a].recordEditUrl)+'" data-identifier="referenceLink">'+u.encodeHtml(o.references[a].recordTitle)+"</a></td><td>"+u.encodeHtml(o.references[a].recordUid)+'</td><td class="col-control"><div class="btn-group" role="group"><a href="'+u.encodeHtml(o.references[a].recordEditUrl)+'" data-identifier="referenceLink" class="btn btn-default" title="'+t.get("formManager.btn.edit.title")+'">'+F+"</a></div></td></tr>";s+="</tbody></table></div>"}else s="<div><h1>"+t.get("formManager.references.title",{0:u.encodeHtml(o.formPersistenceIdentifier)})+"</h1></div><div>"+t.get("formManager.no_references")+"</div>";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};
@@ -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};
@@ -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};

Some files were not shown because too many files have changed in this diff Show More