--- 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: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:value-of select="."/>
+ <xsl:text>","</xsl:text> + <xsl:value-of select="@code"/> + <xsl:text>"]</xsl:text> <xsl:if test="position()!=last()">
@@ -4502,6 +4504,12 @@
<xsl:text> this.spread_json_data_bound = this.spread_json_data.bind(this);
+ <xsl:text> this.handle_http_response_bound = this.handle_http_response.bind(this); + <xsl:text> this.fetch_error_bound = this.fetch_error.bind(this); + <xsl:text> this.promised = false; @@ -4520,8 +4528,18 @@
+ <xsl:text> fetch_error(e){ + <xsl:text> console.log("HTTP fetch error, message = " + e.message + "Widget:" + this.element_id); <xsl:text> do_http_request(...opt) {
+ <xsl:text> this.abort_controller = new AbortController(); <xsl:text> const query = {
<xsl:text> args: this.args,
@@ -4546,27 +4564,61 @@
<xsl:text> body: JSON.stringify(query),
- <xsl:text> headers: {'Content-Type': 'application/json'}
+ <xsl:text> headers: {'Content-Type': 'application/json'}, + <xsl:text> signal: this.abort_controller.signal - <xsl:text> fetch(this.args[0], options)
- <xsl:text> .then(this.handle_http_response)
- <xsl:text> .then(this.spread_json_data_bound);
+ <xsl:text> return fetch(this.args[0], options) + <xsl:text> .then(this.handle_http_response_bound) + <xsl:text> .then(this.spread_json_data_bound) + <xsl:text> .catch(this.fetch_error_bound); + <xsl:text> this.abort_controller.abort(); + <xsl:text> super.unsub(); <xsl:text> dispatch(value, oldval, index) {
- <xsl:text> this.cache[index] = value;
- <xsl:text> this.do_http_request();
+ <xsl:text> if(this.cache[index] != value) + <xsl:text> this.cache[index] = value; + <xsl:text> if(!this.promised){ + <xsl:text> this.promised = true; + <xsl:text> this.do_http_request().finally(() => { + <xsl:text> this.promised = false; @@ -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"/> @@ -4811,13 +4862,6 @@
<xsl:value-of select="position()"/>
<xsl:text> == undefined) {
- <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"/>
@@ -4847,7 +4891,7 @@
<xsl:text> } catch(err) {
<xsl:text> id("</xsl:text>
- <xsl:value-of select="$gid"/>
+ <xsl:value-of select="@id"/> <xsl:text>").style = "display:none";
@@ -4877,11 +4921,13 @@
<xsl:text> let [range,position,jdata] = janswer;
- <xsl:text> this.apply_hmi_value(1, range);
- <xsl:text> this.apply_hmi_value(2, position);
- <xsl:text> this.apply_hmi_value(3, this.visible);
+ <xsl:text> [[1, range], [2, position], [3, this.visible]].map(([i,v]) => { + <xsl:text> this.apply_hmi_value(i,v); + <xsl:text> this.cache[i] = v; <xsl:apply-templates mode="json_table_render_except_comments" select="$data_elt">
<xsl:with-param name="expressions" select="$initexpr_ns"/>
@@ -7171,19 +7217,15 @@
<xsl:text>function switch_langnum(langnum) {
- <xsl:text> if(langnum == current_lang) {
+ <xsl:text> langnum = Math.max(0, Math.min(langs.length - 1, langnum)); <xsl:text> for (let translation of translations) {
- <xsl:text> let [objs, msgs, orig] = translation;
- <xsl:text> let msg = langnum == 0 ? orig : msgs[langnum - 1];
+ <xsl:text> let [objs, msgs] = translation; + <xsl:text> let msg = msgs[langnum]; <xsl:text> for (let obj of objs) {
@@ -7195,7 +7237,7 @@
- <xsl:text> current_lang = langnum;
+ <xsl:text> return langnum; @@ -7205,9 +7247,9 @@
<xsl:text>for (let translation of translations) {
- <xsl:text> let [objs] = translation;
- <xsl:text> translation.push(svg_text_to_multiline(objs[0]));
+ <xsl:text> let [objs, msgs] = translation; + <xsl:text> msgs.unshift(svg_text_to_multiline(objs[0])); @@ -7215,13 +7257,23 @@
<xsl:text>var lang_local_index = hmi_local_index("lang");
+ <xsl:text>var langcode_local_index = hmi_local_index("lang_code"); + <xsl:text>var langname_local_index = hmi_local_index("lang_name"); <xsl:text>subscribers(lang_local_index).add({
<xsl:text> indexes: [lang_local_index],
<xsl:text> new_hmi_value: function(index, value, oldval) {
- <xsl:text> switch_langnum(value);
+ <xsl:text> let current_lang = switch_langnum(value); + <xsl:text> let [langname,langcode] = langs[current_lang]; + <xsl:text> apply_hmi_value(langcode_local_index, langcode); + <xsl:text> apply_hmi_value(langname_local_index, langname); <xsl:text> switch_page();
@@ -7229,9 +7281,25 @@
- <xsl:text>var current_lang = 0;
- <xsl:text>switch_langnum(cache[lang_local_index]);
+ <xsl:text>function setup_lang(){ + <xsl:text> let current_lang = cache[lang_local_index]; + <xsl:text> let new_lang = switch_langnum(current_lang); + <xsl:text> if(current_lang != new_lang){ + <xsl:text> apply_hmi_value(lang_local_index, new_lang); + <xsl:text>setup_lang(); --- 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 @@
- Promise.resolve().then(() => {
- return this.do_http_request().finally(() => {
+ this.do_http_request().finally(() => { make_on_click(...options){