@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,67 +1,86 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ARIA_SORT, ATTRIBUTE_DATA_SORT_DIRECTION, ATTRIBUTE_DATA_SORT_POSITION } from "../models/dom.model.mjs";
|
|
2
|
+
import { EVENT_DATA_SORTED, EVENT_SORT_ADD, EVENT_SORT_CLEAR, EVENT_SORT_FLIP, EVENT_SORT_REMOVE, EVENT_SORT_SET } from "../models/event.model.mjs";
|
|
3
|
+
import { isGroupKey } from "../helpers/misc.helpers.mjs";
|
|
4
|
+
import { SORT_ASCENDING, SORT_DESCENDING } from "../models/sort.model.mjs";
|
|
2
5
|
import { setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
|
|
3
6
|
import { sort } from "@oscarpalmer/atoms/array";
|
|
4
7
|
import { getValue } from "@oscarpalmer/atoms/value/handle";
|
|
5
8
|
import { compare } from "@oscarpalmer/atoms/value/compare";
|
|
6
9
|
//#region src/managers/sort.manager.ts
|
|
7
10
|
var SortManager = class {
|
|
8
|
-
handlers =
|
|
11
|
+
handlers = {
|
|
9
12
|
add: (field, direction) => this.add(field, direction),
|
|
10
13
|
flip: (field) => this.flip(field),
|
|
11
14
|
clear: () => this.clear(),
|
|
12
15
|
remove: (field) => this.remove(field),
|
|
13
|
-
set: (items) => this.set(items)
|
|
14
|
-
}
|
|
16
|
+
set: (items) => this.set(items, true)
|
|
17
|
+
};
|
|
15
18
|
items = [];
|
|
16
19
|
constructor(state) {
|
|
17
20
|
this.state = state;
|
|
18
21
|
}
|
|
19
|
-
add(
|
|
20
|
-
if (this.items.findIndex((item) => item.key ===
|
|
22
|
+
add(key, direction) {
|
|
23
|
+
if (this.items.findIndex((item) => item.key === key) > -1) return;
|
|
21
24
|
this.items.push({
|
|
22
|
-
key
|
|
25
|
+
key,
|
|
23
26
|
direction: direction ?? "ascending"
|
|
24
27
|
});
|
|
28
|
+
this.state.managers.event.emit(EVENT_SORT_ADD, [{
|
|
29
|
+
key,
|
|
30
|
+
direction: direction ?? "ascending"
|
|
31
|
+
}]);
|
|
25
32
|
this.sort();
|
|
26
33
|
}
|
|
27
|
-
addOrSet(event,
|
|
28
|
-
if (event.ctrlKey || event.metaKey) this.add(
|
|
34
|
+
addOrSet(event, key) {
|
|
35
|
+
if (event.ctrlKey || event.metaKey) this.add(key);
|
|
29
36
|
else this.set([{
|
|
30
|
-
|
|
31
|
-
direction:
|
|
32
|
-
}]);
|
|
37
|
+
key,
|
|
38
|
+
direction: SORT_ASCENDING
|
|
39
|
+
}], false);
|
|
33
40
|
}
|
|
34
41
|
clear() {
|
|
35
|
-
if (this.items.length
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
if (this.items.length === 0) return;
|
|
43
|
+
this.items.length = 0;
|
|
44
|
+
this.state.managers.event.emit(EVENT_SORT_CLEAR);
|
|
45
|
+
this.sort();
|
|
39
46
|
}
|
|
40
47
|
destroy() {
|
|
41
48
|
this.handlers = void 0;
|
|
42
49
|
this.items = void 0;
|
|
43
50
|
this.state = void 0;
|
|
44
51
|
}
|
|
45
|
-
flip(
|
|
46
|
-
const item = this.items.find((item) => item.key ===
|
|
52
|
+
flip(key) {
|
|
53
|
+
const item = this.items.find((item) => item.key === key);
|
|
47
54
|
if (item == null) return;
|
|
48
|
-
item.direction = item.direction === "ascending" ?
|
|
55
|
+
item.direction = item.direction === "ascending" ? SORT_DESCENDING : SORT_ASCENDING;
|
|
56
|
+
this.state.managers.event.emit(EVENT_SORT_FLIP, [{
|
|
57
|
+
key,
|
|
58
|
+
direction: item.direction
|
|
59
|
+
}]);
|
|
49
60
|
this.sort();
|
|
50
61
|
}
|
|
51
|
-
remove(
|
|
52
|
-
const index = this.items.findIndex((item) => item.key ===
|
|
53
|
-
if (index
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
removeOrClear(event, field) {
|
|
59
|
-
if (event.ctrlKey || event.metaKey) this.remove(field);
|
|
60
|
-
else this.clear();
|
|
62
|
+
remove(key) {
|
|
63
|
+
const index = this.items.findIndex((item) => item.key === key);
|
|
64
|
+
if (index === -1) return;
|
|
65
|
+
const spliced = this.items.splice(index, 1);
|
|
66
|
+
this.state.managers.event.emit(EVENT_SORT_REMOVE, spliced);
|
|
67
|
+
if (this.items.length === 0) this.state.managers.event.emit(EVENT_SORT_CLEAR);
|
|
68
|
+
this.sort();
|
|
61
69
|
}
|
|
62
|
-
set(items) {
|
|
63
|
-
this.items.splice(0, this.items.length, ...items.map((item) => ({
|
|
64
|
-
key: item.
|
|
70
|
+
set(items, set) {
|
|
71
|
+
const removed = this.items.splice(0, this.items.length, ...items.map((item) => ({
|
|
72
|
+
key: item.key,
|
|
73
|
+
direction: item.direction
|
|
74
|
+
})));
|
|
75
|
+
if (set) this.state.managers.event.emit(EVENT_SORT_SET, {
|
|
76
|
+
removed,
|
|
77
|
+
added: items.map((item) => ({
|
|
78
|
+
key: item.key,
|
|
79
|
+
direction: item.direction
|
|
80
|
+
}))
|
|
81
|
+
});
|
|
82
|
+
else this.state.managers.event.emit(EVENT_SORT_ADD, items.map((item) => ({
|
|
83
|
+
key: item.key,
|
|
65
84
|
direction: item.direction
|
|
66
85
|
})));
|
|
67
86
|
this.sort();
|
|
@@ -71,47 +90,48 @@ var SortManager = class {
|
|
|
71
90
|
const { length } = state.managers.column.items;
|
|
72
91
|
for (let index = 0; index < length; index += 1) {
|
|
73
92
|
const column = state.managers.column.items[index];
|
|
74
|
-
const sorterIndex = items.findIndex((item) => item.key === column.options.
|
|
93
|
+
const sorterIndex = items.findIndex((item) => item.key === column.options.key);
|
|
75
94
|
const sorterItem = items[sorterIndex];
|
|
76
95
|
setAttributes(column.elements.wrapper, {
|
|
77
|
-
|
|
78
|
-
|
|
96
|
+
[ARIA_SORT]: sorterItem == null ? SORT_NONE : items.length > 1 ? SORT_OTHER : sorterItem.direction,
|
|
97
|
+
[ATTRIBUTE_DATA_SORT_DIRECTION]: sorterItem == null ? void 0 : sorterItem.direction
|
|
79
98
|
});
|
|
80
|
-
setAttribute(column.elements.sorter,
|
|
99
|
+
setAttribute(column.elements.sorter, ATTRIBUTE_DATA_SORT_POSITION, sorterIndex > -1 && items.length > 1 ? sorterIndex + 1 : void 0);
|
|
81
100
|
}
|
|
82
|
-
state.managers.data.state.
|
|
101
|
+
state.managers.data.state.keys.active = items.length === 0 ? void 0 : getSortedItems(state, items);
|
|
102
|
+
state.managers.event.emit(EVENT_DATA_SORTED, state.managers.data.get(true));
|
|
83
103
|
state.managers.render.update(true, true);
|
|
84
104
|
}
|
|
85
|
-
toggle(event,
|
|
105
|
+
toggle(event, key, direction) {
|
|
86
106
|
switch (direction) {
|
|
87
|
-
case
|
|
88
|
-
this.flip(
|
|
107
|
+
case SORT_ASCENDING:
|
|
108
|
+
this.flip(key);
|
|
89
109
|
return;
|
|
90
|
-
case
|
|
91
|
-
this.
|
|
110
|
+
case SORT_DESCENDING:
|
|
111
|
+
this.remove(key);
|
|
92
112
|
return;
|
|
93
113
|
default:
|
|
94
|
-
this.addOrSet(event,
|
|
114
|
+
this.addOrSet(event, key);
|
|
95
115
|
return;
|
|
96
116
|
}
|
|
97
117
|
}
|
|
98
118
|
};
|
|
99
119
|
function getSortedItems(state, sorters) {
|
|
100
|
-
const data = state.managers.data.state.
|
|
120
|
+
const data = state.managers.data.state.keys.active?.map((key) => isGroupKey(key) ? key : state.managers.data.state.values.mapped.get(key)) ?? state.managers.data.state.values.array;
|
|
101
121
|
if (!state.managers.group.enabled) return sort(data, sorters).map((item) => getValue(item, state.key));
|
|
102
|
-
return sortWithGroups(state, data, sorters).map((item) => item
|
|
122
|
+
return sortWithGroups(state, data, sorters).map((item) => isGroupKey(item) ? item : getValue(item, state.key));
|
|
103
123
|
}
|
|
104
124
|
function sortWithGroups(state, data, sorters) {
|
|
105
125
|
const { length } = sorters;
|
|
106
126
|
return data.sort((first, second) => {
|
|
107
|
-
const
|
|
108
|
-
const
|
|
127
|
+
const firstIsGroup = isGroupKey(first);
|
|
128
|
+
const secondIsGroup = isGroupKey(second);
|
|
129
|
+
const firstValue = firstIsGroup ? state.managers.group.getForKey(first).value.stringified : getValue(first, state.managers.group.key);
|
|
130
|
+
const secondValue = secondIsGroup ? state.managers.group.getForKey(second).value.stringified : getValue(second, state.managers.group.key);
|
|
109
131
|
const firstOrder = state.managers.group.order[firstValue];
|
|
110
132
|
const secondOrder = state.managers.group.order[secondValue];
|
|
111
133
|
const groupComparison = compare(firstOrder, secondOrder);
|
|
112
134
|
if (groupComparison !== 0) return groupComparison;
|
|
113
|
-
const firstIsGroup = first instanceof GroupComponent;
|
|
114
|
-
const secondIsGroup = second instanceof GroupComponent;
|
|
115
135
|
if (firstIsGroup || secondIsGroup) return firstIsGroup && secondIsGroup ? 0 : firstIsGroup ? -1 : 1;
|
|
116
136
|
for (let index = 0; index < length; index += 1) {
|
|
117
137
|
const sorter = sorters[index];
|
|
@@ -121,5 +141,7 @@ function sortWithGroups(state, data, sorters) {
|
|
|
121
141
|
return 0;
|
|
122
142
|
});
|
|
123
143
|
}
|
|
144
|
+
const SORT_NONE = "none";
|
|
145
|
+
const SORT_OTHER = "other";
|
|
124
146
|
//#endregion
|
|
125
147
|
export { SortManager, sortWithGroups };
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { State } from "../models/tabela.model.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/managers/style.manager.d.ts
|
|
4
|
+
declare class StyleManager {
|
|
5
|
+
readonly state: State;
|
|
6
|
+
constructor(state: State);
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
2
9
|
export { StyleManager };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CSS_BUTTON, CSS_CELL, CSS_CELL_FOOTER, CSS_CELL_GROUP, CSS_HEADING, CSS_HEADING_CONTENT, CSS_HEADING_SORTER, CSS_ROW, CSS_ROWGROUP_BODY, CSS_ROWGROUP_FOOTER, CSS_ROWGROUP_HEADER, CSS_ROW_SELECTED, CSS_SELECTION, CSS_TABLE, CSS_WRAPPER } from "../models/style.model.mjs";
|
|
1
2
|
//#region src/managers/style.manager.ts
|
|
2
3
|
var StyleManager = class {
|
|
3
4
|
constructor(state) {
|
|
@@ -11,14 +12,14 @@ var StyleManager = class {
|
|
|
11
12
|
};
|
|
12
13
|
const styling = `/** Table */
|
|
13
14
|
|
|
14
|
-
:where(
|
|
15
|
+
:where(.${CSS_WRAPPER}) {
|
|
15
16
|
flex: 1;
|
|
16
17
|
position: relative;
|
|
17
18
|
background-color: var(--oui-absolute);
|
|
18
19
|
border: 1px solid grey;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
:where(
|
|
22
|
+
:where(.${CSS_TABLE}) {
|
|
22
23
|
min-height: 24em;
|
|
23
24
|
display: flex;
|
|
24
25
|
flex-flow: column nowrap;
|
|
@@ -30,69 +31,69 @@ const styling = `/** Table */
|
|
|
30
31
|
|
|
31
32
|
/** Row group */
|
|
32
33
|
|
|
33
|
-
:where(
|
|
34
|
-
:where(
|
|
34
|
+
:where(.${CSS_ROWGROUP_HEADER}),
|
|
35
|
+
:where(.${CSS_ROWGROUP_FOOTER}) {
|
|
35
36
|
background-color: white;
|
|
36
37
|
position: sticky;
|
|
37
38
|
left: 0;
|
|
38
39
|
z-index: 10;
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
:where(
|
|
42
|
+
:where(.${CSS_ROWGROUP_HEADER}) {
|
|
42
43
|
top: 0;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
:where(
|
|
46
|
+
:where(.${CSS_ROWGROUP_FOOTER}) {
|
|
46
47
|
bottom: 0;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
:where(
|
|
50
|
+
:where(.${CSS_ROWGROUP_BODY}) {
|
|
50
51
|
display: flex;
|
|
51
52
|
flex-flow: column nowrap;
|
|
52
53
|
flex: 1;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
:where(
|
|
56
|
+
:where(.${CSS_ROWGROUP_BODY}:focus) {
|
|
56
57
|
outline: none;
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
:where(
|
|
60
|
+
:where(.${CSS_WRAPPER}:has(.${CSS_ROWGROUP_BODY}:focus-visible)) {
|
|
60
61
|
outline: 2px solid var(--oui-blue-6);
|
|
61
62
|
outline-offset: 2px;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
/** Row */
|
|
65
66
|
|
|
66
|
-
:where(
|
|
67
|
+
:where(.${CSS_ROW}) {
|
|
67
68
|
width: 100%;
|
|
68
69
|
display: flex;
|
|
69
70
|
flex-flow: row nowrap;
|
|
70
71
|
}
|
|
71
72
|
|
|
72
|
-
:where(
|
|
73
|
+
:where(.${CSS_ROW}:last-child .${CSS_CELL}) {
|
|
73
74
|
border-bottom-width: 0;
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
:where(
|
|
77
|
-
:where(
|
|
77
|
+
:where(.${CSS_ROW}--body),
|
|
78
|
+
:where(.${CSS_ROW}--group) {
|
|
78
79
|
flex: 1;
|
|
79
80
|
position: absolute;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
:where(
|
|
83
|
+
:where(.${CSS_ROW_SELECTED}) {
|
|
83
84
|
background-color: var(--oui-blue-1);
|
|
84
85
|
color: var(--oui-blue-9);
|
|
85
86
|
}
|
|
86
87
|
|
|
87
|
-
:where(
|
|
88
|
+
:where(.${CSS_WRAPPER}:has(.${CSS_ROWGROUP_BODY}:focus-visible) .${CSS_ROW}[data-active="true"]) {
|
|
88
89
|
outline: 2px solid var(--oui-blue-6);
|
|
89
90
|
outline-offset: 2px;
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
/** Cells */
|
|
93
94
|
|
|
94
|
-
:where(
|
|
95
|
-
:where(
|
|
95
|
+
:where(.${CSS_CELL}),
|
|
96
|
+
:where(.${CSS_HEADING}) {
|
|
96
97
|
padding: 0.5em;
|
|
97
98
|
border-color: gray;
|
|
98
99
|
border-style: solid;
|
|
@@ -100,24 +101,55 @@ const styling = `/** Table */
|
|
|
100
101
|
line-height: 1;
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
:where(
|
|
104
|
-
:where(
|
|
104
|
+
:where(.${CSS_WRAPPER} .${CSS_CELL}:last-child),
|
|
105
|
+
:where(.${CSS_ROW} .${CSS_HEADING}:last-child) {
|
|
105
106
|
flex: 1;
|
|
106
107
|
border-right-width: 0;
|
|
107
108
|
}
|
|
108
109
|
|
|
109
|
-
:where(
|
|
110
|
+
:where(.${CSS_CELL}) {
|
|
110
111
|
overflow: hidden;
|
|
111
112
|
text-overflow: ellipsis;
|
|
112
113
|
white-space: nowrap;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
:where(
|
|
116
|
+
:where(.${CSS_HEADING}) {
|
|
117
|
+
display: flex;
|
|
118
|
+
flex-flow: row nowrap;
|
|
119
|
+
align-items: center;
|
|
120
|
+
justify-content: space-between;
|
|
121
|
+
gap: 0.5em;
|
|
122
|
+
cursor: pointer;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
:where(.${CSS_HEADING_CONTENT}) {
|
|
126
|
+
overflow: hidden;
|
|
127
|
+
white-space: nowrap;
|
|
128
|
+
text-overflow: ellipsis;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
:where(.${CSS_HEADING}[data-sort-direction] .${CSS_HEADING_SORTER})::after {
|
|
132
|
+
width: 1em;
|
|
133
|
+
height: 1em;
|
|
134
|
+
display: inline-flex;
|
|
135
|
+
font-size: .75em;
|
|
136
|
+
font-weight: bold;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
:where(.${CSS_HEADING}[data-sort-direction="ascending"] .${CSS_HEADING_SORTER})::after {
|
|
140
|
+
content: '\\21C8';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
:where(.${CSS_HEADING}[data-sort-direction="descending"] .${CSS_HEADING_SORTER})::after {
|
|
144
|
+
content: '\\21CA';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
:where(.${CSS_CELL_FOOTER}) {
|
|
116
148
|
border-top-width: 1px;
|
|
117
149
|
border-bottom-width: 0;
|
|
118
150
|
}
|
|
119
151
|
|
|
120
|
-
:where(
|
|
152
|
+
:where(.${CSS_CELL_GROUP}) {
|
|
121
153
|
padding: 0;
|
|
122
154
|
display: flex;
|
|
123
155
|
flex-flow: row nowrap;
|
|
@@ -125,18 +157,18 @@ const styling = `/** Table */
|
|
|
125
157
|
gap: 0.5em;
|
|
126
158
|
}
|
|
127
159
|
|
|
128
|
-
:where(
|
|
160
|
+
:where(.${CSS_CELL_GROUP} .${CSS_BUTTON}) {
|
|
129
161
|
margin: 0 0 0 .25rem;
|
|
130
162
|
}
|
|
131
163
|
|
|
132
164
|
/** Misc. */
|
|
133
165
|
|
|
134
|
-
:where(
|
|
166
|
+
:where(.${CSS_BUTTON}) {
|
|
135
167
|
font-size: .75rem;
|
|
136
168
|
font-weight: bold;
|
|
137
169
|
}
|
|
138
170
|
|
|
139
|
-
:where(
|
|
171
|
+
:where(.${CSS_SELECTION}) {
|
|
140
172
|
background-color: color-mix(in oklch, var(--oui-blue-6), transparent);
|
|
141
173
|
border: 1px solid var(--oui-blue-6);
|
|
142
174
|
border-radius: .25rem;
|
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/models/column.model.d.ts
|
|
2
|
+
type Column = {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
width: number;
|
|
6
|
+
};
|
|
7
|
+
type TabelaColumn = {
|
|
8
|
+
key: string;
|
|
9
|
+
label: string;
|
|
10
|
+
width?: number;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { Column, TabelaColumn };
|
|
@@ -1,2 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { State } from "./tabela.model.mjs";
|
|
2
|
+
import { Key, PlainObject } from "@oscarpalmer/atoms/models";
|
|
3
|
+
|
|
4
|
+
//#region src/models/data.model.d.ts
|
|
5
|
+
type DataKeys = {
|
|
6
|
+
active?: Key[];
|
|
7
|
+
original: Key[];
|
|
8
|
+
};
|
|
9
|
+
type DataState = {
|
|
10
|
+
keys: DataKeys;
|
|
11
|
+
values: DataValues;
|
|
12
|
+
} & State;
|
|
13
|
+
type DataValue = string | PlainObject;
|
|
14
|
+
type DataValues = {
|
|
15
|
+
array: DataValue[];
|
|
16
|
+
mapped: Map<Key, PlainObject>;
|
|
17
|
+
};
|
|
18
|
+
type TabelaData = {
|
|
19
|
+
add(data: PlainObject[]): Promise<void>;
|
|
20
|
+
clear(): Promise<void>;
|
|
21
|
+
get(active?: boolean): PlainObject[];
|
|
22
|
+
remove(keys: Key[]): Promise<void>;
|
|
23
|
+
remove(data: PlainObject[]): Promise<void>;
|
|
24
|
+
synchronize(data: PlainObject[], remove?: boolean): Promise<void>;
|
|
25
|
+
update(data: PlainObject[]): Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { DataState, DataValue, TabelaData };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/models/dom.model.d.ts
|
|
2
|
+
declare const ARIA_ACTIVEDESCENDANT = "aria-activedescendant";
|
|
3
|
+
declare const ARIA_LABEL = "aria-label";
|
|
4
|
+
declare const ARIA_SELECTED = "aria-selected";
|
|
5
|
+
declare const ARIA_SORT = "aria-sort";
|
|
6
|
+
declare const ATTRIBUTE_DATA_ACTIVE = "data-active";
|
|
7
|
+
declare const ATTRIBUTE_DATA_EVENT = "data-event";
|
|
8
|
+
declare const ATTRIBUTE_DATA_KEY = "data-key";
|
|
9
|
+
declare const ATTRIBUTE_DATA_SORT_DIRECTION = "data-sort-direction";
|
|
10
|
+
declare const ATTRIBUTE_DATA_SORT_POSITION = "data-sort-position";
|
|
11
|
+
declare const ATTRIBUTE_ROLE = "role";
|
|
12
|
+
declare const ELEMENT_DIV = "div";
|
|
13
|
+
declare const ROLE_CELL = "cell";
|
|
14
|
+
declare const ROLE_COLUMNHEADER = "columnheader";
|
|
15
|
+
declare const ROLE_ROW = "row";
|
|
16
|
+
declare const ROLE_ROWGROUP = "rowgroup";
|
|
17
|
+
declare const ROLE_TABLE = "table";
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ARIA_ACTIVEDESCENDANT, ARIA_LABEL, ARIA_SELECTED, ARIA_SORT, ATTRIBUTE_DATA_ACTIVE, ATTRIBUTE_DATA_EVENT, ATTRIBUTE_DATA_KEY, ATTRIBUTE_DATA_SORT_DIRECTION, ATTRIBUTE_DATA_SORT_POSITION, ATTRIBUTE_ROLE, ELEMENT_DIV, ROLE_CELL, ROLE_COLUMNHEADER, ROLE_ROW, ROLE_ROWGROUP, ROLE_TABLE };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/models/dom.model.ts
|
|
2
|
+
const ARIA_ACTIVEDESCENDANT = "aria-activedescendant";
|
|
3
|
+
const ARIA_LABEL = "aria-label";
|
|
4
|
+
const ARIA_SELECTED = "aria-selected";
|
|
5
|
+
const ARIA_SORT = "aria-sort";
|
|
6
|
+
const ATTRIBUTE_DATA_ACTIVE = "data-active";
|
|
7
|
+
const ATTRIBUTE_DATA_EVENT = "data-event";
|
|
8
|
+
const ATTRIBUTE_DATA_KEY = "data-key";
|
|
9
|
+
const ATTRIBUTE_DATA_SORT_DIRECTION = "data-sort-direction";
|
|
10
|
+
const ATTRIBUTE_DATA_SORT_POSITION = "data-sort-position";
|
|
11
|
+
const ATTRIBUTE_ROLE = "role";
|
|
12
|
+
const ELEMENT_DIV = "div";
|
|
13
|
+
const ROLE_CELL = "cell";
|
|
14
|
+
const ROLE_COLUMNHEADER = "columnheader";
|
|
15
|
+
const ROLE_ROW = "row";
|
|
16
|
+
const ROLE_ROWGROUP = "rowgroup";
|
|
17
|
+
const ROLE_TABLE = "table";
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ARIA_ACTIVEDESCENDANT, ARIA_LABEL, ARIA_SELECTED, ARIA_SORT, ATTRIBUTE_DATA_ACTIVE, ATTRIBUTE_DATA_EVENT, ATTRIBUTE_DATA_KEY, ATTRIBUTE_DATA_SORT_DIRECTION, ATTRIBUTE_DATA_SORT_POSITION, ATTRIBUTE_ROLE, ELEMENT_DIV, ROLE_CELL, ROLE_COLUMNHEADER, ROLE_ROW, ROLE_ROWGROUP, ROLE_TABLE };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { TabelaFilterItem } from "./filter.model.mjs";
|
|
2
|
+
import { TabelaGroup, TabelaGroupToggle } from "./group.model.mjs";
|
|
3
|
+
import { TabelaSortItem } from "./sort.model.mjs";
|
|
4
|
+
import { Key, PlainObject } from "@oscarpalmer/atoms/models";
|
|
5
|
+
|
|
6
|
+
//#region src/models/event.model.d.ts
|
|
7
|
+
type EventDataAdd = (data: PlainObject[]) => void;
|
|
8
|
+
type EventDataClear = () => void;
|
|
9
|
+
type EventDataFiltered = (data: PlainObject[]) => void;
|
|
10
|
+
type EventDataRemove = (data: PlainObject[]) => void;
|
|
11
|
+
type EventDataSorted = (data: PlainObject[]) => void;
|
|
12
|
+
type EventDataSynchronize = (data: {
|
|
13
|
+
added: PlainObject[];
|
|
14
|
+
removed: PlainObject[];
|
|
15
|
+
updated: PlainObject[];
|
|
16
|
+
}) => void;
|
|
17
|
+
type EventDataUpdate = (data: PlainObject[]) => void;
|
|
18
|
+
type EventFilterAdd = (filters: TabelaFilterItem[]) => void;
|
|
19
|
+
type EventFilterClear = () => void;
|
|
20
|
+
type EventFilterRemove = (filters: TabelaFilterItem[]) => void;
|
|
21
|
+
type EventGroupAdd = (groups: TabelaGroup[]) => void;
|
|
22
|
+
type EventGroupClear = () => void;
|
|
23
|
+
type EventGroupRemove = (groups: TabelaGroup[]) => void;
|
|
24
|
+
type EventGroupToggle = (event: TabelaGroupToggle) => void;
|
|
25
|
+
type EventGroupUpdate = (groups: TabelaGroup[]) => void;
|
|
26
|
+
type EventMap = {
|
|
27
|
+
'data:add': EventDataAdd;
|
|
28
|
+
'data:clear': EventDataClear;
|
|
29
|
+
'data:filtered': EventDataFiltered;
|
|
30
|
+
'data:remove': EventDataRemove;
|
|
31
|
+
'data:sorted': EventDataSorted;
|
|
32
|
+
'data:synchronize': EventDataSynchronize;
|
|
33
|
+
'data:update': EventDataUpdate;
|
|
34
|
+
'filter:add': EventFilterAdd;
|
|
35
|
+
'filter:clear': EventFilterClear;
|
|
36
|
+
'filter:remove': EventFilterRemove;
|
|
37
|
+
'group:add': EventGroupAdd;
|
|
38
|
+
'group:clear': EventGroupClear;
|
|
39
|
+
'group:remove': EventGroupRemove;
|
|
40
|
+
'group:toggle': EventGroupToggle;
|
|
41
|
+
'group:update': EventGroupUpdate;
|
|
42
|
+
'navigation:active': EventNavigationActive;
|
|
43
|
+
'render:begin': EventRenderBegin;
|
|
44
|
+
'render:end': EventRenderEnd;
|
|
45
|
+
'selection:add': EventSelectionAdd;
|
|
46
|
+
'selection:clear': EventSelectionClear;
|
|
47
|
+
'selection:remove': EventSelectionRemove;
|
|
48
|
+
'selection:toggle': EventSelectionToggle;
|
|
49
|
+
'sort:add': EventSortAdd;
|
|
50
|
+
'sort:clear': EventSortClear;
|
|
51
|
+
'sort:flip': EventSortFlip;
|
|
52
|
+
'sort:remove': EventSortRemove;
|
|
53
|
+
'sort:set': EventSortSet;
|
|
54
|
+
};
|
|
55
|
+
type EventName = keyof EventMap;
|
|
56
|
+
type EventNavigationActive = (active: Key | null) => void;
|
|
57
|
+
type EventRenderBegin = () => void;
|
|
58
|
+
type EventRenderEnd = () => void;
|
|
59
|
+
type EventSelectionAdd = (keys: Key[]) => void;
|
|
60
|
+
type EventSelectionClear = () => void;
|
|
61
|
+
type EventSelectionRemove = (keys: Key[]) => void;
|
|
62
|
+
type EventSelectionToggle = (keys: Key[]) => void;
|
|
63
|
+
type EventSortAdd = (sorters: TabelaSortItem[]) => void;
|
|
64
|
+
type EventSortClear = () => void;
|
|
65
|
+
type EventSortFlip = (sorters: TabelaSortItem[]) => void;
|
|
66
|
+
type EventSortRemove = (sorters: TabelaSortItem[]) => void;
|
|
67
|
+
type EventSortSet = (sorters: {
|
|
68
|
+
added: TabelaSortItem[];
|
|
69
|
+
removed: TabelaSortItem[];
|
|
70
|
+
}) => void;
|
|
71
|
+
type Events = Partial<{ [Name in EventName]: Set<EventMap[Name]> }>;
|
|
72
|
+
type TabelaEvents = {
|
|
73
|
+
subscribe<Name extends EventName>(name: Name, callback: EventMap[Name]): void;
|
|
74
|
+
unsubscribe<Name extends EventName>(name: Name, callback: EventMap[Name]): void;
|
|
75
|
+
};
|
|
76
|
+
declare const EVENT_BODY = "body";
|
|
77
|
+
declare const EVENT_DATA_ADD = "data:add";
|
|
78
|
+
declare const EVENT_DATA_CLEAR = "data:clear";
|
|
79
|
+
declare const EVENT_DATA_FILTERED = "data:filtered";
|
|
80
|
+
declare const EVENT_DATA_REMOVE = "data:remove";
|
|
81
|
+
declare const EVENT_DATA_SORTED = "data:sorted";
|
|
82
|
+
declare const EVENT_DATA_SYNCHRONIZE = "data:synchronize";
|
|
83
|
+
declare const EVENT_DATA_UPDATE = "data:update";
|
|
84
|
+
declare const EVENT_GROUP = "group";
|
|
85
|
+
declare const EVENT_GROUP_ADD = "group:add";
|
|
86
|
+
declare const EVENT_GROUP_CLEAR = "group:clear";
|
|
87
|
+
declare const EVENT_GROUP_REMOVE = "group:remove";
|
|
88
|
+
declare const EVENT_GROUP_TOGGLE = "group:toggle";
|
|
89
|
+
declare const EVENT_GROUP_UPDATE = "group:update";
|
|
90
|
+
declare const EVENT_HEADING = "heading";
|
|
91
|
+
declare const EVENT_ROW = "row";
|
|
92
|
+
declare const EVENT_SORT_ADD = "sort:add";
|
|
93
|
+
declare const EVENT_SORT_CLEAR = "sort:clear";
|
|
94
|
+
declare const EVENT_SORT_FLIP = "sort:flip";
|
|
95
|
+
declare const EVENT_SORT_REMOVE = "sort:remove";
|
|
96
|
+
declare const EVENT_SORT_SET = "sort:set";
|
|
97
|
+
declare const EVENTS_NAMES: Set<keyof EventMap>;
|
|
98
|
+
//#endregion
|
|
99
|
+
export { EVENTS_NAMES, EVENT_BODY, EVENT_DATA_ADD, EVENT_DATA_CLEAR, EVENT_DATA_FILTERED, EVENT_DATA_REMOVE, EVENT_DATA_SORTED, EVENT_DATA_SYNCHRONIZE, EVENT_DATA_UPDATE, EVENT_GROUP, EVENT_GROUP_ADD, EVENT_GROUP_CLEAR, EVENT_GROUP_REMOVE, EVENT_GROUP_TOGGLE, EVENT_GROUP_UPDATE, EVENT_HEADING, EVENT_ROW, EVENT_SORT_ADD, EVENT_SORT_CLEAR, EVENT_SORT_FLIP, EVENT_SORT_REMOVE, EVENT_SORT_SET, EventDataAdd, EventDataClear, EventDataFiltered, EventDataRemove, EventDataSorted, EventDataSynchronize, EventDataUpdate, EventFilterAdd, EventFilterClear, EventFilterRemove, EventGroupAdd, EventGroupClear, EventGroupRemove, EventGroupToggle, EventGroupUpdate, EventMap, EventName, EventNavigationActive, EventRenderBegin, EventRenderEnd, EventSelectionAdd, EventSelectionClear, EventSelectionRemove, EventSelectionToggle, EventSortAdd, EventSortClear, EventSortFlip, EventSortRemove, EventSortSet, Events, TabelaEvents };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//#region src/models/event.model.ts
|
|
2
|
+
const EVENT_BODY = "body";
|
|
3
|
+
const EVENT_DATA_ADD = "data:add";
|
|
4
|
+
const EVENT_DATA_CLEAR = "data:clear";
|
|
5
|
+
const EVENT_DATA_FILTERED = "data:filtered";
|
|
6
|
+
const EVENT_DATA_REMOVE = "data:remove";
|
|
7
|
+
const EVENT_DATA_SORTED = "data:sorted";
|
|
8
|
+
const EVENT_DATA_SYNCHRONIZE = "data:synchronize";
|
|
9
|
+
const EVENT_DATA_UPDATE = "data:update";
|
|
10
|
+
const EVENT_GROUP = "group";
|
|
11
|
+
const EVENT_GROUP_ADD = "group:add";
|
|
12
|
+
const EVENT_GROUP_CLEAR = "group:clear";
|
|
13
|
+
const EVENT_GROUP_REMOVE = "group:remove";
|
|
14
|
+
const EVENT_GROUP_TOGGLE = "group:toggle";
|
|
15
|
+
const EVENT_GROUP_UPDATE = "group:update";
|
|
16
|
+
const EVENT_HEADING = "heading";
|
|
17
|
+
const EVENT_ROW = "row";
|
|
18
|
+
const EVENT_SORT_ADD = "sort:add";
|
|
19
|
+
const EVENT_SORT_CLEAR = "sort:clear";
|
|
20
|
+
const EVENT_SORT_FLIP = "sort:flip";
|
|
21
|
+
const EVENT_SORT_REMOVE = "sort:remove";
|
|
22
|
+
const EVENT_SORT_SET = "sort:set";
|
|
23
|
+
const EVENTS_NAMES = new Set([
|
|
24
|
+
EVENT_DATA_ADD,
|
|
25
|
+
EVENT_DATA_CLEAR,
|
|
26
|
+
EVENT_DATA_FILTERED,
|
|
27
|
+
EVENT_DATA_REMOVE,
|
|
28
|
+
EVENT_DATA_SORTED,
|
|
29
|
+
EVENT_DATA_SYNCHRONIZE,
|
|
30
|
+
EVENT_DATA_UPDATE,
|
|
31
|
+
"filter:add",
|
|
32
|
+
"filter:clear",
|
|
33
|
+
"filter:remove",
|
|
34
|
+
EVENT_GROUP_ADD,
|
|
35
|
+
EVENT_GROUP_CLEAR,
|
|
36
|
+
EVENT_GROUP_REMOVE,
|
|
37
|
+
EVENT_GROUP_TOGGLE,
|
|
38
|
+
EVENT_GROUP_UPDATE,
|
|
39
|
+
"navigation:active",
|
|
40
|
+
"render:begin",
|
|
41
|
+
"render:end",
|
|
42
|
+
"selection:add",
|
|
43
|
+
"selection:clear",
|
|
44
|
+
"selection:remove",
|
|
45
|
+
"selection:toggle",
|
|
46
|
+
EVENT_SORT_ADD,
|
|
47
|
+
EVENT_SORT_CLEAR,
|
|
48
|
+
EVENT_SORT_FLIP,
|
|
49
|
+
EVENT_SORT_REMOVE,
|
|
50
|
+
EVENT_SORT_SET
|
|
51
|
+
]);
|
|
52
|
+
//#endregion
|
|
53
|
+
export { EVENTS_NAMES, EVENT_BODY, EVENT_DATA_ADD, EVENT_DATA_CLEAR, EVENT_DATA_FILTERED, EVENT_DATA_REMOVE, EVENT_DATA_SORTED, EVENT_DATA_SYNCHRONIZE, EVENT_DATA_UPDATE, EVENT_GROUP, EVENT_GROUP_ADD, EVENT_GROUP_CLEAR, EVENT_GROUP_REMOVE, EVENT_GROUP_TOGGLE, EVENT_GROUP_UPDATE, EVENT_HEADING, EVENT_ROW, EVENT_SORT_ADD, EVENT_SORT_CLEAR, EVENT_SORT_FLIP, EVENT_SORT_REMOVE, EVENT_SORT_SET };
|
|
@@ -1,2 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/models/filter.model.d.ts
|
|
2
|
+
type TabelaFilter = {
|
|
3
|
+
add(item: TabelaFilterItem): void;
|
|
4
|
+
clear(): void;
|
|
5
|
+
remove(key: string): void;
|
|
6
|
+
remove(item: TabelaFilterItem): void;
|
|
7
|
+
set(items: TabelaFilterItem[]): void;
|
|
8
|
+
};
|
|
9
|
+
type TabelaFilterComparison = 'contains' | 'ends-with' | 'equals' | 'greater-than' | 'greater-than-or-equal' | 'less-than' | 'less-than-or-equal' | 'not-contains' | 'not-equals' | 'starts-with';
|
|
10
|
+
type TabelaFilterItem = {
|
|
11
|
+
comparison: TabelaFilterComparison;
|
|
12
|
+
key: string;
|
|
13
|
+
value: unknown;
|
|
14
|
+
};
|
|
15
|
+
declare const FILTER_CONTAINS: TabelaFilterComparison;
|
|
16
|
+
declare const FILTER_ENDS_WITH: TabelaFilterComparison;
|
|
17
|
+
declare const FILTER_EQUALS: TabelaFilterComparison;
|
|
18
|
+
declare const FILTER_GREATER_THAN: TabelaFilterComparison;
|
|
19
|
+
declare const FILTER_GREATER_THAN_OR_EQUAL: TabelaFilterComparison;
|
|
20
|
+
declare const FILTER_LESS_THAN: TabelaFilterComparison;
|
|
21
|
+
declare const FILTER_LESS_THAN_OR_EQUAL: TabelaFilterComparison;
|
|
22
|
+
declare const FILTER_NOT_CONTAINS: TabelaFilterComparison;
|
|
23
|
+
declare const FILTER_NOT_EQUALS: TabelaFilterComparison;
|
|
24
|
+
declare const FILTER_STARTS_WITH: TabelaFilterComparison;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { FILTER_CONTAINS, FILTER_ENDS_WITH, FILTER_EQUALS, FILTER_GREATER_THAN, FILTER_GREATER_THAN_OR_EQUAL, FILTER_LESS_THAN, FILTER_LESS_THAN_OR_EQUAL, FILTER_NOT_CONTAINS, FILTER_NOT_EQUALS, FILTER_STARTS_WITH, TabelaFilter, TabelaFilterComparison, TabelaFilterItem };
|