diff --git a/Build/Sources/TypeScript/backend/multi-record-selection.ts b/Build/Sources/TypeScript/backend/multi-record-selection.ts index d858f4ec17c980cd5a6a633de4208e080cbf96aa..43ec4028aba3b03b92d68afa2d182d93e97de20b 100644 --- a/Build/Sources/TypeScript/backend/multi-record-selection.ts +++ b/Build/Sources/TypeScript/backend/multi-record-selection.ts @@ -47,7 +47,6 @@ enum CheckboxState { */ class MultiRecordSelection { static activeClass: string = 'active'; - static disabledClass: string = 'disabled'; private lastChecked: HTMLInputElement = null; constructor() { @@ -165,7 +164,7 @@ class MultiRecordSelection { return; } // Start the evaluation by disabling the action - action.classList.add(this.disabledClass); + action.disabled = true; // Get all currently checked elements const checked: NodeListOf<HTMLInputElement> = MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier); for (let i = 0; i < checked.length; i++) { @@ -173,7 +172,7 @@ class MultiRecordSelection { if ((checked[i].closest(MultiRecordSelectionSelectors.elementSelector) as HTMLElement)?.dataset[configuration.idField]) { // If a checked element contains the idField, remove the "disabled" // state and end the search since the action can be performed. - action.classList.remove(this.disabledClass); + action.disabled = false; break; } } @@ -381,7 +380,7 @@ class MultiRecordSelection { ].join(' ')); if (checkAll !== null) { - checkAll.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.unchecked, identifier).length); + checkAll.disabled = !MultiRecordSelection.getCheckboxes(CheckboxState.unchecked, identifier).length; } const checkNone: HTMLButtonElement = document.querySelector([ @@ -390,7 +389,7 @@ class MultiRecordSelection { ].join(' ')); if (checkNone !== null) { - checkNone.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier).length); + checkNone.disabled = !MultiRecordSelection.getCheckboxes(CheckboxState.checked, identifier).length; } const toggle: HTMLButtonElement = document.querySelector([ @@ -399,7 +398,7 @@ class MultiRecordSelection { ].join(' ')); if (toggle !== null) { - toggle.classList.toggle('disabled', !MultiRecordSelection.getCheckboxes(CheckboxState.any, identifier).length); + toggle.disabled = !MultiRecordSelection.getCheckboxes(CheckboxState.any, identifier).length; } }).delegateTo(document, MultiRecordSelectionSelectors.checkboxActionsToggleSelector); } diff --git a/Build/Sources/TypeScript/workspaces/renderable/record-table.ts b/Build/Sources/TypeScript/workspaces/renderable/record-table.ts index bf7672b786fb3bacf53ce2c519d1fab855086ccd..eade79860939ac6d32647cba13061f7a5acadff3 100644 --- a/Build/Sources/TypeScript/workspaces/renderable/record-table.ts +++ b/Build/Sources/TypeScript/workspaces/renderable/record-table.ts @@ -94,7 +94,7 @@ export class RecordTableElement extends LitElement { </button> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-all" title=${TYPO3.lang['labels.checkAll']}> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-all" title=${TYPO3.lang['labels.checkAll']}> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <typo3-backend-icon identifier="actions-selection-elements-all" size="small"></typo3-backend-icon> @@ -106,7 +106,7 @@ export class RecordTableElement extends LitElement { </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title=${TYPO3.lang['labels.uncheckAll']}> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-none" title=${TYPO3.lang['labels.uncheckAll']}> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <typo3-backend-icon identifier="actions-selection-elements-none" size="small"></typo3-backend-icon> diff --git a/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php b/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php index 9c32ba0767dac3d9c90bcc81f399a1666114d489..13bcdfe350871a77528473c35bf2ddec6114207d 100644 --- a/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/SelectCheckBoxElement.php @@ -313,7 +313,7 @@ class SelectCheckBoxElement extends AbstractFormElement </button> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="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')) . '"> + <button type="button" class="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')) . '"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> ' . $this->iconFactory->getIcon('actions-selection-elements-all', IconSize::SMALL)->render() . ' @@ -325,7 +325,7 @@ class SelectCheckBoxElement extends AbstractFormElement </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . '"> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-none" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . '"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> ' . $this->iconFactory->getIcon('actions-selection-elements-none', IconSize::SMALL)->render() . ' diff --git a/typo3/sysext/backend/Classes/Form/Element/TablePermissionElement.php b/typo3/sysext/backend/Classes/Form/Element/TablePermissionElement.php index 11558a71f464121e8b24240b528a469783eec0eb..25153ecda1620a1fa015545a16dddbce114fcede 100644 --- a/typo3/sysext/backend/Classes/Form/Element/TablePermissionElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/TablePermissionElement.php @@ -212,7 +212,7 @@ final class TablePermissionElement extends AbstractFormElement $checkboxOptions = [ 'all' => ' <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-all" title="' . $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll') . '"> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-all" title="' . $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll') . '"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> ' . $this->iconFactory->getIcon('actions-selection-elements-all', IconSize::SMALL)->render() . ' @@ -225,7 +225,7 @@ final class TablePermissionElement extends AbstractFormElement </li>', 'none' => ' <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="' . $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll') . '"> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-none" title="' . $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll') . '"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> ' . $this->iconFactory->getIcon('actions-selection-elements-none', IconSize::SMALL)->render() . ' diff --git a/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php b/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php index bc00fc8eadab8008b473c07539df8b782cd9e7b8..e0721967bf506d9fc3c5ef537a8f68bc7a3b594f 100644 --- a/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php +++ b/typo3/sysext/backend/Classes/RecordList/DatabaseRecordList.php @@ -3116,7 +3116,7 @@ class DatabaseRecordList $dropdownItems['checkAll'] = ' <li> - <button type="button" class="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')) . '"> + <button type="button" class="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-selection-elements-all', IconSize::SMALL)->render() . ' ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')) . ' </button> @@ -3124,7 +3124,7 @@ class DatabaseRecordList $dropdownItems['checkNone'] = ' <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . '"> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-none" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . '"> ' . $this->iconFactory->getIcon('actions-selection-elements-none', IconSize::SMALL)->render() . ' ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . ' </button> @@ -3132,7 +3132,7 @@ class DatabaseRecordList $dropdownItems['toggleSelection'] = ' <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="toggle" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection')) . '"> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="toggle" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection')) . '"> ' . $this->iconFactory->getIcon('actions-selection-elements-invert', IconSize::SMALL)->render() . ' ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.toggleSelection')) . ' </button> @@ -3219,7 +3219,8 @@ class DatabaseRecordList if ($addClipboardActions && (string)($this->modTSconfig['enableClipBoard'] ?? '') !== 'deactivated') { $copyMarked = ' <button type="button" - class="btn btn-sm btn-default ' . ($this->clipObj->current === 'normal' ? 'disabled' : '') . '" + class="btn btn-sm btn-default" + ' . ($this->clipObj->current === 'normal' ? 'disabled' : '') . ' title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.transferToClipboard')) . '" data-multi-record-selection-action="copyMarked" > @@ -3228,7 +3229,8 @@ class DatabaseRecordList </button>'; $removeMarked = ' <button type="button" - class="btn btn-sm btn-default ' . ($this->clipObj->current === 'normal' ? 'disabled' : '') . '" + class="btn btn-sm btn-default" + ' . ($this->clipObj->current === 'normal' ? 'disabled' : '') . ' title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.removeFromClipboard')) . '" data-multi-record-selection-action="removeMarked" > diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/multi-record-selection.js b/typo3/sysext/backend/Resources/Public/JavaScript/multi-record-selection.js index b30107b67945aace7c522073c9babfb58c448271..15d97b8ea6a3ffda6a25e4871e1a42f82845058b 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/multi-record-selection.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/multi-record-selection.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -import Notification from"@typo3/backend/notification.js";import DocumentService from"@typo3/core/document-service.js";import RegularEvent from"@typo3/core/event/regular-event.js";import{selector}from"@typo3/core/literals.js";export var MultiRecordSelectionSelectors;var Buttons,CheckboxActions,CheckboxState;!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",e.elementSelector="[data-multi-record-selection-element]"}(MultiRecordSelectionSelectors||(MultiRecordSelectionSelectors={})),function(e){e.actionButton="button[data-multi-record-selection-action]",e.checkboxActionButton="button[data-multi-record-selection-check-action]"}(Buttons||(Buttons={})),function(e){e.checkAll="check-all",e.checkNone="check-none",e.toggle="toggle"}(CheckboxActions||(CheckboxActions={})),function(e){e.any="",e.checked=":checked",e.unchecked=":not(:checked)"}(CheckboxState||(CheckboxState={}));class MultiRecordSelection{constructor(){this.lastChecked=null,DocumentService.ready().then((()=>{MultiRecordSelection.restoreTemporaryState(),this.registerActions(),this.registerActionsEventHandlers(),this.registerCheckboxActions(),this.registerCheckboxKeyboardActions(),this.registerCheckboxTableRowSelectionAction(),this.registerToggleCheckboxActions(),this.registerDispatchCheckboxStateChangedEvent(),this.registerCheckboxStateChangedEventHandler()}))}static getCheckboxes(e=CheckboxState.any,t=""){return document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxSelector+e,t))}static getCombinedSelector(e,t){return""!==t?[selector`[data-multi-record-selection-identifier="${t}"]`,e].join(" "):e}static getIdentifier(e){return e.closest("[data-multi-record-selection-identifier]")?.dataset.multiRecordSelectionIdentifier||""}static changeCheckboxState(e,t){e.disabled||e.checked===t||e.dataset.manuallyChanged||(e.checked=t,e.dispatchEvent(new CustomEvent("change",{bubbles:!0})),e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{detail:{identifier:MultiRecordSelection.getIdentifier(e)},bubbles:!0,cancelable:!1})))}static restoreTemporaryState(){const e=MultiRecordSelection.getCheckboxes(CheckboxState.checked);if(!e.length)return;let t=!1;const c=[];e.forEach((e=>{e.closest(MultiRecordSelectionSelectors.elementSelector)?.classList.add(MultiRecordSelection.activeClass);const o=MultiRecordSelection.getIdentifier(e);""===o||c.includes(o)||(c.push(o),t=!0,MultiRecordSelection.toggleActionsState(o))})),t||MultiRecordSelection.toggleActionsState()}static toggleActionsState(e=""){const t=document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,e));if(!t.length)return;if(!MultiRecordSelection.getCheckboxes(CheckboxState.checked,e).length)return void t.forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e,!1)));t.forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e)));const c=document.querySelectorAll([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,e),Buttons.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(this.disabledClass);const o=MultiRecordSelection.getCheckboxes(CheckboxState.checked,e);for(let e=0;e<o.length;e++)if(o[e].closest(MultiRecordSelectionSelectors.elementSelector)?.dataset[c.idField]){t.classList.remove(this.disabledClass);break}}))}static changeActionContainerVisibility(e,t=!0){const c=e.closest(".multi-record-selection-panel")?.children;if(t){if(c)for(let e=0;e<c.length;e++)c[e].classList.add("hidden");e.classList.remove("hidden")}else{if(c)for(let e=0;e<c.length;e++)c[e].classList.remove("hidden");e.classList.add("hidden")}}static unsetManuallyChangedAttribute(e){MultiRecordSelection.getCheckboxes(CheckboxState.any,e).forEach((e=>{e.removeAttribute("data-manually-changed")}))}registerActions(){new RegularEvent("click",((e,t)=>{t.dataset.multiRecordSelectionAction;const c=MultiRecordSelection.getIdentifier(t),o=JSON.parse(t.dataset.multiRecordSelectionActionConfig||"{}"),i=MultiRecordSelection.getCheckboxes(CheckboxState.checked,c);i.length&&t.dispatchEvent(new CustomEvent("multiRecordSelection:action:"+t.dataset.multiRecordSelectionAction,{detail:{identifier:c,checkboxes:i,configuration:o},bubbles:!0,cancelable:!1}))})).delegateTo(document,[MultiRecordSelectionSelectors.actionsSelector,Buttons.actionButton].join(" "))}registerActionsEventHandlers(){new RegularEvent("multiRecordSelection:actions:show",(e=>{const t=e.detail?.identifier||"";document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,t)).forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e)))})).bindTo(document),new RegularEvent("multiRecordSelection:actions:hide",(e=>{const t=e.detail?.identifier||"";document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,t)).forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e,!1)))})).bindTo(document)}registerCheckboxActions(){new RegularEvent("click",((e,t)=>{if(e.preventDefault(),!t.dataset.multiRecordSelectionCheckAction)return;const c=MultiRecordSelection.getIdentifier(t),o=MultiRecordSelection.getCheckboxes(CheckboxState.any,c);if(o.length){switch(MultiRecordSelection.unsetManuallyChangedAttribute(c),t.dataset.multiRecordSelectionCheckAction){case CheckboxActions.checkAll:o.forEach((e=>{MultiRecordSelection.changeCheckboxState(e,!0)}));break;case CheckboxActions.checkNone:o.forEach((e=>{MultiRecordSelection.changeCheckboxState(e,!1)}));break;case CheckboxActions.toggle:o.forEach((e=>{MultiRecordSelection.changeCheckboxState(e,!e.checked)}));break;default:Notification.warning("Unknown checkbox action")}MultiRecordSelection.unsetManuallyChangedAttribute(c)}})).delegateTo(document,[MultiRecordSelectionSelectors.checkboxActionsSelector,Buttons.checkboxActionButton].join(" "))}registerCheckboxKeyboardActions(){new RegularEvent("click",((e,t)=>this.handleCheckboxKeyboardActions(e,t))).delegateTo(document,MultiRecordSelectionSelectors.checkboxSelector)}registerCheckboxTableRowSelectionAction(){new RegularEvent("click",((e,t)=>{const c=e.target.tagName;if("TH"!==c&&"TD"!==c)return;const o=t.querySelector(MultiRecordSelectionSelectors.checkboxSelector);null!==o&&(MultiRecordSelection.changeCheckboxState(o,!o.checked),this.handleCheckboxKeyboardActions(e,o,!1))})).delegateTo(document,MultiRecordSelectionSelectors.elementSelector),new RegularEvent("mousedown",(e=>(e.shiftKey||e.altKey||e.ctrlKey)&&e.preventDefault())).delegateTo(document,MultiRecordSelectionSelectors.elementSelector)}registerDispatchCheckboxStateChangedEvent(){new RegularEvent("change",((e,t)=>{t.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{detail:{identifier:MultiRecordSelection.getIdentifier(t)},bubbles:!0,cancelable:!1}))})).delegateTo(document,MultiRecordSelectionSelectors.checkboxSelector)}registerCheckboxStateChangedEventHandler(){new RegularEvent("multiRecordSelection:checkbox:state:changed",(e=>{const t=e.target,c=e.detail?.identifier||"";t.checked?t.closest(MultiRecordSelectionSelectors.elementSelector).classList.add(MultiRecordSelection.activeClass):t.closest(MultiRecordSelectionSelectors.elementSelector).classList.remove(MultiRecordSelection.activeClass),MultiRecordSelection.toggleActionsState(c)})).bindTo(document)}registerToggleCheckboxActions(){new RegularEvent("click",((e,t)=>{const c=MultiRecordSelection.getIdentifier(t),o=document.querySelector([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+CheckboxActions.checkAll+'"]'].join(" "));null!==o&&o.classList.toggle("disabled",!MultiRecordSelection.getCheckboxes(CheckboxState.unchecked,c).length);const i=document.querySelector([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+CheckboxActions.checkNone+'"]'].join(" "));null!==i&&i.classList.toggle("disabled",!MultiRecordSelection.getCheckboxes(CheckboxState.checked,c).length);const l=document.querySelector([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+CheckboxActions.toggle+'"]'].join(" "));null!==l&&l.classList.toggle("disabled",!MultiRecordSelection.getCheckboxes(CheckboxState.any,c).length)})).delegateTo(document,MultiRecordSelectionSelectors.checkboxActionsToggleSelector)}handleCheckboxKeyboardActions(e,t,c=!0){const o=MultiRecordSelection.getIdentifier(t);if(this.lastChecked&&document.body.contains(this.lastChecked)&&MultiRecordSelection.getIdentifier(this.lastChecked)===o&&(e.shiftKey||e.altKey||e.ctrlKey)){if(c&&MultiRecordSelection.unsetManuallyChangedAttribute(o),e.shiftKey){const e=Array.from(MultiRecordSelection.getCheckboxes(CheckboxState.any,o)),c=e.indexOf(t),i=e.indexOf(this.lastChecked);e.slice(Math.min(c,i),Math.max(c,i)+1).forEach((e=>{e!==t&&MultiRecordSelection.changeCheckboxState(e,t.checked)}))}this.lastChecked=t,(e.altKey||e.ctrlKey)&&MultiRecordSelection.getCheckboxes(CheckboxState.any,o).forEach((e=>{e!==t&&MultiRecordSelection.changeCheckboxState(e,!e.checked)})),MultiRecordSelection.unsetManuallyChangedAttribute(o)}else this.lastChecked=t}}MultiRecordSelection.activeClass="active",MultiRecordSelection.disabledClass="disabled";export default new MultiRecordSelection; \ No newline at end of file +import Notification from"@typo3/backend/notification.js";import DocumentService from"@typo3/core/document-service.js";import RegularEvent from"@typo3/core/event/regular-event.js";import{selector}from"@typo3/core/literals.js";export var MultiRecordSelectionSelectors;var Buttons,CheckboxActions,CheckboxState;!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",e.elementSelector="[data-multi-record-selection-element]"}(MultiRecordSelectionSelectors||(MultiRecordSelectionSelectors={})),function(e){e.actionButton="button[data-multi-record-selection-action]",e.checkboxActionButton="button[data-multi-record-selection-check-action]"}(Buttons||(Buttons={})),function(e){e.checkAll="check-all",e.checkNone="check-none",e.toggle="toggle"}(CheckboxActions||(CheckboxActions={})),function(e){e.any="",e.checked=":checked",e.unchecked=":not(:checked)"}(CheckboxState||(CheckboxState={}));class MultiRecordSelection{constructor(){this.lastChecked=null,DocumentService.ready().then((()=>{MultiRecordSelection.restoreTemporaryState(),this.registerActions(),this.registerActionsEventHandlers(),this.registerCheckboxActions(),this.registerCheckboxKeyboardActions(),this.registerCheckboxTableRowSelectionAction(),this.registerToggleCheckboxActions(),this.registerDispatchCheckboxStateChangedEvent(),this.registerCheckboxStateChangedEventHandler()}))}static getCheckboxes(e=CheckboxState.any,t=""){return document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxSelector+e,t))}static getCombinedSelector(e,t){return""!==t?[selector`[data-multi-record-selection-identifier="${t}"]`,e].join(" "):e}static getIdentifier(e){return e.closest("[data-multi-record-selection-identifier]")?.dataset.multiRecordSelectionIdentifier||""}static changeCheckboxState(e,t){e.disabled||e.checked===t||e.dataset.manuallyChanged||(e.checked=t,e.dispatchEvent(new CustomEvent("change",{bubbles:!0})),e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{detail:{identifier:MultiRecordSelection.getIdentifier(e)},bubbles:!0,cancelable:!1})))}static restoreTemporaryState(){const e=MultiRecordSelection.getCheckboxes(CheckboxState.checked);if(!e.length)return;let t=!1;const c=[];e.forEach((e=>{e.closest(MultiRecordSelectionSelectors.elementSelector)?.classList.add(MultiRecordSelection.activeClass);const o=MultiRecordSelection.getIdentifier(e);""===o||c.includes(o)||(c.push(o),t=!0,MultiRecordSelection.toggleActionsState(o))})),t||MultiRecordSelection.toggleActionsState()}static toggleActionsState(e=""){const t=document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,e));if(!t.length)return;if(!MultiRecordSelection.getCheckboxes(CheckboxState.checked,e).length)return void t.forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e,!1)));t.forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e)));const c=document.querySelectorAll([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,e),Buttons.actionButton].join(" "));c.length&&c.forEach((t=>{if(!t.dataset.multiRecordSelectionActionConfig)return;const c=JSON.parse(t.dataset.multiRecordSelectionActionConfig);if(!c.idField)return;t.disabled=!0;const o=MultiRecordSelection.getCheckboxes(CheckboxState.checked,e);for(let e=0;e<o.length;e++)if(o[e].closest(MultiRecordSelectionSelectors.elementSelector)?.dataset[c.idField]){t.disabled=!1;break}}))}static changeActionContainerVisibility(e,t=!0){const c=e.closest(".multi-record-selection-panel")?.children;if(t){if(c)for(let e=0;e<c.length;e++)c[e].classList.add("hidden");e.classList.remove("hidden")}else{if(c)for(let e=0;e<c.length;e++)c[e].classList.remove("hidden");e.classList.add("hidden")}}static unsetManuallyChangedAttribute(e){MultiRecordSelection.getCheckboxes(CheckboxState.any,e).forEach((e=>{e.removeAttribute("data-manually-changed")}))}registerActions(){new RegularEvent("click",((e,t)=>{t.dataset.multiRecordSelectionAction;const c=MultiRecordSelection.getIdentifier(t),o=JSON.parse(t.dataset.multiRecordSelectionActionConfig||"{}"),i=MultiRecordSelection.getCheckboxes(CheckboxState.checked,c);i.length&&t.dispatchEvent(new CustomEvent("multiRecordSelection:action:"+t.dataset.multiRecordSelectionAction,{detail:{identifier:c,checkboxes:i,configuration:o},bubbles:!0,cancelable:!1}))})).delegateTo(document,[MultiRecordSelectionSelectors.actionsSelector,Buttons.actionButton].join(" "))}registerActionsEventHandlers(){new RegularEvent("multiRecordSelection:actions:show",(e=>{const t=e.detail?.identifier||"";document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,t)).forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e)))})).bindTo(document),new RegularEvent("multiRecordSelection:actions:hide",(e=>{const t=e.detail?.identifier||"";document.querySelectorAll(MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.actionsSelector,t)).forEach((e=>MultiRecordSelection.changeActionContainerVisibility(e,!1)))})).bindTo(document)}registerCheckboxActions(){new RegularEvent("click",((e,t)=>{if(e.preventDefault(),!t.dataset.multiRecordSelectionCheckAction)return;const c=MultiRecordSelection.getIdentifier(t),o=MultiRecordSelection.getCheckboxes(CheckboxState.any,c);if(o.length){switch(MultiRecordSelection.unsetManuallyChangedAttribute(c),t.dataset.multiRecordSelectionCheckAction){case CheckboxActions.checkAll:o.forEach((e=>{MultiRecordSelection.changeCheckboxState(e,!0)}));break;case CheckboxActions.checkNone:o.forEach((e=>{MultiRecordSelection.changeCheckboxState(e,!1)}));break;case CheckboxActions.toggle:o.forEach((e=>{MultiRecordSelection.changeCheckboxState(e,!e.checked)}));break;default:Notification.warning("Unknown checkbox action")}MultiRecordSelection.unsetManuallyChangedAttribute(c)}})).delegateTo(document,[MultiRecordSelectionSelectors.checkboxActionsSelector,Buttons.checkboxActionButton].join(" "))}registerCheckboxKeyboardActions(){new RegularEvent("click",((e,t)=>this.handleCheckboxKeyboardActions(e,t))).delegateTo(document,MultiRecordSelectionSelectors.checkboxSelector)}registerCheckboxTableRowSelectionAction(){new RegularEvent("click",((e,t)=>{const c=e.target.tagName;if("TH"!==c&&"TD"!==c)return;const o=t.querySelector(MultiRecordSelectionSelectors.checkboxSelector);null!==o&&(MultiRecordSelection.changeCheckboxState(o,!o.checked),this.handleCheckboxKeyboardActions(e,o,!1))})).delegateTo(document,MultiRecordSelectionSelectors.elementSelector),new RegularEvent("mousedown",(e=>(e.shiftKey||e.altKey||e.ctrlKey)&&e.preventDefault())).delegateTo(document,MultiRecordSelectionSelectors.elementSelector)}registerDispatchCheckboxStateChangedEvent(){new RegularEvent("change",((e,t)=>{t.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{detail:{identifier:MultiRecordSelection.getIdentifier(t)},bubbles:!0,cancelable:!1}))})).delegateTo(document,MultiRecordSelectionSelectors.checkboxSelector)}registerCheckboxStateChangedEventHandler(){new RegularEvent("multiRecordSelection:checkbox:state:changed",(e=>{const t=e.target,c=e.detail?.identifier||"";t.checked?t.closest(MultiRecordSelectionSelectors.elementSelector).classList.add(MultiRecordSelection.activeClass):t.closest(MultiRecordSelectionSelectors.elementSelector).classList.remove(MultiRecordSelection.activeClass),MultiRecordSelection.toggleActionsState(c)})).bindTo(document)}registerToggleCheckboxActions(){new RegularEvent("click",((e,t)=>{const c=MultiRecordSelection.getIdentifier(t),o=document.querySelector([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+CheckboxActions.checkAll+'"]'].join(" "));null!==o&&(o.disabled=!MultiRecordSelection.getCheckboxes(CheckboxState.unchecked,c).length);const i=document.querySelector([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+CheckboxActions.checkNone+'"]'].join(" "));null!==i&&(i.disabled=!MultiRecordSelection.getCheckboxes(CheckboxState.checked,c).length);const n=document.querySelector([MultiRecordSelection.getCombinedSelector(MultiRecordSelectionSelectors.checkboxActionsSelector,c),'button[data-multi-record-selection-check-action="'+CheckboxActions.toggle+'"]'].join(" "));null!==n&&(n.disabled=!MultiRecordSelection.getCheckboxes(CheckboxState.any,c).length)})).delegateTo(document,MultiRecordSelectionSelectors.checkboxActionsToggleSelector)}handleCheckboxKeyboardActions(e,t,c=!0){const o=MultiRecordSelection.getIdentifier(t);if(this.lastChecked&&document.body.contains(this.lastChecked)&&MultiRecordSelection.getIdentifier(this.lastChecked)===o&&(e.shiftKey||e.altKey||e.ctrlKey)){if(c&&MultiRecordSelection.unsetManuallyChangedAttribute(o),e.shiftKey){const e=Array.from(MultiRecordSelection.getCheckboxes(CheckboxState.any,o)),c=e.indexOf(t),i=e.indexOf(this.lastChecked);e.slice(Math.min(c,i),Math.max(c,i)+1).forEach((e=>{e!==t&&MultiRecordSelection.changeCheckboxState(e,t.checked)}))}this.lastChecked=t,(e.altKey||e.ctrlKey)&&MultiRecordSelection.getCheckboxes(CheckboxState.any,o).forEach((e=>{e!==t&&MultiRecordSelection.changeCheckboxState(e,!e.checked)})),MultiRecordSelection.unsetManuallyChangedAttribute(o)}else this.lastChecked=t}}MultiRecordSelection.activeClass="active";export default new MultiRecordSelection; \ No newline at end of file diff --git a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php index f87868039e4055cd17037f672dd461f4f75e890e..1e665b393b034d5de8dc57685fda9ccd2eaee86f 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/FileList/FileClipboardCest.php @@ -77,9 +77,9 @@ final class FileClipboardCest $I->wait(1); $I->click('Clipboard #1 (multi-selection mode)'); $I->click('.t3js-multi-record-selection-check-actions-toggle'); - $I->waitForElementVisible('button[data-multi-record-selection-check-action="check-all"]:not(.disabled)'); + $I->waitForElementClickable('button[data-multi-record-selection-check-action="check-all"]'); $I->click('button[data-multi-record-selection-check-action="check-all"]'); - $I->waitForElementVisible('button[data-multi-record-selection-action="copyMarked"]:not(.disabled)'); + $I->waitForElementClickable('button[data-multi-record-selection-action="copyMarked"]'); $I->click('button[data-multi-record-selection-action="copyMarked"]'); foreach ($expectedFiles as $file) { diff --git a/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php b/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php index ec0bcc875d4313374ab657d73034ab8c2d8101ea..d5ca59b43bd69417a751f46c4d286bbaa4285500 100644 --- a/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php +++ b/typo3/sysext/core/Tests/Acceptance/Application/Recycler/RecyclerModuleCest.php @@ -82,6 +82,7 @@ final class RecyclerModuleCest $I->amGoingTo('Recover the page and its contents'); $I->click('tr[data-recordtitle="' . self::$pageTitle . '"] .t3js-multi-record-selection-check'); + $I->waitForElementClickable('button[data-multi-record-selection-action="massundo"]'); $I->click('button[data-multi-record-selection-action="massundo"]'); $this->modalDialog->canSeeDialog(); $I->click('#undo-recursive'); diff --git a/typo3/sysext/filelist/Classes/FileList.php b/typo3/sysext/filelist/Classes/FileList.php index 6a619fa66ff25d067957331985ea21bd94cd5358..86ed7a99301babad9295fb649384631d01b7a772 100644 --- a/typo3/sysext/filelist/Classes/FileList.php +++ b/typo3/sysext/filelist/Classes/FileList.php @@ -1392,7 +1392,7 @@ class FileList $dropdownItems['checkAll'] = ' <li> - <button type="button" class="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')) . '"> + <button type="button" class="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')) . '"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> ' . $this->iconFactory->getIcon('actions-selection-elements-all', IconSize::SMALL)->render() . ' @@ -1406,7 +1406,7 @@ class FileList $dropdownItems['checkNone'] = ' <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . '"> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-none" title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')) . '"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> ' . $this->iconFactory->getIcon('actions-selection-elements-none', IconSize::SMALL)->render() . ' diff --git a/typo3/sysext/filelist/Resources/Private/Templates/File/List.html b/typo3/sysext/filelist/Resources/Private/Templates/File/List.html index 7e4638fc8de5f818bb78608cbcbd717250451326..afe4e33ee917143499a9c2f36ff3709b2d2d3fd4 100644 --- a/typo3/sysext/filelist/Resources/Private/Templates/File/List.html +++ b/typo3/sysext/filelist/Resources/Private/Templates/File/List.html @@ -99,13 +99,13 @@ <f:if condition="{editActionConfiguration}"> <div class="col"> <div class="btn-group"> - <button type="button" class="btn btn-default btn-sm disabled" data-multi-record-selection-action="edit" data-multi-record-selection-action-config="{editActionConfiguration -> f:format.raw()}"> + <button type="button" class="btn btn-default btn-sm" disabled="disabled" data-multi-record-selection-action="edit" data-multi-record-selection-action-config="{editActionConfiguration -> f:format.raw()}"> <span title="{f:translate(key: 'LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:editMarked')}"> <core:icon identifier="actions-open" size="small" /> <f:translate key="LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:editMarked" /> </span> </button> <f:if condition="{editColumnsActionConfiguration}"> - <button type="button" class="btn btn-default btn-sm disabled" data-multi-record-selection-action="edit" data-multi-record-selection-action-config="{editColumnsActionConfiguration -> f:format.raw()}"> + <button type="button" class="btn btn-default btn-sm" disabled="disabled" data-multi-record-selection-action="edit" data-multi-record-selection-action-config="{editColumnsActionConfiguration -> f:format.raw()}"> <span title="{f:translate(key: 'LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:editColumns')}"> <core:icon identifier="actions-open" size="small" /> <f:translate key="LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:editColumns" /> </span> @@ -126,12 +126,12 @@ <f:if condition="{showClipboardPanel} && {enableClipBoard.mode} != 'normal'"> <div class="col"> <div class="btn-group"> - <button type="button" class="btn btn-default btn-sm {f:if(condition: '{enableClipBoard.mode} == normal', then: 'disabled')}" data-multi-record-selection-action="copyMarked"> + <button type="button" class="btn btn-default btn-sm" {f:if(condition: '{enableClipBoard.mode} == normal', then: 'disabled')} data-multi-record-selection-action="copyMarked"> <span title="{f:translate(key: 'LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_selectMarked')}"> <core:icon identifier="actions-edit-copy" size="small" /> <f:translate key="LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_selectMarked" /> </span> </button> - <button type="button" class="btn btn-default btn-sm {f:if(condition: '{enableClipBoard.mode} == normal', then: 'disabled')}" data-multi-record-selection-action="removeMarked"> + <button type="button" class="btn btn-default btn-sm" {f:if(condition: '{enableClipBoard.mode} == normal', then: 'disabled')} data-multi-record-selection-action="removeMarked"> <span title="{f:translate(key: 'LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_deleteMarked')}"> <core:icon identifier="actions-minus" size="small" /> <f:translate key="LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_deleteMarked" /> </span> diff --git a/typo3/sysext/reactions/Resources/Private/Templates/Management/Overview.html b/typo3/sysext/reactions/Resources/Private/Templates/Management/Overview.html index cf0947720e9036d7f064c583acaf8122b4f91d2f..3a1029a078d9a6216178255826203d62d280d788 100644 --- a/typo3/sysext/reactions/Resources/Private/Templates/Management/Overview.html +++ b/typo3/sysext/reactions/Resources/Private/Templates/Management/Overview.html @@ -71,7 +71,7 @@ </button> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="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')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-all" size="small" /> @@ -83,7 +83,7 @@ </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-none" size="small" /> diff --git a/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html b/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html index 511f87d3656207e46b4fd5eeb32e1c679308f1ef..b276529b0e13209886e7a51e23adb2e9a0f39ef3 100644 --- a/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html +++ b/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html @@ -74,7 +74,7 @@ </button> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="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')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-all" size="small" /> @@ -86,7 +86,7 @@ </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-none" size="small" /> diff --git a/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html b/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html index 9bc793b7caa47b42af7713ffe88940c0c03914cf..7094b30bd73d947a189d7f2089fac94fefcd616e 100644 --- a/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html +++ b/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html @@ -75,7 +75,7 @@ </a> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="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')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-all" size="small" /> @@ -87,7 +87,7 @@ </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-none" size="small" /> diff --git a/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html b/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html index b5c9720a1b144eca9ad4dedf1fd8d2d13f20e003..44cc63c879aaeffebe20647516ad7fa05608a981 100644 --- a/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html +++ b/typo3/sysext/scheduler/Resources/Private/Partials/TaskList.html @@ -211,7 +211,8 @@ <li> <button type="button" - class="dropdown-item disabled" + class="dropdown-item" + disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}" > @@ -228,7 +229,8 @@ <li> <button type="button" - class="dropdown-item disabled" + class="dropdown-item" + disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}" > diff --git a/typo3/sysext/webhooks/Resources/Private/Templates/Management/Overview.html b/typo3/sysext/webhooks/Resources/Private/Templates/Management/Overview.html index f436fd3403ec2fe8140892499b1702b40136796f..4590ed8cd357589192dd03e2d96a18e43ddf49dd 100644 --- a/typo3/sysext/webhooks/Resources/Private/Templates/Management/Overview.html +++ b/typo3/sysext/webhooks/Resources/Private/Templates/Management/Overview.html @@ -242,7 +242,7 @@ </button> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="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')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-all" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.checkAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-all" size="small" /> @@ -254,7 +254,7 @@ </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> + <button type="button" class="dropdown-item" disabled="disabled" data-multi-record-selection-check-action="check-none" title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.uncheckAll')}"> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <core:icon identifier="actions-selection-elements-none" size="small" /> diff --git a/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js b/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js index 662bb0175e5ce5bbd8f9dd6b6ffaa228f1396d09..a9ee3b7fe1db10ffbd609b81908e6990fe9751d3 100644 --- a/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js +++ b/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js @@ -22,7 +22,7 @@ var __decorate=function(e,t,n,a){var o,l=arguments.length,i=l<3?t:null===a?a=Obj </button> <ul class="dropdown-menu t3js-multi-record-selection-check-actions"> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-all" title=${TYPO3.lang["labels.checkAll"]}> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-all" title=${TYPO3.lang["labels.checkAll"]}> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <typo3-backend-icon identifier="actions-selection-elements-all" size="small"></typo3-backend-icon> @@ -34,7 +34,7 @@ var __decorate=function(e,t,n,a){var o,l=arguments.length,i=l<3?t:null===a?a=Obj </button> </li> <li> - <button type="button" class="dropdown-item disabled" data-multi-record-selection-check-action="check-none" title=${TYPO3.lang["labels.uncheckAll"]}> + <button type="button" class="dropdown-item" disabled data-multi-record-selection-check-action="check-none" title=${TYPO3.lang["labels.uncheckAll"]}> <span class="dropdown-item-columns"> <span class="dropdown-item-column dropdown-item-column-icon" aria-hidden="true"> <typo3-backend-icon identifier="actions-selection-elements-none" size="small"></typo3-backend-icon>