@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.
Files changed (160) hide show
  1. package/dist/body.component-_VDOpJhV.d.mts +10 -0
  2. package/dist/body.model-2iwsovAV.d.mts +7 -0
  3. package/dist/column.component-Bx46r3JI.d.mts +16 -0
  4. package/dist/column.model-D-aw4EU4.d.mts +16 -0
  5. package/dist/components/body.component.d.mts +2 -0
  6. package/dist/components/{body.component.js → body.component.mjs} +6 -3
  7. package/dist/components/column.component.d.mts +2 -0
  8. package/dist/components/{column.component.js → column.component.mjs} +8 -5
  9. package/dist/components/footer.component.d.mts +2 -0
  10. package/dist/components/{footer.component.js → footer.component.mjs} +7 -4
  11. package/dist/components/group.component.d.mts +2 -0
  12. package/dist/components/group.component.mjs +51 -0
  13. package/dist/components/header.component.d.mts +2 -0
  14. package/dist/components/{header.component.js → header.component.mjs} +6 -3
  15. package/dist/components/row.component.d.mts +2 -0
  16. package/dist/components/{row.component.js → row.component.mjs} +11 -7
  17. package/dist/filter.model-7ukJrtil.d.mts +16 -0
  18. package/dist/footer.component-Curiab8j.d.mts +12 -0
  19. package/dist/footer.model-DhqoS6ds.d.mts +8 -0
  20. package/dist/group.component-Cq1YYbfJ.d.mts +285 -0
  21. package/dist/group.model-BsKFwHbt.d.mts +10 -0
  22. package/dist/header.component-BjjlpZIg.d.mts +12 -0
  23. package/dist/header.model-DN_KzUCV.d.mts +7 -0
  24. package/dist/helpers/dom.helpers.d.mts +12 -0
  25. package/dist/helpers/{dom.helpers.js → dom.helpers.mjs} +13 -9
  26. package/dist/helpers/misc.helpers.d.mts +6 -0
  27. package/dist/helpers/{misc.helpers.js → misc.helpers.mjs} +3 -1
  28. package/dist/helpers/style.helper.d.mts +6 -0
  29. package/dist/helpers/style.helper.mjs +8 -0
  30. package/dist/index.d.mts +7 -0
  31. package/dist/{index.js → index.mjs} +3 -1
  32. package/dist/managers/column.manager.d.mts +2 -0
  33. package/dist/managers/{column.manager.js → column.manager.mjs} +6 -1
  34. package/dist/managers/data.manager.d.mts +2 -0
  35. package/dist/managers/data.manager.mjs +222 -0
  36. package/dist/managers/event.manager.d.mts +2 -0
  37. package/dist/managers/{event.manager.js → event.manager.mjs} +9 -8
  38. package/dist/managers/filter.manager.d.mts +2 -0
  39. package/dist/managers/{filter.manager.js → filter.manager.mjs} +23 -14
  40. package/dist/managers/group.manager.d.mts +2 -0
  41. package/dist/managers/group.manager.mjs +73 -0
  42. package/dist/managers/navigation.manager.d.mts +2 -0
  43. package/dist/managers/{navigation.manager.js → navigation.manager.mjs} +27 -24
  44. package/dist/managers/render.manager.d.mts +2 -0
  45. package/dist/managers/{render.manager.js → render.manager.mjs} +35 -26
  46. package/dist/managers/row.manager.d.mts +2 -0
  47. package/dist/managers/{row.manager.js → row.manager.mjs} +18 -11
  48. package/dist/managers/selection.manager.d.mts +2 -0
  49. package/dist/managers/{selection.manager.js → selection.manager.mjs} +32 -28
  50. package/dist/managers/sort.manager.d.mts +2 -0
  51. package/dist/managers/{sort.manager.js → sort.manager.mjs} +12 -9
  52. package/dist/managers/style.manager.d.mts +2 -0
  53. package/dist/managers/style.manager.mjs +149 -0
  54. package/dist/models/body.model.d.mts +2 -0
  55. package/dist/models/body.model.mjs +1 -0
  56. package/dist/models/column.model.d.mts +2 -0
  57. package/dist/models/column.model.mjs +1 -0
  58. package/dist/models/data.model.d.mts +2 -0
  59. package/dist/models/data.model.mjs +1 -0
  60. package/dist/models/filter.model.d.mts +2 -0
  61. package/dist/models/filter.model.mjs +1 -0
  62. package/dist/models/footer.model.d.mts +2 -0
  63. package/dist/models/footer.model.mjs +1 -0
  64. package/dist/models/group.model.d.mts +2 -0
  65. package/dist/models/group.model.mjs +1 -0
  66. package/dist/models/header.model.d.mts +2 -0
  67. package/dist/models/header.model.mjs +1 -0
  68. package/dist/models/render.model.d.mts +2 -0
  69. package/dist/models/render.model.mjs +1 -0
  70. package/dist/models/selection.model.d.mts +2 -0
  71. package/dist/models/selection.model.mjs +1 -0
  72. package/dist/models/sort.model.d.mts +2 -0
  73. package/dist/models/sort.model.mjs +1 -0
  74. package/dist/models/style.model.d.mts +23 -0
  75. package/dist/models/style.model.mjs +23 -0
  76. package/dist/models/tabela.model.d.mts +2 -0
  77. package/dist/models/tabela.model.mjs +1 -0
  78. package/dist/models/tabela.options.d.mts +2 -0
  79. package/dist/models/tabela.options.mjs +1 -0
  80. package/dist/selection.model-rwQe9fco.d.mts +12 -0
  81. package/dist/sort.model-CauImaLu.d.mts +15 -0
  82. package/dist/tabela.d.mts +21 -0
  83. package/dist/{tabela.full.js → tabela.full.mjs} +1073 -756
  84. package/dist/tabela.mjs +126 -0
  85. package/dist/tabela.options-RkZvfptB.d.mts +14 -0
  86. package/package.json +45 -37
  87. package/src/components/body.component.ts +4 -3
  88. package/src/components/column.component.ts +13 -18
  89. package/src/components/footer.component.ts +8 -3
  90. package/src/components/group.component.ts +48 -6
  91. package/src/components/header.component.ts +3 -2
  92. package/src/components/row.component.ts +8 -6
  93. package/src/helpers/dom.helpers.ts +21 -19
  94. package/src/helpers/style.helper.ts +1 -1
  95. package/src/managers/column.manager.ts +4 -0
  96. package/src/managers/data.manager.ts +170 -100
  97. package/src/managers/event.manager.ts +9 -10
  98. package/src/managers/filter.manager.ts +23 -12
  99. package/src/managers/group.manager.ts +63 -11
  100. package/src/managers/navigation.manager.ts +23 -22
  101. package/src/managers/render.manager.ts +43 -29
  102. package/src/managers/row.manager.ts +21 -9
  103. package/src/managers/selection.manager.ts +28 -21
  104. package/src/managers/sort.manager.ts +22 -20
  105. package/src/managers/style.manager.ts +156 -0
  106. package/src/models/data.model.ts +11 -8
  107. package/src/models/group.model.ts +6 -2
  108. package/src/models/style.model.ts +39 -0
  109. package/src/models/tabela.model.ts +10 -8
  110. package/src/tabela.ts +65 -33
  111. package/dist/components/group.component.js +0 -28
  112. package/dist/helpers/style.helper.js +0 -6
  113. package/dist/managers/data.manager.js +0 -181
  114. package/dist/managers/group.manager.js +0 -46
  115. package/dist/models/body.model.js +0 -0
  116. package/dist/models/column.model.js +0 -0
  117. package/dist/models/data.model.js +0 -0
  118. package/dist/models/filter.model.js +0 -0
  119. package/dist/models/footer.model.js +0 -0
  120. package/dist/models/group.model.js +0 -0
  121. package/dist/models/header.model.js +0 -0
  122. package/dist/models/render.model.js +0 -0
  123. package/dist/models/selection.model.js +0 -0
  124. package/dist/models/sort.model.js +0 -0
  125. package/dist/models/tabela.model.js +0 -0
  126. package/dist/models/tabela.options.js +0 -0
  127. package/dist/tabela.js +0 -105
  128. package/types/components/body.component.d.ts +0 -6
  129. package/types/components/column.component.d.ts +0 -13
  130. package/types/components/footer.component.d.ts +0 -8
  131. package/types/components/group.component.d.ts +0 -14
  132. package/types/components/header.component.d.ts +0 -8
  133. package/types/components/row.component.d.ts +0 -11
  134. package/types/helpers/dom.helpers.d.ts +0 -10
  135. package/types/helpers/misc.helpers.d.ts +0 -2
  136. package/types/helpers/style.helper.d.ts +0 -1
  137. package/types/index.d.ts +0 -4
  138. package/types/managers/column.manager.d.ts +0 -12
  139. package/types/managers/data.manager.d.ts +0 -29
  140. package/types/managers/event.manager.d.ts +0 -7
  141. package/types/managers/filter.manager.d.ts +0 -19
  142. package/types/managers/group.manager.d.ts +0 -17
  143. package/types/managers/navigation.manager.d.ts +0 -10
  144. package/types/managers/render.manager.d.ts +0 -17
  145. package/types/managers/row.manager.d.ts +0 -13
  146. package/types/managers/selection.manager.d.ts +0 -24
  147. package/types/managers/sort.manager.d.ts +0 -28
  148. package/types/models/body.model.d.ts +0 -4
  149. package/types/models/column.model.d.ts +0 -13
  150. package/types/models/data.model.d.ts +0 -24
  151. package/types/models/filter.model.d.ts +0 -13
  152. package/types/models/footer.model.d.ts +0 -5
  153. package/types/models/group.model.d.ts +0 -4
  154. package/types/models/header.model.d.ts +0 -4
  155. package/types/models/render.model.d.ts +0 -13
  156. package/types/models/selection.model.d.ts +0 -8
  157. package/types/models/sort.model.d.ts +0 -12
  158. package/types/models/tabela.model.d.ts +0 -39
  159. package/types/models/tabela.options.d.ts +0 -10
  160. 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 type {DataValues, TabelaData} from '../models/data.model';
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 {isPlainObject} from '@oscarpalmer/atoms/is';
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
- values: DataValues = {
22
- keys: {
23
- original: [],
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.keys.length;
31
+ return this.items.length;
37
32
  }
38
33
 
39
- constructor(public state: State) {}
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, values} = this;
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[state.key] as Key;
58
+ const key = getValue(item, state.key) as Key;
50
59
 
51
- if (values.objects.mapped.has(key)) {
60
+ if (state.values.mapped.has(key)) {
52
61
  updates.push(item);
53
62
 
54
63
  continue;
55
64
  }
56
65
 
57
- values.objects.array.push(item);
58
- values.objects.mapped.set(key, item);
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 groupKey = item[state.managers.group.field] as unknown;
73
+ const groupValue = getValue(item, state.managers.group.field) as unknown;
65
74
 
66
- let group = state.managers.group.get(groupKey);
75
+ let group = state.managers.group.get(groupValue);
67
76
 
68
77
  if (group == null) {
69
- group = new GroupComponent(String(groupKey), String(groupKey), groupKey);
78
+ groupColumn ??= state.managers.column.get(state.managers.group.field);
70
79
 
71
- values.objects.array.push(group);
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.objects.array.length > 0) {
92
- this.set([]);
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 {values} = this;
118
+ const {state} = this;
98
119
 
99
- values.objects.mapped.clear();
120
+ state.values.mapped.clear();
100
121
 
101
- values.keys.active = undefined;
102
- values.keys.original.length = 0;
103
- values.objects.array.length = 0;
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 {values} = this;
131
+ const {state} = this;
112
132
 
113
133
  return (active ?? false)
114
134
  ? select(
115
- values.keys.active ?? [],
135
+ state.items.active ?? [],
116
136
  key => !(key instanceof GroupComponent),
117
- key => values.objects.mapped.get(key as Key)!,
137
+ key => state.values.mapped.get(key as Key)!,
118
138
  )
119
- : (values.objects.array.filter(item => !(item instanceof GroupComponent)) as PlainObject[]);
139
+ : (state.values.array.filter(item => !(item instanceof GroupComponent)) as PlainObject[]);
120
140
  }
121
141
 
122
- getIndex(key: Key): number {
123
- return this.keys.indexOf(key);
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, values} = this;
153
+ const {state} = this;
128
154
 
129
- const keys = items
130
- .map(value => (isPlainObject(value) ? value[state.key] : value) as Key)
131
- .filter(key => values.objects.mapped.has(key)) as Key[];
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 === 0) {
136
- return;
161
+ if (length > 0) {
162
+ return this.removeItems(keys, false, render === true);
137
163
  }
164
+ }
138
165
 
139
- for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
140
- const key = keys[keyIndex];
166
+ async removeItems(items: DataItem[], clear: boolean, render: boolean): Promise<void> {
167
+ const {state} = this;
141
168
 
142
- values.objects.mapped.delete(key);
169
+ if (clear) {
170
+ state.items.active = undefined;
171
+ state.items.original = [];
172
+ state.values.array = [];
143
173
 
144
- const arrayIndex = values.objects.array.findIndex(
145
- item => !(item instanceof GroupComponent) && item[state.key] === key,
146
- );
174
+ state.values.mapped.clear();
147
175
 
148
- let item: PlainObject | undefined;
176
+ state.managers.row.clear();
149
177
 
150
- if (arrayIndex > -1) {
151
- [item] = values.objects.array.splice(arrayIndex, 1) as PlainObject[];
178
+ if (state.managers.group.enabled) {
179
+ state.managers.group.clear();
152
180
  }
153
181
 
154
- values.keys.original.splice(values.keys.original.indexOf(key), 1);
182
+ return this.render();
183
+ }
155
184
 
156
- state.managers.row.remove(key);
185
+ const groups: GroupComponent[] = [];
157
186
 
158
- if (!state.managers.group.enabled || item == null) {
159
- continue;
160
- }
187
+ const chunked = chunk(items);
188
+ const chunkedLength = chunked.length;
161
189
 
162
- state.managers.group.collapsed.delete(key);
190
+ for (let chunkedIndex = 0; chunkedIndex < chunkedLength; chunkedIndex += 1) {
191
+ const chunk = chunked[chunkedIndex];
192
+ const chunkLength = chunk.length;
163
193
 
164
- const groupKey = item[state.managers.group.field] as unknown;
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
- const group = state.managers.group.get(groupKey);
198
+ let dataValue: PlainObject | undefined;
167
199
 
168
- if (group == null) {
169
- continue;
170
- }
200
+ [dataValue] = state.values.array.splice(dataIndex, 1) as PlainObject[];
171
201
 
172
- group.total -= 1;
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
- if (group.total > 0) {
175
- continue;
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
- const groupIndex = values.objects.array.findIndex(
179
- item => item instanceof GroupComponent && item.value === groupKey,
180
- );
230
+ if (groupIndex > -1) {
231
+ groups.splice(groupIndex, 1);
232
+ }
181
233
 
182
- if (groupIndex > -1) {
183
- values.objects.array.splice(groupIndex, 1);
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
- state.managers.group.remove(group);
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, values} = this;
261
+ const {state} = this;
196
262
 
197
263
  if (state.managers.group.enabled) {
198
- sortWithGroups(state, values.objects.array, [
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.objects.array as PlainObject[], [
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
- values.keys.original = values.objects.array.map(item =>
214
- item instanceof GroupComponent ? item : (item[state.key] as Key),
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.objects.mapped = toMap(
218
- values.objects.array.filter(item => !(item instanceof GroupComponent)) as PlainObject[],
219
- item => item[state.key] as Key,
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, values} = this;
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 key = String(value);
251
-
252
- const group = new GroupComponent(key, key, value);
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.objects.array = array;
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, values} = this;
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[state.key] as Key;
350
+ const key = getValue(object, state.key) as Key;
282
351
 
283
- if (values.objects.mapped.has(key)) {
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 = values.keys.original.filter(
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, values} = this;
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
- const key = object[state.key] as Key;
325
- const value = values.objects.mapped.get(key);
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.objects.mapped.set(key, {...value, ...object} as PlainObject);
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, '.tabela');
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
- case 'heading':
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, '.tabela');
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
- const type = target?.getAttribute('data-event');
74
+ if (event.key === ' ') {
75
+ event.preventDefault();
75
76
 
76
- switch (type) {
77
- case 'body':
78
- manager.state.managers.navigation.handle(event);
79
- break;
77
+ // TODO: it's on the way
80
78
 
81
- default:
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 !== -1) {
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: Array<GroupComponent | Key> = [];
55
+ const filtered: DataItem[] = [];
56
56
  const filters = Object.entries(this.items);
57
57
 
58
- const keysLength = state.managers.data.values.keys.original.length;
58
+ const itemsLength = state.managers.data.state.items.original.length;
59
59
 
60
- rowLoop: for (let keyIndex = 0; keyIndex < keysLength; keyIndex += 1) {
61
- const key = state.managers.data.values.keys.original[keyIndex];
60
+ rowLoop: for (let itemIndex = 0; itemIndex < itemsLength; itemIndex += 1) {
61
+ const item = state.managers.data.state.items.original[itemIndex];
62
62
 
63
- if (key instanceof GroupComponent) {
64
- filtered.push(key);
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.objects.mapped.get(key);
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(key);
91
+ filtered.push(item);
92
92
  }
93
93
 
94
- state.managers.data.values.keys.active = filtered;
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;