@yuneta/gobj-ui 7.23.122 → 7.23.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gobj-ui.cjs.js +157 -123
- package/dist/gobj-ui.es.js +157 -123
- package/package.json +1 -1
- package/src/c_yui_form.js +9 -0
- package/src/c_yui_treedb_topic_with_form.js +9 -1
- package/src/yui_tabulator_i18n.js +41 -2
package/dist/gobj-ui.cjs.js
CHANGED
|
@@ -5892,6 +5892,157 @@ function register_c_yui_wizard() {
|
|
|
5892
5892
|
return create_gclass$17(GCLASS_NAME$17);
|
|
5893
5893
|
}
|
|
5894
5894
|
//#endregion
|
|
5895
|
+
//#region src/yui_tabulator_i18n.js
|
|
5896
|
+
/***********************************************************************
|
|
5897
|
+
* yui_tabulator_i18n.js
|
|
5898
|
+
*
|
|
5899
|
+
* The strings TABULATOR renders on its own — the paginator ("Page
|
|
5900
|
+
* Size", "First", "Prev", "Next", "Last"), the placeholder ("No Data
|
|
5901
|
+
* Available"), the loading/error notices — through the app's i18n.
|
|
5902
|
+
*
|
|
5903
|
+
* They are not built by any gclass, so nothing here or in an app ever
|
|
5904
|
+
* passed them through t(): a table sat in English inside an otherwise
|
|
5905
|
+
* Spanish view, and a language switch did not touch it.
|
|
5906
|
+
*
|
|
5907
|
+
* Two calls:
|
|
5908
|
+
*
|
|
5909
|
+
* new Tabulator($el, {..., ...yui_tabulator_lang(t)});
|
|
5910
|
+
* yui_tabulator_relocalize(table, t); // on a language change
|
|
5911
|
+
*
|
|
5912
|
+
* Every key carries an English `defaultValue`, so an app that does not
|
|
5913
|
+
* define it renders exactly what Tabulator rendered before — the
|
|
5914
|
+
* keys are an OPPORTUNITY to translate, never a requirement.
|
|
5915
|
+
*
|
|
5916
|
+
* Copyright (c) 2026, ArtGins.
|
|
5917
|
+
* All Rights Reserved.
|
|
5918
|
+
***********************************************************************/
|
|
5919
|
+
var __lang_seq__ = 0;
|
|
5920
|
+
function next_lang_name() {
|
|
5921
|
+
return `yui-${++__lang_seq__}`;
|
|
5922
|
+
}
|
|
5923
|
+
/***************************************************************
|
|
5924
|
+
* Tabulator's own strings, in the CURRENT language.
|
|
5925
|
+
*
|
|
5926
|
+
* ONE lang dict (not one per locale): the app owns the locales and hands us
|
|
5927
|
+
* only its live `t`, so a language change rebuilds the dict and re-applies
|
|
5928
|
+
* it under a fresh name (yui_tabulator_relocalize).
|
|
5929
|
+
***************************************************************/
|
|
5930
|
+
function yui_tabulator_lang(t) {
|
|
5931
|
+
let name = next_lang_name();
|
|
5932
|
+
let langs = {};
|
|
5933
|
+
langs[name] = tabulator_strings(t);
|
|
5934
|
+
return {
|
|
5935
|
+
locale: name,
|
|
5936
|
+
langs
|
|
5937
|
+
};
|
|
5938
|
+
}
|
|
5939
|
+
function tabulator_strings(t) {
|
|
5940
|
+
let tr = (key, def) => t(key, { defaultValue: def });
|
|
5941
|
+
return {
|
|
5942
|
+
data: {
|
|
5943
|
+
loading: tr("loading", "Loading"),
|
|
5944
|
+
error: tr("error", "Error")
|
|
5945
|
+
},
|
|
5946
|
+
pagination: {
|
|
5947
|
+
page_size: tr("page size", "Page Size"),
|
|
5948
|
+
page_title: tr("show page", "Show Page"),
|
|
5949
|
+
first: tr("first", "First"),
|
|
5950
|
+
first_title: tr("first page", "First Page"),
|
|
5951
|
+
last: tr("last", "Last"),
|
|
5952
|
+
last_title: tr("last page", "Last Page"),
|
|
5953
|
+
prev: tr("prev", "Prev"),
|
|
5954
|
+
prev_title: tr("prev page", "Prev Page"),
|
|
5955
|
+
next: tr("next", "Next"),
|
|
5956
|
+
next_title: tr("next page", "Next Page"),
|
|
5957
|
+
all: tr("all", "All")
|
|
5958
|
+
},
|
|
5959
|
+
headerFilters: { default: tr("filter column", "filter column...") }
|
|
5960
|
+
};
|
|
5961
|
+
}
|
|
5962
|
+
/***************************************************************
|
|
5963
|
+
* Put an EXISTING table in the current language: rebuild the strings and
|
|
5964
|
+
* re-apply the locale, which is what makes Tabulator re-render the parts
|
|
5965
|
+
* it owns (the paginator above all — it is drawn once, at build).
|
|
5966
|
+
*
|
|
5967
|
+
* Silent no-op on a table that is gone: a language switch races nothing,
|
|
5968
|
+
* but a view torn down mid-switch must not log a failure it cannot act on.
|
|
5969
|
+
***************************************************************/
|
|
5970
|
+
/***************************************************************
|
|
5971
|
+
* Name the HEADER FILTER inputs.
|
|
5972
|
+
*
|
|
5973
|
+
* Tabulator draws one text box per filterable column and gives
|
|
5974
|
+
* it nothing: no label, no `aria-label`, no placeholder. On
|
|
5975
|
+
* screen its position says what it filters -- it sits under the
|
|
5976
|
+
* column's title -- and to anything that is not an eye it is a
|
|
5977
|
+
* row of anonymous text boxes.
|
|
5978
|
+
*
|
|
5979
|
+
* The name is composed from the column's own title, so it needs
|
|
5980
|
+
* ONE consumer key with an interpolation (`filter by column` ->
|
|
5981
|
+
* "Filtrar por {{column}}") instead of one per column, and it
|
|
5982
|
+
* follows a language change because this runs from
|
|
5983
|
+
* `yui_tabulator_relocalize()` as well as at build.
|
|
5984
|
+
***************************************************************/
|
|
5985
|
+
function yui_tabulator_name_filters(table, t) {
|
|
5986
|
+
if (!table || typeof table.getColumns !== "function") return;
|
|
5987
|
+
try {
|
|
5988
|
+
for (let col of table.getColumns()) {
|
|
5989
|
+
let $el = typeof col.getElement === "function" ? col.getElement() : null;
|
|
5990
|
+
if (!$el) continue;
|
|
5991
|
+
let $input = $el.querySelector(".tabulator-header-filter input, .tabulator-header-filter select");
|
|
5992
|
+
if (!$input) continue;
|
|
5993
|
+
let title = typeof col.getDefinition === "function" ? String(col.getDefinition().title || "") : "";
|
|
5994
|
+
let $title = $el.querySelector(".tabulator-col-title");
|
|
5995
|
+
if (!title && $title) title = $title.textContent.trim();
|
|
5996
|
+
if (!title) continue;
|
|
5997
|
+
$input.setAttribute("aria-label", t("filter by column", { column: title }));
|
|
5998
|
+
}
|
|
5999
|
+
} catch (e) {}
|
|
6000
|
+
}
|
|
6001
|
+
/***************************************************************
|
|
6002
|
+
* Name the ROW-SELECTION checkboxes.
|
|
6003
|
+
*
|
|
6004
|
+
* Tabulator's `rowSelection` formatter hard-codes
|
|
6005
|
+
* `aria-label="Select Row"` on the box it draws -- no locale
|
|
6006
|
+
* key, no option, nothing to configure -- so a table in any
|
|
6007
|
+
* other language announces every row in English. Same shape as
|
|
6008
|
+
* the header filters above: rename after the render, and again
|
|
6009
|
+
* from `yui_tabulator_relocalize()` so a language change
|
|
6010
|
+
* reaches them.
|
|
6011
|
+
*
|
|
6012
|
+
* It matches Tabulator's OWN literal and only that, so a box a
|
|
6013
|
+
* view named itself is left alone.
|
|
6014
|
+
***************************************************************/
|
|
6015
|
+
var TABULATOR_ROW_SELECT_ARIA = "Select Row";
|
|
6016
|
+
function yui_tabulator_name_row_selects(table, t) {
|
|
6017
|
+
if (!table || typeof table.getElement !== "function") return;
|
|
6018
|
+
try {
|
|
6019
|
+
let $el = table.getElement();
|
|
6020
|
+
if (!$el) return;
|
|
6021
|
+
let boxes = $el.querySelectorAll(`input[type=checkbox][aria-label="${TABULATOR_ROW_SELECT_ARIA}"]`);
|
|
6022
|
+
for (let $box of boxes) {
|
|
6023
|
+
$box.setAttribute("aria-label", t("select row"));
|
|
6024
|
+
$box.setAttribute("data-i18n-aria-label", "select row");
|
|
6025
|
+
}
|
|
6026
|
+
} catch (e) {}
|
|
6027
|
+
}
|
|
6028
|
+
function yui_tabulator_relocalize(table, t) {
|
|
6029
|
+
if (!table) return;
|
|
6030
|
+
yui_tabulator_name_filters(table, t);
|
|
6031
|
+
yui_tabulator_name_row_selects(table, t);
|
|
6032
|
+
try {
|
|
6033
|
+
let name = next_lang_name();
|
|
6034
|
+
let strings = tabulator_strings(t);
|
|
6035
|
+
table.options.langs = table.options.langs || {};
|
|
6036
|
+
table.options.langs[name] = strings;
|
|
6037
|
+
let localize = table.modules && table.modules.localize;
|
|
6038
|
+
if (localize && typeof localize.installLang === "function") localize.installLang(name, strings);
|
|
6039
|
+
else (0, _yuneta_gobj_js.log_warning)("yui_tabulator_relocalize: no localize module: Tabulator's own chrome stays in the old language");
|
|
6040
|
+
table.setLocale(name);
|
|
6041
|
+
} catch (e) {
|
|
6042
|
+
(0, _yuneta_gobj_js.log_warning)(`yui_tabulator_relocalize: table gone: ${e}`);
|
|
6043
|
+
}
|
|
6044
|
+
}
|
|
6045
|
+
//#endregion
|
|
5895
6046
|
//#region src/yui_file_field.js
|
|
5896
6047
|
/***********************************************************************
|
|
5897
6048
|
* yui_file_field.js
|
|
@@ -8286,6 +8437,9 @@ function create_tabulator$1(gobj, $extend, name, template) {
|
|
|
8286
8437
|
hozAlign: "center"
|
|
8287
8438
|
};
|
|
8288
8439
|
let tabulator = new tabulator_tables.TabulatorFull($extend, tabulator_settings);
|
|
8440
|
+
tabulator.on("renderComplete", function() {
|
|
8441
|
+
yui_tabulator_name_row_selects(tabulator, i18next.t);
|
|
8442
|
+
});
|
|
8289
8443
|
tabulator.on("rowClick", function(e, row) {
|
|
8290
8444
|
e.preventDefault();
|
|
8291
8445
|
if (get_selectable_state(row)) row.toggleSelect();
|
|
@@ -23323,129 +23477,6 @@ function register_c_yui_treedb_topics() {
|
|
|
23323
23477
|
return create_gclass$6(GCLASS_NAME$6);
|
|
23324
23478
|
}
|
|
23325
23479
|
//#endregion
|
|
23326
|
-
//#region src/yui_tabulator_i18n.js
|
|
23327
|
-
/***********************************************************************
|
|
23328
|
-
* yui_tabulator_i18n.js
|
|
23329
|
-
*
|
|
23330
|
-
* The strings TABULATOR renders on its own — the paginator ("Page
|
|
23331
|
-
* Size", "First", "Prev", "Next", "Last"), the placeholder ("No Data
|
|
23332
|
-
* Available"), the loading/error notices — through the app's i18n.
|
|
23333
|
-
*
|
|
23334
|
-
* They are not built by any gclass, so nothing here or in an app ever
|
|
23335
|
-
* passed them through t(): a table sat in English inside an otherwise
|
|
23336
|
-
* Spanish view, and a language switch did not touch it.
|
|
23337
|
-
*
|
|
23338
|
-
* Two calls:
|
|
23339
|
-
*
|
|
23340
|
-
* new Tabulator($el, {..., ...yui_tabulator_lang(t)});
|
|
23341
|
-
* yui_tabulator_relocalize(table, t); // on a language change
|
|
23342
|
-
*
|
|
23343
|
-
* Every key carries an English `defaultValue`, so an app that does not
|
|
23344
|
-
* define it renders exactly what Tabulator rendered before — the
|
|
23345
|
-
* keys are an OPPORTUNITY to translate, never a requirement.
|
|
23346
|
-
*
|
|
23347
|
-
* Copyright (c) 2026, ArtGins.
|
|
23348
|
-
* All Rights Reserved.
|
|
23349
|
-
***********************************************************************/
|
|
23350
|
-
var __lang_seq__ = 0;
|
|
23351
|
-
function next_lang_name() {
|
|
23352
|
-
return `yui-${++__lang_seq__}`;
|
|
23353
|
-
}
|
|
23354
|
-
/***************************************************************
|
|
23355
|
-
* Tabulator's own strings, in the CURRENT language.
|
|
23356
|
-
*
|
|
23357
|
-
* ONE lang dict (not one per locale): the app owns the locales and hands us
|
|
23358
|
-
* only its live `t`, so a language change rebuilds the dict and re-applies
|
|
23359
|
-
* it under a fresh name (yui_tabulator_relocalize).
|
|
23360
|
-
***************************************************************/
|
|
23361
|
-
function yui_tabulator_lang(t) {
|
|
23362
|
-
let name = next_lang_name();
|
|
23363
|
-
let langs = {};
|
|
23364
|
-
langs[name] = tabulator_strings(t);
|
|
23365
|
-
return {
|
|
23366
|
-
locale: name,
|
|
23367
|
-
langs
|
|
23368
|
-
};
|
|
23369
|
-
}
|
|
23370
|
-
function tabulator_strings(t) {
|
|
23371
|
-
let tr = (key, def) => t(key, { defaultValue: def });
|
|
23372
|
-
return {
|
|
23373
|
-
data: {
|
|
23374
|
-
loading: tr("loading", "Loading"),
|
|
23375
|
-
error: tr("error", "Error")
|
|
23376
|
-
},
|
|
23377
|
-
pagination: {
|
|
23378
|
-
page_size: tr("page size", "Page Size"),
|
|
23379
|
-
page_title: tr("show page", "Show Page"),
|
|
23380
|
-
first: tr("first", "First"),
|
|
23381
|
-
first_title: tr("first page", "First Page"),
|
|
23382
|
-
last: tr("last", "Last"),
|
|
23383
|
-
last_title: tr("last page", "Last Page"),
|
|
23384
|
-
prev: tr("prev", "Prev"),
|
|
23385
|
-
prev_title: tr("prev page", "Prev Page"),
|
|
23386
|
-
next: tr("next", "Next"),
|
|
23387
|
-
next_title: tr("next page", "Next Page"),
|
|
23388
|
-
all: tr("all", "All")
|
|
23389
|
-
},
|
|
23390
|
-
headerFilters: { default: tr("filter column", "filter column...") }
|
|
23391
|
-
};
|
|
23392
|
-
}
|
|
23393
|
-
/***************************************************************
|
|
23394
|
-
* Put an EXISTING table in the current language: rebuild the strings and
|
|
23395
|
-
* re-apply the locale, which is what makes Tabulator re-render the parts
|
|
23396
|
-
* it owns (the paginator above all — it is drawn once, at build).
|
|
23397
|
-
*
|
|
23398
|
-
* Silent no-op on a table that is gone: a language switch races nothing,
|
|
23399
|
-
* but a view torn down mid-switch must not log a failure it cannot act on.
|
|
23400
|
-
***************************************************************/
|
|
23401
|
-
/***************************************************************
|
|
23402
|
-
* Name the HEADER FILTER inputs.
|
|
23403
|
-
*
|
|
23404
|
-
* Tabulator draws one text box per filterable column and gives
|
|
23405
|
-
* it nothing: no label, no `aria-label`, no placeholder. On
|
|
23406
|
-
* screen its position says what it filters -- it sits under the
|
|
23407
|
-
* column's title -- and to anything that is not an eye it is a
|
|
23408
|
-
* row of anonymous text boxes.
|
|
23409
|
-
*
|
|
23410
|
-
* The name is composed from the column's own title, so it needs
|
|
23411
|
-
* ONE consumer key with an interpolation (`filter by column` ->
|
|
23412
|
-
* "Filtrar por {{column}}") instead of one per column, and it
|
|
23413
|
-
* follows a language change because this runs from
|
|
23414
|
-
* `yui_tabulator_relocalize()` as well as at build.
|
|
23415
|
-
***************************************************************/
|
|
23416
|
-
function yui_tabulator_name_filters(table, t) {
|
|
23417
|
-
if (!table || typeof table.getColumns !== "function") return;
|
|
23418
|
-
try {
|
|
23419
|
-
for (let col of table.getColumns()) {
|
|
23420
|
-
let $el = typeof col.getElement === "function" ? col.getElement() : null;
|
|
23421
|
-
if (!$el) continue;
|
|
23422
|
-
let $input = $el.querySelector(".tabulator-header-filter input, .tabulator-header-filter select");
|
|
23423
|
-
if (!$input) continue;
|
|
23424
|
-
let title = typeof col.getDefinition === "function" ? String(col.getDefinition().title || "") : "";
|
|
23425
|
-
let $title = $el.querySelector(".tabulator-col-title");
|
|
23426
|
-
if (!title && $title) title = $title.textContent.trim();
|
|
23427
|
-
if (!title) continue;
|
|
23428
|
-
$input.setAttribute("aria-label", t("filter by column", { column: title }));
|
|
23429
|
-
}
|
|
23430
|
-
} catch (e) {}
|
|
23431
|
-
}
|
|
23432
|
-
function yui_tabulator_relocalize(table, t) {
|
|
23433
|
-
if (!table) return;
|
|
23434
|
-
yui_tabulator_name_filters(table, t);
|
|
23435
|
-
try {
|
|
23436
|
-
let name = next_lang_name();
|
|
23437
|
-
let strings = tabulator_strings(t);
|
|
23438
|
-
table.options.langs = table.options.langs || {};
|
|
23439
|
-
table.options.langs[name] = strings;
|
|
23440
|
-
let localize = table.modules && table.modules.localize;
|
|
23441
|
-
if (localize && typeof localize.installLang === "function") localize.installLang(name, strings);
|
|
23442
|
-
else (0, _yuneta_gobj_js.log_warning)("yui_tabulator_relocalize: no localize module: Tabulator's own chrome stays in the old language");
|
|
23443
|
-
table.setLocale(name);
|
|
23444
|
-
} catch (e) {
|
|
23445
|
-
(0, _yuneta_gobj_js.log_warning)(`yui_tabulator_relocalize: table gone: ${e}`);
|
|
23446
|
-
}
|
|
23447
|
-
}
|
|
23448
|
-
//#endregion
|
|
23449
23480
|
//#region src/yui_table_select.js
|
|
23450
23481
|
/***********************************************************************
|
|
23451
23482
|
* yui_table_select.js
|
|
@@ -25192,6 +25223,9 @@ function create_tabulator(gobj) {
|
|
|
25192
25223
|
delete tabulator._pendingData;
|
|
25193
25224
|
}
|
|
25194
25225
|
});
|
|
25226
|
+
tabulator.on("renderComplete", function() {
|
|
25227
|
+
yui_tabulator_name_row_selects(tabulator, i18next.t);
|
|
25228
|
+
});
|
|
25195
25229
|
tabulator.on("dataProcessed", update_rowcount);
|
|
25196
25230
|
tabulator.on("dataChanged", update_rowcount);
|
|
25197
25231
|
tabulator.on("pageSizeChanged", function(size) {
|
package/dist/gobj-ui.es.js
CHANGED
|
@@ -5887,6 +5887,157 @@ function register_c_yui_wizard() {
|
|
|
5887
5887
|
return create_gclass$17(GCLASS_NAME$17);
|
|
5888
5888
|
}
|
|
5889
5889
|
//#endregion
|
|
5890
|
+
//#region src/yui_tabulator_i18n.js
|
|
5891
|
+
/***********************************************************************
|
|
5892
|
+
* yui_tabulator_i18n.js
|
|
5893
|
+
*
|
|
5894
|
+
* The strings TABULATOR renders on its own — the paginator ("Page
|
|
5895
|
+
* Size", "First", "Prev", "Next", "Last"), the placeholder ("No Data
|
|
5896
|
+
* Available"), the loading/error notices — through the app's i18n.
|
|
5897
|
+
*
|
|
5898
|
+
* They are not built by any gclass, so nothing here or in an app ever
|
|
5899
|
+
* passed them through t(): a table sat in English inside an otherwise
|
|
5900
|
+
* Spanish view, and a language switch did not touch it.
|
|
5901
|
+
*
|
|
5902
|
+
* Two calls:
|
|
5903
|
+
*
|
|
5904
|
+
* new Tabulator($el, {..., ...yui_tabulator_lang(t)});
|
|
5905
|
+
* yui_tabulator_relocalize(table, t); // on a language change
|
|
5906
|
+
*
|
|
5907
|
+
* Every key carries an English `defaultValue`, so an app that does not
|
|
5908
|
+
* define it renders exactly what Tabulator rendered before — the
|
|
5909
|
+
* keys are an OPPORTUNITY to translate, never a requirement.
|
|
5910
|
+
*
|
|
5911
|
+
* Copyright (c) 2026, ArtGins.
|
|
5912
|
+
* All Rights Reserved.
|
|
5913
|
+
***********************************************************************/
|
|
5914
|
+
var __lang_seq__ = 0;
|
|
5915
|
+
function next_lang_name() {
|
|
5916
|
+
return `yui-${++__lang_seq__}`;
|
|
5917
|
+
}
|
|
5918
|
+
/***************************************************************
|
|
5919
|
+
* Tabulator's own strings, in the CURRENT language.
|
|
5920
|
+
*
|
|
5921
|
+
* ONE lang dict (not one per locale): the app owns the locales and hands us
|
|
5922
|
+
* only its live `t`, so a language change rebuilds the dict and re-applies
|
|
5923
|
+
* it under a fresh name (yui_tabulator_relocalize).
|
|
5924
|
+
***************************************************************/
|
|
5925
|
+
function yui_tabulator_lang(t) {
|
|
5926
|
+
let name = next_lang_name();
|
|
5927
|
+
let langs = {};
|
|
5928
|
+
langs[name] = tabulator_strings(t);
|
|
5929
|
+
return {
|
|
5930
|
+
locale: name,
|
|
5931
|
+
langs
|
|
5932
|
+
};
|
|
5933
|
+
}
|
|
5934
|
+
function tabulator_strings(t) {
|
|
5935
|
+
let tr = (key, def) => t(key, { defaultValue: def });
|
|
5936
|
+
return {
|
|
5937
|
+
data: {
|
|
5938
|
+
loading: tr("loading", "Loading"),
|
|
5939
|
+
error: tr("error", "Error")
|
|
5940
|
+
},
|
|
5941
|
+
pagination: {
|
|
5942
|
+
page_size: tr("page size", "Page Size"),
|
|
5943
|
+
page_title: tr("show page", "Show Page"),
|
|
5944
|
+
first: tr("first", "First"),
|
|
5945
|
+
first_title: tr("first page", "First Page"),
|
|
5946
|
+
last: tr("last", "Last"),
|
|
5947
|
+
last_title: tr("last page", "Last Page"),
|
|
5948
|
+
prev: tr("prev", "Prev"),
|
|
5949
|
+
prev_title: tr("prev page", "Prev Page"),
|
|
5950
|
+
next: tr("next", "Next"),
|
|
5951
|
+
next_title: tr("next page", "Next Page"),
|
|
5952
|
+
all: tr("all", "All")
|
|
5953
|
+
},
|
|
5954
|
+
headerFilters: { default: tr("filter column", "filter column...") }
|
|
5955
|
+
};
|
|
5956
|
+
}
|
|
5957
|
+
/***************************************************************
|
|
5958
|
+
* Put an EXISTING table in the current language: rebuild the strings and
|
|
5959
|
+
* re-apply the locale, which is what makes Tabulator re-render the parts
|
|
5960
|
+
* it owns (the paginator above all — it is drawn once, at build).
|
|
5961
|
+
*
|
|
5962
|
+
* Silent no-op on a table that is gone: a language switch races nothing,
|
|
5963
|
+
* but a view torn down mid-switch must not log a failure it cannot act on.
|
|
5964
|
+
***************************************************************/
|
|
5965
|
+
/***************************************************************
|
|
5966
|
+
* Name the HEADER FILTER inputs.
|
|
5967
|
+
*
|
|
5968
|
+
* Tabulator draws one text box per filterable column and gives
|
|
5969
|
+
* it nothing: no label, no `aria-label`, no placeholder. On
|
|
5970
|
+
* screen its position says what it filters -- it sits under the
|
|
5971
|
+
* column's title -- and to anything that is not an eye it is a
|
|
5972
|
+
* row of anonymous text boxes.
|
|
5973
|
+
*
|
|
5974
|
+
* The name is composed from the column's own title, so it needs
|
|
5975
|
+
* ONE consumer key with an interpolation (`filter by column` ->
|
|
5976
|
+
* "Filtrar por {{column}}") instead of one per column, and it
|
|
5977
|
+
* follows a language change because this runs from
|
|
5978
|
+
* `yui_tabulator_relocalize()` as well as at build.
|
|
5979
|
+
***************************************************************/
|
|
5980
|
+
function yui_tabulator_name_filters(table, t) {
|
|
5981
|
+
if (!table || typeof table.getColumns !== "function") return;
|
|
5982
|
+
try {
|
|
5983
|
+
for (let col of table.getColumns()) {
|
|
5984
|
+
let $el = typeof col.getElement === "function" ? col.getElement() : null;
|
|
5985
|
+
if (!$el) continue;
|
|
5986
|
+
let $input = $el.querySelector(".tabulator-header-filter input, .tabulator-header-filter select");
|
|
5987
|
+
if (!$input) continue;
|
|
5988
|
+
let title = typeof col.getDefinition === "function" ? String(col.getDefinition().title || "") : "";
|
|
5989
|
+
let $title = $el.querySelector(".tabulator-col-title");
|
|
5990
|
+
if (!title && $title) title = $title.textContent.trim();
|
|
5991
|
+
if (!title) continue;
|
|
5992
|
+
$input.setAttribute("aria-label", t("filter by column", { column: title }));
|
|
5993
|
+
}
|
|
5994
|
+
} catch (e) {}
|
|
5995
|
+
}
|
|
5996
|
+
/***************************************************************
|
|
5997
|
+
* Name the ROW-SELECTION checkboxes.
|
|
5998
|
+
*
|
|
5999
|
+
* Tabulator's `rowSelection` formatter hard-codes
|
|
6000
|
+
* `aria-label="Select Row"` on the box it draws -- no locale
|
|
6001
|
+
* key, no option, nothing to configure -- so a table in any
|
|
6002
|
+
* other language announces every row in English. Same shape as
|
|
6003
|
+
* the header filters above: rename after the render, and again
|
|
6004
|
+
* from `yui_tabulator_relocalize()` so a language change
|
|
6005
|
+
* reaches them.
|
|
6006
|
+
*
|
|
6007
|
+
* It matches Tabulator's OWN literal and only that, so a box a
|
|
6008
|
+
* view named itself is left alone.
|
|
6009
|
+
***************************************************************/
|
|
6010
|
+
var TABULATOR_ROW_SELECT_ARIA = "Select Row";
|
|
6011
|
+
function yui_tabulator_name_row_selects(table, t) {
|
|
6012
|
+
if (!table || typeof table.getElement !== "function") return;
|
|
6013
|
+
try {
|
|
6014
|
+
let $el = table.getElement();
|
|
6015
|
+
if (!$el) return;
|
|
6016
|
+
let boxes = $el.querySelectorAll(`input[type=checkbox][aria-label="${TABULATOR_ROW_SELECT_ARIA}"]`);
|
|
6017
|
+
for (let $box of boxes) {
|
|
6018
|
+
$box.setAttribute("aria-label", t("select row"));
|
|
6019
|
+
$box.setAttribute("data-i18n-aria-label", "select row");
|
|
6020
|
+
}
|
|
6021
|
+
} catch (e) {}
|
|
6022
|
+
}
|
|
6023
|
+
function yui_tabulator_relocalize(table, t) {
|
|
6024
|
+
if (!table) return;
|
|
6025
|
+
yui_tabulator_name_filters(table, t);
|
|
6026
|
+
yui_tabulator_name_row_selects(table, t);
|
|
6027
|
+
try {
|
|
6028
|
+
let name = next_lang_name();
|
|
6029
|
+
let strings = tabulator_strings(t);
|
|
6030
|
+
table.options.langs = table.options.langs || {};
|
|
6031
|
+
table.options.langs[name] = strings;
|
|
6032
|
+
let localize = table.modules && table.modules.localize;
|
|
6033
|
+
if (localize && typeof localize.installLang === "function") localize.installLang(name, strings);
|
|
6034
|
+
else log_warning("yui_tabulator_relocalize: no localize module: Tabulator's own chrome stays in the old language");
|
|
6035
|
+
table.setLocale(name);
|
|
6036
|
+
} catch (e) {
|
|
6037
|
+
log_warning(`yui_tabulator_relocalize: table gone: ${e}`);
|
|
6038
|
+
}
|
|
6039
|
+
}
|
|
6040
|
+
//#endregion
|
|
5890
6041
|
//#region src/yui_file_field.js
|
|
5891
6042
|
/***********************************************************************
|
|
5892
6043
|
* yui_file_field.js
|
|
@@ -8281,6 +8432,9 @@ function create_tabulator$1(gobj, $extend, name, template) {
|
|
|
8281
8432
|
hozAlign: "center"
|
|
8282
8433
|
};
|
|
8283
8434
|
let tabulator = new TabulatorFull($extend, tabulator_settings);
|
|
8435
|
+
tabulator.on("renderComplete", function() {
|
|
8436
|
+
yui_tabulator_name_row_selects(tabulator, t);
|
|
8437
|
+
});
|
|
8284
8438
|
tabulator.on("rowClick", function(e, row) {
|
|
8285
8439
|
e.preventDefault();
|
|
8286
8440
|
if (get_selectable_state(row)) row.toggleSelect();
|
|
@@ -23318,129 +23472,6 @@ function register_c_yui_treedb_topics() {
|
|
|
23318
23472
|
return create_gclass$6(GCLASS_NAME$6);
|
|
23319
23473
|
}
|
|
23320
23474
|
//#endregion
|
|
23321
|
-
//#region src/yui_tabulator_i18n.js
|
|
23322
|
-
/***********************************************************************
|
|
23323
|
-
* yui_tabulator_i18n.js
|
|
23324
|
-
*
|
|
23325
|
-
* The strings TABULATOR renders on its own — the paginator ("Page
|
|
23326
|
-
* Size", "First", "Prev", "Next", "Last"), the placeholder ("No Data
|
|
23327
|
-
* Available"), the loading/error notices — through the app's i18n.
|
|
23328
|
-
*
|
|
23329
|
-
* They are not built by any gclass, so nothing here or in an app ever
|
|
23330
|
-
* passed them through t(): a table sat in English inside an otherwise
|
|
23331
|
-
* Spanish view, and a language switch did not touch it.
|
|
23332
|
-
*
|
|
23333
|
-
* Two calls:
|
|
23334
|
-
*
|
|
23335
|
-
* new Tabulator($el, {..., ...yui_tabulator_lang(t)});
|
|
23336
|
-
* yui_tabulator_relocalize(table, t); // on a language change
|
|
23337
|
-
*
|
|
23338
|
-
* Every key carries an English `defaultValue`, so an app that does not
|
|
23339
|
-
* define it renders exactly what Tabulator rendered before — the
|
|
23340
|
-
* keys are an OPPORTUNITY to translate, never a requirement.
|
|
23341
|
-
*
|
|
23342
|
-
* Copyright (c) 2026, ArtGins.
|
|
23343
|
-
* All Rights Reserved.
|
|
23344
|
-
***********************************************************************/
|
|
23345
|
-
var __lang_seq__ = 0;
|
|
23346
|
-
function next_lang_name() {
|
|
23347
|
-
return `yui-${++__lang_seq__}`;
|
|
23348
|
-
}
|
|
23349
|
-
/***************************************************************
|
|
23350
|
-
* Tabulator's own strings, in the CURRENT language.
|
|
23351
|
-
*
|
|
23352
|
-
* ONE lang dict (not one per locale): the app owns the locales and hands us
|
|
23353
|
-
* only its live `t`, so a language change rebuilds the dict and re-applies
|
|
23354
|
-
* it under a fresh name (yui_tabulator_relocalize).
|
|
23355
|
-
***************************************************************/
|
|
23356
|
-
function yui_tabulator_lang(t) {
|
|
23357
|
-
let name = next_lang_name();
|
|
23358
|
-
let langs = {};
|
|
23359
|
-
langs[name] = tabulator_strings(t);
|
|
23360
|
-
return {
|
|
23361
|
-
locale: name,
|
|
23362
|
-
langs
|
|
23363
|
-
};
|
|
23364
|
-
}
|
|
23365
|
-
function tabulator_strings(t) {
|
|
23366
|
-
let tr = (key, def) => t(key, { defaultValue: def });
|
|
23367
|
-
return {
|
|
23368
|
-
data: {
|
|
23369
|
-
loading: tr("loading", "Loading"),
|
|
23370
|
-
error: tr("error", "Error")
|
|
23371
|
-
},
|
|
23372
|
-
pagination: {
|
|
23373
|
-
page_size: tr("page size", "Page Size"),
|
|
23374
|
-
page_title: tr("show page", "Show Page"),
|
|
23375
|
-
first: tr("first", "First"),
|
|
23376
|
-
first_title: tr("first page", "First Page"),
|
|
23377
|
-
last: tr("last", "Last"),
|
|
23378
|
-
last_title: tr("last page", "Last Page"),
|
|
23379
|
-
prev: tr("prev", "Prev"),
|
|
23380
|
-
prev_title: tr("prev page", "Prev Page"),
|
|
23381
|
-
next: tr("next", "Next"),
|
|
23382
|
-
next_title: tr("next page", "Next Page"),
|
|
23383
|
-
all: tr("all", "All")
|
|
23384
|
-
},
|
|
23385
|
-
headerFilters: { default: tr("filter column", "filter column...") }
|
|
23386
|
-
};
|
|
23387
|
-
}
|
|
23388
|
-
/***************************************************************
|
|
23389
|
-
* Put an EXISTING table in the current language: rebuild the strings and
|
|
23390
|
-
* re-apply the locale, which is what makes Tabulator re-render the parts
|
|
23391
|
-
* it owns (the paginator above all — it is drawn once, at build).
|
|
23392
|
-
*
|
|
23393
|
-
* Silent no-op on a table that is gone: a language switch races nothing,
|
|
23394
|
-
* but a view torn down mid-switch must not log a failure it cannot act on.
|
|
23395
|
-
***************************************************************/
|
|
23396
|
-
/***************************************************************
|
|
23397
|
-
* Name the HEADER FILTER inputs.
|
|
23398
|
-
*
|
|
23399
|
-
* Tabulator draws one text box per filterable column and gives
|
|
23400
|
-
* it nothing: no label, no `aria-label`, no placeholder. On
|
|
23401
|
-
* screen its position says what it filters -- it sits under the
|
|
23402
|
-
* column's title -- and to anything that is not an eye it is a
|
|
23403
|
-
* row of anonymous text boxes.
|
|
23404
|
-
*
|
|
23405
|
-
* The name is composed from the column's own title, so it needs
|
|
23406
|
-
* ONE consumer key with an interpolation (`filter by column` ->
|
|
23407
|
-
* "Filtrar por {{column}}") instead of one per column, and it
|
|
23408
|
-
* follows a language change because this runs from
|
|
23409
|
-
* `yui_tabulator_relocalize()` as well as at build.
|
|
23410
|
-
***************************************************************/
|
|
23411
|
-
function yui_tabulator_name_filters(table, t) {
|
|
23412
|
-
if (!table || typeof table.getColumns !== "function") return;
|
|
23413
|
-
try {
|
|
23414
|
-
for (let col of table.getColumns()) {
|
|
23415
|
-
let $el = typeof col.getElement === "function" ? col.getElement() : null;
|
|
23416
|
-
if (!$el) continue;
|
|
23417
|
-
let $input = $el.querySelector(".tabulator-header-filter input, .tabulator-header-filter select");
|
|
23418
|
-
if (!$input) continue;
|
|
23419
|
-
let title = typeof col.getDefinition === "function" ? String(col.getDefinition().title || "") : "";
|
|
23420
|
-
let $title = $el.querySelector(".tabulator-col-title");
|
|
23421
|
-
if (!title && $title) title = $title.textContent.trim();
|
|
23422
|
-
if (!title) continue;
|
|
23423
|
-
$input.setAttribute("aria-label", t("filter by column", { column: title }));
|
|
23424
|
-
}
|
|
23425
|
-
} catch (e) {}
|
|
23426
|
-
}
|
|
23427
|
-
function yui_tabulator_relocalize(table, t) {
|
|
23428
|
-
if (!table) return;
|
|
23429
|
-
yui_tabulator_name_filters(table, t);
|
|
23430
|
-
try {
|
|
23431
|
-
let name = next_lang_name();
|
|
23432
|
-
let strings = tabulator_strings(t);
|
|
23433
|
-
table.options.langs = table.options.langs || {};
|
|
23434
|
-
table.options.langs[name] = strings;
|
|
23435
|
-
let localize = table.modules && table.modules.localize;
|
|
23436
|
-
if (localize && typeof localize.installLang === "function") localize.installLang(name, strings);
|
|
23437
|
-
else log_warning("yui_tabulator_relocalize: no localize module: Tabulator's own chrome stays in the old language");
|
|
23438
|
-
table.setLocale(name);
|
|
23439
|
-
} catch (e) {
|
|
23440
|
-
log_warning(`yui_tabulator_relocalize: table gone: ${e}`);
|
|
23441
|
-
}
|
|
23442
|
-
}
|
|
23443
|
-
//#endregion
|
|
23444
23475
|
//#region src/yui_table_select.js
|
|
23445
23476
|
/***********************************************************************
|
|
23446
23477
|
* yui_table_select.js
|
|
@@ -25187,6 +25218,9 @@ function create_tabulator(gobj) {
|
|
|
25187
25218
|
delete tabulator._pendingData;
|
|
25188
25219
|
}
|
|
25189
25220
|
});
|
|
25221
|
+
tabulator.on("renderComplete", function() {
|
|
25222
|
+
yui_tabulator_name_row_selects(tabulator, t);
|
|
25223
|
+
});
|
|
25190
25224
|
tabulator.on("dataProcessed", update_rowcount);
|
|
25191
25225
|
tabulator.on("dataChanged", update_rowcount);
|
|
25192
25226
|
tabulator.on("pageSizeChanged", function(size) {
|
package/package.json
CHANGED
package/src/c_yui_form.js
CHANGED
|
@@ -50,6 +50,8 @@ import {
|
|
|
50
50
|
} from "@yuneta/gobj-js";
|
|
51
51
|
|
|
52
52
|
import {t} from "i18next";
|
|
53
|
+
|
|
54
|
+
import {yui_tabulator_name_row_selects} from "./yui_tabulator_i18n.js";
|
|
53
55
|
import "tom-select/dist/css/tom-select.css"; // Import Tom-Select CSS
|
|
54
56
|
import TomSelect from "tom-select"; // Import Tom-Select JS
|
|
55
57
|
|
|
@@ -1833,6 +1835,13 @@ function create_tabulator(gobj, $extend, name, template)
|
|
|
1833
1835
|
$extend,
|
|
1834
1836
|
tabulator_settings
|
|
1835
1837
|
);
|
|
1838
|
+
/* Tabulator hard-codes `aria-label="Select Row"` on the box its
|
|
1839
|
+
* rowSelection formatter draws, and it draws a fresh one on EVERY
|
|
1840
|
+
* render -- so this hangs off `renderComplete`, not `tableBuilt`:
|
|
1841
|
+
* a name put on once is gone with the next sort or page. */
|
|
1842
|
+
tabulator.on("renderComplete", function() {
|
|
1843
|
+
yui_tabulator_name_row_selects(tabulator, t);
|
|
1844
|
+
});
|
|
1836
1845
|
tabulator.on("rowClick", function(e, row) {
|
|
1837
1846
|
//e - the click event object
|
|
1838
1847
|
//row - row component
|
|
@@ -76,7 +76,8 @@ import {register_c_yui_json} from "./c_yui_json.js";
|
|
|
76
76
|
import {attach_clear} from "./yui_inputs.js";
|
|
77
77
|
|
|
78
78
|
import {yui_tabulator_lang, yui_tabulator_relocalize,
|
|
79
|
-
yui_tabulator_name_filters
|
|
79
|
+
yui_tabulator_name_filters,
|
|
80
|
+
yui_tabulator_name_row_selects} from "./yui_tabulator_i18n.js";
|
|
80
81
|
|
|
81
82
|
import {
|
|
82
83
|
yui_selection_column,
|
|
@@ -1674,6 +1675,13 @@ function create_tabulator(gobj)
|
|
|
1674
1675
|
* rows, because filtering fires its own event and neither of the other
|
|
1675
1676
|
* two. Nobody had noticed while the only filter was the global search
|
|
1676
1677
|
* box; a filter per column made it a claim you read on every keystroke. */
|
|
1678
|
+
/* Tabulator hard-codes `aria-label="Select Row"` on the box its
|
|
1679
|
+
* rowSelection formatter draws, and it draws a fresh one on EVERY
|
|
1680
|
+
* render -- so this hangs off `renderComplete`, not `tableBuilt`:
|
|
1681
|
+
* a name put on once is gone with the next sort or page. */
|
|
1682
|
+
tabulator.on("renderComplete", function() {
|
|
1683
|
+
yui_tabulator_name_row_selects(tabulator, t);
|
|
1684
|
+
});
|
|
1677
1685
|
tabulator.on("dataProcessed", update_rowcount);
|
|
1678
1686
|
tabulator.on("dataChanged", update_rowcount);
|
|
1679
1687
|
/* The reader changed the page size. The widget has already done the
|
|
@@ -142,14 +142,52 @@ function yui_tabulator_name_filters(table, t)
|
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
/***************************************************************
|
|
146
|
+
* Name the ROW-SELECTION checkboxes.
|
|
147
|
+
*
|
|
148
|
+
* Tabulator's `rowSelection` formatter hard-codes
|
|
149
|
+
* `aria-label="Select Row"` on the box it draws -- no locale
|
|
150
|
+
* key, no option, nothing to configure -- so a table in any
|
|
151
|
+
* other language announces every row in English. Same shape as
|
|
152
|
+
* the header filters above: rename after the render, and again
|
|
153
|
+
* from `yui_tabulator_relocalize()` so a language change
|
|
154
|
+
* reaches them.
|
|
155
|
+
*
|
|
156
|
+
* It matches Tabulator's OWN literal and only that, so a box a
|
|
157
|
+
* view named itself is left alone.
|
|
158
|
+
***************************************************************/
|
|
159
|
+
const TABULATOR_ROW_SELECT_ARIA = "Select Row";
|
|
160
|
+
|
|
161
|
+
function yui_tabulator_name_row_selects(table, t)
|
|
162
|
+
{
|
|
163
|
+
if(!table || typeof table.getElement !== "function") {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
let $el = table.getElement();
|
|
168
|
+
if(!$el) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
let boxes = $el.querySelectorAll(
|
|
172
|
+
`input[type=checkbox][aria-label="${TABULATOR_ROW_SELECT_ARIA}"]`);
|
|
173
|
+
for(let $box of boxes) {
|
|
174
|
+
$box.setAttribute("aria-label", t("select row"));
|
|
175
|
+
$box.setAttribute("data-i18n-aria-label", "select row");
|
|
176
|
+
}
|
|
177
|
+
} catch(e) {
|
|
178
|
+
/* a table between renders has no boxes to name */
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
145
182
|
function yui_tabulator_relocalize(table, t)
|
|
146
183
|
{
|
|
147
184
|
if(!table) {
|
|
148
185
|
return;
|
|
149
186
|
}
|
|
150
|
-
/*
|
|
151
|
-
* again in the new language. */
|
|
187
|
+
/* Neither the header filters nor the row-selection boxes have a
|
|
188
|
+
* name of their own; give them one again in the new language. */
|
|
152
189
|
yui_tabulator_name_filters(table, t);
|
|
190
|
+
yui_tabulator_name_row_selects(table, t);
|
|
153
191
|
try {
|
|
154
192
|
let name = next_lang_name();
|
|
155
193
|
let strings = tabulator_strings(t);
|
|
@@ -182,4 +220,5 @@ export {
|
|
|
182
220
|
yui_tabulator_lang,
|
|
183
221
|
yui_tabulator_relocalize,
|
|
184
222
|
yui_tabulator_name_filters,
|
|
223
|
+
yui_tabulator_name_row_selects,
|
|
185
224
|
};
|