From b5637aea31ea648e174e1a2b58c706eff8152a5e Mon Sep 17 00:00:00 2001 From: Oliver Hader <oliver@typo3.org> Date: Sat, 18 Apr 2020 14:04:17 +0200 Subject: [PATCH] [TASK] Reduce inline JavaScript in QueryView MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change aims to reduce the amount of inline JavaScript by moving these parts to dedicated static JavaScript modules or using native HTML functionality instead of location.href. * unused properties in QueryView have been removed * onclick event on a submit button does not have any effect since the onsubmit event is handled first - corresponding code has been removed as well Resolves: #91111 Releases: master Change-Id: I51263b5cd71109d9a28d4edf3cb0b95097aab6b6 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64230 Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Benni Mack <benni@typo3.org> Tested-by: Josef Glatz <josefglatz@gmail.com> Tested-by: Frank Nägler <frank.naegler@typo3.org> Reviewed-by: Benni Mack <benni@typo3.org> Reviewed-by: Josef Glatz <josefglatz@gmail.com> Reviewed-by: Frank Nägler <frank.naegler@typo3.org> --- .../Public/TypeScript/QueryGenerator.ts | 9 +++++++++ .../sysext/core/Classes/Database/QueryView.php | 17 ++--------------- .../Public/JavaScript/QueryGenerator.js | 2 +- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/Build/Sources/TypeScript/lowlevel/Resources/Public/TypeScript/QueryGenerator.ts b/Build/Sources/TypeScript/lowlevel/Resources/Public/TypeScript/QueryGenerator.ts index f37ffe7b61fe..946149c035c0 100644 --- a/Build/Sources/TypeScript/lowlevel/Resources/Public/TypeScript/QueryGenerator.ts +++ b/Build/Sources/TypeScript/lowlevel/Resources/Public/TypeScript/QueryGenerator.ts @@ -50,6 +50,15 @@ class QueryGenerator { const $field = $(e.currentTarget); this.addValueToField($field.data('field'), $field.val()); }); + this.form.on('change', '[data-assign-store-control-title]', (evt: JQueryEventObject): void => { + const $currentTarget = $(evt.currentTarget); + const $titleField = this.form.find('[name="storeControl\[title\]"]'); + if ($currentTarget.val() !== '0') { + $titleField.val($currentTarget.find('option:selected').text()); + } else { + $titleField.val(''); + } + }); (<NodeListOf<HTMLInputElement>>document.querySelectorAll('form[name="queryform"] .t3js-clearable')).forEach( (clearableField: HTMLInputElement) => clearableField.clearable({ onClear: (): void => { diff --git a/typo3/sysext/core/Classes/Database/QueryView.php b/typo3/sysext/core/Classes/Database/QueryView.php index 8c1ccd0dda47..07f8594a9822 100644 --- a/typo3/sysext/core/Classes/Database/QueryView.php +++ b/typo3/sysext/core/Classes/Database/QueryView.php @@ -45,16 +45,6 @@ class QueryView */ public $storeList = 'search_query_smallparts,search_result_labels,labels_noprefix,show_deleted,queryConfig,queryTable,queryFields,queryLimit,queryOrder,queryOrderDesc,queryOrder2,queryOrder2Desc,queryGroup,search_query_makeQuery'; - /** - * @var string - */ - public $downloadScript = 'index.php'; - - /** - * @var int - */ - public $formW = 48; - /** * @var int */ @@ -173,9 +163,7 @@ class QueryView $markup[] = '<div class="load-queries">'; $markup[] = ' <div class="form-inline">'; $markup[] = ' <div class="form-group">'; - $markup[] = ' <select class="form-control" name="storeControl[STORE]" onChange="document.forms[0]' - . '[\'storeControl[title]\'].value= this.options[this.selectedIndex].value!=0 ' - . '? this.options[this.selectedIndex].text : \'\';">' . implode(LF, $opt) . '</select>'; + $markup[] = ' <select class="form-control" name="storeControl[STORE]" data-assign-store-control-title>' . implode(LF, $opt) . '</select>'; $markup[] = ' <input class="form-control" name="storeControl[title]" value="" type="text" max="80">'; $markup[] = ' <input class="btn btn-default" type="submit" name="storeControl[LOAD]" value="Load">'; $markup[] = ' <input class="btn btn-default" type="submit" name="storeControl[SAVE]" value="Save">'; @@ -546,8 +534,7 @@ class QueryView . '</textarea>'; if (!$this->noDownloadB) { $out .= '<br><input class="btn btn-default" type="submit" name="download_file" ' - . 'value="Click to download file" onClick="window.location.href=' . htmlspecialchars(GeneralUtility::quoteJSvalue($this->downloadScript)) - . ';">'; + . 'value="Click to download file">'; } // Downloads file: // @todo: args. routing anyone? diff --git a/typo3/sysext/lowlevel/Resources/Public/JavaScript/QueryGenerator.js b/typo3/sysext/lowlevel/Resources/Public/JavaScript/QueryGenerator.js index ec9717891181..240ad496af76 100644 --- a/typo3/sysext/lowlevel/Resources/Public/JavaScript/QueryGenerator.js +++ b/typo3/sysext/lowlevel/Resources/Public/JavaScript/QueryGenerator.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports","jquery","TYPO3/CMS/Backend/Input/Clearable"],(function(t,i,e){"use strict";return new class{constructor(){this.form=null,this.limitField=null,this.initialize()}initialize(){this.form=e('form[name="queryform"]'),this.limitField=e("#queryLimit"),this.form.on("click",".t3js-submit-click",t=>{t.preventDefault(),this.doSubmit()}),this.form.on("change",".t3js-submit-change",t=>{t.preventDefault(),this.doSubmit()}),this.form.on("click",'.t3js-limit-submit input[type="button"]',t=>{t.preventDefault(),this.setLimit(e(t.currentTarget).data("value")),this.doSubmit()}),this.form.on("click",".t3js-addfield",t=>{t.preventDefault();const i=e(t.currentTarget);this.addValueToField(i.data("field"),i.val())}),document.querySelectorAll('form[name="queryform"] .t3js-clearable').forEach(t=>t.clearable({onClear:()=>{this.doSubmit()}}))}doSubmit(){this.form.submit()}setLimit(t){this.limitField.val(t)}addValueToField(t,i){const e=this.form.find('[name="'+t+'"]'),l=e.val();e.val(l+","+i)}}})); \ No newline at end of file +define(["require","exports","jquery","TYPO3/CMS/Backend/Input/Clearable"],(function(t,i,e){"use strict";return new class{constructor(){this.form=null,this.limitField=null,this.initialize()}initialize(){this.form=e('form[name="queryform"]'),this.limitField=e("#queryLimit"),this.form.on("click",".t3js-submit-click",t=>{t.preventDefault(),this.doSubmit()}),this.form.on("change",".t3js-submit-change",t=>{t.preventDefault(),this.doSubmit()}),this.form.on("click",'.t3js-limit-submit input[type="button"]',t=>{t.preventDefault(),this.setLimit(e(t.currentTarget).data("value")),this.doSubmit()}),this.form.on("click",".t3js-addfield",t=>{t.preventDefault();const i=e(t.currentTarget);this.addValueToField(i.data("field"),i.val())}),this.form.on("change","[data-assign-store-control-title]",t=>{const i=e(t.currentTarget),l=this.form.find('[name="storeControl[title]"]');"0"!==i.val()?l.val(i.find("option:selected").text()):l.val("")}),document.querySelectorAll('form[name="queryform"] .t3js-clearable').forEach(t=>t.clearable({onClear:()=>{this.doSubmit()}}))}doSubmit(){this.form.submit()}setLimit(t){this.limitField.val(t)}addValueToField(t,i){const e=this.form.find('[name="'+t+'"]'),l=e.val();e.val(l+","+i)}}})); \ No newline at end of file -- GitLab