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,14 @@
<p>
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:cms_description',
arguments: '{
0: "&copy; {typo3Info.copyrightYear}",
1: "Kasper Sk&aring;rh&oslash;j."
}') -> f:format.raw()}
</p>
<p>
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_login.xlf:extension.trademark',
arguments: '{
0: "<a href=\"{trademarkUrl}\" target=\"_blank\" rel=\"noreferrer\">",
1: "</a>"
}') -> f:format.raw()}
</p>
@@ -0,0 +1,10 @@
<div class="card">
<div class="card-body">
<h3 class="card-title">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:coredevs" />
</h3>
<p class="card-text">
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:coredevs_detail') -> f:format.raw()}
</p>
</div>
</div>
@@ -0,0 +1,10 @@
<div class="card">
<div class="card-body">
<h3 class="card-title">
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:community_credits')}
</h3>
<p class="card-text">
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:information_detail') -> f:format.raw()}
</p>
</div>
</div>
@@ -0,0 +1,13 @@
<div class="card">
<div class="card-body">
<h3 class="card-title">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:donation_header" />
</h3>
<p class="card-text">
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:donation_message') -> f:format.raw()}
</p>
<a href="{donationUrl}" class="btn btn-default" title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:donation_button')}" target="_blank" rel="noreferrer">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:donation_button" />
</a>
</div>
</div>
@@ -0,0 +1,38 @@
<f:if condition="{loadedExtensions}">
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:extension_authors" />
</h2>
<p>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:extension_list_info" />
</p>
<div class="table-fit">
<table class="table table-striped table-hover table-vertical-top">
<thead>
<tr>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:extension" /></th>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:extension_author" /></th>
</tr>
</thead>
<tbody>
<f:for each="{loadedExtensions}" as="loadedExtension">
<tr>
<td>
{loadedExtension.title} ({loadedExtension.key})
</td>
<td>
<f:if condition="{loadedExtension.authors}">
<f:for each="{loadedExtension.authors}" as="extensionAuthor" iteration="i">
{extensionAuthor.name} <f:if condition="{extensionAuthor.email}">({extensionAuthor.email})</f:if>
<f:if condition="{i.isLast} == false">
<br>
</f:if>
</f:for>
</f:if>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
@@ -0,0 +1,139 @@
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:external_libraries" />
</h2>
<p>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:external_thanks" />
</p>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:external_libraries.table.column.name" /></th>
<th><f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:external_libraries.table.column.website" /></th>
</tr>
</thead>
<tbody>
<tr>
<td>Composer</td>
<td><a href="https://getcomposer.org" target="_blank" rel="noreferrer">getcomposer.org</a></td>
</tr>
<tr>
<td>Bootstrap</td>
<td><a href="https://getbootstrap.com" target="_blank" rel="noreferrer">getbootstrap.com</a></td>
</tr>
<tr>
<td>Doctrine Project (DBAL Component and Instantiator)</td>
<td><a href="https://www.doctrine-project.org/projects/dbal.html" target="_blank" rel="noreferrer">doctrine-project.org</a></td>
</tr>
<tr>
<td>Symfony Framework Component: Config</td>
<td><a href="https://symfony.com/doc/current/components/config.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: Console</td>
<td><a href="https://symfony.com/doc/current/components/console.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: DependencyInjection</td>
<td><a href="https://symfony.com/doc/current/components/dependency_injection.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: ExpressionLanguage</td>
<td><a href="https://symfony.com/doc/current/components/expression_language.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: Finder</td>
<td><a href="https://symfony.com/doc/current/components/finder.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: Mailer</td>
<td><a href="https://symfony.com/doc/current/components/mailer.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: Mime</td>
<td><a href="https://symfony.com/doc/current/components/mime.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: PropertyAccess</td>
<td><a href="https://symfony.com/doc/current/components/property_access.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: PropertyInfo</td>
<td><a href="https://symfony.com/doc/current/components/property_info.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: Routing</td>
<td><a href="https://symfony.com/doc/current/components/routing.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Symfony Framework Component: YAML</td>
<td><a href="https://symfony.com/doc/current/components/yaml.html" target="_blank" rel="noreferrer">symfony.com</a></td>
</tr>
<tr>
<td>Lit</td>
<td><a href="https://lit.dev/" target="_blank" rel="noreferrer">lit.dev</a></td>
</tr>
<tr>
<td>Guzzle PHP</td>
<td><a href="http://guzzlephp.org" target="_blank" rel="noreferrer">guzzlephp.org</a></td>
</tr>
<tr>
<td>CKEditor</td>
<td><a href="https://ckeditor.com" target="_blank" rel="noreferrer">ckeditor.com</a></td>
</tr>
<tr>
<td>chart.js</td>
<td><a href="https://www.chartjs.org/" target="_blank" rel="noreferrer">chartjs.org</a></td>
</tr>
<tr>
<td>luxon</td>
<td><a href="https://moment.github.io/luxon/" target="_blank" rel="noreferrer">moment.github.io/luxon</a></td>
</tr>
<tr>
<td>Autosize</td>
<td><a href="https://www.jacklmoore.com/autosize/" target="_blank" rel="noreferrer">jacklmoore.com</a></td>
</tr>
<tr>
<td>Cropper.js</td>
<td><a href="https://fengyuanchen.github.io/cropperjs/" target="_blank" rel="noreferrer">fengyuanchen.github.io</a></td>
</tr>
<tr>
<td>flatpickr</td>
<td><a href="https://flatpickr.js.org/" target="_blank" rel="noreferrer">flatpickr.js.org</a></td>
</tr>
<tr>
<td>Tablesort</td>
<td><a href="http://tristen.ca/tablesort/demo/" target="_blank" rel="noreferrer">tristen.ca</a></td>
</tr>
<tr>
<td>Alwan Color Picker</td>
<td><a href="https://sefianecho.github.io/alwan/" target="_blank" rel="noreferrer">sefianecho.github.io/</a></td>
</tr>
<tr>
<td>Tab Override</td>
<td><a href="https://wjbryant.github.io/taboverride/" target="_blank" rel="noreferrer">wjbryant.github.io</a></td>
</tr>
<tr>
<td>Neos (Form component)</td>
<td><a href="https://www.neos.io" target="_blank" rel="noreferrer">neos.io</a></td>
</tr>
<tr>
<td>FineDiff</td>
<td><a href="https://github.com/lolli42/FineDiff" target="_blank" rel="noreferrer">github.com</a></td>
</tr>
<tr>
<td>IDNA Convert</td>
<td><a href="https://idnaconv.net" target="_blank" rel="noreferrer">idnaconv.net</a></td>
</tr>
<tr>
<td>CodeMirror</td>
<td><a href="https://codemirror.net" target="_blank" rel="noreferrer">codemirror.net</a></td>
</tr>
<tr>
<td>SelectPure</td>
<td><a href="https://github.com/dudyn5ky1/select-pure" target="_blank" rel="noreferrer">github.com</a></td>
</tr>
</tbody>
</table>
</div>
@@ -0,0 +1,9 @@
<img
src="{f:uri.resource(path: 'EXT:core/Resources/Public/Images/typo3_light_dark.svg')}"
width="150"
alt="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:typo3_logo')}"
/>
<h1>
TYPO3 CMS {typo3Version.version}<br>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:introtext" />
</h1>
@@ -0,0 +1,76 @@
<h2>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:modules.headline" />
</h2>
<p>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:modules.introtext" />
</p>
<f:for each="{modules}" as="mainModule">
<f:if condition="{mainModule.subModules}">
<f:if condition="{mainModule.title}">
<h3><f:translate key="{mainModule.title}">{mainModule.title}</f:translate></h3>
</f:if>
<section class="card-container">
<f:for each="{mainModule.subModules}" as="subModule">
<div class="card card-size-small">
<div class="card-header">
<div class="card-icon">
<core:icon identifier="{subModule.iconIdentifier}" size="large" />
</div>
<f:if condition="{subModule.title} || {subModule.shortDescription}">
<div class="card-header-body">
<f:if condition="{subModule.title}">
<h4 class="card-title">
<f:translate key="{subModule.title}">{subModule.title}</f:translate>
</h4>
</f:if>
<f:if condition="{subModule.shortDescription}">
<span class="card-subtitle">
<f:translate key="{subModule.shortDescription}">{subModule.shortDescription}</f:translate>
</span>
</f:if>
</div>
</f:if>
</div>
<f:if condition="{subModule.description}">
<div class="card-body">
<p class="card-text">
<f:sanitize.html>
<f:translate key="{subModule.description}">{subModule.description}</f:translate>
</f:sanitize.html>
</p>
</div>
</f:if>
<div class="card-footer">
<f:if condition="{subModule.appearance.dependsOnSubmodules} && !{subModule.subModules}">
<f:then>
<p class="text-variant">
<f:if condition="{subModule.title}">
<f:then>
<f:variable name="submoduleTitle"><f:translate key="{subModule.title}">{subModule.title}</f:translate></f:variable>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:noSubModulesWithTitle" arguments="{0: submoduleTitle}" />
</f:then>
<f:else>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:noSubModules" />
</f:else>
</f:if>
</p>
</f:then>
<f:else>
<f:variable name="submoduleTitle"><f:translate key="{subModule.title}">{subModule.title}</f:translate></f:variable>
<a
href="#"
data-dispatch-action="TYPO3.ModuleMenu.showModule"
data-dispatch-args-list="{subModule.identifier}"
class="btn btn-default"
aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:submoduleOverview.openModuleWithTitle', arguments: {0: submoduleTitle})}"
>
<f:translate key="LLL:EXT:backend/Resources/Private/Language/Modules/about.xlf:link.openModule" />
</a>
</f:else>
</f:if>
</div>
</div>
</f:for>
</section>
</f:if>
</f:for>
@@ -0,0 +1,88 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<nav
class="modulemenu"
data-role="modulemenu"
id="modulemenu"
data-modulemenu
aria-label="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:modulemenu.label')}"
data-modules-information="{modulesInformation}"
>
<f:if condition="{modules}">
<f:render section="Menubar" arguments="{modules: modules}" />
</f:if>
</nav>
<f:section name="Menubar">
<ul
role="menubar"
aria-orientation="vertical"
aria-label="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang.xlf:modulemenu.label')}"
class="modulemenu-group-container"
>
<f:for each="{modules}" as="module" iteration="iterator">
<li
role="presentation"
data-modulemenu-level="1"
{f:if(condition: module.subModules, then: 'class="modulemenu-group modulemenu-group-{f:if(condition: module.collapsed, then: \'collapsed\', else: \'expanded\')}"')}
>
<f:render section="Button" arguments="{module: module, showChildren: module.subModules, tabIndex: '{f:if(condition: iterator.isFirst, then: \'0\', else: \'-1\')}'}" />
<f:if condition="{module.subModules}">
<f:render section="Menu" arguments="{modules: module.subModules, parent: module}" />
</f:if>
</li>
</f:for>
</ul>
</f:section>
<f:section name="Menu">
<ul
id="modulemenu-group-{parent.identifier}"
role="menu"
aria-orientation="vertical"
<f:if condition="{parent.title}">
aria-label="{f:translate(key: parent.title, default: parent.title)}"
</f:if>
class="modulemenu-group-container collapse {f:if(condition: '{parent}', then: '{f:if(condition: parent.collapsed, else: \'show\')}')}"
>
<f:for each="{modules}" as="module">
<li role="presentation" data-modulemenu-level="2">
<f:render section="Button" arguments="{module: module, tabIndex: '-1'}" />
</li>
</f:for>
</ul>
</f:section>
<f:section name="Button">
<f:variable name="moduleTitle" value="" />
<f:if condition="{module.title}">
<f:variable name="moduleTitle" value="{f:translate(key: module.title, default: module.title)}" />
</f:if>
<{f:if(condition: module.shouldBeLinked, then: 'a', else: 'button')}
<f:if condition="{module.shouldBeLinked}">
<f:then>
href="{f:be.uri(route: module.identifier)}"
data-moduleroute-identifier="{module.identifier}"
</f:then>
<f:else>
type="button"
</f:else>
</f:if>
role="menuitem"
title="{moduleTitle}"
class="modulemenu-action"
tabindex="{tabIndex}"
data-modulemenu-identifier="{module.identifier}"
data-modulemenu-collapsible="{f:if(condition: showChildren, then: 'true', else: 'false')}"
{f:if(condition: showChildren, then: 'aria-controls="modulemenu-group-{module.identifier}" aria-haspopup="menu" aria-expanded="{f:if(condition: module.collapsed, then: \'false\', else: \'true\')}"')}
>
<span class="modulemenu-icon" aria-hidden="true"><core:icon size="medium" identifier="{module.iconIdentifier}" alternativeMarkupIdentifier="inline" /></span>
<span class="modulemenu-name">{moduleTitle}</span>
<span class="modulemenu-indicator" aria-hidden="true"></span>
</{f:if(condition: module.shouldBeLinked, then: 'a', else: 'button')}>
</f:section>
</html>
@@ -0,0 +1,69 @@
<html
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
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:asset.module identifier="@typo3/backend/element/sidebar-toggle-element.js" />
<div class="scaffold-topbar t3js-scaffold-topbar" data-topbar-identifier="topbar">
<div class="topbar t3js-topbar">
<typo3-backend-sidebar-toggle
class="topbar-button topbar-button-modulemenu"
label-collapse="{f:translate(key: 'toolbarItems.sidebarCollapse', domain: 'backend.toolbar')}"
label-expand="{f:translate(key: 'toolbarItems.sidebarExpand', domain: 'backend.toolbar')}"
{f:if(condition: '!{sidebar.accessible}', then: 'disabled')}
></typo3-backend-sidebar-toggle>
<div class="topbar-site-container">
<a class="topbar-site" href="./" target="_top" title="{siteName} - {applicationVersion}">
<span class="topbar-site-logo">
<img src="{logoUrl}" width="{logoWidth}" height="{logoHeight}" alt="" aria-hidden="true" />
</span>
<span class="topbar-site-title">
<span class="topbar-site-name">{siteName}</span>
<span class="topbar-site-version">{applicationVersion}</span>
</span>
</a>
</div>
<button
class="topbar-button topbar-button-toolbar t3js-topbar-button-toolbar"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.toolbarOpenClose')}"
aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.toolbarOpenClose')}"
>
<core:icon identifier="actions-cog" alternativeMarkupIdentifier="inline" />
</button>
<button
class="topbar-button topbar-button-search t3js-topbar-button-search"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.searchbarOpenClose')}"
aria-label="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_toolbar.xlf:toolbarItems.searchbarOpenClose')}"
aria-haspopup="dialog"
>
<core:icon identifier="actions-search" alternativeMarkupIdentifier="inline" />
</button>
</div>
</div>
<div class="scaffold-toolbar t3js-scaffold-toolbar" data-toolbar-identifier="toolbar">
<div class="toolbar">
<ul class="toolbar-list" data-typo3-role="typo3-module-menu">
<f:for each="{toolbarItems}" as="toolbarItem" iteration="iterator">
<li {be:toolbar.attributes(class: toolbarItem) -> f:format.raw()}>
<be:toolbar.ifHasDropdown class="{toolbarItem}">
<f:then>
<button type="button" class="toolbar-item-link dropdown-toggle dropdown-toggle-no-chevron" data-bs-target="toolbar-menu-{iterator.cycle}" data-bs-toggle="dropdown" data-bs-offset="0,0">
{toolbarItem.item -> f:format.raw()}
</button>
<div id="toolbar-menu-{iterator.cycle}" class="dropdown-menu" role="menu">
{toolbarItem.dropdown -> f:format.raw()}
</div>
</f:then>
<f:else>
{toolbarItem.item -> f:format.raw()}
</f:else>
</be:toolbar.ifHasDropdown>
</li>
</f:for>
</ul>
</div>
</div>
</html>
@@ -0,0 +1,57 @@
<div class="module-loading-indicator"></div>
<div class="module-docheader module-docheader-navigation t3js-module-docheader-navigation">
<f:be.pageRenderer includeJavaScriptModules="{0: '@typo3/backend/viewport/content-navigation-toggle.js'}" />
<div class="module-docheader-column">
<typo3-backend-content-navigation-toggle
class="btn btn-sm btn-icon btn-default btn-borderless"
action="expand"
hidden
>
</typo3-backend-content-navigation-toggle>
</div>
<div class="module-docheader-column module-docheader-column-breadcrumb">
<f:if condition="{docHeader.breadcrumb}">
<f:be.pageRenderer includeJavaScriptModules="{0: '@typo3/backend/element/breadcrumb.js'}" />
<typo3-breadcrumb
label='{f:translate(key: "LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:breadcrumb")}'
nodes='{docHeader.breadcrumb -> f:format.json()}'
></typo3-breadcrumb>
</f:if>
</div>
<div class="module-docheader-column">
<f:if condition="{docHeader.languageSelector}">
<f:format.raw>{docHeader.languageSelector}</f:format.raw>
</f:if>
</div>
</div>
<f:if condition="{docHeader.buttons.left -> f:count()} > 0 || {docHeader.buttons.right -> f:count()} > 0">
<div class="module-docheader module-docheader-buttons t3js-module-docheader-buttons">
<div class="module-docheader-column module-docheader-column-grow">
<f:render section="buttonbar" arguments="{buttons:docHeader.buttons.left}" />
</div>
<div class="module-docheader-column">
<f:render section="buttonbar" arguments="{buttons:docHeader.buttons.right}" />
</div>
</div>
</f:if>
<f:section name="buttonbar">
<f:if condition="{buttons -> f:count()} > 0">
<div class="btn-toolbar" role="toolbar" aria-label="">
<f:for each="{buttons}" as="buttonGroup">
<f:if condition="{buttonGroup -> f:count()} > 1">
<f:then>
<div class="btn-group" role="group" aria-label="">
<f:for each="{buttonGroup}" as="button">
{button -> f:format.raw()}
</f:for>
</div>
</f:then>
<f:else>
{buttonGroup.0 -> f:format.raw()}
</f:else>
</f:if>
</f:for>
</div>
</f:if>
</f:section>
@@ -0,0 +1,6 @@
<p>
<f:if condition="{normalizedParams.remoteAddress}">
This password reset request originated from the IP address <strong>{normalizedParams.remoteAddress}</strong>.
</f:if>
If you have not requested a password reset and have concerns about this email, please let your administrator know.
</p>
@@ -0,0 +1,2 @@
<f:if condition="{normalizedParams.remoteAddress}">This password reset request originated from the IP address "{normalizedParams.remoteAddress}".</f:if>
If you have not requested a password reset and have concerns about this email, please let your administrator know.
@@ -0,0 +1,8 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_wizards.xlf:imwizard.image-manipulation" />
: <f:if condition="{image.properties.title}"><f:then>{image.properties.title} &mdash; {image.name}</f:then><f:else>{image.name}</f:else></f:if>
({image.properties.width} × {image.properties.height})
</html>
@@ -0,0 +1,53 @@
<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:if condition="{loginNewsItems}">
<section class="typo3-login-news" aria-labelledby="loginNewsHeader">
<h2 id="loginNewsHeader" class="visually-hidden">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.news.header" />
</h2>
<f:if condition="{loginNewsItems -> f:count()} > 1">
<f:then>
<div class="carousel slide typo3-login-carousel t3js-login-news-carousel" id="loginNews" data-bs-ride="false">
<button class="left typo3-login-carousel-control" data-bs-target="#loginNews" data-bs-slide="prev">
<core:icon identifier="actions-chevron-start" size="small" />
<span class="visually-hidden"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.news.previous"/></span>
</button>
<button type="button" class="right typo3-login-carousel-control" data-bs-target="#loginNews" data-bs-slide="next">
<core:icon identifier="actions-chevron-end" size="small" />
<span class="visually-hidden"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.news.next"/></span>
</button>
<div class="carousel-inner carousel-inner--overflowing-bottom" aria-live="polite">
<f:for each="{loginNewsItems}" as="item" iteration="loginNewsIterator">
<div role="group" aria-labelledby="loginNewsItem-{item.uid}" class="carousel-item{f:if(condition: loginNewsIterator.isFirst,then: ' active')}">
<f:render section="Item" arguments="{item: item}"/>
</div>
</f:for>
</div>
</div>
</f:then>
<f:else>
<div class="carousel typo3-login-carousel">
<div class="carousel-inner carousel-inner--overflowing-bottom">
<f:render section="Item" arguments="{item:'{loginNewsItems.0}'}"/>
</div>
</div>
</f:else>
</f:if>
</section>
</f:if>
<f:section name="Item">
<p id="loginNewsItem-{item.uid}" class="typo3-login-news-heading">{item.header}</p>
{item.content -> f:transform.html() -> f:sanitize.html()}
<f:if condition="{item.date}">
<p class="text-variant">
<span class="visually-hidden"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang.xlf:login.news.date"/></span>{item.date}
</p>
</f:if>
</f:section>
</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="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_mfa.xlf:setup.instructions')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<f:format.nl2br>{provider.setupInstructions -> f:translate(key: provider.setupInstructions, default: provider.setupInstructions)}</f:format.nl2br>
</f:be.infobox>
</html>
@@ -0,0 +1,12 @@
<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:switch expression="{item.stateIcon}">
<f:case value="-1"><core:icon identifier="status-dialog-ok" /></f:case>
<f:case value="1"><core:icon identifier="status-dialog-notification" /></f:case>
<f:case value="2"><core:icon identifier="status-dialog-warning" /></f:case>
<f:case value="3"><core:icon identifier="status-dialog-error" /></f:case>
</f:switch>
</html>
@@ -0,0 +1,60 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="tab-wrapper">
<ul class="nav nav-tabs" role="tablist" id="tabs-{id}" data-store-last-tab="{storeLastActiveTab}">
<f:for each="{items}" as="item" iteration="iteration">
<f:if condition="{item.content}">
<li role="presentation" class="nav-item">
<button
type="button"
class="nav-link {f:if(condition: '{iteration.cycle} == {defaultTabIndex}', then: ' active')}"
title="{item.linkTitle}"
data-typo3-tab="#{id}-{iteration.cycle}"
aria-controls="{id}-{iteration.cycle}"
role="tab"
>
<f:if condition="{item.icon}">
<f:format.raw>{item.icon}</f:format.raw>
</f:if>
{item.label}
<f:if condition="{item.requiredIcon}">
<f:format.raw>{item.requiredIcon}</f:format.raw>
</f:if>
<f:if condition="{item.stateIcon}">
<f:render partial="ModuleTemplate/StateIcon" arguments="{item: item}" />
</f:if>
</button>
</li>
</f:if>
</f:for>
</ul>
<div class="tab-content">
<f:for each="{items}" as="item" iteration="iteration">
<f:if condition="{item.content}">
<div role="tabpanel" class="tab-pane{f:if(condition: '{iteration.cycle} == {defaultTabIndex}', then: ' active')}" id="{id}-{iteration.cycle}">
<h2 class="visually-hidden">{item.label}</h2>
<f:if condition="{item.description}">
<div class="form-section">
<p><f:format.nl2br>{item.description}</f:format.nl2br></p>
</div>
</f:if>
<f:if condition="{wrapContent}">
<f:then>
<div class="form-section">
<f:format.raw>{item.content}</f:format.raw>
</div>
</f:then>
<f:else>
<f:format.raw>{item.content}</f:format.raw>
</f:else>
</f:if>
</div>
</f:if>
</f:for>
</div>
</div>
</html>
@@ -0,0 +1,26 @@
<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="multi-record-selection-actions-wrapper">
<div class="row row-cols-auto align-items-center gx-2 t3js-multi-record-selection-actions hidden">
<div class="col">
<strong><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.selection"/></strong>
</div>
<div class="col">
<f:for each="{actions}" as="action">
<button class="btn btn-default btn-sm"
data-multi-record-selection-action="{action.name}"
data-multi-record-selection-action-config='{action.configuration -> f:format.raw()}'
>
{action.icon -> f:format.raw()}
<span class="text">{action.label}</span>
</button>
</f:for>
</div>
</div>
</div>
</html>
@@ -0,0 +1,6 @@
<div class="t3-page-ce-actions t3js-page-new-ce">
<typo3-backend-new-content-element-wizard-button class="btn btn-default btn-sm" url="{url}" subject="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:newContentElement')}">
<core:icon identifier="actions-plus" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:createNewContent" />
</typo3-backend-new-content-element-wizard-button>
</div>
@@ -0,0 +1,20 @@
<div class="t3-grid-container{f:if(condition: grid.context.backendLayout.identifierCleaned, then: ' t3-grid-container-{grid.context.backendLayout.identifierCleaned}')}">
<div class="t3-grid-container-inner">
<table class="t3-page-columns t3-grid-table t3js-page-columns">
<f:if condition="{gridColumns}">
<colgroup>
<f:for each="{gridColumns}" as="tmpColumn">
<col span="1" style="width: calc(100% / {gridColumns -> f:count()})">
</f:for>
</colgroup>
</f:if>
<f:for each="{grid.rows}" as="row">
<tr>
<f:for each="{row.columns}" as="column">
<f:render partial="PageLayout/Grid/Column" arguments="{_all}" />
</f:for>
</tr>
</f:for>
</table>
</div>
</div>
@@ -0,0 +1,50 @@
<f:comment>
Styling requires the colpos to be set to the string 'unused'. To preserve type safety in the
controller, the string is only used in the template by setting the below "colpos" variable.
</f:comment>
<f:variable name="colpos" value="{f:if(condition: column.unused, then: 'unused', else: column.columnNumber)}"/>
<f:if condition="{languageColumns}">
<f:then>
<f:comment><!-- Language comparison view --></f:comment>
<f:variable name="columnIdentifier" value="columnIdentifier_language-{column.context.siteLanguage.languageId}_column-{colpos}" />
</f:then>
<f:else>
<f:comment><!-- Grid / Column view --></f:comment>
<f:variable name="columnIdentifier" value="columnIdentifier_column-{colpos}" />
</f:else>
</f:if>
<f:variable name="columnClasses">
t3js-page-column t3-grid-cell t3-page-column
{f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}
{f:if(condition: column.unassigned, then: 't3-grid-cell-unassigned')}
{f:if(condition: '!{column.active} && !{column.unused}', then: 't3-grid-cell-restricted')}
{f:if(condition: '!{column.active} && {hideRestrictedColumns} && !{column.unused}', then: 't3-grid-cell-hidden')}
</f:variable>
<td
valign="top"
colspan="{column.colSpan}"
rowspan="{column.rowSpan}"
data-colpos="{colpos}"
data-language-uid="{column.context.siteLanguage.languageId}"
class="{columnClasses -> f:spaceless()}"
role="group" aria-labelledby="{columnIdentifier}"
>
<f:alias map="{columnHeaderLevel: 2}">
<f:render partial="PageLayout/Grid/ColumnHeader" arguments="{_all}" />
</f:alias>
<f:if condition="{column.active} || {column.unused}">
<div data-colpos="{colpos}" data-language-uid="{column.context.siteLanguage.languageId}" class="t3-page-ce-wrapper">
<f:for each="{column.items}" as="item">
<f:render partial="PageLayout/Record" arguments="{_all}" />
</f:for>
</div>
</f:if>
<f:if condition="{column.unassigned}">
<f:be.infobox
title="{f:translate(domain: 'backend.layout', key: 'emptyColPos')}"
message="{f:translate(domain: 'backend.layout', key: 'emptyColPos.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}"
/>
</f:if>
</td>
@@ -0,0 +1,49 @@
{columnHeaderLevel -> f:or(alternative: 2) -> f:variable(name: 'columnHeaderLevel')}
<div class="t3-page-column-header">
<f:if condition="{column.active}">
<f:then>
<div class="t3-page-column-header-icons">
<f:if condition="{allowEditContent} && {column.editUrl}">
<a
class="btn btn-link"
href="{column.editUrl}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editColumn')}"
>
<core:icon identifier="actions-document-open" />
<span class="visually-hidden">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editColumn')}</span>
</a>
</f:if>
</div>
<h{columnHeaderLevel} id="{columnIdentifier}" class="t3-page-column-title">
{column.title}
<f:if condition="{context.pageContext.pageRecord.pid} !== 0 && {column.slideMode.value} !== 'none'">
<f:if condition="!({column.slideMode.value} === 'slide' && {column.items})">
<span class="badge badge-info" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:slideModeInfo.{column.slideMode.value}')}">
<f:switch expression="{column.slideMode.value}">
<f:case value="slide">{core:icon(identifier: 'actions-search', size: 'small')}{core:icon(identifier: 'actions-sort-amount-up', size: 'small')}</f:case>
<f:case value="collect">{core:icon(identifier: 'actions-cart', size: 'small')}{core:icon(identifier: 'actions-sort-amount-down', size: 'small')}</f:case>
<f:case value="collectReverse">{core:icon(identifier: 'actions-cart', size: 'small')}{core:icon(identifier: 'actions-sort-amount-up', size: 'small')}</f:case>
</f:switch>
</span>
</f:if>
</f:if>
</h{columnHeaderLevel}>
</f:then>
<f:else if="{column.unused}">
<span id="{columnIdentifier}"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:unusedColPos"/></span>
</f:else>
<f:else if="{column.unassigned}">
<span id="{columnIdentifier}">{column.titleUnassigned}</span>
</f:else>
<f:else>
<span id="{columnIdentifier}">{column.titleInaccessible}</span>
</f:else>
</f:if>
</div>
<f:if condition="{allowEditContent} && {column.contentEditable} && {column.context.allowNewContent} && {column.active}">
<div class="t3-page-ce t3js-page-ce" data-page="{column.context.pageId}">
<f:render partial="PageLayout/ActionControls" arguments="{column: column, allowEditContent: allowEditContent, url: column.newContentUrl}" />
<div class="t3-page-ce-dropzone t3js-page-ce-dropzone-available" hidden></div>
</div>
</f:if>
@@ -0,0 +1,149 @@
<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"
>
<div class="t3-grid-container{f:if(condition: context.backendLayout.identifierCleaned, then: ' t3-grid-container-{context.backendLayout.identifierCleaned}')}" data-multi-languages="{f:if(condition: context.multiLanguages, then: '1', else: '0')}">
<div class="t3-grid-container-inner">
<table class="t3-page-columns t3-grid-table t3js-page-columns">
<tr>
<f:for each="{languageColumns}" as="languageColumn">
<td valign="top"
class="t3-page-column t3-page-column-lang-name"
data-language-uid="{languageColumn.context.siteLanguage.languageId}"
data-language-title="{languageColumn.context.siteLanguage.title}"
data-flag-identifier="{languageColumn.context.siteLanguage.flagIdentifier}"
>
<typo3-backend-editable-page-title
pageTitle="{languageColumn.context.localizedPageTitle}"
pageId="{context.pageId}"
localizedPageId="{languageColumn.pageRecordUid}"
{languageColumn.allowEditPage ? 'editable' : ''}
>
{languageColumn.context.localizedPageTitle}
</typo3-backend-editable-page-title>
<div>
<core:iconForRecord table="pages" row="{languageColumn.pageRecord}" />
<core:icon identifier="{languageColumn.context.siteLanguage.flagIdentifier}" />
{languageColumn.context.siteLanguage.title}
<f:if condition="{languageColumn.context.languageMode}">
<span class="badge badge-{languageColumn.context.languageModeLabelClass}">{languageColumn.context.languageMode}</span>
</f:if>
<f:if condition="{languageColumn.translationData.hasElementsWithWorkspaceDeletePlaceholders}">
<span class="badge badge-warning"
data-bs-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:languageContainsWorkspaceDeletePlaceholderRecords')}"
data-bs-toggle="popover"
data-bs-placement="auto"
data-bs-trigger="hover focus"
>
!
</span>
</f:if>
</div>
<div class="mt-2">
<f:if condition="{languageColumn.allowViewPage}">
<button class="btn btn-default btn-sm" {f:if(condition: languageColumn.previewUrlAttributes, then: '{languageColumn.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" />
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage" />
</button>
</f:if>
<f:if condition="{languageColumn.allowEditPage}">
<typo3-backend-contextual-record-edit-trigger
url="{languageColumn.pageEditUrl}"
edit-url="{languageColumn.fullPageEditUrl}"
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editPageProperties')}"
>
<core:icon identifier="actions-open" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editPageProperties" />
</typo3-backend-contextual-record-edit-trigger>
</f:if>
<f:if condition="{allowEditContent} && {languageColumn.context.siteLanguage.languageId} && {languageColumn.translationData.untranslatedRecordUids}">
<typo3-backend-localization-button
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:newPageContent_translate')}"
record-type="pages"
record-uid="{context.pageId}"
target-language="{languageColumn.context.siteLanguage.languageId}"
>
<core:icon identifier="actions-localize" />
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:localize.wizard.button.translate" />
</typo3-backend-localization-button>
</f:if>
</div>
</td>
</f:for>
</tr>
<f:if condition="{context.multiLanguages}">
<f:then>
<f:variable name="grid" value="{languageColumns.0.grid}" />
<f:for each="{context.drawingConfiguration.activeColumns}" as="columnNumber">
<tr>
<f:for each="{languageColumns}" as="languageColumn">
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumn, columnNumber: columnNumber)}" />
<td valign="top"
data-colpos="{column.columnNumber}" data-language-uid="{column.context.siteLanguage.languageId}"
class="t3-grid-cell t3-page-column t3js-page-column {f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}">
<f:alias map="{columnHeaderLevel: 3}">
<f:render partial="PageLayout/Grid/ColumnHeader" arguments="{_all}" />
</f:alias>
</td>
</f:for>
</tr>
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumns.0, columnNumber: columnNumber)}" />
<f:for each="{column.items}" as="gridItem" iteration="itemIterator">
<tr>
<td class="t3-grid-cell t3js-page-column {f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}" valign="top" data-colpos="{column.columnNumber}">
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumns.0, columnNumber: columnNumber)}" />
<f:variable name="item" value="{gridItem}" />
<f:render partial="PageLayout/Record" arguments="{_all}" />
</td>
<f:for each="{languageColumns}" as="languageColumn">
<f:if condition="{languageColumn.context.siteLanguage.languageId} > 0">
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumn, columnNumber: columnNumber)}" />
<td class="t3-grid-cell t3js-page-column {f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}" valign="top" data-colpos="{column.columnNumber}">
<f:variable name="languageId" value="{languageColumn.context.siteLanguage.languageId}" />
<f:if condition="{languageColumn.translationData.mode} == 'connected'">
<f:then>
<f:if condition="{gridItem.translations.{languageId}}">
<f:variable name="item" value="{gridItem.translations.{languageId}}" />
<f:render partial="PageLayout/Record" arguments="{_all}" />
</f:if>
</f:then>
<f:else>
<f:if condition="{itemIterator.isFirst}">
<f:variable name="languageColumnNonConnected">{languageColumns.{languageId}}</f:variable>
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumnNonConnected, columnNumber: columnNumber)}" />
<f:for each="{column.items}" as="item">
<f:render partial="PageLayout/Record" arguments="{_all}" />
</f:for>
</f:if>
</f:else>
</f:if>
</td>
</f:if>
</f:for>
</tr>
</f:for>
</f:for>
</f:then>
<f:else>
<f:for each="{context.drawingConfiguration.activeColumns}" as="columnNumber">
<tr>
<f:for each="{languageColumns}" as="languageColumn">
<f:if condition="{languageColumn.grid.columns}">
<f:variable name="grid" value="{languageColumn.grid}" />
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumn, columnNumber: columnNumber)}" />
<f:render partial="PageLayout/Grid/Column" arguments="{_all}" />
</f:if>
</f:for>
</tr>
</f:for>
</f:else>
</f:if>
</table>
</div>
</div>
</html>
@@ -0,0 +1,36 @@
{f:if(condition: '{item.disabled} && {item.context.drawingConfiguration.showHidden} == 0', then: 'height: 0; display: none;') -> f:variable(name: 'style')}
<div
role="group"
aria-labelledby="element-{item.table}-{item.record.uid}-label"
class="t3-page-ce {item.wrapperClassName} t3js-page-ce t3js-page-ce-sortable"
id="element-{item.table}-{item.record.uid}"
data-table="{item.table}"
data-uid="{item.record.uid}"
data-language-uid="{item.record.languageId}"
data-move-element-url="{f:be.uri(route: 'move_element', parameters: '{uid: item.record.uid, originalPid: item.record.pid, expandPage: item.record.pid, returnUrl: context.returnUrl}')}"
style="{style}"
>
<span id="element-{item.table}-{item.record.uid}-label" class="visually-hidden">id={item.record.uid} - <f:if condition="{item.record.header}">{item.record.header} - </f:if>{item.contentTypeLabel}</span>
<div class="t3-page-ce-element t3-page-ce-dragitem">
<f:render partial="PageLayout/Record/{item.record.CType}/Header" arguments="{_all}" optional="1">
<f:render partial="PageLayout/RecordDefault/Header" arguments="{_all}" />
</f:render>
<f:spaceless>
<div class="t3-page-ce-body">
<f:render partial="PageLayout/RecordDefault/Preview" arguments="{_all}" />
</div>
</f:spaceless>
<f:render partial="PageLayout/Record/{item.record.CType}/Footer" arguments="{_all}" optional="1">
<f:render partial="PageLayout/RecordDefault/Footer" arguments="{_all}" />
</f:render>
<f:if condition="{item.inconsistentLanguage}">
<div class="t3-page-ce-footer">
<span class="badge badge-warning">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inconsistentLanguageWarning')}</span>
</div>
</f:if>
</div>
<f:if condition="{allowEditContent} && {item.column.contentEditable} && {column.context.allowNewContent} && {column.active}">
<f:render partial="PageLayout/ActionControls" arguments="{item: item, column: column, allowEditContent: allowEditContent, url: item.newContentAfterUrl}" />
</f:if>
<div class="t3-page-ce-dropzone t3js-page-ce-dropzone-available" hidden></div>
</div>
@@ -0,0 +1,7 @@
<f:if condition="{item.footerInfo}">
<div class="t3-page-ce-footer">
<div class="t3-page-ce-info">
{item.footerInfo -> f:format.raw()}
</div>
</div>
</f:if>
@@ -0,0 +1,60 @@
<div class="t3-page-ce-header t3js-page-ce-header" {f:if(condition: '{allowEditContent} && {item.dragAndDropAllowed}', then: 'draggable="true"')}>
<div class="t3-page-ce-header-left">
{item.icons -> f:format.raw()}
<f:if condition="{item.siteLanguage.flagIdentifier}">
<span class="t3-page-ce-header-icon-flag t3js-flag">
<span class="visually-hidden">{item.siteLanguage.title}</span>
<core:icon identifier="{item.siteLanguage.flagIdentifier}" title="{item.siteLanguage.title}" />
</span>
</f:if>
</div>
<div class="t3-page-ce-header-title">
{item.contentTypeLabel}
</div>
<div class="t3-page-ce-header-right">
<f:if condition="{item.editable} && {allowEditContent}">
<div class="btn-toolbar">
<div class="btn-group btn-group-sm">
<typo3-backend-contextual-record-edit-trigger
url="{item.contextualEditUrl}"
edit-url="{item.editUrl}"
class="btn btn-sm btn-default btn-borderless"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:edit')}"
>
<core:icon identifier="actions-open" />
</typo3-backend-contextual-record-edit-trigger>
<f:if condition="{item.visibilityToggling}">
<button type="button"
class="btn btn-sm btn-default btn-borderless"
data-action="content-element-visibility-toggle"
title="{item.visibilityToggleTitle}">
<typo3-backend-icon identifier="actions-edit-{item.visibilityToggleIconName}" size="small"></typo3-backend-icon>
</button>
</f:if>
<f:if condition="{item.delible}">
<a class="btn btn-default btn-borderless t3js-modal-trigger"
href="{item.deleteUrl}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:label.confirm.delete_record.title')}"
data-content="{item.deleteMessage}"
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_mod_web_list.xlf:delete')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:deleteItem')}">
<core:icon identifier="actions-edit-delete" size="small" />
</a>
</f:if>
<button type="button"
aria-haspopup="true"
aria-controls="contentMenu0"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
class="btn btn-sm btn-default btn-borderless"
data-contextmenu-trigger="click"
data-contextmenu-table="{item.table}"
data-contextmenu-uid="{item.record.uid}">
<core:icon identifier="actions-menu-alternative" />
</button>
</div>
</div>
</f:if>
</div>
</div>
@@ -0,0 +1,3 @@
<f:render partial="PageLayout/Record/{item.record.CType}/Preview" arguments="{_all}" optional="1">
{item.preview -> f:format.raw()}
</f:render>
@@ -0,0 +1,30 @@
<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="diff">
<f:for each="{differences}" as="differencesItem" key="key">
<div class="diff-item">
<div class="diff-item-title">
{differencesItem.title}
</div>
<div class="diff-item-result"><f:spaceless>
<f:format.raw>{differencesItem.result}</f:format.raw>
</f:spaceless></div>
<f:if condition="{differences -> f:count()} > 1">
<div class="diff-item-button col-control nowrap">
<f:if condition="{differencesItem.rollbackUrl}">
<div class="btn-group">
<a href="{differencesItem.rollbackUrl}" class="btn btn-default">
<core:icon identifier="actions-edit-undo" />
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:revertField')}
</a>
</div>
</f:if>
</div>
</f:if>
</div>
</f:for>
</div>
</html>
@@ -0,0 +1,129 @@
<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"
>
<h2>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:changes')}</h2>
<f:groupedFor each="{history}" as="historyEntries" groupBy="day" groupKey="day">
<h3>{day}</h3>
<div class="table-fit">
<table class="table table-striped table-hover table-vertical-top">
<thead>
<tr>
<th class="col-time">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:time')}</th>
<th colspan="2">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:user')}</th>
<th colspan="2">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:column.recordTitle')}</th>
<th class="col-action">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:column.action')}</th>
<th class="col-differences">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:differences')}</th>
<th class="col-control nowrap"><span class="visually-hidden">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels._CONTROL_')}</span></th>
</tr>
</thead>
<tbody>
<f:for each="{historyEntries}" as="historyRow">
<tr>
<td class="col-time">
<f:format.date format="H:i:s">{historyRow.timestamp}</f:format.date>
</td>
<td class="col-avatar">
<f:if condition="{historyRow.backendUserUid}">
<be:avatar backendUser="{historyRow.backendUserUid}" showIcon="true" />
</f:if>
</td>
<td class="col-username">
<f:if condition="{historyRow.backendUserUid}">
<f:then>
<f:if condition="{historyRow.backendUserRealName}">
<f:then>
{historyRow.backendUserRealName}
<div class="text-variant">({f:if(condition: historyRow.backendUserName, then: historyRow.backendUserName, else: '{f:translate(key: \'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:userNotFound\')}')})</div>
</f:then>
<f:else>
{f:if(condition: historyRow.backendUserName, then: historyRow.backendUserName, else: '{f:translate(key: \'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:userNotFound\')}')}
</f:else>
</f:if>
</f:then>
<f:else>
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:externalChange')}
</f:else>
</f:if>
<f:if condition="{historyRow.originalBackendUserUid}">
<div>({f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:viaUser')} {f:if(condition: historyRow.originalBackendUserName, then: historyRow.originalBackendUserName, else: '{f:translate(key: \'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:userNotFound\')}')})</div>
</f:if>
<f:if condition="{isUserInWorkspace} && {historyRow.isChangedInWorkspace}">
<br>
<span class="text-variant">
{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:workspace')}
</span>
</f:if>
</td>
<td class="col-icon nowrap">
<span title="id={historyRow.recordUid}">
<core:iconForRecord table="{historyRow.recordTable}" row="{historyRow}" alternativeMarkupIdentifier="inline" />
</span>
</td>
<td class="col-recordtitle">
{historyRow.title} ({historyRow.recordTable}:{historyRow.recordUid})
</td>
<td class="col-action">
<f:variable name="actionTypeClass">
<f:switch expression="{historyRow.actiontype}">
<f:case value="1">success</f:case>
<f:case value="2">warning</f:case>
<f:case value="3">primary</f:case>
<f:case value="4">danger</f:case>
<f:case value="7">info</f:case>
<f:defaultCase>secondary</f:defaultCase>
</f:switch>
</f:variable>
<span class="badge badge-{actionTypeClass -> f:spaceless()}">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:historyRow.actiontype.{historyRow.actiontype}" />
</span>
</td>
<td class="col-differences">
<f:if condition="{historyRow.fieldNames}">
{historyRow.fieldNames}
</f:if>
<f:if condition="{historyRow.differences}">
<f:render partial="RecordHistory/Diff" arguments="{differences: historyRow.differences}"/>
</f:if>
</td>
<td class="col-control nowrap">
<div class="btn-group">
<f:if condition="{0:recordTable,1:recordUid} !== {0:historyRow.recordTable,1:historyRow.recordUid}">
<a
href="{historyRow.elementUrl}"
title="{f:translate(id: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:linkRecordHistory')}"
class="btn btn-default"
>
<core:icon identifier="actions-filter" />
</a>
</f:if>
<f:if condition="{isUserInWorkspace} !== true || {historyRow.isChangedInWorkspace}">
<f:if condition="{editLock}">
<f:then>
<button class="btn btn-default disabled" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:editLockIsActive')}">
<core:icon identifier="actions-document-history-open" />
</button>
</f:then>
<f:else>
<a class="btn btn-default" href="{historyRow.diffUrl}" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:sumUpChanges')}">
<core:icon identifier="actions-document-history-open" />
</a>
</f:else>
</f:if>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:groupedFor>
<f:be.infobox state="{f:constant(name: '\TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:differenceMsg') -> f:format.raw()}</f:be.infobox>
</html>
@@ -0,0 +1,44 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<h2>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:mergedDifferences')}</h2>
<f:if condition="{revertAllUrl}">
<f:then>
<p><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:mergedDifferences.description" /></p>
<div class="diff-group">
<f:for each="{multipleDiff}" as="historyRow">
<h3>{historyRow.title}</h3>
<div class="row">
<div class="col">
<f:if condition="{historyRow.insertDelete} || {historyRow.fieldNames} || {historyRow.differences -> f:count()}">
<div class="diff-group">
<f:if condition="{historyRow.insertDelete} == 'delete'">
<p><strong>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:rollback.plannedAction.delete')}</strong></p>
</f:if>
<f:if condition="{historyRow.insertDelete} == 'insert'">
<p><strong>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:rollback.plannedAction.insert')}</strong></p>
</f:if>
<f:if condition="{historyRow.fieldNames}">
<p>{historyRow.fieldNames}</p>
</f:if>
<f:if condition="{historyRow.differences}">
<f:render partial="RecordHistory/Diff" arguments="{differences: historyRow.differences}"/>
</f:if>
</div>
</f:if>
</div>
</div>
<a href="{historyRow.revertRecordUrl}" class="btn btn-default">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:revertRecord')}</a>
</f:for>
</div>
<a href="{revertAllUrl}" class="btn btn-default">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:revertAll')}</a>
</f:then>
<f:else>
<p>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:noDifferences')}</p>
</f:else>
</f:if>
</html>
@@ -0,0 +1,39 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div id="element-history-settings" class="container-settings">
<form action="{settingsFormUrl}" name="recordHistorySettingsForm" method="post">
<div class="form-row-md">
<div class="form-group">
<label class="form-label" for="maxSteps"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:maxSteps" /></label>
<select class="form-select" id="maxSteps" name="settings[maxSteps]" data-global-event="change" data-action-submit="$form">
<option value="10" {f:if(condition: '{moduleSettings.maxSteps} == 10', then :'selected')}>10</option>
<option value="20" {f:if(condition: '{moduleSettings.maxSteps} == 20', then :'selected')}>20</option>
<option value="50" {f:if(condition: '{moduleSettings.maxSteps} == 50', then :'selected')}>50</option>
<option value="100" {f:if(condition: '{moduleSettings.maxSteps} == 100', then :'selected')}>100</option>
<option value="999" {f:if(condition: '{moduleSettings.maxSteps} == 999', then :'selected')}><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:maxSteps_all" /></option>
</select>
</div>
<div class="form-group">
<div class="form-check form-switch form-check-size-input">
<input type="hidden" value="0" name="settings[showDiff]" />
<input type="checkbox" id="showDiff" value="1" name="settings[showDiff]" data-global-event="change" data-action-submit="$form" class="form-check-input" {f:if(condition: '{moduleSettings.showDiff}', then: 'checked')} />
<label class="form-check-label" for="showDiff">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:showDiff" />
</label>
</div>
</div>
<div class="form-group">
<div class="form-check form-switch form-check-size-input">
<input type="hidden" value="0" name="settings[showSubElements]" />
<input type="checkbox" id="showSubElements" value="1" name="settings[showSubElements]" data-global-event="change" data-action-submit="$form" class="form-check-input" {f:if(condition: '{moduleSettings.showSubElements}', then: 'checked')} />
<label class="form-check-label" for="showSubElements">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:showSubElements" />
</label>
</div>
</div>
</div>
</form>
</div>
</html>
@@ -0,0 +1,33 @@
<f:if condition="{site.invalidSets}">
<f:variable name="renderMode">{f:if(condition: '{renderMode} == "infobox"', then: 'infobox', else: 'alert')}</f:variable>
<f:render section="{renderMode}" arguments="{
site: site,
title: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:error.site.invalidSetDependencies\')}'
}"/>
</f:if>
<f:section name="infobox">
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}" title="{title}">
<ul class="alert-message">
<f:for each="{site.invalidSets}" as="invalidSet">
<li><f:translate key="{invalidSet.error.label}" arguments="{0: invalidSet.name, 1: invalidSet.context}"/></li>
</f:for>
</ul>
</f:be.infobox>
</f:section>
<f:section name="alert">
<div class="alert alert-danger mt-2">
<div class="alert-inner">
<div class="alert-content">
<div class="alert-title">{title}</div>
<ul class="alert-message">
<f:for each="{site.invalidSets}" as="invalidSet">
<li><f:translate key="{invalidSet.error.label}" arguments="{0: invalidSet.name, 1: invalidSet.context}"/></li>
</f:for>
</ul>
</div>
</div>
</div>
</f:section>
@@ -0,0 +1,5 @@
<span class="toolbar-item-icon" title="{f:translate(key: title, default: title)}" aria-hidden="true">{icon -> f:format.raw()}</span>
<span class="toolbar-item-title">{f:translate(key: title) -> f:format.raw()}</span>
<f:if condition="{name}">
<span class="toolbar-item-name">{name -> f:format.raw()}</span>
</f:if>