@oscarpalmer/tabela 0.12.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} +8 -5
- 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} +13 -9
- 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} +9 -8
- package/dist/managers/filter.manager.d.mts +2 -0
- package/dist/managers/{filter.manager.js → filter.manager.mjs} +23 -14
- 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.js → render.manager.mjs} +35 -26
- 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} +32 -28
- package/dist/managers/sort.manager.d.mts +2 -0
- package/dist/managers/{sort.manager.js → sort.manager.mjs} +12 -9
- 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} +1073 -756
- 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 +13 -18
- package/src/components/footer.component.ts +8 -3
- package/src/components/group.component.ts +48 -6
- package/src/components/header.component.ts +3 -2
- package/src/components/row.component.ts +8 -6
- package/src/helpers/dom.helpers.ts +21 -19
- package/src/helpers/style.helper.ts +1 -1
- package/src/managers/column.manager.ts +4 -0
- package/src/managers/data.manager.ts +170 -100
- package/src/managers/event.manager.ts +9 -10
- package/src/managers/filter.manager.ts +23 -12
- package/src/managers/group.manager.ts +63 -11
- package/src/managers/navigation.manager.ts +23 -22
- package/src/managers/render.manager.ts +43 -29
- package/src/managers/row.manager.ts +21 -9
- package/src/managers/selection.manager.ts +28 -21
- package/src/managers/sort.manager.ts +22 -20
- package/src/managers/style.manager.ts +156 -0
- package/src/models/data.model.ts +11 -8
- package/src/models/group.model.ts +6 -2
- package/src/models/style.model.ts +39 -0
- package/src/models/tabela.model.ts +10 -8
- package/src/tabela.ts +65 -33
- package/dist/components/group.component.js +0 -28
- package/dist/helpers/style.helper.js +0 -6
- package/dist/managers/data.manager.js +0 -181
- package/dist/managers/group.manager.js +0 -46
- 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/group.model.js +0 -0
- package/dist/models/header.model.js +0 -0
- package/dist/models/render.model.js +0 -0
- package/dist/models/selection.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 -105
- 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/group.component.d.ts +0 -14
- 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 -29
- package/types/managers/event.manager.d.ts +0 -7
- package/types/managers/filter.manager.d.ts +0 -19
- package/types/managers/group.manager.d.ts +0 -17
- package/types/managers/navigation.manager.d.ts +0 -10
- package/types/managers/render.manager.d.ts +0 -17
- package/types/managers/row.manager.d.ts +0 -13
- package/types/managers/selection.manager.d.ts +0 -24
- package/types/managers/sort.manager.d.ts +0 -28
- 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 -24
- package/types/models/filter.model.d.ts +0 -13
- package/types/models/footer.model.d.ts +0 -5
- package/types/models/group.model.d.ts +0 -4
- package/types/models/header.model.d.ts +0 -4
- package/types/models/render.model.d.ts +0 -13
- package/types/models/selection.model.d.ts +0 -8
- package/types/models/sort.model.d.ts +0 -12
- package/types/models/tabela.model.d.ts +0 -39
- package/types/models/tabela.options.d.ts +0 -10
- package/types/tabela.d.ts +0 -15
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import { GroupComponent, renderGroup } from "../components/group.component.
|
|
2
|
-
import { removeRow, renderRow } from "../components/row.component.
|
|
1
|
+
import { GroupComponent, renderGroup } from "../components/group.component.mjs";
|
|
2
|
+
import { removeRow, renderRow } from "../components/row.component.mjs";
|
|
3
3
|
import { on } from "@oscarpalmer/toretto/event";
|
|
4
|
+
//#region src/managers/render.manager.ts
|
|
4
5
|
function getRange(state, down) {
|
|
5
|
-
const {
|
|
6
|
-
const { clientHeight, scrollTop } =
|
|
7
|
-
const {
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
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);
|
|
13
16
|
return {
|
|
14
|
-
end: Math.min(
|
|
17
|
+
end: Math.min(lastIndex, last + after),
|
|
15
18
|
start
|
|
16
19
|
};
|
|
17
20
|
}
|
|
@@ -19,7 +22,7 @@ function onScroll() {
|
|
|
19
22
|
const { state } = this;
|
|
20
23
|
if (!state.active) {
|
|
21
24
|
requestAnimationFrame(() => {
|
|
22
|
-
const top = state.
|
|
25
|
+
const top = state.element.scrollTop;
|
|
23
26
|
this.update(top > state.top);
|
|
24
27
|
state.active = false;
|
|
25
28
|
state.top = top;
|
|
@@ -37,7 +40,7 @@ var RenderManager = class {
|
|
|
37
40
|
state;
|
|
38
41
|
visible = /* @__PURE__ */ new Map();
|
|
39
42
|
constructor(state) {
|
|
40
|
-
this.listener = on(state.
|
|
43
|
+
this.listener = on(state.element, "scroll", onScroll.bind(this));
|
|
41
44
|
this.state = {
|
|
42
45
|
...state,
|
|
43
46
|
active: false,
|
|
@@ -48,6 +51,11 @@ var RenderManager = class {
|
|
|
48
51
|
const { listener, pool, visible } = this;
|
|
49
52
|
listener();
|
|
50
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();
|
|
51
59
|
pool.cells = {};
|
|
52
60
|
pool.rows = [];
|
|
53
61
|
this.fragment = void 0;
|
|
@@ -62,7 +70,7 @@ var RenderManager = class {
|
|
|
62
70
|
for (let index = 0; index < length; index += 1) delete pool.cells[fields[index]];
|
|
63
71
|
for (const [, key] of visible) {
|
|
64
72
|
if (key instanceof GroupComponent) continue;
|
|
65
|
-
const row = state.managers.row.get(key);
|
|
73
|
+
const row = state.managers.row.get(key, false);
|
|
66
74
|
if (row == null || row.element == null) continue;
|
|
67
75
|
for (let index = 0; index < length; index += 1) {
|
|
68
76
|
row.cells[fields[index]].innerHTML = "";
|
|
@@ -92,38 +100,38 @@ var RenderManager = class {
|
|
|
92
100
|
}
|
|
93
101
|
continue;
|
|
94
102
|
}
|
|
95
|
-
const row = managers.row.get(key);
|
|
103
|
+
const row = managers.row.get(key, false);
|
|
96
104
|
if (remove || row == null || !indices.has(index) || managers.group.collapsed.has(key)) {
|
|
97
105
|
visible.delete(index);
|
|
98
106
|
if (row != null) removeRow(pool, row);
|
|
99
107
|
}
|
|
100
108
|
}
|
|
101
109
|
const fragment = this.getFragment();
|
|
102
|
-
const {
|
|
110
|
+
const { items } = managers.data;
|
|
103
111
|
let count = 0;
|
|
104
112
|
let offset = 0;
|
|
105
113
|
for (let index = range.start; index <= range.end + offset; index += 1) {
|
|
106
114
|
if (visible.has(index)) continue;
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
115
|
+
const item = items[index];
|
|
116
|
+
if (item instanceof GroupComponent) {
|
|
109
117
|
count += 1;
|
|
110
|
-
renderGroup(state,
|
|
111
|
-
visible.set(index,
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
fragment.append(
|
|
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);
|
|
115
123
|
}
|
|
116
124
|
continue;
|
|
117
125
|
}
|
|
118
|
-
const row = managers.row.get(
|
|
126
|
+
const row = managers.row.get(item, true);
|
|
119
127
|
if (row == null) continue;
|
|
120
|
-
if (managers.group.collapsed.has(
|
|
128
|
+
if (managers.group.collapsed.has(item)) {
|
|
121
129
|
offset += 1;
|
|
122
130
|
continue;
|
|
123
131
|
}
|
|
124
132
|
count += 1;
|
|
125
133
|
renderRow(state, row);
|
|
126
|
-
visible.set(index,
|
|
134
|
+
visible.set(index, item);
|
|
127
135
|
if (row.element != null) {
|
|
128
136
|
row.element.style.transform = `translateY(${(index - offset) * options.rowHeight}px)`;
|
|
129
137
|
fragment.append(row.element);
|
|
@@ -132,4 +140,5 @@ var RenderManager = class {
|
|
|
132
140
|
if (count > 0) components.body.elements.group[down ? "append" : "prepend"](fragment);
|
|
133
141
|
}
|
|
134
142
|
};
|
|
143
|
+
//#endregion
|
|
135
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,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
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";
|
|
5
6
|
import { setAttribute } from "@oscarpalmer/toretto/attribute";
|
|
6
7
|
import { isKey } from "@oscarpalmer/atoms/is";
|
|
7
8
|
import { getPosition, on } from "@oscarpalmer/toretto/event";
|
|
8
9
|
import { findAncestor } from "@oscarpalmer/toretto/find";
|
|
10
|
+
//#region src/managers/selection.manager.ts
|
|
9
11
|
var SelectionManager = class {
|
|
10
12
|
handlers = Object.freeze({
|
|
11
13
|
add: (keys) => this.add(keys),
|
|
@@ -69,15 +71,15 @@ var SelectionManager = class {
|
|
|
69
71
|
const fromKey = keyed ? from : getKey(from.getAttribute("data-key"));
|
|
70
72
|
const toKey = keyed ? to : getKey(to.getAttribute("data-key"));
|
|
71
73
|
if (fromKey === toKey) return;
|
|
72
|
-
const {
|
|
74
|
+
const { items } = state.managers.data;
|
|
73
75
|
const fromIndex = state.managers.data.getIndex(fromKey);
|
|
74
76
|
const toIndex = state.managers.data.getIndex(toKey);
|
|
75
77
|
if (fromIndex === -1 || toIndex === -1) return;
|
|
76
78
|
const [start, end] = fromIndex < toIndex ? [fromIndex, toIndex] : [toIndex, fromIndex];
|
|
77
79
|
const selected = [];
|
|
78
80
|
for (let index = start; index <= end; index += 1) {
|
|
79
|
-
const
|
|
80
|
-
if (!(
|
|
81
|
+
const item = items[index];
|
|
82
|
+
if (!(item instanceof GroupComponent)) selected.push(item);
|
|
81
83
|
}
|
|
82
84
|
if (keyed) this.add(selected);
|
|
83
85
|
else this.set(selected);
|
|
@@ -103,11 +105,12 @@ var SelectionManager = class {
|
|
|
103
105
|
}
|
|
104
106
|
toggle() {
|
|
105
107
|
const { items, state } = this;
|
|
106
|
-
const
|
|
107
|
-
if (items.size ===
|
|
108
|
-
else this.set(
|
|
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)));
|
|
109
111
|
}
|
|
110
112
|
update(removed) {
|
|
113
|
+
const { state } = this;
|
|
111
114
|
const items = [...removed.map((key) => ({
|
|
112
115
|
key,
|
|
113
116
|
removed: true
|
|
@@ -115,28 +118,28 @@ var SelectionManager = class {
|
|
|
115
118
|
key,
|
|
116
119
|
removed: false
|
|
117
120
|
}))];
|
|
118
|
-
|
|
121
|
+
let { length } = items;
|
|
119
122
|
for (let index = 0; index < length; index += 1) {
|
|
120
123
|
const { key, removed } = items[index];
|
|
121
|
-
const
|
|
122
|
-
if (
|
|
123
|
-
setAttribute(
|
|
124
|
-
if (removed)
|
|
125
|
-
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);
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
131
|
};
|
|
129
132
|
function getPlaceholder() {
|
|
130
|
-
placeholder ??= createElement("div", { className:
|
|
133
|
+
placeholder ??= createElement("div", { className: CSS_TABELA_SELECTION }, {}, {});
|
|
131
134
|
return placeholder;
|
|
132
135
|
}
|
|
133
136
|
function onMouseDown(event) {
|
|
134
137
|
if (shifted) {
|
|
135
|
-
const row = findAncestor(event.target,
|
|
138
|
+
const row = findAncestor(event.target, `.${CSS_TABELA_ROW_BODY}`);
|
|
136
139
|
if (!(row instanceof HTMLElement)) return;
|
|
137
140
|
startElement = row;
|
|
138
141
|
startPosition = getPosition(event);
|
|
139
|
-
|
|
142
|
+
preventSelection.set();
|
|
140
143
|
}
|
|
141
144
|
}
|
|
142
145
|
function onMouseMove(event) {
|
|
@@ -157,14 +160,14 @@ function onMouseUp(event) {
|
|
|
157
160
|
if (startElement == null) return;
|
|
158
161
|
if (!event.shiftKey) {
|
|
159
162
|
shifted = false;
|
|
160
|
-
|
|
163
|
+
preventSelection.remove();
|
|
161
164
|
}
|
|
162
165
|
getPlaceholder().remove();
|
|
163
166
|
const row = findAncestor(event.target, ".tabela__row--body");
|
|
164
167
|
if (row instanceof HTMLElement) {
|
|
165
168
|
endElement = row;
|
|
166
|
-
const endTable = findAncestor(endElement, ".
|
|
167
|
-
const startTable = findAncestor(startElement, ".
|
|
169
|
+
const endTable = findAncestor(endElement, ".tabela__table");
|
|
170
|
+
const startTable = findAncestor(startElement, ".tabela__table");
|
|
168
171
|
if (startTable != null && startTable === endTable) mapped.get(startTable)?.range(startElement, endElement);
|
|
169
172
|
}
|
|
170
173
|
endElement = void 0;
|
|
@@ -180,15 +183,16 @@ function onShiftDown(event) {
|
|
|
180
183
|
function onShiftUp(event) {
|
|
181
184
|
onShift(event, false);
|
|
182
185
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
const mapped = /* @__PURE__ */ new WeakMap();
|
|
187
|
+
let shifted = false;
|
|
188
|
+
let endElement;
|
|
189
|
+
let placeholder;
|
|
190
|
+
let startPosition;
|
|
191
|
+
let startElement;
|
|
189
192
|
on(document, "keydown", onShiftDown);
|
|
190
193
|
on(document, "keyup", onShiftUp);
|
|
191
194
|
on(document, "mousedown", onMouseDown);
|
|
192
195
|
on(document, "mousemove", onMouseMove);
|
|
193
196
|
on(document, "mouseup", onMouseUp);
|
|
197
|
+
//#endregion
|
|
194
198
|
export { SelectionManager };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { GroupComponent } from "../components/group.component.
|
|
1
|
+
import { GroupComponent } from "../components/group.component.mjs";
|
|
2
2
|
import { setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
3
3
|
import { sort } from "@oscarpalmer/atoms/array";
|
|
4
|
+
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
4
5
|
import { compare } from "@oscarpalmer/atoms/value/compare";
|
|
6
|
+
//#region src/managers/sort.manager.ts
|
|
5
7
|
var SortManager = class {
|
|
6
8
|
handlers = Object.freeze({
|
|
7
9
|
add: (field, direction) => this.add(field, direction),
|
|
@@ -77,7 +79,7 @@ var SortManager = class {
|
|
|
77
79
|
});
|
|
78
80
|
setAttribute(column.elements.sorter, "data-sort-position", sorterIndex > -1 && items.length > 1 ? sorterIndex + 1 : void 0);
|
|
79
81
|
}
|
|
80
|
-
state.managers.data.
|
|
82
|
+
state.managers.data.state.items.active = items.length === 0 ? void 0 : getSortedItems(state, items);
|
|
81
83
|
state.managers.render.update(true, true);
|
|
82
84
|
}
|
|
83
85
|
toggle(event, field, direction) {
|
|
@@ -94,16 +96,16 @@ var SortManager = class {
|
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
};
|
|
97
|
-
function
|
|
98
|
-
const data = state.managers.data.
|
|
99
|
-
if (!state.managers.group.enabled) return sort(data, sorters).map((item) => item
|
|
100
|
-
return sortWithGroups(state, data, sorters).map((item) => item instanceof GroupComponent ? item : item
|
|
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));
|
|
101
103
|
}
|
|
102
104
|
function sortWithGroups(state, data, sorters) {
|
|
103
105
|
const { length } = sorters;
|
|
104
106
|
return data.sort((first, second) => {
|
|
105
|
-
const firstValue = first instanceof GroupComponent ? first.value : first
|
|
106
|
-
const secondValue = second instanceof GroupComponent ? second.value : 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);
|
|
107
109
|
const firstOrder = state.managers.group.order[firstValue];
|
|
108
110
|
const secondOrder = state.managers.group.order[secondValue];
|
|
109
111
|
const groupComparison = compare(firstOrder, secondOrder);
|
|
@@ -113,10 +115,11 @@ function sortWithGroups(state, data, sorters) {
|
|
|
113
115
|
if (firstIsGroup || secondIsGroup) return firstIsGroup && secondIsGroup ? 0 : firstIsGroup ? -1 : 1;
|
|
114
116
|
for (let index = 0; index < length; index += 1) {
|
|
115
117
|
const sorter = sorters[index];
|
|
116
|
-
const comparison = compare(first
|
|
118
|
+
const comparison = compare(getValue(first, sorter.key), getValue(second, sorter.key));
|
|
117
119
|
if (comparison !== 0) return comparison * (sorter.direction === "ascending" ? 1 : -1);
|
|
118
120
|
}
|
|
119
121
|
return 0;
|
|
120
122
|
});
|
|
121
123
|
}
|
|
124
|
+
//#endregion
|
|
122
125
|
export { SortManager, sortWithGroups };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
//#region src/managers/style.manager.ts
|
|
2
|
+
var StyleManager = class {
|
|
3
|
+
constructor(state) {
|
|
4
|
+
this.state = state;
|
|
5
|
+
if (appended) return;
|
|
6
|
+
appended = true;
|
|
7
|
+
const style = document.createElement("style");
|
|
8
|
+
style.textContent = styling;
|
|
9
|
+
document.head.appendChild(style);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const styling = `/** Table */
|
|
13
|
+
|
|
14
|
+
:where(.tabela) {
|
|
15
|
+
flex: 1;
|
|
16
|
+
position: relative;
|
|
17
|
+
background-color: var(--oui-absolute);
|
|
18
|
+
border: 1px solid grey;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:where(.tabela__table) {
|
|
22
|
+
min-height: 24em;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-flow: column nowrap;
|
|
25
|
+
flex: 1;
|
|
26
|
+
overflow: auto;
|
|
27
|
+
position: absolute;
|
|
28
|
+
inset: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Row group */
|
|
32
|
+
|
|
33
|
+
:where(.tabela__rowgroup--header),
|
|
34
|
+
:where(.tabela__rowgroup--footer) {
|
|
35
|
+
background-color: white;
|
|
36
|
+
position: sticky;
|
|
37
|
+
left: 0;
|
|
38
|
+
z-index: 10;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
:where(.tabela__rowgroup--header) {
|
|
42
|
+
top: 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:where(.tabela__rowgroup--footer) {
|
|
46
|
+
bottom: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:where(.tabela__rowgroup--body) {
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-flow: column nowrap;
|
|
52
|
+
flex: 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:where(.tabela__rowgroup--body:focus) {
|
|
56
|
+
outline: none;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:where(.tabela:has(.tabela__rowgroup--body:focus-visible)) {
|
|
60
|
+
outline: 2px solid var(--oui-blue-6);
|
|
61
|
+
outline-offset: 2px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Row */
|
|
65
|
+
|
|
66
|
+
:where(.tabela__row) {
|
|
67
|
+
width: 100%;
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-flow: row nowrap;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
:where(.tabela__row:last-child .tabela__cell) {
|
|
73
|
+
border-bottom-width: 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
:where(.tabela__row--body),
|
|
77
|
+
:where(.tabela__row--group) {
|
|
78
|
+
flex: 1;
|
|
79
|
+
position: absolute;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
:where(.tabela__row--selected) {
|
|
83
|
+
background-color: var(--oui-blue-1);
|
|
84
|
+
color: var(--oui-blue-9);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
:where(.tabela:has(.tabela__rowgroup--body:focus-visible) .tabela__row[data-active="true"]) {
|
|
88
|
+
outline: 2px solid var(--oui-blue-6);
|
|
89
|
+
outline-offset: 2px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Cells */
|
|
93
|
+
|
|
94
|
+
:where(.tabela__cell),
|
|
95
|
+
:where(.tabela__heading) {
|
|
96
|
+
padding: 0.5em;
|
|
97
|
+
border-color: gray;
|
|
98
|
+
border-style: solid;
|
|
99
|
+
border-width: 0 1px 1px 0;
|
|
100
|
+
line-height: 1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
:where(.tabela__row .tabela__cell:last-child),
|
|
104
|
+
:where(.tabela__row .tabela__heading:last-child) {
|
|
105
|
+
flex: 1;
|
|
106
|
+
border-right-width: 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:where(.tabela__cell) {
|
|
110
|
+
overflow: hidden;
|
|
111
|
+
text-overflow: ellipsis;
|
|
112
|
+
white-space: nowrap;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
:where(.tabela__cell--footer) {
|
|
116
|
+
border-top-width: 1px;
|
|
117
|
+
border-bottom-width: 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
:where(.tabela__cell--group) {
|
|
121
|
+
padding: 0;
|
|
122
|
+
display: flex;
|
|
123
|
+
flex-flow: row nowrap;
|
|
124
|
+
align-items: center;
|
|
125
|
+
gap: 0.5em;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
:where(.tabela__cell--group .tabela__button) {
|
|
129
|
+
margin: 0 0 0 .25rem;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Misc. */
|
|
133
|
+
|
|
134
|
+
:where(.tabela__button) {
|
|
135
|
+
font-size: .75rem;
|
|
136
|
+
font-weight: bold;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
:where(.tabela__selection) {
|
|
140
|
+
background-color: color-mix(in oklch, var(--oui-blue-6), transparent);
|
|
141
|
+
border: 1px solid var(--oui-blue-6);
|
|
142
|
+
border-radius: .25rem;
|
|
143
|
+
position: fixed;
|
|
144
|
+
z-index: 1000;
|
|
145
|
+
}
|
|
146
|
+
`.replace(/^\s+|\s+|\s+$/g, " ");
|
|
147
|
+
let appended = false;
|
|
148
|
+
//#endregion
|
|
149
|
+
export { StyleManager };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/models/style.model.d.ts
|
|
2
|
+
declare const CSS_TABELA = "tabela";
|
|
3
|
+
declare const CSS_TABELA_CELL = "tabela__cell";
|
|
4
|
+
declare const CSS_TABELA_CELL_BODY = "tabela__cell--body";
|
|
5
|
+
declare const CSS_TABELA_CELL_FOOTER = "tabela__cell--footer";
|
|
6
|
+
declare const CSS_TABELA_FAKER = "tabela__faker";
|
|
7
|
+
declare const CSS_TABELA_HEADING = "tabela__heading";
|
|
8
|
+
declare const CSS_TABELA_HEADING_CONTENT = "tabela__heading__content";
|
|
9
|
+
declare const CSS_TABELA_HEADING_SORTER = "tabela__heading__sorter";
|
|
10
|
+
declare const CSS_TABELA_ROW = "tabela__row";
|
|
11
|
+
declare const CSS_TABELA_ROW_BODY = "tabela__row--body";
|
|
12
|
+
declare const CSS_TABELA_ROW_FOOTER = "tabela__row--footer";
|
|
13
|
+
declare const CSS_TABELA_ROW_GROUP = "tabela__row--group tabela__group";
|
|
14
|
+
declare const CSS_TABELA_ROW_HEADER = "tabela__row--header";
|
|
15
|
+
declare const CSS_TABELA_ROW_SELECTED = "tabela__row--selected";
|
|
16
|
+
declare const CSS_TABELA_ROWGROUP = "tabela__rowgroup";
|
|
17
|
+
declare const CSS_TABELA_ROWGROUP_BODY = "tabela__rowgroup--body";
|
|
18
|
+
declare const CSS_TABELA_ROWGROUP_FOOTER = "tabela__rowgroup--footer";
|
|
19
|
+
declare const CSS_TABELA_ROWGROUP_HEADER = "tabela__rowgroup--header";
|
|
20
|
+
declare const CSS_TABELA_SELECTION = "tabela__selection";
|
|
21
|
+
declare const CSS_TABELA_TABLE = "tabela__table";
|
|
22
|
+
//#endregion
|
|
23
|
+
export { CSS_TABELA, CSS_TABELA_CELL, CSS_TABELA_CELL_BODY, CSS_TABELA_CELL_FOOTER, CSS_TABELA_FAKER, CSS_TABELA_HEADING, CSS_TABELA_HEADING_CONTENT, CSS_TABELA_HEADING_SORTER, CSS_TABELA_ROW, CSS_TABELA_ROWGROUP, CSS_TABELA_ROWGROUP_BODY, CSS_TABELA_ROWGROUP_FOOTER, CSS_TABELA_ROWGROUP_HEADER, CSS_TABELA_ROW_BODY, CSS_TABELA_ROW_FOOTER, CSS_TABELA_ROW_GROUP, CSS_TABELA_ROW_HEADER, CSS_TABELA_ROW_SELECTED, CSS_TABELA_SELECTION, CSS_TABELA_TABLE };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/models/style.model.ts
|
|
2
|
+
const CSS_TABELA = "tabela";
|
|
3
|
+
const CSS_TABELA_CELL = "tabela__cell";
|
|
4
|
+
const CSS_TABELA_CELL_BODY = "tabela__cell--body";
|
|
5
|
+
const CSS_TABELA_CELL_FOOTER = "tabela__cell--footer";
|
|
6
|
+
const CSS_TABELA_FAKER = "tabela__faker";
|
|
7
|
+
const CSS_TABELA_HEADING = "tabela__heading";
|
|
8
|
+
const CSS_TABELA_HEADING_CONTENT = "tabela__heading__content";
|
|
9
|
+
const CSS_TABELA_HEADING_SORTER = "tabela__heading__sorter";
|
|
10
|
+
const CSS_TABELA_ROW = "tabela__row";
|
|
11
|
+
const CSS_TABELA_ROW_BODY = "tabela__row--body";
|
|
12
|
+
const CSS_TABELA_ROW_FOOTER = "tabela__row--footer";
|
|
13
|
+
const CSS_TABELA_ROW_GROUP = "tabela__row--group tabela__group";
|
|
14
|
+
const CSS_TABELA_ROW_HEADER = "tabela__row--header";
|
|
15
|
+
const CSS_TABELA_ROW_SELECTED = "tabela__row--selected";
|
|
16
|
+
const CSS_TABELA_ROWGROUP = "tabela__rowgroup";
|
|
17
|
+
const CSS_TABELA_ROWGROUP_BODY = "tabela__rowgroup--body";
|
|
18
|
+
const CSS_TABELA_ROWGROUP_FOOTER = "tabela__rowgroup--footer";
|
|
19
|
+
const CSS_TABELA_ROWGROUP_HEADER = "tabela__rowgroup--header";
|
|
20
|
+
const CSS_TABELA_SELECTION = "tabela__selection";
|
|
21
|
+
const CSS_TABELA_TABLE = "tabela__table";
|
|
22
|
+
//#endregion
|
|
23
|
+
export { CSS_TABELA, CSS_TABELA_CELL, CSS_TABELA_CELL_BODY, CSS_TABELA_CELL_FOOTER, CSS_TABELA_FAKER, CSS_TABELA_HEADING, CSS_TABELA_HEADING_CONTENT, CSS_TABELA_HEADING_SORTER, CSS_TABELA_ROW, CSS_TABELA_ROWGROUP, CSS_TABELA_ROWGROUP_BODY, CSS_TABELA_ROWGROUP_FOOTER, CSS_TABELA_ROWGROUP_HEADER, CSS_TABELA_ROW_BODY, CSS_TABELA_ROW_FOOTER, CSS_TABELA_ROW_GROUP, CSS_TABELA_ROW_HEADER, CSS_TABELA_ROW_SELECTED, CSS_TABELA_SELECTION, CSS_TABELA_TABLE };
|