SVGHMI: JsonTable removed useless promise since fetch() already does one. Updated generated XSLT. svghmi
authorEdouard Tisserant
Thu, 18 Feb 2021 10:43:10 +0100
branchsvghmi
changeset 3150 5a1bb6ec48a0
parent 3149 d32e6246cd59
child 3151 8e5d383a58cb
SVGHMI: JsonTable removed useless promise since fetch() already does one. Updated generated XSLT.
svghmi/gen_index_xhtml.xslt
svghmi/widget_jsontable.ysl2
--- a/svghmi/gen_index_xhtml.xslt	Thu Feb 18 05:39:46 2021 +0100
+++ b/svghmi/gen_index_xhtml.xslt	Thu Feb 18 10:43:10 2021 +0100
@@ -974,11 +974,13 @@
     <xsl:text>
 </xsl:text>
     <xsl:variable name="translations" select="ns:GetTranslations($translatable_strings)"/>
-    <xsl:text>var langs = [ "default",</xsl:text>
+    <xsl:text>var langs = [ ["Default", "C"],</xsl:text>
     <xsl:for-each select="$translations/langs/lang">
-      <xsl:text>"</xsl:text>
+      <xsl:text>["</xsl:text>
       <xsl:value-of select="."/>
-      <xsl:text>"</xsl:text>
+      <xsl:text>","</xsl:text>
+      <xsl:value-of select="@code"/>
+      <xsl:text>"]</xsl:text>
       <xsl:if test="position()!=last()">
         <xsl:text>,</xsl:text>
       </xsl:if>
@@ -4502,6 +4504,12 @@
 </xsl:text>
     <xsl:text>        this.spread_json_data_bound = this.spread_json_data.bind(this);
 </xsl:text>
+    <xsl:text>        this.handle_http_response_bound = this.handle_http_response.bind(this);
+</xsl:text>
+    <xsl:text>        this.fetch_error_bound = this.fetch_error.bind(this);
+</xsl:text>
+    <xsl:text>        this.promised = false;
+</xsl:text>
     <xsl:text>    }
 </xsl:text>
     <xsl:text>
@@ -4520,8 +4528,18 @@
 </xsl:text>
     <xsl:text>
 </xsl:text>
+    <xsl:text>    fetch_error(e){
+</xsl:text>
+    <xsl:text>        console.log("HTTP fetch error, message = " + e.message + "Widget:" + this.element_id);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
     <xsl:text>    do_http_request(...opt) {
 </xsl:text>
+    <xsl:text>        this.abort_controller = new AbortController();
+</xsl:text>
     <xsl:text>        const query = {
 </xsl:text>
     <xsl:text>            args: this.args,
@@ -4546,27 +4564,61 @@
 </xsl:text>
     <xsl:text>             body: JSON.stringify(query),
 </xsl:text>
-    <xsl:text>             headers: {'Content-Type': 'application/json'}
+    <xsl:text>             headers: {'Content-Type': 'application/json'},
+</xsl:text>
+    <xsl:text>             signal: this.abort_controller.signal
 </xsl:text>
     <xsl:text>        };
 </xsl:text>
     <xsl:text>
 </xsl:text>
-    <xsl:text>        fetch(this.args[0], options)
-</xsl:text>
-    <xsl:text>            .then(this.handle_http_response)
-</xsl:text>
-    <xsl:text>            .then(this.spread_json_data_bound);
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    }
+    <xsl:text>        return fetch(this.args[0], options)
+</xsl:text>
+    <xsl:text>                .then(this.handle_http_response_bound)
+</xsl:text>
+    <xsl:text>                .then(this.spread_json_data_bound)
+</xsl:text>
+    <xsl:text>                .catch(this.fetch_error_bound);
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    unsub(){
+</xsl:text>
+    <xsl:text>        this.abort_controller.abort();
+</xsl:text>
+    <xsl:text>        super.unsub();
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
 </xsl:text>
     <xsl:text>    dispatch(value, oldval, index) {
 </xsl:text>
-    <xsl:text>        this.cache[index] = value;
-</xsl:text>
-    <xsl:text>        this.do_http_request();
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        if(this.cache[index] != value)
+</xsl:text>
+    <xsl:text>            this.cache[index] = value;
+</xsl:text>
+    <xsl:text>        else
+</xsl:text>
+    <xsl:text>            return;
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        if(!this.promised){
+</xsl:text>
+    <xsl:text>            this.promised = true;
+</xsl:text>
+    <xsl:text>            this.do_http_request().finally(() =&gt; {
+</xsl:text>
+    <xsl:text>                this.promised = false;
+</xsl:text>
+    <xsl:text>            });
+</xsl:text>
+    <xsl:text>        }
 </xsl:text>
     <xsl:text>    }
 </xsl:text>
@@ -4790,10 +4842,9 @@
     <xsl:param name="expressions"/>
     <xsl:param name="widget_elts"/>
     <xsl:param name="label"/>
-    <xsl:variable name="gid" select="@id"/>
     <xsl:variable name="varprefix">
       <xsl:text>obj_</xsl:text>
-      <xsl:value-of select="$gid"/>
+      <xsl:value-of select="@id"/>
       <xsl:text>_</xsl:text>
     </xsl:variable>
     <xsl:text>        try {
@@ -4811,13 +4862,6 @@
       <xsl:value-of select="position()"/>
       <xsl:text> == undefined) {
 </xsl:text>
-      <xsl:text>              console.log("</xsl:text>
-      <xsl:value-of select="$varprefix"/>
-      <xsl:value-of select="position()"/>
-      <xsl:text> = </xsl:text>
-      <xsl:value-of select="@content"/>
-      <xsl:text>");
-</xsl:text>
       <xsl:text>              throw null;
 </xsl:text>
       <xsl:text>         }
@@ -4847,7 +4891,7 @@
     <xsl:text>        } catch(err) {
 </xsl:text>
     <xsl:text>          id("</xsl:text>
-    <xsl:value-of select="$gid"/>
+    <xsl:value-of select="@id"/>
     <xsl:text>").style = "display:none";
 </xsl:text>
     <xsl:text>        }
@@ -4877,11 +4921,13 @@
 </xsl:text>
     <xsl:text>        let [range,position,jdata] = janswer;
 </xsl:text>
-    <xsl:text>        this.apply_hmi_value(1, range);
-</xsl:text>
-    <xsl:text>        this.apply_hmi_value(2, position);
-</xsl:text>
-    <xsl:text>        this.apply_hmi_value(3, this.visible);
+    <xsl:text>        [[1, range], [2, position], [3, this.visible]].map(([i,v]) =&gt; {
+</xsl:text>
+    <xsl:text>             this.apply_hmi_value(i,v);
+</xsl:text>
+    <xsl:text>             this.cache[i] = v;
+</xsl:text>
+    <xsl:text>        });
 </xsl:text>
     <xsl:apply-templates mode="json_table_render_except_comments" select="$data_elt">
       <xsl:with-param name="expressions" select="$initexpr_ns"/>
@@ -7171,67 +7217,89 @@
 </xsl:text>
           <xsl:text>function switch_langnum(langnum) {
 </xsl:text>
-          <xsl:text>    if(langnum == current_lang) {
-</xsl:text>
-          <xsl:text>        return;
+          <xsl:text>    langnum = Math.max(0, Math.min(langs.length - 1, langnum));
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    for (let translation of translations) {
+</xsl:text>
+          <xsl:text>        let [objs, msgs] = translation;
+</xsl:text>
+          <xsl:text>        let msg = msgs[langnum];
+</xsl:text>
+          <xsl:text>        for (let obj of objs) {
+</xsl:text>
+          <xsl:text>            multiline_to_svg_text(obj, msg);
+</xsl:text>
+          <xsl:text>            obj.setAttribute("lang",langnum);
+</xsl:text>
+          <xsl:text>        }
 </xsl:text>
           <xsl:text>    }
 </xsl:text>
-          <xsl:text>
-</xsl:text>
-          <xsl:text>    for (let translation of translations) {
-</xsl:text>
-          <xsl:text>        let [objs, msgs, orig] = translation;
-</xsl:text>
-          <xsl:text>        let msg = langnum == 0 ? orig : msgs[langnum - 1];
-</xsl:text>
-          <xsl:text>        for (let obj of objs) {
-</xsl:text>
-          <xsl:text>            multiline_to_svg_text(obj, msg);
-</xsl:text>
-          <xsl:text>            obj.setAttribute("lang",langnum);
-</xsl:text>
-          <xsl:text>        }
+          <xsl:text>    return langnum;
+</xsl:text>
+          <xsl:text>}
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>// backup original texts
+</xsl:text>
+          <xsl:text>for (let translation of translations) {
+</xsl:text>
+          <xsl:text>    let [objs, msgs] = translation;
+</xsl:text>
+          <xsl:text>    msgs.unshift(svg_text_to_multiline(objs[0])); 
+</xsl:text>
+          <xsl:text>}
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>var lang_local_index = hmi_local_index("lang");
+</xsl:text>
+          <xsl:text>var langcode_local_index = hmi_local_index("lang_code");
+</xsl:text>
+          <xsl:text>var langname_local_index = hmi_local_index("lang_name");
+</xsl:text>
+          <xsl:text>subscribers(lang_local_index).add({
+</xsl:text>
+          <xsl:text>    indexes: [lang_local_index],
+</xsl:text>
+          <xsl:text>    new_hmi_value: function(index, value, oldval) {
+</xsl:text>
+          <xsl:text>        let current_lang =  switch_langnum(value);
+</xsl:text>
+          <xsl:text>        let [langname,langcode] = langs[current_lang];
+</xsl:text>
+          <xsl:text>        apply_hmi_value(langcode_local_index, langcode);
+</xsl:text>
+          <xsl:text>        apply_hmi_value(langname_local_index, langname);
+</xsl:text>
+          <xsl:text>        switch_page();
 </xsl:text>
           <xsl:text>    }
 </xsl:text>
-          <xsl:text>    current_lang = langnum;
+          <xsl:text>});
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>function setup_lang(){
+</xsl:text>
+          <xsl:text>    let current_lang = cache[lang_local_index];
+</xsl:text>
+          <xsl:text>    let new_lang = switch_langnum(current_lang);
+</xsl:text>
+          <xsl:text>    if(current_lang != new_lang){
+</xsl:text>
+          <xsl:text>        apply_hmi_value(lang_local_index, new_lang);
+</xsl:text>
+          <xsl:text>    }
 </xsl:text>
           <xsl:text>}
 </xsl:text>
           <xsl:text>
 </xsl:text>
-          <xsl:text>// backup original texts
-</xsl:text>
-          <xsl:text>for (let translation of translations) {
-</xsl:text>
-          <xsl:text>    let [objs] = translation;
-</xsl:text>
-          <xsl:text>    translation.push(svg_text_to_multiline(objs[0])); 
-</xsl:text>
-          <xsl:text>}
-</xsl:text>
-          <xsl:text>
-</xsl:text>
-          <xsl:text>var lang_local_index = hmi_local_index("lang");
-</xsl:text>
-          <xsl:text>subscribers(lang_local_index).add({
-</xsl:text>
-          <xsl:text>    indexes: [lang_local_index],
-</xsl:text>
-          <xsl:text>    new_hmi_value: function(index, value, oldval) {
-</xsl:text>
-          <xsl:text>        switch_langnum(value);
-</xsl:text>
-          <xsl:text>        switch_page();
-</xsl:text>
-          <xsl:text>    }
-</xsl:text>
-          <xsl:text>});
-</xsl:text>
-          <xsl:text>var current_lang = 0;
-</xsl:text>
-          <xsl:text>switch_langnum(cache[lang_local_index]);
+          <xsl:text>setup_lang();
 </xsl:text>
           <xsl:text>
 </xsl:text>
--- a/svghmi/widget_jsontable.ysl2	Thu Feb 18 05:39:46 2021 +0100
+++ b/svghmi/widget_jsontable.ysl2	Thu Feb 18 10:43:10 2021 +0100
@@ -61,11 +61,9 @@
 
             if(!this.promised){
                 this.promised = true;
-                Promise.resolve().then(() => {
-                    return this.do_http_request().finally(() => {
-                        this.promised = false;
-                    });
-                })
+                this.do_http_request().finally(() => {
+                    this.promised = false;
+                });
             }
         }
         make_on_click(...options){