From 14061a95ecedbab66b81df124adafca5c90aca20 Mon Sep 17 00:00:00 2001 From: Oliver Bartsch <bo@cedev.de> Date: Fri, 27 Aug 2021 17:43:55 +0200 Subject: [PATCH] [TASK] Enable multi record selection to handle multiple instances The multi record selection component is now able to handle multiple instances per page, by using an unique identifier for each instance. Resolves: #95017 Releases: master Change-Id: I31f5a85f74044501912fdc92183408ea9ca03b88 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/70799 Tested-by: core-ci <typo3@b13.com> Tested-by: Benni Mack <benni@typo3.org> Tested-by: Benjamin Franzke <bfr@qbus.de> Reviewed-by: Benni Mack <benni@typo3.org> Reviewed-by: Benjamin Franzke <bfr@qbus.de> --- .../Public/TypeScript/MultiRecordSelection.ts | 189 +++++++++++++----- .../Public/TypeScript/BrowseFiles.ts | 4 +- .../Resources/Public/TypeScript/Recycler.ts | 4 +- .../Resources/Public/TypeScript/Backend.ts | 8 +- .../Public/JavaScript/MultiRecordSelection.js | 2 +- typo3/sysext/filelist/Classes/FileList.php | 4 +- .../Classes/Browser/FileBrowser.php | 8 +- .../Public/JavaScript/BrowseFiles.js | 2 +- .../Templates/RecyclerModule/Index.html | 4 +- .../Resources/Public/JavaScript/Recycler.js | 2 +- .../Private/Partials/WorkingTable.html | 4 +- .../Resources/Public/JavaScript/Backend.js | 2 +- 12 files changed, 165 insertions(+), 68 deletions(-) diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/MultiRecordSelection.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/MultiRecordSelection.ts index b4f44efd6835..428cdebcb7db 100644 --- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/MultiRecordSelection.ts +++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/MultiRecordSelection.ts @@ -18,7 +18,8 @@ import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); enum Selectors { actionsSelector = '.t3js-multi-record-selection-actions', checkboxSelector = '.t3js-multi-record-selection-check', - checkboxActionsSelector = '#multi-record-selection-check-actions', + checkboxActionsSelector = '.t3js-multi-record-selection-check-actions', + checkboxActionsToggleSelector = '.t3js-multi-record-selection-check-actions-toggle', } enum Buttons { @@ -58,8 +59,16 @@ interface EditActionConfiguration extends ActionConfiguration{ class MultiRecordSelection { private lastChecked: HTMLInputElement = null; - private static getCheckboxes(state: CheckboxState = CheckboxState.any): NodeListOf<HTMLInputElement> { - return document.querySelectorAll(Selectors.checkboxSelector + state); + private static getCheckboxes(state: CheckboxState = CheckboxState.any, identifier: string = ''): NodeListOf<HTMLInputElement> { + return document.querySelectorAll(MultiRecordSelection.getCombinedSelector(Selectors.checkboxSelector + state, identifier)); + } + + private static getCombinedSelector(selector: string, identifier: string): string { + return identifier !== '' ? ['[data-multi-record-selection-identifier="' + identifier + '"]', selector].join (' ') : selector; + } + + private static getIdentifier(element: HTMLElement): string { + return (element.closest('[data-multi-record-selection-identifier]') as HTMLElement)?.dataset.multiRecordSelectionIdentifier || ''; } private static changeCheckboxState(checkbox: HTMLInputElement, check: boolean): void { @@ -68,7 +77,9 @@ class MultiRecordSelection { return; } checkbox.checked = check; - checkbox.dispatchEvent(new Event('checkbox:state:changed', {bubbles: true, cancelable: false})); + checkbox.dispatchEvent(new CustomEvent('multiRecordSelection:checkbox:state:changed',{ + detail: { identifier: MultiRecordSelection.getIdentifier(checkbox) }, bubbles: true, cancelable: false + })); } private static getReturnUrl(returnUrl: string): string { @@ -89,34 +100,54 @@ class MultiRecordSelection { if (!checked.length) { return; } + // Highlight each checked checkbox and toggle the corresponding actions. Since + // the evaluation for toggling actions does a lot of things, we don't want to + // perform this for every checked checkbox. Therefore we store the identifiers, + // which were already evaluated and do not call the evaluation for them again. + let actionsToggled: boolean = false; + let identifiers: Array<string> = []; checked.forEach((checkbox: HTMLInputElement) => { checkbox.closest('tr').classList.add('success'); + const identifier: string = MultiRecordSelection.getIdentifier(checkbox); + if (identifier !== '' && !identifiers.includes(identifier)) { + identifiers.push(identifier); + actionsToggled = true; + MultiRecordSelection.toggleActionsState(identifier); + } }); - const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll(Selectors.actionsSelector); - actionContainers.length && actionContainers.forEach((container: HTMLElement): void => container.classList.remove('hidden')); + // If none of the checked checkboxes contain an identifier, call the toggling one time anyways. + if (!actionsToggled) { + MultiRecordSelection.toggleActionsState(); + } } /** * Toggles the state of the actions, depending on the * currently selected elements and their nature. */ - private static toggleActionsState(): void { - const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll(Selectors.actionsSelector); + private static toggleActionsState(identifier: string = ''): void { + const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll( + MultiRecordSelection.getCombinedSelector(Selectors.actionsSelector, identifier) + ); + if (!actionContainers.length) { // Early return in case no action containers are defined return; } - if (!MultiRecordSelection.getCheckboxes(CheckboxState.checked).length) { + if (!MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier).length) { // In case no checkbox is checked, hide all action containers and return - actionContainers.forEach((container: HTMLElement): void => container.classList.add('hidden')); + actionContainers.forEach((container: HTMLElement): void => MultiRecordSelection.changeActionContainerVisibility(container, false)); return; } // Remove hidden state of all action containers, since checked checkboxes exist - actionContainers.forEach((container: HTMLElement): void => container.classList.remove('hidden')); + actionContainers.forEach((container: HTMLElement): void => MultiRecordSelection.changeActionContainerVisibility(container)); + + const actions: NodeListOf<HTMLButtonElement> = document.querySelectorAll( + [MultiRecordSelection.getCombinedSelector(Selectors.actionsSelector, identifier), Buttons.actionButton].join(' ') + ); - const actions: NodeListOf<HTMLButtonElement> = document.querySelectorAll([Selectors.actionsSelector, Buttons.actionButton].join(' ')); if (!actions.length) { // Early return in case no action is defined return; @@ -135,7 +166,7 @@ class MultiRecordSelection { // Start the evaluation by disabling the action action.classList.add('disabled'); // Get all currently checked elements - const checked: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(CheckboxState.checked); + const checked: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier); for (let i=0; i < checked.length; i++) { // Evaluate each checked element if it contains the specified idField if (checked[i].closest('tr').dataset[configuration.idField]) { @@ -148,6 +179,30 @@ class MultiRecordSelection { }); } + /** + * This primarily just adds/removes the "hidden" class of the container. In case + * the container is in a panel, it also toggles the other panel heading elements. + * Note: This only works in case the container is not in the wrapper class, which + * should only be used for containers, outside of a panel. + * + * @param {HTMLElement} container The container to change the visibility for + * @param {boolean} visible Whether the container should be visible or not + */ + private static changeActionContainerVisibility(container: HTMLElement, visible: boolean = true): void { + const panelElements: HTMLCollection = container.closest('.panel-heading')?.children; + if (visible) { + if (panelElements) { + for (let i=0; i < panelElements.length; i++) { panelElements[i].classList.add('hidden') } + } + container.classList.remove('hidden'); + } else { + if (panelElements) { + for (let i=0; i < panelElements.length; i++) { panelElements[i].classList.remove('hidden') } + } + container.classList.add('hidden'); + } + } + /** * The manually changed attribute can be set by components, using * this module while implementing custom logic to change checkbox @@ -157,8 +212,8 @@ class MultiRecordSelection { * this module, which changes checkbox states. Otherwise old * state would may led to misbehaviour. */ - private static unsetManuallyChangedAttribute(): void { - MultiRecordSelection.getCheckboxes().forEach((checkbox: HTMLInputElement): void => { + private static unsetManuallyChangedAttribute(identifier: string): void { + MultiRecordSelection.getCheckboxes(CheckboxState.any, identifier).forEach((checkbox: HTMLInputElement): void => { checkbox.removeAttribute('data-manually-changed'); }); } @@ -178,11 +233,15 @@ class MultiRecordSelection { private registerActions(): void { new RegularEvent('click', (e: Event, target: HTMLButtonElement): void => { - const checked: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(CheckboxState.checked); + if (!target.dataset.multiRecordSelectionAction) { + // Return if we don't deal with a valid action + } - if (!target.dataset.multiRecordSelectionAction || !checked.length) { - // Return if we don't deal with a valid action or in case there is - // currently no element checked to perform the action on. + const identifier: string = MultiRecordSelection.getIdentifier(target); + const checked: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier); + + if (!checked.length) { + // Return in case there is currently no element checked to perform the action on. return; } @@ -212,7 +271,9 @@ class MultiRecordSelection { default: // Not all actions are handled here. Therefore we simply skip them and just // dispatch an event so those components can react on the triggered action. - target.dispatchEvent(new Event('multiRecordSelection:action:' + target.dataset.multiRecordSelectionAction, {bubbles: true, cancelable: false})); + target.dispatchEvent(new CustomEvent('multiRecordSelection:action:' + target.dataset.multiRecordSelectionAction, { + detail: { identifier: identifier, checkboxes: checked }, bubbles: true, cancelable: false + })); break; } }).delegateTo(document, [Selectors.actionsSelector, Buttons.actionButton].join(' ')); @@ -226,13 +287,15 @@ class MultiRecordSelection { * events to influence the display depending on their custom logic. */ private registerActionsEventHandlers(): void { - new RegularEvent('multiRecordSelection:actions:show', (): void => { - const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll(Selectors.actionsSelector); - actionContainers && actionContainers.forEach((container: HTMLElement): void => container.classList.remove('hidden')); + new RegularEvent('multiRecordSelection:actions:show', (e: CustomEvent): void => { + const identifier: string = e.detail?.identifier || ''; + const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll(MultiRecordSelection.getCombinedSelector(Selectors.actionsSelector, identifier)); + actionContainers.length && actionContainers.forEach((container: HTMLElement): void => MultiRecordSelection.changeActionContainerVisibility(container)); }).bindTo(document); - new RegularEvent('multiRecordSelection:actions:hide', (): void => { - const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll(Selectors.actionsSelector); - actionContainers && actionContainers.forEach((container: HTMLElement): void => container.classList.add('hidden')); + new RegularEvent('multiRecordSelection:actions:hide', (e: CustomEvent): void => { + const identifier: string = e.detail?.identifier || ''; + const actionContainers: NodeListOf<HTMLElement> = document.querySelectorAll(MultiRecordSelection.getCombinedSelector(Selectors.actionsSelector, identifier)); + actionContainers.length && actionContainers.forEach((container: HTMLElement): void => MultiRecordSelection.changeActionContainerVisibility(container, false)); }).bindTo(document); } @@ -240,17 +303,23 @@ class MultiRecordSelection { new RegularEvent('click', (e: Event, target: HTMLButtonElement): void => { e.preventDefault(); - const checkboxes: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(); - if (!target.dataset.multiRecordSelectionCheckAction || !checkboxes.length) { - // Return if we don't deal with a valid action or in case there - // are no checkboxes (elements) to perform the action on. + if (!target.dataset.multiRecordSelectionCheckAction) { + // Return if we don't deal with a valid action + return; + } + + const identifier: string = MultiRecordSelection.getIdentifier(target); + const checkboxes: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(CheckboxState.any, identifier); + + if (!checkboxes.length) { + // Return in case there are no checkboxes (elements) to perform the action on. return; } // Unset manually changed attribute so we can be sure, in case this is // set on a checkbox, while executing the requested action, the checkbox // was already changed by another component. - MultiRecordSelection.unsetManuallyChangedAttribute(); + MultiRecordSelection.unsetManuallyChangedAttribute(identifier); // Perform requested action switch (target.dataset.multiRecordSelectionCheckAction) { @@ -275,23 +344,34 @@ class MultiRecordSelection { } // To prevent possible side effects we simply clean up and unset the attribute here again - MultiRecordSelection.unsetManuallyChangedAttribute(); + MultiRecordSelection.unsetManuallyChangedAttribute(identifier); }).delegateTo(document, [Selectors.checkboxActionsSelector, Buttons.checkboxActionButton].join(' ')); } private registerCheckboxKeyboardActions(): void { new RegularEvent('click', (e: PointerEvent, target: HTMLInputElement): void => { - // If lastChecked is not set or does no longer exist in visible DOM (e.g. because the list is - // paginated and lastChecked is on a prev/next page), assign the current target and return. - if (!this.lastChecked || !document.body.contains(this.lastChecked)) { + const identifier: string = MultiRecordSelection.getIdentifier(target); + + // If lastChecked is not set, does no longer exist in visible DOM (e.g. because the list is + // paginated and lastChecked is on a prev/next page) or is not in the same table as current + // target (according to the identifier), add the current target as lastChecked and return. + if (!this.lastChecked + || !document.body.contains(this.lastChecked) + || MultiRecordSelection.getIdentifier(this.lastChecked) !== identifier + ) { this.lastChecked = target; return; } + // Unset manually changed attribute so we can be sure, in case this is + // set on a checkbox, while executing the requested action, the checkbox + // was already changed by another component. + MultiRecordSelection.unsetManuallyChangedAttribute(identifier); + // With the shift key, it's possible to check / uncheck a range of checkboxes if (e.shiftKey) { // To easily calculate the start and end position we need checkboxes as an array - const checkboxes: Array<HTMLInputElement> = Array.from(document.querySelectorAll(Selectors.checkboxSelector)); + const checkboxes: Array<HTMLInputElement> = Array.from(MultiRecordSelection.getCheckboxes(CheckboxState.any, identifier)); // The current target is the start position const start = checkboxes.indexOf(target); // The last manually clicked / checked checkbox is the end @@ -312,25 +392,32 @@ class MultiRecordSelection { // With the alt or ctrl key, it's possible to toggle the current selection if (e.altKey || e.ctrlKey) { - document.querySelectorAll(Selectors.checkboxSelector).forEach((checkbox: HTMLInputElement): void => { + MultiRecordSelection.getCheckboxes(CheckboxState.any, identifier).forEach((checkbox: HTMLInputElement): void => { // Toggle all checkboxes except the current target as this was already done by clicking on it if (checkbox !== target) { MultiRecordSelection.changeCheckboxState(checkbox, !checkbox.checked); } }) } + + // To prevent possible side effects we simply clean up and unset the attribute here again + MultiRecordSelection.unsetManuallyChangedAttribute(identifier); }).delegateTo(document, Selectors.checkboxSelector); } private registerDispatchCheckboxStateChangedEvent(): void { new RegularEvent('change', (e: Event, target: HTMLInputElement): void => { - target.dispatchEvent(new Event('checkbox:state:changed', {bubbles: true, cancelable: false})); + target.dispatchEvent(new CustomEvent('multiRecordSelection:checkbox:state:changed',{ + detail: { identifier: MultiRecordSelection.getIdentifier(target) }, bubbles: true, cancelable: false + })); }).delegateTo(document, Selectors.checkboxSelector); } private registerCheckboxStateChangedEventHandler(): void { - new RegularEvent('checkbox:state:changed', (e: Event): void => { + new RegularEvent('multiRecordSelection:checkbox:state:changed', (e: CustomEvent): void => { const checkbox: HTMLInputElement = <HTMLInputElement>e.target; + const identifier: string = e.detail?.identifier || ''; + if (checkbox.checked) { checkbox.closest('tr').classList.add('success'); } else { @@ -338,22 +425,32 @@ class MultiRecordSelection { } // Toggle actions for changed checkbox state - MultiRecordSelection.toggleActionsState(); + MultiRecordSelection.toggleActionsState(identifier); }).bindTo(document); } private registerToggleCheckboxActions(): void { - new RegularEvent('click', (): void => { - const checkAll: HTMLButtonElement = document.querySelector('button[data-multi-record-selection-check-action="' + CheckboxActions.checkAll + '"]'); + new RegularEvent('click', (e: Event, target: HTMLButtonElement): void => { + const identifier: string = MultiRecordSelection.getIdentifier(target); + + const checkAll: HTMLButtonElement = document.querySelector([ + MultiRecordSelection.getCombinedSelector(Selectors.checkboxActionsSelector, identifier), + 'button[data-multi-record-selection-check-action="' + CheckboxActions.checkAll + '"]' + ].join(' ')); + if (checkAll !== null) { - checkAll.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.unchecked).length) + checkAll.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.unchecked, identifier).length) } - const checkNone: HTMLButtonElement = document.querySelector('button[data-multi-record-selection-check-action="' + CheckboxActions.checkNone + '"]'); + const checkNone: HTMLButtonElement = document.querySelector([ + MultiRecordSelection.getCombinedSelector(Selectors.checkboxActionsSelector, identifier), + 'button[data-multi-record-selection-check-action="' + CheckboxActions.checkNone + '"]' + ].join(' ')); + if (checkNone !== null) { - checkNone.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.checked).length); + checkNone.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier).length); } - }).delegateTo(document, Buttons.checkboxActionsToggleButton); + }).delegateTo(document, Selectors.checkboxActionsToggleSelector); } } diff --git a/Build/Sources/TypeScript/recordlist/Resources/Public/TypeScript/BrowseFiles.ts b/Build/Sources/TypeScript/recordlist/Resources/Public/TypeScript/BrowseFiles.ts index edbb8da2e71d..24f7d096ace3 100644 --- a/Build/Sources/TypeScript/recordlist/Resources/Public/TypeScript/BrowseFiles.ts +++ b/Build/Sources/TypeScript/recordlist/Resources/Public/TypeScript/BrowseFiles.ts @@ -54,10 +54,10 @@ class BrowseFiles { new RegularEvent('multiRecordSelection:action:import', this.importSelection).bindTo(document); } - private importSelection = (e: Event): void => { + private importSelection = (e: CustomEvent): void => { e.preventDefault(); const targetEl: HTMLElement = e.target as HTMLElement; - const items: NodeListOf<HTMLInputElement> = document.querySelectorAll('.t3js-multi-record-selection-check'); + const items: NodeListOf<HTMLInputElement> = e.detail.checkboxes; if (!items.length) { return; } diff --git a/Build/Sources/TypeScript/recycler/Resources/Public/TypeScript/Recycler.ts b/Build/Sources/TypeScript/recycler/Resources/Public/TypeScript/Recycler.ts index 570bb1d782a9..ef9ec9581205 100644 --- a/Build/Sources/TypeScript/recycler/Resources/Public/TypeScript/Recycler.ts +++ b/Build/Sources/TypeScript/recycler/Resources/Public/TypeScript/Recycler.ts @@ -199,7 +199,7 @@ class Recycler { }); // checkboxes in the table - new RegularEvent('checkbox:state:changed', this.handleCheckboxStateChanged).bindTo(document); + new RegularEvent('multiRecordSelection:checkbox:state:changed', this.handleCheckboxStateChanged).bindTo(document); new RegularEvent('multiRecordSelection:action:massundo', this.undoRecord).bindTo(document); new RegularEvent('multiRecordSelection:action:massdelete', this.deleteRecord).bindTo(document); } @@ -260,7 +260,7 @@ class Recycler { this.markedRecordsForMassAction = []; this.elements.$massUndo.find('span.text').text(TYPO3.lang['button.undo']); this.elements.$massDelete.find('span.text').text(TYPO3.lang['button.delete']); - document.dispatchEvent(new Event('multiRecordSelection:actions:hide')); + document.dispatchEvent(new CustomEvent('multiRecordSelection:actions:hide')); } /** diff --git a/Build/Sources/TypeScript/workspaces/Resources/Public/TypeScript/Backend.ts b/Build/Sources/TypeScript/workspaces/Resources/Public/TypeScript/Backend.ts index 567f2a7e1f59..b2048bf35e47 100644 --- a/Build/Sources/TypeScript/workspaces/Resources/Public/TypeScript/Backend.ts +++ b/Build/Sources/TypeScript/workspaces/Resources/Public/TypeScript/Backend.ts @@ -207,7 +207,7 @@ class Backend extends Workspaces { if (parent !== null && parent.checked !== check) { parent.checked = check; parent.dataset.manuallyChanged = 'true'; - parent.dispatchEvent(new Event('checkbox:state:changed', {bubbles: true, cancelable: false})); + parent.dispatchEvent(new CustomEvent('multiRecordSelection:checkbox:state:changed', {bubbles: true, cancelable: false})); } } @@ -230,7 +230,7 @@ class Backend extends Workspaces { if (checkbox.checked !== check) { checkbox.checked = check; checkbox.dataset.manuallyChanged = 'true'; - checkbox.dispatchEvent(new Event('checkbox:state:changed', {bubbles: true, cancelable: false})); + checkbox.dispatchEvent(new CustomEvent('multiRecordSelection:checkbox:state:changed', {bubbles: true, cancelable: false})); } }) } @@ -409,7 +409,7 @@ class Backend extends Workspaces { } // checkboxes in the table - new RegularEvent('checkbox:state:changed', this.handleCheckboxStateChanged).bindTo(document); + new RegularEvent('multiRecordSelection:checkbox:state:changed', this.handleCheckboxStateChanged).bindTo(document); // Listen for depth changes this.elements.$depthSelector.on('change', (e: JQueryEventObject): void => { @@ -1338,7 +1338,7 @@ class Backend extends Workspaces { this.elements.$workspaceActions.removeClass('hidden'); this.elements.$chooseMassAction.prop('disabled', false); } - document.dispatchEvent(new Event('multiRecordSelection:actions:hide')); + document.dispatchEvent(new CustomEvent('multiRecordSelection:actions:hide')); } } diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/MultiRecordSelection.js b/typo3/sysext/backend/Resources/Public/JavaScript/MultiRecordSelection.js index e76c9d28c023..977a52b68929 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/MultiRecordSelection.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/MultiRecordSelection.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","TYPO3/CMS/Backend/Notification","TYPO3/CMS/Core/DocumentService","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,c,o,n){"use strict";var i,a,s,l,r;!function(e){e.actionsSelector=".t3js-multi-record-selection-actions",e.checkboxSelector=".t3js-multi-record-selection-check",e.checkboxActionsSelector="#multi-record-selection-check-actions"}(i||(i={})),function(e){e.actionButton="button[data-multi-record-selection-action]",e.checkboxActionButton="button[data-multi-record-selection-check-action]",e.checkboxActionsToggleButton='button[data-bs-target="multi-record-selection-check-actions"]'}(a||(a={})),function(e){e.edit="edit"}(s||(s={})),function(e){e.checkAll="check-all",e.checkNone="check-none",e.toggle="toggle"}(l||(l={})),function(e){e.any="",e.checked=":checked",e.unchecked=":not(:checked)"}(r||(r={}));class d{constructor(){this.lastChecked=null,o.ready().then(()=>{d.restoreTemporaryState(),this.registerActions(),this.registerActionsEventHandlers(),this.registerCheckboxActions(),this.registerCheckboxKeyboardActions(),this.registerToggleCheckboxActions(),this.registerDispatchCheckboxStateChangedEvent(),this.registerCheckboxStateChangedEventHandler()})}static getCheckboxes(e=r.any){return document.querySelectorAll(i.checkboxSelector+e)}static changeCheckboxState(e,t){e.checked===t||e.dataset.manuallyChanged||(e.checked=t,e.dispatchEvent(new Event("checkbox:state:changed",{bubbles:!0,cancelable:!1})))}static getReturnUrl(e){return""===e&&(e=top.list_frame.document.location.pathname+top.list_frame.document.location.search),encodeURIComponent(e)}static restoreTemporaryState(){const e=d.getCheckboxes(r.checked);if(!e.length)return;e.forEach(e=>{e.closest("tr").classList.add("success")});const t=document.querySelectorAll(i.actionsSelector);t.length&&t.forEach(e=>e.classList.remove("hidden"))}static toggleActionsState(){const e=document.querySelectorAll(i.actionsSelector);if(!e.length)return;if(!d.getCheckboxes(r.checked).length)return void e.forEach(e=>e.classList.add("hidden"));e.forEach(e=>e.classList.remove("hidden"));const t=document.querySelectorAll([i.actionsSelector,a.actionButton].join(" "));t.length&&t.forEach(e=>{if(!e.dataset.multiRecordSelectionActionConfig)return;const t=JSON.parse(e.dataset.multiRecordSelectionActionConfig);if(!t.idField)return;e.classList.add("disabled");const c=d.getCheckboxes(r.checked);for(let o=0;o<c.length;o++)if(c[o].closest("tr").dataset[t.idField]){e.classList.remove("disabled");break}})}static unsetManuallyChangedAttribute(){d.getCheckboxes().forEach(e=>{e.removeAttribute("data-manually-changed")})}registerActions(){new n("click",(e,t)=>{const o=d.getCheckboxes(r.checked);if(t.dataset.multiRecordSelectionAction&&o.length)switch(t.dataset.multiRecordSelectionAction){case s.edit:e.preventDefault();const n=JSON.parse(t.dataset.multiRecordSelectionActionConfig||"");if(!n||!n.idField||!n.table)break;const i=[];o.forEach(e=>{const t=e.closest("tr");null!==t&&t.dataset[n.idField]&&i.push(t.dataset[n.idField])}),i.length?window.location.href=top.TYPO3.settings.FormEngine.moduleUrl+"&edit["+n.table+"]["+i.join(",")+"]=edit&returnUrl="+d.getReturnUrl(n.returnUrl||""):c.warning("The selected elements can not be edited.");break;default:t.dispatchEvent(new Event("multiRecordSelection:action:"+t.dataset.multiRecordSelectionAction,{bubbles:!0,cancelable:!1}))}}).delegateTo(document,[i.actionsSelector,a.actionButton].join(" ")),d.toggleActionsState()}registerActionsEventHandlers(){new n("multiRecordSelection:actions:show",()=>{const e=document.querySelectorAll(i.actionsSelector);e&&e.forEach(e=>e.classList.remove("hidden"))}).bindTo(document),new n("multiRecordSelection:actions:hide",()=>{const e=document.querySelectorAll(i.actionsSelector);e&&e.forEach(e=>e.classList.add("hidden"))}).bindTo(document)}registerCheckboxActions(){new n("click",(e,t)=>{e.preventDefault();const o=d.getCheckboxes();if(t.dataset.multiRecordSelectionCheckAction&&o.length){switch(d.unsetManuallyChangedAttribute(),t.dataset.multiRecordSelectionCheckAction){case l.checkAll:o.forEach(e=>{d.changeCheckboxState(e,!0)});break;case l.checkNone:o.forEach(e=>{d.changeCheckboxState(e,!1)});break;case l.toggle:o.forEach(e=>{d.changeCheckboxState(e,!e.checked)});break;default:c.warning("Unknown checkbox action")}d.unsetManuallyChangedAttribute()}}).delegateTo(document,[i.checkboxActionsSelector,a.checkboxActionButton].join(" "))}registerCheckboxKeyboardActions(){new n("click",(e,t)=>{if(this.lastChecked&&document.body.contains(this.lastChecked)){if(e.shiftKey){const e=Array.from(document.querySelectorAll(i.checkboxSelector)),c=e.indexOf(t),o=e.indexOf(this.lastChecked);e.slice(Math.min(c,o),Math.max(c,o)+1).forEach(e=>{e!==t&&d.changeCheckboxState(e,t.checked)})}this.lastChecked=t,(e.altKey||e.ctrlKey)&&document.querySelectorAll(i.checkboxSelector).forEach(e=>{e!==t&&d.changeCheckboxState(e,!e.checked)})}else this.lastChecked=t}).delegateTo(document,i.checkboxSelector)}registerDispatchCheckboxStateChangedEvent(){new n("change",(e,t)=>{t.dispatchEvent(new Event("checkbox:state:changed",{bubbles:!0,cancelable:!1}))}).delegateTo(document,i.checkboxSelector)}registerCheckboxStateChangedEventHandler(){new n("checkbox:state:changed",e=>{const t=e.target;t.checked?t.closest("tr").classList.add("success"):t.closest("tr").classList.remove("success"),d.toggleActionsState()}).bindTo(document)}registerToggleCheckboxActions(){new n("click",()=>{const e=document.querySelector('button[data-multi-record-selection-check-action="'+l.checkAll+'"]');null!==e&&e.classList.toggle("disabled",!d.getCheckboxes(r.unchecked).length);const t=document.querySelector('button[data-multi-record-selection-check-action="'+l.checkNone+'"]');null!==t&&t.classList.toggle("disabled",!d.getCheckboxes(r.checked).length)}).delegateTo(document,a.checkboxActionsToggleButton)}}return new d})); \ No newline at end of file +define(["require","exports","TYPO3/CMS/Backend/Notification","TYPO3/CMS/Core/DocumentService","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,c,o,n){"use strict";var i,a,l,s,r;!function(e){e.actionsSelector=".t3js-multi-record-selection-actions",e.checkboxSelector=".t3js-multi-record-selection-check",e.checkboxActionsSelector=".t3js-multi-record-selection-check-actions",e.checkboxActionsToggleSelector=".t3js-multi-record-selection-check-actions-toggle"}(i||(i={})),function(e){e.actionButton="button[data-multi-record-selection-action]",e.checkboxActionButton="button[data-multi-record-selection-check-action]",e.checkboxActionsToggleButton='button[data-bs-target="multi-record-selection-check-actions"]'}(a||(a={})),function(e){e.edit="edit"}(l||(l={})),function(e){e.checkAll="check-all",e.checkNone="check-none",e.toggle="toggle"}(s||(s={})),function(e){e.any="",e.checked=":checked",e.unchecked=":not(:checked)"}(r||(r={}));class d{constructor(){this.lastChecked=null,o.ready().then(()=>{d.restoreTemporaryState(),this.registerActions(),this.registerActionsEventHandlers(),this.registerCheckboxActions(),this.registerCheckboxKeyboardActions(),this.registerToggleCheckboxActions(),this.registerDispatchCheckboxStateChangedEvent(),this.registerCheckboxStateChangedEventHandler()})}static getCheckboxes(e=r.any,t=""){return document.querySelectorAll(d.getCombinedSelector(i.checkboxSelector+e,t))}static getCombinedSelector(e,t){return""!==t?['[data-multi-record-selection-identifier="'+t+'"]',e].join(" "):e}static getIdentifier(e){var t;return(null===(t=e.closest("[data-multi-record-selection-identifier]"))||void 0===t?void 0:t.dataset.multiRecordSelectionIdentifier)||""}static changeCheckboxState(e,t){e.checked===t||e.dataset.manuallyChanged||(e.checked=t,e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{detail:{identifier:d.getIdentifier(e)},bubbles:!0,cancelable:!1})))}static getReturnUrl(e){return""===e&&(e=top.list_frame.document.location.pathname+top.list_frame.document.location.search),encodeURIComponent(e)}static restoreTemporaryState(){const e=d.getCheckboxes(r.checked);if(!e.length)return;let t=!1,c=[];e.forEach(e=>{e.closest("tr").classList.add("success");const o=d.getIdentifier(e);""===o||c.includes(o)||(c.push(o),t=!0,d.toggleActionsState(o))}),t||d.toggleActionsState()}static toggleActionsState(e=""){const t=document.querySelectorAll(d.getCombinedSelector(i.actionsSelector,e));if(!t.length)return;if(!d.getCheckboxes(r.checked,e).length)return void t.forEach(e=>d.changeActionContainerVisibility(e,!1));t.forEach(e=>d.changeActionContainerVisibility(e));const c=document.querySelectorAll([d.getCombinedSelector(i.actionsSelector,e),a.actionButton].join(" "));c.length&&c.forEach(t=>{if(!t.dataset.multiRecordSelectionActionConfig)return;const c=JSON.parse(t.dataset.multiRecordSelectionActionConfig);if(!c.idField)return;t.classList.add("disabled");const o=d.getCheckboxes(r.checked,e);for(let e=0;e<o.length;e++)if(o[e].closest("tr").dataset[c.idField]){t.classList.remove("disabled");break}})}static changeActionContainerVisibility(e,t=!0){var c;const o=null===(c=e.closest(".panel-heading"))||void 0===c?void 0:c.children;if(t){if(o)for(let e=0;e<o.length;e++)o[e].classList.add("hidden");e.classList.remove("hidden")}else{if(o)for(let e=0;e<o.length;e++)o[e].classList.remove("hidden");e.classList.add("hidden")}}static unsetManuallyChangedAttribute(e){d.getCheckboxes(r.any,e).forEach(e=>{e.removeAttribute("data-manually-changed")})}registerActions(){new n("click",(e,t)=>{t.dataset.multiRecordSelectionAction;const o=d.getIdentifier(t),n=d.getCheckboxes(r.checked,o);if(n.length)switch(t.dataset.multiRecordSelectionAction){case l.edit:e.preventDefault();const i=JSON.parse(t.dataset.multiRecordSelectionActionConfig||"");if(!i||!i.idField||!i.table)break;const a=[];n.forEach(e=>{const t=e.closest("tr");null!==t&&t.dataset[i.idField]&&a.push(t.dataset[i.idField])}),a.length?window.location.href=top.TYPO3.settings.FormEngine.moduleUrl+"&edit["+i.table+"]["+a.join(",")+"]=edit&returnUrl="+d.getReturnUrl(i.returnUrl||""):c.warning("The selected elements can not be edited.");break;default:t.dispatchEvent(new CustomEvent("multiRecordSelection:action:"+t.dataset.multiRecordSelectionAction,{detail:{identifier:o,checkboxes:n},bubbles:!0,cancelable:!1}))}}).delegateTo(document,[i.actionsSelector,a.actionButton].join(" ")),d.toggleActionsState()}registerActionsEventHandlers(){new n("multiRecordSelection:actions:show",e=>{var t;const c=(null===(t=e.detail)||void 0===t?void 0:t.identifier)||"",o=document.querySelectorAll(d.getCombinedSelector(i.actionsSelector,c));o.length&&o.forEach(e=>d.changeActionContainerVisibility(e))}).bindTo(document),new n("multiRecordSelection:actions:hide",e=>{var t;const c=(null===(t=e.detail)||void 0===t?void 0:t.identifier)||"",o=document.querySelectorAll(d.getCombinedSelector(i.actionsSelector,c));o.length&&o.forEach(e=>d.changeActionContainerVisibility(e,!1))}).bindTo(document)}registerCheckboxActions(){new n("click",(e,t)=>{if(e.preventDefault(),!t.dataset.multiRecordSelectionCheckAction)return;const o=d.getIdentifier(t),n=d.getCheckboxes(r.any,o);if(n.length){switch(d.unsetManuallyChangedAttribute(o),t.dataset.multiRecordSelectionCheckAction){case s.checkAll:n.forEach(e=>{d.changeCheckboxState(e,!0)});break;case s.checkNone:n.forEach(e=>{d.changeCheckboxState(e,!1)});break;case s.toggle:n.forEach(e=>{d.changeCheckboxState(e,!e.checked)});break;default:c.warning("Unknown checkbox action")}d.unsetManuallyChangedAttribute(o)}}).delegateTo(document,[i.checkboxActionsSelector,a.checkboxActionButton].join(" "))}registerCheckboxKeyboardActions(){new n("click",(e,t)=>{const c=d.getIdentifier(t);if(this.lastChecked&&document.body.contains(this.lastChecked)&&d.getIdentifier(this.lastChecked)===c){if(d.unsetManuallyChangedAttribute(c),e.shiftKey){const e=Array.from(d.getCheckboxes(r.any,c)),o=e.indexOf(t),n=e.indexOf(this.lastChecked);e.slice(Math.min(o,n),Math.max(o,n)+1).forEach(e=>{e!==t&&d.changeCheckboxState(e,t.checked)})}this.lastChecked=t,(e.altKey||e.ctrlKey)&&d.getCheckboxes(r.any,c).forEach(e=>{e!==t&&d.changeCheckboxState(e,!e.checked)}),d.unsetManuallyChangedAttribute(c)}else this.lastChecked=t}).delegateTo(document,i.checkboxSelector)}registerDispatchCheckboxStateChangedEvent(){new n("change",(e,t)=>{t.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{detail:{identifier:d.getIdentifier(t)},bubbles:!0,cancelable:!1}))}).delegateTo(document,i.checkboxSelector)}registerCheckboxStateChangedEventHandler(){new n("multiRecordSelection:checkbox:state:changed",e=>{var t;const c=e.target,o=(null===(t=e.detail)||void 0===t?void 0:t.identifier)||"";c.checked?c.closest("tr").classList.add("success"):c.closest("tr").classList.remove("success"),d.toggleActionsState(o)}).bindTo(document)}registerToggleCheckboxActions(){new n("click",(e,t)=>{const c=d.getIdentifier(t),o=document.querySelector([d.getCombinedSelector(i.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+s.checkAll+'"]'].join(" "));null!==o&&o.classList.toggle("disabled",!d.getCheckboxes(r.unchecked,c).length);const n=document.querySelector([d.getCombinedSelector(i.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+s.checkNone+'"]'].join(" "));null!==n&&n.classList.toggle("disabled",!d.getCheckboxes(r.checked,c).length)}).delegateTo(document,i.checkboxActionsToggleSelector)}}return new d})); \ No newline at end of file diff --git a/typo3/sysext/filelist/Classes/FileList.php b/typo3/sysext/filelist/Classes/FileList.php index c621195c11e5..0f3a98030c9f 100644 --- a/typo3/sysext/filelist/Classes/FileList.php +++ b/typo3/sysext/filelist/Classes/FileList.php @@ -1349,10 +1349,10 @@ class FileList return ' <div class="btn-group dropdown position-static"> - <button type="button" class="btn btn-borderless dropdown-toggle" data-bs-target="multi-record-selection-check-actions" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> + <button type="button" class="btn btn-borderless dropdown-toggle t3js-multi-record-selection-check-actions-toggle" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> ' . $this->iconFactory->getIcon('content-special-div', Icon::SIZE_SMALL) . ' </button> - <ul id="multi-record-selection-check-actions" class="dropdown-menu"> + <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> ' . implode(PHP_EOL, $dropdownItems) . ' </ul> </div>'; diff --git a/typo3/sysext/recordlist/Classes/Browser/FileBrowser.php b/typo3/sysext/recordlist/Classes/Browser/FileBrowser.php index 153b66efbe6f..f80eb11cd157 100644 --- a/typo3/sysext/recordlist/Classes/Browser/FileBrowser.php +++ b/typo3/sysext/recordlist/Classes/Browser/FileBrowser.php @@ -245,10 +245,10 @@ class FileBrowser extends AbstractElementBrowser implements ElementBrowserInterf <tr> <th colspan="3" class="nowrap"> <div class="btn-group dropdown position-static me-1"> - <button type="button" class="btn btn-borderless dropdown-toggle" data-bs-target="multi-record-selection-check-actions" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false">' . - $this->iconFactory->getIcon('content-special-div', Icon::SIZE_SMALL) . - '</button> - <ul id="multi-record-selection-check-actions" class="dropdown-menu"> + <button type="button" class="btn btn-borderless dropdown-toggle t3js-multi-record-selection-check-actions-toggle" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> + ' . $this->iconFactory->getIcon('content-special-div', Icon::SIZE_SMALL) . ' + </button> + <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> <button type="button" class="btn btn-link dropdown-item disabled" data-multi-record-selection-check-action="check-all" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')) . '">' . $this->iconFactory->getIcon('actions-check-square', Icon::SIZE_SMALL) . ' ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')) . diff --git a/typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseFiles.js b/typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseFiles.js index e1bc77a820de..e2b907bde86d 100644 --- a/typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseFiles.js +++ b/typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseFiles.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","TYPO3/CMS/Backend/Utility/MessageUtility","./ElementBrowser","nprogress","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,n,i,s,r){"use strict";var a=TYPO3.Icons;class l{constructor(){this.importSelection=e=>{e.preventDefault();const t=e.target,o=document.querySelectorAll(".t3js-multi-record-selection-check");if(!o.length)return;const c=[];o.forEach(e=>{e.checked&&e.name&&e.dataset.fileName&&e.dataset.fileUid&&c.unshift({uid:e.dataset.fileUid,fileName:e.dataset.fileName})}),a.getIcon("spinner-circle",a.sizes.small,null,null,a.markupIdentifiers.inline).then(e=>{t.classList.add("disabled"),t.innerHTML=e}),s.configure({parent:".element-browser-main-content",showSpinner:!1}),s.start();const d=1/c.length;l.handleNext(c),new r("message",e=>{if(!n.MessageUtility.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;"typo3:foreignRelation:inserted"===e.data.actionName&&(c.length>0?(s.inc(d),l.handleNext(c)):(s.done(),i.focusOpenerAndClose()))}).bindTo(window)},new r("click",(e,t)=>{e.preventDefault(),l.insertElement(t.dataset.fileName,Number(t.dataset.fileUid),1===parseInt(t.dataset.close||"0",10))}).delegateTo(document,"[data-close]"),new r("multiRecordSelection:action:import",this.importSelection).bindTo(document)}static insertElement(e,t,n){return i.insertElement("sys_file",String(t),e,String(t),n)}static handleNext(e){if(e.length>0){const t=e.pop();l.insertElement(t.fileName,Number(t.uid))}}}return new l})); \ No newline at end of file +define(["require","exports","TYPO3/CMS/Backend/Utility/MessageUtility","./ElementBrowser","nprogress","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,n,i,s,a){"use strict";var r=TYPO3.Icons;class l{constructor(){this.importSelection=e=>{e.preventDefault();const t=e.target,o=e.detail.checkboxes;if(!o.length)return;const c=[];o.forEach(e=>{e.checked&&e.name&&e.dataset.fileName&&e.dataset.fileUid&&c.unshift({uid:e.dataset.fileUid,fileName:e.dataset.fileName})}),r.getIcon("spinner-circle",r.sizes.small,null,null,r.markupIdentifiers.inline).then(e=>{t.classList.add("disabled"),t.innerHTML=e}),s.configure({parent:".element-browser-main-content",showSpinner:!1}),s.start();const d=1/c.length;l.handleNext(c),new a("message",e=>{if(!n.MessageUtility.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;"typo3:foreignRelation:inserted"===e.data.actionName&&(c.length>0?(s.inc(d),l.handleNext(c)):(s.done(),i.focusOpenerAndClose()))}).bindTo(window)},new a("click",(e,t)=>{e.preventDefault(),l.insertElement(t.dataset.fileName,Number(t.dataset.fileUid),1===parseInt(t.dataset.close||"0",10))}).delegateTo(document,"[data-close]"),new a("multiRecordSelection:action:import",this.importSelection).bindTo(document)}static insertElement(e,t,n){return i.insertElement("sys_file",String(t),e,String(t),n)}static handleNext(e){if(e.length>0){const t=e.pop();l.insertElement(t.fileName,Number(t.uid))}}}return new l})); \ No newline at end of file diff --git a/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule/Index.html b/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule/Index.html index 1b52c3d81d48..9a7a71ee5154 100644 --- a/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule/Index.html +++ b/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule/Index.html @@ -53,10 +53,10 @@ <f:section name="multiRecordSelectionCheckboxActions"> <div class="btn-group dropdown position-static"> - <button type="button" class="btn btn-borderless dropdown-toggle" data-bs-target="multi-record-selection-check-actions" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> + <button type="button" class="btn btn-borderless dropdown-toggle t3js-multi-record-selection-check-actions-toggle" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> <core:icon identifier="content-special-div" size="small" /> </button> - <ul id="multi-record-selection-check-actions" class="dropdown-menu"> + <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> <button type="button" class="btn btn-link dropdown-item disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}"> <core:icon identifier="actions-check-square" size="small" /> <f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll" /> diff --git a/typo3/sysext/recycler/Resources/Public/JavaScript/Recycler.js b/typo3/sysext/recycler/Resources/Public/JavaScript/Recycler.js index 3b20fa40e4fd..4431311a0ddc 100644 --- a/typo3/sysext/recycler/Resources/Public/JavaScript/Recycler.js +++ b/typo3/sysext/recycler/Resources/Public/JavaScript/Recycler.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};define(["require","exports","jquery","nprogress","TYPO3/CMS/Backend/ActionButton/DeferredAction","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Notification","TYPO3/CMS/Backend/Severity","TYPO3/CMS/Core/Event/RegularEvent","TYPO3/CMS/Backend/Input/Clearable"],(function(e,t,a,s,n,l,i,r,d){"use strict";var o;a=__importDefault(a),s=__importDefault(s),d=__importDefault(d),function(e){e.searchForm="#recycler-form",e.searchText="#recycler-form [name=search-text]",e.searchSubmitBtn="#recycler-form button[type=submit]",e.depthSelector="#recycler-form [name=depth]",e.tableSelector="#recycler-form [name=pages]",e.recyclerTable="#itemsInRecycler",e.paginator="#recycler-index nav",e.reloadAction="a[data-action=reload]",e.undo="a[data-action=undo]",e.delete="a[data-action=delete]",e.massUndo="button[data-multi-record-selection-action=massundo]",e.massDelete="button[data-multi-record-selection-action=massdelete]"}(o||(o={}));class c{constructor(){this.elements={},this.paging={currentPage:1,totalPages:1,totalItems:0,itemsPerPage:TYPO3.settings.Recycler.pagingSize},this.markedRecordsForMassAction=[],this.handleCheckboxStateChanged=e=>{const t=a.default(e.target),s=t.parents("tr"),n=s.data("table")+":"+s.data("uid");if(t.prop("checked"))this.markedRecordsForMassAction.push(n);else{const e=this.markedRecordsForMassAction.indexOf(n);e>-1&&this.markedRecordsForMassAction.splice(e,1)}this.markedRecordsForMassAction.length>0?(this.elements.$massUndo.find("span.text").text(this.createMessage(TYPO3.lang["button.undoselected"],[this.markedRecordsForMassAction.length])),this.elements.$massDelete.find("span.text").text(this.createMessage(TYPO3.lang["button.deleteselected"],[this.markedRecordsForMassAction.length]))):this.resetMassActionButtons()},this.deleteRecord=e=>{if(TYPO3.settings.Recycler.deleteDisable)return;const t=a.default(e.target).parents("tr"),s="TBODY"!==t.parent().prop("tagName");let i,d;if(s)i=this.markedRecordsForMassAction,d=TYPO3.lang["modal.massdelete.text"];else{const e=t.data("uid"),a=t.data("table"),s=t.data("recordtitle");i=[a+":"+e],d="pages"===a?TYPO3.lang["modal.deletepage.text"]:TYPO3.lang["modal.deletecontent.text"],d=this.createMessage(d,[s,"["+i[0]+"]"])}l.confirm(TYPO3.lang["modal.delete.header"],d,r.error,[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){l.dismiss()}},{text:TYPO3.lang["button.delete"],btnClass:"btn-danger",action:new n(()=>Promise.resolve(this.callAjaxAction("delete",i,s)))}])},this.undoRecord=e=>{const t=a.default(e.target).parents("tr"),s="TBODY"!==t.parent().prop("tagName");let i,d,o;if(s)i=this.markedRecordsForMassAction,d=TYPO3.lang["modal.massundo.text"],o=!0;else{const e=t.data("uid"),a=t.data("table"),s=t.data("recordtitle");i=[a+":"+e],o="pages"===a,d=o?TYPO3.lang["modal.undopage.text"]:TYPO3.lang["modal.undocontent.text"],d=this.createMessage(d,[s,"["+i[0]+"]"]),o&&t.data("parentDeleted")&&(d+=TYPO3.lang["modal.undo.parentpages"])}let c=null;c=o?a.default("<div />").append(a.default("<p />").text(d),a.default("<div />",{class:"checkbox"}).append(a.default("<label />").append(TYPO3.lang["modal.undo.recursive"]).prepend(a.default("<input />",{id:"undo-recursive",type:"checkbox"})))):a.default("<p />").text(d),l.confirm(TYPO3.lang["modal.undo.header"],c,r.ok,[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){l.dismiss()}},{text:TYPO3.lang["button.undo"],btnClass:"btn-success",action:new n(()=>Promise.resolve(this.callAjaxAction("undo","object"==typeof i?i:[i],s,c.find("#undo-recursive").prop("checked"))))}])},a.default(()=>{this.initialize()})}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}getElements(){this.elements={$searchForm:a.default(o.searchForm),$searchTextField:a.default(o.searchText),$searchSubmitBtn:a.default(o.searchSubmitBtn),$depthSelector:a.default(o.depthSelector),$tableSelector:a.default(o.tableSelector),$recyclerTable:a.default(o.recyclerTable),$tableBody:a.default(o.recyclerTable).find("tbody"),$paginator:a.default(o.paginator),$reloadAction:a.default(o.reloadAction),$massUndo:a.default(o.massUndo),$massDelete:a.default(o.massDelete)}}registerEvents(){this.elements.$searchForm.on("submit",e=>{e.preventDefault(),""!==this.elements.$searchTextField.val()&&this.loadDeletedElements()}),this.elements.$searchTextField.on("keyup",e=>{""!==a.default(e.currentTarget).val()?this.elements.$searchSubmitBtn.removeClass("disabled"):(this.elements.$searchSubmitBtn.addClass("disabled"),this.loadDeletedElements())}),this.elements.$searchTextField.get(0).clearable({onClear:()=>{this.elements.$searchSubmitBtn.addClass("disabled"),this.loadDeletedElements()}}),this.elements.$depthSelector.on("change",()=>{a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements()})}),this.elements.$tableSelector.on("change",()=>{this.paging.currentPage=1,this.loadDeletedElements()}),new d.default("click",this.undoRecord).delegateTo(document,o.undo),new d.default("click",this.deleteRecord).delegateTo(document,o.delete),this.elements.$reloadAction.on("click",e=>{e.preventDefault(),a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements()})}),this.elements.$paginator.on("click","a[data-action]",e=>{e.preventDefault();const t=a.default(e.currentTarget);let s=!1;switch(t.data("action")){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,s=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,s=!0);break;case"page":this.paging.currentPage=parseInt(t.find("span").text(),10),s=!0}s&&this.loadDeletedElements()}),TYPO3.settings.Recycler.deleteDisable?this.elements.$massDelete.remove():this.elements.$massDelete.show(),this.elements.$recyclerTable.on("show.bs.collapse hide.bs.collapse","tr.collapse",e=>{let t,s,n=a.default(e.currentTarget).prev("tr").find("[data-action=expand]").find(".t3-icon");switch(e.type){case"show":t="t3-icon-pagetree-collapse",s="t3-icon-pagetree-expand";break;case"hide":t="t3-icon-pagetree-expand",s="t3-icon-pagetree-collapse"}n.removeClass(t).addClass(s)}),new d.default("checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),new d.default("multiRecordSelection:action:massundo",this.undoRecord).bindTo(document),new d.default("multiRecordSelection:action:massdelete",this.deleteRecord).bindTo(document)}initialize(){s.default.configure({parent:".module-loading-indicator",showSpinner:!1}),this.getElements(),this.registerEvents(),TYPO3.settings.Recycler.depthSelection>0?this.elements.$depthSelector.val(TYPO3.settings.Recycler.depthSelection).trigger("change"):a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements()})}resetMassActionButtons(){this.markedRecordsForMassAction=[],this.elements.$massUndo.find("span.text").text(TYPO3.lang["button.undo"]),this.elements.$massDelete.find("span.text").text(TYPO3.lang["button.delete"]),document.dispatchEvent(new Event("multiRecordSelection:actions:hide"))}loadAvailableTables(){return a.default.ajax({url:TYPO3.settings.ajaxUrls.recycler,dataType:"json",data:{action:"getTables",startUid:TYPO3.settings.Recycler.startUid,depth:this.elements.$depthSelector.find("option:selected").val()},beforeSend:()=>{s.default.start(),this.elements.$tableSelector.val(""),this.paging.currentPage=1},success:e=>{const t=[];this.elements.$tableSelector.children().remove(),a.default.each(e,(e,s)=>{const n=s[0],l=s[1],i=(s[2]?s[2]:TYPO3.lang.label_allrecordtypes)+" ("+l+")";t.push(a.default("<option />").val(n).text(i))}),t.length>0&&(this.elements.$tableSelector.append(t),""!==TYPO3.settings.Recycler.tableSelection&&this.elements.$tableSelector.val(TYPO3.settings.Recycler.tableSelection))},complete:()=>{s.default.done()}})}loadDeletedElements(){return a.default.ajax({url:TYPO3.settings.ajaxUrls.recycler,dataType:"json",data:{action:"getDeletedRecords",depth:this.elements.$depthSelector.find("option:selected").val(),startUid:TYPO3.settings.Recycler.startUid,table:this.elements.$tableSelector.find("option:selected").val(),filterTxt:this.elements.$searchTextField.val(),start:(this.paging.currentPage-1)*this.paging.itemsPerPage,limit:this.paging.itemsPerPage},beforeSend:()=>{s.default.start(),this.resetMassActionButtons()},success:e=>{this.elements.$tableBody.html(e.rows),this.buildPaginator(e.totalItems)},complete:()=>{s.default.done()}})}callAjaxAction(e,t,n,l=!1){let r={records:t,action:""},d=!1;if("undo"===e)r.action="undoRecords",r.recursive=l?1:0,d=!0;else{if("delete"!==e)return;r.action="deleteRecords"}return a.default.ajax({url:TYPO3.settings.ajaxUrls.recycler,type:"POST",dataType:"json",data:r,beforeSend:()=>{s.default.start()},success:e=>{e.success?i.success("",e.message):i.error("",e.message),this.paging.currentPage=1,a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements(),n&&this.resetMassActionButtons(),d&&c.refreshPageTree()})},complete:()=>{s.default.done()}})}createMessage(e,t){return void 0===e?"":e.replace(/\{([0-9]+)\}/g,(function(e,a){return t[a]}))}buildPaginator(e){if(0===e)return void this.elements.$paginator.contents().remove();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/this.paging.itemsPerPage),1===this.paging.totalPages)return void this.elements.$paginator.contents().remove();const t=a.default("<ul />",{class:"pagination"}),s=[],n=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"previous"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-left"}))),l=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"next"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-right"})));1===this.paging.currentPage&&n.disablePagingAction(),this.paging.currentPage===this.paging.totalPages&&l.disablePagingAction();for(let e=1;e<=this.paging.totalPages;e++){const t=a.default("<li />",{class:"page-item"+(this.paging.currentPage===e?" active":"")});t.append(a.default("<a />",{class:"page-link","data-action":"page"}).append(a.default("<span />").text(e))),s.push(t)}t.append(n,s,l),this.elements.$paginator.html(t)}}return a.default.fn.disablePagingAction=function(){a.default(this).addClass("disabled").find(".t3-icon").unwrap().wrap(a.default("<span />",{class:"page-link"}))},new c})); \ No newline at end of file +var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};define(["require","exports","jquery","nprogress","TYPO3/CMS/Backend/ActionButton/DeferredAction","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Notification","TYPO3/CMS/Backend/Severity","TYPO3/CMS/Core/Event/RegularEvent","TYPO3/CMS/Backend/Input/Clearable"],(function(e,t,a,s,n,l,i,r,d){"use strict";var o;a=__importDefault(a),s=__importDefault(s),d=__importDefault(d),function(e){e.searchForm="#recycler-form",e.searchText="#recycler-form [name=search-text]",e.searchSubmitBtn="#recycler-form button[type=submit]",e.depthSelector="#recycler-form [name=depth]",e.tableSelector="#recycler-form [name=pages]",e.recyclerTable="#itemsInRecycler",e.paginator="#recycler-index nav",e.reloadAction="a[data-action=reload]",e.undo="a[data-action=undo]",e.delete="a[data-action=delete]",e.massUndo="button[data-multi-record-selection-action=massundo]",e.massDelete="button[data-multi-record-selection-action=massdelete]"}(o||(o={}));class c{constructor(){this.elements={},this.paging={currentPage:1,totalPages:1,totalItems:0,itemsPerPage:TYPO3.settings.Recycler.pagingSize},this.markedRecordsForMassAction=[],this.handleCheckboxStateChanged=e=>{const t=a.default(e.target),s=t.parents("tr"),n=s.data("table")+":"+s.data("uid");if(t.prop("checked"))this.markedRecordsForMassAction.push(n);else{const e=this.markedRecordsForMassAction.indexOf(n);e>-1&&this.markedRecordsForMassAction.splice(e,1)}this.markedRecordsForMassAction.length>0?(this.elements.$massUndo.find("span.text").text(this.createMessage(TYPO3.lang["button.undoselected"],[this.markedRecordsForMassAction.length])),this.elements.$massDelete.find("span.text").text(this.createMessage(TYPO3.lang["button.deleteselected"],[this.markedRecordsForMassAction.length]))):this.resetMassActionButtons()},this.deleteRecord=e=>{if(TYPO3.settings.Recycler.deleteDisable)return;const t=a.default(e.target).parents("tr"),s="TBODY"!==t.parent().prop("tagName");let i,d;if(s)i=this.markedRecordsForMassAction,d=TYPO3.lang["modal.massdelete.text"];else{const e=t.data("uid"),a=t.data("table"),s=t.data("recordtitle");i=[a+":"+e],d="pages"===a?TYPO3.lang["modal.deletepage.text"]:TYPO3.lang["modal.deletecontent.text"],d=this.createMessage(d,[s,"["+i[0]+"]"])}l.confirm(TYPO3.lang["modal.delete.header"],d,r.error,[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){l.dismiss()}},{text:TYPO3.lang["button.delete"],btnClass:"btn-danger",action:new n(()=>Promise.resolve(this.callAjaxAction("delete",i,s)))}])},this.undoRecord=e=>{const t=a.default(e.target).parents("tr"),s="TBODY"!==t.parent().prop("tagName");let i,d,o;if(s)i=this.markedRecordsForMassAction,d=TYPO3.lang["modal.massundo.text"],o=!0;else{const e=t.data("uid"),a=t.data("table"),s=t.data("recordtitle");i=[a+":"+e],o="pages"===a,d=o?TYPO3.lang["modal.undopage.text"]:TYPO3.lang["modal.undocontent.text"],d=this.createMessage(d,[s,"["+i[0]+"]"]),o&&t.data("parentDeleted")&&(d+=TYPO3.lang["modal.undo.parentpages"])}let c=null;c=o?a.default("<div />").append(a.default("<p />").text(d),a.default("<div />",{class:"checkbox"}).append(a.default("<label />").append(TYPO3.lang["modal.undo.recursive"]).prepend(a.default("<input />",{id:"undo-recursive",type:"checkbox"})))):a.default("<p />").text(d),l.confirm(TYPO3.lang["modal.undo.header"],c,r.ok,[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){l.dismiss()}},{text:TYPO3.lang["button.undo"],btnClass:"btn-success",action:new n(()=>Promise.resolve(this.callAjaxAction("undo","object"==typeof i?i:[i],s,c.find("#undo-recursive").prop("checked"))))}])},a.default(()=>{this.initialize()})}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}getElements(){this.elements={$searchForm:a.default(o.searchForm),$searchTextField:a.default(o.searchText),$searchSubmitBtn:a.default(o.searchSubmitBtn),$depthSelector:a.default(o.depthSelector),$tableSelector:a.default(o.tableSelector),$recyclerTable:a.default(o.recyclerTable),$tableBody:a.default(o.recyclerTable).find("tbody"),$paginator:a.default(o.paginator),$reloadAction:a.default(o.reloadAction),$massUndo:a.default(o.massUndo),$massDelete:a.default(o.massDelete)}}registerEvents(){this.elements.$searchForm.on("submit",e=>{e.preventDefault(),""!==this.elements.$searchTextField.val()&&this.loadDeletedElements()}),this.elements.$searchTextField.on("keyup",e=>{""!==a.default(e.currentTarget).val()?this.elements.$searchSubmitBtn.removeClass("disabled"):(this.elements.$searchSubmitBtn.addClass("disabled"),this.loadDeletedElements())}),this.elements.$searchTextField.get(0).clearable({onClear:()=>{this.elements.$searchSubmitBtn.addClass("disabled"),this.loadDeletedElements()}}),this.elements.$depthSelector.on("change",()=>{a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements()})}),this.elements.$tableSelector.on("change",()=>{this.paging.currentPage=1,this.loadDeletedElements()}),new d.default("click",this.undoRecord).delegateTo(document,o.undo),new d.default("click",this.deleteRecord).delegateTo(document,o.delete),this.elements.$reloadAction.on("click",e=>{e.preventDefault(),a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements()})}),this.elements.$paginator.on("click","a[data-action]",e=>{e.preventDefault();const t=a.default(e.currentTarget);let s=!1;switch(t.data("action")){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,s=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,s=!0);break;case"page":this.paging.currentPage=parseInt(t.find("span").text(),10),s=!0}s&&this.loadDeletedElements()}),TYPO3.settings.Recycler.deleteDisable?this.elements.$massDelete.remove():this.elements.$massDelete.show(),this.elements.$recyclerTable.on("show.bs.collapse hide.bs.collapse","tr.collapse",e=>{let t,s,n=a.default(e.currentTarget).prev("tr").find("[data-action=expand]").find(".t3-icon");switch(e.type){case"show":t="t3-icon-pagetree-collapse",s="t3-icon-pagetree-expand";break;case"hide":t="t3-icon-pagetree-expand",s="t3-icon-pagetree-collapse"}n.removeClass(t).addClass(s)}),new d.default("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),new d.default("multiRecordSelection:action:massundo",this.undoRecord).bindTo(document),new d.default("multiRecordSelection:action:massdelete",this.deleteRecord).bindTo(document)}initialize(){s.default.configure({parent:".module-loading-indicator",showSpinner:!1}),this.getElements(),this.registerEvents(),TYPO3.settings.Recycler.depthSelection>0?this.elements.$depthSelector.val(TYPO3.settings.Recycler.depthSelection).trigger("change"):a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements()})}resetMassActionButtons(){this.markedRecordsForMassAction=[],this.elements.$massUndo.find("span.text").text(TYPO3.lang["button.undo"]),this.elements.$massDelete.find("span.text").text(TYPO3.lang["button.delete"]),document.dispatchEvent(new CustomEvent("multiRecordSelection:actions:hide"))}loadAvailableTables(){return a.default.ajax({url:TYPO3.settings.ajaxUrls.recycler,dataType:"json",data:{action:"getTables",startUid:TYPO3.settings.Recycler.startUid,depth:this.elements.$depthSelector.find("option:selected").val()},beforeSend:()=>{s.default.start(),this.elements.$tableSelector.val(""),this.paging.currentPage=1},success:e=>{const t=[];this.elements.$tableSelector.children().remove(),a.default.each(e,(e,s)=>{const n=s[0],l=s[1],i=(s[2]?s[2]:TYPO3.lang.label_allrecordtypes)+" ("+l+")";t.push(a.default("<option />").val(n).text(i))}),t.length>0&&(this.elements.$tableSelector.append(t),""!==TYPO3.settings.Recycler.tableSelection&&this.elements.$tableSelector.val(TYPO3.settings.Recycler.tableSelection))},complete:()=>{s.default.done()}})}loadDeletedElements(){return a.default.ajax({url:TYPO3.settings.ajaxUrls.recycler,dataType:"json",data:{action:"getDeletedRecords",depth:this.elements.$depthSelector.find("option:selected").val(),startUid:TYPO3.settings.Recycler.startUid,table:this.elements.$tableSelector.find("option:selected").val(),filterTxt:this.elements.$searchTextField.val(),start:(this.paging.currentPage-1)*this.paging.itemsPerPage,limit:this.paging.itemsPerPage},beforeSend:()=>{s.default.start(),this.resetMassActionButtons()},success:e=>{this.elements.$tableBody.html(e.rows),this.buildPaginator(e.totalItems)},complete:()=>{s.default.done()}})}callAjaxAction(e,t,n,l=!1){let r={records:t,action:""},d=!1;if("undo"===e)r.action="undoRecords",r.recursive=l?1:0,d=!0;else{if("delete"!==e)return;r.action="deleteRecords"}return a.default.ajax({url:TYPO3.settings.ajaxUrls.recycler,type:"POST",dataType:"json",data:r,beforeSend:()=>{s.default.start()},success:e=>{e.success?i.success("",e.message):i.error("",e.message),this.paging.currentPage=1,a.default.when(this.loadAvailableTables()).done(()=>{this.loadDeletedElements(),n&&this.resetMassActionButtons(),d&&c.refreshPageTree()})},complete:()=>{s.default.done()}})}createMessage(e,t){return void 0===e?"":e.replace(/\{([0-9]+)\}/g,(function(e,a){return t[a]}))}buildPaginator(e){if(0===e)return void this.elements.$paginator.contents().remove();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/this.paging.itemsPerPage),1===this.paging.totalPages)return void this.elements.$paginator.contents().remove();const t=a.default("<ul />",{class:"pagination"}),s=[],n=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"previous"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-left"}))),l=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"next"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-right"})));1===this.paging.currentPage&&n.disablePagingAction(),this.paging.currentPage===this.paging.totalPages&&l.disablePagingAction();for(let e=1;e<=this.paging.totalPages;e++){const t=a.default("<li />",{class:"page-item"+(this.paging.currentPage===e?" active":"")});t.append(a.default("<a />",{class:"page-link","data-action":"page"}).append(a.default("<span />").text(e))),s.push(t)}t.append(n,s,l),this.elements.$paginator.html(t)}}return a.default.fn.disablePagingAction=function(){a.default(this).addClass("disabled").find(".t3-icon").unwrap().wrap(a.default("<span />",{class:"page-link"}))},new c})); \ No newline at end of file diff --git a/typo3/sysext/workspaces/Resources/Private/Partials/WorkingTable.html b/typo3/sysext/workspaces/Resources/Private/Partials/WorkingTable.html index 6a5742a11250..a7afbe3cf89f 100644 --- a/typo3/sysext/workspaces/Resources/Private/Partials/WorkingTable.html +++ b/typo3/sysext/workspaces/Resources/Private/Partials/WorkingTable.html @@ -50,10 +50,10 @@ <tr> <th> <div class="btn-group dropdown position-static"> - <button type="button" class="btn btn-borderless dropdown-toggle" data-bs-target="multi-record-selection-check-actions" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> + <button type="button" class="btn btn-borderless dropdown-toggle t3js-multi-record-selection-check-actions-toggle" data-bs-toggle="dropdown" data-bs-boundary="window" aria-expanded="false"> <core:icon identifier="content-special-div" size="small" /> </button> - <ul id="multi-record-selection-check-actions" class="dropdown-menu"> + <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> <button type="button" class="btn btn-link dropdown-item disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}"> <core:icon identifier="actions-check-square" size="small" /> <f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll" /> diff --git a/typo3/sysext/workspaces/Resources/Public/JavaScript/Backend.js b/typo3/sysext/workspaces/Resources/Public/JavaScript/Backend.js index d4c727f96ef0..23d510f5363f 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! */ -var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};define(["require","exports","jquery","TYPO3/CMS/Backend/Enum/Severity","./Workspaces","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Storage/Persistent","TYPO3/CMS/Backend/Tooltip","TYPO3/CMS/Backend/Utility","TYPO3/CMS/Backend/Wizard","TYPO3/CMS/Core/SecurityUtility","TYPO3/CMS/Backend/WindowManager","TYPO3/CMS/Core/Event/RegularEvent","TYPO3/CMS/Backend/Element/IconElement","TYPO3/CMS/Backend/Input/Clearable"],(function(e,t,a,s,n,i,o,l,r,c,d,p,g){"use strict";var h;a=__importDefault(a),n=__importDefault(n),g=__importDefault(g),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"}(h||(h={}));class u extends n.default{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=a.default(e.target),s=t.parents("tr"),n=t.prop("checked"),i=s.data("table")+":"+s.data("uid")+":"+s.data("t3ver_oid");if(n)this.markedRecordsForMassAction.push(i);else{const e=this.markedRecordsForMassAction.indexOf(i);e>-1&&this.markedRecordsForMassAction.splice(e,1)}s.data("collectionCurrent")?u.changeCollectionChildrenState(s.data("collectionCurrent"),n):s.data("collection")&&(u.changeCollectionChildrenState(s.data("collection"),n),u.changeCollectionParentState(s.data("collection"),n)),this.elements.$chooseMassAction.prop("disabled",this.markedRecordsForMassAction.length>0)},this.viewChanges=e=>{e.preventDefault();const t=a.default(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 n=(await e.resolve())[0].result.data[0],o=a.default("<div />"),l=a.default("<ul />",{class:"nav nav-tabs",role:"tablist"}),r=a.default("<div />",{class:"tab-content"}),c=[];o.append(a.default("<p />").html(TYPO3.lang.path.replace("{0}",n.path_Live)),a.default("<p />").html(TYPO3.lang.current_step.replace("{0}",n.label_Stage).replace("{1}",n.stage_position).replace("{2}",n.stage_count))),n.diff.length>0&&(l.append(a.default("<li />",{role:"presentation",class:"nav-item"}).append(a.default("<a />",{class:"nav-link",href:"#workspace-changes","aria-controls":"workspace-changes",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.changeSummary"]))),r.append(a.default("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-changes"}).append(a.default("<div />",{class:"form-section"}).append(u.generateDiffView(n.diff))))),n.comments.length>0&&(l.append(a.default("<li />",{role:"presentation",class:"nav-item"}).append(a.default("<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(a.default("<span />",{class:"badge"}).text(n.comments.length)))),r.append(a.default("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-comments"}).append(a.default("<div />",{class:"form-section"}).append(u.generateCommentView(n.comments))))),n.history.total>0&&(l.append(a.default("<li />",{role:"presentation",class:"nav-item"}).append(a.default("<a />",{class:"nav-link",href:"#workspace-history","aria-controls":"workspace-history",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.history"]))),r.append(a.default("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-history"}).append(a.default("<div />",{class:"form-section"}).append(u.generateHistoryView(n.history.data))))),l.find("li > a").first().addClass("active"),r.find(".tab-pane").first().addClass("active"),o.append(a.default("<div />").append(l,r)),!1!==n.label_PrevStage&&t.data("stage")!==t.data("prevStage")&&c.push({text:n.label_PrevStage.title,active:!0,btnClass:"btn-default",name:"prevstage",trigger:()=>{i.currentModal.trigger("modal-dismiss"),this.sendToStage(t,"prev")}}),!1!==n.label_NextStage&&c.push({text:n.label_NextStage.title,active:!0,btnClass:"btn-default",name:"nextstage",trigger:()=>{i.currentModal.trigger("modal-dismiss"),this.sendToStage(t,"next")}}),c.push({text:TYPO3.lang.close,active:!0,btnClass:"btn-info",name:"cancel",trigger:()=>{i.currentModal.trigger("modal-dismiss")}}),i.advanced({type:i.types.default,title:TYPO3.lang["window.recordInformation"].replace("{0}",t.find(".t3js-title-live").text().trim()),content:o,severity:s.SeverityEnum.info,buttons:c,size:i.sizes.medium})})},this.confirmDeleteRecordFromWorkspace=e=>{const t=a.default(e.target).closest("tr"),n=i.confirm(TYPO3.lang["window.discard.title"],TYPO3.lang["window.discard.message"],s.SeverityEnum.warning,[{text:TYPO3.lang.cancel,active:!0,btnClass:"btn-default",name:"cancel",trigger:()=>{n.modal("hide")}},{text:TYPO3.lang.ok,btnClass:"btn-warning",name:"ok"}]);n.on("button.clicked",e=>{"ok"===e.target.name&&this.sendRemoteRequest([this.generateRemoteActionsPayload("deleteSingleRecord",[t.data("table"),t.data("uid")])]).then(()=>{n.modal("hide"),this.getWorkspaceInfos(),u.refreshPageTree()})})},this.runSelectionAction=e=>{const t=a.default(e.currentTarget).val(),s="discard"!==t;if(0===t.length)return;const n=[];for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");n.push({table:t[0],liveId:t[2],versionId:t[1]})}s?this.checkIntegrity({selection:n,type:"selection"}).then(async e=>{c.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderSelectionActionWizard(t,n)}):(c.setForceSelection(!1),this.renderSelectionActionWizard(t,n))},this.addIntegrityCheckWarningToWizard=()=>{c.addSlide("integrity-warning","Warning",TYPO3.lang["integrity.hasIssuesDescription"]+"<br>"+TYPO3.lang["integrity.hasIssuesQuestion"],s.SeverityEnum.warning)},this.runMassAction=e=>{const t=a.default(e.currentTarget).val(),s="discard"!==t;0!==t.length&&(s?this.checkIntegrity({language:this.settings.language,type:t}).then(async e=>{c.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderMassActionWizard(t)}):(c.setForceSelection(!1),this.renderMassActionWizard(t)))},this.sendToSpecificStageAction=e=>{const t=[],s=a.default(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",[s,t])).then(async e=>{const a=this.renderSendToStageWindow(await e.resolve());a.on("button.clicked",e=>{if("ok"===e.target.name){const n=r.convertFormToObject(e.currentTarget.querySelector("form"));n.affects={elements:t,nextStage:s},this.sendRemoteRequest([this.generateRemoteActionsPayload("sendToSpecificStageExecute",[n]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then(async e=>{const t=await e.resolve();a.modal("hide"),this.renderWorkspaceInfos(t[1].result),u.refreshPageTree()})}}).on("modal-destroyed",()=>{this.elements.$chooseStageAction.val("")})})},this.generatePreviewLinks=()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("generateWorkspacePreviewLinksForAllLanguages",[this.settings.id])).then(async e=>{const t=(await e.resolve())[0].result,n=a.default("<dl />");a.default.each(t,(e,t)=>{n.append(a.default("<dt />").text(e),a.default("<dd />").append(a.default("<a />",{href:t,target:"_blank"}).text(t)))}),i.show(TYPO3.lang.previewLink,n,s.SeverityEnum.info,[{text:TYPO3.lang.ok,active:!0,btnClass:"btn-info",name:"ok",trigger:()=>{i.currentModal.trigger("modal-dismiss")}}],["modal-inner-scroll"])})},a.default(()=>{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=a.default("<div />",{class:"diff"});for(let s of e)t.append(a.default("<div />",{class:"diff-item"}).append(a.default("<div />",{class:"diff-item-title"}).text(s.label),a.default("<div />",{class:"diff-item-result diff-item-result-inline"}).html(s.content)));return t}static generateCommentView(e){const t=a.default("<div />");for(let s of e){const e=a.default("<div />",{class:"panel panel-default"});s.user_comment.length>0&&e.append(a.default("<div />",{class:"panel-body"}).html(s.user_comment)),e.append(a.default("<div />",{class:"panel-footer"}).append(a.default("<span />",{class:"label label-success"}).text(s.stage_title),a.default("<span />",{class:"label label-info"}).text(s.tstamp))),t.append(a.default("<div />",{class:"media"}).append(a.default("<div />",{class:"media-left text-center"}).text(s.user_username).prepend(a.default("<div />").html(s.user_avatar)),a.default("<div />",{class:"media-body"}).append(e)))}return t}static generateHistoryView(e){const t=a.default("<div />");for(let s of e){const e=a.default("<div />",{class:"panel panel-default"});let n;if("object"==typeof s.differences){if(0===s.differences.length)continue;n=a.default("<div />",{class:"diff"});for(let e=0;e<s.differences.length;++e)n.append(a.default("<div />",{class:"diff-item"}).append(a.default("<div />",{class:"diff-item-title"}).text(s.differences[e].label),a.default("<div />",{class:"diff-item-result diff-item-result-inline"}).html(s.differences[e].html)));e.append(a.default("<div />").append(n))}else e.append(a.default("<div />",{class:"panel-body"}).text(s.differences));e.append(a.default("<div />",{class:"panel-footer"}).append(a.default("<span />",{class:"label label-info"}).text(s.datetime))),t.append(a.default("<div />",{class:"media"}).append(a.default("<div />",{class:"media-left text-center"}).text(s.user).prepend(a.default("<div />").html(s.user_avatar)),a.default("<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 Event("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 Event("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=a.default(h.searchForm),this.elements.$searchTextField=a.default(h.searchTextField),this.elements.$searchSubmitBtn=a.default(h.searchSubmitBtn),this.elements.$depthSelector=a.default(h.depthSelector),this.elements.$languageSelector=a.default(h.languageSelector),this.elements.$stagesSelector=a.default(h.stagesSelector),this.elements.$container=a.default(h.container),this.elements.$contentsContainer=a.default(h.contentsContainer),this.elements.$noContentsContainer=a.default(h.noContentsContainer),this.elements.$tableBody=this.elements.$contentsContainer.find("tbody"),this.elements.$workspaceActions=a.default(h.workspaceActions),this.elements.$chooseStageAction=a.default(h.chooseStageAction),this.elements.$chooseSelectionAction=a.default(h.chooseSelectionAction),this.elements.$chooseMassAction=a.default(h.chooseMassAction),this.elements.$previewLinksButton=a.default(h.previewLinksButton),this.elements.$pagination=a.default(h.pagination)}registerEvents(){a.default(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(),c.setForceSelection(!1),c.addSlide("publish-confirm","Publish",TYPO3.lang["window.publish.message"],s.SeverityEnum.info),c.addFinalProcessingSlide(()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("publishSingleRecord",[t.dataset.table,t.dataset.t3ver_oid,t.dataset.uid])).then(()=>{c.dismiss(),this.getWorkspaceInfos(),u.refreshPageTree()})}).done(()=>{c.show()})})}).on("click",'[data-action="prevstage"]',e=>{this.sendToStage(a.default(e.currentTarget).closest("tr"),"prev")}).on("click",'[data-action="nextstage"]',e=>{this.sendToStage(a.default(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=top.TYPO3.configuration.pageModuleUrl+"&id="+a}).on("click",'[data-action="remove"]',this.confirmDeleteRecordFromWorkspace).on("click",'[data-action="expand"]',e=>{const t=a.default(e.currentTarget);let s;s="true"===t.first().attr("aria-expanded")?"apps-pagetree-expand":"apps-pagetree-collapse",t.empty().append(this.getIcon(s))}),a.default(window.top.document).on("click",".t3js-workspace-recipients-selectall",()=>{a.default(".t3js-workspace-recipient",window.top.document).not(":disabled").prop("checked",!0)}).on("click",".t3js-workspace-recipients-deselectall",()=>{a.default(".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 g.default("checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),this.elements.$depthSelector.on("change",e=>{const t=e.target.value;o.set("moduleData.workspaces.settings.depth",t),this.settings.depth=t,this.getWorkspaceInfos()}),this.elements.$previewLinksButton.on("click",this.generatePreviewLinks),this.elements.$languageSelector.on("change",e=>{const t=a.default(e.target);o.set("moduleData.workspaces.settings.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;o.set("moduleData.workspaces.settings.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","a[data-action]",e=>{e.preventDefault();const t=a.default(e.currentTarget);let s=!1;switch(t.data("action")){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,s=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,s=!0);break;case"page":this.paging.currentPage=parseInt(t.data("page"),10),s=!0;break;default:throw'Unknown action "'+t.data("action")+'"'}s&&(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.on("button.clicked",t=>{if("ok"===t.target.name){const i=r.convertFormToObject(t.currentTarget.querySelector("form"));i.affects={table:e.data("table"),nextStage:a,t3ver_oid:e.data("t3ver_oid"),uid:e.data("uid"),elements:[]},this.sendRemoteRequest([this.generateRemoteActionsPayload(n,[i]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then(async e=>{const t=await e.resolve();s.modal("hide"),this.renderWorkspaceInfos(t[1].result),u.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 s=e.data[t],n=a.default("<div />",{class:"btn-group"});let i,o=s.Workspaces_CollectionChildren>0&&""!==s.Workspaces_CollectionCurrent;n.append(this.getAction(o,"expand",s.expanded?"apps-pagetree-expand":"apps-pagetree-collapse").attr("title",TYPO3.lang["tooltip.expand"]).attr("data-bs-target",'[data-collection="'+s.Workspaces_CollectionCurrent+'"]').attr("aria-expanded",!o||s.expanded?"true":"false").attr("data-bs-toggle","collapse"),this.getAction(s.hasChanges,"changes","actions-document-info").attr("title",TYPO3.lang["tooltip.showChanges"]),this.getAction(s.allowedAction_publish&&""===s.Workspaces_CollectionParent,"publish","actions-version-swap-version").attr("title",TYPO3.lang["tooltip.publish"]),this.getAction(s.allowedAction_view,"preview","actions-version-workspace-preview").attr("title",TYPO3.lang["tooltip.viewElementAction"]),this.getAction(s.allowedAction_edit,"open","actions-open").attr("title",TYPO3.lang["tooltip.editElementAction"]),this.getAction(!0,"version","actions-version-page-open").attr("title",TYPO3.lang["tooltip.openPage"]),this.getAction(s.allowedAction_delete,"remove","actions-version-document-remove").attr("title",TYPO3.lang["tooltip.discardVersion"])),""!==s.integrity.messages&&(i=a.default("<span>"+this.getIcon(s.integrity.status)+"</span>"),i.attr("data-bs-toggle","tooltip").attr("data-bs-placement","top").attr("data-bs-html","true").attr("title",s.integrity.messages)),this.latestPath!==s.path_Workspace&&(this.latestPath=s.path_Workspace,this.elements.$tableBody.append(a.default("<tr />").append(a.default("<th />"),a.default("<th />",{colspan:6}).html('<span title="'+s.path_Workspace+'">'+s.path_Workspace_crop+"</span>"))));const r=a.default("<span />",{class:"form-check form-toggle"}).append(a.default("<input />",{type:"checkbox",class:"form-check-input t3js-multi-record-selection-check"})),c={"data-uid":s.uid,"data-pid":s.livepid,"data-t3ver_oid":s.t3ver_oid,"data-t3ver_wsid":s.t3ver_wsid,"data-table":s.table,"data-next-stage":s.value_nextStage,"data-prev-stage":s.value_prevStage,"data-stage":s.stage};if(""!==s.Workspaces_CollectionParent){let t=e.data.find(e=>e.Workspaces_CollectionCurrent===s.Workspaces_CollectionParent);c["data-collection"]=s.Workspaces_CollectionParent,c.class="collapse"+(t.expanded?" show":"")}else""!==s.Workspaces_CollectionCurrent&&(c["data-collection-current"]=s.Workspaces_CollectionCurrent);this.elements.$tableBody.append(a.default("<tr />",c).append(a.default("<td />").empty().append(r),a.default("<td />",{class:"t3js-title-workspace",style:s.Workspaces_CollectionLevel>0?"padding-left: "+this.indentationPadding*s.Workspaces_CollectionLevel+"px":""}).html('<span class="icon icon-size-small">'+this.getIcon(s.icon_Workspace)+'</span> <a href="#" data-action="changes"><span class="workspace-state-'+s.state_Workspace+'" title="'+s.label_Workspace+'">'+s.label_Workspace_crop+"</span></a>"),a.default("<td />",{class:"t3js-title-live"}).html('<span class="icon icon-size-small">'+this.getIcon(s.icon_Live)+'</span> <span class"workspace-live-title title="'+s.label_Live+'">'+s.label_Live_crop+"</span>"),a.default("<td />").text(s.label_Stage),a.default("<td />").empty().append(i),a.default("<td />").html(this.getIcon(s.language.icon)),a.default("<td />",{class:"text-right nowrap"}).append(n))),l.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=a.default("<ul />",{class:"pagination"}),s=[],n=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"previous"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-left"}))),i=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"next"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-right"})));1===this.paging.currentPage&&n.disablePagingAction(),this.paging.currentPage===this.paging.totalPages&&i.disablePagingAction();for(let e=1;e<=this.paging.totalPages;e++){const t=a.default("<li />",{class:"page-item"+(this.paging.currentPage===e?" active":"")});t.append(a.default("<a />",{class:"page-link","data-action":"page","data-page":e}).append(a.default("<span />").text(e))),s.push(t)}t.append(n,s,i),this.elements.$pagination.empty().append(t)}openPreview(e){const t=a.default(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;p.localOpen(t)})}renderSelectionActionWizard(e,t){c.addSlide("mass-action-confirmation",TYPO3.lang["window.selectionAction.title"],"<p>"+(new d).encodeHtml(TYPO3.lang["tooltip."+e+"Selected"])+"</p>",s.SeverityEnum.warning),c.addFinalProcessingSlide(()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("executeSelectionAction",{action:e,selection:t})).then(()=>{this.markedRecordsForMassAction=[],this.getWorkspaceInfos(),c.dismiss(),u.refreshPageTree()})}).done(()=>{c.show(),c.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 d;c.setForceSelection(!1),c.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>",s.SeverityEnum.warning);const n=async e=>{const a=(await e.resolve())[0].result;a.processed<a.total?this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,a)).then(n):(this.getWorkspaceInfos(),c.dismiss())};c.addFinalProcessingSlide(()=>{this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,{init:!0,total:0,processed:0,language:this.settings.language})).then(n)}).done(()=>{c.show(),c.getComponent().on("wizard-dismissed",()=>{this.elements.$chooseMassAction.val("")})})}getAction(e,t,s){return e?a.default("<button />",{class:"btn btn-default","data-action":t,"data-bs-toggle":"tooltip"}).append(this.getIcon(s)):a.default("<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 Event("multiRecordSelection:actions:hide"))}}return a.default.fn.disablePagingAction=function(){a.default(this).addClass("disabled").find(".t3-icon").unwrap().wrap(a.default("<span />",{class:"page-link"}))},new u})); \ No newline at end of file +var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};define(["require","exports","jquery","TYPO3/CMS/Backend/Enum/Severity","./Workspaces","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Storage/Persistent","TYPO3/CMS/Backend/Tooltip","TYPO3/CMS/Backend/Utility","TYPO3/CMS/Backend/Wizard","TYPO3/CMS/Core/SecurityUtility","TYPO3/CMS/Backend/WindowManager","TYPO3/CMS/Core/Event/RegularEvent","TYPO3/CMS/Backend/Element/IconElement","TYPO3/CMS/Backend/Input/Clearable"],(function(e,t,a,s,n,i,o,l,r,c,d,p,g){"use strict";var h;a=__importDefault(a),n=__importDefault(n),g=__importDefault(g),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"}(h||(h={}));class u extends n.default{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=a.default(e.target),s=t.parents("tr"),n=t.prop("checked"),i=s.data("table")+":"+s.data("uid")+":"+s.data("t3ver_oid");if(n)this.markedRecordsForMassAction.push(i);else{const e=this.markedRecordsForMassAction.indexOf(i);e>-1&&this.markedRecordsForMassAction.splice(e,1)}s.data("collectionCurrent")?u.changeCollectionChildrenState(s.data("collectionCurrent"),n):s.data("collection")&&(u.changeCollectionChildrenState(s.data("collection"),n),u.changeCollectionParentState(s.data("collection"),n)),this.elements.$chooseMassAction.prop("disabled",this.markedRecordsForMassAction.length>0)},this.viewChanges=e=>{e.preventDefault();const t=a.default(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 n=(await e.resolve())[0].result.data[0],o=a.default("<div />"),l=a.default("<ul />",{class:"nav nav-tabs",role:"tablist"}),r=a.default("<div />",{class:"tab-content"}),c=[];o.append(a.default("<p />").html(TYPO3.lang.path.replace("{0}",n.path_Live)),a.default("<p />").html(TYPO3.lang.current_step.replace("{0}",n.label_Stage).replace("{1}",n.stage_position).replace("{2}",n.stage_count))),n.diff.length>0&&(l.append(a.default("<li />",{role:"presentation",class:"nav-item"}).append(a.default("<a />",{class:"nav-link",href:"#workspace-changes","aria-controls":"workspace-changes",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.changeSummary"]))),r.append(a.default("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-changes"}).append(a.default("<div />",{class:"form-section"}).append(u.generateDiffView(n.diff))))),n.comments.length>0&&(l.append(a.default("<li />",{role:"presentation",class:"nav-item"}).append(a.default("<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(a.default("<span />",{class:"badge"}).text(n.comments.length)))),r.append(a.default("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-comments"}).append(a.default("<div />",{class:"form-section"}).append(u.generateCommentView(n.comments))))),n.history.total>0&&(l.append(a.default("<li />",{role:"presentation",class:"nav-item"}).append(a.default("<a />",{class:"nav-link",href:"#workspace-history","aria-controls":"workspace-history",role:"tab","data-bs-toggle":"tab"}).text(TYPO3.lang["window.recordChanges.tabs.history"]))),r.append(a.default("<div />",{role:"tabpanel",class:"tab-pane",id:"workspace-history"}).append(a.default("<div />",{class:"form-section"}).append(u.generateHistoryView(n.history.data))))),l.find("li > a").first().addClass("active"),r.find(".tab-pane").first().addClass("active"),o.append(a.default("<div />").append(l,r)),!1!==n.label_PrevStage&&t.data("stage")!==t.data("prevStage")&&c.push({text:n.label_PrevStage.title,active:!0,btnClass:"btn-default",name:"prevstage",trigger:()=>{i.currentModal.trigger("modal-dismiss"),this.sendToStage(t,"prev")}}),!1!==n.label_NextStage&&c.push({text:n.label_NextStage.title,active:!0,btnClass:"btn-default",name:"nextstage",trigger:()=>{i.currentModal.trigger("modal-dismiss"),this.sendToStage(t,"next")}}),c.push({text:TYPO3.lang.close,active:!0,btnClass:"btn-info",name:"cancel",trigger:()=>{i.currentModal.trigger("modal-dismiss")}}),i.advanced({type:i.types.default,title:TYPO3.lang["window.recordInformation"].replace("{0}",t.find(".t3js-title-live").text().trim()),content:o,severity:s.SeverityEnum.info,buttons:c,size:i.sizes.medium})})},this.confirmDeleteRecordFromWorkspace=e=>{const t=a.default(e.target).closest("tr"),n=i.confirm(TYPO3.lang["window.discard.title"],TYPO3.lang["window.discard.message"],s.SeverityEnum.warning,[{text:TYPO3.lang.cancel,active:!0,btnClass:"btn-default",name:"cancel",trigger:()=>{n.modal("hide")}},{text:TYPO3.lang.ok,btnClass:"btn-warning",name:"ok"}]);n.on("button.clicked",e=>{"ok"===e.target.name&&this.sendRemoteRequest([this.generateRemoteActionsPayload("deleteSingleRecord",[t.data("table"),t.data("uid")])]).then(()=>{n.modal("hide"),this.getWorkspaceInfos(),u.refreshPageTree()})})},this.runSelectionAction=e=>{const t=a.default(e.currentTarget).val(),s="discard"!==t;if(0===t.length)return;const n=[];for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");n.push({table:t[0],liveId:t[2],versionId:t[1]})}s?this.checkIntegrity({selection:n,type:"selection"}).then(async e=>{c.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderSelectionActionWizard(t,n)}):(c.setForceSelection(!1),this.renderSelectionActionWizard(t,n))},this.addIntegrityCheckWarningToWizard=()=>{c.addSlide("integrity-warning","Warning",TYPO3.lang["integrity.hasIssuesDescription"]+"<br>"+TYPO3.lang["integrity.hasIssuesQuestion"],s.SeverityEnum.warning)},this.runMassAction=e=>{const t=a.default(e.currentTarget).val(),s="discard"!==t;0!==t.length&&(s?this.checkIntegrity({language:this.settings.language,type:t}).then(async e=>{c.setForceSelection(!1),"warning"===(await e.resolve())[0].result.result&&this.addIntegrityCheckWarningToWizard(),this.renderMassActionWizard(t)}):(c.setForceSelection(!1),this.renderMassActionWizard(t)))},this.sendToSpecificStageAction=e=>{const t=[],s=a.default(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",[s,t])).then(async e=>{const a=this.renderSendToStageWindow(await e.resolve());a.on("button.clicked",e=>{if("ok"===e.target.name){const n=r.convertFormToObject(e.currentTarget.querySelector("form"));n.affects={elements:t,nextStage:s},this.sendRemoteRequest([this.generateRemoteActionsPayload("sendToSpecificStageExecute",[n]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then(async e=>{const t=await e.resolve();a.modal("hide"),this.renderWorkspaceInfos(t[1].result),u.refreshPageTree()})}}).on("modal-destroyed",()=>{this.elements.$chooseStageAction.val("")})})},this.generatePreviewLinks=()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("generateWorkspacePreviewLinksForAllLanguages",[this.settings.id])).then(async e=>{const t=(await e.resolve())[0].result,n=a.default("<dl />");a.default.each(t,(e,t)=>{n.append(a.default("<dt />").text(e),a.default("<dd />").append(a.default("<a />",{href:t,target:"_blank"}).text(t)))}),i.show(TYPO3.lang.previewLink,n,s.SeverityEnum.info,[{text:TYPO3.lang.ok,active:!0,btnClass:"btn-info",name:"ok",trigger:()=>{i.currentModal.trigger("modal-dismiss")}}],["modal-inner-scroll"])})},a.default(()=>{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=a.default("<div />",{class:"diff"});for(let s of e)t.append(a.default("<div />",{class:"diff-item"}).append(a.default("<div />",{class:"diff-item-title"}).text(s.label),a.default("<div />",{class:"diff-item-result diff-item-result-inline"}).html(s.content)));return t}static generateCommentView(e){const t=a.default("<div />");for(let s of e){const e=a.default("<div />",{class:"panel panel-default"});s.user_comment.length>0&&e.append(a.default("<div />",{class:"panel-body"}).html(s.user_comment)),e.append(a.default("<div />",{class:"panel-footer"}).append(a.default("<span />",{class:"label label-success"}).text(s.stage_title),a.default("<span />",{class:"label label-info"}).text(s.tstamp))),t.append(a.default("<div />",{class:"media"}).append(a.default("<div />",{class:"media-left text-center"}).text(s.user_username).prepend(a.default("<div />").html(s.user_avatar)),a.default("<div />",{class:"media-body"}).append(e)))}return t}static generateHistoryView(e){const t=a.default("<div />");for(let s of e){const e=a.default("<div />",{class:"panel panel-default"});let n;if("object"==typeof s.differences){if(0===s.differences.length)continue;n=a.default("<div />",{class:"diff"});for(let e=0;e<s.differences.length;++e)n.append(a.default("<div />",{class:"diff-item"}).append(a.default("<div />",{class:"diff-item-title"}).text(s.differences[e].label),a.default("<div />",{class:"diff-item-result diff-item-result-inline"}).html(s.differences[e].html)));e.append(a.default("<div />").append(n))}else e.append(a.default("<div />",{class:"panel-body"}).text(s.differences));e.append(a.default("<div />",{class:"panel-footer"}).append(a.default("<span />",{class:"label label-info"}).text(s.datetime))),t.append(a.default("<div />",{class:"media"}).append(a.default("<div />",{class:"media-left text-center"}).text(s.user).prepend(a.default("<div />").html(s.user_avatar)),a.default("<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=a.default(h.searchForm),this.elements.$searchTextField=a.default(h.searchTextField),this.elements.$searchSubmitBtn=a.default(h.searchSubmitBtn),this.elements.$depthSelector=a.default(h.depthSelector),this.elements.$languageSelector=a.default(h.languageSelector),this.elements.$stagesSelector=a.default(h.stagesSelector),this.elements.$container=a.default(h.container),this.elements.$contentsContainer=a.default(h.contentsContainer),this.elements.$noContentsContainer=a.default(h.noContentsContainer),this.elements.$tableBody=this.elements.$contentsContainer.find("tbody"),this.elements.$workspaceActions=a.default(h.workspaceActions),this.elements.$chooseStageAction=a.default(h.chooseStageAction),this.elements.$chooseSelectionAction=a.default(h.chooseSelectionAction),this.elements.$chooseMassAction=a.default(h.chooseMassAction),this.elements.$previewLinksButton=a.default(h.previewLinksButton),this.elements.$pagination=a.default(h.pagination)}registerEvents(){a.default(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(),c.setForceSelection(!1),c.addSlide("publish-confirm","Publish",TYPO3.lang["window.publish.message"],s.SeverityEnum.info),c.addFinalProcessingSlide(()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("publishSingleRecord",[t.dataset.table,t.dataset.t3ver_oid,t.dataset.uid])).then(()=>{c.dismiss(),this.getWorkspaceInfos(),u.refreshPageTree()})}).done(()=>{c.show()})})}).on("click",'[data-action="prevstage"]',e=>{this.sendToStage(a.default(e.currentTarget).closest("tr"),"prev")}).on("click",'[data-action="nextstage"]',e=>{this.sendToStage(a.default(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=top.TYPO3.configuration.pageModuleUrl+"&id="+a}).on("click",'[data-action="remove"]',this.confirmDeleteRecordFromWorkspace).on("click",'[data-action="expand"]',e=>{const t=a.default(e.currentTarget);let s;s="true"===t.first().attr("aria-expanded")?"apps-pagetree-expand":"apps-pagetree-collapse",t.empty().append(this.getIcon(s))}),a.default(window.top.document).on("click",".t3js-workspace-recipients-selectall",()=>{a.default(".t3js-workspace-recipient",window.top.document).not(":disabled").prop("checked",!0)}).on("click",".t3js-workspace-recipients-deselectall",()=>{a.default(".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 g.default("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),this.elements.$depthSelector.on("change",e=>{const t=e.target.value;o.set("moduleData.workspaces.settings.depth",t),this.settings.depth=t,this.getWorkspaceInfos()}),this.elements.$previewLinksButton.on("click",this.generatePreviewLinks),this.elements.$languageSelector.on("change",e=>{const t=a.default(e.target);o.set("moduleData.workspaces.settings.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;o.set("moduleData.workspaces.settings.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","a[data-action]",e=>{e.preventDefault();const t=a.default(e.currentTarget);let s=!1;switch(t.data("action")){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,s=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,s=!0);break;case"page":this.paging.currentPage=parseInt(t.data("page"),10),s=!0;break;default:throw'Unknown action "'+t.data("action")+'"'}s&&(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.on("button.clicked",t=>{if("ok"===t.target.name){const i=r.convertFormToObject(t.currentTarget.querySelector("form"));i.affects={table:e.data("table"),nextStage:a,t3ver_oid:e.data("t3ver_oid"),uid:e.data("uid"),elements:[]},this.sendRemoteRequest([this.generateRemoteActionsPayload(n,[i]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then(async e=>{const t=await e.resolve();s.modal("hide"),this.renderWorkspaceInfos(t[1].result),u.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 s=e.data[t],n=a.default("<div />",{class:"btn-group"});let i,o=s.Workspaces_CollectionChildren>0&&""!==s.Workspaces_CollectionCurrent;n.append(this.getAction(o,"expand",s.expanded?"apps-pagetree-expand":"apps-pagetree-collapse").attr("title",TYPO3.lang["tooltip.expand"]).attr("data-bs-target",'[data-collection="'+s.Workspaces_CollectionCurrent+'"]').attr("aria-expanded",!o||s.expanded?"true":"false").attr("data-bs-toggle","collapse"),this.getAction(s.hasChanges,"changes","actions-document-info").attr("title",TYPO3.lang["tooltip.showChanges"]),this.getAction(s.allowedAction_publish&&""===s.Workspaces_CollectionParent,"publish","actions-version-swap-version").attr("title",TYPO3.lang["tooltip.publish"]),this.getAction(s.allowedAction_view,"preview","actions-version-workspace-preview").attr("title",TYPO3.lang["tooltip.viewElementAction"]),this.getAction(s.allowedAction_edit,"open","actions-open").attr("title",TYPO3.lang["tooltip.editElementAction"]),this.getAction(!0,"version","actions-version-page-open").attr("title",TYPO3.lang["tooltip.openPage"]),this.getAction(s.allowedAction_delete,"remove","actions-version-document-remove").attr("title",TYPO3.lang["tooltip.discardVersion"])),""!==s.integrity.messages&&(i=a.default("<span>"+this.getIcon(s.integrity.status)+"</span>"),i.attr("data-bs-toggle","tooltip").attr("data-bs-placement","top").attr("data-bs-html","true").attr("title",s.integrity.messages)),this.latestPath!==s.path_Workspace&&(this.latestPath=s.path_Workspace,this.elements.$tableBody.append(a.default("<tr />").append(a.default("<th />"),a.default("<th />",{colspan:6}).html('<span title="'+s.path_Workspace+'">'+s.path_Workspace_crop+"</span>"))));const r=a.default("<span />",{class:"form-check form-toggle"}).append(a.default("<input />",{type:"checkbox",class:"form-check-input t3js-multi-record-selection-check"})),c={"data-uid":s.uid,"data-pid":s.livepid,"data-t3ver_oid":s.t3ver_oid,"data-t3ver_wsid":s.t3ver_wsid,"data-table":s.table,"data-next-stage":s.value_nextStage,"data-prev-stage":s.value_prevStage,"data-stage":s.stage};if(""!==s.Workspaces_CollectionParent){let t=e.data.find(e=>e.Workspaces_CollectionCurrent===s.Workspaces_CollectionParent);c["data-collection"]=s.Workspaces_CollectionParent,c.class="collapse"+(t.expanded?" show":"")}else""!==s.Workspaces_CollectionCurrent&&(c["data-collection-current"]=s.Workspaces_CollectionCurrent);this.elements.$tableBody.append(a.default("<tr />",c).append(a.default("<td />").empty().append(r),a.default("<td />",{class:"t3js-title-workspace",style:s.Workspaces_CollectionLevel>0?"padding-left: "+this.indentationPadding*s.Workspaces_CollectionLevel+"px":""}).html('<span class="icon icon-size-small">'+this.getIcon(s.icon_Workspace)+'</span> <a href="#" data-action="changes"><span class="workspace-state-'+s.state_Workspace+'" title="'+s.label_Workspace+'">'+s.label_Workspace_crop+"</span></a>"),a.default("<td />",{class:"t3js-title-live"}).html('<span class="icon icon-size-small">'+this.getIcon(s.icon_Live)+'</span> <span class"workspace-live-title title="'+s.label_Live+'">'+s.label_Live_crop+"</span>"),a.default("<td />").text(s.label_Stage),a.default("<td />").empty().append(i),a.default("<td />").html(this.getIcon(s.language.icon)),a.default("<td />",{class:"text-right nowrap"}).append(n))),l.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=a.default("<ul />",{class:"pagination"}),s=[],n=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"previous"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-left"}))),i=a.default("<li />",{class:"page-item"}).append(a.default("<a />",{class:"page-link","data-action":"next"}).append(a.default("<span />",{class:"t3-icon fa fa-arrow-right"})));1===this.paging.currentPage&&n.disablePagingAction(),this.paging.currentPage===this.paging.totalPages&&i.disablePagingAction();for(let e=1;e<=this.paging.totalPages;e++){const t=a.default("<li />",{class:"page-item"+(this.paging.currentPage===e?" active":"")});t.append(a.default("<a />",{class:"page-link","data-action":"page","data-page":e}).append(a.default("<span />").text(e))),s.push(t)}t.append(n,s,i),this.elements.$pagination.empty().append(t)}openPreview(e){const t=a.default(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;p.localOpen(t)})}renderSelectionActionWizard(e,t){c.addSlide("mass-action-confirmation",TYPO3.lang["window.selectionAction.title"],"<p>"+(new d).encodeHtml(TYPO3.lang["tooltip."+e+"Selected"])+"</p>",s.SeverityEnum.warning),c.addFinalProcessingSlide(()=>{this.sendRemoteRequest(this.generateRemoteActionsPayload("executeSelectionAction",{action:e,selection:t})).then(()=>{this.markedRecordsForMassAction=[],this.getWorkspaceInfos(),c.dismiss(),u.refreshPageTree()})}).done(()=>{c.show(),c.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 d;c.setForceSelection(!1),c.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>",s.SeverityEnum.warning);const n=async e=>{const a=(await e.resolve())[0].result;a.processed<a.total?this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,a)).then(n):(this.getWorkspaceInfos(),c.dismiss())};c.addFinalProcessingSlide(()=>{this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,{init:!0,total:0,processed:0,language:this.settings.language})).then(n)}).done(()=>{c.show(),c.getComponent().on("wizard-dismissed",()=>{this.elements.$chooseMassAction.val("")})})}getAction(e,t,s){return e?a.default("<button />",{class:"btn btn-default","data-action":t,"data-bs-toggle":"tooltip"}).append(this.getIcon(s)):a.default("<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"))}}return a.default.fn.disablePagingAction=function(){a.default(this).addClass("disabled").find(".t3-icon").unwrap().wrap(a.default("<span />",{class:"page-link"}))},new u})); \ No newline at end of file -- GitLab