From 82036f54cd13e130b8dbd9abd1430b0f6bdb5555 Mon Sep 17 00:00:00 2001 From: Ayke Halder <mail@ayke-halder.de> Date: Wed, 4 Sep 2024 15:39:44 +0200 Subject: [PATCH] [TASK] Improve a11y of disabled recycler search-submit-button This changes the `disabled`-attribute of the recycler's search-submit-button. Thereby screen- readers can announce that the button is disabled. Before this there was toggling implemented for `class="disabled"`. Thereby the 'disabled' button was still active and could be activated by keyboard. Resolves: #104817 Releases: main Change-Id: Ifb99481624c5cc24f590c7e9d0f3a61ab9f997aa Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/85870 Reviewed-by: Andreas Nedbal <andy@pixelde.su> Tested-by: Benjamin Kott <benjamin.kott@outlook.com> Reviewed-by: Benjamin Kott <benjamin.kott@outlook.com> Tested-by: Andreas Nedbal <andy@pixelde.su> --- Build/Sources/TypeScript/recycler/recycler.ts | 8 ++++---- .../Resources/Private/Templates/RecyclerModule.html | 2 +- .../recycler/Resources/Public/JavaScript/recycler.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Build/Sources/TypeScript/recycler/recycler.ts b/Build/Sources/TypeScript/recycler/recycler.ts index a24ba1a38e56..8acf131fad4e 100644 --- a/Build/Sources/TypeScript/recycler/recycler.ts +++ b/Build/Sources/TypeScript/recycler/recycler.ts @@ -82,13 +82,13 @@ class Recycler { // changing the search field new RegularEvent('keyup', (event: KeyboardEvent) => { - const input = event.currentTarget as HTMLInputElement; + const input = event.target as HTMLInputElement; const searchSubmitButton = document.querySelector(Identifiers.searchSubmitBtn) as HTMLButtonElement; if (input.value !== '') { - searchSubmitButton.classList.remove('disabled'); + searchSubmitButton.disabled = false; } else { - searchSubmitButton.classList.add('disabled'); + searchSubmitButton.disabled = true; this.loadDeletedElements(); } }).delegateTo(document, Identifiers.searchText); @@ -123,7 +123,7 @@ class Recycler { { onClear: () => { const searchSubmitButton = document.querySelector(Identifiers.searchSubmitBtn) as HTMLButtonElement; - searchSubmitButton.classList.add('disabled'); + searchSubmitButton.disabled = true; this.loadDeletedElements(); }, }, diff --git a/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html b/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html index b276529b0e13..1c8488be02be 100644 --- a/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html +++ b/typo3/sysext/recycler/Resources/Private/Templates/RecyclerModule.html @@ -17,7 +17,7 @@ <label for="search-text" class="form-label"><f:translate key="LLL:EXT:recycler/Resources/Private/Language/locallang.xlf:filter.search" /></label> <div class="input-group"> <input type="text" id="search-text" name="search-text" class="form-control form-control-clearable"> - <button type="submit" class="btn btn-default disabled"> + <button type="submit" class="btn btn-default" disabled> <span class="visually-hidden"><f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.title.search"/></span> <core:icon identifier="actions-search" /> </button> diff --git a/typo3/sysext/recycler/Resources/Public/JavaScript/recycler.js b/typo3/sysext/recycler/Resources/Public/JavaScript/recycler.js index d20aab9392c0..ccb3eba69c6c 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! */ -import DocumentService from"@typo3/core/document-service.js";import NProgress from"nprogress";import"@typo3/backend/input/clearable.js";import"@typo3/backend/element/icon-element.js";import"@typo3/backend/element/pagination.js";import DeferredAction from"@typo3/backend/action-button/deferred-action.js";import Modal from"@typo3/backend/modal.js";import Notification from"@typo3/backend/notification.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import RegularEvent from"@typo3/core/event/regular-event.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";var Identifiers;!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]"}(Identifiers||(Identifiers={}));class Recycler{constructor(){this.paging={currentPage:1,totalPages:1,totalItems:0,itemsPerPage:parseInt(TYPO3.settings.Recycler.pagingSize,10)},this.markedRecordsForMassAction=[],DocumentService.ready().then((()=>{this.initialize()}))}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}registerEvents(){new RegularEvent("submit",(e=>{e.preventDefault();""!==document.querySelector(Identifiers.searchText).value&&this.loadDeletedElements()})).delegateTo(document,Identifiers.searchForm),new RegularEvent("keyup",(e=>{const t=e.currentTarget,n=document.querySelector(Identifiers.searchSubmitBtn);""!==t.value?n.classList.remove("disabled"):(n.classList.add("disabled"),this.loadDeletedElements())})).delegateTo(document,Identifiers.searchText),new RegularEvent("change",(()=>{this.loadAvailableTables().then((()=>{this.loadDeletedElements()}))})).delegateTo(document,Identifiers.depthSelector),new RegularEvent("change",(()=>{this.paging.currentPage=1,this.loadDeletedElements()})).delegateTo(document,Identifiers.tableSelector),new RegularEvent("click",this.undoRecord.bind(this)).delegateTo(document,Identifiers.undo),new RegularEvent("click",this.deleteRecord.bind(this)).delegateTo(document,Identifiers.delete),new RegularEvent("click",(e=>{e.preventDefault(),this.loadAvailableTables().then((()=>{this.loadDeletedElements()}))})).delegateTo(document,Identifiers.reloadAction),document.querySelector(Identifiers.searchText).clearable({onClear:()=>{document.querySelector(Identifiers.searchSubmitBtn).classList.add("disabled"),this.loadDeletedElements()}}),new RegularEvent("click",(e=>{e.preventDefault();const t=e.target.closest("button");t&&("previous"===t.dataset.action?this.paging.currentPage>1&&this.paging.currentPage--:"next"===t.dataset.action?this.paging.currentPage<this.paging.totalPages&&this.paging.currentPage++:"page"===t.dataset.action&&(this.paging.currentPage=parseInt(t.querySelector("span").textContent,10)),this.loadDeletedElements())})).delegateTo(document,Identifiers.paginator),TYPO3.settings.Recycler.deleteDisable?document.querySelector(Identifiers.massDelete).remove():document.querySelector(Identifiers.massDelete).style.display="block",new RegularEvent("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged.bind(this)).bindTo(document),new RegularEvent("multiRecordSelection:action:massundo",this.undoRecord.bind(this)).bindTo(document),new RegularEvent("multiRecordSelection:action:massdelete",this.deleteRecord.bind(this)).bindTo(document)}initialize(){NProgress.configure({parent:".module-loading-indicator",showSpinner:!1}),this.registerEvents(),TYPO3.settings.Recycler.depthSelection>0&&(document.querySelector(Identifiers.depthSelector).value=String(TYPO3.settings.Recycler.depthSelection)),this.loadAvailableTables().then((()=>{this.loadDeletedElements()}))}handleCheckboxStateChanged(e){const t=e.target,n=t.closest("tr"),a=n.dataset.table+":"+n.dataset.uid;if(t.checked)this.markedRecordsForMassAction.push(a);else{const e=this.markedRecordsForMassAction.indexOf(a);e>-1&&this.markedRecordsForMassAction.splice(e,1)}if(this.markedRecordsForMassAction.length>0){const e=document.querySelector(Identifiers.massUndo),t=document.querySelector(Identifiers.massDelete);e.querySelector("span.text").textContent=this.createMessage(TYPO3.lang["button.undoselected"],[this.markedRecordsForMassAction.length.toString(10)]),t.querySelector("span.text").textContent=this.createMessage(TYPO3.lang["button.deleteselected"],[this.markedRecordsForMassAction.length.toString(10)])}else this.resetMassActionButtons()}resetMassActionButtons(){const e=document.querySelector(Identifiers.massUndo),t=document.querySelector(Identifiers.massDelete);this.markedRecordsForMassAction=[],e.querySelector("span.text").textContent=TYPO3.lang["button.undo"],t.querySelector("span.text").textContent=TYPO3.lang["button.delete"],document.dispatchEvent(new CustomEvent("multiRecordSelection:actions:hide"))}async loadAvailableTables(){const e=document.querySelector(Identifiers.tableSelector),t=document.querySelector(Identifiers.depthSelector);return NProgress.start(),e.value="",this.paging.currentPage=1,new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).withQueryArguments({action:"getTables",startUid:TYPO3.settings.Recycler.startUid,depth:t.value}).get().then((async t=>{const n=await t.resolve(),a=[];e.replaceChildren();for(const e of n){const t=e[0],n=e[1],r=(e[2]?e[2]:TYPO3.lang.label_allrecordtypes)+" ("+n+")",s=document.createElement("option");s.value=t,s.textContent=r,a.push(s)}return a.length>0&&(e.append(...a),""!==TYPO3.settings.Recycler.tableSelection&&(e.value=TYPO3.settings.Recycler.tableSelection)),t})).finally((()=>NProgress.done()))}async loadDeletedElements(){const e=document.querySelector(Identifiers.depthSelector),t=document.querySelector(Identifiers.tableSelector),n=document.querySelector(Identifiers.searchText);return NProgress.start(),this.resetMassActionButtons(),new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).withQueryArguments({action:"getDeletedRecords",depth:e.value,startUid:TYPO3.settings.Recycler.startUid,table:t.value,filterTxt:n.value,start:(this.paging.currentPage-1)*this.paging.itemsPerPage,limit:this.paging.itemsPerPage}).get().then((async e=>{const t=document.querySelector(`${Identifiers.recyclerTable} tbody`),n=await e.resolve();return t.innerHTML=n.rows,this.buildPaginator(n.totalItems),e})).finally((()=>NProgress.done()))}deleteRecord(e,t){if(TYPO3.settings.Recycler.deleteDisable)return;const n=(t||e.target).closest("tr"),a=null===n||"TBODY"!==n.parentElement.tagName;let r,s;if(a)r=this.markedRecordsForMassAction,s=TYPO3.lang["modal.massdelete.text"];else{const e=n.dataset.uid,t=n.dataset.table,a=n.dataset.recordtitle;r=[t+":"+e],s="pages"===t?TYPO3.lang["modal.deletepage.text"]:TYPO3.lang["modal.deletecontent.text"],s=this.createMessage(s,[a,"["+r[0]+"]"])}Modal.advanced({title:TYPO3.lang["modal.delete.header"],content:s,severity:SeverityEnum.error,staticBackdrop:!0,buttons:[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){Modal.dismiss()}},{text:TYPO3.lang["button.delete"],btnClass:"btn-danger",action:new DeferredAction((()=>{this.callAjaxAction("delete",r,a)}))}]})}undoRecord(e,t){const n=(t||e.target).closest("tr"),a=null===n||"TBODY"!==n.parentElement.tagName;let r,s,o;if(a)r=this.markedRecordsForMassAction,s=TYPO3.lang["modal.massundo.text"],o=!0;else{const e=n.dataset.uid,t=n.dataset.table,a=n.dataset.recordtitle;r=[t+":"+e],o="pages"===t,s=o?TYPO3.lang["modal.undopage.text"]:TYPO3.lang["modal.undocontent.text"],s=this.createMessage(s,[a,"["+r[0]+"]"]),o&&n.dataset.parentDeleted&&(s+=TYPO3.lang["modal.undo.parentpages"])}let i=null;if(o){const e=document.createElement("div"),t=document.createElement("p");t.textContent=s;const n=document.createElement("div");n.classList.add("form-check");const a=document.createElement("input");a.type="checkbox",a.id="undo-recursive",a.classList.add("form-check-input");const r=document.createElement("label");r.classList.add("form-check-label"),r.htmlFor="undo-recursive",r.textContent=TYPO3.lang["modal.undo.recursive"],n.append(a,r),e.append(t,n),i=e}else{const e=document.createElement("p");e.textContent=s,i=e}Modal.advanced({title:TYPO3.lang["modal.undo.header"],content:i,severity:SeverityEnum.ok,staticBackdrop:!0,buttons:[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){Modal.dismiss()}},{text:TYPO3.lang["button.undo"],btnClass:"btn-success",action:new DeferredAction((()=>{this.callAjaxAction("undo","object"==typeof r?r:[r],a,i.querySelector("#undo-recursive")?.checked)}))}]})}async callAjaxAction(e,t,n,a=!1){const r={records:t,action:""};let s=!1;if("undo"===e)r.action="undoRecords",r.recursive=a?1:0,s=!0;else{if("delete"!==e)return null;r.action="deleteRecords"}return NProgress.start(),new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).post(r).then((async e=>{const t=await e.resolve();return t.success?Notification.success("",t.message):Notification.error("",t.message),this.paging.currentPage=1,this.loadAvailableTables().then((()=>{this.loadDeletedElements(),n&&this.resetMassActionButtons(),s&&Recycler.refreshPageTree()})),e}))}createMessage(e,t){return void 0===e?"":e.replace(/\{([0-9]+)\}/g,(function(e,n){return t[n]}))}buildPaginator(e){const t=document.querySelector(Identifiers.paginator);if(0===e)return void t.replaceChildren();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/this.paging.itemsPerPage),1===this.paging.totalPages)return void t.replaceChildren();const n=document.createElement("typo3-backend-pagination");n.paging=this.paging,t.replaceChildren(n)}}export default new Recycler; \ No newline at end of file +import DocumentService from"@typo3/core/document-service.js";import NProgress from"nprogress";import"@typo3/backend/input/clearable.js";import"@typo3/backend/element/icon-element.js";import"@typo3/backend/element/pagination.js";import DeferredAction from"@typo3/backend/action-button/deferred-action.js";import Modal from"@typo3/backend/modal.js";import Notification from"@typo3/backend/notification.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import RegularEvent from"@typo3/core/event/regular-event.js";import AjaxRequest from"@typo3/core/ajax/ajax-request.js";var Identifiers;!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]"}(Identifiers||(Identifiers={}));class Recycler{constructor(){this.paging={currentPage:1,totalPages:1,totalItems:0,itemsPerPage:parseInt(TYPO3.settings.Recycler.pagingSize,10)},this.markedRecordsForMassAction=[],DocumentService.ready().then((()=>{this.initialize()}))}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}registerEvents(){new RegularEvent("submit",(e=>{e.preventDefault();""!==document.querySelector(Identifiers.searchText).value&&this.loadDeletedElements()})).delegateTo(document,Identifiers.searchForm),new RegularEvent("keyup",(e=>{const t=e.target,n=document.querySelector(Identifiers.searchSubmitBtn);""!==t.value?n.disabled=!1:(n.disabled=!0,this.loadDeletedElements())})).delegateTo(document,Identifiers.searchText),new RegularEvent("change",(()=>{this.loadAvailableTables().then((()=>{this.loadDeletedElements()}))})).delegateTo(document,Identifiers.depthSelector),new RegularEvent("change",(()=>{this.paging.currentPage=1,this.loadDeletedElements()})).delegateTo(document,Identifiers.tableSelector),new RegularEvent("click",this.undoRecord.bind(this)).delegateTo(document,Identifiers.undo),new RegularEvent("click",this.deleteRecord.bind(this)).delegateTo(document,Identifiers.delete),new RegularEvent("click",(e=>{e.preventDefault(),this.loadAvailableTables().then((()=>{this.loadDeletedElements()}))})).delegateTo(document,Identifiers.reloadAction),document.querySelector(Identifiers.searchText).clearable({onClear:()=>{document.querySelector(Identifiers.searchSubmitBtn).disabled=!0,this.loadDeletedElements()}}),new RegularEvent("click",(e=>{e.preventDefault();const t=e.target.closest("button");t&&("previous"===t.dataset.action?this.paging.currentPage>1&&this.paging.currentPage--:"next"===t.dataset.action?this.paging.currentPage<this.paging.totalPages&&this.paging.currentPage++:"page"===t.dataset.action&&(this.paging.currentPage=parseInt(t.querySelector("span").textContent,10)),this.loadDeletedElements())})).delegateTo(document,Identifiers.paginator),TYPO3.settings.Recycler.deleteDisable?document.querySelector(Identifiers.massDelete).remove():document.querySelector(Identifiers.massDelete).style.display="block",new RegularEvent("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged.bind(this)).bindTo(document),new RegularEvent("multiRecordSelection:action:massundo",this.undoRecord.bind(this)).bindTo(document),new RegularEvent("multiRecordSelection:action:massdelete",this.deleteRecord.bind(this)).bindTo(document)}initialize(){NProgress.configure({parent:".module-loading-indicator",showSpinner:!1}),this.registerEvents(),TYPO3.settings.Recycler.depthSelection>0&&(document.querySelector(Identifiers.depthSelector).value=String(TYPO3.settings.Recycler.depthSelection)),this.loadAvailableTables().then((()=>{this.loadDeletedElements()}))}handleCheckboxStateChanged(e){const t=e.target,n=t.closest("tr"),a=n.dataset.table+":"+n.dataset.uid;if(t.checked)this.markedRecordsForMassAction.push(a);else{const e=this.markedRecordsForMassAction.indexOf(a);e>-1&&this.markedRecordsForMassAction.splice(e,1)}if(this.markedRecordsForMassAction.length>0){const e=document.querySelector(Identifiers.massUndo),t=document.querySelector(Identifiers.massDelete);e.querySelector("span.text").textContent=this.createMessage(TYPO3.lang["button.undoselected"],[this.markedRecordsForMassAction.length.toString(10)]),t.querySelector("span.text").textContent=this.createMessage(TYPO3.lang["button.deleteselected"],[this.markedRecordsForMassAction.length.toString(10)])}else this.resetMassActionButtons()}resetMassActionButtons(){const e=document.querySelector(Identifiers.massUndo),t=document.querySelector(Identifiers.massDelete);this.markedRecordsForMassAction=[],e.querySelector("span.text").textContent=TYPO3.lang["button.undo"],t.querySelector("span.text").textContent=TYPO3.lang["button.delete"],document.dispatchEvent(new CustomEvent("multiRecordSelection:actions:hide"))}async loadAvailableTables(){const e=document.querySelector(Identifiers.tableSelector),t=document.querySelector(Identifiers.depthSelector);return NProgress.start(),e.value="",this.paging.currentPage=1,new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).withQueryArguments({action:"getTables",startUid:TYPO3.settings.Recycler.startUid,depth:t.value}).get().then((async t=>{const n=await t.resolve(),a=[];e.replaceChildren();for(const e of n){const t=e[0],n=e[1],r=(e[2]?e[2]:TYPO3.lang.label_allrecordtypes)+" ("+n+")",s=document.createElement("option");s.value=t,s.textContent=r,a.push(s)}return a.length>0&&(e.append(...a),""!==TYPO3.settings.Recycler.tableSelection&&(e.value=TYPO3.settings.Recycler.tableSelection)),t})).finally((()=>NProgress.done()))}async loadDeletedElements(){const e=document.querySelector(Identifiers.depthSelector),t=document.querySelector(Identifiers.tableSelector),n=document.querySelector(Identifiers.searchText);return NProgress.start(),this.resetMassActionButtons(),new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).withQueryArguments({action:"getDeletedRecords",depth:e.value,startUid:TYPO3.settings.Recycler.startUid,table:t.value,filterTxt:n.value,start:(this.paging.currentPage-1)*this.paging.itemsPerPage,limit:this.paging.itemsPerPage}).get().then((async e=>{const t=document.querySelector(`${Identifiers.recyclerTable} tbody`),n=await e.resolve();return t.innerHTML=n.rows,this.buildPaginator(n.totalItems),e})).finally((()=>NProgress.done()))}deleteRecord(e,t){if(TYPO3.settings.Recycler.deleteDisable)return;const n=(t||e.target).closest("tr"),a=null===n||"TBODY"!==n.parentElement.tagName;let r,s;if(a)r=this.markedRecordsForMassAction,s=TYPO3.lang["modal.massdelete.text"];else{const e=n.dataset.uid,t=n.dataset.table,a=n.dataset.recordtitle;r=[t+":"+e],s="pages"===t?TYPO3.lang["modal.deletepage.text"]:TYPO3.lang["modal.deletecontent.text"],s=this.createMessage(s,[a,"["+r[0]+"]"])}Modal.advanced({title:TYPO3.lang["modal.delete.header"],content:s,severity:SeverityEnum.error,staticBackdrop:!0,buttons:[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){Modal.dismiss()}},{text:TYPO3.lang["button.delete"],btnClass:"btn-danger",action:new DeferredAction((()=>{this.callAjaxAction("delete",r,a)}))}]})}undoRecord(e,t){const n=(t||e.target).closest("tr"),a=null===n||"TBODY"!==n.parentElement.tagName;let r,s,o;if(a)r=this.markedRecordsForMassAction,s=TYPO3.lang["modal.massundo.text"],o=!0;else{const e=n.dataset.uid,t=n.dataset.table,a=n.dataset.recordtitle;r=[t+":"+e],o="pages"===t,s=o?TYPO3.lang["modal.undopage.text"]:TYPO3.lang["modal.undocontent.text"],s=this.createMessage(s,[a,"["+r[0]+"]"]),o&&n.dataset.parentDeleted&&(s+=TYPO3.lang["modal.undo.parentpages"])}let i=null;if(o){const e=document.createElement("div"),t=document.createElement("p");t.textContent=s;const n=document.createElement("div");n.classList.add("form-check");const a=document.createElement("input");a.type="checkbox",a.id="undo-recursive",a.classList.add("form-check-input");const r=document.createElement("label");r.classList.add("form-check-label"),r.htmlFor="undo-recursive",r.textContent=TYPO3.lang["modal.undo.recursive"],n.append(a,r),e.append(t,n),i=e}else{const e=document.createElement("p");e.textContent=s,i=e}Modal.advanced({title:TYPO3.lang["modal.undo.header"],content:i,severity:SeverityEnum.ok,staticBackdrop:!0,buttons:[{text:TYPO3.lang["button.cancel"],btnClass:"btn-default",trigger:function(){Modal.dismiss()}},{text:TYPO3.lang["button.undo"],btnClass:"btn-success",action:new DeferredAction((()=>{this.callAjaxAction("undo","object"==typeof r?r:[r],a,i.querySelector("#undo-recursive")?.checked)}))}]})}async callAjaxAction(e,t,n,a=!1){const r={records:t,action:""};let s=!1;if("undo"===e)r.action="undoRecords",r.recursive=a?1:0,s=!0;else{if("delete"!==e)return null;r.action="deleteRecords"}return NProgress.start(),new AjaxRequest(TYPO3.settings.ajaxUrls.recycler).post(r).then((async e=>{const t=await e.resolve();return t.success?Notification.success("",t.message):Notification.error("",t.message),this.paging.currentPage=1,this.loadAvailableTables().then((()=>{this.loadDeletedElements(),n&&this.resetMassActionButtons(),s&&Recycler.refreshPageTree()})),e}))}createMessage(e,t){return void 0===e?"":e.replace(/\{([0-9]+)\}/g,(function(e,n){return t[n]}))}buildPaginator(e){const t=document.querySelector(Identifiers.paginator);if(0===e)return void t.replaceChildren();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/this.paging.itemsPerPage),1===this.paging.totalPages)return void t.replaceChildren();const n=document.createElement("typo3-backend-pagination");n.paging=this.paging,t.replaceChildren(n)}}export default new Recycler; \ No newline at end of file -- GitLab