@oscarpalmer/tabela 0.13.0 → 0.14.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/components/{body.component.mjs → body.component.js} +3 -6
- package/dist/components/{column.component.mjs → column.component.js} +5 -8
- package/dist/components/{footer.component.mjs → footer.component.js} +4 -7
- package/dist/components/group.component.js +28 -0
- package/dist/components/{header.component.mjs → header.component.js} +3 -6
- package/dist/components/{row.component.mjs → row.component.js} +7 -11
- package/dist/helpers/{dom.helpers.mjs → dom.helpers.js} +9 -13
- package/dist/helpers/{misc.helpers.mjs → misc.helpers.js} +1 -3
- package/dist/helpers/style.helper.js +6 -0
- package/dist/{index.mjs → index.js} +1 -3
- package/dist/managers/{column.manager.mjs → column.manager.js} +1 -6
- package/dist/managers/data.manager.js +181 -0
- package/dist/managers/{event.manager.mjs → event.manager.js} +8 -9
- package/dist/managers/{filter.manager.mjs → filter.manager.js} +14 -23
- package/dist/managers/group.manager.js +46 -0
- package/dist/managers/{navigation.manager.mjs → navigation.manager.js} +24 -27
- package/dist/managers/{render.manager.mjs → render.manager.js} +26 -35
- package/dist/managers/{row.manager.mjs → row.manager.js} +11 -18
- package/dist/managers/{selection.manager.mjs → selection.manager.js} +28 -32
- package/dist/managers/{sort.manager.mjs → sort.manager.js} +9 -12
- 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.full.mjs → tabela.full.js} +860 -1049
- package/dist/tabela.js +105 -0
- package/package.json +1 -1
- package/src/components/body.component.ts +10 -7
- package/src/components/column.component.ts +19 -15
- package/src/components/footer.component.ts +7 -10
- package/src/components/group.component.ts +34 -12
- package/src/components/header.component.ts +6 -5
- package/src/components/row.component.ts +27 -19
- package/src/helpers/dom.helpers.ts +18 -22
- package/src/helpers/misc.helpers.ts +5 -0
- package/src/managers/data.manager.ts +80 -77
- package/src/managers/event.manager.ts +21 -10
- package/src/managers/filter.manager.ts +34 -21
- package/src/managers/group.manager.ts +18 -9
- package/src/managers/navigation.manager.ts +46 -49
- package/src/managers/render.manager.ts +34 -21
- package/src/managers/row.manager.ts +1 -1
- package/src/managers/selection.manager.ts +37 -35
- package/src/managers/sort.manager.ts +47 -34
- package/src/managers/style.manager.ts +40 -25
- package/src/models/column.model.ts +2 -6
- package/src/models/data.model.ts +7 -8
- package/src/models/dom.model.ts +33 -0
- package/src/models/event.model.ts +7 -0
- package/src/models/filter.model.ts +20 -0
- package/src/models/group.model.ts +4 -0
- package/src/models/sort.model.ts +4 -0
- package/src/models/style.model.ts +32 -20
- package/src/models/tabela.model.ts +1 -0
- package/src/tabela.ts +20 -22
- package/dist/body.component-_VDOpJhV.d.mts +0 -10
- package/dist/body.model-2iwsovAV.d.mts +0 -7
- package/dist/column.component-Bx46r3JI.d.mts +0 -16
- package/dist/column.model-D-aw4EU4.d.mts +0 -16
- package/dist/components/body.component.d.mts +0 -2
- package/dist/components/column.component.d.mts +0 -2
- package/dist/components/footer.component.d.mts +0 -2
- package/dist/components/group.component.d.mts +0 -2
- package/dist/components/group.component.mjs +0 -51
- package/dist/components/header.component.d.mts +0 -2
- package/dist/components/row.component.d.mts +0 -2
- package/dist/filter.model-7ukJrtil.d.mts +0 -16
- package/dist/footer.component-Curiab8j.d.mts +0 -12
- package/dist/footer.model-DhqoS6ds.d.mts +0 -8
- package/dist/group.component-Cq1YYbfJ.d.mts +0 -285
- package/dist/group.model-BsKFwHbt.d.mts +0 -10
- package/dist/header.component-BjjlpZIg.d.mts +0 -12
- package/dist/header.model-DN_KzUCV.d.mts +0 -7
- package/dist/helpers/dom.helpers.d.mts +0 -12
- package/dist/helpers/misc.helpers.d.mts +0 -6
- package/dist/helpers/style.helper.d.mts +0 -6
- package/dist/helpers/style.helper.mjs +0 -8
- package/dist/index.d.mts +0 -7
- package/dist/managers/column.manager.d.mts +0 -2
- package/dist/managers/data.manager.d.mts +0 -2
- package/dist/managers/data.manager.mjs +0 -222
- package/dist/managers/event.manager.d.mts +0 -2
- package/dist/managers/filter.manager.d.mts +0 -2
- package/dist/managers/group.manager.d.mts +0 -2
- package/dist/managers/group.manager.mjs +0 -73
- package/dist/managers/navigation.manager.d.mts +0 -2
- package/dist/managers/render.manager.d.mts +0 -2
- package/dist/managers/row.manager.d.mts +0 -2
- package/dist/managers/selection.manager.d.mts +0 -2
- package/dist/managers/sort.manager.d.mts +0 -2
- package/dist/managers/style.manager.d.mts +0 -2
- package/dist/managers/style.manager.mjs +0 -149
- package/dist/models/body.model.d.mts +0 -2
- package/dist/models/body.model.mjs +0 -1
- package/dist/models/column.model.d.mts +0 -2
- package/dist/models/column.model.mjs +0 -1
- package/dist/models/data.model.d.mts +0 -2
- package/dist/models/data.model.mjs +0 -1
- package/dist/models/filter.model.d.mts +0 -2
- package/dist/models/filter.model.mjs +0 -1
- package/dist/models/footer.model.d.mts +0 -2
- package/dist/models/footer.model.mjs +0 -1
- package/dist/models/group.model.d.mts +0 -2
- package/dist/models/group.model.mjs +0 -1
- package/dist/models/header.model.d.mts +0 -2
- package/dist/models/header.model.mjs +0 -1
- package/dist/models/render.model.d.mts +0 -2
- package/dist/models/render.model.mjs +0 -1
- package/dist/models/selection.model.d.mts +0 -2
- package/dist/models/selection.model.mjs +0 -1
- package/dist/models/sort.model.d.mts +0 -2
- package/dist/models/sort.model.mjs +0 -1
- package/dist/models/style.model.d.mts +0 -23
- package/dist/models/style.model.mjs +0 -23
- package/dist/models/tabela.model.d.mts +0 -2
- package/dist/models/tabela.model.mjs +0 -1
- package/dist/models/tabela.options.d.mts +0 -2
- package/dist/models/tabela.options.mjs +0 -1
- package/dist/selection.model-rwQe9fco.d.mts +0 -12
- package/dist/sort.model-CauImaLu.d.mts +0 -15
- package/dist/tabela.d.mts +0 -21
- package/dist/tabela.mjs +0 -126
- package/dist/tabela.options-RkZvfptB.d.mts +0 -14
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createElement, createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
|
-
//#region src/components/body.component.ts
|
|
1
|
+
import { createElement, createRowGroup } from "../helpers/dom.helpers.js";
|
|
4
2
|
function createFaker() {
|
|
5
|
-
return createElement("div", { className:
|
|
3
|
+
return createElement("div", { className: "tabela__faker" }, {}, {});
|
|
6
4
|
}
|
|
7
5
|
var BodyComponent = class {
|
|
8
6
|
elements = {
|
|
@@ -12,7 +10,7 @@ var BodyComponent = class {
|
|
|
12
10
|
constructor() {
|
|
13
11
|
const group = createRowGroup(false);
|
|
14
12
|
this.elements.group = group;
|
|
15
|
-
group.className +=
|
|
13
|
+
group.className += " tabela__rowgroup--body";
|
|
16
14
|
group.tabIndex = 0;
|
|
17
15
|
group.setAttribute("data-event", "body");
|
|
18
16
|
group.append(this.elements.faker);
|
|
@@ -22,5 +20,4 @@ var BodyComponent = class {
|
|
|
22
20
|
this.elements.group = void 0;
|
|
23
21
|
}
|
|
24
22
|
};
|
|
25
|
-
//#endregion
|
|
26
23
|
export { BodyComponent };
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createElement } from "../helpers/dom.helpers.mjs";
|
|
3
|
-
//#region src/components/column.component.ts
|
|
1
|
+
import { createElement } from "../helpers/dom.helpers.js";
|
|
4
2
|
var ColumnComponent = class {
|
|
5
3
|
elements;
|
|
6
4
|
options;
|
|
@@ -22,17 +20,17 @@ var ColumnComponent = class {
|
|
|
22
20
|
};
|
|
23
21
|
function createHeading(field, title, width) {
|
|
24
22
|
const wrapper = createElement("div", {
|
|
25
|
-
className:
|
|
23
|
+
className: "tabela__heading",
|
|
26
24
|
role: "columnheader"
|
|
27
25
|
}, {
|
|
28
26
|
"data-event": "heading",
|
|
29
27
|
"data-field": field
|
|
30
28
|
}, { width: `${width}px` });
|
|
31
29
|
const content = createElement("div", {
|
|
32
|
-
className:
|
|
30
|
+
className: "tabela__heading__content",
|
|
33
31
|
textContent: title
|
|
34
|
-
});
|
|
35
|
-
const sorter = createElement("div", { className:
|
|
32
|
+
}, {}, {});
|
|
33
|
+
const sorter = createElement("div", { className: "tabela__heading__sorter" }, {}, {});
|
|
36
34
|
wrapper.append(content, sorter);
|
|
37
35
|
return {
|
|
38
36
|
content,
|
|
@@ -40,5 +38,4 @@ function createHeading(field, title, width) {
|
|
|
40
38
|
wrapper
|
|
41
39
|
};
|
|
42
40
|
}
|
|
43
|
-
//#endregion
|
|
44
41
|
export { ColumnComponent };
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createCell, createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
|
-
//#region src/components/footer.component.ts
|
|
1
|
+
import { createCell, createRowGroup } from "../helpers/dom.helpers.js";
|
|
4
2
|
var FooterComponent = class {
|
|
5
3
|
elements;
|
|
6
4
|
constructor() {
|
|
@@ -10,8 +8,8 @@ var FooterComponent = class {
|
|
|
10
8
|
row,
|
|
11
9
|
cells: []
|
|
12
10
|
};
|
|
13
|
-
group.className +=
|
|
14
|
-
row.className +=
|
|
11
|
+
group.className += " tabela__rowgroup--footer";
|
|
12
|
+
row.className += " tabela__row--footer";
|
|
15
13
|
}
|
|
16
14
|
destroy() {
|
|
17
15
|
this.elements.cells.length = 0;
|
|
@@ -25,12 +23,11 @@ var FooterComponent = class {
|
|
|
25
23
|
elements.row.innerHTML = "";
|
|
26
24
|
for (let index = 0; index < length; index += 1) {
|
|
27
25
|
const cell = createCell(columns[index].options.width ?? 4, false);
|
|
28
|
-
cell.className +=
|
|
26
|
+
cell.className += " tabela__cell--footer";
|
|
29
27
|
cell.innerHTML = " ";
|
|
30
28
|
elements.cells.push(cell);
|
|
31
29
|
elements.row.append(cell);
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
};
|
|
35
|
-
//#endregion
|
|
36
33
|
export { FooterComponent };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createElement } from "../helpers/dom.helpers.js";
|
|
2
|
+
var GroupComponent = class {
|
|
3
|
+
element;
|
|
4
|
+
expanded = true;
|
|
5
|
+
filtered = 0;
|
|
6
|
+
selected = 0;
|
|
7
|
+
total = 0;
|
|
8
|
+
constructor(key, label, value) {
|
|
9
|
+
this.key = key;
|
|
10
|
+
this.label = label;
|
|
11
|
+
this.value = value;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
function renderGroup(state, component) {
|
|
15
|
+
component.element ??= createElement("div", {
|
|
16
|
+
className: "tabela__row tabela__row--group",
|
|
17
|
+
innerHTML: `<div class="tabela__cell tabela__cell--group" role="cell">
|
|
18
|
+
<button class="tabela__button tabela__button--group" data-event="group" data-key="${component.key}" type="button">
|
|
19
|
+
<span aria-hidden="true"></span>
|
|
20
|
+
<span>Open/close</span>
|
|
21
|
+
</button>
|
|
22
|
+
<p>${component.label}</p>
|
|
23
|
+
</div>`,
|
|
24
|
+
role: "row"
|
|
25
|
+
}, {}, { height: `${state.options.rowHeight}px` });
|
|
26
|
+
}
|
|
27
|
+
function updateGroup(state, component) {}
|
|
28
|
+
export { GroupComponent, renderGroup, updateGroup };
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
|
-
//#region src/components/header.component.ts
|
|
1
|
+
import { createRowGroup } from "../helpers/dom.helpers.js";
|
|
4
2
|
var HeaderComponent = class {
|
|
5
3
|
elements;
|
|
6
4
|
constructor() {
|
|
@@ -9,8 +7,8 @@ var HeaderComponent = class {
|
|
|
9
7
|
group,
|
|
10
8
|
row
|
|
11
9
|
};
|
|
12
|
-
group.className +=
|
|
13
|
-
row.className +=
|
|
10
|
+
group.className += " tabela__rowgroup--header";
|
|
11
|
+
row.className += " tabela__row--header";
|
|
14
12
|
}
|
|
15
13
|
destroy() {
|
|
16
14
|
this.elements.group = void 0;
|
|
@@ -21,5 +19,4 @@ var HeaderComponent = class {
|
|
|
21
19
|
this.elements.row.append(...columns.map((column) => column.elements.wrapper));
|
|
22
20
|
}
|
|
23
21
|
};
|
|
24
|
-
//#endregion
|
|
25
22
|
export { HeaderComponent };
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createCell, createRow } from "../helpers/dom.helpers.mjs";
|
|
1
|
+
import { createCell, createRow } from "../helpers/dom.helpers.js";
|
|
3
2
|
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
4
|
-
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
5
|
-
//#region src/components/row.component.ts
|
|
6
3
|
function removeRow(pool, row) {
|
|
7
4
|
if (row.element != null) {
|
|
8
5
|
row.element.innerHTML = "";
|
|
@@ -23,20 +20,20 @@ function renderRow(state, row) {
|
|
|
23
20
|
"data-active": String(state.managers.navigation.active === row.key),
|
|
24
21
|
"data-event": "row",
|
|
25
22
|
"data-key": key,
|
|
26
|
-
id: `tabela_${state.id}
|
|
23
|
+
id: `tabela_${state.id}_row_${key}`
|
|
27
24
|
});
|
|
28
|
-
element.classList.add(
|
|
29
|
-
if (selected) element.classList.add(
|
|
30
|
-
else element.classList.remove(
|
|
25
|
+
element.classList.add("tabela__row--body");
|
|
26
|
+
if (selected) element.classList.add("tabela__row--selected");
|
|
27
|
+
else element.classList.remove("tabela__row--selected");
|
|
31
28
|
const columns = state.managers.column.items;
|
|
32
29
|
const { length } = columns;
|
|
33
|
-
const data = state.managers.data.
|
|
30
|
+
const data = state.managers.data.values.objects.mapped.get(row.key);
|
|
34
31
|
if (data == null) return;
|
|
35
32
|
for (let index = 0; index < length; index += 1) {
|
|
36
33
|
const { options } = columns[index];
|
|
37
34
|
state.managers.render.pool.cells[options.field] ??= [];
|
|
38
35
|
const cell = state.managers.render.pool.cells[columns[index].options.field].shift() ?? createCell(options.width);
|
|
39
|
-
cell.textContent = String(
|
|
36
|
+
cell.textContent = String(data[options.field]);
|
|
40
37
|
row.cells[options.field] = cell;
|
|
41
38
|
element.append(cell);
|
|
42
39
|
}
|
|
@@ -48,5 +45,4 @@ var RowComponent = class {
|
|
|
48
45
|
this.key = key;
|
|
49
46
|
}
|
|
50
47
|
};
|
|
51
|
-
//#endregion
|
|
52
48
|
export { RowComponent, removeRow, renderRow };
|
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
import { CSS_TABELA_CELL, CSS_TABELA_CELL_BODY, CSS_TABELA_ROW, CSS_TABELA_ROWGROUP } from "../models/style.model.mjs";
|
|
2
1
|
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
3
2
|
import { setStyles } from "@oscarpalmer/toretto/style";
|
|
4
|
-
//#region src/helpers/dom.helpers.ts
|
|
5
3
|
function createCell(width, body) {
|
|
6
4
|
const cell = createElement("div", {
|
|
7
|
-
className:
|
|
5
|
+
className: "tabela__cell",
|
|
8
6
|
role: "cell"
|
|
9
7
|
}, {}, { width: `${width}px` });
|
|
10
|
-
if (body ?? true) cell.classList.add(
|
|
8
|
+
if (body ?? true) cell.classList.add("tabela__cell--body");
|
|
11
9
|
return cell;
|
|
12
10
|
}
|
|
13
11
|
function createElement(tagName, properties, attributes, style) {
|
|
14
12
|
const element = document.createElement(tagName);
|
|
15
|
-
const
|
|
16
|
-
const keys =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
setStyles(element, style ?? {});
|
|
13
|
+
const keys = Object.keys(properties);
|
|
14
|
+
for (const key of keys) element[key] = properties[key];
|
|
15
|
+
setAttributes(element, attributes);
|
|
16
|
+
setStyles(element, style);
|
|
20
17
|
return element;
|
|
21
18
|
}
|
|
22
19
|
function createRowGroup(withRow) {
|
|
23
20
|
const group = createElement("div", {
|
|
24
|
-
className:
|
|
21
|
+
className: "tabela__rowgroup",
|
|
25
22
|
role: "rowgroup"
|
|
26
|
-
});
|
|
23
|
+
}, {}, {});
|
|
27
24
|
if (!(withRow ?? true)) return group;
|
|
28
25
|
const row = createRow();
|
|
29
26
|
group.append(row);
|
|
@@ -34,9 +31,8 @@ function createRowGroup(withRow) {
|
|
|
34
31
|
}
|
|
35
32
|
function createRow() {
|
|
36
33
|
return createElement("div", {
|
|
37
|
-
className:
|
|
34
|
+
className: "tabela__row",
|
|
38
35
|
role: "row"
|
|
39
36
|
}, {}, { height: "32px" });
|
|
40
37
|
}
|
|
41
|
-
//#endregion
|
|
42
38
|
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
//#region src/helpers/misc.helpers.ts
|
|
2
1
|
function getKey(value) {
|
|
3
2
|
if (typeof value === "number") return value;
|
|
4
3
|
if (typeof value !== "string") return;
|
|
5
4
|
return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
|
|
6
5
|
}
|
|
7
|
-
|
|
8
|
-
//#endregion
|
|
6
|
+
var integerExpression = /^\d+$/;
|
|
9
7
|
export { getKey };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { ColumnComponent } from "../components/column.component.
|
|
2
|
-
//#region src/managers/column.manager.ts
|
|
1
|
+
import { ColumnComponent } from "../components/column.component.js";
|
|
3
2
|
var ColumnManager = class {
|
|
4
3
|
items = [];
|
|
5
4
|
constructor(state) {
|
|
@@ -12,9 +11,6 @@ var ColumnManager = class {
|
|
|
12
11
|
this.items = void 0;
|
|
13
12
|
this.state = void 0;
|
|
14
13
|
}
|
|
15
|
-
get(field) {
|
|
16
|
-
return this.items.find((item) => item.options.field === field);
|
|
17
|
-
}
|
|
18
14
|
remove(value) {
|
|
19
15
|
const { items, state } = this;
|
|
20
16
|
const { components, managers } = state;
|
|
@@ -40,5 +36,4 @@ var ColumnManager = class {
|
|
|
40
36
|
footer.update(items);
|
|
41
37
|
}
|
|
42
38
|
};
|
|
43
|
-
//#endregion
|
|
44
39
|
export { ColumnManager };
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { GroupComponent } from "../components/group.component.js";
|
|
2
|
+
import { sortWithGroups } from "./sort.manager.js";
|
|
3
|
+
import { 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
|
+
var DataManager = class {
|
|
8
|
+
handlers = Object.freeze({
|
|
9
|
+
add: (data) => void this.add(data, true),
|
|
10
|
+
clear: () => void this.clear(),
|
|
11
|
+
get: (active) => this.get(active),
|
|
12
|
+
remove: (items) => void this.remove(items, true),
|
|
13
|
+
synchronize: (data, remove) => void this.synchronize(data, remove),
|
|
14
|
+
update: (data) => void this.update(data)
|
|
15
|
+
});
|
|
16
|
+
values = {
|
|
17
|
+
keys: { original: [] },
|
|
18
|
+
objects: {
|
|
19
|
+
mapped: /* @__PURE__ */ new Map(),
|
|
20
|
+
array: []
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
get keys() {
|
|
24
|
+
return this.values.keys.active ?? this.values.keys.original;
|
|
25
|
+
}
|
|
26
|
+
get size() {
|
|
27
|
+
return this.keys.length;
|
|
28
|
+
}
|
|
29
|
+
constructor(state) {
|
|
30
|
+
this.state = state;
|
|
31
|
+
}
|
|
32
|
+
async add(data, render) {
|
|
33
|
+
const { state, values } = this;
|
|
34
|
+
const { length } = data;
|
|
35
|
+
const updates = [];
|
|
36
|
+
for (let index = 0; index < length; index += 1) {
|
|
37
|
+
const item = data[index];
|
|
38
|
+
const key = item[state.key];
|
|
39
|
+
if (values.objects.mapped.has(key)) {
|
|
40
|
+
updates.push(item);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
values.objects.array.push(item);
|
|
44
|
+
values.objects.mapped.set(key, item);
|
|
45
|
+
if (!state.managers.group.enabled) continue;
|
|
46
|
+
const groupKey = item[state.managers.group.field];
|
|
47
|
+
let group = state.managers.group.get(groupKey);
|
|
48
|
+
if (group == null) {
|
|
49
|
+
group = new GroupComponent(String(groupKey), String(groupKey), groupKey);
|
|
50
|
+
values.objects.array.push(group);
|
|
51
|
+
state.managers.group.add(group);
|
|
52
|
+
}
|
|
53
|
+
if (!group.expanded) state.managers.group.collapsed.add(key);
|
|
54
|
+
group.total += 1;
|
|
55
|
+
}
|
|
56
|
+
if (updates.length > 0) this.update(updates);
|
|
57
|
+
else if (render) this.render();
|
|
58
|
+
}
|
|
59
|
+
clear() {
|
|
60
|
+
if (this.values.objects.array.length > 0) this.set([]);
|
|
61
|
+
}
|
|
62
|
+
destroy() {
|
|
63
|
+
const { values } = this;
|
|
64
|
+
values.objects.mapped.clear();
|
|
65
|
+
values.keys.active = void 0;
|
|
66
|
+
values.keys.original.length = 0;
|
|
67
|
+
values.objects.array.length = 0;
|
|
68
|
+
this.handlers = void 0;
|
|
69
|
+
this.state = void 0;
|
|
70
|
+
this.values = void 0;
|
|
71
|
+
}
|
|
72
|
+
get(active) {
|
|
73
|
+
const { values } = this;
|
|
74
|
+
return active ?? false ? select(values.keys.active ?? [], (key) => !(key instanceof GroupComponent), (key) => values.objects.mapped.get(key)) : values.objects.array.filter((item) => !(item instanceof GroupComponent));
|
|
75
|
+
}
|
|
76
|
+
getIndex(key) {
|
|
77
|
+
return this.keys.indexOf(key);
|
|
78
|
+
}
|
|
79
|
+
async remove(items, render) {
|
|
80
|
+
const { state, values } = this;
|
|
81
|
+
const keys = items.map((value) => isPlainObject(value) ? value[state.key] : value).filter((key) => values.objects.mapped.has(key));
|
|
82
|
+
const { length } = keys;
|
|
83
|
+
if (length === 0) return;
|
|
84
|
+
for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
|
|
85
|
+
const key = keys[keyIndex];
|
|
86
|
+
values.objects.mapped.delete(key);
|
|
87
|
+
const arrayIndex = values.objects.array.findIndex((item) => !(item instanceof GroupComponent) && item[state.key] === key);
|
|
88
|
+
let item;
|
|
89
|
+
if (arrayIndex > -1) [item] = values.objects.array.splice(arrayIndex, 1);
|
|
90
|
+
values.keys.original.splice(values.keys.original.indexOf(key), 1);
|
|
91
|
+
state.managers.row.remove(key);
|
|
92
|
+
if (!state.managers.group.enabled || item == null) continue;
|
|
93
|
+
state.managers.group.collapsed.delete(key);
|
|
94
|
+
const groupKey = item[state.managers.group.field];
|
|
95
|
+
const group = state.managers.group.get(groupKey);
|
|
96
|
+
if (group == null) continue;
|
|
97
|
+
group.total -= 1;
|
|
98
|
+
if (group.total > 0) continue;
|
|
99
|
+
const groupIndex = values.objects.array.findIndex((item) => item instanceof GroupComponent && item.value === groupKey);
|
|
100
|
+
if (groupIndex > -1) values.objects.array.splice(groupIndex, 1);
|
|
101
|
+
state.managers.group.remove(group);
|
|
102
|
+
}
|
|
103
|
+
if (render) this.render();
|
|
104
|
+
}
|
|
105
|
+
render() {
|
|
106
|
+
const { state, values } = this;
|
|
107
|
+
if (state.managers.group.enabled) sortWithGroups(state, values.objects.array, [{
|
|
108
|
+
direction: "ascending",
|
|
109
|
+
key: state.key
|
|
110
|
+
}]);
|
|
111
|
+
else sort(values.objects.array, [{
|
|
112
|
+
direction: "ascending",
|
|
113
|
+
key: state.key
|
|
114
|
+
}]);
|
|
115
|
+
values.keys.original = values.objects.array.map((item) => item instanceof GroupComponent ? item : item[state.key]);
|
|
116
|
+
values.objects.mapped = toMap(values.objects.array.filter((item) => !(item instanceof GroupComponent)), (item) => item[state.key]);
|
|
117
|
+
if (Object.keys(state.managers.filter.items).length > 0) state.managers.filter.filter();
|
|
118
|
+
else if (state.managers.sort.items.length > 0) state.managers.sort.sort();
|
|
119
|
+
else state.managers.render.update(true, true);
|
|
120
|
+
}
|
|
121
|
+
set(data) {
|
|
122
|
+
const { state, values } = this;
|
|
123
|
+
const array = data.slice();
|
|
124
|
+
if (state.managers.group.enabled) {
|
|
125
|
+
const grouped = toRecord.arrays(data, state.managers.group.field);
|
|
126
|
+
const entries = Object.entries(grouped);
|
|
127
|
+
const { length } = entries;
|
|
128
|
+
const groups = [];
|
|
129
|
+
for (let index = 0; index < length; index += 1) {
|
|
130
|
+
const [value, items] = entries[index];
|
|
131
|
+
const key = String(value);
|
|
132
|
+
const group = new GroupComponent(key, key, value);
|
|
133
|
+
group.total = items.length;
|
|
134
|
+
groups.push(group);
|
|
135
|
+
array.push(group);
|
|
136
|
+
}
|
|
137
|
+
state.managers.group.set(groups);
|
|
138
|
+
}
|
|
139
|
+
values.objects.array = array;
|
|
140
|
+
this.render();
|
|
141
|
+
}
|
|
142
|
+
async synchronize(data, remove) {
|
|
143
|
+
const { state, values } = this;
|
|
144
|
+
const add = [];
|
|
145
|
+
const updated = [];
|
|
146
|
+
const keys = /* @__PURE__ */ new Set([]);
|
|
147
|
+
const { length } = data;
|
|
148
|
+
for (let index = 0; index < length; index += 1) {
|
|
149
|
+
const object = data[index];
|
|
150
|
+
const key = object[state.key];
|
|
151
|
+
if (values.objects.mapped.has(key)) updated.push(object);
|
|
152
|
+
else add.push(object);
|
|
153
|
+
keys.add(key);
|
|
154
|
+
}
|
|
155
|
+
if (keys.size === 0) return;
|
|
156
|
+
if (remove ?? false) {
|
|
157
|
+
const toRemove = values.keys.original.filter((key) => !(key instanceof GroupComponent) && !keys.has(key));
|
|
158
|
+
if (toRemove.length > 0) await this.remove(toRemove, false);
|
|
159
|
+
}
|
|
160
|
+
await this.update(updated);
|
|
161
|
+
if (add.length > 0) await this.add(add, false);
|
|
162
|
+
if (add.length > 0 || (remove ?? false)) this.render();
|
|
163
|
+
}
|
|
164
|
+
async update(data) {
|
|
165
|
+
const { state, values } = this;
|
|
166
|
+
const { length } = data;
|
|
167
|
+
for (let index = 0; index < length; index += 1) {
|
|
168
|
+
const object = data[index];
|
|
169
|
+
const key = object[state.key];
|
|
170
|
+
const value = values.objects.mapped.get(key);
|
|
171
|
+
if (value != null) {
|
|
172
|
+
values.objects.mapped.set(key, {
|
|
173
|
+
...value,
|
|
174
|
+
...object
|
|
175
|
+
});
|
|
176
|
+
state.managers.row.update(key);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
export { DataManager };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { on } from "@oscarpalmer/toretto/event";
|
|
2
2
|
import { findAncestor } from "@oscarpalmer/toretto/find";
|
|
3
|
-
//#region src/managers/event.manager.ts
|
|
4
3
|
var EventManager = class {
|
|
5
4
|
constructor(state) {
|
|
6
5
|
this.state = state;
|
|
@@ -18,7 +17,7 @@ var EventManager = class {
|
|
|
18
17
|
};
|
|
19
18
|
function onClick(event) {
|
|
20
19
|
const target = findAncestor(event, "[data-event]");
|
|
21
|
-
const table = findAncestor(event, ".
|
|
20
|
+
const table = findAncestor(event, ".tabela");
|
|
22
21
|
if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) return;
|
|
23
22
|
const manager = mapped.get(table);
|
|
24
23
|
if (manager == null) return;
|
|
@@ -37,18 +36,18 @@ function onClick(event) {
|
|
|
37
36
|
}
|
|
38
37
|
function onKeydown(event) {
|
|
39
38
|
const target = findAncestor(event, "[data-event]");
|
|
40
|
-
const table = findAncestor(event, ".
|
|
39
|
+
const table = findAncestor(event, ".tabela");
|
|
41
40
|
if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) return;
|
|
42
41
|
const manager = mapped.get(table);
|
|
43
42
|
if (manager == null) return;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
switch (target?.getAttribute("data-event")) {
|
|
44
|
+
case "body":
|
|
45
|
+
manager.state.managers.navigation.handle(event);
|
|
46
|
+
break;
|
|
47
|
+
default: break;
|
|
47
48
|
}
|
|
48
|
-
manager.state.managers.navigation.handle(event);
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
var mapped = /* @__PURE__ */ new WeakMap();
|
|
51
51
|
on(document, "click", onClick);
|
|
52
52
|
on(document, "keydown", onKeydown, { passive: false });
|
|
53
|
-
//#endregion
|
|
54
53
|
export { EventManager };
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { GroupComponent } from "../components/group.component.
|
|
2
|
-
import { getString } from "@oscarpalmer/atoms/string";
|
|
1
|
+
import { GroupComponent } from "../components/group.component.js";
|
|
3
2
|
import { getNumber } from "@oscarpalmer/atoms/number";
|
|
3
|
+
import { getString } from "@oscarpalmer/atoms/string";
|
|
4
4
|
import { endsWith, includes, startsWith } from "@oscarpalmer/atoms/string/match";
|
|
5
5
|
import { equal } from "@oscarpalmer/atoms/value/equal";
|
|
6
|
-
//#region src/managers/filter.manager.ts
|
|
7
6
|
var FilterManager = class {
|
|
8
7
|
handlers = Object.freeze({
|
|
9
8
|
add: (item) => this.add(item),
|
|
@@ -17,7 +16,7 @@ var FilterManager = class {
|
|
|
17
16
|
}
|
|
18
17
|
add(item) {
|
|
19
18
|
if (this.items[item.field] == null) this.items[item.field] = [];
|
|
20
|
-
else if (this.items[item.field].findIndex((existing) => equal(existing, item))
|
|
19
|
+
else if (this.items[item.field].findIndex((existing) => equal(existing, item)) !== -1) return;
|
|
21
20
|
this.items[item.field].push(item);
|
|
22
21
|
this.filter();
|
|
23
22
|
}
|
|
@@ -36,14 +35,14 @@ var FilterManager = class {
|
|
|
36
35
|
const { state } = this;
|
|
37
36
|
const filtered = [];
|
|
38
37
|
const filters = Object.entries(this.items);
|
|
39
|
-
const
|
|
40
|
-
rowLoop: for (let
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
filtered.push(
|
|
38
|
+
const keysLength = state.managers.data.values.keys.original.length;
|
|
39
|
+
rowLoop: for (let keyIndex = 0; keyIndex < keysLength; keyIndex += 1) {
|
|
40
|
+
const key = state.managers.data.values.keys.original[keyIndex];
|
|
41
|
+
if (key instanceof GroupComponent) {
|
|
42
|
+
filtered.push(key);
|
|
44
43
|
continue;
|
|
45
44
|
}
|
|
46
|
-
const row = state.managers.data.
|
|
45
|
+
const row = state.managers.data.values.objects.mapped.get(key);
|
|
47
46
|
if (row == null) continue;
|
|
48
47
|
filterLoop: for (let filterIndex = 0; filterIndex < filters.length; filterIndex += 1) {
|
|
49
48
|
const [field, items] = filters[filterIndex];
|
|
@@ -54,23 +53,16 @@ var FilterManager = class {
|
|
|
54
53
|
}
|
|
55
54
|
continue rowLoop;
|
|
56
55
|
}
|
|
57
|
-
filtered.push(
|
|
56
|
+
filtered.push(key);
|
|
58
57
|
}
|
|
59
|
-
state.managers.data.
|
|
58
|
+
state.managers.data.values.keys.active = filtered;
|
|
60
59
|
if (state.managers.sort.items.length > 0) state.managers.sort.sort();
|
|
61
60
|
else state.managers.render.update(true, true);
|
|
62
61
|
}
|
|
63
62
|
remove(value) {
|
|
64
63
|
if (typeof value === "string") {
|
|
65
64
|
if (this.items[value] == null) return;
|
|
66
|
-
|
|
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;
|
|
65
|
+
this.items = {};
|
|
74
66
|
} else {
|
|
75
67
|
const { field } = value;
|
|
76
68
|
if (this.items[field] == null) return;
|
|
@@ -90,7 +82,7 @@ var FilterManager = class {
|
|
|
90
82
|
this.filter();
|
|
91
83
|
}
|
|
92
84
|
};
|
|
93
|
-
|
|
85
|
+
var comparators = {
|
|
94
86
|
contains: (row, filter) => includes(getString(row), getString(filter), true),
|
|
95
87
|
"ends-with": (row, filter) => endsWith(getString(row), getString(filter), true),
|
|
96
88
|
equals: (row, filter) => equalizer(row, filter),
|
|
@@ -102,6 +94,5 @@ const comparators = {
|
|
|
102
94
|
"not-equals": (row, filter) => !equalizer(row, filter),
|
|
103
95
|
"starts-with": (row, filter) => startsWith(getString(row), getString(filter), true)
|
|
104
96
|
};
|
|
105
|
-
|
|
106
|
-
//#endregion
|
|
97
|
+
var equalizer = equal.initialize({ ignoreCase: true });
|
|
107
98
|
export { FilterManager };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { sort } from "@oscarpalmer/atoms/array";
|
|
2
|
+
import { toRecord } from "@oscarpalmer/atoms/array/to-record";
|
|
3
|
+
import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
|
|
4
|
+
var GroupManager = class {
|
|
5
|
+
collapsed = /* @__PURE__ */ new Set();
|
|
6
|
+
enabled = false;
|
|
7
|
+
field;
|
|
8
|
+
items = [];
|
|
9
|
+
order = {};
|
|
10
|
+
constructor(state) {
|
|
11
|
+
this.state = state;
|
|
12
|
+
if (isNullableOrWhitespace(state.options.grouping)) return;
|
|
13
|
+
this.enabled = true;
|
|
14
|
+
this.field = state.options.grouping;
|
|
15
|
+
}
|
|
16
|
+
add(group) {
|
|
17
|
+
this.set([...this.items, group]);
|
|
18
|
+
}
|
|
19
|
+
get(value) {
|
|
20
|
+
return this.items.find((item) => item.value === value);
|
|
21
|
+
}
|
|
22
|
+
handle(button) {
|
|
23
|
+
const key = button.dataset.key;
|
|
24
|
+
const group = this.get(key);
|
|
25
|
+
if (group == null) return;
|
|
26
|
+
const { collapsed, items, state } = this;
|
|
27
|
+
group.expanded = !group.expanded;
|
|
28
|
+
const index = items.indexOf(group);
|
|
29
|
+
let first = state.managers.data.values.keys.original.indexOf(items[index]) + 1;
|
|
30
|
+
const last = items[index + 1] == null ? state.managers.data.keys.length - 1 : state.managers.data.values.keys.original.indexOf(items[index + 1]) - 1;
|
|
31
|
+
for (; first <= last; first += 1) {
|
|
32
|
+
const key = state.managers.data.values.keys.original[first];
|
|
33
|
+
if (group.expanded) collapsed.delete(key);
|
|
34
|
+
else collapsed.add(key);
|
|
35
|
+
}
|
|
36
|
+
state.managers.render.update(true, true);
|
|
37
|
+
}
|
|
38
|
+
remove(group) {
|
|
39
|
+
this.set(this.items.filter((item) => item !== group));
|
|
40
|
+
}
|
|
41
|
+
set(items) {
|
|
42
|
+
this.items = sort(items, (item) => item.label);
|
|
43
|
+
this.order = toRecord(items, "value", (_, index) => index);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export { GroupManager };
|