@oscarpalmer/tabela 0.14.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 +11 -0
- package/dist/components/body.component.mjs +28 -0
- package/dist/components/column.component.d.mts +16 -0
- package/dist/components/column.component.mjs +46 -0
- package/dist/components/footer.component.d.mts +13 -0
- package/dist/components/{footer.component.js → footer.component.mjs} +9 -6
- package/dist/components/group.component.d.mts +20 -0
- package/dist/components/group.component.mjs +57 -0
- package/dist/components/header.component.d.mts +13 -0
- package/dist/components/header.component.mjs +25 -0
- package/dist/components/row.component.d.mts +15 -0
- package/dist/components/row.component.mjs +56 -0
- package/dist/helpers/dom.helpers.d.mts +12 -0
- package/dist/helpers/dom.helpers.mjs +43 -0
- package/dist/helpers/misc.helpers.d.mts +12 -0
- package/dist/helpers/misc.helpers.mjs +20 -0
- 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 +17 -0
- package/dist/managers/{column.manager.js → column.manager.mjs} +11 -6
- package/dist/managers/data.manager.d.mts +27 -0
- package/dist/managers/data.manager.mjs +256 -0
- package/dist/managers/event.manager.d.mts +18 -0
- package/dist/managers/event.manager.mjs +79 -0
- package/dist/managers/filter.manager.d.mts +18 -0
- package/dist/managers/filter.manager.mjs +115 -0
- package/dist/managers/group.manager.d.mts +27 -0
- package/dist/managers/group.manager.mjs +93 -0
- package/dist/managers/navigation.manager.d.mts +15 -0
- package/dist/managers/navigation.manager.mjs +80 -0
- package/dist/managers/render.manager.d.mts +19 -0
- package/dist/managers/render.manager.mjs +157 -0
- package/dist/managers/row.manager.d.mts +19 -0
- package/dist/managers/row.manager.mjs +45 -0
- package/dist/managers/selection.manager.d.mts +23 -0
- package/dist/managers/{selection.manager.js → selection.manager.mjs} +38 -31
- package/dist/managers/sort.manager.d.mts +23 -0
- package/dist/managers/sort.manager.mjs +147 -0
- package/dist/managers/style.manager.d.mts +9 -0
- package/dist/managers/style.manager.mjs +181 -0
- package/dist/models/body.model.d.mts +7 -0
- package/dist/models/body.model.mjs +1 -0
- package/dist/models/column.model.d.mts +13 -0
- package/dist/models/column.model.mjs +1 -0
- package/dist/models/data.model.d.mts +28 -0
- package/dist/models/data.model.mjs +1 -0
- 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 -0
- package/dist/models/filter.model.mjs +13 -0
- package/dist/models/footer.model.d.mts +8 -0
- package/dist/models/footer.model.mjs +1 -0
- package/dist/models/group.model.d.mts +19 -0
- package/dist/models/group.model.mjs +5 -0
- package/dist/models/header.model.d.mts +7 -0
- package/dist/models/header.model.mjs +1 -0
- package/dist/models/render.model.d.mts +22 -0
- package/dist/models/render.model.mjs +1 -0
- package/dist/models/selection.model.d.mts +12 -0
- package/dist/models/selection.model.mjs +1 -0
- package/dist/models/sort.model.d.mts +19 -0
- package/dist/models/sort.model.mjs +5 -0
- package/dist/models/style.model.d.mts +29 -0
- package/dist/models/style.model.mjs +29 -0
- package/dist/models/tabela.model.d.mts +46 -0
- package/dist/models/tabela.model.mjs +1 -0
- package/dist/models/tabela.options.d.mts +14 -0
- package/dist/models/tabela.options.mjs +1 -0
- package/dist/tabela.d.mts +22 -0
- package/dist/{tabela.full.js → tabela.full.mjs} +1501 -803
- package/dist/tabela.mjs +126 -0
- package/package.json +2 -4
- package/src/components/column.component.ts +4 -4
- package/src/components/group.component.ts +6 -2
- package/src/components/row.component.ts +5 -5
- package/src/helpers/misc.helpers.ts +13 -1
- package/src/managers/column.manager.ts +9 -9
- package/src/managers/data.manager.ts +139 -53
- package/src/managers/event.manager.ts +52 -6
- package/src/managers/filter.manager.ts +36 -20
- package/src/managers/group.manager.ts +43 -10
- package/src/managers/render.manager.ts +30 -17
- package/src/managers/sort.manager.ts +81 -52
- package/src/managers/style.manager.ts +33 -0
- package/src/models/column.model.ts +2 -2
- package/src/models/data.model.ts +6 -6
- package/src/models/dom.model.ts +0 -2
- package/src/models/event.model.ts +168 -0
- package/src/models/filter.model.ts +2 -2
- package/src/models/group.model.ts +9 -0
- package/src/models/render.model.ts +6 -0
- package/src/models/sort.model.ts +7 -5
- package/src/tabela.ts +6 -2
- package/dist/components/body.component.js +0 -23
- package/dist/components/column.component.js +0 -41
- package/dist/components/group.component.js +0 -28
- package/dist/components/header.component.js +0 -22
- package/dist/components/row.component.js +0 -48
- package/dist/helpers/dom.helpers.js +0 -38
- package/dist/helpers/misc.helpers.js +0 -7
- package/dist/helpers/style.helper.js +0 -6
- package/dist/managers/data.manager.js +0 -181
- package/dist/managers/event.manager.js +0 -53
- package/dist/managers/filter.manager.js +0 -98
- package/dist/managers/group.manager.js +0 -46
- package/dist/managers/navigation.manager.js +0 -73
- package/dist/managers/render.manager.js +0 -135
- package/dist/managers/row.manager.js +0 -38
- package/dist/managers/sort.manager.js +0 -122
- 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
|
@@ -0,0 +1,11 @@
|
|
|
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
|
|
11
|
+
export { BodyComponent };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ATTRIBUTE_DATA_EVENT } from "../models/dom.model.mjs";
|
|
2
|
+
import { CSS_FAKER, CSS_ROWGROUP_BODY } from "../models/style.model.mjs";
|
|
3
|
+
import { createElement, createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import { EVENT_BODY } from "../models/event.model.mjs";
|
|
5
|
+
//#region src/components/body.component.ts
|
|
6
|
+
function createFaker() {
|
|
7
|
+
return createElement("div", { className: CSS_FAKER });
|
|
8
|
+
}
|
|
9
|
+
var BodyComponent = class {
|
|
10
|
+
elements = {
|
|
11
|
+
faker: createFaker(),
|
|
12
|
+
group: void 0
|
|
13
|
+
};
|
|
14
|
+
constructor(state) {
|
|
15
|
+
const group = createRowGroup(state.options.rowHeight, false);
|
|
16
|
+
this.elements.group = group;
|
|
17
|
+
group.className += ` ${CSS_ROWGROUP_BODY}`;
|
|
18
|
+
group.tabIndex = 0;
|
|
19
|
+
group.setAttribute(ATTRIBUTE_DATA_EVENT, EVENT_BODY);
|
|
20
|
+
group.append(this.elements.faker);
|
|
21
|
+
}
|
|
22
|
+
destroy() {
|
|
23
|
+
this.elements.faker = void 0;
|
|
24
|
+
this.elements.group = void 0;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { BodyComponent };
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
16
|
+
export { ColumnComponent };
|
|
@@ -0,0 +1,46 @@
|
|
|
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";
|
|
3
|
+
import { createElement } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import { EVENT_HEADING } from "../models/event.model.mjs";
|
|
5
|
+
//#region src/components/column.component.ts
|
|
6
|
+
var ColumnComponent = class {
|
|
7
|
+
elements;
|
|
8
|
+
options;
|
|
9
|
+
constructor(column) {
|
|
10
|
+
const width = Number.parseInt(getComputedStyle(document.body).fontSize, 10) * (column.width ?? column.label.length * 1.5);
|
|
11
|
+
this.options = {
|
|
12
|
+
...column,
|
|
13
|
+
width
|
|
14
|
+
};
|
|
15
|
+
this.elements = createHeading(this.options.key, this.options.label, width);
|
|
16
|
+
}
|
|
17
|
+
destroy() {
|
|
18
|
+
this.elements.content.remove();
|
|
19
|
+
this.elements.wrapper.remove();
|
|
20
|
+
this.elements.sorter.remove();
|
|
21
|
+
this.elements = void 0;
|
|
22
|
+
this.options = void 0;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
function createHeading(key, title, width) {
|
|
26
|
+
const wrapper = createElement("div", {
|
|
27
|
+
className: CSS_HEADING,
|
|
28
|
+
[ATTRIBUTE_ROLE]: ROLE_COLUMNHEADER
|
|
29
|
+
}, {
|
|
30
|
+
[ATTRIBUTE_DATA_EVENT]: EVENT_HEADING,
|
|
31
|
+
[ATTRIBUTE_DATA_KEY]: key
|
|
32
|
+
}, { width: `${width}px` });
|
|
33
|
+
const content = createElement("div", {
|
|
34
|
+
className: CSS_HEADING_CONTENT,
|
|
35
|
+
textContent: title
|
|
36
|
+
});
|
|
37
|
+
const sorter = createElement("div", { className: CSS_HEADING_SORTER });
|
|
38
|
+
wrapper.append(content, sorter);
|
|
39
|
+
return {
|
|
40
|
+
content,
|
|
41
|
+
sorter,
|
|
42
|
+
wrapper
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { ColumnComponent };
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
|
13
|
+
export { FooterComponent };
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CSS_CELL_FOOTER, CSS_ROWGROUP_FOOTER, CSS_ROW_FOOTER } from "../models/style.model.mjs";
|
|
2
|
+
import { createCell, createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
|
+
//#region src/components/footer.component.ts
|
|
2
4
|
var FooterComponent = class {
|
|
3
5
|
elements;
|
|
4
|
-
constructor() {
|
|
5
|
-
const { group, row } = createRowGroup();
|
|
6
|
+
constructor(state) {
|
|
7
|
+
const { group, row } = createRowGroup(state.options.rowHeight);
|
|
6
8
|
this.elements = {
|
|
7
9
|
group,
|
|
8
10
|
row,
|
|
9
11
|
cells: []
|
|
10
12
|
};
|
|
11
|
-
group.className +=
|
|
12
|
-
row.className +=
|
|
13
|
+
group.className += ` ${CSS_ROWGROUP_FOOTER}`;
|
|
14
|
+
row.className += ` ${CSS_ROW_FOOTER}`;
|
|
13
15
|
}
|
|
14
16
|
destroy() {
|
|
15
17
|
this.elements.cells.length = 0;
|
|
@@ -23,11 +25,12 @@ var FooterComponent = class {
|
|
|
23
25
|
elements.row.innerHTML = "";
|
|
24
26
|
for (let index = 0; index < length; index += 1) {
|
|
25
27
|
const cell = createCell(columns[index].options.width ?? 4, false);
|
|
26
|
-
cell.className +=
|
|
28
|
+
cell.className += ` ${CSS_CELL_FOOTER}`;
|
|
27
29
|
cell.innerHTML = " ";
|
|
28
30
|
elements.cells.push(cell);
|
|
29
31
|
elements.row.append(cell);
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
};
|
|
35
|
+
//#endregion
|
|
33
36
|
export { FooterComponent };
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
|
20
|
+
export { GroupComponent, removeGroup, renderGroup, updateGroup };
|
|
@@ -0,0 +1,57 @@
|
|
|
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";
|
|
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";
|
|
6
|
+
import { getString } from "@oscarpalmer/atoms/string";
|
|
7
|
+
//#region src/components/group.component.ts
|
|
8
|
+
var GroupComponent = class {
|
|
9
|
+
element;
|
|
10
|
+
expanded = true;
|
|
11
|
+
filtered = 0;
|
|
12
|
+
key;
|
|
13
|
+
selected = 0;
|
|
14
|
+
total = 0;
|
|
15
|
+
value;
|
|
16
|
+
constructor(label, value) {
|
|
17
|
+
this.label = label;
|
|
18
|
+
const stringified = getString(value);
|
|
19
|
+
this.key = `${GROUP_KEY_PREFIX}${stringified}`;
|
|
20
|
+
this.value = {
|
|
21
|
+
stringified,
|
|
22
|
+
original: value
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
function removeGroup(group) {
|
|
27
|
+
if (group.element == null) return;
|
|
28
|
+
group.element.innerHTML = "";
|
|
29
|
+
group.element.remove();
|
|
30
|
+
}
|
|
31
|
+
function renderGroup(state, component) {
|
|
32
|
+
component.element ??= createElement("div", {
|
|
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">
|
|
36
|
+
<span aria-hidden="true"></span>
|
|
37
|
+
<span>Open/close</span>
|
|
38
|
+
</button>
|
|
39
|
+
<p>${component.label}</p>
|
|
40
|
+
<span class="${CSS_GROUP_TOTAL}">${component.total}</span>
|
|
41
|
+
<span class="${CSS_GROUP_SELECTED}">${component.selected === 0 ? "" : component.selected}</span>
|
|
42
|
+
</div>`,
|
|
43
|
+
[ATTRIBUTE_ROLE]: "row"
|
|
44
|
+
}, {}, { height: `${state.options.rowHeight}px` });
|
|
45
|
+
}
|
|
46
|
+
function updateGroup(state, component, emit) {
|
|
47
|
+
if (component.element == null) return;
|
|
48
|
+
const selected = component.element.querySelector(selectedSelector);
|
|
49
|
+
const total = component.element.querySelector(totalSelector);
|
|
50
|
+
if (selected != null) selected.textContent = component.selected === 0 ? "" : String(component.selected);
|
|
51
|
+
if (total != null) total.textContent = String(component.total);
|
|
52
|
+
if (emit) state.managers.event.emit(EVENT_GROUP_UPDATE, [component]);
|
|
53
|
+
}
|
|
54
|
+
const selectedSelector = `.${CSS_GROUP_SELECTED}`;
|
|
55
|
+
const totalSelector = `.${CSS_GROUP_TOTAL}`;
|
|
56
|
+
//#endregion
|
|
57
|
+
export { GroupComponent, removeGroup, renderGroup, updateGroup };
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
|
13
|
+
export { HeaderComponent };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CSS_ROWGROUP_HEADER, CSS_ROW_HEADER } from "../models/style.model.mjs";
|
|
2
|
+
import { createRowGroup } from "../helpers/dom.helpers.mjs";
|
|
3
|
+
//#region src/components/header.component.ts
|
|
4
|
+
var HeaderComponent = class {
|
|
5
|
+
elements;
|
|
6
|
+
constructor(state) {
|
|
7
|
+
const { group, row } = createRowGroup(state.options.rowHeight);
|
|
8
|
+
this.elements = {
|
|
9
|
+
group,
|
|
10
|
+
row
|
|
11
|
+
};
|
|
12
|
+
group.className += ` ${CSS_ROWGROUP_HEADER}`;
|
|
13
|
+
row.className += ` ${CSS_ROW_HEADER}`;
|
|
14
|
+
}
|
|
15
|
+
destroy() {
|
|
16
|
+
this.elements.group = void 0;
|
|
17
|
+
this.elements.row = void 0;
|
|
18
|
+
}
|
|
19
|
+
update(columns) {
|
|
20
|
+
this.elements.row.innerHTML = "";
|
|
21
|
+
this.elements.row.append(...columns.map((column) => column.elements.wrapper));
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
export { HeaderComponent };
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
|
15
|
+
export { RowComponent, removeRow, renderRow };
|
|
@@ -0,0 +1,56 @@
|
|
|
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";
|
|
3
|
+
import { createCell, createRow } from "../helpers/dom.helpers.mjs";
|
|
4
|
+
import "../models/event.model.mjs";
|
|
5
|
+
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
6
|
+
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
7
|
+
//#region src/components/row.component.ts
|
|
8
|
+
function removeRow(pool, row) {
|
|
9
|
+
if (row.element != null) {
|
|
10
|
+
row.element.innerHTML = "";
|
|
11
|
+
pool.rows.push(row.element);
|
|
12
|
+
row.element.remove();
|
|
13
|
+
row.element = void 0;
|
|
14
|
+
}
|
|
15
|
+
row.cells = {};
|
|
16
|
+
}
|
|
17
|
+
function renderRow(state, row) {
|
|
18
|
+
const { managers, options, prefix } = state;
|
|
19
|
+
const element = row.element ?? managers.render.pool.rows.shift() ?? createRow(options.rowHeight);
|
|
20
|
+
row.element = element;
|
|
21
|
+
element.innerHTML = "";
|
|
22
|
+
const selected = managers.selection.items.has(row.key);
|
|
23
|
+
const key = String(row.key);
|
|
24
|
+
setAttributes(element, {
|
|
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}`
|
|
30
|
+
});
|
|
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;
|
|
35
|
+
const { length } = columns;
|
|
36
|
+
const data = managers.data.state.values.mapped.get(row.key);
|
|
37
|
+
if (data == null) return;
|
|
38
|
+
for (let index = 0; index < length; index += 1) {
|
|
39
|
+
const { options } = columns[index];
|
|
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;
|
|
45
|
+
element.append(cell);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
var RowComponent = class {
|
|
49
|
+
cells = {};
|
|
50
|
+
element;
|
|
51
|
+
constructor(key) {
|
|
52
|
+
this.key = key;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { RowComponent, removeRow, renderRow };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/helpers/dom.helpers.d.ts
|
|
2
|
+
type RowGroupWithRow = {
|
|
3
|
+
group: HTMLDivElement;
|
|
4
|
+
row: HTMLDivElement;
|
|
5
|
+
};
|
|
6
|
+
declare function createCell(width: number, body?: boolean): HTMLDivElement;
|
|
7
|
+
declare function createElement<TagName extends keyof HTMLElementTagNameMap>(tagName: TagName, properties?: Partial<HTMLElementTagNameMap[TagName]>, attributes?: Record<string, string>, style?: Partial<CSSStyleDeclaration>): HTMLElementTagNameMap[TagName];
|
|
8
|
+
declare function createRowGroup(height: number): RowGroupWithRow;
|
|
9
|
+
declare function createRowGroup(height: number, withRow: boolean): HTMLDivElement;
|
|
10
|
+
declare function createRow(height: number): HTMLDivElement;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -0,0 +1,43 @@
|
|
|
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";
|
|
3
|
+
import { setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
4
|
+
import { setStyles } from "@oscarpalmer/toretto/style";
|
|
5
|
+
//#region src/helpers/dom.helpers.ts
|
|
6
|
+
function createCell(width, body) {
|
|
7
|
+
const cell = createElement("div", {
|
|
8
|
+
className: CSS_CELL,
|
|
9
|
+
role: ROLE_CELL
|
|
10
|
+
}, {}, { width: `${width}px` });
|
|
11
|
+
if (body ?? true) cell.classList.add(CSS_CELL_BODY);
|
|
12
|
+
return cell;
|
|
13
|
+
}
|
|
14
|
+
function createElement(tagName, properties, attributes, style) {
|
|
15
|
+
const element = document.createElement(tagName);
|
|
16
|
+
const props = properties ?? {};
|
|
17
|
+
const keys = Object.keys(props);
|
|
18
|
+
for (const key of keys) element[key] = props[key];
|
|
19
|
+
setAttributes(element, attributes ?? {});
|
|
20
|
+
setStyles(element, style ?? {});
|
|
21
|
+
return element;
|
|
22
|
+
}
|
|
23
|
+
function createRowGroup(height, withRow) {
|
|
24
|
+
const group = createElement("div", {
|
|
25
|
+
className: CSS_ROWGROUP,
|
|
26
|
+
role: ROLE_ROWGROUP
|
|
27
|
+
});
|
|
28
|
+
if (!(withRow ?? true)) return group;
|
|
29
|
+
const row = createRow(height);
|
|
30
|
+
group.append(row);
|
|
31
|
+
return {
|
|
32
|
+
group,
|
|
33
|
+
row
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function createRow(height) {
|
|
37
|
+
return createElement("div", {
|
|
38
|
+
className: CSS_ROW,
|
|
39
|
+
role: "row"
|
|
40
|
+
}, {}, { height: `${height}px` });
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { createCell, createElement, createRow, createRowGroup };
|
|
@@ -0,0 +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";
|
|
4
|
+
import { Key } from "@oscarpalmer/atoms/models";
|
|
5
|
+
|
|
6
|
+
//#region src/helpers/misc.helpers.d.ts
|
|
7
|
+
declare function getGroup(group: GroupComponent): TabelaGroup;
|
|
8
|
+
declare function getKey(value: unknown): Key | undefined;
|
|
9
|
+
declare function isEvent(value: unknown): value is EventName;
|
|
10
|
+
declare function isGroupKey(key: unknown): boolean;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { getGroup, getKey, isEvent, isGroupKey };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EVENTS_NAMES } from "../models/event.model.mjs";
|
|
2
|
+
import { GROUP_KEY_EXPRESSION } from "../models/group.model.mjs";
|
|
3
|
+
//#region src/helpers/misc.helpers.ts
|
|
4
|
+
function getGroup(group) {
|
|
5
|
+
return { value: group.value.original };
|
|
6
|
+
}
|
|
7
|
+
function getKey(value) {
|
|
8
|
+
if (typeof value === "number") return value;
|
|
9
|
+
if (typeof value !== "string") return;
|
|
10
|
+
return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
|
|
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
|
+
}
|
|
18
|
+
const integerExpression = /^\d+$/;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { getGroup, getKey, isEvent, isGroupKey };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TabelaOptions } from "./models/tabela.options.mjs";
|
|
2
|
+
import { Tabela } from "./tabela.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/index.d.ts
|
|
5
|
+
declare function tabela(element: HTMLElement, options: TabelaOptions): Tabela;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { type Tabela, type TabelaOptions, tabela };
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
17
|
+
export { ColumnManager };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ColumnComponent } from "../components/column.component.
|
|
1
|
+
import { ColumnComponent } from "../components/column.component.mjs";
|
|
2
|
+
//#region src/managers/column.manager.ts
|
|
2
3
|
var ColumnManager = class {
|
|
3
4
|
items = [];
|
|
4
5
|
constructor(state) {
|
|
@@ -11,14 +12,17 @@ var ColumnManager = class {
|
|
|
11
12
|
this.items = void 0;
|
|
12
13
|
this.state = void 0;
|
|
13
14
|
}
|
|
15
|
+
get(key) {
|
|
16
|
+
return this.items.find((item) => item.options.key === key);
|
|
17
|
+
}
|
|
14
18
|
remove(value) {
|
|
15
19
|
const { items, state } = this;
|
|
16
20
|
const { components, managers } = state;
|
|
17
|
-
const
|
|
18
|
-
const { length } =
|
|
21
|
+
const keys = (Array.isArray(value) ? value : [value]).filter((item) => typeof item === "string");
|
|
22
|
+
const { length } = keys;
|
|
19
23
|
if (length === 0) return;
|
|
20
|
-
for (let
|
|
21
|
-
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]);
|
|
22
26
|
if (itemIndex > -1) {
|
|
23
27
|
items[itemIndex].destroy();
|
|
24
28
|
items.splice(itemIndex, 1);
|
|
@@ -26,7 +30,7 @@ var ColumnManager = class {
|
|
|
26
30
|
}
|
|
27
31
|
components.header.update(items);
|
|
28
32
|
components.footer.update(items);
|
|
29
|
-
managers.render.removeCells(
|
|
33
|
+
managers.render.removeCells(keys);
|
|
30
34
|
}
|
|
31
35
|
set(columns) {
|
|
32
36
|
const { items, state } = this;
|
|
@@ -36,4 +40,5 @@ var ColumnManager = class {
|
|
|
36
40
|
footer.update(items);
|
|
37
41
|
}
|
|
38
42
|
};
|
|
43
|
+
//#endregion
|
|
39
44
|
export { ColumnManager };
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
|
27
|
+
export { DataManager };
|