@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
package/dist/tabela.mjs
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { ARIA_LABEL, ATTRIBUTE_ROLE, ROLE_TABLE } from "./models/dom.model.mjs";
|
|
2
|
+
import { CSS_TABLE, CSS_WRAPPER } from "./models/style.model.mjs";
|
|
3
|
+
import { createElement } from "./helpers/dom.helpers.mjs";
|
|
4
|
+
import { BodyComponent } from "./components/body.component.mjs";
|
|
5
|
+
import { FooterComponent } from "./components/footer.component.mjs";
|
|
6
|
+
import { HeaderComponent } from "./components/header.component.mjs";
|
|
7
|
+
import { ColumnManager } from "./managers/column.manager.mjs";
|
|
8
|
+
import { SortManager } from "./managers/sort.manager.mjs";
|
|
9
|
+
import { DataManager } from "./managers/data.manager.mjs";
|
|
10
|
+
import { EventManager } from "./managers/event.manager.mjs";
|
|
11
|
+
import { FilterManager } from "./managers/filter.manager.mjs";
|
|
12
|
+
import { GroupManager } from "./managers/group.manager.mjs";
|
|
13
|
+
import { NavigationManager } from "./managers/navigation.manager.mjs";
|
|
14
|
+
import { RenderManager } from "./managers/render.manager.mjs";
|
|
15
|
+
import { RowManager } from "./managers/row.manager.mjs";
|
|
16
|
+
import { SelectionManager } from "./managers/selection.manager.mjs";
|
|
17
|
+
import { StyleManager } from "./managers/style.manager.mjs";
|
|
18
|
+
//#region src/tabela.ts
|
|
19
|
+
var Tabela = class {
|
|
20
|
+
#components;
|
|
21
|
+
#element;
|
|
22
|
+
#id = getId();
|
|
23
|
+
#key;
|
|
24
|
+
#managers = {
|
|
25
|
+
column: void 0,
|
|
26
|
+
data: void 0,
|
|
27
|
+
event: void 0,
|
|
28
|
+
filter: void 0,
|
|
29
|
+
group: void 0,
|
|
30
|
+
navigation: void 0,
|
|
31
|
+
render: void 0,
|
|
32
|
+
row: void 0,
|
|
33
|
+
selection: void 0,
|
|
34
|
+
sort: void 0,
|
|
35
|
+
style: void 0
|
|
36
|
+
};
|
|
37
|
+
#prefix = `tabela_${this.#id}_`;
|
|
38
|
+
#state;
|
|
39
|
+
#table;
|
|
40
|
+
data;
|
|
41
|
+
events;
|
|
42
|
+
filter;
|
|
43
|
+
group;
|
|
44
|
+
selection;
|
|
45
|
+
sort;
|
|
46
|
+
constructor(element, options) {
|
|
47
|
+
this.#element = element;
|
|
48
|
+
element.innerHTML = "";
|
|
49
|
+
element.classList.add(CSS_WRAPPER);
|
|
50
|
+
this.#table = createElement("div", {
|
|
51
|
+
className: CSS_TABLE,
|
|
52
|
+
role: ROLE_TABLE
|
|
53
|
+
}, { [ARIA_LABEL]: options.label });
|
|
54
|
+
this.#key = options.key;
|
|
55
|
+
this.#components = {};
|
|
56
|
+
this.#state = {
|
|
57
|
+
options,
|
|
58
|
+
components: this.#components,
|
|
59
|
+
element: this.#table,
|
|
60
|
+
id: this.#id,
|
|
61
|
+
key: this.#key,
|
|
62
|
+
managers: this.#managers,
|
|
63
|
+
prefix: this.#prefix
|
|
64
|
+
};
|
|
65
|
+
this.#components.body = new BodyComponent(this.#state);
|
|
66
|
+
this.#components.footer = new FooterComponent(this.#state);
|
|
67
|
+
this.#components.header = new HeaderComponent(this.#state);
|
|
68
|
+
this.#managers.column = new ColumnManager(this.#state);
|
|
69
|
+
this.#managers.data = new DataManager(this.#state);
|
|
70
|
+
this.#managers.event = new EventManager(this.#state);
|
|
71
|
+
this.#managers.filter = new FilterManager(this.#state);
|
|
72
|
+
this.#managers.group = new GroupManager(this.#state);
|
|
73
|
+
this.#managers.navigation = new NavigationManager(this.#state);
|
|
74
|
+
this.#managers.render = new RenderManager(this.#state);
|
|
75
|
+
this.#managers.row = new RowManager(this.#state);
|
|
76
|
+
this.#managers.selection = new SelectionManager(this.#state);
|
|
77
|
+
this.#managers.sort = new SortManager(this.#state);
|
|
78
|
+
this.#managers.style = new StyleManager(this.#state);
|
|
79
|
+
this.#table.append(this.#components.header.elements.group, this.#components.body.elements.group, this.#components.footer.elements.group);
|
|
80
|
+
element.append(this.#table);
|
|
81
|
+
this.#managers.data.set(options.data);
|
|
82
|
+
this.data = this.#managers.data.handlers;
|
|
83
|
+
this.events = this.#managers.event.handlers;
|
|
84
|
+
this.filter = this.#managers.filter.handlers;
|
|
85
|
+
this.group = this.#managers.group.handlers;
|
|
86
|
+
this.selection = this.#managers.selection.handlers;
|
|
87
|
+
this.sort = this.#managers.sort.handlers;
|
|
88
|
+
}
|
|
89
|
+
destroy() {
|
|
90
|
+
const components = this.#components;
|
|
91
|
+
const managers = this.#managers;
|
|
92
|
+
const element = this.#element;
|
|
93
|
+
const table = this.#table;
|
|
94
|
+
components.body.destroy();
|
|
95
|
+
components.footer.destroy();
|
|
96
|
+
components.header.destroy();
|
|
97
|
+
managers.column.destroy();
|
|
98
|
+
managers.data.destroy();
|
|
99
|
+
managers.event.destroy();
|
|
100
|
+
managers.filter.destroy();
|
|
101
|
+
managers.group.destroy();
|
|
102
|
+
managers.navigation.destroy();
|
|
103
|
+
managers.render.destroy();
|
|
104
|
+
managers.row.destroy();
|
|
105
|
+
managers.selection.destroy();
|
|
106
|
+
managers.sort.destroy();
|
|
107
|
+
element.innerHTML = "";
|
|
108
|
+
table.innerHTML = "";
|
|
109
|
+
element.classList.remove(CSS_WRAPPER);
|
|
110
|
+
table.removeAttribute(ARIA_LABEL);
|
|
111
|
+
table.removeAttribute(ATTRIBUTE_ROLE);
|
|
112
|
+
this.#state.components = void 0;
|
|
113
|
+
this.#state.managers = void 0;
|
|
114
|
+
this.#state.element = void 0;
|
|
115
|
+
this.#state.options = void 0;
|
|
116
|
+
this.#element = void 0;
|
|
117
|
+
this.#table = void 0;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
function getId() {
|
|
121
|
+
id += 1;
|
|
122
|
+
return id;
|
|
123
|
+
}
|
|
124
|
+
let id = 0;
|
|
125
|
+
//#endregion
|
|
126
|
+
export { Tabela };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oscarpalmer/tabela",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "A modern table.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,12 +37,10 @@
|
|
|
37
37
|
"www:js": "vpx tsdown -c ./www/.app/js/tsdown.config.ts --watch"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@oscarpalmer/atoms": "^0.
|
|
40
|
+
"@oscarpalmer/atoms": "^0.166",
|
|
41
41
|
"@oscarpalmer/toretto": "^0.41"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@oscarpalmer/abydon": "^0.19",
|
|
45
|
-
"@oscarpalmer/oui": "^0.19",
|
|
46
44
|
"@types/node": "^25.5",
|
|
47
45
|
"@vitest/coverage-istanbul": "^4.1",
|
|
48
46
|
"concurrently": "^9.2",
|
|
@@ -2,7 +2,7 @@ import {createElement} from '../helpers/dom.helpers';
|
|
|
2
2
|
import type {Column, TabelaColumn} from '../models/column.model';
|
|
3
3
|
import {
|
|
4
4
|
ATTRIBUTE_DATA_EVENT,
|
|
5
|
-
|
|
5
|
+
ATTRIBUTE_DATA_KEY,
|
|
6
6
|
ATTRIBUTE_ROLE,
|
|
7
7
|
ELEMENT_DIV,
|
|
8
8
|
ROLE_COLUMNHEADER,
|
|
@@ -24,7 +24,7 @@ export class ColumnComponent {
|
|
|
24
24
|
width,
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
this.elements = createHeading(this.options.
|
|
27
|
+
this.elements = createHeading(this.options.key, this.options.label, width);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
destroy(): void {
|
|
@@ -43,7 +43,7 @@ type ColumnElements = {
|
|
|
43
43
|
wrapper: HTMLDivElement;
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
-
function createHeading(
|
|
46
|
+
function createHeading(key: string, title: string, width: number): ColumnElements {
|
|
47
47
|
const wrapper = createElement(
|
|
48
48
|
ELEMENT_DIV,
|
|
49
49
|
{
|
|
@@ -52,7 +52,7 @@ function createHeading(field: string, title: string, width: number): ColumnEleme
|
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
[ATTRIBUTE_DATA_EVENT]: EVENT_HEADING,
|
|
55
|
-
[
|
|
55
|
+
[ATTRIBUTE_DATA_KEY]: key,
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
width: `${width}px`,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
ROLE_CELL,
|
|
21
21
|
ROLE_ROW,
|
|
22
22
|
} from '../models/dom.model';
|
|
23
|
-
import {EVENT_GROUP} from '../models/event.model';
|
|
23
|
+
import {EVENT_GROUP, EVENT_GROUP_UPDATE} from '../models/event.model';
|
|
24
24
|
|
|
25
25
|
export class GroupComponent {
|
|
26
26
|
element: HTMLElement | undefined;
|
|
@@ -85,7 +85,7 @@ export function renderGroup(state: State, component: GroupComponent): void {
|
|
|
85
85
|
);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
export function updateGroup(state: State, component: GroupComponent): void {
|
|
88
|
+
export function updateGroup(state: State, component: GroupComponent, emit: boolean): void {
|
|
89
89
|
if (component.element == null) {
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
@@ -100,6 +100,10 @@ export function updateGroup(state: State, component: GroupComponent): void {
|
|
|
100
100
|
if (total != null) {
|
|
101
101
|
total.textContent = String(component.total);
|
|
102
102
|
}
|
|
103
|
+
|
|
104
|
+
if (emit) {
|
|
105
|
+
state.managers.event.emit(EVENT_GROUP_UPDATE, [component]);
|
|
106
|
+
}
|
|
103
107
|
}
|
|
104
108
|
|
|
105
109
|
const selectedSelector = `.${CSS_GROUP_SELECTED}`;
|
|
@@ -66,15 +66,15 @@ export function renderRow(state: State, row: RowComponent): void {
|
|
|
66
66
|
|
|
67
67
|
for (let index = 0; index < length; index += 1) {
|
|
68
68
|
const {options} = columns[index];
|
|
69
|
-
const {
|
|
69
|
+
const {key, width} = options;
|
|
70
70
|
|
|
71
|
-
managers.render.pool.cells[
|
|
71
|
+
managers.render.pool.cells[key] ??= [];
|
|
72
72
|
|
|
73
|
-
const cell = managers.render.pool.cells[
|
|
73
|
+
const cell = managers.render.pool.cells[key].shift() ?? createCell(width);
|
|
74
74
|
|
|
75
|
-
cell.textContent = String(getValue(data,
|
|
75
|
+
cell.textContent = String(getValue(data, key));
|
|
76
76
|
|
|
77
|
-
row.cells[
|
|
77
|
+
row.cells[key] = cell;
|
|
78
78
|
|
|
79
79
|
element.append(cell);
|
|
80
80
|
}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type {Key} from '@oscarpalmer/atoms/models';
|
|
2
|
-
import {
|
|
2
|
+
import type {GroupComponent} from '../components/group.component';
|
|
3
|
+
import {EVENTS_NAMES, type EventName} from '../models/event.model';
|
|
4
|
+
import {GROUP_KEY_EXPRESSION, type TabelaGroup} from '../models/group.model';
|
|
5
|
+
|
|
6
|
+
export function getGroup(group: GroupComponent): TabelaGroup {
|
|
7
|
+
return {
|
|
8
|
+
value: group.value.original,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
3
11
|
|
|
4
12
|
export function getKey(value: unknown): Key | undefined {
|
|
5
13
|
if (typeof value === 'number') {
|
|
@@ -13,6 +21,10 @@ export function getKey(value: unknown): Key | undefined {
|
|
|
13
21
|
return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
|
|
14
22
|
}
|
|
15
23
|
|
|
24
|
+
export function isEvent(value: unknown): value is EventName {
|
|
25
|
+
return EVENTS_NAMES.has(value as EventName);
|
|
26
|
+
}
|
|
27
|
+
|
|
16
28
|
export function isGroupKey(key: unknown): boolean {
|
|
17
29
|
return typeof key === 'string' && GROUP_KEY_EXPRESSION.test(key);
|
|
18
30
|
}
|
|
@@ -20,31 +20,31 @@ export class ColumnManager {
|
|
|
20
20
|
this.state = undefined as never;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
get(
|
|
24
|
-
return this.items.find(item => item.options.
|
|
23
|
+
get(key: string): ColumnComponent | undefined {
|
|
24
|
+
return this.items.find(item => item.options.key === key);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
remove(
|
|
27
|
+
remove(key: string): void;
|
|
28
28
|
|
|
29
|
-
remove(
|
|
29
|
+
remove(keys: string[]): void;
|
|
30
30
|
|
|
31
31
|
remove(value: unknown): void {
|
|
32
32
|
const {items, state} = this;
|
|
33
33
|
const {components, managers} = state;
|
|
34
34
|
|
|
35
|
-
const
|
|
35
|
+
const keys = (Array.isArray(value) ? value : [value]).filter(
|
|
36
36
|
item => typeof item === 'string',
|
|
37
37
|
);
|
|
38
38
|
|
|
39
|
-
const {length} =
|
|
39
|
+
const {length} = keys;
|
|
40
40
|
|
|
41
41
|
if (length === 0) {
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
for (let
|
|
45
|
+
for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
|
|
46
46
|
const itemIndex = items.findIndex(
|
|
47
|
-
component => component.options.
|
|
47
|
+
component => component.options.key === keys[keyIndex],
|
|
48
48
|
);
|
|
49
49
|
|
|
50
50
|
if (itemIndex > -1) {
|
|
@@ -57,7 +57,7 @@ export class ColumnManager {
|
|
|
57
57
|
components.header.update(items);
|
|
58
58
|
components.footer.update(items);
|
|
59
59
|
|
|
60
|
-
managers.render.removeCells(
|
|
60
|
+
managers.render.removeCells(keys);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
set(columns: TabelaColumn[]): void {
|