@apia/table2-controller 4.0.102 → 5.0.1

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.
Files changed (91) hide show
  1. package/dist/data/TableController.d.ts +174 -0
  2. package/dist/data/TableController.d.ts.map +1 -0
  3. package/dist/data/TableController.js +348 -0
  4. package/dist/data/TableController.js.map +1 -0
  5. package/dist/data/body/TableBody.d.ts +16 -0
  6. package/dist/data/body/TableBody.d.ts.map +1 -0
  7. package/dist/data/body/TableBody.js +35 -0
  8. package/dist/data/body/TableBody.js.map +1 -0
  9. package/dist/data/filter/ComboFilter.d.ts +18 -0
  10. package/dist/data/filter/ComboFilter.d.ts.map +1 -0
  11. package/dist/data/filter/ComboFilter.js +32 -0
  12. package/dist/data/filter/ComboFilter.js.map +1 -0
  13. package/dist/data/filter/DateFilter.d.ts +7 -0
  14. package/dist/data/filter/DateFilter.d.ts.map +1 -0
  15. package/dist/data/filter/DateFilter.js +7 -0
  16. package/dist/data/filter/DateFilter.js.map +1 -0
  17. package/dist/data/filter/DateRangeFilter.d.ts +52 -0
  18. package/dist/data/filter/DateRangeFilter.d.ts.map +1 -0
  19. package/dist/data/filter/DateRangeFilter.js +208 -0
  20. package/dist/data/filter/DateRangeFilter.js.map +1 -0
  21. package/dist/data/filter/DateTimeRangeFilter.d.ts +23 -0
  22. package/dist/data/filter/DateTimeRangeFilter.d.ts.map +1 -0
  23. package/dist/data/filter/DateTimeRangeFilter.js +87 -0
  24. package/dist/data/filter/DateTimeRangeFilter.js.map +1 -0
  25. package/dist/data/filter/Filter.d.ts +49 -0
  26. package/dist/data/filter/Filter.d.ts.map +1 -0
  27. package/dist/data/filter/Filter.js +63 -0
  28. package/dist/data/filter/Filter.js.map +1 -0
  29. package/dist/data/head/Column.d.ts +23 -0
  30. package/dist/data/head/Column.d.ts.map +1 -0
  31. package/dist/data/head/Column.js +26 -0
  32. package/dist/data/head/Column.js.map +1 -0
  33. package/dist/data/head/Columns.d.ts +16 -0
  34. package/dist/data/head/Columns.d.ts.map +1 -0
  35. package/dist/data/head/Columns.js +57 -0
  36. package/dist/data/head/Columns.js.map +1 -0
  37. package/dist/data/head/Filters.d.ts +20 -0
  38. package/dist/data/head/Filters.d.ts.map +1 -0
  39. package/dist/data/head/Filters.js +132 -0
  40. package/dist/data/head/Filters.js.map +1 -0
  41. package/dist/data/head/NullFilter.js +25 -0
  42. package/dist/data/head/NullFilter.js.map +1 -0
  43. package/dist/data/head/TableHead.d.ts +26 -0
  44. package/dist/data/head/TableHead.d.ts.map +1 -0
  45. package/dist/data/head/TableHead.js +59 -0
  46. package/dist/data/head/TableHead.js.map +1 -0
  47. package/dist/data/plugins/FocusControllerPlugin/index.d.ts +26 -0
  48. package/dist/data/plugins/FocusControllerPlugin/index.d.ts.map +1 -0
  49. package/dist/data/plugins/FocusControllerPlugin/index.js +130 -0
  50. package/dist/data/plugins/FocusControllerPlugin/index.js.map +1 -0
  51. package/dist/data/plugins/FocusControllerPlugin/useFocusByClick.js +80 -0
  52. package/dist/data/plugins/FocusControllerPlugin/useFocusByClick.js.map +1 -0
  53. package/dist/data/plugins/FocusControllerPlugin/useFocusByKey.js +156 -0
  54. package/dist/data/plugins/FocusControllerPlugin/useFocusByKey.js.map +1 -0
  55. package/dist/data/plugins/TablePlugin.d.ts +30 -0
  56. package/dist/data/plugins/TablePlugin.d.ts.map +1 -0
  57. package/dist/data/plugins/TablePlugin.js +10 -0
  58. package/dist/data/plugins/TablePlugin.js.map +1 -0
  59. package/dist/data/plugins/WaiAriaPlugin.d.ts +42 -0
  60. package/dist/data/plugins/WaiAriaPlugin.d.ts.map +1 -0
  61. package/dist/data/plugins/WaiAriaPlugin.js +29 -0
  62. package/dist/data/plugins/WaiAriaPlugin.js.map +1 -0
  63. package/dist/data/primitive/AdditionalCell.d.ts +11 -0
  64. package/dist/data/primitive/AdditionalCell.d.ts.map +1 -0
  65. package/dist/data/primitive/AdditionalCell.js +38 -0
  66. package/dist/data/primitive/AdditionalCell.js.map +1 -0
  67. package/dist/data/primitive/AdditionalRow.d.ts +12 -0
  68. package/dist/data/primitive/AdditionalRow.d.ts.map +1 -0
  69. package/dist/data/primitive/AdditionalRow.js +16 -0
  70. package/dist/data/primitive/AdditionalRow.js.map +1 -0
  71. package/dist/data/primitive/Cell.d.ts +39 -0
  72. package/dist/data/primitive/Cell.d.ts.map +1 -0
  73. package/dist/data/primitive/Cell.js +41 -0
  74. package/dist/data/primitive/Cell.js.map +1 -0
  75. package/dist/data/primitive/Element.d.ts +18 -0
  76. package/dist/data/primitive/Element.d.ts.map +1 -0
  77. package/dist/data/primitive/Element.js +40 -0
  78. package/dist/data/primitive/Element.js.map +1 -0
  79. package/dist/data/primitive/Row.d.ts +58 -0
  80. package/dist/data/primitive/Row.d.ts.map +1 -0
  81. package/dist/data/primitive/Row.js +193 -0
  82. package/dist/data/primitive/Row.js.map +1 -0
  83. package/dist/data/primitive/RowsGroup.d.ts +29 -0
  84. package/dist/data/primitive/RowsGroup.d.ts.map +1 -0
  85. package/dist/data/primitive/RowsGroup.js +86 -0
  86. package/dist/data/primitive/RowsGroup.js.map +1 -0
  87. package/dist/index.d.ts +20 -425
  88. package/dist/index.js +20 -1255
  89. package/dist/index.js.map +1 -1
  90. package/package.json +3 -4
  91. package/LICENSE.md +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Column.js","sources":["../../../src/data/head/Column.ts"],"sourcesContent":["import { TSortType } from '@apia/util';\r\nimport { Cell, type CellState } from '../primitive/Cell';\r\n\r\nexport type ColumnState<T extends ColumnState<any> = ColumnState<any>> =\r\n CellState<T> & {\r\n asAdditional?: boolean;\r\n sortable?: boolean;\r\n sortState?: TSortType;\r\n showInAccordionTitle?: boolean;\r\n adjustWidthToTitle?: boolean;\r\n };\r\n\r\nexport class Column extends Cell<ColumnState> {\r\n constructor(state: ColumnState) {\r\n super(state);\r\n }\r\n\r\n public get asAdditional() {\r\n return !!this.state.asAdditional;\r\n }\r\n\r\n public get isHidden() {\r\n return !!this.state.isHidden;\r\n }\r\n\r\n /**\r\n * A visible column is that which is not additional nor hidden.\r\n */\r\n public get isVisible() {\r\n return !this.asAdditional && !this.isHidden;\r\n }\r\n\r\n public sort(order?: ColumnState['sortState']) {\r\n order = order ?? (this.getState('sortState') === 'ASC' ? 'DESC' : 'ASC');\r\n\r\n this.setState('sortState', order);\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAYO,MAAM,eAAe,IAAA,CAAkB;AAAA,EAC5C,YAAY,KAAA,EAAoB;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAA;AAAA;AACb,EAEA,IAAW,YAAA,GAAe;AACxB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,KAAA,CAAM,YAAA;AAAA;AACtB,EAEA,IAAW,QAAA,GAAW;AACpB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA;AACtB;AAAA;AAAA;AAAA,EAKA,IAAW,SAAA,GAAY;AACrB,IAAA,OAAO,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,IAAA,CAAK,QAAA;AAAA;AACrC,EAEO,KAAK,KAAA,EAAkC;AAC5C,IAAA,KAAA,GAAQ,UAAU,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,KAAM,QAAQ,MAAA,GAAS,KAAA,CAAA;AAElE,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,KAAK,CAAA;AAAA;AAEpC;;;;"}
@@ -0,0 +1,16 @@
1
+ import { Row, RowProperties } from '../primitive/Row.js';
2
+ import { Column, ColumnState } from './Column.js';
3
+
4
+ declare class Columns extends Row {
5
+ protected properties?: Omit<RowProperties, "id"> | undefined;
6
+ columns: Map<string, Column>;
7
+ constructor(id: string, properties?: Omit<RowProperties, "id"> | undefined);
8
+ buildColumnsRow(columns: ColumnState[]): void;
9
+ getColumn(name: string): Column;
10
+ getColumns(): Column[];
11
+ getAdditionalColumns(): Column[];
12
+ getShownColumns(): Column[];
13
+ }
14
+
15
+ export { Columns };
16
+ //# sourceMappingURL=Columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Columns.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { Row } from '../primitive/Row.js';
2
+ import { Column } from './Column.js';
3
+
4
+ var __defProp = Object.defineProperty;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __publicField = (obj, key, value) => {
7
+ __defNormalProp(obj, key + "" , value);
8
+ return value;
9
+ };
10
+ class Columns extends Row {
11
+ constructor(id, properties) {
12
+ super(id, {
13
+ ...properties,
14
+ cells: properties?.cells || [],
15
+ isSelectable: false
16
+ });
17
+ this.properties = properties;
18
+ __publicField(this, "columns", /* @__PURE__ */ new Map());
19
+ }
20
+ buildColumnsRow(columns) {
21
+ const incoming = new Set(columns.map((c) => c.colName));
22
+ for (const key of this.columns.keys()) {
23
+ if (!incoming.has(key)) {
24
+ this.columns.delete(key);
25
+ }
26
+ }
27
+ let i = 0;
28
+ for (const column of columns) {
29
+ if (!this.columns.has(column.colName)) {
30
+ this.columns.set(column.colName, new Column(column));
31
+ } else {
32
+ this.columns.get(column.colName)?.updateState(column);
33
+ }
34
+ const currentColumn = this.columns.get(column.colName);
35
+ if (currentColumn.isVisible) {
36
+ this.state.cells[i++] = currentColumn;
37
+ this.attachCell(currentColumn);
38
+ }
39
+ }
40
+ this.state.cells.length = i;
41
+ }
42
+ getColumn(name) {
43
+ return this.getCellByColumnName(name) ?? this.columns.get(name);
44
+ }
45
+ getColumns() {
46
+ return Array.from(this.columns.values());
47
+ }
48
+ getAdditionalColumns() {
49
+ return this.getColumns().filter((c) => c.asAdditional);
50
+ }
51
+ getShownColumns() {
52
+ return this.cells ?? [];
53
+ }
54
+ }
55
+
56
+ export { Columns };
57
+ //# sourceMappingURL=Columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Columns.js","sources":["../../../src/data/head/Columns.ts"],"sourcesContent":["import { Row, type RowProperties } from '../primitive/Row';\r\nimport { Column, type ColumnState } from './Column';\r\n\r\nexport class Columns extends Row {\r\n columns: Map<string, Column> = new Map();\r\n\r\n constructor(\r\n id: string,\r\n protected properties?: Omit<RowProperties, 'id'>,\r\n ) {\r\n super(id, {\r\n ...properties,\r\n cells: properties?.cells || [],\r\n isSelectable: false,\r\n });\r\n }\r\n\r\n buildColumnsRow(columns: ColumnState[]) {\r\n // Track incoming column names\r\n const incoming = new Set(columns.map((c) => c.colName));\r\n\r\n // Remove columns that are no longer present\r\n for (const key of this.columns.keys()) {\r\n if (!incoming.has(key)) {\r\n this.columns.delete(key);\r\n }\r\n }\r\n\r\n let i = 0;\r\n\r\n for (const column of columns) {\r\n if (!this.columns.has(column.colName)) {\r\n this.columns.set(column.colName, new Column(column));\r\n } else {\r\n this.columns.get(column.colName)?.updateState(column);\r\n }\r\n\r\n const currentColumn = this.columns.get(column.colName) as Column;\r\n if (currentColumn.isVisible) {\r\n this.state.cells[i++] = currentColumn;\r\n this.attachCell(currentColumn);\r\n }\r\n }\r\n this.state.cells.length = i;\r\n }\r\n\r\n getColumn(name: string) {\r\n return (this.getCellByColumnName(name) as Column) ?? this.columns.get(name);\r\n }\r\n\r\n getColumns() {\r\n return Array.from(this.columns.values());\r\n }\r\n\r\n getAdditionalColumns() {\r\n return this.getColumns().filter((c) => c.asAdditional);\r\n }\r\n\r\n getShownColumns() {\r\n return (this.cells ?? []) as Column[];\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;;;;AAGO,MAAM,gBAAgB,GAAA,CAAI;AAAA,EAG/B,WAAA,CACE,IACU,UAAA,EACV;AACA,IAAA,KAAA,CAAM,EAAA,EAAI;AAAA,MACR,GAAG,UAAA;AAAA,MACH,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,EAAC;AAAA,MAC7B,YAAA,EAAc;AAAA,KACf,CAAA;AANS,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAJZ,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,sBAAmC,GAAA,EAAI,CAAA;AAAA;AAWvC,EAEA,gBAAgB,OAAA,EAAwB;AAEtC,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAGtD,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACrC,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA;AACzB;AAGF,IAAA,IAAI,CAAA,GAAI,CAAA;AAER,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,OACrD,MAAO;AACL,QAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,EAAG,YAAY,MAAM,CAAA;AAAA;AAGtD,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,OAAO,CAAA;AACrD,MAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,QAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,aAAA;AACxB,QAAA,IAAA,CAAK,WAAW,aAAa,CAAA;AAAA;AAC/B;AAEF,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAA;AAAA;AAC5B,EAEA,UAAU,IAAA,EAAc;AACtB,IAAA,OAAQ,KAAK,mBAAA,CAAoB,IAAI,KAAgB,IAAA,CAAK,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA;AAC5E,EAEA,UAAA,GAAa;AACX,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA;AACzC,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,UAAA,EAAW,CAAE,OAAO,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA;AACvD,EAEA,eAAA,GAAkB;AAChB,IAAA,OAAQ,IAAA,CAAK,SAAS,EAAC;AAAA;AAE3B;;;;"}
@@ -0,0 +1,20 @@
1
+ import { Row, RowProperties } from '../primitive/Row.js';
2
+ import { Filter, FilterState } from '../filter/Filter.js';
3
+ import { TableHead } from './TableHead.js';
4
+
5
+ declare class Filters extends Row {
6
+ protected properties?: Omit<RowProperties, "id"> | undefined;
7
+ filters: Map<string, Filter<any>>;
8
+ private buildFilterFromDefinition;
9
+ constructor(id: string, properties?: Omit<RowProperties, "id"> | undefined);
10
+ buildFilters(filters: Omit<FilterState, 'colName'>[]): boolean;
11
+ getAdditionalFilters(): Filter<any>[];
12
+ getCells(): Filter<string>[];
13
+ getContainer(): TableHead;
14
+ get(name: string): Filter<any> | undefined;
15
+ getAll(): Filter<any>[];
16
+ getFiltersInTable(): Filter<any>[];
17
+ }
18
+
19
+ export { Filters };
20
+ //# sourceMappingURL=Filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Filters.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ import { arrayOrArray } from '@apia/util';
2
+ import { Row } from '../primitive/Row.js';
3
+ import { Filter } from '../filter/Filter.js';
4
+ import { NullFilter } from './NullFilter.js';
5
+ import { DateFilter } from '../filter/DateFilter.js';
6
+ import { DateRangeFilter } from '../filter/DateRangeFilter.js';
7
+ import { DateTimeRangeFilter } from '../filter/DateTimeRangeFilter.js';
8
+ import { ComboFilter } from '../filter/ComboFilter.js';
9
+ import { makeObservable, observable } from 'mobx';
10
+ import { AdditionalCell } from '../primitive/AdditionalCell.js';
11
+
12
+ var __defProp = Object.defineProperty;
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __publicField = (obj, key, value) => {
15
+ __defNormalProp(obj, key + "" , value);
16
+ return value;
17
+ };
18
+ class Filters extends Row {
19
+ constructor(id, properties) {
20
+ super(id, {
21
+ ...properties,
22
+ cells: properties?.cells || [],
23
+ isSelectable: false
24
+ });
25
+ this.properties = properties;
26
+ __publicField(this, "filters", /* @__PURE__ */ new Map());
27
+ makeObservable(this, { filters: observable });
28
+ }
29
+ buildFilterFromDefinition(def) {
30
+ switch (def.type) {
31
+ case "COMBO":
32
+ return new ComboFilter(def);
33
+ case "DATE":
34
+ return new DateFilter(def);
35
+ case "DATERANGE":
36
+ return new DateRangeFilter(def);
37
+ case "DATEHOURRANGE":
38
+ return new DateTimeRangeFilter(def);
39
+ default:
40
+ if (def.valueType === "NUMBER") {
41
+ return new Filter(def, (val) => {
42
+ if (def.showAsInteger && val !== "") {
43
+ const parsed = Math.trunc(Number(val));
44
+ return parsed.toString();
45
+ } else {
46
+ return val;
47
+ }
48
+ });
49
+ } else {
50
+ return new Filter(def);
51
+ }
52
+ }
53
+ }
54
+ buildFilters(filters) {
55
+ let hasFiltersInRow = false;
56
+ const columns = arrayOrArray(
57
+ this.getContainer().getHeaderRow()?.getShownColumns()
58
+ );
59
+ this.setState("cells", []);
60
+ this.filters.clear();
61
+ for (let i = 0; i < columns.length; i++) {
62
+ const column = columns[i];
63
+ const filter = filters.find(
64
+ (c) => c.columnName === column.getState("colName") && !c.asAdditional
65
+ );
66
+ if (filter) {
67
+ const currentFilterCell = this.cells.find(
68
+ (c) => c.getColumnName() === column.getColumnName()
69
+ );
70
+ const filterCell = currentFilterCell ?? this.buildFilterFromDefinition({
71
+ ...filter,
72
+ colName: filter.columnName
73
+ });
74
+ this.filters.set(filter.name, filterCell);
75
+ if (!currentFilterCell) {
76
+ filterCell.updateState(filter);
77
+ this.addCell(filterCell);
78
+ } else {
79
+ currentFilterCell.updateState(filter);
80
+ }
81
+ hasFiltersInRow = true;
82
+ filter.added = true;
83
+ } else {
84
+ if (!this.cells.find(
85
+ (c) => c.getColumnName() === column.getColumnName()
86
+ ) && !(column instanceof AdditionalCell)) {
87
+ this.addCell(new NullFilter(column.getColumnName()));
88
+ }
89
+ }
90
+ }
91
+ for (const filter of filters) {
92
+ if (!filter.added) {
93
+ const filterCell = this.filters.get(filter.name) ?? this.buildFilterFromDefinition({
94
+ ...filter,
95
+ colName: filter.columnName
96
+ });
97
+ filterCell.updateState({
98
+ ...filter,
99
+ asAdditional: filter.asAdditional ? filter.asAdditional : this.getContainer().getHeaderRow()?.columns.get(filter.columnName ?? "") ? filter.asAdditional : true
100
+ });
101
+ filterCell.setTable(this.table);
102
+ this.filters.set(filter.name, filterCell);
103
+ }
104
+ }
105
+ return hasFiltersInRow;
106
+ }
107
+ getAdditionalFilters() {
108
+ return this.getAll().filter(
109
+ (c) => c.getState("asAdditional") || this.getContainer().getHeaderRow()?.columns.get(c.getState("colName"))?.asAdditional || !c.getState("asAdditional") && !this.getContainer().getHeaderRow()?.columns.get(c.getState("colName"))
110
+ );
111
+ }
112
+ getCells() {
113
+ return this.cells.map((c) => c);
114
+ }
115
+ getContainer() {
116
+ return this.container;
117
+ }
118
+ get(name) {
119
+ return this.filters.get(name);
120
+ }
121
+ getAll() {
122
+ return Array.from(this.filters.values());
123
+ }
124
+ getFiltersInTable() {
125
+ return this.getAll().filter((f) => {
126
+ return !(f.getState("asAdditional") || this.getContainer().getHeaderRow()?.columns.get(f.getState("colName"))?.isVisible === false);
127
+ });
128
+ }
129
+ }
130
+
131
+ export { Filters };
132
+ //# sourceMappingURL=Filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Filters.js","sources":["../../../src/data/head/Filters.ts"],"sourcesContent":["import { arrayOrArray } from '@apia/util';\r\nimport { Row, type RowProperties } from '../primitive/Row';\r\nimport { Filter, type FilterState } from '../filter/Filter';\r\nimport type { TableHead } from './TableHead';\r\nimport { NullFilter } from './NullFilter';\r\nimport { DateFilter } from '../filter/DateFilter';\r\nimport { DateRangeFilter } from '../filter/DateRangeFilter';\r\nimport { DateTimeRangeFilter } from '../filter/DateTimeRangeFilter';\r\nimport { ComboFilter } from '../filter';\r\nimport { makeObservable, observable } from 'mobx';\r\nimport { AdditionalCell } from '../primitive/AdditionalCell';\r\n\r\nexport class Filters extends Row {\r\n filters: Map<string, Filter<any>> = new Map();\r\n\r\n private buildFilterFromDefinition(def: FilterState<any>) {\r\n switch (def.type) {\r\n case 'COMBO':\r\n return new ComboFilter(def as any);\r\n case 'DATE':\r\n return new DateFilter(def);\r\n case 'DATERANGE':\r\n return new DateRangeFilter(def as any);\r\n case 'DATEHOURRANGE':\r\n return new DateTimeRangeFilter(def as any);\r\n default:\r\n if (def.valueType === 'NUMBER') {\r\n return new Filter(def, (val) => {\r\n if (def.showAsInteger && val !== '') {\r\n const parsed = Math.trunc(Number(val));\r\n return parsed.toString();\r\n } else {\r\n return val;\r\n }\r\n });\r\n } else {\r\n return new Filter(def);\r\n }\r\n }\r\n }\r\n\r\n constructor(\r\n id: string,\r\n protected properties?: Omit<RowProperties, 'id'>,\r\n ) {\r\n super(id, {\r\n ...properties,\r\n cells: properties?.cells || [],\r\n isSelectable: false,\r\n });\r\n makeObservable(this, { filters: observable });\r\n }\r\n\r\n buildFilters(filters: Omit<FilterState, 'colName'>[]) {\r\n let hasFiltersInRow = false;\r\n\r\n const columns = arrayOrArray(\r\n this.getContainer().getHeaderRow()?.getShownColumns(),\r\n );\r\n\r\n /**\r\n * Se comenta y cambia por un clear debido a que en consultas donde las columnas cambian,\r\n * los filtros y columnas de dichas columnas tampoco llegan en la respuesta, pero tampoco se borran al contruir los filtros nuevos\r\n *\r\n * Como viene la estructura entera de la tabla, con los filtros y columnas que se deben ver,\r\n * se limpian los filtros y columnas existentes y se crean nuevos a partir de los que llegan\r\n */\r\n // for (const stored of this.filters.values()) {\r\n // if (!filters.find((c) => c.name === stored.getState('name'))) {\r\n // this.filters.delete(stored.getState('name'));\r\n // }\r\n // }\r\n this.setState('cells', []);\r\n this.filters.clear();\r\n for (let i = 0; i < columns.length; i++) {\r\n const column = columns[i];\r\n\r\n const filter = filters.find(\r\n (c) => c.columnName === column.getState('colName') && !c.asAdditional,\r\n );\r\n if (filter) {\r\n const currentFilterCell = this.cells.find(\r\n (c) => c.getColumnName() === column.getColumnName(),\r\n ) as Filter;\r\n\r\n const filterCell =\r\n currentFilterCell ??\r\n this.buildFilterFromDefinition({\r\n ...filter,\r\n colName: filter.columnName!,\r\n });\r\n this.filters.set(filter.name, filterCell);\r\n\r\n if (!currentFilterCell) {\r\n filterCell.updateState(filter);\r\n this.addCell(filterCell);\r\n } else {\r\n /** Se comenta debido a que en filtros con eventos, por ejemplo un combo que carga otro, si ambos tienen valor pero el primero cambia a vacio,\r\n * se lanza on change y vuelve el segundo sin opciones y valor vacio, pero aqui el valor nuevo se ignora, manteniendo el previo\r\n */\r\n //const { value, ...filterState } = filter;\r\n currentFilterCell.updateState(filter);\r\n }\r\n\r\n hasFiltersInRow = true;\r\n (filter as any).added = true;\r\n } else {\r\n if (\r\n !this.cells.find(\r\n (c) => c.getColumnName() === column.getColumnName(),\r\n ) &&\r\n !(column instanceof AdditionalCell)\r\n ) {\r\n this.addCell(new NullFilter(column.getColumnName()));\r\n }\r\n }\r\n }\r\n\r\n for (const filter of filters) {\r\n if (!(filter as any).added) {\r\n const filterCell =\r\n this.filters.get(filter.name) ??\r\n this.buildFilterFromDefinition({\r\n ...filter,\r\n colName: filter.columnName!,\r\n });\r\n\r\n /**\r\n * Se comenta debido a que al levantar la estructura de la tabla cuando se lanza un evento de on change\r\n * el valor se pierde\r\n */\r\n // const { value, ...fs } = filter;\r\n (filterCell as Filter).updateState({\r\n ...filter,\r\n asAdditional: filter.asAdditional\r\n ? filter.asAdditional\r\n : this.getContainer()\r\n .getHeaderRow()\r\n ?.columns.get(filter.columnName ?? '')\r\n ? filter.asAdditional\r\n : true,\r\n });\r\n\r\n filterCell.setTable(this.table);\r\n this.filters.set(filter.name, filterCell);\r\n }\r\n }\r\n\r\n return hasFiltersInRow;\r\n }\r\n\r\n getAdditionalFilters() {\r\n return this.getAll().filter(\r\n (c) =>\r\n c.getState('asAdditional') ||\r\n this.getContainer().getHeaderRow()?.columns.get(c.getState('colName'))\r\n ?.asAdditional ||\r\n (!c.getState('asAdditional') &&\r\n !this.getContainer()\r\n .getHeaderRow()\r\n ?.columns.get(c.getState('colName'))),\r\n );\r\n }\r\n\r\n getCells() {\r\n return this.cells.map((c) => c as Filter);\r\n }\r\n\r\n getContainer() {\r\n return this.container as TableHead;\r\n }\r\n\r\n get(name: string) {\r\n return this.filters.get(name);\r\n }\r\n\r\n getAll() {\r\n return Array.from(this.filters.values());\r\n }\r\n\r\n getFiltersInTable() {\r\n return this.getAll().filter((f) => {\r\n return !(\r\n f.getState('asAdditional') ||\r\n this.getContainer().getHeaderRow()?.columns.get(f.getState('colName'))\r\n ?.isVisible === false\r\n );\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAYO,MAAM,gBAAgB,GAAA,CAAI;AAAA,EA6B/B,WAAA,CACE,IACU,UAAA,EACV;AACA,IAAA,KAAA,CAAM,EAAA,EAAI;AAAA,MACR,GAAG,UAAA;AAAA,MACH,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,EAAC;AAAA,MAC7B,YAAA,EAAc;AAAA,KACf,CAAA;AANS,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AA9BZ,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,sBAAwC,GAAA,EAAI,CAAA;AAqC1C,IAAA,cAAA,CAAe,IAAA,EAAM,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA;AAC9C,EApCQ,0BAA0B,GAAA,EAAuB;AACvD,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,OAAA;AACH,QAAA,OAAO,IAAI,YAAY,GAAU,CAAA;AAAA,MACnC,KAAK,MAAA;AACH,QAAA,OAAO,IAAI,WAAW,GAAG,CAAA;AAAA,MAC3B,KAAK,WAAA;AACH,QAAA,OAAO,IAAI,gBAAgB,GAAU,CAAA;AAAA,MACvC,KAAK,eAAA;AACH,QAAA,OAAO,IAAI,oBAAoB,GAAU,CAAA;AAAA,MAC3C;AACE,QAAA,IAAI,GAAA,CAAI,cAAc,QAAA,EAAU;AAC9B,UAAA,OAAO,IAAI,MAAA,CAAO,GAAA,EAAK,CAAC,GAAA,KAAQ;AAC9B,YAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,KAAQ,EAAA,EAAI;AACnC,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACrC,cAAA,OAAO,OAAO,QAAA,EAAS;AAAA,aACzB,MAAO;AACL,cAAA,OAAO,GAAA;AAAA;AACT,WACD,CAAA;AAAA,SACH,MAAO;AACL,UAAA,OAAO,IAAI,OAAO,GAAG,CAAA;AAAA;AACvB;AACJ;AACF,EAcA,aAAa,OAAA,EAAyC;AACpD,IAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,IAAA,MAAM,OAAA,GAAU,YAAA;AAAA,MACd,IAAA,CAAK,YAAA,EAAa,CAAE,YAAA,IAAgB,eAAA;AAAgB,KACtD;AAcA,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AAExB,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA;AAAA,QACrB,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,OAAO,QAAA,CAAS,SAAS,CAAA,IAAK,CAAC,CAAA,CAAE;AAAA,OAC3D;AACA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,iBAAA,GAAoB,KAAK,KAAA,CAAM,IAAA;AAAA,UACnC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,EAAc,KAAM,OAAO,aAAA;AAAc,SACpD;AAEA,QAAA,MAAM,UAAA,GACJ,iBAAA,IACA,IAAA,CAAK,yBAAA,CAA0B;AAAA,UAC7B,GAAG,MAAA;AAAA,UACH,SAAS,MAAA,CAAO;AAAA,SACjB,CAAA;AACH,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAExC,QAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,UAAA,UAAA,CAAW,YAAY,MAAM,CAAA;AAC7B,UAAA,IAAA,CAAK,QAAQ,UAAU,CAAA;AAAA,SACzB,MAAO;AAKL,UAAA,iBAAA,CAAkB,YAAY,MAAM,CAAA;AAAA;AAGtC,QAAA,eAAA,GAAkB,IAAA;AAClB,QAAC,OAAe,KAAA,GAAQ,IAAA;AAAA,OAC1B,MAAO;AACL,QAAA,IACE,CAAC,KAAK,KAAA,CAAM,IAAA;AAAA,UACV,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,EAAc,KAAM,OAAO,aAAA;AAAc,SACpD,IACA,EAAE,MAAA,YAAkB,cAAA,CAAA,EACpB;AACA,UAAA,IAAA,CAAK,QAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,aAAA,EAAe,CAAC,CAAA;AAAA;AACrD;AACF;AAGF,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAE,OAAe,KAAA,EAAO;AAC1B,QAAA,MAAM,UAAA,GACJ,KAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,IAAI,CAAA,IAC5B,KAAK,yBAAA,CAA0B;AAAA,UAC7B,GAAG,MAAA;AAAA,UACH,SAAS,MAAA,CAAO;AAAA,SACjB,CAAA;AAOH,QAAC,WAAsB,WAAA,CAAY;AAAA,UACjC,GAAG,MAAA;AAAA,UACH,cAAc,MAAA,CAAO,YAAA,GACjB,MAAA,CAAO,YAAA,GACP,KAAK,YAAA,EAAa,CACb,YAAA,EAAa,EACZ,QAAQ,GAAA,CAAI,MAAA,CAAO,cAAc,EAAE,CAAA,GACvC,OAAO,YAAA,GACP;AAAA,SACP,CAAA;AAED,QAAA,UAAA,CAAW,QAAA,CAAS,KAAK,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAAA;AAC1C;AAGF,IAAA,OAAO,eAAA;AAAA;AACT,EAEA,oBAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAO,CAAE,MAAA;AAAA,MACnB,CAAC,CAAA,KACC,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,IACzB,IAAA,CAAK,YAAA,EAAa,CAAE,cAAa,EAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,SAAS,SAAS,CAAC,CAAA,EACjE,YAAA,IACH,CAAC,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,IACzB,CAAC,IAAA,CAAK,YAAA,EAAa,CAChB,YAAA,IACC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,SAAS,CAAC;AAAA,KAC3C;AAAA;AACF,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAW,CAAA;AAAA;AAC1C,EAEA,YAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA;AACd,EAEA,IAAI,IAAA,EAAc;AAChB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA;AAC9B,EAEA,MAAA,GAAS;AACP,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA;AACzC,EAEA,iBAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM;AACjC,MAAA,OAAO,EACL,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,IACzB,KAAK,YAAA,EAAa,CAAE,YAAA,EAAa,EAAG,QAAQ,GAAA,CAAI,CAAA,CAAE,SAAS,SAAS,CAAC,GACjE,SAAA,KAAc,KAAA,CAAA;AAAA,KAErB,CAAA;AAAA;AAEL;;;;"}
@@ -0,0 +1,25 @@
1
+ import { Filter } from '../filter/Filter.js';
2
+
3
+ class NullFilter extends Filter {
4
+ constructor(colName) {
5
+ super({ colName });
6
+ }
7
+ clear() {
8
+ }
9
+ fire(_) {
10
+ }
11
+ getValue() {
12
+ return void 0;
13
+ }
14
+ hasValue() {
15
+ return false;
16
+ }
17
+ setValue() {
18
+ }
19
+ validate() {
20
+ return true;
21
+ }
22
+ }
23
+
24
+ export { NullFilter };
25
+ //# sourceMappingURL=NullFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullFilter.js","sources":["../../../src/data/head/NullFilter.ts"],"sourcesContent":["import { Filter, FilterEvents } from '../filter/Filter';\r\n\r\nexport class NullFilter extends Filter {\r\n constructor(colName: string) {\r\n super({ colName } as any);\r\n }\r\n\r\n clear() {}\r\n\r\n fire(_: keyof FilterEvents): void {}\r\n\r\n getValue() {\r\n return undefined as any;\r\n }\r\n\r\n hasValue() {\r\n return false;\r\n }\r\n\r\n setValue(): void {}\r\n\r\n validate() {\r\n return true;\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAEO,MAAM,mBAAmB,MAAA,CAAO;AAAA,EACrC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,EAAE,SAAgB,CAAA;AAAA;AAC1B,EAEA,KAAA,GAAQ;AAAA;AAAC,EAET,KAAK,CAAA,EAA6B;AAAA;AAAC,EAEnC,QAAA,GAAW;AACT,IAAA,OAAO,MAAA;AAAA;AACT,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,KAAA;AAAA;AACT,EAEA,QAAA,GAAiB;AAAA;AAAC,EAElB,QAAA,GAAW;AACT,IAAA,OAAO,IAAA;AAAA;AAEX;;;;"}
@@ -0,0 +1,26 @@
1
+ import { ColumnState } from './Column.js';
2
+ import { FilterState } from '../filter/Filter.js';
3
+ import { ElementBaseState } from '../primitive/Element.js';
4
+ import { RowsGroup, RowsGroupBaseState } from '../primitive/RowsGroup.js';
5
+ import { TableController } from '../TableController.js';
6
+ import { Columns } from './Columns.js';
7
+ import { Filters } from './Filters.js';
8
+
9
+ type TableHeadState = ElementBaseState & RowsGroupBaseState & {};
10
+ type TBuildHead = {
11
+ columns: ColumnState[];
12
+ filters: Omit<FilterState, 'colName'>[];
13
+ };
14
+ declare class TableHead extends RowsGroup<TableHeadState> {
15
+ constructor(table: TableController);
16
+ columnsRow: Columns | null;
17
+ filtersRow: Filters | null;
18
+ getHeaderRow(): Columns | undefined;
19
+ getFiltersRow(): Filters | undefined;
20
+ getColumns(): Columns | undefined;
21
+ getFilters(): Filters | undefined;
22
+ build(data: TBuildHead): void;
23
+ }
24
+
25
+ export { type TBuildHead, TableHead, type TableHeadState };
26
+ //# sourceMappingURL=TableHead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableHead.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { RowsGroup } from '../primitive/RowsGroup.js';
2
+ import { Columns } from './Columns.js';
3
+ import { Filters } from './Filters.js';
4
+ import { makeObservable, observable } from 'mobx';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __publicField = (obj, key, value) => {
9
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
+ return value;
11
+ };
12
+ class TableHead extends RowsGroup {
13
+ constructor(table) {
14
+ super(table, { rows: [] });
15
+ __publicField(this, "columnsRow", null);
16
+ __publicField(this, "filtersRow", null);
17
+ makeObservable(this, { columnsRow: observable, filtersRow: observable });
18
+ }
19
+ getHeaderRow() {
20
+ return this.rows[0] instanceof Columns ? this.rows[0] : void 0;
21
+ }
22
+ getFiltersRow() {
23
+ return this.rows[1] instanceof Filters ? this.rows[1] : void 0;
24
+ }
25
+ getColumns() {
26
+ return this.columnsRow || void 0;
27
+ }
28
+ getFilters() {
29
+ return this.filtersRow || void 0;
30
+ }
31
+ build(data) {
32
+ if (data.columns.length) {
33
+ const currentHeaderRow = this.rows[0];
34
+ if (currentHeaderRow && !(currentHeaderRow instanceof Columns)) {
35
+ currentHeaderRow.remove();
36
+ }
37
+ this.columnsRow = currentHeaderRow ?? new Columns("header");
38
+ this.columnsRow.setTable(this.table);
39
+ this.columnsRow.setContainer(this);
40
+ if (!currentHeaderRow) {
41
+ this.addRow(this.columnsRow);
42
+ }
43
+ this.columnsRow.buildColumnsRow(data.columns);
44
+ }
45
+ if (data.filters.length) {
46
+ const currentFiltersRow = this.getFiltersRow();
47
+ this.filtersRow = currentFiltersRow ?? new Filters("filters");
48
+ this.filtersRow.setTable(this.table);
49
+ this.filtersRow.setContainer(this);
50
+ const hasFilter = this.filtersRow.buildFilters(data.filters);
51
+ if (hasFilter && !currentFiltersRow) {
52
+ this.addRow(this.filtersRow);
53
+ }
54
+ }
55
+ }
56
+ }
57
+
58
+ export { TableHead };
59
+ //# sourceMappingURL=TableHead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableHead.js","sources":["../../../src/data/head/TableHead.ts"],"sourcesContent":["import type { ColumnState } from './Column';\r\nimport type { FilterState } from '../filter/Filter';\r\nimport type { ElementBaseState } from '../primitive/Element';\r\nimport { RowsGroup, type RowsGroupBaseState } from '../primitive/RowsGroup';\r\nimport type { TableController } from '../TableController';\r\nimport { Columns } from './Columns';\r\nimport { Filters } from './Filters';\r\nimport { makeObservable, observable } from 'mobx';\r\n\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nexport type TableHeadState = ElementBaseState & RowsGroupBaseState & {};\r\n\r\nexport type TBuildHead = {\r\n columns: ColumnState[];\r\n filters: Omit<FilterState, 'colName'>[];\r\n};\r\n\r\nexport class TableHead extends RowsGroup<TableHeadState> {\r\n constructor(table: TableController) {\r\n super(table, { rows: [] });\r\n\r\n makeObservable(this, { columnsRow: observable, filtersRow: observable });\r\n }\r\n\r\n columnsRow: Columns | null = null;\r\n filtersRow: Filters | null = null;\r\n\r\n getHeaderRow(): Columns | undefined {\r\n return this.rows[0] instanceof Columns ? this.rows[0] : undefined;\r\n }\r\n\r\n getFiltersRow(): Filters | undefined {\r\n return this.rows[1] instanceof Filters ? this.rows[1] : undefined;\r\n }\r\n\r\n getColumns(): Columns | undefined {\r\n return this.columnsRow || undefined;\r\n }\r\n\r\n getFilters(): Filters | undefined {\r\n return this.filtersRow || undefined;\r\n }\r\n\r\n build(data: TBuildHead) {\r\n if (data.columns.length) {\r\n /**\r\n * Generate main header row\r\n */\r\n\r\n const currentHeaderRow = this.rows[0];\r\n\r\n if (currentHeaderRow && !(currentHeaderRow instanceof Columns)) {\r\n currentHeaderRow.remove();\r\n }\r\n\r\n this.columnsRow = (currentHeaderRow ?? new Columns('header')) as Columns;\r\n this.columnsRow.setTable(this.table);\r\n this.columnsRow.setContainer(this);\r\n\r\n if (!currentHeaderRow) {\r\n this.addRow(this.columnsRow);\r\n }\r\n\r\n this.columnsRow.buildColumnsRow(data.columns);\r\n }\r\n\r\n if (data.filters.length) {\r\n /**\r\n * Generate filters row\r\n */\r\n\r\n const currentFiltersRow = this.getFiltersRow();\r\n this.filtersRow = currentFiltersRow ?? new Filters('filters');\r\n this.filtersRow.setTable(this.table);\r\n this.filtersRow.setContainer(this);\r\n\r\n const hasFilter = this.filtersRow.buildFilters(data.filters);\r\n if (hasFilter && !currentFiltersRow) {\r\n this.addRow(this.filtersRow);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;;;;;;AAiBO,MAAM,kBAAkB,SAAA,CAA0B;AAAA,EACvD,YAAY,KAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,KAAA,EAAO,EAAE,IAAA,EAAM,IAAI,CAAA;AAK3B,IAAA,aAAA,CAAA,IAAA,EAAA,YAAA,EAA6B,IAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAA,YAAA,EAA6B,IAAA,CAAA;AAJ3B,IAAA,cAAA,CAAe,MAAM,EAAE,UAAA,EAAY,UAAA,EAAY,UAAA,EAAY,YAAY,CAAA;AAAA;AACzE,EAKA,YAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,YAAa,UAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA;AAAA;AAC1D,EAEA,aAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,YAAa,UAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA;AAAA;AAC1D,EAEA,UAAA,GAAkC;AAChC,IAAA,OAAO,KAAK,UAAA,IAAc,MAAA;AAAA;AAC5B,EAEA,UAAA,GAAkC;AAChC,IAAA,OAAO,KAAK,UAAA,IAAc,MAAA;AAAA;AAC5B,EAEA,MAAM,IAAA,EAAkB;AACtB,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AAKvB,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAEpC,MAAA,IAAI,gBAAA,IAAoB,EAAE,gBAAA,YAA4B,OAAA,CAAA,EAAU;AAC9D,QAAA,gBAAA,CAAiB,MAAA,EAAO;AAAA;AAG1B,MAAA,IAAA,CAAK,UAAA,GAAc,gBAAA,IAAoB,IAAI,OAAA,CAAQ,QAAQ,CAAA;AAC3D,MAAA,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACnC,MAAA,IAAA,CAAK,UAAA,CAAW,aAAa,IAAI,CAAA;AAEjC,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA;AAG7B,MAAA,IAAA,CAAK,UAAA,CAAW,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA;AAG9C,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AAKvB,MAAA,MAAM,iBAAA,GAAoB,KAAK,aAAA,EAAc;AAC7C,MAAA,IAAA,CAAK,UAAA,GAAa,iBAAA,IAAqB,IAAI,OAAA,CAAQ,SAAS,CAAA;AAC5D,MAAA,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACnC,MAAA,IAAA,CAAK,UAAA,CAAW,aAAa,IAAI,CAAA;AAEjC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,KAAK,OAAO,CAAA;AAC3D,MAAA,IAAI,SAAA,IAAa,CAAC,iBAAA,EAAmB;AACnC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA;AAC7B;AACF;AAEJ;;;;"}
@@ -0,0 +1,26 @@
1
+ import * as react from 'react';
2
+ import { FocusEvent } from 'react';
3
+ import { Element } from '../../primitive/Element.js';
4
+ import { TableController } from '../../TableController.js';
5
+ import { TablePlugin } from '../TablePlugin.js';
6
+
7
+ declare class FocusControllerPlugin implements TablePlugin {
8
+ rootElement: HTMLElement | null;
9
+ scrollIntoView(rowId: string): void;
10
+ useElementDomProps(controller: TableController, element: TableController | Element<any>, _context: any): {
11
+ className: string;
12
+ onClick: (ev: react.MouseEvent) => void;
13
+ onKeyDown: (ev: react.KeyboardEvent) => void;
14
+ onBlur: (ev: FocusEvent) => void;
15
+ ref: (el: HTMLElement | null) => void;
16
+ } | {
17
+ className?: undefined;
18
+ onClick?: undefined;
19
+ onKeyDown?: undefined;
20
+ onBlur?: undefined;
21
+ ref?: undefined;
22
+ };
23
+ }
24
+
25
+ export { FocusControllerPlugin };
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { useMount, scrollParentIntoElement, disableChildrenFocus, getFocusSelector } from '@apia/util';
2
+ import { useRef } from 'react';
3
+ import { useFocusByClick } from './useFocusByClick.js';
4
+ import { useFocusByKey } from './useFocusByKey.js';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __publicField = (obj, key, value) => {
9
+ __defNormalProp(obj, key + "" , value);
10
+ return value;
11
+ };
12
+ function getCellElement(focusControllerRef, cell) {
13
+ return focusControllerRef.querySelector(
14
+ `tr[data-rowid="${cell.getRow().getState("id")}"] td[data-colname="${cell.getState("colName")}"], tr[data-rowid="${cell.getRow().getState("id")}"] th[data-colname="${cell.getState("colName")}"]`
15
+ );
16
+ }
17
+ function isVisible(el) {
18
+ if (!(el instanceof HTMLElement))
19
+ return false;
20
+ while (el) {
21
+ const style = getComputedStyle(el);
22
+ if (style.display === "none" || style.visibility === "hidden" || style.opacity === "0") {
23
+ return false;
24
+ }
25
+ el = el.parentElement;
26
+ }
27
+ return true;
28
+ }
29
+ function scrollIntoRow(row) {
30
+ if (row) {
31
+ scrollParentIntoElement(row, 150, 0, 0);
32
+ }
33
+ }
34
+ function restoreFocus(controller, tableElement, doFocus) {
35
+ const cell = controller.getFocusedCell();
36
+ if (cell) {
37
+ const cellElement = getCellElement(tableElement, cell);
38
+ if (cellElement) {
39
+ disableChildrenFocus(tableElement);
40
+ const widgets = cellElement.querySelectorAll(getFocusSelector());
41
+ const widget = [...widgets].find((c) => isVisible(c));
42
+ const focusableElement = widget || cellElement;
43
+ focusableElement.setAttribute("tabindex", "0");
44
+ restoreEditionMode(tableElement, cell.getTable().isEditionMode);
45
+ if (doFocus) {
46
+ focusableElement.focus();
47
+ }
48
+ }
49
+ }
50
+ }
51
+ function restoreEditionMode(focusController, editionMode) {
52
+ const focusable = focusController?.querySelector(
53
+ '[tabindex="0"]'
54
+ );
55
+ const cell = focusable?.closest("td, th");
56
+ if (cell instanceof HTMLElement) {
57
+ const widgets = cell.querySelectorAll(getFocusSelector());
58
+ widgets.forEach((widget) => {
59
+ widget.setAttribute("tabindex", editionMode ? "0" : "-1");
60
+ });
61
+ const firstFocusable = [...widgets].find((c) => isVisible(c)) || cell;
62
+ firstFocusable.setAttribute("tabindex", "0");
63
+ }
64
+ }
65
+ class FocusControllerPlugin {
66
+ constructor() {
67
+ __publicField(this, "rootElement", null);
68
+ }
69
+ scrollIntoView(rowId) {
70
+ const row = this.rootElement?.querySelector(
71
+ `tr[data-rowid="${rowId}"]`
72
+ );
73
+ if (row) {
74
+ scrollIntoRow(row);
75
+ }
76
+ }
77
+ useElementDomProps(controller, element, _context) {
78
+ if (element === controller) {
79
+ const disconnect = useRef(() => {
80
+ });
81
+ useMount(() => {
82
+ const uns1 = controller.on("cellFocus", (ev) => {
83
+ if (this.rootElement) {
84
+ restoreFocus(controller, this.rootElement, ev.doFocus);
85
+ }
86
+ });
87
+ const uns2 = controller.on("editionMode", (editionMode) => {
88
+ if (this.rootElement) {
89
+ restoreEditionMode(this.rootElement, editionMode);
90
+ }
91
+ });
92
+ const uns3 = controller.on("scrollIntoRow", (row) => {
93
+ this.scrollIntoView(row.getState("id"));
94
+ });
95
+ return () => {
96
+ uns1();
97
+ uns2();
98
+ uns3();
99
+ };
100
+ });
101
+ return {
102
+ className: "table__focus_controller",
103
+ onClick: useFocusByClick(controller),
104
+ onKeyDown: useFocusByKey(controller),
105
+ onBlur: (ev) => {
106
+ if (ev.relatedTarget instanceof HTMLElement && ev.relatedTarget.closest(".table__focus_controller") !== this.rootElement) {
107
+ controller.toggleEditionMode(false);
108
+ }
109
+ },
110
+ ref: (el) => {
111
+ this.rootElement = el;
112
+ if (el) {
113
+ const observer = new MutationObserver(() => {
114
+ restoreFocus(controller, this.rootElement, false);
115
+ });
116
+ disconnect.current?.();
117
+ observer.observe(el, { subtree: true, childList: true });
118
+ disconnect.current = () => {
119
+ observer.disconnect();
120
+ };
121
+ }
122
+ }
123
+ };
124
+ }
125
+ return {};
126
+ }
127
+ }
128
+
129
+ export { FocusControllerPlugin, restoreFocus };
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data/plugins/FocusControllerPlugin/index.tsx"],"sourcesContent":["/* eslint-disable react-hooks/rules-of-hooks */\r\nimport {\r\n disableChildrenFocus,\r\n getFocusSelector,\r\n scrollParentIntoElement,\r\n useMount,\r\n} from '@apia/util';\r\nimport type { FocusEvent } from 'react';\r\nimport { useRef } from 'react';\r\nimport type { Element } from '../../primitive/Element';\r\nimport type { TableController } from '../../TableController';\r\nimport type { TablePlugin } from '../TablePlugin';\r\nimport { useFocusByClick } from './useFocusByClick';\r\nimport { useFocusByKey } from './useFocusByKey';\r\nimport type { Cell } from '../../primitive/Cell';\r\n\r\nfunction getCellElement(focusControllerRef: HTMLElement, cell: Cell) {\r\n return focusControllerRef.querySelector<HTMLTableCellElement>(\r\n `tr[data-rowid=\"${cell.getRow()!.getState('id')}\"] td[data-colname=\"${cell.getState('colName')}\"], tr[data-rowid=\"${cell.getRow()!.getState('id')}\"] th[data-colname=\"${cell.getState('colName')}\"]`,\r\n );\r\n}\r\n\r\nfunction isVisible(el: HTMLElement | null) {\r\n if (!(el instanceof HTMLElement)) return false;\r\n\r\n // Traverse up the DOM tree\r\n while (el) {\r\n const style = getComputedStyle(el);\r\n\r\n if (\r\n style.display === 'none' ||\r\n style.visibility === 'hidden' ||\r\n style.opacity === '0'\r\n ) {\r\n return false;\r\n }\r\n\r\n el = el.parentElement;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction scrollIntoRow(row: HTMLTableCaptionElement) {\r\n if (row) {\r\n scrollParentIntoElement(row, 150, 0, 0);\r\n }\r\n}\r\n\r\nexport function restoreFocus(\r\n controller: TableController,\r\n tableElement: HTMLElement,\r\n doFocus: boolean,\r\n) {\r\n const cell = controller.getFocusedCell();\r\n\r\n if (cell) {\r\n const cellElement = getCellElement(tableElement, cell);\r\n\r\n if (cellElement) {\r\n disableChildrenFocus(tableElement);\r\n const widgets =\r\n cellElement.querySelectorAll<HTMLElement>(getFocusSelector());\r\n const widget = [...widgets].find((c) => isVisible(c));\r\n const focusableElement = widget || cellElement;\r\n\r\n focusableElement.setAttribute('tabindex', '0');\r\n restoreEditionMode(tableElement, cell.getTable().isEditionMode);\r\n if (doFocus) {\r\n focusableElement.focus();\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction restoreEditionMode(\r\n focusController: HTMLElement,\r\n editionMode: boolean,\r\n) {\r\n const focusable = focusController?.querySelector(\r\n '[tabindex=\"0\"]',\r\n ) as HTMLElement;\r\n const cell = focusable?.closest('td, th');\r\n if (cell instanceof HTMLElement) {\r\n const widgets = cell.querySelectorAll<HTMLElement>(getFocusSelector());\r\n widgets.forEach((widget) => {\r\n widget.setAttribute('tabindex', editionMode ? '0' : '-1');\r\n });\r\n const firstFocusable = [...widgets].find((c) => isVisible(c)) || cell;\r\n firstFocusable.setAttribute('tabindex', '0');\r\n }\r\n}\r\n\r\nexport class FocusControllerPlugin implements TablePlugin {\r\n rootElement: HTMLElement | null = null;\r\n\r\n scrollIntoView(rowId: string) {\r\n const row = this.rootElement?.querySelector(\r\n `tr[data-rowid=\"${rowId}\"]`,\r\n ) as HTMLTableRowElement;\r\n\r\n if (row) {\r\n scrollIntoRow(row);\r\n }\r\n }\r\n\r\n useElementDomProps(\r\n controller: TableController,\r\n element: TableController | Element<any>,\r\n _context: any,\r\n ) {\r\n if (element === controller) {\r\n const disconnect = useRef(() => {});\r\n\r\n useMount(() => {\r\n const uns1 = controller.on('cellFocus', (ev) => {\r\n if (this.rootElement) {\r\n restoreFocus(controller, this.rootElement, ev.doFocus);\r\n }\r\n });\r\n const uns2 = controller.on('editionMode', (editionMode) => {\r\n if (this.rootElement) {\r\n restoreEditionMode(this.rootElement!, editionMode);\r\n }\r\n });\r\n const uns3 = controller.on('scrollIntoRow', (row) => {\r\n this.scrollIntoView(row.getState('id'));\r\n });\r\n\r\n return () => {\r\n uns1();\r\n uns2();\r\n uns3();\r\n };\r\n });\r\n\r\n return {\r\n className: 'table__focus_controller',\r\n onClick: useFocusByClick(controller),\r\n onKeyDown: useFocusByKey(controller),\r\n onBlur: (ev: FocusEvent) => {\r\n if (\r\n ev.relatedTarget instanceof HTMLElement &&\r\n ev.relatedTarget.closest('.table__focus_controller') !==\r\n this.rootElement\r\n ) {\r\n controller.toggleEditionMode(false);\r\n }\r\n },\r\n ref: (el: HTMLElement | null) => {\r\n this.rootElement = el;\r\n if (el) {\r\n const observer = new MutationObserver(() => {\r\n restoreFocus(controller, this.rootElement!, false);\r\n });\r\n disconnect.current?.();\r\n observer.observe(el, { subtree: true, childList: true });\r\n disconnect.current = () => {\r\n observer.disconnect();\r\n };\r\n }\r\n },\r\n };\r\n }\r\n\r\n return {};\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}