TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:00 +02:00
commit f9941541b7
1178 changed files with 135377 additions and 0 deletions
@@ -0,0 +1,39 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="module contextual-record-edit" data-module-id="{moduleId}" data-module-name="{moduleName}">
<div class="contextual-record-edit-header">
<div class="contextual-record-edit-title-group">
<span class="contextual-record-edit-title">{recordTitle}</span>
<f:if condition="{fullEditUrl}">
<a href="{fullEditUrl}" class="btn btn-default btn-borderless t3js-contextual-fullscreen" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:openFullEditView')}">
<core:icon identifier="actions-expand" size="small" />
</a>
</f:if>
</div>
<div class="contextual-record-edit-actions">
<button type="submit" name="_savedok" value="1" form="ContextualRecordEditController" class="btn btn-primary">
<core:icon identifier="actions-document-save" size="small" />
<span class="contextual-record-edit-button-label"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:save" /></span>
</button>
<button type="button" class="btn btn-default t3js-contextual-close">
<core:icon identifier="actions-close" size="small" />
<span class="contextual-record-edit-button-label"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:close" /></span>
</button>
</div>
</div>
<div class="module-body contextual-record-edit-body t3js-module-body">
<f:if condition="{uiBlock}">
<div id="t3js-ui-block" class="ui-block">
<core:icon identifier="spinner-circle" size="large" />
</div>
</f:if>
<f:flashMessages queueIdentifier="{flashMessageQueueIdentifier}" />
<f:format.raw>{bodyHtml}</f:format.raw>
</div>
</div>
</html>
@@ -0,0 +1,27 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/localization.js"/>
<f:if condition="{moduleContext} != '' && {moduleContextId} != ''">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:variable name="immediateActionArgs" value="{0: moduleContext, 1: moduleContextId}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{immediateActionArgs -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:if>
<f:format.raw>{bodyHtml}</f:format.raw>
</f:section>
</html>
@@ -0,0 +1,58 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:format.raw>{fieldInformation}</f:format.raw>
<typo3-formengine-container-inline {webComponentAttributes -> f:format.raw()}>
<div class="form-group t3js-formengine-validation-marker t3js-inline-controls">
<f:for each="{fileSelectors}" as="fileSelector">
{fileSelector -> f:format.raw()}
</f:for>
<f:if condition="{allowedFileExtensions}">
<f:then>
<div class="form-text mt-2">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.allowedFileExtensions"/>
<ul class="badge-list">
<f:for each="{allowedFileExtensions}" as="allowedFileExtension">
<li><span class="badge badge-secondary">{allowedFileExtension}</span></li>
</f:for>
</ul>
</div>
</f:then>
<f:else if="{disallowedFileExtensions}">
<div class="form-text mt-2">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.disallowedFileExtensions"/>
<ul class="badge-list">
<f:for each="{disallowedFileExtensions}" as="disallowedFileExtension">
<li><span class="badge badge-danger">{disallowedFileExtension}</span></li>
</f:for>
</ul>
</div>
</f:else>
</f:if>
</div>
<f:if condition="{showAllLocalizationLink}">
<button type="button" class="btn btn-default t3js-synchronizelocalize-button" data-type="localize" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:localizeAllRecords')}">
<core:icon identifier="actions-document-localize" size="small" />
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:localizeAllRecords" />
</button>
</f:if>
<f:if condition="{showSynchronizationLink}">
<button type="button" class="btn btn-default t3js-synchronizelocalize-button" data-type="synchronize" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:synchronizeWithOriginalLanguage')}">
<core:icon identifier="actions-document-synchronize" size="small" />
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:synchronizeWithOriginalLanguage" />
</button>
</f:if>
<div class="panel-group panel-hover {f:if(condition: '{showAllLocalizationLink} || {showSynchronizationLink}', then: 'mt-3')}" id="{fileReferences.id}" data-title="{fileReferences.title}">
<f:format.raw>{fileReferences.records}</f:format.raw>
</div>
<f:format.raw>{fieldWizard}</f:format.raw>
<f:if condition="{customControls}">
<div id="{customControls.id}">
<f:format.raw>{customControls.controls}</f:format.raw>
</div>
</f:if>
<input type="hidden" class="inlineRecord" name="{formFieldName}" value="{sortableRecordUids}" data-formengine-validation-rules="{validationRules}" />
</typo3-formengine-container-inline>
</html>
@@ -0,0 +1,23 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{recordDescription}">
<f:be.infobox title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.recordInformation')}">
{recordDescription -> f:format.nl2br()}
</f:be.infobox>
</f:if>
<f:if condition="{recordReadonly}">
<f:be.infobox title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.recordInformation')}">
{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.recordReadonly')}
</f:be.infobox>
</f:if>
<div class="typo3-TCEforms{f:if(condition:isNewRecord, then:' is-new')}">
<f:format.raw>{fieldInformationHtml}</f:format.raw>
<f:format.raw>{fieldWizardHtml}</f:format.raw>
<f:format.raw>{childHtml}</f:format.raw>
</div>
</html>
@@ -0,0 +1,115 @@
<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"
>
<div class="formengine-field-item t3js-formengine-field-item">
{fieldInformation -> f:format.raw()}
<div class="form-wizards-wrap">
<div class="form-wizards-item-element">
<f:if condition="{isAllowedFileExtension} && {image.properties.width}">
<f:then>
<f:if condition="{config.readOnly}">
<f:else>
<div class="form-control-wrap">
<input
type="hidden"
id="{formEngine.field.id}"
name="{formEngine.field.name}"
value="{formEngine.field.value}"
data-formengine-validation-rules="{formEngine.validation}"
/>
<button
class="btn btn-default t3js-image-manipulation-trigger"
data-url="{wizardUri}"
data-payload="{wizardPayload}"
data-preview-url="{previewUrl}"
data-severity="notice"
data-modal-title="{f:render(partial: 'Form/ImageManipulationModalTitle', arguments: _all)}"
data-image-uid="{image.uid}"
data-crop-variants="{config.cropVariants -> f:format.json()}"
data-button-preview-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.preview')}"
data-button-dismiss-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.cancel')}"
data-button-save-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.accept')}"
data-file-field="{config.file_field}"
data-field="{formEngine.field.id}"
data-sync-available="{f:if(condition: '{config.syncAvailable}', then: 'true', else: 'false')}"
>
<core:icon identifier="actions-crop" size="small" />
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.open-editor"/>
</button>
</div>
</f:else>
</f:if>
<div class="row media-gallery__list mt-2">
<f:for each="{config.cropVariants}" as="cropVariant">
<div class="col-6 col-sm-4 col-md-3 media-gallery__item">
<p>
<b><f:translate id="{cropVariant.title}" default="{cropVariant.title}" /></b><br/>
<f:if condition="{cropVariant.allowedAspectRatios.{cropVariant.selectedRatio}.title}">
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.aspect-ratio"/>: <span class="t3js-image-manipulation-selected-ratio" data-crop-variant-id="{cropVariant.id}"><f:translate id="{cropVariant.allowedAspectRatios.{cropVariant.selectedRatio}.title}" default="{cropVariant.allowedAspectRatios.{cropVariant.selectedRatio}.title}" /></span>
</f:if>
</p>
<div
class="t3js-image-manipulation-preview media-object"
data-preview-height="150"
data-crop-variant-id="{cropVariant.id}"
>
<f:image
image="{image}"
crop="{formEngine.field.value}"
cropVariant="{cropVariant.id}"
maxHeight="150"
class="thumbnail thumbnail-status"
loading="lazy"
additionalAttributes="{data-crop-variant: '{cropVariant -> f:format.json()}', data-crop-variant-id: cropVariant.id}"
/>
</div>
</div>
</f:for>
</div>
</f:then>
<f:else>
<div class="media-body">
<f:if condition="{image.properties.width}">
<f:then>
<p>
<em>
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.supported-types-message" /><br/>
{config.allowedExtensions -> f:format.case(mode: 'upper')}
</em>
</p>
</f:then>
<f:else>
<div class="alert alert-info">
<h4>
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.no-image-dimensions"/>
</h4>
<p>
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.no-image-dimensions-message"/>
</p>
</div>
</f:else>
</f:if>
</div>
</f:else>
</f:if>
</div>
<div class="form-wizards-item-aside form-wizards-item-aside--field-control">
<div class="btn-group">
{fieldControl -> f:format.raw()}
</div>
</div>
<div class="form-wizards-item-bottom">
{fieldWizard -> f:format.raw()}
</div>
</div>
</div>
</html>
@@ -0,0 +1,104 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
>
<div class="modal-panel-main">
<div id="t3js-crop-image-container" class="cropper-image-container">
<f:image image="{image}" maxWidth="1000" maxHeight="1000" id="t3js-crop-image" additionalAttributes="{data-original-width: image.properties.width, data-original-height: image.properties.height}" />
</div>
</div>
<div class="modal-panel-sidebar">
<div class="panel-group mb-3 d-none" id="sync-crop-variants-container">
<div class="panel">
<div class="panel-body">
<div class="form-check">
<input type="checkbox" class="form-check-input" value="1" id="sync-crop-variants"/>
<label class="form-check-label" for="sync-crop-variants">
<f:translate domain="core.wizards" key="imwizard.sync-crop-variants"/>
</label>
</div>
</div>
</div>
</div>
<div class="panel-group" id="accordion-cropper-variants" role="tablist" aria-multiselectable="false">
<f:for each="{cropVariants}" as="cropVariant" iteration="cropVariantIterator">
<div class="panel panel-default" data-crop-variant-container="{cropVariant.id}">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button t3js-crop-variant-trigger {f:if(condition:cropVariantIterator.isFirst, then:'is-active', else:'collapsed')}"
type="button"
data-bs-toggle="collapse"
data-bs-target="#cropper-collapse-{cropVariantIterator.cycle}"
aria-expanded="{f:if(condition:cropVariantIterator.isFirst, then:'true', else:'false')}"
aria-controls="cropper-collapse-{cropVariantIterator.cycle}"
data-crop-variant-id="{cropVariant.id}"
data-crop-variant
data-exclude-from-sync="{f:if(condition:cropVariant.excludeFromSync, then:'true', else:'false')}"
id="cropper-accordion-heading-{cropVariantIterator.cycle}"
>
<span class="caret"></span>
<div class="panel-title">{cropVariant.title -> f:translate(id: cropVariant.title)}</div>
<div class="cropper-preview-thumbnail {f:if(condition:'{image.properties.width}>{image.properties.height}', then:'wide', else: 'tall')}">
<img class="cropper-preview-thumbnail-image" src="{f:uri.image(image:image, maxWidth:'300', maxHeight: '300')}">
<div class="cropper-preview-thumbnail-crop-area t3js-cropper-preview-thumbnail-crop-area">
<img src="{f:uri.image(image:image, maxWidth:'300', maxHeight: '300')}" class="cropper-preview-thumbnail-crop-image t3js-cropper-preview-thumbnail-crop-image">
<div class="cropper-preview-thumbnail-focus-area t3js-cropper-preview-thumbnail-focus-area"></div>
</div>
</div>
</button>
</div>
</div>
<div
id="cropper-collapse-{cropVariantIterator.cycle}"
class="panel-collapse collapse {f:if(condition:cropVariantIterator.isFirst, then:'show')}"
role="tabpanel"
aria-labelledby="cropper-accordion-heading-{cropVariantIterator.cycle}"
data-bs-parent="#accordion-cropper-variants"
>
<div class="panel-body">
<form class="form">
<f:if condition="{cropVariant.allowedAspectRatios}">
<label class="form-label" for="ratio-{cropVariantIterator.cycle}">
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.aspect-ratio"/>
</label>
<div id="ratio-{cropVariantIterator.cycle}" class="ratio-buttons t3js-ratio-buttons">
<f:for each="{cropVariant.allowedAspectRatios}" as="ratio" iteration="ratioIterator">
<label
class="btn btn-default"
data-method="setAspectRatio"
data-bs-option="{ratio.id}"
title="{f:translate(id:'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.set-aspect-ratio')}"
>
<input
class="visually-hidden"
id="aspectRatio-{cropVariantIterator.cycle}-{ratioIterator.cycle}"
name="aspectRatio-{cropVariantIterator.cycle}-{ratioIterator.cycle}"
value="{cropVariant.id}"
type="radio"
/>
<span class="t3-js-ratio-title" data-ratio-id="{cropVariant.id}{ratio.id}">{ratio.title -> f:translate(id: ratio.title)}</span> <core:icon identifier="actions-check" size="small" />
</label>
</f:for>
</div>
</f:if>
<label><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.selection" /></label>
<div class="mb-3 t3js-cropper-info-crop"></div>
<button
class="btn btn-default"
name="reset"
data-crop-variant="{cropVariant -> f:format.json()}"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.reset')}"
>
<core:icon identifier="actions-refresh" size="small" />
{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.reset')}
</button>
</form>
</div>
</div>
</div>
</f:for>
</div>
</div>
</html>
@@ -0,0 +1,31 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:format.raw>{fieldInformation}</f:format.raw>
<typo3-formengine-container-inline {webComponentAttributes -> f:format.raw()}>
<div class="form-group t3js-formengine-validation-marker t3js-inline-controls">
<button type="button" class="btn btn-default t3js-create-new-button" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.languages.createNew')}">
<core:icon identifier="actions-plus" size="small" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.languages.createNew" />
</button>
<select id="{presetOptions.identifier}" name="preset" class="form-select t3js-create-new-preset d-inline-block w-auto">
<option value=""><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.languages.choosePreset"/></option>
<f:for each="{presetOptions.options}" as="option">
<option value="{option.value}">{option.label}</option>
</f:for>
</select>
<select id="{selectorConfiguration.identifier}" class="form-select t3js-create-new-selector d-inline-block w-auto">
<option value=""><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.languages.chooseExistingFromOtherSite"/></option>
<f:for each="{selectorConfiguration.options}" as="option">
<option value="{option.value}">{option.label}</option>
</f:for>
</select>
</div>
<div class="panel-group panel-hover" id="{inlineRecords.identifier}" data-title="{inlineRecords.title}">
<f:format.raw>{inlineRecords.records}</f:format.raw>
</div>
<input type="hidden" class="inlineRecord" name="{nameForm}" value="{childRecordUids}" data-formengine-validation-rules="{validationRules}" />
</typo3-formengine-container-inline>
</html>
@@ -0,0 +1,6 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:render partial="ModuleTemplate/Tabs" arguments="{_all}" />
</html>