@oscarpalmer/tabela 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/body.component-_VDOpJhV.d.mts +10 -0
- package/dist/body.model-2iwsovAV.d.mts +7 -0
- package/dist/column.component-Bx46r3JI.d.mts +16 -0
- package/dist/column.model-D-aw4EU4.d.mts +16 -0
- package/dist/components/body.component.d.mts +2 -0
- package/dist/components/{body.component.js → body.component.mjs} +6 -3
- package/dist/components/column.component.d.mts +2 -0
- package/dist/components/{column.component.js → column.component.mjs} +8 -5
- package/dist/components/footer.component.d.mts +2 -0
- package/dist/components/{footer.component.js → footer.component.mjs} +7 -4
- package/dist/components/group.component.d.mts +2 -0
- package/dist/components/group.component.mjs +51 -0
- package/dist/components/header.component.d.mts +2 -0
- package/dist/components/{header.component.js → header.component.mjs} +6 -3
- package/dist/components/row.component.d.mts +2 -0
- package/dist/components/{row.component.js → row.component.mjs} +11 -7
- package/dist/filter.model-7ukJrtil.d.mts +16 -0
- package/dist/footer.component-Curiab8j.d.mts +12 -0
- package/dist/footer.model-DhqoS6ds.d.mts +8 -0
- package/dist/group.component-Cq1YYbfJ.d.mts +285 -0
- package/dist/group.model-BsKFwHbt.d.mts +10 -0
- package/dist/header.component-BjjlpZIg.d.mts +12 -0
- package/dist/header.model-DN_KzUCV.d.mts +7 -0
- package/dist/helpers/dom.helpers.d.mts +12 -0
- package/dist/helpers/{dom.helpers.js → dom.helpers.mjs} +13 -9
- package/dist/helpers/misc.helpers.d.mts +6 -0
- package/dist/helpers/{misc.helpers.js → misc.helpers.mjs} +3 -1
- package/dist/helpers/style.helper.d.mts +6 -0
- package/dist/helpers/style.helper.mjs +8 -0
- package/dist/index.d.mts +7 -0
- package/dist/{index.js → index.mjs} +3 -1
- package/dist/managers/column.manager.d.mts +2 -0
- package/dist/managers/{column.manager.js → column.manager.mjs} +6 -1
- package/dist/managers/data.manager.d.mts +2 -0
- package/dist/managers/data.manager.mjs +222 -0
- package/dist/managers/event.manager.d.mts +2 -0
- package/dist/managers/{event.manager.js → event.manager.mjs} +9 -8
- package/dist/managers/filter.manager.d.mts +2 -0
- package/dist/managers/{filter.manager.js → filter.manager.mjs} +23 -14
- package/dist/managers/group.manager.d.mts +2 -0
- package/dist/managers/group.manager.mjs +73 -0
- package/dist/managers/navigation.manager.d.mts +2 -0
- package/dist/managers/{navigation.manager.js → navigation.manager.mjs} +27 -24
- package/dist/managers/render.manager.d.mts +2 -0
- package/dist/managers/{render.manager.js → render.manager.mjs} +35 -26
- package/dist/managers/row.manager.d.mts +2 -0
- package/dist/managers/{row.manager.js → row.manager.mjs} +18 -11
- package/dist/managers/selection.manager.d.mts +2 -0
- package/dist/managers/{selection.manager.js → selection.manager.mjs} +32 -28
- package/dist/managers/sort.manager.d.mts +2 -0
- package/dist/managers/{sort.manager.js → sort.manager.mjs} +12 -9
- package/dist/managers/style.manager.d.mts +2 -0
- package/dist/managers/style.manager.mjs +149 -0
- package/dist/models/body.model.d.mts +2 -0
- package/dist/models/body.model.mjs +1 -0
- package/dist/models/column.model.d.mts +2 -0
- package/dist/models/column.model.mjs +1 -0
- package/dist/models/data.model.d.mts +2 -0
- package/dist/models/data.model.mjs +1 -0
- package/dist/models/filter.model.d.mts +2 -0
- package/dist/models/filter.model.mjs +1 -0
- package/dist/models/footer.model.d.mts +2 -0
- package/dist/models/footer.model.mjs +1 -0
- package/dist/models/group.model.d.mts +2 -0
- package/dist/models/group.model.mjs +1 -0
- package/dist/models/header.model.d.mts +2 -0
- package/dist/models/header.model.mjs +1 -0
- package/dist/models/render.model.d.mts +2 -0
- package/dist/models/render.model.mjs +1 -0
- package/dist/models/selection.model.d.mts +2 -0
- package/dist/models/selection.model.mjs +1 -0
- package/dist/models/sort.model.d.mts +2 -0
- package/dist/models/sort.model.mjs +1 -0
- package/dist/models/style.model.d.mts +23 -0
- package/dist/models/style.model.mjs +23 -0
- package/dist/models/tabela.model.d.mts +2 -0
- package/dist/models/tabela.model.mjs +1 -0
- package/dist/models/tabela.options.d.mts +2 -0
- package/dist/models/tabela.options.mjs +1 -0
- package/dist/selection.model-rwQe9fco.d.mts +12 -0
- package/dist/sort.model-CauImaLu.d.mts +15 -0
- package/dist/tabela.d.mts +21 -0
- package/dist/{tabela.full.js → tabela.full.mjs} +1073 -756
- package/dist/tabela.mjs +126 -0
- package/dist/tabela.options-RkZvfptB.d.mts +14 -0
- package/package.json +45 -37
- package/src/components/body.component.ts +4 -3
- package/src/components/column.component.ts +13 -18
- package/src/components/footer.component.ts +8 -3
- package/src/components/group.component.ts +48 -6
- package/src/components/header.component.ts +3 -2
- package/src/components/row.component.ts +8 -6
- package/src/helpers/dom.helpers.ts +21 -19
- package/src/helpers/style.helper.ts +1 -1
- package/src/managers/column.manager.ts +4 -0
- package/src/managers/data.manager.ts +170 -100
- package/src/managers/event.manager.ts +9 -10
- package/src/managers/filter.manager.ts +23 -12
- package/src/managers/group.manager.ts +63 -11
- package/src/managers/navigation.manager.ts +23 -22
- package/src/managers/render.manager.ts +43 -29
- package/src/managers/row.manager.ts +21 -9
- package/src/managers/selection.manager.ts +28 -21
- package/src/managers/sort.manager.ts +22 -20
- package/src/managers/style.manager.ts +156 -0
- package/src/models/data.model.ts +11 -8
- package/src/models/group.model.ts +6 -2
- package/src/models/style.model.ts +39 -0
- package/src/models/tabela.model.ts +10 -8
- package/src/tabela.ts +65 -33
- package/dist/components/group.component.js +0 -28
- package/dist/helpers/style.helper.js +0 -6
- package/dist/managers/data.manager.js +0 -181
- package/dist/managers/group.manager.js +0 -46
- package/dist/models/body.model.js +0 -0
- package/dist/models/column.model.js +0 -0
- package/dist/models/data.model.js +0 -0
- package/dist/models/filter.model.js +0 -0
- package/dist/models/footer.model.js +0 -0
- package/dist/models/group.model.js +0 -0
- package/dist/models/header.model.js +0 -0
- package/dist/models/render.model.js +0 -0
- package/dist/models/selection.model.js +0 -0
- package/dist/models/sort.model.js +0 -0
- package/dist/models/tabela.model.js +0 -0
- package/dist/models/tabela.options.js +0 -0
- package/dist/tabela.js +0 -105
- package/types/components/body.component.d.ts +0 -6
- package/types/components/column.component.d.ts +0 -13
- package/types/components/footer.component.d.ts +0 -8
- package/types/components/group.component.d.ts +0 -14
- package/types/components/header.component.d.ts +0 -8
- package/types/components/row.component.d.ts +0 -11
- package/types/helpers/dom.helpers.d.ts +0 -10
- package/types/helpers/misc.helpers.d.ts +0 -2
- package/types/helpers/style.helper.d.ts +0 -1
- package/types/index.d.ts +0 -4
- package/types/managers/column.manager.d.ts +0 -12
- package/types/managers/data.manager.d.ts +0 -29
- package/types/managers/event.manager.d.ts +0 -7
- package/types/managers/filter.manager.d.ts +0 -19
- package/types/managers/group.manager.d.ts +0 -17
- package/types/managers/navigation.manager.d.ts +0 -10
- package/types/managers/render.manager.d.ts +0 -17
- package/types/managers/row.manager.d.ts +0 -13
- package/types/managers/selection.manager.d.ts +0 -24
- package/types/managers/sort.manager.d.ts +0 -28
- package/types/models/body.model.d.ts +0 -4
- package/types/models/column.model.d.ts +0 -13
- package/types/models/data.model.d.ts +0 -24
- package/types/models/filter.model.d.ts +0 -13
- package/types/models/footer.model.d.ts +0 -5
- package/types/models/group.model.d.ts +0 -4
- package/types/models/header.model.d.ts +0 -4
- package/types/models/render.model.d.ts +0 -13
- package/types/models/selection.model.d.ts +0 -8
- package/types/models/sort.model.d.ts +0 -12
- package/types/models/tabela.model.d.ts +0 -39
- package/types/models/tabela.options.d.ts +0 -10
- package/types/tabela.d.ts +0 -15
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {sort
|
|
1
|
+
import {sort} from '@oscarpalmer/atoms/array';
|
|
2
2
|
import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
|
|
3
3
|
import {compare} from '@oscarpalmer/atoms/value/compare';
|
|
4
|
+
import {getValue} from '@oscarpalmer/atoms/value/handle';
|
|
4
5
|
import {setAttribute, setAttributes} from '@oscarpalmer/toretto/attribute';
|
|
5
6
|
import {GroupComponent} from '../components/group.component';
|
|
7
|
+
import type {DataItem} from '../models/data.model';
|
|
6
8
|
import type {TabelaSort, TabelaSortDirection, TabelaSortItem} from '../models/sort.model';
|
|
7
9
|
import type {State} from '../models/tabela.model';
|
|
8
10
|
|
|
@@ -15,7 +17,7 @@ export class SortManager {
|
|
|
15
17
|
set: items => this.set(items),
|
|
16
18
|
} satisfies TabelaSort);
|
|
17
19
|
|
|
18
|
-
items:
|
|
20
|
+
items: PlainObject[] = [];
|
|
19
21
|
|
|
20
22
|
constructor(public state: State) {}
|
|
21
23
|
|
|
@@ -120,8 +122,8 @@ export class SortManager {
|
|
|
120
122
|
);
|
|
121
123
|
}
|
|
122
124
|
|
|
123
|
-
state.managers.data.
|
|
124
|
-
items.length === 0 ? undefined :
|
|
125
|
+
state.managers.data.state.items.active =
|
|
126
|
+
items.length === 0 ? undefined : getSortedItems(state, items);
|
|
125
127
|
|
|
126
128
|
state.managers.render.update(true, true);
|
|
127
129
|
}
|
|
@@ -143,43 +145,40 @@ export class SortManager {
|
|
|
143
145
|
}
|
|
144
146
|
}
|
|
145
147
|
|
|
146
|
-
function
|
|
147
|
-
state: State,
|
|
148
|
-
sorters: ArrayKeySorter<PlainObject>[],
|
|
149
|
-
): Array<GroupComponent | Key> {
|
|
148
|
+
function getSortedItems(state: State, sorters: PlainObject[]): DataItem[] {
|
|
150
149
|
const data =
|
|
151
|
-
state.managers.data.
|
|
152
|
-
key instanceof GroupComponent ? key : state.managers.data.values.
|
|
153
|
-
) ?? state.managers.data.values.
|
|
150
|
+
state.managers.data.state.items.active?.map(key =>
|
|
151
|
+
key instanceof GroupComponent ? key : state.managers.data.state.values.mapped.get(key)!,
|
|
152
|
+
) ?? state.managers.data.state.values.array.slice();
|
|
154
153
|
|
|
155
154
|
if (!state.managers.group.enabled) {
|
|
156
|
-
return sort(data as PlainObject[], sorters).map(
|
|
157
|
-
item => (item
|
|
155
|
+
return sort(data as PlainObject[], sorters as never).map(
|
|
156
|
+
item => getValue(item, state.key) as Key,
|
|
158
157
|
);
|
|
159
158
|
}
|
|
160
159
|
|
|
161
160
|
return sortWithGroups(state, data, sorters).map(item =>
|
|
162
|
-
item instanceof GroupComponent ? item : (item
|
|
161
|
+
item instanceof GroupComponent ? item : (getValue(item, state.key) as Key),
|
|
163
162
|
);
|
|
164
163
|
}
|
|
165
164
|
|
|
166
165
|
export function sortWithGroups(
|
|
167
166
|
state: State,
|
|
168
167
|
data: Array<GroupComponent | PlainObject>,
|
|
169
|
-
sorters:
|
|
168
|
+
sorters: PlainObject[],
|
|
170
169
|
): Array<GroupComponent | PlainObject> {
|
|
171
170
|
const {length} = sorters;
|
|
172
171
|
|
|
173
172
|
return data.sort((first, second) => {
|
|
174
173
|
const firstValue =
|
|
175
174
|
first instanceof GroupComponent
|
|
176
|
-
? first.value
|
|
177
|
-
: (first
|
|
175
|
+
? first.value.stringified
|
|
176
|
+
: getValue(first, state.managers.group.field);
|
|
178
177
|
|
|
179
178
|
const secondValue =
|
|
180
179
|
second instanceof GroupComponent
|
|
181
|
-
? second.value
|
|
182
|
-
: (second
|
|
180
|
+
? second.value.stringified
|
|
181
|
+
: getValue(second, state.managers.group.field);
|
|
183
182
|
|
|
184
183
|
const firstOrder = state.managers.group.order[firstValue as never];
|
|
185
184
|
const secondOrder = state.managers.group.order[secondValue as never];
|
|
@@ -200,7 +199,10 @@ export function sortWithGroups(
|
|
|
200
199
|
for (let index = 0; index < length; index += 1) {
|
|
201
200
|
const sorter = sorters[index];
|
|
202
201
|
|
|
203
|
-
const comparison = compare(
|
|
202
|
+
const comparison = compare(
|
|
203
|
+
getValue(first, (sorter as any).key),
|
|
204
|
+
getValue(second, (sorter as any).key),
|
|
205
|
+
);
|
|
204
206
|
|
|
205
207
|
if (comparison !== 0) {
|
|
206
208
|
return comparison * (sorter.direction === 'ascending' ? 1 : -1);
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type {State} from '../models/tabela.model';
|
|
2
|
+
|
|
3
|
+
export class StyleManager {
|
|
4
|
+
constructor(readonly state: State) {
|
|
5
|
+
if (appended) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
appended = true;
|
|
10
|
+
|
|
11
|
+
const style = document.createElement('style');
|
|
12
|
+
|
|
13
|
+
style.textContent = styling;
|
|
14
|
+
|
|
15
|
+
document.head.appendChild(style);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const styling = //css
|
|
20
|
+
`/** Table */
|
|
21
|
+
|
|
22
|
+
:where(.tabela) {
|
|
23
|
+
flex: 1;
|
|
24
|
+
position: relative;
|
|
25
|
+
background-color: var(--oui-absolute);
|
|
26
|
+
border: 1px solid grey;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
:where(.tabela__table) {
|
|
30
|
+
min-height: 24em;
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-flow: column nowrap;
|
|
33
|
+
flex: 1;
|
|
34
|
+
overflow: auto;
|
|
35
|
+
position: absolute;
|
|
36
|
+
inset: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Row group */
|
|
40
|
+
|
|
41
|
+
:where(.tabela__rowgroup--header),
|
|
42
|
+
:where(.tabela__rowgroup--footer) {
|
|
43
|
+
background-color: white;
|
|
44
|
+
position: sticky;
|
|
45
|
+
left: 0;
|
|
46
|
+
z-index: 10;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:where(.tabela__rowgroup--header) {
|
|
50
|
+
top: 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
:where(.tabela__rowgroup--footer) {
|
|
54
|
+
bottom: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
:where(.tabela__rowgroup--body) {
|
|
58
|
+
display: flex;
|
|
59
|
+
flex-flow: column nowrap;
|
|
60
|
+
flex: 1;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
:where(.tabela__rowgroup--body:focus) {
|
|
64
|
+
outline: none;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
:where(.tabela:has(.tabela__rowgroup--body:focus-visible)) {
|
|
68
|
+
outline: 2px solid var(--oui-blue-6);
|
|
69
|
+
outline-offset: 2px;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Row */
|
|
73
|
+
|
|
74
|
+
:where(.tabela__row) {
|
|
75
|
+
width: 100%;
|
|
76
|
+
display: flex;
|
|
77
|
+
flex-flow: row nowrap;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
:where(.tabela__row:last-child .tabela__cell) {
|
|
81
|
+
border-bottom-width: 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
:where(.tabela__row--body),
|
|
85
|
+
:where(.tabela__row--group) {
|
|
86
|
+
flex: 1;
|
|
87
|
+
position: absolute;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:where(.tabela__row--selected) {
|
|
91
|
+
background-color: var(--oui-blue-1);
|
|
92
|
+
color: var(--oui-blue-9);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:where(.tabela:has(.tabela__rowgroup--body:focus-visible) .tabela__row[data-active="true"]) {
|
|
96
|
+
outline: 2px solid var(--oui-blue-6);
|
|
97
|
+
outline-offset: 2px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Cells */
|
|
101
|
+
|
|
102
|
+
:where(.tabela__cell),
|
|
103
|
+
:where(.tabela__heading) {
|
|
104
|
+
padding: 0.5em;
|
|
105
|
+
border-color: gray;
|
|
106
|
+
border-style: solid;
|
|
107
|
+
border-width: 0 1px 1px 0;
|
|
108
|
+
line-height: 1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
:where(.tabela__row .tabela__cell:last-child),
|
|
112
|
+
:where(.tabela__row .tabela__heading:last-child) {
|
|
113
|
+
flex: 1;
|
|
114
|
+
border-right-width: 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
:where(.tabela__cell) {
|
|
118
|
+
overflow: hidden;
|
|
119
|
+
text-overflow: ellipsis;
|
|
120
|
+
white-space: nowrap;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
:where(.tabela__cell--footer) {
|
|
124
|
+
border-top-width: 1px;
|
|
125
|
+
border-bottom-width: 0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
:where(.tabela__cell--group) {
|
|
129
|
+
padding: 0;
|
|
130
|
+
display: flex;
|
|
131
|
+
flex-flow: row nowrap;
|
|
132
|
+
align-items: center;
|
|
133
|
+
gap: 0.5em;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
:where(.tabela__cell--group .tabela__button) {
|
|
137
|
+
margin: 0 0 0 .25rem;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Misc. */
|
|
141
|
+
|
|
142
|
+
:where(.tabela__button) {
|
|
143
|
+
font-size: .75rem;
|
|
144
|
+
font-weight: bold;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
:where(.tabela__selection) {
|
|
148
|
+
background-color: color-mix(in oklch, var(--oui-blue-6), transparent);
|
|
149
|
+
border: 1px solid var(--oui-blue-6);
|
|
150
|
+
border-radius: .25rem;
|
|
151
|
+
position: fixed;
|
|
152
|
+
z-index: 1000;
|
|
153
|
+
}
|
|
154
|
+
`.replace(/^\s+|\s+|\s+$/g, ' ');
|
|
155
|
+
|
|
156
|
+
let appended = false;
|
package/src/models/data.model.ts
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
|
|
2
2
|
import type {GroupComponent} from '../components/group.component';
|
|
3
|
+
import type {State} from './tabela.model';
|
|
3
4
|
|
|
4
|
-
export type
|
|
5
|
-
keys: DataValuesKeys;
|
|
6
|
-
objects: DataValuesObjects;
|
|
7
|
-
};
|
|
5
|
+
export type DataItem = GroupComponent | Key;
|
|
8
6
|
|
|
9
|
-
type
|
|
10
|
-
active?: Array<
|
|
11
|
-
original: Array<
|
|
7
|
+
type DataItems = {
|
|
8
|
+
active?: Array<DataItem>;
|
|
9
|
+
original: Array<DataItem>;
|
|
12
10
|
};
|
|
13
11
|
|
|
14
|
-
type
|
|
12
|
+
export type DataState = {
|
|
13
|
+
items: DataItems;
|
|
14
|
+
values: DataValues;
|
|
15
|
+
} & State;
|
|
16
|
+
|
|
17
|
+
type DataValues = {
|
|
15
18
|
array: Array<GroupComponent | PlainObject>;
|
|
16
19
|
mapped: Map<Key, PlainObject>;
|
|
17
20
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const CSS_TABELA = 'tabela';
|
|
2
|
+
|
|
3
|
+
export const CSS_TABELA_CELL = 'tabela__cell';
|
|
4
|
+
|
|
5
|
+
export const CSS_TABELA_CELL_BODY = 'tabela__cell--body';
|
|
6
|
+
|
|
7
|
+
export const CSS_TABELA_CELL_FOOTER = 'tabela__cell--footer';
|
|
8
|
+
|
|
9
|
+
export const CSS_TABELA_FAKER = 'tabela__faker';
|
|
10
|
+
|
|
11
|
+
export const CSS_TABELA_HEADING = 'tabela__heading';
|
|
12
|
+
|
|
13
|
+
export const CSS_TABELA_HEADING_CONTENT = 'tabela__heading__content';
|
|
14
|
+
|
|
15
|
+
export const CSS_TABELA_HEADING_SORTER = 'tabela__heading__sorter';
|
|
16
|
+
|
|
17
|
+
export const CSS_TABELA_ROW = 'tabela__row';
|
|
18
|
+
|
|
19
|
+
export const CSS_TABELA_ROW_BODY = 'tabela__row--body';
|
|
20
|
+
|
|
21
|
+
export const CSS_TABELA_ROW_FOOTER = 'tabela__row--footer';
|
|
22
|
+
|
|
23
|
+
export const CSS_TABELA_ROW_GROUP = 'tabela__row--group tabela__group';
|
|
24
|
+
|
|
25
|
+
export const CSS_TABELA_ROW_HEADER = 'tabela__row--header';
|
|
26
|
+
|
|
27
|
+
export const CSS_TABELA_ROW_SELECTED = 'tabela__row--selected';
|
|
28
|
+
|
|
29
|
+
export const CSS_TABELA_ROWGROUP = 'tabela__rowgroup';
|
|
30
|
+
|
|
31
|
+
export const CSS_TABELA_ROWGROUP_BODY = 'tabela__rowgroup--body';
|
|
32
|
+
|
|
33
|
+
export const CSS_TABELA_ROWGROUP_FOOTER = 'tabela__rowgroup--footer';
|
|
34
|
+
|
|
35
|
+
export const CSS_TABELA_ROWGROUP_HEADER = 'tabela__rowgroup--header';
|
|
36
|
+
|
|
37
|
+
export const CSS_TABELA_SELECTION = 'tabela__selection';
|
|
38
|
+
|
|
39
|
+
export const CSS_TABELA_TABLE = 'tabela__table';
|
|
@@ -5,12 +5,13 @@ import type {ColumnManager} from '../managers/column.manager';
|
|
|
5
5
|
import type {DataManager} from '../managers/data.manager';
|
|
6
6
|
import type {EventManager} from '../managers/event.manager';
|
|
7
7
|
import type {FilterManager} from '../managers/filter.manager';
|
|
8
|
-
import type {
|
|
8
|
+
import type {GroupManager} from '../managers/group.manager';
|
|
9
9
|
import type {NavigationManager} from '../managers/navigation.manager';
|
|
10
10
|
import type {RenderManager} from '../managers/render.manager';
|
|
11
11
|
import type {RowManager} from '../managers/row.manager';
|
|
12
12
|
import type {SelectionManager} from '../managers/selection.manager';
|
|
13
13
|
import type {SortManager} from '../managers/sort.manager';
|
|
14
|
+
import type {StyleManager} from '../managers/style.manager';
|
|
14
15
|
import type {TabelaOptions} from './tabela.options';
|
|
15
16
|
|
|
16
17
|
export type Components = {
|
|
@@ -26,17 +27,18 @@ export type Managers = {
|
|
|
26
27
|
filter: FilterManager;
|
|
27
28
|
group: GroupManager;
|
|
28
29
|
navigation: NavigationManager;
|
|
30
|
+
render: RenderManager;
|
|
29
31
|
row: RowManager;
|
|
30
32
|
selection: SelectionManager;
|
|
31
33
|
sort: SortManager;
|
|
32
|
-
|
|
34
|
+
style: StyleManager;
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
export type State = {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
components: Components;
|
|
39
|
+
element: HTMLElement;
|
|
40
|
+
id: number;
|
|
41
|
+
key: string;
|
|
42
|
+
managers: Managers;
|
|
43
|
+
options: TabelaOptions;
|
|
42
44
|
};
|
package/src/tabela.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {BodyComponent} from './components/body.component';
|
|
2
2
|
import {FooterComponent} from './components/footer.component';
|
|
3
3
|
import {HeaderComponent} from './components/header.component';
|
|
4
|
+
import {createElement} from './helpers/dom.helpers';
|
|
4
5
|
import {ColumnManager} from './managers/column.manager';
|
|
5
6
|
import {DataManager} from './managers/data.manager';
|
|
6
7
|
import {EventManager} from './managers/event.manager';
|
|
@@ -11,27 +12,28 @@ import {RenderManager} from './managers/render.manager';
|
|
|
11
12
|
import {RowManager} from './managers/row.manager';
|
|
12
13
|
import {SelectionManager} from './managers/selection.manager';
|
|
13
14
|
import {SortManager} from './managers/sort.manager';
|
|
15
|
+
import {StyleManager} from './managers/style.manager';
|
|
14
16
|
import type {TabelaData} from './models/data.model';
|
|
15
17
|
import type {TabelaFilter} from './models/filter.model';
|
|
18
|
+
import type {TabelaGroup} from './models/group.model';
|
|
16
19
|
import type {TabelaSelection} from './models/selection.model';
|
|
17
20
|
import type {TabelaSort} from './models/sort.model';
|
|
21
|
+
import {CSS_TABELA, CSS_TABELA_TABLE} from './models/style.model';
|
|
18
22
|
import type {Components, Managers, State} from './models/tabela.model';
|
|
19
23
|
import type {TabelaOptions} from './models/tabela.options';
|
|
20
24
|
|
|
21
25
|
export class Tabela {
|
|
22
|
-
|
|
23
|
-
header: undefined as never,
|
|
24
|
-
body: undefined as never,
|
|
25
|
-
footer: undefined as never,
|
|
26
|
-
};
|
|
26
|
+
#components: Components;
|
|
27
27
|
|
|
28
28
|
#element: HTMLElement;
|
|
29
29
|
|
|
30
30
|
#id = getId();
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
#table: HTMLElement;
|
|
33
|
+
|
|
34
|
+
#key: string;
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
#managers: Managers = {
|
|
35
37
|
column: undefined as never,
|
|
36
38
|
data: undefined as never,
|
|
37
39
|
event: undefined as never,
|
|
@@ -42,12 +44,17 @@ export class Tabela {
|
|
|
42
44
|
row: undefined as never,
|
|
43
45
|
selection: undefined as never,
|
|
44
46
|
sort: undefined as never,
|
|
47
|
+
style: undefined as never,
|
|
45
48
|
};
|
|
46
49
|
|
|
50
|
+
#state: State;
|
|
51
|
+
|
|
47
52
|
readonly data: TabelaData;
|
|
48
53
|
|
|
49
54
|
readonly filter: TabelaFilter;
|
|
50
55
|
|
|
56
|
+
readonly group: TabelaGroup;
|
|
57
|
+
|
|
51
58
|
readonly selection: TabelaSelection;
|
|
52
59
|
|
|
53
60
|
readonly sort: TabelaSort;
|
|
@@ -60,48 +67,62 @@ export class Tabela {
|
|
|
60
67
|
this.#element = element;
|
|
61
68
|
|
|
62
69
|
element.innerHTML = '';
|
|
63
|
-
element.role = 'table';
|
|
64
|
-
|
|
65
|
-
element.classList.add('tabela');
|
|
66
70
|
|
|
67
|
-
element.
|
|
71
|
+
element.classList.add(CSS_TABELA);
|
|
72
|
+
|
|
73
|
+
this.#table = createElement(
|
|
74
|
+
'div',
|
|
75
|
+
{
|
|
76
|
+
className: CSS_TABELA_TABLE,
|
|
77
|
+
role: 'table',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
'aria-label': options.label,
|
|
81
|
+
},
|
|
82
|
+
);
|
|
68
83
|
|
|
69
84
|
this.#key = options.key;
|
|
70
85
|
|
|
71
|
-
this.#components
|
|
72
|
-
|
|
73
|
-
|
|
86
|
+
this.#components = {
|
|
87
|
+
body: new BodyComponent(),
|
|
88
|
+
footer: new FooterComponent(),
|
|
89
|
+
header: new HeaderComponent(),
|
|
90
|
+
};
|
|
74
91
|
|
|
75
|
-
|
|
76
|
-
element,
|
|
92
|
+
this.#state = {
|
|
77
93
|
options,
|
|
78
94
|
components: this.#components,
|
|
95
|
+
element: this.#table,
|
|
79
96
|
id: this.#id,
|
|
80
97
|
key: this.#key,
|
|
81
98
|
managers: this.#managers,
|
|
82
99
|
};
|
|
83
100
|
|
|
84
|
-
this.#managers.column = new ColumnManager(state);
|
|
85
|
-
this.#managers.data = new DataManager(state);
|
|
86
|
-
this.#managers.event = new EventManager(state);
|
|
87
|
-
this.#managers.filter = new FilterManager(state);
|
|
88
|
-
this.#managers.group = new GroupManager(state);
|
|
89
|
-
this.#managers.navigation = new NavigationManager(state);
|
|
90
|
-
this.#managers.render = new RenderManager(state);
|
|
91
|
-
this.#managers.row = new RowManager(state);
|
|
92
|
-
this.#managers.selection = new SelectionManager(state);
|
|
93
|
-
this.#managers.sort = new SortManager(state);
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
this.#managers.column = new ColumnManager(this.#state);
|
|
102
|
+
this.#managers.data = new DataManager(this.#state);
|
|
103
|
+
this.#managers.event = new EventManager(this.#state);
|
|
104
|
+
this.#managers.filter = new FilterManager(this.#state);
|
|
105
|
+
this.#managers.group = new GroupManager(this.#state);
|
|
106
|
+
this.#managers.navigation = new NavigationManager(this.#state);
|
|
107
|
+
this.#managers.render = new RenderManager(this.#state);
|
|
108
|
+
this.#managers.row = new RowManager(this.#state);
|
|
109
|
+
this.#managers.selection = new SelectionManager(this.#state);
|
|
110
|
+
this.#managers.sort = new SortManager(this.#state);
|
|
111
|
+
this.#managers.style = new StyleManager(this.#state);
|
|
112
|
+
|
|
113
|
+
this.#table.append(
|
|
96
114
|
this.#components.header.elements.group,
|
|
97
115
|
this.#components.body.elements.group,
|
|
98
116
|
this.#components.footer.elements.group,
|
|
99
117
|
);
|
|
100
118
|
|
|
119
|
+
element.append(this.#table);
|
|
120
|
+
|
|
101
121
|
this.#managers.data.set(options.data);
|
|
102
122
|
|
|
103
123
|
this.data = this.#managers.data.handlers;
|
|
104
124
|
this.filter = this.#managers.filter.handlers;
|
|
125
|
+
this.group = this.#managers.group.handlers;
|
|
105
126
|
this.selection = this.#managers.selection.handlers;
|
|
106
127
|
this.sort = this.#managers.sort.handlers;
|
|
107
128
|
}
|
|
@@ -110,6 +131,7 @@ export class Tabela {
|
|
|
110
131
|
const components = this.#components;
|
|
111
132
|
const managers = this.#managers;
|
|
112
133
|
const element = this.#element;
|
|
134
|
+
const table = this.#table;
|
|
113
135
|
|
|
114
136
|
components.body.destroy();
|
|
115
137
|
components.footer.destroy();
|
|
@@ -119,20 +141,30 @@ export class Tabela {
|
|
|
119
141
|
managers.data.destroy();
|
|
120
142
|
managers.event.destroy();
|
|
121
143
|
managers.filter.destroy();
|
|
122
|
-
|
|
144
|
+
managers.group.destroy();
|
|
145
|
+
managers.navigation.destroy();
|
|
123
146
|
managers.render.destroy();
|
|
124
147
|
managers.row.destroy();
|
|
125
148
|
managers.selection.destroy();
|
|
126
149
|
managers.sort.destroy();
|
|
127
150
|
|
|
128
151
|
element.innerHTML = '';
|
|
129
|
-
element.role = '';
|
|
130
152
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
153
|
+
table.innerHTML = '';
|
|
154
|
+
table.role = '';
|
|
155
|
+
|
|
156
|
+
element.classList.remove(CSS_TABELA);
|
|
157
|
+
|
|
158
|
+
table.removeAttribute('aria-label');
|
|
159
|
+
table.removeAttribute('role');
|
|
160
|
+
|
|
161
|
+
this.#state.components = undefined as never;
|
|
162
|
+
this.#state.managers = undefined as never;
|
|
163
|
+
this.#state.element = undefined as never;
|
|
164
|
+
this.#state.options = undefined as never;
|
|
134
165
|
|
|
135
166
|
this.#element = undefined as never;
|
|
167
|
+
this.#table = undefined as never;
|
|
136
168
|
}
|
|
137
169
|
}
|
|
138
170
|
|
|
@@ -1,28 +0,0 @@
|
|
|
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 };
|