TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:41 +02:00
commit 621587f02d
50 changed files with 4650 additions and 0 deletions
@@ -0,0 +1,87 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{conditions}">
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="typoscript-active-{type}-conditions-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#typoscript-active-{type}-conditions-body"
aria-controls="typoscript-active-{type}-conditions-body"
aria-expanded="false"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:panel.header.conditions"/></strong>
</div>
<f:if condition="{conditionActiveCount}">
<div class="panel-badge">
<span class="badge badge-info">
<f:translate
key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:panel.info.conditionActiveCount.{f:if(condition: '{conditionActiveCount} > 1', then:'multiple', else: 'single')}"
arguments="{0: conditionActiveCount}"
/>
</span>
</div>
</f:if>
<span class="caret"></span>
</button>
</div>
</h3>
<div
class="panel-collapse collapse"
id="typoscript-active-{type}-conditions-body"
aria-labelledby="typoscript-active-{type}-conditions-heading"
role="tabpanel"
data-persist-collapse-state="true"
>
<div class="panel-body">
<form action="{f:be.uri(route: 'typoscript_active', parameters: '{id: pageUid}')}" method="post">
<f:for each="{conditions}" as="condition">
<input type="hidden" name="{type}Conditions[{condition.hash}]" value="0" />
<div class="form-check form-switch">
<input
type="checkbox"
class="form-check-input"
name="{type}Conditions[{condition.hash}]"
id="{type}Condition{condition.hash}"
value="1"
{f:if(condition: condition.active, then:'checked="checked"')}
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='{type}Conditions[{condition.hash}]']"
/>
<label class="form-check-label" for="{type}Condition{condition.hash}">
<f:if condition="{displayConstantSubstitutions} && {condition.originalValue}">
<f:then>
<span class="font-monospace">[{condition.value}]</span>
<span class="diff-inline">
<f:format.raw>
<f:translate
key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:panel.info.conditionWithConstant"
arguments="{
0: '{backend:typoScript.fineDiff(from: condition.originalValue, to: condition.value)}'
}"
/>
</f:format.raw>
</span>
</f:then>
<f:else>
<span class="font-monospace">[{condition.value}]</span>
</f:else>
</f:if>
</label>
</div>
</f:for>
</form>
</div>
</div>
</div>
</f:if>
</html>
@@ -0,0 +1,122 @@
<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="form-row-md">
<f:if condition="{f:count(subject: allTemplatesOnPage)} > 1">
<div class="form-group">
<form action="{f:be.uri(route: 'typoscript_active', parameters: '{id: pageUid}')}" method="post">
<label class="form-label" for="selectedTemplate">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:options.selectedRecord" />
</label>
<select
name="selectedTemplate"
id="selectedTemplate"
class="form-select"
data-global-event="change"
data-action-navigate="$data=~s/$value/"
data-action-submit="$form"
>
<f:for each="{allTemplatesOnPage}" as="template">
<option
value="{template.uid}"
{f:if(condition:'{selectedTemplateUid} == {template.uid}', then:'selected="selected"')}
>
{template.title}
</option>
</f:for>
</select>
</form>
</div>
</f:if>
<div class="form-group">
<form action="#">
<label for="searchValue" class="form-label">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.label.searchString" />
</label>
<div class="input-group">
<input
type="search"
autocomplete="off"
class="form-control t3js-collapse-search-term"
name="searchValue"
id="searchValue"
data-persist-collapse-search-key="collapse-search-term-typoscript-active"
value=""
minlength="3"
/>
</div>
</form>
</div>
<div class="form-group">
<div class="form-row-md">
<div class="form-group">
<form action="{f:be.uri(route: 'typoscript_active', parameters: '{id: pageUid}')}" method="post">
<div class="form-check form-switch form-check-size-input">
<input type="hidden" name="displayConstantSubstitutions" value="0" />
<input
type="checkbox"
class="form-check-input"
name="displayConstantSubstitutions"
id="displayConstantSubstitutions"
value="1"
{f:if(condition: displayConstantSubstitutions, then:'checked="checked"')}
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='displayConstantSubstitutions']"
/>
<label class="form-check-label" for="displayConstantSubstitutions">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:options.displayConstantSubstitutions" />
</label>
</div>
</form>
</div>
<div class="form-group">
<form action="{f:be.uri(route: 'typoscript_active', parameters: '{id: pageUid}')}" method="post">
<div class="form-check form-switch form-check-size-input">
<input type="hidden" name="displayComments" value="0" />
<input
type="checkbox"
class="form-check-input"
name="displayComments"
id="displayComments"
value="1"
{f:if(condition: displayComments, then:'checked="checked"')}
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='displayComments']"
/>
<label class="form-check-label" for="displayComments">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:options.displayComments" />
</label>
</div>
</form>
</div>
<div class="form-group">
<form action="{f:be.uri(route: 'typoscript_active', parameters: '{id: pageUid}')}" method="post">
<div class="form-check form-switch form-check-size-input">
<input type="hidden" name="sortAlphabetically" value="0" />
<input
type="checkbox"
class="form-check-input"
name="sortAlphabetically"
id="sortAlphabetically"
value="1"
{f:if(condition: sortAlphabetically, then:'checked="checked"')}
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='sortAlphabetically']"
/>
<label class="form-check-label" for="sortAlphabetically">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:options.sortAlphabetically" />
</label>
</div>
</form>
</div>
</div>
</div>
</div>
</html>
@@ -0,0 +1,83 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:for each="{tree.nextChild}" as="child">
<f:if condition="{displayComments} && {child.comments}">
<li class="loose">
<div class="treelist-comment">
<f:for each="{child.comments}" as="comment" iteration="iterator">
<div><f:format.nl2br>{comment}</f:format.nl2br></div>
</f:for>
</div>
</li>
</f:if>
<f:if condition="{displayConstantSubstitutions} && {child.originalValueTokenStream}">
<li class="loose">
<span class="diff-inline">
<f:format.raw>
<f:variable name="trimmedValueTokenStream"><f:format.trim>{child.originalValueTokenStream}</f:format.trim></f:variable>
<f:translate
key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:tree.valueWithConstant"
arguments="{
0: '{backend:typoScript.fineDiff(from: trimmedValueTokenStream, to: child.value)}'
}"
/>
</f:format.raw>
</span>
</li>
</f:if>
<li>
<f:if condition="{child.children}">
<typo3-backend-tree-node-toggle
class="treelist-control collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapse-list-{child.identifier}"
aria-expanded="false">
</typo3-backend-tree-node-toggle>
</f:if>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
<a href="{editUri}&nodeIdentifier={child.identifier}">{child.name}</a>
</span>
<f:if condition="!{child.valueNull}">
<span class="treelist-operator">=</span>
<span class="treelist-value">{child.value}</span>
</f:if>
<f:if condition="{child.referenceSourceStream}">
<span class="treelist-operator">=<</span>
<span class="treelist-value">{child.referenceSourceStream}</span>
</f:if>
</span>
<f:if condition="{child.children}">
<div
class="treelist-collapse collapse"
data-persist-collapse-state="true"
data-persist-collapse-state-suffix="typoscript-active-{type}"
data-persist-collapse-state-not-if-search="true"
data-persist-collapse-state-if-state="shown"
id="collapse-list-{child.identifier}"
>
<ul class="treelist">
<f:render
partial="ActiveTree"
arguments="{
type: type,
tree: child,
pageUid: pageUid,
displayConstantSubstitutions: displayConstantSubstitutions,
displayComments: displayComments,
editUri: editUri
}"
/>
</ul>
</div>
</f:if>
</li>
</f:for>
</html>
@@ -0,0 +1,68 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="typoscript-active-{type}-ast-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#typoscript-active-{type}-ast-body"
aria-controls="typoscript-active-{type}-ast-body"
aria-expanded="false"
id="panel-tree-heading-{type}"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_active.xlf:panel.header.configuration"/></strong>
</div>
<div class="panel-badge">
<span class="badge badge-success hidden t3js-collapse-states-search-numberOfSearchMatches"></span>
</div>
<span class="caret"></span>
</button>
</div>
</h3>
<div
class="panel-collapse collapse"
id="typoscript-active-{type}-ast-body"
aria-labelledby="typoscript-active-{type}-ast-heading"
role="tabpanel"
data-persist-collapse-state="true"
data-persist-collapse-state-if-state="shown"
>
<div class="panel-body t3js-collapse-states-search-tree">
<form action="{f:be.uri(route: 'typoscript_active', parameters: '{id: pageUid}')}" method="post">
<ul class="treelist">
<f:comment>
Variable {editUri} is a performance optimization hack: The ActiveTree template is called
recursive for each node and then creates an "edit" link in each. This is expensive with
many nodes. With client side expand/collapse, we always render the entire tree in fluid,
with a bigger tree we're easily creating the link thousands of times. The hack below
creates the link once, the usage then adds the child parameter.
Ugly but effective in this case. Don't do this at home, kids.
</f:comment>
<f:variable
name="editUri"
value="{f:be.uri(route: 'typoscript_active.edit', parameters: '{id: pageUid, type: type}')}"
/>
<f:render
partial="ActiveTree"
arguments="{
type: type,
tree: tree,
pageUid: pageUid,
displayConstantSubstitutions: displayConstantSubstitutions,
displayComments: displayComments,
editUri: editUri
}"
/>
</ul>
</form>
</div>
</div>
</div>
</html>
@@ -0,0 +1,36 @@
<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:if condition="{f:count(subject: allTemplatesOnPage)} > 1">
<div class="form-row">
<div class="form-group">
<form action="{f:be.uri(route: 'web_typoscript_analyzer', parameters: '{id: pageUid}')}" method="post">
<label class="form-label" for="selectedTemplate">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:options.selectedRecord" />
</label>
<select
name="selectedTemplate"
id="selectedTemplate"
class="form-select"
data-global-event="change"
data-action-navigate="$data=~s/$value/"
data-action-submit="$form"
>
<f:for each="{allTemplatesOnPage}" as="template">
<option
value="{template.uid}"
{f:if(condition:'{selectedTemplateUid} == {template.uid}', then:'selected="selected"')}
>
{template.title}
</option>
</f:for>
</select>
</form>
</div>
</div>
</f:if>
</html>
@@ -0,0 +1,70 @@
<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:if condition="{errors}">
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="template-analyzer-{type}-errors-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#template-analyzer-{type}-errors-body"
aria-controls="template-analyzer-{type}-errors-body"
aria-expanded="false"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:panel.header.syntaxErrors"/></strong>
</div>
<div class="panel-badge">
<span class="badge badge-warning">
<f:translate
key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:panel.info.syntaxErrorCount.{f:if(condition: '{errorCount} > 1', then:'multiple', else: 'single')}"
arguments="{0: errorCount}"
/>
</span>
</div>
<span class="caret"></span>
</button>
</div>
</h3>
<div
class="panel-collapse collapse"
id="template-analyzer-{type}-errors-body"
aria-labelledby="template-analyzer-{type}-errors-heading"
role="tabpanel"
data-persist-collapse-state="true"
>
<div class="panel-body">
<f:for each="{errors}" as="error">
<div class="row justify-content-between">
<div class="col">
<f:translate
key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:syntaxError.type.{error.type}"
arguments="{0: error.include.name, 1: '{error.lineNumber + 1}'}"
/>
</div>
<div class="col col-auto text-end">
<div class="btn-group">
<f:be.link
route="web_typoscript_analyzer.source"
parameters="{id: pageUid, includeType: type, identifier: error.include.identifier}"
additionalAttributes="{'data-modal-title': error.include.name}"
class="btn btn-default btn-sm t3js-typoscript-analyzer-modal"
title="{f:translate(key: 'LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:syntaxError.sourceCode')}"
>
<core:icon identifier="actions-variable" />
</f:be.link>
</div>
</div>
</div>
</f:for>
</div>
</div>
</div>
</f:if>
</html>
@@ -0,0 +1,126 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:ts="http://typo3.org/ns/TYPO3/CMS/Tstemplate/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:asset.module identifier="@typo3/backend/tree/tree-node-toggle.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:comment><!-- This is a template that calls itself recursive for sub nodes. --></f:comment>
<f:if condition="{tree.children}">
<f:for each="{tree.nextChild}" as="child">
<li>
<f:if condition="{child.children}">
<typo3-backend-tree-node-toggle
class="treelist-control treelist-control-collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapse-list-{child.identifier}"
aria-expanded="false">
</typo3-backend-tree-node-toggle>
</f:if>
<div class="row justify-content-between">
<div class="col">
<div class="row row-cols-auto justify-content-md-between">
<div class="col col-12 col-lg-auto">
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
<f:if condition="{child.type} == 'Segment'">
<f:then>
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.type.Segment" />
</f:then>
<f:else if="{child.type} == 'DefaultTypoScriptMagicKey'">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.type.DefaultTypoScriptMagicKey_formlabel" />
</f:else>
<f:else if="{child.type} == 'Condition'">
{child.lineStream}
</f:else>
<f:else if="{child.type} == 'ConditionElse'">
{child.lineStream}
</f:else>
<f:else if="{child.type} == 'ConditionStop'">
{child.lineStream}
</f:else>
<f:else>{child.name}</f:else>
</f:if>
</span>
</span>
</div>
<div class="col col-12 col-lg-auto text-md-end">
<f:comment><!-- Hand {child.type} over to f:translate and add locallang.xlf entries when Include classes stabilized. --></f:comment>
<f:if condition="{child.sysTemplateRecord}">
<f:then>
<span class="badge">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.sysTemplateRecord" arguments="{0: '{child.pid}'}" />
</span>
</f:then>
<f:else if="{child.type} != 'Segment'">
<span class="badge">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.type.{child.type}" />
</span>
</f:else>
</f:if>
<f:if condition="{child.root}">
<span class="badge badge-info">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.setting.root" />
</span>
</f:if>
<f:if condition="{child.clear}">
<span class="badge badge-info">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.setting.clear" />
</span>
</f:if>
</div>
</div>
</div>
<div class="col col-auto text-end">
<div class="btn-group tstemplate-tree-btn-group">
<f:be.link
route="web_typoscript_analyzer.source"
parameters="{id: pageUid, includeType: type, identifier: child.identifier}"
additionalAttributes="{'data-modal-title': child.name}"
class="btn btn-default btn-sm t3js-typoscript-analyzer-modal{f:if(condition:'!{child.lineStream}', then:' disabled')}"
title="{f:translate(key: 'LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.btn.sourceCode')}"
>
<core:icon identifier="{f:if(condition:'{child.lineStream}', then:'actions-variable', else: 'empty-empty')}" />
</f:be.link>
<f:be.link
route="web_typoscript_analyzer.sourceWithIncludes"
parameters="{id: pageUid, includeType: type, identifier: child.identifier}"
additionalAttributes="{'data-modal-title': '{child.name} (with resolved includes)'}"
class="btn btn-default btn-sm t3js-typoscript-analyzer-modal{f:if(condition:'!{child.children}', then:' disabled')}"
title="{f:translate(key: 'LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:tree.child.btn.sourceCodeWithResolvedIncludes')}"
>
<core:icon identifier="{f:if(condition:'{child.children}', then:'actions-variable-select', else: 'empty-empty')}" />
</f:be.link>
</div>
</div>
</div>
<f:if condition="{child.children}">
<div
class="treelist-collapse collapse"
id="collapse-list-{child.identifier}"
data-persist-collapse-state="true"
data-persist-collapse-state-suffix="typoscript-include-{type}"
data-persist-collapse-state-if-state="shown"
>
<ul class="treelist">
<f:render
partial="AnalyzerTree"
arguments="{
type: type,
pageUid: pageUid,
tree: child
}"
/>
</ul>
</div>
</f:if>
</li>
</f:for>
</f:if>
</html>
@@ -0,0 +1,46 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="template-analyzer-{type}-tree-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#template-analyzer-{type}-tree-body"
aria-controls="template-analyzer-{type}-tree-body"
aria-expanded="false"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_analyzer.xlf:panel.header.configuration"/></strong>
</div>
<span class="caret"></span>
</button>
</div>
</h3>
<div
class="panel-collapse collapse"
id="template-analyzer-{type}-tree-body"
data-persist-collapse-state="true"
role="tabpanel"
aria-labelledby="template-analyzer-{type}-tree-heading"
>
<div class="panel-body panel-body-overflow">
<ul class="treelist">
<f:render
partial="AnalyzerTree"
arguments="{
type: type,
pageUid: pageUid,
tree: tree
}"
/>
</ul>
</div>
</div>
</div>
</html>
@@ -0,0 +1,193 @@
<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"
>
<form action="{f:be.uri(route: 'web_typoscript_constanteditor', parameters: '{id: pageUid}')}" method="post" id="TypoScriptConstantEditorController">
<f:for each="{displayConstants}" as="mainCategory" key="mainCategoryKey">
<h2>{mainCategory.label}</h2>
<f:for each="{mainCategory.items}" as="constantItems">
<f:for each="{constantItems}" as="constantItem">
<fieldset class="form-section">
<div class="form-group">
<label class="form-label t3js-formengine-label">
<span>{constantItem.label}</span>
<code>[{constantItem.name}]</code>
</label>
<f:if condition="{constantItem.description}"><p>{constantItem.description}</p></f:if>
<f:if condition="{constantItem.typeHint}"><span class="text-variant">{constantItem.typeHint}</span></f:if>
<input
type="hidden"
name="check[{constantItem.name}]"
id="check-{constantItem.idName}"
value="checked"
checked
{f:if(condition: '!{constantItem.isInCurrentTemplate}', then: 'disabled')}
>
<div class="input-group userTS" id="userTS-{constantItem.idName}" style="{f:if(condition: constantItem.isInCurrentTemplate, else: 'display:none;')}">
<button
type="button"
class="btn btn-default t3js-toggle"
data-bs-toggle="undo"
rel="{constantItem.idName}"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.deleteTitle')}">
<core:icon identifier="actions-edit-undo" />
</button>
<f:switch expression="{constantItem.type}">
<f:case value="int+">
<input
class="form-control"
id="{constantItem.idName}"
type="number"
name="data[{constantItem.name}]"
value="{constantItem.value}"
{f:if(condition: '{constantItem.typeIntPlusMin} || {constantItem.typeIntPlusMin == 0}', then: 'min="{constantItem.typeIntPlusMin}"')}
{f:if(condition: constantItem.typeIntPlusMax, then: 'max="{constantItem.typeIntPlusMax}"')}
>
</f:case>
<f:case value="int">
<input
class="form-control"
id="{constantItem.idName}"
type="number"
name="data[{constantItem.name}]"
value="{constantItem.value}"
{f:if(condition: '{constantItem.typeIntMin} || {constantItem.typeIntMin == 0}', then: 'min="{constantItem.typeIntMin}"')}
{f:if(condition: '{constantItem.typeIntMax} || {constantItem.typeIntMax == 0}', then: 'max="{constantItem.typeIntMax}"')}
>
</f:case>
<f:case value="string">
<input
class="form-control"
id="{constantItem.idName}"
type="text"
name="data[{constantItem.name}]"
value="{constantItem.value}"
/>
</f:case>
<f:case value="color">
<typo3-backend-color-picker>
<input
class="form-control"
type="text"
id="{constantItem.idName}"
rel="{constantItem.idName}"
name="data[{constantItem.name}]"
value="{constantItem.value}"
/>
</typo3-backend-color-picker>
</f:case>
<f:case value="wrap">
<input
class="form-control form-control-adapt"
type="text"
id="{constantItem.idName}"
name="data[{constantItem.name}][left]"
value="{constantItem.wrapStart}"
/>
<span class="input-group-text input-group-icon">|</span>
<input
class="form-control form-control-adapt"
type="text"
name="data[{constantItem.name}][right]"
value="{constantItem.wrapEnd}"
/>
</f:case>
<f:case value="offset">
<f:for each="{constantItem.labelValueArray}" as="labelAndValue" iteration="iterator">
<span class="input-group-text input-group-icon">{labelAndValue.label}</span>
<input
type="text"
class="form-control form-control-adapt"
name="data[{constantItem.name}][{iterator.index}]"
value="{labelAndValue.value}"
/>
</f:for>
</f:case>
<f:case value="options">
<select
class="form-select"
id="{constantItem.idName}"
name="data[{constantItem.name}]"
>
<f:for each="{constantItem.labelValueArray}" as="labelAndValue">
<option value="{labelAndValue.value}" {f:if(condition: labelAndValue.selected, then: 'selected')}>
{labelAndValue.label}
</option>
</f:for>
</select>
</f:case>
<f:case value="boolean">
<input
type="hidden"
name="data[{constantItem.name}]"
value="0"
/>
<div class="input-group-text">
<div class="form-check form-check-type-toggle">
<input
type="checkbox"
name="data[{constantItem.name}]"
id="{constantItem.idName}"
class="form-check-input"
value="{constantItem.trueValue}"
{f:if(condition: '{constantItem.value} == {constantItem.trueValue}', then: 'checked')}
/>
</div>
</div>
</f:case>
<f:case value="comment">
<input
type="hidden"
name="data[{constantItem.name}]"
value="0"
/>
<div class="input-group-text">
<div class="form-check form-check-type-toggle">
<input
type="checkbox"
name="data[{constantItem.name}]"
id="{constantItem.idName}"
class="form-check-input mt-0"
value="1"
{f:if(condition: '!{constantItem.value}', then: 'checked')}
/>
</div>
</div>
</f:case>
<f:case value="user">
<input
type="hidden"
name="data[{constantItem.name}]"
value="0"
/>
{constantItem.html -> f:format.raw()}
</f:case>
</f:switch>
</div>
<div class="input-group defaultTS" id="defaultTS-{constantItem.idName}" style="{f:if(condition: constantItem.isInCurrentTemplate, then: 'display:none;')}">
<button type="button" class="btn btn-default t3js-toggle" data-bs-toggle="edit" rel="{constantItem.idName}">
<span title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.editTitle')}">
<core:icon identifier="actions-open" />
</span>
</button>
<f:if condition="{constantItem.type} == 'color'">
<f:then>
<typo3-backend-color-picker color="{constantItem.default_value}">
<input class="form-control" type="number" placeholder="{constantItem.default_value}" disabled readonly>
</typo3-backend-color-picker>
</f:then>
<f:else>
<input class="form-control" type="number" placeholder="{constantItem.default_value}" disabled readonly>
</f:else>
</f:if>
</div>
</div>
</fieldset>
</f:for>
</f:for>
</f:for>
</form>
</html>
@@ -0,0 +1,64 @@
<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:if condition="({f:count(subject: allTemplatesOnPage)} > 1) || ({f:count(subject: relevantCategories)} > 1)">
<div class="form-row">
<f:if condition="{f:count(subject: allTemplatesOnPage)} > 1">
<div class="form-group">
<form action="{f:be.uri(route: 'web_typoscript_constanteditor', parameters: '{id: pageUid}')}" method="post">
<label class="form-label" for="selectedTemplate">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_ceditor.xlf:options.selectedRecord" />
</label>
<select
name="selectedTemplate"
id="selectedTemplate"
class="form-select"
data-global-event="change"
data-action-navigate="$data=~s/$value/"
data-action-submit="$form"
>
<f:for each="{allTemplatesOnPage}" as="template">
<option
value="{template.uid}"
{f:if(condition:'{selectedTemplateUid} == {template.uid}', then:'selected="selected"')}
>
{template.title}
</option>
</f:for>
</select>
</form>
</div>
</f:if>
<f:if condition="{selectedTemplateUid} > 0 && {f:count(subject: relevantCategories)} > 1">
<div class="form-group">
<form action="{f:be.uri(route: 'web_typoscript_constanteditor', parameters: '{id: pageUid}')}" method="post">
<label class="form-label" for="selectedCategory">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang_ceditor.xlf:options.selectedCategory" />
</label>
<select
name="selectedCategory"
id="selectedCategory"
class="form-select"
data-global-event="change"
data-action-navigate="$data=~s/$value/"
data-action-submit="$form"
>
<f:for each="{relevantCategories}" key="relevantCategoryKey" as="relevantCategory">
<option
value="{relevantCategoryKey}"
{f:if(condition:'{selectedCategory} == {relevantCategoryKey}', then:'selected="selected"')}
>
{relevantCategory.label} ({relevantCategory.usageCount})
</option>
</f:for>
</select>
</form>
</div>
</f:if>
</div>
</f:if>
</html>
@@ -0,0 +1,79 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:be.infobox title="{f:translate(key: 'LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.infobox.title')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.infobox.message" />
</p>
<f:if condition="{previousPage}">
<p class="mt-4">
<f:translate
key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.goToClosestRecord.description"
arguments="{0: previousPage.title, 1: previousPage.uid}"
/>
</p>
<f:be.link
route="{moduleIdentifier}"
parameters="{id: previousPage.uid}"
class="btn btn-default"
>
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.goToClosestRecord.link.title" />
</f:be.link>
</f:if>
</f:be.infobox>
<div class="card-container">
<div class="card card-size-medium">
<div class="card-body">
<h2 class="card-title">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.createRootTypoScriptRecord.headline" />
</h2>
<div class="card-text">
<p>
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.createRootTypoScriptRecord.description" />
</p>
</div>
</div>
<div class="card-footer">
<form action="{f:be.uri(route: moduleIdentifier, parameters: '{id: pageUid}')}" method="post">
<input type="hidden" name="action" value="createNewWebsiteTemplate" />
<input
class="btn btn-default"
type="submit"
name="newWebsite"
value="{f:translate(key: 'LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.createRootTypoScriptRecord.link.title')}"
/>
</form>
</div>
</div>
<div class="card card-size-medium">
<div class="card-body">
<h2 class="card-title">
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.createAdditionalTypoScriptRecord.headline" />
</h2>
<div class="card-text">
<p>
<f:translate key="LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.createAdditionalTypoScriptRecord.description" />
</p>
</div>
</div>
<div class="card-footer">
<form action="{f:be.uri(route: moduleIdentifier, parameters: '{id: pageUid}')}" method="post">
<input type="hidden" name="action" value="createExtensionTemplate" />
<input
class="btn btn-default"
type="submit"
name="createExtension"
value="{f:translate(key: 'LLL:EXT:tstemplate/Resources/Private/Language/locallang.xlf:noRecordFound.createAdditionalTypoScriptRecord.link.title')}"
/>
</form>
</div>
</div>
</div>
</html>