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