@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,12 +1,15 @@
|
|
|
1
|
-
import {select, sort} from '@oscarpalmer/atoms/array';
|
|
1
|
+
import {chunk, select, sort} from '@oscarpalmer/atoms/array';
|
|
2
2
|
import {toMap} from '@oscarpalmer/atoms/array/to-map';
|
|
3
3
|
import {toRecord} from '@oscarpalmer/atoms/array/to-record';
|
|
4
|
+
import {isPlainObject} from '@oscarpalmer/atoms/is';
|
|
4
5
|
import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
|
|
5
|
-
import
|
|
6
|
+
import {delay} from '@oscarpalmer/atoms/promise/delay';
|
|
7
|
+
import {getValue} from '@oscarpalmer/atoms/value/handle';
|
|
8
|
+
import {GroupComponent, updateGroup} from '../components/group.component';
|
|
9
|
+
import type {DataItem, DataState, TabelaData} from '../models/data.model';
|
|
6
10
|
import type {State} from '../models/tabela.model';
|
|
7
|
-
import {GroupComponent} from '../components/group.component';
|
|
8
11
|
import {sortWithGroups} from './sort.manager';
|
|
9
|
-
import {
|
|
12
|
+
import type {ColumnComponent} from '../components/column.component';
|
|
10
13
|
|
|
11
14
|
export class DataManager {
|
|
12
15
|
handlers = Object.freeze({
|
|
@@ -18,58 +21,68 @@ export class DataManager {
|
|
|
18
21
|
update: data => void this.update(data),
|
|
19
22
|
} satisfies TabelaData);
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
objects: {
|
|
26
|
-
mapped: new Map(),
|
|
27
|
-
array: [],
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
get keys(): Array<GroupComponent | Key> {
|
|
32
|
-
return this.values.keys.active ?? this.values.keys.original;
|
|
24
|
+
state: DataState;
|
|
25
|
+
|
|
26
|
+
get items(): DataItem[] {
|
|
27
|
+
return this.state.items.active ?? this.state.items.original;
|
|
33
28
|
}
|
|
34
29
|
|
|
35
30
|
get size(): number {
|
|
36
|
-
return this.
|
|
31
|
+
return this.items.length;
|
|
37
32
|
}
|
|
38
33
|
|
|
39
|
-
constructor(
|
|
34
|
+
constructor(state: State) {
|
|
35
|
+
this.state = {
|
|
36
|
+
...state,
|
|
37
|
+
items: {
|
|
38
|
+
original: [],
|
|
39
|
+
},
|
|
40
|
+
values: {
|
|
41
|
+
array: [],
|
|
42
|
+
mapped: new Map(),
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
40
46
|
|
|
41
47
|
async add(data: PlainObject[], render: boolean): Promise<void> {
|
|
42
|
-
const {state
|
|
43
|
-
const {length} = data;
|
|
48
|
+
const {state} = this;
|
|
44
49
|
|
|
50
|
+
const groups: GroupComponent[] = [];
|
|
45
51
|
const updates: PlainObject[] = [];
|
|
46
52
|
|
|
53
|
+
let groupColumn: ColumnComponent | undefined;
|
|
54
|
+
let {length} = data;
|
|
55
|
+
|
|
47
56
|
for (let index = 0; index < length; index += 1) {
|
|
48
57
|
const item = data[index];
|
|
49
|
-
const key = item
|
|
58
|
+
const key = getValue(item, state.key) as Key;
|
|
50
59
|
|
|
51
|
-
if (values.
|
|
60
|
+
if (state.values.mapped.has(key)) {
|
|
52
61
|
updates.push(item);
|
|
53
62
|
|
|
54
63
|
continue;
|
|
55
64
|
}
|
|
56
65
|
|
|
57
|
-
values.
|
|
58
|
-
values.
|
|
66
|
+
state.values.array.push(item);
|
|
67
|
+
state.values.mapped.set(key, item);
|
|
59
68
|
|
|
60
69
|
if (!state.managers.group.enabled) {
|
|
61
70
|
continue;
|
|
62
71
|
}
|
|
63
72
|
|
|
64
|
-
const
|
|
73
|
+
const groupValue = getValue(item, state.managers.group.field) as unknown;
|
|
65
74
|
|
|
66
|
-
let group = state.managers.group.get(
|
|
75
|
+
let group = state.managers.group.get(groupValue);
|
|
67
76
|
|
|
68
77
|
if (group == null) {
|
|
69
|
-
|
|
78
|
+
groupColumn ??= state.managers.column.get(state.managers.group.field);
|
|
70
79
|
|
|
71
|
-
|
|
80
|
+
group = new GroupComponent(
|
|
81
|
+
`${groupColumn?.options.title ?? state.managers.group.field}: ${groupValue}`,
|
|
82
|
+
groupValue,
|
|
83
|
+
);
|
|
72
84
|
|
|
85
|
+
state.values.array.push(group);
|
|
73
86
|
state.managers.group.add(group);
|
|
74
87
|
}
|
|
75
88
|
|
|
@@ -78,6 +91,14 @@ export class DataManager {
|
|
|
78
91
|
}
|
|
79
92
|
|
|
80
93
|
group.total += 1;
|
|
94
|
+
|
|
95
|
+
groups.push(group);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
length = groups.length;
|
|
99
|
+
|
|
100
|
+
for (let index = 0; index < length; index += 1) {
|
|
101
|
+
updateGroup(state, groups[index]);
|
|
81
102
|
}
|
|
82
103
|
|
|
83
104
|
if (updates.length > 0) {
|
|
@@ -88,121 +109,166 @@ export class DataManager {
|
|
|
88
109
|
}
|
|
89
110
|
|
|
90
111
|
clear(): void {
|
|
91
|
-
if (this.values.
|
|
92
|
-
this.
|
|
112
|
+
if (this.state.values.array.length > 0) {
|
|
113
|
+
void this.removeItems([], true, true);
|
|
93
114
|
}
|
|
94
115
|
}
|
|
95
116
|
|
|
96
117
|
destroy(): void {
|
|
97
|
-
const {
|
|
118
|
+
const {state} = this;
|
|
98
119
|
|
|
99
|
-
values.
|
|
120
|
+
state.values.mapped.clear();
|
|
100
121
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
values.
|
|
122
|
+
state.items.active = undefined;
|
|
123
|
+
state.items.original.length = 0;
|
|
124
|
+
state.values.array.length = 0;
|
|
104
125
|
|
|
105
126
|
this.handlers = undefined as never;
|
|
106
127
|
this.state = undefined as never;
|
|
107
|
-
this.values = undefined as never;
|
|
108
128
|
}
|
|
109
129
|
|
|
110
130
|
get(active?: boolean): PlainObject[] {
|
|
111
|
-
const {
|
|
131
|
+
const {state} = this;
|
|
112
132
|
|
|
113
133
|
return (active ?? false)
|
|
114
134
|
? select(
|
|
115
|
-
|
|
135
|
+
state.items.active ?? [],
|
|
116
136
|
key => !(key instanceof GroupComponent),
|
|
117
|
-
key => values.
|
|
137
|
+
key => state.values.mapped.get(key as Key)!,
|
|
118
138
|
)
|
|
119
|
-
: (values.
|
|
139
|
+
: (state.values.array.filter(item => !(item instanceof GroupComponent)) as PlainObject[]);
|
|
120
140
|
}
|
|
121
141
|
|
|
122
|
-
getIndex(
|
|
123
|
-
|
|
142
|
+
getIndex(item: DataItem): number {
|
|
143
|
+
if (item instanceof GroupComponent) {
|
|
144
|
+
return this.items.indexOf(item);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return this.items.findIndex(value =>
|
|
148
|
+
value instanceof GroupComponent ? value.key === item : value === item,
|
|
149
|
+
);
|
|
124
150
|
}
|
|
125
151
|
|
|
126
152
|
async remove(items: Array<Key | PlainObject>, render: boolean): Promise<void> {
|
|
127
|
-
const {state
|
|
153
|
+
const {state} = this;
|
|
128
154
|
|
|
129
|
-
const keys = items
|
|
130
|
-
|
|
131
|
-
|
|
155
|
+
const keys = items.map(
|
|
156
|
+
value => (isPlainObject(value) ? getValue(value, state.key) : value) as Key,
|
|
157
|
+
);
|
|
132
158
|
|
|
133
159
|
const {length} = keys;
|
|
134
160
|
|
|
135
|
-
if (length
|
|
136
|
-
return;
|
|
161
|
+
if (length > 0) {
|
|
162
|
+
return this.removeItems(keys, false, render === true);
|
|
137
163
|
}
|
|
164
|
+
}
|
|
138
165
|
|
|
139
|
-
|
|
140
|
-
|
|
166
|
+
async removeItems(items: DataItem[], clear: boolean, render: boolean): Promise<void> {
|
|
167
|
+
const {state} = this;
|
|
141
168
|
|
|
142
|
-
|
|
169
|
+
if (clear) {
|
|
170
|
+
state.items.active = undefined;
|
|
171
|
+
state.items.original = [];
|
|
172
|
+
state.values.array = [];
|
|
143
173
|
|
|
144
|
-
|
|
145
|
-
item => !(item instanceof GroupComponent) && item[state.key] === key,
|
|
146
|
-
);
|
|
174
|
+
state.values.mapped.clear();
|
|
147
175
|
|
|
148
|
-
|
|
176
|
+
state.managers.row.clear();
|
|
149
177
|
|
|
150
|
-
if (
|
|
151
|
-
|
|
178
|
+
if (state.managers.group.enabled) {
|
|
179
|
+
state.managers.group.clear();
|
|
152
180
|
}
|
|
153
181
|
|
|
154
|
-
|
|
182
|
+
return this.render();
|
|
183
|
+
}
|
|
155
184
|
|
|
156
|
-
|
|
185
|
+
const groups: GroupComponent[] = [];
|
|
157
186
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
187
|
+
const chunked = chunk(items);
|
|
188
|
+
const chunkedLength = chunked.length;
|
|
161
189
|
|
|
162
|
-
|
|
190
|
+
for (let chunkedIndex = 0; chunkedIndex < chunkedLength; chunkedIndex += 1) {
|
|
191
|
+
const chunk = chunked[chunkedIndex];
|
|
192
|
+
const chunkLength = chunk.length;
|
|
163
193
|
|
|
164
|
-
|
|
194
|
+
for (let itemIndex = 0; itemIndex < chunkLength; itemIndex += 1) {
|
|
195
|
+
const item = chunk[itemIndex];
|
|
196
|
+
const dataIndex = state.items.original.indexOf(item);
|
|
165
197
|
|
|
166
|
-
|
|
198
|
+
let dataValue: PlainObject | undefined;
|
|
167
199
|
|
|
168
|
-
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
200
|
+
[dataValue] = state.values.array.splice(dataIndex, 1) as PlainObject[];
|
|
171
201
|
|
|
172
|
-
|
|
202
|
+
state.items.original.splice(dataIndex, 1);
|
|
203
|
+
state.managers.row.remove(item as never);
|
|
204
|
+
state.values.mapped.delete(item as Key);
|
|
173
205
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
206
|
+
if (!state.managers.group.enabled || item instanceof GroupComponent) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
state.managers.group.collapsed.delete(item as never);
|
|
211
|
+
|
|
212
|
+
const groupKey = getValue(dataValue, state.managers.group.field) as unknown;
|
|
213
|
+
|
|
214
|
+
const group = state.managers.group.get(groupKey);
|
|
215
|
+
|
|
216
|
+
if (group == null) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
group.total -= 1;
|
|
221
|
+
|
|
222
|
+
if (group.total > 0) {
|
|
223
|
+
groups.push(group);
|
|
224
|
+
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
let groupIndex = groups.indexOf(group);
|
|
177
229
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
230
|
+
if (groupIndex > -1) {
|
|
231
|
+
groups.splice(groupIndex, 1);
|
|
232
|
+
}
|
|
181
233
|
|
|
182
|
-
|
|
183
|
-
|
|
234
|
+
groupIndex = state.values.array.indexOf(group);
|
|
235
|
+
|
|
236
|
+
if (groupIndex > -1) {
|
|
237
|
+
state.items.original.splice(groupIndex, 1);
|
|
238
|
+
state.values.array.splice(groupIndex, 1);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
state.managers.group.remove(group);
|
|
242
|
+
|
|
243
|
+
if (items.length >= 10_000) {
|
|
244
|
+
await delay(25);
|
|
245
|
+
}
|
|
184
246
|
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const {length} = groups;
|
|
185
250
|
|
|
186
|
-
|
|
251
|
+
for (let index = 0; index < length; index += 1) {
|
|
252
|
+
updateGroup(state, groups[index]);
|
|
187
253
|
}
|
|
188
254
|
|
|
189
255
|
if (render) {
|
|
190
|
-
this.render();
|
|
256
|
+
return this.render();
|
|
191
257
|
}
|
|
192
258
|
}
|
|
193
259
|
|
|
194
260
|
render(): void {
|
|
195
|
-
const {state
|
|
261
|
+
const {state} = this;
|
|
196
262
|
|
|
197
263
|
if (state.managers.group.enabled) {
|
|
198
|
-
sortWithGroups(state, values.
|
|
264
|
+
sortWithGroups(state, state.values.array, [
|
|
199
265
|
{
|
|
200
266
|
direction: 'ascending',
|
|
201
267
|
key: state.key,
|
|
202
268
|
},
|
|
203
269
|
]);
|
|
204
270
|
} else {
|
|
205
|
-
sort(values.
|
|
271
|
+
sort(state.values.array as PlainObject[], [
|
|
206
272
|
{
|
|
207
273
|
direction: 'ascending',
|
|
208
274
|
key: state.key,
|
|
@@ -210,13 +276,13 @@ export class DataManager {
|
|
|
210
276
|
]);
|
|
211
277
|
}
|
|
212
278
|
|
|
213
|
-
|
|
214
|
-
item instanceof GroupComponent ? item : (item
|
|
279
|
+
state.items.original = state.values.array.map(item =>
|
|
280
|
+
item instanceof GroupComponent ? item : (getValue(item, state.key) as Key),
|
|
215
281
|
);
|
|
216
282
|
|
|
217
|
-
values.
|
|
218
|
-
values.
|
|
219
|
-
item => item
|
|
283
|
+
state.values.mapped = toMap(
|
|
284
|
+
state.values.array.filter(item => !(item instanceof GroupComponent)) as PlainObject[],
|
|
285
|
+
item => getValue(item, state.key) as Key,
|
|
220
286
|
);
|
|
221
287
|
|
|
222
288
|
if (Object.keys(state.managers.filter.items).length > 0) {
|
|
@@ -229,11 +295,13 @@ export class DataManager {
|
|
|
229
295
|
}
|
|
230
296
|
|
|
231
297
|
set(data: PlainObject[]): void {
|
|
232
|
-
const {state
|
|
298
|
+
const {state} = this;
|
|
233
299
|
|
|
234
300
|
const array: Array<GroupComponent | PlainObject> = data.slice();
|
|
235
301
|
|
|
236
302
|
if (state.managers.group.enabled) {
|
|
303
|
+
const column = state.managers.column.get(state.managers.group.field);
|
|
304
|
+
|
|
237
305
|
const grouped = toRecord.arrays(data, state.managers.group.field) as Record<
|
|
238
306
|
string,
|
|
239
307
|
PlainObject[]
|
|
@@ -247,9 +315,10 @@ export class DataManager {
|
|
|
247
315
|
for (let index = 0; index < length; index += 1) {
|
|
248
316
|
const [value, items] = entries[index];
|
|
249
317
|
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
|
|
318
|
+
const group = new GroupComponent(
|
|
319
|
+
`${column?.options.title ?? state.managers.group.field}: ${value}`,
|
|
320
|
+
value,
|
|
321
|
+
);
|
|
253
322
|
|
|
254
323
|
group.total = items.length;
|
|
255
324
|
|
|
@@ -261,13 +330,13 @@ export class DataManager {
|
|
|
261
330
|
state.managers.group.set(groups);
|
|
262
331
|
}
|
|
263
332
|
|
|
264
|
-
values.
|
|
333
|
+
state.values.array = array;
|
|
265
334
|
|
|
266
335
|
this.render();
|
|
267
336
|
}
|
|
268
337
|
|
|
269
338
|
async synchronize(data: PlainObject[], remove?: boolean): Promise<void> {
|
|
270
|
-
const {state
|
|
339
|
+
const {state} = this;
|
|
271
340
|
|
|
272
341
|
const add: PlainObject[] = [];
|
|
273
342
|
const updated: PlainObject[] = [];
|
|
@@ -278,9 +347,9 @@ export class DataManager {
|
|
|
278
347
|
|
|
279
348
|
for (let index = 0; index < length; index += 1) {
|
|
280
349
|
const object = data[index];
|
|
281
|
-
const key = object
|
|
350
|
+
const key = getValue(object, state.key) as Key;
|
|
282
351
|
|
|
283
|
-
if (values.
|
|
352
|
+
if (state.values.mapped.has(key)) {
|
|
284
353
|
updated.push(object);
|
|
285
354
|
} else {
|
|
286
355
|
add.push(object);
|
|
@@ -294,7 +363,7 @@ export class DataManager {
|
|
|
294
363
|
}
|
|
295
364
|
|
|
296
365
|
if (remove ?? false) {
|
|
297
|
-
const toRemove =
|
|
366
|
+
const toRemove = state.items.original.filter(
|
|
298
367
|
key => !(key instanceof GroupComponent) && !keys.has(key),
|
|
299
368
|
) as Key[];
|
|
300
369
|
|
|
@@ -315,17 +384,18 @@ export class DataManager {
|
|
|
315
384
|
}
|
|
316
385
|
|
|
317
386
|
async update(data: PlainObject[]): Promise<void> {
|
|
318
|
-
const {state
|
|
387
|
+
const {state} = this;
|
|
319
388
|
|
|
320
389
|
const {length} = data;
|
|
321
390
|
|
|
322
391
|
for (let index = 0; index < length; index += 1) {
|
|
323
392
|
const object = data[index];
|
|
324
|
-
|
|
325
|
-
const
|
|
393
|
+
|
|
394
|
+
const key = getValue(object, state.key) as Key;
|
|
395
|
+
const value = state.values.mapped.get(key);
|
|
326
396
|
|
|
327
397
|
if (value != null) {
|
|
328
|
-
values.
|
|
398
|
+
state.values.mapped.set(key, {...value, ...object} as PlainObject);
|
|
329
399
|
|
|
330
400
|
state.managers.row.update(key);
|
|
331
401
|
}
|
|
@@ -25,7 +25,7 @@ export class EventManager {
|
|
|
25
25
|
|
|
26
26
|
function onClick(event: MouseEvent): void {
|
|
27
27
|
const target = findAncestor(event, '[data-event]');
|
|
28
|
-
const table = findAncestor(event, '.
|
|
28
|
+
const table = findAncestor(event, '.tabela__table');
|
|
29
29
|
|
|
30
30
|
if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) {
|
|
31
31
|
return;
|
|
@@ -44,7 +44,7 @@ function onClick(event: MouseEvent): void {
|
|
|
44
44
|
manager.state.managers.group.handle(target);
|
|
45
45
|
break;
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
case 'heading':
|
|
48
48
|
manager.onSort(event, target);
|
|
49
49
|
break;
|
|
50
50
|
|
|
@@ -59,7 +59,7 @@ function onClick(event: MouseEvent): void {
|
|
|
59
59
|
|
|
60
60
|
function onKeydown(event: KeyboardEvent): void {
|
|
61
61
|
const target = findAncestor(event, '[data-event]');
|
|
62
|
-
const table = findAncestor(event, '.
|
|
62
|
+
const table = findAncestor(event, '.tabela__table');
|
|
63
63
|
|
|
64
64
|
if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) {
|
|
65
65
|
return;
|
|
@@ -71,16 +71,15 @@ function onKeydown(event: KeyboardEvent): void {
|
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
if (event.key === ' ') {
|
|
75
|
+
event.preventDefault();
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
case 'body':
|
|
78
|
-
manager.state.managers.navigation.handle(event);
|
|
79
|
-
break;
|
|
77
|
+
// TODO: it's on the way
|
|
80
78
|
|
|
81
|
-
|
|
82
|
-
break;
|
|
79
|
+
return;
|
|
83
80
|
}
|
|
81
|
+
|
|
82
|
+
manager.state.managers.navigation.handle(event);
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
const mapped = new WeakMap<HTMLElement, EventManager>();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {Key} from '@oscarpalmer/atoms/models';
|
|
2
1
|
import {getNumber} from '@oscarpalmer/atoms/number';
|
|
3
2
|
import {getString} from '@oscarpalmer/atoms/string';
|
|
4
3
|
import {endsWith, includes, startsWith} from '@oscarpalmer/atoms/string/match';
|
|
5
4
|
import {equal} from '@oscarpalmer/atoms/value/equal';
|
|
5
|
+
import {GroupComponent} from '../components/group.component';
|
|
6
|
+
import type {DataItem} from '../models/data.model';
|
|
6
7
|
import type {TabelaFilter, TabelaFilterComparison, TabelaFilterItem} from '../models/filter.model';
|
|
7
8
|
import type {State} from '../models/tabela.model';
|
|
8
|
-
import {GroupComponent} from '../components/group.component';
|
|
9
9
|
|
|
10
10
|
export class FilterManager {
|
|
11
11
|
handlers = Object.freeze({
|
|
@@ -25,7 +25,7 @@ export class FilterManager {
|
|
|
25
25
|
} else {
|
|
26
26
|
const index = this.items[item.field].findIndex(existing => equal(existing, item));
|
|
27
27
|
|
|
28
|
-
if (index
|
|
28
|
+
if (index > -1) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -52,21 +52,21 @@ export class FilterManager {
|
|
|
52
52
|
filter(): void {
|
|
53
53
|
const {state} = this;
|
|
54
54
|
|
|
55
|
-
const filtered:
|
|
55
|
+
const filtered: DataItem[] = [];
|
|
56
56
|
const filters = Object.entries(this.items);
|
|
57
57
|
|
|
58
|
-
const
|
|
58
|
+
const itemsLength = state.managers.data.state.items.original.length;
|
|
59
59
|
|
|
60
|
-
rowLoop: for (let
|
|
61
|
-
const
|
|
60
|
+
rowLoop: for (let itemIndex = 0; itemIndex < itemsLength; itemIndex += 1) {
|
|
61
|
+
const item = state.managers.data.state.items.original[itemIndex];
|
|
62
62
|
|
|
63
|
-
if (
|
|
64
|
-
filtered.push(
|
|
63
|
+
if (item instanceof GroupComponent) {
|
|
64
|
+
filtered.push(item);
|
|
65
65
|
|
|
66
66
|
continue;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
const row = state.managers.data.values.
|
|
69
|
+
const row = state.managers.data.state.values.mapped.get(item);
|
|
70
70
|
|
|
71
71
|
if (row == null) {
|
|
72
72
|
continue;
|
|
@@ -88,10 +88,10 @@ export class FilterManager {
|
|
|
88
88
|
continue rowLoop;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
filtered.push(
|
|
91
|
+
filtered.push(item);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
state.managers.data.
|
|
94
|
+
state.managers.data.state.items.active = filtered;
|
|
95
95
|
|
|
96
96
|
if (state.managers.sort.items.length > 0) {
|
|
97
97
|
state.managers.sort.sort();
|
|
@@ -108,6 +108,17 @@ export class FilterManager {
|
|
|
108
108
|
|
|
109
109
|
const keyed: Record<string, TabelaFilterItem[]> = {};
|
|
110
110
|
|
|
111
|
+
const filters = Object.keys(this.items);
|
|
112
|
+
const {length} = filters;
|
|
113
|
+
|
|
114
|
+
for (let index = 0; index < length; index += 1) {
|
|
115
|
+
const field = filters[index];
|
|
116
|
+
|
|
117
|
+
if (field !== value) {
|
|
118
|
+
keyed[field] = this.items[field];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
111
122
|
this.items = keyed;
|
|
112
123
|
} else {
|
|
113
124
|
const {field} = value;
|