TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:33 +02:00
commit 1a6eae9988
124 changed files with 11393 additions and 0 deletions
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/Modules/qrcodes.xlf" date="2025-11-13T18:00:15Z" product-name="redirects">
<header/>
<body>
<trans-unit id="title">
<source>QR Codes</source>
</trans-unit>
<trans-unit id="short_description">
<source>QR Codes Administration</source>
</trans-unit>
<trans-unit id="description">
<source>Generate and customize QR codes to provide quick, scannable access to your digital content.</source>
</trans-unit>
<trans-unit id="heading_text">
<source>QR Code Management</source>
</trans-unit>
<trans-unit id="add_text">
<source>Add QR Code</source>
</trans-unit>
<trans-unit id="not_found_with_filter.message">
<source>No QR Code could be found with the current set of filters applied.</source>
</trans-unit>
<trans-unit id="not_found.title">
<source>No QR Codes found</source>
</trans-unit>
<trans-unit id="not_found.message">
<source>There are currently no QR Codes found in the database.</source>
</trans-unit>
<trans-unit id="create">
<source>Create new QR Code</source>
</trans-unit>
<trans-unit id="delete.title">
<source>Delete QR Codes</source>
</trans-unit>
<trans-unit id="delete.message">
<source>Delete all marked QR Codes permanently? You cannot undo this action.</source>
</trans-unit>
<trans-unit id="download">
<source>Download</source>
</trans-unit>
<trans-unit id="show">
<source>Show QR Code</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/Modules/redirects.xlf" date="2026-11-10T13:37:37Z" product-name="redirects">
<header/>
<body>
<trans-unit id="short_description">
<source>Redirect Administration</source>
</trans-unit>
<trans-unit id="description">
<source>Manage URL redirects to prevent broken links and route traffic to preferred destinations.</source>
</trans-unit>
<trans-unit id="title">
<source>Redirects</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/Modules/short_urls.xlf" date="2025-11-13T18:00:15Z" product-name="redirects">
<header/>
<body>
<trans-unit id="title">
<source>Short URLs</source>
</trans-unit>
<trans-unit id="short_description">
<source>Short URLs Administration</source>
</trans-unit>
<trans-unit id="description">
<source>Create and manage Short URLs that redirect to longer links for easier sharing and tracking.</source>
</trans-unit>
<trans-unit id="heading_text">
<source>Short URL Management</source>
</trans-unit>
<trans-unit id="add_text">
<source>Add Short URL</source>
</trans-unit>
<trans-unit id="not_found_with_filter.message">
<source>No Short URL could be found with the current set of filters applied.</source>
</trans-unit>
<trans-unit id="not_found.title">
<source>No Short URLs found</source>
</trans-unit>
<trans-unit id="not_found.message">
<source>There are currently no Short URLs found in the database.</source>
</trans-unit>
<trans-unit id="create">
<source>Create new Short URL</source>
</trans-unit>
<trans-unit id="delete.title">
<source>Delete Short URLs</source>
</trans-unit>
<trans-unit id="delete.message">
<source>Delete all marked Short URLs permanently? You cannot undo this action.</source>
</trans-unit>
<trans-unit id="show">
<source>Show Short URL</source>
</trans-unit>
<trans-unit id="generate_short_url">
<source>Generate Short URL</source>
</trans-unit>
<trans-unit id="validation.duplicate_short_url">
<source>This Short URL already exists. Please choose a different source host or source path.</source>
</trans-unit>
</body>
</file>
</xliff>
+56
View File
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/locallang.xlf" date="2017-12-29T20:22:14Z" product-name="redirects">
<header/>
<body>
<trans-unit id="redirects">
<source>Redirect Settings</source>
</trans-unit>
<trans-unit id="redirects.autoUpdateSlugs">
<source>Update the slugs of all sub pages automatically</source>
</trans-unit>
<trans-unit id="redirects.autoCreateRedirects">
<source>Create redirects for pages with a new slug automatically</source>
</trans-unit>
<trans-unit id="redirects.redirectTTL">
<source>Time To Live of redirect records in days</source>
</trans-unit>
<trans-unit id="redirects.httpStatusCode">
<source>HTTP Status Code for the redirect, 301 is the default</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.days">
<source>Cleanup redirects older than provided number of days</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.domain">
<source>Cleanup redirects matching provided domain(s)</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.hitCount">
<source>Cleanup redirects matching hit counts lower than given number</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.path">
<source>Cleanup redirects matching given path (as database like expression)</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.creationType">
<source>Cleanup redirects matching provided creation type</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.statusCode">
<source>Cleanup redirects matching provided status code(s)</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.integrityStatus">
<source>Cleanup redirects matching provided integrity status</source>
</trans-unit>
<trans-unit id="cleanupRedirectsCommand.label.redirectType">
<source>Cleanup redirects matching provided redirect type</source>
</trans-unit>
<trans-unit id="created_on">
<source>on</source>
</trans-unit>
<trans-unit id="not_tracked">
<source>[Not Tracked]</source>
</trans-unit>
<trans-unit id="no_qrcode">
<source>Not enough information for generating a QR Code.</source>
</trans-unit>
</body>
</file>
</xliff>
+149
View File
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/locallang_db.xlf" date="2017-12-29T20:22:14Z" product-name="redirects">
<header/>
<body>
<trans-unit id="sys_redirect">
<source>Redirect</source>
</trans-unit>
<trans-unit id="sys_redirect.redirect_type.qr_code">
<source>QR Code</source>
</trans-unit>
<trans-unit id="sys_redirect.redirect_type.short_url">
<source>Short URL</source>
</trans-unit>
<trans-unit id="sys_redirect.source_host">
<source>Source Domain</source>
</trans-unit>
<trans-unit id="sys_redirect.source_path">
<source>Source Path</source>
</trans-unit>
<trans-unit id="sys_redirect.force_https">
<source>SSL Redirect</source>
</trans-unit>
<trans-unit id="sys_redirect.force_https.0">
<source>Force SSL Redirect</source>
</trans-unit>
<trans-unit id="sys_redirect.keep_query_parameters">
<source>GET Parameters</source>
</trans-unit>
<trans-unit id="sys_redirect.keep_query_parameters.0">
<source>Keep GET Parameters</source>
</trans-unit>
<trans-unit id="sys_redirect.respect_query_parameters">
<source>GET Parameters (source)</source>
</trans-unit>
<trans-unit id="sys_redirect.respect_query_parameters.0">
<source>Respect GET Parameters</source>
</trans-unit>
<trans-unit id="sys_redirect.target">
<source>Target</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode">
<source>Status Code HTTP Header</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.301">
<source>301 Moved Permanently</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.302">
<source>302 Found</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.303">
<source>303 See Other</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.307">
<source>307 Temporary Redirect</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.308">
<source>308 Permanent Redirect</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.keep">
<source>Keep HTTP method</source>
</trans-unit>
<trans-unit id="sys_redirect.target_statuscode.change">
<source>Change HTTP method to GET</source>
</trans-unit>
<trans-unit id="sys_redirect.hitcount">
<source>Hit count</source>
</trans-unit>
<trans-unit id="sys_redirect.lasthiton">
<source>Last Hit on</source>
</trans-unit>
<trans-unit id="sys_redirect.hitcountState">
<source>Hit Counter</source>
</trans-unit>
<trans-unit id="sys_redirect.disable_hitcount">
<source>Disable Hit Counter</source>
</trans-unit>
<trans-unit id="sys_redirect.disable_hitcount.0">
<source>Disable</source>
</trans-unit>
<trans-unit id="tabs.redirectCount">
<source>Statistics</source>
</trans-unit>
<trans-unit id="sys_redirect.protected">
<source>Protected</source>
</trans-unit>
<trans-unit id="sys_redirect.protected.description">
<source>When enabled, this redirect will be skipped by scheduled cleanup tasks that might delete redirects under certain conditions.</source>
</trans-unit>
<trans-unit id="sys_redirect.is_regexp">
<source>Is regular expression?</source>
</trans-unit>
<trans-unit id="sys_redirect.is_regexp.0">
<source>Yes</source>
</trans-unit>
<trans-unit id="sys_redirect.disabled">
<source>Disable</source>
</trans-unit>
<trans-unit id="sys_redirect.disabled.0">
<source>Deactivate redirect</source>
</trans-unit>
<trans-unit id="sys_redirect.creation_type">
<source>Creation Type</source>
</trans-unit>
<trans-unit id="sys_redirect.creation_type.description">
<source>Defines how the redirect was created.</source>
</trans-unit>
<trans-unit id="sys_redirect.creation_type.1">
<source>manually created</source>
</trans-unit>
<trans-unit id="sys_redirect.creation_type.0">
<source>automatically created</source>
</trans-unit>
<trans-unit id="sys_redirect.webhook_type.typo3-redirect-was-hit">
<source>... when a redirect has been hit</source>
</trans-unit>
<trans-unit id="sys_redirect.integrity_status">
<source>Integrity status</source>
</trans-unit>
<trans-unit id="sys_redirect.integrity_status.description">
<source>Redirects can be checked via the command redirects:checkintegrity.</source>
</trans-unit>
<trans-unit id="sys_redirect.integrity_status.no_conflict">
<source>No conflict</source>
</trans-unit>
<trans-unit id="sys_redirect.integrity_status.self_reference">
<source>Self reference</source>
</trans-unit>
<trans-unit id="sys_redirect.integrity_status.invalid_target">
<source>Invalid target</source>
</trans-unit>
<trans-unit id="sys_redirect.uid">
<source>UID</source>
</trans-unit>
<trans-unit id="sys_redirect.createdby">
<source>Created by</source>
</trans-unit>
<trans-unit id="sys_redirect.short_url">
<source>Short URL</source>
</trans-unit>
<trans-unit id="sys_redirect.short_url.description">
<source>Enter a Short URL or generate a random one automatically. Once saved, the Short URL cannot be changed.</source>
</trans-unit>
<trans-unit id="sys_redirect.short_url.shortUrlGenerator">
<source>Generate Short URL</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/locallang_extconf.xlf" date="2023-06-19T06:49:15Z" product-name="redirects">
<header/>
<body>
<trans-unit id="showCheckintegrityInfoInReports.enable">
<source>Show report warning if checkintegrity has not been run.</source>
</trans-unit>
<trans-unit id="showCheckintegrityInfoInReports.seconds">
<source>Set validity period (seconds) for the last checkintegrity report.</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf" date="2017-12-29T20:23:34Z" product-name="redirects">
<header/>
<body>
<trans-unit id="source_host_global_text">
<source>Global redirect (any domain)</source>
</trans-unit>
<trans-unit id="heading_text">
<source>Redirect Management</source>
</trans-unit>
<trans-unit id="redirect_add_text">
<source>Add redirect</source>
</trans-unit>
<trans-unit id="redirect_not_found.title">
<source>No redirects found</source>
</trans-unit>
<trans-unit id="redirect_not_found.message">
<source>There are currently no redirect records found in the database.</source>
</trans-unit>
<trans-unit id="redirect_create">
<source>Create new redirect</source>
</trans-unit>
<trans-unit id="noAccessPermissions.title">
<source>Access denied</source>
</trans-unit>
<trans-unit id="noAccessPermissions.message">
<source>You are not allowed to list or modify redirects due to insufficient permissions.</source>
</trans-unit>
<trans-unit id="redirect_not_found_with_filter.title">
<source>No redirects found</source>
</trans-unit>
<trans-unit id="redirect_not_found_with_filter.message">
<source>With the current set of filters applied, no redirect could be found.</source>
</trans-unit>
<trans-unit id="redirect_no_filter">
<source>Remove all filter</source>
</trans-unit>
<trans-unit id="filter.source_host.showAll">
<source>Show All</source>
</trans-unit>
<trans-unit id="filter.targetStatusCode">
<source>Status Code</source>
</trans-unit>
<trans-unit id="filter.creationType">
<source>Creation type</source>
</trans-unit>
<trans-unit id="filter.creationType.showAll">
<source>Show All</source>
</trans-unit>
<trans-unit id="filter.protected">
<source>Protected</source>
</trans-unit>
<trans-unit id="filter.protected.showAll">
<source>Show All</source>
</trans-unit>
<trans-unit id="filter.protected.unprotected">
<source>unprotected</source>
</trans-unit>
<trans-unit id="filter.protected.protected">
<source>protected</source>
</trans-unit>
<trans-unit id="filter.integrityStatus">
<source>Integrity status</source>
</trans-unit>
<trans-unit id="filter.integrityStatus.showAll">
<source>Show All</source>
</trans-unit>
<trans-unit id="filter.neverHit">
<source>Never hit</source>
</trans-unit>
<trans-unit id="filter.sendButton">
<source>Filter</source>
</trans-unit>
<trans-unit id="filter.resetButton">
<source>Reset</source>
</trans-unit>
<trans-unit id="record_disabled">
<source>Disabled</source>
</trans-unit>
<trans-unit id="source_path.placeholder">
<source>/my-path/ or #^/my-path/$# (when regex enabled)</source>
</trans-unit>
<trans-unit id="short_url.source_path.placeholder">
<source>e.g. /AbCdEfGh</source>
</trans-unit>
<trans-unit id="short_url.copy">
<source>Copy Short URL to clipboard</source>
</trans-unit>
<trans-unit id="pageID">
<source>Page ID</source>
</trans-unit>
<trans-unit id="destination_status_code">
<source>Status Code</source>
</trans-unit>
<trans-unit id="hit_reset">
<source>Reset hit counter</source>
</trans-unit>
<trans-unit id="hit_reset.confirm.title">
<source>Reset the hit counter of this record?</source>
</trans-unit>
<trans-unit id="hit_reset.confirm.content">
<source>Are you sure you want to reset the hit counter of this record?</source>
</trans-unit>
<trans-unit id="hit_last_never">
<source>Never</source>
</trans-unit>
<trans-unit id="visit_destination">
<source>Go to</source>
</trans-unit>
<trans-unit id="view_redirect">
<source>View redirect</source>
</trans-unit>
<trans-unit id="overview.tableHead.protected">
<source>Protected</source>
</trans-unit>
<trans-unit id="overview.tableField.protected.no">
<source>No</source>
</trans-unit>
<trans-unit id="overview.tableField.protected.yes">
<source>Yes</source>
</trans-unit>
<trans-unit id="labels.delete.title">
<source>Delete redirects</source>
</trans-unit>
<trans-unit id="labels.delete.message">
<source>Are you sure you want to delete all marked redirects?</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/locallang_reports.xlf" date="2019-09-05T15:20:15Z" product-name="redirects">
<header/>
<body>
<trans-unit id="statusProvider">
<source>Redirects</source>
</trans-unit>
<trans-unit id="status.conflictingRedirects">
<source>Conflicting Redirects</source>
</trans-unit>
<trans-unit id="status.conflictingRedirects.none">
<source>None</source>
</trans-unit>
<trans-unit id="status.conflictingRedirects.count">
<source>%1$s conflicting redirects</source>
</trans-unit>
<trans-unit id="status.conflictingRedirects.message">
<source>These redirects cause a conflict as there are pages that are still accessible with the same URL.</source>
</trans-unit>
<trans-unit id="status.checkIntegrityResultState">
<source>Redirects integrity check</source>
</trans-unit>
<trans-unit id="status.checkIntegrityResultState.title">
<source>List of conflicting redirects may not be up to date</source>
</trans-unit>
<trans-unit id="status.checkIntegrityResultState.message">
<source>Regularly run the console command redirects:checkintegrity.</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="EXT:redirects/Resources/Private/Language/locallang_slug_service.xlf" date="2017-12-29T20:23:34Z" product-name="redirects">
<header/>
<body>
<trans-unit id="notification.slug_and_redirects.title">
<source>Slugs updated and redirects created</source>
</trans-unit>
<trans-unit id="notification.slug_and_redirects.message">
<source>Because you renamed a slug, the slugs of all sub-pages were updated and redirects were created for you automatically.</source>
</trans-unit>
<trans-unit id="notification.slug_only.title">
<source>Slugs updated</source>
</trans-unit>
<trans-unit id="notification.slug_only.message">
<source>Because you renamed a slug, the slugs of all sub-pages were updated for you automatically.</source>
</trans-unit>
<trans-unit id="notification.redirects.button.revert_update">
<source>Revert update</source>
</trans-unit>
<trans-unit id="notification.redirects.button.revert_redirect">
<source>Revert redirects only</source>
</trans-unit>
<trans-unit id="redirects_error_title">
<source>An error occurred</source>
</trans-unit>
<trans-unit id="redirects_error_message">
<source>Sorry something went wrong.</source>
</trans-unit>
<trans-unit id="revert_update_success_title">
<source>Revert successful</source>
</trans-unit>
<trans-unit id="revert_update_success_message">
<source>All slug changes of sub pages have been reverted.</source>
</trans-unit>
<trans-unit id="revert_redirects_success_title">
<source>Revert successful</source>
</trans-unit>
<trans-unit id="revert_redirects_success_message">
<source>All created redirects have been reverted.</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,88 @@
<f:if condition="{pagination.numberOfPages} > 1">
<nav class="pagination-wrap">
<ul class="pagination">
<f:if condition="{pagination.hasLessPages}">
<f:then>
<li class="page-item">
<a href="{f:be.uri(route: route, parameters: '{demand: demand.parameters, orderField: demand.orderField, orderDirection: demand.orderDirection, page: 1}')}" title="{f:translate(extensionName: 'fluid', key:'widget.pagination.first')}" class="page-link">
<core:icon identifier="actions-view-paging-first" />
</a>
</li>
<li class="page-item">
<a href="{f:be.uri(route: route, parameters: '{demand: demand.parameters, orderField: demand.orderField, orderDirection: demand.orderDirection, page: pagination.previousPage}')}" title="{f:translate(extensionName: 'fluid', key:'widget.pagination.previous')}" class="page-link">
<core:icon identifier="actions-view-paging-previous" />
</a>
</li>
</f:then>
<f:else>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
</f:else>
</f:if>
<li class="page-item">
<span class="page-link">
<f:translate key="title" domain="redirects.module"/>
{pagination.startRecord} - {pagination.endRecord}
</span>
</li>
<li class="page-item">
<span class="page-link">
<f:translate extensionName="fluid" key="widget.pagination.page" />
<f:variable name="gotToPageUrl">
<f:be.uri route="redirects" parameters="{demand: demand.parameters, orderField: demand.orderField, orderDirection: demand.orderDirection, page: 987654322}" />
</f:variable>
<form data-on-submit="processNavigate" class="form-inline">
<input type="number"
value="{pagination.current}"
name="paginator-target-page"
class="form-control form-control-sm paginator-input"
min="1"
max="{pagination.numberOfPages}"
data-number-of-pages="{pagination.numberOfPages}"
data-url="{gotToPageUrl}" />
</form>
/ {pagination.numberOfPages}
</span>
</li>
<f:if condition="{pagination.hasMorePages}">
<f:then>
<li class="page-item">
<a href="{f:be.uri(route: route, parameters: '{demand: demand.parameters, page: pagination.nextPage, orderField: demand.orderField, orderDirection: demand.orderDirection}')}" title="{f:translate(extensionName: 'fluid', key:'widget.pagination.next')}" class="page-link">
<core:icon identifier="actions-view-paging-next" />
</a>
</li>
<li class="page-item">
<a href="{f:be.uri(route: route, parameters: '{demand: demand.parameters, page: pagination.numberOfPages, orderField: demand.orderField, orderDirection: demand.orderDirection}')}" title="{f:translate(extensionName: 'fluid', key:'widget.pagination.last')}" class="page-link">
<core:icon identifier="actions-view-paging-last" />
</a>
</li>
</f:then>
<f:else>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
<li class="page-item disabled">
<span class="page-link">
<core:icon identifier="empty-empty"/>
</span>
</li>
</f:else>
</f:if>
<li class="page-item">
<a href="{f:be.uri(route: route, parameters: '{demand: demand.parameters, page: demand.page, orderField: demand.orderField, orderDirection: demand.orderDirection}')}" title="{f:translate(extensionName: 'fluid', key:'widget.pagination.refresh')}" class="page-link">
<core:icon identifier="actions-refresh" />
</a>
</li>
</ul>
</nav>
</f:if>
@@ -0,0 +1,499 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:rd="http://typo3.org/ns/TYPO3/CMS/Redirects/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="{canListRedirects}">
<f:then>
<f:render section="overview" arguments="{_all}" />
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}"
message="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:noAccessPermissions.message')}"
title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:noAccessPermissions.title')}"
/>
</f:else>
</f:if>
</f:section>
<f:section name="overview">
<f:asset.module identifier="@typo3/backend/modal.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-edit-action.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-delete-action.js"/>
<f:asset.module identifier="@typo3/redirects/redirects-module.js"/>
<h1><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:heading_text"/></h1>
<f:if condition="{redirects -> f:count()}">
<f:then>
<f:render section="filter" arguments="{_all}" />
<f:render section="table" arguments="{_all}" />
</f:then>
<f:else>
<f:if condition="{demand.constraints}">
<f:then>
<f:render section="filter" arguments="{_all}" />
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::NOTICE')}" title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_not_found_with_filter.title')}">
<p><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_not_found_with_filter.message"/></p>
<a class="btn btn-default" href="{f:be.uri(route:'redirects')}">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_no_filter"/>
</a>
<be:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="sys_redirect">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_create"/>
</be:link.newRecord>
</f:be.infobox>
<f:variable name="gotToPageUrl"><f:be.uri route="redirects" parameters="{demand: demand.parameters, page: 987654322}" /></f:variable>
<form data-on-submit="processNavigate">
<input type="hidden" value="1" name="paginator-target-page" data-number-of-pages="1" data-url="{gotToPageUrl}"/>
</form>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_not_found.title')}">
<p><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_not_found.message"/></p>
<f:if condition="{canEditRedirects}">
<be:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="sys_redirect">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_create"/>
</be:link.newRecord>
</f:if>
</f:be.infobox>
</f:else>
</f:if>
</f:else>
</f:if>
</f:section>
<f:section name="table">
<f:comment>Partial is used from EXT:backend/Resources/Private/Partials/MultiRecordSelection/redirectss.html</f:comment>
<f:render partial="MultiRecordSelection/Actions" arguments="{actions: actions}"/>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="col-checkbox" colspan="2">
<div class="dropdown">
<button type="button" class="dropdown-toggle dropdown-toggle-link t3js-multi-record-selection-check-actions-toggle" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.openSelectionOptions')}" popovertarget="redirects-selection">
<core:icon identifier="actions-selection" size="small" />
</button>
<ul id="redirects-selection" class="dropdown-menu t3js-multi-record-selection-check-actions" popover>
<li>
<button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-all" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll" />
</span>
</span>
</button>
</li>
<li>
<button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-none" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll" />
</span>
</span>
</button>
</li>
<li>
<button type="button" class="dropdown-item" data-multi-record-selection-check-action="toggle" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-invert" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection" />
</span>
</span>
</button>
</li>
</ul>
</div>
</th>
<th class="col-path">
<f:render section="listHeaderSorting" arguments="{field: 'source_host', label: 'sys_redirect.source_host', demand: demand}"/>
</th>
<th class="col-path">
<f:render section="listHeaderSorting" arguments="{field: 'source_path', label: 'sys_redirect.source_path', demand: demand}"/>
</th>
<th class="col-path"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.target"/></th>
<th><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:destination_status_code"/></th>
<th><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:overview.tableHead.protected"/></th>
<f:if condition="{showHitCounter}">
<th><f:render section="listHeaderSorting" arguments="{field: 'hitcount', label: 'sys_redirect.hitcount', demand: demand}"/></th>
<th class="col-datetime"><f:render section="listHeaderSorting" arguments="{field: 'lasthiton', label: 'sys_redirect.lasthiton', demand: demand}"/></th>
</f:if>
<th class="col-control">
<span class="visually-hidden"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels._CONTROL_"/></span>
</th>
</tr>
</thead>
<tbody data-multi-record-selection-row-selection="true">
<f:for each="{redirects}" key="domainName" as="redirect">
<tr
class="{f:if(condition: '{redirect.integrity_status} && {redirect.integrity_status} !== {defaultIntegrityStatus}', then: 'danger')}"
data-uid="{redirect.uid}"
data-multi-record-selection-element="true"
>
<td class="col-checkbox">
<span class="form-check form-check-type-toggle">
<input class="form-check-input t3js-multi-record-selection-check" type="checkbox">
</span>
</td>
<td class="col-icon">
<f:alias map="{
disable: '{f:translate(key: \'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:record_disabled\')}',
onlystart: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:start\')}: {f:format.date(date: redirect.starttime, format: \'Y-m-d H:i\')}',
onlyend: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:stop\')}: {f:format.date(date: redirect.endtime, format: \'Y-m-d H:i\')}',
startend: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:start\')}: {f:format.date(date: redirect.starttime, format: \'Y-m-d H:i\')} - {f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:stop\')}: {f:format.date(date: redirect.endtime, format: \'Y-m-d H:i\')}'
}">
<f:if condition="{redirect.disabled}">
<f:then><span title="{disable}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:then>
<f:else if="{redirect.starttime} && !{redirect.endtime}"><span title="{onlystart}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else if="!{redirect.starttime} && {redirect.endtime}"><span title="{onlyend}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else if="{redirect.starttime} && {redirect.endtime}"><span title="{startend}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else><span><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
</f:if>
</f:alias>
</td>
<td class="col-path">{redirect.source_host}</td>
<td class="col-path">
<f:if condition="{canEditRedirects}">
<f:then>
<be:link.editRecord
returnUrl="{returnUrl}"
table="sys_redirect"
uid="{redirect.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}: {redirect.source_path}"
>
{redirect.source_path}
</be:link.editRecord>
</f:then>
<f:else>
{redirect.source_path}
</f:else>
</f:if>
</td>
<td class="col-path">
<f:variable name="targetUri" value="{f:uri.typolink(parameter:redirect.target)}" />
<f:link.typolink
parameter="{redirect.target}"
target="_blank"
title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:visit_destination')} {f:if(condition: targetUri, then:targetUri, else:redirect.target)}"
>
{f:if(condition: targetUri, then:targetUri, else:redirect.target)}
</f:link.typolink>
<f:variable name="pageRow" value="{rd:targetPageRecord(target:redirect.target)}" />
<f:if condition="{pageRow}">(<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:pageID"/>:
<be:link.editRecord
table="pages"
uid="{pageRow.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}: {redirect.source_path}"
><core:iconForRecord table="pages" row="{pageRow}" /> {pageRow.uid}</be:link.editRecord>)</f:if>
</td>
<td>{redirect.target_statuscode}</td>
<td>
<f:if condition="{redirect.protected}">
<f:then>
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:overview.tableField.protected.yes"/>
</f:then>
<f:else>
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:overview.tableField.protected.no"/>
</f:else>
</f:if>
</td>
<f:if condition="{showHitCounter}">
<td>
<f:if condition="!{redirect.disable_hitcount}">
{redirect.hitcount}
</f:if>
</td>
<td class="col-datetime">
<f:if condition="{redirect.lasthiton}">
<f:then><f:format.date format="Y-m-d H:i">@{redirect.lasthiton}</f:format.date></f:then>
<f:else><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_last_never"/></f:else>
</f:if>
</td>
</f:if>
<td class="col-control">
<div class="btn-group" role="group">
<f:if condition="{canEditRedirects}">
<f:then>
<be:link.editRecord
returnUrl="{returnUrl}"
class="btn btn-default"
table="sys_redirect"
uid="{redirect.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}"
>
<core:icon identifier="actions-open" />
</be:link.editRecord>
<f:if condition="{redirect.disabled} == 1">
<f:then>
<a
class="btn btn-default"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][disabled]=0', arguments:'{redirect: returnUrl}')}"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:unHide')}"
>
<core:icon identifier="actions-edit-unhide" />
</a>
</f:then>
<f:else>
<a
class="btn btn-default"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][disabled]=1', arguments:'{redirect: returnUrl}')}"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:hide')}"
>
<core:icon identifier="actions-edit-hide" />
</a>
</f:else>
</f:if>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'tce_db', query:'cmd[sys_redirect][{redirect.uid}][delete]=1', arguments:'{redirect: returnUrl}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:delete')}"
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="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:deleteWarning')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_record.no')}">
<core:icon identifier="actions-delete" />
</a>
</f:then>
<f:else>
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
</div>
<div class="btn-group" role="group">
<f:if condition="{redirect.is_regexp} || ({redirect.source_host} === '*')">
<f:else>
<f:variable name="showPreviewButton" value="1" />
</f:else>
</f:if>
<f:if condition="{showHitCounter} && !{redirect.disable_hitcount}">
<f:variable name="showHitCountResetButton" value="{f:if(condition: '{redirect.hitcount} != 0', then: '1', else: '0')}" />
</f:if>
<f:if condition="{showPreviewButton} || {showHitCountResetButton}">
<f:then>
<button
type="button"
class="btn btn-default dropdown-toggle dropdown-toggle-no-chevron"
popovertarget="actions-{redirect.uid}"
>
<core:icon identifier="actions-menu-alternative" />
</button>
<ul id="actions-{redirect.uid}" class="dropdown-menu" popover>
<f:if condition="{showPreviewButton}">
<li>
<f:link.external
class="dropdown-item"
uri="{redirect.source_host}{redirect.source_path}"
target="_blank"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-{cacheAction.severity}">
<core:icon identifier="actions-view-page" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:view_redirect" />
</span>
</span>
</f:link.external>
</li>
</f:if>
<f:if condition="{showHitCountResetButton}">
<li>
<a
class="dropdown-item t3js-modal-trigger"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][hitcount]=0', arguments:'{redirect: returnUrl}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_reset.confirm.title')}"
data-content="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_reset.confirm.content')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_record.no')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon">
<core:icon identifier="actions-edit-restore" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_reset" />
</span>
</span>
</a>
</li>
</f:if>
</ul>
</f:then>
<f:else if="{canEditRedirects}">
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
<f:render partial="MultiRecordSelection/Actions" arguments="{actions: actions}"/>
<f:render partial="Pagination" arguments="{route: 'redirects', demand: demand, pagination: pagination, gotToPageUrl: gotToPageUrl}" />
</f:section>
<f:section name="listHeaderSorting">
<div class="dropdown">
<button class="dropdown-toggle dropdown-toggle-link" type="button" popovertarget="redirects-selection-sorting-{field}">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:{label}"/>
<f:if condition="{demand.orderField} === {field}">
<f:then>
<div class="text-primary">
<f:if condition="{demand.orderDirection} === asc">
<f:then>
<core:icon identifier="actions-sort-amount-up" />
</f:then>
<f:else>
<core:icon identifier="actions-sort-amount-down" />
</f:else>
</f:if>
</div>
</f:then>
<f:else>
<div>
<core:icon identifier="empty-empty" />
</div>
</f:else>
</f:if>
</button>
<ul id="redirects-selection-sorting-{field}" class="dropdown-menu" popover>
<li>
<a
class="dropdown-item"
href="{f:be.uri(route:'redirects', parameters: '{demand: demand.parameters, orderField: field, orderDirection: demand.defaultOrderDirection}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{demand.orderField} === {field}">
<f:if condition="{demand.orderDirection} === asc">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}
</span>
</span>
</a>
</li>
<li>
<a
class="dropdown-item"
href="{f:be.uri(route:'redirects', parameters: '{demand: demand.parameters, orderField: field, orderDirection: demand.reverseOrderDirection}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{demand.orderField} === {field}">
<f:if condition="{demand.orderDirection} === desc">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}
</span>
</span>
</a>
</li>
</ul>
</div>
</f:section>
<f:section name="filter">
<form action="{f:be.uri(route:'redirects')}" method="post" enctype="multipart/form-data" name="demand">
<input type="hidden" name="orderField" value="{demand.orderField}">
<input type="hidden" name="orderDirection" value="{demand.orderDirection}">
<input type="hidden" name="redirectType" value="{f:constant(name: '\TYPO3\CMS\Redirects\Repository\Demand::DEFAULT_REDIRECT_TYPE')}">
<div class="form-row">
<div class="form-group">
<label for="demand-source-host" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.source_host"/></label>
<select id="demand-source-host" class="form-select" name="demand[source_host]" data-on-change="submit">
<option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option>
<f:for each="{hosts}" as="host">
<option value="{host.name}" {f:if(condition: '{host.name} == {demand.firstSourceHost}', then: 'selected')}>{host.name}</option>
</f:for>
</select>
</div>
<div class="form-group">
<label for="demand-source-path" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.source_path"/></label>
<input type="text" id="demand-source-path" class="form-control" name="demand[source_path]" value="{demand.sourcePath}"/>
</div>
<div class="form-group">
<label for="demand-target" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.target"/></label>
<input type="text" id="demand-target" class="form-control" name="demand[target]" value="{demand.target}"/>
</div>
<div class="form-group">
<label for="demand-target-status-code" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.targetStatusCode"/></label>
<select id="demand-target-status-code" class="form-select" name="demand[target_statuscode]" data-on-change="submit">
<option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option>
<f:for each="{statusCodes}" as="statusCode">
<option value="{statusCode.code}" {f:if(condition: '{statusCode.code} == {demand.firstStatusCode}', then: 'selected')}>{statusCode.code}</option>
</f:for>
</select>
</div>
<div class="form-group">
<label for="demand-target-automatically-created" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.creationType"/></label>
<select id="demand-target-automatically-created" class="form-select" name="demand[creation_type]" data-on-change="submit">
<option value="-1"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.creationType.showAll"/></option>
<f:for each="{creationTypes}" key="creationType" as="label">
<option value="{creationType}" {f:if(condition: '{demand.creationType} == {creationType}', then: 'selected')}>{f:translate(key: label, default: label)}</option>
</f:for>
</select>
</div>
<div class="form-group">
<label for="demand-integrity-status" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.integrityStatus"/></label>
<select id="demand-integrity-status" class="form-select" name="demand[integrity_status]" data-on-change="submit">
<option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.integrityStatus.showAll"/></option>
<f:for each="{integrityStatusCodes}" key="integrityStatusCode" as="label">
<option value="{integrityStatusCode}" {f:if(condition: '{demand.integrityStatus} == {integrityStatusCode}', then: 'selected')}>{f:translate(key: label, default: label)}</option>
</f:for>
</select>
</div>
<div class="form-group">
<label for="demand-target-protected" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.protected"/></label>
<select id="demand-target-protected" class="form-select" name="demand[protected]" data-on-change="submit">
<option value="-1"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.protected.showAll"/></option>
<option value="0" {f:if(condition: '{demand.protected} == 0', then: 'selected')}><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.protected.unprotected"/></option>
<option value="1" {f:if(condition: '{demand.protected} == 1', then: 'selected')}><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.protected.protected"/></option>
</select>
</div>
<f:if condition="{showHitCounter}">
<div class="form-group align-self-end">
<div class="form-check form-switch form-check-size-input">
<input type="checkbox" class="form-check-input" name="demand[max_hits]" id="demand-never-hit" value="1" data-on-change="submit" {f:if(condition: demand.maxHits, then: 'checked="checked"')}>
<label class="form-check-label" for="demand-never-hit">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.neverHit"/>
</label>
</div>
</div>
</f:if>
<div class="form-group align-self-end">
<input type="submit" value="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.sendButton')}" class="btn btn-default" />
<a href="{f:be.uri(route:'redirects')}" class="btn btn-link"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.resetButton"/></a>
</div>
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,403 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:rd="http://typo3.org/ns/TYPO3/CMS/Redirects/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/modal.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-edit-action.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-delete-action.js"/>
<f:asset.module identifier="@typo3/redirects/redirects-module.js"/>
<f:asset.module identifier="@typo3/backend/element/qrcode-modal-button.js"/>
<f:asset.module identifier="@typo3/backend/element/icon-element.js"/>
<h1><f:translate id="heading_text" domain="redirects.modules.qrcodes"/></h1>
<f:if condition="{redirects -> f:count()}">
<f:then>
<f:render section="filter" arguments="{_all}" />
<f:render section="table" arguments="{_all}" />
</f:then>
<f:else>
<f:if condition="{demand.constraints}">
<f:then>
<f:render section="filter" arguments="{_all}" />
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::NOTICE')}" title="{f:translate(id: 'not_found.title', domain: 'redirects.modules.qrcodes')}">
<p><f:translate id="not_found_with_filter.message" domain="redirects.modules.qrcodes"/></p>
<a class="btn btn-default" href="{f:be.uri(route:'qrcodes')}">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:redirect_no_filter"/>
</a>
<be:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="sys_redirect" module="qrcodes" defaultValues="{sys_redirect: {redirect_type: 'qrcode'}}" >
<f:translate id="create" domain="redirects.modules.qrcodes"/>
</be:link.newRecord>
</f:be.infobox>
<f:variable name="gotToPageUrl"><f:be.uri route="qrcodes" parameters="{demand: demand.parameters, page: 987654322}" /></f:variable>
<form data-on-submit="processNavigate">
<input type="hidden" value="1" name="paginator-target-page" data-number-of-pages="1" data-url="{gotToPageUrl}"/>
</form>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" title="{f:translate(id: 'not_found.title', domain: 'redirects.modules.qrcodes')}">
<p>
<f:translate id="not_found.message" domain="redirects.modules.qrcodes"/>
</p>
<be:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="sys_redirect" module="qrcodes" defaultValues="{'sys_redirect': {'redirect_type': 'qrcode'}}">
<f:translate id="create" domain="redirects.modules.qrcodes"/>
</be:link.newRecord>
</f:be.infobox>
</f:else>
</f:if>
</f:else>
</f:if>
</f:section>
<f:section name="table">
<f:comment>Partial is used from EXT:backend/Resources/Private/Partials/MultiRecordSelection/Actions.html</f:comment>
<f:render partial="MultiRecordSelection/Actions" arguments="{actions: actions}"/>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="col-checkbox" colspan="2">
<div class="dropdown">
<button type="button" class="dropdown-toggle dropdown-toggle-link t3js-multi-record-selection-check-actions-toggle" aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.openSelectionOptions')}" popovertarget="qrcodes-selection">
<core:icon identifier="actions-selection" size="small" />
</button>
<ul id="qrcodes-selection" class="dropdown-menu t3js-multi-record-selection-check-actions" popover>
<li>
<button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-all" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll" />
</span>
</span>
</button>
</li>
<li>
<button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-none" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll" />
</span>
</span>
</button>
</li>
<li>
<button type="button" class="dropdown-item" data-multi-record-selection-check-action="toggle" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-invert" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection" />
</span>
</span>
</button>
</li>
</ul>
</div>
</th>
<th class="col-path">
<f:render section="listHeaderSorting" arguments="{field: 'source_host', label: 'sys_redirect.source_host', demand: demand}"/>
</th>
<th class="col-path"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.target"/></th>
<th class="col-description">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.note"/>
</th>
<f:if condition="{showHitCounter}">
<th><f:render section="listHeaderSorting" arguments="{field: 'hitcount', label: 'sys_redirect.hitcount', demand: demand}"/></th>
<th class="col-datetime"><f:render section="listHeaderSorting" arguments="{field: 'lasthiton', label: 'sys_redirect.lasthiton', demand: demand}"/></th>
</f:if>
<th class="col-control">
<span class="visually-hidden"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels._CONTROL_"/></span>
</th>
</tr>
</thead>
<tbody data-multi-record-selection-row-selection="true">
<f:for each="{redirects}" key="domainName" as="redirect">
<tr
data-uid="{redirect.uid}"
data-multi-record-selection-element="true"
>
<td class="col-checkbox">
<span class="form-check form-check-type-toggle">
<input class="form-check-input t3js-multi-record-selection-check" type="checkbox">
</span>
</td>
<td class="col-icon">
<f:alias map="{
disable: '{f:translate(key: \'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:record_disabled\')}',
onlystart: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:start\')}: {f:format.date(date: redirect.starttime, format: \'Y-m-d H:i\')}',
onlyend: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:stop\')}: {f:format.date(date: redirect.endtime, format: \'Y-m-d H:i\')}',
startend: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:start\')}: {f:format.date(date: redirect.starttime, format: \'Y-m-d H:i\')} - {f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:stop\')}: {f:format.date(date: redirect.endtime, format: \'Y-m-d H:i\')}'
}">
<f:if condition="{redirect.disabled}">
<f:then><span title="{disable}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:then>
<f:else if="{redirect.starttime} && !{redirect.endtime}"><span title="{onlystart}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else if="!{redirect.starttime} && {redirect.endtime}"><span title="{onlyend}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else if="{redirect.starttime} && {redirect.endtime}"><span title="{startend}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else><span><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
</f:if>
</f:alias>
</td>
<td class="col-path">
<be:link.editRecord
returnUrl="{returnUrl}"
table="sys_redirect"
uid="{redirect.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}: {redirect.source_host}"
>
{redirect.source_host}
</be:link.editRecord>
</td>
<td class="col-path">
<f:variable name="targetUri" value="{f:uri.typolink(parameter:redirect.target)}" />
<f:link.typolink
parameter="{redirect.target}"
target="_blank"
title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:visit_destination')} {f:if(condition: targetUri, then:targetUri, else:redirect.target)}"
>
{f:if(condition: targetUri, then:targetUri, else:redirect.target)}
</f:link.typolink>
<f:variable name="pageRow" value="{rd:targetPageRecord(target:redirect.target)}" />
<f:if condition="{pageRow}"><br>(<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:pageID"/>:
<be:link.editRecord
table="pages"
uid="{pageRow.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}: {redirect.source_path}"
><core:iconForRecord table="pages" row="{pageRow}" /> {pageRow.uid}</be:link.editRecord>)</f:if>
</td>
<td class="col-description">
{redirect.description}
</td>
<f:if condition="{showHitCounter}">
<td>
<f:if condition="!{redirect.disable_hitcount}">
{redirect.hitcount}
</f:if>
</td>
<td class="col-datetime">
<f:if condition="{redirect.lasthiton}">
<f:then><f:format.date format="Y-m-d H:i">@{redirect.lasthiton}</f:format.date></f:then>
<f:else><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_last_never"/></f:else>
</f:if>
</td>
</f:if>
<td class="col-control">
<div class="btn-group" role="group">
<typo3-qrcode-modal-button class="btn btn-default" title="{f:translate(id: 'show', domain: 'redirects.modules.qrcodes')}" modal-title="{f:translate(id: 'sys_redirect.redirect_type.qr_code', domain: 'redirects.db')}" content="https://{redirect.source_host}{redirect.source_path}" show-download>
<typo3-backend-icon identifier="actions-qrcode" size="small"></typo3-backend-icon>
</typo3-qrcode-modal-button>
<be:link.editRecord
returnUrl="{returnUrl}"
class="btn btn-default"
table="sys_redirect"
module="qrcodes"
uid="{redirect.uid}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:edit')}"
>
<core:icon identifier="actions-open" />
</be:link.editRecord>
<f:if condition="{redirect.disabled} == 1">
<f:then>
<a
class="btn btn-default"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][disabled]=0', arguments:'{redirect: returnUrl}')}"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:unHide')}"
>
<core:icon identifier="actions-edit-unhide" />
</a>
</f:then>
<f:else>
<a
class="btn btn-default"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][disabled]=1', arguments:'{redirect: returnUrl}')}"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:hide')}"
>
<core:icon identifier="actions-edit-hide" />
</a>
</f:else>
</f:if>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'tce_db', query:'cmd[sys_redirect][{redirect.uid}][delete]=1', arguments:'{redirect: returnUrl}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:delete')}"
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="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:deleteWarning')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_record.no')}">
<core:icon identifier="actions-delete" />
</a>
</div>
<div class="btn-group dropdown" role="group">
<f:if condition="{redirect.is_regexp} || ({redirect.source_host} === '*')">
<f:else>
<f:variable name="showPreviewButton" value="1" />
</f:else>
</f:if>
<f:if condition="{showHitCounter} && !{redirect.disable_hitcount}">
<f:variable name="showHitCountResetButton" value="{f:if(condition: '{redirect.hitcount} != 0', then: '1', else: '0')}" />
</f:if>
<f:if condition="{showPreviewButton} || {showHitCountResetButton}">
<f:then>
<ul id="actions-{redirect.uid}" class="dropdown-menu">
<f:if condition="{showHitCountResetButton}">
<li>
<a
class="dropdown-item t3js-modal-trigger"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][hitcount]=0', arguments:'{redirect: returnUrl}')}"
data-severity="warning"
data-title="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_reset.confirm.title')}"
data-content="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:hit_reset.confirm.content')}"
data-button-close-text="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_record.no')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon">
<core:icon identifier="actions-edit-restore" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate id="xlf:hit_reset" domain="redirects.locallang_module_redirect" />
</span>
</span>
</a>
</li>
</f:if>
</ul>
</f:then>
<f:else>
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
<f:render partial="MultiRecordSelection/Actions" arguments="{actions: actions}"/>
<f:render partial="Pagination" arguments="{route: 'qrcodes', demand: demand, pagination: pagination, gotToPageUrl: gotToPageUrl}" />
</f:section>
<f:section name="listHeaderSorting">
<div class="dropdown">
<button class="dropdown-toggle dropdown-toggle-link" type="button" popovertarget="qrcodes-selection-sorting-{field}">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:{label}"/>
<f:if condition="{demand.orderField} === {field}">
<f:then>
<div class="text-primary">
<f:if condition="{demand.orderDirection} === asc">
<f:then>
<core:icon identifier="actions-sort-amount-up" />
</f:then>
<f:else>
<core:icon identifier="actions-sort-amount-down" />
</f:else>
</f:if>
</div>
</f:then>
<f:else>
<div>
<core:icon identifier="empty-empty" />
</div>
</f:else>
</f:if>
</button>
<ul id="qrcodes-selection-sorting-{field}" class="dropdown-menu" popover>
<li>
<a
class="dropdown-item"
href="{f:be.uri(route:'qrcodes', parameters: '{demand: demand.parameters, orderField: field, orderDirection: demand.defaultOrderDirection}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{demand.orderField} === {field}">
<f:if condition="{demand.orderDirection} === asc">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.asc')}
</span>
</span>
</a>
</li>
<li>
<a
class="dropdown-item"
href="{f:be.uri(route:'qrcodes', parameters: '{demand: demand.parameters, orderField: field, orderDirection: demand.reverseOrderDirection}')}"
title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{demand.orderField} === {field}">
<f:if condition="{demand.orderDirection} === desc">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.sorting.desc')}
</span>
</span>
</a>
</li>
</ul>
</div>
</f:section>
<f:section name="filter">
<form action="{f:be.uri(route:'qrcodes')}" method="post" enctype="multipart/form-data" name="demand">
<input type="hidden" name="orderField" value="{demand.orderField}">
<input type="hidden" name="orderDirection" value="{demand.orderDirection}">
<input type="hidden" name="redirectType" value="{f:constant(name: '\TYPO3\CMS\Redirects\Repository\Demand::QRCODE_REDIRECT_TYPE')}">
<div class="form-row">
<div class="form-group">
<label for="demand-source-host" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.source_host"/></label>
<select id="demand-source-host" class="form-select" name="demand[source_host]" data-on-change="submit">
<option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option>
<f:for each="{hosts}" as="host">
<f:if condition="{host.name} !== '*'">
<option value="{host.name}" {f:if(condition: '{host.name} == {demand.firstSourceHost}', then: 'selected')}>{host.name}</option>
</f:if>
</f:for>
</select>
</div>
<div class="form-group">
<label for="demand-target" class="form-label"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.target"/></label>
<input type="text" id="demand-target" class="form-control" name="demand[target]" value="{demand.target}"/>
</div>
<f:if condition="{showHitCounter}">
<div class="form-group align-self-end">
<div class="form-check form-switch form-check-size-input">
<input type="checkbox" class="form-check-input" name="demand[max_hits]" id="demand-never-hit" value="1" data-on-change="submit" {f:if(condition: demand.maxHits, then: 'checked="checked"')}>
<label class="form-check-label" for="demand-never-hit">
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.neverHit"/>
</label>
</div>
</div>
</f:if>
<div class="form-group align-self-end">
<input type="submit" value="{f:translate(key: 'LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.sendButton')}" class="btn btn-default" />
<a href="{f:be.uri(route:'qrcodes')}" class="btn btn-link"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.resetButton"/></a>
</div>
</div>
</form>
</f:section>
</html>
@@ -0,0 +1,19 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{count} > 0">
<p><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_reports.xlf:status.conflictingRedirects.message" /></p>
<ul>
<f:for each="{reportedConflicts}" as="conflict">
<li>
<span title="{conflict.uri}">{conflict.uri -> f:format.crop(maxCharacters: '100')}</span><br>
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.source_host" />: {conflict.redirect.source_host}<br>
<f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_db.xlf:sys_redirect.source_path" />: <span title="{conflict.redirect.source_path}">{conflict.redirect.source_path -> f:format.crop(maxCharacters: '100')}</span>
</li>
</f:for>
</ul>
</f:if>
</html>
@@ -0,0 +1,451 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:rd="http://typo3.org/ns/TYPO3/CMS/Redirects/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/modal.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-edit-action.js"/>
<f:asset.module identifier="@typo3/backend/multi-record-selection-delete-action.js"/>
<f:asset.module identifier="@typo3/redirects/redirects-module.js"/>
<f:asset.module identifier="@typo3/backend/element/icon-element.js"/>
<f:asset.module identifier="@typo3/backend/copy-to-clipboard.js"/>
<h1><f:translate id="heading_text" domain="redirects.modules.short_urls"/></h1>
<f:if condition="{redirects -> f:count()}">
<f:then>
<f:render section="filter" arguments="{_all}" />
<f:render section="table" arguments="{_all}" />
</f:then>
<f:else>
<f:if condition="{demand.constraints}">
<f:then>
<f:render section="filter" arguments="{_all}" />
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::NOTICE')}" title="{f:translate(id: 'not_found.title', domain: 'redirects.modules.short_urls')}">
<p><f:translate id="not_found_with_filter.message" domain="redirects.modules.short_urls"/></p>
<a class="btn btn-default" href="{f:be.uri(route:'short_urls')}">
<f:translate id="redirect_no_filter" domain="redirects.module_redirect" />
</a>
<be:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="sys_redirect" module="short_urls" defaultValues="{sys_redirect: {redirect_type: 'short_url'}}" >
<f:translate id="create" domain="redirects.modules.short_urls"/>
</be:link.newRecord>
</f:be.infobox>
<f:variable name="gotToPageUrl"><f:be.uri route="short_urls" parameters="{demand: demand.parameters, page: 987654322}" /></f:variable>
<form data-on-submit="processNavigate">
<input type="hidden" value="1" name="paginator-target-page" data-number-of-pages="1" data-url="{gotToPageUrl}"/>
</form>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" title="{f:translate(id: 'not_found.title', domain: 'redirects.modules.short_urls')}">
<p>
<f:translate id="not_found.message" domain="redirects.modules.short_urls"/>
</p>
<be:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="sys_redirect" module="short_urls" defaultValues="{'sys_redirect': {'redirect_type': 'short_url'}}">
<f:translate id="create" domain="redirects.modules.short_urls"/>
</be:link.newRecord>
</f:be.infobox>
</f:else>
</f:if>
</f:else>
</f:if>
</f:section>
<f:section name="table">
<f:comment>Partial is used from EXT:backend/Resources/Private/Partials/MultiRecordSelection/Actions.html</f:comment>
<f:render partial="MultiRecordSelection/Actions" arguments="{actions: actions}"/>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="col-checkbox" colspan="2">
<div class="dropdown">
<button type="button" class="dropdown-toggle dropdown-toggle-link t3js-multi-record-selection-check-actions-toggle" aria-label="{f:translate(id: 'labels.openSelectionOptions', domain: 'core.core')}" popovertarget="short-urls-selection">
<core:icon identifier="actions-selection" size="small" />
</button>
<ul id="short-urls-selection" class="dropdown-menu t3js-multi-record-selection-check-actions" popover>
<li>
<button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(id: 'labels.checkAll', domain: 'core.core')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-all" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate id="labels.checkAll" domain="core.core"/>
</span>
</span>
</button>
</li>
<li>
<button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(id: 'labels.uncheckAll', domain: 'core.core')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-none" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate id="labels.uncheckAll" domain="core.core"/>
</span>
</span>
</button>
</li>
<li>
<button type="button" class="dropdown-item" data-multi-record-selection-check-action="toggle" title="{f:translate(id: 'labels.toggleSelection', domain: 'core.core')}">
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true">
<core:icon identifier="actions-selection-elements-invert" size="small" />
</span>
<span class="dropdown-item-column dropdown-item-column-title">
<f:translate id="labels.toggleSelection" domain="core.core"/>
</span>
</span>
</button>
</li>
</ul>
</div>
</th>
<th class="col-path">
<f:render section="listHeaderSorting" arguments="{field: 'source_host', label: 'sys_redirect.short_url', demand: demand}"/>
</th>
<th class="col-path">
<f:translate id="sys_redirect.target" domain="redirects.db"/>
</th>
<th class="col-description">
<f:translate id="LGL.note" domain="core.general"/>
</th>
<f:if condition="{showHitCounter}">
<th><f:render section="listHeaderSorting" arguments="{field: 'hitcount', label: 'sys_redirect.hitcount', demand: demand}"/></th>
<th class="col-datetime"><f:render section="listHeaderSorting" arguments="{field: 'lasthiton', label: 'sys_redirect.lasthiton', demand: demand}"/></th>
</f:if>
<th class="col-control">
<span class="visually-hidden">
<f:translate id="labels._CONTROL_" domain="core.core"/>
</span>
</th>
</tr>
</thead>
<tbody data-multi-record-selection-row-selection="true">
<f:for each="{redirects}" key="domainName" as="redirect">
<tr
data-uid="{redirect.uid}"
data-multi-record-selection-element="true"
>
<td class="col-checkbox">
<span class="form-check form-check-type-toggle">
<input class="form-check-input t3js-multi-record-selection-check" type="checkbox">
</span>
</td>
<td class="col-icon">
<f:alias map="{
disable: '{f:translate(id: \'record_disabled\', domain: \'redirects.module_redirect\')}',
onlystart: '{f:translate(id: \'start\', domain: \'core.common\')}: {f:format.date(date: redirect.starttime, format: \'Y-m-d H:i\')}',
onlyend: '{f:translate(id: \'stop\', domain: \'core.common\')}: {f:format.date(date: redirect.endtime, format: \'Y-m-d H:i\')}',
startend: '{f:translate(id: \'start\', domain: \'core.common\')}: {f:format.date(date: redirect.starttime, format: \'Y-m-d H:i\')} - {f:translate(id: \'stop\', domain: \'core.common\')}: {f:format.date(date: redirect.endtime, format: \'Y-m-d H:i\')}'
}">
<f:if condition="{redirect.disabled}">
<f:then><span title="{disable}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:then>
<f:else if="{redirect.starttime} && !{redirect.endtime}"><span title="{onlystart}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else if="!{redirect.starttime} && {redirect.endtime}"><span title="{onlyend}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else if="{redirect.starttime} && {redirect.endtime}"><span title="{startend}"><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
<f:else><span><core:iconForRecord table="sys_redirect" row="{redirect}" /></span></f:else>
</f:if>
</f:alias>
</td>
<td class="col-path">
<be:link.editRecord
returnUrl="{returnUrl}"
table="sys_redirect"
module="short_urls"
uid="{redirect.uid}"
title="{f:translate(id: 'edit', domain: 'core.mod_web_list')}: {redirect.source_host}{redirect.source_path}"
>
{protocol}://{redirect.source_host}{redirect.source_path}
</be:link.editRecord>
</td>
<td class="col-path">
<f:variable name="targetUri" value="{f:uri.typolink(parameter:redirect.target)}" />
<f:link.typolink
parameter="{redirect.target}"
target="_blank"
title="{f:translate(id: 'visit_destination', domain: 'redirects.module_redirect')} {f:if(condition: targetUri, then:targetUri, else:redirect.target)}"
>
{f:if(condition: targetUri, then:targetUri, else:redirect.target)}
</f:link.typolink>
<f:variable name="pageRow" value="{rd:targetPageRecord(target:redirect.target)}" />
<f:if condition="{pageRow}"><br>(<f:translate id="pageID" domain="redirects.module_redirect"/>:
<be:link.editRecord
table="pages"
uid="{pageRow.uid}"
title="{f:translate(id: 'edit', domain: 'core.mod_web_list')}: {redirect.source_path}"
><core:iconForRecord table="pages" row="{pageRow}" /> {pageRow.uid}</be:link.editRecord>)</f:if>
</td>
<td class="col-description">
{redirect.description}
</td>
<f:if condition="{showHitCounter}">
<td>
<f:if condition="!{redirect.disable_hitcount}">
{redirect.hitcount}
</f:if>
</td>
<td class="col-datetime">
<f:if condition="{redirect.lasthiton}">
<f:then><f:format.date format="Y-m-d H:i">@{redirect.lasthiton}</f:format.date></f:then>
<f:else><f:translate id="hit_last_never" domain="redirects.module_redirect"/></f:else>
</f:if>
</td>
</f:if>
<td class="col-control">
<div class="btn-group" role="group">
<typo3-copy-to-clipboard
text="{protocol}://{redirect.source_host}{redirect.source_path}"
class="btn btn-default"
title="{f:translate(id: 'short_url.copy', domain: 'redirects.module_redirect')}"
>
<core:icon identifier="actions-clipboard" />
</typo3-copy-to-clipboard>
<be:link.editRecord
returnUrl="{returnUrl}"
class="btn btn-default"
table="sys_redirect"
module="short_urls"
uid="{redirect.uid}"
title="{f:translate(id: 'edit', domain: 'core.mod_web_list')}"
>
<core:icon identifier="actions-open" />
</be:link.editRecord>
<f:if condition="{redirect.disabled} == 1">
<f:then>
<a
class="btn btn-default"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][disabled]=0', arguments:'{redirect: returnUrl}')}"
title="{f:translate(id: 'unHide', domain: 'core.mod_web_list')}"
>
<core:icon identifier="actions-edit-unhide" />
</a>
</f:then>
<f:else>
<a
class="btn btn-default"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][disabled]=1', arguments:'{redirect: returnUrl}')}"
title="{f:translate(id: 'hide', domain: 'core.mod_web_list')}"
>
<core:icon identifier="actions-edit-hide" />
</a>
</f:else>
</f:if>
<a class="btn btn-default t3js-modal-trigger"
href="{be:moduleLink(route:'tce_db', query:'cmd[sys_redirect][{redirect.uid}][delete]=1', arguments:'{redirect: returnUrl}')}"
title="{f:translate(id: 'delete', domain: 'core.mod_web_list')}"
data-severity="warning"
data-title="{f:translate(id: 'label.confirm.delete_record.title', domain: 'backend.alt_doc')}"
data-content="{f:translate(id: 'deleteWarning', domain: 'backend.alt_doc')}"
data-button-close-text="{f:translate(id: 'buttons.confirm.delete_record.no', domain: 'backend.alt_doc')}">
<core:icon identifier="actions-delete" />
</a>
</div>
<div class="btn-group dropdown" role="group">
<f:if condition="{redirect.is_regexp} || ({redirect.source_host} === '*')">
<f:else>
<f:variable name="showPreviewButton" value="1" />
</f:else>
</f:if>
<f:if condition="{showHitCounter} && !{redirect.disable_hitcount}">
<f:variable name="showHitCountResetButton" value="{f:if(condition: '{redirect.hitcount} != 0', then: '1', else: '0')}" />
</f:if>
<f:if condition="{showPreviewButton} || {showHitCountResetButton}">
<f:then>
<button
type="button"
class="btn btn-default dropdown-toggle dropdown-toggle-no-chevron"
popovertarget="actions-{redirect.uid}"
>
<core:icon identifier="actions-menu-alternative" />
</button>
<ul id="actions-{redirect.uid}" class="dropdown-menu" popover>
<f:if condition="{showPreviewButton}">
<li>
<f:link.external
class="dropdown-item"
uri="{protocol}://{redirect.source_host}{redirect.source_path}"
target="_blank"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-{cacheAction.severity}">
<core:icon identifier="actions-view-page" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate id="view_redirect" domain="redirects.module_redirect" />
</span>
</span>
</f:link.external>
</li>
</f:if>
<f:if condition="{showHitCountResetButton}">
<li>
<a
class="dropdown-item t3js-modal-trigger"
href="{be:moduleLink(route:'tce_db', query:'data[sys_redirect][{redirect.uid}][hitcount]=0', arguments:'{redirect: returnUrl}')}"
data-severity="warning"
data-title="{f:translate(id: 'hit_reset.confirm.title', domain: 'redirects.module_redirect')}"
data-content="{f:translate(id: 'hit_reset.confirm.content', domain: 'redirects.module_redirect')}"
data-button-close-text="{f:translate(id: 'buttons.confirm.delete_record.no', domain: 'backend.alt_doc')}">
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon">
<core:icon identifier="actions-edit-restore" />
</span>
<span class="dropdown-item-column dropdown-item-column-text">
<f:translate id="hit_reset" domain="redirects.module_redirect" />
</span>
</span>
</a>
</li>
</f:if>
</ul>
</f:then>
<f:else if="{canEditRedirects}">
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
<f:render partial="MultiRecordSelection/Actions" arguments="{actions: actions}"/>
<f:render partial="Pagination" arguments="{route: 'short_urls', demand: demand, pagination: pagination, gotToPageUrl: gotToPageUrl}" />
</f:section>
<f:section name="listHeaderSorting">
<div class="dropdown">
<button class="dropdown-toggle dropdown-toggle-link" type="button" popovertarget="short-urls-selection-sorting-{field}">
<f:translate id="{label}" domain="redirects.db" />
<f:if condition="{demand.orderField} === {field}">
<f:then>
<div class="text-primary">
<f:if condition="{demand.orderDirection} === asc">
<f:then>
<core:icon identifier="actions-sort-amount-up" />
</f:then>
<f:else>
<core:icon identifier="actions-sort-amount-down" />
</f:else>
</f:if>
</div>
</f:then>
<f:else>
<div>
<core:icon identifier="empty-empty" />
</div>
</f:else>
</f:if>
</button>
<ul id="short-urls-selection-sorting-{field}" class="dropdown-menu" popover>
<li>
<a
class="dropdown-item"
href="{f:be.uri(route:'short_urls', parameters: '{demand: demand.parameters, orderField: field, orderDirection: demand.defaultOrderDirection}')}"
title="{f:translate(id: 'labels.sorting.asc', domain: 'core.core')}"
aria-label="{f:translate(id: 'labels.sorting.asc', domain: 'core.core')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{demand.orderField} === {field}">
<f:if condition="{demand.orderDirection} === asc">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(id: 'labels.sorting.asc', domain: 'core.core')}
</span>
</span>
</a>
</li>
<li>
<a
class="dropdown-item"
href="{f:be.uri(route:'short_urls', parameters: '{demand: demand.parameters, orderField: field, orderDirection: demand.reverseOrderDirection}')}"
title="{f:translate(id: 'labels.sorting.desc', domain: 'core.core')}"
aria-label="{f:translate(id: 'labels.sorting.desc', domain: 'core.core')}"
>
<span class="dropdown-item-columns">
<span class="dropdown-item-column dropdown-item-column-icon text-primary">
<f:if condition="{demand.orderField} === {field}">
<f:if condition="{demand.orderDirection} === desc">
<core:icon identifier="actions-dot" />
</f:if>
</f:if>
</span>
<span class="dropdown-item-column dropdown-item-column-title">
{f:translate(id: 'labels.sorting.desc', domain: 'core.core')}
</span>
</span>
</a>
</li>
</ul>
</div>
</f:section>
<f:section name="filter">
<form action="{f:be.uri(route:'short_urls')}" method="post" enctype="multipart/form-data" name="demand">
<input type="hidden" name="orderField" value="{demand.orderField}">
<input type="hidden" name="orderDirection" value="{demand.orderDirection}">
<input type="hidden" name="redirectType" value="{f:constant(name: '\TYPO3\CMS\Redirects\Repository\Demand::SHORT_URL_REDIRECT_TYPE')}">
<div class="form-row">
<div class="form-group">
<label for="demand-source-host" class="form-label">
<f:translate id="sys_redirect.source_host" domain="redirects.db" />
</label>
<select id="demand-source-host" class="form-select" name="demand[source_host]" data-on-change="submit">
<option value="">
<f:translate id="filter.source_host.showAll" domain="redirects.module_redirect" />
</option>
<f:for each="{hosts}" as="host">
<f:if condition="{host.name} !== '*'">
<option value="{host.name}" {f:if(condition: '{host.name} == {demand.firstSourceHost}', then: 'selected')}>{host.name}</option>
</f:if>
</f:for>
</select>
</div>
<div class="form-group">
<label for="demand-source-path" class="form-label">
<f:translate id="sys_redirect.source_path" domain="redirects.db" />
</label>
<input type="text" id="demand-source-path" class="form-control" name="demand[source_path]" value="{demand.sourcePath}"/>
</div>
<div class="form-group">
<label for="demand-target" class="form-label">
<f:translate id="sys_redirect.target" domain="redirects.db" />
</label>
<input type="text" id="demand-target" class="form-control" name="demand[target]" value="{demand.target}"/>
</div>
<f:if condition="{showHitCounter}">
<div class="form-group align-self-end">
<div class="form-check form-switch form-check-size-input">
<input type="checkbox" class="form-check-input" name="demand[max_hits]" id="demand-never-hit" value="1" data-on-change="submit" {f:if(condition: demand.maxHits, then: 'checked="checked"')}>
<label class="form-check-label" for="demand-never-hit">
<f:translate id="filter.neverHit" domain="redirects.module_redirect" />
</label>
</div>
</div>
</f:if>
<div class="form-group align-self-end">
<input type="submit" value="{f:translate(id: 'filter.sendButton', domain: 'redirects.module_redirect')}" class="btn btn-default" />
<a href="{f:be.uri(route:'short_urls')}" class="btn btn-link">
<f:translate id="filter.resetButton" domain="redirects.module_redirect" />
</a>
</div>
</div>
</form>
</f:section>
</html>