TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:03 +02:00
commit 61d66df078
65 changed files with 8311 additions and 0 deletions
@@ -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:beuser/Resources/Private/Language/Modules/permissions.xlf" date="2026-11-10T13:37:37Z" product-name="permissions">
<header/>
<body>
<trans-unit id="title">
<source>Permissions</source>
</trans-unit>
<trans-unit id="short_description">
<source>Manage page access permissions</source>
</trans-unit>
<trans-unit id="description">
<source>Administers which backend users and groups can access and edit pages in the site tree. For each page, an owner user and group can be assigned, and read, write, and edit permissions defined. These settings control who can view or modify content within the page hierarchy.</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:beuser/Resources/Private/Language/Modules/user_management.xlf" date="2026-11-10T13:37:37Z" product-name="user_management">
<header/>
<body>
<trans-unit id="title">
<source>Users</source>
</trans-unit>
<trans-unit id="short_description">
<source>Backend users management</source>
</trans-unit>
<trans-unit id="description">
<source>Administers backend user accounts and groups, and defines access permissions on records, files, and modules. Page-level read and write permissions can be managed separately in the Permissions module.</source>
</trans-unit>
</body>
</file>
</xliff>
+430
View File
@@ -0,0 +1,430 @@
<?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:beuser/Resources/Private/Language/locallang.xlf" date="2023-02-15T18:03:32Z" product-name="beuser">
<header/>
<body>
<trans-unit id="userName">
<source>Username</source>
</trans-unit>
<trans-unit id="avatar">
<source>Avatar</source>
</trans-unit>
<trans-unit id="realName">
<source>Real name</source>
</trans-unit>
<trans-unit id="name">
<source>Name</source>
</trans-unit>
<trans-unit id="email">
<source>Email</source>
</trans-unit>
<trans-unit id="admin">
<source>Admin</source>
</trans-unit>
<trans-unit id="users">
<source>Users</source>
</trans-unit>
<trans-unit id="user">
<source>User</source>
</trans-unit>
<trans-unit id="yes">
<source>Yes</source>
</trans-unit>
<trans-unit id="no">
<source>No</source>
</trans-unit>
<trans-unit id="never">
<source>Never</source>
</trans-unit>
<trans-unit id="disable">
<source>Enabled</source>
</trans-unit>
<trans-unit id="startDateAndTime">
<source>Start</source>
</trans-unit>
<trans-unit id="endDateAndTime">
<source>Stop</source>
</trans-unit>
<trans-unit id="lastLogin">
<source>Last login</source>
</trans-unit>
<trans-unit id="allowedLanguages">
<source>Limit to languages</source>
</trans-unit>
<trans-unit id="pageTreeEntryPoints">
<source>Page Tree Entry Points</source>
</trans-unit>
<trans-unit id="fileMounts">
<source>File mountpoints</source>
</trans-unit>
<trans-unit id="groups">
<source>Groups</source>
</trans-unit>
<trans-unit id="inheritance">
<source>Inheritance</source>
</trans-unit>
<trans-unit id="group">
<source>Group</source>
</trans-unit>
<trans-unit id="languages">
<source>Languages</source>
</trans-unit>
<trans-unit id="categories">
<source>Categories</source>
</trans-unit>
<trans-unit id="permissions">
<source>Permissions</source>
</trans-unit>
<trans-unit id="modules">
<source>Modules</source>
</trans-unit>
<trans-unit id="tableModes.read">
<source>Read</source>
</trans-unit>
<trans-unit id="tableModes.write">
<source>Read &amp; Write</source>
</trans-unit>
<trans-unit id="mountsWorkspaces">
<source>Mounts and workspaces</source>
</trans-unit>
<trans-unit id="options">
<source>Options</source>
</trans-unit>
<trans-unit id="allowedPageContentTypes">
<source>Allowed page content types</source>
</trans-unit>
<trans-unit id="generalPermissions">
<source>General permissions</source>
</trans-unit>
<trans-unit id="compare.tables">
<source>Table permissions</source>
</trans-unit>
<trans-unit id="compare.direct.inherit">
<source>Inherit</source>
</trans-unit>
<trans-unit id="compare.direct.direct">
<source>Direct</source>
</trans-unit>
<trans-unit id="information.defaultLanguage">
<source>Default</source>
</trans-unit>
<trans-unit id="information.defaultWorkspace">
<source>Default</source>
</trans-unit>
<trans-unit id="information.groups.table.column.groupTitle">
<source>Group title</source>
</trans-unit>
<!-- Docheader menu / Shortcut button title -->
<trans-unit id="backendUser">
<source>Backend User</source>
</trans-unit>
<trans-unit id="backendUserGroup">
<source>Backend User Group</source>
</trans-unit>
<trans-unit id="backendUsers">
<source>Backend users</source>
</trans-unit>
<trans-unit id="backendUserDetails">
<source>Backend user details</source>
</trans-unit>
<trans-unit id="backendUserGroupsMenu">
<source>Backend user groups</source>
</trans-unit>
<trans-unit id="backendUserGroupDetails">
<source>Backend user group details</source>
</trans-unit>
<trans-unit id="compareBackendUsers">
<source>Compare backend users</source>
</trans-unit>
<trans-unit id="compareBackendUsersGroups">
<source>Compare backend user groups</source>
</trans-unit>
<trans-unit id="onlineUsers">
<source>Online users</source>
</trans-unit>
<!-- Button / Links -->
<trans-unit id="btn.addToCompareList">
<source>Add to compare list</source>
</trans-unit>
<trans-unit id="btn.backendUser.create">
<source>Create new backend user</source>
</trans-unit>
<trans-unit id="btn.editor.create">
<source>Create editor</source>
</trans-unit>
<trans-unit id="btn.admin.create">
<source>Create admin</source>
</trans-unit>
<trans-unit id="btn.backendUserGroup.create">
<source>Create new backend user group</source>
</trans-unit>
<trans-unit id="btn.clearCompareList">
<source>Clear compare list</source>
</trans-unit>
<trans-unit id="btn.compare">
<source>Compare</source>
</trans-unit>
<trans-unit id="btn.delete">
<source>Delete</source>
</trans-unit>
<trans-unit id="btn.details">
<source>Show details</source>
</trans-unit>
<trans-unit id="btn.disable">
<source>Disable</source>
</trans-unit>
<trans-unit id="btn.edit">
<source>Edit</source>
</trans-unit>
<trans-unit id="btn.enable">
<source>Enable</source>
</trans-unit>
<trans-unit id="btn.info">
<source>Info</source>
</trans-unit>
<trans-unit id="btn.removeFromCompareList">
<source>Remove from compare list</source>
</trans-unit>
<!-- Filter -->
<trans-unit id="filter">
<source>Filter</source>
</trans-unit>
<trans-unit id="reset">
<source>Reset</source>
</trans-unit>
<!-- Pagination -->
<trans-unit id="pagination.previous">
<source>previous</source>
</trans-unit>
<trans-unit id="pagination.next">
<source>next</source>
</trans-unit>
<trans-unit id="pagination.first">
<source>first</source>
</trans-unit>
<trans-unit id="pagination.last">
<source>last</source>
</trans-unit>
<trans-unit id="pagination.records">
<source>Records</source>
</trans-unit>
<trans-unit id="pagination.page">
<source>Page</source>
</trans-unit>
<trans-unit id="pagination.refresh">
<source>Refresh</source>
</trans-unit>
<!-- Backend users: General (ViewHelper labels, etc.) -->
<trans-unit id="switchBackMode">
<source>Switch to user</source>
</trans-unit>
<trans-unit id="lockedMfaProviders">
<source>Locked MFA providers</source>
</trans-unit>
<trans-unit id="mfaEnabled">
<source>MFA enabled</source>
</trans-unit>
<!-- Backend users: List -->
<trans-unit id="backendUser.list.title">
<source>Backend users</source>
</trans-unit>
<trans-unit id="backendUser.list.section.compare">
<source>Backend users to compare</source>
</trans-unit>
<trans-unit id="backendUser.list.section.allUsers">
<source>Backend users in the system</source>
</trans-unit>
<trans-unit id="backendUser.list.btn.compareList">
<source>Compare selected backend users</source>
</trans-unit>
<trans-unit id="backendUser.list.table.column.group">
<source>Group</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.group">
<source>Group</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.loginState">
<source>Login state</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.loginState.all">
<source>All</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.loginState.loginBefore">
<source>Logged in before</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.loginState.never">
<source>Never logged in</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.loginState.loggedIn">
<source>Currently logged in</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.status">
<source>Status</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.status.all">
<source>All</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.status.enabled">
<source>Enabled</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.status.disabled">
<source>Disabled</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.userType">
<source>Type</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.userType.all">
<source>All</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.userType.admin">
<source>Admin</source>
</trans-unit>
<trans-unit id="backendUser.list.filter.userType.normalUser">
<source>Normal user</source>
</trans-unit>
<trans-unit id="backendUser.list.label.online">
<source>online</source>
</trans-unit>
<trans-unit id="backendUser.confirmDelete">
<source>Are you sure you want to delete the backend user '%s'?</source>
</trans-unit>
<!-- Backend users: Show -->
<trans-unit id="backendUser.show.title">
<source>Configuration of backend user "%s"</source>
</trans-unit>
<trans-unit id="backendUser.show.notConfigured">
<source>Not configured.</source>
</trans-unit>
<trans-unit id="backendUser.show.infobox.title">
<source>Compiled rights and settings</source>
</trans-unit>
<trans-unit id="backendUser.show.infobox.message">
<source>This view displays all compiled rights and settings of the selected backend user. These can come from settings in the backend user record itself, as well as from settings that have been stored in backend user groups assigned to this backend user.</source>
</trans-unit>
<!-- Backend users: Compare -->
<trans-unit id="backendUser.compare.title">
<source>Compare backend users</source>
</trans-unit>
<!-- Backend users: Online -->
<trans-unit id="backendUser.online.title">
<source>Online users</source>
</trans-unit>
<trans-unit id="backendUser.online.table.column.ipAddress">
<source>IP address</source>
</trans-unit>
<trans-unit id="backendUser.online.table.column.lastAccess">
<source>Last access</source>
</trans-unit>
<trans-unit id="backendUser.online.activeSession">
<source>Active session</source>
</trans-unit>
<trans-unit id="backendUser.online.flashMessage.terminateSessionSuccess">
<source>Session successfully terminated.</source>
</trans-unit>
<trans-unit id="backendUser.online.reallyLogout">
<source>Really logout</source>
</trans-unit>
<trans-unit id="backendUser.online.endSession">
<source>End session</source>
</trans-unit>
<!-- Backend user groups: List -->
<trans-unit id="backendUserGroup.list.title">
<source>Backend user groups</source>
</trans-unit>
<trans-unit id="backendUserGroup.noGroupsFound.title">
<source>No backend user groups found</source>
</trans-unit>
<trans-unit id="backendUserGroup.noGroupsFound.message">
<source>There are currently no backend user groups found in the database.</source>
</trans-unit>
<trans-unit id="backendUserGroup.list.section.compare">
<source>Backend user groups to compare</source>
</trans-unit>
<trans-unit id="backendUserGroup.list.section.allUserGroups">
<source>Backend user groups in the system</source>
</trans-unit>
<trans-unit id="backendUserGroup.list.btn.compareList">
<source>Compare selected backend user groups</source>
</trans-unit>
<trans-unit id="backendUserGroup.list.filter.groupTitle">
<source>Group title or group ID</source>
</trans-unit>
<trans-unit id="backendUserGroup.list.table.column.groupTitle">
<source>Group title</source>
</trans-unit>
<trans-unit id="backendUserGroup.list.table.column.subgroup">
<source>Inherit settings from groups</source>
</trans-unit>
<trans-unit id="backendUserGroup.confirmDelete">
<source>Are you sure you want to delete the backend user group '%s'?</source>
</trans-unit>
<!-- Backend user groups: Show -->
<trans-unit id="backendUserGroup.show.title">
<source>Configuration of backend user group "%s"</source>
</trans-unit>
<trans-unit id="backendUserGroup.show.notConfigured">
<source>Not configured.</source>
</trans-unit>
<trans-unit id="backendUserGroup.show.infobox.title">
<source>Compiled rights and settings</source>
</trans-unit>
<trans-unit id="backendUserGroup.show.infobox.message">
<source>This view displays all compiled rights and settings of the selected backend user group. These can come from settings in the backend user group record itself, as well as from settings that have been stored in backend user groups assigned to this backend user group.</source>
</trans-unit>
<!-- Backend user groups: Compare -->
<trans-unit id="backendUserGroup.compare.title">
<source>Compare backend user groups</source>
</trans-unit>
<!-- File mounts -->
<trans-unit id="filemounts">
<source>File mounts</source>
</trans-unit>
<trans-unit id="filemount.list.title">
<source>File Mounts</source>
</trans-unit>
<trans-unit id="filemount.confirm.deletion">
<source>Are you sure, that you want to delete the file mount "%s"?</source>
</trans-unit>
<trans-unit id="filemount.create">
<source>Create new file mount</source>
</trans-unit>
<trans-unit id="filemount.infobox.noFilemountFound.title">
<source>No file mount found</source>
</trans-unit>
<trans-unit id="filemount.infobox.noFilemountFound.message">
<source>Please create a file mount and select its entry point.</source>
</trans-unit>
<trans-unit id="filemount.link.openInFilelist">
<source>Open in file list</source>
</trans-unit>
<trans-unit id="filemount.amount.multiple">
<source>File mounts</source>
</trans-unit>
<trans-unit id="filemount.amount.singular">
<source>File mount</source>
</trans-unit>
<!-- Password reset -->
<trans-unit id="flashMessage.resetPassword.error.title">
<source>Password reset not triggered</source>
</trans-unit>
<trans-unit id="flashMessage.resetPassword.error.text">
<source>Sorry, the password of this user cannot be reset.</source>
</trans-unit>
<trans-unit id="flashMessage.resetPassword.success.title">
<source>Password reset triggered</source>
</trans-unit>
<trans-unit id="flashMessage.resetPassword.success.text">
<source>Password reset for email address %s initiated.</source>
</trans-unit>
<trans-unit id="resetPassword.label">
<source>Reset Password</source>
</trans-unit>
<trans-unit id="resetPassword.confirmation.header">
<source>Reset Password</source>
</trans-unit>
<trans-unit id="resetPassword.confirmation.text">
<source>Are you sure you want to reset the password for %s?</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,134 @@
<?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:beuser/Resources/Private/Language/locallang_mod_permission.xlf" date="2011-10-17T20:22:34Z" product-name="lang">
<header/>
<body>
<trans-unit id="permissions">
<source>Permissions</source>
</trans-unit>
<trans-unit id="ch_permissions">
<source>Change permissions</source>
</trans-unit>
<trans-unit id="Legend">
<source>Legend</source>
</trans-unit>
<trans-unit id="Owner">
<source>Owner</source>
</trans-unit>
<trans-unit id="Group">
<source>Group</source>
</trans-unit>
<trans-unit id="Everybody">
<source>Everybody</source>
</trans-unit>
<trans-unit id="EditLock_descr">
<source>Disable the »Admin-only« edit lock for this page. Currently this page and all content is locked for editing by all non-Admin users.</source>
</trans-unit>
<trans-unit id="EditLock_descr2">
<source>Enable the »Admin-only« edit lock for this page</source>
</trans-unit>
<trans-unit id="Save">
<source>Save</source>
</trans-unit>
<trans-unit id="Abort">
<source>Abort</source>
</trans-unit>
<trans-unit id="Edit">
<source>EDIT</source>
</trans-unit>
<trans-unit id="recursive">
<source>Set recursively</source>
</trans-unit>
<trans-unit id="page_affected">
<source>page affected</source>
</trans-unit>
<trans-unit id="pages_affected">
<source>pages affected</source>
</trans-unit>
<trans-unit id="user_overview">
<source>User overview</source>
</trans-unit>
<trans-unit id="Mode">
<source>Mode</source>
</trans-unit>
<trans-unit id="Depth">
<source>Depth</source>
</trans-unit>
<trans-unit id="level">
<source>level</source>
</trans-unit>
<trans-unit id="levels">
<source>levels</source>
</trans-unit>
<trans-unit id="User">
<source>User</source>
</trans-unit>
<trans-unit id="changeOwner">
<source>Change owner</source>
</trans-unit>
<trans-unit id="changeGroup">
<source>Change group</source>
</trans-unit>
<trans-unit id="def">
<source>Definition: 'content' is records from all tables on a page - except from records from the table 'pages' (Pages).</source>
</trans-unit>
<trans-unit id="A_Granted">
<source>Access Granted</source>
</trans-unit>
<trans-unit id="A_Denied">
<source>Access Denied</source>
</trans-unit>
<trans-unit id="1">
<source>Show page</source>
</trans-unit>
<trans-unit id="16">
<source>Edit content</source>
</trans-unit>
<trans-unit id="2">
<source>Edit page</source>
</trans-unit>
<trans-unit id="4">
<source>Delete page</source>
</trans-unit>
<trans-unit id="8">
<source>New pages</source>
</trans-unit>
<trans-unit id="1_t">
<source>Show/Copy page and content.</source>
</trans-unit>
<trans-unit id="16_t">
<source>Change/Add/Delete/Move content.</source>
</trans-unit>
<trans-unit id="2_t">
<source>Change page eg. change pagetitle etc.</source>
</trans-unit>
<trans-unit id="4_t">
<source>Delete/Move page and content.</source>
</trans-unit>
<trans-unit id="8_t">
<source>Create new pages under this page.</source>
</trans-unit>
<trans-unit id="WorkspaceWarning">
<source>Workspace Warning</source>
</trans-unit>
<trans-unit id="WorkspaceWarningText">
<source>Permissions set in a workspace take effect only after the related elements are published. To apply permissions immediately, configure them in the Live workspace. (Permissions are always evaluated based on the Live workspace record or the placeholder of a draft version)</source>
</trans-unit>
<trans-unit id="notSet">
<source>not set</source>
</trans-unit>
<trans-unit id="deleted">
<source>deleted</source>
</trans-unit>
<trans-unit id="noGroups">
<source>No user groups exist.</source>
</trans-unit>
<trans-unit id="selectNone">
<source> - none - </source>
</trans-unit>
<trans-unit id="selectUnchanged">
<source> - leave unchanged - </source>
</trans-unit>
</body>
</file>
</xliff>
@@ -0,0 +1,9 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:render section="headline" />
<f:render section="content" />
</html>
@@ -0,0 +1,80 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:form action="list" objectName="demand" object="{demand}">
<div class="form-row">
<div class="form-group">
<label for="tx_Beuser_username" class="form-label"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:userName" /></label>
<f:form.textfield
type="search"
autocomplete="off"
id="tx_Beuser_username"
class="form-control"
property="userName"
/>
</div>
<div class="form-group">
<label for="tx_Beuser_usertype" class="form-label"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.filter.userType" /></label>
<f:form.select
id="tx_Beuser_usertype"
class="form-select"
property="userType"
options="{
0: '{f:translate(key:\"backendUser.list.filter.userType.all\")}',
1: '{f:translate(key:\"backendUser.list.filter.userType.admin\")}',
2: '{f:translate(key:\"backendUser.list.filter.userType.normalUser\")}'
}"
/>
</div>
<div class="form-group">
<label for="tx_Beuser_status" class="form-label"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.filter.status" /></label>
<f:form.select
id="tx_Beuser_status"
class="form-select"
property="status"
options="{
0: '{f:translate(key:\"backendUser.list.filter.status.all\")}',
1: '{f:translate(key:\"backendUser.list.filter.status.enabled\")}',
2: '{f:translate(key:\"backendUser.list.filter.status.disabled\")}'
}"
/>
</div>
<div class="form-group">
<label for="tx_Beuser_logins" class="form-label"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.filter.loginState" /></label>
<f:form.select
id="tx_Beuser_logins"
class="form-select"
property="logins"
options="{
0: '{f:translate(key:\"backendUser.list.filter.loginState.all\")}',
1: '{f:translate(key:\"backendUser.list.filter.loginState.loginBefore\")}',
2: '{f:translate(key:\"backendUser.list.filter.loginState.never\")}',
3: '{f:translate(key:\"backendUser.list.filter.loginState.loggedIn\")}'
}"
/>
</div>
<div class="form-group">
<label for="tx_beuser_backendUserGroup" class="form-label"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.filter.group" /></label>
<f:form.select
id="tx_beuser_backendUserGroup"
class="form-select"
property="backendUserGroup"
options="{backendUserGroups}"
optionLabelField="title"
optionValueField="uid"
/>
</div>
<div class="form-group align-self-end">
<f:form.button type="submit" name="operation" value="filter" class="btn btn-default">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filter" />
</f:form.button>
<f:form.button type="submit" name="operation" value="reset-filters" class="btn btn-link">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:reset" />
</f:form.button>
</div>
</div>
</f:form>
</html>
@@ -0,0 +1,223 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="table-fit">
<table id="typo3-backend-user-list" class="table table-striped table-hover">
<thead>
<tr>
<th colspan="3"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:userName" /> / <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:realName" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.table.column.group" /></th>
<th class="col-datetime"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:lastLogin" /></th>
<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>
<f:for each="{paginator.paginatedItems}" as="backendUser">
<tr>
<td class="col-indicator">
<f:if condition="{onlineBackendUsers.{backendUser.uid}}">
<typo3-backend-status-indicator state="success" live label="{f:translate(key:'backendUser.list.label.online', domain:'beuser.messages')}"></typo3-backend-status-indicator>
</f:if>
</td>
<td class="col-avatar">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_users"
data-contextmenu-uid="{backendUser.uid}"
title="{f:if(condition: '{backendUser.description}', then: '{backendUser.description} (id={backendUser.uid})', else: 'id={backendUser.uid}')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<backend:avatar backendUser="{backendUser.uid}" showIcon="TRUE" />
</button>
</td>
<td class="col-50">
<backend:link.editRecord table="be_users" uid="{backendUser.uid}" title="{f:translate(key:'btn.edit')}">
<f:if condition="{backendUser.realName}">
<f:then>
{backendUser.realName}
<beuser:mfaStatus userUid="{backendUser.uid}"/><br>
<span class="text-variant">({backendUser.username})</span>
</f:then>
<f:else>
{backendUser.username}
<beuser:mfaStatus userUid="{backendUser.uid}"/>
</f:else>
</f:if>
</backend:link.editRecord>
</td>
<td class="col-50 nowrap-disabled">
<f:for each="{backendUser.backendUserGroups}" as="backendUserGroup" iteration="backendUserGroupIterator">
<backend:link.editRecord table="be_groups" uid="{backendUserGroup.uid}" title="{f:translate(key:'btn.edit')}" class="nowrap">{backendUserGroup.title}</backend:link.editRecord><f:if condition="!{backendUserGroupIterator.isLast}">,</f:if>
</f:for>
</td>
<td class="col-datetime">
<f:if condition="{backendUser.lastLoginDateAndTime}">
<f:then>
<f:format.date format="{dateFormat} {timeFormat}">{backendUser.lastLoginDateAndTime}</f:format.date>
</f:then>
<f:else>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:never" />
</f:else>
</f:if>
</td>
<td class="col-control">
<div class="btn-group" role="group">
<backend:link.editRecord
class="btn btn-default"
table="be_users"
uid="{backendUser.uid}"
title="{f:translate(key:'btn.edit')}"
role="button"
>
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:if condition="{backendUser.currentlyLoggedIn} == 1">
<f:then>
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:then>
<f:else>
<f:if condition="{backendUser.isDisabled} == 1">
<f:then>
<a
class="btn btn-default"
href="{backend:moduleLink(route:'tce_db', query:'data[be_users][{backendUser.uid}][disable]=0', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.enable')}"
role="button"
>
<core:icon identifier="actions-edit-unhide" />
</a>
</f:then>
<f:else>
<a
class="btn btn-default"
href="{backend:moduleLink(route:'tce_db', query:'data[be_users][{backendUser.uid}][disable]=1', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.disable')}"
role="button"
>
<core:icon identifier="actions-edit-hide" />
</a>
</f:else>
</f:if>
</f:else>
</f:if>
<f:if condition="{currentUserUid} == {backendUser.uid}">
<f:then>
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:then>
<f:else>
<form action="{backend:moduleLink(route:'tce_db', currentUrlParameterName:'redirect')}" name="be_user_remove_{backendUser.uid}" id="be_user_remove_{backendUser.uid}" method="post">
<input name="cmd[be_users][{backendUser.uid}][delete]=1" type="hidden" value="{group.uid}">
</form>
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
data-target-form="be_user_remove_{backendUser.uid}"
title="{f:translate(key:'btn.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:'backendUser.confirmDelete',arguments:'{0:backendUser.userName}')}"
data-button-close-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-button-ok-text="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_record.yes')}"
>
<core:icon identifier="actions-edit-delete" />
</button>
</f:else>
</f:if>
</div>
<div class="btn-group" role="group">
<f:if condition="{backendUser.passwordResetEnabled}">
<f:then>
<f:form.button
name="user"
value="{backendUser.uid}"
form="form-initiate-password-reset"
class="btn btn-default t3js-modal-trigger"
title="{f:translate(key: 'resetPassword.label')}"
type="submit"
data-severity="warning"
data-title="{f:translate(key: 'resetPassword.confirmation.header')}"
data-content="{f:translate(key: 'resetPassword.confirmation.text', arguments: {0: '{backendUser.email}'})}"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}">
<core:icon identifier="actions-key" />
</f:form.button>
</f:then>
<f:else>
<span class="btn btn-default disabled"><core:icon identifier="empty-empty" /></span>
</f:else>
</f:if>
<f:link.action
action="show"
arguments="{uid: backendUser.uid}"
class="btn btn-default"
title="{f:translate(key: 'btn.details')}"
role="button"
>
<core:icon identifier="actions-system-options-view" size="small"/>
</f:link.action>
<a
class="btn btn-default"
href="#"
title="{f:translate(key:'btn.info')}"
data-dispatch-action="TYPO3.InfoWindow.showItem"
data-dispatch-args-list="be_users,{backendUser.uid}"
role="button"
>
<core:icon identifier="actions-document-info" />
</a>
</div>
<div class="btn-group" role="group">
<f:if condition="{compareUserUidList.{backendUser.uid}}">
<f:then>
<f:form.button
form="form-remove-from-compare-list"
name="uid"
value="{backendUser.uid}"
type="submit"
class="btn btn-default"
title="{f:translate(key: 'btn.removeFromCompareList')}"
>
<core:icon identifier="actions-minus" size="small"/>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.compare" />
</f:form.button>
</f:then>
<f:else>
<f:form.button
form="form-add-to-compare-list"
name="uid"
value="{backendUser.uid}"
type="submit"
class="btn btn-default"
title="{f:translate(key: 'btn.addToCompareList')}"
>
<core:icon identifier="actions-plus" size="small"/>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.compare" />
</f:form.button>
</f:else>
</f:if>
<beuser:SwitchUser class="btn btn-default" backendUser="{backendUser}" />
</div>
</td>
</tr>
</f:for>
</tbody>
<tfoot>
<tr>
<td colspan="6">
<f:if condition="{totalAmountOfBackendUsers} > 1">
<f:then>{totalAmountOfBackendUsers} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:users" /></f:then>
<f:else>{totalAmountOfBackendUsers} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:user" /></f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:render partial="SimplePagination" arguments="{paginator:paginator, pagination:pagination, actionName:'list'}" />
@@ -0,0 +1,27 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:form action="groups" objectName="userGroupDto" object="{userGroupDto}">
<div class="form-row">
<div class="form-group">
<label for="tx_Beugroups_title" class="form-label"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.filter.groupTitle" /></label>
<f:form.textfield
id="tx_Beugroups_title"
class="form-control"
property="title"
/>
</div>
<div class="form-group align-self-end">
<f:form.button type="submit" name="operation" value="filter" class="btn btn-default">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filter" />
</f:form.button>
<f:form.button type="submit" name="operation" value="reset-filters" class="btn btn-link">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:reset" />
</f:form.button>
</div>
</div>
</f:form>
</html>
@@ -0,0 +1,162 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="table-fit">
<table id="typo3-backend-user-group-list" class="table table-striped table-hover">
<thead>
<tr>
<th colspan="2"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.table.column.groupTitle" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.table.column.subgroup" /></th>
<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>
<f:for each="{paginator.paginatedItems}" as="backendUserGroup">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_groups"
data-contextmenu-uid="{backendUserGroup.uid}"
title="{f:if(condition: '{backendUserGroup.description}', then: '{backendUserGroup.description} (id={backendUserGroup.uid})', else: 'id={backendUserGroup.uid}')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<beuser:spriteIconForRecord table="be_groups" object="{backendUserGroup}" />
</button>
</td>
<td class="col-50">
<backend:link.editRecord table="be_groups" uid="{backendUserGroup.uid}" title="{f:translate(key:'btn.edit')}">
{backendUserGroup.title}
</backend:link.editRecord>
</td>
<td class="col-50 nowrap-disabled">
<f:for each="{backendUserGroup.subgroups}" as="subgroup" iteration="subGroupIterator">
<backend:link.editRecord table="be_groups" uid="{subgroup.uid}" title="{f:translate(key:'btn.edit')}">{subgroup.title}</backend:link.editRecord><f:if condition="!{subGroupIterator.isLast}">,</f:if>
</f:for>
</td>
<td class="col-control">
<div class="btn-group" role="group">
<backend:link.editRecord
class="btn btn-default"
table="be_groups"
uid="{backendUserGroup.uid}"
title="{f:translate(key:'btn.edit')}"
>
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:if condition="{backendUserGroup.hidden}">
<f:then>
<a
class="btn btn-default"
href="{backend:moduleLink(route:'tce_db', query:'data[be_groups][{backendUserGroup.uid}][hidden]=0', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.enable')}"
role="button"
>
<core:icon identifier="actions-edit-unhide" />
</a>
</f:then>
<f:else>
<a
class="btn btn-default"
href="{backend:moduleLink(route:'tce_db', query:'data[be_groups][{backendUserGroup.uid}][hidden]=1', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.disable')}"
role="button"
>
<core:icon identifier="actions-edit-hide" />
</a>
</f:else>
</f:if>
<form action="{backend:moduleLink(route:'tce_db', currentUrlParameterName:'redirect')}" name="be_user_group_remove_{backendUserGroup.uid}" id="be_user_group_remove_{backendUserGroup.uid}" method="post">
<input name="cmd[be_groups][{backendUserGroup.uid}][delete]=1" type="hidden" value="{group.uid}">
</form>
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
data-target-form="be_user_group_remove_{backendUserGroup.uid}"
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:'backendUserGroup.confirmDelete',arguments:'{0:backendUserGroup.title}')}"
data-button-close-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-button-ok-text="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_record.yes')}"
title="{f:translate(key:'btn.delete')}"
>
<core:icon identifier="actions-edit-delete"/>
</button>
</div>
<div class="btn-group" role="group">
<f:link.action
action="showGroup"
arguments="{uid: backendUserGroup.uid}"
class="btn btn-default"
title="{f:translate(key: 'btn.details')}"
role="button"
>
<core:icon identifier="actions-system-options-view" size="small"/>
</f:link.action>
<a
class="btn btn-default"
href="#"
title="{f:translate(key:'btn.info')}"
data-dispatch-action="TYPO3.InfoWindow.showItem"
data-dispatch-args-list="be_groups,{backendUserGroup.uid}"
role="button"
>
<core:icon identifier="actions-document-info" />
</a>
</div>
<div class="btn-group" role="group">
<f:if condition="{compareGroupUidList.{backendUserGroup.uid}}">
<f:then>
<f:form.button
form="form-remove-group-from-compare-list"
name="uid"
value="{backendUserGroup.uid}"
type="submit"
class="btn btn-default"
title="{f:translate(key: 'btn.removeFromCompareList')}"
>
<core:icon identifier="actions-minus" size="small"/>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.compare" />
</f:form.button>
</f:then>
<f:else>
<f:form.button
form="form-add-group-to-compare-list"
name="uid"
value="{backendUserGroup.uid}"
type="submit"
class="btn btn-default"
title="{f:translate(key: 'btn.addToCompareList')}"
>
<core:icon identifier="actions-plus" size="small"/> <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.compare" />
</f:form.button>
</f:else>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
<tfoot>
<tr>
<td colspan="4">
<f:if condition="{totalAmountOfBackendUserGroups} > 1">
<f:then>{totalAmountOfBackendUserGroups} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:groups" /></f:then>
<f:else>{totalAmountOfBackendUserGroups} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:group" /></f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:render partial="SimplePagination" arguments="{paginator:paginator, pagination:pagination, actionName:'groups'}" />
</html>
@@ -0,0 +1,489 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:section name="languages">
<f:if condition="{languages}">
<div class="table-fit">
<table class="table">
<f:for each="{languages}" key="languageId" as="language">
<tr>
<f:if condition="{languageId} == 0">
<f:then>
<td class="col-icon"></td>
<td class="col-title">
{language.title} (<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:information.defaultLanguage" />)<f:if condition="{showUid}"> <code>[{languageId}]</code></f:if>
</td>
</f:then>
<f:else>
<td class="col-icon">
<span title="id={languageId}"><core:icon identifier="{language.flagIconIdentifier}" /></span>
</td>
<td class="col-title">{language.title}<f:if condition="{showUid}"> <code>[{languageId}]</code></f:if></td>
</f:else>
</f:if>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
<f:section name="groups">
<f:if condition="{groups.all}">
<div class="table-fit">
<table class="table table-bordered">
<thead>
<tr>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:information.groups.table.column.groupTitle" /></th>
<th{f:if(condition: '{hasColumnClasses}', then: ' class="col-min"')}><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.direct.direct" /></th>
<th{f:if(condition: '{hasColumnClasses}', then: ' class="col-min"')}><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.direct.inherit" /></th>
</tr>
</thead>
<tbody>
<f:for each="{groups.all}" as="group">
<tr>
<td class="col-title col-responsive">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_groups"
data-contextmenu-uid="{group.row.uid}"
title="id={group.row.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="be_groups" row="{group.row}"/>
</button>
<backend:link.editRecord
table="be_groups"
uid="{group.row.uid}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
{group.row.title}<f:if condition="{showUid}"> <code>[{group.row.uid}]</code></f:if>
</backend:link.editRecord>
</td>
<td{f:if(condition: '{hasColumnClasses}', then: ' class="col-min"')}>
<f:if condition="{group.direct}"><span class="text-success"><core:icon identifier="actions-check" size="small" /></span></f:if>
</td>
<td{f:if(condition: '{hasColumnClasses}', then: ' class="col-min"')}>
<f:if condition="{group.diff}"><span class="text-success"><core:icon identifier="actions-check" size="small" /></span></f:if>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
</f:section>
<f:section name="dbMounts">
<f:if condition="{dbMounts}">
<div class="table-fit">
<table class="table">
<f:for each="{dbMounts}" as="item">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{item.uid}"
title="id={item.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="pages" row="{item}"/>
</button>
</td>
<td class="col-title">
<backend:link.editRecord
table="pages"
uid="{item.uid}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
{item.title}<f:if condition="{showUid}"> <code>[{item.uid}]</code></f:if>
</backend:link.editRecord>
</td>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
<f:section name="fileMounts">
<f:if condition="{fileMounts}">
<div class="table-fit">
<table class="table">
<f:for each="{fileMounts}" as="item">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="sys_filemounts"
data-contextmenu-uid="{item.uid}"
title="id={item.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="sys_filemounts" row="{item}"/>
</button>
</td>
<td class="col-title">
<backend:link.editRecord
table="sys_filemounts"
uid="{item.uid}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
{item.title}<f:if condition="{showUid}"> <code>[{item.uid}]</code></f:if>
</backend:link.editRecord>
</td>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
<f:section name="fileFolderPermissions">
<f:if condition="{fileFolderPermissions}">
<div class="table-fit">
<table class="table">
<f:for each="{fileFolderPermissions}" as="item">
<tr>
<td class="col-icon"><core:icon identifier="{item.icon}" /></td>
<td class="col-title">
<f:if condition="{item.label}">
<f:then>{f:translate(key:item.label,default:item.label)}</f:then>
<f:else>{item.value}</f:else>
</f:if>
<f:if condition="{showUid}"> <code>[{item.value}]</code></f:if>
</td>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
<f:section name="categories">
<f:if condition="{categories}">
<div class="table-fit">
<table class="table">
<f:for each="{categories}" as="item">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="sys_category"
data-contextmenu-uid="{item.uid}"
title="id={item.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="sys_category" row="{item}"/>
</button>
</td>
<td class="col-title">
<backend:link.editRecord
table="sys_category"
uid="{item.uid}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
{item.title}<f:if condition="{showUid}"> <code>[{item.uid}]</code></f:if>
</backend:link.editRecord>
</td>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
<f:section name="workspaces">
<f:if condition="{workspaces}">
<f:if condition="{workspaces.record.uid}">
<div class="table-fit">
<table class="table">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="sys_workspace"
data-contextmenu-uid="{workspaces.record.uid}"
title="id={workspaces.record.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:icon identifier="mimetypes-x-sys_workspace" size="small" />
</button>
</td>
<td class="col-title">
<backend:link.editRecord
table="sys_workspace"
uid="{workspaces.record.uid}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>{workspaces.record.title}</backend:link.editRecord>
(<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:information.defaultWorkspace" />)<f:if condition="{showUid}"> <code>[{workspaces.record.uid}]</code></f:if>
</td>
</tr>
</table>
</div>
</f:if>
</f:if>
</f:section>
<f:section name="pageTypes">
<f:if condition="{pageTypes}">
<div class="table-fit">
<table class="table">
<f:for each="{pageTypes}" as="item">
<tr>
<td class="col-icon"><core:icon identifier="{item.icon}" /></td>
<td class="col-title">
<f:if condition="{item.label}">{f:translate(key:item.label,default:item.label)}</f:if><f:if condition="{showUid}"> <code>[{item.value}]</code></f:if>
</td>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
<f:section name="modules">
<f:if condition="{modules}">
<div class="table-fit">
<table class="table">
<f:if condition="{showHeadline}">
<thead>
<tr>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:modules" /></th>
</tr>
</thead>
</f:if>
<tbody>
<f:for each="{modules}" as="module">
<tr>
<td class="col-icon"><core:icon identifier="{module.iconIdentifier}" /></td>
<td class="col-title">{f:translate(key: module.title, default: module.title)}<f:if condition="{showUid}"> <code>[{module.identifier}]</code></f:if></td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
</f:section>
<f:section name="tables">
<f:if condition="{tables.all}">
<f:for each="{tables.all}" key="table" as="label">
<f:if condition="{tables.tables_select.{table}} && !{tables.tables_modify.{table}}">
<f:variable name="tableReadConfigured" value="1" />
</f:if>
<f:if condition="{tables.tables_modify.{table}}">
<f:variable name="tableReadWriteConfigured" value="1" />
</f:if>
</f:for>
<f:if condition="{tableReadConfigured}">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-read-table-{id}-collapse"
aria-controls="permission-group-read-table-{id}-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:tableModes.read" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-read-table-{id}-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table">
<f:for each="{tables.all}" key="table" as="label">
<f:if condition="{tables.tables_select.{table}} && !{tables.tables_modify.{table}}">
<tr>
<td class="col-icon">
<core:iconForRecord table="{table}" row="{id: '0'}" />
</td>
<td class="col-title">
<f:if condition="{label}">{f:translate(key:label, default:label)}</f:if><f:if condition="{showUid}"> <code>[{table}]</code></f:if>
</td>
</tr>
</f:if>
</f:for>
</table>
</div>
</div>
</div>
</f:if>
<f:if condition="{tableReadWriteConfigured}">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-read-write-table-{id}-collapse"
aria-controls="permission-group-read-write-table-{id}-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:tableModes.write" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-read-write-table-{id}-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table">
<f:for each="{tables.all}" key="table" as="label">
<f:if condition="{tables.tables_modify.{table}}">
<tr>
<td class="col-icon">
<core:iconForRecord table="{table}" row="{id: '0'}" />
</td>
<td class="col-title">
<f:if condition="{label}">{f:translate(key:label, default:label)}</f:if><f:if condition="{showUid}"> <code>[{table}]</code></f:if>
</td>
</tr>
</f:if>
</f:for>
</table>
</div>
</div>
</div>
</f:if>
</f:if>
</f:section>
<f:section name="nonExcludeFields">
<f:if condition="{nonExcludeFields}">
<f:for each="{nonExcludeFields}" key="tableName" as="table">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-{tableName}-{id}-collapse"
aria-controls="permission-group-{tableName}-{id}-collapse"
aria-expanded="false"
>
<div class="panel-icon">
<core:iconForRecord table="{tableName}" row="{id: '0'}" />
</div>
<div class="panel-title">
<f:if condition="{table.label}">{f:translate(key:table.label,default:table.label)}</f:if><f:if condition="{showUid}"> <code>[{tableName}]</code></f:if>
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-{tableName}-{id}-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="panel-list">
<f:for each="{table.fields}" as="label" key="field">
<li><f:if condition="{label}">{f:translate(key:label,default:label)} </f:if><code>[{field}]</code></li>
</f:for>
</ul>
</div>
</div>
</div>
</f:for>
</f:if>
</f:section>
<f:section name="tsconfig">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-tsconfig-{id}-collapse"
aria-controls="permission-group-tsconfig-{id}-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:TSconfig" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-tsconfig-{id}-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<f:render section="userTsConfigTree" arguments="{treeArray: tsconfig}" />
</div>
</div>
</div>
</f:section>
<f:section name="userTsConfigTree">
<ul class="treelist">
<f:for each="{treeArray}" key="key" as="value">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">{key}</span>
<f:if condition="!{beuser:isArray(value: value)}">
<span class="treelist-operator">=</span>
<span class="treelist-value">{value}</span>
</f:if>
</span>
<f:if condition="{beuser:isArray(value: value)}">
<f:render section="userTsConfigTree" arguments="{treeArray: value}" />
</f:if>
</li>
</f:for>
</ul>
</f:section>
<f:section name="pageContentTypes">
<f:if condition="{pageContentTypes}">
<div class="table-fit">
<table class="table">
<f:for each="{pageContentTypes}" as="item">
<tr>
<td class="col-icon">
<core:icon identifier="{f:if(condition: item.icon, then: item.icon, else: 'empty-empty')}" />
</td>
<td class="col-title">
<f:if condition="{item.label}">
<f:then>
{f:translate(key: item.label)}
<f:if condition="{showUid}"><code title="{item.longType}">[{item.shortType}]</code></f:if>
</f:then>
<f:else>
{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:notAvailableAbbreviation')}
<f:if condition="{showUid}"><code>[{item.longType}]</code></f:if>
</f:else>
</f:if>
</td>
</tr>
</f:for>
</table>
</div>
</f:if>
</f:section>
</html>
@@ -0,0 +1,150 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<div class="table-fit">
<table id="typo3-filemount-list" class="table table-striped table-hover">
<colgroup>
<col class="col-icon">
<col style="width: 20%;">
</colgroup>
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col class="col-min">
<col class="col-control">
</colgroup>
<thead>
<tr>
<th colspan="2"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_filemounts.title" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.description" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_file_storage" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_filemounts.identifier" /></th>
<th><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_filemounts.read_only" /></th>
<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>
<f:for each="{paginator.paginatedItems}" as="fileMount">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="sys_filemounts"
data-contextmenu-uid="{fileMount.uid}"
title="{f:if(condition: '{fileMount.description}', then: '{fileMount.description} (id={fileMount.uid})', else: 'id={fileMount.uid}')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<beuser:spriteIconForRecord table="sys_filemounts" object="{fileMount}" />
</button>
</td>
<td>
<backend:link.editRecord table="sys_filemounts" uid="{fileMount.uid}" title="{f:translate(key:'btn.edit')}">
{fileMount.title}
</backend:link.editRecord>
</td>
<td>{fileMount.description}</td>
<td>
<a
href="{backend:moduleLink(route: 'media_management', query: 'id={fileMount.storage.uid}:/')}'"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.link.openInFilelist')}"
>
{fileMount.storage.name}
</a>
</td>
<td>
<a
href="{backend:moduleLink(route: 'media_management', query: 'id={fileMount.storage.uid}:{fileMount.path}')}'"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.link.openInFilelist')}"
>
{fileMount.storage.configuration.basePath}{fileMount.path}
</a>
</td>
<td>
<f:if condition="{fileMount.readOnly} == true">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:yes" />
</f:if>
</td>
<td class="col-control">
<div class="btn-group" role="group">
<backend:link.editRecord class="btn btn-default" table="sys_filemounts" uid="{fileMount.uid}" title="{f:translate(key:'btn.edit')}">
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:if condition="{fileMount.hidden} == true">
<f:then>
<a
class="btn btn-default"
href="{backend:moduleLink(route:'tce_db', query:'data[sys_filemounts][{fileMount.uid}][hidden]=0', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.enable')}"
role="button"
>
<core:icon identifier="actions-toggle-off" />
</a>
</f:then>
<f:else>
<a
class="btn btn-default"
href="{backend:moduleLink(route:'tce_db', query:'data[sys_filemounts][{fileMount.uid}][hidden]=1', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.disable')}"
role="button"
>
<core:icon identifier="actions-toggle-on" />
</a>
</f:else>
</f:if>
<a
class="btn btn-default t3js-modal-trigger"
href="{backend:moduleLink(route:'tce_db', query:'cmd[sys_filemounts][{fileMount.uid}][delete]=1', currentUrlParameterName:'redirect')}"
title="{f:translate(key:'btn.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:'filemount.confirm.deletion',arguments:'{0:fileMount.title}')}"
data-button-close-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
role="button"
>
<core:icon identifier="actions-delete" />
</a>
</div>
<div class="btn-group" role="group">
<a
class="btn btn-default"
href="#"
title="{f:translate(key:'btn.info')}"
data-dispatch-action="TYPO3.InfoWindow.showItem"
data-dispatch-args-list="sys_filemounts,{fileMount.uid}"
role="button"
>
<core:icon identifier="actions-info" />
</a>
</div>
</td>
</tr>
</f:for>
</tbody>
<tfoot>
<tr>
<td colspan="7">
<f:if condition="{totalAmountOfFilemounts} > 1" >
<f:then>
{totalAmountOfFilemounts} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.amount.multiple" />
</f:then>
<f:else>
{totalAmountOfFilemounts} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.amount.singular" />
</f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:render partial="SimplePagination" arguments="{paginator:paginator, pagination:pagination, actionName:'filemounts'}" />
</html>
@@ -0,0 +1,42 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<span id="g_{pageId}">
<button
type="button"
class="ug_selector changegroup btn btn-sm btn-link"
data-page="{pageId}"
data-group-id="{groupId}"
data-groupname="{groupname}"
title="{groupname}"
>
<f:if condition="{groupId} == 0">
<f:then>
<f:comment>
No group set -> [not set]
</f:comment>
[<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:notSet" />]
</f:then>
<f:else>
<f:if condition="{groupname}">
<f:then>
<f:comment>
A group name can be resolved
</f:comment>
{groupname}
</f:then>
<f:else>
<f:comment>
Group was deleted -> [deleted]
</f:comment>
[<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:deleted" />]
</f:else>
</f:if>
</f:else>
</f:if>
</button>
</span>
</html>
@@ -0,0 +1,42 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<span id="o_{pageId}">
<button
type="button"
class="ug_selector changeowner btn btn-sm btn-link"
data-page="{pageId}"
data-owner="{userId}"
data-username="{username}"
title="{username}"
>
<f:if condition="{userId} == 0">
<f:then>
<f:comment>
No owner set -> [not set]
</f:comment>
[<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:notSet" />]
</f:then>
<f:else>
<f:if condition="{username}">
<f:then>
<f:comment>
A user name can be resolved
</f:comment>
{username}
</f:then>
<f:else>
<f:comment>
User was deleted -> [deleted]
</f:comment>
[<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:deleted" />]
</f:else>
</f:if>
</f:else>
</f:if>
</button>
</span>
</html>
@@ -0,0 +1,99 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{paginator.numberOfPages} > 1">
<nav class="pagination-wrap">
<ul class="pagination">
<f:if condition="{pagination.previousPageNumber} && {pagination.previousPageNumber} >= {pagination.firstPageNumber}">
<f:then>
<li class="page-item">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: 1})}" title="{f:translate(key:'pagination.first')}" class="page-link">
<core:icon identifier="actions-view-paging-first" />
</a>
</li>
<li class="page-item">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.previousPageNumber})}" title="{f:translate(key:'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="pagination.records" /> {pagination.startRecordNumber} - {pagination.endRecordNumber}
</span>
</li>
<li class="page-item">
<span class="page-link">
<f:translate key="pagination.page" />
<form class="form-inline"
data-global-event="submit"
data-action-navigate="$form=~s/$value/"
data-navigate-value="{f:uri.action(action:actionName, arguments:'{currentPage: \'$[value]\'}')}"
data-value-selector="input[name='paginator-target-page']">
<input
min="{pagination.firstPageNumber}"
max="{pagination.lastPageNumber}"
data-number-of-pages="{paginator.numberOfPages}"
name="paginator-target-page"
class="form-control form-control-sm paginator-input"
size="5"
value="{paginator.currentPageNumber}"
type="number"
/>
</form>
/ {pagination.lastPageNumber}
</span>
</li>
<f:if condition="{pagination.nextPageNumber} && {pagination.nextPageNumber} <= {pagination.lastPageNumber}">
<f:then>
<li class="page-item">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.nextPageNumber})}" title="{f:translate(key:'pagination.next')}" class="page-link">
<core:icon identifier="actions-view-paging-next" />
</a>
</li>
<li class="page-item">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.lastPageNumber})}" title="{f:translate(key:'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:uri.action(action:actionName, arguments:{currentPage: paginator.currentPageNumber})}" title="{f:translate(key:'pagination.refresh')}" class="page-link">
<core:icon identifier="actions-refresh" />
</a>
</li>
</ul>
</nav>
</f:if>
</html>
@@ -0,0 +1,290 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:variable name="args" value="{0: 'system', 1: '0'}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.compare.title" /></h1>
<f:variable name="comparedUserAmount" value="{compareUserList -> f:count()}" />
<div class="table-fit">
<table class="table table-striped-columns table-bordered table-vertical-top beuser-comparison-table">
<colgroup>
<col style="width: 15%;">
<f:for each="{compareUserList}" as="tmpColumn">
<col style="width: calc(85% / {comparedUserAmount})">
</f:for>
</colgroup>
<thead>
<tr>
<td></td>
<f:for each="{compareUserList}" as="compareData">
<th scope="col">
<div class="beuser-comparison-element">
<div class="beuser-comparison-element__title">
<span title="id={compareData.user.uid}">
<core:iconForRecord table="be_users" row="{compareData.user}"/>
</span>
<span>{compareData.user.username}<f:if condition="{showUid}" > <code>[{compareData.user.uid}]</code></f:if></span>
</div>
<div class="beuser-comparison-element__action">
<backend:link.editRecord
table="be_users"
uid="{compareData.user.uid}"
class="btn btn-default btn-sm"
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:form.button
form="form-remove-from-compare-list"
name="uid"
value="{compareData.user.uid}"
type="submit"
class="btn btn-default btn-sm"
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.removeFromCompareList')}"
>
<core:icon identifier="actions-minus" size="small" />
</f:form.button>
</div>
</div>
</th>
</f:for>
</tr>
</thead>
<tbody>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:admin" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:if condition="{compareData.user.admin}">
<f:then>
<span class="text-success"><core:icon identifier="actions-check" size="small" /></span>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:yes" />
</f:then>
<f:else>
<span class="text-danger"><core:icon identifier="actions-close" size="small" /></span>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:no" />
</f:else>
</f:if>
<f:if condition="{showUid}"> <code>[{compareData.user.admin}]</code></f:if>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:name" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>{compareData.user.realName}</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:email" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
{compareData.user.email}
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:avatar" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<backend:avatar backendUser="{compareData.user.uid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:disable" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:if condition="{compareData.user.disable}">
<f:then>
<span class="text-danger"><core:icon identifier="actions-close" size="small" /></span>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:no" />
</f:then>
<f:else>
<span class="text-success"><core:icon identifier="actions-check" size="small" /></span>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:yes" />
</f:else>
</f:if>
<f:if condition="{showUid}"> <code>[{compareData.user.disable}]</code></f:if>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:startDateAndTime" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:if condition="{compareData.user.starttime}">
<f:format.date format="{dateFormat} {timeFormat}">{compareData.user.starttime}</f:format.date>
</f:if>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:endDateAndTime" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:if condition="{compareData.user.endtime}">
<f:format.date format="{dateFormat} {timeFormat}">{compareData.user.endtime}</f:format.date>
</f:if>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:lastLogin" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:if condition="{compareData.user.lastlogin}">
<f:then>
<f:format.date format="{dateFormat} {timeFormat}">{compareData.user.lastlogin}</f:format.date>
</f:then>
<f:else>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:never" />
</f:else>
</f:if>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.description" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
{compareData.user.description -> f:format.nl2br()}
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.subgroup" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="groups" arguments="{groups: compareData.groups, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedLanguages" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="languages" arguments="{languages: compareData.languages, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.pagetypes_select" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="pageTypes" arguments="{pageTypes: compareData.pageTypes, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedPageContentTypes" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:if condition="{compareData.pageContentTypes}">
<f:render partial="Compare/Information" section="pageContentTypes" arguments="{pageContentTypes: compareData.pageContentTypes, showUid: showUid}" />
</f:if>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.non_exclude_fields" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render
partial="Compare/Information"
section="nonExcludeFields"
arguments="{
nonExcludeFields: compareData.non_exclude_fields,
id: compareData.user.uid,
showUid: showUid
}"
/>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:workspace_perms" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="workspaces" arguments="{workspaces: compareData.workspaces, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:pageTreeEntryPoints" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="dbMounts" arguments="{dbMounts: compareData.dbMounts, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:fileMounts" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="fileMounts" arguments="{fileMounts: compareData.fileMounts, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.fileoper_perms" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="fileFolderPermissions" arguments="{fileFolderPermissions: compareData.fileFolderPermissions, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:category_perms" /></th>
<f:for each="{compareUserList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="categories" arguments="{categories: compareData.categories, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:options" /></th>
<f:for each="{compareUserList}" as="compareData">
<td class="col-word-break">
<f:if condition="{compareData.tsconfig}">
<f:render
partial="Compare/Information"
section="tsconfig"
arguments="{
tsconfig: compareData.tsconfig,
id:compareData.user.uid,
showUid: showUid
}"
/>
</f:if>
</td>
</f:for>
</tr>
</tbody>
</table>
</div>
<f:form action="removeFromCompareList" method="post" id="form-remove-from-compare-list" class="hidden">
<f:form.hidden name="redirectToCompare" value="1"/>
</f:form>
</f:section>
</html>
@@ -0,0 +1,116 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.title" /></h1>
<f:if condition="{compareUserList}">
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.section.compare" /></h2>
<div class="table-fit">
<table id="typo3-backend-user-list-compare" class="table table-striped table-hover">
<thead>
<th colspan="3"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:userName" /> / <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:realName" /></th>
<th class="col-control"><span class="visually-hidden"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels._CONTROL_" /></span></th>
</thead>
<tbody>
<f:for each="{compareUserList}" as="compareUser">
<tr>
<td class="col-indicator">
<f:if condition="{onlineBackendUsers.{compareUser.uid}}">
<typo3-backend-status-indicator state="success" live label="{f:translate(key:'backendUser.list.label.online', domain:'beuser.messages')}"></typo3-backend-status-indicator>
</f:if>
</td>
<td class="col-avatar">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_users"
data-contextmenu-uid="{compareUser.uid}"
title="{f:if(condition: '{compareUser.description}', then: '{compareUser.description} (id={compareUser.uid})', else: 'id={compareUser.uid}')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<backend:avatar backendUser="{compareUser.uid}" showIcon="true" />
</button>
</td>
<td class="col-title">
<backend:link.editRecord
table="be_users"
uid="{compareUser.uid}"
title="{f:translate(key:'btn.edit')}"
>
<f:if condition="{compareUser.realName}">
<f:then>
{compareUser.realName}
<br>
<span class="text-variant">({compareUser.username})</span>
</f:then>
<f:else>
{compareUser.username}
</f:else>
</f:if>
</backend:link.editRecord>
</td>
<td class="col-control">
<backend:link.editRecord
class="btn btn-default"
table="be_users"
uid="{compareUser.uid}"
title="{f:translate(key:'btn.edit')}"
role="button"
>
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:form.button
form="form-remove-from-compare-list"
name="uid"
value="{compareUser.uid}"
type="submit"
class="btn btn-default"
title="{f:translate(key: 'btn.removeFromCompareList')}"
>
<core:icon identifier="actions-minus" />
</f:form.button>
</td>
</tr>
</f:for>
</tbody>
<tfoot>
<tr>
<td colspan="4">
<f:if condition="{compareUserList -> f:count()} > 1">
<f:then>{compareUserList -> f:count()} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:users" /></f:then>
<f:else>{compareUserList -> f:count()} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:user" /></f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:link.action action="compare" class="btn btn-default t3js-acceptance-compare">
<core:icon identifier="actions-code-compare" />
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.btn.compareList" />
</f:link.action>
<f:form.button type="submit" class="btn btn-default" form="form-remove-all-from-compare-list">
<core:icon identifier="actions-selection-delete" />
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.clearCompareList" />
</f:form.button>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.list.section.allUsers" /></h2>
</f:if>
<f:render partial="BackendUser/Filter" arguments="{demand: demand, backendUserGroups: backendUserGroups}" />
<f:render partial="BackendUser/PaginatedList" arguments="{_all}" />
<f:form action="initiatePasswordReset" method="post" id="form-initiate-password-reset" class="hidden"/>
<f:form action="removeFromCompareList" method="post" id="form-remove-from-compare-list" class="hidden"/>
<f:form action="addToCompareList" method="post" id="form-add-to-compare-list" class="hidden"/>
<f:form action="removeAllFromCompareList" method="post" id="form-remove-all-from-compare-list" class="hidden"/>
</f:section>
</html>
@@ -0,0 +1,119 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.online.title" /></h1>
<div class="table-fit">
<table class="table beuser-online-table">
<thead>
<tr>
<th colspan="2"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:userName" /> / <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:realName" /></th>
<th class="col-50"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.online.table.column.ipAddress" /></th>
<th class="col-datetime"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.online.table.column.lastAccess" /></th>
<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>
<f:for each="{onlineUsersAndSessions}" as="onlineUser">
<tbody>
<f:for each="{onlineUser.sessions}" as="session" iteration="backendUserIterator">
<f:variable name="sessionAmount" value="{onlineUser.sessions -> f:count()}" />
<tr{f:if(condition: '({sessionAmount} > 1) && !{backendUserIterator.isFirst}', then: ' class="beuser-online-table_row"')}>
<f:if condition="{backendUserIterator.isFirst}">
<f:then>
<td {f:if(condition: '{sessionAmount} > 1', then: 'rowspan="{sessionAmount}" class="col-avatar align-top"', else: 'class="col-avatar"')}>
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_users"
data-contextmenu-uid="{onlineUser.backendUser.uid}"
title="{f:if(condition: '{onlineUser.backendUser.description}', then: '{onlineUser.backendUser.description} (id={onlineUser.backendUser.uid})', else: 'id={onlineUser.backendUser.uid}')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<backend:avatar backendUser="{onlineUser.backendUser.uid}" showIcon="true" />
</button>
</td>
<td {f:if(condition: '{sessionAmount} > 1', then: 'rowspan="{sessionAmount}" class="col-min align-top border-end"', else: 'class="col-min"')}>
<backend:link.editRecord table="be_users" uid="{onlineUser.backendUser.uid}" title="{f:translate(key:'btn.edit')}">
<f:if condition="{onlineUser.backendUser.realName}">
<f:then>
{onlineUser.backendUser.realName}
<beuser:mfaStatus userUid="{onlineUser.backendUser.uid}"/><br>
<span class="text-variant">({onlineUser.backendUser.userName})</span>
</f:then>
<f:else>
{onlineUser.backendUser.userName}
<beuser:mfaStatus userUid="{onlineUser.backendUser.uid}"/>
</f:else>
</f:if>
</backend:link.editRecord>
</td>
</f:then>
</f:if>
<td class="col-50">{session.ip}</td>
<td class="col-datetime">
<f:format.date format="{dateFormat} {timeFormat}" date="{session.timestamp}" />
<f:if condition="{currentSessionId} == {session.id}">
<span class="badge badge-notice"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.online.activeSession" /></span>
</f:if>
</td>
<td class="col-control">
<f:if condition="{currentSessionId} == {session.id}">
<f:else>
<f:form.button
name="sessionId"
value="{session.id}"
form="form-terminate-backend-user-session"
class="btn btn-default t3js-modal-trigger"
title="{f:translate(key: 'resetPassword.label')}"
type="submit"
data-severity="warning"
data-title="{f:translate(key: 'backendUser.online.endSession')}"
data-content="{f:translate(key: 'backendUser.online.reallyLogout')} {onlineUser.backendUser.userName}?"
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
>
<core:icon identifier="actions-close" />
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.online.endSession" />
</f:form.button>
</f:else>
</f:if>
<a
class="btn btn-default"
href="#"
data-dispatch-action="TYPO3.InfoWindow.showItem"
data-dispatch-args-list="be_users,{onlineUser.backendUser.uid}"
role="button"
>
<core:icon identifier="actions-document-info" />
</a>
</td>
</tr>
</f:for>
</tbody>
</f:for>
<tfoot>
<tr>
<td colspan="5">
<f:variable name="onlineUsersAndSessionsCount">{onlineUsersAndSessions -> f:count()}</f:variable>
<f:if condition="{onlineUsersAndSessionsCount} > 1">
<f:then>{onlineUsersAndSessionsCount} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:users" /></f:then>
<f:else>{onlineUsersAndSessionsCount} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:user" /></f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:form id="form-terminate-backend-user-session" action="terminateBackendUserSession" controller="BackendUser" method="post"class="hidden" />
</f:section>
</html>
@@ -0,0 +1,578 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module"/>
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:variable name="args" value="{0: 'system', 1: data.user.uid}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1>
<f:translate
key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.title"
arguments="{
0: '{data.user.username}'
}"
/>
</h1>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.infobox.title')}"
message="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.infobox.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
<div class="table-fit">
<table class="table table-striped table-hover table-vertical-top">
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:admin" /></th>
<td class="col-word-break">
<f:if condition="{data.user.admin}">
<f:then>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:yes" />
</f:then>
<f:else>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:no" />
</f:else>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:userName" /></th>
<td class="col-word-break">
{data.user.username}
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:name" /></th>
<td class="col-word-break">
{data.user.realName}
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:email" /></th>
<td class="col-word-break">
<f:if condition="{data.user.email}">
<f:link.email email="{data.user.email}"/>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:avatar" /></th>
<td class="col-word-break">
<backend:avatar backendUser="{data.user.uid}" />
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:disable" /></th>
<td class="col-word-break">
<f:if condition="{data.user.disable}">
<f:then>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:no" />
</f:then>
<f:else>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:yes" />
</f:else>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:startDateAndTime" /></th>
<td class="col-word-break">
<f:if condition="{data.user.starttime}">
<f:format.date format="{dateFormat} {timeFormat}">{data.user.starttime}</f:format.date>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:endDateAndTime" /></th>
<td class="col-word-break">
<f:if condition="{data.user.endtime}">
<f:format.date format="{dateFormat} {timeFormat}">{data.user.endtime}</f:format.date>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:lastLogin" /></th>
<td class="col-word-break">
<f:if condition="{data.user.lastlogin}">
<f:then>
<f:format.date format="{dateFormat} {timeFormat}">{data.user.lastlogin}</f:format.date>
</f:then>
<f:else>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:never" />
</f:else>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.description" /></th>
<td class="col-word-break">
{data.user.description -> f:format.nl2br()}
</td>
</tr>
</table>
</div>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:groups" /></h2>
<f:if condition="{data.groups.all}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-groups-collapse"
aria-controls="permission-group-groups-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.subgroup" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-groups-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render
partial="Compare/Information"
section="groups"
arguments="{
groups: data.groups,
hasColumnClasses: 1
}"
/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.subgroup" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:languages" /></h2>
<f:if condition="{data.languages}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-languages-collapse"
aria-controls="permission-group-languages-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedLanguages" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-languages-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="languages" arguments="{languages: data.languages}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedLanguages" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:permissions" /></h2>
<h3><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:generalPermissions" /></h3>
<f:if condition="{data.modules}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-modules-collapse"
aria-controls="permission-group-modules-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:userMods" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-modules-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="modules" arguments="{modules: data.modules}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:userMods" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.pageTypes}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-pageType-collapse"
aria-controls="permission-group-pageType-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.pagetypes_select" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-pageType-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="pageTypes" arguments="{pageTypes: data.pageTypes}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.pagetypes_select" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.pageContentTypes}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-pageContentTypes-collapse"
aria-controls="permission-group-pageContentTypes-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedPageContentTypes" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-pageContentTypes-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="pageContentTypes" arguments="{pageContentTypes: data.pageContentTypes}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedPageContentTypes" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.tables.all}">
<f:then>
<h3 class="headline-spaced"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.tables" /></h3>
<f:render partial="Compare/Information" section="tables" arguments="{tables: data.tables}" />
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.tables" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.non_exclude_fields}">
<f:then>
<h3 class="headline-spaced"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.non_exclude_fields" /></h3>
<f:render
partial="Compare/Information"
section="nonExcludeFields"
arguments="{
nonExcludeFields: data.non_exclude_fields,
id: data.user.uid
}"
/>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.non_exclude_fields" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:mountsWorkspaces" /></h2>
<f:if condition="{data.workspaces} && {data.workspaces.record.uid}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-workspaces-collapse"
aria-controls="permission-group-workspaces-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:workspace_perms" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-workspaces-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="workspaces" arguments="{workspaces: data.workspaces}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:workspace_perms" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.dbMounts}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-dbMounts-collapse"
aria-controls="permission-group-dbMounts-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:pageTreeEntryPoints" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-dbMounts-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="dbMounts" arguments="{dbMounts: data.dbMounts}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:pageTreeEntryPoints" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.fileMounts}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-fileMounts-collapse"
aria-controls="permission-group-fileMounts-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:fileMounts" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-fileMounts-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="fileMounts" arguments="{fileMounts: data.fileMounts}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:fileMounts" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.fileFolderPermissions}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-fileFolderPermissions-collapse"
aria-controls="permission-group-fileFolderPermissions-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.fileoper_perms" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-fileFolderPermissions-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="fileFolderPermissions" arguments="{fileFolderPermissions: data.fileFolderPermissions}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.fileoper_perms" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.categories}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-categories-collapse"
aria-controls="permission-group-categories-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:category_perms" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-categories-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="categories" arguments="{categories: data.categories}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:category_perms" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:options" /></h2>
<f:if condition="{data.tsconfig}">
<f:then>
<f:render
partial="Compare/Information"
section="tsconfig"
arguments="{
tsconfig: data.tsconfig,
id: data.user.uid
}"
/>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:TSconfig" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,217 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:variable name="args" value="{0: 'system', 1: '0'}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.compare.title" /></h1>
<f:variable name="comparedUserGroupAmount" value="{compareGroupList -> f:count()}" />
<div class="table-fit">
<table class="table table-striped-columns table-bordered table-vertical-top beuser-comparison-table">
<colgroup>
<col style="width: 15%;">
<f:for each="{compareGroupList}" as="tmpColumn">
<col style="width: calc(85% / {comparedUserGroupAmount})">
</f:for>
</colgroup>
<thead>
<tr>
<td></td>
<f:for each="{compareGroupList}" as="compareData">
<th scope="col">
<div class="beuser-comparison-element">
<div class="beuser-comparison-element__title">
<span title="id={compareData.group.uid}">
<core:iconForRecord table="be_groups" row="{compareData.group}"/>
</span>
<span>{compareData.group.title}<f:if condition="{showUid}"> <code>[{compareData.group.uid}]</code></f:if></span>
</div>
<div class="beuser-comparison-element__action">
<backend:link.editRecord
table="be_groups"
uid="{compareData.group.uid}"
class="btn btn-default btn-sm"
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:form.button
form="form-remove-group-from-compare-list"
name="uid"
value="{compareData.group.uid}"
type="submit"
class="btn btn-default btn-sm"
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.removeFromCompareList')}"
>
<core:icon identifier="actions-minus" size="small" />
</f:form.button>
</div>
</div>
</th>
</f:for>
</tr>
</thead>
<tbody>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.description" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
{compareData.group.description -> f:format.nl2br()}
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.subgroup" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="groups" arguments="{groups: compareData.groups, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedLanguages" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="languages" arguments="{languages: compareData.languages, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:userMods" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="modules" arguments="{modules: compareData.modules, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.pagetypes_select" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="pageTypes" arguments="{pageTypes: compareData.pageTypes, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.tables" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render
partial="Compare/Information"
section="tables"
arguments="{
tables: compareData.tables,
id:compareData.group.uid,
showUid: showUid
}"
/>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedPageContentTypes" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="pageContentTypes" arguments="{pageContentTypes: compareData.pageContentTypes, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.non_exclude_fields" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render
partial="Compare/Information"
section="nonExcludeFields"
arguments="{
nonExcludeFields: compareData.non_exclude_fields,
id: compareData.group.uid,
showUid: showUid
}"
/>
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:workspace_perms" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="workspaces" arguments="{workspaces: compareData.workspaces}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:pageTreeEntryPoints" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="dbMounts" arguments="{dbMounts: compareData.dbMounts, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:fileMounts" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="fileMounts" arguments="{fileMounts: compareData.fileMounts, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.fileoper_perms" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="fileFolderPermissions" arguments="{fileFolderPermissions: compareData.fileFolderPermissions, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:category_perms" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td>
<f:render partial="Compare/Information" section="categories" arguments="{categories: compareData.categories, showUid: showUid}" />
</td>
</f:for>
</tr>
<tr>
<th scope="row"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:options" /></th>
<f:for each="{compareGroupList}" as="compareData">
<td class="col-word-break">
<f:if condition="{compareData.tsconfig}">
<f:render
partial="Compare/Information"
section="tsconfig"
arguments="{
tsconfig: compareData.tsconfig,
id:compareData.group.uid
}"
/>
</f:if>
</td>
</f:for>
</tr>
</tbody>
</table>
</div>
<f:form action="removeGroupFromCompareList" method="post" id="form-remove-group-from-compare-list" class="hidden">
<f:form.hidden name="redirectToCompare" value="1"/>
</f:form>
</f:section>
</html>
@@ -0,0 +1,114 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.title" /></h1>
<f:if condition="{totalAmountOfBackendUserGroups} > 0">
<f:then>
<f:if condition="{compareGroupList}">
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.section.compare" /></h2>
<div class="table-fit">
<table id="typo3-backend-user-list-compare" class="table table-striped table-hover">
<thead>
<tr>
<th colspan="2"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.table.column.groupTitle" /></th>
<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>
<f:for each="{compareGroupList}" as="compareGroup">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_groups"
data-contextmenu-uid="{compareGroup.uid}"
title="{f:if(condition: '{compareGroup.description}', then: '{compareGroup.description} (id={compareGroup.uid})', else: 'id={compareGroup.uid}')}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="be_groups" row="{compareGroup}"/>
</button>
</td>
<td class="col-title">
<backend:link.editRecord
table="be_groups"
uid="{compareGroup.uid}"
title="{f:translate(key:'btn.edit')}"
>
{compareGroup.title}
</backend:link.editRecord>
</td>
<td class="col-control">
<backend:link.editRecord
class="btn btn-default"
table="be_groups"
uid="{compareGroup.uid}"
title="{f:translate(key:'btn.edit')}"
>
<core:icon identifier="actions-open" />
</backend:link.editRecord>
<f:form.button
form="form-remove-group-from-compare-list"
name="uid"
value="{compareGroup.uid}"
type="submit"
class="btn btn-default"
title="{f:translate(key: 'btn.removeFromCompareList')}"
>
<core:icon identifier="actions-minus" />
</f:form.button>
</td>
</tr>
</f:for>
</tbody>
<tfoot>
<tr>
<td colspan="3">
<f:if condition="{compareGroupList -> f:count()} > 1">
<f:then>{compareGroupList -> f:count()} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:groups" /></f:then>
<f:else>{compareGroupList -> f:count()} <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:group" /></f:else>
</f:if>
</td>
</tr>
</tfoot>
</table>
</div>
<f:link.action action="compareGroups" class="btn btn-default t3js-acceptance-compare">
<core:icon identifier="actions-code-compare" />
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.btn.compareList" />
</f:link.action>
<f:form.button type="submit" class="btn btn-default" form="form-remove-all-groups-from-compare-list">
<core:icon identifier="actions-selection-delete" />
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.clearCompareList" />
</f:form.button>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.list.section.allUserGroups" /></h2>
</f:if>
</f:then>
<f:else>
<f:be.infobox state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}" title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.noGroupsFound.title')}">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.noGroupsFound.message"/></p>
<backend:link.newRecord returnUrl="{returnUrl}" class="btn btn-primary" table="be_groups">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.backendUserGroup.create"/>
</backend:link.newRecord>
</f:be.infobox>
</f:else>
</f:if>
<f:render partial="BackendUserGroup/Filter" arguments="{userGroupDto: userGroupDto, backendUserGroups: backendUserGroups}" />
<f:render partial="BackendUserGroup/PaginatedList" arguments="{_all}" />
<f:form action="removeGroupFromCompareList" method="post" id="form-remove-group-from-compare-list" class="hidden"/>
<f:form action="addGroupToCompareList" method="post" id="form-add-group-to-compare-list" class="hidden"/>
<f:form action="removeAllGroupsFromCompareList" method="post" id="form-remove-all-groups-from-compare-list" class="hidden"/>
</f:section>
</html>
@@ -0,0 +1,545 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module"/>
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:variable name="args" value="{0: 'system', 1: '0'}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<h1>
<f:translate
key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.show.title"
arguments="{
0: '{data.group.title}'
}"
/>
</h1>
<f:be.infobox
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.show.infobox.title')}"
message="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUserGroup.show.infobox.message')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
/>
<div class="table-fit">
<table class="table table-striped table-hover table-vertical-top">
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.title" /></th>
<td class="col-word-break">
{data.group.title}
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:disable" /></th>
<td class="col-word-break">
<f:if condition="{data.group.hidden}">
<f:then>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:no" />
</f:then>
<f:else>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:yes" />
</f:else>
</f:if>
</td>
</tr>
<tr>
<th class="col-fieldname"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.description" /></th>
<td class="col-word-break">
{data.group.description -> f:format.nl2br()}
</td>
</tr>
</table>
</div>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:inheritance" /></h2>
<f:if condition="{data.groups.diff}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-groups-collapse"
aria-controls="permission-group-groups-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.subgroup" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-groups-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table table-bordered">
<thead>
<tr>
<th>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:information.groups.table.column.groupTitle" />
</th>
</tr>
</thead>
<tbody>
<f:for each="{data.groups.all}" as="group">
<f:if condition="{group.diff}">
<tr>
<td class="col-title col-responsive">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="be_groups"
data-contextmenu-uid="{group.row.uid}"
title="id={group.row.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="be_groups" row="{group.row}"/>
</button>
<backend:link.editRecord
table="be_groups"
uid="{group.row.uid}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:btn.edit')}"
>
{group.row.title}<f:if condition="{showUid}"> <code>[{group.row.uid}]</code></f:if>
</backend:link.editRecord>
</td>
</tr>
</f:if>
</f:for>
</tbody>
</table>
</div>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.subgroup" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:languages" /></h2>
<f:if condition="{data.languages}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-languages-collapse"
aria-controls="permission-group-languages-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedLanguages" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-languages-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="languages" arguments="{languages: data.languages}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedLanguages" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:permissions" /></h2>
<h3><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:generalPermissions" /></h3>
<f:if condition="{data.modules}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-modules-collapse"
aria-controls="permission-group-modules-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:userMods" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-modules-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="modules" arguments="{modules: data.modules}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:userMods" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.pageTypes}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-pageType-collapse"
aria-controls="permission-group-pageType-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.pagetypes_select" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-pageType-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="pageTypes" arguments="{pageTypes: data.pageTypes}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.pagetypes_select" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.pageContentTypes}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-pageContentTypes-collapse"
aria-controls="permission-group-pageContentTypes-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedPageContentTypes" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-pageContentTypes-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="pageContentTypes" arguments="{pageContentTypes: data.pageContentTypes}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:allowedPageContentTypes" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.tables.all}">
<f:then>
<h3 class="headline-spaced"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.tables" /></h3>
<f:render partial="Compare/Information" section="tables" arguments="{tables: data.tables}" />
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:compare.tables" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.non_exclude_fields}">
<f:then>
<h3 class="headline-spaced"><f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.non_exclude_fields" /></h3>
<f:render
partial="Compare/Information"
section="nonExcludeFields"
arguments="{
nonExcludeFields: data.non_exclude_fields,
id: data.user.uid
}"
/>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.non_exclude_fields" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:mountsWorkspaces" /></h2>
<f:if condition="{data.workspaces} && {data.workspaces.record.uid}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-workspaces-collapse"
aria-controls="permission-group-workspaces-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:workspace_perms" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-workspaces-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="workspaces" arguments="{workspaces: data.workspaces}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:workspace_perms" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.dbMounts}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-dbMounts-collapse"
aria-controls="permission-group-dbMounts-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:pageTreeEntryPoints" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-dbMounts-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="dbMounts" arguments="{dbMounts: data.dbMounts}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:pageTreeEntryPoints" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.fileMounts}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-fileMounts-collapse"
aria-controls="permission-group-fileMounts-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:fileMounts" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-fileMounts-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="fileMounts" arguments="{fileMounts: data.fileMounts}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:fileMounts" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.fileFolderPermissions}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-fileFolderPermissions-collapse"
aria-controls="permission-group-fileFolderPermissions-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.fileoper_perms" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-fileFolderPermissions-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="fileFolderPermissions" arguments="{fileFolderPermissions: data.fileFolderPermissions}" />
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:be_groups.fileoper_perms" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<f:if condition="{data.categories}">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#permission-group-categories-collapse"
aria-controls="permission-group-categories-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:category_perms" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="permission-group-categories-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<f:render partial="Compare/Information" section="categories" arguments="{categories: data.categories}"/>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:category_perms" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
<h2><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:options" /></h2>
<f:if condition="{data.tsconfig}">
<f:then>
<f:render
partial="Compare/Information"
section="tsconfig"
arguments="{
tsconfig: data.tsconfig,
id: data.user.uid
}"
/>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:TSconfig" />
</div>
<div class="panel-body">
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:backendUser.show.notConfigured" /></p>
</div>
</div>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,37 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.list.title" /></h1>
<f:if condition="{totalAmountOfFilemounts} > 0">
<f:then>
<f:render partial="Filemount/PaginatedList" arguments="{_all}" />
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.infobox.noFilemountFound.title')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
<p><f:translate key="filemount.infobox.noFilemountFound.message" /></p>
<backend:link.newRecord
table="sys_filemounts"
returnUrl="{f:be.uri(route: 'backend_user_management')}"
class="btn btn-default"
role="button"
>
<core:icon identifier="actions-add" />
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang.xlf:filemount.create" />
</backend:link.newRecord>
</f:be.infobox>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,8 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:render partial="Permission/Groupname" arguments="{pageId: pageId, groupId: groupId, groupname: groupname}" />
</html>
@@ -0,0 +1,43 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<span id="{elementId}">
<div class="input-group">
<select class="form-select form-select-sm" name="new_page_group" id="new_page_group">
<f:if condition="{addCurrentGroup}">
<f:then><option value="{groupUid}" selected>{groupname}</option></f:then>
<f:else><option value="0"></option></f:else>
</f:if>
<f:for each="{groups}" key="uid" as="group">
<option value="{uid}" {f:if(condition: '{uid} == {groupUid}', then: 'selected')}>{group.title}</option>
</f:for>
</select>
<button
type="button"
class="savegroup btn btn-sm btn-default"
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:changeGroup')}"
data-page="{pageId}"
data-group-id="{groupUid}"
data-element-id="{elementId}"
>
<core:icon identifier="actions-document-save" size="small"/>
</button>
<button
type="button"
class="restoregroup btn btn-sm btn-default"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-page="{pageId}"
data-group-id="{groupUid}"
data-element-id="{elementId}"
data-if-not-set="[not set]"
{f:if(condition: groupname, then: 'data-groupname="{groupname}"')}
>
<core:icon identifier="actions-close" size="small"/>
</button>
</span>
</span>
</html>
@@ -0,0 +1,8 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:render partial="Permission/Ownername" arguments="{pageId: pageId, userId: userId, username: username}" />
</html>
@@ -0,0 +1,41 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<span id="{elementId}">
<div class="input-group">
<select class="form-select form-select-sm" name="new_page_owner" id="new_page_owner">
<f:if condition="{addCurrentUser}">
<f:then><option value="{ownerUid}" selected>{username}</option></f:then>
<f:else><option value="0"></option></f:else>
</f:if>
<f:for each="{users}" key="uid" as="user">
<option value="{uid}" {f:if(condition: '{uid} == {ownerUid}', then: 'selected')}>{user.username}</option>
</f:for>
</select>
<button type="button"
class="saveowner btn btn-sm btn-default"
title="{f:translate(key:'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:changeOwner')}"
data-page="{pageId}"
data-owner="{ownerUid}"
data-element-id="{elementId}"
>
<core:icon identifier="actions-document-save" size="small"/>
</button>
<button type="button"
class="restoreowner btn btn-sm btn-default"
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
data-page="{pageId}"
data-owner="{ownerUid}"
data-element-id="{elementId}"
data-if-not-set="[not set]"
{f:if(condition: username, then: 'data-username="{username}"')}
>
<core:icon identifier="actions-close" size="small"/>
</button>
</div>
</span>
</html>
@@ -0,0 +1,8 @@
<html
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<beuser:permissions permission="{permission}" scope="{scope}" pageId="{pageId}" />
</html>
@@ -0,0 +1,175 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<f:asset.module identifier="@typo3/beuser/permissions.js"/>
<h1>
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:permissions" />:
<f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Edit" />
</h1>
<f:comment><!-- {base} is defined as it's *required* for mathematical operations in Fluid --></f:comment>
<f:variable name="base" value="2" />
<form action="{formAction}" method="post" name="editform" id="PermissionControllerEdit">
<div class="form-row">
<div class="form-group">
<label class="form-label" for="selectOwner"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Owner" /></label>
<select class="form-select" name="data[pages][{id}][perms_userid]" id="selectOwner">
<f:for each="{beUserData}" key="userId" as="user">
<option value="{userId}" {f:if(condition: '{userId} == {currentBeUser}', then: 'selected')}>{user}</option>
</f:for>
</select>
</div>
<div class="form-group">
<label class="form-label" for="selectGroup"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Group" /></label>
<f:if condition="{f:count(subject:beGroupData)} > 1">
<f:then>
<select class="form-select" name="data[pages][{id}][perms_groupid]" id="selectGroup">
<f:for each="{beGroupData}" key="groupId" as="group">
<option value="{groupId}" {f:if(condition: '{groupId} == {currentBeGroup}', then: 'selected')}>{group}</option>
</f:for>
</select>
</f:then>
<f:else>
<div class="alert alert-notice"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:noGroups" /></div>
</f:else>
</f:if>
</div>
<div class="form-group">
<label class="form-label" for="recursionLevel"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Depth" /></label>
<select class="form-select" name="mirror[pages][{id}]" id="recursionLevel">
<f:for each="{recursiveSelectOptions}" key="depth" as="depthLabel">
<option value="{depth}" {f:if(condition: '{depth} == {currentBeUser}', then: 'selected')}>{depthLabel}</option>
</f:for>
</select>
</div>
</div>
<div class="table-fit">
<table class="table table-striped table-hover" id="typo3-permissionMatrix">
<thead>
<tr>
<th></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:1" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:16" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:2" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:4" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:8" /></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Owner" /></strong></td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_user][]" value="{base ^ 0}" data-check-change-permissions="check[perms_user],data[pages][{id}][perms_user]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_user][]" value="{base ^ 4}" data-check-change-permissions="check[perms_user],data[pages][{id}][perms_user]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_user][]" value="{base ^ 1}" data-check-change-permissions="check[perms_user],data[pages][{id}][perms_user]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_user][]" value="{base ^ 2}" data-check-change-permissions="check[perms_user],data[pages][{id}][perms_user]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_user][]" value="{base ^ 3}" data-check-change-permissions="check[perms_user],data[pages][{id}][perms_user]" />
</div>
</td>
</tr>
<tr>
<td><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Group" /></strong></td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_group][]" value="{base ^ 0}" data-check-change-permissions="check[perms_group],data[pages][{id}][perms_group]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_group][]" value="{base ^ 4}" data-check-change-permissions="check[perms_group],data[pages][{id}][perms_group]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_group][]" value="{base ^ 1}" data-check-change-permissions="check[perms_group],data[pages][{id}][perms_group]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_group][]" value="{base ^ 2}" data-check-change-permissions="check[perms_group],data[pages][{id}][perms_group]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_group][]" value="{base ^ 3}" data-check-change-permissions="check[perms_group],data[pages][{id}][perms_group]" />
</div>
</td>
</tr>
<tr>
<td><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Everybody" /></strong></td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_everybody][]" value="{base ^ 0}" data-check-change-permissions="check[perms_everybody],data[pages][{id}][perms_everybody]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_everybody][]" value="{base ^ 4}" data-check-change-permissions="check[perms_everybody],data[pages][{id}][perms_everybody]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_everybody][]" value="{base ^ 1}" data-check-change-permissions="check[perms_everybody],data[pages][{id}][perms_everybody]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_everybody][]" value="{base ^ 2}" data-check-change-permissions="check[perms_everybody],data[pages][{id}][perms_everybody]" />
</div>
</td>
<td>
<div class="form-check form-check-type-toggle">
<input class="form-check-input" type="checkbox" name="check[perms_everybody][]" value="{base ^ 3}" data-check-change-permissions="check[perms_everybody],data[pages][{id}][perms_everybody]" />
</div>
</td>
</tr>
</tbody>
</table>
</div>
<input type="hidden" name="data[pages][{id}][perms_user]" value="{pageInfo.perms_user}" data-checkbox-group="check[perms_user]" />
<input type="hidden" name="data[pages][{id}][perms_group]" value="{pageInfo.perms_group}" data-checkbox-group="check[perms_group]" />
<input type="hidden" name="data[pages][{id}][perms_everybody]" value="{pageInfo.perms_everybody}" data-checkbox-group="check[perms_everybody]" />
<input type="hidden" name="depth" value="{depth}" />
<input type="hidden" name="returnUrl" value="{returnUrl}" />
</form>
<h3><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Legend" /></h3>
<p>
<strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:1" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:1_t" /> <br>
<strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:16" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:16_t" /> <br>
<strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:2" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:2_t" /> <br>
<strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:4" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:4_t" /> <br>
<strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:8" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:8_t" />
</p>
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:def" /></p>
</f:section>
</html>
@@ -0,0 +1,196 @@
<html
xmlns:backend="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
xmlns:beuser="http://typo3.org/ns/TYPO3/CMS/Beuser/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<f:asset.module identifier="@typo3/beuser/permissions.js"/>
<h1><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:permissions" /></h1>
<div class="table-fit">
<table class="table table-striped table-hover" id="typo3-permissionList">
<thead>
<tr>
<th></th>
<th colspan="2"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Owner" /></th>
<th colspan="2"><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Group" /></th>
<th><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Everybody" /></th>
<th></th>
</tr>
</thead>
<f:for each="{viewTree}" as="data">
<tr>
<f:if condition="{data.row.uid}">
<f:then>
<f:variable name="editUrl"><f:spaceless>
<backend:moduleLink route="permissions_pages" arguments="{id: '{f:if(condition: data.row._ORIG_uid, then: data.row._ORIG_uid, else: data.row.uid)}', action: 'edit', depth: depth, returnUrl: returnUrl}" />
</f:spaceless></f:variable>
<f:comment>
A "normal" page row is rendered, not the root page
</f:comment>
<td class="col-title col-responsive permission-column-name">
<div class="treeline-container">
<f:spaceless>
{data.depthData -> f:format.raw()}{data.HTML -> f:format.raw()}
<f:if condition="{data.icon}">{data.icon -> f:format.raw()}</f:if>
</f:spaceless>
<a class="treeline-label"
href="{editUrl}"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:ch_permissions')}"
>{data.row.title}</a>
</div>
</td>
<td class="permission-column-list">
<beuser:permissions permission="{data.row.perms_user}" scope="user" pageId="{data.row.uid}" />
</td>
<td class="permission-column-group">
<f:render
partial="Permission/Ownername"
arguments="{
pageId: '{data.row.uid}',
userId: '{data.row.perms_userid}',
username: '{beuser:arrayElement(array:beUsers, key:data.row.perms_userid, subKey:\'username\')}'
}"
/>
</td>
<td class="permission-column-list">
<beuser:permissions permission="{data.row.perms_group}" scope="group" pageId="{data.row.uid}" />
</td>
<td class="permission-column-group">
<f:render
partial="Permission/Groupname"
arguments="{
pageId: '{data.row.uid}',
groupId: '{data.row.perms_groupid}',
groupname: '{beuser:arrayElement(array:beGroups, key:data.row.perms_groupid, subKey:\'title\')}'
}"
/>
</td>
<td class="permission-column-list">
<beuser:permissions permission="{data.row.perms_everybody}" scope="everybody" pageId="{data.row.uid}" />
</td>
<td class="col-control">
<span class="btn-group">
<f:if condition="{data.row.editlock}">
<f:then>
<button
type="button"
class="editlock btn btn-sm btn-default"
data-page="{data.row.uid}"
data-lockstate="1"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:EditLock_descr')}"
>
<core:icon identifier="actions-lock" />
</button>
</f:then>
<f:else>
<button
type="button"
class="editlock btn btn-sm btn-default"
data-page="{data.row.uid}"
data-lockstate="0"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:EditLock_descr2')}"
>
<core:icon identifier="actions-unlock" />
</button>
</f:else>
</f:if>
<f:comment>
Edit link is workspace aware: If in ws, link to edit the ws overlay record is rendered
</f:comment>
<a href="{editUrl}"
class="btn btn-sm btn-default"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:ch_permissions')}">
<core:icon identifier="actions-open" />
</a>
</span>
</td>
</f:then>
<f:else>
<f:comment>
Root page row is rendered
</f:comment>
<td class="permission-column-name">
<f:format.raw>{data.HTML}</f:format.raw>
<f:if condition="{data.icon}">{data.icon -> f:format.raw()}</f:if>
{data.row.title -> f:format.crop(maxCharacters:20)}
</td>
<td colspan="6"></td>
</f:else>
</f:if>
</tr>
</f:for>
</table>
</div>
<h3><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:Legend" />:</h3>
<div class="access-legend">
<table>
<tr>
<td class="edge nowrap"><span><span></span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="nowrap"><span class="number">1</span></td>
<td class="nowrap"><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:1" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:1_t" /></td>
</tr>
<tr>
<td class="t3-vr nowrap"><span></span></td>
<td class="edge nowrap"><span><span></span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="nowrap"><span class="number">2</span></td>
<td class="nowrap"><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:16" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:16_t" /></td>
</tr>
<tr>
<td class="t3-vr nowrap"><span></span></td>
<td class="t3-vr nowrap"><span></span></td>
<td class="edge nowrap"><span><span></span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="nowrap"><span class="number">3</span></td>
<td class="nowrap"><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:2" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:2_t" /></td>
</tr>
<tr>
<td class="t3-vr nowrap"><span></span></td>
<td class="t3-vr nowrap"><span></span></td>
<td class="t3-vr nowrap"><span></span></td>
<td class="edge nowrap"><span><span></span></span></td>
<td class="hr nowrap"><span></span></td>
<td class="nowrap"><span class="number">4</span></td>
<td class="nowrap"><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:4" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:4_t" /></td>
</tr>
<tr>
<td class="nowrap"><core:icon identifier="status-status-permission-granted" /></td>
<td class="nowrap"><core:icon identifier="status-status-permission-denied" /></td>
<td class="nowrap"><core:icon identifier="status-status-permission-granted" /></td>
<td class="nowrap"><core:icon identifier="status-status-permission-denied" /></td>
<td class="nowrap"><core:icon identifier="status-status-permission-denied" /></td>
<td class="nowrap"><span class="number">5</span></td>
<td class="nowrap"><strong><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:8" /></strong>: <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:8_t" /></td>
</tr>
</table>
</div>
<p><f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:def" /></p>
<p>
<core:icon identifier="status-status-permission-granted" /> <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:A_Granted" /><br>
<core:icon identifier="status-status-permission-denied" /> <f:translate key="LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:A_Denied" />
</p>
</f:section>
</html>
@@ -0,0 +1,30 @@
<html
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:if condition="{editLockState}">
<f:then>
<button type="button"
class="editlock btn btn-sm btn-default"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:EditLock_descr')}"
data-page="{pageId}"
data-lockstate="1"
>
<core:icon identifier="actions-lock" size="small" />
</button>
</f:then>
<f:else>
<button type="button"
class="editlock btn btn-sm btn-default"
title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:EditLock_descr2')}"
data-page="{pageId}"
data-lockstate="0"
>
<core:icon identifier="actions-unlock" size="small" />
</button>
</f:else>
</f:if>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

@@ -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 e from"@typo3/core/event/regular-event.js";import s from"@typo3/core/document-service.js";class i{constructor(){this.searchField=document.querySelector("#tx_Beuser_username"),this.activeSearch=this.searchField?this.searchField.value!=="":!1,s.ready().then(()=>{this.searchField&&new e("search",()=>{this.searchField.value===""&&this.activeSearch&&this.searchField.closest("form").submit()}).bindTo(this.searchField)})}}var r=new i;export{r as default};
@@ -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 r from"@typo3/core/event/regular-event.js";import c from"@typo3/core/ajax/ajax-request.js";class i{constructor(){this.options={containerSelector:"#typo3-permissionList",editControllerSelector:"#PermissionControllerEdit"},this.ajaxUrl=TYPO3.settings.ajaxUrls.user_access_permissions,this.initializeCheckboxGroups(),this.initializeEvents()}static setPermissionCheckboxes(e,o){const t=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]`);for(const a of t){const s=parseInt(a.value,10);a.checked=(o&s)===s}}static updatePermissionValue(e,o){let t=0;const a=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]:checked`);for(const s of a)t|=parseInt(s.value,10);document.forms.namedItem("editform")[o].value=t|(e==="check[perms_user]"?1:0)}setPermissions(e){const o=e.dataset.page,t=e.dataset.who,a=e.dataset.bits;new c(this.ajaxUrl).post({page:o,who:t,permissions:e.dataset.permissions,mode:e.dataset.mode,bits:e.dataset.bits}).then(async s=>{const n=await s.resolve(),p=e.parentElement;p.innerHTML=n,p.querySelector('button[data-bits="'+a+'"]').focus()})}toggleEditLock(e){const o=e.dataset.page;new c(this.ajaxUrl).post({action:"toggle_edit_lock",page:o,editLockState:e.dataset.lockstate}).then(async t=>{const a=await t.resolve(),s=e.parentElement;e.outerHTML=a,s.querySelector('button[data-page="'+o+'"]').focus()})}changeOwner(e){const o=e.dataset.page,t=document.getElementById("o_"+o);new c(this.ajaxUrl).post({action:"change_owner",page:o,ownerUid:e.dataset.owner,newOwnerUid:t.getElementsByTagName("select")[0].value}).then(async a=>{t.outerHTML=await a.resolve()})}showChangeOwnerSelector(e){const o=e.dataset.page;new c(this.ajaxUrl).post({action:"show_change_owner_selector",page:o,ownerUid:e.dataset.owner,username:e.dataset.username}).then(async t=>{document.getElementById("o_"+o).outerHTML=await t.resolve()})}restoreOwner(e){const o=e.dataset.page,t=e.dataset.username??e.dataset.ifNotSet,a=document.createElement("span");a.setAttribute("id",`o_${o}`);const s=document.createElement("button");s.classList.add("ug_selector","changeowner","btn","btn-sm","btn-link"),s.setAttribute("type","button"),s.setAttribute("data-page",o),s.setAttribute("data-owner",e.dataset.owner),s.setAttribute("data-username",t),s.innerText=t,a.appendChild(s);const n=document.getElementById("o_"+o);n.parentNode.replaceChild(a,n)}restoreGroup(e){const o=e.dataset.page,t=e.dataset.groupname??e.dataset.ifNotSet,a=document.createElement("span");a.setAttribute("id",`g_${o}`);const s=document.createElement("button");s.classList.add("ug_selector","changegroup","btn","btn-sm","btn-link"),s.setAttribute("type","button"),s.setAttribute("data-page",o),s.setAttribute("data-group-id",e.dataset.groupId),s.setAttribute("data-groupname",t),s.innerText=t,a.appendChild(s);const n=document.getElementById("g_"+o);n.parentNode.replaceChild(a,n)}changeGroup(e){const o=e.dataset.page,t=document.getElementById("g_"+o);new c(this.ajaxUrl).post({action:"change_group",page:o,groupUid:e.dataset.groupId,newGroupUid:t.getElementsByTagName("select")[0].value}).then(async a=>{t.outerHTML=await a.resolve()})}showChangeGroupSelector(e){const o=e.dataset.page;new c(this.ajaxUrl).post({action:"show_change_group_selector",page:o,groupUid:e.dataset.groupId,groupname:e.dataset.groupname}).then(async t=>{document.getElementById("g_"+o).outerHTML=await t.resolve()})}initializeCheckboxGroups(){document.querySelectorAll("[data-checkbox-group]").forEach(o=>{const t=o.dataset.checkboxGroup,a=parseInt(o.value,10);i.setPermissionCheckboxes(t,a)})}initializeEvents(){const e=document.querySelector(this.options.containerSelector),o=document.querySelector(this.options.editControllerSelector);e!==null&&(new r("click",(t,a)=>{t.preventDefault(),this.setPermissions(a)}).delegateTo(e,".change-permission"),new r("click",(t,a)=>{t.preventDefault(),this.toggleEditLock(a)}).delegateTo(e,".editlock"),new r("click",(t,a)=>{t.preventDefault(),this.showChangeOwnerSelector(a)}).delegateTo(e,".changeowner"),new r("click",(t,a)=>{t.preventDefault(),this.showChangeGroupSelector(a)}).delegateTo(e,".changegroup"),new r("click",(t,a)=>{t.preventDefault(),this.restoreOwner(a)}).delegateTo(e,".restoreowner"),new r("click",(t,a)=>{t.preventDefault(),this.changeOwner(a)}).delegateTo(e,".saveowner"),new r("click",(t,a)=>{t.preventDefault(),this.restoreGroup(a)}).delegateTo(e,".restoregroup"),new r("click",(t,a)=>{t.preventDefault(),this.changeGroup(a)}).delegateTo(e,".savegroup")),o!==null&&new r("click",(t,a)=>{const s=a.dataset.checkChangePermissions.split(",").map(n=>n.trim());i.updatePermissionValue.apply(this,s)}).delegateTo(o,"[data-check-change-permissions]")}}var l=new i;export{l as default};