diff --git a/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts index 84ad97029ad29a54ff7d9198728cf4b2800327f1..8d38b0e190f66c40a9576b3fe8afef2902bc35cf 100644 --- a/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts +++ b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts @@ -1,8 +1,25 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse'; import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest'); import NotificationService = require('TYPO3/CMS/Backend/Notification'); import DeferredAction = require('TYPO3/CMS/Backend/ActionButton/DeferredAction'); +/** + * Module: TYPO3/CMS/Redirects/EventHandler + * @exports TYPO3/CMS/Redirects/EventHandler + */ class EventHandler { public constructor() { document.addEventListener( diff --git a/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/RedirectsModule.ts b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/RedirectsModule.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f308674d6c680a985a6d0d86766d33b9d301211 --- /dev/null +++ b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/RedirectsModule.ts @@ -0,0 +1,56 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent'); + +/** + * Module: TYPO3/CMS/Redirects/RedirectsModule + * @exports TYPO3/CMS/Redirects/RedirectsModule + */ +class RedirectsModule { + public constructor() { + const filterForm: HTMLFormElement = document.querySelector('form[data-on-submit="processNavigate"]'); + if (filterForm !== null) { + new RegularEvent('change', this.executeSubmit.bind(this)) + .delegateTo(document, '[data-on-change="submit"]'); + new RegularEvent('submit', this.processNavigate.bind(this)) + .bindTo(filterForm); + } + } + + private executeSubmit(evt: Event, target: Element): void { + if (target instanceof HTMLSelectElement) { + target.form.submit(); + } + } + + private processNavigate(evt: Event, target: Element): void { + if (!(target instanceof HTMLFormElement)) { + return; + } + evt.preventDefault(); + const formField = target.elements.namedItem('paginator-target-page') as HTMLInputElement; + const numberOfPages = parseInt(formField.dataset.numberOfPages, 10); + let url = formField.dataset.url; + let page = parseInt(formField.value, 10); + if (page > numberOfPages) { + page = numberOfPages; + } else if (page < 1) { + page = 1; + } + url = url.replace('987654322', page.toString()); + self.location.href = url; + } +} + +export = new RedirectsModule(); diff --git a/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts b/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts index 46f3fd2897fd54c75228c05fa8d6bce5f270c9d1..8d86fd0fee67f8a23218d765b79437f7bd8f8607 100644 --- a/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts +++ b/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts @@ -163,6 +163,13 @@ class Scheduler { this.actOnChangeSchedulerTableGarbageCollectionTable($(evt.currentTarget)); }); + $('[data-update-task-frequency]').change((evt: JQueryEventObject): void => { + const $target = $(evt.currentTarget); + const $taskFrequency = $('#task_frequency'); + $taskFrequency.val($target.val()); + $target.val($target.attr('value')).blur(); + }); + const taskGroupTable = document.querySelector('table.taskGroup-table'); if (taskGroupTable !== null) { new Tablesort(taskGroupTable); diff --git a/typo3/sysext/redirects/Classes/Controller/ManagementController.php b/typo3/sysext/redirects/Classes/Controller/ManagementController.php index b8b506d3bb9963010018aae2468fcff5696c7211..0e18c89801f53fd8c2fda418670ca7a22df562fa 100644 --- a/typo3/sysext/redirects/Classes/Controller/ManagementController.php +++ b/typo3/sysext/redirects/Classes/Controller/ManagementController.php @@ -69,6 +69,7 @@ class ManagementController { $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class); $this->moduleTemplate->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/Modal'); + $this->moduleTemplate->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Redirects/RedirectsModule'); $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class); $this->getLanguageService()->includeLLFile('EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf'); } diff --git a/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php b/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php index e1fb8f8341c42ecca7a814a730d61774b13fe1df..0ece0b44f54b5bd507a94f61085d2d7e829ebc76 100644 --- a/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php +++ b/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php @@ -26,6 +26,7 @@ class SourceHost { /** * JavaScript code for client side validation/evaluation + * (invoked by FormEngine when editing redirect entities) * * @return string JavaScript code for client side validation/evaluation */ diff --git a/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html b/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html index 1e9136411f609490daf3c8ea833966a88762090a..f7c484a845fe996c703315db8893cc13b86133d2 100644 --- a/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html +++ b/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html @@ -1,23 +1,6 @@ <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> -<script> - function goToPage(formObject) { - var formField = formObject.elements['paginator-target-page']; - var url = formField.dataset.url; - var numberOfPages = parseInt(formField.dataset.numberOfPages); - var page = parseInt(formField.value); - if (page > numberOfPages) { - page = numberOfPages; - } else if (page < 1) { - page = 1; - } - url = url.replace('987654322', page); - self.location.href = url; - return false; - } -</script> - <nav class="pagination-wrap"> <ul class="pagination pagination-block"> <f:if condition="{pagination.hasLessPages}"> @@ -58,7 +41,7 @@ <f:variable name="gotToPageUrl"> <f:be.uri route="site_redirects" parameters="{action: 'overview', demand: demand.parameters, page: 987654322}" /> </f:variable> - <form onsubmit="return goToPage(this);" style="display:inline;"> + <form data-on-submit="processNavigate" style="display:inline;"> <f:form.textfield additionalAttributes="{min: 1, max: pagination.numberOfPages}" data="{number-of-pages: pagination.numberOfPages, url: gotToPageUrl}" diff --git a/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html b/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html index 7f6b557069752fb5a41df6082995acc6d14a3387..afe3cdb427dfc9c17020a1c652257f54cf8eea8c 100644 --- a/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html +++ b/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html @@ -9,7 +9,6 @@ </f:section> <f:section name="content"> - <f:if condition="{redirects -> f:count()}"> <f:then> <f:render section="filter" arguments="{_all}" /> @@ -160,7 +159,7 @@ <div class="form-group"> <label for="demand-source-host"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:source_host"/></label> - <select id="demand-source-host" class="form-control input-sm" name="demand[source_host]" onchange="submit()"> + <select id="demand-source-host" class="form-control input-sm" name="demand[source_host]" data-on-change="submit"> <option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option> <f:for each="{hosts}" as="host"> <f:form.select.option value="{host.name}" selected="{host.name} === {demand.sourceHost}">{host.name}</f:form.select.option> @@ -177,7 +176,7 @@ </div> <div class="form-group"> <label for="demand-target-status-code"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.targetStatusCode"/></label> - <select id="demand-target-status-code" class="form-control input-sm" name="demand[target_statuscode]" onchange="submit()"> + <select id="demand-target-status-code" class="form-control input-sm" name="demand[target_statuscode]" data-on-change="submit"> <option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option> <f:for each="{statusCodes}" as="statusCode"> <f:form.select.option value="{statusCode.code}" selected="{statusCode.code} === {demand.statusCode}">{statusCode.code}</f:form.select.option> diff --git a/typo3/sysext/redirects/Resources/Public/JavaScript/RedirectsModule.js b/typo3/sysext/redirects/Resources/Public/JavaScript/RedirectsModule.js new file mode 100644 index 0000000000000000000000000000000000000000..3aada9b73044e40ace740c4335e6784891805077 --- /dev/null +++ b/typo3/sysext/redirects/Resources/Public/JavaScript/RedirectsModule.js @@ -0,0 +1,13 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ +define(["require","exports","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,n){"use strict";return new class{constructor(){const e=document.querySelector('form[data-on-submit="processNavigate"]');null!==e&&(new n("change",this.executeSubmit.bind(this)).delegateTo(document,'[data-on-change="submit"]'),new n("submit",this.processNavigate.bind(this)).bindTo(e))}executeSubmit(e,t){t instanceof HTMLSelectElement&&t.form.submit()}processNavigate(e,t){if(!(t instanceof HTMLFormElement))return;e.preventDefault();const n=t.elements.namedItem("paginator-target-page"),a=parseInt(n.dataset.numberOfPages,10);let s=n.dataset.url,r=parseInt(n.value,10);r>a?r=a:r<1&&(r=1),s=s.replace("987654322",r.toString()),self.location.href=s}}})); \ No newline at end of file diff --git a/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php b/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php index 927de8e2f49be2f121a43595b18d5e803c39917d..96496dcf07132cc334aa0ccecf91f50a3197a1ae 100644 --- a/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php +++ b/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php @@ -1325,8 +1325,7 @@ class SchedulerModuleController $closeButton = $buttonBar->makeLinkButton() ->setTitle($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')) ->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-close', Icon::SIZE_SMALL)) - ->setOnClick('document.location=' . GeneralUtility::quoteJSvalue($this->moduleUri)) - ->setHref('#'); + ->setHref($this->moduleUri); $buttonBar->addButton($closeButton, ButtonBar::BUTTON_POSITION_LEFT, 2); // Save, SaveAndClose, SaveAndNew $saveButtonDropdown = $buttonBar->makeSplitButton(); diff --git a/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html b/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html index a65bf638ba6d75313378c119230b909051501206..0616126a82f4c5a4ffc6fdd2d8098597e707b99a 100644 --- a/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html +++ b/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html @@ -105,8 +105,8 @@ <div class="form-wizards-items-aside"> <div class="btn-group"> <select - class="form-control tceforms-select tceforms-wizardselect" - onchange="document.getElementById('task_frequency').value=this.options[this.selectedIndex].value;this.blur();this.selectedIndex=0;"> + data-update-task-frequency + class="form-control tceforms-select tceforms-wizardselect"> <option></option> <f:for each="{frequencyOptions}" as="label" key="command"> <option value="{command}">{f:translate(key:label,default:label)} ({command})</option> diff --git a/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js b/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js index d2f3296a524169b97bc27cb6cdee7734f5045a86..a6dca43a80a08f6177d97579e1938404a027338e 100644 --- a/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js +++ b/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/DocumentSaveActions","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Utility/MessageUtility","tablesort"],(function(e,t,a,l,s,r){"use strict";class i{constructor(){this.allCheckedStatus=!1,this.actOnChangedTaskClass=e=>{let t=e.val();t=t.toLowerCase().replace(/\\/g,"-"),a(".extraFields").hide(),a(".extra_fields_"+t).show()},this.actOnChangedTaskType=e=>{this.toggleFieldsByTaskType(a(e.currentTarget).val())},this.actOnChangeSchedulerTableGarbageCollectionAllTables=e=>{let t=a("#task_tableGarbageCollection_numberOfDays"),l=a("#task_tableGarbageCollection_table");if(e.prop("checked"))l.prop("disabled",!0),t.prop("disabled",!0);else{let e=parseInt(t.val(),10);if(e<1){let t=l.val();void 0!==defaultNumberOfDays[t]&&(e=defaultNumberOfDays[t])}l.prop("disabled",!1),e>0&&t.prop("disabled",!1)}},this.actOnChangeSchedulerTableGarbageCollectionTable=e=>{let t=a("#task_tableGarbageCollection_numberOfDays");defaultNumberOfDays[e.val()]>0?(t.prop("disabled",!1),t.val(defaultNumberOfDays[e.val()])):(t.prop("disabled",!0),t.val(0))},this.checkOrUncheckAllCheckboxes=e=>(e.parents(".tx_scheduler_mod1_table").find(":checkbox").prop("checked",!this.allCheckedStatus),this.allCheckedStatus=!this.allCheckedStatus,!1),this.toggleFieldsByTaskType=e=>{e=parseInt(e+"",10),a("#task_end_col").toggle(2===e),a("#task_frequency_row").toggle(2===e)},this.toggleTaskGroups=e=>{let t=e.data("task-group-id");a("#recordlist-task-group-"+t).collapse("toggle")},this.initializeEvents=()=>{a(".checkall").on("click",e=>{this.checkOrUncheckAllCheckboxes(a(e.currentTarget))}),a("#task_class").change(e=>{this.actOnChangedTaskClass(a(e.currentTarget))}),a("#task_type").change(this.actOnChangedTaskType),a("#task_tableGarbageCollection_allTables").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionAllTables(a(e.currentTarget))}),a("#task_tableGarbageCollection_table").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionTable(a(e.currentTarget))});const e=document.querySelector("table.taskGroup-table");null!==e&&new Tablesort(e),a(document).on("click",".t3js-element-browser",e=>{e.preventDefault();const t=e.currentTarget;s.advanced({type:s.types.iframe,content:t.href+"&mode="+t.dataset.mode+"&bparams="+t.dataset.params,size:s.sizes.large})}),window.addEventListener("message",this.listenOnElementBrowser)},this.initializeDefaultStates=()=>{let e=a("#task_type");e.length&&this.toggleFieldsByTaskType(e.val());let t=a("#task_class");t.length&&(this.actOnChangedTaskClass(t),i.updateElementBrowserTriggers())},this.listenOnElementBrowser=e=>{if(!r.MessageUtility.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;if("typo3:elementBrowser:elementAdded"===e.data.actionName){if(void 0===e.data.fieldName)throw"fieldName not defined in message";if(void 0===e.data.value)throw"value not defined in message";const t=e.data.value.split("_");document.querySelector('input[name="'+e.data.fieldName+'"]').value=t[1]}},this.initializeEvents(),this.initializeDefaultStates(),l.getInstance().addPreSubmitCallback(()=>{let e=a("#task_class").val();e=e.toLowerCase().replace(/\\/g,"-"),a(".extraFields").appendTo(a("#extraFieldsHidden")),a(".extra_fields_"+e).appendTo(a("#extraFieldsSection"))})}static updateElementBrowserTriggers(){document.querySelectorAll(".t3js-element-browser").forEach(e=>{const t=document.getElementById(e.dataset.triggerFor);e.dataset.params=t.name+"|||pages"})}}return new i})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/DocumentSaveActions","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Utility/MessageUtility","tablesort"],(function(e,a,t,l,s,r){"use strict";class n{constructor(){this.allCheckedStatus=!1,this.actOnChangedTaskClass=e=>{let a=e.val();a=a.toLowerCase().replace(/\\/g,"-"),t(".extraFields").hide(),t(".extra_fields_"+a).show()},this.actOnChangedTaskType=e=>{this.toggleFieldsByTaskType(t(e.currentTarget).val())},this.actOnChangeSchedulerTableGarbageCollectionAllTables=e=>{let a=t("#task_tableGarbageCollection_numberOfDays"),l=t("#task_tableGarbageCollection_table");if(e.prop("checked"))l.prop("disabled",!0),a.prop("disabled",!0);else{let e=parseInt(a.val(),10);if(e<1){let a=l.val();void 0!==defaultNumberOfDays[a]&&(e=defaultNumberOfDays[a])}l.prop("disabled",!1),e>0&&a.prop("disabled",!1)}},this.actOnChangeSchedulerTableGarbageCollectionTable=e=>{let a=t("#task_tableGarbageCollection_numberOfDays");defaultNumberOfDays[e.val()]>0?(a.prop("disabled",!1),a.val(defaultNumberOfDays[e.val()])):(a.prop("disabled",!0),a.val(0))},this.checkOrUncheckAllCheckboxes=e=>(e.parents(".tx_scheduler_mod1_table").find(":checkbox").prop("checked",!this.allCheckedStatus),this.allCheckedStatus=!this.allCheckedStatus,!1),this.toggleFieldsByTaskType=e=>{e=parseInt(e+"",10),t("#task_end_col").toggle(2===e),t("#task_frequency_row").toggle(2===e)},this.toggleTaskGroups=e=>{let a=e.data("task-group-id");t("#recordlist-task-group-"+a).collapse("toggle")},this.initializeEvents=()=>{t(".checkall").on("click",e=>{this.checkOrUncheckAllCheckboxes(t(e.currentTarget))}),t("#task_class").change(e=>{this.actOnChangedTaskClass(t(e.currentTarget))}),t("#task_type").change(this.actOnChangedTaskType),t("#task_tableGarbageCollection_allTables").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionAllTables(t(e.currentTarget))}),t("#task_tableGarbageCollection_table").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionTable(t(e.currentTarget))}),t("[data-update-task-frequency]").change(e=>{const a=t(e.currentTarget);t("#task_frequency").val(a.val()),a.val(a.attr("value")).blur()});const e=document.querySelector("table.taskGroup-table");null!==e&&new Tablesort(e),t(document).on("click",".t3js-element-browser",e=>{e.preventDefault();const a=e.currentTarget;s.advanced({type:s.types.iframe,content:a.href+"&mode="+a.dataset.mode+"&bparams="+a.dataset.params,size:s.sizes.large})}),window.addEventListener("message",this.listenOnElementBrowser)},this.initializeDefaultStates=()=>{let e=t("#task_type");e.length&&this.toggleFieldsByTaskType(e.val());let a=t("#task_class");a.length&&(this.actOnChangedTaskClass(a),n.updateElementBrowserTriggers())},this.listenOnElementBrowser=e=>{if(!r.MessageUtility.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;if("typo3:elementBrowser:elementAdded"===e.data.actionName){if(void 0===e.data.fieldName)throw"fieldName not defined in message";if(void 0===e.data.value)throw"value not defined in message";const a=e.data.value.split("_");document.querySelector('input[name="'+e.data.fieldName+'"]').value=a[1]}},this.initializeEvents(),this.initializeDefaultStates(),l.getInstance().addPreSubmitCallback(()=>{let e=t("#task_class").val();e=e.toLowerCase().replace(/\\/g,"-"),t(".extraFields").appendTo(t("#extraFieldsHidden")),t(".extra_fields_"+e).appendTo(t("#extraFieldsSection"))})}static updateElementBrowserTriggers(){document.querySelectorAll(".t3js-element-browser").forEach(e=>{const a=document.getElementById(e.dataset.triggerFor);e.dataset.params=a.name+"|||pages"})}}return new n})); \ No newline at end of file