@oscarpalmer/tabela 0.13.0 → 0.15.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.d.mts +10 -1
- package/dist/components/body.component.mjs +8 -6
- package/dist/components/column.component.d.mts +15 -1
- package/dist/components/column.component.mjs +12 -10
- package/dist/components/footer.component.d.mts +12 -1
- package/dist/components/footer.component.mjs +6 -6
- package/dist/components/group.component.d.mts +19 -1
- package/dist/components/group.component.mjs +17 -11
- package/dist/components/header.component.d.mts +12 -1
- package/dist/components/header.component.mjs +5 -5
- package/dist/components/row.component.d.mts +14 -1
- package/dist/components/row.component.mjs +21 -17
- package/dist/helpers/dom.helpers.d.mts +3 -3
- package/dist/helpers/dom.helpers.mjs +12 -11
- package/dist/helpers/misc.helpers.d.mts +7 -1
- package/dist/helpers/misc.helpers.mjs +12 -1
- package/dist/index.d.mts +1 -1
- package/dist/managers/column.manager.d.mts +16 -1
- package/dist/managers/column.manager.mjs +7 -7
- package/dist/managers/data.manager.d.mts +26 -1
- package/dist/managers/data.manager.mjs +122 -88
- package/dist/managers/event.manager.d.mts +17 -1
- package/dist/managers/event.manager.mjs +35 -10
- package/dist/managers/filter.manager.d.mts +17 -1
- package/dist/managers/filter.manager.mjs +43 -35
- package/dist/managers/group.manager.d.mts +26 -1
- package/dist/managers/group.manager.mjs +36 -16
- package/dist/managers/navigation.manager.d.mts +15 -2
- package/dist/managers/navigation.manager.mjs +38 -34
- package/dist/managers/render.manager.d.mts +18 -1
- package/dist/managers/render.manager.mjs +44 -31
- package/dist/managers/row.manager.d.mts +18 -1
- package/dist/managers/row.manager.mjs +1 -1
- package/dist/managers/selection.manager.d.mts +22 -1
- package/dist/managers/selection.manager.mjs +26 -23
- package/dist/managers/sort.manager.d.mts +22 -1
- package/dist/managers/sort.manager.mjs +71 -49
- package/dist/managers/style.manager.d.mts +8 -1
- package/dist/managers/style.manager.mjs +57 -25
- package/dist/models/body.model.d.mts +6 -1
- package/dist/models/column.model.d.mts +13 -2
- package/dist/models/data.model.d.mts +28 -2
- package/dist/models/dom.model.d.mts +19 -0
- package/dist/models/dom.model.mjs +19 -0
- package/dist/models/event.model.d.mts +99 -0
- package/dist/models/event.model.mjs +53 -0
- package/dist/models/filter.model.d.mts +26 -2
- package/dist/models/filter.model.mjs +13 -1
- package/dist/models/footer.model.d.mts +7 -1
- package/dist/models/group.model.d.mts +19 -2
- package/dist/models/group.model.mjs +5 -1
- package/dist/models/header.model.d.mts +6 -1
- package/dist/models/render.model.d.mts +22 -2
- package/dist/models/selection.model.d.mts +11 -1
- package/dist/models/sort.model.d.mts +19 -2
- package/dist/models/sort.model.mjs +5 -1
- package/dist/models/style.model.d.mts +27 -21
- package/dist/models/style.model.mjs +27 -21
- package/dist/models/tabela.model.d.mts +45 -1
- package/dist/models/tabela.options.d.mts +13 -1
- package/dist/tabela.d.mts +9 -8
- package/dist/tabela.full.mjs +1083 -574
- package/dist/tabela.mjs +19 -19
- package/package.json +2 -4
- package/src/components/body.component.ts +10 -7
- package/src/components/column.component.ts +20 -16
- package/src/components/footer.component.ts +7 -10
- package/src/components/group.component.ts +39 -13
- 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 +17 -0
- package/src/managers/column.manager.ts +9 -9
- package/src/managers/data.manager.ts +196 -107
- package/src/managers/event.manager.ts +69 -12
- package/src/managers/filter.manager.ts +70 -41
- package/src/managers/group.manager.ts +60 -18
- package/src/managers/navigation.manager.ts +46 -49
- package/src/managers/render.manager.ts +60 -34
- package/src/managers/row.manager.ts +1 -1
- package/src/managers/selection.manager.ts +37 -35
- package/src/managers/sort.manager.ts +114 -72
- package/src/managers/style.manager.ts +73 -25
- package/src/models/column.model.ts +4 -8
- package/src/models/data.model.ts +13 -14
- package/src/models/dom.model.ts +31 -0
- package/src/models/event.model.ts +175 -0
- package/src/models/filter.model.ts +22 -2
- package/src/models/group.model.ts +13 -0
- package/src/models/render.model.ts +6 -0
- package/src/models/sort.model.ts +11 -5
- package/src/models/style.model.ts +32 -20
- package/src/models/tabela.model.ts +1 -0
- package/src/tabela.ts +26 -24
- 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/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/selection.model-rwQe9fco.d.mts +0 -12
- package/dist/sort.model-CauImaLu.d.mts +0 -15
- package/dist/tabela.options-RkZvfptB.d.mts +0 -14
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BodyElements } from "../models/body.model.mjs";
|
|
2
|
+
import { State } from "../models/tabela.model.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/components/body.component.d.ts
|
|
5
|
+
declare class BodyComponent {
|
|
6
|
+
readonly elements: BodyElements;
|
|
7
|
+
constructor(state: State);
|
|
8
|
+
destroy(): void;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
2
11
|
export { BodyComponent };
|
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ATTRIBUTE_DATA_EVENT } from "../models/dom.model.mjs";
|
|
2
|
+
import { CSS_FAKER, CSS_ROWGROUP_BODY } from "../models/style.model.mjs";
|
|
2
3
|
import { createElement, createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import { EVENT_BODY } from "../models/event.model.mjs";
|
|
3
5
|
//#region src/components/body.component.ts
|
|
4
6
|
function createFaker() {
|
|
5
|
-
return createElement("div", { className:
|
|
7
|
+
return createElement("div", { className: CSS_FAKER });
|
|
6
8
|
}
|
|
7
9
|
var BodyComponent = class {
|
|
8
10
|
elements = {
|
|
9
11
|
faker: createFaker(),
|
|
10
12
|
group: void 0
|
|
11
13
|
};
|
|
12
|
-
constructor() {
|
|
13
|
-
const group = createRowGroup(false);
|
|
14
|
+
constructor(state) {
|
|
15
|
+
const group = createRowGroup(state.options.rowHeight, false);
|
|
14
16
|
this.elements.group = group;
|
|
15
|
-
group.className += ` ${
|
|
17
|
+
group.className += ` ${CSS_ROWGROUP_BODY}`;
|
|
16
18
|
group.tabIndex = 0;
|
|
17
|
-
group.setAttribute(
|
|
19
|
+
group.setAttribute(ATTRIBUTE_DATA_EVENT, EVENT_BODY);
|
|
18
20
|
group.append(this.elements.faker);
|
|
19
21
|
}
|
|
20
22
|
destroy() {
|
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Column, TabelaColumn } from "../models/column.model.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/components/column.component.d.ts
|
|
4
|
+
declare class ColumnComponent {
|
|
5
|
+
elements: ColumnElements;
|
|
6
|
+
options: Column;
|
|
7
|
+
constructor(column: TabelaColumn);
|
|
8
|
+
destroy(): void;
|
|
9
|
+
}
|
|
10
|
+
type ColumnElements = {
|
|
11
|
+
content: HTMLDivElement;
|
|
12
|
+
sorter: HTMLDivElement;
|
|
13
|
+
wrapper: HTMLDivElement;
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
2
16
|
export { ColumnComponent };
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ATTRIBUTE_DATA_EVENT, ATTRIBUTE_DATA_KEY, ATTRIBUTE_ROLE, ROLE_COLUMNHEADER } from "../models/dom.model.mjs";
|
|
2
|
+
import { CSS_HEADING, CSS_HEADING_CONTENT, CSS_HEADING_SORTER } from "../models/style.model.mjs";
|
|
2
3
|
import { createElement } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import { EVENT_HEADING } from "../models/event.model.mjs";
|
|
3
5
|
//#region src/components/column.component.ts
|
|
4
6
|
var ColumnComponent = class {
|
|
5
7
|
elements;
|
|
6
8
|
options;
|
|
7
9
|
constructor(column) {
|
|
8
|
-
const width = Number.parseInt(getComputedStyle(document.body).fontSize, 10) * (column.width ?? column.
|
|
10
|
+
const width = Number.parseInt(getComputedStyle(document.body).fontSize, 10) * (column.width ?? column.label.length * 1.5);
|
|
9
11
|
this.options = {
|
|
10
12
|
...column,
|
|
11
13
|
width
|
|
12
14
|
};
|
|
13
|
-
this.elements = createHeading(this.options.
|
|
15
|
+
this.elements = createHeading(this.options.key, this.options.label, width);
|
|
14
16
|
}
|
|
15
17
|
destroy() {
|
|
16
18
|
this.elements.content.remove();
|
|
@@ -20,19 +22,19 @@ var ColumnComponent = class {
|
|
|
20
22
|
this.options = void 0;
|
|
21
23
|
}
|
|
22
24
|
};
|
|
23
|
-
function createHeading(
|
|
25
|
+
function createHeading(key, title, width) {
|
|
24
26
|
const wrapper = createElement("div", {
|
|
25
|
-
className:
|
|
26
|
-
|
|
27
|
+
className: CSS_HEADING,
|
|
28
|
+
[ATTRIBUTE_ROLE]: ROLE_COLUMNHEADER
|
|
27
29
|
}, {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
[ATTRIBUTE_DATA_EVENT]: EVENT_HEADING,
|
|
31
|
+
[ATTRIBUTE_DATA_KEY]: key
|
|
30
32
|
}, { width: `${width}px` });
|
|
31
33
|
const content = createElement("div", {
|
|
32
|
-
className:
|
|
34
|
+
className: CSS_HEADING_CONTENT,
|
|
33
35
|
textContent: title
|
|
34
36
|
});
|
|
35
|
-
const sorter = createElement("div", { className:
|
|
37
|
+
const sorter = createElement("div", { className: CSS_HEADING_SORTER });
|
|
36
38
|
wrapper.append(content, sorter);
|
|
37
39
|
return {
|
|
38
40
|
content,
|
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FooterElements } from "../models/footer.model.mjs";
|
|
2
|
+
import { ColumnComponent } from "./column.component.mjs";
|
|
3
|
+
import { State } from "../models/tabela.model.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/components/footer.component.d.ts
|
|
6
|
+
declare class FooterComponent {
|
|
7
|
+
readonly elements: FooterElements;
|
|
8
|
+
constructor(state: State);
|
|
9
|
+
destroy(): void;
|
|
10
|
+
update(columns: ColumnComponent[]): void;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
2
13
|
export { FooterComponent };
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CSS_CELL_FOOTER, CSS_ROWGROUP_FOOTER, CSS_ROW_FOOTER } from "../models/style.model.mjs";
|
|
2
2
|
import { createCell, createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
3
|
//#region src/components/footer.component.ts
|
|
4
4
|
var FooterComponent = class {
|
|
5
5
|
elements;
|
|
6
|
-
constructor() {
|
|
7
|
-
const { group, row } = createRowGroup();
|
|
6
|
+
constructor(state) {
|
|
7
|
+
const { group, row } = createRowGroup(state.options.rowHeight);
|
|
8
8
|
this.elements = {
|
|
9
9
|
group,
|
|
10
10
|
row,
|
|
11
11
|
cells: []
|
|
12
12
|
};
|
|
13
|
-
group.className += ` ${
|
|
14
|
-
row.className += ` ${
|
|
13
|
+
group.className += ` ${CSS_ROWGROUP_FOOTER}`;
|
|
14
|
+
row.className += ` ${CSS_ROW_FOOTER}`;
|
|
15
15
|
}
|
|
16
16
|
destroy() {
|
|
17
17
|
this.elements.cells.length = 0;
|
|
@@ -25,7 +25,7 @@ var FooterComponent = class {
|
|
|
25
25
|
elements.row.innerHTML = "";
|
|
26
26
|
for (let index = 0; index < length; index += 1) {
|
|
27
27
|
const cell = createCell(columns[index].options.width ?? 4, false);
|
|
28
|
-
cell.className += ` ${
|
|
28
|
+
cell.className += ` ${CSS_CELL_FOOTER}`;
|
|
29
29
|
cell.innerHTML = " ";
|
|
30
30
|
elements.cells.push(cell);
|
|
31
31
|
elements.row.append(cell);
|
|
@@ -1,2 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GroupValue } from "../models/group.model.mjs";
|
|
2
|
+
import { State } from "../models/tabela.model.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/components/group.component.d.ts
|
|
5
|
+
declare class GroupComponent {
|
|
6
|
+
readonly label: string;
|
|
7
|
+
element: HTMLElement | undefined;
|
|
8
|
+
expanded: boolean;
|
|
9
|
+
filtered: number;
|
|
10
|
+
readonly key: string;
|
|
11
|
+
selected: number;
|
|
12
|
+
total: number;
|
|
13
|
+
readonly value: GroupValue;
|
|
14
|
+
constructor(label: string, value: unknown);
|
|
15
|
+
}
|
|
16
|
+
declare function removeGroup(group: GroupComponent): void;
|
|
17
|
+
declare function renderGroup(state: State, component: GroupComponent): void;
|
|
18
|
+
declare function updateGroup(state: State, component: GroupComponent, emit: boolean): void;
|
|
19
|
+
//#endregion
|
|
2
20
|
export { GroupComponent, removeGroup, renderGroup, updateGroup };
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ATTRIBUTE_DATA_EVENT, ATTRIBUTE_DATA_KEY, ATTRIBUTE_ROLE, ROLE_CELL } from "../models/dom.model.mjs";
|
|
2
|
+
import { CSS_BUTTON, CSS_BUTTON_GROUP, CSS_CELL, CSS_CELL_GROUP, CSS_GROUP_SELECTED, CSS_GROUP_TOTAL, CSS_ROW, CSS_ROW_GROUP } from "../models/style.model.mjs";
|
|
2
3
|
import { createElement } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import { EVENT_GROUP, EVENT_GROUP_UPDATE } from "../models/event.model.mjs";
|
|
5
|
+
import { GROUP_KEY_PREFIX } from "../models/group.model.mjs";
|
|
3
6
|
import { getString } from "@oscarpalmer/atoms/string";
|
|
4
7
|
//#region src/components/group.component.ts
|
|
5
8
|
var GroupComponent = class {
|
|
@@ -13,7 +16,7 @@ var GroupComponent = class {
|
|
|
13
16
|
constructor(label, value) {
|
|
14
17
|
this.label = label;
|
|
15
18
|
const stringified = getString(value);
|
|
16
|
-
this.key =
|
|
19
|
+
this.key = `${GROUP_KEY_PREFIX}${stringified}`;
|
|
17
20
|
this.value = {
|
|
18
21
|
stringified,
|
|
19
22
|
original: value
|
|
@@ -27,25 +30,28 @@ function removeGroup(group) {
|
|
|
27
30
|
}
|
|
28
31
|
function renderGroup(state, component) {
|
|
29
32
|
component.element ??= createElement("div", {
|
|
30
|
-
className: `${
|
|
31
|
-
innerHTML: `<div class="
|
|
32
|
-
<button class="
|
|
33
|
+
className: `${CSS_ROW} ${CSS_ROW_GROUP}`,
|
|
34
|
+
innerHTML: `<div class="${CSS_CELL} ${CSS_CELL_GROUP}" role="${ROLE_CELL}">
|
|
35
|
+
<button class="${CSS_BUTTON} ${CSS_BUTTON_GROUP}" ${ATTRIBUTE_DATA_EVENT}="${EVENT_GROUP}" ${ATTRIBUTE_DATA_KEY}="${state.prefix}_${component.key}" type="button">
|
|
33
36
|
<span aria-hidden="true"></span>
|
|
34
37
|
<span>Open/close</span>
|
|
35
38
|
</button>
|
|
36
39
|
<p>${component.label}</p>
|
|
37
|
-
<span class="
|
|
38
|
-
<span class="
|
|
40
|
+
<span class="${CSS_GROUP_TOTAL}">${component.total}</span>
|
|
41
|
+
<span class="${CSS_GROUP_SELECTED}">${component.selected === 0 ? "" : component.selected}</span>
|
|
39
42
|
</div>`,
|
|
40
|
-
|
|
43
|
+
[ATTRIBUTE_ROLE]: "row"
|
|
41
44
|
}, {}, { height: `${state.options.rowHeight}px` });
|
|
42
45
|
}
|
|
43
|
-
function updateGroup(state, component) {
|
|
46
|
+
function updateGroup(state, component, emit) {
|
|
44
47
|
if (component.element == null) return;
|
|
45
|
-
const selected = component.element.querySelector(
|
|
46
|
-
const total = component.element.querySelector(
|
|
48
|
+
const selected = component.element.querySelector(selectedSelector);
|
|
49
|
+
const total = component.element.querySelector(totalSelector);
|
|
47
50
|
if (selected != null) selected.textContent = component.selected === 0 ? "" : String(component.selected);
|
|
48
51
|
if (total != null) total.textContent = String(component.total);
|
|
52
|
+
if (emit) state.managers.event.emit(EVENT_GROUP_UPDATE, [component]);
|
|
49
53
|
}
|
|
54
|
+
const selectedSelector = `.${CSS_GROUP_SELECTED}`;
|
|
55
|
+
const totalSelector = `.${CSS_GROUP_TOTAL}`;
|
|
50
56
|
//#endregion
|
|
51
57
|
export { GroupComponent, removeGroup, renderGroup, updateGroup };
|
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ColumnComponent } from "./column.component.mjs";
|
|
2
|
+
import { HeaderElements } from "../models/header.model.mjs";
|
|
3
|
+
import { State } from "../models/tabela.model.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/components/header.component.d.ts
|
|
6
|
+
declare class HeaderComponent {
|
|
7
|
+
readonly elements: HeaderElements;
|
|
8
|
+
constructor(state: State);
|
|
9
|
+
destroy(): void;
|
|
10
|
+
update(columns: ColumnComponent[]): void;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
2
13
|
export { HeaderComponent };
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CSS_ROWGROUP_HEADER, CSS_ROW_HEADER } from "../models/style.model.mjs";
|
|
2
2
|
import { createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
3
|
//#region src/components/header.component.ts
|
|
4
4
|
var HeaderComponent = class {
|
|
5
5
|
elements;
|
|
6
|
-
constructor() {
|
|
7
|
-
const { group, row } = createRowGroup();
|
|
6
|
+
constructor(state) {
|
|
7
|
+
const { group, row } = createRowGroup(state.options.rowHeight);
|
|
8
8
|
this.elements = {
|
|
9
9
|
group,
|
|
10
10
|
row
|
|
11
11
|
};
|
|
12
|
-
group.className += ` ${
|
|
13
|
-
row.className += ` ${
|
|
12
|
+
group.className += ` ${CSS_ROWGROUP_HEADER}`;
|
|
13
|
+
row.className += ` ${CSS_ROW_HEADER}`;
|
|
14
14
|
}
|
|
15
15
|
destroy() {
|
|
16
16
|
this.elements.group = void 0;
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RenderElementPool } from "../models/render.model.mjs";
|
|
2
|
+
import { State } from "../models/tabela.model.mjs";
|
|
3
|
+
import { Key } from "@oscarpalmer/atoms/models";
|
|
4
|
+
|
|
5
|
+
//#region src/components/row.component.d.ts
|
|
6
|
+
declare function removeRow(pool: RenderElementPool, row: RowComponent): void;
|
|
7
|
+
declare function renderRow(state: State, row: RowComponent): void;
|
|
8
|
+
declare class RowComponent {
|
|
9
|
+
readonly key: Key;
|
|
10
|
+
cells: Record<string, HTMLDivElement>;
|
|
11
|
+
element: HTMLDivElement | undefined;
|
|
12
|
+
constructor(key: Key);
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
2
15
|
export { RowComponent, removeRow, renderRow };
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ARIA_SELECTED, ATTRIBUTE_DATA_ACTIVE, ATTRIBUTE_DATA_EVENT, ATTRIBUTE_DATA_KEY } from "../models/dom.model.mjs";
|
|
2
|
+
import { CSS_ROW_BODY, CSS_ROW_SELECTED } from "../models/style.model.mjs";
|
|
2
3
|
import { createCell, createRow } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import "../models/event.model.mjs";
|
|
3
5
|
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
4
6
|
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
5
7
|
//#region src/components/row.component.ts
|
|
@@ -13,31 +15,33 @@ function removeRow(pool, row) {
|
|
|
13
15
|
row.cells = {};
|
|
14
16
|
}
|
|
15
17
|
function renderRow(state, row) {
|
|
16
|
-
const
|
|
18
|
+
const { managers, options, prefix } = state;
|
|
19
|
+
const element = row.element ?? managers.render.pool.rows.shift() ?? createRow(options.rowHeight);
|
|
17
20
|
row.element = element;
|
|
18
21
|
element.innerHTML = "";
|
|
19
|
-
const selected =
|
|
22
|
+
const selected = managers.selection.items.has(row.key);
|
|
20
23
|
const key = String(row.key);
|
|
21
24
|
setAttributes(element, {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
id:
|
|
25
|
+
[ARIA_SELECTED]: String(selected),
|
|
26
|
+
[ATTRIBUTE_DATA_ACTIVE]: String(managers.navigation.active === row.key),
|
|
27
|
+
[ATTRIBUTE_DATA_EVENT]: "row",
|
|
28
|
+
[ATTRIBUTE_DATA_KEY]: key,
|
|
29
|
+
id: `${prefix}${key}`
|
|
27
30
|
});
|
|
28
|
-
element.classList.add(
|
|
29
|
-
if (selected) element.classList.add(
|
|
30
|
-
else element.classList.remove(
|
|
31
|
-
const columns =
|
|
31
|
+
element.classList.add(CSS_ROW_BODY);
|
|
32
|
+
if (selected) element.classList.add(CSS_ROW_SELECTED);
|
|
33
|
+
else element.classList.remove(CSS_ROW_SELECTED);
|
|
34
|
+
const columns = managers.column.items;
|
|
32
35
|
const { length } = columns;
|
|
33
|
-
const data =
|
|
36
|
+
const data = managers.data.state.values.mapped.get(row.key);
|
|
34
37
|
if (data == null) return;
|
|
35
38
|
for (let index = 0; index < length; index += 1) {
|
|
36
39
|
const { options } = columns[index];
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
cell
|
|
40
|
-
|
|
40
|
+
const { key, width } = options;
|
|
41
|
+
managers.render.pool.cells[key] ??= [];
|
|
42
|
+
const cell = managers.render.pool.cells[key].shift() ?? createCell(width);
|
|
43
|
+
cell.textContent = String(getValue(data, key));
|
|
44
|
+
row.cells[key] = cell;
|
|
41
45
|
element.append(cell);
|
|
42
46
|
}
|
|
43
47
|
}
|
|
@@ -5,8 +5,8 @@ type RowGroupWithRow = {
|
|
|
5
5
|
};
|
|
6
6
|
declare function createCell(width: number, body?: boolean): HTMLDivElement;
|
|
7
7
|
declare function createElement<TagName extends keyof HTMLElementTagNameMap>(tagName: TagName, properties?: Partial<HTMLElementTagNameMap[TagName]>, attributes?: Record<string, string>, style?: Partial<CSSStyleDeclaration>): HTMLElementTagNameMap[TagName];
|
|
8
|
-
declare function createRowGroup(): RowGroupWithRow;
|
|
9
|
-
declare function createRowGroup(withRow: boolean): HTMLDivElement;
|
|
10
|
-
declare function createRow(): HTMLDivElement;
|
|
8
|
+
declare function createRowGroup(height: number): RowGroupWithRow;
|
|
9
|
+
declare function createRowGroup(height: number, withRow: boolean): HTMLDivElement;
|
|
10
|
+
declare function createRow(height: number): HTMLDivElement;
|
|
11
11
|
//#endregion
|
|
12
12
|
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ROLE_CELL, ROLE_ROWGROUP } from "../models/dom.model.mjs";
|
|
2
|
+
import { CSS_CELL, CSS_CELL_BODY, CSS_ROW, CSS_ROWGROUP } from "../models/style.model.mjs";
|
|
2
3
|
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
3
4
|
import { setStyles } from "@oscarpalmer/toretto/style";
|
|
4
5
|
//#region src/helpers/dom.helpers.ts
|
|
5
6
|
function createCell(width, body) {
|
|
6
7
|
const cell = createElement("div", {
|
|
7
|
-
className:
|
|
8
|
-
role:
|
|
8
|
+
className: CSS_CELL,
|
|
9
|
+
role: ROLE_CELL
|
|
9
10
|
}, {}, { width: `${width}px` });
|
|
10
|
-
if (body ?? true) cell.classList.add(
|
|
11
|
+
if (body ?? true) cell.classList.add(CSS_CELL_BODY);
|
|
11
12
|
return cell;
|
|
12
13
|
}
|
|
13
14
|
function createElement(tagName, properties, attributes, style) {
|
|
@@ -19,24 +20,24 @@ function createElement(tagName, properties, attributes, style) {
|
|
|
19
20
|
setStyles(element, style ?? {});
|
|
20
21
|
return element;
|
|
21
22
|
}
|
|
22
|
-
function createRowGroup(withRow) {
|
|
23
|
+
function createRowGroup(height, withRow) {
|
|
23
24
|
const group = createElement("div", {
|
|
24
|
-
className:
|
|
25
|
-
role:
|
|
25
|
+
className: CSS_ROWGROUP,
|
|
26
|
+
role: ROLE_ROWGROUP
|
|
26
27
|
});
|
|
27
28
|
if (!(withRow ?? true)) return group;
|
|
28
|
-
const row = createRow();
|
|
29
|
+
const row = createRow(height);
|
|
29
30
|
group.append(row);
|
|
30
31
|
return {
|
|
31
32
|
group,
|
|
32
33
|
row
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
|
-
function createRow() {
|
|
36
|
+
function createRow(height) {
|
|
36
37
|
return createElement("div", {
|
|
37
|
-
className:
|
|
38
|
+
className: CSS_ROW,
|
|
38
39
|
role: "row"
|
|
39
|
-
}, {}, { height:
|
|
40
|
+
}, {}, { height: `${height}px` });
|
|
40
41
|
}
|
|
41
42
|
//#endregion
|
|
42
43
|
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import { TabelaGroup } from "../models/group.model.mjs";
|
|
2
|
+
import { EventName } from "../models/event.model.mjs";
|
|
3
|
+
import { GroupComponent } from "../components/group.component.mjs";
|
|
1
4
|
import { Key } from "@oscarpalmer/atoms/models";
|
|
2
5
|
|
|
3
6
|
//#region src/helpers/misc.helpers.d.ts
|
|
7
|
+
declare function getGroup(group: GroupComponent): TabelaGroup;
|
|
4
8
|
declare function getKey(value: unknown): Key | undefined;
|
|
9
|
+
declare function isEvent(value: unknown): value is EventName;
|
|
10
|
+
declare function isGroupKey(key: unknown): boolean;
|
|
5
11
|
//#endregion
|
|
6
|
-
export { getKey };
|
|
12
|
+
export { getGroup, getKey, isEvent, isGroupKey };
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
+
import { EVENTS_NAMES } from "../models/event.model.mjs";
|
|
2
|
+
import { GROUP_KEY_EXPRESSION } from "../models/group.model.mjs";
|
|
1
3
|
//#region src/helpers/misc.helpers.ts
|
|
4
|
+
function getGroup(group) {
|
|
5
|
+
return { value: group.value.original };
|
|
6
|
+
}
|
|
2
7
|
function getKey(value) {
|
|
3
8
|
if (typeof value === "number") return value;
|
|
4
9
|
if (typeof value !== "string") return;
|
|
5
10
|
return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
|
|
6
11
|
}
|
|
12
|
+
function isEvent(value) {
|
|
13
|
+
return EVENTS_NAMES.has(value);
|
|
14
|
+
}
|
|
15
|
+
function isGroupKey(key) {
|
|
16
|
+
return typeof key === "string" && GROUP_KEY_EXPRESSION.test(key);
|
|
17
|
+
}
|
|
7
18
|
const integerExpression = /^\d+$/;
|
|
8
19
|
//#endregion
|
|
9
|
-
export { getKey };
|
|
20
|
+
export { getGroup, getKey, isEvent, isGroupKey };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TabelaColumn } from "../models/column.model.mjs";
|
|
2
|
+
import { ColumnComponent } from "../components/column.component.mjs";
|
|
3
|
+
import { State } from "../models/tabela.model.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/managers/column.manager.d.ts
|
|
6
|
+
declare class ColumnManager {
|
|
7
|
+
state: State;
|
|
8
|
+
items: ColumnComponent[];
|
|
9
|
+
constructor(state: State);
|
|
10
|
+
destroy(): void;
|
|
11
|
+
get(key: string): ColumnComponent | undefined;
|
|
12
|
+
remove(key: string): void;
|
|
13
|
+
remove(keys: string[]): void;
|
|
14
|
+
set(columns: TabelaColumn[]): void;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
2
17
|
export { ColumnManager };
|
|
@@ -12,17 +12,17 @@ var ColumnManager = class {
|
|
|
12
12
|
this.items = void 0;
|
|
13
13
|
this.state = void 0;
|
|
14
14
|
}
|
|
15
|
-
get(
|
|
16
|
-
return this.items.find((item) => item.options.
|
|
15
|
+
get(key) {
|
|
16
|
+
return this.items.find((item) => item.options.key === key);
|
|
17
17
|
}
|
|
18
18
|
remove(value) {
|
|
19
19
|
const { items, state } = this;
|
|
20
20
|
const { components, managers } = state;
|
|
21
|
-
const
|
|
22
|
-
const { length } =
|
|
21
|
+
const keys = (Array.isArray(value) ? value : [value]).filter((item) => typeof item === "string");
|
|
22
|
+
const { length } = keys;
|
|
23
23
|
if (length === 0) return;
|
|
24
|
-
for (let
|
|
25
|
-
const itemIndex = items.findIndex((component) => component.options.
|
|
24
|
+
for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
|
|
25
|
+
const itemIndex = items.findIndex((component) => component.options.key === keys[keyIndex]);
|
|
26
26
|
if (itemIndex > -1) {
|
|
27
27
|
items[itemIndex].destroy();
|
|
28
28
|
items.splice(itemIndex, 1);
|
|
@@ -30,7 +30,7 @@ var ColumnManager = class {
|
|
|
30
30
|
}
|
|
31
31
|
components.header.update(items);
|
|
32
32
|
components.footer.update(items);
|
|
33
|
-
managers.render.removeCells(
|
|
33
|
+
managers.render.removeCells(keys);
|
|
34
34
|
}
|
|
35
35
|
set(columns) {
|
|
36
36
|
const { items, state } = this;
|
|
@@ -1,2 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataState, TabelaData } from "../models/data.model.mjs";
|
|
2
|
+
import { State } from "../models/tabela.model.mjs";
|
|
3
|
+
import { Key, PlainObject } from "@oscarpalmer/atoms/models";
|
|
4
|
+
|
|
5
|
+
//#region src/managers/data.manager.d.ts
|
|
6
|
+
declare class DataManager {
|
|
7
|
+
handlers: TabelaData;
|
|
8
|
+
state: DataState;
|
|
9
|
+
get keys(): Key[];
|
|
10
|
+
get size(): number;
|
|
11
|
+
constructor(state: State);
|
|
12
|
+
add(data: PlainObject[], render: boolean): Promise<void>;
|
|
13
|
+
clear(): Promise<void>;
|
|
14
|
+
destroy(): void;
|
|
15
|
+
get(active?: boolean): PlainObject[];
|
|
16
|
+
getIndex(item: Key): number;
|
|
17
|
+
remove(items: Array<Key | PlainObject>, render: false): Promise<PlainObject[]>;
|
|
18
|
+
remove(items: Array<Key | PlainObject>, render: true): Promise<void>;
|
|
19
|
+
removeItems(data: Key[], clear: boolean, render: false): Promise<PlainObject[]>;
|
|
20
|
+
removeItems(data: Key[], clear: boolean, render: true): Promise<void>;
|
|
21
|
+
render(): void;
|
|
22
|
+
set(data: PlainObject[]): void;
|
|
23
|
+
synchronize(data: PlainObject[], remove: boolean): Promise<void>;
|
|
24
|
+
update(data: PlainObject[], render: boolean): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
2
27
|
export { DataManager };
|