TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:14 +02:00
commit ff4622ba97
138 changed files with 9045 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="messages" date="2018-11-27T22:26:21Z" product-name="dashboard">
<header/>
<body>
<trans-unit id="be_dashboard">
<source>Dashboard</source>
</trans-unit>
<trans-unit id="identifier">
<source>Identifier</source>
</trans-unit>
<trans-unit id="title">
<source>Title</source>
</trans-unit>
</body>
</file>
</xliff>
+329
View File
@@ -0,0 +1,329 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="messages" date="2018-11-27T22:26:21Z" product-name="dashboard">
<header/>
<body>
<trans-unit id="close">
<source>Close</source>
</trans-unit>
<trans-unit id="title">
<source>Dashboard</source>
</trans-unit>
<trans-unit id="widget.add">
<source>Add widget</source>
</trans-unit>
<trans-unit id="widget.addToDashboard">
<source>Add widget to "%s"</source>
</trans-unit>
<trans-unit id="widget.addToDashboard.searchLabel">
<source>Search for dashboard widgets</source>
</trans-unit>
<trans-unit id="widget.addToDashboard.searchNotFound">
<source>Unfortunately no dashboard widget matches your query, please try a different one.</source>
</trans-unit>
<trans-unit id="widget.addToDashboard.userNotAllowed">
<source>No widgets are available with your current permissions.</source>
</trans-unit>
<trans-unit id="widget.add.button.close">
<source>Close</source>
</trans-unit>
<trans-unit id="widget.add.button.ok">
<source>Add widget</source>
</trans-unit>
<trans-unit id="widget.refresh">
<source>Refresh Widget</source>
</trans-unit>
<trans-unit id="widget.settings">
<source>Widget Settings</source>
</trans-unit>
<trans-unit id="widget.settings.button.close">
<source>Close</source>
</trans-unit>
<trans-unit id="widget.settings.button.save">
<source>Save</source>
</trans-unit>
<trans-unit id="widget.settings.unchanged">
<source>Settings unchanged</source>
</trans-unit>
<trans-unit id="widget.move">
<source>Move Widget</source>
</trans-unit>
<trans-unit id="widget.remove">
<source>Remove Widget</source>
</trans-unit>
<trans-unit id="widget.remove.button.close">
<source>Close</source>
</trans-unit>
<trans-unit id="widget.remove.button.ok">
<source>Remove</source>
</trans-unit>
<trans-unit id="widget.remove.confirm.title">
<source>Remove widget</source>
</trans-unit>
<trans-unit id="widget.remove.confirm.message">
<source>Are you sure you want to remove this widget?</source>
</trans-unit>
<trans-unit id="widget.error">
<source>An error occurred while retrieving information for this widget. Please try again, and if the problem persists, contact your administrator.</source>
</trans-unit>
<trans-unit id="dashboard.headline">
<source>Dashboard "%s"</source>
</trans-unit>
<trans-unit id="dashboard.default">
<source>My dashboard</source>
</trans-unit>
<trans-unit id="dashboard.default.description">
<source>Create a new dashboard with some general TYPO3 widgets on it</source>
</trans-unit>
<trans-unit id="dashboard.empty">
<source>Empty dashboard</source>
</trans-unit>
<trans-unit id="dashboard.empty.description">
<source>Your dashboard will be created without any widget on it.</source>
</trans-unit>
<trans-unit id="dashboard.add">
<source>Add dashboard</source>
</trans-unit>
<trans-unit id="dashboard.add.button.close">
<source>Close</source>
</trans-unit>
<trans-unit id="dashboard.add.button.ok">
<source>Add Dashboard</source>
</trans-unit>
<trans-unit id="dashboard.configure">
<source>Configure dashboard</source>
</trans-unit>
<trans-unit id="dashboard.configure.button.close">
<source>Close</source>
</trans-unit>
<trans-unit id="dashboard.configure.button.ok">
<source>Save Dashboard</source>
</trans-unit>
<trans-unit id="dashboard.delete">
<source>Delete dashboard</source>
</trans-unit>
<trans-unit id="dashboard.delete.sure">
<source>Are you sure you want to delete this dashboard?</source>
</trans-unit>
<trans-unit id="dashboard.delete.ok">
<source>Yes, delete it</source>
</trans-unit>
<trans-unit id="dashboard.delete.cancel">
<source>Cancel</source>
</trans-unit>
<trans-unit id="dashboard.title">
<source>Title of dashboard</source>
</trans-unit>
<trans-unit id="widgets.documentation.gettingStarted.title">
<source>Getting Started with TYPO3</source>
</trans-unit>
<trans-unit id="widgets.documentation.gettingStarted.description">
<source>Add a shortcut to the TYPO3 Getting Started Tutorial.</source>
</trans-unit>
<trans-unit id="widgets.documentation.gettingStarted.text">
<source>New to TYPO3? In our Getting Started Tutorial you will learn the basics how to use TYPO3.</source>
</trans-unit>
<trans-unit id="widgets.documentation.gettingStarted.content.label">
<source>Getting Started Tutorial</source>
</trans-unit>
<trans-unit id="widgets.documentation.typoscriptReference.title">
<source>TypoScript Template Reference</source>
</trans-unit>
<trans-unit id="widgets.documentation.typoscriptReference.description">
<source>Add a shortcut to the TYPO3 TypoScript Template Reference.</source>
</trans-unit>
<trans-unit id="widgets.documentation.typoscriptReference.text">
<source>This document is a reference, used to lookup TypoScript templating.</source>
</trans-unit>
<trans-unit id="widgets.documentation.typoscriptReference.content.label">
<source>TypoScript Template Reference</source>
</trans-unit>
<trans-unit id="widgets.documentation.TSconfigReference.title">
<source>TSconfig Reference</source>
</trans-unit>
<trans-unit id="widgets.documentation.TSconfigReference.description">
<source>Add a shortcut to the TYPO3 TSconfig Reference.</source>
</trans-unit>
<trans-unit id="widgets.documentation.TSconfigReference.text">
<source>This document describes TSconfig and its options.</source>
</trans-unit>
<trans-unit id="widgets.documentation.TSconfigReference.content.label">
<source>TSconfig Reference</source>
</trans-unit>
<trans-unit id="widgets.t3news.title">
<source>TYPO3 news</source>
</trans-unit>
<trans-unit id="widgets.t3news.description">
<source>Add a list of news items from the TYPO3 project</source>
</trans-unit>
<trans-unit id="widgets.t3news.moreItems">
<source>More TYPO3 news</source>
</trans-unit>
<trans-unit id="widgets.t3information.title">
<source>About TYPO3</source>
</trans-unit>
<trans-unit id="widgets.t3information.description">
<source>Some general information about TYPO3 and the version used</source>
</trans-unit>
<trans-unit id="widgets.t3information.text">
<source><![CDATA[TYPO3 CMS is an enterprise-class, Open Source Content Management System, used internationally to build and manage websites of all types, from small sites for non-profits to multilingual enterprise solutions for large corporations.<br /><br />For further information visit <a href="https://typo3.org/typo3-cms/" target="_blank" rel="noreferrer">typo3.org</a>.<br /><br />TYPO3 CMS is <b>freely available</b> under the <a href="https://typo3.org/project/licenses/" target="_blank" rel="noreferrer">TYPO3-license (GNU/GPL)</a>.<br /><br />You are using version %s - Copyright %s %s]]></source>
</trans-unit>
<trans-unit id="widgets.t3information.logo">
<source>TYPO3 CMS logo</source>
</trans-unit>
<trans-unit id="widgets.sysLogErrors.title">
<source>Number of errors in system log</source>
</trans-unit>
<trans-unit id="widgets.sysLogErrors.description">
<source>Shows the number of errors in the sys log of the last month, grouped by date</source>
</trans-unit>
<trans-unit id="widgets.sysLogErrors.buttonText">
<source>Show all errors in log</source>
</trans-unit>
<trans-unit id="widgets.sysLogUsers.buttonText">
<source>Show all user logins</source>
</trans-unit>
<trans-unit id="widgets.sysLogErrors.chart.dataSet.0">
<source>Number of errors</source>
</trans-unit>
<trans-unit id="widgets.typeOfUsers.title">
<source>Type of backend users</source>
</trans-unit>
<trans-unit id="widgets.typeOfUsers.description">
<source>Shows the amount of normal- and admin-users</source>
</trans-unit>
<trans-unit id="widgets.typeOfUsers.normalUsers">
<source>Normal users</source>
</trans-unit>
<trans-unit id="widgets.typeOfUsers.adminUsers">
<source>Admin users</source>
</trans-unit>
<trans-unit id="widgets.failedLogins.title">
<source>Failed backend logins</source>
</trans-unit>
<trans-unit id="widgets.failedLogins.subtitle">
<source>In last 24 hours</source>
</trans-unit>
<trans-unit id="widgets.failedLogins.description">
<source>Information about the number of failed logins during the last 24 hours.</source>
</trans-unit>
<trans-unit id="widgets.t3securityAdvisories.title">
<source>TYPO3 security advisories</source>
</trans-unit>
<trans-unit id="widgets.t3securityAdvisories.description">
<source>Add a list of security advisories from the TYPO3 project</source>
</trans-unit>
<trans-unit id="widgets.t3securityAdvisories.moreItems">
<source>More TYPO3 security advisories</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.title">
<source>Latest changed pages</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.title.restrictToCurrentUser">
<source>My latest changed pages</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.description">
<source>Show a list of pages where the latest changes were made</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.empty">
<source>No history found</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.settings.restrictToCurrentUser">
<source>Only show my changes</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.change">
<source>Change</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.user">
<source>User</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.user.userNotFound">
<source>Not Found</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.page">
<source>Page</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.page.workspace">
<source>Changes in current selected workspace</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.page.pagetree">
<source>Position in pagetree</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.control">
<source>Control</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.control.recordHistory">
<source>Show history</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.control.viewWebpage">
<source>View webpage</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.control.editPageContent">
<source>Edit page content</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.column.control.editPage">
<source>Edit page properties</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.table.tt_content">
<source>Content</source>
</trans-unit>
<trans-unit id="widgets.latestChangedPages.table.pages">
<source>Page</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.title">
<source>Latest backend logins</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.description">
<source>Shows the latest backend user logins.</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.empty">
<source>No backend login history found</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.column.time">
<source>Time</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.column.user">
<source>User</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.column.user.notFound">
<source>Not found</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.column.user.edit">
<source>Edit user</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.settings.limit">
<source>Number of logins to display</source>
</trans-unit>
<trans-unit id="widgets.latestBeLogins.settings.limit.description">
<source>Maximum number of backend user logins to show in the widget</source>
</trans-unit>
<trans-unit id="widget_group.general">
<source>General</source>
</trans-unit>
<trans-unit id="widget_group.typo3">
<source>TYPO3 community</source>
</trans-unit>
<trans-unit id="widget_group.news">
<source>News</source>
</trans-unit>
<trans-unit id="widget_group.documentation">
<source>Documentation</source>
</trans-unit>
<trans-unit id="widget_group.system">
<source>System Information</source>
</trans-unit>
<trans-unit id="widget_group.content">
<source>Content</source>
</trans-unit>
<trans-unit id="dashboard.empty.content.title">
<source>No widgets</source>
</trans-unit>
<trans-unit id="dashboard.empty.content.description">
<source>There are no widgets on this dashboard yet. You can add widgets now by clicking on the button below.</source>
</trans-unit>
<trans-unit id="dashboard.empty.content.button">
<source>Add a widget</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="messages" date="2018-11-27T22:26:21Z" product-name="dashboard">
<header/>
<body>
<trans-unit id="widget.bookmarks.title" xml:space="preserve">
<source>Bookmarks</source>
</trans-unit>
<trans-unit id="widget.bookmarks.description" xml:space="preserve">
<source>Display your bookmarks as a dashboard widget.</source>
</trans-unit>
<trans-unit id="widget.bookmarks.setting.groups.label" xml:space="preserve">
<source>Bookmark groups</source>
</trans-unit>
<trans-unit id="widget.bookmarks.setting.groups.description" xml:space="preserve">
<source>Bookmark groups to be displayed.</source>
</trans-unit>
<trans-unit id="widget.bookmarks.setting.limit.label" xml:space="preserve">
<source>Limit</source>
</trans-unit>
<trans-unit id="widget.bookmarks.setting.limit.description" xml:space="preserve">
<source>Maximum number of bookmarks to display.</source>
</trans-unit>
<trans-unit id="widget.bookmarks.setting.showAll" xml:space="preserve">
<source>Show all bookmarks</source>
</trans-unit>
<trans-unit id="widget.bookmarks.manageBookmarks" xml:space="preserve">
<source>Manage bookmarks</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" datatype="plaintext" original="messages" date="2018-11-27T22:26:21Z" product-name="dashboard">
<header/>
<body>
<trans-unit id="widget.rss.title">
<source>RSS Feed</source>
</trans-unit>
<trans-unit id="widget.rss.description">
<source>Displays the latest entries from a customizable RSS feed.</source>
</trans-unit>
<trans-unit id="widget.rss.setting.label.label">
<source>Label</source>
</trans-unit>
<trans-unit id="widget.rss.setting.label.description">
<source>Defines the label of the widget.</source>
</trans-unit>
<trans-unit id="widget.rss.setting.fieldUrl.label">
<source>RSS Feed</source>
</trans-unit>
<trans-unit id="widget.rss.setting.fieldUrl.description">
<source>Defines the URL or file providing the RSS Feed. This is read by the widget in order to fetch entries to show.</source>
</trans-unit>
<trans-unit id="widget.rss.setting.limit.label">
<source>Limit</source>
</trans-unit>
<trans-unit id="widget.rss.setting.limit.description">
<source>Defines how many RSS items should be shown.</source>
</trans-unit>
<trans-unit id="widget.rss.setting.lifetime.label">
<source>Lifetime</source>
</trans-unit>
<trans-unit id="widget.rss.setting.lifetime.description">
<source>Defines how long to wait, in seconds, until fetching RSS Feed again.</source>
</trans-unit>
<trans-unit id="widget.rss.missingFeedConfiguration.title">
<source>Missing feed configuration</source>
</trans-unit>
<trans-unit id="widget.rss.missingFeedConfiguration.message">
<source>Please configure a feed URL to retrieve items from.</source>
</trans-unit>
<trans-unit id="widget.rss.feedError.title">
<source>Feed error</source>
</trans-unit>
<trans-unit id="widget.rss.feedError.message">
<source>The feed at "%1$s" could not be parsed.</source>
</trans-unit>
<trans-unit id="widget.rss.noItems.title">
<source>No items to display</source>
</trans-unit>
<trans-unit id="widget.rss.noItems.message">
<source>The feed at "%1$s" does not contain any items.</source>
</trans-unit>
</body>
</file>
</xliff>
+17
View File
@@ -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:dashboard/Resources/Private/Language/module.xlf" date="2026-11-10T13:37:37Z" product-name="dashboard">
<header/>
<body>
<trans-unit id="short_description">
<source>Dashboard</source>
</trans-unit>
<trans-unit id="description">
<source>A dashboard that can show widgets of all kind of extensions</source>
</trans-unit>
<trans-unit id="title">
<source>Dashboard</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,11 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="widget-content-main">
<f:render section="main" optional="true" />
</div>
<f:variable name="footer" value="{f:render(section:'footer', optional: 'true')}" />
<f:if condition="{footer -> f:spaceless()}">
<div class="widget-content-footer">
{footer -> f:format.raw()}
</div>
</f:if>
</html>
@@ -0,0 +1,7 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:dashboard="http://typo3.org/ns/TYPO3/CMS/Dashboard/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:if condition="{button}">
<dashboard:widget.button button="{button}" class="widget-cta">{f:translate(id: button.title, default: button.title)}</dashboard:widget.button>
</f:if>
</html>
@@ -0,0 +1,8 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Module" />
<f:section name="Content">
<typo3-dashboard></typo3-dashboard>
</f:section>
</html>
@@ -0,0 +1,14 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget"/>
<f:section name="main">
<typo3-dashboard-bookmarks-widget
limit="{settings.limit}"
group="{f:if(condition: '{settings.group} != \'\'', then: settings.group)}"
></typo3-dashboard-bookmarks-widget>
</f:section>
<f:section name="footer">
<typo3-backend-bookmark-manager-button class="widget-cta">
<f:translate key="widget.bookmarks.manageBookmarks" domain="dashboard.widget_bookmarks" />
</typo3-backend-bookmark-manager-button>
</f:section>
</html>
@@ -0,0 +1,13 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget" />
<f:section name="main">
<div class="widget-chart">
<canvas></canvas>
</div>
</f:section>
<f:section name="footer">
<f:render partial="Widget/Button" arguments="{button: button}"/>
</f:section>
</html>
@@ -0,0 +1,13 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget"/>
<f:section name="main">
<f:if condition="{text}">
<f:translate id='{text}' default='{text}' />
</f:if>
</f:section>
<f:section name="footer">
<f:render partial="Widget/Button" arguments="{button: button}"/>
</f:section>
</html>
@@ -0,0 +1,66 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget"/>
<f:section name="main">
<f:if condition="{items}">
<f:then>
<div class="widget-table-wrapper">
<table class="widget-table table table-striped table-hover">
<thead>
<tr>
<th colspan="2">{f:translate(key: 'widgets.latestBeLogins.column.user', domain: 'dashboard.messages')}</th>
<th class="col-time">{f:translate(key: 'widgets.latestBeLogins.column.time', domain: 'dashboard.messages')}</th>
</tr>
</thead>
<tbody>
<f:for each="{items}" as="item">
<tr>
<td class="col-avatar">
<be:avatar backendUser="{item.userId}" size="32" showIcon="true" />
</td>
<td class="col-username">
<f:if condition="{item.realName}">
<f:then>
<be:link.editRecord table="be_users" uid="{item.userId}" title="{f:translate(key: 'widgets.latestBeLogins.column.user.edit', domain: 'dashboard.messages')}" returnUrl="{f:be.uri(route: 'dashboard')}">{item.realName}</be:link.editRecord>
<f:if condition="{item.username}">
<div class="text-muted">({item.username})</div>
</f:if>
</f:then>
<f:else>
<be:link.editRecord table="be_users" uid="{item.userId}" title="{f:translate(key: 'widgets.latestBeLogins.column.user.edit', domain: 'dashboard.messages')}" returnUrl="{f:be.uri(route: 'dashboard')}">{f:if(condition: item.username, then: item.username, else: '{f:translate(key: \'widgets.latestBeLogins.column.user.notFound\', domain: \'dashboard.messages\')}')}</be:link.editRecord>
</f:else>
</f:if>
</td>
<td class="col-datetime">
{item.timestamp -> f:format.date(format: dateFormat)}
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:then>
<f:else>
<div class="callout callout-info">
<div class="callout-icon">
<span class="icon-emphasized">
<core:icon identifier="content-widget-list" />
</span>
</div>
<div class="callout-content">
<div class="callout-title">
{f:translate(key: 'widgets.latestBeLogins.empty', domain: 'dashboard.messages')}
</div>
</div>
</div>
</f:else>
</f:if>
</f:section>
<f:section name="footer">
<f:render partial="Widget/Button" arguments="{button: button}"/>
</f:section>
</html>
@@ -0,0 +1,122 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget"/>
<f:section name="main">
<f:if condition="{latestPages}">
<f:then>
<div class="widget-table-wrapper">
<table class="widget-table table table-striped table-hover">
<thead>
<tr>
<th class="col-time">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.change')}</th>
<th colspan="2">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.user')}</th>
<th colspan="2">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.page')}</th>
<th class="col-control nowrap"><span class="visually-hidden">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.control')}</span></th>
</tr>
</thead>
<tbody>
<f:for each="{latestPages}" as="page">
<tr>
<td class="col-datetime">
{page.pageRecord.tstamp -> f:format.date(format: dateFormat)}<br/>
<span class="badge badge-notice">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.table.{page.history.tablename}')}</span>
</td>
<td class="col-avatar">
<be:avatar backendUser="{page.history.userid}" size="32" showIcon="true" />
</td>
<td class="col-username col-responsive">
<f:if condition="{page.realName}">
<f:then>
{page.realName}
<f:if condition="{page.userName}">
<div class="text-variant">({page.userName})</div>
</f:if>
</f:then>
<f:else>
{f:if(condition: page.userName, then: page.userName, else: '{f:translate(key: \'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.user.userNotFound\')}')}
</f:else>
</f:if>
</td>
<td class="col-icon col-nowrap">
<span title="id={page.pageRecord.uid}">
<core:iconForRecord table="pages" row="{page}" />
</span>
<f:if condition="{page.siteLanguage}">
<span title="{page.siteLanguage.title}">
<core:icon identifier="{page.siteLanguage.flagIdentifier}" />
</span>
</f:if>
<f:if condition="{page.pageRecord.t3ver_wsid}">
<span title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.page.workspace')}">
<core:icon identifier="actions-workspace" size="small" />
</span>
</f:if>
</td>
<td class="col-title">
{page.pageRecord.title}
<f:if condition="{page.rootline}">
<div><small class="text-variant" title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.page.pagetree')}">{page.rootline}</small></div>
</f:if>
</td>
<td class="col-control nowrap">
<div class="btn-group">
<f:be.link
route="record_history"
parameters="{element: 'pages:{page.pageRecord.uid}'}"
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.control.recordHistory')}">
<core:icon identifier="actions-history" />
</f:be.link>
<a href="{page.viewLink}"
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.control.viewWebpage')}"
target="_blank">
<core:icon identifier="actions-view-page" />
</a>
<f:be.link
route="web_layout"
parameters="{id: page.pageRecord._uid, function: 2, language: page.pageRecord.sys_language_uid}"
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.control.editPageContent')}">
<core:icon identifier="actions-document-edit" />
</f:be.link>
<be:link.editRecord
uid="{page.pageRecord.uid}"
table="pages"
class="btn btn-default btn-sm"
title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.column.control.editPage')}"
returnUrl="{f:be.uri(route: 'dashboard')}">
<core:icon identifier="actions-page-open" />
</be:link.editRecord>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:then>
<f:else>
<div class="callout callout-info">
<div class="callout-icon">
<span class="icon-emphasized">
<core:icon identifier="actions-history" />
</span>
</div>
<div class="callout-content">
<div class="callout-title">
<f:translate key="LLL:EXT:dashboard/Resources/Private/Language/locallang.xlf:widgets.latestChangedPages.empty" />
</div>
</div>
</div>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,17 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget" />
<f:section name="main">
<f:if condition="{items}">
<ul>
<f:for each="{items}" as="item">
<li>{item}</li>
</f:for>
</ul>
</f:if>
</f:section>
<f:section name="footer">
<f:render partial="Widget/Button" arguments="{button: button}"/>
</f:section>
</html>
@@ -0,0 +1,21 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget" />
<f:section name="main">
<div class="widget-number">
<f:if condition="{icon}">
<div class="widget-number-icon">
<core:icon identifier="{icon}" size="large" alternativeMarkupIdentifier="inline" />
</div>
</f:if>
<div class="widget-number-content">
<div class="widget-number-title"><f:translate key="{title}" default="{title}" /></div>
<f:if condition="{subtitle}">
<div class="widget-number-subtitle"><small><f:translate key="{subtitle}" default="{subtitle}" /></small></div>
</f:if>
<div class="widget-number-number">{number}</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,36 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget" />
<f:section name="main">
<f:if condition="{items}">
<f:then>
<div class="widget-table-wrapper">
<table class="widget-table table table-striped table-hover">
<f:for each="{items}" as="item">
<tr>
<td>
<f:link.external uri="{item.link}" target="_blank" rel="noreferrer"><strong>{item.title}</strong></f:link.external>
<small><time datetime="{item.pubDate -> f:format.date(format: '%Y-%m-%d')}">{item.pubDate -> f:format.date()}</time><f:if condition="{item.author.name}"> | {item.author.name}</f:if></small>
<p>{item.description -> f:format.crop(maxCharacters: 180)}</p>
</td>
</tr>
</f:for>
</table>
</div>
</f:then>
<f:else if="!{feedUrl}">
<f:be.infobox title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang_widget_rss.xlf:widget.rss.missingFeedConfiguration.title')}" state="-1">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang_widget_rss.xlf:widget.rss.missingFeedConfiguration.message')}</f:be.infobox>
</f:else>
<f:else if="{invalidFeed}">
<f:be.infobox title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang_widget_rss.xlf:widget.rss.feedError.title')}" state="2">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang_widget_rss.xlf:widget.rss.feedError.message', arguments: '{0: feedUrl}')}</f:be.infobox>
</f:else>
<f:else>
<f:be.infobox title="{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang_widget_rss.xlf:widget.rss.noItems.title')}" state="1">{f:translate(key: 'LLL:EXT:dashboard/Resources/Private/Language/locallang_widget_rss.xlf:widget.rss.noItems.message', arguments: '{0: feedUrl}')}</f:be.infobox>
</f:else>
</f:if>
</f:section>
<f:section name="footer">
<f:render partial="Widget/Button" arguments="{button: button}"/>
</f:section>
</html>
@@ -0,0 +1,27 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Widget/Widget" />
<f:section name="main">
<div class="row">
<div class="col-sm-8">
<f:if condition="{currentVersion} && {copyrightYear}">
<p>
{f:translate(key: 'widgets.t3information.text',
extensionName: 'dashboard',
arguments: '{
0: currentVersion,
1: "&copy; {copyrightYear}",
2: "Kasper Sk&aring;rh&oslash;j"
}') -> f:format.raw()}
</p>
</f:if>
</div>
<div class="col-sm-4">
<img src="{f:uri.resource(path: 'EXT:core/Resources/Public/Images/typo3_light_dark.svg')}"
class="widget-t3information-logo"
alt="{f:translate(key:'widgets.t3information.logo', extensionName: 'dashboard')}"/>
</div>
</div>
</f:section>
</html>
+24
View File
@@ -0,0 +1,24 @@
/*!
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
.dashboard-modal-tabpanel .nav{margin:-15px -15px 0;padding:15px 15px 0}
.dashboard-modal-items{display:grid;gap:var(--typo3-spacing);grid-template-columns:repeat(2,1fr)}
.dashboard-modal-item-block{background-color:var(--typo3-component-bg);border:var(--typo3-component-border-width) solid var(--typo3-component-border-color);border-radius:var(--typo3-component-border-radius);box-shadow:var(--typo3-component-box-shadow);color:var(--typo3-component-color);display:flex;font-weight:400;gap:var(--typo3-spacing);grid-column:span 2;height:100%;padding:var(--typo3-component-padding-y) var(--typo3-component-padding-x);text-align:left}
.dashboard-modal-item-block>*{-webkit-user-select:none;-moz-user-select:none;user-select:none}
.dashboard-modal-item-block:hover{background-color:var(--typo3-component-hover-bg);border:var(--typo3-component-border-width) solid var(--typo3-component-hover-border-color);color:var(--typo3-component-hover-color)}
@media screen and (min-width:768px){
.dashboard-modal-item-block{grid-column:span 1}}
.dashboard-modal-item-checkbox{cursor:pointer;height:0;opacity:0;position:absolute;width:0}
.dashboard-modal-item-checkbox:focus~.dashboard-modal-item-block{background-color:var(--typo3-component-focus-bg);border:var(--typo3-component-border-width) solid var(--typo3-component-focus-border-color);color:var(--typo3-component-focus-color);outline:var(--typo3-outline-width) var(--typo3-outline-style) color-mix(in srgb,var(--typo3-component-focus-border-color),transparent 25%)}
.dashboard-modal-item-checkbox:checked~.dashboard-modal-item-block{background-color:var(--typo3-component-active-bg);border:var(--typo3-component-border-width) solid var(--typo3-component-active-border-color);color:var(--typo3-component-active-color)}
.dashboard-modal-item-checkbox:focus:checked~.dashboard-modal-item-block{outline:var(--typo3-outline-width) var(--typo3-outline-style) color-mix(in srgb,var(--typo3-component-active-border-color),transparent 25%)}
.dashboard-modal-item-title{display:block;font-weight:700}
+84
View File
@@ -0,0 +1,84 @@
/*!
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
.dashboard-header{--dashboard-header-bg:var(--typo3-surface-container-high);--dashboard-header-border-color:var(--typo3-surface-container-highest);background:var(--dashboard-header-bg);border-bottom:1px solid var(--dashboard-header-border-color);margin:calc(var(--module-body-padding-y)*-1) calc(var(--module-body-padding-x)*-1) var(--module-body-padding-y);padding:var(--module-body-padding-y) var(--module-body-padding-x) 0}
.dashboard-header-container{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;justify-content:space-between}
.dashboard-loader{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}
.dashboard-tabs{align-items:center;display:flex;flex-wrap:wrap;gap:.25rem}
.dashboard-tabs-menu{display:flex;gap:2px;list-style:none;margin:0;padding:0}
.dashboard-tab{--dashboard-header-tab-padding:1rem;--dashboard-header-tab-state-color:initial;--dashboard-header-tab-state-bg:initial;--dashboard-header-tab-border-color:color-mix(in srgb,var(--dashboard-header-tab-bg),var(--dashboard-header-tab-color) var(--typo3-border-mix));--dashboard-header-tab-color:var(--dashboard-header-tab-state-color,var(--module-color));--dashboard-header-tab-bg:var(--dashboard-header-tab-state-bg,color-mix(in srgb,var(--module-bg),var(--dashboard-header-tab-color) 5%));--dashboard-header-tab-hover-color:var(--dashboard-header-tab-color);--dashboard-header-tab-hover-bg:color-mix(in srgb,color-mix(in srgb,var(--module-bg),var(--dashboard-header-tab-color) 5%),var(--dashboard-header-tab-color) 5%);--dashboard-header-tab-focus-color:var(--typo3-state-default-focus-color);--dashboard-header-tab-focus-bg:var(--typo3-state-default-focus-bg);--dashboard-header-tab-active-color:var(--module-color);--dashboard-header-tab-active-bg:var(--module-bg);--dashboard-header-tab-border-radius:var(--typo3-component-border-radius);border:1px solid var(--dashboard-header-tab-border-color);border-radius:var(--dashboard-header-tab-border-radius) var(--dashboard-header-tab-border-radius) 0 0;-webkit-margin-after:-1px;background:var(--dashboard-header-tab-bg);color:var(--dashboard-header-tab-color);display:inline-block;margin-block-end:-1px;outline-offset:-1px;padding:calc(var(--dashboard-header-tab-padding)/1.5) var(--dashboard-header-tab-padding)}
.dashboard-tab:focus,.dashboard-tab:hover{--dashboard-header-tab-state-bg:var(--dashboard-header-tab-hover-bg);isolation:isolate;text-decoration:none}
.dashboard-tab:focus-visible{border-radius:var(--dashboard-header-tab-border-radius);outline:var(--typo3-outline-width) var(--typo3-outline-style) color-mix(in srgb,var(--dashboard-header-tab-color),transparent 50%)}
.dashboard-tab--active{--dashboard-header-tab-state-color:var(--dashboard-header-tab-active-color)!important;--dashboard-header-tab-state-bg:var(--dashboard-header-tab-active-bg)!important;border-bottom-color:var(--dashboard-header-tab-state-bg)}
.dashboard-tab:has(+.btn-dashboard-add-tab){-webkit-margin-end:.25rem;margin-inline-end:.25rem}
.dashboard-empty{position:relative}
.dashboard-empty-content{background-color:var(--typo3-component-bg);border:var(--typo3-component-border-width) dashed var(--typo3-component-border-color);border-radius:var(--typo3-component-border-radius);padding:2.5em;text-align:center}
.dashboard-empty-content h3{font-size:1.5em;margin-bottom:.5em}
.dashboard-empty-content p{font-size:1.25em;margin-bottom:1em}
.dashboard-empty-content>:first-child{margin-top:0}
.dashboard-empty-content>:last-child{margin-bottom:0}
typo3-dashboard{display:block;width:100%}
.dashboard-configuration{margin:.25rem 0}
.dashboard-container{max-width:1600px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto}
.dashboard-dragging-container>typo3-dashboard-widget{position:fixed}
.dashboard-grid{--gutter:20px;--columns:1;--row-height:200px;display:grid;grid-template-columns:repeat(var(--columns),1fr);grid-gap:var(--gutter);grid-auto-rows:var(--row-height)}
.dashboard-item{--dashboard-item-border-color:transparent;--dashboard-item-border-radius:var(--typo3-component-border-radius);--dashboard-item-bg:transparent;--dashboard-item-active-border-color:var(--typo3-state-primary-border-color);--dashboard-item-active-bg:color-mix(in srgb,transparent,var(--typo3-state-primary-bg) 10%);--col-start:1;--col-span:1;--row-start:1;--row-span:1;background-color:var(--dashboard-item-bg);border-radius:var(--dashboard-item-border-radius);contain:inline-size;grid-column:var(--col-start)/span var(--col-span);grid-row:var(--row-start)/span var(--row-span);outline:1px dashed var(--dashboard-item-border-color);outline-offset:-1px;transition:outline .15s ease-out,background-color .15s ease-out}
@media (prefers-reduced-motion:reduce){
.dashboard-item{transition:none}}
.dashboard-item-content{height:100%;position:relative;width:100%}
.dashboard-item-dragging{--dashboard-item-border-color:var(--dashboard-item-active-border-color);--dashboard-item-bg:var(--dashboard-item-active-bg)}
.btn-dashboard-add-widget{--typo3-btn-padding-y:1rem;--typo3-btn-padding-x:1rem;bottom:24px;box-shadow:var(--typo3-component-box-shadow-flyout);inset-inline-end:24px;position:fixed;z-index:2}
.widget{--widget-padding:1.25rem;--widget-color:var(--typo3-component-color);--widget-bg:var(--typo3-component-bg);--widget-border-width:1px;--widget-border-radius:var(--typo3-component-border-radius);--widget-border-color:color-mix(in srgb,var(--widget-bg),var(--widget-color) var(--typo3-border-mix));--widget-box-shadow:var(--typo3-component-box-shadow);--widget-title-font-size:1rem;--widget-title-line-height:1.25;--widget-title-font-family:var(--typo3-header-font-family);--widget-title-color-state:initial;--widget-title-bg-state:initial;--widget-title-color:var(--widget-color);--widget-title-bg:var(--widget-bg);--widget-action-size:28px;background-color:var(--widget-bg);border:var(--widget-border-width) solid var(--widget-border-color);border-radius:var(--widget-border-radius);box-shadow:var(--widget-box-shadow);color:var(--widget-color);display:flex;flex-direction:column;height:100%;overflow:hidden}
.widget:focus-within .widget-action,.widget:hover .widget-action{opacity:.75}
.widget.widget-selected{--widget-border-color:var(--typo3-state-primary-border-color)}
.widget-loader{flex-grow:1;justify-content:center}
.widget-header,.widget-loader{align-items:center;display:flex}
.widget-header{border-bottom:var(--typo3-component-border-width) solid var(--typo3-component-border-color);cursor:grab;gap:var(--typo3-spacing);justify-content:space-between;padding:var(--typo3-component-padding-y) var(--typo3-component-padding-x)}
.widget-title{display:block;font-family:var(--typo3-header-font-family);font-size:.875rem;font-weight:700;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.widget-content{display:flex;flex-direction:column;height:100%;-webkit-user-select:text;-moz-user-select:text;user-select:text}
.widget-content-title{background-color:var(--widget-title-bg-state,var(--widget-title-bg));color:var(--widget-title-color-state,var(--widget-title-color));padding:calc(var(--widget-padding)/2) var(--widget-padding);-webkit-padding-end:calc(var(--widget-action-size)*3 + var(--widget-padding));border-bottom:var(--widget-border-width) solid var(--widget-border-color);font-family:var(--widget-title-font-family);font-size:var(--widget-title-font-size);font-weight:700;line-height:var(--widget-title-line-height);padding-inline-end:calc(var(--widget-action-size)*3 + var(--widget-padding))}
.widget-content-title span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.widget-content-title h2{margin-bottom:0}
.widget-content-main{flex-basis:0;flex-grow:1;overflow-y:auto;padding:var(--widget-padding)}
.widget-content-footer{padding:var(--widget-padding);padding-top:0}
.widget-actions{color:var(--widget-title-color-state,var(--widget-title-color));display:flex;inset-inline-end:calc(var(--widget-padding)/2)}
.widget-action{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;border-radius:4px;color:inherit;height:var(--widget-action-size);opacity:.5;position:relative;text-align:center;transition:opacity .2s ease-in-out;width:var(--widget-action-size)}
.widget-action:focus,.widget-action:hover{opacity:1!important}
.widget-action:focus,.widget-action:focus-visible{outline:var(--typo3-outline-width) var(--typo3-outline-style) color-mix(in srgb,currentColor,transparent 25%)!important}
.widget-action .icon{inset-inline-start:50%;position:absolute;top:50%;transform:translate(calc(-50%*var(--typo3-position-modifier)),-50%)}
.widget-action-move{cursor:grab}
.widget-chart{height:100%;width:100%}
.widget-edit{text-align:center;width:45px}
.widget-identifier-sys_note_default{--widget-title-bg:var(--typo3-state-default-bg);--widget-title-color:var(--typo3-state-default-color)}
.widget-identifier-sys_note_todos{--widget-title-bg:var(--typo3-state-success-bg);--widget-title-color:var(--typo3-state-success-color)}
.widget-identifier-sys_note_instructions{--widget-title-bg:var(--typo3-state-info-bg);--widget-title-color:var(--typo3-state-info-color)}
.widget-identifier-sys_note_notes{--widget-title-bg:var(--typo3-state-notice-bg);--widget-title-color:var(--typo3-state-notice-color)}
.widget-identifier-sys_note_template{--widget-title-bg:var(--typo3-state-warning-bg);--widget-title-color:var(--typo3-state-warning-color)}
.widget-table-wrapper{margin:calc(var(--widget-padding)*-1)}
.widget-table{margin:0}
.widget-table td:first-child,.widget-table th:first-child{-webkit-padding-start:var(--widget-padding);padding-inline-start:var(--widget-padding)}
.widget-table td:last-child,.widget-table th:last-child{-webkit-padding-end:var(--widget-padding);padding-inline-end:var(--widget-padding)}
.widget-table tbody:last-child tr:last-child td,.widget-table tbody:last-child tr:last-child th{border-bottom:none}
.widget-cta{--widget-cta-padding:8px;--widget-cta-bg:var(--typo3-state-secondary-bg);--widget-cta-color:var(--typo3-state-secondary-color);--widget-cta-hover-bg:var(--typo3-state-primary-hover-bg);--widget-cta-hover-color:var(--typo3-state-primary-hover-color);--widget-cta-focus-bg:var(--typo3-state-primary-focus-bg);--widget-cta-focus-color:var(--typo3-state-primary-focus-color);--widget-cta-border-radius:var(--typo3-component-border-radius);align-items:center;background-color:var(--widget-cta-bg);border-radius:var(--widget-cta-border-radius);color:var(--widget-cta-color);display:flex;justify-content:center;outline-offset:0;padding:var(--widget-cta-padding)}
.widget-cta:hover{--widget-cta-color:var(--widget-cta-hover-color);--widget-cta-bg:var(--widget-cta-hover-bg);text-decoration:none}
.widget-cta:focus{--widget-cta-color:var(--widget-cta-focus-color);--widget-cta-bg:var(--widget-cta-focus-bg);text-decoration:none}
.widget-cta:focus-visible{outline:var(--typo3-outline-width) var(--typo3-outline-style) color-mix(in srgb,var(--widget-cta-bg),transparent 25%)}
.widget-cta-icon{align-items:center;display:flex;height:18px;justify-content:center;width:18px;-webkit-margin-end:12px;color:var(--widget-cta-color);margin-inline-end:12px}
.widget-number{align-items:center;display:flex;height:100%}
.widget-number-icon{align-items:center;display:flex;width:42px;-webkit-margin-end:20px;margin-inline-end:20px}
.widget-number-content{display:flex;flex-direction:column;justify-content:center}
.widget-number-title{font-size:1rem;line-height:1.3;margin-bottom:5px}
.widget-number-number{font-size:24px;font-weight:900;line-height:1.3}
.widget-listgroup{--typo3-list-group-border-radius:0;--typo3-outline-width:2px;margin:calc(var(--widget-padding)*-1)}
.widget-listgroup .list-group-item{-webkit-border-start:0;border-inline-start:0;-webkit-border-end:0;border-inline-end:0;outline-offset:calc(var(--typo3-outline-width)*-1)}
.widget-listgroup .list-group-item:first-child{-webkit-border-before:0;border-block-start:0}
.widget-listgroup .list-group-item:last-child{-webkit-border-after:0;border-block-end:0}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#A4276A" d="M0 0h64v64H0z"/><path opacity=".5" fill="#FFF" d="M40 16h10v-1c0-.5-.5-1-1-1h-9v2z"/><path opacity=".75" fill="#FFF" d="M28 14h10v2H28z"/><path fill="#FFF" d="M40 18H26v-4H15c-.5 0-1 .5-1 1v34c0 .5.5 1 1 1h34c.5 0 1-.5 1-1V18H40z"/><path fill="#A4276A" d="M38 22h8v14h-8z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#A4276A" d="M18 22h18v14H18z"/><path opacity=".5" fill="#FFF" d="M38 24h8v12h-8z"/><path opacity=".5" fill-rule="evenodd" clip-rule="evenodd" fill="#FFF" d="M36 36H18v-4l6-2 4 2 4-2 4-6z"/><path fill="#A4276A" d="M28 40h18v2H28zM28 44h10v2H28zM18 40h8v6h-8z"/><path opacity=".5" fill="#FFF" d="M18 42h8v4h-8z"/></svg>

After

Width:  |  Height:  |  Size: 728 B

File diff suppressed because one or more lines are too long
@@ -0,0 +1,13 @@
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
import{Chart as t,ArcElement as i,LineElement as c,BarElement as d,PointElement as s,BarController as g,BubbleController as f,DoughnutController as u,LineController as h,PieController as C,PolarAreaController as m,RadarController as p,ScatterController as S,CategoryScale as b,LinearScale as v,LogarithmicScale as w,RadialLinearScale as y,TimeScale as E,TimeSeriesScale as L,Decimation as T,Filler as k,Legend as x,Title as z,Tooltip as D,SubTitle as R}from"chart.js";import B from"@typo3/core/event/regular-event.js";import{DashboardWidgetContentRenderedEvent as M}from"@typo3/dashboard/dashboard.js";class P{constructor(){this.selector=".dashboard-item",this.initialize()}initialize(){t.register(i,c,d,s,g,f,u,h,C,m,p,S,b,v,w,y,E,L,T,k,x,z,D,R),new B(M.eventName,(r,a)=>{r.preventDefault();const e=r.widget.eventdata;if(e===void 0||e.graphConfig===void 0)return;const l=a.querySelector("canvas");let o;if(l!==null&&(o=l.getContext("2d")),o===void 0)return;this.darkModeEnabled()?(e.graphConfig.options.color="#ccc",e.graphConfig.options.borderColor="#000",t.defaults.borderColor="rgba(255,255,255,.1)",t.defaults.color="#ccc"):(e.graphConfig.options.color="#666",e.graphConfig.options.borderColor="#fff",t.defaults.borderColor="rgba(0,0,0,.1)",t.defaults.color="#666");const n=t.getChart(o);if(n){n.data=e.graphConfig.data,n.options=e.graphConfig.options,n.update();return}new t(o,e.graphConfig)}).delegateTo(document,this.selector)}darkModeEnabled(){const r=document.querySelector(this.selector),e=window.getComputedStyle(r).colorScheme;return e==="light only"||e==="light"?!1:e==="dark only"||e==="dark"?!0:window.matchMedia("(prefers-color-scheme: dark)").matches}}var q=new P;export{q as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1,13 @@
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
import{LitElement as f,html as d,nothing as k}from"lit";import{property as m,state as c,customElement as y}from"lit/decorators.js";import{repeat as h}from"lit/directives/repeat.js";import g from"~labels/core.bookmarks";import u,{BookmarkStoreChangedEvent as b}from"@typo3/backend/bookmark/bookmark-store.js";import"@typo3/backend/bookmark/bookmark-manager.js";var l=function(r,t,e,s){var a=arguments.length,o=a<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,e):s,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(r,t,e,s);else for(var p=r.length-1;p>=0;p--)(i=r[p])&&(o=(a<3?i(o):a>3?i(t,e,o):i(t,e))||o);return a>3&&o&&Object.defineProperty(t,e,o),o};let n=class extends f{constructor(){super(...arguments),this.limit=0,this.groupId=null,this.groupedBookmarks=new Map,this.groups=[],this.handleStoreUpdate=()=>{this.syncFromStore()}}connectedCallback(){super.connectedCallback(),document.addEventListener(b,this.handleStoreUpdate),this.syncFromStore()}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener(b,this.handleStoreUpdate)}createRenderRoot(){return this}render(){return this.groupedBookmarks.size===0?d`<p class=dropdown-item-text>${g.get("description")}</p>`:d`<div class=widget-table-wrapper>${h(Array.from(this.groupedBookmarks.entries()),([t])=>t,([t,e])=>this.renderGroup(t,e,this.groupedBookmarks.size>1))}</div>`}async syncFromStore(){this.groupedBookmarks=await u.getGroupedBookmarks({groupId:this.groupId??void 0,limit:this.limit>0?this.limit:void 0,accessibleOnly:!0}),this.groups=await u.getGroups()}renderGroup(t,e,s){const o=this.groups.find(i=>i.id===t)?.label||g.get("notGrouped");return d`<table class="widget-table table table-striped table-hover">${s&&this.groupId===null?d`<thead><tr><th>${o}</th></tr></thead>`:k}<tbody>${h(e,i=>i.id,i=>this.renderBookmarkRow(i))}</tbody></table>`}renderBookmarkRow(t){return d`<tr><td><span class="bookmark-item-column bookmark-item-column-icon" aria-hidden=true> <typo3-backend-icon identifier=${t.iconIdentifier} overlay=${t.iconOverlayIdentifier} size=small></typo3-backend-icon> </span> <a href=${t.href} title=${t.title} @click=${e=>this.handleNavigate(e,t)}><span class="bookmark-item-column bookmark-item-column-title"> ${t.title} </span> </a></td></tr>`}handleNavigate(t,e){t.preventDefault(),u.navigate(e)}};l([m({type:Number})],n.prototype,"limit",void 0),l([m({attribute:"group",converter:{fromAttribute:r=>{if(r===null||r==="")return null;const t=Number(r);return Number.isNaN(t)?r:t},toAttribute:r=>r===null?null:String(r)}})],n.prototype,"groupId",void 0),l([c()],n.prototype,"groupedBookmarks",void 0),l([c()],n.prototype,"groups",void 0),n=l([y("typo3-dashboard-bookmarks-widget")],n);export{n as BookmarksWidgetElement};