@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
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GroupComponent } from "../components/group.component.mjs";
|
|
2
|
+
import { getKey } from "../helpers/misc.helpers.mjs";
|
|
2
3
|
import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
|
|
3
4
|
import { clamp } from "@oscarpalmer/atoms/number";
|
|
5
|
+
//#region src/managers/navigation.manager.ts
|
|
4
6
|
var NavigationManager = class {
|
|
5
7
|
active;
|
|
6
8
|
constructor(state) {
|
|
@@ -14,28 +16,28 @@ var NavigationManager = class {
|
|
|
14
16
|
event.preventDefault();
|
|
15
17
|
const { components, id, managers } = this.state;
|
|
16
18
|
const activeDescendant = components.body.elements.group.getAttribute("aria-activedescendant");
|
|
17
|
-
const
|
|
18
|
-
const { length } =
|
|
19
|
+
const { items } = managers.data;
|
|
20
|
+
const { length } = items;
|
|
19
21
|
let next;
|
|
20
22
|
if (isNullableOrWhitespace(activeDescendant)) next = getDefaultIndex(event.key, length);
|
|
21
|
-
else next = getIndex(event, activeDescendant, id
|
|
22
|
-
if (next != null) this.setActive(
|
|
23
|
+
else next = getIndex(this.state, event, activeDescendant, id);
|
|
24
|
+
if (next != null) this.setActive(items.at(next));
|
|
23
25
|
}
|
|
24
|
-
setActive(
|
|
25
|
-
const { components, managers, options } = this.state;
|
|
26
|
-
this.active =
|
|
26
|
+
setActive(item, scroll) {
|
|
27
|
+
const { components, id, managers, options } = this.state;
|
|
28
|
+
this.active = item;
|
|
27
29
|
const active = components.body.elements.group.querySelectorAll("[data-active=\"true\"]");
|
|
28
30
|
for (const item of active) item.setAttribute("data-active", "false");
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
if (scroll ?? true) if (
|
|
33
|
-
top: managers.data.getIndex(
|
|
31
|
+
const component = item instanceof GroupComponent ? item : managers.row.get(item, false);
|
|
32
|
+
if (component != null) {
|
|
33
|
+
component.element?.setAttribute("data-active", "true");
|
|
34
|
+
if (scroll ?? true) if (component.element == null) components.body.elements.group.scrollTo({
|
|
35
|
+
top: managers.data.getIndex(item) * options.rowHeight,
|
|
34
36
|
behavior: "smooth"
|
|
35
37
|
});
|
|
36
|
-
else
|
|
38
|
+
else component.element.scrollIntoView({ block: "nearest" });
|
|
37
39
|
}
|
|
38
|
-
components.body.elements.group.setAttribute("aria-activedescendant",
|
|
40
|
+
components.body.elements.group.setAttribute("aria-activedescendant", component == null ? "" : `tabela_${id}_${component.key}`);
|
|
39
41
|
}
|
|
40
42
|
};
|
|
41
43
|
function getDefaultIndex(key, max) {
|
|
@@ -46,11 +48,11 @@ function getDefaultIndex(key, max) {
|
|
|
46
48
|
default: return 0;
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
|
-
function getIndex(event, active, id
|
|
50
|
-
const key = getKey(active.replace(`tabela_${id}
|
|
51
|
+
function getIndex(state, event, active, id) {
|
|
52
|
+
const key = getKey(active.replace(`tabela_${id}_`, ""));
|
|
51
53
|
if (key == null) return;
|
|
52
|
-
if (absoluteKeys.has(event.key)) return event.key === "Home" ? 0 :
|
|
53
|
-
return clamp(
|
|
54
|
+
if (absoluteKeys.has(event.key)) return event.key === "Home" ? 0 : state.managers.data.size - 1;
|
|
55
|
+
return clamp(state.managers.data.getIndex(key) + getOffset(event.key), 0, state.managers.data.size - 1, true);
|
|
54
56
|
}
|
|
55
57
|
function getOffset(key) {
|
|
56
58
|
switch (key) {
|
|
@@ -61,13 +63,14 @@ function getOffset(key) {
|
|
|
61
63
|
default: return 0;
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
const absoluteKeys = new Set(["End", "Home"]);
|
|
67
|
+
const arrowKeys = new Set(["ArrowDown", "ArrowUp"]);
|
|
68
|
+
const negativeDefaultKeys = new Set(["ArrowUp", "End"]);
|
|
69
|
+
const pageKeys = new Set(["PageDown", "PageUp"]);
|
|
70
|
+
const allKeys = new Set([
|
|
69
71
|
...absoluteKeys,
|
|
70
72
|
...arrowKeys,
|
|
71
73
|
...pageKeys
|
|
72
74
|
]);
|
|
75
|
+
//#endregion
|
|
73
76
|
export { NavigationManager };
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { GroupComponent, renderGroup } from "../components/group.component.mjs";
|
|
2
|
+
import { removeRow, renderRow } from "../components/row.component.mjs";
|
|
3
|
+
import { on } from "@oscarpalmer/toretto/event";
|
|
4
|
+
//#region src/managers/render.manager.ts
|
|
5
|
+
function getRange(state, down) {
|
|
6
|
+
const { element, managers, options } = state;
|
|
7
|
+
const { clientHeight, scrollTop } = element;
|
|
8
|
+
const { items } = managers.data;
|
|
9
|
+
const firstIndex = Math.floor(scrollTop / options.rowHeight);
|
|
10
|
+
const lastIndex = items.length - managers.group.collapsed.size - 1;
|
|
11
|
+
const last = Math.min(lastIndex, Math.ceil((scrollTop + clientHeight) / options.rowHeight) - 1);
|
|
12
|
+
const visible = clientHeight / options.rowHeight;
|
|
13
|
+
const before = Math.ceil(visible) * (down ? 1 : 2);
|
|
14
|
+
const after = Math.ceil(visible) * (down ? 2 : 1);
|
|
15
|
+
const start = Math.max(0, firstIndex - before);
|
|
16
|
+
return {
|
|
17
|
+
end: Math.min(lastIndex, last + after),
|
|
18
|
+
start
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function onScroll() {
|
|
22
|
+
const { state } = this;
|
|
23
|
+
if (!state.active) {
|
|
24
|
+
requestAnimationFrame(() => {
|
|
25
|
+
const top = state.element.scrollTop;
|
|
26
|
+
this.update(top > state.top);
|
|
27
|
+
state.active = false;
|
|
28
|
+
state.top = top;
|
|
29
|
+
});
|
|
30
|
+
state.active = true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
var RenderManager = class {
|
|
34
|
+
fragment;
|
|
35
|
+
listener;
|
|
36
|
+
pool = {
|
|
37
|
+
cells: {},
|
|
38
|
+
rows: []
|
|
39
|
+
};
|
|
40
|
+
state;
|
|
41
|
+
visible = /* @__PURE__ */ new Map();
|
|
42
|
+
constructor(state) {
|
|
43
|
+
this.listener = on(state.element, "scroll", onScroll.bind(this));
|
|
44
|
+
this.state = {
|
|
45
|
+
...state,
|
|
46
|
+
active: false,
|
|
47
|
+
top: 0
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
destroy() {
|
|
51
|
+
const { listener, pool, visible } = this;
|
|
52
|
+
listener();
|
|
53
|
+
visible.clear();
|
|
54
|
+
const cells = Object.values(pool.cells).flat();
|
|
55
|
+
let { length } = cells;
|
|
56
|
+
for (let index = 0; index < length; index += 1) cells[index].remove();
|
|
57
|
+
length = pool.rows.length;
|
|
58
|
+
for (let index = 0; index < length; index += 1) pool.rows[index].remove();
|
|
59
|
+
pool.cells = {};
|
|
60
|
+
pool.rows = [];
|
|
61
|
+
this.fragment = void 0;
|
|
62
|
+
this.listener = void 0;
|
|
63
|
+
this.pool = void 0;
|
|
64
|
+
this.state = void 0;
|
|
65
|
+
this.visible = void 0;
|
|
66
|
+
}
|
|
67
|
+
removeCells(fields) {
|
|
68
|
+
const { pool, state, visible } = this;
|
|
69
|
+
const { length } = fields;
|
|
70
|
+
for (let index = 0; index < length; index += 1) delete pool.cells[fields[index]];
|
|
71
|
+
for (const [, key] of visible) {
|
|
72
|
+
if (key instanceof GroupComponent) continue;
|
|
73
|
+
const row = state.managers.row.get(key, false);
|
|
74
|
+
if (row == null || row.element == null) continue;
|
|
75
|
+
for (let index = 0; index < length; index += 1) {
|
|
76
|
+
row.cells[fields[index]].innerHTML = "";
|
|
77
|
+
row.cells[fields[index]].remove();
|
|
78
|
+
delete row.cells[fields[index]];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
getFragment() {
|
|
83
|
+
this.fragment ??= document.createDocumentFragment();
|
|
84
|
+
this.fragment.replaceChildren();
|
|
85
|
+
return this.fragment;
|
|
86
|
+
}
|
|
87
|
+
update(down, rerender) {
|
|
88
|
+
const { state, pool, visible } = this;
|
|
89
|
+
const { components, managers, options } = state;
|
|
90
|
+
components.body.elements.faker.style.height = `${(managers.data.size - managers.group.collapsed.size) * options.rowHeight}px`;
|
|
91
|
+
const indices = /* @__PURE__ */ new Set();
|
|
92
|
+
const range = getRange(state, down);
|
|
93
|
+
for (let index = range.start; index <= range.end; index += 1) indices.add(index);
|
|
94
|
+
let remove = rerender ?? false;
|
|
95
|
+
for (const [index, key] of visible) {
|
|
96
|
+
if (key instanceof GroupComponent) {
|
|
97
|
+
if (remove || !indices.has(index)) {
|
|
98
|
+
visible.delete(index);
|
|
99
|
+
key.element?.remove();
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const row = managers.row.get(key, false);
|
|
104
|
+
if (remove || row == null || !indices.has(index) || managers.group.collapsed.has(key)) {
|
|
105
|
+
visible.delete(index);
|
|
106
|
+
if (row != null) removeRow(pool, row);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const fragment = this.getFragment();
|
|
110
|
+
const { items } = managers.data;
|
|
111
|
+
let count = 0;
|
|
112
|
+
let offset = 0;
|
|
113
|
+
for (let index = range.start; index <= range.end + offset; index += 1) {
|
|
114
|
+
if (visible.has(index)) continue;
|
|
115
|
+
const item = items[index];
|
|
116
|
+
if (item instanceof GroupComponent) {
|
|
117
|
+
count += 1;
|
|
118
|
+
renderGroup(state, item);
|
|
119
|
+
visible.set(index, item);
|
|
120
|
+
if (item.element != null) {
|
|
121
|
+
item.element.style.transform = `translateY(${(index - offset) * options.rowHeight}px)`;
|
|
122
|
+
fragment.append(item.element);
|
|
123
|
+
}
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const row = managers.row.get(item, true);
|
|
127
|
+
if (row == null) continue;
|
|
128
|
+
if (managers.group.collapsed.has(item)) {
|
|
129
|
+
offset += 1;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
count += 1;
|
|
133
|
+
renderRow(state, row);
|
|
134
|
+
visible.set(index, item);
|
|
135
|
+
if (row.element != null) {
|
|
136
|
+
row.element.style.transform = `translateY(${(index - offset) * options.rowHeight}px)`;
|
|
137
|
+
fragment.append(row.element);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (count > 0) components.body.elements.group[down ? "append" : "prepend"](fragment);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
//#endregion
|
|
144
|
+
export { RenderManager };
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import { RowComponent, removeRow, renderRow } from "../components/row.component.
|
|
1
|
+
import { RowComponent, removeRow, renderRow } from "../components/row.component.mjs";
|
|
2
|
+
//#region src/managers/row.manager.ts
|
|
2
3
|
var RowManager = class {
|
|
3
4
|
components = /* @__PURE__ */ new Map();
|
|
4
5
|
constructor(state) {
|
|
5
6
|
this.state = state;
|
|
6
7
|
}
|
|
8
|
+
clear() {
|
|
9
|
+
const { components } = this;
|
|
10
|
+
const rows = [...components.values()];
|
|
11
|
+
const { length } = rows;
|
|
12
|
+
for (let index = 0; index < length; index += 1) this.removeRow(rows[index]);
|
|
13
|
+
components.clear();
|
|
14
|
+
}
|
|
7
15
|
destroy() {
|
|
8
|
-
|
|
9
|
-
const { length } = components;
|
|
10
|
-
for (let index = 0; index < length; index += 1) removeRow(this.state.managers.render.pool, components[index]);
|
|
11
|
-
this.components.clear();
|
|
16
|
+
this.clear();
|
|
12
17
|
this.components = void 0;
|
|
13
18
|
this.state = void 0;
|
|
14
19
|
}
|
|
15
|
-
get(key) {
|
|
20
|
+
get(key, create) {
|
|
16
21
|
let row = this.components.get(key);
|
|
17
|
-
if (row == null) {
|
|
22
|
+
if (row == null && create) {
|
|
18
23
|
row = new RowComponent(key);
|
|
19
24
|
this.components.set(key, row);
|
|
20
25
|
}
|
|
@@ -25,14 +30,16 @@ var RowManager = class {
|
|
|
25
30
|
}
|
|
26
31
|
remove(key) {
|
|
27
32
|
const row = this.components.get(key);
|
|
28
|
-
if (row != null)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
if (row != null) this.removeRow(row);
|
|
34
|
+
}
|
|
35
|
+
removeRow(row) {
|
|
36
|
+
if (row.element != null) removeRow(this.state.managers.render.pool, row);
|
|
37
|
+
this.components.delete(row.key);
|
|
32
38
|
}
|
|
33
39
|
update(key) {
|
|
34
40
|
const row = this.components.get(key);
|
|
35
41
|
if (row != null) renderRow(this.state, row);
|
|
36
42
|
}
|
|
37
43
|
};
|
|
44
|
+
//#endregion
|
|
38
45
|
export { RowManager };
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { CSS_TABELA_ROW_BODY, CSS_TABELA_ROW_SELECTED, CSS_TABELA_SELECTION } from "../models/style.model.mjs";
|
|
2
|
+
import { createElement } from "../helpers/dom.helpers.mjs";
|
|
3
|
+
import { GroupComponent } from "../components/group.component.mjs";
|
|
4
|
+
import { getKey } from "../helpers/misc.helpers.mjs";
|
|
5
|
+
import { preventSelection } from "../helpers/style.helper.mjs";
|
|
4
6
|
import { setAttribute } from "@oscarpalmer/toretto/attribute";
|
|
5
7
|
import { isKey } from "@oscarpalmer/atoms/is";
|
|
6
8
|
import { getPosition, on } from "@oscarpalmer/toretto/event";
|
|
7
|
-
import { findAncestor } from "@oscarpalmer/toretto";
|
|
9
|
+
import { findAncestor } from "@oscarpalmer/toretto/find";
|
|
10
|
+
//#region src/managers/selection.manager.ts
|
|
8
11
|
var SelectionManager = class {
|
|
9
12
|
handlers = Object.freeze({
|
|
13
|
+
add: (keys) => this.add(keys),
|
|
10
14
|
clear: () => this.clear(),
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
remove: (keys) => this.remove(keys),
|
|
16
|
+
set: (keys) => this.set(keys),
|
|
13
17
|
toggle: () => this.toggle()
|
|
14
18
|
});
|
|
15
19
|
items = /* @__PURE__ */ new Set();
|
|
@@ -18,21 +22,24 @@ var SelectionManager = class {
|
|
|
18
22
|
this.state = state;
|
|
19
23
|
mapped.set(state.element, this);
|
|
20
24
|
}
|
|
25
|
+
add(keys) {
|
|
26
|
+
const { length } = keys;
|
|
27
|
+
let update = false;
|
|
28
|
+
for (let index = 0; index < length; index += 1) {
|
|
29
|
+
const key = keys[index];
|
|
30
|
+
if (!this.items.has(key)) {
|
|
31
|
+
this.items.add(key);
|
|
32
|
+
update = true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (update) this.update([]);
|
|
36
|
+
}
|
|
21
37
|
clear() {
|
|
22
38
|
if (this.items.size === 0) return;
|
|
23
39
|
const removed = [...this.items];
|
|
24
40
|
this.items.clear();
|
|
25
41
|
this.update(removed);
|
|
26
42
|
}
|
|
27
|
-
deselect(keys) {
|
|
28
|
-
const { length } = keys;
|
|
29
|
-
const removed = [];
|
|
30
|
-
for (let index = 0; index < length; index += 1) {
|
|
31
|
-
const key = keys[index];
|
|
32
|
-
if (this.items.delete(key)) removed.push(key);
|
|
33
|
-
}
|
|
34
|
-
if (removed.length > 0) this.update(removed);
|
|
35
|
-
}
|
|
36
43
|
destroy() {
|
|
37
44
|
mapped.delete(this.state.element);
|
|
38
45
|
this.handlers = void 0;
|
|
@@ -52,8 +59,8 @@ var SelectionManager = class {
|
|
|
52
59
|
this.last = key;
|
|
53
60
|
this.state.managers.navigation.setActive(key, false);
|
|
54
61
|
if (event.ctrlKey || event.metaKey) {
|
|
55
|
-
if (items.has(key)) this.
|
|
56
|
-
else this.
|
|
62
|
+
if (items.has(key)) this.remove([key]);
|
|
63
|
+
else this.add([key]);
|
|
57
64
|
return;
|
|
58
65
|
}
|
|
59
66
|
this.set([key]);
|
|
@@ -64,29 +71,29 @@ var SelectionManager = class {
|
|
|
64
71
|
const fromKey = keyed ? from : getKey(from.getAttribute("data-key"));
|
|
65
72
|
const toKey = keyed ? to : getKey(to.getAttribute("data-key"));
|
|
66
73
|
if (fromKey === toKey) return;
|
|
67
|
-
const
|
|
74
|
+
const { items } = state.managers.data;
|
|
68
75
|
const fromIndex = state.managers.data.getIndex(fromKey);
|
|
69
76
|
const toIndex = state.managers.data.getIndex(toKey);
|
|
70
77
|
if (fromIndex === -1 || toIndex === -1) return;
|
|
71
78
|
const [start, end] = fromIndex < toIndex ? [fromIndex, toIndex] : [toIndex, fromIndex];
|
|
72
79
|
const selected = [];
|
|
73
|
-
for (let index = start; index <= end; index += 1)
|
|
74
|
-
|
|
80
|
+
for (let index = start; index <= end; index += 1) {
|
|
81
|
+
const item = items[index];
|
|
82
|
+
if (!(item instanceof GroupComponent)) selected.push(item);
|
|
83
|
+
}
|
|
84
|
+
if (keyed) this.add(selected);
|
|
75
85
|
else this.set(selected);
|
|
76
86
|
this.last = toKey;
|
|
77
87
|
this.state.managers.navigation.setActive(toKey, false);
|
|
78
88
|
}
|
|
79
|
-
|
|
89
|
+
remove(keys) {
|
|
80
90
|
const { length } = keys;
|
|
81
|
-
|
|
91
|
+
const removed = [];
|
|
82
92
|
for (let index = 0; index < length; index += 1) {
|
|
83
93
|
const key = keys[index];
|
|
84
|
-
if (
|
|
85
|
-
this.items.add(key);
|
|
86
|
-
update = true;
|
|
87
|
-
}
|
|
94
|
+
if (this.items.delete(key)) removed.push(key);
|
|
88
95
|
}
|
|
89
|
-
if (
|
|
96
|
+
if (removed.length > 0) this.update(removed);
|
|
90
97
|
}
|
|
91
98
|
set(keys) {
|
|
92
99
|
const { items } = this;
|
|
@@ -98,11 +105,12 @@ var SelectionManager = class {
|
|
|
98
105
|
}
|
|
99
106
|
toggle() {
|
|
100
107
|
const { items, state } = this;
|
|
101
|
-
const
|
|
102
|
-
if (items.size ===
|
|
103
|
-
else this.
|
|
108
|
+
const data = state.managers.data.items;
|
|
109
|
+
if (items.size === data.length - state.managers.group.items.length) this.clear();
|
|
110
|
+
else this.set(data.filter((key) => !(key instanceof GroupComponent)));
|
|
104
111
|
}
|
|
105
112
|
update(removed) {
|
|
113
|
+
const { state } = this;
|
|
106
114
|
const items = [...removed.map((key) => ({
|
|
107
115
|
key,
|
|
108
116
|
removed: true
|
|
@@ -110,28 +118,28 @@ var SelectionManager = class {
|
|
|
110
118
|
key,
|
|
111
119
|
removed: false
|
|
112
120
|
}))];
|
|
113
|
-
|
|
121
|
+
let { length } = items;
|
|
114
122
|
for (let index = 0; index < length; index += 1) {
|
|
115
123
|
const { key, removed } = items[index];
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
118
|
-
setAttribute(
|
|
119
|
-
if (removed)
|
|
120
|
-
else
|
|
124
|
+
const element = state.managers.row.get(key, false)?.element;
|
|
125
|
+
if (element == null) continue;
|
|
126
|
+
setAttribute(element, "aria-selected", String(!removed));
|
|
127
|
+
if (removed) element.classList.remove(CSS_TABELA_ROW_SELECTED);
|
|
128
|
+
else element.classList.add(CSS_TABELA_ROW_SELECTED);
|
|
121
129
|
}
|
|
122
130
|
}
|
|
123
131
|
};
|
|
124
132
|
function getPlaceholder() {
|
|
125
|
-
placeholder ??= createElement("div", { className:
|
|
133
|
+
placeholder ??= createElement("div", { className: CSS_TABELA_SELECTION }, {}, {});
|
|
126
134
|
return placeholder;
|
|
127
135
|
}
|
|
128
136
|
function onMouseDown(event) {
|
|
129
137
|
if (shifted) {
|
|
130
|
-
const row = findAncestor(event.target,
|
|
138
|
+
const row = findAncestor(event.target, `.${CSS_TABELA_ROW_BODY}`);
|
|
131
139
|
if (!(row instanceof HTMLElement)) return;
|
|
132
140
|
startElement = row;
|
|
133
141
|
startPosition = getPosition(event);
|
|
134
|
-
|
|
142
|
+
preventSelection.set();
|
|
135
143
|
}
|
|
136
144
|
}
|
|
137
145
|
function onMouseMove(event) {
|
|
@@ -152,14 +160,14 @@ function onMouseUp(event) {
|
|
|
152
160
|
if (startElement == null) return;
|
|
153
161
|
if (!event.shiftKey) {
|
|
154
162
|
shifted = false;
|
|
155
|
-
|
|
163
|
+
preventSelection.remove();
|
|
156
164
|
}
|
|
157
165
|
getPlaceholder().remove();
|
|
158
166
|
const row = findAncestor(event.target, ".tabela__row--body");
|
|
159
167
|
if (row instanceof HTMLElement) {
|
|
160
168
|
endElement = row;
|
|
161
|
-
const endTable = findAncestor(endElement, ".
|
|
162
|
-
const startTable = findAncestor(startElement, ".
|
|
169
|
+
const endTable = findAncestor(endElement, ".tabela__table");
|
|
170
|
+
const startTable = findAncestor(startElement, ".tabela__table");
|
|
163
171
|
if (startTable != null && startTable === endTable) mapped.get(startTable)?.range(startElement, endElement);
|
|
164
172
|
}
|
|
165
173
|
endElement = void 0;
|
|
@@ -175,15 +183,16 @@ function onShiftDown(event) {
|
|
|
175
183
|
function onShiftUp(event) {
|
|
176
184
|
onShift(event, false);
|
|
177
185
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
186
|
+
const mapped = /* @__PURE__ */ new WeakMap();
|
|
187
|
+
let shifted = false;
|
|
188
|
+
let endElement;
|
|
189
|
+
let placeholder;
|
|
190
|
+
let startPosition;
|
|
191
|
+
let startElement;
|
|
184
192
|
on(document, "keydown", onShiftDown);
|
|
185
193
|
on(document, "keyup", onShiftUp);
|
|
186
194
|
on(document, "mousedown", onMouseDown);
|
|
187
195
|
on(document, "mousemove", onMouseMove);
|
|
188
196
|
on(document, "mouseup", onMouseUp);
|
|
197
|
+
//#endregion
|
|
189
198
|
export { SelectionManager };
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { GroupComponent } from "../components/group.component.mjs";
|
|
1
2
|
import { setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
2
3
|
import { sort } from "@oscarpalmer/atoms/array";
|
|
4
|
+
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
5
|
+
import { compare } from "@oscarpalmer/atoms/value/compare";
|
|
6
|
+
//#region src/managers/sort.manager.ts
|
|
3
7
|
var SortManager = class {
|
|
4
8
|
handlers = Object.freeze({
|
|
5
9
|
add: (field, direction) => this.add(field, direction),
|
|
@@ -75,7 +79,7 @@ var SortManager = class {
|
|
|
75
79
|
});
|
|
76
80
|
setAttribute(column.elements.sorter, "data-sort-position", sorterIndex > -1 && items.length > 1 ? sorterIndex + 1 : void 0);
|
|
77
81
|
}
|
|
78
|
-
state.managers.data.
|
|
82
|
+
state.managers.data.state.items.active = items.length === 0 ? void 0 : getSortedItems(state, items);
|
|
79
83
|
state.managers.render.update(true, true);
|
|
80
84
|
}
|
|
81
85
|
toggle(event, field, direction) {
|
|
@@ -92,4 +96,30 @@ var SortManager = class {
|
|
|
92
96
|
}
|
|
93
97
|
}
|
|
94
98
|
};
|
|
95
|
-
|
|
99
|
+
function getSortedItems(state, sorters) {
|
|
100
|
+
const data = state.managers.data.state.items.active?.map((key) => key instanceof GroupComponent ? key : state.managers.data.state.values.mapped.get(key)) ?? state.managers.data.state.values.array.slice();
|
|
101
|
+
if (!state.managers.group.enabled) return sort(data, sorters).map((item) => getValue(item, state.key));
|
|
102
|
+
return sortWithGroups(state, data, sorters).map((item) => item instanceof GroupComponent ? item : getValue(item, state.key));
|
|
103
|
+
}
|
|
104
|
+
function sortWithGroups(state, data, sorters) {
|
|
105
|
+
const { length } = sorters;
|
|
106
|
+
return data.sort((first, second) => {
|
|
107
|
+
const firstValue = first instanceof GroupComponent ? first.value.stringified : getValue(first, state.managers.group.field);
|
|
108
|
+
const secondValue = second instanceof GroupComponent ? second.value.stringified : getValue(second, state.managers.group.field);
|
|
109
|
+
const firstOrder = state.managers.group.order[firstValue];
|
|
110
|
+
const secondOrder = state.managers.group.order[secondValue];
|
|
111
|
+
const groupComparison = compare(firstOrder, secondOrder);
|
|
112
|
+
if (groupComparison !== 0) return groupComparison;
|
|
113
|
+
const firstIsGroup = first instanceof GroupComponent;
|
|
114
|
+
const secondIsGroup = second instanceof GroupComponent;
|
|
115
|
+
if (firstIsGroup || secondIsGroup) return firstIsGroup && secondIsGroup ? 0 : firstIsGroup ? -1 : 1;
|
|
116
|
+
for (let index = 0; index < length; index += 1) {
|
|
117
|
+
const sorter = sorters[index];
|
|
118
|
+
const comparison = compare(getValue(first, sorter.key), getValue(second, sorter.key));
|
|
119
|
+
if (comparison !== 0) return comparison * (sorter.direction === "ascending" ? 1 : -1);
|
|
120
|
+
}
|
|
121
|
+
return 0;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
export { SortManager, sortWithGroups };
|