@oscarpalmer/tabela 0.11.0 → 0.13.0
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/body.component-_VDOpJhV.d.mts +10 -0
- package/dist/body.model-2iwsovAV.d.mts +7 -0
- package/dist/column.component-Bx46r3JI.d.mts +16 -0
- package/dist/column.model-D-aw4EU4.d.mts +16 -0
- package/dist/components/body.component.d.mts +2 -0
- package/dist/components/{body.component.js → body.component.mjs} +6 -3
- package/dist/components/column.component.d.mts +2 -0
- package/dist/components/{column.component.js → column.component.mjs} +12 -9
- package/dist/components/footer.component.d.mts +2 -0
- package/dist/components/{footer.component.js → footer.component.mjs} +7 -4
- package/dist/components/group.component.d.mts +2 -0
- package/dist/components/group.component.mjs +51 -0
- package/dist/components/header.component.d.mts +2 -0
- package/dist/components/{header.component.js → header.component.mjs} +6 -3
- package/dist/components/row.component.d.mts +2 -0
- package/dist/components/{row.component.js → row.component.mjs} +11 -7
- package/dist/filter.model-7ukJrtil.d.mts +16 -0
- package/dist/footer.component-Curiab8j.d.mts +12 -0
- package/dist/footer.model-DhqoS6ds.d.mts +8 -0
- package/dist/group.component-Cq1YYbfJ.d.mts +285 -0
- package/dist/group.model-BsKFwHbt.d.mts +10 -0
- package/dist/header.component-BjjlpZIg.d.mts +12 -0
- package/dist/header.model-DN_KzUCV.d.mts +7 -0
- package/dist/helpers/dom.helpers.d.mts +12 -0
- package/dist/helpers/{dom.helpers.js → dom.helpers.mjs} +14 -10
- package/dist/helpers/misc.helpers.d.mts +6 -0
- package/dist/helpers/{misc.helpers.js → misc.helpers.mjs} +3 -1
- package/dist/helpers/style.helper.d.mts +6 -0
- package/dist/helpers/style.helper.mjs +8 -0
- package/dist/index.d.mts +7 -0
- package/dist/{index.js → index.mjs} +3 -1
- package/dist/managers/column.manager.d.mts +2 -0
- package/dist/managers/{column.manager.js → column.manager.mjs} +6 -1
- package/dist/managers/data.manager.d.mts +2 -0
- package/dist/managers/data.manager.mjs +222 -0
- package/dist/managers/event.manager.d.mts +2 -0
- package/dist/managers/{event.manager.js → event.manager.mjs} +12 -8
- package/dist/managers/filter.manager.d.mts +2 -0
- package/dist/managers/{filter.manager.js → filter.manager.mjs} +25 -11
- package/dist/managers/group.manager.d.mts +2 -0
- package/dist/managers/group.manager.mjs +73 -0
- package/dist/managers/navigation.manager.d.mts +2 -0
- package/dist/managers/{navigation.manager.js → navigation.manager.mjs} +27 -24
- package/dist/managers/render.manager.d.mts +2 -0
- package/dist/managers/render.manager.mjs +144 -0
- package/dist/managers/row.manager.d.mts +2 -0
- package/dist/managers/{row.manager.js → row.manager.mjs} +18 -11
- package/dist/managers/selection.manager.d.mts +2 -0
- package/dist/managers/{selection.manager.js → selection.manager.mjs} +57 -48
- package/dist/managers/sort.manager.d.mts +2 -0
- package/dist/managers/{sort.manager.js → sort.manager.mjs} +32 -2
- package/dist/managers/style.manager.d.mts +2 -0
- package/dist/managers/style.manager.mjs +149 -0
- package/dist/models/body.model.d.mts +2 -0
- package/dist/models/body.model.mjs +1 -0
- package/dist/models/column.model.d.mts +2 -0
- package/dist/models/column.model.mjs +1 -0
- package/dist/models/data.model.d.mts +2 -0
- package/dist/models/data.model.mjs +1 -0
- package/dist/models/filter.model.d.mts +2 -0
- package/dist/models/filter.model.mjs +1 -0
- package/dist/models/footer.model.d.mts +2 -0
- package/dist/models/footer.model.mjs +1 -0
- package/dist/models/group.model.d.mts +2 -0
- package/dist/models/group.model.mjs +1 -0
- package/dist/models/header.model.d.mts +2 -0
- package/dist/models/header.model.mjs +1 -0
- package/dist/models/render.model.d.mts +2 -0
- package/dist/models/render.model.mjs +1 -0
- package/dist/models/selection.model.d.mts +2 -0
- package/dist/models/selection.model.mjs +1 -0
- package/dist/models/sort.model.d.mts +2 -0
- package/dist/models/sort.model.mjs +1 -0
- package/dist/models/style.model.d.mts +23 -0
- package/dist/models/style.model.mjs +23 -0
- package/dist/models/tabela.model.d.mts +2 -0
- package/dist/models/tabela.model.mjs +1 -0
- package/dist/models/tabela.options.d.mts +2 -0
- package/dist/models/tabela.options.mjs +1 -0
- package/dist/selection.model-rwQe9fco.d.mts +12 -0
- package/dist/sort.model-CauImaLu.d.mts +15 -0
- package/dist/tabela.d.mts +21 -0
- package/dist/{tabela.full.js → tabela.full.mjs} +1407 -1124
- package/dist/tabela.mjs +126 -0
- package/dist/tabela.options-RkZvfptB.d.mts +14 -0
- package/package.json +45 -37
- package/src/components/body.component.ts +4 -3
- package/src/components/column.component.ts +19 -24
- package/src/components/footer.component.ts +8 -3
- package/src/components/group.component.ts +85 -0
- package/src/components/header.component.ts +3 -2
- package/src/components/row.component.ts +10 -8
- package/src/helpers/dom.helpers.ts +24 -20
- package/src/helpers/style.helper.ts +1 -1
- package/src/managers/column.manager.ts +8 -4
- package/src/managers/data.manager.ts +265 -61
- package/src/managers/event.manager.ts +14 -11
- package/src/managers/filter.manager.ts +38 -19
- package/src/managers/group.manager.ts +131 -0
- package/src/managers/navigation.manager.ts +25 -23
- package/src/managers/render.manager.ts +84 -32
- package/src/managers/row.manager.ts +23 -11
- package/src/managers/selection.manager.ts +68 -54
- package/src/managers/sort.manager.ts +81 -16
- package/src/managers/style.manager.ts +156 -0
- package/src/models/column.model.ts +2 -2
- package/src/models/data.model.ts +23 -9
- package/src/models/filter.model.ts +11 -3
- package/src/models/group.model.ts +8 -0
- package/src/models/render.model.ts +2 -2
- package/src/models/selection.model.ts +9 -0
- package/src/models/sort.model.ts +11 -3
- package/src/models/style.model.ts +39 -0
- package/src/models/tabela.model.ts +14 -46
- package/src/models/tabela.options.ts +3 -2
- package/src/tabela.ts +72 -41
- package/dist/helpers/style.helper.js +0 -6
- package/dist/managers/data.manager.js +0 -120
- package/dist/managers/render.manager.js +0 -110
- package/dist/models/body.model.js +0 -0
- package/dist/models/column.model.js +0 -0
- package/dist/models/data.model.js +0 -0
- package/dist/models/filter.model.js +0 -0
- package/dist/models/footer.model.js +0 -0
- package/dist/models/header.model.js +0 -0
- package/dist/models/render.model.js +0 -0
- package/dist/models/sort.model.js +0 -0
- package/dist/models/tabela.model.js +0 -0
- package/dist/models/tabela.options.js +0 -0
- package/dist/tabela.js +0 -102
- package/types/components/body.component.d.ts +0 -6
- package/types/components/column.component.d.ts +0 -13
- package/types/components/footer.component.d.ts +0 -8
- package/types/components/header.component.d.ts +0 -8
- package/types/components/row.component.d.ts +0 -11
- package/types/helpers/dom.helpers.d.ts +0 -10
- package/types/helpers/misc.helpers.d.ts +0 -2
- package/types/helpers/style.helper.d.ts +0 -1
- package/types/index.d.ts +0 -4
- package/types/managers/column.manager.d.ts +0 -12
- package/types/managers/data.manager.d.ts +0 -27
- package/types/managers/event.manager.d.ts +0 -7
- package/types/managers/filter.manager.d.ts +0 -19
- package/types/managers/navigation.manager.d.ts +0 -10
- package/types/managers/render.manager.d.ts +0 -16
- package/types/managers/row.manager.d.ts +0 -13
- package/types/managers/selection.manager.d.ts +0 -18
- package/types/managers/sort.manager.d.ts +0 -26
- package/types/models/body.model.d.ts +0 -4
- package/types/models/column.model.d.ts +0 -13
- package/types/models/data.model.d.ts +0 -14
- package/types/models/filter.model.d.ts +0 -6
- package/types/models/footer.model.d.ts +0 -5
- package/types/models/header.model.d.ts +0 -4
- package/types/models/render.model.d.ts +0 -13
- package/types/models/sort.model.d.ts +0 -5
- package/types/models/tabela.model.d.ts +0 -69
- package/types/models/tabela.options.d.ts +0 -9
- package/types/tabela.d.ts +0 -12
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/helpers/dom.helpers.d.ts
|
|
2
|
+
type RowGroupWithRow = {
|
|
3
|
+
group: HTMLDivElement;
|
|
4
|
+
row: HTMLDivElement;
|
|
5
|
+
};
|
|
6
|
+
declare function createCell(width: number, body?: boolean): HTMLDivElement;
|
|
7
|
+
declare function createElement<TagName extends keyof HTMLElementTagNameMap>(tagName: TagName, properties?: Partial<HTMLElementTagNameMap[TagName]>, attributes?: Record<string, string>, style?: Partial<CSSStyleDeclaration>): HTMLElementTagNameMap[TagName];
|
|
8
|
+
declare function createRowGroup(): RowGroupWithRow;
|
|
9
|
+
declare function createRowGroup(withRow: boolean): HTMLDivElement;
|
|
10
|
+
declare function createRow(): HTMLDivElement;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -1,26 +1,29 @@
|
|
|
1
|
+
import { CSS_TABELA_CELL, CSS_TABELA_CELL_BODY, CSS_TABELA_ROW, CSS_TABELA_ROWGROUP } from "../models/style.model.mjs";
|
|
1
2
|
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
2
3
|
import { setStyles } from "@oscarpalmer/toretto/style";
|
|
4
|
+
//#region src/helpers/dom.helpers.ts
|
|
3
5
|
function createCell(width, body) {
|
|
4
6
|
const cell = createElement("div", {
|
|
5
|
-
className:
|
|
7
|
+
className: CSS_TABELA_CELL,
|
|
6
8
|
role: "cell"
|
|
7
9
|
}, {}, { width: `${width}px` });
|
|
8
|
-
if (body ?? true) cell.classList.add(
|
|
10
|
+
if (body ?? true) cell.classList.add(CSS_TABELA_CELL_BODY);
|
|
9
11
|
return cell;
|
|
10
12
|
}
|
|
11
13
|
function createElement(tagName, properties, attributes, style) {
|
|
12
14
|
const element = document.createElement(tagName);
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const props = properties ?? {};
|
|
16
|
+
const keys = Object.keys(props);
|
|
17
|
+
for (const key of keys) element[key] = props[key];
|
|
18
|
+
setAttributes(element, attributes ?? {});
|
|
19
|
+
setStyles(element, style ?? {});
|
|
17
20
|
return element;
|
|
18
21
|
}
|
|
19
22
|
function createRowGroup(withRow) {
|
|
20
23
|
const group = createElement("div", {
|
|
21
|
-
className:
|
|
24
|
+
className: CSS_TABELA_ROWGROUP,
|
|
22
25
|
role: "rowgroup"
|
|
23
|
-
}
|
|
26
|
+
});
|
|
24
27
|
if (!(withRow ?? true)) return group;
|
|
25
28
|
const row = createRow();
|
|
26
29
|
group.append(row);
|
|
@@ -31,8 +34,9 @@ function createRowGroup(withRow) {
|
|
|
31
34
|
}
|
|
32
35
|
function createRow() {
|
|
33
36
|
return createElement("div", {
|
|
34
|
-
className:
|
|
37
|
+
className: CSS_TABELA_ROW,
|
|
35
38
|
role: "row"
|
|
36
|
-
}, {}, {});
|
|
39
|
+
}, {}, { height: "32px" });
|
|
37
40
|
}
|
|
41
|
+
//#endregion
|
|
38
42
|
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
//#region src/helpers/misc.helpers.ts
|
|
1
2
|
function getKey(value) {
|
|
2
3
|
if (typeof value === "number") return value;
|
|
3
4
|
if (typeof value !== "string") return;
|
|
4
5
|
return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
+
const integerExpression = /^\d+$/;
|
|
8
|
+
//#endregion
|
|
7
9
|
export { getKey };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { t as TabelaOptions } from "./tabela.options-RkZvfptB.mjs";
|
|
2
|
+
import { Tabela } from "./tabela.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/index.d.ts
|
|
5
|
+
declare function tabela(element: HTMLElement, options: TabelaOptions): Tabela;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { type Tabela, type TabelaOptions, tabela };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ColumnComponent } from "../components/column.component.
|
|
1
|
+
import { ColumnComponent } from "../components/column.component.mjs";
|
|
2
|
+
//#region src/managers/column.manager.ts
|
|
2
3
|
var ColumnManager = class {
|
|
3
4
|
items = [];
|
|
4
5
|
constructor(state) {
|
|
@@ -11,6 +12,9 @@ var ColumnManager = class {
|
|
|
11
12
|
this.items = void 0;
|
|
12
13
|
this.state = void 0;
|
|
13
14
|
}
|
|
15
|
+
get(field) {
|
|
16
|
+
return this.items.find((item) => item.options.field === field);
|
|
17
|
+
}
|
|
14
18
|
remove(value) {
|
|
15
19
|
const { items, state } = this;
|
|
16
20
|
const { components, managers } = state;
|
|
@@ -36,4 +40,5 @@ var ColumnManager = class {
|
|
|
36
40
|
footer.update(items);
|
|
37
41
|
}
|
|
38
42
|
};
|
|
43
|
+
//#endregion
|
|
39
44
|
export { ColumnManager };
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { GroupComponent, updateGroup } from "../components/group.component.mjs";
|
|
2
|
+
import { sortWithGroups } from "./sort.manager.mjs";
|
|
3
|
+
import { chunk, select, sort } from "@oscarpalmer/atoms/array";
|
|
4
|
+
import { toMap } from "@oscarpalmer/atoms/array/to-map";
|
|
5
|
+
import { toRecord } from "@oscarpalmer/atoms/array/to-record";
|
|
6
|
+
import { isPlainObject } from "@oscarpalmer/atoms/is";
|
|
7
|
+
import { delay } from "@oscarpalmer/atoms/promise/delay";
|
|
8
|
+
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
9
|
+
//#region src/managers/data.manager.ts
|
|
10
|
+
var DataManager = class {
|
|
11
|
+
handlers = Object.freeze({
|
|
12
|
+
add: (data) => void this.add(data, true),
|
|
13
|
+
clear: () => void this.clear(),
|
|
14
|
+
get: (active) => this.get(active),
|
|
15
|
+
remove: (items) => void this.remove(items, true),
|
|
16
|
+
synchronize: (data, remove) => void this.synchronize(data, remove),
|
|
17
|
+
update: (data) => void this.update(data)
|
|
18
|
+
});
|
|
19
|
+
state;
|
|
20
|
+
get items() {
|
|
21
|
+
return this.state.items.active ?? this.state.items.original;
|
|
22
|
+
}
|
|
23
|
+
get size() {
|
|
24
|
+
return this.items.length;
|
|
25
|
+
}
|
|
26
|
+
constructor(state) {
|
|
27
|
+
this.state = {
|
|
28
|
+
...state,
|
|
29
|
+
items: { original: [] },
|
|
30
|
+
values: {
|
|
31
|
+
array: [],
|
|
32
|
+
mapped: /* @__PURE__ */ new Map()
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async add(data, render) {
|
|
37
|
+
const { state } = this;
|
|
38
|
+
const groups = [];
|
|
39
|
+
const updates = [];
|
|
40
|
+
let groupColumn;
|
|
41
|
+
let { length } = data;
|
|
42
|
+
for (let index = 0; index < length; index += 1) {
|
|
43
|
+
const item = data[index];
|
|
44
|
+
const key = getValue(item, state.key);
|
|
45
|
+
if (state.values.mapped.has(key)) {
|
|
46
|
+
updates.push(item);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
state.values.array.push(item);
|
|
50
|
+
state.values.mapped.set(key, item);
|
|
51
|
+
if (!state.managers.group.enabled) continue;
|
|
52
|
+
const groupValue = getValue(item, state.managers.group.field);
|
|
53
|
+
let group = state.managers.group.get(groupValue);
|
|
54
|
+
if (group == null) {
|
|
55
|
+
groupColumn ??= state.managers.column.get(state.managers.group.field);
|
|
56
|
+
group = new GroupComponent(`${groupColumn?.options.title ?? state.managers.group.field}: ${groupValue}`, groupValue);
|
|
57
|
+
state.values.array.push(group);
|
|
58
|
+
state.managers.group.add(group);
|
|
59
|
+
}
|
|
60
|
+
if (!group.expanded) state.managers.group.collapsed.add(key);
|
|
61
|
+
group.total += 1;
|
|
62
|
+
groups.push(group);
|
|
63
|
+
}
|
|
64
|
+
length = groups.length;
|
|
65
|
+
for (let index = 0; index < length; index += 1) updateGroup(state, groups[index]);
|
|
66
|
+
if (updates.length > 0) this.update(updates);
|
|
67
|
+
else if (render) this.render();
|
|
68
|
+
}
|
|
69
|
+
clear() {
|
|
70
|
+
if (this.state.values.array.length > 0) this.removeItems([], true, true);
|
|
71
|
+
}
|
|
72
|
+
destroy() {
|
|
73
|
+
const { state } = this;
|
|
74
|
+
state.values.mapped.clear();
|
|
75
|
+
state.items.active = void 0;
|
|
76
|
+
state.items.original.length = 0;
|
|
77
|
+
state.values.array.length = 0;
|
|
78
|
+
this.handlers = void 0;
|
|
79
|
+
this.state = void 0;
|
|
80
|
+
}
|
|
81
|
+
get(active) {
|
|
82
|
+
const { state } = this;
|
|
83
|
+
return active ?? false ? select(state.items.active ?? [], (key) => !(key instanceof GroupComponent), (key) => state.values.mapped.get(key)) : state.values.array.filter((item) => !(item instanceof GroupComponent));
|
|
84
|
+
}
|
|
85
|
+
getIndex(item) {
|
|
86
|
+
if (item instanceof GroupComponent) return this.items.indexOf(item);
|
|
87
|
+
return this.items.findIndex((value) => value instanceof GroupComponent ? value.key === item : value === item);
|
|
88
|
+
}
|
|
89
|
+
async remove(items, render) {
|
|
90
|
+
const { state } = this;
|
|
91
|
+
const keys = items.map((value) => isPlainObject(value) ? getValue(value, state.key) : value);
|
|
92
|
+
const { length } = keys;
|
|
93
|
+
if (length > 0) return this.removeItems(keys, false, render === true);
|
|
94
|
+
}
|
|
95
|
+
async removeItems(items, clear, render) {
|
|
96
|
+
const { state } = this;
|
|
97
|
+
if (clear) {
|
|
98
|
+
state.items.active = void 0;
|
|
99
|
+
state.items.original = [];
|
|
100
|
+
state.values.array = [];
|
|
101
|
+
state.values.mapped.clear();
|
|
102
|
+
state.managers.row.clear();
|
|
103
|
+
if (state.managers.group.enabled) state.managers.group.clear();
|
|
104
|
+
return this.render();
|
|
105
|
+
}
|
|
106
|
+
const groups = [];
|
|
107
|
+
const chunked = chunk(items);
|
|
108
|
+
const chunkedLength = chunked.length;
|
|
109
|
+
for (let chunkedIndex = 0; chunkedIndex < chunkedLength; chunkedIndex += 1) {
|
|
110
|
+
const chunk = chunked[chunkedIndex];
|
|
111
|
+
const chunkLength = chunk.length;
|
|
112
|
+
for (let itemIndex = 0; itemIndex < chunkLength; itemIndex += 1) {
|
|
113
|
+
const item = chunk[itemIndex];
|
|
114
|
+
const dataIndex = state.items.original.indexOf(item);
|
|
115
|
+
let dataValue;
|
|
116
|
+
[dataValue] = state.values.array.splice(dataIndex, 1);
|
|
117
|
+
state.items.original.splice(dataIndex, 1);
|
|
118
|
+
state.managers.row.remove(item);
|
|
119
|
+
state.values.mapped.delete(item);
|
|
120
|
+
if (!state.managers.group.enabled || item instanceof GroupComponent) continue;
|
|
121
|
+
state.managers.group.collapsed.delete(item);
|
|
122
|
+
const groupKey = getValue(dataValue, state.managers.group.field);
|
|
123
|
+
const group = state.managers.group.get(groupKey);
|
|
124
|
+
if (group == null) continue;
|
|
125
|
+
group.total -= 1;
|
|
126
|
+
if (group.total > 0) {
|
|
127
|
+
groups.push(group);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
let groupIndex = groups.indexOf(group);
|
|
131
|
+
if (groupIndex > -1) groups.splice(groupIndex, 1);
|
|
132
|
+
groupIndex = state.values.array.indexOf(group);
|
|
133
|
+
if (groupIndex > -1) {
|
|
134
|
+
state.items.original.splice(groupIndex, 1);
|
|
135
|
+
state.values.array.splice(groupIndex, 1);
|
|
136
|
+
}
|
|
137
|
+
state.managers.group.remove(group);
|
|
138
|
+
if (items.length >= 1e4) await delay(25);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const { length } = groups;
|
|
142
|
+
for (let index = 0; index < length; index += 1) updateGroup(state, groups[index]);
|
|
143
|
+
if (render) return this.render();
|
|
144
|
+
}
|
|
145
|
+
render() {
|
|
146
|
+
const { state } = this;
|
|
147
|
+
if (state.managers.group.enabled) sortWithGroups(state, state.values.array, [{
|
|
148
|
+
direction: "ascending",
|
|
149
|
+
key: state.key
|
|
150
|
+
}]);
|
|
151
|
+
else sort(state.values.array, [{
|
|
152
|
+
direction: "ascending",
|
|
153
|
+
key: state.key
|
|
154
|
+
}]);
|
|
155
|
+
state.items.original = state.values.array.map((item) => item instanceof GroupComponent ? item : getValue(item, state.key));
|
|
156
|
+
state.values.mapped = toMap(state.values.array.filter((item) => !(item instanceof GroupComponent)), (item) => getValue(item, state.key));
|
|
157
|
+
if (Object.keys(state.managers.filter.items).length > 0) state.managers.filter.filter();
|
|
158
|
+
else if (state.managers.sort.items.length > 0) state.managers.sort.sort();
|
|
159
|
+
else state.managers.render.update(true, true);
|
|
160
|
+
}
|
|
161
|
+
set(data) {
|
|
162
|
+
const { state } = this;
|
|
163
|
+
const array = data.slice();
|
|
164
|
+
if (state.managers.group.enabled) {
|
|
165
|
+
const column = state.managers.column.get(state.managers.group.field);
|
|
166
|
+
const grouped = toRecord.arrays(data, state.managers.group.field);
|
|
167
|
+
const entries = Object.entries(grouped);
|
|
168
|
+
const { length } = entries;
|
|
169
|
+
const groups = [];
|
|
170
|
+
for (let index = 0; index < length; index += 1) {
|
|
171
|
+
const [value, items] = entries[index];
|
|
172
|
+
const group = new GroupComponent(`${column?.options.title ?? state.managers.group.field}: ${value}`, value);
|
|
173
|
+
group.total = items.length;
|
|
174
|
+
groups.push(group);
|
|
175
|
+
array.push(group);
|
|
176
|
+
}
|
|
177
|
+
state.managers.group.set(groups);
|
|
178
|
+
}
|
|
179
|
+
state.values.array = array;
|
|
180
|
+
this.render();
|
|
181
|
+
}
|
|
182
|
+
async synchronize(data, remove) {
|
|
183
|
+
const { state } = this;
|
|
184
|
+
const add = [];
|
|
185
|
+
const updated = [];
|
|
186
|
+
const keys = /* @__PURE__ */ new Set([]);
|
|
187
|
+
const { length } = data;
|
|
188
|
+
for (let index = 0; index < length; index += 1) {
|
|
189
|
+
const object = data[index];
|
|
190
|
+
const key = getValue(object, state.key);
|
|
191
|
+
if (state.values.mapped.has(key)) updated.push(object);
|
|
192
|
+
else add.push(object);
|
|
193
|
+
keys.add(key);
|
|
194
|
+
}
|
|
195
|
+
if (keys.size === 0) return;
|
|
196
|
+
if (remove ?? false) {
|
|
197
|
+
const toRemove = state.items.original.filter((key) => !(key instanceof GroupComponent) && !keys.has(key));
|
|
198
|
+
if (toRemove.length > 0) await this.remove(toRemove, false);
|
|
199
|
+
}
|
|
200
|
+
await this.update(updated);
|
|
201
|
+
if (add.length > 0) await this.add(add, false);
|
|
202
|
+
if (add.length > 0 || (remove ?? false)) this.render();
|
|
203
|
+
}
|
|
204
|
+
async update(data) {
|
|
205
|
+
const { state } = this;
|
|
206
|
+
const { length } = data;
|
|
207
|
+
for (let index = 0; index < length; index += 1) {
|
|
208
|
+
const object = data[index];
|
|
209
|
+
const key = getValue(object, state.key);
|
|
210
|
+
const value = state.values.mapped.get(key);
|
|
211
|
+
if (value != null) {
|
|
212
|
+
state.values.mapped.set(key, {
|
|
213
|
+
...value,
|
|
214
|
+
...object
|
|
215
|
+
});
|
|
216
|
+
state.managers.row.update(key);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
//#endregion
|
|
222
|
+
export { DataManager };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { on } from "@oscarpalmer/toretto/event";
|
|
2
2
|
import { findAncestor } from "@oscarpalmer/toretto/find";
|
|
3
|
+
//#region src/managers/event.manager.ts
|
|
3
4
|
var EventManager = class {
|
|
4
5
|
constructor(state) {
|
|
5
6
|
this.state = state;
|
|
@@ -17,11 +18,14 @@ var EventManager = class {
|
|
|
17
18
|
};
|
|
18
19
|
function onClick(event) {
|
|
19
20
|
const target = findAncestor(event, "[data-event]");
|
|
20
|
-
const table = findAncestor(event, ".
|
|
21
|
+
const table = findAncestor(event, ".tabela__table");
|
|
21
22
|
if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) return;
|
|
22
23
|
const manager = mapped.get(table);
|
|
23
24
|
if (manager == null) return;
|
|
24
25
|
switch (target?.getAttribute("data-event")) {
|
|
26
|
+
case "group":
|
|
27
|
+
manager.state.managers.group.handle(target);
|
|
28
|
+
break;
|
|
25
29
|
case "heading":
|
|
26
30
|
manager.onSort(event, target);
|
|
27
31
|
break;
|
|
@@ -33,18 +37,18 @@ function onClick(event) {
|
|
|
33
37
|
}
|
|
34
38
|
function onKeydown(event) {
|
|
35
39
|
const target = findAncestor(event, "[data-event]");
|
|
36
|
-
const table = findAncestor(event, ".
|
|
40
|
+
const table = findAncestor(event, ".tabela__table");
|
|
37
41
|
if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) return;
|
|
38
42
|
const manager = mapped.get(table);
|
|
39
43
|
if (manager == null) return;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
break;
|
|
44
|
-
default: break;
|
|
44
|
+
if (event.key === " ") {
|
|
45
|
+
event.preventDefault();
|
|
46
|
+
return;
|
|
45
47
|
}
|
|
48
|
+
manager.state.managers.navigation.handle(event);
|
|
46
49
|
}
|
|
47
|
-
|
|
50
|
+
const mapped = /* @__PURE__ */ new WeakMap();
|
|
48
51
|
on(document, "click", onClick);
|
|
49
52
|
on(document, "keydown", onKeydown, { passive: false });
|
|
53
|
+
//#endregion
|
|
50
54
|
export { EventManager };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GroupComponent } from "../components/group.component.mjs";
|
|
2
2
|
import { getString } from "@oscarpalmer/atoms/string";
|
|
3
|
+
import { getNumber } from "@oscarpalmer/atoms/number";
|
|
3
4
|
import { endsWith, includes, startsWith } from "@oscarpalmer/atoms/string/match";
|
|
4
5
|
import { equal } from "@oscarpalmer/atoms/value/equal";
|
|
6
|
+
//#region src/managers/filter.manager.ts
|
|
5
7
|
var FilterManager = class {
|
|
6
8
|
handlers = Object.freeze({
|
|
7
9
|
add: (item) => this.add(item),
|
|
@@ -15,7 +17,7 @@ var FilterManager = class {
|
|
|
15
17
|
}
|
|
16
18
|
add(item) {
|
|
17
19
|
if (this.items[item.field] == null) this.items[item.field] = [];
|
|
18
|
-
else if (this.items[item.field].findIndex((existing) => equal(existing, item))
|
|
20
|
+
else if (this.items[item.field].findIndex((existing) => equal(existing, item)) > -1) return;
|
|
19
21
|
this.items[item.field].push(item);
|
|
20
22
|
this.filter();
|
|
21
23
|
}
|
|
@@ -34,10 +36,14 @@ var FilterManager = class {
|
|
|
34
36
|
const { state } = this;
|
|
35
37
|
const filtered = [];
|
|
36
38
|
const filters = Object.entries(this.items);
|
|
37
|
-
const
|
|
38
|
-
rowLoop: for (let
|
|
39
|
-
const
|
|
40
|
-
|
|
39
|
+
const itemsLength = state.managers.data.state.items.original.length;
|
|
40
|
+
rowLoop: for (let itemIndex = 0; itemIndex < itemsLength; itemIndex += 1) {
|
|
41
|
+
const item = state.managers.data.state.items.original[itemIndex];
|
|
42
|
+
if (item instanceof GroupComponent) {
|
|
43
|
+
filtered.push(item);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const row = state.managers.data.state.values.mapped.get(item);
|
|
41
47
|
if (row == null) continue;
|
|
42
48
|
filterLoop: for (let filterIndex = 0; filterIndex < filters.length; filterIndex += 1) {
|
|
43
49
|
const [field, items] = filters[filterIndex];
|
|
@@ -48,16 +54,23 @@ var FilterManager = class {
|
|
|
48
54
|
}
|
|
49
55
|
continue rowLoop;
|
|
50
56
|
}
|
|
51
|
-
filtered.push(
|
|
57
|
+
filtered.push(item);
|
|
52
58
|
}
|
|
53
|
-
state.managers.data.
|
|
59
|
+
state.managers.data.state.items.active = filtered;
|
|
54
60
|
if (state.managers.sort.items.length > 0) state.managers.sort.sort();
|
|
55
61
|
else state.managers.render.update(true, true);
|
|
56
62
|
}
|
|
57
63
|
remove(value) {
|
|
58
64
|
if (typeof value === "string") {
|
|
59
65
|
if (this.items[value] == null) return;
|
|
60
|
-
|
|
66
|
+
const keyed = {};
|
|
67
|
+
const filters = Object.keys(this.items);
|
|
68
|
+
const { length } = filters;
|
|
69
|
+
for (let index = 0; index < length; index += 1) {
|
|
70
|
+
const field = filters[index];
|
|
71
|
+
if (field !== value) keyed[field] = this.items[field];
|
|
72
|
+
}
|
|
73
|
+
this.items = keyed;
|
|
61
74
|
} else {
|
|
62
75
|
const { field } = value;
|
|
63
76
|
if (this.items[field] == null) return;
|
|
@@ -77,7 +90,7 @@ var FilterManager = class {
|
|
|
77
90
|
this.filter();
|
|
78
91
|
}
|
|
79
92
|
};
|
|
80
|
-
|
|
93
|
+
const comparators = {
|
|
81
94
|
contains: (row, filter) => includes(getString(row), getString(filter), true),
|
|
82
95
|
"ends-with": (row, filter) => endsWith(getString(row), getString(filter), true),
|
|
83
96
|
equals: (row, filter) => equalizer(row, filter),
|
|
@@ -89,5 +102,6 @@ var comparators = {
|
|
|
89
102
|
"not-equals": (row, filter) => !equalizer(row, filter),
|
|
90
103
|
"starts-with": (row, filter) => startsWith(getString(row), getString(filter), true)
|
|
91
104
|
};
|
|
92
|
-
|
|
105
|
+
const equalizer = equal.initialize({ ignoreCase: true });
|
|
106
|
+
//#endregion
|
|
93
107
|
export { FilterManager };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { removeGroup } from "../components/group.component.mjs";
|
|
2
|
+
import { sort } from "@oscarpalmer/atoms/array";
|
|
3
|
+
import { toRecord } from "@oscarpalmer/atoms/array/to-record";
|
|
4
|
+
import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
|
|
5
|
+
import { getString } from "@oscarpalmer/atoms/string";
|
|
6
|
+
//#region src/managers/group.manager.ts
|
|
7
|
+
var GroupManager = class {
|
|
8
|
+
collapsed = /* @__PURE__ */ new Set();
|
|
9
|
+
enabled = false;
|
|
10
|
+
field;
|
|
11
|
+
handlers = Object.freeze({ set: (group) => {
|
|
12
|
+
if (group === this.field) return;
|
|
13
|
+
this.enabled = !isNullableOrWhitespace(group);
|
|
14
|
+
this.field = group ?? "";
|
|
15
|
+
this.state.managers.data.set(this.state.managers.data.get());
|
|
16
|
+
} });
|
|
17
|
+
items = [];
|
|
18
|
+
order = {};
|
|
19
|
+
constructor(state) {
|
|
20
|
+
this.state = state;
|
|
21
|
+
if (isNullableOrWhitespace(state.options.grouping)) return;
|
|
22
|
+
this.enabled = true;
|
|
23
|
+
this.field = state.options.grouping;
|
|
24
|
+
}
|
|
25
|
+
add(group) {
|
|
26
|
+
this.set([...this.items, group]);
|
|
27
|
+
}
|
|
28
|
+
clear() {
|
|
29
|
+
const groups = this.items.splice(0);
|
|
30
|
+
const { length } = groups;
|
|
31
|
+
for (let index = 0; index < length; index += 1) this.remove(groups[index]);
|
|
32
|
+
}
|
|
33
|
+
destroy() {
|
|
34
|
+
const groups = this.items.splice(0);
|
|
35
|
+
const { length } = groups;
|
|
36
|
+
for (let index = 0; index < length; index += 1) removeGroup(groups[index]);
|
|
37
|
+
this.collapsed.clear();
|
|
38
|
+
this.handlers = void 0;
|
|
39
|
+
this.state = void 0;
|
|
40
|
+
}
|
|
41
|
+
get(value) {
|
|
42
|
+
const asString = getString(value);
|
|
43
|
+
return this.items.find((item) => item.value.stringified === asString);
|
|
44
|
+
}
|
|
45
|
+
handle(button) {
|
|
46
|
+
const value = button.dataset.key?.replace(`tabela_${this.state.id}_group:`, "");
|
|
47
|
+
const group = this.get(value);
|
|
48
|
+
if (group == null) return;
|
|
49
|
+
const { collapsed, items, state } = this;
|
|
50
|
+
group.expanded = !group.expanded;
|
|
51
|
+
const index = items.indexOf(group);
|
|
52
|
+
let first = state.managers.data.state.items.original.indexOf(items[index]) + 1;
|
|
53
|
+
const last = items[index + 1] == null ? state.managers.data.state.items.original.length - 1 : state.managers.data.state.items.original.indexOf(items[index + 1]) - 1;
|
|
54
|
+
for (; first <= last; first += 1) {
|
|
55
|
+
const key = state.managers.data.state.items.original[first];
|
|
56
|
+
if (group.expanded) collapsed.delete(key);
|
|
57
|
+
else collapsed.add(key);
|
|
58
|
+
}
|
|
59
|
+
if (Object.keys(state.managers.filter.items).length > 0) state.managers.filter.filter();
|
|
60
|
+
else if (state.managers.sort.items.length > 0) state.managers.sort.sort();
|
|
61
|
+
else state.managers.render.update(true, true);
|
|
62
|
+
}
|
|
63
|
+
remove(group) {
|
|
64
|
+
removeGroup(group);
|
|
65
|
+
this.set(this.items.filter((item) => item !== group));
|
|
66
|
+
}
|
|
67
|
+
set(items) {
|
|
68
|
+
this.items = sort(items, (item) => item.label);
|
|
69
|
+
this.order = toRecord(items, (group) => group.value.stringified, (_, index) => index);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
//#endregion
|
|
73
|
+
export { GroupManager };
|