diff --git a/Build/Sources/Sass/form.scss b/Build/Sources/Sass/form.scss index a022e442ff5563bbb81d2221209600fa63d75d86..c4814a576d44796a4bae79f8eaafe84661e7485c 100644 --- a/Build/Sources/Sass/form.scss +++ b/Build/Sources/Sass/form.scss @@ -996,10 +996,6 @@ $tree-line-height: 20px; .t3-form-new-element-container { display: none; } - - .t3-form-element-toplevel > form > .tooltip { - top: 100px !important; - } } #t3-form-stage { diff --git a/Build/Sources/TypeScript/backend/ajax-data-handler.ts b/Build/Sources/TypeScript/backend/ajax-data-handler.ts index 10a4ac32918255388d6faf33a0061afc9f211538..729db9a7c404e264f51b0c23c9bc1a4a169c93f2 100644 --- a/Build/Sources/TypeScript/backend/ajax-data-handler.ts +++ b/Build/Sources/TypeScript/backend/ajax-data-handler.ts @@ -129,7 +129,6 @@ class AjaxDataHandler { $(document).on('click', Identifiers.delete, (evt: JQueryEventObject): void => { evt.preventDefault(); const $anchorElement = $(evt.currentTarget); - $anchorElement.tooltip('hide'); const modal = Modal.confirm($anchorElement.data('title'), $anchorElement.data('message'), SeverityEnum.warning, [ { text: $anchorElement.data('button-close-text') || TYPO3.lang['button.cancel'] || 'Cancel', @@ -178,16 +177,6 @@ class AjaxDataHandler { } $anchorElement.data('state', nextState).data('params', nextParams); - // Update tooltip title - $anchorElement.one('hidden.bs.tooltip', (): void => { - const nextTitle = $anchorElement.data('toggleTitle'); - // Bootstrap Tooltip internally uses only .attr('data-bs-original-title') - $anchorElement - .data('toggleTitle', $anchorElement.attr('data-bs-original-title')) - .attr('data-bs-original-title', nextTitle); - }); - $anchorElement.tooltip('hide'); - const $iconElement = $anchorElement.find(Identifiers.icon); Icons.getIcon(iconName, Icons.sizes.small).then((icon: string): void => { $iconElement.replaceWith(icon); diff --git a/Build/Sources/TypeScript/backend/form-engine/element/select-tree-toolbar.ts b/Build/Sources/TypeScript/backend/form-engine/element/select-tree-toolbar.ts index b19b1599d4d86ba1b152458c3beb89f72f8df469..beb108f6a5d60cd856042c5a2386bfa9f0c254e0 100644 --- a/Build/Sources/TypeScript/backend/form-engine/element/select-tree-toolbar.ts +++ b/Build/Sources/TypeScript/backend/form-engine/element/select-tree-toolbar.ts @@ -12,7 +12,6 @@ */ import type {SelectTree} from './select-tree'; -import {Tooltip} from 'bootstrap'; import {html, LitElement, TemplateResult} from 'lit'; import {customElement} from 'lit/decorators'; import {lll} from '@typo3/core/lit-helper'; @@ -40,10 +39,6 @@ export class SelectTreeToolbar extends LitElement { return this; } - protected firstUpdated(): void { - this.querySelectorAll('[data-bs-toggle="tooltip"]').forEach((tooltipTriggerEl: HTMLElement) => new Tooltip(tooltipTriggerEl)); - } - protected render(): TemplateResult { return html` <div class="tree-toolbar btn-toolbar"> @@ -54,13 +49,13 @@ export class SelectTreeToolbar extends LitElement { <input type="text" class="form-control ${this.settings.searchInput}" placeholder="${lll('tcatree.findItem')}" @input="${(evt: InputEvent) => this.filter(evt)}"> </div> <div class="btn-group"> - <button type="button" data-bs-toggle="tooltip" class="btn btn-default ${this.settings.expandAllBtn}" title="${lll('tcatree.expandAll')}" @click="${() => this.expandAll()}"> + <button type="button" class="btn btn-default ${this.settings.expandAllBtn}" title="${lll('tcatree.expandAll')}" @click="${() => this.expandAll()}"> <typo3-backend-icon identifier="apps-pagetree-category-expand-all" size="small"></typo3-backend-icon> </button> - <button type="button" data-bs-toggle="tooltip" class="btn btn-default ${this.settings.collapseAllBtn}" title="${lll('tcatree.collapseAll')}" @click="${(evt: MouseEvent) => this.collapseAll(evt)}"> + <button type="button" class="btn btn-default ${this.settings.collapseAllBtn}" title="${lll('tcatree.collapseAll')}" @click="${(evt: MouseEvent) => this.collapseAll(evt)}"> <typo3-backend-icon identifier="apps-pagetree-category-collapse-all" size="small"></typo3-backend-icon> </button> - <button type="button" data-bs-toggle="tooltip" class="btn btn-default ${this.settings.toggleHideUnchecked}" title="${lll('tcatree.toggleHideUnchecked')}" @click="${() => this.toggleHideUnchecked()}"> + <button type="button" class="btn btn-default ${this.settings.toggleHideUnchecked}" title="${lll('tcatree.toggleHideUnchecked')}" @click="${() => this.toggleHideUnchecked()}"> <typo3-backend-icon identifier="apps-pagetree-category-toggle-hide-checked" size="small"></typo3-backend-icon> </button> </div> diff --git a/Build/Sources/TypeScript/backend/page-tree/page-tree-element.ts b/Build/Sources/TypeScript/backend/page-tree/page-tree-element.ts index 7b6eaa51dc39e3d5bc9f08402b09845752aeaa9b..7d481ac03cf384ec3d5941c812ffd9f8f08408d0 100644 --- a/Build/Sources/TypeScript/backend/page-tree/page-tree-element.ts +++ b/Build/Sources/TypeScript/backend/page-tree/page-tree-element.ts @@ -487,7 +487,7 @@ class PageTreeToolbar extends Toolbar { ? this.tree.settings.doktypes.map((item: any) => { return html` <div class="svg-toolbar__menuitem svg-toolbar__drag-node" data-tree-icon="${item.icon}" data-node-type="${item.nodeType}" - title="${item.title}" tooltip="${item.tooltip}"> + title="${item.title}"> <typo3-backend-icon identifier="${item.icon}" size="small"></typo3-backend-icon> </div> `; @@ -539,7 +539,6 @@ interface NodeCreationOptions { type: string, name: string, title?: string; - tooltip: string, icon: string, position: DraggablePositionEnum, target: TreeNode @@ -702,7 +701,6 @@ class ToolbarDragHandler implements DragDropHandler { public startPageY: number = 0; private readonly id: string = ''; private readonly name: string = ''; - private readonly tooltip: string = ''; private readonly icon: string = ''; private dragDrop: PageTreeDragDrop; private tree: EditablePageTree; @@ -710,7 +708,6 @@ class ToolbarDragHandler implements DragDropHandler { constructor(item: any, tree: EditablePageTree, dragDrop: PageTreeDragDrop) { this.id = item.nodeType; this.name = item.title; - this.tooltip = item.tooltip; this.icon = item.icon; this.tree = tree; this.dragDrop = dragDrop; @@ -750,7 +747,6 @@ class ToolbarDragHandler implements DragDropHandler { this.addNewNode({ type: this.id, name: this.name, - tooltip: this.tooltip, icon: this.icon, position: this.tree.settings.nodeDragPosition, target: this.tree.hoveredNode diff --git a/Build/Sources/TypeScript/backend/recordlist.ts b/Build/Sources/TypeScript/backend/recordlist.ts index a883b3757b7056c0aab85835b008635c3c39fce9..6d2e436fda0b8d6e14016949ca6e9a22f2e95142 100644 --- a/Build/Sources/TypeScript/backend/recordlist.ts +++ b/Build/Sources/TypeScript/backend/recordlist.ts @@ -15,7 +15,6 @@ import $ from 'jquery'; import Icons from '@typo3/backend/icons'; import PersistentStorage from '@typo3/backend/storage/persistent'; import RegularEvent from '@typo3/core/event/regular-event'; -import Tooltip from '@typo3/backend/tooltip'; import DocumentService from '@typo3/core/document-service'; import {ActionConfiguration, ActionEventDetails} from '@typo3/backend/multi-record-selection-action'; import {default as Modal, ModalElement} from '@typo3/backend/modal'; @@ -99,7 +98,6 @@ class Recordlist { $(document).on('click', this.identifier.localize, this.disableButton); $(document).on('click', this.identifier.searchboxToggle, this.toggleSearchbox); DocumentService.ready().then((): void => { - Tooltip.initialize('.table-fit a[title]'); this.registerPaginationEvents(); }); new RegularEvent('typo3:datahandler:process', this.handleDataHandlerResult.bind(this)).bindTo(document); diff --git a/Build/Sources/TypeScript/backend/svg-tree.ts b/Build/Sources/TypeScript/backend/svg-tree.ts index 7ed733f1312b139dc3067b0af190bef0bd8cf2a4..d5f1a8d81b9bc31178c0680227c730cf034cf921 100644 --- a/Build/Sources/TypeScript/backend/svg-tree.ts +++ b/Build/Sources/TypeScript/backend/svg-tree.ts @@ -19,13 +19,11 @@ import AjaxRequest from '@typo3/core/ajax/ajax-request'; import Notification from './notification'; import {KeyTypesEnum as KeyTypes} from './enum/key-types'; import Icons from './icons'; -import Tooltip from './tooltip'; import {AjaxResponse} from '@typo3/core/ajax/ajax-response'; import {MarkupIdentifiers} from './enum/icon-types'; import {lll} from '@typo3/core/lit-helper'; import DebounceEvent from '@typo3/core/event/debounce-event'; import '@typo3/backend/element/icon-element'; -import {Tooltip as BootstrapTooltip} from 'bootstrap'; export type TreeWrapperSelection<TBase extends d3selection.BaseType> = d3selection.Selection<TBase, any, any, any>; export type TreeNodeSelection = d3selection.Selection<d3selection.BaseType, TreeNode, any, any>; @@ -136,8 +134,6 @@ export class SvgTree extends LitElement { protected networkErrorTitle: string = top.TYPO3.lang.tree_networkError; protected networkErrorMessage: string = top.TYPO3.lang.tree_networkErrorDescription; - protected tooltipOptions: Partial<BootstrapTooltip.Options> = {}; - /** * Initializes the tree component - created basic markup, loads and renders data * @todo declare private @@ -156,13 +152,6 @@ export class SvgTree extends LitElement { this.nodesContainer = this.container.select('.nodes') as TreeWrapperSelection<SVGGElement>; this.iconsContainer = this.svg.select('defs') as TreeWrapperSelection<SVGGElement>; - this.tooltipOptions = { - delay: 50, - trigger: 'hover', - placement: 'right', - container: typeof this.settings.id !== 'undefined' ? '#' + this.settings.id : 'body', - } - this.updateScrollPosition(); this.loadCommonIcons(); this.loadData(); @@ -1140,12 +1129,10 @@ export class SvgTree extends LitElement { const nodeContainer = nodeEnter .append('svg') .attr('class', 'node-icon-container') - .attr('title', this.getNodeTitle) .attr('height', '20') .attr('width', '20') .attr('x', '6') .attr('y', '-10') - .attr('data-bs-toggle', 'tooltip') .on('click', (evt: MouseEvent, node: TreeNode) => { evt.preventDefault(); this.clickOnIcon(node) @@ -1197,7 +1184,7 @@ export class SvgTree extends LitElement { .attr('class', 'node-icon-locked'); } - Tooltip.initialize('[data-bs-toggle="tooltip"]', this.tooltipOptions); + nodeEnter.append('title').text(this.getNodeTitle); this.appendTextElement(nodeEnter); return nodes.merge(nodeEnter); @@ -1248,10 +1235,6 @@ export class SvgTree extends LitElement { private updateScrollPosition(): void { this.viewportHeight = this.getBoundingClientRect().height; this.scrollBottom = this.scrollTop + this.viewportHeight + (this.viewportHeight / 2); - // wait for the tooltip to appear and disable tooltips when scrolling - setTimeout(() => { - Tooltip.hide(document.querySelector(<string>this.tooltipOptions.container).querySelectorAll('.bs-tooltip-end')); - }, <number>this.tooltipOptions.delay) } /** diff --git a/Build/Sources/TypeScript/backend/tooltip.ts b/Build/Sources/TypeScript/backend/tooltip.ts index 0aa6c967f4b2156eec5be93778013224b4bbdbee..0935b22b8a0458ce8164e2bd743a5eb27f7319a1 100644 --- a/Build/Sources/TypeScript/backend/tooltip.ts +++ b/Build/Sources/TypeScript/backend/tooltip.ts @@ -18,6 +18,8 @@ import DocumentService from '@typo3/core/document-service'; * The main tooltip object * * Hint: Due to the current usage of tooltips, this class can't be static right now + * + * @deprecated bootstrap tooltip has been deprecated since TYPO3 v12 and will be removed with v13. */ class Tooltip { private static applyAttributes(attributes: { [key: string]: string }, node: HTMLElement): void { @@ -28,6 +30,7 @@ class Tooltip { constructor() { DocumentService.ready().then((): void => { + console.warn('Tooltip has been deprecated since TYPO3 v12 and will be removed with v13. Rely on browser title instead.'); this.initialize('[data-bs-toggle="tooltip"]'); }); } diff --git a/Build/Sources/TypeScript/beuser/permissions.ts b/Build/Sources/TypeScript/beuser/permissions.ts index 6f66a41ed087112b95484a52f0aad3fd742f1651..9812493e7ea52d85b2153695957660df48e6c548 100644 --- a/Build/Sources/TypeScript/beuser/permissions.ts +++ b/Build/Sources/TypeScript/beuser/permissions.ts @@ -14,7 +14,6 @@ import {AjaxResponse} from '@typo3/core/ajax/ajax-response'; import RegularEvent from '@typo3/core/event/regular-event'; import AjaxRequest from '@typo3/core/ajax/ajax-request'; -import Tooltip from '@typo3/backend/tooltip'; /** * Module: @typo3/beuser/permissions @@ -63,9 +62,6 @@ class Permissions { let page = element.dataset.page; let who = element.dataset.who; - // Hide all Tooltips to avoid permanent visible/never hidden Tooltips - Tooltip.hide(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - (new AjaxRequest(this.ajaxUrl)).post({ page: page, who: who, @@ -77,8 +73,6 @@ class Permissions { const element = document.getElementById(page + '_' + who); // Replace content element.outerHTML = data; - // Reinitialize tooltip - Tooltip.initialize('[data-bs-toggle="tooltip"]'); }); } diff --git a/Build/Sources/TypeScript/extensionmanager/main.ts b/Build/Sources/TypeScript/extensionmanager/main.ts index c3d544535420a7415a0c2649f2026e18784c6407..6c467420868086b5732e6eaa24c7a4b3e2c45407 100644 --- a/Build/Sources/TypeScript/extensionmanager/main.ts +++ b/Build/Sources/TypeScript/extensionmanager/main.ts @@ -16,7 +16,6 @@ import $ from 'jquery'; import BrowserSession from '@typo3/backend/storage/browser-session'; import NProgress from 'nprogress'; import {default as Modal, ModalElement} from '@typo3/backend/modal'; -import Tooltip from '@typo3/backend/tooltip'; import Severity from '@typo3/backend/severity'; import SecurityUtility from '@typo3/core/security-utility'; import ExtensionManagerRepository from './repository'; @@ -138,8 +137,6 @@ class ExtensionManager { this.Repository.initDom(); this.Update.initializeEvents(); this.UploadForm.initializeEvents(); - - Tooltip.initialize('#typo3-extension-list [title]'); }); } diff --git a/Build/Sources/TypeScript/filelist/file-list.ts b/Build/Sources/TypeScript/filelist/file-list.ts index e72986c41294e9d03576a9f077ed3ff6fef4c954..9d23540038e3332f31d34b530846c823f5e856f0 100644 --- a/Build/Sources/TypeScript/filelist/file-list.ts +++ b/Build/Sources/TypeScript/filelist/file-list.ts @@ -17,7 +17,6 @@ import Notification from '@typo3/backend/notification'; import InfoWindow from '@typo3/backend/info-window'; import {BroadcastMessage} from '@typo3/backend/broadcast-message'; import broadcastService from '@typo3/backend/broadcast-service'; -import Tooltip from '@typo3/backend/tooltip'; import NProgress from 'nprogress'; import Icons from '@typo3/backend/icons'; import AjaxRequest from '@typo3/core/ajax/ajax-request'; @@ -181,7 +180,6 @@ export default class Filelist { })); }).delegateTo(document, '.t3js-element-browser'); - Tooltip.initialize('.table-fit a[title]'); // file index events new RegularEvent('click', (event: Event, target: HTMLElement): void => { event.preventDefault(); diff --git a/Build/Sources/TypeScript/install/module/maintenance/language-packs.ts b/Build/Sources/TypeScript/install/module/maintenance/language-packs.ts index bc826deeca9936ee5a142274028f5a54e536726a..063c7b665b75a4f54bd8b758cdbc20ae70879b24 100644 --- a/Build/Sources/TypeScript/install/module/maintenance/language-packs.ts +++ b/Build/Sources/TypeScript/install/module/maintenance/language-packs.ts @@ -102,7 +102,6 @@ class LanguagePacks extends AbstractInteractableModule { contentContainer.empty(); contentContainer.append(this.languageMatrixHtml(data)); contentContainer.append(this.extensionMatrixHtml(data)); - $('[data-bs-toggle="tooltip"]').tooltip(<any>({container: contentContainer})); } else { const message = InfoBox.render(Severity.error, 'Something went wrong', ''); this.addNotification(message); @@ -342,13 +341,11 @@ class LanguagePacks extends AbstractInteractableModule { $('<a>', { 'class': 'btn btn-default t3js-languagePacks-deactivateLanguage', 'data-iso': language.iso, - 'data-bs-toggle': 'tooltip', 'title': 'Deactivate', }).append(deactivateIcon), $('<a>', { 'class': 'btn btn-default t3js-languagePacks-update', 'data-iso': language.iso, - 'data-bs-toggle': 'tooltip', 'title': 'Download language packs', }).append(updateIcon), ), @@ -363,7 +360,6 @@ class LanguagePacks extends AbstractInteractableModule { $('<a>', { 'class': 'btn btn-default t3js-languagePacks-activateLanguage', 'data-iso': language.iso, - 'data-bs-toggle': 'tooltip', 'title': 'Activate', }).append(activateIcon), ), @@ -433,7 +429,6 @@ class LanguagePacks extends AbstractInteractableModule { $('<a>', { 'class': 'btn btn-default t3js-languagePacks-update', 'data-iso': language, - 'data-bs-toggle': 'tooltip', 'title': 'Download and update all language packs', }).append( $('<span>').append(updateIcon), @@ -491,7 +486,6 @@ class LanguagePacks extends AbstractInteractableModule { 'class': 'btn btn-default t3js-languagePacks-update', 'data-extension': extension.key, 'data-iso': pack.iso, - 'data-bs-toggle': 'tooltip', 'title': securityUtility.encodeHtml(tooltip), }).append(updateIcon), ); diff --git a/Build/Sources/TypeScript/workspaces/backend.ts b/Build/Sources/TypeScript/workspaces/backend.ts index 85fa05819b2fe5acee823e6be7d3841a5ee87c77..88c2379b96f2b5896020d718ced8afaedf66f090 100644 --- a/Build/Sources/TypeScript/workspaces/backend.ts +++ b/Build/Sources/TypeScript/workspaces/backend.ts @@ -20,7 +20,6 @@ import '@typo3/backend/input/clearable'; import Workspaces from './workspaces'; import {default as Modal, ModalElement} from '@typo3/backend/modal'; import Persistent from '@typo3/backend/storage/persistent'; -import Tooltip from '@typo3/backend/tooltip'; import Utility from '@typo3/backend/utility'; import Wizard from '@typo3/backend/wizard'; import SecurityUtility from '@typo3/core/security-utility'; @@ -652,9 +651,6 @@ class Backend extends Workspaces { if (item.integrity.messages !== '') { $integrityIcon = $('<span>' + this.getIcon(item.integrity.status) + '</span>'); $integrityIcon - .attr('data-bs-toggle', 'tooltip') - .attr('data-bs-placement', 'top') - .attr('data-bs-html', 'true') .attr('title', item.integrity.messages); } @@ -723,15 +719,6 @@ class Backend extends Workspaces { $('<td />', {class: 'text-end nowrap'}).append($actions), ), ); - - Tooltip.initialize('[data-bs-toggle="tooltip"]', { - delay: { - show: 500, - hide: 100, - }, - trigger: 'hover', - container: 'body', - }); } } @@ -1250,7 +1237,6 @@ class Backend extends Workspaces { return $('<button />', { class: 'btn btn-default', 'data-action': action, - 'data-bs-toggle': 'tooltip', }).append(this.getIcon(iconIdentifier)); } return $('<span />', {class: 'btn btn-default disabled'}).append(this.getIcon('empty-empty')); diff --git a/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php b/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php index 2ec04b087726e82a5f732a4a1edea3eb001d9d5b..33f19a4111227c34a56883fe350ba2dfbce3ae2a 100644 --- a/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php +++ b/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php @@ -88,7 +88,6 @@ class MoveElementController } $assigns = []; $backendUser = $this->getBackendUser(); - $this->pageRenderer->loadJavaScriptModule('@typo3/backend/tooltip.js'); // Get record for element: $elRow = BackendUtility::getRecordWSOL($this->table, $this->moveUid); // Headerline: Icon, record title: diff --git a/typo3/sysext/backend/Classes/Controller/NewRecordController.php b/typo3/sysext/backend/Classes/Controller/NewRecordController.php index 7a90e40a2cb427b1549a949021f06e6c7dcbec23..a68345518072008a79c0038aebdd5ef907a1d575 100644 --- a/typo3/sysext/backend/Classes/Controller/NewRecordController.php +++ b/typo3/sysext/backend/Classes/Controller/NewRecordController.php @@ -212,7 +212,6 @@ class NewRecordController $this->returnUrl = GeneralUtility::sanitizeLocalUrl($parsedBody['returnUrl'] ?? $queryParams['returnUrl'] ?? ''); // Setting up the context sensitive menu: $this->pageRenderer->loadJavaScriptModule('@typo3/backend/context-menu.js'); - $this->pageRenderer->loadJavaScriptModule('@typo3/backend/tooltip.js'); $this->pageRenderer->loadJavaScriptModule('@typo3/backend/new-content-element-wizard-button.js'); // Id a positive id is supplied, ask for the page record with permission information contained: if ($this->id > 0) { diff --git a/typo3/sysext/backend/Classes/Controller/Page/TreeController.php b/typo3/sysext/backend/Classes/Controller/Page/TreeController.php index be266868a785c13bb916931c39baec0d3c50079b..a65c75f5b3ebfd5c80fb6fed03a3454fec51f367 100644 --- a/typo3/sysext/backend/Classes/Controller/Page/TreeController.php +++ b/typo3/sysext/backend/Classes/Controller/Page/TreeController.php @@ -239,7 +239,6 @@ class TreeController 'nodeType' => $doktype, 'icon' => $GLOBALS['TCA']['pages']['ctrl']['typeicon_classes'][$doktype] ?? '', 'title' => $label, - 'tooltip' => $label, ]; } return $output; diff --git a/typo3/sysext/backend/Classes/Form/Container/FileReferenceContainer.php b/typo3/sysext/backend/Classes/Form/Container/FileReferenceContainer.php index b73ea75690b3a2b4894088834103bee55c73949e..91d8a798b26c10f0e074c88e5d996e4e3b718545 100644 --- a/typo3/sysext/backend/Classes/Form/Container/FileReferenceContainer.php +++ b/typo3/sysext/backend/Classes/Form/Container/FileReferenceContainer.php @@ -454,7 +454,7 @@ class FileReferenceContainer extends AbstractContainer } if ($lockInfo = BackendUtility::isRecordLocked(self::FILE_REFERENCE_TABLE, $databaseRow['uid'])) { $controls['locked'] = ' - <button type="button" class="btn btn-default" data-bs-toggle="tooltip" title="' . htmlspecialchars($lockInfo['msg']) . '"> + <button type="button" class="btn btn-default" title="' . htmlspecialchars($lockInfo['msg']) . '"> ' . $this->iconFactory->getIcon('status-user-backend', Icon::SIZE_SMALL, 'overlay-edit')->render() . ' </button>'; } diff --git a/typo3/sysext/backend/Classes/Form/Container/InlineRecordContainer.php b/typo3/sysext/backend/Classes/Form/Container/InlineRecordContainer.php index 7a1303b4aa8498cb7c88c9a0e6984f07d5f9fb0e..23f72ee84f6db68f93c89fa2ba9535af749d1856 100644 --- a/typo3/sysext/backend/Classes/Form/Container/InlineRecordContainer.php +++ b/typo3/sysext/backend/Classes/Form/Container/InlineRecordContainer.php @@ -522,7 +522,7 @@ class InlineRecordContainer extends AbstractContainer // If the record is edit-locked by another user, we will show a little warning sign: if ($lockInfo = BackendUtility::isRecordLocked($foreignTable, $rec['uid'])) { $cells['locked'] = ' - <button type="button" class="btn btn-default" data-bs-toggle="tooltip" title="' . htmlspecialchars($lockInfo['msg']) . '"> + <button type="button" class="btn btn-default" title="' . htmlspecialchars($lockInfo['msg']) . '"> ' . $this->iconFactory->getIcon('status-user-backend', Icon::SIZE_SMALL, 'overlay-edit')->render() . ' </button>'; } diff --git a/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php b/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php index ec2d3aaadfe1708268427e387c8ab8a670a26bed..b75f1a8540f0535dd7411d30ec3d3253b39e9520 100644 --- a/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/InputSlugElement.php @@ -155,7 +155,6 @@ class InputSlugElement extends AbstractFormElement // field to manipulate the value, and the final hidden field used to send the value $mainFieldHtml[] = '<input'; $mainFieldHtml[] = ' class="form-control t3js-form-field-slug-readonly"'; - $mainFieldHtml[] = ' data-bs-toggle="tooltip"'; $mainFieldHtml[] = ' title="' . htmlspecialchars($itemValue) . '"'; $mainFieldHtml[] = ' value="' . htmlspecialchars($itemValue) . '"'; $mainFieldHtml[] = ' readonly'; diff --git a/typo3/sysext/backend/Classes/Form/Element/LinkElement.php b/typo3/sysext/backend/Classes/Form/Element/LinkElement.php index 6edce70dd10ff2aabf8fbb0c906d1080872455c1..2110721b1572eba89e1e867140e6a9d76257254b 100644 --- a/typo3/sysext/backend/Classes/Form/Element/LinkElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/LinkElement.php @@ -202,7 +202,7 @@ class LinkElement extends AbstractFormElement $expansionHtml[] = '<div class="form-wizards-element">'; $expansionHtml[] = '<div class="input-group t3js-form-field-link">'; $expansionHtml[] = '<span class="t3js-form-field-link-icon input-group-addon">' . ($linkExplanation['icon'] ?? '') . '</span>'; - $expansionHtml[] = '<input class="form-control t3js-form-field-link-explanation" data-bs-toggle="tooltip" title="' . $explanation . '" value="' . $explanation . '" readonly>'; + $expansionHtml[] = '<input class="form-control t3js-form-field-link-explanation" title="' . $explanation . '" value="' . $explanation . '" readonly>'; $expansionHtml[] = '<input type="text" ' . GeneralUtility::implodeAttributes($attributes, true) . ' />'; $expansionHtml[] = '<button class="btn btn-default t3js-form-field-link-explanation-toggle" type="button" title="' . htmlspecialchars($toggleButtonTitle) . '">'; $expansionHtml[] = $this->iconFactory->getIcon('actions-version-workspaces-preview-link', Icon::SIZE_SMALL)->render(); diff --git a/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php b/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php index e51c8548167f786a6a368d06b42e0c1ace5131c0..bc3b560c762c3b2920231ee7a8ad6c27f861d40f 100644 --- a/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php @@ -229,7 +229,7 @@ class SelectCheckBoxElement extends AbstractFormElement $html[] = '<thead>'; $html[] = '<tr>'; $html[] = '<th class="col-checkbox">'; - $html[] = '<input type="checkbox" id="' . $checkboxId . '" class="t3js-toggle-checkboxes" data-bs-trigger="hover" data-bs-placement="right" title="' . $title . '" data-bs-toggle="tooltip" />'; + $html[] = '<input type="checkbox" id="' . $checkboxId . '" class="t3js-toggle-checkboxes" title="' . $title . '" />'; $html[] = '</th>'; $html[] = '<th class="col-title"><label for="' . $checkboxId . '">' . $title . '</label></th>'; $html[] = '<th class="text-end">'; @@ -267,7 +267,6 @@ class SelectCheckBoxElement extends AbstractFormElement $html[] = '</div>'; $resultArray['html'] = implode(LF, $html); - $resultArray['javaScriptModules'][] = JavaScriptModuleInstruction::create('@typo3/backend/tooltip.js'); return $resultArray; } diff --git a/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php b/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php index 8dbbfb626bb4469f33d581b71614d8531a680427..21282342aa79979918affd2f113549128f78b586 100644 --- a/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php +++ b/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php @@ -1004,7 +1004,7 @@ class DatabaseRecordList // If the record is edit-locked by another user, we will show a little warning sign: $lockInfo = BackendUtility::isRecordLocked($table, $row['uid']); if ($lockInfo) { - $warning = '<span tabindex="0" data-bs-toggle="tooltip" data-bs-placement="right"' + $warning = '<span tabindex="0"' . ' title="' . htmlspecialchars($lockInfo['msg']) . '"' . ' aria-label="' . htmlspecialchars($lockInfo['msg']) . '">' . $this->iconFactory->getIcon('status-user-backend', Icon::SIZE_SMALL, 'overlay-edit')->render() @@ -1683,7 +1683,7 @@ class DatabaseRecordList if ($cellOutput !== '') { $icon = $this->iconFactory->getIcon('actions-menu-alternative', Icon::SIZE_SMALL); $title = $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.more'); - $output .= ' <div class="btn-group dropdown position-static" data-bs-toggle="tooltip" title="' . htmlspecialchars($title) . '">' . + $output .= ' <div class="btn-group dropdown position-static" title="' . htmlspecialchars($title) . '">' . '<a href="#actions_' . $table . '_' . $row['uid'] . '" class="btn btn-default dropdown-toggle dropdown-toggle-no-chevron" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false">' . $icon->render() . '</a>' . '<ul id="actions_' . $table . '_' . $row['uid'] . '" class="dropdown-menu">' . $cellOutput . '</ul>' . '</div>'; diff --git a/typo3/sysext/backend/Classes/Utility/BackendUtility.php b/typo3/sysext/backend/Classes/Utility/BackendUtility.php index b73e0474b812fdfa21ab20adfdc6e0c94665835d..56db7ef6a46c664e9c31dc89faad97b8a964834f 100644 --- a/typo3/sysext/backend/Classes/Utility/BackendUtility.php +++ b/typo3/sysext/backend/Classes/Utility/BackendUtility.php @@ -1210,11 +1210,7 @@ class BackendUtility */ public static function getRecordToolTip(array $row, $table = 'pages') { - $toolTipText = self::getRecordIconAltText($row, $table); - $toolTipCode = 'data-bs-toggle="tooltip" title=" ' - . str_replace(' - ', '<br>', $toolTipText) - . '" data-bs-html="true" data-bs-placement="right"'; - return $toolTipCode; + return 'title="' . self::getRecordIconAltText($row, $table) . '"'; } /** diff --git a/typo3/sysext/backend/Classes/View/BackendLayout/Grid/GridColumnItem.php b/typo3/sysext/backend/Classes/View/BackendLayout/Grid/GridColumnItem.php index 159db0cbd7684b7c14d238570678c3e5f090874a..fc28ae880932ae7469d14cbb1beed6f271ec134c 100644 --- a/typo3/sysext/backend/Classes/View/BackendLayout/Grid/GridColumnItem.php +++ b/typo3/sysext/backend/Classes/View/BackendLayout/Grid/GridColumnItem.php @@ -182,7 +182,7 @@ class GridColumnItem extends AbstractGridObject $icons[] = $icon; if ($lockInfo = BackendUtility::isRecordLocked('tt_content', $row['uid'])) { - $icons[] = '<a href="#" data-bs-toggle="tooltip" title="' . htmlspecialchars($lockInfo['msg']) . '">' + $icons[] = '<a href="#" title="' . htmlspecialchars($lockInfo['msg']) . '">' . $this->iconFactory->getIcon('status-user-backend', Icon::SIZE_SMALL, 'overlay-edit')->render() . '</a>'; } return implode(' ', $icons); diff --git a/typo3/sysext/backend/Resources/Private/Templates/Page/SortSubPages.html b/typo3/sysext/backend/Resources/Private/Templates/Page/SortSubPages.html index a1a1e8c1113f6317d929850f4ce6ce37a22f58c4..4ecce826882f94d3557aec1ef8e140d4ba993a84 100644 --- a/typo3/sysext/backend/Resources/Private/Templates/Page/SortSubPages.html +++ b/typo3/sysext/backend/Resources/Private/Templates/Page/SortSubPages.html @@ -12,8 +12,7 @@ <f:be.pageRenderer includeJavaScriptModules="{ 0:'@typo3/backend/context-menu.js', - 1:'@typo3/backend/modal.js', - 2:'@typo3/backend/tooltip.js' + 1:'@typo3/backend/modal.js' }" /> @@ -71,10 +70,7 @@ <td class="text-nowrap"> <core:iconForRecord table="pages" row="{page.record}" /> <f:if condition="!{page.canEdit}"> - <span - data-bs-toggle="tooltip" - title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:noEditPermissions')}" - > + <span title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_pages_sort.xlf:noEditPermissions')}"> <core:icon identifier="status-status-permission-denied" /> </span> </f:if> diff --git a/typo3/sysext/backend/Resources/Private/Templates/PageLayout/PageModule.html b/typo3/sysext/backend/Resources/Private/Templates/PageLayout/PageModule.html index f438d73871e04e3f049d200a3dc64fe737edf6be..1b3d68d9e79a8f4f2be459e48fb2c80fc9074595 100644 --- a/typo3/sysext/backend/Resources/Private/Templates/PageLayout/PageModule.html +++ b/typo3/sysext/backend/Resources/Private/Templates/PageLayout/PageModule.html @@ -12,11 +12,10 @@ 0: '@typo3/backend/clear-cache.js', 1: '@typo3/backend/new-content-element-wizard-button.js', 2: '@typo3/backend/context-menu.js', - 3: '@typo3/backend/tooltip.js', - 4: '@typo3/backend/localization.js', - 5: '@typo3/backend/layout-module/drag-drop.js', - 6: '@typo3/backend/modal.js', - 7: '@typo3/backend/element/editable-page-title.js' + 3: '@typo3/backend/localization.js', + 4: '@typo3/backend/layout-module/drag-drop.js', + 5: '@typo3/backend/modal.js', + 6: '@typo3/backend/element/editable-page-title.js' }" /> diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/ajax-data-handler.js b/typo3/sysext/backend/Resources/Public/JavaScript/ajax-data-handler.js index bd619ae04f061af8c87f34e72985fd95b2e7d59e..d488c3eb55c7b7f437d3a102e3fc499722018e7d 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/ajax-data-handler.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/ajax-data-handler.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import{BroadcastMessage}from"@typo3/backend/broadcast-message.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import DocumentService from"@typo3/core/document-service.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import $ from"jquery";import BroadcastService from"@typo3/backend/broadcast-service.js";import Icons from"@typo3/backend/icons.js";import Modal from"@typo3/backend/modal.js";import Notification from"@typo3/backend/notification.js";var Identifiers;!function(e){e.hide=".t3js-record-hide",e.delete=".t3js-record-delete",e.icon=".t3js-icon"}(Identifiers||(Identifiers={}));class AjaxDataHandler{static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}static call(e){return new AjaxRequest(TYPO3.settings.ajaxUrls.record_process).withQueryArguments(e).get().then((async e=>await e.resolve()))}constructor(){DocumentService.ready().then((()=>{this.initialize()}))}process(e,t){return AjaxDataHandler.call(e).then((e=>{if(e.hasErrors&&this.handleErrors(e),t){const a={...t,hasErrors:e.hasErrors},n=new BroadcastMessage("datahandler","process",a);BroadcastService.post(n);const o=new CustomEvent("typo3:datahandler:process",{detail:{payload:a}});document.dispatchEvent(o)}return e}))}initialize(){$(document).on("click",Identifiers.hide,(e=>{e.preventDefault();const t=$(e.currentTarget),a=t.find(Identifiers.icon),n=t.closest("tr[data-uid]"),o=t.data("params");this._showSpinnerIcon(a),this.process(o).then((e=>{e.hasErrors||this.toggleRow(n)}))})),$(document).on("click",Identifiers.delete,(e=>{e.preventDefault();const t=$(e.currentTarget);t.tooltip("hide");const a=Modal.confirm(t.data("title"),t.data("message"),SeverityEnum.warning,[{text:t.data("button-close-text")||TYPO3.lang["button.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:t.data("button-ok-text")||TYPO3.lang["button.delete"]||"Delete",btnClass:"btn-warning",name:"delete"}]);a.addEventListener("button.clicked",(e=>{"cancel"===e.target.getAttribute("name")?a.hideModal():"delete"===e.target.getAttribute("name")&&(a.hideModal(),this.deleteRecord(t))}))}))}toggleRow(e){const t=e.find(Identifiers.hide),a=t.closest("table[data-table]").data("table"),n=t.data("params");let o,s,i;"hidden"===t.data("state")?(s="visible",o=n.replace("=0","=1"),i="actions-edit-hide"):(s="hidden",o=n.replace("=1","=0"),i="actions-edit-unhide"),t.data("state",s).data("params",o),t.one("hidden.bs.tooltip",(()=>{const e=t.data("toggleTitle");t.data("toggleTitle",t.attr("data-bs-original-title")).attr("data-bs-original-title",e)})),t.tooltip("hide");const r=t.find(Identifiers.icon);Icons.getIcon(i,Icons.sizes.small).then((e=>{r.replaceWith(e)}));const d=e.find(".col-icon "+Identifiers.icon);"hidden"===s?Icons.getIcon("miscellaneous-placeholder",Icons.sizes.small,"overlay-hidden").then((e=>{d.append($(e).find(".icon-overlay"))})):d.find(".icon-overlay").remove(),e.fadeTo("fast",.4,(()=>{e.fadeTo("fast",1)})),"pages"===a&&AjaxDataHandler.refreshPageTree()}deleteRecord(e){const t=e.data("params");let a=e.find(Identifiers.icon);this._showSpinnerIcon(a);const n=e.closest("table[data-table]"),o=n.data("table");let s=e.closest("tr[data-uid]");const i=s.data("uid"),r={component:"datahandler",action:"delete",table:o,uid:i};this.process(t,r).then((t=>{if(Icons.getIcon("actions-edit-delete",Icons.sizes.small).then((t=>{a=e.find(Identifiers.icon),a.replaceWith(t)})),!t.hasErrors){const t=e.closest(".panel"),a=t.find(".panel-heading"),r=n.find("[data-l10nparent="+i+"]").closest("tr[data-uid]");if(s=s.add(r),s.fadeTo("slow",.4,(()=>{s.slideUp("slow",(()=>{s.remove(),0===n.find("tbody tr").length&&t.slideUp("slow")}))})),"0"===e.data("l10parent")||""===e.data("l10parent")){const e=Number(a.find(".t3js-table-total-items").html());a.find(".t3js-table-total-items").text(e-1)}"pages"===o&&AjaxDataHandler.refreshPageTree()}}))}handleErrors(e){for(let t of e.messages)Notification.error(t.title,t.message)}_showSpinnerIcon(e){Icons.getIcon("spinner-circle-dark",Icons.sizes.small).then((t=>{e.replaceWith(t)}))}}export default new AjaxDataHandler; \ No newline at end of file +import{BroadcastMessage}from"@typo3/backend/broadcast-message.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import DocumentService from"@typo3/core/document-service.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import $ from"jquery";import BroadcastService from"@typo3/backend/broadcast-service.js";import Icons from"@typo3/backend/icons.js";import Modal from"@typo3/backend/modal.js";import Notification from"@typo3/backend/notification.js";var Identifiers;!function(e){e.hide=".t3js-record-hide",e.delete=".t3js-record-delete",e.icon=".t3js-icon"}(Identifiers||(Identifiers={}));class AjaxDataHandler{static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}static call(e){return new AjaxRequest(TYPO3.settings.ajaxUrls.record_process).withQueryArguments(e).get().then((async e=>await e.resolve()))}constructor(){DocumentService.ready().then((()=>{this.initialize()}))}process(e,t){return AjaxDataHandler.call(e).then((e=>{if(e.hasErrors&&this.handleErrors(e),t){const a={...t,hasErrors:e.hasErrors},n=new BroadcastMessage("datahandler","process",a);BroadcastService.post(n);const s=new CustomEvent("typo3:datahandler:process",{detail:{payload:a}});document.dispatchEvent(s)}return e}))}initialize(){$(document).on("click",Identifiers.hide,(e=>{e.preventDefault();const t=$(e.currentTarget),a=t.find(Identifiers.icon),n=t.closest("tr[data-uid]"),s=t.data("params");this._showSpinnerIcon(a),this.process(s).then((e=>{e.hasErrors||this.toggleRow(n)}))})),$(document).on("click",Identifiers.delete,(e=>{e.preventDefault();const t=$(e.currentTarget),a=Modal.confirm(t.data("title"),t.data("message"),SeverityEnum.warning,[{text:t.data("button-close-text")||TYPO3.lang["button.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:t.data("button-ok-text")||TYPO3.lang["button.delete"]||"Delete",btnClass:"btn-warning",name:"delete"}]);a.addEventListener("button.clicked",(e=>{"cancel"===e.target.getAttribute("name")?a.hideModal():"delete"===e.target.getAttribute("name")&&(a.hideModal(),this.deleteRecord(t))}))}))}toggleRow(e){const t=e.find(Identifiers.hide),a=t.closest("table[data-table]").data("table"),n=t.data("params");let s,r,o;"hidden"===t.data("state")?(r="visible",s=n.replace("=0","=1"),o="actions-edit-hide"):(r="hidden",s=n.replace("=1","=0"),o="actions-edit-unhide"),t.data("state",r).data("params",s);const i=t.find(Identifiers.icon);Icons.getIcon(o,Icons.sizes.small).then((e=>{i.replaceWith(e)}));const d=e.find(".col-icon "+Identifiers.icon);"hidden"===r?Icons.getIcon("miscellaneous-placeholder",Icons.sizes.small,"overlay-hidden").then((e=>{d.append($(e).find(".icon-overlay"))})):d.find(".icon-overlay").remove(),e.fadeTo("fast",.4,(()=>{e.fadeTo("fast",1)})),"pages"===a&&AjaxDataHandler.refreshPageTree()}deleteRecord(e){const t=e.data("params");let a=e.find(Identifiers.icon);this._showSpinnerIcon(a);const n=e.closest("table[data-table]"),s=n.data("table");let r=e.closest("tr[data-uid]");const o=r.data("uid"),i={component:"datahandler",action:"delete",table:s,uid:o};this.process(t,i).then((t=>{if(Icons.getIcon("actions-edit-delete",Icons.sizes.small).then((t=>{a=e.find(Identifiers.icon),a.replaceWith(t)})),!t.hasErrors){const t=e.closest(".panel"),a=t.find(".panel-heading"),i=n.find("[data-l10nparent="+o+"]").closest("tr[data-uid]");if(r=r.add(i),r.fadeTo("slow",.4,(()=>{r.slideUp("slow",(()=>{r.remove(),0===n.find("tbody tr").length&&t.slideUp("slow")}))})),"0"===e.data("l10parent")||""===e.data("l10parent")){const e=Number(a.find(".t3js-table-total-items").html());a.find(".t3js-table-total-items").text(e-1)}"pages"===s&&AjaxDataHandler.refreshPageTree()}}))}handleErrors(e){for(let t of e.messages)Notification.error(t.title,t.message)}_showSpinnerIcon(e){Icons.getIcon("spinner-circle-dark",Icons.sizes.small).then((t=>{e.replaceWith(t)}))}}export default new AjaxDataHandler; \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/form-engine/element/select-tree-toolbar.js b/typo3/sysext/backend/Resources/Public/JavaScript/form-engine/element/select-tree-toolbar.js index 095ffd7a13876395ededaaab066882dcee90c4f0..7eea6510e2260ebf43a10dc5316adec58aa99961 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/form-engine/element/select-tree-toolbar.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/form-engine/element/select-tree-toolbar.js @@ -10,7 +10,7 @@ * * The TYPO3 project - inspiring people to share! */ -var __decorate=function(e,t,l,o){var i,n=arguments.length,a=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,l):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,l,o);else for(var r=e.length-1;r>=0;r--)(i=e[r])&&(a=(n<3?i(a):n>3?i(t,l,a):i(t,l))||a);return n>3&&a&&Object.defineProperty(t,l,a),a};import{Tooltip}from"bootstrap";import{html,LitElement}from"lit";import{customElement}from"lit/decorators.js";import{lll}from"@typo3/core/lit-helper.js";let SelectTreeToolbar=class extends LitElement{constructor(){super(...arguments),this.settings={collapseAllBtn:"collapse-all-btn",expandAllBtn:"expand-all-btn",searchInput:"search-input",toggleHideUnchecked:"hide-unchecked-btn"},this.hideUncheckedState=!1}createRenderRoot(){return this}firstUpdated(){this.querySelectorAll('[data-bs-toggle="tooltip"]').forEach((e=>new Tooltip(e)))}render(){return html` +var __decorate=function(e,t,l,i){var n,o=arguments.length,r=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,l,i);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(r=(o<3?n(r):o>3?n(t,l,r):n(t,l))||r);return o>3&&r&&Object.defineProperty(t,l,r),r};import{html,LitElement}from"lit";import{customElement}from"lit/decorators.js";import{lll}from"@typo3/core/lit-helper.js";let SelectTreeToolbar=class extends LitElement{constructor(){super(...arguments),this.settings={collapseAllBtn:"collapse-all-btn",expandAllBtn:"expand-all-btn",searchInput:"search-input",toggleHideUnchecked:"hide-unchecked-btn"},this.hideUncheckedState=!1}createRenderRoot(){return this}render(){return html` <div class="tree-toolbar btn-toolbar"> <div class="input-group"> <span class="input-group-addon input-group-icon filter"> @@ -19,13 +19,13 @@ var __decorate=function(e,t,l,o){var i,n=arguments.length,a=n<3?t:null===o?o=Obj <input type="text" class="form-control ${this.settings.searchInput}" placeholder="${lll("tcatree.findItem")}" @input="${e=>this.filter(e)}"> </div> <div class="btn-group"> - <button type="button" data-bs-toggle="tooltip" class="btn btn-default ${this.settings.expandAllBtn}" title="${lll("tcatree.expandAll")}" @click="${()=>this.expandAll()}"> + <button type="button" class="btn btn-default ${this.settings.expandAllBtn}" title="${lll("tcatree.expandAll")}" @click="${()=>this.expandAll()}"> <typo3-backend-icon identifier="apps-pagetree-category-expand-all" size="small"></typo3-backend-icon> </button> - <button type="button" data-bs-toggle="tooltip" class="btn btn-default ${this.settings.collapseAllBtn}" title="${lll("tcatree.collapseAll")}" @click="${e=>this.collapseAll(e)}"> + <button type="button" class="btn btn-default ${this.settings.collapseAllBtn}" title="${lll("tcatree.collapseAll")}" @click="${e=>this.collapseAll(e)}"> <typo3-backend-icon identifier="apps-pagetree-category-collapse-all" size="small"></typo3-backend-icon> </button> - <button type="button" data-bs-toggle="tooltip" class="btn btn-default ${this.settings.toggleHideUnchecked}" title="${lll("tcatree.toggleHideUnchecked")}" @click="${()=>this.toggleHideUnchecked()}"> + <button type="button" class="btn btn-default ${this.settings.toggleHideUnchecked}" title="${lll("tcatree.toggleHideUnchecked")}" @click="${()=>this.toggleHideUnchecked()}"> <typo3-backend-icon identifier="apps-pagetree-category-toggle-hide-checked" size="small"></typo3-backend-icon> </button> </div> diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/page-tree/page-tree-element.js b/typo3/sysext/backend/Resources/Public/JavaScript/page-tree/page-tree-element.js index ac791197087aeb3a15947489cce8b532cda2f684..189ac129a11274638c854b62cf5bef562a3400df 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/page-tree/page-tree-element.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/page-tree/page-tree-element.js @@ -45,7 +45,7 @@ var __decorate=function(e,t,o,i){var n,s=arguments.length,r=s<3?t:null===i?i=Obj <div class="svg-toolbar__submenu"> ${this.tree?.settings?.doktypes?.length?this.tree.settings.doktypes.map((e=>html` <div class="svg-toolbar__menuitem svg-toolbar__drag-node" data-tree-icon="${e.icon}" data-node-type="${e.nodeType}" - title="${e.title}" tooltip="${e.tooltip}"> + title="${e.title}"> <typo3-backend-icon identifier="${e.icon}" size="small"></typo3-backend-icon> </div> `)):""} @@ -78,4 +78,4 @@ var __decorate=function(e,t,o,i){var n,s=arguments.length,r=s<3?t:null===i?i=Obj </ul> </div> </div> - `}dragToolbar(e,t){return t.connectDragHandler(new ToolbarDragHandler(e,this.tree,t))}};__decorate([property({type:EditablePageTree})],PageTreeToolbar.prototype,"tree",void 0),PageTreeToolbar=__decorate([customElement("typo3-backend-navigation-component-pagetree-toolbar")],PageTreeToolbar);class PageTreeDragDrop extends DragDrop{getDropCommandDetails(e,t="",o=null){const i=this.tree.nodes,n=o.identifier;let s=this.tree.settings.nodeDragPosition,r=e||o;if(n===r.identifier&&"delete"!==t)return null;if(s===DraggablePositionEnum.BEFORE){const t=i.indexOf(e),o=this.setNodePositionAndTarget(t);if(null===o)return null;s=o.position,r=o.target}return{node:o,uid:n,target:r,position:s,command:t}}updateStateOfHoveredNode(e){const t=this.tree.svg.select(".node-over");if(t.size()&&this.tree.isOverSvg){this.createPositioningLine();let o=d3selection.pointer(e,t.node())[1];o<3?(this.updatePositioningLine(this.tree.hoveredNode),0===this.tree.hoveredNode.depth?this.addNodeDdClass("nodrop"):this.tree.hoveredNode.firstChild?this.addNodeDdClass("ok-above"):this.addNodeDdClass("ok-between"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.BEFORE):o>17?(this.hidePositioningLine(),this.tree.hoveredNode.expanded&&this.tree.hoveredNode.hasChildren?(this.addNodeDdClass("ok-append"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.INSIDE):(this.updatePositioningLine(this.tree.hoveredNode),this.tree.hoveredNode.lastChild?this.addNodeDdClass("ok-below"):this.addNodeDdClass("ok-between"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.AFTER)):(this.hidePositioningLine(),this.addNodeDdClass("ok-append"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.INSIDE)}else this.hidePositioningLine(),this.addNodeDdClass("nodrop")}setNodePositionAndTarget(e){const t=this.tree.nodes,o=t[e].depth;e>0&&e--;const i=t[e].depth,n=this.tree.nodes[e];if(i===o)return{position:DraggablePositionEnum.AFTER,target:n};if(i<o)return{position:DraggablePositionEnum.INSIDE,target:n};for(let i=e;i>=0;i--){if(t[i].depth===o)return{position:DraggablePositionEnum.AFTER,target:this.tree.nodes[i]};if(t[i].depth<o)return{position:DraggablePositionEnum.AFTER,target:t[i]}}return null}isDropAllowed(e,t){return!!this.tree.settings.allowDragMove&&(!!this.tree.isOverSvg&&(!!this.tree.hoveredNode&&(!t.isOver&&!this.isTheSameNode(e,t))))}}class ToolbarDragHandler{constructor(e,t,o){this.dragStarted=!1,this.startPageX=0,this.startPageY=0,this.id="",this.name="",this.tooltip="",this.icon="",this.id=e.nodeType,this.name=e.title,this.tooltip=e.tooltip,this.icon=e.icon,this.tree=t,this.dragDrop=o}onDragStart(e,t){return this.dragStarted=!1,this.startPageX=e.pageX,this.startPageY=e.pageY,!0}onDragOver(e,t){return!!this.dragDrop.isDragNodeDistanceMore(e,this)&&(this.dragStarted=!0,this.dragDrop.getDraggable()||this.dragDrop.createDraggable("#icon-"+this.icon,this.name),this.dragDrop.openNodeTimeout(),this.dragDrop.updateDraggablePosition(e),this.dragDrop.updateStateOfHoveredNode(e),!0)}onDrop(e,t){return!!this.dragStarted&&(this.dragDrop.cleanupDrop(),!!this.dragDrop.isDropAllowed(this.tree.hoveredNode,t)&&(this.addNewNode({type:this.id,name:this.name,tooltip:this.tooltip,icon:this.icon,position:this.tree.settings.nodeDragPosition,target:this.tree.hoveredNode}),!0))}addNewNode(e){const t=e.target;let o=this.tree.nodes.indexOf(t);const i={};if(this.tree.disableFocusedNodes(),i.focused=!0,this.tree.updateVisibleNodes(),i.command="new",i.type=e.type,i.identifier="-1",i.target=t,i.parents=t.parents,i.parentsStateIdentifier=t.parentsStateIdentifier,i.depth=t.depth,i.position=e.position,i.name=void 0!==e.title?e.title:TYPO3.lang["tree.defaultPageTitle"],i.y=i.y||i.target.y,i.x=i.x||i.target.x,this.tree.nodeIsEdit=!0,e.position===DraggablePositionEnum.INSIDE&&(i.depth++,i.parents.unshift(o),i.parentsStateIdentifier.unshift(this.tree.nodes[o].stateIdentifier),this.tree.nodes[o].hasChildren=!0,this.tree.showChildren(this.tree.nodes[o])),e.position!==DraggablePositionEnum.INSIDE&&e.position!==DraggablePositionEnum.AFTER||o++,e.icon&&(i.icon=e.icon),i.position===DraggablePositionEnum.BEFORE){const e=this.dragDrop.setNodePositionAndTarget(o);null!==e&&(i.position=e.position,i.target=e.target)}this.tree.nodes.splice(o,0,i),this.tree.setParametersNode(),this.tree.prepareDataForVisibleNodes(),this.tree.updateVisibleNodes(),this.tree.removeEditedText(),d3selection.select(this.tree.svg.node().parentNode).append("input").attr("class","node-edit").style("top",i.y+this.tree.settings.marginTop+"px").style("left",i.x+this.tree.textPosition+5+"px").style("width","calc(100% - "+(i.x+this.tree.textPosition+5)+"px)").style("height",this.tree.settings.nodeHeight+"px").attr("text","text").attr("value",i.name).on("keydown",(e=>{const t=e.target,o=e.keyCode;if(13===o||9===o){this.tree.nodeIsEdit=!1;const e=t.value.trim();e.length?(i.name=e,this.tree.removeEditedText(),this.tree.sendChangeCommand(i)):this.removeNode(i)}else 27===o&&(this.tree.nodeIsEdit=!1,this.removeNode(i))})).on("blur",(e=>{if(this.tree.nodeIsEdit&&this.tree.nodes.indexOf(i)>-1){const t=e.target.value.trim();t.length?(i.name=t,this.tree.removeEditedText(),this.tree.sendChangeCommand(i)):this.removeNode(i)}})).node().select()}removeNode(e){let t=this.tree.nodes.indexOf(e);this.tree.nodes[t-1].depth==e.depth||this.tree.nodes[t+1]&&this.tree.nodes[t+1].depth==e.depth||(this.tree.nodes[t-1].hasChildren=!1),this.tree.nodes.splice(t,1),this.tree.setParametersNode(),this.tree.prepareDataForVisibleNodes(),this.tree.updateVisibleNodes(),this.tree.removeEditedText()}}class PageTreeNodeDragHandler{constructor(e,t){this.dragStarted=!1,this.startPageX=0,this.startPageY=0,this.nodeIsOverDelete=!1,this.tree=e,this.dragDrop=t}onDragStart(e,t){return!0===this.tree.settings.allowDragMove&&0!==t.depth&&(this.dropZoneDelete=null,t.allowDelete&&(this.dropZoneDelete=this.tree.nodesContainer.select('.node[data-state-id="'+t.stateIdentifier+'"]').append("g").attr("class","nodes-drop-zone").attr("height",this.tree.settings.nodeHeight),this.nodeIsOverDelete=!1,this.dropZoneDelete.append("rect").attr("height",this.tree.settings.nodeHeight).attr("width","50px").attr("x",0).attr("y",0).on("mouseover",(()=>{this.nodeIsOverDelete=!0})).on("mouseout",(()=>{this.nodeIsOverDelete=!1})),this.dropZoneDelete.append("text").text(TYPO3.lang.deleteItem).attr("x",5).attr("y",this.tree.settings.nodeHeight/2+4),this.dropZoneDelete.node().dataset.open="false",this.dropZoneDelete.node().style.transform=this.getDropZoneCloseTransform(t)),this.startPageX=e.pageX,this.startPageY=e.pageY,this.dragStarted=!1,!0)}onDragOver(e,t){return!!this.dragDrop.isDragNodeDistanceMore(e,this)&&(this.dragStarted=!0,!0===this.tree.settings.allowDragMove&&0!==t.depth&&(this.dragDrop.getDraggable()||this.dragDrop.createDraggableFromExistingNode(t),this.tree.settings.nodeDragPosition=!1,this.dragDrop.openNodeTimeout(),this.dragDrop.updateDraggablePosition(e),this.dragDrop.isDropAllowed(this.tree.hoveredNode,t)?this.tree.hoveredNode?this.dropZoneDelete&&"false"!==this.dropZoneDelete.node().dataset.open?this.animateDropZone("hide",this.dropZoneDelete.node(),t):this.dragDrop.updateStateOfHoveredNode(e):(this.dragDrop.addNodeDdClass("nodrop"),this.dragDrop.hidePositioningLine()):(this.dragDrop.addNodeDdClass("nodrop"),this.tree.isOverSvg||this.dragDrop.hidePositioningLine(),this.dropZoneDelete&&"true"!==this.dropZoneDelete.node().dataset.open&&this.tree.isOverSvg&&this.animateDropZone("show",this.dropZoneDelete.node(),t)),!0))}onDrop(e,t){if(this.dropZoneDelete&&"true"===this.dropZoneDelete.node().dataset.open){const e=this.dropZoneDelete;this.animateDropZone("hide",this.dropZoneDelete.node(),t,(()=>{e.remove(),this.dropZoneDelete=null}))}else this.dropZoneDelete&&"false"===this.dropZoneDelete.node().dataset.open?(this.dropZoneDelete.remove(),this.dropZoneDelete=null):this.dropZoneDelete=null;if(!this.dragStarted||!0!==this.tree.settings.allowDragMove||0===t.depth)return!1;if(this.dragDrop.cleanupDrop(),this.dragDrop.isDropAllowed(this.tree.hoveredNode,t)){const e=this.dragDrop.getDropCommandDetails(this.tree.hoveredNode,"",t);if(null===e)return!1;let o=e.position===DraggablePositionEnum.INSIDE?TYPO3.lang["mess.move_into"]:TYPO3.lang["mess.move_after"];o=o.replace("%s",e.node.name).replace("%s",e.target.name);const i=Modal.confirm(TYPO3.lang.move_page,o,Severity.warning,[{text:TYPO3.lang["labels.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:TYPO3.lang["cm.copy"]||"Copy",btnClass:"btn-warning",name:"copy"},{text:TYPO3.lang["labels.move"]||"Move",btnClass:"btn-warning",name:"move"}]);i.addEventListener("button.clicked",(t=>{const o=t.target;"move"===o.name?(e.command="move",this.tree.sendChangeCommand(e)):"copy"===o.name&&(e.command="copy",this.tree.sendChangeCommand(e)),i.hideModal()}))}else if(this.nodeIsOverDelete){const e=this.dragDrop.getDropCommandDetails(this.tree.hoveredNode,"delete",t);if(null===e)return!1;if(this.tree.settings.displayDeleteConfirmation){Modal.confirm(TYPO3.lang["mess.delete.title"],TYPO3.lang["mess.delete"].replace("%s",e.node.name),Severity.warning,[{text:TYPO3.lang["labels.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:TYPO3.lang.delete||"Delete",btnClass:"btn-warning",name:"delete"}]).addEventListener("button.clicked",(t=>{"delete"===t.target.name&&this.tree.sendChangeCommand(e),Modal.dismiss()}))}else this.tree.sendChangeCommand(e)}return!0}getDropZoneOpenTransform(e){return"translate("+((parseFloat(this.tree.svg.style("width"))||300)-58-e.x)+"px, "+this.tree.settings.nodeHeight/2*-1+"px)"}getDropZoneCloseTransform(e){return"translate("+((parseFloat(this.tree.svg.style("width"))||300)-e.x)+"px, "+this.tree.settings.nodeHeight/2*-1+"px)"}animateDropZone(e,t,o,i=null){t.classList.add("animating"),t.dataset.open="show"===e?"true":"false";let n=[{transform:this.getDropZoneCloseTransform(o)},{transform:this.getDropZoneOpenTransform(o)}];"show"!==e&&(n=n.reverse());const s=function(){t.style.transform=n[1].transform,t.classList.remove("animating"),i&&i()};"animate"in t?t.animate(n,{duration:300,easing:"cubic-bezier(.02, .01, .47, 1)"}).onfinish=s:s()}} \ No newline at end of file + `}dragToolbar(e,t){return t.connectDragHandler(new ToolbarDragHandler(e,this.tree,t))}};__decorate([property({type:EditablePageTree})],PageTreeToolbar.prototype,"tree",void 0),PageTreeToolbar=__decorate([customElement("typo3-backend-navigation-component-pagetree-toolbar")],PageTreeToolbar);class PageTreeDragDrop extends DragDrop{getDropCommandDetails(e,t="",o=null){const i=this.tree.nodes,n=o.identifier;let s=this.tree.settings.nodeDragPosition,r=e||o;if(n===r.identifier&&"delete"!==t)return null;if(s===DraggablePositionEnum.BEFORE){const t=i.indexOf(e),o=this.setNodePositionAndTarget(t);if(null===o)return null;s=o.position,r=o.target}return{node:o,uid:n,target:r,position:s,command:t}}updateStateOfHoveredNode(e){const t=this.tree.svg.select(".node-over");if(t.size()&&this.tree.isOverSvg){this.createPositioningLine();let o=d3selection.pointer(e,t.node())[1];o<3?(this.updatePositioningLine(this.tree.hoveredNode),0===this.tree.hoveredNode.depth?this.addNodeDdClass("nodrop"):this.tree.hoveredNode.firstChild?this.addNodeDdClass("ok-above"):this.addNodeDdClass("ok-between"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.BEFORE):o>17?(this.hidePositioningLine(),this.tree.hoveredNode.expanded&&this.tree.hoveredNode.hasChildren?(this.addNodeDdClass("ok-append"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.INSIDE):(this.updatePositioningLine(this.tree.hoveredNode),this.tree.hoveredNode.lastChild?this.addNodeDdClass("ok-below"):this.addNodeDdClass("ok-between"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.AFTER)):(this.hidePositioningLine(),this.addNodeDdClass("ok-append"),this.tree.settings.nodeDragPosition=DraggablePositionEnum.INSIDE)}else this.hidePositioningLine(),this.addNodeDdClass("nodrop")}setNodePositionAndTarget(e){const t=this.tree.nodes,o=t[e].depth;e>0&&e--;const i=t[e].depth,n=this.tree.nodes[e];if(i===o)return{position:DraggablePositionEnum.AFTER,target:n};if(i<o)return{position:DraggablePositionEnum.INSIDE,target:n};for(let i=e;i>=0;i--){if(t[i].depth===o)return{position:DraggablePositionEnum.AFTER,target:this.tree.nodes[i]};if(t[i].depth<o)return{position:DraggablePositionEnum.AFTER,target:t[i]}}return null}isDropAllowed(e,t){return!!this.tree.settings.allowDragMove&&(!!this.tree.isOverSvg&&(!!this.tree.hoveredNode&&(!t.isOver&&!this.isTheSameNode(e,t))))}}class ToolbarDragHandler{constructor(e,t,o){this.dragStarted=!1,this.startPageX=0,this.startPageY=0,this.id="",this.name="",this.icon="",this.id=e.nodeType,this.name=e.title,this.icon=e.icon,this.tree=t,this.dragDrop=o}onDragStart(e,t){return this.dragStarted=!1,this.startPageX=e.pageX,this.startPageY=e.pageY,!0}onDragOver(e,t){return!!this.dragDrop.isDragNodeDistanceMore(e,this)&&(this.dragStarted=!0,this.dragDrop.getDraggable()||this.dragDrop.createDraggable("#icon-"+this.icon,this.name),this.dragDrop.openNodeTimeout(),this.dragDrop.updateDraggablePosition(e),this.dragDrop.updateStateOfHoveredNode(e),!0)}onDrop(e,t){return!!this.dragStarted&&(this.dragDrop.cleanupDrop(),!!this.dragDrop.isDropAllowed(this.tree.hoveredNode,t)&&(this.addNewNode({type:this.id,name:this.name,icon:this.icon,position:this.tree.settings.nodeDragPosition,target:this.tree.hoveredNode}),!0))}addNewNode(e){const t=e.target;let o=this.tree.nodes.indexOf(t);const i={};if(this.tree.disableFocusedNodes(),i.focused=!0,this.tree.updateVisibleNodes(),i.command="new",i.type=e.type,i.identifier="-1",i.target=t,i.parents=t.parents,i.parentsStateIdentifier=t.parentsStateIdentifier,i.depth=t.depth,i.position=e.position,i.name=void 0!==e.title?e.title:TYPO3.lang["tree.defaultPageTitle"],i.y=i.y||i.target.y,i.x=i.x||i.target.x,this.tree.nodeIsEdit=!0,e.position===DraggablePositionEnum.INSIDE&&(i.depth++,i.parents.unshift(o),i.parentsStateIdentifier.unshift(this.tree.nodes[o].stateIdentifier),this.tree.nodes[o].hasChildren=!0,this.tree.showChildren(this.tree.nodes[o])),e.position!==DraggablePositionEnum.INSIDE&&e.position!==DraggablePositionEnum.AFTER||o++,e.icon&&(i.icon=e.icon),i.position===DraggablePositionEnum.BEFORE){const e=this.dragDrop.setNodePositionAndTarget(o);null!==e&&(i.position=e.position,i.target=e.target)}this.tree.nodes.splice(o,0,i),this.tree.setParametersNode(),this.tree.prepareDataForVisibleNodes(),this.tree.updateVisibleNodes(),this.tree.removeEditedText(),d3selection.select(this.tree.svg.node().parentNode).append("input").attr("class","node-edit").style("top",i.y+this.tree.settings.marginTop+"px").style("left",i.x+this.tree.textPosition+5+"px").style("width","calc(100% - "+(i.x+this.tree.textPosition+5)+"px)").style("height",this.tree.settings.nodeHeight+"px").attr("text","text").attr("value",i.name).on("keydown",(e=>{const t=e.target,o=e.keyCode;if(13===o||9===o){this.tree.nodeIsEdit=!1;const e=t.value.trim();e.length?(i.name=e,this.tree.removeEditedText(),this.tree.sendChangeCommand(i)):this.removeNode(i)}else 27===o&&(this.tree.nodeIsEdit=!1,this.removeNode(i))})).on("blur",(e=>{if(this.tree.nodeIsEdit&&this.tree.nodes.indexOf(i)>-1){const t=e.target.value.trim();t.length?(i.name=t,this.tree.removeEditedText(),this.tree.sendChangeCommand(i)):this.removeNode(i)}})).node().select()}removeNode(e){let t=this.tree.nodes.indexOf(e);this.tree.nodes[t-1].depth==e.depth||this.tree.nodes[t+1]&&this.tree.nodes[t+1].depth==e.depth||(this.tree.nodes[t-1].hasChildren=!1),this.tree.nodes.splice(t,1),this.tree.setParametersNode(),this.tree.prepareDataForVisibleNodes(),this.tree.updateVisibleNodes(),this.tree.removeEditedText()}}class PageTreeNodeDragHandler{constructor(e,t){this.dragStarted=!1,this.startPageX=0,this.startPageY=0,this.nodeIsOverDelete=!1,this.tree=e,this.dragDrop=t}onDragStart(e,t){return!0===this.tree.settings.allowDragMove&&0!==t.depth&&(this.dropZoneDelete=null,t.allowDelete&&(this.dropZoneDelete=this.tree.nodesContainer.select('.node[data-state-id="'+t.stateIdentifier+'"]').append("g").attr("class","nodes-drop-zone").attr("height",this.tree.settings.nodeHeight),this.nodeIsOverDelete=!1,this.dropZoneDelete.append("rect").attr("height",this.tree.settings.nodeHeight).attr("width","50px").attr("x",0).attr("y",0).on("mouseover",(()=>{this.nodeIsOverDelete=!0})).on("mouseout",(()=>{this.nodeIsOverDelete=!1})),this.dropZoneDelete.append("text").text(TYPO3.lang.deleteItem).attr("x",5).attr("y",this.tree.settings.nodeHeight/2+4),this.dropZoneDelete.node().dataset.open="false",this.dropZoneDelete.node().style.transform=this.getDropZoneCloseTransform(t)),this.startPageX=e.pageX,this.startPageY=e.pageY,this.dragStarted=!1,!0)}onDragOver(e,t){return!!this.dragDrop.isDragNodeDistanceMore(e,this)&&(this.dragStarted=!0,!0===this.tree.settings.allowDragMove&&0!==t.depth&&(this.dragDrop.getDraggable()||this.dragDrop.createDraggableFromExistingNode(t),this.tree.settings.nodeDragPosition=!1,this.dragDrop.openNodeTimeout(),this.dragDrop.updateDraggablePosition(e),this.dragDrop.isDropAllowed(this.tree.hoveredNode,t)?this.tree.hoveredNode?this.dropZoneDelete&&"false"!==this.dropZoneDelete.node().dataset.open?this.animateDropZone("hide",this.dropZoneDelete.node(),t):this.dragDrop.updateStateOfHoveredNode(e):(this.dragDrop.addNodeDdClass("nodrop"),this.dragDrop.hidePositioningLine()):(this.dragDrop.addNodeDdClass("nodrop"),this.tree.isOverSvg||this.dragDrop.hidePositioningLine(),this.dropZoneDelete&&"true"!==this.dropZoneDelete.node().dataset.open&&this.tree.isOverSvg&&this.animateDropZone("show",this.dropZoneDelete.node(),t)),!0))}onDrop(e,t){if(this.dropZoneDelete&&"true"===this.dropZoneDelete.node().dataset.open){const e=this.dropZoneDelete;this.animateDropZone("hide",this.dropZoneDelete.node(),t,(()=>{e.remove(),this.dropZoneDelete=null}))}else this.dropZoneDelete&&"false"===this.dropZoneDelete.node().dataset.open?(this.dropZoneDelete.remove(),this.dropZoneDelete=null):this.dropZoneDelete=null;if(!this.dragStarted||!0!==this.tree.settings.allowDragMove||0===t.depth)return!1;if(this.dragDrop.cleanupDrop(),this.dragDrop.isDropAllowed(this.tree.hoveredNode,t)){const e=this.dragDrop.getDropCommandDetails(this.tree.hoveredNode,"",t);if(null===e)return!1;let o=e.position===DraggablePositionEnum.INSIDE?TYPO3.lang["mess.move_into"]:TYPO3.lang["mess.move_after"];o=o.replace("%s",e.node.name).replace("%s",e.target.name);const i=Modal.confirm(TYPO3.lang.move_page,o,Severity.warning,[{text:TYPO3.lang["labels.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:TYPO3.lang["cm.copy"]||"Copy",btnClass:"btn-warning",name:"copy"},{text:TYPO3.lang["labels.move"]||"Move",btnClass:"btn-warning",name:"move"}]);i.addEventListener("button.clicked",(t=>{const o=t.target;"move"===o.name?(e.command="move",this.tree.sendChangeCommand(e)):"copy"===o.name&&(e.command="copy",this.tree.sendChangeCommand(e)),i.hideModal()}))}else if(this.nodeIsOverDelete){const e=this.dragDrop.getDropCommandDetails(this.tree.hoveredNode,"delete",t);if(null===e)return!1;if(this.tree.settings.displayDeleteConfirmation){Modal.confirm(TYPO3.lang["mess.delete.title"],TYPO3.lang["mess.delete"].replace("%s",e.node.name),Severity.warning,[{text:TYPO3.lang["labels.cancel"]||"Cancel",active:!0,btnClass:"btn-default",name:"cancel"},{text:TYPO3.lang.delete||"Delete",btnClass:"btn-warning",name:"delete"}]).addEventListener("button.clicked",(t=>{"delete"===t.target.name&&this.tree.sendChangeCommand(e),Modal.dismiss()}))}else this.tree.sendChangeCommand(e)}return!0}getDropZoneOpenTransform(e){return"translate("+((parseFloat(this.tree.svg.style("width"))||300)-58-e.x)+"px, "+this.tree.settings.nodeHeight/2*-1+"px)"}getDropZoneCloseTransform(e){return"translate("+((parseFloat(this.tree.svg.style("width"))||300)-e.x)+"px, "+this.tree.settings.nodeHeight/2*-1+"px)"}animateDropZone(e,t,o,i=null){t.classList.add("animating"),t.dataset.open="show"===e?"true":"false";let n=[{transform:this.getDropZoneCloseTransform(o)},{transform:this.getDropZoneOpenTransform(o)}];"show"!==e&&(n=n.reverse());const s=function(){t.style.transform=n[1].transform,t.classList.remove("animating"),i&&i()};"animate"in t?t.animate(n,{duration:300,easing:"cubic-bezier(.02, .01, .47, 1)"}).onfinish=s:s()}} \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/recordlist.js b/typo3/sysext/backend/Resources/Public/JavaScript/recordlist.js index bffdeab76186d42d7aa4f4df66858bd45e6172e8..3c9f307c59bf4b1976683ced5cffdad5dd3fc945 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/recordlist.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/recordlist.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import $ from"jquery";import Icons from"@typo3/backend/icons.js";import PersistentStorage from"@typo3/backend/storage/persistent.js";import RegularEvent from"@typo3/core/event/regular-event.js";import Tooltip from"@typo3/backend/tooltip.js";import DocumentService from"@typo3/core/document-service.js";import{default as Modal}from"@typo3/backend/modal.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import Severity from"@typo3/backend/severity.js";import{MultiRecordSelectionSelectors}from"@typo3/backend/multi-record-selection.js";class Recordlist{constructor(){this.identifier={entity:".t3js-entity",toggle:".t3js-toggle-recordlist",localize:".t3js-action-localize",searchboxToolbar:"#db_list-searchbox-toolbar",searchboxToggle:".t3js-toggle-search-toolbox",searchField:"#search_field",icons:{collapse:"actions-view-list-collapse",expand:"actions-view-list-expand",editMultiple:".t3js-record-edit-multiple"}},this.toggleClick=(e,t)=>{e.preventDefault();const i=$(t),o=i.data("table"),a=$(i.data("bs-target")),l="expanded"===a.data("state"),n=i.find(".collapseIcon"),r=l?this.identifier.icons.expand:this.identifier.icons.collapse;Icons.getIcon(r,Icons.sizes.small).then((e=>{n.html(e)}));let s={};PersistentStorage.isset("moduleData.web_list.collapsedTables")&&(s=PersistentStorage.get("moduleData.web_list.collapsedTables"));const d={};d[o]=l?1:0,$.extend(s,d),PersistentStorage.set("moduleData.web_list.collapsedTables",s).then((()=>{a.data("state",l?"collapsed":"expanded")}))},this.onEditMultiple=e=>{e.preventDefault();let t="",i="",o="",a=[];if("multiRecordSelection:action:edit"===e.type){const o=e.detail,l=o.configuration;if(i=l.returnUrl||"",t=l.tableName||"",""===t)return;o.checkboxes.forEach((e=>{const t=e.closest(MultiRecordSelectionSelectors.elementSelector);null!==t&&t.dataset[l.idField]&&a.push(t.dataset[l.idField])}))}else{const l=e.currentTarget,n=l.closest("[data-table]");if(null===n)return;if(t=n.dataset.table||"",""===t)return;i=l.dataset.returnUrl||"",o=l.dataset.columnsOnly||"";const r=n.querySelectorAll(this.identifier.entity+'[data-uid][data-table="'+t+'"] td.col-selector input[type="checkbox"]:checked');if(r.length)r.forEach((e=>{a.push(e.closest(this.identifier.entity+'[data-uid][data-table="'+t+'"]').dataset.uid)}));else{const e=n.querySelectorAll(this.identifier.entity+'[data-uid][data-table="'+t+'"]');if(!e.length)return;e.forEach((e=>{a.push(e.dataset.uid)}))}}if(!a.length)return;let l=top.TYPO3.settings.FormEngine.moduleUrl+"&edit["+t+"]["+a.join(",")+"]=edit&returnUrl="+Recordlist.getReturnUrl(i);""!==o&&(l+="&columnsOnly="+o),window.location.href=l},this.disableButton=e=>{$(e.currentTarget).prop("disable",!0).addClass("disabled")},this.toggleSearchbox=()=>{const e=$(this.identifier.searchboxToolbar);e.toggle(),e.is(":visible")&&$(this.identifier.searchField).focus()},this.deleteRow=e=>{const t=$(`table[data-table="${e.table}"]`),i=t.find(`tr[data-uid="${e.uid}"]`),o=t.closest(".panel"),a=o.find(".panel-heading"),l=t.find(`[data-l10nparent="${e.uid}"]`),n=$().add(i).add(l);if(n.fadeTo("slow",.4,(()=>{n.slideUp("slow",(()=>{n.remove(),0===t.find("tbody tr").length&&o.slideUp("slow")}))})),"0"===i.data("l10nparent")||""===i.data("l10nparent")){const e=Number(a.find(".t3js-table-total-items").html());a.find(".t3js-table-total-items").text(e-1)}"pages"===e.table&&top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))},this.registerPaginationEvents=()=>{document.querySelectorAll(".t3js-recordlist-paging").forEach((e=>{e.addEventListener("keyup",(t=>{t.preventDefault();let i=parseInt(e.value,10);i<parseInt(e.min,10)&&(i=parseInt(e.min,10)),i>parseInt(e.max,10)&&(i=parseInt(e.max,10)),"Enter"===t.key&&i!==parseInt(e.dataset.currentpage,10)&&(window.location.href=e.dataset.currenturl+i.toString())}))}))},new RegularEvent("click",this.toggleClick).delegateTo(document,this.identifier.toggle),$(document).on("click",this.identifier.icons.editMultiple,this.onEditMultiple),$(document).on("click",this.identifier.localize,this.disableButton),$(document).on("click",this.identifier.searchboxToggle,this.toggleSearchbox),DocumentService.ready().then((()=>{Tooltip.initialize(".table-fit a[title]"),this.registerPaginationEvents()})),new RegularEvent("typo3:datahandler:process",this.handleDataHandlerResult.bind(this)).bindTo(document),new RegularEvent("multiRecordSelection:action:edit",this.onEditMultiple).bindTo(document),new RegularEvent("multiRecordSelection:action:delete",this.deleteMultiple).bindTo(document),new RegularEvent("multiRecordSelection:action:copyMarked",(e=>{Recordlist.submitClipboardFormWithCommand("copyMarked",e.target)})).bindTo(document),new RegularEvent("multiRecordSelection:action:removeMarked",(e=>{Recordlist.submitClipboardFormWithCommand("removeMarked",e.target)})).bindTo(document)}static submitClipboardFormWithCommand(e,t){const i=t.closest("form");if(!i)return;const o=i.querySelector('input[name="cmd"]');o&&(o.value=e,i.submit())}static getReturnUrl(e){return""===e&&(e=top.list_frame.document.location.pathname+top.list_frame.document.location.search),encodeURIComponent(e)}handleDataHandlerResult(e){const t=e.detail.payload;t.hasErrors||"datahandler"!==t.component&&"delete"===t.action&&this.deleteRow(t)}deleteMultiple(e){e.preventDefault();const t=e.detail.configuration;Modal.advanced({title:t.title||"Delete",content:t.content||"Are you sure you want to delete those records?",severity:SeverityEnum.warning,buttons:[{text:TYPO3.lang["button.close"]||"Close",active:!0,btnClass:"btn-default",trigger:(e,t)=>t.hideModal()},{text:t.ok||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+Severity.getCssClass(SeverityEnum.warning),trigger:(t,i)=>{i.hideModal(),Recordlist.submitClipboardFormWithCommand("delete",e.target)}}]})}}export default new Recordlist; \ No newline at end of file +import $ from"jquery";import Icons from"@typo3/backend/icons.js";import PersistentStorage from"@typo3/backend/storage/persistent.js";import RegularEvent from"@typo3/core/event/regular-event.js";import DocumentService from"@typo3/core/document-service.js";import{default as Modal}from"@typo3/backend/modal.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import Severity from"@typo3/backend/severity.js";import{MultiRecordSelectionSelectors}from"@typo3/backend/multi-record-selection.js";class Recordlist{constructor(){this.identifier={entity:".t3js-entity",toggle:".t3js-toggle-recordlist",localize:".t3js-action-localize",searchboxToolbar:"#db_list-searchbox-toolbar",searchboxToggle:".t3js-toggle-search-toolbox",searchField:"#search_field",icons:{collapse:"actions-view-list-collapse",expand:"actions-view-list-expand",editMultiple:".t3js-record-edit-multiple"}},this.toggleClick=(e,t)=>{e.preventDefault();const i=$(t),o=i.data("table"),a=$(i.data("bs-target")),n="expanded"===a.data("state"),l=i.find(".collapseIcon"),r=n?this.identifier.icons.expand:this.identifier.icons.collapse;Icons.getIcon(r,Icons.sizes.small).then((e=>{l.html(e)}));let s={};PersistentStorage.isset("moduleData.web_list.collapsedTables")&&(s=PersistentStorage.get("moduleData.web_list.collapsedTables"));const d={};d[o]=n?1:0,$.extend(s,d),PersistentStorage.set("moduleData.web_list.collapsedTables",s).then((()=>{a.data("state",n?"collapsed":"expanded")}))},this.onEditMultiple=e=>{e.preventDefault();let t="",i="",o="",a=[];if("multiRecordSelection:action:edit"===e.type){const o=e.detail,n=o.configuration;if(i=n.returnUrl||"",t=n.tableName||"",""===t)return;o.checkboxes.forEach((e=>{const t=e.closest(MultiRecordSelectionSelectors.elementSelector);null!==t&&t.dataset[n.idField]&&a.push(t.dataset[n.idField])}))}else{const n=e.currentTarget,l=n.closest("[data-table]");if(null===l)return;if(t=l.dataset.table||"",""===t)return;i=n.dataset.returnUrl||"",o=n.dataset.columnsOnly||"";const r=l.querySelectorAll(this.identifier.entity+'[data-uid][data-table="'+t+'"] td.col-selector input[type="checkbox"]:checked');if(r.length)r.forEach((e=>{a.push(e.closest(this.identifier.entity+'[data-uid][data-table="'+t+'"]').dataset.uid)}));else{const e=l.querySelectorAll(this.identifier.entity+'[data-uid][data-table="'+t+'"]');if(!e.length)return;e.forEach((e=>{a.push(e.dataset.uid)}))}}if(!a.length)return;let n=top.TYPO3.settings.FormEngine.moduleUrl+"&edit["+t+"]["+a.join(",")+"]=edit&returnUrl="+Recordlist.getReturnUrl(i);""!==o&&(n+="&columnsOnly="+o),window.location.href=n},this.disableButton=e=>{$(e.currentTarget).prop("disable",!0).addClass("disabled")},this.toggleSearchbox=()=>{const e=$(this.identifier.searchboxToolbar);e.toggle(),e.is(":visible")&&$(this.identifier.searchField).focus()},this.deleteRow=e=>{const t=$(`table[data-table="${e.table}"]`),i=t.find(`tr[data-uid="${e.uid}"]`),o=t.closest(".panel"),a=o.find(".panel-heading"),n=t.find(`[data-l10nparent="${e.uid}"]`),l=$().add(i).add(n);if(l.fadeTo("slow",.4,(()=>{l.slideUp("slow",(()=>{l.remove(),0===t.find("tbody tr").length&&o.slideUp("slow")}))})),"0"===i.data("l10nparent")||""===i.data("l10nparent")){const e=Number(a.find(".t3js-table-total-items").html());a.find(".t3js-table-total-items").text(e-1)}"pages"===e.table&&top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))},this.registerPaginationEvents=()=>{document.querySelectorAll(".t3js-recordlist-paging").forEach((e=>{e.addEventListener("keyup",(t=>{t.preventDefault();let i=parseInt(e.value,10);i<parseInt(e.min,10)&&(i=parseInt(e.min,10)),i>parseInt(e.max,10)&&(i=parseInt(e.max,10)),"Enter"===t.key&&i!==parseInt(e.dataset.currentpage,10)&&(window.location.href=e.dataset.currenturl+i.toString())}))}))},new RegularEvent("click",this.toggleClick).delegateTo(document,this.identifier.toggle),$(document).on("click",this.identifier.icons.editMultiple,this.onEditMultiple),$(document).on("click",this.identifier.localize,this.disableButton),$(document).on("click",this.identifier.searchboxToggle,this.toggleSearchbox),DocumentService.ready().then((()=>{this.registerPaginationEvents()})),new RegularEvent("typo3:datahandler:process",this.handleDataHandlerResult.bind(this)).bindTo(document),new RegularEvent("multiRecordSelection:action:edit",this.onEditMultiple).bindTo(document),new RegularEvent("multiRecordSelection:action:delete",this.deleteMultiple).bindTo(document),new RegularEvent("multiRecordSelection:action:copyMarked",(e=>{Recordlist.submitClipboardFormWithCommand("copyMarked",e.target)})).bindTo(document),new RegularEvent("multiRecordSelection:action:removeMarked",(e=>{Recordlist.submitClipboardFormWithCommand("removeMarked",e.target)})).bindTo(document)}static submitClipboardFormWithCommand(e,t){const i=t.closest("form");if(!i)return;const o=i.querySelector('input[name="cmd"]');o&&(o.value=e,i.submit())}static getReturnUrl(e){return""===e&&(e=top.list_frame.document.location.pathname+top.list_frame.document.location.search),encodeURIComponent(e)}handleDataHandlerResult(e){const t=e.detail.payload;t.hasErrors||"datahandler"!==t.component&&"delete"===t.action&&this.deleteRow(t)}deleteMultiple(e){e.preventDefault();const t=e.detail.configuration;Modal.advanced({title:t.title||"Delete",content:t.content||"Are you sure you want to delete those records?",severity:SeverityEnum.warning,buttons:[{text:TYPO3.lang["button.close"]||"Close",active:!0,btnClass:"btn-default",trigger:(e,t)=>t.hideModal()},{text:t.ok||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+Severity.getCssClass(SeverityEnum.warning),trigger:(t,i)=>{i.hideModal(),Recordlist.submitClipboardFormWithCommand("delete",e.target)}}]})}}export default new Recordlist; \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js b/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js index 2dc84c387f1c364a901859cb1d9a1426c462585b..1f3dd98fc80364b85776139dbdeabcf5793be8a4 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/svg-tree.js @@ -10,7 +10,7 @@ * * The TYPO3 project - inspiring people to share! */ -var __decorate=function(e,t,s,i){var o,n=arguments.length,r=n<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,s,i);else for(var a=e.length-1;a>=0;a--)(o=e[a])&&(r=(n<3?o(r):n>3?o(t,s,r):o(t,s))||r);return n>3&&r&&Object.defineProperty(t,s,r),r};import{html,LitElement}from"lit";import{customElement,property,state}from"lit/decorators.js";import*as d3selection from"d3-selection";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import Notification from"@typo3/backend/notification.js";import{KeyTypesEnum as KeyTypes}from"@typo3/backend/enum/key-types.js";import Icons from"@typo3/backend/icons.js";import Tooltip from"@typo3/backend/tooltip.js";import{MarkupIdentifiers}from"@typo3/backend/enum/icon-types.js";import{lll}from"@typo3/core/lit-helper.js";import DebounceEvent from"@typo3/core/event/debounce-event.js";import"@typo3/backend/element/icon-element.js";export class SvgTree extends LitElement{constructor(){super(...arguments),this.setup=null,this.settings={showIcons:!1,marginTop:15,nodeHeight:26,icon:{size:16,containerSize:20},indentWidth:20,width:300,duration:400,dataUrl:"",filterUrl:"",defaultProperties:{},expandUpToLevel:null,actions:[]},this.isOverSvg=!1,this.svg=null,this.container=null,this.nodesContainer=null,this.nodesBgContainer=null,this.hoveredNode=null,this.nodes=[],this.textPosition=10,this.icons={},this.nodesActionsContainer=null,this.iconsContainer=null,this.linksContainer=null,this.data=new class{constructor(){this.links=[],this.nodes=[]}},this.viewportHeight=0,this.scrollBottom=0,this.searchTerm=null,this.unfilteredNodes="",this.networkErrorTitle=top.TYPO3.lang.tree_networkError,this.networkErrorMessage=top.TYPO3.lang.tree_networkErrorDescription,this.tooltipOptions={}}doSetup(e){Object.assign(this.settings,e),this.settings.showIcons&&(this.textPosition+=this.settings.icon.containerSize),this.svg=d3selection.select(this).select("svg"),this.container=this.svg.select(".nodes-wrapper"),this.nodesBgContainer=this.container.select(".nodes-bg"),this.nodesActionsContainer=this.container.select(".nodes-actions"),this.linksContainer=this.container.select(".links"),this.nodesContainer=this.container.select(".nodes"),this.iconsContainer=this.svg.select("defs"),this.tooltipOptions={delay:50,trigger:"hover",placement:"right",container:void 0!==this.settings.id?"#"+this.settings.id:"body"},this.updateScrollPosition(),this.loadCommonIcons(),this.loadData(),this.dispatchEvent(new Event("svg-tree:initialized"))}loadCommonIcons(){this.fetchIcon("actions-chevron-right",!1),this.fetchIcon("overlay-backenduser",!1),this.fetchIcon("actions-caret-right",!1),this.fetchIcon("actions-link",!1)}focusElement(e){if(null===e)return;e.parentNode.querySelectorAll("[tabindex]").forEach((e=>{e.setAttribute("tabindex","-1")})),e.setAttribute("tabindex","0"),e.focus()}focusNode(e){this.disableFocusedNodes(),e.focused=!0,this.focusElement(this.getElementFromNode(e))}getNodeFromElement(e){return null!==e&&"stateId"in e.dataset?this.getNodeByIdentifier(e.dataset.stateId):null}getElementFromNode(e){return this.querySelector("#identifier-"+this.getNodeStateIdentifier(e))}loadData(){this.nodesAddPlaceholder(),new AjaxRequest(this.settings.dataUrl).get({cache:"no-cache"}).then((e=>e.resolve())).then((e=>{const t=Array.isArray(e)?e:[];this.replaceData(t),this.nodesRemovePlaceholder(),this.updateScrollPosition(),this.updateVisibleNodes()})).catch((e=>{throw this.errorNotification(e,!1),this.nodesRemovePlaceholder(),e}))}replaceData(e){this.setParametersNode(e),this.prepareDataForVisibleNodes(),this.nodesContainer.selectAll(".node").remove(),this.nodesBgContainer.selectAll(".node-bg").remove(),this.nodesActionsContainer.selectAll(".node-action").remove(),this.linksContainer.selectAll(".link").remove(),this.updateVisibleNodes()}setParametersNode(e=null){1===(e=(e=e||this.nodes).map(((t,s)=>{if(void 0===t.command&&(t=Object.assign({},this.settings.defaultProperties,t)),t.expanded=null!==this.settings.expandUpToLevel?t.depth<this.settings.expandUpToLevel:Boolean(t.expanded),t.parents=[],t.parentsStateIdentifier=[],t.depth>0){let i=t.depth;for(let o=s;o>=0;o--){let s=e[o];s.depth<i&&(t.parents.push(o),t.parentsStateIdentifier.push(e[o].stateIdentifier),i=s.depth)}}return void 0===t.checked&&(t.checked=!1),void 0===t.focused&&(t.focused=!1),t}))).filter((e=>0===e.depth)).length&&(e[0].expanded=!0);const t=new CustomEvent("typo3:svg-tree:nodes-prepared",{detail:{nodes:e},bubbles:!1});this.dispatchEvent(t),this.nodes=t.detail.nodes}nodesRemovePlaceholder(){const e=this.querySelector(".node-loader");e&&(e.style.display="none");const t=this.closest(".svg-tree")?.querySelector(".svg-tree-loader");t&&(t.style.display="none")}nodesAddPlaceholder(e=null){if(e){const t=this.querySelector(".node-loader");t&&(t.style.top=""+(e.y+this.settings.marginTop),t.style.display="block")}else{const e=this.closest(".svg-tree")?.querySelector(".svg-tree-loader");e&&(e.style.display="block")}}hideChildren(e){e.expanded=!1,this.setExpandedState(e),this.dispatchEvent(new CustomEvent("typo3:svg-tree:expand-toggle",{detail:{node:e}}))}showChildren(e){e.expanded=!0,this.setExpandedState(e),this.dispatchEvent(new CustomEvent("typo3:svg-tree:expand-toggle",{detail:{node:e}}))}setExpandedState(e){const t=this.getElementFromNode(e);t&&(e.hasChildren?t.setAttribute("aria-expanded",e.expanded?"true":"false"):t.removeAttribute("aria-expanded"))}refreshTree(){this.loadData()}refreshOrFilterTree(){""!==this.searchTerm?this.filter(this.searchTerm):this.refreshTree()}prepareDataForVisibleNodes(){const e={};this.nodes.forEach(((t,s)=>{t.expanded||(e[s]=!0)})),this.data.nodes=this.nodes.filter((t=>!0!==t.hidden&&!t.parents.some((t=>Boolean(e[t]))))),this.data.links=[];let t=0;this.data.nodes.forEach(((e,s)=>{e.x=e.depth*this.settings.indentWidth,e.readableRootline&&(t+=this.settings.nodeHeight),e.y=s*this.settings.nodeHeight+t,void 0!==e.parents[0]&&this.data.links.push({source:this.nodes[e.parents[0]],target:e}),this.settings.showIcons&&(this.fetchIcon(e.icon),this.fetchIcon(e.overlayIcon))})),this.svg.attr("height",this.data.nodes.length*this.settings.nodeHeight+this.settings.nodeHeight/2+t)}fetchIcon(e,t=!0){e&&(e in this.icons||(this.icons[e]={identifier:e,icon:null},Icons.getIcon(e,Icons.sizes.small,null,null,MarkupIdentifiers.inline).then((s=>{let i=s.match(/<svg[\s\S]*<\/svg>/i);if(i){let t=document.createRange().createContextualFragment(i[0]);this.icons[e].icon=t.firstElementChild}t&&this.updateVisibleNodes()}))))}updateVisibleNodes(){const e=Math.ceil(this.viewportHeight/this.settings.nodeHeight+1),t=Math.floor(Math.max(this.scrollTop-2*this.settings.nodeHeight,0)/this.settings.nodeHeight),s=this.data.nodes.slice(t,t+e),i=this.querySelector('[tabindex="0"]'),o=s.find((e=>e.focused)),n=s.find((e=>e.checked));let r=this.nodesContainer.selectAll(".node").data(s,(e=>e.stateIdentifier));const a=this.nodesBgContainer.selectAll(".node-bg").data(s,(e=>e.stateIdentifier)),d=this.nodesActionsContainer.selectAll(".node-action").data(s,(e=>e.stateIdentifier));r.exit().remove(),a.exit().remove(),d.exit().remove(),this.updateNodeActions(d);const l=this.updateNodeBgClass(a);l.attr("class",((e,t)=>this.getNodeBgClass(e,t,l))).attr("style",(e=>e.backgroundColor?"fill: "+e.backgroundColor+";":"")),this.updateLinks(),r=this.enterSvgElements(r),r.attr("tabindex",((e,t)=>{if(void 0!==o){if(o===e)return"0"}else if(void 0!==n){if(n===e)return"0"}else if(null===i){if(0===t)return"0"}else if(d3selection.select(i).datum()===e)return"0";return"-1"})).attr("transform",this.getNodeTransform).select(".node-name").html((e=>this.getNodeLabel(e))),r.select(".node-toggle").attr("class",this.getToggleClass).attr("visibility",this.getToggleVisibility),this.settings.showIcons&&(r.select("use.node-icon").attr("xlink:href",this.getIconId),r.select("use.node-icon-overlay").attr("xlink:href",this.getIconOverlayId),r.select("use.node-icon-locked").attr("xlink:href",(e=>"#icon-"+(e.locked?"overlay-backenduser":""))))}updateNodeBgClass(e){let t=this.settings.nodeHeight;return t-=1,e.enter().append("rect").merge(e).attr("width","100%").attr("height",t).attr("data-state-id",this.getNodeStateIdentifier).attr("transform",(e=>this.getNodeBackgroundTransform(e,this.settings.indentWidth,this.settings.nodeHeight))).on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).on("click",((e,t)=>{this.selectNode(t,!0),this.focusNode(t),this.updateVisibleNodes()})).on("contextmenu",((e,t)=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:t}}))}))}getIconId(e){return"#icon-"+e.icon}getIconOverlayId(e){return"#icon-"+e.overlayIcon}selectNode(e,t=!0){this.isNodeSelectable(e)&&(this.disableSelectedNodes(),this.disableFocusedNodes(),e.checked=!0,e.focused=!0,this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-selected",{detail:{node:e,propagate:t}})),this.updateVisibleNodes())}filter(e){"string"==typeof e&&(this.searchTerm=e),this.nodesAddPlaceholder(),this.searchTerm&&this.settings.filterUrl?new AjaxRequest(this.settings.filterUrl+"&q="+this.searchTerm).get({cache:"no-cache"}).then((e=>e.resolve())).then((e=>{let t=Array.isArray(e)?e:[];t.length>0&&(""===this.unfilteredNodes&&(this.unfilteredNodes=JSON.stringify(this.nodes)),this.replaceData(t)),this.nodesRemovePlaceholder()})).catch((e=>{throw this.errorNotification(e,!1),this.nodesRemovePlaceholder(),e})):this.resetFilter()}resetFilter(){if(this.searchTerm="",this.unfilteredNodes.length>0){let e=this.getSelectedNodes()[0];if(void 0===e)return void this.refreshTree();this.nodes=JSON.parse(this.unfilteredNodes),this.unfilteredNodes="";const t=this.getNodeByIdentifier(e.stateIdentifier);t?(this.selectNode(t,!1),this.focusNode(t),this.nodesRemovePlaceholder()):this.refreshTree()}else this.refreshTree();this.prepareDataForVisibleNodes(),this.updateVisibleNodes()}errorNotification(e=null,t=!1){if(Array.isArray(e))e.forEach((e=>{Notification.error(e.title,e.message)}));else{let t=this.networkErrorTitle;e&&e.target&&(e.target.status||e.target.statusText)&&(t+=" - "+(e.target.status||"")+" "+(e.target.statusText||"")),Notification.error(t,this.networkErrorMessage)}t&&this.loadData()}connectedCallback(){super.connectedCallback(),this.addEventListener("resize",(()=>this.updateView())),this.addEventListener("scroll",(()=>this.updateView())),this.addEventListener("svg-tree:visible",(()=>this.updateView())),window.addEventListener("resize",(()=>{this.getClientRects().length>0&&this.updateView()}))}getSelectedNodes(){return this.nodes.filter((e=>e.checked))}getFocusedNodes(){return this.nodes.filter((e=>e.focused))}disableFocusedNodes(){this.getFocusedNodes().forEach((e=>{!0===e.focused&&(e.focused=!1)}))}createRenderRoot(){return this}render(){return html` +var __decorate=function(e,t,s,i){var o,n=arguments.length,r=n<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,s,i);else for(var a=e.length-1;a>=0;a--)(o=e[a])&&(r=(n<3?o(r):n>3?o(t,s,r):o(t,s))||r);return n>3&&r&&Object.defineProperty(t,s,r),r};import{html,LitElement}from"lit";import{customElement,property,state}from"lit/decorators.js";import*as d3selection from"d3-selection";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import Notification from"@typo3/backend/notification.js";import{KeyTypesEnum as KeyTypes}from"@typo3/backend/enum/key-types.js";import Icons from"@typo3/backend/icons.js";import{MarkupIdentifiers}from"@typo3/backend/enum/icon-types.js";import{lll}from"@typo3/core/lit-helper.js";import DebounceEvent from"@typo3/core/event/debounce-event.js";import"@typo3/backend/element/icon-element.js";export class SvgTree extends LitElement{constructor(){super(...arguments),this.setup=null,this.settings={showIcons:!1,marginTop:15,nodeHeight:26,icon:{size:16,containerSize:20},indentWidth:20,width:300,duration:400,dataUrl:"",filterUrl:"",defaultProperties:{},expandUpToLevel:null,actions:[]},this.isOverSvg=!1,this.svg=null,this.container=null,this.nodesContainer=null,this.nodesBgContainer=null,this.hoveredNode=null,this.nodes=[],this.textPosition=10,this.icons={},this.nodesActionsContainer=null,this.iconsContainer=null,this.linksContainer=null,this.data=new class{constructor(){this.links=[],this.nodes=[]}},this.viewportHeight=0,this.scrollBottom=0,this.searchTerm=null,this.unfilteredNodes="",this.networkErrorTitle=top.TYPO3.lang.tree_networkError,this.networkErrorMessage=top.TYPO3.lang.tree_networkErrorDescription}doSetup(e){Object.assign(this.settings,e),this.settings.showIcons&&(this.textPosition+=this.settings.icon.containerSize),this.svg=d3selection.select(this).select("svg"),this.container=this.svg.select(".nodes-wrapper"),this.nodesBgContainer=this.container.select(".nodes-bg"),this.nodesActionsContainer=this.container.select(".nodes-actions"),this.linksContainer=this.container.select(".links"),this.nodesContainer=this.container.select(".nodes"),this.iconsContainer=this.svg.select("defs"),this.updateScrollPosition(),this.loadCommonIcons(),this.loadData(),this.dispatchEvent(new Event("svg-tree:initialized"))}loadCommonIcons(){this.fetchIcon("actions-chevron-right",!1),this.fetchIcon("overlay-backenduser",!1),this.fetchIcon("actions-caret-right",!1),this.fetchIcon("actions-link",!1)}focusElement(e){if(null===e)return;e.parentNode.querySelectorAll("[tabindex]").forEach((e=>{e.setAttribute("tabindex","-1")})),e.setAttribute("tabindex","0"),e.focus()}focusNode(e){this.disableFocusedNodes(),e.focused=!0,this.focusElement(this.getElementFromNode(e))}getNodeFromElement(e){return null!==e&&"stateId"in e.dataset?this.getNodeByIdentifier(e.dataset.stateId):null}getElementFromNode(e){return this.querySelector("#identifier-"+this.getNodeStateIdentifier(e))}loadData(){this.nodesAddPlaceholder(),new AjaxRequest(this.settings.dataUrl).get({cache:"no-cache"}).then((e=>e.resolve())).then((e=>{const t=Array.isArray(e)?e:[];this.replaceData(t),this.nodesRemovePlaceholder(),this.updateScrollPosition(),this.updateVisibleNodes()})).catch((e=>{throw this.errorNotification(e,!1),this.nodesRemovePlaceholder(),e}))}replaceData(e){this.setParametersNode(e),this.prepareDataForVisibleNodes(),this.nodesContainer.selectAll(".node").remove(),this.nodesBgContainer.selectAll(".node-bg").remove(),this.nodesActionsContainer.selectAll(".node-action").remove(),this.linksContainer.selectAll(".link").remove(),this.updateVisibleNodes()}setParametersNode(e=null){1===(e=(e=e||this.nodes).map(((t,s)=>{if(void 0===t.command&&(t=Object.assign({},this.settings.defaultProperties,t)),t.expanded=null!==this.settings.expandUpToLevel?t.depth<this.settings.expandUpToLevel:Boolean(t.expanded),t.parents=[],t.parentsStateIdentifier=[],t.depth>0){let i=t.depth;for(let o=s;o>=0;o--){let s=e[o];s.depth<i&&(t.parents.push(o),t.parentsStateIdentifier.push(e[o].stateIdentifier),i=s.depth)}}return void 0===t.checked&&(t.checked=!1),void 0===t.focused&&(t.focused=!1),t}))).filter((e=>0===e.depth)).length&&(e[0].expanded=!0);const t=new CustomEvent("typo3:svg-tree:nodes-prepared",{detail:{nodes:e},bubbles:!1});this.dispatchEvent(t),this.nodes=t.detail.nodes}nodesRemovePlaceholder(){const e=this.querySelector(".node-loader");e&&(e.style.display="none");const t=this.closest(".svg-tree")?.querySelector(".svg-tree-loader");t&&(t.style.display="none")}nodesAddPlaceholder(e=null){if(e){const t=this.querySelector(".node-loader");t&&(t.style.top=""+(e.y+this.settings.marginTop),t.style.display="block")}else{const e=this.closest(".svg-tree")?.querySelector(".svg-tree-loader");e&&(e.style.display="block")}}hideChildren(e){e.expanded=!1,this.setExpandedState(e),this.dispatchEvent(new CustomEvent("typo3:svg-tree:expand-toggle",{detail:{node:e}}))}showChildren(e){e.expanded=!0,this.setExpandedState(e),this.dispatchEvent(new CustomEvent("typo3:svg-tree:expand-toggle",{detail:{node:e}}))}setExpandedState(e){const t=this.getElementFromNode(e);t&&(e.hasChildren?t.setAttribute("aria-expanded",e.expanded?"true":"false"):t.removeAttribute("aria-expanded"))}refreshTree(){this.loadData()}refreshOrFilterTree(){""!==this.searchTerm?this.filter(this.searchTerm):this.refreshTree()}prepareDataForVisibleNodes(){const e={};this.nodes.forEach(((t,s)=>{t.expanded||(e[s]=!0)})),this.data.nodes=this.nodes.filter((t=>!0!==t.hidden&&!t.parents.some((t=>Boolean(e[t]))))),this.data.links=[];let t=0;this.data.nodes.forEach(((e,s)=>{e.x=e.depth*this.settings.indentWidth,e.readableRootline&&(t+=this.settings.nodeHeight),e.y=s*this.settings.nodeHeight+t,void 0!==e.parents[0]&&this.data.links.push({source:this.nodes[e.parents[0]],target:e}),this.settings.showIcons&&(this.fetchIcon(e.icon),this.fetchIcon(e.overlayIcon))})),this.svg.attr("height",this.data.nodes.length*this.settings.nodeHeight+this.settings.nodeHeight/2+t)}fetchIcon(e,t=!0){e&&(e in this.icons||(this.icons[e]={identifier:e,icon:null},Icons.getIcon(e,Icons.sizes.small,null,null,MarkupIdentifiers.inline).then((s=>{let i=s.match(/<svg[\s\S]*<\/svg>/i);if(i){let t=document.createRange().createContextualFragment(i[0]);this.icons[e].icon=t.firstElementChild}t&&this.updateVisibleNodes()}))))}updateVisibleNodes(){const e=Math.ceil(this.viewportHeight/this.settings.nodeHeight+1),t=Math.floor(Math.max(this.scrollTop-2*this.settings.nodeHeight,0)/this.settings.nodeHeight),s=this.data.nodes.slice(t,t+e),i=this.querySelector('[tabindex="0"]'),o=s.find((e=>e.focused)),n=s.find((e=>e.checked));let r=this.nodesContainer.selectAll(".node").data(s,(e=>e.stateIdentifier));const a=this.nodesBgContainer.selectAll(".node-bg").data(s,(e=>e.stateIdentifier)),d=this.nodesActionsContainer.selectAll(".node-action").data(s,(e=>e.stateIdentifier));r.exit().remove(),a.exit().remove(),d.exit().remove(),this.updateNodeActions(d);const l=this.updateNodeBgClass(a);l.attr("class",((e,t)=>this.getNodeBgClass(e,t,l))).attr("style",(e=>e.backgroundColor?"fill: "+e.backgroundColor+";":"")),this.updateLinks(),r=this.enterSvgElements(r),r.attr("tabindex",((e,t)=>{if(void 0!==o){if(o===e)return"0"}else if(void 0!==n){if(n===e)return"0"}else if(null===i){if(0===t)return"0"}else if(d3selection.select(i).datum()===e)return"0";return"-1"})).attr("transform",this.getNodeTransform).select(".node-name").html((e=>this.getNodeLabel(e))),r.select(".node-toggle").attr("class",this.getToggleClass).attr("visibility",this.getToggleVisibility),this.settings.showIcons&&(r.select("use.node-icon").attr("xlink:href",this.getIconId),r.select("use.node-icon-overlay").attr("xlink:href",this.getIconOverlayId),r.select("use.node-icon-locked").attr("xlink:href",(e=>"#icon-"+(e.locked?"overlay-backenduser":""))))}updateNodeBgClass(e){let t=this.settings.nodeHeight;return t-=1,e.enter().append("rect").merge(e).attr("width","100%").attr("height",t).attr("data-state-id",this.getNodeStateIdentifier).attr("transform",(e=>this.getNodeBackgroundTransform(e,this.settings.indentWidth,this.settings.nodeHeight))).on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).on("click",((e,t)=>{this.selectNode(t,!0),this.focusNode(t),this.updateVisibleNodes()})).on("contextmenu",((e,t)=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:t}}))}))}getIconId(e){return"#icon-"+e.icon}getIconOverlayId(e){return"#icon-"+e.overlayIcon}selectNode(e,t=!0){this.isNodeSelectable(e)&&(this.disableSelectedNodes(),this.disableFocusedNodes(),e.checked=!0,e.focused=!0,this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-selected",{detail:{node:e,propagate:t}})),this.updateVisibleNodes())}filter(e){"string"==typeof e&&(this.searchTerm=e),this.nodesAddPlaceholder(),this.searchTerm&&this.settings.filterUrl?new AjaxRequest(this.settings.filterUrl+"&q="+this.searchTerm).get({cache:"no-cache"}).then((e=>e.resolve())).then((e=>{let t=Array.isArray(e)?e:[];t.length>0&&(""===this.unfilteredNodes&&(this.unfilteredNodes=JSON.stringify(this.nodes)),this.replaceData(t)),this.nodesRemovePlaceholder()})).catch((e=>{throw this.errorNotification(e,!1),this.nodesRemovePlaceholder(),e})):this.resetFilter()}resetFilter(){if(this.searchTerm="",this.unfilteredNodes.length>0){let e=this.getSelectedNodes()[0];if(void 0===e)return void this.refreshTree();this.nodes=JSON.parse(this.unfilteredNodes),this.unfilteredNodes="";const t=this.getNodeByIdentifier(e.stateIdentifier);t?(this.selectNode(t,!1),this.focusNode(t),this.nodesRemovePlaceholder()):this.refreshTree()}else this.refreshTree();this.prepareDataForVisibleNodes(),this.updateVisibleNodes()}errorNotification(e=null,t=!1){if(Array.isArray(e))e.forEach((e=>{Notification.error(e.title,e.message)}));else{let t=this.networkErrorTitle;e&&e.target&&(e.target.status||e.target.statusText)&&(t+=" - "+(e.target.status||"")+" "+(e.target.statusText||"")),Notification.error(t,this.networkErrorMessage)}t&&this.loadData()}connectedCallback(){super.connectedCallback(),this.addEventListener("resize",(()=>this.updateView())),this.addEventListener("scroll",(()=>this.updateView())),this.addEventListener("svg-tree:visible",(()=>this.updateView())),window.addEventListener("resize",(()=>{this.getClientRects().length>0&&this.updateView()}))}getSelectedNodes(){return this.nodes.filter((e=>e.checked))}getFocusedNodes(){return this.nodes.filter((e=>e.focused))}disableFocusedNodes(){this.getFocusedNodes().forEach((e=>{!0===e.focused&&(e.focused=!1)}))}createRenderRoot(){return this}render(){return html` <div class="node-loader"> <typo3-backend-icon identifier="spinner-circle-light" size="small"></typo3-backend-icon> </div> @@ -27,7 +27,7 @@ var __decorate=function(e,t,s,i){var o,n=arguments.length,r=n<3?t:null===i?i=Obj </g> <defs></defs> </svg> - `}firstUpdated(){this.svg=d3selection.select(this.querySelector("svg")),this.container=d3selection.select(this.querySelector(".nodes-wrapper")).attr("transform","translate("+this.settings.indentWidth/2+","+this.settings.nodeHeight/2+")"),this.nodesBgContainer=d3selection.select(this.querySelector(".nodes-bg")),this.nodesActionsContainer=d3selection.select(this.querySelector(".nodes-actions")),this.linksContainer=d3selection.select(this.querySelector(".links")),this.nodesContainer=d3selection.select(this.querySelector(".nodes")),this.doSetup(this.setup||{}),this.updateView()}updateView(){this.updateScrollPosition(),this.updateVisibleNodes(),this.settings.actions&&this.settings.actions.length&&this.nodesActionsContainer.attr("transform","translate("+(this.querySelector("svg").clientWidth-16-16*this.settings.actions.length)+",0)")}disableSelectedNodes(){this.getSelectedNodes().forEach((e=>{!0===e.checked&&(e.checked=!1)}))}updateNodeActions(e){return this.settings.actions&&this.settings.actions.length?(this.nodesActionsContainer.selectAll(".node-action").selectChildren().remove(),e.enter().append("g").merge(e).attr("class","node-action").on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).attr("data-state-id",this.getNodeStateIdentifier).attr("transform",(e=>this.getNodeActionTransform(e,this.settings.indentWidth,this.settings.nodeHeight)))):e.enter()}createIconAreaForAction(e,t){const s=e.append("svg").attr("class","node-icon-container").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("x","0").attr("y","0");s.append("rect").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("y","0").attr("x","0").attr("class","node-icon-click");s.append("svg").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("y",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("x",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("class","node-icon-inner").append("use").attr("class","node-icon").attr("xlink:href","#icon-"+t)}isNodeSelectable(e){return!0}appendTextElement(e){return e.append("text").attr("dx",this.textPosition).attr("dy",5).attr("class","node-name").on("click",((e,t)=>{this.selectNode(t,!0),this.focusNode(t),this.updateVisibleNodes()}))}nodesUpdate(e){return(e=e.enter().append("g").attr("class","node").attr("id",(e=>"identifier-"+e.stateIdentifier)).attr("role","treeitem").attr("aria-owns",(e=>e.hasChildren?"group-identifier-"+e.stateIdentifier:null)).attr("aria-level",this.getNodeDepth).attr("aria-setsize",this.getNodeSetsize).attr("aria-posinset",this.getNodePositionInSet).attr("aria-expanded",(e=>e.hasChildren?e.expanded:null)).attr("transform",this.getNodeTransform).attr("data-state-id",this.getNodeStateIdentifier).attr("title",this.getNodeTitle).on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).on("contextmenu",((e,t)=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:t}}))}))).append("text").text((e=>e.readableRootline)).attr("class","node-rootline").attr("dx",0).attr("dy",this.settings.nodeHeight/2*-1).attr("visibility",(e=>e.readableRootline?"visible":"hidden")),e}getNodeIdentifier(e){return e.identifier}getNodeDepth(e){return e.depth}getNodeSetsize(e){return e.siblingsCount}getNodePositionInSet(e){return e.siblingsPosition}getNodeStateIdentifier(e){return e.stateIdentifier}getNodeLabel(e){let t=(e.prefix||"")+e.name+(e.suffix||"");const s=document.createElement("div");if(s.textContent=t,t=s.innerHTML,this.searchTerm){const e=new RegExp(this.searchTerm,"gi");t=t.replace(e,'<tspan class="node-highlight-text">$&</tspan>')}return t}getNodeByIdentifier(e){return this.nodes.find((t=>t.stateIdentifier===e))}getNodeBgClass(e,t,s){let i="node-bg",o=null,n=null;return"object"==typeof s&&(o=s.data()[t-1],n=s.data()[t+1]),e.checked&&(i+=" node-selected"),e.focused&&(i+=" node-focused"),(o&&e.depth>o.depth||!o)&&(e.firstChild=!0,i+=" node-first-child"),(n&&e.depth>n.depth||!n)&&(e.lastChild=!0,i+=" node-last-child"),e.class&&(i+=" "+e.class),i}getNodeTitle(e){return e.tip?e.tip:"uid="+e.identifier}getToggleVisibility(e){return e.hasChildren?"visible":"hidden"}getToggleClass(e){return"node-toggle node-toggle--"+(e.expanded?"expanded":"collapsed")+" chevron "+(e.expanded?"expanded":"collapsed")}getLinkPath(e){const t=e.target.x,s=e.target.y,i=[];return i.push("M"+e.source.x+" "+e.source.y),i.push("V"+s),e.target.hasChildren?i.push("H"+(t-2)):i.push("H"+(t+this.settings.indentWidth/4-2)),i.join(" ")}getNodeTransform(e){return"translate("+(e.x||0)+","+(e.y||0)+")"}getNodeBackgroundTransform(e,t,s){let i=t/2*-1,o=(e.y||0)-s/2;return o+=.5,"translate("+i+", "+o+")"}getNodeActionTransform(e,t,s){return"translate("+t/2*-1+", "+((e.y||0)-s/2)+")"}clickOnIcon(e){this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:e}}))}handleNodeToggle(e){e.expanded?this.hideChildren(e):this.showChildren(e),this.prepareDataForVisibleNodes(),this.updateVisibleNodes()}enterSvgElements(e){if(this.settings.showIcons){const e=Object.values(this.icons).filter((e=>""!==e.icon&&null!==e.icon)),t=this.iconsContainer.selectAll(".icon-def").data(e,(e=>e.identifier));t.exit().remove(),t.enter().append("g").attr("class","icon-def").attr("id",(e=>"icon-"+e.identifier)).append((e=>{if(e.icon instanceof SVGElement)return e.icon;const t="<svg>"+e.icon+"</svg>";return(new DOMParser).parseFromString(t,"image/svg+xml").documentElement.firstChild}))}const t=this.nodesUpdate(e);let s=t.append("svg").attr("class","node-toggle").attr("y",this.settings.icon.size/2*-1).attr("x",this.settings.icon.size/2*-1).attr("visibility",this.getToggleVisibility).attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).on("click",((e,t)=>this.handleNodeToggle(t)));if(s.append("use").attr("class","node-toggle-icon").attr("href","#icon-actions-chevron-right"),s.append("rect").attr("class","node-toggle-spacer").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("fill","transparent"),this.settings.showIcons){const e=t.append("svg").attr("class","node-icon-container").attr("title",this.getNodeTitle).attr("height","20").attr("width","20").attr("x","6").attr("y","-10").attr("data-bs-toggle","tooltip").on("click",((e,t)=>{e.preventDefault(),this.clickOnIcon(t)}));e.append("rect").style("opacity",0).attr("width","20").attr("height","20").attr("y","0").attr("x","0").attr("class","node-icon-click");const s=e.append("svg").attr("height","16").attr("width","16").attr("y","2").attr("x","2").attr("class","node-icon-inner");s.append("use").attr("class","node-icon").attr("data-uid",this.getNodeIdentifier);s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-overlay");s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-locked")}return Tooltip.initialize('[data-bs-toggle="tooltip"]',this.tooltipOptions),this.appendTextElement(t),e.merge(t)}onMouseOverNode(e){e.isOver=!0,this.hoveredNode=e;let t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over",!0);let s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&(s.classed("node-action-over",!0),s.attr("fill",t.style("fill")))}onMouseOutOfNode(e){e.isOver=!1,this.hoveredNode=null;let t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over node-alert",!1);let s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&s.classed("node-action-over",!1)}updateScrollPosition(){this.viewportHeight=this.getBoundingClientRect().height,this.scrollBottom=this.scrollTop+this.viewportHeight+this.viewportHeight/2,setTimeout((()=>{Tooltip.hide(document.querySelector(this.tooltipOptions.container).querySelectorAll(".bs-tooltip-end"))}),this.tooltipOptions.delay)}handleKeyboardInteraction(e){const t=e.target;let s=d3selection.select(t).datum();if(-1===[KeyTypes.ENTER,KeyTypes.SPACE,KeyTypes.END,KeyTypes.HOME,KeyTypes.LEFT,KeyTypes.UP,KeyTypes.RIGHT,KeyTypes.DOWN].indexOf(e.keyCode))return;e.preventDefault();const i=t.parentNode;switch(e.keyCode){case KeyTypes.END:this.scrollTop=this.lastElementChild.getBoundingClientRect().height+this.settings.nodeHeight-this.viewportHeight,i.scrollIntoView({behavior:"smooth",block:"end"}),this.focusNode(this.getNodeFromElement(i.lastElementChild)),this.updateVisibleNodes();break;case KeyTypes.HOME:this.scrollTo({top:this.nodes[0].y,behavior:"smooth"}),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(i.firstElementChild)),this.updateVisibleNodes();break;case KeyTypes.LEFT:if(s.expanded)s.hasChildren&&(this.hideChildren(s),this.prepareDataForVisibleNodes(),this.updateVisibleNodes());else if(s.parents.length>0){let e=this.nodes[s.parents[0]];this.scrollNodeIntoVisibleArea(e,"up"),this.focusNode(e),this.updateVisibleNodes()}break;case KeyTypes.UP:this.scrollNodeIntoVisibleArea(s,"up"),t.previousSibling&&(this.focusNode(this.getNodeFromElement(t.previousSibling)),this.updateVisibleNodes());break;case KeyTypes.RIGHT:s.expanded?(this.scrollNodeIntoVisibleArea(s,"down"),this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes()):s.hasChildren&&(this.showChildren(s),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(t)),this.updateVisibleNodes());break;case KeyTypes.DOWN:this.scrollNodeIntoVisibleArea(s,"down"),t.nextSibling&&(this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes());break;case KeyTypes.ENTER:case KeyTypes.SPACE:this.selectNode(s,!0),this.focusNode(s)}}scrollNodeIntoVisibleArea(e,t="up"){let s=this.scrollTop;if("up"===t&&s>e.y-this.settings.nodeHeight)s=e.y-this.settings.nodeHeight;else{if(!("down"===t&&s+this.viewportHeight<=e.y+3*this.settings.nodeHeight))return;s+=this.settings.nodeHeight}this.scrollTo({top:s,behavior:"smooth"}),this.updateVisibleNodes()}updateLinks(){const e=this.data.links.filter((e=>e.source.y<=this.scrollBottom&&e.target.y>=this.scrollTop-this.settings.nodeHeight)).map((e=>(e.source.owns=e.source.owns||[],e.source.owns.push("identifier-"+e.target.stateIdentifier),e))),t=this.linksContainer.selectAll(".link").data(e);t.exit().remove(),t.enter().append("path").attr("class","link").attr("id",this.getGroupIdentifier).attr("role",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?"group":null)).attr("aria-owns",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?e.source.owns.join(" "):null)).merge(t).attr("d",(e=>this.getLinkPath(e)))}getGroupIdentifier(e){return 1===e.target.siblingsPosition?"group-identifier-"+e.source.stateIdentifier:null}}__decorate([property({type:Object})],SvgTree.prototype,"setup",void 0),__decorate([state()],SvgTree.prototype,"settings",void 0);let Toolbar=class extends LitElement{constructor(){super(...arguments),this.tree=null,this.settings={searchInput:".search-input",filterTimeout:450}}createRenderRoot(){return this}firstUpdated(){const e=this.querySelector(this.settings.searchInput);e&&(new DebounceEvent("input",(e=>{const t=e.target;this.tree.filter(t.value.trim())}),this.settings.filterTimeout).bindTo(e),e.focus())}render(){return html` + `}firstUpdated(){this.svg=d3selection.select(this.querySelector("svg")),this.container=d3selection.select(this.querySelector(".nodes-wrapper")).attr("transform","translate("+this.settings.indentWidth/2+","+this.settings.nodeHeight/2+")"),this.nodesBgContainer=d3selection.select(this.querySelector(".nodes-bg")),this.nodesActionsContainer=d3selection.select(this.querySelector(".nodes-actions")),this.linksContainer=d3selection.select(this.querySelector(".links")),this.nodesContainer=d3selection.select(this.querySelector(".nodes")),this.doSetup(this.setup||{}),this.updateView()}updateView(){this.updateScrollPosition(),this.updateVisibleNodes(),this.settings.actions&&this.settings.actions.length&&this.nodesActionsContainer.attr("transform","translate("+(this.querySelector("svg").clientWidth-16-16*this.settings.actions.length)+",0)")}disableSelectedNodes(){this.getSelectedNodes().forEach((e=>{!0===e.checked&&(e.checked=!1)}))}updateNodeActions(e){return this.settings.actions&&this.settings.actions.length?(this.nodesActionsContainer.selectAll(".node-action").selectChildren().remove(),e.enter().append("g").merge(e).attr("class","node-action").on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).attr("data-state-id",this.getNodeStateIdentifier).attr("transform",(e=>this.getNodeActionTransform(e,this.settings.indentWidth,this.settings.nodeHeight)))):e.enter()}createIconAreaForAction(e,t){const s=e.append("svg").attr("class","node-icon-container").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("x","0").attr("y","0");s.append("rect").attr("height",this.settings.icon.containerSize).attr("width",this.settings.icon.containerSize).attr("y","0").attr("x","0").attr("class","node-icon-click");s.append("svg").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("y",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("x",(this.settings.icon.containerSize-this.settings.icon.size)/2).attr("class","node-icon-inner").append("use").attr("class","node-icon").attr("xlink:href","#icon-"+t)}isNodeSelectable(e){return!0}appendTextElement(e){return e.append("text").attr("dx",this.textPosition).attr("dy",5).attr("class","node-name").on("click",((e,t)=>{this.selectNode(t,!0),this.focusNode(t),this.updateVisibleNodes()}))}nodesUpdate(e){return(e=e.enter().append("g").attr("class","node").attr("id",(e=>"identifier-"+e.stateIdentifier)).attr("role","treeitem").attr("aria-owns",(e=>e.hasChildren?"group-identifier-"+e.stateIdentifier:null)).attr("aria-level",this.getNodeDepth).attr("aria-setsize",this.getNodeSetsize).attr("aria-posinset",this.getNodePositionInSet).attr("aria-expanded",(e=>e.hasChildren?e.expanded:null)).attr("transform",this.getNodeTransform).attr("data-state-id",this.getNodeStateIdentifier).attr("title",this.getNodeTitle).on("mouseover",((e,t)=>this.onMouseOverNode(t))).on("mouseout",((e,t)=>this.onMouseOutOfNode(t))).on("contextmenu",((e,t)=>{e.preventDefault(),this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:t}}))}))).append("text").text((e=>e.readableRootline)).attr("class","node-rootline").attr("dx",0).attr("dy",this.settings.nodeHeight/2*-1).attr("visibility",(e=>e.readableRootline?"visible":"hidden")),e}getNodeIdentifier(e){return e.identifier}getNodeDepth(e){return e.depth}getNodeSetsize(e){return e.siblingsCount}getNodePositionInSet(e){return e.siblingsPosition}getNodeStateIdentifier(e){return e.stateIdentifier}getNodeLabel(e){let t=(e.prefix||"")+e.name+(e.suffix||"");const s=document.createElement("div");if(s.textContent=t,t=s.innerHTML,this.searchTerm){const e=new RegExp(this.searchTerm,"gi");t=t.replace(e,'<tspan class="node-highlight-text">$&</tspan>')}return t}getNodeByIdentifier(e){return this.nodes.find((t=>t.stateIdentifier===e))}getNodeBgClass(e,t,s){let i="node-bg",o=null,n=null;return"object"==typeof s&&(o=s.data()[t-1],n=s.data()[t+1]),e.checked&&(i+=" node-selected"),e.focused&&(i+=" node-focused"),(o&&e.depth>o.depth||!o)&&(e.firstChild=!0,i+=" node-first-child"),(n&&e.depth>n.depth||!n)&&(e.lastChild=!0,i+=" node-last-child"),e.class&&(i+=" "+e.class),i}getNodeTitle(e){return e.tip?e.tip:"uid="+e.identifier}getToggleVisibility(e){return e.hasChildren?"visible":"hidden"}getToggleClass(e){return"node-toggle node-toggle--"+(e.expanded?"expanded":"collapsed")+" chevron "+(e.expanded?"expanded":"collapsed")}getLinkPath(e){const t=e.target.x,s=e.target.y,i=[];return i.push("M"+e.source.x+" "+e.source.y),i.push("V"+s),e.target.hasChildren?i.push("H"+(t-2)):i.push("H"+(t+this.settings.indentWidth/4-2)),i.join(" ")}getNodeTransform(e){return"translate("+(e.x||0)+","+(e.y||0)+")"}getNodeBackgroundTransform(e,t,s){let i=t/2*-1,o=(e.y||0)-s/2;return o+=.5,"translate("+i+", "+o+")"}getNodeActionTransform(e,t,s){return"translate("+t/2*-1+", "+((e.y||0)-s/2)+")"}clickOnIcon(e){this.dispatchEvent(new CustomEvent("typo3:svg-tree:node-context",{detail:{node:e}}))}handleNodeToggle(e){e.expanded?this.hideChildren(e):this.showChildren(e),this.prepareDataForVisibleNodes(),this.updateVisibleNodes()}enterSvgElements(e){if(this.settings.showIcons){const e=Object.values(this.icons).filter((e=>""!==e.icon&&null!==e.icon)),t=this.iconsContainer.selectAll(".icon-def").data(e,(e=>e.identifier));t.exit().remove(),t.enter().append("g").attr("class","icon-def").attr("id",(e=>"icon-"+e.identifier)).append((e=>{if(e.icon instanceof SVGElement)return e.icon;const t="<svg>"+e.icon+"</svg>";return(new DOMParser).parseFromString(t,"image/svg+xml").documentElement.firstChild}))}const t=this.nodesUpdate(e);let s=t.append("svg").attr("class","node-toggle").attr("y",this.settings.icon.size/2*-1).attr("x",this.settings.icon.size/2*-1).attr("visibility",this.getToggleVisibility).attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).on("click",((e,t)=>this.handleNodeToggle(t)));if(s.append("use").attr("class","node-toggle-icon").attr("href","#icon-actions-chevron-right"),s.append("rect").attr("class","node-toggle-spacer").attr("height",this.settings.icon.size).attr("width",this.settings.icon.size).attr("fill","transparent"),this.settings.showIcons){const e=t.append("svg").attr("class","node-icon-container").attr("height","20").attr("width","20").attr("x","6").attr("y","-10").on("click",((e,t)=>{e.preventDefault(),this.clickOnIcon(t)}));e.append("rect").style("opacity",0).attr("width","20").attr("height","20").attr("y","0").attr("x","0").attr("class","node-icon-click");const s=e.append("svg").attr("height","16").attr("width","16").attr("y","2").attr("x","2").attr("class","node-icon-inner");s.append("use").attr("class","node-icon").attr("data-uid",this.getNodeIdentifier);s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-overlay");s.append("svg").attr("height","11").attr("width","11").attr("y","5").attr("x","5").append("use").attr("class","node-icon-locked")}return t.append("title").text(this.getNodeTitle),this.appendTextElement(t),e.merge(t)}onMouseOverNode(e){e.isOver=!0,this.hoveredNode=e;let t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over",!0);let s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&(s.classed("node-action-over",!0),s.attr("fill",t.style("fill")))}onMouseOutOfNode(e){e.isOver=!1,this.hoveredNode=null;let t=this.svg.select('.nodes-bg .node-bg[data-state-id="'+e.stateIdentifier+'"]');t.size()&&t.classed("node-over node-alert",!1);let s=this.nodesActionsContainer.select('.node-action[data-state-id="'+e.stateIdentifier+'"]');s.size()&&s.classed("node-action-over",!1)}updateScrollPosition(){this.viewportHeight=this.getBoundingClientRect().height,this.scrollBottom=this.scrollTop+this.viewportHeight+this.viewportHeight/2}handleKeyboardInteraction(e){const t=e.target;let s=d3selection.select(t).datum();if(-1===[KeyTypes.ENTER,KeyTypes.SPACE,KeyTypes.END,KeyTypes.HOME,KeyTypes.LEFT,KeyTypes.UP,KeyTypes.RIGHT,KeyTypes.DOWN].indexOf(e.keyCode))return;e.preventDefault();const i=t.parentNode;switch(e.keyCode){case KeyTypes.END:this.scrollTop=this.lastElementChild.getBoundingClientRect().height+this.settings.nodeHeight-this.viewportHeight,i.scrollIntoView({behavior:"smooth",block:"end"}),this.focusNode(this.getNodeFromElement(i.lastElementChild)),this.updateVisibleNodes();break;case KeyTypes.HOME:this.scrollTo({top:this.nodes[0].y,behavior:"smooth"}),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(i.firstElementChild)),this.updateVisibleNodes();break;case KeyTypes.LEFT:if(s.expanded)s.hasChildren&&(this.hideChildren(s),this.prepareDataForVisibleNodes(),this.updateVisibleNodes());else if(s.parents.length>0){let e=this.nodes[s.parents[0]];this.scrollNodeIntoVisibleArea(e,"up"),this.focusNode(e),this.updateVisibleNodes()}break;case KeyTypes.UP:this.scrollNodeIntoVisibleArea(s,"up"),t.previousSibling&&(this.focusNode(this.getNodeFromElement(t.previousSibling)),this.updateVisibleNodes());break;case KeyTypes.RIGHT:s.expanded?(this.scrollNodeIntoVisibleArea(s,"down"),this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes()):s.hasChildren&&(this.showChildren(s),this.prepareDataForVisibleNodes(),this.focusNode(this.getNodeFromElement(t)),this.updateVisibleNodes());break;case KeyTypes.DOWN:this.scrollNodeIntoVisibleArea(s,"down"),t.nextSibling&&(this.focusNode(this.getNodeFromElement(t.nextSibling)),this.updateVisibleNodes());break;case KeyTypes.ENTER:case KeyTypes.SPACE:this.selectNode(s,!0),this.focusNode(s)}}scrollNodeIntoVisibleArea(e,t="up"){let s=this.scrollTop;if("up"===t&&s>e.y-this.settings.nodeHeight)s=e.y-this.settings.nodeHeight;else{if(!("down"===t&&s+this.viewportHeight<=e.y+3*this.settings.nodeHeight))return;s+=this.settings.nodeHeight}this.scrollTo({top:s,behavior:"smooth"}),this.updateVisibleNodes()}updateLinks(){const e=this.data.links.filter((e=>e.source.y<=this.scrollBottom&&e.target.y>=this.scrollTop-this.settings.nodeHeight)).map((e=>(e.source.owns=e.source.owns||[],e.source.owns.push("identifier-"+e.target.stateIdentifier),e))),t=this.linksContainer.selectAll(".link").data(e);t.exit().remove(),t.enter().append("path").attr("class","link").attr("id",this.getGroupIdentifier).attr("role",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?"group":null)).attr("aria-owns",(e=>1===e.target.siblingsPosition&&e.source.owns.length>0?e.source.owns.join(" "):null)).merge(t).attr("d",(e=>this.getLinkPath(e)))}getGroupIdentifier(e){return 1===e.target.siblingsPosition?"group-identifier-"+e.source.stateIdentifier:null}}__decorate([property({type:Object})],SvgTree.prototype,"setup",void 0),__decorate([state()],SvgTree.prototype,"settings",void 0);let Toolbar=class extends LitElement{constructor(){super(...arguments),this.tree=null,this.settings={searchInput:".search-input",filterTimeout:450}}createRenderRoot(){return this}firstUpdated(){const e=this.querySelector(this.settings.searchInput);e&&(new DebounceEvent("input",(e=>{const t=e.target;this.tree.filter(t.value.trim())}),this.settings.filterTimeout).bindTo(e),e.focus())}render(){return html` <div class="tree-toolbar"> <div class="svg-toolbar__menu"> <div class="svg-toolbar__search"> diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/tooltip.js b/typo3/sysext/backend/Resources/Public/JavaScript/tooltip.js index e0f23e900b84bcb9404e34cf820bb3f35b245095..d04201d81b284c45f043e4a7104f4382ea3a09bb 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/tooltip.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/tooltip.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import{Tooltip as BootstrapTooltip}from"bootstrap";import DocumentService from"@typo3/core/document-service.js";class Tooltip{static applyAttributes(t,o){for(const[e,i]of Object.entries(t))o.setAttribute(e,i)}constructor(){DocumentService.ready().then((()=>{this.initialize('[data-bs-toggle="tooltip"]')}))}initialize(t,o={}){0===Object.entries(o).length&&(o={container:"body",trigger:"hover",delay:{show:500,hide:100}});const e=document.querySelectorAll(t);for(const t of e)BootstrapTooltip.getOrCreateInstance(t,o)}show(t,o){const e={"data-bs-placement":"auto",title:o};if(t instanceof NodeList)for(const o of t)Tooltip.applyAttributes(e,o),BootstrapTooltip.getInstance(o).show();else if(t instanceof HTMLElement)return Tooltip.applyAttributes(e,t),void BootstrapTooltip.getInstance(t).show()}hide(t){if(t instanceof NodeList)for(const o of t){const t=BootstrapTooltip.getInstance(o);null!==t&&t.hide()}else t instanceof HTMLElement&&BootstrapTooltip.getInstance(t).hide()}}const tooltipObject=new Tooltip;TYPO3.Tooltip=tooltipObject;export default tooltipObject; \ No newline at end of file +import{Tooltip as BootstrapTooltip}from"bootstrap";import DocumentService from"@typo3/core/document-service.js";class Tooltip{static applyAttributes(t,o){for(const[e,i]of Object.entries(t))o.setAttribute(e,i)}constructor(){DocumentService.ready().then((()=>{console.warn("Tooltip has been deprecated since TYPO3 v12 and will be removed with v13. Rely on browser title instead."),this.initialize('[data-bs-toggle="tooltip"]')}))}initialize(t,o={}){0===Object.entries(o).length&&(o={container:"body",trigger:"hover",delay:{show:500,hide:100}});const e=document.querySelectorAll(t);for(const t of e)BootstrapTooltip.getOrCreateInstance(t,o)}show(t,o){const e={"data-bs-placement":"auto",title:o};if(t instanceof NodeList)for(const o of t)Tooltip.applyAttributes(e,o),BootstrapTooltip.getInstance(o).show();else if(t instanceof HTMLElement)return Tooltip.applyAttributes(e,t),void BootstrapTooltip.getInstance(t).show()}hide(t){if(t instanceof NodeList)for(const o of t){const t=BootstrapTooltip.getInstance(o);null!==t&&t.hide()}else t instanceof HTMLElement&&BootstrapTooltip.getInstance(t).hide()}}const tooltipObject=new Tooltip;TYPO3.Tooltip=tooltipObject;export default tooltipObject; \ No newline at end of file diff --git a/typo3/sysext/beuser/Classes/ViewHelpers/PermissionsViewHelper.php b/typo3/sysext/beuser/Classes/ViewHelpers/PermissionsViewHelper.php index 05773c19be5d9d70d5ec8e4e397ce602ea7b0143..5f3c46f9bd356a04fbc9b02415dcc51f17e263ee 100644 --- a/typo3/sysext/beuser/Classes/ViewHelpers/PermissionsViewHelper.php +++ b/typo3/sysext/beuser/Classes/ViewHelpers/PermissionsViewHelper.php @@ -79,7 +79,6 @@ final class PermissionsViewHelper extends AbstractViewHelper $icon .= '<button' . ' aria-label="' . htmlspecialchars($label) . ', ' . htmlspecialchars($mode) . ', ' . htmlspecialchars($arguments['scope']) . '"' . ' title="' . htmlspecialchars($label) . '"' - . ' data-bs-toggle="tooltip"' . ' data-page="' . htmlspecialchars((string)$arguments['pageId']) . '"' . ' data-permissions="' . htmlspecialchars((string)$arguments['permission']) . '"' . ' data-who="' . htmlspecialchars($arguments['scope']) . '"' diff --git a/typo3/sysext/beuser/Resources/Private/Templates/Permission/Edit.html b/typo3/sysext/beuser/Resources/Private/Templates/Permission/Edit.html index 9d93abf24ed30a2d8fda758ba918d67e519c0ecb..d3abfdb559ba45b158595bff97058a869967689d 100644 --- a/typo3/sysext/beuser/Resources/Private/Templates/Permission/Edit.html +++ b/typo3/sysext/beuser/Resources/Private/Templates/Permission/Edit.html @@ -9,8 +9,7 @@ <f:be.pageRenderer includeJavaScriptModules="{ - 0: '@typo3/beuser/permissions.js', - 1: '@typo3/backend/tooltip.js' + 0: '@typo3/beuser/permissions.js' }" /> diff --git a/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html b/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html index 724536f2ca6edc156816dbbfa77b323ad12aee7f..efa88e9a0b6bea59d6385ea74670fa7568f9ceac 100644 --- a/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html +++ b/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html @@ -12,8 +12,7 @@ <f:be.pageRenderer includeJavaScriptModules="{ - 0: '@typo3/beuser/permissions.js', - 1: '@typo3/backend/tooltip.js' + 0: '@typo3/beuser/permissions.js' }" /> diff --git a/typo3/sysext/beuser/Resources/Public/JavaScript/permissions.js b/typo3/sysext/beuser/Resources/Public/JavaScript/permissions.js index b7b31c467134f1313796472781f6eebcc1cf86f6..258da77266cf24bc900b1fb93bd54a52289e8b23 100644 --- a/typo3/sysext/beuser/Resources/Public/JavaScript/permissions.js +++ b/typo3/sysext/beuser/Resources/Public/JavaScript/permissions.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import RegularEvent from"@typo3/core/event/regular-event.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import Tooltip from"@typo3/backend/tooltip.js";class Permissions{constructor(){this.options={containerSelector:"#typo3-permissionList",editControllerSelector:"#PermissionControllerEdit"},this.ajaxUrl=TYPO3.settings.ajaxUrls.user_access_permissions,this.initializeCheckboxGroups(),this.initializeEvents()}static setPermissionCheckboxes(e,t){const a=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]`);for(let e of a){const a=parseInt(e.value,10);e.checked=(t&a)===a}}static updatePermissionValue(e,t){let a=0;const o=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]:checked`);for(let e of o)a|=parseInt(e.value,10);document.forms.namedItem("editform")[t].value=a|("check[perms_user]"===e?1:0)}setPermissions(e){let t=e.dataset.page,a=e.dataset.who;Tooltip.hide(document.querySelectorAll('[data-bs-toggle="tooltip"]')),new AjaxRequest(this.ajaxUrl).post({page:t,who:a,permissions:e.dataset.permissions,mode:e.dataset.mode,bits:e.dataset.bits}).then((async e=>{const o=await e.resolve();document.getElementById(t+"_"+a).outerHTML=o,Tooltip.initialize('[data-bs-toggle="tooltip"]')}))}toggleEditLock(e){let t=e.dataset.page;new AjaxRequest(this.ajaxUrl).post({action:"toggle_edit_lock",page:t,editLockState:e.dataset.lockstate}).then((async e=>{document.getElementById("el_"+t).outerHTML=await e.resolve()}))}changeOwner(e){let t=e.dataset.page;const a=document.getElementById("o_"+t);new AjaxRequest(this.ajaxUrl).post({action:"change_owner",page:t,ownerUid:e.dataset.owner,newOwnerUid:a.getElementsByTagName("select")[0].value}).then((async e=>{a.outerHTML=await e.resolve()}))}showChangeOwnerSelector(e){let t=e.dataset.page;new AjaxRequest(this.ajaxUrl).post({action:"show_change_owner_selector",page:t,ownerUid:e.dataset.owner,username:e.dataset.username}).then((async e=>{document.getElementById("o_"+t).outerHTML=await e.resolve()}))}restoreOwner(e){const t=e.dataset.page,a=e.dataset.username??e.dataset.ifNotSet,o=document.createElement("span");o.setAttribute("id",`o_${t}`);const n=document.createElement("button");n.classList.add("ug_selector","changeowner","btn","btn-link"),n.setAttribute("type","button"),n.setAttribute("data-page",t),n.setAttribute("data-owner",e.dataset.owner),n.setAttribute("data-username",a),n.innerText=a,o.appendChild(n);const s=document.getElementById("o_"+t);s.parentNode.replaceChild(o,s)}restoreGroup(e){const t=e.dataset.page,a=e.dataset.groupname??e.dataset.ifNotSet,o=document.createElement("span");o.setAttribute("id",`g_${t}`);const n=document.createElement("button");n.classList.add("ug_selector","changegroup","btn","btn-link"),n.setAttribute("type","button"),n.setAttribute("data-page",t),n.setAttribute("data-group-id",e.dataset.groupId),n.setAttribute("data-groupname",a),n.innerText=a,o.appendChild(n);const s=document.getElementById("g_"+t);s.parentNode.replaceChild(o,s)}changeGroup(e){let t=e.dataset.page;const a=document.getElementById("g_"+t);new AjaxRequest(this.ajaxUrl).post({action:"change_group",page:t,groupUid:e.dataset.groupId,newGroupUid:a.getElementsByTagName("select")[0].value}).then((async e=>{a.outerHTML=await e.resolve()}))}showChangeGroupSelector(e){let t=e.dataset.page;new AjaxRequest(this.ajaxUrl).post({action:"show_change_group_selector",page:t,groupUid:e.dataset.groupId,groupname:e.dataset.groupname}).then((async e=>{document.getElementById("g_"+t).outerHTML=await e.resolve()}))}initializeCheckboxGroups(){document.querySelectorAll("[data-checkbox-group]").forEach((e=>{const t=e.dataset.checkboxGroup,a=parseInt(e.value,10);Permissions.setPermissionCheckboxes(t,a)}))}initializeEvents(){const e=document.querySelector(this.options.containerSelector),t=document.querySelector(this.options.editControllerSelector);null!==e&&(new RegularEvent("click",((e,t)=>{e.preventDefault(),this.setPermissions(t)})).delegateTo(e,".change-permission"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.toggleEditLock(t)})).delegateTo(e,".editlock"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.showChangeOwnerSelector(t)})).delegateTo(e,".changeowner"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.showChangeGroupSelector(t)})).delegateTo(e,".changegroup"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.restoreOwner(t)})).delegateTo(e,".restoreowner"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.changeOwner(t)})).delegateTo(e,".saveowner"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.restoreGroup(t)})).delegateTo(e,".restoregroup"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.changeGroup(t)})).delegateTo(e,".savegroup")),null!==t&&new RegularEvent("click",((e,t)=>{const a=t.dataset.checkChangePermissions.split(",").map((e=>e.trim()));Permissions.updatePermissionValue.apply(this,a)})).delegateTo(t,"[data-check-change-permissions]")}}export default new Permissions; \ No newline at end of file +import RegularEvent from"@typo3/core/event/regular-event.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";class Permissions{constructor(){this.options={containerSelector:"#typo3-permissionList",editControllerSelector:"#PermissionControllerEdit"},this.ajaxUrl=TYPO3.settings.ajaxUrls.user_access_permissions,this.initializeCheckboxGroups(),this.initializeEvents()}static setPermissionCheckboxes(e,t){const a=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]`);for(let e of a){const a=parseInt(e.value,10);e.checked=(t&a)===a}}static updatePermissionValue(e,t){let a=0;const o=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]:checked`);for(let e of o)a|=parseInt(e.value,10);document.forms.namedItem("editform")[t].value=a|("check[perms_user]"===e?1:0)}setPermissions(e){let t=e.dataset.page,a=e.dataset.who;new AjaxRequest(this.ajaxUrl).post({page:t,who:a,permissions:e.dataset.permissions,mode:e.dataset.mode,bits:e.dataset.bits}).then((async e=>{const o=await e.resolve();document.getElementById(t+"_"+a).outerHTML=o}))}toggleEditLock(e){let t=e.dataset.page;new AjaxRequest(this.ajaxUrl).post({action:"toggle_edit_lock",page:t,editLockState:e.dataset.lockstate}).then((async e=>{document.getElementById("el_"+t).outerHTML=await e.resolve()}))}changeOwner(e){let t=e.dataset.page;const a=document.getElementById("o_"+t);new AjaxRequest(this.ajaxUrl).post({action:"change_owner",page:t,ownerUid:e.dataset.owner,newOwnerUid:a.getElementsByTagName("select")[0].value}).then((async e=>{a.outerHTML=await e.resolve()}))}showChangeOwnerSelector(e){let t=e.dataset.page;new AjaxRequest(this.ajaxUrl).post({action:"show_change_owner_selector",page:t,ownerUid:e.dataset.owner,username:e.dataset.username}).then((async e=>{document.getElementById("o_"+t).outerHTML=await e.resolve()}))}restoreOwner(e){const t=e.dataset.page,a=e.dataset.username??e.dataset.ifNotSet,o=document.createElement("span");o.setAttribute("id",`o_${t}`);const s=document.createElement("button");s.classList.add("ug_selector","changeowner","btn","btn-link"),s.setAttribute("type","button"),s.setAttribute("data-page",t),s.setAttribute("data-owner",e.dataset.owner),s.setAttribute("data-username",a),s.innerText=a,o.appendChild(s);const n=document.getElementById("o_"+t);n.parentNode.replaceChild(o,n)}restoreGroup(e){const t=e.dataset.page,a=e.dataset.groupname??e.dataset.ifNotSet,o=document.createElement("span");o.setAttribute("id",`g_${t}`);const s=document.createElement("button");s.classList.add("ug_selector","changegroup","btn","btn-link"),s.setAttribute("type","button"),s.setAttribute("data-page",t),s.setAttribute("data-group-id",e.dataset.groupId),s.setAttribute("data-groupname",a),s.innerText=a,o.appendChild(s);const n=document.getElementById("g_"+t);n.parentNode.replaceChild(o,n)}changeGroup(e){let t=e.dataset.page;const a=document.getElementById("g_"+t);new AjaxRequest(this.ajaxUrl).post({action:"change_group",page:t,groupUid:e.dataset.groupId,newGroupUid:a.getElementsByTagName("select")[0].value}).then((async e=>{a.outerHTML=await e.resolve()}))}showChangeGroupSelector(e){let t=e.dataset.page;new AjaxRequest(this.ajaxUrl).post({action:"show_change_group_selector",page:t,groupUid:e.dataset.groupId,groupname:e.dataset.groupname}).then((async e=>{document.getElementById("g_"+t).outerHTML=await e.resolve()}))}initializeCheckboxGroups(){document.querySelectorAll("[data-checkbox-group]").forEach((e=>{const t=e.dataset.checkboxGroup,a=parseInt(e.value,10);Permissions.setPermissionCheckboxes(t,a)}))}initializeEvents(){const e=document.querySelector(this.options.containerSelector),t=document.querySelector(this.options.editControllerSelector);null!==e&&(new RegularEvent("click",((e,t)=>{e.preventDefault(),this.setPermissions(t)})).delegateTo(e,".change-permission"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.toggleEditLock(t)})).delegateTo(e,".editlock"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.showChangeOwnerSelector(t)})).delegateTo(e,".changeowner"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.showChangeGroupSelector(t)})).delegateTo(e,".changegroup"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.restoreOwner(t)})).delegateTo(e,".restoreowner"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.changeOwner(t)})).delegateTo(e,".saveowner"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.restoreGroup(t)})).delegateTo(e,".restoregroup"),new RegularEvent("click",((e,t)=>{e.preventDefault(),this.changeGroup(t)})).delegateTo(e,".savegroup")),null!==t&&new RegularEvent("click",((e,t)=>{const a=t.dataset.checkChangePermissions.split(",").map((e=>e.trim()));Permissions.updatePermissionValue.apply(this,a)})).delegateTo(t,"[data-check-change-permissions]")}}export default new Permissions; \ No newline at end of file diff --git a/typo3/sysext/core/Documentation/Changelog/12.2/Deprecation-99811-DeprecateBootstrapTooltip.rst b/typo3/sysext/core/Documentation/Changelog/12.2/Deprecation-99811-DeprecateBootstrapTooltip.rst new file mode 100644 index 0000000000000000000000000000000000000000..5fa41778c7200d2e78f6a96a61c39c7132fedd65 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/12.2/Deprecation-99811-DeprecateBootstrapTooltip.rst @@ -0,0 +1,44 @@ +.. include:: /Includes.rst.txt + +.. _deprecation-99811-1675447357: + +============================================================ +Deprecation: #99811 - Deprecate JavaScript bootstrap tooltip +============================================================ + +See :issue:`99811` + +Description +=========== + +Bootstrap related Backend tooltips initiated with +:html:`data-bs-toggle="tooltip"` together with the core +JavaScript class :js:`typo3/backend/tooltip.js` have been marked +as deprecated and should not be used anymore. + + +Impact +====== + +Loading :js:`typo3/backend/tooltip.js` in a Backend related module +will trigger a :js:`console.warn()`. The module will vanish in TYPO3 v13. + + +Affected installations +====================== + +Instances with extensions that add Backend modules using the bootstrap +related tooltips plugin may be affected. A typical sign for this is +using the :html:`data-bs-toggle="tooltip"` attribute on elements, loading +JavaScript module :js:`typo3/backend/tooltip.js`, and calling :js:`Tooltip.initialize()`. + + +Migration +========= + +Some parts of the core will fallback to the :html:`title` attribute for now. However, +both the bootstrap tooltips as well as the title attribute raise accessibility +concerns. See `MDN <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title#accessibility_concerns>`_ +for more information on this. The core will continue to improve the situation. + +.. index:: Backend, JavaScript, NotScanned, ext:backend diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Extensionmanager/InstalledExtensionsCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Extensionmanager/InstalledExtensionsCest.php index 5e66534946db3724ae9361a3cbe9cf943fa98cd0..07faa39e1ac61498bb06a72f4fe7316bfca08dc1 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Extensionmanager/InstalledExtensionsCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Extensionmanager/InstalledExtensionsCest.php @@ -70,7 +70,7 @@ final class InstalledExtensionsCest $I->switchToContentFrame(); $I->waitForElementVisible('//*[@id="typo3-extension-list"]/tbody/tr[@id="belog"]'); - $I->click('a[aria-label="Deactivate"]', '//*[@id="typo3-extension-list"]/tbody/tr[@id="belog"]'); + $I->click('a[title="Deactivate"]', '//*[@id="typo3-extension-list"]/tbody/tr[@id="belog"]'); $I->switchToMainFrame(); $I->cantSeeElement('#system_BelogLog'); @@ -82,7 +82,7 @@ final class InstalledExtensionsCest $I->switchToContentFrame(); $I->waitForElementVisible('//*[@id="typo3-extension-list"]/tbody/tr[@id="belog"]'); - $I->click('a[aria-label="Activate"]', '//*[@id="typo3-extension-list"]/tbody/tr[@id="belog"]'); + $I->click('a[title="Activate"]', '//*[@id="typo3-extension-list"]/tbody/tr[@id="belog"]'); $I->switchToMainFrame(); $I->seeElement('#system_BelogLog'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php index 1676eb65b7f13726bf8a2ccb36dadd538a3086df..77e3be8f9044c09ad4d00386a522378ad3ec5732 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php @@ -50,13 +50,11 @@ final class FileClipboardCest public function seeAddRemoveSingleRecord(ApplicationTester $I): void { $fileName = 'bus_lane.jpg'; - $I->switchToMainFrame(); - $I->click('//*[text()="styleguide"]'); - $I->click('.scaffold-content-navigation-switcher-close'); - $I->switchToContentFrame(); $I->click('//*[text()="View"]'); $I->click('//*[text()="List"]'); - + $I->waitForText('styleguide'); + $I->click('styleguide'); + $I->waitForText($fileName); $this->openActionDropdown($I, $fileName)->click(); $I->click('Cut'); $I->see($fileName, '.clipboard-panel a'); @@ -67,13 +65,10 @@ final class FileClipboardCest public function seeAddRemoveMultipleRecords(ApplicationTester $I): void { $expectedFiles = ['bus_lane.jpg', 'telephone_box.jpg', 'underground.jpg']; - - $I->switchToMainFrame(); - $I->click('//*[text()="styleguide"]'); - $I->click('.scaffold-content-navigation-switcher-close'); - $I->switchToContentFrame(); $I->click('//*[text()="View"]'); $I->click('//*[text()="List"]'); + $I->waitForText('styleguide'); + $I->click('styleguide'); $I->amGoingTo('add multiple elements to clipboard'); $I->click('Clipboard #1 (multi-selection mode)'); diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Scheduler/TasksCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Scheduler/TasksCest.php index e59df458d8448b02cb7c1d477720becc88abd197..aa8888031dd659aacdcdd17e49eb2c271a8aae76 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Scheduler/TasksCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Scheduler/TasksCest.php @@ -70,7 +70,7 @@ final class TasksCest */ public function canEditTask(ApplicationTester $I): void { - $I->click('//a[contains(@aria-label, "Edit")]'); + $I->click('//a[contains(@title, "Edit")]'); $I->waitForText('Edit scheduled task "System Status Update (reports)"'); $I->seeInField('#task_SystemStatusUpdateNotificationEmail', 'test@local.typo3.org'); $I->fillField('#task_SystemStatusUpdateNotificationEmail', 'foo@local.typo3.org'); @@ -85,15 +85,15 @@ final class TasksCest public function canEnableAndDisableTask(ApplicationTester $I): void { $I->wantTo('See a enable button for a task'); - $I->click('//button[contains(@aria-label, "Enable")]', '#tx_scheduler_form'); + $I->click('//button[contains(@title, "Enable")]', '#tx_scheduler_form'); $I->dontSeeElement('.tx_scheduler_mod1 .disabled'); $I->dontSee('disabled'); $I->wantTo('See a disable button for a task'); // Give tooltips some time to fully init $I->wait(1); - $I->moveMouseOver('//button[contains(@aria-label, "Disable")]'); + $I->moveMouseOver('//button[contains(@title, "Disable")]'); $I->wait(1); - $I->click('//button[contains(@aria-label, "Disable")]'); + $I->click('//button[contains(@title, "Disable")]'); $I->waitForElementVisible('div.tx_scheduler_mod1'); $I->seeElement('.tx_scheduler_mod1 .disabled'); $I->see('disabled'); @@ -105,8 +105,8 @@ final class TasksCest public function canDeleteTask(ApplicationTester $I, ModalDialog $modalDialog): void { $I->wantTo('See a delete button for a task'); - $I->seeElement('//a[contains(@aria-label, "Delete")]'); - $I->click('//a[contains(@aria-label, "Delete")]'); + $I->seeElement('//a[contains(@title, "Delete")]'); + $I->click('//a[contains(@title, "Delete")]'); $I->wantTo('Cancel the delete dialog'); // don't use $modalDialog->clickButtonInDialog due to too low timeout @@ -116,7 +116,7 @@ final class TasksCest $I->switchToContentFrame(); $I->wantTo('Still see and can click the Delete button as the deletion has been canceled'); - $I->click('//a[contains(@aria-label, "Delete")]'); + $I->click('//a[contains(@title, "Delete")]'); $modalDialog->clickButtonInDialog('OK'); $I->switchToContentFrame(); $I->see('The task was successfully deleted.'); diff --git a/typo3/sysext/extensionmanager/Resources/Public/JavaScript/main.js b/typo3/sysext/extensionmanager/Resources/Public/JavaScript/main.js index 6168d38fc2e2772a56e4de2f020701891e63f1fe..804f33d38d7a7aaa096a405e9c57dad4c9f5a228 100644 --- a/typo3/sysext/extensionmanager/Resources/Public/JavaScript/main.js +++ b/typo3/sysext/extensionmanager/Resources/Public/JavaScript/main.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import DocumentService from"@typo3/core/document-service.js";import $ from"jquery";import BrowserSession from"@typo3/backend/storage/browser-session.js";import NProgress from"nprogress";import{default as Modal}from"@typo3/backend/modal.js";import Tooltip from"@typo3/backend/tooltip.js";import Severity from"@typo3/backend/severity.js";import SecurityUtility from"@typo3/core/security-utility.js";import ExtensionManagerRepository from"@typo3/extensionmanager/repository.js";import ExtensionManagerUpdate from"@typo3/extensionmanager/update.js";import ExtensionManagerUploadForm from"@typo3/extensionmanager/upload-form.js";import Tablesort from"tablesort";import"tablesort.dotsep.js";import"@typo3/backend/input/clearable.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import DebounceEvent from"@typo3/core/event/debounce-event.js";import RegularEvent from"@typo3/core/event/regular-event.js";const securityUtility=new SecurityUtility;var ExtensionManagerIdentifier;!function(e){e.extensionlist="typo3-extension-list",e.searchField="#Tx_Extensionmanager_extensionkey"}(ExtensionManagerIdentifier||(ExtensionManagerIdentifier={}));class ExtensionManager{constructor(){this.searchFilterSessionKey="tx-extensionmanager-local-filter";const e=this;DocumentService.ready().then((()=>{this.Update=new ExtensionManagerUpdate,this.UploadForm=new ExtensionManagerUploadForm,this.Repository=new ExtensionManagerRepository;const t=document.getElementById(ExtensionManagerIdentifier.extensionlist);let n;if(null!==t&&(new Tablesort(t),new RegularEvent("click",(function(t){t.preventDefault(),Modal.confirm(TYPO3.lang["extensionList.removalConfirmation.title"],TYPO3.lang["extensionList.removalConfirmation.question"],Severity.error,[{text:TYPO3.lang["button.cancel"],active:!0,btnClass:"btn-default",trigger:()=>{Modal.dismiss()}},{text:TYPO3.lang["button.remove"],btnClass:"btn-danger",trigger:()=>{e.removeExtensionFromDisk(this),Modal.dismiss()}}])})).delegateTo(t,".removeExtension")),$(document).on("click",".onClickMaskExtensionManager",(()=>{NProgress.start()})).on("click","a[data-action=update-extension]",(e=>{e.preventDefault(),NProgress.start(),new AjaxRequest($(e.currentTarget).attr("href")).get().then(this.updateExtension)})).on("change","input[name=unlockDependencyIgnoreButton]",(e=>{$(".t3js-dependencies").toggleClass("disabled",!$(e.currentTarget).prop("checked"))})),null!==(n=document.querySelector(ExtensionManagerIdentifier.searchField))){const e=BrowserSession.get(this.searchFilterSessionKey);null!==e&&(n.value=e,this.filterExtensions(e)),new RegularEvent("submit",(e=>{e.preventDefault()})).bindTo(n.closest("form")),new DebounceEvent("input",(e=>{const t=e.target;BrowserSession.set(this.searchFilterSessionKey,t.value),this.filterExtensions(t.value)}),100).bindTo(n),n.clearable({onClear:()=>{BrowserSession.unset(this.searchFilterSessionKey),this.filterExtensions("")}})}$(document).on("click",".t3-button-action-installdistribution",(()=>{NProgress.start()})),this.Repository.initDom(),this.Update.initializeEvents(),this.UploadForm.initializeEvents(),Tooltip.initialize("#typo3-extension-list [title]")}))}filterExtensions(e){const t=document.querySelectorAll("[data-filterable]"),n=[];t.forEach((e=>{const t=Array.from(e.parentElement.children);n.push(t.indexOf(e))}));document.querySelectorAll("#typo3-extension-list tbody tr").forEach((t=>{const o=n.map((e=>t.children.item(e))),i=[];o.forEach((e=>{i.push(e.textContent.trim().replace(/\s+/g," "))})),t.classList.toggle("hidden",""!==e&&!RegExp(e,"i").test(i.join(":")))}))}removeExtensionFromDisk(e){NProgress.start(),new AjaxRequest(e.href).get().then((()=>{location.reload()})).finally((()=>{NProgress.done()}))}async updateExtension(e){let t=0;const n=await e.resolve(),o=$("<form>");for(let[e,i]of Object.entries(n.updateComments)){const n=$("<input>").attr({type:"radio",name:"version"}).val(e);0===t&&n.attr("checked","checked"),o.append([$("<h3>").append([n," "+securityUtility.encodeHtml(e)]),$("<div>").append(i.replace(/(\r\n|\n\r|\r|\n)/g,"\n").split(/\n/).map((e=>securityUtility.encodeHtml(e))).join("<br>"))]),t++}const i=$("<div>").append([$("<h1>").text(TYPO3.lang["extensionList.updateConfirmation.title"]),$("<h2>").text(TYPO3.lang["extensionList.updateConfirmation.message"]),o]);NProgress.done(),Modal.confirm(TYPO3.lang["extensionList.updateConfirmation.questionVersionComments"],i,Severity.warning,[{text:TYPO3.lang["button.cancel"],active:!0,btnClass:"btn-default",trigger:(e,t)=>t.hideModal()},{text:TYPO3.lang["button.updateExtension"],btnClass:"btn-warning",trigger:(e,t)=>{NProgress.start(),new AjaxRequest(n.url).withQueryArguments({version:$("input:radio[name=version]:checked",t).val()}).get().finally((()=>{location.reload()})),t.hideModal()}}])}}let extensionManagerObject=new ExtensionManager;void 0===TYPO3.ExtensionManager&&(TYPO3.ExtensionManager=extensionManagerObject);export default extensionManagerObject; \ No newline at end of file +import DocumentService from"@typo3/core/document-service.js";import $ from"jquery";import BrowserSession from"@typo3/backend/storage/browser-session.js";import NProgress from"nprogress";import{default as Modal}from"@typo3/backend/modal.js";import Severity from"@typo3/backend/severity.js";import SecurityUtility from"@typo3/core/security-utility.js";import ExtensionManagerRepository from"@typo3/extensionmanager/repository.js";import ExtensionManagerUpdate from"@typo3/extensionmanager/update.js";import ExtensionManagerUploadForm from"@typo3/extensionmanager/upload-form.js";import Tablesort from"tablesort";import"tablesort.dotsep.js";import"@typo3/backend/input/clearable.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import DebounceEvent from"@typo3/core/event/debounce-event.js";import RegularEvent from"@typo3/core/event/regular-event.js";const securityUtility=new SecurityUtility;var ExtensionManagerIdentifier;!function(e){e.extensionlist="typo3-extension-list",e.searchField="#Tx_Extensionmanager_extensionkey"}(ExtensionManagerIdentifier||(ExtensionManagerIdentifier={}));class ExtensionManager{constructor(){this.searchFilterSessionKey="tx-extensionmanager-local-filter";const e=this;DocumentService.ready().then((()=>{this.Update=new ExtensionManagerUpdate,this.UploadForm=new ExtensionManagerUploadForm,this.Repository=new ExtensionManagerRepository;const t=document.getElementById(ExtensionManagerIdentifier.extensionlist);let n;if(null!==t&&(new Tablesort(t),new RegularEvent("click",(function(t){t.preventDefault(),Modal.confirm(TYPO3.lang["extensionList.removalConfirmation.title"],TYPO3.lang["extensionList.removalConfirmation.question"],Severity.error,[{text:TYPO3.lang["button.cancel"],active:!0,btnClass:"btn-default",trigger:()=>{Modal.dismiss()}},{text:TYPO3.lang["button.remove"],btnClass:"btn-danger",trigger:()=>{e.removeExtensionFromDisk(this),Modal.dismiss()}}])})).delegateTo(t,".removeExtension")),$(document).on("click",".onClickMaskExtensionManager",(()=>{NProgress.start()})).on("click","a[data-action=update-extension]",(e=>{e.preventDefault(),NProgress.start(),new AjaxRequest($(e.currentTarget).attr("href")).get().then(this.updateExtension)})).on("change","input[name=unlockDependencyIgnoreButton]",(e=>{$(".t3js-dependencies").toggleClass("disabled",!$(e.currentTarget).prop("checked"))})),null!==(n=document.querySelector(ExtensionManagerIdentifier.searchField))){const e=BrowserSession.get(this.searchFilterSessionKey);null!==e&&(n.value=e,this.filterExtensions(e)),new RegularEvent("submit",(e=>{e.preventDefault()})).bindTo(n.closest("form")),new DebounceEvent("input",(e=>{const t=e.target;BrowserSession.set(this.searchFilterSessionKey,t.value),this.filterExtensions(t.value)}),100).bindTo(n),n.clearable({onClear:()=>{BrowserSession.unset(this.searchFilterSessionKey),this.filterExtensions("")}})}$(document).on("click",".t3-button-action-installdistribution",(()=>{NProgress.start()})),this.Repository.initDom(),this.Update.initializeEvents(),this.UploadForm.initializeEvents()}))}filterExtensions(e){const t=document.querySelectorAll("[data-filterable]"),n=[];t.forEach((e=>{const t=Array.from(e.parentElement.children);n.push(t.indexOf(e))}));document.querySelectorAll("#typo3-extension-list tbody tr").forEach((t=>{const o=n.map((e=>t.children.item(e))),r=[];o.forEach((e=>{r.push(e.textContent.trim().replace(/\s+/g," "))})),t.classList.toggle("hidden",""!==e&&!RegExp(e,"i").test(r.join(":")))}))}removeExtensionFromDisk(e){NProgress.start(),new AjaxRequest(e.href).get().then((()=>{location.reload()})).finally((()=>{NProgress.done()}))}async updateExtension(e){let t=0;const n=await e.resolve(),o=$("<form>");for(let[e,r]of Object.entries(n.updateComments)){const n=$("<input>").attr({type:"radio",name:"version"}).val(e);0===t&&n.attr("checked","checked"),o.append([$("<h3>").append([n," "+securityUtility.encodeHtml(e)]),$("<div>").append(r.replace(/(\r\n|\n\r|\r|\n)/g,"\n").split(/\n/).map((e=>securityUtility.encodeHtml(e))).join("<br>"))]),t++}const r=$("<div>").append([$("<h1>").text(TYPO3.lang["extensionList.updateConfirmation.title"]),$("<h2>").text(TYPO3.lang["extensionList.updateConfirmation.message"]),o]);NProgress.done(),Modal.confirm(TYPO3.lang["extensionList.updateConfirmation.questionVersionComments"],r,Severity.warning,[{text:TYPO3.lang["button.cancel"],active:!0,btnClass:"btn-default",trigger:(e,t)=>t.hideModal()},{text:TYPO3.lang["button.updateExtension"],btnClass:"btn-warning",trigger:(e,t)=>{NProgress.start(),new AjaxRequest(n.url).withQueryArguments({version:$("input:radio[name=version]:checked",t).val()}).get().finally((()=>{location.reload()})),t.hideModal()}}])}}let extensionManagerObject=new ExtensionManager;void 0===TYPO3.ExtensionManager&&(TYPO3.ExtensionManager=extensionManagerObject);export default extensionManagerObject; \ No newline at end of file diff --git a/typo3/sysext/filelist/Classes/FileList.php b/typo3/sysext/filelist/Classes/FileList.php index 384bc8811068e51390df4ee3a127d6a789468202..a12832aab309e41d487789b7344bb5bcae73cdee 100644 --- a/typo3/sysext/filelist/Classes/FileList.php +++ b/typo3/sysext/filelist/Classes/FileList.php @@ -1022,7 +1022,7 @@ class FileList if ($cellOutput !== '') { $icon = $this->iconFactory->getIcon('actions-menu-alternative', Icon::SIZE_SMALL); $title = $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.more'); - $output .= '<div class="btn-group dropdown position-static" data-bs-toggle="tooltip" title="' . htmlspecialchars($title) . '" >' . + $output .= '<div class="btn-group dropdown position-static" title="' . htmlspecialchars($title) . '" >' . '<a href="#actions_' . $fileOrFolderObject->getHashedIdentifier() . '" class="btn btn-default dropdown-toggle dropdown-toggle-no-chevron" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false">' . $icon->render() . '</a>' . '<ul id="actions_' . $fileOrFolderObject->getHashedIdentifier() . '" class="dropdown-menu">' . $cellOutput . '</ul>' . '</div>'; @@ -1164,7 +1164,7 @@ class FileList } return $translations !== [] ? ' - <div class="btn-group dropdown position-static" data-bs-toggle="tooltip" title="' . htmlspecialchars($this->getLanguageService()->getLL('translateMetadata')) . '"> + <div class="btn-group dropdown position-static" title="' . htmlspecialchars($this->getLanguageService()->getLL('translateMetadata')) . '"> <button class="btn btn-default dropdown-toggle dropdown-toggle-no-chevron" type="button" id="translations_' . $file->getHashedIdentifier() . '" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> ' . $this->iconFactory->getIcon('actions-translate', Icon::SIZE_SMALL)->render() . ' </button> diff --git a/typo3/sysext/filelist/Resources/Public/JavaScript/file-list.js b/typo3/sysext/filelist/Resources/Public/JavaScript/file-list.js index 64719430578836db6cf7f1b681080462cda3a750..77b522df49597b141d5f814e7b2f8ddcc51809df 100644 --- a/typo3/sysext/filelist/Resources/Public/JavaScript/file-list.js +++ b/typo3/sysext/filelist/Resources/Public/JavaScript/file-list.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import{lll}from"@typo3/core/lit-helper.js";import DocumentService from"@typo3/core/document-service.js";import Notification from"@typo3/backend/notification.js";import InfoWindow from"@typo3/backend/info-window.js";import{BroadcastMessage}from"@typo3/backend/broadcast-message.js";import broadcastService from"@typo3/backend/broadcast-service.js";import Tooltip from"@typo3/backend/tooltip.js";import NProgress from"nprogress";import Icons from"@typo3/backend/icons.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import RegularEvent from"@typo3/core/event/regular-event.js";import{ModuleStateStorage}from"@typo3/backend/storage/module-state-storage.js";import{default as Modal}from"@typo3/backend/modal.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import Severity from"@typo3/backend/severity.js";import{MultiRecordSelectionSelectors}from"@typo3/backend/multi-record-selection.js";var Selectors;!function(e){e.fileListFormSelector='form[name="fileListForm"]',e.commandSelector='input[name="cmd"]',e.searchFieldSelector='input[name="searchTerm"]',e.pointerFieldSelector='input[name="pointer"]'}(Selectors||(Selectors={}));export const fileListOpenElementBrowser="typo3:filelist:openElementBrowser";export default class Filelist{constructor(){this.downloadFilesAndFolders=e=>{const t=e.target,o=e.detail,i=o.configuration,r=[];o.checkboxes.forEach((e=>{const t=e.closest(MultiRecordSelectionSelectors.elementSelector);t?.dataset[i.folderIdentifier]?r.push(t.dataset[i.folderIdentifier]):t?.dataset[i.fileIdentifier]&&r.push(t.dataset[i.fileIdentifier])})),r.length?this.triggerDownload(r,i.downloadUrl,t):Notification.warning(lll("file_download.invalidSelection"))},this.downloadFolder=e=>{const t=e.target,o=t.dataset.folderIdentifier;this.triggerDownload([o],t.dataset.folderDownload,t)},Filelist.processTriggers(),new RegularEvent(fileListOpenElementBrowser,(e=>{const t=new URL(e.detail.actionUrl,window.location.origin);t.searchParams.set("expandFolder",e.detail.identifier),t.searchParams.set("mode",e.detail.mode);Modal.advanced({type:Modal.types.iframe,content:t.toString(),size:Modal.sizes.large}).addEventListener("typo3-modal-hidden",(()=>{top.list_frame.document.location.reload()}))})).bindTo(document),DocumentService.ready().then((()=>{document.querySelector(".t3-filelist-container");new RegularEvent("click",((e,t)=>{e.preventDefault(),document.dispatchEvent(new CustomEvent(fileListOpenElementBrowser,{detail:{actionUrl:t.href,identifier:t.dataset.identifier,mode:t.dataset.mode}}))})).delegateTo(document,".t3js-element-browser"),Tooltip.initialize(".table-fit a[title]"),new RegularEvent("click",((e,t)=>{e.preventDefault(),Filelist.openInfoPopup(t.dataset.filelistShowItemType,t.dataset.filelistShowItemIdentifier)})).delegateTo(document,"[data-filelist-show-item-identifier][data-filelist-show-item-type]"),new RegularEvent("click",((e,t)=>{e.preventDefault(),Filelist.openInfoPopup("_FILE",t.dataset.identifier)})).delegateTo(document,"a.filelist-file-info"),new RegularEvent("click",((e,t)=>{e.preventDefault(),Filelist.openInfoPopup("_FILE",t.dataset.identifier)})).delegateTo(document,"a.filelist-file-references"),new RegularEvent("click",((e,t)=>{e.preventDefault();const o=t.getAttribute("href");let i=o?encodeURIComponent(o):encodeURIComponent(top.list_frame.document.location.pathname+top.list_frame.document.location.search);top.list_frame.location.href=o+"&redirect="+i})).delegateTo(document,"a.filelist-file-copy"),new RegularEvent("dragstart",((e,t)=>{const o=[],i=document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector+":checked");if(i.length>0)for(let e of i){const t=e.closest("[data-filelist-draggable-container]");o.push({type:t.dataset.type,identifier:t.dataset.identifier,name:t.dataset.name,extra:{referencedElement:t.querySelector("img"),stateIdentifier:t.dataset.stateIdentifier}})}else{const e=t.closest("[data-filelist-draggable-container]");o.push({type:e.dataset.type,identifier:e.dataset.identifier,name:e.dataset.name,extra:{referencedElement:e.querySelector("img"),stateIdentifier:e.dataset.stateIdentifier}})}this.drawDataTransferPreview(e.dataTransfer,o),e.dataTransfer.setData("application/json",JSON.stringify(o))})).delegateTo(document,'.t3-filelist-container [draggable="true"]')})),new RegularEvent("multiRecordSelection:action:edit",this.editFileMetadata).bindTo(document),new RegularEvent("multiRecordSelection:action:delete",this.deleteMultiple).bindTo(document),new RegularEvent("multiRecordSelection:action:download",this.downloadFilesAndFolders).bindTo(document),new RegularEvent("click",this.downloadFolder).delegateTo(document,"button[data-folder-download]"),new RegularEvent("multiRecordSelection:action:copyMarked",(e=>{Filelist.submitClipboardFormWithCommand("copyMarked",e.target)})).bindTo(document),new RegularEvent("multiRecordSelection:action:removeMarked",(e=>{Filelist.submitClipboardFormWithCommand("removeMarked",e.target)})).bindTo(document),new RegularEvent("multiRecordSelection:checkbox:state:changed",(e=>{const t=e.target,o=t.closest(MultiRecordSelectionSelectors.elementSelector);if(null!==o&&(o.draggable=t.checked),t.checked){document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector+":not(:checked)").forEach((e=>{const t=e.closest("[data-filelist-draggable]");t.draggable=!1,t.querySelectorAll("[data-filelist-draggable]").forEach((e=>{e.draggable=!1}))}))}else{0===document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector+":checked").length&&document.querySelectorAll(".t3-filelist-container [data-filelist-draggable]").forEach((e=>{e.draggable=!0,e.querySelectorAll("[data-filelist-draggable]").forEach((e=>{e.draggable=!0}))}))}})).bindTo(document);const e=""!==document.querySelector([Selectors.fileListFormSelector,Selectors.searchFieldSelector].join(" "))?.value;new RegularEvent("search",(t=>{const o=t.target;""===o.value&&e&&o.closest(Selectors.fileListFormSelector)?.submit()})).delegateTo(document,Selectors.searchFieldSelector)}static submitClipboardFormWithCommand(e,t){const o=t.closest(Selectors.fileListFormSelector);if(!o)return;const i=o.querySelector(Selectors.commandSelector);if(i){if(i.value=e,"copyMarked"===e||"removeMarked"===e){const e=o.querySelector(Selectors.pointerFieldSelector),t=Filelist.parseQueryParameters(document.location).pointer;e&&t&&(e.value=t)}o.submit()}}static openInfoPopup(e,t){InfoWindow.showItem(e,t)}static processTriggers(){const e=document.querySelector(".filelist-main");if(null===e)return;const t=encodeURIComponent(e.dataset.filelistCurrentIdentifier);ModuleStateStorage.update("file",t,!0,void 0),Filelist.emitTreeUpdateRequest(e.dataset.filelistCurrentIdentifier)}static emitTreeUpdateRequest(e){const t=new BroadcastMessage("filelist","treeUpdateRequested",{type:"folder",identifier:e});broadcastService.post(t)}static parseQueryParameters(e){let t={};if(e&&Object.prototype.hasOwnProperty.call(e,"search")){let o=e.search.substr(1).split("&");for(let e=0;e<o.length;e++){const i=o[e].split("=");t[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}}return t}static getReturnUrl(e){return""===e&&(e=top.list_frame.document.location.pathname+top.list_frame.document.location.search),encodeURIComponent(e)}drawDataTransferPreview(e,t){if(null===e||0===t.length)return;const o="dragstart-canvas";document.getElementById(o)?.remove();const i=document.createElement("canvas"),r=i.getContext("2d");if(!t.some((e=>!(e.extra.referencedElement instanceof HTMLImageElement)))&&t.length<=5){const e=this.calculateDrawImageCanvasConfiguration(t);i.width=e.width,i.height=e.height;for(let t of e.operations)r.drawImage(t.reference,t.offsetX,t.offsetY)}else{const e=1,o=t.length.toString(10);r.font="16px verdana, arial, sans-serif";const l=r.measureText(o),n=Math.max(Math.ceil(l.width))+32,a=32;i.width=n,i.height=a,r.beginPath(),r.rect(0,0,n,a),r.fillStyle="#f2f8fe",r.fill(),r.lineWidth=e,r.strokeStyle="#3393eb",r.stroke(),r.fillStyle="#313131",r.textAlign="center",r.textBaseline="middle",r.font="16px verdana, arial, sans-serif",r.fillText(o,n/2,a/2)}const l=document.createElement("img");l.id=o,l.src=i.toDataURL("data/png"),document.body.appendChild(l),e.setDragImage(l,0,0)}calculateDrawImageCanvasConfiguration(e){let t=0,o=0,i=0,r=0,l=[];e=e.filter((e=>e.extra.referencedElement instanceof HTMLImageElement));for(let n=0;n<e.length;++n){const a=e[n].extra.referencedElement;n>0&&(i+=Math.max(20,Math.floor(a.width/100*20)),r+=Math.max(20,Math.floor(a.height/100*20))),a.width+i>t&&(t=a.width+i),a.height+r>o&&(o=a.height+r),l.push({offsetX:i,offsetY:r,reference:a})}return{width:t,height:o,operations:l}}deleteMultiple(e){e.preventDefault();const t=e.detail.configuration;Modal.advanced({title:t.title||"Delete",content:t.content||"Are you sure you want to delete those files and folders?",severity:SeverityEnum.warning,buttons:[{text:TYPO3.lang["button.close"]||"Close",active:!0,btnClass:"btn-default",trigger:(e,t)=>t.hideModal()},{text:t.ok||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+Severity.getCssClass(SeverityEnum.warning),trigger:(t,o)=>{Filelist.submitClipboardFormWithCommand("delete",e.target),o.hideModal()}}]})}editFileMetadata(e){e.preventDefault();const t=e.detail,o=t.configuration;if(!o||!o.idField||!o.table)return;const i=[];t.checkboxes.forEach((e=>{const t=e.closest(MultiRecordSelectionSelectors.elementSelector);null!==t&&t.dataset[o.idField]&&i.push(t.dataset[o.idField])})),i.length?window.location.href=top.TYPO3.settings.FormEngine.moduleUrl+"&edit["+o.table+"]["+i.join(",")+"]=edit&returnUrl="+Filelist.getReturnUrl(o.returnUrl||""):Notification.warning("The selected elements can not be edited.")}triggerDownload(e,t,o){Notification.info(lll("file_download.prepare"),"",2);const i=o.innerHTML;o.setAttribute("disabled","disabled"),Icons.getIcon("spinner-circle-dark",Icons.sizes.small).then((e=>{o.innerHTML=e})),NProgress.configure({parent:"#typo3-filelist",showSpinner:!1}).start(),new AjaxRequest(t).post({items:e}).then((async e=>{let t=e.response.headers.get("Content-Disposition");if(!t){const t=await e.resolve();return void(!1===t.success&&t.status?Notification.warning(lll("file_download."+t.status),lll("file_download."+t.status+".message"),10):Notification.error(lll("file_download.error")))}t=t.substring(t.indexOf(" filename=")+10);const o=await e.raw().arrayBuffer(),i=new Blob([o],{type:e.raw().headers.get("Content-Type")}),r=URL.createObjectURL(i),l=document.createElement("a");l.href=r,l.download=t,document.body.appendChild(l),l.click(),URL.revokeObjectURL(r),document.body.removeChild(l),Notification.success(lll("file_download.success"),"",2)})).catch((()=>{Notification.error(lll("file_download.error"))})).finally((()=>{NProgress.done(),o.removeAttribute("disabled"),o.innerHTML=i}))}} \ No newline at end of file +import{lll}from"@typo3/core/lit-helper.js";import DocumentService from"@typo3/core/document-service.js";import Notification from"@typo3/backend/notification.js";import InfoWindow from"@typo3/backend/info-window.js";import{BroadcastMessage}from"@typo3/backend/broadcast-message.js";import broadcastService from"@typo3/backend/broadcast-service.js";import NProgress from"nprogress";import Icons from"@typo3/backend/icons.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import RegularEvent from"@typo3/core/event/regular-event.js";import{ModuleStateStorage}from"@typo3/backend/storage/module-state-storage.js";import{default as Modal}from"@typo3/backend/modal.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import Severity from"@typo3/backend/severity.js";import{MultiRecordSelectionSelectors}from"@typo3/backend/multi-record-selection.js";var Selectors;!function(e){e.fileListFormSelector='form[name="fileListForm"]',e.commandSelector='input[name="cmd"]',e.searchFieldSelector='input[name="searchTerm"]',e.pointerFieldSelector='input[name="pointer"]'}(Selectors||(Selectors={}));export const fileListOpenElementBrowser="typo3:filelist:openElementBrowser";export default class Filelist{constructor(){this.downloadFilesAndFolders=e=>{const t=e.target,o=e.detail,r=o.configuration,i=[];o.checkboxes.forEach((e=>{const t=e.closest(MultiRecordSelectionSelectors.elementSelector);t?.dataset[r.folderIdentifier]?i.push(t.dataset[r.folderIdentifier]):t?.dataset[r.fileIdentifier]&&i.push(t.dataset[r.fileIdentifier])})),i.length?this.triggerDownload(i,r.downloadUrl,t):Notification.warning(lll("file_download.invalidSelection"))},this.downloadFolder=e=>{const t=e.target,o=t.dataset.folderIdentifier;this.triggerDownload([o],t.dataset.folderDownload,t)},Filelist.processTriggers(),new RegularEvent(fileListOpenElementBrowser,(e=>{const t=new URL(e.detail.actionUrl,window.location.origin);t.searchParams.set("expandFolder",e.detail.identifier),t.searchParams.set("mode",e.detail.mode);Modal.advanced({type:Modal.types.iframe,content:t.toString(),size:Modal.sizes.large}).addEventListener("typo3-modal-hidden",(()=>{top.list_frame.document.location.reload()}))})).bindTo(document),DocumentService.ready().then((()=>{document.querySelector(".t3-filelist-container");new RegularEvent("click",((e,t)=>{e.preventDefault(),document.dispatchEvent(new CustomEvent(fileListOpenElementBrowser,{detail:{actionUrl:t.href,identifier:t.dataset.identifier,mode:t.dataset.mode}}))})).delegateTo(document,".t3js-element-browser"),new RegularEvent("click",((e,t)=>{e.preventDefault(),Filelist.openInfoPopup(t.dataset.filelistShowItemType,t.dataset.filelistShowItemIdentifier)})).delegateTo(document,"[data-filelist-show-item-identifier][data-filelist-show-item-type]"),new RegularEvent("click",((e,t)=>{e.preventDefault(),Filelist.openInfoPopup("_FILE",t.dataset.identifier)})).delegateTo(document,"a.filelist-file-info"),new RegularEvent("click",((e,t)=>{e.preventDefault(),Filelist.openInfoPopup("_FILE",t.dataset.identifier)})).delegateTo(document,"a.filelist-file-references"),new RegularEvent("click",((e,t)=>{e.preventDefault();const o=t.getAttribute("href");let r=o?encodeURIComponent(o):encodeURIComponent(top.list_frame.document.location.pathname+top.list_frame.document.location.search);top.list_frame.location.href=o+"&redirect="+r})).delegateTo(document,"a.filelist-file-copy"),new RegularEvent("dragstart",((e,t)=>{const o=[],r=document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector+":checked");if(r.length>0)for(let e of r){const t=e.closest("[data-filelist-draggable-container]");o.push({type:t.dataset.type,identifier:t.dataset.identifier,name:t.dataset.name,extra:{referencedElement:t.querySelector("img"),stateIdentifier:t.dataset.stateIdentifier}})}else{const e=t.closest("[data-filelist-draggable-container]");o.push({type:e.dataset.type,identifier:e.dataset.identifier,name:e.dataset.name,extra:{referencedElement:e.querySelector("img"),stateIdentifier:e.dataset.stateIdentifier}})}this.drawDataTransferPreview(e.dataTransfer,o),e.dataTransfer.setData("application/json",JSON.stringify(o))})).delegateTo(document,'.t3-filelist-container [draggable="true"]')})),new RegularEvent("multiRecordSelection:action:edit",this.editFileMetadata).bindTo(document),new RegularEvent("multiRecordSelection:action:delete",this.deleteMultiple).bindTo(document),new RegularEvent("multiRecordSelection:action:download",this.downloadFilesAndFolders).bindTo(document),new RegularEvent("click",this.downloadFolder).delegateTo(document,"button[data-folder-download]"),new RegularEvent("multiRecordSelection:action:copyMarked",(e=>{Filelist.submitClipboardFormWithCommand("copyMarked",e.target)})).bindTo(document),new RegularEvent("multiRecordSelection:action:removeMarked",(e=>{Filelist.submitClipboardFormWithCommand("removeMarked",e.target)})).bindTo(document),new RegularEvent("multiRecordSelection:checkbox:state:changed",(e=>{const t=e.target,o=t.closest(MultiRecordSelectionSelectors.elementSelector);if(null!==o&&(o.draggable=t.checked),t.checked){document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector+":not(:checked)").forEach((e=>{const t=e.closest("[data-filelist-draggable]");t.draggable=!1,t.querySelectorAll("[data-filelist-draggable]").forEach((e=>{e.draggable=!1}))}))}else{0===document.querySelectorAll(MultiRecordSelectionSelectors.checkboxSelector+":checked").length&&document.querySelectorAll(".t3-filelist-container [data-filelist-draggable]").forEach((e=>{e.draggable=!0,e.querySelectorAll("[data-filelist-draggable]").forEach((e=>{e.draggable=!0}))}))}})).bindTo(document);const e=""!==document.querySelector([Selectors.fileListFormSelector,Selectors.searchFieldSelector].join(" "))?.value;new RegularEvent("search",(t=>{const o=t.target;""===o.value&&e&&o.closest(Selectors.fileListFormSelector)?.submit()})).delegateTo(document,Selectors.searchFieldSelector)}static submitClipboardFormWithCommand(e,t){const o=t.closest(Selectors.fileListFormSelector);if(!o)return;const r=o.querySelector(Selectors.commandSelector);if(r){if(r.value=e,"copyMarked"===e||"removeMarked"===e){const e=o.querySelector(Selectors.pointerFieldSelector),t=Filelist.parseQueryParameters(document.location).pointer;e&&t&&(e.value=t)}o.submit()}}static openInfoPopup(e,t){InfoWindow.showItem(e,t)}static processTriggers(){const e=document.querySelector(".filelist-main");if(null===e)return;const t=encodeURIComponent(e.dataset.filelistCurrentIdentifier);ModuleStateStorage.update("file",t,!0,void 0),Filelist.emitTreeUpdateRequest(e.dataset.filelistCurrentIdentifier)}static emitTreeUpdateRequest(e){const t=new BroadcastMessage("filelist","treeUpdateRequested",{type:"folder",identifier:e});broadcastService.post(t)}static parseQueryParameters(e){let t={};if(e&&Object.prototype.hasOwnProperty.call(e,"search")){let o=e.search.substr(1).split("&");for(let e=0;e<o.length;e++){const r=o[e].split("=");t[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}}return t}static getReturnUrl(e){return""===e&&(e=top.list_frame.document.location.pathname+top.list_frame.document.location.search),encodeURIComponent(e)}drawDataTransferPreview(e,t){if(null===e||0===t.length)return;const o="dragstart-canvas";document.getElementById(o)?.remove();const r=document.createElement("canvas"),i=r.getContext("2d");if(!t.some((e=>!(e.extra.referencedElement instanceof HTMLImageElement)))&&t.length<=5){const e=this.calculateDrawImageCanvasConfiguration(t);r.width=e.width,r.height=e.height;for(let t of e.operations)i.drawImage(t.reference,t.offsetX,t.offsetY)}else{const e=1,o=t.length.toString(10);i.font="16px verdana, arial, sans-serif";const n=i.measureText(o),l=Math.max(Math.ceil(n.width))+32,a=32;r.width=l,r.height=a,i.beginPath(),i.rect(0,0,l,a),i.fillStyle="#f2f8fe",i.fill(),i.lineWidth=e,i.strokeStyle="#3393eb",i.stroke(),i.fillStyle="#313131",i.textAlign="center",i.textBaseline="middle",i.font="16px verdana, arial, sans-serif",i.fillText(o,l/2,a/2)}const n=document.createElement("img");n.id=o,n.src=r.toDataURL("data/png"),document.body.appendChild(n),e.setDragImage(n,0,0)}calculateDrawImageCanvasConfiguration(e){let t=0,o=0,r=0,i=0,n=[];e=e.filter((e=>e.extra.referencedElement instanceof HTMLImageElement));for(let l=0;l<e.length;++l){const a=e[l].extra.referencedElement;l>0&&(r+=Math.max(20,Math.floor(a.width/100*20)),i+=Math.max(20,Math.floor(a.height/100*20))),a.width+r>t&&(t=a.width+r),a.height+i>o&&(o=a.height+i),n.push({offsetX:r,offsetY:i,reference:a})}return{width:t,height:o,operations:n}}deleteMultiple(e){e.preventDefault();const t=e.detail.configuration;Modal.advanced({title:t.title||"Delete",content:t.content||"Are you sure you want to delete those files and folders?",severity:SeverityEnum.warning,buttons:[{text:TYPO3.lang["button.close"]||"Close",active:!0,btnClass:"btn-default",trigger:(e,t)=>t.hideModal()},{text:t.ok||TYPO3.lang["button.ok"]||"OK",btnClass:"btn-"+Severity.getCssClass(SeverityEnum.warning),trigger:(t,o)=>{Filelist.submitClipboardFormWithCommand("delete",e.target),o.hideModal()}}]})}editFileMetadata(e){e.preventDefault();const t=e.detail,o=t.configuration;if(!o||!o.idField||!o.table)return;const r=[];t.checkboxes.forEach((e=>{const t=e.closest(MultiRecordSelectionSelectors.elementSelector);null!==t&&t.dataset[o.idField]&&r.push(t.dataset[o.idField])})),r.length?window.location.href=top.TYPO3.settings.FormEngine.moduleUrl+"&edit["+o.table+"]["+r.join(",")+"]=edit&returnUrl="+Filelist.getReturnUrl(o.returnUrl||""):Notification.warning("The selected elements can not be edited.")}triggerDownload(e,t,o){Notification.info(lll("file_download.prepare"),"",2);const r=o.innerHTML;o.setAttribute("disabled","disabled"),Icons.getIcon("spinner-circle-dark",Icons.sizes.small).then((e=>{o.innerHTML=e})),NProgress.configure({parent:"#typo3-filelist",showSpinner:!1}).start(),new AjaxRequest(t).post({items:e}).then((async e=>{let t=e.response.headers.get("Content-Disposition");if(!t){const t=await e.resolve();return void(!1===t.success&&t.status?Notification.warning(lll("file_download."+t.status),lll("file_download."+t.status+".message"),10):Notification.error(lll("file_download.error")))}t=t.substring(t.indexOf(" filename=")+10);const o=await e.raw().arrayBuffer(),r=new Blob([o],{type:e.raw().headers.get("Content-Type")}),i=URL.createObjectURL(r),n=document.createElement("a");n.href=i,n.download=t,document.body.appendChild(n),n.click(),URL.revokeObjectURL(i),document.body.removeChild(n),Notification.success(lll("file_download.success"),"",2)})).catch((()=>{Notification.error(lll("file_download.error"))})).finally((()=>{NProgress.done(),o.removeAttribute("disabled"),o.innerHTML=r}))}} \ No newline at end of file diff --git a/typo3/sysext/form/Resources/Private/Templates/Backend/FormManager/Index.html b/typo3/sysext/form/Resources/Private/Templates/Backend/FormManager/Index.html index 30119d537723341549520fed81fc7f079824d640..48eef146d611a26a86acc11300f2558176e81f0e 100644 --- a/typo3/sysext/form/Resources/Private/Templates/Backend/FormManager/Index.html +++ b/typo3/sysext/form/Resources/Private/Templates/Backend/FormManager/Index.html @@ -34,17 +34,17 @@ <td class="col-icon"> <f:if condition="{form.invalid}"> <f:then> - <span title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.invalid')}" data-bs-toggle="tooltip" data-bs-placement="top"> + <span title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.invalid')}"> <core:icon identifier="overlay-missing" /> </span> </f:then> <f:else if="{form.duplicateIdentifier}"> - <span title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.duplicate_identifier')} {form.identifier}" data-bs-toggle="tooltip" data-bs-placement="top"> + <span title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.duplicate_identifier')} {form.identifier}"> <core:icon identifier="overlay-missing" /> </span> </f:else> <f:else> - <span title="id={form.identifier}" data-bs-toggle="tooltip" data-bs-placement="right"> + <span title="id={form.identifier}"> <core:icon identifier="content-form" /> </span> </f:else> @@ -56,7 +56,7 @@ <div title="{form.name}">{form.name}</div> </f:then> <f:else> - <f:link.action controller="FormEditor" action="index" arguments="{formPersistenceIdentifier: form.persistenceIdentifier}" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.edit_form')}" data="{toggle: 'tooltip', placement: 'right'}">{form.name}</f:link.action> + <f:link.action controller="FormEditor" action="index" arguments="{formPersistenceIdentifier: form.persistenceIdentifier}" title="{f:translate(key: 'LLL:EXT:form/Resources/Private/Language/Database.xlf:formManager.edit_form')}">{form.name}</f:link.action> </f:else> </f:if> </td> diff --git a/typo3/sysext/form/Resources/Public/Css/form.css b/typo3/sysext/form/Resources/Public/Css/form.css index 789447ba20f32cdf0688441d474594195591787c..58d032b45a1e1bd99d75ab184eae88be24d186e6 100644 --- a/typo3/sysext/form/Resources/Public/Css/form.css +++ b/typo3/sysext/form/Resources/Public/Css/form.css @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -.form-editor{padding:0 .5em}.form-control-wrap{margin:0;padding:.5rem 0}.form-control-wrap .table{margin:0}.form-control-wrap .help-block{margin-bottom:0}.form-check.form-switch{margin-bottom:0;padding-bottom:.5rem}.form-group-select{padding-bottom:.5rem}.form-group-select .form-control-wrap{padding:0}.form-group-select .t3-form-add-collection-element{padding-bottom:0}.form-group-select .form-select{margin-top:.5rem}.t3-form-x-component{position:absolute;top:0;height:100%;line-height:inherit;background:#f5f5f5}.t3-form-x-component a{text-decoration:none}.t3-form-x-component ol,.t3-form-x-component ul:not(.dropdown-menu){list-style:none;padding:0}.t3-form-x-component .form-sortable-ghost{outline-offset:-1px!important}.t3-form-x-component-inner-wrapper{position:relative;padding:1.5em}#t3-form-navigation-component{overflow:hidden;left:0}#t3-form-structure-panel{overflow:auto;padding-top:var(--module-docheader-height);height:100%}#t3-form-structure-panel .icon{z-index:1}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container,#t3-form-structure-panel .tree li>div{border:1px solid transparent;cursor:pointer}#t3-form-structure-panel .tree .svg-wrapper svg{overflow:visible;position:relative;top:-1em;left:.6em}#t3-form-structure-panel .tree .svg-wrapper path{fill:none;shape-rendering:crispEdges;stroke:#ddd;stroke-width:1}#t3-form-structure-panel .tree li{white-space:nowrap}#t3-form-structure-panel .tree li.mjs-nestedSortable-collapsed>ol{display:none}#t3-form-structure-panel .tree li.mjs-nestedSortable-collapsed>div>span[data-identifier=treeExpander]{transform:rotate(0);transition:transform .2s}#t3-form-structure-panel .tree li.mjs-nestedSortable-expanded>div>span[data-identifier=treeExpander]{transform:rotate(90deg);transition:transform .2s}#t3-form-structure-panel .tree li small{padding-left:.5em;font-size:80%}#t3-form-structure-panel .tree .t3-form-icon{margin-right:.5em;margin-left:.5em}#t3-form-structure-panel .tree .t3-form-element-has-children>div .t3-form-icon{margin-left:.1em}#t3-form-structure-panel .tree .sortable-hover{outline:1px solid #aaa}#t3-form-structure-panel .icon{margin-top:1px}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container,#t3-form-structure-panel .tree li>div{height:20px}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container>span,#t3-form-structure-panel .tree li>div>span{display:inline-block;vertical-align:top;line-height:20px}#t3-form-structure-panel #t3-form-navigation-component-tree-root{width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container:hover,#t3-form-structure-panel .t3-form-form-element-selected,#t3-form-structure-panel .t3-form-root-element-selected,#t3-form-structure-panel .tree li>div:hover{background-color:#f2f2f2;border-color:#dcdcdc;border-radius:2px;margin-left:-20px;padding-left:20px;margin-right:-1.3em}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container.t3-form-root-element-selected,#t3-form-structure-panel #t3-form-navigation-component-tree-root-container.t3-form-root-element-selected:hover,#t3-form-structure-panel .tree li>.t3-form-form-element-selected,#t3-form-structure-panel .tree li>.t3-form-form-element-selected:hover{background-color:#fff;border-color:#dcdcdc}#t3-form-structure-panel .t3-form-x-component-inner-wrapper{padding-top:2.5em}#t3-form-structure-panel .form-sortable-drag #t3-form-navigation-component-tree-root-container:hover,#t3-form-structure-panel .form-sortable-drag .t3-form-form-element-selected,#t3-form-structure-panel .form-sortable-drag .t3-form-root-element-selected,#t3-form-structure-panel .form-sortable-drag>div:hover{background-color:transparent!important;border-color:transparent!important}#t3-form-structure-panel .form-sortable-drag svg{opacity:0}#t3-form-structure-panel .mjs-nestedSortable-branch span[data-identifier=treeExpander]{margin-left:-1.7em;margin-top:-2px}#t3-form-structure-panel .mjs-nestedSortable-leaf span.t3-form-icon{margin-left:initial}.form-group.t3-form-collection-element-remove-button,.form-group.t3-form-inspector-validators-editor-removeButton,.t3-form-inspector-finishers-editor-removeButton{margin:0!important;font-size:0}#t3-form-inspector-panels-container{overflow:hidden;right:0;padding-top:var(--module-docheader-height)}#t3-form-inspector-panels{overflow:auto;height:100%}#t3-form-inspector{padding:1em 0}#t3-form-inspector h2,#t3-form-inspector h3,#t3-form-inspector h4{margin:0;padding:.1em .2em .2em .5em;border-top:1px solid var(--module-docheader-border);clear:both;font:inherit;font-weight:700}#t3-form-inspector h2{padding-bottom:1em;border:none;border-bottom:1px solid var(--module-docheader-border)}#t3-form-inspector>h2:first-child{border-top:none}#t3-form-inspector h3{color:#000;padding-top:.3em;border:none}#t3-form-inspector h4{padding:.8em 3.5em .8em 2.8em;font-weight:500;background-color:#ddd}#t3-form-inspector h4 span[data-template-property=label]{vertical-align:top}#t3-form-inspector .form-section-headline{padding:0}#t3-form-inspector .icon-size-small{line-height:1.5}#t3-form-inspector .input-group .t3-form-controls{flex:1 1 auto}#t3-form-inspector .input-group-btn{position:static;line-height:13px}#t3-form-inspector>.t3-form-remove-element-button{padding-top:1rem;border-top:1px solid var(--module-docheader-border)}#t3-form-inspector>.t3-form-remove-element-button .btn{width:100%}#t3-form-inspector-validators.sortable+.t3-form-remove-element-button{margin-top:.25rem}#t3-form-inspector .t3-form-inspector-finishers-editor-removeButton .btn,#t3-form-inspector .t3-form-inspector-validators-editor-removeButton .btn{padding:.25rem .5rem;font-size:.65625rem}#t3-form-inspector .t3-form-inspector-finishers-editor-removeButton .t3-form-remove-element-button-label,#t3-form-inspector .t3-form-inspector-validators-editor-removeButton .t3-form-remove-element-button-label{display:none}#t3-form-inspector .t3-form-add-collection-element,#t3-form-inspector .t3-form-control-group{clear:both}#t3-form-inspector .t3-form-control-group.form-group #t3-form-add-finisher.t3-form-add-collection-element,#t3-form-inspector .t3-form-control-group.form-group #t3-form-add-validator.t3-form-add-collection-element{margin:initial}#t3-form-inspector .t3-form-inspector-editor-requiredValidator label{cursor:pointer}#t3-form-inspector .t3-form-dropdown-buttons.open{position:static}#t3-form-inspector .t3-form-dropdown-buttons.open .dropdown-menu{width:100%}#t3-form-inspector .t3-form-dropdown-buttons.open .dropdown-menu a{overflow:hidden;text-overflow:ellipsis}.t3-form-add-collection-element{padding-bottom:.5rem}.t3-form-collection-container{margin-top:-1em;padding:.5em}.t3-form-collection-container .form-sortable-handle{cursor:auto}.t3-form-collection-container h4{cursor:move}.t3-form-collection-container .t3-form-control-group{margin-right:.5em;margin-left:.5em}.t3-form-collection-element{position:relative;margin-bottom:.5em;border:1px solid var(--module-docheader-border);border-top:none;background:#f5f5f5}.t3-form-collection-element .t3-form-collection-element-remove-button{position:absolute;right:.5em;top:.5em}.t3-form-collection-element h4>.icon{position:absolute;left:1em}.t3-form-collection-element .form-editor{padding:0}.t3-form-collection-element .panel-collapse .form-editor:first-child{margin-top:1em}.t3-form-validator-editor .collapsed .icon-actions-view-table-expand{transform:rotate(0);transition:transform .2s}.t3-form-validator-editor .icon-actions-view-table-expand{transform:rotate(90deg);transition:transform .2s}.property-grid .form-control{min-width:auto;font-size:.9em}.property-grid .table th{font-size:.9em}.property-grid .table>tbody>tr{cursor:pointer;background-color:#fff}.property-grid .table>tbody>tr:last-child{cursor:auto}.property-grid .table>tbody>tr>td{padding:.6em .3em;text-align:center}.property-grid .table>tbody>tr>td:first-child{width:35px}.property-grid .table>tbody>tr>td:nth-child(2),.property-grid .table>tbody>tr>td:nth-child(3){width:75px}.property-grid .table>tbody>tr>td:nth-child(4){width:65px}.property-grid .table>tbody>tr>td:nth-child(5){width:35px}.property-grid .sort-row-field{cursor:move}.property-grid .form-sortable-drag td{border:none}.property-grid .form-sortable-ghost{height:45px;border-left:1px solid var(--module-docheader-border)!important;border-right:1px solid var(--module-docheader-border)!important;outline-offset:-5px!important}.property-grid .form-check{padding-left:3.2em}#t3-form-stage-inner-container{position:relative;left:-5px;display:inline-block;width:90%;max-width:800px;text-align:left}#t3-form-stage-container{overflow:auto;position:relative;height:calc(100% - var(--module-docheader-height));max-height:100%;text-align:center}#t3-form-stage-container ol,#t3-form-stage-container ul{list-style:none}#t3-form-stage-container .form-section{border:none}#t3-form-stage-container .panel-heading button{outline:0}#t3-form-stage-container .panel-heading .paginiation-label{margin-right:1em}#t3-form-stage-container .t3-form-new-element-container{display:flex;justify-content:center;align-items:center;height:62px;border:1px dashed #ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-page-title{margin:0 0 .5em}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage-inner-container{overflow:hidden}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit:not(.t3-form-element-toplevel){margin-bottom:1em;padding-bottom:1px;outline:1px solid #ddd;outline-offset:-1px}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit .sortable-hover{outline-color:#777}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit .t3-form-form-composit-element-selected{outline-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit>.form-sortable-handle{margin:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit>.form-sortable-handle div.t3-form-form-element-body{border-bottom:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit.sortable-hover>.form-sortable-handle{border-color:#777}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-icon-container,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit.sortable-hover>.form-sortable-handle .t3-form-icon-container{background-color:#777}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle{position:relative;height:62px;margin-bottom:1em;border:1px solid #ddd;background-color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:first-of-type{margin-top:1em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-validator-list{right:0;transition:right .2s}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-element-info .element-content div,#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-element-info .element-content span{color:#5a5a5a}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-validator-info .t3-form-icon{margin-right:75px;transition:margin .2s}#t3-form-stage-container.t3-form-stage-viewmode-abstract .ui-state-disabled{cursor:auto}#t3-form-stage-container.t3-form-stage-viewmode-abstract .ui-state-disabled:hover{background:0 0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-ghost{margin-bottom:1em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-icon-container{float:left;width:40px;height:100%;padding:1em;cursor:move;background-color:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-icon-container .t3-form-icon{height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-form-element-body{height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info{position:relative;float:left;width:55%;height:100%;padding-left:1em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:after,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:before{z-index:1;display:block;content:"";position:absolute;bottom:0;right:0;left:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:before{height:.8em;background:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:after{bottom:.8em;height:1em;background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-label-container{float:left;position:relative;width:45%;height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-label-container .element-label{overflow:hidden;position:absolute;top:50%;width:100%;text-overflow:ellipsis;transform:translateY(-50%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-content{padding-top:1em;white-space:nowrap;font-size:.8em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-content div,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-content span{color:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info{position:relative;overflow:hidden;float:right;height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-icon{height:100%;z-index:1;margin-left:1em;transition:margin .3s;filter:grayscale(100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list{position:absolute;top:0;right:-100px;width:100px;height:100%;padding:1em 1em 1em 35px;font-size:.8em;transition:right .3s;background-color:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:after,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:before{z-index:1;display:block;content:"";position:absolute;bottom:0;right:0;left:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:before{height:1em;background:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:after{bottom:1em;height:1em;background:linear-gradient(to bottom,rgba(221,221,221,0) 0,#ddd 100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .validator-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#5a5a5a}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected{position:relative;padding-top:35px;height:97px;border:none}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-form-element-body{border:1px solid #0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-icon-container{background-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-element-info .element-content div,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-element-info .element-content span{color:#5a5a5a}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-list{right:0;transition:none;background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-list:before{background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-list:after{background:linear-gradient(to bottom,rgba(235,243,251,0) 0,#ebf3fb 100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-info .t3-form-icon{margin-right:75px;filter:none}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container{position:absolute;top:0;right:0;width:100%;height:35px;border:1px solid #0078e6;background-color:#0078e6;padding-right:.7em;padding-top:.4em}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:after,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:before{position:absolute;top:0;display:block;width:1px;height:100%;content:" ";background-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:before{left:-1px}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:after{right:-1px}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .caret{color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .t3-form-dropdown-buttons .icon{margin-right:.5em}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar{float:right}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn{background-color:#fff;border-color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn.active,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn:focus,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn:hover{background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn .icon svg path{fill:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .meta-label{display:inline-block;top:1em;left:5em;bottom:auto;font-size:.9em;color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .meta-label span{color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected{border-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading{background-color:#0078e6;border-color:#0078e6;color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn{background-color:#fff;border-color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn.active,#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn:focus,#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn:hover{background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn .icon svg path{fill:#0078e6}@media (max-width:1199px){#t3-form-stage-container.t3-form-stage-viewmode-preview #t3-form-stage-inner-container{width:600px}}#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=date],#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=password],#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=text],#t3-form-stage-container.t3-form-stage-viewmode-preview select,#t3-form-stage-container.t3-form-stage-viewmode-preview textarea{color:#000;background-color:#e5e5e5}#t3-form-stage-container.t3-form-stage-viewmode-preview ::-moz-placeholder{color:#737373;font-style:italic}#t3-form-stage-container.t3-form-stage-viewmode-preview ::placeholder{color:#737373;font-style:italic}#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=date]{display:block;width:100%;height:32px;padding:.6em;font-size:12px;line-height:1.5;background-image:none;border:1px solid var(--module-docheader-border);border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#t3-form-stage-container.t3-form-stage-viewmode-preview select[multiple=multiple]{height:auto;min-height:32px}#t3-form-stage-container.t3-form-stage-viewmode-preview textarea{min-height:100px}#t3-form-stage-container.t3-form-stage-viewmode-preview .container{width:auto}#t3-form-stage-container.t3-form-stage-viewmode-preview legend.t3-form-form-element-selected{border-color:var(--module-docheader-border)}#t3-form-stage-container.t3-form-stage-viewmode-preview .form-navigation .btn-group button,#t3-form-stage-container.t3-form-stage-viewmode-preview .form-navigation .btn-group span{display:inline-block;margin-right:1em}#t3-form-stage-container.t3-form-stage-viewmode-preview .preview-table-first-col{width:30%}#t3-form-stage-container.t3-form-stage-viewmode-preview .t3-form-element-preview{position:relative;display:inline-block;width:100%}#t3-form-stage-container.t3-form-stage-viewmode-preview .t3-form-new-element-container{display:none}#t3-form-stage-container.t3-form-stage-viewmode-preview .t3-form-element-toplevel>form>.tooltip{top:100px!important}#t3-form-stage-container #t3-form-stage{margin-bottom:0;padding-top:.5em}#t3-form-stage-container #t3-form-stage>ol,#t3-form-stage-container #t3-form-stage>ol>li>ol{padding-left:0;padding-right:0}#t3-form-stage-container #t3-form-stage .t3-form-element-toplevel>.t3-form-form-element-selected{height:auto;padding-top:0}#t3-form-stage-container #t3-form-stage .t3-form-element-toplevel>.t3-form-form-element-selected .btn-toolbar-container{display:none}.meta-label{z-index:2;position:absolute;bottom:1em;left:5.5em;display:none;color:#0078e6;line-height:1.6;font-size:.8em}.form-sortable-handle:hover>.meta-label{display:inline-block}.form-sortable-ghost,.t3-form-element-composit.form-sortable-ghost{z-index:1;position:relative;background-color:#fff!important;border:none!important;outline:1px dashed #3fe63f!important;outline-offset:-2px!important;visibility:visible!important}.form-sortable-ghost.mjs-nestedSortable-error{outline:1px dashed #c83c3c!important}.t3-form-icon{margin-right:1em}.t3-form-validation-child-has-error{color:#c83c3c}#t3-form-navigation-component .t3-form-validation-errors,#t3-form-stage-container .t3-form-validation-errors{position:relative;color:#c83c3c}#t3-form-navigation-component .t3-form-validation-errors:before,#t3-form-stage-container .t3-form-validation-errors:before{z-index:1;position:absolute;display:inline-block;width:14px;height:14px;border-radius:50%;background:0 0}#t3-form-navigation-component .t3-form-validation-errors:before{content:"";vertical-align:middle;-webkit-mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");background-color:#c83c3c;background-size:contain;display:inline-block;margin-top:.2em}.t3-form-validation-errors#t3-form-navigation-component-tree-root:before{left:-2em!important;margin-top:.1em}#t3-form-stage-container .t3-form-validation-errors.form-sortable-handle{border-color:#c83c3c}#t3-form-stage-container .t3-form-validation-errors.form-sortable-handle:before{content:"";vertical-align:middle;-webkit-mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");background-color:#c83c3c;background-size:contain;display:inline-block;left:4.5em;margin-top:1.9em}#t3-form-stage-container .t3-form-validation-errors.form-sortable-handle .element-label{padding-left:1.5em}#t3-form-inspector-panels .t3-form-collection-element .t3-form-validation-errors{display:inline-block;color:#fff;font-size:.8em;font-weight:700;background-color:#c83c3c;margin-bottom:.5em;padding:.1em .5em;border-radius:2px}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element{border-color:#c83c3c}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element h4{border-color:#c83c3c;background-color:#c83c3c;color:#fff}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element h4 path{fill:#fff}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element .t3-form-collection-element-remove-button{background:#fff;border-color:transparent}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element .t3-form-collection-element-remove-button path{fill:#c83c3c}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element .t3-form-collection-element-remove-button:hover{background:#eab3b3}#t3-form-inspector-panels span.t3-form-validation-errors{display:inline-block;color:#fff;font-size:.8em;font-weight:700;margin-bottom:.5em;padding:.1em .5em;border-radius:2px;line-height:1.5em}#t3-form-inspector-panels span.t3-form-validation-errors{background-color:#c83c3c}.form-editor-loading-spinner{width:150px;margin:5em auto 0;text-align:center}.form-sortable-handle{cursor:pointer}.module.web_FormFormbuilder_FormEditor{overflow:hidden}.module.web_FormFormbuilder_FormEditor .module-body,.module.web_FormFormbuilder_FormEditor div[data-identifier=moduleWrapper]{height:100%}.module.web_FormFormbuilder_FormEditor .module-body{padding-bottom:.5em}.module.web_FormFormbuilder_FormEditor .module-docheader-bar-column-left button,.module.web_FormFormbuilder_FormEditor .module-docheader-bar-column-left button:active,.module.web_FormFormbuilder_FormEditor .module-docheader-bar-column-left button:focus{outline:initial initial 0}.t3-form-element-new-page-button{position:absolute;left:.5em}.t3-form-controls.has-error .help-block{margin-bottom:initial} \ No newline at end of file +.form-editor{padding:0 .5em}.form-control-wrap{margin:0;padding:.5rem 0}.form-control-wrap .table{margin:0}.form-control-wrap .help-block{margin-bottom:0}.form-check.form-switch{margin-bottom:0;padding-bottom:.5rem}.form-group-select{padding-bottom:.5rem}.form-group-select .form-control-wrap{padding:0}.form-group-select .t3-form-add-collection-element{padding-bottom:0}.form-group-select .form-select{margin-top:.5rem}.t3-form-x-component{position:absolute;top:0;height:100%;line-height:inherit;background:#f5f5f5}.t3-form-x-component a{text-decoration:none}.t3-form-x-component ol,.t3-form-x-component ul:not(.dropdown-menu){list-style:none;padding:0}.t3-form-x-component .form-sortable-ghost{outline-offset:-1px!important}.t3-form-x-component-inner-wrapper{position:relative;padding:1.5em}#t3-form-navigation-component{overflow:hidden;left:0}#t3-form-structure-panel{overflow:auto;padding-top:var(--module-docheader-height);height:100%}#t3-form-structure-panel .icon{z-index:1}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container,#t3-form-structure-panel .tree li>div{border:1px solid transparent;cursor:pointer}#t3-form-structure-panel .tree .svg-wrapper svg{overflow:visible;position:relative;top:-1em;left:.6em}#t3-form-structure-panel .tree .svg-wrapper path{fill:none;shape-rendering:crispEdges;stroke:#ddd;stroke-width:1}#t3-form-structure-panel .tree li{white-space:nowrap}#t3-form-structure-panel .tree li.mjs-nestedSortable-collapsed>ol{display:none}#t3-form-structure-panel .tree li.mjs-nestedSortable-collapsed>div>span[data-identifier=treeExpander]{transform:rotate(0);transition:transform .2s}#t3-form-structure-panel .tree li.mjs-nestedSortable-expanded>div>span[data-identifier=treeExpander]{transform:rotate(90deg);transition:transform .2s}#t3-form-structure-panel .tree li small{padding-left:.5em;font-size:80%}#t3-form-structure-panel .tree .t3-form-icon{margin-right:.5em;margin-left:.5em}#t3-form-structure-panel .tree .t3-form-element-has-children>div .t3-form-icon{margin-left:.1em}#t3-form-structure-panel .tree .sortable-hover{outline:1px solid #aaa}#t3-form-structure-panel .icon{margin-top:1px}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container,#t3-form-structure-panel .tree li>div{height:20px}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container>span,#t3-form-structure-panel .tree li>div>span{display:inline-block;vertical-align:top;line-height:20px}#t3-form-structure-panel #t3-form-navigation-component-tree-root{width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container:hover,#t3-form-structure-panel .t3-form-form-element-selected,#t3-form-structure-panel .t3-form-root-element-selected,#t3-form-structure-panel .tree li>div:hover{background-color:#f2f2f2;border-color:#dcdcdc;border-radius:2px;margin-left:-20px;padding-left:20px;margin-right:-1.3em}#t3-form-structure-panel #t3-form-navigation-component-tree-root-container.t3-form-root-element-selected,#t3-form-structure-panel #t3-form-navigation-component-tree-root-container.t3-form-root-element-selected:hover,#t3-form-structure-panel .tree li>.t3-form-form-element-selected,#t3-form-structure-panel .tree li>.t3-form-form-element-selected:hover{background-color:#fff;border-color:#dcdcdc}#t3-form-structure-panel .t3-form-x-component-inner-wrapper{padding-top:2.5em}#t3-form-structure-panel .form-sortable-drag #t3-form-navigation-component-tree-root-container:hover,#t3-form-structure-panel .form-sortable-drag .t3-form-form-element-selected,#t3-form-structure-panel .form-sortable-drag .t3-form-root-element-selected,#t3-form-structure-panel .form-sortable-drag>div:hover{background-color:transparent!important;border-color:transparent!important}#t3-form-structure-panel .form-sortable-drag svg{opacity:0}#t3-form-structure-panel .mjs-nestedSortable-branch span[data-identifier=treeExpander]{margin-left:-1.7em;margin-top:-2px}#t3-form-structure-panel .mjs-nestedSortable-leaf span.t3-form-icon{margin-left:initial}.form-group.t3-form-collection-element-remove-button,.form-group.t3-form-inspector-validators-editor-removeButton,.t3-form-inspector-finishers-editor-removeButton{margin:0!important;font-size:0}#t3-form-inspector-panels-container{overflow:hidden;right:0;padding-top:var(--module-docheader-height)}#t3-form-inspector-panels{overflow:auto;height:100%}#t3-form-inspector{padding:1em 0}#t3-form-inspector h2,#t3-form-inspector h3,#t3-form-inspector h4{margin:0;padding:.1em .2em .2em .5em;border-top:1px solid var(--module-docheader-border);clear:both;font:inherit;font-weight:700}#t3-form-inspector h2{padding-bottom:1em;border:none;border-bottom:1px solid var(--module-docheader-border)}#t3-form-inspector>h2:first-child{border-top:none}#t3-form-inspector h3{color:#000;padding-top:.3em;border:none}#t3-form-inspector h4{padding:.8em 3.5em .8em 2.8em;font-weight:500;background-color:#ddd}#t3-form-inspector h4 span[data-template-property=label]{vertical-align:top}#t3-form-inspector .form-section-headline{padding:0}#t3-form-inspector .icon-size-small{line-height:1.5}#t3-form-inspector .input-group .t3-form-controls{flex:1 1 auto}#t3-form-inspector .input-group-btn{position:static;line-height:13px}#t3-form-inspector>.t3-form-remove-element-button{padding-top:1rem;border-top:1px solid var(--module-docheader-border)}#t3-form-inspector>.t3-form-remove-element-button .btn{width:100%}#t3-form-inspector-validators.sortable+.t3-form-remove-element-button{margin-top:.25rem}#t3-form-inspector .t3-form-inspector-finishers-editor-removeButton .btn,#t3-form-inspector .t3-form-inspector-validators-editor-removeButton .btn{padding:.25rem .5rem;font-size:.65625rem}#t3-form-inspector .t3-form-inspector-finishers-editor-removeButton .t3-form-remove-element-button-label,#t3-form-inspector .t3-form-inspector-validators-editor-removeButton .t3-form-remove-element-button-label{display:none}#t3-form-inspector .t3-form-add-collection-element,#t3-form-inspector .t3-form-control-group{clear:both}#t3-form-inspector .t3-form-control-group.form-group #t3-form-add-finisher.t3-form-add-collection-element,#t3-form-inspector .t3-form-control-group.form-group #t3-form-add-validator.t3-form-add-collection-element{margin:initial}#t3-form-inspector .t3-form-inspector-editor-requiredValidator label{cursor:pointer}#t3-form-inspector .t3-form-dropdown-buttons.open{position:static}#t3-form-inspector .t3-form-dropdown-buttons.open .dropdown-menu{width:100%}#t3-form-inspector .t3-form-dropdown-buttons.open .dropdown-menu a{overflow:hidden;text-overflow:ellipsis}.t3-form-add-collection-element{padding-bottom:.5rem}.t3-form-collection-container{margin-top:-1em;padding:.5em}.t3-form-collection-container .form-sortable-handle{cursor:auto}.t3-form-collection-container h4{cursor:move}.t3-form-collection-container .t3-form-control-group{margin-right:.5em;margin-left:.5em}.t3-form-collection-element{position:relative;margin-bottom:.5em;border:1px solid var(--module-docheader-border);border-top:none;background:#f5f5f5}.t3-form-collection-element .t3-form-collection-element-remove-button{position:absolute;right:.5em;top:.5em}.t3-form-collection-element h4>.icon{position:absolute;left:1em}.t3-form-collection-element .form-editor{padding:0}.t3-form-collection-element .panel-collapse .form-editor:first-child{margin-top:1em}.t3-form-validator-editor .collapsed .icon-actions-view-table-expand{transform:rotate(0);transition:transform .2s}.t3-form-validator-editor .icon-actions-view-table-expand{transform:rotate(90deg);transition:transform .2s}.property-grid .form-control{min-width:auto;font-size:.9em}.property-grid .table th{font-size:.9em}.property-grid .table>tbody>tr{cursor:pointer;background-color:#fff}.property-grid .table>tbody>tr:last-child{cursor:auto}.property-grid .table>tbody>tr>td{padding:.6em .3em;text-align:center}.property-grid .table>tbody>tr>td:first-child{width:35px}.property-grid .table>tbody>tr>td:nth-child(2),.property-grid .table>tbody>tr>td:nth-child(3){width:75px}.property-grid .table>tbody>tr>td:nth-child(4){width:65px}.property-grid .table>tbody>tr>td:nth-child(5){width:35px}.property-grid .sort-row-field{cursor:move}.property-grid .form-sortable-drag td{border:none}.property-grid .form-sortable-ghost{height:45px;border-left:1px solid var(--module-docheader-border)!important;border-right:1px solid var(--module-docheader-border)!important;outline-offset:-5px!important}.property-grid .form-check{padding-left:3.2em}#t3-form-stage-inner-container{position:relative;left:-5px;display:inline-block;width:90%;max-width:800px;text-align:left}#t3-form-stage-container{overflow:auto;position:relative;height:calc(100% - var(--module-docheader-height));max-height:100%;text-align:center}#t3-form-stage-container ol,#t3-form-stage-container ul{list-style:none}#t3-form-stage-container .form-section{border:none}#t3-form-stage-container .panel-heading button{outline:0}#t3-form-stage-container .panel-heading .paginiation-label{margin-right:1em}#t3-form-stage-container .t3-form-new-element-container{display:flex;justify-content:center;align-items:center;height:62px;border:1px dashed #ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-page-title{margin:0 0 .5em}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage-inner-container{overflow:hidden}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit:not(.t3-form-element-toplevel){margin-bottom:1em;padding-bottom:1px;outline:1px solid #ddd;outline-offset:-1px}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit .sortable-hover{outline-color:#777}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit .t3-form-form-composit-element-selected{outline-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit>.form-sortable-handle{margin:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit>.form-sortable-handle div.t3-form-form-element-body{border-bottom:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit.sortable-hover>.form-sortable-handle{border-color:#777}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-icon-container,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-composit.sortable-hover>.form-sortable-handle .t3-form-icon-container{background-color:#777}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle{position:relative;height:62px;margin-bottom:1em;border:1px solid #ddd;background-color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:first-of-type{margin-top:1em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-validator-list{right:0;transition:right .2s}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-element-info .element-content div,#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-element-info .element-content span{color:#5a5a5a}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-handle:hover .t3-form-validator-info .t3-form-icon{margin-right:75px;transition:margin .2s}#t3-form-stage-container.t3-form-stage-viewmode-abstract .ui-state-disabled{cursor:auto}#t3-form-stage-container.t3-form-stage-viewmode-abstract .ui-state-disabled:hover{background:0 0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .form-sortable-ghost{margin-bottom:1em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-icon-container{float:left;width:40px;height:100%;padding:1em;cursor:move;background-color:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-icon-container .t3-form-icon{height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-form-element-body{height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info{position:relative;float:left;width:55%;height:100%;padding-left:1em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:after,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:before{z-index:1;display:block;content:"";position:absolute;bottom:0;right:0;left:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:before{height:.8em;background:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info:after{bottom:.8em;height:1em;background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-label-container{float:left;position:relative;width:45%;height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-label-container .element-label{overflow:hidden;position:absolute;top:50%;width:100%;text-overflow:ellipsis;transform:translateY(-50%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-content{padding-top:1em;white-space:nowrap;font-size:.8em}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-content div,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-element-info .element-content span{color:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info{position:relative;overflow:hidden;float:right;height:100%}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-icon{height:100%;z-index:1;margin-left:1em;transition:margin .3s;filter:grayscale(100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list{position:absolute;top:0;right:-100px;width:100px;height:100%;padding:1em 1em 1em 35px;font-size:.8em;transition:right .3s;background-color:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:after,#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:before{z-index:1;display:block;content:"";position:absolute;bottom:0;right:0;left:0}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:before{height:1em;background:#ddd}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .t3-form-validator-list:after{bottom:1em;height:1em;background:linear-gradient(to bottom,rgba(221,221,221,0) 0,#ddd 100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract .t3-form-validator-info .validator-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#5a5a5a}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected{position:relative;padding-top:35px;height:97px;border:none}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-form-element-body{border:1px solid #0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-icon-container{background-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-element-info .element-content div,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-element-info .element-content span{color:#5a5a5a}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-list{right:0;transition:none;background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-list:before{background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-list:after{background:linear-gradient(to bottom,rgba(235,243,251,0) 0,#ebf3fb 100%)}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .t3-form-validator-info .t3-form-icon{margin-right:75px;filter:none}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container{position:absolute;top:0;right:0;width:100%;height:35px;border:1px solid #0078e6;background-color:#0078e6;padding-right:.7em;padding-top:.4em}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:after,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:before{position:absolute;top:0;display:block;width:1px;height:100%;content:" ";background-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:before{left:-1px}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container:after{right:-1px}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .caret{color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .t3-form-dropdown-buttons .icon{margin-right:.5em}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar{float:right}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn{background-color:#fff;border-color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn.active,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn:focus,#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn:hover{background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .btn-toolbar-container .btn-toolbar .btn .icon svg path{fill:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .meta-label{display:inline-block;top:1em;left:5em;bottom:auto;font-size:.9em;color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract #t3-form-stage .t3-form-form-element-selected .meta-label span{color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected{border-color:#0078e6}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading{background-color:#0078e6;border-color:#0078e6;color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn{background-color:#fff;border-color:#fff}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn.active,#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn:focus,#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn:hover{background-color:#ebf3fb}#t3-form-stage-container.t3-form-stage-viewmode-abstract .panel.t3-form-form-stage-selected>.panel-heading .btn .icon svg path{fill:#0078e6}@media (max-width:1199px){#t3-form-stage-container.t3-form-stage-viewmode-preview #t3-form-stage-inner-container{width:600px}}#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=date],#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=password],#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=text],#t3-form-stage-container.t3-form-stage-viewmode-preview select,#t3-form-stage-container.t3-form-stage-viewmode-preview textarea{color:#000;background-color:#e5e5e5}#t3-form-stage-container.t3-form-stage-viewmode-preview ::-moz-placeholder{color:#737373;font-style:italic}#t3-form-stage-container.t3-form-stage-viewmode-preview ::placeholder{color:#737373;font-style:italic}#t3-form-stage-container.t3-form-stage-viewmode-preview input[type=date]{display:block;width:100%;height:32px;padding:.6em;font-size:12px;line-height:1.5;background-image:none;border:1px solid var(--module-docheader-border);border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#t3-form-stage-container.t3-form-stage-viewmode-preview select[multiple=multiple]{height:auto;min-height:32px}#t3-form-stage-container.t3-form-stage-viewmode-preview textarea{min-height:100px}#t3-form-stage-container.t3-form-stage-viewmode-preview .container{width:auto}#t3-form-stage-container.t3-form-stage-viewmode-preview legend.t3-form-form-element-selected{border-color:var(--module-docheader-border)}#t3-form-stage-container.t3-form-stage-viewmode-preview .form-navigation .btn-group button,#t3-form-stage-container.t3-form-stage-viewmode-preview .form-navigation .btn-group span{display:inline-block;margin-right:1em}#t3-form-stage-container.t3-form-stage-viewmode-preview .preview-table-first-col{width:30%}#t3-form-stage-container.t3-form-stage-viewmode-preview .t3-form-element-preview{position:relative;display:inline-block;width:100%}#t3-form-stage-container.t3-form-stage-viewmode-preview .t3-form-new-element-container{display:none}#t3-form-stage-container #t3-form-stage{margin-bottom:0;padding-top:.5em}#t3-form-stage-container #t3-form-stage>ol,#t3-form-stage-container #t3-form-stage>ol>li>ol{padding-left:0;padding-right:0}#t3-form-stage-container #t3-form-stage .t3-form-element-toplevel>.t3-form-form-element-selected{height:auto;padding-top:0}#t3-form-stage-container #t3-form-stage .t3-form-element-toplevel>.t3-form-form-element-selected .btn-toolbar-container{display:none}.meta-label{z-index:2;position:absolute;bottom:1em;left:5.5em;display:none;color:#0078e6;line-height:1.6;font-size:.8em}.form-sortable-handle:hover>.meta-label{display:inline-block}.form-sortable-ghost,.t3-form-element-composit.form-sortable-ghost{z-index:1;position:relative;background-color:#fff!important;border:none!important;outline:1px dashed #3fe63f!important;outline-offset:-2px!important;visibility:visible!important}.form-sortable-ghost.mjs-nestedSortable-error{outline:1px dashed #c83c3c!important}.t3-form-icon{margin-right:1em}.t3-form-validation-child-has-error{color:#c83c3c}#t3-form-navigation-component .t3-form-validation-errors,#t3-form-stage-container .t3-form-validation-errors{position:relative;color:#c83c3c}#t3-form-navigation-component .t3-form-validation-errors:before,#t3-form-stage-container .t3-form-validation-errors:before{z-index:1;position:absolute;display:inline-block;width:14px;height:14px;border-radius:50%;background:0 0}#t3-form-navigation-component .t3-form-validation-errors:before{content:"";vertical-align:middle;-webkit-mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");background-color:#c83c3c;background-size:contain;display:inline-block;margin-top:.2em}.t3-form-validation-errors#t3-form-navigation-component-tree-root:before{left:-2em!important;margin-top:.1em}#t3-form-stage-container .t3-form-validation-errors.form-sortable-handle{border-color:#c83c3c}#t3-form-stage-container .t3-form-validation-errors.form-sortable-handle:before{content:"";vertical-align:middle;-webkit-mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");mask:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 16 16'%3e%3cg class='icon-color'%3e%3cpath d='M8 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6m0-1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z'/%3e%3ccircle cx='8' cy='11' r='1'/%3e%3cpath d='M8.5 9h-1l-.445-4.45A.5.5 0 0 1 7.552 4h.896a.5.5 0 0 1 .497.55L8.5 9z'/%3e%3c/g%3e%3c/svg%3e");background-color:#c83c3c;background-size:contain;display:inline-block;left:4.5em;margin-top:1.9em}#t3-form-stage-container .t3-form-validation-errors.form-sortable-handle .element-label{padding-left:1.5em}#t3-form-inspector-panels .t3-form-collection-element .t3-form-validation-errors{display:inline-block;color:#fff;font-size:.8em;font-weight:700;background-color:#c83c3c;margin-bottom:.5em;padding:.1em .5em;border-radius:2px}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element{border-color:#c83c3c}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element h4{border-color:#c83c3c;background-color:#c83c3c;color:#fff}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element h4 path{fill:#fff}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element .t3-form-collection-element-remove-button{background:#fff;border-color:transparent}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element .t3-form-collection-element-remove-button path{fill:#c83c3c}#t3-form-inspector-panels .t3-form-validation-errors.t3-form-collection-element .t3-form-collection-element-remove-button:hover{background:#eab3b3}#t3-form-inspector-panels span.t3-form-validation-errors{display:inline-block;color:#fff;font-size:.8em;font-weight:700;margin-bottom:.5em;padding:.1em .5em;border-radius:2px;line-height:1.5em}#t3-form-inspector-panels span.t3-form-validation-errors{background-color:#c83c3c}.form-editor-loading-spinner{width:150px;margin:5em auto 0;text-align:center}.form-sortable-handle{cursor:pointer}.module.web_FormFormbuilder_FormEditor{overflow:hidden}.module.web_FormFormbuilder_FormEditor .module-body,.module.web_FormFormbuilder_FormEditor div[data-identifier=moduleWrapper]{height:100%}.module.web_FormFormbuilder_FormEditor .module-body{padding-bottom:.5em}.module.web_FormFormbuilder_FormEditor .module-docheader-bar-column-left button,.module.web_FormFormbuilder_FormEditor .module-docheader-bar-column-left button:active,.module.web_FormFormbuilder_FormEditor .module-docheader-bar-column-left button:focus{outline:initial initial 0}.t3-form-element-new-page-button{position:absolute;left:.5em}.t3-form-controls.has-error .help-block{margin-bottom:initial} \ No newline at end of file diff --git a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/stage-component.js b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/stage-component.js index e01c9c23c9deefdfcae17424976bfb3b7f2c17fa..52ecd183fc7540a73cb0eaab0e6a874d8cdb6dd4 100644 --- a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/stage-component.js +++ b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/stage-component.js @@ -868,20 +868,8 @@ function factory($, Helper, Icons) { if ( !getFormElementDefinition(formElement, '_isTopLevelFormElement') - && getFormElementDefinition(formElement, '_isCompositeFormElement') ) { - $(this).tooltip({ - title: 'identifier: ' + formElement.get('identifier') + ' (type: ' + formElement.get('type') + ')', - placement: 'right' - }); - } else if ( - !getFormElementDefinition(formElement, '_isTopLevelFormElement') - && !getFormElementDefinition(formElement, '_isCompositeFormElement') - ) { - $(this).tooltip({ - title: 'identifier: ' + formElement.get('identifier') + ' (type: ' + formElement.get('type') + ')', - placement: 'left' - }); + $(this).attr('title', 'identifier: ' + formElement.get('identifier') + ' (type: ' + formElement.get('type') + ')'); } if (getFormElementDefinition(formElement, '_isTopLevelFormElement')) { diff --git a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/tree-component.js b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/tree-component.js index ec215d68ff09813f4a2da12b184bb708a88f00e1..8d07ac4a15f51bfcfa05c51413ff5ad84cd8aa25 100644 --- a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/tree-component.js +++ b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/tree-component.js @@ -273,10 +273,7 @@ function factory($, Helper, Icons) { Icons.getIcon(getFormElementDefinition(formElement, 'iconIdentifier'), Icons.sizes.small, null, Icons.states.default).then(function(icon) { expanderItem.after( $(icon).addClass(getHelper().getDomElementClassName('icon')) - .tooltip({ - title: 'id = ' + formElement.get('identifier'), - placement: 'right' - }) + .attr('title', 'id = ' + formElement.get('identifier')) ); if (getFormElementDefinition(formElement, '_isCompositeFormElement')) { diff --git a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/view-model.js b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/view-model.js index fd0ce0e35b78beecd5dad74e80bff715c0cf38bc..2ebbf3021be1af401d88b19527dd43f6418c158d 100644 --- a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/view-model.js +++ b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-editor/view-model.js @@ -545,10 +545,7 @@ function factory($, TreeComponent, ModalsComponent, InspectorComponent, StageCom $(getHelper().getDomElementDataIdentifierSelector('iconMailform'), $(getHelper().getDomElementDataIdentifierSelector('structureRootContainer')) - ).tooltip({ - title: 'identifier: ' + getRootFormElement().get('identifier'), - placement: 'right' - }); + ).attr('title', 'identifier: ' + getRootFormElement().get('identifier')); }; /** diff --git a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-manager/view-model.js b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-manager/view-model.js index 93cfb05c5b9c5cc9671f6c67d61d09c971b48826..89bdd38471c469c38e4df00171b5d568b75502e5 100644 --- a/typo3/sysext/form/Resources/Public/JavaScript/backend/form-manager/view-model.js +++ b/typo3/sysext/form/Resources/Public/JavaScript/backend/form-manager/view-model.js @@ -72,8 +72,6 @@ function factory($, Modal, Severity, MultiStepWizard, Icons, Notification, Secur showReferences: {identifier: '[data-identifier="showReferences"]'}, referenceLink: {identifier: '[data-identifier="referenceLink"]'}, - tooltip: {identifier: '[data-bs-toggle="tooltip"]'}, - moduleBody: {class: '.module-body.t3js-module-body'}, t3Logo: {class: '.t3-message-page-logo'}, t3Footer: {id: '#t3-footer'} @@ -866,7 +864,6 @@ function factory($, Modal, Severity, MultiStepWizard, Icons, Notification, Secur _newFormSetup(); _duplicateFormSetup(); _showReferencesSetup(); - $(getDomElementIdentifier('tooltip')).tooltip(); }; /** diff --git a/typo3/sysext/install/Resources/Private/Partials/Upgrade/UpgradeDocs/PanelItem.html b/typo3/sysext/install/Resources/Private/Partials/Upgrade/UpgradeDocs/PanelItem.html index 109800504b689ddc75017db2086e433e82c952a8..a101763ded7240ca5dce00f76eebe859eeb32764 100644 --- a/typo3/sysext/install/Resources/Private/Partials/Upgrade/UpgradeDocs/PanelItem.html +++ b/typo3/sysext/install/Resources/Private/Partials/Upgrade/UpgradeDocs/PanelItem.html @@ -8,13 +8,13 @@ <h3 class="panel-title"> <f:if condition="{read}"> <f:then> - <button type="button" class="btn btn-link link-action t3js-upgradeDocs-unmarkRead float-end" data-filepath="{fileArray.filepath}" data-bs-toggle="tooltip" data-bs-placement="top" title="Mark as not read"> + <button type="button" class="btn btn-link link-action t3js-upgradeDocs-unmarkRead float-end" data-filepath="{fileArray.filepath}" title="Mark as not read"> <core:icon identifier="actions-ban" size="small" /> <span class="visually-hidden">restore this document</span> </button> </f:then> <f:else> - <button type="button" class="btn btn-link link-action t3js-upgradeDocs-markRead float-end" data-filepath="{fileArray.filepath}" data-bs-toggle="tooltip" data-bs-placement="top" title="Mark as read"> + <button type="button" class="btn btn-link link-action t3js-upgradeDocs-markRead float-end" data-filepath="{fileArray.filepath}" title="Mark as read"> <core:icon identifier="actions-check" size="small" /> <span class="visually-hidden">ignore this document</span> </button> diff --git a/typo3/sysext/install/Resources/Public/JavaScript/module/maintenance/language-packs.js b/typo3/sysext/install/Resources/Public/JavaScript/module/maintenance/language-packs.js index 771f259d94130a209ef9197cc402db0d2ace0715..0b3a51209652e485b48d61d06776da27ef02e79f 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/module/maintenance/language-packs.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/module/maintenance/language-packs.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import"bootstrap";import $ from"jquery";import{AbstractInteractableModule}from"@typo3/install/module/abstract-interactable-module.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import SecurityUtility from"@typo3/core/security-utility.js";import FlashMessage from"@typo3/install/renderable/flash-message.js";import InfoBox from"@typo3/install/renderable/info-box.js";import ProgressBar from"@typo3/install/renderable/progress-bar.js";import Severity from"@typo3/install/renderable/severity.js";import Router from"@typo3/install/router.js";class LanguagePacks extends AbstractInteractableModule{constructor(){super(...arguments),this.selectorOutputContainer=".t3js-languagePacks-output",this.selectorContentContainer=".t3js-languagePacks-mainContent",this.selectorActivateLanguage=".t3js-languagePacks-activateLanguage",this.selectorActivateLanguageIcon="#t3js-languagePacks-activate-icon",this.selectorAddLanguageToggle=".t3js-languagePacks-addLanguage-toggle",this.selectorLanguageInactive=".t3js-languagePacks-inactive",this.selectorDeactivateLanguage=".t3js-languagePacks-deactivateLanguage",this.selectorDeactivateLanguageIcon="#t3js-languagePacks-deactivate-icon",this.selectorUpdate=".t3js-languagePacks-update",this.selectorLanguageUpdateIcon="#t3js-languagePacks-languageUpdate-icon",this.selectorNotifications=".t3js-languagePacks-notifications",this.activeLanguages=[],this.activeExtensions=[],this.packsUpdateDetails={toHandle:0,handled:0,updated:0,new:0,failed:0,skipped:0},this.notifications=[]}static pluralize(t,a="pack",e="s",s=0){return 1!==t&&1!==s?a+e:a}initialize(t){this.currentModal=t,this.getData(),t.on("click",this.selectorAddLanguageToggle,(()=>{t.find(this.selectorContentContainer+" "+this.selectorLanguageInactive).toggle()})),t.on("click",this.selectorActivateLanguage,(t=>{const a=$(t.target).closest(this.selectorActivateLanguage).data("iso");t.preventDefault(),this.activateLanguage(a)})),t.on("click",this.selectorDeactivateLanguage,(t=>{const a=$(t.target).closest(this.selectorDeactivateLanguage).data("iso");t.preventDefault(),this.deactivateLanguage(a)})),t.on("click",this.selectorUpdate,(t=>{const a=$(t.target).closest(this.selectorUpdate).data("iso"),e=$(t.target).closest(this.selectorUpdate).data("extension");t.preventDefault(),this.updatePacks(a,e)}))}getData(){const t=this.getModalBody();new AjaxRequest(Router.getUrl("languagePacksGetData")).get({cache:"no-cache"}).then((async a=>{const e=await a.resolve();if(!0===e.success){this.activeLanguages=e.activeLanguages,this.activeExtensions=e.activeExtensions,t.empty().append(e.html);const a=t.parent().find(this.selectorContentContainer);a.empty(),a.append(this.languageMatrixHtml(e)),a.append(this.extensionMatrixHtml(e)),$('[data-bs-toggle="tooltip"]').tooltip({container:a})}else{const t=InfoBox.render(Severity.error,"Something went wrong","");this.addNotification(t)}this.renderNotifications()}),(a=>{Router.handleAjaxError(a,t)}))}activateLanguage(t){const a=this.getModalBody(),e=this.findInModal(this.selectorOutputContainer),s=ProgressBar.render(Severity.loading,"Loading...","");e.empty().append(s),this.getNotificationBox().empty(),new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksActivateLanguage",token:this.getModuleContent().data("language-packs-activate-language-token"),iso:t}}).then((async t=>{const a=await t.resolve();if(e.empty(),!0===a.success&&Array.isArray(a.status))a.status.forEach((t=>{const a=InfoBox.render(t.severity,t.title,t.message);this.addNotification(a)}));else{const t=FlashMessage.render(Severity.error,"Something went wrong","");this.addNotification(t)}this.getData()}),(t=>{Router.handleAjaxError(t,a)}))}deactivateLanguage(t){const a=this.getModalBody(),e=this.findInModal(this.selectorOutputContainer),s=ProgressBar.render(Severity.loading,"Loading...","");e.empty().append(s),this.getNotificationBox().empty(),new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksDeactivateLanguage",token:this.getModuleContent().data("language-packs-deactivate-language-token"),iso:t}}).then((async t=>{const a=await t.resolve();if(e.empty(),!0===a.success&&Array.isArray(a.status))a.status.forEach((t=>{const a=InfoBox.render(t.severity,t.title,t.message);this.addNotification(a)}));else{const t=FlashMessage.render(Severity.error,"Something went wrong","");this.addNotification(t)}this.getData()}),(t=>{Router.handleAjaxError(t,a)}))}updatePacks(t,a){const e=this.findInModal(this.selectorOutputContainer),s=this.findInModal(this.selectorContentContainer),n=void 0===t?this.activeLanguages:[t];let i=!0,o=this.activeExtensions;void 0!==a&&(o=[a],i=!1),this.packsUpdateDetails={toHandle:n.length*o.length,handled:0,updated:0,new:0,failed:0,skipped:0},e.empty().append($("<div>",{class:"progress"}).append($("<div>",{class:"progress-bar progress-bar-info",role:"progressbar","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,style:"width: 0;"}).append($("<span>",{class:"text-nowrap"}).text("0 of "+this.packsUpdateDetails.toHandle+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.toHandle)+" updated")))),s.empty(),n.forEach((t=>{o.forEach((a=>{this.getNotificationBox().empty(),new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksUpdatePack",token:this.getModuleContent().data("language-packs-update-pack-token"),iso:t,extension:a}}).then((async t=>{const a=await t.resolve();!0===a.success?(this.packsUpdateDetails.handled++,"new"===a.packResult?this.packsUpdateDetails.new++:"update"===a.packResult?this.packsUpdateDetails.updated++:"skipped"===a.packResult?this.packsUpdateDetails.skipped++:this.packsUpdateDetails.failed++,this.packUpdateDone(i,n)):(this.packsUpdateDetails.handled++,this.packsUpdateDetails.failed++,this.packUpdateDone(i,n))}),(()=>{this.packsUpdateDetails.handled++,this.packsUpdateDetails.failed++,this.packUpdateDone(i,n)}))}))}))}packUpdateDone(t,a){const e=this.getModalBody(),s=this.findInModal(this.selectorOutputContainer);if(this.packsUpdateDetails.handled===this.packsUpdateDetails.toHandle){const s=InfoBox.render(Severity.ok,"Language packs updated",this.packsUpdateDetails.new+" new language "+LanguagePacks.pluralize(this.packsUpdateDetails.new)+" downloaded, "+this.packsUpdateDetails.updated+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.updated)+" updated, "+this.packsUpdateDetails.skipped+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.skipped)+" skipped, "+this.packsUpdateDetails.failed+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.failed)+" not available");this.addNotification(s),!0===t?new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksUpdateIsoTimes",token:this.getModuleContent().data("language-packs-update-iso-times-token"),isos:a}}).then((async t=>{if(!0===(await t.resolve()).success)this.getData();else{const t=FlashMessage.render(Severity.error,"Something went wrong","");this.addNotification(t)}}),(t=>{Router.handleAjaxError(t,e)})):this.getData()}else{const t=this.packsUpdateDetails.handled/this.packsUpdateDetails.toHandle*100;s.find(".progress-bar").css("width",t+"%").attr("aria-valuenow",t).find("span").text(this.packsUpdateDetails.handled+" of "+this.packsUpdateDetails.toHandle+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.handled,"pack","s",this.packsUpdateDetails.toHandle)+" updated")}}languageMatrixHtml(t){const a=this.findInModal(this.selectorActivateLanguageIcon).html(),e=this.findInModal(this.selectorDeactivateLanguageIcon).html(),s=this.findInModal(this.selectorLanguageUpdateIcon).html(),n=$("<div>"),i=$("<tbody>");return t.languages.forEach((t=>{const n=t.active,o=$("<tr>");n?i.append(o.append($("<td>").text(" "+t.name).prepend($("<div />",{class:"btn-group"}).append($("<a>",{class:"btn btn-default t3js-languagePacks-deactivateLanguage","data-iso":t.iso,"data-bs-toggle":"tooltip",title:"Deactivate"}).append(e),$("<a>",{class:"btn btn-default t3js-languagePacks-update","data-iso":t.iso,"data-bs-toggle":"tooltip",title:"Download language packs"}).append(s))))):i.append(o.addClass("t3-languagePacks-inactive t3js-languagePacks-inactive").css({display:"none"}).append($("<td>").text(" "+t.name).prepend($("<div />",{class:"btn-group"}).append($("<a>",{class:"btn btn-default t3js-languagePacks-activateLanguage","data-iso":t.iso,"data-bs-toggle":"tooltip",title:"Activate"}).append(a))))),o.append($("<td>").text(t.iso),$("<td>").text(t.dependencies.join(", ")),$("<td>").text(null===t.lastUpdate?"":t.lastUpdate)),i.append(o)})),n.append($("<h3>").text("Active languages"),$("<table>",{class:"table table-striped table-bordered"}).append($("<thead>").append($("<tr>").append($("<th>").append($("<div />",{class:"btn-group"}).append($("<button>",{class:"btn btn-default t3js-languagePacks-addLanguage-toggle",type:"button"}).append($("<span>").append(a)," Add language"),$("<button>",{class:"btn btn-default disabled update-all t3js-languagePacks-update",type:"button",disabled:"disabled"}).append($("<span>").append(s)," Update all"))),$("<th>").text("Locale"),$("<th>").text("Dependencies"),$("<th>").text("Last update"))),i)),Array.isArray(this.activeLanguages)&&this.activeLanguages.length&&n.find(".update-all").removeClass("disabled").removeAttr("disabled"),n.html()}extensionMatrixHtml(t){const a=new SecurityUtility,e=this.findInModal(this.selectorLanguageUpdateIcon).html();let s,n="",i=0;const o=$("<div>"),d=$("<tr>");d.append($("<th>").text("Extension"),$("<th>").text("Key")),t.activeLanguages.forEach((t=>{d.append($("<th>").append($("<a>",{class:"btn btn-default t3js-languagePacks-update","data-iso":t,"data-bs-toggle":"tooltip",title:"Download and update all language packs"}).append($("<span>").append(e)," "+t)))}));const l=$("<tbody>");return t.extensions.forEach((o=>{i++,s=void 0!==o.icon?$("<span>").append($("<img>",{style:"max-height: 16px; max-width: 16px;",src:o.icon,alt:o.title}),$("<span>").text(" "+o.title)):$("<span>").text(o.title);const d=$("<tr>");d.append($("<td>").html(s.html()),$("<td>").text(o.key)),t.activeLanguages.forEach((t=>{let s=!1;if(o.packs.forEach((i=>{if(i.iso!==t)return;s=!0;const l=$("<td>");d.append(l),n=!0!==i.exists?null!==i.lastUpdate?"No language pack available for "+i.iso+" when tried at "+i.lastUpdate+". Click to re-try.":"Language pack not downloaded. Click to download":null===i.lastUpdate?"Downloaded. Click to renew":"Language pack downloaded at "+i.lastUpdate+". Click to renew",l.append($("<a>",{class:"btn btn-default t3js-languagePacks-update","data-extension":o.key,"data-iso":i.iso,"data-bs-toggle":"tooltip",title:a.encodeHtml(n)}).append(e))})),!s){const t=$("<td>");d.append(t).append(" ")}})),l.append(d)})),o.append($("<h3>").text("Translation status"),$("<table>",{class:"table table-striped table-bordered"}).append($("<thead>").append(d),l)),0===i?InfoBox.render(Severity.ok,"Language packs have been found for every installed extension.","To download the latest changes, use the refresh button in the list above."):o.html()}getNotificationBox(){return this.findInModal(this.selectorNotifications)}addNotification(t){this.notifications.push(t)}renderNotifications(){const t=this.getNotificationBox();for(let a of this.notifications)t.append(a);this.notifications=[]}}export default new LanguagePacks; \ No newline at end of file +import"bootstrap";import $ from"jquery";import{AbstractInteractableModule}from"@typo3/install/module/abstract-interactable-module.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";import SecurityUtility from"@typo3/core/security-utility.js";import FlashMessage from"@typo3/install/renderable/flash-message.js";import InfoBox from"@typo3/install/renderable/info-box.js";import ProgressBar from"@typo3/install/renderable/progress-bar.js";import Severity from"@typo3/install/renderable/severity.js";import Router from"@typo3/install/router.js";class LanguagePacks extends AbstractInteractableModule{constructor(){super(...arguments),this.selectorOutputContainer=".t3js-languagePacks-output",this.selectorContentContainer=".t3js-languagePacks-mainContent",this.selectorActivateLanguage=".t3js-languagePacks-activateLanguage",this.selectorActivateLanguageIcon="#t3js-languagePacks-activate-icon",this.selectorAddLanguageToggle=".t3js-languagePacks-addLanguage-toggle",this.selectorLanguageInactive=".t3js-languagePacks-inactive",this.selectorDeactivateLanguage=".t3js-languagePacks-deactivateLanguage",this.selectorDeactivateLanguageIcon="#t3js-languagePacks-deactivate-icon",this.selectorUpdate=".t3js-languagePacks-update",this.selectorLanguageUpdateIcon="#t3js-languagePacks-languageUpdate-icon",this.selectorNotifications=".t3js-languagePacks-notifications",this.activeLanguages=[],this.activeExtensions=[],this.packsUpdateDetails={toHandle:0,handled:0,updated:0,new:0,failed:0,skipped:0},this.notifications=[]}static pluralize(t,a="pack",e="s",s=0){return 1!==t&&1!==s?a+e:a}initialize(t){this.currentModal=t,this.getData(),t.on("click",this.selectorAddLanguageToggle,(()=>{t.find(this.selectorContentContainer+" "+this.selectorLanguageInactive).toggle()})),t.on("click",this.selectorActivateLanguage,(t=>{const a=$(t.target).closest(this.selectorActivateLanguage).data("iso");t.preventDefault(),this.activateLanguage(a)})),t.on("click",this.selectorDeactivateLanguage,(t=>{const a=$(t.target).closest(this.selectorDeactivateLanguage).data("iso");t.preventDefault(),this.deactivateLanguage(a)})),t.on("click",this.selectorUpdate,(t=>{const a=$(t.target).closest(this.selectorUpdate).data("iso"),e=$(t.target).closest(this.selectorUpdate).data("extension");t.preventDefault(),this.updatePacks(a,e)}))}getData(){const t=this.getModalBody();new AjaxRequest(Router.getUrl("languagePacksGetData")).get({cache:"no-cache"}).then((async a=>{const e=await a.resolve();if(!0===e.success){this.activeLanguages=e.activeLanguages,this.activeExtensions=e.activeExtensions,t.empty().append(e.html);const a=t.parent().find(this.selectorContentContainer);a.empty(),a.append(this.languageMatrixHtml(e)),a.append(this.extensionMatrixHtml(e))}else{const t=InfoBox.render(Severity.error,"Something went wrong","");this.addNotification(t)}this.renderNotifications()}),(a=>{Router.handleAjaxError(a,t)}))}activateLanguage(t){const a=this.getModalBody(),e=this.findInModal(this.selectorOutputContainer),s=ProgressBar.render(Severity.loading,"Loading...","");e.empty().append(s),this.getNotificationBox().empty(),new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksActivateLanguage",token:this.getModuleContent().data("language-packs-activate-language-token"),iso:t}}).then((async t=>{const a=await t.resolve();if(e.empty(),!0===a.success&&Array.isArray(a.status))a.status.forEach((t=>{const a=InfoBox.render(t.severity,t.title,t.message);this.addNotification(a)}));else{const t=FlashMessage.render(Severity.error,"Something went wrong","");this.addNotification(t)}this.getData()}),(t=>{Router.handleAjaxError(t,a)}))}deactivateLanguage(t){const a=this.getModalBody(),e=this.findInModal(this.selectorOutputContainer),s=ProgressBar.render(Severity.loading,"Loading...","");e.empty().append(s),this.getNotificationBox().empty(),new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksDeactivateLanguage",token:this.getModuleContent().data("language-packs-deactivate-language-token"),iso:t}}).then((async t=>{const a=await t.resolve();if(e.empty(),!0===a.success&&Array.isArray(a.status))a.status.forEach((t=>{const a=InfoBox.render(t.severity,t.title,t.message);this.addNotification(a)}));else{const t=FlashMessage.render(Severity.error,"Something went wrong","");this.addNotification(t)}this.getData()}),(t=>{Router.handleAjaxError(t,a)}))}updatePacks(t,a){const e=this.findInModal(this.selectorOutputContainer),s=this.findInModal(this.selectorContentContainer),n=void 0===t?this.activeLanguages:[t];let i=!0,o=this.activeExtensions;void 0!==a&&(o=[a],i=!1),this.packsUpdateDetails={toHandle:n.length*o.length,handled:0,updated:0,new:0,failed:0,skipped:0},e.empty().append($("<div>",{class:"progress"}).append($("<div>",{class:"progress-bar progress-bar-info",role:"progressbar","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,style:"width: 0;"}).append($("<span>",{class:"text-nowrap"}).text("0 of "+this.packsUpdateDetails.toHandle+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.toHandle)+" updated")))),s.empty(),n.forEach((t=>{o.forEach((a=>{this.getNotificationBox().empty(),new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksUpdatePack",token:this.getModuleContent().data("language-packs-update-pack-token"),iso:t,extension:a}}).then((async t=>{const a=await t.resolve();!0===a.success?(this.packsUpdateDetails.handled++,"new"===a.packResult?this.packsUpdateDetails.new++:"update"===a.packResult?this.packsUpdateDetails.updated++:"skipped"===a.packResult?this.packsUpdateDetails.skipped++:this.packsUpdateDetails.failed++,this.packUpdateDone(i,n)):(this.packsUpdateDetails.handled++,this.packsUpdateDetails.failed++,this.packUpdateDone(i,n))}),(()=>{this.packsUpdateDetails.handled++,this.packsUpdateDetails.failed++,this.packUpdateDone(i,n)}))}))}))}packUpdateDone(t,a){const e=this.getModalBody(),s=this.findInModal(this.selectorOutputContainer);if(this.packsUpdateDetails.handled===this.packsUpdateDetails.toHandle){const s=InfoBox.render(Severity.ok,"Language packs updated",this.packsUpdateDetails.new+" new language "+LanguagePacks.pluralize(this.packsUpdateDetails.new)+" downloaded, "+this.packsUpdateDetails.updated+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.updated)+" updated, "+this.packsUpdateDetails.skipped+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.skipped)+" skipped, "+this.packsUpdateDetails.failed+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.failed)+" not available");this.addNotification(s),!0===t?new AjaxRequest(Router.getUrl()).post({install:{action:"languagePacksUpdateIsoTimes",token:this.getModuleContent().data("language-packs-update-iso-times-token"),isos:a}}).then((async t=>{if(!0===(await t.resolve()).success)this.getData();else{const t=FlashMessage.render(Severity.error,"Something went wrong","");this.addNotification(t)}}),(t=>{Router.handleAjaxError(t,e)})):this.getData()}else{const t=this.packsUpdateDetails.handled/this.packsUpdateDetails.toHandle*100;s.find(".progress-bar").css("width",t+"%").attr("aria-valuenow",t).find("span").text(this.packsUpdateDetails.handled+" of "+this.packsUpdateDetails.toHandle+" language "+LanguagePacks.pluralize(this.packsUpdateDetails.handled,"pack","s",this.packsUpdateDetails.toHandle)+" updated")}}languageMatrixHtml(t){const a=this.findInModal(this.selectorActivateLanguageIcon).html(),e=this.findInModal(this.selectorDeactivateLanguageIcon).html(),s=this.findInModal(this.selectorLanguageUpdateIcon).html(),n=$("<div>"),i=$("<tbody>");return t.languages.forEach((t=>{const n=t.active,o=$("<tr>");n?i.append(o.append($("<td>").text(" "+t.name).prepend($("<div />",{class:"btn-group"}).append($("<a>",{class:"btn btn-default t3js-languagePacks-deactivateLanguage","data-iso":t.iso,title:"Deactivate"}).append(e),$("<a>",{class:"btn btn-default t3js-languagePacks-update","data-iso":t.iso,title:"Download language packs"}).append(s))))):i.append(o.addClass("t3-languagePacks-inactive t3js-languagePacks-inactive").css({display:"none"}).append($("<td>").text(" "+t.name).prepend($("<div />",{class:"btn-group"}).append($("<a>",{class:"btn btn-default t3js-languagePacks-activateLanguage","data-iso":t.iso,title:"Activate"}).append(a))))),o.append($("<td>").text(t.iso),$("<td>").text(t.dependencies.join(", ")),$("<td>").text(null===t.lastUpdate?"":t.lastUpdate)),i.append(o)})),n.append($("<h3>").text("Active languages"),$("<table>",{class:"table table-striped table-bordered"}).append($("<thead>").append($("<tr>").append($("<th>").append($("<div />",{class:"btn-group"}).append($("<button>",{class:"btn btn-default t3js-languagePacks-addLanguage-toggle",type:"button"}).append($("<span>").append(a)," Add language"),$("<button>",{class:"btn btn-default disabled update-all t3js-languagePacks-update",type:"button",disabled:"disabled"}).append($("<span>").append(s)," Update all"))),$("<th>").text("Locale"),$("<th>").text("Dependencies"),$("<th>").text("Last update"))),i)),Array.isArray(this.activeLanguages)&&this.activeLanguages.length&&n.find(".update-all").removeClass("disabled").removeAttr("disabled"),n.html()}extensionMatrixHtml(t){const a=new SecurityUtility,e=this.findInModal(this.selectorLanguageUpdateIcon).html();let s,n="",i=0;const o=$("<div>"),d=$("<tr>");d.append($("<th>").text("Extension"),$("<th>").text("Key")),t.activeLanguages.forEach((t=>{d.append($("<th>").append($("<a>",{class:"btn btn-default t3js-languagePacks-update","data-iso":t,title:"Download and update all language packs"}).append($("<span>").append(e)," "+t)))}));const l=$("<tbody>");return t.extensions.forEach((o=>{i++,s=void 0!==o.icon?$("<span>").append($("<img>",{style:"max-height: 16px; max-width: 16px;",src:o.icon,alt:o.title}),$("<span>").text(" "+o.title)):$("<span>").text(o.title);const d=$("<tr>");d.append($("<td>").html(s.html()),$("<td>").text(o.key)),t.activeLanguages.forEach((t=>{let s=!1;if(o.packs.forEach((i=>{if(i.iso!==t)return;s=!0;const l=$("<td>");d.append(l),n=!0!==i.exists?null!==i.lastUpdate?"No language pack available for "+i.iso+" when tried at "+i.lastUpdate+". Click to re-try.":"Language pack not downloaded. Click to download":null===i.lastUpdate?"Downloaded. Click to renew":"Language pack downloaded at "+i.lastUpdate+". Click to renew",l.append($("<a>",{class:"btn btn-default t3js-languagePacks-update","data-extension":o.key,"data-iso":i.iso,title:a.encodeHtml(n)}).append(e))})),!s){const t=$("<td>");d.append(t).append(" ")}})),l.append(d)})),o.append($("<h3>").text("Translation status"),$("<table>",{class:"table table-striped table-bordered"}).append($("<thead>").append(d),l)),0===i?InfoBox.render(Severity.ok,"Language packs have been found for every installed extension.","To download the latest changes, use the refresh button in the list above."):o.html()}getNotificationBox(){return this.findInModal(this.selectorNotifications)}addNotification(t){this.notifications.push(t)}renderNotifications(){const t=this.getNotificationBox();for(let a of this.notifications)t.append(a);this.notifications=[]}}export default new LanguagePacks; \ No newline at end of file diff --git a/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html b/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html index c5bf699bd6c6a728e634c524e29e7a7872379ad3..50f87f567d7e20985d546592feb29f94412df101 100644 --- a/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html +++ b/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html @@ -263,7 +263,7 @@ <f:be.link route="system_txschedulerM1" parameters="{action: {'stop': task.uid}}" class="btn btn-default t3js-modal-trigger" - data="{bs-toggle: 'tooltip', + data="{ severity: 'warning', button-close-text: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel\')}', bs-content='{f:translate(key: \'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:msg.stop\')}' @@ -279,7 +279,6 @@ <f:be.link route="system_txschedulerM1" parameters="{action: 'edit', 'uid': task.uid}" class="btn btn-default" - data="{bs-toggle: 'tooltip'}" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:edit')}" > <core:icon identifier="actions-open"/> @@ -290,7 +289,6 @@ type="submit" name="action[toggleHidden]" value="{task.uid}" - data-bs-toggle="tooltip" class="btn btn-default" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:enable')}" > @@ -302,7 +300,6 @@ type="submit" name="action[toggleHidden]" value="{task.uid}" - data-bs-toggle="tooltip" class="btn btn-default" title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:disable')}" > @@ -314,7 +311,7 @@ <f:be.link route="system_txschedulerM1" parameters="{action: {'delete': task.uid}}" class="btn btn-default t3js-modal-trigger" - data="{bs-toggle: 'tooltip', + data="{ severity: 'warning', button-close-text: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel\')}', bs-content='{f:translate(key: \'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:msg.delete\')}' @@ -327,7 +324,6 @@ <div class="btn-group" role="group"> <button type="submit" class="btn btn-default" - data-bs-toggle="tooltip" name="scheduleCron" value="{task.uid}" title="{f:translate(key:'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:action.run_task_cron')}" @@ -336,7 +332,6 @@ </button> <button type="submit" class="btn btn-default" - data-bs-toggle="tooltip" name="execute" value="{task.uid}" title="{f:translate(key:'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:action.run_task')}" @@ -409,7 +404,7 @@ route="system_txschedulerM1" parameters="{action: {'delete': errorClass.uid}}" class="btn btn-default t3js-modal-trigger" - data="{bs-toggle: 'tooltip', + data="{ severity: 'warning', button-close-text: '{f:translate(key: \'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel\')}', bs-content='{f:translate(key: \'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:msg.delete\')}' diff --git a/typo3/sysext/scheduler/Resources/Private/Templates/ListTasks.html b/typo3/sysext/scheduler/Resources/Private/Templates/ListTasks.html index 82ab0811d0e86a338f02769dc2b8fabbbd4a1357..b88108abee11e7f9f5766ce4f3492f1a19a5c9be 100644 --- a/typo3/sysext/scheduler/Resources/Private/Templates/ListTasks.html +++ b/typo3/sysext/scheduler/Resources/Private/Templates/ListTasks.html @@ -10,9 +10,8 @@ <f:be.pageRenderer includeJavaScriptModules="{ 0: '@typo3/backend/modal.js', - 1: '@typo3/backend/tooltip.js', - 2: '@typo3/backend/multi-record-selection.js', - 3: '@typo3/scheduler/scheduler.js' + 1: '@typo3/backend/multi-record-selection.js', + 2: '@typo3/scheduler/scheduler.js' }" /> <form name="tx_scheduler_form" id="tx_scheduler_form" method="post"> diff --git a/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js b/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js index 0949d3f96f02699feee5a70c6a5c9605a5d78a43..6a627e8e886bf14c1d88250ec751d24b4bcc40c8 100644 --- a/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js +++ b/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import DocumentService from"@typo3/core/document-service.js";import $ from"jquery";import"@typo3/backend/element/icon-element.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import"@typo3/backend/input/clearable.js";import Workspaces from"@typo3/workspaces/workspaces.js";import{default as Modal}from"@typo3/backend/modal.js";import Persistent from"@typo3/backend/storage/persistent.js";import Tooltip from"@typo3/backend/tooltip.js";import Utility from"@typo3/backend/utility.js";import Wizard from"@typo3/backend/wizard.js";import SecurityUtility from"@typo3/core/security-utility.js";import windowManager from"@typo3/backend/window-manager.js";import RegularEvent from"@typo3/core/event/regular-event.js";var Identifiers;!function(e){e.searchForm="#workspace-settings-form",e.searchTextField='#workspace-settings-form input[name="search-text"]',e.searchSubmitBtn='#workspace-settings-form button[type="submit"]',e.depthSelector='#workspace-settings-form [name="depth"]',e.languageSelector='#workspace-settings-form select[name="languages"]',e.stagesSelector='#workspace-settings-form select[name="stages"]',e.workspaceActions=".workspace-actions",e.chooseStageAction='.workspace-actions [name="stage-action"]',e.chooseSelectionAction='.workspace-actions [name="selection-action"]',e.chooseMassAction='.workspace-actions [name="mass-action"]',e.container="#workspace-panel",e.contentsContainer="#workspace-contents",e.noContentsContainer="#workspace-contents-empty",e.previewLinksButton=".t3js-preview-link",e.pagination="#workspace-pagination"}(Identifiers||(Identifiers={}));class Backend extends Workspaces{constructor(){super(),this.elements={},this.settings={dir:"ASC",id:TYPO3.settings.Workspaces.id,depth:1,language:"all",limit:30,query:"",sort:"label_Live",start:0,filterTxt:""},this.paging={currentPage:1,totalPages:1,totalItems:0},this.latestPath="",this.markedRecordsForMassAction=[],this.indentationPadding=26,this.handleCheckboxStateChanged=e=>{const t=$(e.target),a=t.parents("tr"),s=t.prop("checked"),n=a.data("table")+":"+a.data("uid")+":"+a.data("t3ver_oid");if(s)this.markedRecordsForMassAction.push(n);else{const e=this.markedRecordsForMassAction.indexOf(n);e>-1&&this.markedRecordsForMassAction.splice(e,1)}a.data("collectionCurrent")?Backend.changeCollectionChildrenState(a.data("collectionCurrent"),s):a.data("collection")&&(Backend.changeCollectionChildrenState(a.data("collection"),s),Backend.changeCollectionParentState(a.data("collection"),s)),this.elements.$chooseMassAction.prop("disabled",this.markedRecordsForMassAction.length>0)},this.viewChanges=e=>{e.preventDefault();const t=$(e.currentTarget).closest("tr");this.sendRemoteRequest(this.generateRemotePayload("getRowDetails",{stage:t.data("stage"),t3ver_oid:t.data("t3ver_oid"),table:t.data("table"),uid:t.data("uid"),filterFields:!0})).then((async e=>{const a=(await e.resolve())[0].result.data[0],s=$("<div />"),n=$("<ul />",{class:"nav nav-tabs",role:"tablist"}),i=$("<div />",{class:"tab-content"}),o=[];s.append($("<p />").html(TYPO3.lang.path.replace("{0}",a.path_Live)),$("<p />").html(TYPO3.lang.current_step.replace("{0}",a.label_Stage).replace("{1}",a.stage_position).replace("{2}",a.stage_count))),a.diff.length>0&&(n.append($("<li />",{role:"presentation",class:"nav-item"}).append($("<a />",{class:"nav-link",href:"#workspace-changes","aria-controls":"workspace-changes",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.changeSummary"]))),i.append($("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-changes"}).append($("<div />",{class:"form-section"}).append(Backend.generateDiffView(a.diff))))),a.comments.length>0&&(n.append($("<li />",{role:"presentation",class:"nav-item"}).append($("<a />",{class:"nav-link",href:"#workspace-comments","aria-controls":"workspace-comments",role:"tab","data-bs-toggle":"tab"}).html(TYPO3.lang["window.recordChanges.tabs.comments"]+" ").append($("<span />",{class:"badge"}).text(a.comments.length)))),i.append($("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-comments"}).append($("<div />",{class:"form-section"}).append(Backend.generateCommentView(a.comments))))),a.history.total>0&&(n.append($("<li />",{role:"presentation",class:"nav-item"}).append($("<a />",{class:"nav-link",href:"#workspace-history","aria-controls":"workspace-history",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.history"]))),i.append($("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-history"}).append($("<div />",{class:"form-section"}).append(Backend.generateHistoryView(a.history.data))))),n.find("li > a").first().addClass("active"),i.find(".tab-pane").first().addClass("active"),s.append($("<div />").append(n,i)),!1!==a.label_PrevStage&&t.data("stage")!==t.data("prevStage")&&o.push({text:a.label_PrevStage.title,active:!0,btnClass:"btn-default",name:"prevstage",trigger:(e,a)=>{a.hideModal(),this.sendToStage(t,"prev")}}),!1!==a.label_NextStage&&o.push({text:a.label_NextStage.title,active:!0,btnClass:"btn-default",name:"nextstage",trigger:(e,a)=>{a.hideModal(),this.sendToStage(t,"next")}}),o.push({text:TYPO3.lang.close,active:!0,btnClass:"btn-info",name:"cancel",trigger:(e,t)=>t.hideModal()}),Modal.advanced({type:Modal.types.default,title:TYPO3.lang["window.recordInformation"].replace("{0}",t.find(".t3js-title-live").text().trim()),content:s,severity:SeverityEnum.info,buttons:o,size:Modal.sizes.medium})}))},this.confirmDeleteRecordFromWorkspace=e=>{const t=$(e.target).closest("tr"),a=Modal.confirm(TYPO3.lang["window.discard.title"],TYPO3.lang["window.discard.message"],SeverityEnum.warning,[{text:TYPO3.lang.cancel,active:!0,btnClass:"btn-default",name:"cancel",trigger:()=>{a.hideModal()}},{text:TYPO3.lang.ok,btnClass:"btn-warning",name:"ok"}]);a.addEventListener("button.clicked",(e=>{"ok"===e.target.name&&this.sendRemoteRequest([this.generateRemoteActionsPayload("deleteSingleRecord",[t.data("table"),t.data("uid")])]).then((()=>{a.hideModal(),this.getWorkspaceInfos(),Backend.refreshPageTree()}))}))},this.runSelectionAction=e=>{const t=$(e.currentTarget).val(),a="discard"!==t;if(0===t.length)return;const s=[];for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");s.push({table:t[0],liveId:t[2],versionId:t[1]})}a?this.checkIntegrity({selection:s,type:"selection"}).then((async e=>{Wizard.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderSelectionActionWizard(t,s)})):(Wizard.setForceSelection(!1),this.renderSelectionActionWizard(t,s))},this.addIntegrityCheckWarningToWizard=()=>{Wizard.addSlide("integrity-warning","Warning",TYPO3.lang["integrity.hasIssuesDescription"]+"<br>"+TYPO3.lang["integrity.hasIssuesQuestion"],SeverityEnum.warning)},this.runMassAction=e=>{const t=$(e.currentTarget).val(),a="discard"!==t;0!==t.length&&(a?this.checkIntegrity({language:this.settings.language,type:t}).then((async e=>{Wizard.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderMassActionWizard(t)})):(Wizard.setForceSelection(!1),this.renderMassActionWizard(t)))},this.sendToSpecificStageAction=e=>{const t=[],a=$(e.currentTarget).val();for(let e=0;e<this.markedRecordsForMassAction.length;++e){const a=this.markedRecordsForMassAction[e].split(":");t.push({table:a[0],uid:a[1],t3ver_oid:a[2]})}this.sendRemoteRequest(this.generateRemoteActionsPayload("sendToSpecificStageWindow",[a,t])).then((async e=>{const s=this.renderSendToStageWindow(await e.resolve());s.addEventListener("button.clicked",(e=>{if("ok"===e.target.name){const e=Utility.convertFormToObject(s.querySelector("form"));e.affects={elements:t,nextStage:a},this.sendRemoteRequest([this.generateRemoteActionsPayload("sendToSpecificStageExecute",[e]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const t=await e.resolve();s.hideModal(),this.renderWorkspaceInfos(t[1].result),Backend.refreshPageTree()}))}})),s.addEventListener("typo3-modal-hide",(()=>{this.elements.$chooseStageAction.val("")}))}))},this.generatePreviewLinks=()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("generateWorkspacePreviewLinksForAllLanguages",[this.settings.id])).then((async e=>{const t=(await e.resolve())[0].result,a=$("<dl />");for(let[e,s]of Object.entries(t))a.append($("<dt />").text(e),$("<dd />").append($("<a />",{href:s,target:"_blank"}).text(s)));Modal.show(TYPO3.lang.previewLink,a,SeverityEnum.info,[{text:TYPO3.lang.ok,active:!0,btnClass:"btn-info",name:"ok",trigger:(e,t)=>t.hideModal()}],["modal-inner-scroll"])}))},DocumentService.ready().then((()=>{this.getElements(),this.registerEvents(),this.notifyWorkspaceSwitchAction(),this.settings.depth=this.elements.$depthSelector.val(),this.settings.language=this.elements.$languageSelector.val(),this.settings.stage=this.elements.$stagesSelector.val(),this.elements.$container.length&&this.getWorkspaceInfos()}))}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}static generateDiffView(e){const t=$("<div />",{class:"diff"});for(let a of e)t.append($("<div />",{class:"diff-item"}).append($("<div />",{class:"diff-item-title"}).text(a.label),$("<div />",{class:"diff-item-result diff-item-result-inline"}).html(a.content)));return t}static generateCommentView(e){const t=$("<div />");for(let a of e){const e=$("<div />",{class:"panel panel-default"});a.user_comment.length>0&&e.append($("<div />",{class:"panel-body"}).html(a.user_comment)),e.append($("<div />",{class:"panel-footer"}).append($("<span />",{class:"badge badge-success me-2"}).text(a.previous_stage_title+" > "+a.stage_title),$("<span />",{class:"badge badge-info"}).text(a.tstamp))),t.append($("<div />",{class:"media"}).append($("<div />",{class:"media-left text-center"}).text(a.user_username).prepend($("<div />").html(a.user_avatar)),$("<div />",{class:"media-body"}).append(e)))}return t}static generateHistoryView(e){const t=$("<div />");for(let a of e){const e=$("<div />",{class:"panel panel-default"});let s;if("object"==typeof a.differences){if(0===a.differences.length)continue;s=$("<div />",{class:"diff"});for(let e=0;e<a.differences.length;++e)s.append($("<div />",{class:"diff-item"}).append($("<div />",{class:"diff-item-title"}).text(a.differences[e].label),$("<div />",{class:"diff-item-result diff-item-result-inline"}).html(a.differences[e].html)));e.append($("<div />").append(s))}else e.append($("<div />",{class:"panel-body"}).text(a.differences));e.append($("<div />",{class:"panel-footer"}).append($("<span />",{class:"badge badge-info"}).text(a.datetime))),t.append($("<div />",{class:"media"}).append($("<div />",{class:"media-left text-center"}).text(a.user).prepend($("<div />").html(a.user_avatar)),$("<div />",{class:"media-body"}).append(e)))}return t}static changeCollectionParentState(e,t){const a=document.querySelector('tr[data-collection-current="'+e+'"] input[type=checkbox]');null!==a&&a.checked!==t&&(a.checked=t,a.dataset.manuallyChanged="true",a.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}static changeCollectionChildrenState(e,t){const a=document.querySelectorAll('tr[data-collection="'+e+'"] input[type=checkbox]');a.length&&a.forEach((e=>{e.checked!==t&&(e.checked=t,e.dataset.manuallyChanged="true",e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}))}notifyWorkspaceSwitchAction(){const e=document.querySelector("main[data-workspace-switch-action]");if(e.dataset.workspaceSwitchAction){const t=JSON.parse(e.dataset.workspaceSwitchAction);top.TYPO3.WorkspacesMenu.performWorkspaceSwitch(t.id,t.title),top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh")),top.TYPO3.ModuleMenu.App.refreshMenu()}}checkIntegrity(e){return this.sendRemoteRequest(this.generateRemotePayload("checkIntegrity",e))}getElements(){this.elements.$searchForm=$(Identifiers.searchForm),this.elements.$searchTextField=$(Identifiers.searchTextField),this.elements.$searchSubmitBtn=$(Identifiers.searchSubmitBtn),this.elements.$depthSelector=$(Identifiers.depthSelector),this.elements.$languageSelector=$(Identifiers.languageSelector),this.elements.$stagesSelector=$(Identifiers.stagesSelector),this.elements.$container=$(Identifiers.container),this.elements.$contentsContainer=$(Identifiers.contentsContainer),this.elements.$noContentsContainer=$(Identifiers.noContentsContainer),this.elements.$tableBody=this.elements.$contentsContainer.find("tbody"),this.elements.$workspaceActions=$(Identifiers.workspaceActions),this.elements.$chooseStageAction=$(Identifiers.chooseStageAction),this.elements.$chooseSelectionAction=$(Identifiers.chooseSelectionAction),this.elements.$chooseMassAction=$(Identifiers.chooseMassAction),this.elements.$previewLinksButton=$(Identifiers.previewLinksButton),this.elements.$pagination=$(Identifiers.pagination)}registerEvents(){$(document).on("click",'[data-action="publish"]',(e=>{const t=e.target.closest("tr");this.checkIntegrity({selection:[{liveId:t.dataset.uid,versionId:t.dataset.t3ver_oid,table:t.dataset.table}],type:"selection"}).then((async e=>{"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),Wizard.setForceSelection(!1),Wizard.addSlide("publish-confirm","Publish",TYPO3.lang["window.publish.message"],SeverityEnum.info),Wizard.addFinalProcessingSlide((()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("publishSingleRecord",[t.dataset.table,t.dataset.t3ver_oid,t.dataset.uid])).then((()=>{Wizard.dismiss(),this.getWorkspaceInfos(),Backend.refreshPageTree()}))})).then((()=>{Wizard.show()}))}))})).on("click",'[data-action="prevstage"]',(e=>{this.sendToStage($(e.currentTarget).closest("tr"),"prev")})).on("click",'[data-action="nextstage"]',(e=>{this.sendToStage($(e.currentTarget).closest("tr"),"next")})).on("click",'[data-action="changes"]',this.viewChanges).on("click",'[data-action="preview"]',this.openPreview.bind(this)).on("click",'[data-action="open"]',(e=>{const t=e.currentTarget.closest("tr");let a=TYPO3.settings.FormEngine.moduleUrl+"&returnUrl="+encodeURIComponent(document.location.href)+"&id="+TYPO3.settings.Workspaces.id+"&edit["+t.dataset.table+"]["+t.dataset.uid+"]=edit";window.location.href=a})).on("click",'[data-action="version"]',(e=>{const t=e.currentTarget.closest("tr"),a="pages"===t.dataset.table?t.dataset.t3ver_oid:t.dataset.pid;window.location.href=TYPO3.settings.WebLayout.moduleUrl+"&id="+a})).on("click",'[data-action="remove"]',this.confirmDeleteRecordFromWorkspace).on("click",'[data-action="expand"]',(e=>{const t=$(e.currentTarget);let a;a="true"===t.first().attr("aria-expanded")?"apps-pagetree-expand":"apps-pagetree-collapse",t.empty().append(this.getIcon(a))})),$(window.top.document).on("click",".t3js-workspace-recipients-selectall",(()=>{$(".t3js-workspace-recipient",window.top.document).not(":disabled").prop("checked",!0)})).on("click",".t3js-workspace-recipients-deselectall",(()=>{$(".t3js-workspace-recipient",window.top.document).not(":disabled").prop("checked",!1)})),this.elements.$searchForm.on("submit",(e=>{e.preventDefault(),this.settings.filterTxt=this.elements.$searchTextField.val(),this.getWorkspaceInfos()})),this.elements.$searchTextField.on("keyup",(e=>{""!==e.target.value?this.elements.$searchSubmitBtn.removeClass("disabled"):(this.elements.$searchSubmitBtn.addClass("disabled"),this.getWorkspaceInfos())}));const e=this.elements.$searchTextField.get(0);void 0!==e&&e.clearable({onClear:()=>{this.elements.$searchSubmitBtn.addClass("disabled"),this.settings.filterTxt="",this.getWorkspaceInfos()}}),new RegularEvent("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),this.elements.$depthSelector.on("change",(e=>{const t=e.target.value;Persistent.set("moduleData.workspaces_admin.depth",t),this.settings.depth=t,this.getWorkspaceInfos()})),this.elements.$previewLinksButton.on("click",this.generatePreviewLinks),this.elements.$languageSelector.on("change",(e=>{const t=$(e.target);Persistent.set("moduleData.workspaces_admin.language",t.val()),this.settings.language=t.val(),this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{const a=await e.resolve();this.elements.$languageSelector.prev().html(t.find(":selected").data("icon")),this.renderWorkspaceInfos(a[0].result)}))})),this.elements.$stagesSelector.on("change",(e=>{const t=e.target.value;Persistent.set("moduleData.workspaces_admin.stage",t),this.settings.stage=t,this.getWorkspaceInfos()})),this.elements.$chooseStageAction.on("change",this.sendToSpecificStageAction),this.elements.$chooseSelectionAction.on("change",this.runSelectionAction),this.elements.$chooseMassAction.on("change",this.runMassAction),this.elements.$pagination.on("click","[data-action]",(e=>{e.preventDefault();const t=$(e.currentTarget);let a=!1;switch(t.data("action")){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,a=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,a=!0);break;case"page":this.paging.currentPage=parseInt(t.data("page"),10),a=!0;break;default:throw'Unknown action "'+t.data("action")+'"'}a&&(this.settings.start=parseInt(this.settings.limit.toString(),10)*(this.paging.currentPage-1),this.getWorkspaceInfos())}))}sendToStage(e,t){let a,s,n;if("next"===t)a=e.data("nextStage"),s="sendToNextStageWindow",n="sendToNextStageExecute";else{if("prev"!==t)throw"Invalid direction given.";a=e.data("prevStage"),s="sendToPrevStageWindow",n="sendToPrevStageExecute"}this.sendRemoteRequest(this.generateRemoteActionsPayload(s,[e.data("uid"),e.data("table"),e.data("t3ver_oid")])).then((async t=>{const s=this.renderSendToStageWindow(await t.resolve());s.addEventListener("button.clicked",(t=>{if("ok"===t.target.name){const t=Utility.convertFormToObject(s.querySelector("form"));t.affects={table:e.data("table"),nextStage:a,t3ver_oid:e.data("t3ver_oid"),uid:e.data("uid"),elements:[]},this.sendRemoteRequest([this.generateRemoteActionsPayload(n,[t]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const t=await e.resolve();s.hideModal(),this.renderWorkspaceInfos(t[1].result),Backend.refreshPageTree()}))}}))}))}getWorkspaceInfos(){this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{this.renderWorkspaceInfos((await e.resolve())[0].result)}))}renderWorkspaceInfos(e){this.elements.$tableBody.children().remove(),this.resetMassActionState(e.data.length),this.buildPagination(e.total),0===e.total?(this.elements.$contentsContainer.hide(),this.elements.$noContentsContainer.show()):(this.elements.$contentsContainer.show(),this.elements.$noContentsContainer.hide());for(let t=0;t<e.data.length;++t){const a=e.data[t],s=$("<div />",{class:"btn-group"});let n,i=a.Workspaces_CollectionChildren>0&&""!==a.Workspaces_CollectionCurrent;s.append(this.getAction(i,"expand",a.expanded?"apps-pagetree-expand":"apps-pagetree-collapse").attr("title",TYPO3.lang["tooltip.expand"]).attr("data-bs-target",'[data-collection="'+a.Workspaces_CollectionCurrent+'"]').attr("aria-expanded",!i||a.expanded?"true":"false").attr("data-bs-toggle","collapse"),this.getAction(a.hasChanges,"changes","actions-document-info").attr("title",TYPO3.lang["tooltip.showChanges"]),this.getAction(a.allowedAction_publish&&""===a.Workspaces_CollectionParent,"publish","actions-version-swap-version").attr("title",TYPO3.lang["tooltip.publish"]),this.getAction(a.allowedAction_view,"preview","actions-version-workspace-preview").attr("title",TYPO3.lang["tooltip.viewElementAction"]),this.getAction(a.allowedAction_edit,"open","actions-open").attr("title",TYPO3.lang["tooltip.editElementAction"]),this.getAction(a.allowedAction_versionPageOpen,"version","actions-version-page-open").attr("title",TYPO3.lang["tooltip.openPage"]),this.getAction(a.allowedAction_delete,"remove","actions-version-document-remove").attr("title",TYPO3.lang["tooltip.discardVersion"])),""!==a.integrity.messages&&(n=$("<span>"+this.getIcon(a.integrity.status)+"</span>"),n.attr("data-bs-toggle","tooltip").attr("data-bs-placement","top").attr("data-bs-html","true").attr("title",a.integrity.messages)),this.latestPath!==a.path_Workspace&&(this.latestPath=a.path_Workspace,this.elements.$tableBody.append($("<tr />").append($("<th />"),$("<th />",{colspan:6}).html('<span title="'+a.path_Workspace+'">'+a.path_Workspace_crop+"</span>"))));const o=$("<span />",{class:"form-check form-toggle"}).append($("<input />",{type:"checkbox",class:"form-check-input t3js-multi-record-selection-check"})),r={"data-uid":a.uid,"data-pid":a.livepid,"data-t3ver_oid":a.t3ver_oid,"data-t3ver_wsid":a.t3ver_wsid,"data-table":a.table,"data-next-stage":a.value_nextStage,"data-prev-stage":a.value_prevStage,"data-stage":a.stage,"data-multi-record-selection-element":"true"};if(""!==a.Workspaces_CollectionParent){let t=e.data.find((e=>e.Workspaces_CollectionCurrent===a.Workspaces_CollectionParent));r["data-collection"]=a.Workspaces_CollectionParent,r.class="collapse"+(t.expanded?" show":"")}else""!==a.Workspaces_CollectionCurrent&&(r["data-collection-current"]=a.Workspaces_CollectionCurrent);this.elements.$tableBody.append($("<tr />",r).append($("<td />").empty().append(o),$("<td />",{class:"t3js-title-workspace",style:a.Workspaces_CollectionLevel>0?"padding-left: "+this.indentationPadding*a.Workspaces_CollectionLevel+"px":""}).html('<span class="icon icon-size-small">'+this.getIcon(a.icon_Workspace)+'</span> <a href="#" data-action="changes"><span class="workspace-state-'+a.state_Workspace+'" title="'+a.label_Workspace+'">'+a.label_Workspace_crop+"</span></a>"),$("<td />",{class:"t3js-title-live"}).html('<span class="icon icon-size-small">'+this.getIcon(a.icon_Live)+'</span> <span class"workspace-live-title title="'+a.label_Live+'">'+a.label_Live_crop+"</span>"),$("<td />").text(a.label_Stage),$("<td />").empty().append(n),$("<td />").html(this.getIcon(a.language.icon)),$("<td />",{class:"text-end nowrap"}).append(s))),Tooltip.initialize('[data-bs-toggle="tooltip"]',{delay:{show:500,hide:100},trigger:"hover",container:"body"})}}buildPagination(e){if(0===e)return void this.elements.$pagination.contents().remove();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/parseInt(this.settings.limit.toString(),10)),1===this.paging.totalPages)return void this.elements.$pagination.contents().remove();const t=$("<ul />",{class:"pagination"}),a=[],s=$("<li />",{class:"page-item"}).append($("<button />",{class:"page-link",type:"button","data-action":"previous"}).append($("<typo3-backend-icon />",{identifier:"actions-arrow-left-alt",size:"small"}))),n=$("<li />",{class:"page-item"}).append($("<button />",{class:"page-link",type:"button","data-action":"next"}).append($("<typo3-backend-icon />",{identifier:"actions-arrow-right-alt",size:"small"})));1===this.paging.currentPage&&s.disablePagingAction(),this.paging.currentPage===this.paging.totalPages&&n.disablePagingAction();for(let e=1;e<=this.paging.totalPages;e++){const t=$("<li />",{class:"page-item"+(this.paging.currentPage===e?" active":"")});t.append($("<button />",{class:"page-link",type:"button","data-action":"page","data-page":e}).append($("<span />").text(e))),a.push(t)}t.append(s,a,n),this.elements.$pagination.empty().append(t)}openPreview(e){const t=$(e.currentTarget).closest("tr");this.sendRemoteRequest(this.generateRemoteActionsPayload("viewSingleRecord",[t.data("table"),t.data("uid")])).then((async e=>{const t=(await e.resolve())[0].result;windowManager.localOpen(t)}))}renderSelectionActionWizard(e,t){Wizard.addSlide("mass-action-confirmation",TYPO3.lang["window.selectionAction.title"],"<p>"+(new SecurityUtility).encodeHtml(TYPO3.lang["tooltip."+e+"Selected"])+"</p>",SeverityEnum.warning),Wizard.addFinalProcessingSlide((()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("executeSelectionAction",{action:e,selection:t})).then((()=>{this.markedRecordsForMassAction=[],this.getWorkspaceInfos(),Wizard.dismiss(),Backend.refreshPageTree()}))})).then((()=>{Wizard.show(),Wizard.getComponent().on("wizard-dismissed",(()=>{this.elements.$chooseSelectionAction.val("")}))}))}renderMassActionWizard(e){let t;switch(e){case"publish":t="publishWorkspace";break;case"discard":t="flushWorkspace";break;default:throw"Invalid mass action "+e+" called."}const a=new SecurityUtility;Wizard.setForceSelection(!1),Wizard.addSlide("mass-action-confirmation",TYPO3.lang["window.massAction.title"],"<p>"+a.encodeHtml(TYPO3.lang["tooltip."+e+"All"])+"<br><br>"+a.encodeHtml(TYPO3.lang["tooltip.affectWholeWorkspace"])+"</p>",SeverityEnum.warning);const s=async e=>{const a=(await e.resolve())[0].result;a.processed<a.total?this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,a)).then(s):(this.getWorkspaceInfos(),Wizard.dismiss())};Wizard.addFinalProcessingSlide((()=>{this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,{init:!0,total:0,processed:0,language:this.settings.language})).then(s)})).then((()=>{Wizard.show(),Wizard.getComponent().on("wizard-dismissed",(()=>{this.elements.$chooseMassAction.val("")}))}))}getAction(e,t,a){return e?$("<button />",{class:"btn btn-default","data-action":t,"data-bs-toggle":"tooltip"}).append(this.getIcon(a)):$("<span />",{class:"btn btn-default disabled"}).append(this.getIcon("empty-empty"))}getIcon(e){switch(e){case"language":e="flags-multiple";break;case"integrity":case"info":e="status-dialog-information";break;case"success":e="status-dialog-ok";break;case"warning":e="status-dialog-warning";break;case"error":e="status-dialog-error"}return'<typo3-backend-icon identifier="'+e+'" size="small"></typo3-backend-icon>'}resetMassActionState(e){this.markedRecordsForMassAction=[],e&&(this.elements.$workspaceActions.removeClass("hidden"),this.elements.$chooseMassAction.prop("disabled",!1)),document.dispatchEvent(new CustomEvent("multiRecordSelection:actions:hide"))}}$.fn.disablePagingAction=function(){$(this).addClass("disabled").find("button").prop("disabled",!0)};export default new Backend; \ No newline at end of file +import DocumentService from"@typo3/core/document-service.js";import $ from"jquery";import"@typo3/backend/element/icon-element.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import"@typo3/backend/input/clearable.js";import Workspaces from"@typo3/workspaces/workspaces.js";import{default as Modal}from"@typo3/backend/modal.js";import Persistent from"@typo3/backend/storage/persistent.js";import Utility from"@typo3/backend/utility.js";import Wizard from"@typo3/backend/wizard.js";import SecurityUtility from"@typo3/core/security-utility.js";import windowManager from"@typo3/backend/window-manager.js";import RegularEvent from"@typo3/core/event/regular-event.js";var Identifiers;!function(e){e.searchForm="#workspace-settings-form",e.searchTextField='#workspace-settings-form input[name="search-text"]',e.searchSubmitBtn='#workspace-settings-form button[type="submit"]',e.depthSelector='#workspace-settings-form [name="depth"]',e.languageSelector='#workspace-settings-form select[name="languages"]',e.stagesSelector='#workspace-settings-form select[name="stages"]',e.workspaceActions=".workspace-actions",e.chooseStageAction='.workspace-actions [name="stage-action"]',e.chooseSelectionAction='.workspace-actions [name="selection-action"]',e.chooseMassAction='.workspace-actions [name="mass-action"]',e.container="#workspace-panel",e.contentsContainer="#workspace-contents",e.noContentsContainer="#workspace-contents-empty",e.previewLinksButton=".t3js-preview-link",e.pagination="#workspace-pagination"}(Identifiers||(Identifiers={}));class Backend extends Workspaces{constructor(){super(),this.elements={},this.settings={dir:"ASC",id:TYPO3.settings.Workspaces.id,depth:1,language:"all",limit:30,query:"",sort:"label_Live",start:0,filterTxt:""},this.paging={currentPage:1,totalPages:1,totalItems:0},this.latestPath="",this.markedRecordsForMassAction=[],this.indentationPadding=26,this.handleCheckboxStateChanged=e=>{const t=$(e.target),a=t.parents("tr"),s=t.prop("checked"),n=a.data("table")+":"+a.data("uid")+":"+a.data("t3ver_oid");if(s)this.markedRecordsForMassAction.push(n);else{const e=this.markedRecordsForMassAction.indexOf(n);e>-1&&this.markedRecordsForMassAction.splice(e,1)}a.data("collectionCurrent")?Backend.changeCollectionChildrenState(a.data("collectionCurrent"),s):a.data("collection")&&(Backend.changeCollectionChildrenState(a.data("collection"),s),Backend.changeCollectionParentState(a.data("collection"),s)),this.elements.$chooseMassAction.prop("disabled",this.markedRecordsForMassAction.length>0)},this.viewChanges=e=>{e.preventDefault();const t=$(e.currentTarget).closest("tr");this.sendRemoteRequest(this.generateRemotePayload("getRowDetails",{stage:t.data("stage"),t3ver_oid:t.data("t3ver_oid"),table:t.data("table"),uid:t.data("uid"),filterFields:!0})).then((async e=>{const a=(await e.resolve())[0].result.data[0],s=$("<div />"),n=$("<ul />",{class:"nav nav-tabs",role:"tablist"}),i=$("<div />",{class:"tab-content"}),o=[];s.append($("<p />").html(TYPO3.lang.path.replace("{0}",a.path_Live)),$("<p />").html(TYPO3.lang.current_step.replace("{0}",a.label_Stage).replace("{1}",a.stage_position).replace("{2}",a.stage_count))),a.diff.length>0&&(n.append($("<li />",{role:"presentation",class:"nav-item"}).append($("<a />",{class:"nav-link",href:"#workspace-changes","aria-controls":"workspace-changes",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.changeSummary"]))),i.append($("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-changes"}).append($("<div />",{class:"form-section"}).append(Backend.generateDiffView(a.diff))))),a.comments.length>0&&(n.append($("<li />",{role:"presentation",class:"nav-item"}).append($("<a />",{class:"nav-link",href:"#workspace-comments","aria-controls":"workspace-comments",role:"tab","data-bs-toggle":"tab"}).html(TYPO3.lang["window.recordChanges.tabs.comments"]+" ").append($("<span />",{class:"badge"}).text(a.comments.length)))),i.append($("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-comments"}).append($("<div />",{class:"form-section"}).append(Backend.generateCommentView(a.comments))))),a.history.total>0&&(n.append($("<li />",{role:"presentation",class:"nav-item"}).append($("<a />",{class:"nav-link",href:"#workspace-history","aria-controls":"workspace-history",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.history"]))),i.append($("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-history"}).append($("<div />",{class:"form-section"}).append(Backend.generateHistoryView(a.history.data))))),n.find("li > a").first().addClass("active"),i.find(".tab-pane").first().addClass("active"),s.append($("<div />").append(n,i)),!1!==a.label_PrevStage&&t.data("stage")!==t.data("prevStage")&&o.push({text:a.label_PrevStage.title,active:!0,btnClass:"btn-default",name:"prevstage",trigger:(e,a)=>{a.hideModal(),this.sendToStage(t,"prev")}}),!1!==a.label_NextStage&&o.push({text:a.label_NextStage.title,active:!0,btnClass:"btn-default",name:"nextstage",trigger:(e,a)=>{a.hideModal(),this.sendToStage(t,"next")}}),o.push({text:TYPO3.lang.close,active:!0,btnClass:"btn-info",name:"cancel",trigger:(e,t)=>t.hideModal()}),Modal.advanced({type:Modal.types.default,title:TYPO3.lang["window.recordInformation"].replace("{0}",t.find(".t3js-title-live").text().trim()),content:s,severity:SeverityEnum.info,buttons:o,size:Modal.sizes.medium})}))},this.confirmDeleteRecordFromWorkspace=e=>{const t=$(e.target).closest("tr"),a=Modal.confirm(TYPO3.lang["window.discard.title"],TYPO3.lang["window.discard.message"],SeverityEnum.warning,[{text:TYPO3.lang.cancel,active:!0,btnClass:"btn-default",name:"cancel",trigger:()=>{a.hideModal()}},{text:TYPO3.lang.ok,btnClass:"btn-warning",name:"ok"}]);a.addEventListener("button.clicked",(e=>{"ok"===e.target.name&&this.sendRemoteRequest([this.generateRemoteActionsPayload("deleteSingleRecord",[t.data("table"),t.data("uid")])]).then((()=>{a.hideModal(),this.getWorkspaceInfos(),Backend.refreshPageTree()}))}))},this.runSelectionAction=e=>{const t=$(e.currentTarget).val(),a="discard"!==t;if(0===t.length)return;const s=[];for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");s.push({table:t[0],liveId:t[2],versionId:t[1]})}a?this.checkIntegrity({selection:s,type:"selection"}).then((async e=>{Wizard.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderSelectionActionWizard(t,s)})):(Wizard.setForceSelection(!1),this.renderSelectionActionWizard(t,s))},this.addIntegrityCheckWarningToWizard=()=>{Wizard.addSlide("integrity-warning","Warning",TYPO3.lang["integrity.hasIssuesDescription"]+"<br>"+TYPO3.lang["integrity.hasIssuesQuestion"],SeverityEnum.warning)},this.runMassAction=e=>{const t=$(e.currentTarget).val(),a="discard"!==t;0!==t.length&&(a?this.checkIntegrity({language:this.settings.language,type:t}).then((async e=>{Wizard.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderMassActionWizard(t)})):(Wizard.setForceSelection(!1),this.renderMassActionWizard(t)))},this.sendToSpecificStageAction=e=>{const t=[],a=$(e.currentTarget).val();for(let e=0;e<this.markedRecordsForMassAction.length;++e){const a=this.markedRecordsForMassAction[e].split(":");t.push({table:a[0],uid:a[1],t3ver_oid:a[2]})}this.sendRemoteRequest(this.generateRemoteActionsPayload("sendToSpecificStageWindow",[a,t])).then((async e=>{const s=this.renderSendToStageWindow(await e.resolve());s.addEventListener("button.clicked",(e=>{if("ok"===e.target.name){const e=Utility.convertFormToObject(s.querySelector("form"));e.affects={elements:t,nextStage:a},this.sendRemoteRequest([this.generateRemoteActionsPayload("sendToSpecificStageExecute",[e]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const t=await e.resolve();s.hideModal(),this.renderWorkspaceInfos(t[1].result),Backend.refreshPageTree()}))}})),s.addEventListener("typo3-modal-hide",(()=>{this.elements.$chooseStageAction.val("")}))}))},this.generatePreviewLinks=()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("generateWorkspacePreviewLinksForAllLanguages",[this.settings.id])).then((async e=>{const t=(await e.resolve())[0].result,a=$("<dl />");for(let[e,s]of Object.entries(t))a.append($("<dt />").text(e),$("<dd />").append($("<a />",{href:s,target:"_blank"}).text(s)));Modal.show(TYPO3.lang.previewLink,a,SeverityEnum.info,[{text:TYPO3.lang.ok,active:!0,btnClass:"btn-info",name:"ok",trigger:(e,t)=>t.hideModal()}],["modal-inner-scroll"])}))},DocumentService.ready().then((()=>{this.getElements(),this.registerEvents(),this.notifyWorkspaceSwitchAction(),this.settings.depth=this.elements.$depthSelector.val(),this.settings.language=this.elements.$languageSelector.val(),this.settings.stage=this.elements.$stagesSelector.val(),this.elements.$container.length&&this.getWorkspaceInfos()}))}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}static generateDiffView(e){const t=$("<div />",{class:"diff"});for(let a of e)t.append($("<div />",{class:"diff-item"}).append($("<div />",{class:"diff-item-title"}).text(a.label),$("<div />",{class:"diff-item-result diff-item-result-inline"}).html(a.content)));return t}static generateCommentView(e){const t=$("<div />");for(let a of e){const e=$("<div />",{class:"panel panel-default"});a.user_comment.length>0&&e.append($("<div />",{class:"panel-body"}).html(a.user_comment)),e.append($("<div />",{class:"panel-footer"}).append($("<span />",{class:"badge badge-success me-2"}).text(a.previous_stage_title+" > "+a.stage_title),$("<span />",{class:"badge badge-info"}).text(a.tstamp))),t.append($("<div />",{class:"media"}).append($("<div />",{class:"media-left text-center"}).text(a.user_username).prepend($("<div />").html(a.user_avatar)),$("<div />",{class:"media-body"}).append(e)))}return t}static generateHistoryView(e){const t=$("<div />");for(let a of e){const e=$("<div />",{class:"panel panel-default"});let s;if("object"==typeof a.differences){if(0===a.differences.length)continue;s=$("<div />",{class:"diff"});for(let e=0;e<a.differences.length;++e)s.append($("<div />",{class:"diff-item"}).append($("<div />",{class:"diff-item-title"}).text(a.differences[e].label),$("<div />",{class:"diff-item-result diff-item-result-inline"}).html(a.differences[e].html)));e.append($("<div />").append(s))}else e.append($("<div />",{class:"panel-body"}).text(a.differences));e.append($("<div />",{class:"panel-footer"}).append($("<span />",{class:"badge badge-info"}).text(a.datetime))),t.append($("<div />",{class:"media"}).append($("<div />",{class:"media-left text-center"}).text(a.user).prepend($("<div />").html(a.user_avatar)),$("<div />",{class:"media-body"}).append(e)))}return t}static changeCollectionParentState(e,t){const a=document.querySelector('tr[data-collection-current="'+e+'"] input[type=checkbox]');null!==a&&a.checked!==t&&(a.checked=t,a.dataset.manuallyChanged="true",a.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}static changeCollectionChildrenState(e,t){const a=document.querySelectorAll('tr[data-collection="'+e+'"] input[type=checkbox]');a.length&&a.forEach((e=>{e.checked!==t&&(e.checked=t,e.dataset.manuallyChanged="true",e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}))}notifyWorkspaceSwitchAction(){const e=document.querySelector("main[data-workspace-switch-action]");if(e.dataset.workspaceSwitchAction){const t=JSON.parse(e.dataset.workspaceSwitchAction);top.TYPO3.WorkspacesMenu.performWorkspaceSwitch(t.id,t.title),top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh")),top.TYPO3.ModuleMenu.App.refreshMenu()}}checkIntegrity(e){return this.sendRemoteRequest(this.generateRemotePayload("checkIntegrity",e))}getElements(){this.elements.$searchForm=$(Identifiers.searchForm),this.elements.$searchTextField=$(Identifiers.searchTextField),this.elements.$searchSubmitBtn=$(Identifiers.searchSubmitBtn),this.elements.$depthSelector=$(Identifiers.depthSelector),this.elements.$languageSelector=$(Identifiers.languageSelector),this.elements.$stagesSelector=$(Identifiers.stagesSelector),this.elements.$container=$(Identifiers.container),this.elements.$contentsContainer=$(Identifiers.contentsContainer),this.elements.$noContentsContainer=$(Identifiers.noContentsContainer),this.elements.$tableBody=this.elements.$contentsContainer.find("tbody"),this.elements.$workspaceActions=$(Identifiers.workspaceActions),this.elements.$chooseStageAction=$(Identifiers.chooseStageAction),this.elements.$chooseSelectionAction=$(Identifiers.chooseSelectionAction),this.elements.$chooseMassAction=$(Identifiers.chooseMassAction),this.elements.$previewLinksButton=$(Identifiers.previewLinksButton),this.elements.$pagination=$(Identifiers.pagination)}registerEvents(){$(document).on("click",'[data-action="publish"]',(e=>{const t=e.target.closest("tr");this.checkIntegrity({selection:[{liveId:t.dataset.uid,versionId:t.dataset.t3ver_oid,table:t.dataset.table}],type:"selection"}).then((async e=>{"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),Wizard.setForceSelection(!1),Wizard.addSlide("publish-confirm","Publish",TYPO3.lang["window.publish.message"],SeverityEnum.info),Wizard.addFinalProcessingSlide((()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("publishSingleRecord",[t.dataset.table,t.dataset.t3ver_oid,t.dataset.uid])).then((()=>{Wizard.dismiss(),this.getWorkspaceInfos(),Backend.refreshPageTree()}))})).then((()=>{Wizard.show()}))}))})).on("click",'[data-action="prevstage"]',(e=>{this.sendToStage($(e.currentTarget).closest("tr"),"prev")})).on("click",'[data-action="nextstage"]',(e=>{this.sendToStage($(e.currentTarget).closest("tr"),"next")})).on("click",'[data-action="changes"]',this.viewChanges).on("click",'[data-action="preview"]',this.openPreview.bind(this)).on("click",'[data-action="open"]',(e=>{const t=e.currentTarget.closest("tr");let a=TYPO3.settings.FormEngine.moduleUrl+"&returnUrl="+encodeURIComponent(document.location.href)+"&id="+TYPO3.settings.Workspaces.id+"&edit["+t.dataset.table+"]["+t.dataset.uid+"]=edit";window.location.href=a})).on("click",'[data-action="version"]',(e=>{const t=e.currentTarget.closest("tr"),a="pages"===t.dataset.table?t.dataset.t3ver_oid:t.dataset.pid;window.location.href=TYPO3.settings.WebLayout.moduleUrl+"&id="+a})).on("click",'[data-action="remove"]',this.confirmDeleteRecordFromWorkspace).on("click",'[data-action="expand"]',(e=>{const t=$(e.currentTarget);let a;a="true"===t.first().attr("aria-expanded")?"apps-pagetree-expand":"apps-pagetree-collapse",t.empty().append(this.getIcon(a))})),$(window.top.document).on("click",".t3js-workspace-recipients-selectall",(()=>{$(".t3js-workspace-recipient",window.top.document).not(":disabled").prop("checked",!0)})).on("click",".t3js-workspace-recipients-deselectall",(()=>{$(".t3js-workspace-recipient",window.top.document).not(":disabled").prop("checked",!1)})),this.elements.$searchForm.on("submit",(e=>{e.preventDefault(),this.settings.filterTxt=this.elements.$searchTextField.val(),this.getWorkspaceInfos()})),this.elements.$searchTextField.on("keyup",(e=>{""!==e.target.value?this.elements.$searchSubmitBtn.removeClass("disabled"):(this.elements.$searchSubmitBtn.addClass("disabled"),this.getWorkspaceInfos())}));const e=this.elements.$searchTextField.get(0);void 0!==e&&e.clearable({onClear:()=>{this.elements.$searchSubmitBtn.addClass("disabled"),this.settings.filterTxt="",this.getWorkspaceInfos()}}),new RegularEvent("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),this.elements.$depthSelector.on("change",(e=>{const t=e.target.value;Persistent.set("moduleData.workspaces_admin.depth",t),this.settings.depth=t,this.getWorkspaceInfos()})),this.elements.$previewLinksButton.on("click",this.generatePreviewLinks),this.elements.$languageSelector.on("change",(e=>{const t=$(e.target);Persistent.set("moduleData.workspaces_admin.language",t.val()),this.settings.language=t.val(),this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{const a=await e.resolve();this.elements.$languageSelector.prev().html(t.find(":selected").data("icon")),this.renderWorkspaceInfos(a[0].result)}))})),this.elements.$stagesSelector.on("change",(e=>{const t=e.target.value;Persistent.set("moduleData.workspaces_admin.stage",t),this.settings.stage=t,this.getWorkspaceInfos()})),this.elements.$chooseStageAction.on("change",this.sendToSpecificStageAction),this.elements.$chooseSelectionAction.on("change",this.runSelectionAction),this.elements.$chooseMassAction.on("change",this.runMassAction),this.elements.$pagination.on("click","[data-action]",(e=>{e.preventDefault();const t=$(e.currentTarget);let a=!1;switch(t.data("action")){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,a=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,a=!0);break;case"page":this.paging.currentPage=parseInt(t.data("page"),10),a=!0;break;default:throw'Unknown action "'+t.data("action")+'"'}a&&(this.settings.start=parseInt(this.settings.limit.toString(),10)*(this.paging.currentPage-1),this.getWorkspaceInfos())}))}sendToStage(e,t){let a,s,n;if("next"===t)a=e.data("nextStage"),s="sendToNextStageWindow",n="sendToNextStageExecute";else{if("prev"!==t)throw"Invalid direction given.";a=e.data("prevStage"),s="sendToPrevStageWindow",n="sendToPrevStageExecute"}this.sendRemoteRequest(this.generateRemoteActionsPayload(s,[e.data("uid"),e.data("table"),e.data("t3ver_oid")])).then((async t=>{const s=this.renderSendToStageWindow(await t.resolve());s.addEventListener("button.clicked",(t=>{if("ok"===t.target.name){const t=Utility.convertFormToObject(s.querySelector("form"));t.affects={table:e.data("table"),nextStage:a,t3ver_oid:e.data("t3ver_oid"),uid:e.data("uid"),elements:[]},this.sendRemoteRequest([this.generateRemoteActionsPayload(n,[t]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const t=await e.resolve();s.hideModal(),this.renderWorkspaceInfos(t[1].result),Backend.refreshPageTree()}))}}))}))}getWorkspaceInfos(){this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{this.renderWorkspaceInfos((await e.resolve())[0].result)}))}renderWorkspaceInfos(e){this.elements.$tableBody.children().remove(),this.resetMassActionState(e.data.length),this.buildPagination(e.total),0===e.total?(this.elements.$contentsContainer.hide(),this.elements.$noContentsContainer.show()):(this.elements.$contentsContainer.show(),this.elements.$noContentsContainer.hide());for(let t=0;t<e.data.length;++t){const a=e.data[t],s=$("<div />",{class:"btn-group"});let n,i=a.Workspaces_CollectionChildren>0&&""!==a.Workspaces_CollectionCurrent;s.append(this.getAction(i,"expand",a.expanded?"apps-pagetree-expand":"apps-pagetree-collapse").attr("title",TYPO3.lang["tooltip.expand"]).attr("data-bs-target",'[data-collection="'+a.Workspaces_CollectionCurrent+'"]').attr("aria-expanded",!i||a.expanded?"true":"false").attr("data-bs-toggle","collapse"),this.getAction(a.hasChanges,"changes","actions-document-info").attr("title",TYPO3.lang["tooltip.showChanges"]),this.getAction(a.allowedAction_publish&&""===a.Workspaces_CollectionParent,"publish","actions-version-swap-version").attr("title",TYPO3.lang["tooltip.publish"]),this.getAction(a.allowedAction_view,"preview","actions-version-workspace-preview").attr("title",TYPO3.lang["tooltip.viewElementAction"]),this.getAction(a.allowedAction_edit,"open","actions-open").attr("title",TYPO3.lang["tooltip.editElementAction"]),this.getAction(a.allowedAction_versionPageOpen,"version","actions-version-page-open").attr("title",TYPO3.lang["tooltip.openPage"]),this.getAction(a.allowedAction_delete,"remove","actions-version-document-remove").attr("title",TYPO3.lang["tooltip.discardVersion"])),""!==a.integrity.messages&&(n=$("<span>"+this.getIcon(a.integrity.status)+"</span>"),n.attr("title",a.integrity.messages)),this.latestPath!==a.path_Workspace&&(this.latestPath=a.path_Workspace,this.elements.$tableBody.append($("<tr />").append($("<th />"),$("<th />",{colspan:6}).html('<span title="'+a.path_Workspace+'">'+a.path_Workspace_crop+"</span>"))));const o=$("<span />",{class:"form-check form-toggle"}).append($("<input />",{type:"checkbox",class:"form-check-input t3js-multi-record-selection-check"})),r={"data-uid":a.uid,"data-pid":a.livepid,"data-t3ver_oid":a.t3ver_oid,"data-t3ver_wsid":a.t3ver_wsid,"data-table":a.table,"data-next-stage":a.value_nextStage,"data-prev-stage":a.value_prevStage,"data-stage":a.stage,"data-multi-record-selection-element":"true"};if(""!==a.Workspaces_CollectionParent){let t=e.data.find((e=>e.Workspaces_CollectionCurrent===a.Workspaces_CollectionParent));r["data-collection"]=a.Workspaces_CollectionParent,r.class="collapse"+(t.expanded?" show":"")}else""!==a.Workspaces_CollectionCurrent&&(r["data-collection-current"]=a.Workspaces_CollectionCurrent);this.elements.$tableBody.append($("<tr />",r).append($("<td />").empty().append(o),$("<td />",{class:"t3js-title-workspace",style:a.Workspaces_CollectionLevel>0?"padding-left: "+this.indentationPadding*a.Workspaces_CollectionLevel+"px":""}).html('<span class="icon icon-size-small">'+this.getIcon(a.icon_Workspace)+'</span> <a href="#" data-action="changes"><span class="workspace-state-'+a.state_Workspace+'" title="'+a.label_Workspace+'">'+a.label_Workspace_crop+"</span></a>"),$("<td />",{class:"t3js-title-live"}).html('<span class="icon icon-size-small">'+this.getIcon(a.icon_Live)+'</span> <span class"workspace-live-title title="'+a.label_Live+'">'+a.label_Live_crop+"</span>"),$("<td />").text(a.label_Stage),$("<td />").empty().append(n),$("<td />").html(this.getIcon(a.language.icon)),$("<td />",{class:"text-end nowrap"}).append(s)))}}buildPagination(e){if(0===e)return void this.elements.$pagination.contents().remove();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/parseInt(this.settings.limit.toString(),10)),1===this.paging.totalPages)return void this.elements.$pagination.contents().remove();const t=$("<ul />",{class:"pagination"}),a=[],s=$("<li />",{class:"page-item"}).append($("<button />",{class:"page-link",type:"button","data-action":"previous"}).append($("<typo3-backend-icon />",{identifier:"actions-arrow-left-alt",size:"small"}))),n=$("<li />",{class:"page-item"}).append($("<button />",{class:"page-link",type:"button","data-action":"next"}).append($("<typo3-backend-icon />",{identifier:"actions-arrow-right-alt",size:"small"})));1===this.paging.currentPage&&s.disablePagingAction(),this.paging.currentPage===this.paging.totalPages&&n.disablePagingAction();for(let e=1;e<=this.paging.totalPages;e++){const t=$("<li />",{class:"page-item"+(this.paging.currentPage===e?" active":"")});t.append($("<button />",{class:"page-link",type:"button","data-action":"page","data-page":e}).append($("<span />").text(e))),a.push(t)}t.append(s,a,n),this.elements.$pagination.empty().append(t)}openPreview(e){const t=$(e.currentTarget).closest("tr");this.sendRemoteRequest(this.generateRemoteActionsPayload("viewSingleRecord",[t.data("table"),t.data("uid")])).then((async e=>{const t=(await e.resolve())[0].result;windowManager.localOpen(t)}))}renderSelectionActionWizard(e,t){Wizard.addSlide("mass-action-confirmation",TYPO3.lang["window.selectionAction.title"],"<p>"+(new SecurityUtility).encodeHtml(TYPO3.lang["tooltip."+e+"Selected"])+"</p>",SeverityEnum.warning),Wizard.addFinalProcessingSlide((()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("executeSelectionAction",{action:e,selection:t})).then((()=>{this.markedRecordsForMassAction=[],this.getWorkspaceInfos(),Wizard.dismiss(),Backend.refreshPageTree()}))})).then((()=>{Wizard.show(),Wizard.getComponent().on("wizard-dismissed",(()=>{this.elements.$chooseSelectionAction.val("")}))}))}renderMassActionWizard(e){let t;switch(e){case"publish":t="publishWorkspace";break;case"discard":t="flushWorkspace";break;default:throw"Invalid mass action "+e+" called."}const a=new SecurityUtility;Wizard.setForceSelection(!1),Wizard.addSlide("mass-action-confirmation",TYPO3.lang["window.massAction.title"],"<p>"+a.encodeHtml(TYPO3.lang["tooltip."+e+"All"])+"<br><br>"+a.encodeHtml(TYPO3.lang["tooltip.affectWholeWorkspace"])+"</p>",SeverityEnum.warning);const s=async e=>{const a=(await e.resolve())[0].result;a.processed<a.total?this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,a)).then(s):(this.getWorkspaceInfos(),Wizard.dismiss())};Wizard.addFinalProcessingSlide((()=>{this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,{init:!0,total:0,processed:0,language:this.settings.language})).then(s)})).then((()=>{Wizard.show(),Wizard.getComponent().on("wizard-dismissed",(()=>{this.elements.$chooseMassAction.val("")}))}))}getAction(e,t,a){return e?$("<button />",{class:"btn btn-default","data-action":t}).append(this.getIcon(a)):$("<span />",{class:"btn btn-default disabled"}).append(this.getIcon("empty-empty"))}getIcon(e){switch(e){case"language":e="flags-multiple";break;case"integrity":case"info":e="status-dialog-information";break;case"success":e="status-dialog-ok";break;case"warning":e="status-dialog-warning";break;case"error":e="status-dialog-error"}return'<typo3-backend-icon identifier="'+e+'" size="small"></typo3-backend-icon>'}resetMassActionState(e){this.markedRecordsForMassAction=[],e&&(this.elements.$workspaceActions.removeClass("hidden"),this.elements.$chooseMassAction.prop("disabled",!1)),document.dispatchEvent(new CustomEvent("multiRecordSelection:actions:hide"))}}$.fn.disablePagingAction=function(){$(this).addClass("disabled").find("button").prop("disabled",!0)};export default new Backend; \ No newline at end of file