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"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<div class="about-module">
<f:render partial="About/Logo" arguments="{_all}" />
<f:for each="{messages}" as="message">
<f:be.infobox title="{f:if(condition: message.title, then: message.title, else: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.header\')}')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}">
<p>{message.message -> f:sanitize.html()}</p>
</f:be.infobox>
</f:for>
<f:render partial="About/About" arguments="{_all}" />
<f:render partial="About/Modules" arguments="{_all}" />
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:donation.sectionHeadline" /></h2>
<f:render partial="About/Donation" arguments="{_all}" />
<f:render partial="About/Credits" arguments="{_all}" />
<f:render partial="About/CoreTeam" arguments="{_all}" />
<f:render partial="About/ExternalLibraries" arguments="{_all}" />
<f:render partial="About/Extensions" arguments="{_all}" />
<p>
<em>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:endText" />
</em>
</p>
<p>{typo3Info.copyrightNotice -> f:format.raw()}</p>
</div>
</f:section>
</html>
@@ -0,0 +1,86 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:asset.module identifier="@typo3/backend/java-script-module-import-event-handler.js"/>
<f:asset.module identifier="bootstrap"/>
<f:asset.module identifier="@typo3/backend/dropdown.js"/>
<f:asset.module identifier="@typo3/backend/module/router.js"/>
<f:asset.module identifier="@typo3/backend/viewport/content-navigation.js"/>
<f:asset.module identifier="@typo3/backend/storage/module-state-storage.js"/>
<f:asset.module identifier="@typo3/backend/toolbar.js"/>
<f:asset.module identifier="@typo3/backend/notification.js"/>
<f:asset.module identifier="@typo3/backend/modal.js"/>
<f:asset.module identifier="@typo3/backend/info-window.js"/>
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/localization.js"/>
<f:asset.module identifier="@typo3/backend/global-event-handler.js"/>
<f:asset.module identifier="@typo3/backend/action-dispatcher.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/live-search/live-search.js"/>
<f:asset.module identifier="@typo3/backend/live-search/element/backend-search.js"/>
<f:asset.module identifier="@typo3/backend/drag-tooltip.js"/>
<div class="scaffold{f:if(condition: '{sidebar.accessible} && {sidebar.expanded}', then: ' scaffold-sidebar-expanded')}{f:if(condition: '{isImpersonated}', then: ' scaffold-in-impersonation')} t3js-scaffold">
<div class="scaffold-state t3js-scaffold-state"></div>
<div class="scaffold-header t3js-scaffold-header">
<f:render partial="Backend/Topbar" arguments="{_all}" />
</div>
<div class="scaffold-sidebar{f:if(condition: '!{sidebar.accessible}', then: ' scaffold-sidebar-disabled')} t3js-scaffold-sidebar">
<f:for each="{sidebar.modules}" as="module">
<f:asset.module identifier="{module}"/>
</f:for>
{sidebar.html -> f:format.raw()}
</div>
<div class="scaffold-content t3js-scaffold-content">
<typo3-backend-content-navigation
identifier="backend"
navigation-title="{f:translate(key: 'viewport.navigation', domain: 'backend.messages')}"
navigation-label-collapse="{f:translate(key: 'viewport.navigation.hide', domain: 'backend.messages')}"
navigation-label-expand="{f:translate(key: 'viewport.navigation.show', domain: 'backend.messages')}"
navigation-min-width="300"
navigation-hidden
>
<div slot="navigation"></div>
<div slot="content">
<f:if condition="{workspaceAccessDenied}">
<f:then>
<div class="m-4">
<f:be.infobox
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:noModuleAccess.workspace.title')}"
message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:noModuleAccess.workspace.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}"
/>
</div>
</f:then>
<f:else if="{noModuleAccess}">
<div class="m-4">
<f:be.infobox
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:noModuleAccess.permissions.title')}"
message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:noModuleAccess.permissions.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}"
/>
</div>
</f:else>
<f:else>
<typo3-backend-module-router
module="{startupModule.0}"
endpoint="{startupModule.1}"
state-tracker="{stateTracker}"
sitename="{sitename}"
{f:if(condition: sitenameFirstInBackendTitle, then: 'sitename-first')}
entry-point="{entryPoint}"
></typo3-backend-module-router>
</f:else>
</f:if>
</div>
</typo3-backend-content-navigation>
</div>
<div class="scaffold-overlay"></div>
</div>
<typo3-backend-drag-tooltip></typo3-backend-drag-tooltip>
<typo3-backend-context-menu></typo3-backend-context-menu>
</html>
@@ -0,0 +1,6 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:render partial="Backend/ModuleMenu" arguments="{modules: modules, modulesInformation: modulesInformation}" />
</html>
@@ -0,0 +1,6 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:render partial="Backend/Topbar" arguments="{_all}" />
</html>
@@ -0,0 +1,84 @@
<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 id="columnSelectorForm">
<div class="sticky-form-actions">
<label
for="columns-filter-input"
class="visually-hidden"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_column_selector.xlf:columnsFilter" />
</label>
<input
type="search"
autocomplete="off"
id="columns-filter-input"
name="columns-filter"
class="form-control"
value=""
placeholder="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.enterSearchString')}"
>
<div class="btn-group t3js-column-selector-actions">
<button type="button" class="btn btn-default disabled" data-action="select-all">
<core:icon identifier="actions-check-square"/> <f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll" />
</button>
<button type="button" class="btn btn-default disabled" data-action="select-none">
<core:icon identifier="actions-square"/> <f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll" />
</button>
<button type="button" class="btn btn-default" data-action="select-toggle">
<core:icon identifier="actions-document-select"/> <f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection" />
</button>
</div>
</div>
<div class="row">
<f:for each="{columns}" as="column">
<div class="col-6 t3js-column-selector-container">
<div class="mt-2 form-check form-check-type-icon-toggle {f:if(condition: column.disabled, then: 'disabled')}">
<input
type="checkbox"
id="select-column-{table}-{column.name}"
name="selectedColumns[]"
class="form-check-input t3js-column-selector"
value="{column.name}"
{f:if(condition:'{column.selected}', then:' checked')}
{f:if(condition:'{column.disabled}', then: 'disabled')}
/>
<label class="form-check-label" for="select-column-{table}-{column.name}">
<span class="form-check-label-icon">
<span class="form-check-label-icon-checked">
<core:icon identifier="actions-check" size="small" alternativeMarkupIdentifier="inline" />
</span>
<span class="form-check-label-icon-unchecked">
<core:icon identifier="miscellaneous-placeholder" size="small" alternativeMarkupIdentifier="inline" />
</span>
</span>
<f:if condition="{column.pseudo} && {column.label}">
<f:then>
<span><i>{column.label}</i></span>
</f:then>
<f:else>
<f:if condition="{column.label}">
<span>{column.label}</span>
</f:if>
<span class="text-variant">[{column.name}]</span>
</f:else>
</f:if>
</label>
</div>
<f:if condition="{column.disabled}">
<input type="hidden" name="selectedColumns[]" value="{column.name}" />
</f:if>
</div>
</f:for>
</div>
<input type="hidden" name="table" value="{table}">
</form>
</html>
@@ -0,0 +1,320 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
</f:section>
<f:section name="Content">
<f:if condition="{accessAllowed}">
<f:then>
<f:if condition="{hookContent}">
<f:then>
<f:format.raw>{hookContent}</f:format.raw>
</f:then>
<f:else>
<f:render section="nativeContent" arguments="{_all}" />
</f:else>
</f:if>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.noEditPermission')}</f:be.infobox>
</f:else>
</f:if>
</f:section>
<f:section name="nativeContent">
<div class="card-container">
<div class="card card-size-medium">
<div class="card-header">
<div class="card-icon">
{icon -> f:format.raw()}
</div>
<div class="card-header-body">
<h2 class="card-title">{title -> f:format.crop(maxCharacters: maxTitleLength)}<f:if condition="{extraFields.uid.value}"><code>[{extraFields.uid.value}]</code></f:if></h2>
<f:if condition="{table}">
<span class="card-subtitle">{table}</span>
</f:if>
</div>
</div>
<div class="card-body">
<div class="row">
<f:for each="{extraFields}" as="extraField">
<f:if condition="{extraField.isDatetime}">
<div class="col-md-6">
<strong>{extraField.fieldLabel}</strong><br>
{extraField.value}
</div>
</f:if>
</f:for>
</div>
<f:if condition="{extraFields.creatorRecord}">
<div class="row mt-3">
<div class="col-md-12">
<strong>{extraFields.creatorRecord.fieldLabel}</strong>
</div>
<div class="col-md-12">
<div class="media">
<div class="media-left">
<be:avatar backendUser="{extraFields.creatorRecord.value.uid}" showIcon="true" />
</div>
<div class="media-body">
<f:if condition="{extraFields.creatorRecord.value.realName}">
<f:then>{extraFields.creatorRecord.value.realName}<br>({extraFields.creatorRecord.value.username})</f:then>
<f:else>{extraFields.creatorRecord.value.username}</f:else>
</f:if>
</div>
</div>
</div>
</div>
</f:if>
</div>
</div>
</div>
<f:if condition="{missingFile}">
<f:be.infobox title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.file_missing')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}">{missingFile}</f:be.infobox>
</f:if>
<f:if condition="{fileRenderer}">
<p>
{fileRenderer -> f:format.raw()}
</p>
</f:if>
<f:if condition="{fileObject}">
<p>
<f:media file="{fileObject}" width="{width}" height="{height}" />
</p>
</f:if>
<f:if condition="{url}">
<p>
<a class="btn btn-default" href="{url}" target="_blank" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.show')}">
<core:icon identifier="actions-document-view" size="small" alternativeMarkupIdentifier="inline" />
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.show" />
</a>
<f:if condition="{editMetadataUrl}">
<a class="btn btn-default" href="{editMetadataUrl}" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.editMetadata')}">
<core:icon identifier="actions-file-edit" size="small" alternativeMarkupIdentifier="inline" />
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.editMetadata" />
</a>
</f:if>
</p>
</f:if>
<h2><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.general" /></h2>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#fieldValues-panel"
aria-controls="fieldValues-panel"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.fieldValues" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="fieldValues-panel" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit table-fit-wrap">
<table class="table table-striped table-hover">
<tbody>
<f:for each="{fields}" as="field">
<tr>
<th class="col-fieldname">{field.fieldLabel}</th>
<td class="col-word-break">{field.fieldValue}</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</div>
</div>
<f:if condition="{returnUrl}">
<a class="btn btn-primary" href="{returnUrl}" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:back')}">
<core:icon identifier="actions-view-go-back" size="small" />
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:back" />
</a>
</f:if>
<f:if condition="{refLines} || {refFromLines}">
<h2><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.references" /></h2>
</f:if>
<f:if condition="{refLines}">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#referencesToThisItem-panel"
aria-controls="referencesToThisItem-panel"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.referencesToThisItem" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="referencesToThisItem-panel" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="col-icon"></th>
<th class="col-recordtitle"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.title" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.table" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.uid" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.field" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.flexpointer" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.softrefKey" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.sorting" /></th>
<th class="col-control"></th>
</tr>
</thead>
<tbody>
<f:for each="{refLines}" as="refLine">
<f:render section="refLineRow" arguments="{line: refLine, maxTitleLength: maxTitleLength}" />
</f:for>
</tbody>
</table>
</div>
</div>
</div>
</f:if>
<f:if condition="{refFromLines}">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#referencesFromThisItem-panel"
aria-controls="referencesFromThisItem-panel"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.referencesFromThisItem" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="referencesFromThisItem-panel" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="col-icon"></th>
<th class="col-recordtitle"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.title" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.table" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.uid" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.field" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.flexpointer" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.softrefKey" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.sorting" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.refString" /></th>
<th class="col-control"></th>
</tr>
</thead>
<tbody>
<f:for each="{refFromLines}" as="refFromLine">
<f:render section="refFromLineRow" arguments="{line: refFromLine, maxTitleLength: maxTitleLength}" />
</f:for>
</tbody>
</table>
</div>
</div>
</div>
</f:if>
</f:section>
<f:section name="refLineRow">
<tr>
<f:if condition="{line.record}">
<f:then>
<td class="col-icon"><a href="{line.url}" title="id={line.record.uid}">{line.icon -> f:format.raw()}</a></td>
<td class="col-recordtitle"><a href="{line.url}" title="{line.recordTitle}">{line.recordTitle -> f:format.crop(maxCharacters: maxTitleLength)}</a></td>
<td>{line.title}</td>
<td>{line.record.uid}</td>
</f:then>
<f:else>
<td class="col-icon"><core:icon identifier="default-not-found" size="small" /></td>
<td class="col-recordtitle"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.missing_record" /></td>
<td>{line.row.title}</td>
<td>{line.row.recuid}</td>
</f:else>
</f:if>
<td>{line.labelForTableColumn}</td>
<td>{line.row.flexpointer}</td>
<td>{line.row.softref_key}</td>
<td>{line.row.sorting}</td>
<td class="col-control">
<f:render section="action" arguments="{line: line.actions}" />
</td>
</tr>
</f:section>
<f:section name="refFromLineRow">
<tr>
<f:if condition="{line.record}">
<f:then>
<td class="col-icon"><a href="{line.url}" title="id={line.record.uid}">{line.icon -> f:format.raw()}</a></td>
<td class="col-recordtitle"><a href="{line.url}" title="{line.recordTitle}">{line.recordTitle -> f:format.crop(maxCharacters: maxTitleLength)}</a></td>
<td>{line.title}</td>
<td>{line.row.ref_uid}</td>
</f:then>
<f:else>
<td class="col-icon"><core:icon identifier="default-not-found" size="small" /></td>
<td class="col-recordtitle"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:show_item.php.missing_record" /></td>
<td>{line.row.title}</td>
<td>{line.row.recuid}</td>
</f:else>
</f:if>
<td>{line.labelForTableColumn}</td>
<td>{line.row.flexpointer}</td>
<td>{line.row.softref_key}</td>
<td>{line.row.sorting}</td>
<td>{line.row.ref_string}</td>
<td class="col-control">
<f:render section="action" arguments="{line: line.actions}" />
</td>
</tr>
</f:section>
<f:section name="action">
<div class="btn-group" role="group">
<f:if condition="{line.recordsModuleUrl}">
<button class="btn btn-default" {f:if(condition: line.previewUrlAttributes, then: '{line.previewUrlAttributes -> f:format.raw()}', else: 'disabled="true"')} title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage')}">
<core:icon identifier="actions-view-page" size="small" />
</button>
</f:if>
<a class="btn btn-default{f:if(condition: '!{line}', then: ' disabled')}" href="{line.recordEditUrl}" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.edit')}">
<core:icon identifier="actions-open" size="small" />
</a>
</div>
<div class="btn-group" role="group">
<a class="btn btn-default{f:if(condition: '!{line}', then: ' disabled')}" href="{line.recordHistoryUrl}" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.history')}">
<core:icon identifier="actions-document-history-open" size="small" />
</a>
</div>
</f:section>
</html>
@@ -0,0 +1,37 @@
<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:layout name="ContentElement/MoveElementLayout" />
<f:section name="Content">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_content_elements.xlf:headline.{f:if(condition: makeCopyChecked, then: 'copy', else: 'move')}" arguments="{0: recordTitle, 1: record.uid}" />
</h2>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_content_elements.xlf:currentPath" /> {pageInfo._thePathFull}</p>
<input type="hidden" name="elementRecordTitle" id="elementRecordTitle" value="{recordTitle}" />
<input type="hidden" name="pageRecordTitle" id="pageRecordTitle" value="{pageRecord.recordTitle}" />
<input type="hidden" name="pageUid" id="pageUid" value="{pageInfo.uid}" />
<div class="form-row">
<div class="form-check form-switch">
<input type="checkbox" name="makeCopy" id="makeCopy" value="1" {f:if(condition: makeCopyChecked, then: 'checked')} class="form-check-input">
<label for="makeCopy" class="form-check-label"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:makeCopy" /></label>
</div>
</div>
<div class="page-position-map">
<div class="page-position-info">
<f:if condition="{pageInfo}">
<span title="{pageRecord.recordTooltip}"><core:iconForRecord table="pages" row="{pageInfo}" /></span>
</f:if>
<strong>{pageRecord.recordTitle}</strong>
</div>
{contentElementColumns -> f:format.raw()}
</div>
</f:section>
</html>
@@ -0,0 +1,14 @@
<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:comment>Deliberately empty</f:comment>
</f:section>
</html>
@@ -0,0 +1,30 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="{f:if(condition: treeEnabled, then: 'ElementBrowserWithNavigation', else: 'ElementBrowser')}" />
<f:section name="Navigation">
<f:if condition="{tree}">
<f:then>
<div class="element-browser-body">
{tree -> f:format.raw()}
</div>
</f:then>
<f:else>
<typo3-backend-component-page-browser
tree-actions="{treeActions -> f:format.json()}"
active-page="{activePage}"
>
</typo3-backend-component-page-browser>
</f:else>
</f:if>
</f:section>
<f:section name="Content">
<f:flashMessages queueIdentifier="core.template.flashMessages"/>
<f:format.raw>{content}</f:format.raw>
</f:section>
</html>
@@ -0,0 +1,43 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="SystemEmail" />
<f:section name="Subject">Attempted login using incorrect multi-factor authentication at "{typo3.sitename}"</f:section>
<f:section name="Title">Attempted login using incorrect multi-factor authentication</f:section>
<f:section name="Main">
<p>
TYPO3 detected a login attempt to your TYPO3 backend account using incorrect multi-factor authentication.
</p>
<table cellpadding="3">
<tr>
<td>Sitename:</td>
<td>{typo3.sitename} ({normalizedParams.httpHost})</td>
</tr>
<tr>
<td>IP Address:</td>
<td>{normalizedParams.remoteAddress}</td>
</tr>
<tr>
<td>Time:</td>
<td><f:format.date date="now"/> <f:format.date date="now" format="H:i:s T"/></td>
</tr>
<tr>
<td>MFA provider:</td>
<td>{f:translate(key: provider.title, default: provider.title)}</td>
</tr>
</table>
<p>
If you recently tried to sign in, but mistakenly used incorrect multi-factor authentication,
you can ignore this email.
</p>
<p>
If you did not recently try to sign in, you should immediately change your password and verify your account
settings for any unauthorized changes.
</p>
<p>
Contact your TYPO3 administrator if you notice suspicious activity.
</p>
</f:section>
</html>
@@ -0,0 +1,19 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">Attempted login using incorrect multi-factor authentication at "{typo3.sitename}"</f:section>
<f:section name="Title">Attempted login using incorrect multi-factor authentication</f:section>
<f:section name="Main">
TYPO3 detected a login attempt to your TYPO3 backend account using incorrect multi-factor authentication.
Sitename: {typo3.sitename} ({normalizedParams.httpHost})
IP Address: {normalizedParams.remoteAddress}
Time: <f:format.date date="now"/> <f:format.date date="now" format="H:i:s T"/>
MFA provider: {f:translate(key: provider.title, default: provider.title)}
If you recently tried to sign in, but mistakenly used incorrect multi-factor authentication, you can ignore this email.
If you did not recently try to sign in, you should immediately change your password and verify your account
settings for any unauthorized changes.
Contact your TYPO3 administrator if you notice suspicious activity.
</f:section>
@@ -0,0 +1,10 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">Password reset requested at "{typo3.sitename}"</f:section>
<f:section name="Title">Your email address was used to trigger a password reset</f:section>
<f:section name="Main">
<p>
Unfortunately, we are unable to reset your password because your email address "{email}" is used for multiple backend user accounts at the TYPO3 instance "{typo3.sitename}".
Please ask your administrator to generate a new password for you.
</p>
<f:render partial="Email/PasswordReset/ClosingParagraph" arguments="{normalizedParams: normalizedParams}" />
</f:section>
@@ -0,0 +1,9 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">Password reset requested at "{typo3.sitename}"</f:section>
<f:section name="Title">Your email address was used to trigger a password reset</f:section>
<f:section name="Main">
Unfortunately, we are unable to reset your password because your email address "{email}" is used for multiple backend user accounts at the TYPO3 instance "{typo3.sitename}".
Please ask your administrator to generate a new password for you.
<f:render partial="Email/PasswordReset/ClosingParagraph" arguments="{normalizedParams: normalizedParams}" />
</f:section>
@@ -0,0 +1,13 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">Password reset requested at "{typo3.sitename}"</f:section>
<f:section name="Title">Your email address was used to trigger a password reset</f:section>
<f:section name="Main">
<p>
Follow the link below to reset your backend user password at &quot;{typo3.sitename}&quot; (this link expires in 2 hours).
<f:if condition="{username}">Your username is: <strong>{username}</strong></f:if>
</p>
<p>
<a href="{resetLink}">Reset password</a>
</p>
<f:render partial="Email/PasswordReset/ClosingParagraph" arguments="{normalizedParams: normalizedParams}" />
</f:section>
@@ -0,0 +1,11 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">Password reset requested at "{typo3.sitename}"</f:section>
<f:section name="Title">Your email address was used to trigger a password reset</f:section>
<f:section name="Main">
Follow the link below to reset your backend user password at "{typo3.sitename}" (this link expires in 2 hours).
<f:if condition="{username}">Your username is: {username}</f:if>
{resetLink -> f:format.raw()}
<f:render partial="Email/PasswordReset/ClosingParagraph" arguments="{normalizedParams: normalizedParams}" />
</f:section>
@@ -0,0 +1,11 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">TYPO3 Login Failure Warning (at {typo3.sitename})</f:section>
<f:section name="Title">TYPO3 Login Failure Warning at {typo3.sitename}</f:section>
<f:section name="Main">
<strong>There have been some attempts ({lines -> f:count()}) to login at the TYPO3 site "{typo3.sitename}" (<strong>{normalizedParams.remoteAddress}</strong>).</strong>
<br><br>
This is a dump of the failures:<br>
<f:for each="{lines}" as="line">
{f:format.date(date:line.row.tstamp, format:'{typo3.formats.date} {typo3.formats.time}')}: {line.text}<br>
</f:for>
</f:section>
@@ -0,0 +1,9 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">TYPO3 Login Failure Warning (at {typo3.sitename})</f:section>
<f:section name="Title">TYPO3 Login Failure Warning at {typo3.sitename}</f:section>
<f:section name="Main">There have been some attempts ({lines -> f:count()}) to login at the TYPO3 site "{typo3.sitename}" ({normalizedParams.remoteAddress}).
This is a dump of the failures:
<f:for each="{lines}" as="line">{f:format.date(date:line.row.tstamp, format:'{typo3.formats.date} {typo3.formats.time}')}: {line.text -> f:format.raw()}
</f:for>
</f:section>
@@ -0,0 +1,7 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">{prefix} New Login at "{typo3.sitename}"</f:section>
<f:section name="Title">{headline}</f:section>
<f:section name="Main">
<h4>{introduction}</h4>
<p>The user <em>"{user.username}"</em> logged in from the IP address <strong>{normalizedParams.remoteAddress}</strong> at "{typo3.sitename}".</p>
</f:section>
@@ -0,0 +1,6 @@
<f:layout name="SystemEmail" />
<f:section name="Subject">{prefix} New Login at "{typo3.sitename}"</f:section>
<f:section name="Title">{headline}</f:section>
<f:section name="Main">{introduction}
The user "{user.username}" logged in from the IP address "{normalizedParams.remoteAddress}" at the site "{typo3.sitename}".
</f:section>
@@ -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>
@@ -0,0 +1,8 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:be.infobox title="{title}" state="{state}">
<f:format.raw>{message}</f:format.raw>
</f:be.infobox>
</html>
@@ -0,0 +1,82 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="LinkBrowser" />
<f:section name="Content">
<form action="" id="lmailform">
<div class="element-browser-form-group">
<label for="lemail" class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:emailAddress" />
</label>
<input
id="lemail"
type="email"
name="lemail"
class="form-control"
value="{email}"
required />
</div>
<f:if condition="{allowedLinkAttributes.subject}">
<div class="element-browser-form-group">
<label for="emailSubject" class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:email.subject" />
</label>
<input
id="emailSubject"
name="emailSubject"
class="form-control"
value="{subject}"
data-mailto-part="subject"/>
</div>
</f:if>
<f:if condition="{allowedLinkAttributes.cc}">
<div class="element-browser-form-group">
<label for="emailCc" class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:email.cc" />
</label>
<input
id="emailCc"
name="emailCc"
class="form-control"
value="{cc}"
data-mailto-part="cc"/>
</div>
</f:if>
<f:if condition="{allowedLinkAttributes.bcc}">
<div class="element-browser-form-group">
<label for="emailBcc" class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:email.bcc" />
</label>
<input
id="emailBcc"
name="emailBcc"
class="form-control"
value="{bcc}"
data-mailto-part="bcc"/>
</div>
</f:if>
<f:if condition="{allowedLinkAttributes.body}">
<div class="element-browser-form-group">
<label for="emailBody" class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:email.body" />
</label>
<textarea
id="emailBody"
name="emailBody"
rows="10"
cols="50"
size="20"
class="form-control"
data-mailto-part="body">{body}</textarea>
</div>
</f:if>
<div class="element-browser-form-group">
<input class="btn btn-primary" type="submit" value="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:setLink')}" />
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,44 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="LinkBrowser" />
<f:section name="Navigation">
<typo3-backend-component-page-browser
tree-actions="{treeActions -> f:format.json()}"
active-page="{expandedPage}"
>
</typo3-backend-component-page-browser>
</f:section>
<f:section name="Content">
<f:if condition="{expandActivePage}">
<f:if condition="{activePageLink}">
<f:then>
<a href="{activePageLink}" class="t3js-pageLink btn btn-default">
<f:format.raw>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:linkTo" arguments="{0: '{activePageIcon} {activePageTitle}'}">{activePageIcon} {activePageTitle}</f:translate>
</f:format.raw>
</a>
</f:then>
<f:else>
<div>{activePageIcon -> f:format.raw()} {activePageTitle -> f:format.raw()}</div>
</f:else>
</f:if>
<f:if condition="{contentElements}">
<h4 class="mt-4 mb-3"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:contentElements" /></h4>
<div class="list-group">
<f:for each="{contentElements}" as="content">
<a href="{content.url}" class="t3js-pageLink list-group-item list-group-item-action {f:if(condition: content.isSelected, then: ' active')}">
{content.icon -> f:format.raw()} {content.title -> f:format.raw()}
</a>
</f:for>
</div>
</f:if>
</f:if>
</f:section>
</html>
@@ -0,0 +1,21 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="LinkBrowser" />
<f:section name="Navigation"><f:if condition="{treeEnabled}">
<typo3-backend-component-page-browser
tree-actions="{treeActions -> f:format.json()}"
alternative-entry-points="{pageTreeMountPoints -> f:format.json()}"
active-page="{expandedPage}"
>
</typo3-backend-component-page-browser>
</f:if></f:section>
<f:section name="Content">
{recordList -> f:format.raw()}
</f:section>
</html>
@@ -0,0 +1,29 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="LinkBrowser" />
<f:section name="Content">
<form class="form" action="" id="ltelephoneform">
<div class="element-browser-form-group">
<label for="ltelephone" class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:telephoneNumber" />
</label>
<div class="input-group">
<input
id="ltelephone"
type="tel"
name="ltelephone"
size="20"
class="form-control"
value="{telephone}"
required />
<input class="btn btn-primary" type="submit" value="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:setLink')}" />
</div>
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,30 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="LinkBrowser" />
<f:section name="Content">
<form class="form" action="" id="lurlform">
<div class="element-browser-form-group">
<label for="lurl" class="form-label">
URL
</label>
<div class="input-group">
<input
id="lurl"
type="text"
name="lurl"
size="30"
class="form-control"
value="{url}"
placeholder="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:urlPlaceholder')}"
required />
<input class="btn btn-primary" type="submit" value="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:setLink')}" />
</div>
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,56 @@
<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"
>
<tr>
<td colspan="{colspan + 1}">
<nav aria-labelledby="recordlist-pagination">
<ul class="pagination mb-0">
<li class="page-item">
<span id="recordlist-pagination" class="page-link">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:rangeIndicator" arguments="{0: firstElement, 1: lastElement}" />
<span class="visually-hidden">, <f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:pageIndicator" arguments="{0: currentPage, 1: totalPages}"/></span>
</span>
</li>
<f:comment>First page and previous page</f:comment>
<f:if condition="{currentPage} > 1">
<f:then>
<li class="page-item"><a class="page-link" href="{currentUrl}&pointer=1" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:first')}" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:first')}"><core:icon identifier="actions-view-paging-first"/></a></li>
<li class="page-item"><a class="page-link" href="{currentUrl}&pointer={currentPage -1}" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:previous')}" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:previous')}"><core:icon identifier="actions-view-paging-previous" /></a></li>
</f:then>
<f:else>
<li class="page-item disabled" aria-hidden="true"><span class="page-link"><core:icon identifier="actions-view-paging-first" /></span></li>
<li class="page-item disabled" aria-hidden="true"><span class="page-link"><core:icon identifier="actions-view-paging-previous" /></span></li>
</f:else>
</f:if>
<f:variable name="pageInput">
<input type="number" autocomplete="off" data-currentpage="{currentPage}" name="pointer" min="1" max="{totalPages}" value="{currentPage}" size="3" class="t3js-recordlist-paging form-control form-control-sm paginator-input" />
<span aria-hidden="true">
</f:variable>
<li class="page-item">
<span class="page-link">
<f:format.raw><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:pageIndicator" arguments="{0: pageInput, 1: totalPages}"/></f:format.raw></span>
</span>
</li>
<f:comment>Next page and last page</f:comment>
<f:if condition="{currentPage} < {totalPages}">
<f:then>
<li class="page-item"><a class="page-link" href="{currentUrl}&pointer={currentPage + 1}" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:next')}" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:next')}"><core:icon identifier="actions-view-paging-next" /></a></li>
<li class="page-item"><a class="page-link" href="{currentUrl}&pointer={totalPages}" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:last')}" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:last')}"><core:icon identifier="actions-view-paging-last" /></a></li>
</f:then>
<f:else>
<li class="page-item disabled" aria-hidden="true"><span class="page-link"><core:icon identifier="actions-view-paging-next" /></span></li>
<li class="page-item disabled" aria-hidden="true"><span class="page-link"><core:icon identifier="actions-view-paging-last" /></span></li>
</f:else>
</f:if>
<li class="page-item"><a class="page-link" href="{currentUrl}&pointer={currentPage}" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:reload')}" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:reload')}"><core:icon identifier="actions-refresh" /></a></li>
</ul>
</nav>
</td>
</tr>
</html>
@@ -0,0 +1,50 @@
<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"
>
<typo3-backend-live-search>
<form>
<div class="input-group mb-2">
<input
type="search"
autocomplete="off"
name="query"
class="form-control"
placeholder="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:liveSearch_search')}"
value="{searchDemand.query}"
>
<f:if condition="{searchProviders->f:count()} > 0">
<button class="btn btn-default dropdown-toggle t3js-search-provider-dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
<core:icon identifier="actions-filter" size="small" />
<span class="search-option-badge badge badge-primary {activeOptions == 0 ? 'hidden' : ''}" data-active-options-counter="{activeOptions}">
<output>{activeOptions}</output>
<span class="visually-hidden">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:liveSearch_activeFilters')}</span>
</span>
</button>
<div class="dropdown-menu t3js-search-provider-dropdown">
<h6 class="dropdown-header">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:liveSearch_searchIn')}</h6>
<div class="dropdown-item-text">
<f:for each="{searchProviders}" as="searchProvider" key="searchProviderIdentifier">
<typo3-backend-live-search-option-item
optionId="{searchProviderIdentifier}"
optionName="searchProviders"
optionLabel="{searchProvider.instance.filterLabel}"
{searchProvider.isActive ? 'active' : ''}
></typo3-backend-live-search-option-item>
</f:for>
</div>
</div>
</f:if>
</div>
<div class="form-text">
<typo3-backend-live-search-hint hint="{hint}"></typo3-backend-live-search-hint>
</div>
<input type="hidden" name="offset" value="{searchDemand.offset}">
<input type="hidden" name="pageId" value="{searchDemand.pageId}">
</form>
<typo3-backend-live-search-result-container></typo3-backend-live-search-result-container>
<typo3-backend-live-search-result-pagination></typo3-backend-live-search-result-pagination>
</typo3-backend-live-search>
</html>
@@ -0,0 +1,64 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Login" />
<f:section name="ResetPassword">
<div class="typo3-login-form t3js-login-formfields">
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:headline" /></h2>
<f:if condition="{resetInitiated}">
<f:then>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::OK')}" disableIcon="true" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:email_sent.headline')}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:email_sent.message" arguments="{0: email}" />
</f:be.infobox>
<p class="float-end">
<a href="{returnUrl}"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:button.back_to_login" /></a>.
</p>
</f:then>
<f:else>
<f:if condition="{invalidEmail}">
<f:be.infobox message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:error.invalid_email')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" />
</f:if>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:instructions.email" /></p>
<form action="{formUrl}" method="post" name="forget-password-form" id="typo3-forget-password-form">
<div class="form-group">
<div class="form-control-wrap">
<div class="form-control-holder">
<label class="form-label" for="typo3-forget-password-email"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:input.email" /></label>
<input
type="email"
name="email"
value="{email}"
placeholder="you@example.com"
id="typo3-forget-password-email"
class="form-control form-control-clearable input-login t3js-clearable"
autofocus="autofocus"
autocomplete="email"
required="required"
data-clearable-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inputfield.clearButton.title')}"
/>
</div>
</div>
</div>
<div class="form-group d-grid">
<button class="btn d-block btn-login" type="submit" name="forgetPasswordSubmit">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:button.initiate" />
</button>
</div>
</form>
<p>
<small>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:note.other_providers" />
</small>
</p>
<p class="float-end">
<a href="{returnUrl}"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:button.back_to_login" /></a>.
</p>
</f:else>
</f:if>
</div>
</f:section>
</html>
@@ -0,0 +1,93 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Login" />
<f:section name="ResetPassword">
<div class="typo3-login-form t3js-login-formfields">
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:headline" /></h2>
<f:if condition="{invalidToken}">
<f:then>
<f:be.infobox message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:error.token_expired')}" title="" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" />
<div class="d-grid">
<a class="btn d-block btn-login" href="{restartUrl}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:button.restart" />
</a>
</div>
</f:then>
<f:else if="{resetExecuted}">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::OK')}" disableIcon="true" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:reset_success.headline')}">
<f:format.raw>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:reset_success.message" arguments="{0: '{f:be.uri(route: \'login\')}'}"/>
</f:format.raw>
</f:be.infobox>
</f:else>
<f:else>
<f:if condition="{error}">
<f:be.infobox message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:error.password')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" />
</f:if>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:instructions.password" /></p>
<form action="{formUrl}" method="post" name="forget-password-form" id="typo3-forget-password-form">
<div class="form-group">
<div class="form-control-wrap">
<div class="form-control-holder">
<label class="form-label" for="t3-reset-password"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:input.password" /></label>
<input
type="password"
id="t3-reset-password"
name="password"
value=""
class="form-control form-control-clearable input-login t3js-clearable t3js-capslockwarning t3js-login-password-field"
autocomplete="new-password"
autofocus="autofocus"
required="required"
spellcheck="false"
data-capslockwarning-title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslock')}"
data-capslockwarning-message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslockStatus')}"
data-clearable-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inputfield.clearButton.title')}"
/>
</div>
</div>
</div>
<div class="form-group">
<div class="form-control-wrap">
<div class="form-control-holder">
<label class="form-label" for="t3-reset-password-repeat"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:input.passwordrepeat" /></label>
<input
type="password"
id="t3-reset-password-repeat"
name="passwordrepeat"
value=""
autocomplete="new-password"
class="form-control form-control-clearable input-login t3js-clearable t3js-capslockwarning t3js-login-password-field"
required="required"
spellcheck="false"
data-capslockwarning-title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslock')}"
data-capslockwarning-message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslockStatus')}"
data-clearable-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inputfield.clearButton.title')}"
/>
</div>
</div>
</div>
<div class="form-group d-grid">
<button class="btn d-block btn-login" type="submit" name="forgotPasswordSubmit">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:button.reset" />
</button>
</div>
<f:if condition="{passwordRequirements}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_reset_password.xlf:instructions.password_requirement" /></p>
<ul>
<f:for each="{passwordRequirements}" as="passwordRequirement">
<li>{passwordRequirement}</li>
</f:for>
</ul>
</f:if>
</form>
</f:else>
</f:if>
</div>
</f:section>
</html>
@@ -0,0 +1,68 @@
<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="Login" />
<f:section name="loginFormFields">
<f:asset.module identifier="@typo3/backend/user-pass-login.js"/>
<div class="form-group t3js-login-username-section" id="t3-login-username-section">
<div class="form-control-wrap">
<div class="form-control-holder">
<label class="form-label" for="t3-username"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.username" /></label>
<div class="input-group">
<input
type="text"
id="t3-username"
name="username"
value="{presetUsername}"
class="form-control form-control-clearable input-login t3js-clearable t3js-capslockwarning t3js-login-username-field"
autofocus="autofocus"
autocomplete="username"
required="required"
spellcheck="false"
data-capslockwarning-title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslock')}"
data-capslockwarning-message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslockStatus')}"
data-clearable-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inputfield.clearButton.title')}"
/>
</div>
</div>
</div>
</div>
<div class="form-group t3js-login-password-section" id="t3-login-password-section">
<div class="form-control-wrap">
<div class="form-control-holder">
<label class="form-label" for="t3-password"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.password" /></label>
<div class="input-group">
<input
type="password"
id="t3-password"
name="p_field"
value="{presetPassword}"
class="form-control input-login t3js-clearable t3js-capslockwarning t3js-login-password-field"
autocomplete="current-password"
required="required"
spellcheck="false"
data-capslockwarning-title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslock')}"
data-capslockwarning-message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.error.capslockStatus')}"
data-clearable-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inputfield.clearButton.title')}"
data-passwordtoggle-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.togglePassword')}"
/>
</div>
</div>
</div>
</div>
</f:section>
<f:section name="ResetPassword">
<div class="forgot-password my-3">
<div class="text-end">
<a href="{forgetPasswordUrl}"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.password_forget" /></a>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,83 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="typo3-login">
<div class="typo3-login-inner">
<div class="typo3-login-container">
<div class="typo3-login-wrap">
<div class="card card-login card-mfa">
<header class="card-heading">
<h2 class="text-center">{provider.title -> f:translate(key: provider.title, default: provider.title)}</h2>
</header>
<main class="card-body">
<f:if condition="{isLocked} || {hasAuthError}">
<div id="t3-login-error" class="mb-2">
<div class="alert alert-danger">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.{f:if(condition: isLocked, then: 'locked', else: 'authError')}"/>
</div>
</div>
</f:if>
<f:if condition="!{isLocked}">
<f:then>
<form action="{formUrl}" method="post" enctype="multipart/form-data" name="verify" id="mfaController">
<input type="hidden" name="identifier" value="{provider.identifier}" />
{providerContent -> f:format.raw()}
<div class="form-group d-grid mb-2" id="t3-login-submit-section">
<button class="btn d-block btn-login" type="submit" name="submit" autocomplete="off">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.submit"/>
</button>
</div>
</form>
</f:then>
<f:else>
<f:comment>In case, the provider is temporarily locked, still allow to render provider specific content.</f:comment>
{providerContent -> f:format.raw()}
</f:else>
</f:if>
<div class="cancel-authentication">
<div class="text-end">
<f:be.link
route="auth_mfa"
parameters="{action: 'cancel', redirect: redirectRoute, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.cancel')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.cancel"/>
</f:be.link>
</div>
</div>
</main>
<f:if condition="{alternativeProviders}">
<footer class="card-footer">
<h5><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.alternativeProviders"/></h5>
<ul class="list-group px-lg-4">
<f:for each="{alternativeProviders}" as="alternativeProvider">
<li>
<f:be.link
route="auth_mfa"
parameters="{identifier: alternativeProvider.identifier, redirect: redirectRoute, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.alternativeProviders.use', arguments: {0: '{alternativeProvider.title -> f:translate(key: alternativeProvider.title, default: alternativeProvider.title)}'})}"
>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:auth.alternativeProviders.use"
arguments="{0: '{alternativeProvider.title -> f:translate(key: alternativeProvider.title, default: alternativeProvider.title)}'}"
/>
</f:be.link>
</li>
</f:for>
</ul>
</footer>
</f:if>
</div>
</div>
</div>
<f:if condition="{footerNote}">
<aside class="typo3-login-footnote" aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.region.footnote')}">
<p>{footerNote}</p>
</aside>
</f:if>
</div>
</div>
</html>
@@ -0,0 +1,56 @@
<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:layout name="Module" />
<f:section name="Content">
<f:variable name="providerTitle" value="{provider.title -> f:translate(key: provider.title, default: provider.title)}"/>
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.title" arguments="{0: providerTitle}"/></h1>
<p><f:format.nl2br>{provider.description -> f:translate(key: provider.description, default: provider.description)}</f:format.nl2br></p>
<form
action="{f:be.uri(route:'mfa', parameters:'{action: \'save\'}')}"
method="post"
enctype="multipart/form-data"
name="edit"
id="mfaConfigurationController">
<input type="hidden" name="identifier" value="{provider.identifier}" />
<div class="mb-3">
{providerContent -> f:format.raw()}
</div>
<div class="mfa-provider-settings">
<f:if condition="{provider.defaultProviderAllowed}">
<div class="row mb-3">
<div class="col-md-5">
<h4><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.defaultProvider"/></h4>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.defaultProvider.description"/></p>
<div class="form-check">
<input type="checkbox" name="defaultProvider" id="defaultProvider" class="form-check-input" value="1" {f:if(condition: isDefaultProvider, then: 'checked="checked"')} />
<label class="form-check-label" for="defaultProvider">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.defaultProvider.inputLabel"/>
</label>
</div>
</div>
</div>
</f:if>
<div class="row">
<div class="col">
<h4><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider"/></h4>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider.description"/></p>
<f:be.link route="mfa" parameters="{action: 'deactivate', identifier: provider.identifier}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider.linkTitle', arguments: '{0: providerTitle}')}" class="btn btn-danger">
<core:icon identifier="actions-toggle-off" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:edit.deactivateProvider.linkText"/>
</f:be.link>
</div>
</div>
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,105 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.title" /></h1>
<f:if condition="{setupRequired}">
<f:then>
<f:if condition="{providers}">
<f:then>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupRequired.title')}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupRequired.message"/></p>
</f:be.infobox>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.noProviders.title')}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:noprovider_error_message"/></p>
</f:be.infobox>
</f:else>
</f:if>
</f:then>
<f:else if="!{providers}">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.noProviders.title')}">
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.noProviders.message"/></p>
</f:be.infobox>
</f:else>
</f:if>
<f:if condition="{providers}">
<f:then>
<div class="card-container">
<f:for each="{providers}" as="provider">
<f:render section="Item" arguments="{provider: provider, defaultProvider: defaultProvider, recommendedProvider: recommendedProvider}"/>
</f:for>
</div>
</f:then>
</f:if>
</f:section>
<f:section name="Item">
<f:variable name="providerTitle" value="{provider.title -> f:translate(key: provider.title, default: provider.title)}"/>
<div class="card card-size-small {f:if(condition: '{recommendedProvider} == {provider.identifier}', then: 'card-success')}" id="{provider.identifier}-provider">
<div class="card-header">
<div class="card-icon">
<core:icon identifier="{provider.iconIdentifier}" size="large"/>
</div>
<div class="card-header-body">
<h2 class="card-title">
{providerTitle}
<be:mfa.ifHasState state="active" provider="{provider}">
<span class="badge badge-{be:mfa.ifHasState(state: 'locked', provider: provider, then: 'danger', else: 'success')}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.badge.{be:mfa.ifHasState(state: 'locked', provider: provider, then: 'locked', else: 'active')}"/>
</span>
</be:mfa.ifHasState>
<f:if condition="{defaultProvider} == {provider.identifier}">
<span title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.defaultProvider')}">
<core:icon identifier="actions-star" />
</span>
</f:if>
</h2>
</div>
</div>
<div class="card-body">
<p class="card-text">{provider.description -> f:translate(key: provider.description, default: provider.description)}</p>
</div>
<div class="card-footer">
<be:mfa.ifHasState state="active" provider="{provider}">
<f:then>
<be:mfa.ifHasState state="locked" provider="{provider}">
<f:then>
<f:be.link route="mfa" parameters="{action: 'unlock', identifier: provider.identifier}" class="btn btn-success" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.unlockLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-unlock" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.unlockLinkLabel"/>
</f:be.link>
</f:then>
<f:else>
<f:be.link route="mfa" parameters="{action: 'edit', identifier: provider.identifier}" class="btn btn-default" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.editLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-open" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.editLinkLabel"/>
</f:be.link>
</f:else>
</be:mfa.ifHasState>
<f:be.link route="mfa" parameters="{action: 'deactivate', identifier: provider.identifier}" class="btn btn-danger" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.deactivateLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-toggle-off" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.deactivateLinkLabel"/>
</f:be.link>
</f:then>
<f:else>
<f:be.link route="mfa" parameters="{action: 'setup', identifier: provider.identifier}" class="btn btn-{f:if(condition: '{recommendedProvider} == {provider.identifier}', then: 'success', else: 'default')}" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupLinkTitle', arguments: {0: providerTitle})}">
<core:icon identifier="actions-plus" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:overview.setupLinkLabel"/>
</f:be.link>
</f:else>
</be:mfa.ifHasState>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,33 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:setup.title" arguments="{0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'}"/></h1>
<div class="row g-6">
<div class="col">
<form
action="{f:be.uri(route:'mfa', parameters:'{action: \'activate\'}')}"
method="post"
enctype="multipart/form-data"
name="setup"
id="mfaConfigurationController">
<input type="hidden" name="identifier" value="{provider.identifier}" />
{providerContent -> f:format.raw()}
</form>
</div>
<f:if condition="{provider.setupInstructions}">
<div class="col-md-4">
<f:render partial="Mfa/SetupInstructions" arguments="{provider: provider}" />
</div>
</f:if>
</div>
</f:section>
</html>
@@ -0,0 +1,79 @@
<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="typo3-login">
<div class="typo3-login-inner">
<div class="typo3-login-container">
<div class="typo3-login-wrap">
<div class="card card-login card-mfa">
<header class="card-heading text-center">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.title" />
</h2>
<p class="text-variant">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.message" arguments="{0: siteName}" />
</p>
</header>
<main class="card-body">
<f:if condition="{recommendedProvider} || {providers}">
<f:then>
<div class="list-group mb-2">
<f:if condition="{recommendedProvider}">
<f:render section="providerLink" arguments="{provider: recommendedProvider, highlight: '{providers -> f:count()}', redirect: redirect, redirectParams: redirectParams}" />
</f:if>
<f:for each="{providers}" as="provider">
<f:render section="providerLink" arguments="{provider: provider, redirect: redirect, redirectParams: redirectParams}" />
</f:for>
</div>
</f:then>
<f:else>
<div class="alert alert-warning mb-2">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:noprovider_error_message" arguments="{0: siteName}" />
</div>
</f:else>
</f:if>
<div class="cancel-setup">
<div class="text-end">
<f:be.link
route="setup_mfa"
parameters="{action: 'cancel', redirect: redirect, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.goBack')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.selection.goBack"/>
</f:be.link>
</div>
</div>
</main>
</div>
</div>
</div>
<f:if condition="{footerNote}">
<aside class="typo3-login-footnote" aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.region.footnote')}">
<p>{footerNote}</p>
</aside>
</f:if>
</div>
</div>
<f:section name="providerLink">
<f:be.link
route="setup_mfa"
class="list-group-item list-group-item-action {f:if(condition: highlight, then: 'border-success')}"
parameters="{action: 'setup', identifier: provider.identifier, redirect: redirect, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setupProvider', arguments: {0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'})}"
>
<div class="d-flex">
<div class="align-self-center pe-3">
<core:icon identifier="{provider.iconIdentifier}" size="medium" />
</div>
<div class="align-self-center">
<f:translate key="{provider.title}" default="{provider.title}" />
</div>
</div>
</f:be.link>
</f:section>
</html>
@@ -0,0 +1,68 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="typo3-login">
<div class="typo3-login-inner">
<div class="typo3-login-container">
<div class="typo3-login-wrap typo3-login-wrap-large">
<div class="card card-login card-mfa">
<header class="card-heading text-center">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setupProvider" arguments="{0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'}"/>
</h2>
</header>
<main class="card-body">
<f:if condition="{hasErrors}">
<div id="t3-login-error">
<div class="alert alert-danger">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:activate.failure" arguments="{0: '{provider.title -> f:translate(key: provider.title, default: provider.title)}'}"/>
</div>
</div>
</f:if>
<div class="row">
<div class="col-12">
<form
action="{f:be.uri(route:'setup_mfa', parameters:'{action: \'activate\', redirect: redirect, redirectParams: redirectParams}')}"
method="post"
enctype="multipart/form-data"
name="setup"
id="mfaSetupController"
>
{providerContent -> f:format.raw()}
<input type="hidden" name="identifier" value="{provider.identifier}" />
<div class="text-end">
<f:be.link
route="setup_mfa"
class="btn btn-default fw-normal"
parameters="{redirect: redirect, redirectParams: redirectParams}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setup.cancel')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setup.cancel"/>
</f:be.link>
<button type="submit" class="btn btn-info">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:standalone.setup" />
</button>
</div>
</form>
</div>
<f:if condition="{provider.setupInstructions}">
<div class="col-12 mt-3">
<f:render partial="Mfa/SetupInstructions" arguments="{provider: provider}" />
</div>
</f:if>
</div>
</main>
</div>
</div>
</div>
<f:if condition="{footerNote}">
<aside class="typo3-login-footnote" aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.region.footnote')}">
<p>{footerNote}</p>
</aside>
</f:if>
</div>
</div>
</html>
@@ -0,0 +1,10 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<h5>{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:2_selectPosition') -> f:format.htmlspecialchars()}</h5>
<div class="page-position-map">
{posMap -> f:format.raw()}
</div>
</html>
@@ -0,0 +1,19 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{positionSelection}">
<h5>{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:1_selectType')}</h5>
</f:if>
<typo3-backend-new-record-wizard
storename="new-content-element"
categories="{categoriesJson}"
searchplaceholder="{f:translate(domain: 'core.misc', key: 'newContentElement.filter.placeholder')}"
searchnothingfoundlabel="{f:translate(domain: 'core.misc', key: 'newContentElement.filter.noResults')}"
usernotallowedlabel="{f:translate(domain: 'core.misc', key: 'newContentElement.filter.userNotAllowed')}"
>
</typo3-backend-new-record-wizard>
</html>
@@ -0,0 +1,62 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:db_new.php.pagetitle" /></h1>
<f:for each="{recordTypeGroups}" as="recordTypeGroup" key="recordTypeGroupIdentifier">
<div class="row mb-4">
<div class="col-12">
<strong>{recordTypeGroup.icon -> f:format.raw()} <f:format.case mode="capital">{recordTypeGroup.title}</f:format.case></strong>
<div class="list-group mt-2">
<f:for each="{recordTypeGroup.items}" key="recordTypeTable" as="recordTypeItem">
<f:if condition="{recordTypeItem.types}">
<f:then>
<div class="list-group-item p-0">
<button class="list-group-button" data-bs-toggle="collapse" data-bs-target="#{recordTypeTable}-types" aria-expanded="false" aria-controls="{recordTypeTable}-types">
{recordTypeItem.icon -> f:format.raw()}
{recordTypeItem.label}
<span class="caret"></span>
</button>
<div class="collapse" id="{recordTypeTable}-types">
<div class="list-group m-2 mt-0">
<f:for each="{recordTypeItem.types}" key="name" as="type">
<a class="list-group-item list-group-item-action" href="{type.url}" title="">
{type.icon -> f:format.raw()}
{type.label}
</a>
</f:for>
</div>
</div>
</div>
</f:then>
<f:else if="{recordTypeGroupIdentifier} == 'pages'">
<typo3-backend-new-page-wizard-button class="list-group-item list-group-item-action"
configuration="{recordTypeItem.wizardConfiguration -> f:format.json()}"
data-page-create="{recordTypeTable}"
>
{recordTypeItem.icon -> f:format.raw()}
{recordTypeItem.label}
</typo3-backend-new-page-wizard-button>
</f:else>
<f:else>
<a class="list-group-item list-group-item-action" href="{recordTypeItem.url}">
{recordTypeItem.icon -> f:format.raw()}
{recordTypeItem.label}
</a>
</f:else>
</f:if>
</f:for>
</div>
</div>
</div>
</f:for>
</f:section>
</html>
@@ -0,0 +1,74 @@
<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:layout name="Page/MovePageLayout" />
<f:section name="Content">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:headline" arguments="{0: element.recordTitle, 1: element.record.uid}" />
</h2>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:currentPath" /> {element.recordPath}</p>
<input type="hidden" name="elementRecordTitle" id="elementRecordTitle" value="{element.recordTitle}" />
<div class="form-row">
<div class="form-check form-switch">
<input type="checkbox" name="makeCopy" id="makeCopy" value="1" {f:if(condition: makeCopyChecked, then: 'checked')} class="form-check-input">
<label for="makeCopy" class="form-check-label"><f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:makeCopy" /></label>
</div>
</div>
<div class="page-position">
<f:if condition="{hasEditPermissions} && {isDifferentPage}">
<div class="page-position-control page-position-control-top">
<button data-action="paste" data-position="{positions.above}" class="btn btn-default" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:action.pasteAbove')}">
<typo3-backend-icon identifier="apps-pagetree-drag-move-above" size="small"></typo3-backend-icon>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:action.pasteAbove" />
</button>
</div>
</f:if>
<f:if condition="{isDifferentPage}">
<f:then>
<div class="page-position-target">
<div class="page-position-target-abstract">
<span title="{target.recordTooltip}"><core:iconForRecord table="pages" row="{target.record}" /></span>
<strong>{target.recordTitle} [{target.record.uid}]</strong>
</div>
<div class="page-position-target-meta">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.path" />: {target.recordPath}
</div>
</div>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:samePageConflict" arguments="{0: target.recordTitle, 1: target.record.uid}" />
</f:be.infobox>
</f:else>
</f:if>
<f:if condition="{hasEditPermissions} && {isDifferentPage}">
<f:if condition="!{targetHasSubpages}">
<div class="page-position-control page-position-control-right">
<button data-action="paste" data-position="{positions.inside}" class="btn btn-default" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:action.pasteInto')}">
<typo3-backend-icon identifier="apps-pagetree-drag-move-between" size="small"></typo3-backend-icon>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:action.pasteInto" />
</button>
</div>
</f:if>
<div class="page-position-control page-position-control-bottom">
<button data-action="paste" data-position="{positions.below}" class="btn btn-default" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:action.pasteBelow')}">
<typo3-backend-icon identifier="apps-pagetree-drag-move-below" size="small"></typo3-backend-icon>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Wizards/move_page.xlf:action.pasteBelow" />
</button>
</div>
</f:if>
</div>
</f:section>
</html>
@@ -0,0 +1,282 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/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/new-multiple-pages.js"/>
<h1>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:title" />
</h1>
<f:if condition="!{canCreateNew}">
<f:then>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:canNotCreateNew.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:canNotCreateNew.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
</f:then>
<f:else>
<f:if condition="{hasNewPagesData}">
<f:then>
<f:if condition="{pagesCreated}">
<f:then>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:pagesCreated.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:pagesCreated.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:noPagesCreated.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:noPagesCreated.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}"
/>
</f:else>
</f:if>
<f:if condition="{visiblePages}">
<h2 class="mt-4">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:newSubPages"/>
</h2>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:newSubPages.pageTitle" /></th>
<th></th>
</tr>
</thead>
<tbody>
<f:for each="{visiblePages}" as="page" iteration="pageIterator">
<tr>
<td>
<span class="treeline-icon treeline-icon-join{f:if(condition: '{pageIterator.isLast}', then: 'bottom')}"></span>
<span title="id={page.uid}"><f:spaceless>
<button type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{page.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="pages" row="{page}" />
</button>
{page.title -> f:format.crop(maxCharacters: maxTitleLength)}
</f:spaceless></span>
</td>
<td class="col-control">
<div class="btn-group">
<be:link.editRecord
table="pages"
uid="{page.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}"
class="btn btn-default"
>
<core:icon identifier="actions-page-open" />
</be:link.editRecord>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
</f:then>
<f:else>
<f:if condition="{pageTypes->f:count()} === 0">
<f:then>
<f:asset.module identifier="@typo3/backend/page-wizard/new-page-wizard-button.js"/>
<f:be.infobox
title="{f:translate(key: 'multiplePagesCanNotBeCreated.title', domain: 'backend.pages_new')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
<p>
<f:translate key="multiplePagesCanNotBeCreated.message" domain="backend.pages_new"/>
</p>
<typo3-backend-new-page-wizard-button
class="btn btn-secondary"
configuration="{wizardConfiguration -> f:format.json()}"
data-page-create="inside"
>
<f:translate key="multiplePagesCanNotBeCreated.buttonLabel" domain="backend.pages_new"/>
</typo3-backend-new-page-wizard-button>
</f:be.infobox>
</f:then>
<f:else>
<f:if condition="{filteredTypes->f:count()} > 0">
<f:asset.module identifier="@typo3/backend/page-wizard/new-page-wizard-button.js"/>
<f:be.infobox
title="{f:translate(key: 'availablePageTypesHaveBeenFiltered.title', domain: 'backend.pages_new')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
<p>
<f:translate key="availablePageTypesHaveBeenFiltered.message" domain="backend.pages_new"/>
<f:for each="{filteredTypes}" as="label" iteration="i"><f:if condition="{i.isFirst}"><f:else>, </f:else></f:if>{label}</f:for>
</p>
<typo3-backend-new-page-wizard-button
class="btn btn-secondary"
configuration="{wizardConfiguration -> f:format.json()}"
data-page-create="inside"
>
<f:translate key="availablePageTypesHaveBeenFiltered.buttonLabel" domain="backend.pages_new"/>
</typo3-backend-new-page-wizard-button>
</f:be.infobox>
</f:if>
<div class="t3js-newmultiplepages-newlinetemplate" style="display:none">
<f:render section="FormLine" arguments="{line: {index: '[0]', label: '[1]', pageTypes: '{pageTypes}'}}" />
</div>
<form action="{be:moduleLink(route:'pages_new', arguments:'{id:pageUid}')}" method="post">
<div class="form-group t3js-newmultiplepages-container">
<f:render section="FormLine" arguments="{line: {index: '0', label: '1', pageTypes: '{pageTypes}'}}" />
<f:render section="FormLine" arguments="{line: {index: '1', label: '2', pageTypes: '{pageTypes}'}}" />
<f:render section="FormLine" arguments="{line: {index: '2', label: '3', pageTypes: '{pageTypes}'}}" />
<f:render section="FormLine" arguments="{line: {index: '3', label: '4', pageTypes: '{pageTypes}'}}" />
<f:render section="FormLine" arguments="{line: {index: '4', label: '5', pageTypes: '{pageTypes}'}}" />
</div>
<div class="form-group">
<input
class="btn btn-default t3js-newmultiplepages-createnewfields"
type="button"
value="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:addMoreLines')}"
/>
</div>
<div class="form-group">
<div class="formengine-field-item">
<div class="form-wizards-wrap">
<div class="form-wizards-item-element">
<div class="form-check form-check-type-icon-toggle">
<input type="checkbox" class="form-check-input" name="createInListEnd" id="createInListEnd" value="1" />
<label for="createInListEnd" class="form-check-label">
<span class="form-check-label-icon">
<span class="form-check-label-icon-checked">
<core:icon identifier="actions-check" size="small" alternativeMarkupIdentifier="inline" />
</span>
<span class="form-check-label-icon-unchecked">
<core:icon identifier="miscellaneous-placeholder" size="small" alternativeMarkupIdentifier="inline" />
</span>
</span>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:listEnd" />
</label>
</div>
<div class="form-check form-check-type-icon-toggle">
<input type="checkbox" class="form-check-input" name="hidePages" id="hidePages" value="1" />
<label for="hidePages" class="form-check-label">
<span class="form-check-label-icon">
<span class="form-check-label-icon-checked">
<core:icon identifier="actions-check" size="small" alternativeMarkupIdentifier="inline" />
</span>
<span class="form-check-label-icon-unchecked">
<core:icon identifier="miscellaneous-placeholder" size="small" alternativeMarkupIdentifier="inline" />
</span>
</span>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:hidePages" />
</label>
</div>
<div class="form-check form-check-type-icon-toggle">
<input type="checkbox" class="form-check-input" name="hidePagesInMenus" id="hidePagesInMenus" value="1" />
<label for="hidePagesInMenus" class="form-check-label">
<span class="form-check-label-icon">
<span class="form-check-label-icon-checked">
<core:icon identifier="actions-check" size="small" alternativeMarkupIdentifier="inline" />
</span>
<span class="form-check-label-icon-unchecked">
<core:icon identifier="miscellaneous-placeholder" size="small" alternativeMarkupIdentifier="inline" />
</span>
</span>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:hidePagesInMenus" />
</label>
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<input
class="btn btn-primary"
type="submit"
name="create"
value="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:create')}"
/>
<input
class="btn btn-default t3js-newmultiplepages-reset-fields"
type="reset"
value="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:reset')}"
/>
</div>
</form>
</f:else>
</f:if>
</f:else>
</f:if>
</f:else>
</f:if>
</f:section>
<f:section name="FormLine">
<fieldset class="form-section" id="form-line-{line.index}">
<div class="row">
<div class="form-group col-8">
<label class="form-label" for="page_new_{line.index}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_new.xlf:newPage"/> {line.label}
</label>
<div class="formengine-field-item t3js-formengine-field-item">
<div class="form-control-wrap">
<div class="form-wizards-wrap">
<input
class="form-control t3js-newmultiplepages-page-title"
type="text"
id="page_new_{line.index}"
name="pages[NEW{line.index}][title]"
placeholder="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.title')}"
/>
</div>
</div>
</div>
</div>
<div class="form-group col-4">
<label class="form-label" for="page_new_select_{line.index}">
<f:translate key="doktype" domain="core.db.pages"/>
</label>
<div class="formengine-field-item t3js-formengine-field-item">
<div class="form-control-wrap">
<div class="form-wizards-wrap">
<div class="form-wizards-item-element">
<div class="input-group">
<span class="input-group-text input-group-icon" id="page_new_icon_{line.index}">
<core:iconForRecord table="pages" row="{id: '0'}" />
</span>
<select id="page_new_select_{line.index}" class="form-select t3js-newmultiplepages-select-doktype" name="pages[NEW{line.index}][doktype]" data-target="#page_new_icon_{line.index}">
<f:for each="{line.pageTypes}" as="typegroup" key="group">
<optgroup label="{group}">
<f:for each="{typegroup}" as="type">
<option data-icon='{core:icon(identifier: type.icon)}' value="{type.value}">{f:translate(key: type.label, default: type.label)}</option>
</f:for>
</optgroup>
</f:for>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</f:section>
</html>
@@ -0,0 +1,163 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/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/modal.js"/>
<h1>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:title" />
</h1>
<f:if condition="{isInWorkspace}">
<f:then>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:notAvailableInWorkspace.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:notAvailableInWorkspace.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}"
/>
</f:then>
<f:else>
<f:if condition="{subPages}">
<f:then>
<f:if condition="{hasInvisiblePage}">
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:hasInvisiblePage.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:hasInvisiblePage.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
</f:if>
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:currentPageOrder" />
</h2>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:fieldTitle" />
</th>
<th>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:fieldSubtitle" />
</th>
<th>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:fieldNavTitle" />
</th>
<th>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:fieldTstamp" />
</th>
<th>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:fieldCrdate" />
</th>
</tr>
</thead>
<f:for each="{subPages}" as="page">
<tr>
<td class="text-nowrap">
<core:iconForRecord table="pages" row="{page.record}" />
<f:if condition="!{page.canEdit}">
<span title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:noEditPermissions')}">
<core:icon identifier="status-status-permission-denied" />
</span>
</f:if>
{page.record.title -> f:format.crop(maxCharacters: maxTitleLength)}
</td>
<td class="text-nowrap">
{page.record.subtitle -> f:format.crop(maxCharacters: maxTitleLength)}
</td>
<td class="text-nowrap">
{page.record.nav_title -> f:format.crop(maxCharacters: maxTitleLength)}
</td>
<td class="text-nowrap">
<f:format.date format="{dateFormat} {timeFormat}">{page.record.tstamp}</f:format.date>
</td>
<td class="text-nowrap">
<f:format.date format="{dateFormat} {timeFormat}">{page.record.crdate}</f:format.date>
</td>
</tr>
</f:for>
</table>
</div>
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrder"/>
</h2>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'pages_sort', arguments:'{id:parentPageUid, newSortBy:\'title\'}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:pleaseConfirm')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderConfirm')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderByTitle" />
</a>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'pages_sort', arguments:'{id:parentPageUid, newSortBy:\'subtitle\'}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:pleaseConfirm')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderConfirm')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderBySubtitle" />
</a>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'pages_sort', arguments:'{id:parentPageUid, newSortBy:\'nav_title\'}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:pleaseConfirm')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderConfirm')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderByNavtitle" />
</a>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'pages_sort', arguments:'{id:parentPageUid, newSortBy:\'tstamp\'}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:pleaseConfirm')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderConfirm')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderByTstamp" />
</a>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'pages_sort', arguments:'{id:parentPageUid, newSortBy:\'create\'}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:pleaseConfirm')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderConfirm')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderByCreate" />
</a>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'pages_sort', arguments:'{id:parentPageUid, newSortBy:\'reverseCurrentSorting\'}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:pleaseConfirm')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderConfirm')}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:changeOrderReverse" />
</a>
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:noSubpages.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:noSubpages.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
</f:else>
</f:if>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,11 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:be.infobox
title="{error.title}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}"
>
{error.message}
</f:be.infobox>
</html>
@@ -0,0 +1,9 @@
{namespace be=TYPO3\CMS\Backend\ViewHelpers}
<f:if condition="{context.drawingConfiguration.languageComparisonMode}">
<f:then>
<f:render partial="PageLayout/LanguageColumns" arguments="{_all}" />
</f:then>
<f:else>
<f:render partial="PageLayout/Grid" arguments="{_all}" />
</f:else>
</f:if>
@@ -0,0 +1,57 @@
<html
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/backend/clear-cache.js"/>
<f:asset.module identifier="@typo3/backend/new-content-element-wizard-button.js"/>
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/localization.js"/>
<f:asset.module identifier="@typo3/backend/layout-module/drag-drop.js"/>
<f:asset.module identifier="@typo3/backend/layout-module/velocity-scroll.js"/>
<f:asset.module identifier="@typo3/backend/layout-module/page-layout.js"/>
<f:asset.module identifier="@typo3/backend/modal.js"/>
<f:asset.module identifier="@typo3/backend/element/editable-page-title.js"/>
<f:asset.module identifier="@typo3/backend/element/contextual-record-edit-trigger.js"/>
<f:asset.module identifier="@typo3/backend/element/qrcode-modal-button.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:variable name="immediateActionArgs" value="{0: 'web', 1: pageId}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{immediateActionArgs -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<f:if condition="!{pageLayoutContext.drawingConfiguration.languageComparisonMode}">
<typo3-backend-editable-page-title
pageTitle="{localizedPageTitle}"
pageId="{pageId}"
localizedPageId="{localizedPageId}"
{isPageEditable ? 'editable' : ''}
>
{localizedPageTitle}
</typo3-backend-editable-page-title>
</f:if>
<f:for each="{infoBoxes}" as="infoBox">
<f:be.infobox state="{infoBox.state}">
<f:format.raw>{infoBox.message}</f:format.raw>
</f:be.infobox>
</f:for>
<f:format.raw>{eventContentHtmlTop}</f:format.raw>
<form action="{f:be.uri(route:'web_layout', parameters:'{id: pageId}')}" id="PageLayoutController" method="post">
<f:format.raw>{mainContentHtml}</f:format.raw>
</form>
<f:format.raw>{eventContentHtmlBottom}</f:format.raw>
</f:section>
</html>
@@ -0,0 +1,24 @@
<html
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/backend/element/immediate-action-element.js"/>
<f:variable name="immediateActionArgs" value="{0: 'web', 1: pageId}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{immediateActionArgs -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1>{siteName}</h1>
<f:be.infobox message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:clickAPage_content')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" />
</f:section>
</html>
@@ -0,0 +1 @@
<f:render partial="PageLayout/Grid" arguments="{_all}" />
@@ -0,0 +1,384 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module"/>
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/tree/tree-node-toggle.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-search.js"/>
<f:variable name="args" value="{0: 'web', 1: pageUid}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.headline"
arguments="{
0: '{pageTitle}'
}"
/>
</h1>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.description" /></p>
<f:render section="Options" arguments="{_all}" />
<f:comment><!-- Constants from Site settings --></f:comment>
<f:if condition="{siteSettingsAst}">
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.siteSettings" /></h2>
<div class="panel-group">
<f:render
section="TreePanel"
arguments="{
type: 'constant',
tree: siteSettingsAst,
pageUid: pageUid,
displayComments: 0
}"
/>
</div>
</f:if>
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.activePageTsConfig" /></h2>
<f:if condition="!{pageTsConfigAst.children}">
<f:then>
<f:be.infobox
message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.noPageTSconfigAvailable')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
</f:then>
<f:else>
<div class="panel-group">
<f:if condition="{pageTsConfigConditions}">
<f:render
section="Conditions"
arguments="{
pageUid: pageUid,
conditions: pageTsConfigConditions,
conditionActiveCount: pageTsConfigConditionsActiveCount,
displayConstantSubstitutions: displayConstantSubstitutions
}"
/>
</f:if>
<f:render
section="TreePanel"
arguments="{
type: 'setup',
tree: pageTsConfigAst,
pageUid: pageUid,
displayComments: displayComments,
displayConstantSubstitutions: displayConstantSubstitutions
}"
/>
</div>
</f:else>
</f:if>
</f:section>
<f:section name="Options">
<div class="form-row-md align-items-md-end">
<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"
id="searchValue"
name="searchValue"
data-persist-collapse-search-key="collapse-search-term-pagets"
value=""
minlength="3"
/>
</div>
</form>
</div>
<div class="form-group">
<div class="form-row-md">
<f:if condition="{siteSettingsAst}">
<div class="form-group">
<form action="{f:be.uri(route: 'pagetsconfig_active', parameters: '{id: pageUid}')}" method="post">
<input type="hidden" name="displayConstantSubstitutions" value="0" />
<div class="form-check form-switch form-check-size-input">
<input
type="checkbox"
class="form-check-input"
name="displayConstantSubstitutions"
id="displayConstantSubstitutions"
value="1"
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='displayConstantSubstitutions']"
{f:if(condition: displayConstantSubstitutions, then: 'checked="checked"')}
/>
<label class="form-check-label" for="displayConstantSubstitutions">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.displayConstantSubstitutions" />
</label>
</div>
</form>
</div>
</f:if>
<div class="form-group">
<form action="{f:be.uri(route: 'pagetsconfig_active', parameters: '{id: pageUid}')}" method="post">
<input type="hidden" name="displayComments" value="0" />
<div class="form-check form-switch form-check-size-input">
<input
type="checkbox"
class="form-check-input"
name="displayComments"
id="displayComments"
value="1"
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='displayComments']"
{f:if(condition: displayComments, then: 'checked="checked"')}
/>
<label class="form-check-label" for="displayComments">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.displayComments" />
</label>
</div>
</form>
</div>
<div class="form-group">
<form action="{f:be.uri(route: 'pagetsconfig_active', parameters: '{id: pageUid}')}" method="post">
<input type="hidden" name="sortAlphabetically" value="0" />
<div class="form-check form-switch form-check-size-input">
<input
type="checkbox"
class="form-check-input"
name="sortAlphabetically"
id="sortAlphabetically"
value="1"
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='sortAlphabetically']"
{f:if(condition: sortAlphabetically, then: 'checked="checked"')}
/>
<label class="form-check-label" for="sortAlphabetically">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.sortAlphabetically" />
</label>
</div>
</form>
</div>
</div>
</div>
</div>
</f:section>
<f:section name="Conditions">
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="pagetsconfig-active-conditions-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#pagetsconfig-active-conditions-body"
aria-controls="pagetsconfig-active-conditions-body"
aria-expanded="false"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.panel.header.conditions"/></strong>
</div>
<f:if condition="{conditionActiveCount}">
<div class="panel-badge">
<span class="badge badge-info">
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.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="pagetsconfig-active-conditions-body"
data-persist-collapse-state="true"
data-persist-collapse-state-if-state="shown"
role="tabpanel"
aria-labelledby="pagetsconfig-active-conditions-heading"
>
<div class="panel-body">
<form action="{f:be.uri(route: 'pagetsconfig_active', parameters: '{id: pageUid}')}" method="post">
<f:for each="{conditions}" as="condition">
<input type="hidden" name="pageTsConfigConditions[{condition.hash}]" value="0" />
<div class="form-check form-switch">
<input
type="checkbox"
class="form-check-input"
id="condition{condition.hash}"
name="pageTsConfigConditions[{condition.hash}]"
value="1"
data-global-event="change"
data-action-submit="$form"
data-value-selector="input[name='pageTsConfigConditions[{condition.hash}]']"
{f:if(condition: condition.active, then: 'checked="checked"')}
/>
<label class="form-check-label" for="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:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.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:section>
<f:section name="TreePanel">
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="pagetsconfig-active-{type}-ast-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#pagetsconfig-active-{type}-ast-body"
aria-controls="pagetsconfig-active-{type}-ast-body"
aria-expanded="false"
id="panel-tree-heading-{type}"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.panel.header.configuration"/></strong>
</div>
<div class="panel-heading-badge">
<span class="badge badge-success hidden t3js-collapse-states-search-numberOfSearchMatches"></span>
</div>
<span class="caret"></span>
</button>
</div>
</h3>
<div
id="pagetsconfig-active-{type}-ast-body"
class="panel-collapse collapse"
data-persist-collapse-state="true"
data-persist-collapse-state-if-state="shown"
aria-labelledby="pagetsconfig-active-{type}-ast-heading"
role="tabpanel"
>
<div class="panel-body panel-body-overflow t3js-collapse-states-search-tree">
<ul class="treelist">
<f:render
section="Tree"
arguments="{
type: type,
tree: tree,
pageUid: pageUid,
displayConstantSubstitutions: displayConstantSubstitutions,
displayComments: displayComments
}"
/>
</ul>
</div>
</div>
</div>
</f:section>
<f:section name="Tree">
<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:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_active.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">{child.name}</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="pagets-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
section="Tree"
arguments="{
type: type,
tree: child,
pageUid: pageUid,
displayConstantSubstitutions: displayConstantSubstitutions,
displayComments: displayComments
}"
/>
</ul>
</div>
</f:if>
</li>
</f:for>
</f:section>
</html>
@@ -0,0 +1,264 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module"/>
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/tree/tree-node-toggle.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:asset.module identifier="@typo3/backend/pagetsconfig/pagetsconfig-includes.js"/>
<f:variable name="args" value="{0: 'web', 1: pageUid}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.headline"
arguments="{
0: '{pageTitle}'
}"
/>
</h1>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.description" /></p>
<f:if condition="{siteSettingsTree.children}">
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.siteSettings" /></h2>
<div class="panel-group">
<f:render
section="TreePanel"
arguments="{
type: 'constants',
tree: siteSettingsTree,
pageUid: pageUid
}"
/>
</div>
</f:if>
<f:if condition="{pageTsConfigTree.children}">
<h2><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.pagetsconfig" /></h2>
<div class="panel-group">
<f:render
section="SyntaxErrors"
arguments="{
type: 'constants',
pageUid: pageUid,
errors: syntaxErrors,
errorCount: syntaxErrorCount
}"
/>
<f:render
section="TreePanel"
arguments="{
type: 'setup',
tree: pageTsConfigTree,
pageUid: pageUid
}"
/>
</div>
</f:if>
</f:section>
<f:section name="TreePanel">
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="pagetsconfig-includes-{type}-tree-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#pagetsconfig-includes-{type}-tree-body"
aria-controls="pagetsconfig-includes-{type}-tree-body"
aria-expanded="false"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.panel.header.configuration"/></strong>
</div>
<span class="caret"></span>
</button>
</div>
</h3>
<div id="pagetsconfig-includes-{type}-tree-body" class="panel-collapse collapse" data-persist-collapse-state="true" aria-labelledby="pagetsconfig-includes-{type}-tree-heading">
<div class="panel-body panel-body-overflow">
<ul class="treelist">
<f:render
section="Tree"
arguments="{
type: type,
pageUid: pageUid,
tree: tree
}"
/>
</ul>
</div>
</div>
</div>
</f:section>
<f:section name="Tree">
<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:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.tree.child.type.Segment" />
</f:then>
<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.type} != 'Segment'">
<f:then>
<span class="badge">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.tree.child.type.{child.type}" />
</span>
</f:then>
</f:if>
</div>
</div>
</div>
<div class="col col-auto text-end">
<div class="btn-group">
<f:be.link
route="pagetsconfig_includes.source"
parameters="{id: pageUid, includeType: type, identifier: child.identifier}"
additionalAttributes="{'data-modal-title': child.name}"
class="btn btn-default btn-sm t3js-pagetsconfig-includes-modal{f:if(condition:'!{child.lineStream}', then:' disabled')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.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="pagetsconfig_includes.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-pagetsconfig-includes-modal{f:if(condition:'!{child.children}', then:' disabled')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.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}">
<ul
class="treelist list-group 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"
>
<f:render
section="Tree"
arguments="{
type: type,
pageUid: pageUid,
tree: child
}"
/>
</ul>
</f:if>
</li>
</f:for>
</f:if>
</f:section>
<f:section name="SyntaxErrors">
<f:if condition="{errors}">
<div class="panel panel-default">
<h3 class="panel-heading" role="tab" id="pagetsconfig-includes-errors-heading">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#pagetsconfig-includes-errors-body"
aria-controls="pagetsconfig-includes-errors-body"
aria-expanded="false"
>
<div class="panel-title">
<strong><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.panel.header.syntaxErrors"/></strong>
</div>
<div class="panel-badge">
<span class="badge badge-warning">
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.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 id="pagetsconfig-includes-errors-body" class="panel-collapse collapse" data-persist-collapse-state="true" aria-labelledby="pagetsconfig-includes-errors-heading">
<div class="panel-body">
<f:for each="{errors}" as="error">
<div class="row justify-content-between">
<div class="col">
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.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="pagetsconfig_includes.source"
parameters="{id: pageUid, includeType: 'setup', identifier: error.include.identifier}"
additionalAttributes="{'data-modal-title': error.include.name}"
class="btn btn-default btn-sm t3js-pagetsconfig-includes-modal"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_includes.syntaxError.sourceCode')}"
>
<core:icon identifier="actions-variable" />
</f:be.link>
</div>
</div>
</div>
</f:for>
</div>
</div>
</div>
</f:if>
</f:section>
</html>
@@ -0,0 +1,76 @@
<html
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/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:variable name="args" value="{0: 'web', 1: id}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_pages.headline" />
</h1>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_pages.description" /></p>
<f:if condition="!{accessContent}">
<f:then>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig.noAccess')}" />
</f:then>
<f:else>
<f:if condition="!{overviewOfPagesUsingTSConfig}">
<f:then>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" message="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_pages.noRecords')}" />
</f:then>
<f:else>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_pages.pagetitle" /></th>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_pagetsconfig.xlf:module.pagetsconfig_pages.written_tsconfig_lines" /></th>
</tr>
</thead>
<tbody>
<f:for each="{overviewOfPagesUsingTSConfig}" as="line">
<tr>
<td class="align-top nowrap"><f:spaceless>
<span style="margin-left: {line.padding}px">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{line.title}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<span title="id={line.title}">
<f:format.raw>{line.icon}</f:format.raw>
</span>
</button>
<f:format.raw>{line.pageTitle}</f:format.raw>
</span>
</f:spaceless></td>
<td>{line.lines}</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:else>
</f:if>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,105 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<form
action="{f:be.uri(route:'record_download')}"
method="post"
id="downloadSettingsForm"
>
<h1 class="h3"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.generalSettings"/></h1>
<div class="form-row">
<div class="form-group">
<label class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.columnsToDownload"/>
</label>
<div class="form-description">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.default"
arguments="{0: '{f:translate(key: \'LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.selectedColumns\')}'}"/>
</div>
<div class="form-check form-switch">
<input type="checkbox" class="form-check-input" name="allColumns" value="1" data-empty-value="0" id="allColumns">
<label class="form-check-label" for="allColumns">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.allColumns"/>
</label>
</div>
</div>
<div class="form-group">
<label class="form-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.valueFormat"/>
</label>
<div class="form-description">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.default"
arguments="{0: '{f:translate(key: \'LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.processedValues\')}'}"/>
</div>
<div class="form-check form-switch">
<input type="checkbox" class="form-check-input" name="rawValues" value="1" data-empty-value="0" id="rawValues"/>
<label class="form-check-label" for="rawValues">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.rawValues"/>
</label>
</div>
</div>
<f:if condition="{presets}">
<div class="form-group">
<label class="form-label d-block" for="preset">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.preset"/>
</label>
<select id="preset" name="preset" class="form-select d-block">
<option value=""></option>
<f:for each="{presets}" as="preset">
<option value="{preset.identifier}" title="{f:translate(key: preset.label, default: preset.label)}">{f:translate(key: preset.label, default: preset.label)}</option>
</f:for>
</select>
</div>
</f:if>
<div class="form-group">
<label class="form-label" for="filename">
<strong><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.filename"/></strong>
</label>
<input type="text" id="filename" placeholder="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.filename.placeholder', arguments: '{0: table}')}" class="form-control" name="filename" size="30">
</div>
<div class="form-group">
<label class="form-label" for="format">
<strong><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.format"/></strong>
</label>
<select class="form-select t3js-record-download-format-selector" id="format" name="format">
<f:for each="{formats}" as="format" iteration="i">
<option value="{format}" {f:if(condition: i.isFirst, then: 'selected')}><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.format.{format}"/></option>
</f:for>
</select>
</div>
</div>
<f:if condition="{formatOptions}">
<f:for each="{formatOptions}" key="formatName" as="format" iteration="i">
<div class="{f:if(condition: '!{i.isFirst}', then: 'hide')} t3js-record-download-format-option" data-formatName="{formatName}">
<h2 class="h3 headline-spaced"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.formatOptions.{formatName}"/></h2>
<div class="form-row mb-0">
<f:for each="{format.options}" key="formatOptionName" as="formatOption">
<div class="form-group">
<label class="form-label" for="{formatName}-{formatOptionName}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.formatOptions.{formatName}.{formatOptionName}"/>
</label>
<select class="form-select" id="{formatName}-{formatOptionName}" name="{formatName}[{formatOptionName}]">
<f:for each="{formatOption}" key="optionName" as="option">
<option value="{option}" {f:if(condition: '{format.defaults.{formatOptionName}} == {option}', then: 'selected')}>{option} ({f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_download.xlf:downloadSettings.formatOptions.{formatName}.{formatOptionName}.{optionName}')})</option>
</f:for>
</select>
</div>
</f:for>
</div>
</div>
</f:for>
</f:if>
<input type="hidden" name="table" value="{downloadArguments.table}"/>
<input type="hidden" name="id" value="{downloadArguments.id}"/>
<input type="hidden" name="searchString" value="{downloadArguments.searchString}"/>
<input type="hidden" name="searchLevels" value="{downloadArguments.searchLevels}"/>
<input type="hidden" name="sortField" value="{downloadArguments.sortField}"/>
<input type="hidden" name="sortRev" value="{downloadArguments.sortRev}"/>
</form>
</html>
@@ -0,0 +1,25 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1>
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:title')}
<f:if condition="{recordTable}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:headline.titleOf" />
{recordTableReadable} "{recordTitle}"
</f:if>
</h1>
<f:render partial="RecordHistory/Settings" arguments="{_all}" />
<f:if condition="{showDifferences}">
<f:render partial="RecordHistory/MultipleDiff" arguments="{_all}" />
</f:if>
<f:render partial="RecordHistory/History" arguments="{_all}" />
</f:section>
</html>
@@ -0,0 +1,47 @@
<html
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/backend/recordlist.js"/>
<f:asset.module identifier="@typo3/backend/record-download-button.js"/>
<f:asset.module identifier="@typo3/backend/clear-cache.js"/>
<f:asset.module identifier="@typo3/backend/record-search.js"/>
<f:asset.module identifier="@typo3/backend/ajax-data-handler.js"/>
<f:asset.module identifier="@typo3/backend/column-selector-button.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-delete-action.js"/>
<f:asset.module identifier="@typo3/backend/clipboard-panel.js"/>
<f:asset.module identifier="@typo3/backend/new-content-element-wizard-button.js"/>
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/localization.js"/>
<f:asset.module identifier="@typo3/backend/element/editable-page-title.js"/>
<f:asset.module identifier="@typo3/backend/page-wizard/new-page-wizard-button.js"/>
<f:variable name="immediateActionArgs" value="{0: 'web', 1: pageId}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{immediateActionArgs -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<typo3-backend-editable-page-title
pageTitle="{pageTitle}"
pageId="{pageId}"
{isPageEditable ? 'editable' : ''}
>
{pageTitle}
</typo3-backend-editable-page-title>
<f:format.raw>{additionalContentTop}</f:format.raw>
<f:format.raw>{searchBoxHtml}</f:format.raw>
<f:format.raw>{pageTranslationsHtml}</f:format.raw>
<f:format.raw>{tableListHtml}</f:format.raw>
<f:format.raw>{clipboardHtml}</f:format.raw>
<f:format.raw>{additionalContentBottom}</f:format.raw>
</f:section>
</html>
@@ -0,0 +1,41 @@
<div class="recordsearchbox-container" data-recordsearchbox-container>
<form action="{formUrl}" method="post">
<div class="input-group">
<label for="recordsearchbox-searchterm" class="visually-hidden">
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.label.searchString"/>
</label>
<input
data-recordsearchbox-input
class="form-control"
type="search"
autocomplete="off"
placeholder="{f:translate(id:'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.enterSearchString')}"
title="{f:translate(id: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.title.searchString')}"
name="searchTerm"
id="recordsearchbox-searchterm"
value="{searchString}"
/>
<f:if condition="{availableSearchLevels -> f:count()} > 0">
<label for="search_levels" class="visually-hidden">
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.label.search_levels" />
</label>
<select
data-recordsearchbox-levels
class="form-select"
name="search_levels"
title="{f:translate(id: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.title.search_levels')}"
id="search_levels"
>
<f:for each="{availableSearchLevels}" as="searchLevel" key="level">
<option {f:if(condition: '{level} == {selectedSearchLevel}', then: ' selected="selected"')} value="{level}">
<f:translate id="LLL:{searchLevel}">{searchLevel}</f:translate>
</option>
</f:for>
</select>
</f:if>
<button data-recordsearchbox-submit 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>
</form>
</div>
@@ -0,0 +1,76 @@
<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:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/security/element/csp-reports.js"/>
</f:section>
<f:section name="Content">
<h1><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.headline" /></h1>
<p>
<f:if condition="{extLowlevelAvailable}">
<f:then>
<f:variable name="moduleLink">
<f:be.link route="system_config" parameters="{tree: 'contentSecurityPolicyMutations'}"><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.introtext.moduleName" /></f:be.link>
</f:variable>
<f:sanitize.html>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.introtext"
arguments="{0: '{moduleLink}'}" />
</f:sanitize.html>
</f:then>
<f:else>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.introtextLowlevelMissing"
arguments="{0: '{f:translate(key:\'LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.introtext.moduleName\')}'}" />
</f:else>
</f:if>
</p>
<f:if condition="{configurationStatus.featureDisabled.backend} || {configurationStatus.featureDisabled.frontend}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.callout.featureDisabled.title')}"
>
<p>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.callout.featureDisabled.message" />
</p>
<ul class="mb-0">
<f:for each="{configurationStatus.featureDisabled}" as="dispositions" key="scope">
<f:for each="{dispositions}" as="disposition" iteration="iteration">
<li><code>security.{scope}.{disposition}ContentSecurityPolicy</code></li>
</f:for>
</f:for>
</ul>
</f:be.infobox>
</f:if>
<f:if condition="{configurationStatus.customReporting.BE} || {configurationStatus.customReporting.FE}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.callout.customReporting.title')}"
>
<p>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/content-security-policy.xlf:module.callout.customReporting.message" />
</p>
<ul class="mb-0">
<f:for each="{configurationStatus.customReporting}" as="value" key="key">
<li><code>$GLOBALS['TYPO3_CONF_VARS']['{key}']['contentSecurityPolicyReportingUrl'] = '{value}'</code></li>
</f:for>
</ul>
</f:be.infobox>
</f:if>
<typo3-backend-security-csp-reports
scopes="{scopes -> f:format.json()}"
controlUri="{controlUri}">
</typo3-backend-security-csp-reports>
</f:section>
</html>
@@ -0,0 +1,32 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1>
<f:translate domain="backend.user_profile" key="user_settings" />
</h1>
<form
action="{f:be.uri(route: 'user_setup')}"
method="post"
id="SetupModuleController"
name="editform"
enctype="multipart/form-data"
spellcheck="false"
>
<f:format.raw>{formEngineHtml}</f:format.raw>
<div>
<input type="hidden" name="formToken" value="{formToken}" />
<input type="hidden" value="1" name="data[save]" />
<input type="hidden" name="data[setValuesToDefault]" value="0" id="setValuesToDefault" />
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,577 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:asset.module identifier="@typo3/backend/tree/tree-node-toggle.js"/>
<f:variable name="args" value="{0: 'site', 1: page.uid}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<f:if condition="{site.identifier}">
<h1>
<f:if condition="{page}">
<f:then>
<f:translate
key="detail.headline_with_page_title"
domain="backend.siteconfiguration"
arguments="{
0: '{page.title}'
}"
/>
</f:then>
<f:else>
<f:translate
key="detail.headline_with_site_identifier"
domain="backend.siteconfiguration"
arguments="{
0: '{site.identifier}'
}"
/>
</f:else>
</f:if>
</h1>
<f:if condition="{site.sets -> f:count()} && {site.invalidSets}">
<f:render partial="SiteManagement/InvalidSets" arguments="{site: site, renderMode: 'infobox'}" />
</f:if>
<h2>
<f:translate key="detail.site_configuration.headline" domain="backend.siteconfiguration" />
</h2>
<f:comment><!-- Languages --></f:comment>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#languages-collapse"
aria-controls="languages-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.languages" domain="backend.siteconfiguration"/>
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="languages-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table table-hover table-vertical-top">
<thead>
<tr>
<th class="col-50" colspan="2">
<f:translate key="detail.site_configuration.languages.language" domain="backend.siteconfiguration" />
</th>
<th class="col-50 col-word-break">
<f:translate key="detail.site_configuration.languages.language_url" domain="backend.siteconfiguration" />
</th>
</tr>
</thead>
<tbody>
<f:for each="{site.languages}" as="language">
<tr>
<td class="col-icon">
<f:if condition="{language.enabled}">
<f:then>
<core:icon identifier="{language.flagIdentifier}" />
</f:then>
<f:else>
<core:icon identifier="{language.flagIdentifier}" overlay="overlay-hidden" />
</f:else>
</f:if>
</td>
<td>
<f:if condition="{language.enabled}">
<f:then>
{language.title} <code>[{language.languageId}]</code>
</f:then>
<f:else>
<span class="text-body-secondary">
{language.title} (<f:translate key="disabled" domain="core.common">disabled</f:translate>)
<code>[{language.languageId}]</code>
</span>
</f:else>
</f:if>
</td>
<td>
<a href="{language.base}" target="_blank">{language.base}</a>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</div>
</div>
<f:comment><!-- Error handling --></f:comment>
<f:if condition="{site.configuration.errorHandling -> f:count()} > 0">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#error-handling-collapse"
aria-controls="error-handling-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.error_handling" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="error-handling-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{site.configuration.errorHandling}" as="errorHandling">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.{errorHandling.errorCode}" />
</span>
</span>
<ul class="treelist">
<f:switch expression="{errorHandling.errorHandler}">
<f:case value="Fluid">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.errorFluidTemplate', domain:'backend.siteconfiguration_tca')}"/>
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.errorFluidTemplate}'
}"
/>
</f:case>
<f:case value="Page">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.errorContentSource', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.errorContentSource}'
}"
/>
</f:case>
<f:case value="PHP">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.errorPhpClassFQCN', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.errorPhpClassFQCN}'
}"
/>
</f:case>
<f:case value="LoginRedirect">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.loginRedirectTarget', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.loginRedirectTarget}'
}"
/>
<f:variable name="label" value="{f:translate(key:'site_errorhandling.loginRedirectParameter', domain:'backend.siteconfiguration_tca')}" />
<f:variable name="value" value="{f:translate(key:'site_errorhandling.loginRedirectParameter.{errorHandling.loginRedirectParameter}', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: value
}"
/>
</f:case>
</f:switch>
</ul>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="detail.site_configuration.error_handling" domain="backend.siteconfiguration" />
</div>
<div class="panel-body">
<f:translate key="detail.not_configured" domain="backend.siteconfiguration"/>
</div>
</div>
</f:else>
</f:if>
<f:comment><!-- Static routes --></f:comment>
<f:if condition="{site.configuration.routes -> f:count()} > 0">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#routes-handling-collapse"
aria-controls="routes-handling-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.static_routes" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="routes-handling-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{site.configuration.routes}" as="route">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{route.route}
</span>
</span>
<ul class="treelist">
<f:variable name="typeLabel" value="{f:translate(key:'site_route.type', domain:'backend.siteconfiguration_tca')}" />
<f:if condition="{route.type} == 'uri'">
<f:then>
<f:variable name="typeValue" value="{f:translate(key:'site_route.source', domain:'backend.siteconfiguration_tca')}" />
</f:then>
<f:else>
<f:variable name="typeValue" value="{f:translate(key:'site_route.{route.type}', domain:'backend.siteconfiguration_tca')}" />
</f:else>
</f:if>
<f:render
section="TreeItem"
arguments="{
label: typeLabel,
value: typeValue
}"
/>
<f:switch expression="{route.type}">
<f:case value="staticText">
<f:variable name="label" value="{f:translate(key:'site_route.staticText', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{route.content}'
}"
/>
</f:case>
<f:case value="uri">
<f:variable name="label" value="{f:translate(key:'site_route.source', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{route.source}'
}"
/>
</f:case>
<f:case value="asset">
<f:variable name="label" value="{f:translate(key:'site_route.asset', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{route.asset}'
}"
/>
</f:case>
</f:switch>
</ul>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="detail.site_configuration.static_routes" domain="backend.siteconfiguration" />
</div>
<div class="panel-body">
<f:translate key="detail.not_configured" domain="backend.siteconfiguration" />
</div>
</div>
</f:else>
</f:if>
<f:comment><!-- Route enhancers --></f:comment>
<f:if condition="{site.configuration.routeEnhancers -> f:count()} > 0">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#route-enhancers-collapse"
aria-controls="route-enhancers-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.route_enhancers" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="route-enhancers-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{site.configuration.routeEnhancers}" as="enhancer" key="enhancerName" iteration="enhancerIterator">
<li>
<typo3-backend-tree-node-toggle
class="treelist-control treelist-control-collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapse-enhancer-{enhancerIterator.index}"
aria-expanded="false"
></typo3-backend-tree-node-toggle>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{enhancerName}
</span>
</span>
<div class="treelist-collapse collapse" id="collapse-enhancer-{enhancerIterator.index}" data-persist-collapse-state="true" data-persist-collapse-state-suffix="site-route-enhancers" data-persist-collapse-state-if-state="shown">
<f:render section="RouteEnhancerConfig" arguments="{config: enhancer, enhancerIndex: enhancerIterator.index}" />
</div>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:if>
<h2>
<f:translate key="detail.site_settings.headline" domain="backend.siteconfiguration" />
</h2>
<f:if condition="({site.sets -> f:count()} > 0) || ({localSettings.map -> f:count()} > 0) || ({categories -> f:count()} > 0)">
<f:then>
<f:comment><!-- Show dependencies --></f:comment>
<f:if condition="{site.sets -> f:count()} > 0">
<h3>
<f:translate key="detail.site_settings.dependencies.headline" domain="backend.siteconfiguration" />
</h3>
<p>
<f:sanitize.html><f:translate key="detail.site_settings.dependencies.text" domain="backend.siteconfiguration" /></f:sanitize.html>
</p>
<ul>
<f:for each="{site.sets}" as="set" iteration="setIterator">
<li><code>{set}</code></li>
</f:for>
</ul>
</f:if>
<h3>
<f:translate key="detail.site_settings.active_settings.headline" domain="backend.siteconfiguration" />
</h3>
<f:comment><!-- Settings from site configuration --></f:comment>
<f:if condition="{localSettings.map -> f:count()} > 0">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#custom-settings-collapse"
aria-controls="custom-settings-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_settings.active_settings.custom_site_settings" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="custom-settings-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{localSettings.map}" as="setting" key="key">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{key}
</span>
<span class="treelist-operator">=</span>
<span class="treelist-value">
{setting -> f:format.json()}
</span>
</span>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:if>
<f:comment><!-- Settings from site sets --></f:comment>
<f:if condition="{categories -> f:count()} > 0">
<f:for each="{categories}" as="category">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#siteset-{category.key}-collapse"
aria-controls="siteset-{category.key}-collapse"
aria-expanded="false"
>
<div class="panel-title">
{category.label}
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="siteset-{category.key}-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<f:if condition="{category.categories -> f:count()} > 0">
<f:then>
<f:comment><!-- Grouped settings --></f:comment>
<ul class="treelist">
<f:for each="{category.categories}" as="section">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">{section.label}</span>
</span>
<f:render section="Tree" arguments="{settings: '{section.settings}'}" />
</li>
</f:for>
</ul>
</f:then>
<f:else>
<f:comment><!-- Default --></f:comment>
<f:render section="Tree" arguments="{settings: '{category.settings}'}" />
</f:else>
</f:if>
</div>
</div>
</div>
</f:for>
</f:if>
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key:'detail.site_settings.no_settings_found.title', domain:'backend.siteconfiguration')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
<f:sanitize.html><f:translate key="detail.site_settings.no_settings_found.message" domain="backend.siteconfiguration" /></f:sanitize.html>
</f:be.infobox>
</f:else>
</f:if>
</f:if>
</f:section>
<f:section name="Tree">
<ul class="treelist">
<f:for each="{settings}" as="setting">
<f:if condition="{setting.definition.label}">
<li class="loose">
<div class="treelist-comment">
<div>
# {setting.definition.label}
</div>
</div>
</li>
</f:if>
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{setting.definition.key}
</span>
<span class="treelist-operator">=</span>
<span class="treelist-value">
{setting.renderedValue}
</span>
</span>
</li>
</f:for>
</ul>
</f:section>
<f:section name="TreeItem">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{label}
</span>
<span class="treelist-operator">=</span>
<span class="treelist-value">
{value}
</span>
</span>
</li>
</f:section>
<f:section name="RouteEnhancerConfig">
<ul class="treelist">
<f:for each="{config}" as="propertyValue" key="propertyKey" iteration="propertyIterator">
<f:render section="RouteEnhancerProperty" arguments="{label: propertyKey, value: propertyValue, idPrefix: 'enhancer-{enhancerIndex}-{propertyIterator.index}'}" />
</f:for>
</ul>
</f:section>
<f:section name="RouteEnhancerProperty">
<f:if condition="{be:type.isArray(value: value)}">
<f:then>
<li>
<typo3-backend-tree-node-toggle
class="treelist-control treelist-control-collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapse-{idPrefix}"
aria-expanded="false"
></typo3-backend-tree-node-toggle>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">{label}</span>
</span>
<div class="treelist-collapse collapse" id="collapse-{idPrefix}" data-persist-collapse-state="true" data-persist-collapse-state-suffix="site-route-enhancers" data-persist-collapse-state-if-state="shown">
<ul class="treelist">
<f:for each="{value}" as="subValue" key="subKey" iteration="subIterator">
<f:render section="RouteEnhancerProperty" arguments="{label: subKey, value: subValue, idPrefix: '{idPrefix}-{subIterator.index}'}" />
</f:for>
</ul>
</div>
</li>
</f:then>
<f:else>
<f:render section="TreeItem" arguments="{label: label, value: value}" />
</f:else>
</f:if>
</f:section>
@@ -0,0 +1,32 @@
<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/modal.js"/>
<f:asset.module identifier="@typo3/backend/site-inline-actions.js"/>
<f:render partial="SiteManagement/InvalidSets" arguments="{site: site}"/>
<form
action="{f:be.uri(route:'site_configuration.save')}"
method="post"
enctype="multipart/form-data"
name="editform"
id="siteConfigurationController"
>
{formEngineHtml -> f:format.raw()}
<input type="hidden" name="returnUrl" value="{returnUrl}" />
<input type="hidden" name="closeDoc" value="0" />
<input type="hidden" name="rootPageId" value="{rootPageId}" />
</form>
</f:section>
</html>
@@ -0,0 +1,633 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/modal.js"/>
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
</f:section>
<f:section name="Content">
<h1><f:translate key="overview.title" domain="backend.siteconfiguration" /></h1>
<f:if condition="{rootPagesWithSiteConfiguration -> f:count()} || {rootPagesWithoutSiteConfiguration -> f:count()} || {unassignedSites -> f:count()}">
<f:be.infobox
title="{f:translate(key:'overview.status.title', domain:'backend.siteconfiguration')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::NOTICE')}"
>
<ul>
<f:if condition="{rootPagesWithSiteConfiguration -> f:count()}">
<li>
<f:sanitize.html>
<f:translate
key="overview.info.all_sites.{f:if(condition: '{rootPagesWithSiteConfiguration -> f:count()} === 1', then: 'single', else: 'multiple')}"
domain="backend.siteconfiguration"
arguments="{
0: '{rootPagesWithSiteConfiguration -> f:count()}'
}"
/>
</f:sanitize.html>
</li>
</f:if>
<f:if condition="{rootPagesWithoutSiteConfiguration -> f:count()}">
<li>
<f:sanitize.html>
<f:translate
key="overview.info.root_pages_without_site_sonfiguration.{f:if(condition: '{rootPagesWithoutSiteConfiguration -> f:count()} === 1', then: 'single', else: 'multiple')}"
domain="backend.siteconfiguration"
arguments="{
0: '{rootPagesWithoutSiteConfiguration -> f:count()}'
}"
/>
</f:sanitize.html>
</li>
</f:if>
<f:if condition="{unassignedSites -> f:count()}">
<li>
<f:sanitize.html>
<f:translate
key="overview.info.unassigned_sites.{f:if(condition: '{unassignedSites -> f:count()} === 1', then: 'single', else: 'multiple')}"
domain="backend.siteconfiguration"
arguments="{
0: '{unassignedSites -> f:count()}'
}"
/>
</f:sanitize.html>
</li>
</f:if>
</ul>
</f:be.infobox>
</f:if>
<h2><f:translate key="overview.root_pages_without_site_configuration.title" domain="backend.siteconfiguration" /></h2>
<f:if condition="!{rootPagesWithSiteConfiguration} && !{rootPagesWithoutSiteConfiguration}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.noPages.title')}"
>
<p>
<f:translate key="overview.noPages.message" domain="backend.siteconfiguration" />
</p>
<p>
<be:link.documentation identifier="t3start:create-root-page" class="btn btn-default">
<f:translate key="overview.noPages.link.label" domain="backend.siteconfiguration" />
</be:link.documentation>
</p>
</f:be.infobox>
</f:if>
<f:if condition="{rootPagesWithSiteConfiguration}">
<f:then>
<f:if condition="{duplicatedRootPages}">
<f:be.infobox title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.duplicatedRootPage')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}">
<ul>
<f:for each="{duplicatedRootPages}" key="rootPage" as="duplicateSites">
<li>
<strong>
<f:translate key="overview.duplicatedRootPage.message" domain="backend.siteconfiguration" arguments="{0: rootPage}" />
</strong>
<f:if condition="{duplicateSites}">
<ul>
<f:for each="{duplicateSites}" as="duplicateSite">
<li>{duplicateSite}</li>
</f:for>
</ul>
</f:if>
</li>
</f:for>
</ul>
</f:be.infobox>
</f:if>
<f:if condition="{duplicatedEntryPoints}">
<f:be.infobox title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.duplicatedEntryPoints')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}">
<f:translate key="overview.duplicatedEntryPoints.listing" domain="backend.siteconfiguration" />
<ul>
<f:for each="{duplicatedEntryPoints}" key="item" as="schemes">
<li>
<strong>{item}</strong>
<f:if condition="{schemes}">
<ul>
<f:for each="{schemes}" key="schema" as="count">
<li>{schema} ({count})</li>
</f:for>
</ul>
</f:if>
</li>
</f:for>
</ul>
</f:be.infobox>
</f:if>
<f:render section="{viewMode.value}" arguments="{_all}" />
</f:then>
<f:else if="{rootPagesWithoutSiteConfiguration}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.no_sites_with_site_configuration.title')}"
>
<p>
<f:translate key="overview.no_sites_with_site_configuration.message" domain="backend.siteconfiguration" />
</p>
</f:be.infobox>
</f:else>
</f:if>
<f:if condition="{rootPagesWithoutSiteConfiguration}">
<h2>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.rootPagesWithoutSiteConfiguration.title')}</h2>
<p>
<f:translate key="overview.rootPagesWithoutSiteConfiguration.description" domain="backend.siteconfiguration" />
</p>
<div class="table-fit">
<table class="table table-striped">
<thead>
<tr>
<th colspan="2" class="nowrap"><f:translate key="overview.site" domain="backend.siteconfiguration" /></th>
<th class="align-top">&nbsp;</th>
</tr>
</thead>
<tbody>
<f:for each="{rootPagesWithoutSiteConfiguration}" as="page">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{page.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}">
<core:iconForRecord table="pages" row="{page}" />
</button>
</td>
<td>
{page.title}
</td>
<td class="col-control">
<div class="btn-group">
<f:be.link
route="site_configuration.edit"
parameters="{pageUid: page.uid}"
class="btn btn-default"
>
<core:icon identifier="actions-plus" />
<f:translate key="overview.addSiteConfiguration" domain="backend.siteconfiguration" />
</f:be.link>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
<f:if condition="{unassignedSites}">
<h2>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.unassignedSites.title')}</h2>
<p>
<f:translate key="overview.unassignedSites.description" domain="backend.siteconfiguration" />
</p>
<div class="table-fit">
<table class="table table-striped">
<thead>
<tr>
<th class="nowrap"><f:translate key="overview.siteIdentifier" domain="backend.siteconfiguration" /></th>
<th class="align-top">&nbsp;</th>
</tr>
</thead>
<tbody>
<f:for each="{unassignedSites}" as="unassignedSite">
<tr>
<td>
<code>{unassignedSite.identifier}</code>
</td>
<td class="col-control">
<div class="btn-group">
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
form="form-site-configuration-delete"
name="site"
value="{unassignedSite.identifier}"
data-severity="error"
data-title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.deleteSiteConfiguration')}"
data-button-close-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-button-ok-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:delete')}"
>
<core:icon identifier="actions-delete" />
<f:translate key="overview.deleteSiteConfiguration" domain="backend.siteconfiguration" />
</button>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
<f:if condition="{invalidSets}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.invalidSets.title')}"
>
<p>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.invalidSets.description')}</p>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th><f:translate key="overview.invalidSets.set" domain="backend.siteconfiguration" /></th>
<th><f:translate key="overview.invalidSets.error" domain="backend.siteconfiguration" /></th>
</tr>
</thead>
<tbody>
<f:for each="{invalidSets}" as="invalidSet">
<tr>
<td><code>{invalidSet.name}</code></td>
<td>
<f:translate key="{invalidSet.error.label}" arguments="{0: invalidSet.name, 1: invalidSet.context}"/>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:be.infobox>
</f:if>
<form action="{be:moduleLink(route:'site_configuration.delete')}" id="form-site-configuration-delete" method="post" class="hidden"></form>
</f:section>
<f:section name="list">
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th colspan="2" class="nowrap align-top"><f:translate key="overview.site" domain="backend.siteconfiguration" /></th>
<th class="align-top"><f:translate key="overview.siteIdentifier" domain="backend.siteconfiguration" /></th>
<th class="align-top"><f:translate key="site_language.language" domain="backend.siteconfiguration_tca" /></th>
<th class="align-top"><f:translate key="overview.baseUrl" domain="backend.siteconfiguration" /></th>
<th class="align-top">&nbsp;</th>
</tr>
</thead>
<tbody>
<f:for each="{rootPagesWithSiteConfiguration}" as="page">
<f:variable name="rootPage" value="{page}" />
<f:for each="{page.rootline}" as="rootLinePage" iteration="rootLinePageIterator">
<f:if condition="{rootLinePage.uid} == {page.uid}">
<f:variable name="rootPage" value="{rootLinePage}" />
</f:if>
</f:for>
<tr>
<td class="col-icon align-top">
<button type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{rootPage.uid}"
aria-label="{f:translate(key: 'labels.contextMenu.open', domain:'core.core')}">
<core:iconForRecord table="pages" row="{rootPage}" />
</button>
</td>
<td class="align-top">
<f:if condition="{page.siteIdentifier}">
<f:then>
<f:be.link route="site_configuration.edit" parameters="{site: page.siteIdentifier}" title="{f:translate(key:'overview.editSiteConfiguration', domain:'backend.siteconfiguration')}">
{rootPage.title}
</f:be.link>
</f:then>
<f:else>
{rootPage.title}
</f:else>
</f:if>
</td>
<td class="align-top">
<f:if condition="{page.siteIdentifier}">
<f:then>
<code>{page.siteIdentifier}</code>
</f:then>
<f:else>
<div>
<f:be.link route="site_configuration.edit" parameters="{pageUid: page.uid}" class="btn btn-primary">
<f:translate key="overview.addSiteConfiguration" domain="backend.siteconfiguration" />
</f:be.link>
</div>
</f:else>
</f:if>
<f:if condition="{page.siteConfiguration.invalidSets}">
<f:render partial="SiteManagement/InvalidSets" arguments="{site: page.siteConfiguration}"/>
</f:if>
</td>
<td class="align-top">
<f:if condition="{page.siteConfiguration}">
<f:for each="{page.siteConfiguration.allLanguages}" as="siteLanguage" iteration="siteLanguageIterator">
<div class="{f:if(condition: '{siteLanguageIterator.isLast}', then: '', else: 'mb-2')}">
<f:if condition="{siteLanguage.enabled}">
<f:then>
<core:icon identifier="{siteLanguage.flagIdentifier}" /> {siteLanguage.title} <code>[{siteLanguage.languageId}]</code>
</f:then>
<f:else>
<core:icon identifier="{siteLanguage.flagIdentifier}" overlay="overlay-hidden" />
<span class="text-variant">{siteLanguage.title} (<f:translate key="disabled" domain="core.common">disabled</f:translate>) <code>[{siteLanguage.languageId}]</code></span>
</f:else>
</f:if>
</div>
</f:for>
</f:if>
</td>
<td class="align-top">
<f:if condition="{page.siteConfiguration}">
<f:for each="{page.siteConfiguration.allLanguages}" as="siteLanguage" iteration="siteLanguageIterator">
<div class="{f:if(condition: '{siteLanguageIterator.isLast}', then: '', else: 'mb-2')}">
<a href="{siteLanguage.base}" target="_blank">{siteLanguage.base}</a>
</div>
</f:for>
</f:if>
</td>
<td class="align-top nowrap col-control">
<div class="btn-group">
<f:if condition="{page.siteIdentifier}">
<f:be.link
route="site_configuration.detail"
parameters="{site: page.siteIdentifier}"
title="{f:translate(key:'overview.btn.details', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-system-options-view" />
</f:be.link>
<f:be.link
route="site_configuration.edit"
parameters="{site: page.siteIdentifier}"
title="{f:translate(key:'overview.editSiteConfiguration', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-open" />
</f:be.link>
<f:if condition="{page.siteConfiguration.sets -> f:count()} > 0">
<f:then>
<f:variable name="returnUrl">{f:be.uri(route: 'site_configuration')}</f:variable>
<f:be.link
route="site_configuration.editSettings"
parameters="{site: page.siteIdentifier, returnUrl: returnUrl}"
title="{f:translate(key:'overview.editSiteSettings', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-cog" />
</f:be.link>
</f:then>
<f:else>
<button
disabled
type="button"
class="btn btn-default"
title="{f:translate(key:'overview.editSiteSettingsUnavailable', domain:'backend.siteconfiguration')}}"
>
<core:icon identifier="actions-cog" />
</button>
</f:else>
</f:if>
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
form="form-site-configuration-delete"
name="site"
value="{page.siteIdentifier}"
title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}}"
data-severity="error"
data-title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}}"
data-button-close-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-button-ok-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:delete')}"
>
<core:icon identifier="actions-delete" />
</button>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:section>
<f:section name="tiles">
<div class="card-container">
<f:for each="{rootPagesWithSiteConfiguration}" as="page">
<f:variable name="rootPage" value="{page}" />
<f:for each="{page.rootline}" as="rootLinePage" iteration="rootLinePageIterator">
<f:if condition="{rootLinePage.uid} == {page.uid}">
<f:variable name="rootPage" value="{rootLinePage}" />
</f:if>
</f:for>
<div class="card card-size-medium">
<div class="card-header">
<div class="card-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{rootPage.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="pages" row="{rootPage}" size="medium" />
</button>
</div>
<div class="card-header-body">
<h2 class="card-title">
{rootPage.title}
</h2>
<f:if condition="{page.siteIdentifier}">
<span class="card-subtitle">
<code>{page.siteIdentifier}</code>
</span>
</f:if>
</div>
</div>
<f:if condition="{page.siteConfiguration}">
<ul class="list-group list-group-flush">
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.entry_point" domain="backend.siteconfiguration" />:
</strong>
<div>
<a href="{page.siteConfiguration.base}" target="_blank">{page.siteConfiguration.base}</a>
</div>
</div>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.languages" domain="backend.siteconfiguration" />:
</strong>
<div>
<core:icon identifier="{page.siteConfiguration.allLanguages.0.flagIdentifier}" /> {page.siteConfiguration.allLanguages.0.title}
<f:if condition="{page.siteConfiguration.allLanguages -> f:count()} > 1">
<f:variable name="siteLanguageAmount" value="{page.siteConfiguration.allLanguages -> f:count()}" />
<f:translate
key="overview.languages.amount" domain="backend.siteconfiguration"
arguments="{
0: '{siteLanguageAmount - 1}'
}"
/>
</f:if>
</div>
</div>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.site_sets" domain="backend.siteconfiguration" />:
</strong>
<div>
<f:if condition="{page.siteConfiguration.sets -> f:count()}">
<f:then>
<div class="d-none d-sm-inline">
<core:icon identifier="actions-check" />
<span class="visually-hidden">
<f:translate key="overview.site_sets.yes" domain="backend.siteconfiguration" />
</span>
</div>
<div class="d-inline d-sm-none">
<f:translate key="overview.site_sets.yes" domain="backend.siteconfiguration" />
</div>
</f:then>
<f:else>
<f:render section="none" />
</f:else>
</f:if>
</div>
</div>
<f:if condition="{page.siteConfiguration.invalidSets}">
<f:render partial="SiteManagement/InvalidSets" arguments="{site: page.siteConfiguration}"/>
</f:if>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.error_handling" domain="backend.siteconfiguration" />:
</strong>
<div>
<f:if condition="{page.siteConfiguration.configuration.errorHandling -> f:count()} > 0">
<f:then>
<f:for each="{page.siteConfiguration.configuration.errorHandling}" as="errorHandling" iteration="errorHandlingIterator">
{errorHandling.errorCode}{f:if(condition: '{errorHandlingIterator.isLast}', then: '', else: ', ')}
</f:for>
</f:then>
<f:else>
<f:render section="none" />
</f:else>
</f:if>
</div>
</div>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.static_routes" domain="backend.siteconfiguration" />:
</strong>
<div>
<f:if condition="{page.siteConfiguration.configuration.routes -> f:count()} > 0">
<f:then>
<f:for each="{page.siteConfiguration.configuration.routes}" as="route" iteration="routeIterator">
{route.route}{f:if(condition: '{routeIterator.isLast}', then: '', else: ', ')}
</f:for>
</f:then>
<f:else>
<f:render section="none" />
</f:else>
</f:if>
</div>
</div>
</li>
</ul>
</f:if>
<div class="card-footer">
<f:if condition="{page.siteIdentifier}">
<div class="d-flex justify-content-between">
<div class="btn-group">
<f:be.link
route="site_configuration.detail"
parameters="{site: page.siteIdentifier}"
class="btn btn-default"
>
<core:icon identifier="actions-system-options-view" />
<f:translate key="overview.btn.details" domain="backend.siteconfiguration" />
</f:be.link>
</div>
<div class="btn-group">
<f:be.link
route="site_configuration.edit"
parameters="{site: page.siteIdentifier}"
title="{f:translate(key:'overview.editSiteConfiguration', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-open" />
</f:be.link>
<f:if condition="{page.siteConfiguration.sets -> f:count()} > 0">
<f:then>
<f:be.link
route="site_configuration.editSettings"
parameters="{site: page.siteIdentifier, returnUrl: returnUrl}"
title="{f:translate(key:'overview.editSiteSettings', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-cog" />
</f:be.link>
</f:then>
<f:else>
<button
disabled
type="button"
class="btn btn-default"
title="{f:translate(key:'overview.editSiteSettingsUnavailable', domain:'backend.siteconfiguration')}"
>
<core:icon identifier="actions-cog" />
</button>
</f:else>
</f:if>
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
form="form-site-configuration-delete"
name="site"
value="{page.siteIdentifier}"
title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}"
data-severity="error"
data-title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}"
data-button-close-text="{f:translate(key:'cancel', domain: 'core.common')}"
data-button-ok-text="{f:translate(key:'delete', domain: 'core.common')}"
>
<core:icon identifier="actions-delete" />
</button>
</div>
</div>
</f:if>
</div>
</div>
</f:for>
</div>
</f:section>
<f:section name="none">
<div class="d-none d-sm-inline">
<core:icon identifier="actions-close" />
<span class="visually-hidden">
<f:translate key="overview.none" domain="backend.siteconfiguration" />
</span>
</div>
<div class="d-inline d-sm-none">
<f:translate key="overview.none" domain="backend.siteconfiguration" />
</div>
</f:section>
</html>
@@ -0,0 +1,45 @@
<f:layout name="Module" />
<f:section name="Content">
<f:asset.module identifier="@typo3/backend/settings/editor.js"/>
<f:for each="{categories}" as="category">
<f:for each="{category.settings}" as="setting">
<f:asset.module identifier="{setting.typeImplementation}"/>
</f:for>
</f:for>
<h1>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_sitesettings.xlf:edit.headline"
arguments="{0: siteTitle}"
/>
</h1>
<f:render partial="SiteManagement/InvalidSets" arguments="{site: site, renderMode: 'infobox'}"/>
<f:if condition="{categories -> f:count()} == 0">
<f:then>
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_sitesettings.xlf:edit.noSettings.title')}"
>
<f:translate
key="LLL:EXT:backend/Resources/Private/Language/locallang_sitesettings.xlf:edit.noSettings.message"
arguments="{0: site.identifier}"
/>
</f:be.infobox>
</f:then>
<f:else>
<typo3-backend-settings-editor
form-name="sitesettings_form"
action-url="{actionUrl}"
categories="{categories -> f:format.json()}"
custom-form-data="{f:format.json(value: {formToken: formToken, returnUrl: returnUrl})}"
mode="{mode.value}"
{f:if(condition: "{mode.value} === advanced", then: 'dump-url="{dumpUrl}"')}
></typo3-backend-settings-editor>
</f:else>
</f:if>
</f:section>
@@ -0,0 +1,75 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module"/>
<f:section name="Content">
<f:if condition="{currentModule}">
<f:then>
<h1>{f:translate(key: currentModule.title, default: currentModule.title)}</h1>
<f:if condition="{currentModule.description}">
<f:then>
<p>{f:translate(key: currentModule.description, default: currentModule.description) -> f:transform.html()}</p>
</f:then>
<f:else if="{currentModule.shortDescription}">
<p>{f:translate(key: currentModule.shortDescription, default: currentModule.shortDescription)}</p>
</f:else>
</f:if>
<f:if condition="{submodules}">
<f:then>
<div class="card-container">
<f:for each="{submodules}" as="subModule">
<div class="card card-size-small">
<div class="card-header">
<div class="card-icon">
<core:icon identifier="{subModule.iconIdentifier}" size="medium" alternativeMarkupIdentifier="inline"/>
</div>
<div class="card-header-body">
<h2 class="card-title">{f:translate(key: subModule.title, default: subModule.title)}</h2>
<f:if condition="{subModule.shortDescription}">
<span class="card-subtitle">{f:translate(key: subModule.shortDescription, default: subModule.shortDescription)}</span>
</f:if>
</div>
</div>
<div class="card-body">
<f:if condition="{subModule.description}">
<p class="card-text">{f:translate(key: subModule.description, default: subModule.description)}</p>
</f:if>
</div>
<div class="card-footer">
<f:variable name="moduleTitle">{f:translate(key: subModule.title, default: subModule.title)}</f:variable>
<a
href="{f:be.uri(route: subModule.identifier, parameters: additionalParameters)}"
class="btn btn-default"
aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:submoduleOverview.openModuleWithTitle', arguments: {0: moduleTitle})}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:submoduleOverview.openModule" />
</a>
</div>
</div>
</f:for>
</div>
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:submoduleOverview.noAccess.title')}"
message="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:submoduleOverview.noAccess.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
</f:else>
</f:if>
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:module.noAccess.title')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}"
/>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,12 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:asset.module identifier="@typo3/backend/security/element/sudo-mode.js"/>
<typo3-backend-security-sudo-mode
has-fatal-error
cancelUri="{cancelUri}"
labels="{labels -> f:format.json()}"
allow-install-tool-password
></typo3-backend-security-sudo-mode>
</html>
@@ -0,0 +1,11 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:asset.module identifier="@typo3/backend/security/element/sudo-mode.js"/>
<typo3-backend-security-sudo-mode
verifyActionUri="{verifyActionUri}"
labels="{labels -> f:format.json()}"
{f:if(condition: allowInstallToolPassword, then: 'allow-install-tool-password')}
></typo3-backend-security-sudo-mode>
</html>
@@ -0,0 +1 @@
<typo3-backend-bookmark-menu></typo3-backend-bookmark-menu>
@@ -0,0 +1,9 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<f:asset.module identifier="@typo3/backend/bookmark/toolbar/bookmark-menu-element.js"/>
<span class="toolbar-item-icon" title="{f:translate(key: 'core.bookmarks:title')}" aria-hidden="true">
<core:icon identifier="actions-bookmark" alternativeMarkupIdentifier="inline" />
</span>
<span class="toolbar-item-title">
<f:translate key="core.bookmarks:title"/>
</span>
</html>
@@ -0,0 +1,7 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<f:asset.module identifier="@typo3/backend/toolbar/clear-cache-menu.js"/>
<f:render partial="ToolbarItems/ToolbarItem" arguments="{
title: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.clearCache',
icon: '{core:icon(identifier: \'actions-bolt\', size: \'small\', alternativeMarkupIdentifier: \'inline\')}'
}" />
</html>
@@ -0,0 +1,21 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<p class="dropdown-headline"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.clearCache" /></p>
<ul class="dropdown-list">
<f:for each="{cacheActions}" as="cacheAction">
<li>
<button type="button" data-endpoint="{cacheAction.endpoint}" class="dropdown-item t3js-toolbar-cache-flush-action" aria-describedby="{cacheAction.id}-description">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon {f:if(condition: cacheAction.severity, then: 'text-{cacheAction.severity}')}">
<core:icon identifier="{cacheAction.iconIdentifier}" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate key="{cacheAction.title}" /><br>
<small class="text-variant" aria-hidden="true">{f:translate(key: '{f:if(condition: cacheAction.description, then: cacheAction.description, else: cacheAction.title)}')}</small>
</span>
</span>
</button>
<span id="{cacheAction.id}-description" class="visually-hidden">{f:translate(key: '{f:if(condition: cacheAction.description, then: cacheAction.description, else: cacheAction.title)}')}</span>
</li>
</f:for>
</ul>
</html>
@@ -0,0 +1,6 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<f:asset.module identifier="@typo3/backend/toolbar/clear-cache-menu.js"/>
<button type="button" data-endpoint="{endpoint}" class="toolbar-item-link t3js-toolbar-cache-flush-action">
<f:render partial="ToolbarItems/ToolbarItem" arguments="{title: title, icon: '{core:icon(identifier: iconIdentifier, size: \'small\')}'}"/>
</button>
</html>
@@ -0,0 +1,14 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<f:asset.module identifier="@typo3/backend/live-search/toolbar/live-search-toolbar-item.js"/>
<button
class="toolbar-item-link t3js-topbar-button-search"
aria-haspopup="dialog"
>
<f:render partial="ToolbarItems/ToolbarItem" arguments="{
title: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.search',
icon: '{core:icon(identifier: \'actions-search\', size: \'small\', alternativeMarkupIdentifier: \'inline\')}'
}" />
</button>
</html>
@@ -0,0 +1,82 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<span data-systeminformation-data
data-systeminformation-data-count="{count}"
data-systeminformation-data-severitybadgeclass="{severityBadgeClass}"
></span>
<p class="dropdown-headline"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.sysinfo"/></p>
<p class="dropdown-item-text">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.sysinfo.intro.text"/>
<a href="#" data-moduleroute-identifier="system_environment">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.sysinfo.intro.link"/>
</a>
</p>
<f:if condition="{systemInformation}">
<table class="dropdown-table">
<caption class="hidden">System overview</caption>
<f:for each="{systemInformation}" as="info">
<tr>
<th data-type="title" scope="row">
<f:if condition="{info.iconIdentifier}">
<f:then>
<core:icon identifier="{info.iconIdentifier}" size="small" alternativeMarkupIdentifier="inline" />
</f:then>
<f:else if="{info.icon}" >{info.icon -> f:format.raw()}</f:else>
<f:else>
<core:icon identifier="empty-empty" size="small" alternativeMarkupIdentifier="inline" />
</f:else>
</f:if>
<f:translate key="{info.title}" default="{info.title}"/>
<f:if condition="{info.titleAddition}"> ({info.titleAddition -> f:format.htmlspecialchars()})</f:if>
</th>
<f:if condition="{info.status}">
<td data-type="status">
<typo3-backend-status-indicator state="{info.status}"></typo3-backend-status-indicator>
</td>
</f:if>
<td {f:if(condition: info.status, else: 'colspan="2"')} data-type="value">
{info.value}
</td>
</tr>
</f:for>
</table>
</f:if>
<hr class="dropdown-divider" aria-hidden="true">
<f:if condition="{messages -> f:count()} > 0">
<f:then>
<f:for each="{messages}" as="message">
<div class="dropdown-row"
data-systeminformation-message-module="{message.module}"
data-systeminformation-message-params="{message.params}"
data-systeminformation-message-count="{message.count}"
data-systeminformation-message-status="{message.status}"
>
<div>
<span class="text-{message.status}">
<core:icon identifier="actions-exclamation-circle-alt" />
</span>
</div>
<div>
<f:format.raw>{message.text}</f:format.raw>
</div>
</div>
</f:for>
</f:then>
<f:else>
<div class="dropdown-row">
<div>
<span class="text-success">
<core:icon identifier="actions-check-circle-alt" />
</span>
</div>
<div>
<f:format.nl2br><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.sysinfo.allgood" /></f:format.nl2br>
</div>
</div>
</f:else>
</f:if>
</html>
@@ -0,0 +1,8 @@
<html xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<f:asset.module identifier="@typo3/backend/toolbar/system-information-menu.js"/>
<f:render partial="ToolbarItems/ToolbarItem" arguments="{
title: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.sysinfo',
icon: '{core:icon(identifier: \'actions-info-circle\', size: \'small\', alternativeMarkupIdentifier: \'inline\')}'
}" />
<span class="toolbar-item-badge badge badge-pill badge-warning hidden" data-systeminformation-badge></span>
</html>
@@ -0,0 +1,19 @@
<html xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers" data-namespace-typo3-fluid="true">
<span class="toolbar-item-avatar"><be:avatar backendUser="{currentUser.uid}" size="24"/></span>
<f:if condition="{switchUserMode}">
<f:then>
<span
class="toolbar-item-name"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.user.account.switchToUserMode.tooltip')} {currentUser.username}"
>
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.user.account.switchToUserMode.account.prefix')}
{f:if(condition: '{currentUser.realName}', then: '{currentUser.realName} ({currentUser.username})', else: '{currentUser.username}')}
</span>
</f:then>
<f:else>
<span class="toolbar-item-name" title="{username}">
{f:if(condition: '{currentUser.realName}', then: '{currentUser.realName}', else: '{currentUser.username}')}
</span>
</f:else>
</f:if>
</html>
@@ -0,0 +1,127 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:asset.module identifier="@typo3/backend/switch-user.js"/>
<f:asset.module identifier="@typo3/backend/color-scheme-switch.js"/>
<p class="dropdown-headline">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.user')}</p>
<f:if condition="{modules}">
<ul class="dropdown-list">
<f:for each="{modules}" as="module">
<li>
<a
href="{f:if(condition: module.path, then: '{f:be.uri(route: module.identifier)}', else: '#')}"
title="{f:translate(key: module.description, default: module.description)}"
class="dropdown-item"
role="menuitem"
data-moduleroute-identifier="{module.identifier}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="{module.iconIdentifier}" size="small" alternativeMarkupIdentifier="inline"/>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="{module.title}">{module.title}</f:translate>
</span>
</span>
</a>
</li>
</f:for>
</ul>
</f:if>
<p class="dropdown-headline" id="help-dropdown-headline"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.help" /></p>
<f:if condition="{helpModules}">
<ul class="dropdown-list">
<f:for each="{helpModules}" as="module">
<li>
<a
href="{f:if(condition: module.path, then: '{f:be.uri(route: module.identifier)}', else: '#')}"
title="{f:translate(key: module.description, default: module.description)}"
class="dropdown-item"
role="menuitem"
data-moduleroute-identifier="{module.identifier}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="{module.iconIdentifier}" size="small" alternativeMarkupIdentifier="inline"/>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="{module.title}">{module.title}</f:translate>
</span>
</span>
</a>
</li>
</f:for>
<li>
<a
class="dropdown-item"
role="menuitem"
href="https://docs.typo3.org/" target="_blank" rel="noreferrer">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="module-documentation" size="small" alternativeMarkupIdentifier="inline" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:onlineDocumentation">TYPO3 Online Documentation</f:translate>
<span class="visually-hidden">(<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:opensInANewWindow" />)</span>
</span>
<core:icon identifier="actions-window-open" />
</span>
</a>
</li>
</ul>
</f:if>
<f:if condition="{f:count(subject: recentUsers)} > 0">
<hr class="dropdown-divider" aria-hidden="true">
<p class="dropdown-header"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.user.recentlySwitchedUsers" /></p>
<ul class="modulemenu-group-container">
<f:for each="{recentUsers}" as="user">
<li>
<typo3-backend-switch-user
class="dropdown-item"
mode="switch"
targetUser="{user.uid}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.user.recentlySwitchedUsers.su.tooltip', arguments: '{0: user.username}')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<be:avatar backendUser="{user.uid}" size="16" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:if(condition: user.realName, then: user.realName, else: user.username)}
</span>
</span>
</typo3-backend-switch-user>
</li>
</f:for>
</ul>
</f:if>
<f:if condition="{colorSchemeSwitchEnabled}">
<hr class="dropdown-divider" aria-hidden="true">
<typo3-backend-color-scheme-switch
togglelabel="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:toggleColorScheme')}"
disabledlabel="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:colorSchemeToggleDisabled')}"
colorschemes="{colorSchemes -> f:format.json()}" activeColorScheme="{activeColorScheme}"
></typo3-backend-color-scheme-switch>
</f:if>
<hr class="dropdown-divider" aria-hidden="true">
<f:if condition="{switchUserMode}">
<f:then>
<div class="dropdown-item-text">
<typo3-backend-switch-user class="btn btn-sm btn-default" mode="exit">
<core:icon identifier="actions-logout" size="small" alternativeMarkupIdentifier="inline"/>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.user.btn.exitSwitchUser" />
</typo3-backend-switch-user>
</div>
</f:then>
<f:else>
<div class="dropdown-item-text">
<f:be.link route="logout" class="btn btn-sm btn-default" target="_top">
<core:icon identifier="actions-logout" size="small" alternativeMarkupIdentifier="inline"/>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.user.btn.logout" />
</f:be.link>
</div>
</f:else>
</f:if>
</html>