# HG changeset patch # User Edouard Tisserant # Date 1613641390 -3600 # Node ID 5a1bb6ec48a0ab34f5561f60e7625cc1096f691f # Parent d32e6246cd59f74aa784b52fd9180178263c872a SVGHMI: JsonTable removed useless promise since fetch() already does one. Updated generated XSLT. diff -r d32e6246cd59 -r 5a1bb6ec48a0 svghmi/gen_index_xhtml.xslt --- 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(() => { +</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]) => { +</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> diff -r d32e6246cd59 -r 5a1bb6ec48a0 svghmi/widget_jsontable.ysl2 --- 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){