@oscarpalmer/tabela 0.8.0 → 0.9.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/managers/column.manager.js +6 -1
- package/dist/managers/data.manager.js +5 -3
- package/dist/managers/event.manager.js +1 -1
- package/dist/managers/filter.manager.js +92 -0
- package/dist/managers/row.manager.js +9 -2
- package/dist/managers/sort.manager.js +17 -6
- package/dist/managers/virtualization.manager.js +2 -0
- package/dist/models/filter.model.js +0 -0
- package/dist/tabela.full.js +623 -13
- package/dist/tabela.js +8 -0
- package/package.json +1 -1
- package/src/managers/column.manager.ts +8 -0
- package/src/managers/data.manager.ts +8 -4
- package/src/managers/event.manager.ts +2 -2
- package/src/managers/filter.manager.ts +154 -0
- package/src/managers/row.manager.ts +16 -2
- package/src/managers/sort.manager.ts +35 -16
- package/src/managers/virtualization.manager.ts +4 -1
- package/src/models/filter.model.ts +17 -0
- package/src/models/sort.model.ts +1 -1
- package/src/models/tabela.model.ts +11 -0
- package/src/tabela.ts +16 -1
- package/types/managers/data.manager.d.ts +1 -1
- package/types/managers/filter.manager.d.ts +19 -0
- package/types/managers/sort.manager.d.ts +5 -2
- package/types/managers/virtualization.manager.d.ts +1 -1
- package/types/models/filter.model.d.ts +6 -0
- package/types/models/sort.model.d.ts +1 -1
- package/types/models/tabela.model.d.ts +10 -0
- package/types/tabela.d.ts +2 -1
|
@@ -7,6 +7,8 @@ var ColumnManager = class {
|
|
|
7
7
|
this.set(columns);
|
|
8
8
|
}
|
|
9
9
|
destroy() {
|
|
10
|
+
const { length } = this.items;
|
|
11
|
+
for (let index = 0; index < length; index += 1) this.items[index].destroy();
|
|
10
12
|
this.items.length = 0;
|
|
11
13
|
}
|
|
12
14
|
remove(value) {
|
|
@@ -16,7 +18,10 @@ var ColumnManager = class {
|
|
|
16
18
|
if (length === 0) return;
|
|
17
19
|
for (let fieldIndex = 0; fieldIndex < length; fieldIndex += 1) {
|
|
18
20
|
const itemIndex = items.findIndex((component) => component.options.field === fields[fieldIndex]);
|
|
19
|
-
if (itemIndex > -1)
|
|
21
|
+
if (itemIndex > -1) {
|
|
22
|
+
items[itemIndex].destroy();
|
|
23
|
+
items.splice(itemIndex, 1);
|
|
24
|
+
}
|
|
20
25
|
}
|
|
21
26
|
components.header.update(items);
|
|
22
27
|
components.footer.update(items);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { sort } from "@oscarpalmer/atoms/array";
|
|
1
|
+
import { push, sort } from "@oscarpalmer/atoms/array";
|
|
2
2
|
import { toMap } from "@oscarpalmer/atoms/array/to-map";
|
|
3
3
|
import { isPlainObject } from "@oscarpalmer/atoms/is";
|
|
4
4
|
var DataManager = class {
|
|
@@ -27,7 +27,7 @@ var DataManager = class {
|
|
|
27
27
|
}
|
|
28
28
|
async add(data, render) {
|
|
29
29
|
const { field, values } = this;
|
|
30
|
-
values.objects.array
|
|
30
|
+
push(values.objects.array, data);
|
|
31
31
|
values.objects.mapped = toMap(values.objects.array, field);
|
|
32
32
|
if (render) this.render();
|
|
33
33
|
}
|
|
@@ -40,6 +40,7 @@ var DataManager = class {
|
|
|
40
40
|
values.keys.active = void 0;
|
|
41
41
|
values.keys.original.length = 0;
|
|
42
42
|
values.objects.array.length = 0;
|
|
43
|
+
this.handlers = void 0;
|
|
43
44
|
}
|
|
44
45
|
get(active) {
|
|
45
46
|
const { values } = this;
|
|
@@ -63,7 +64,8 @@ var DataManager = class {
|
|
|
63
64
|
render() {
|
|
64
65
|
const { field, managers, values } = this;
|
|
65
66
|
values.keys.original = sort(values.objects.array.map((item) => item[field]));
|
|
66
|
-
if (managers.
|
|
67
|
+
if (Object.keys(managers.filter.items).length > 0) managers.filter.filter();
|
|
68
|
+
else if (managers.sort.items.length > 0) managers.sort.sort();
|
|
67
69
|
else managers.virtualization.update(true);
|
|
68
70
|
}
|
|
69
71
|
set(data) {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { getNumber } from "@oscarpalmer/atoms/number";
|
|
2
|
+
import { getString } from "@oscarpalmer/atoms/string";
|
|
3
|
+
import { endsWith, includes, startsWith } from "@oscarpalmer/atoms/string/match";
|
|
4
|
+
import { equal } from "@oscarpalmer/atoms/value/equal";
|
|
5
|
+
var FilterManager = class {
|
|
6
|
+
handlers = Object.freeze({
|
|
7
|
+
add: (item) => this.add(item),
|
|
8
|
+
clear: () => this.clear(),
|
|
9
|
+
remove: (value) => this.remove(value),
|
|
10
|
+
set: (items) => this.set(items)
|
|
11
|
+
});
|
|
12
|
+
items = {};
|
|
13
|
+
constructor(managers) {
|
|
14
|
+
this.managers = managers;
|
|
15
|
+
}
|
|
16
|
+
add(item) {
|
|
17
|
+
if (this.items[item.field] == null) this.items[item.field] = [];
|
|
18
|
+
else if (this.items[item.field].findIndex((existing) => equal(existing, item)) !== -1) return;
|
|
19
|
+
this.items[item.field].push(item);
|
|
20
|
+
this.filter();
|
|
21
|
+
}
|
|
22
|
+
clear() {
|
|
23
|
+
if (Object.keys(this.items).length > 0) {
|
|
24
|
+
this.items = {};
|
|
25
|
+
this.filter();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
destroy() {
|
|
29
|
+
this.handlers = void 0;
|
|
30
|
+
this.items = {};
|
|
31
|
+
}
|
|
32
|
+
filter() {
|
|
33
|
+
const { managers } = this;
|
|
34
|
+
const filtered = [];
|
|
35
|
+
const filters = Object.entries(this.items);
|
|
36
|
+
const keysLength = managers.data.values.keys.original.length;
|
|
37
|
+
rowLoop: for (let keyIndex = 0; keyIndex < keysLength; keyIndex += 1) {
|
|
38
|
+
const key = managers.data.values.keys.original[keyIndex];
|
|
39
|
+
const row = managers.data.values.objects.mapped.get(key);
|
|
40
|
+
if (row == null) continue;
|
|
41
|
+
filterLoop: for (let filterIndex = 0; filterIndex < filters.length; filterIndex += 1) {
|
|
42
|
+
const [field, items] = filters[filterIndex];
|
|
43
|
+
const value = row[field];
|
|
44
|
+
for (let itemIndex = 0; itemIndex < items.length; itemIndex += 1) {
|
|
45
|
+
const filter = items[itemIndex];
|
|
46
|
+
if (comparators[filter.comparison](value, filter.value)) continue filterLoop;
|
|
47
|
+
}
|
|
48
|
+
continue rowLoop;
|
|
49
|
+
}
|
|
50
|
+
filtered.push(key);
|
|
51
|
+
}
|
|
52
|
+
managers.data.values.keys.active = filtered;
|
|
53
|
+
if (managers.sort.items.length > 0) managers.sort.sort();
|
|
54
|
+
else managers.virtualization.update(true, true);
|
|
55
|
+
}
|
|
56
|
+
remove(value) {
|
|
57
|
+
if (typeof value === "string") {
|
|
58
|
+
if (this.items[value] == null) return;
|
|
59
|
+
this.items = {};
|
|
60
|
+
} else {
|
|
61
|
+
const { field } = value;
|
|
62
|
+
if (this.items[field] == null) return;
|
|
63
|
+
if (this.items[field].findIndex((item) => equal(item, value)) === -1) return;
|
|
64
|
+
}
|
|
65
|
+
this.filter();
|
|
66
|
+
}
|
|
67
|
+
set(items) {
|
|
68
|
+
const keyed = {};
|
|
69
|
+
const { length } = items;
|
|
70
|
+
for (let index = 0; index < length; index += 1) {
|
|
71
|
+
const item = items[index];
|
|
72
|
+
keyed[item.field] ??= [];
|
|
73
|
+
keyed[item.field].push(item);
|
|
74
|
+
}
|
|
75
|
+
this.items = keyed;
|
|
76
|
+
this.filter();
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var comparators = {
|
|
80
|
+
contains: (row, filter) => includes(getString(row), getString(filter), true),
|
|
81
|
+
"ends-with": (row, filter) => endsWith(getString(row), getString(filter), true),
|
|
82
|
+
equals: (row, filter) => equalizer(row, filter),
|
|
83
|
+
"greater-than": (row, filter) => getNumber(row) > getNumber(filter),
|
|
84
|
+
"greater-than-or-equal": (row, filter) => getNumber(row) >= getNumber(filter),
|
|
85
|
+
"less-than": (row, filter) => getNumber(row) < getNumber(filter),
|
|
86
|
+
"less-than-or-equal": (row, filter) => getNumber(row) <= getNumber(filter),
|
|
87
|
+
"not-contains": (row, filter) => !includes(getString(row), getString(filter), true),
|
|
88
|
+
"not-equals": (row, filter) => !equalizer(row, filter),
|
|
89
|
+
"starts-with": (row, filter) => startsWith(getString(row), getString(filter), true)
|
|
90
|
+
};
|
|
91
|
+
var equalizer = equal.initialize({ ignoreCase: true });
|
|
92
|
+
export { FilterManager };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RowComponent, renderRow } from "../components/row.component.js";
|
|
1
|
+
import { RowComponent, removeRow, renderRow } from "../components/row.component.js";
|
|
2
2
|
var RowManager = class {
|
|
3
3
|
components = /* @__PURE__ */ new Map();
|
|
4
4
|
height;
|
|
@@ -7,6 +7,9 @@ var RowManager = class {
|
|
|
7
7
|
this.height = rowHeight;
|
|
8
8
|
}
|
|
9
9
|
destroy() {
|
|
10
|
+
const components = [...this.components.values()];
|
|
11
|
+
const { length } = components;
|
|
12
|
+
for (let index = 0; index < length; index += 1) removeRow(this.managers.virtualization.pool, components[index]);
|
|
10
13
|
this.components.clear();
|
|
11
14
|
}
|
|
12
15
|
get(key) {
|
|
@@ -21,7 +24,11 @@ var RowManager = class {
|
|
|
21
24
|
return this.components.has(key);
|
|
22
25
|
}
|
|
23
26
|
remove(key) {
|
|
24
|
-
this.components.
|
|
27
|
+
const row = this.components.get(key);
|
|
28
|
+
if (row != null) {
|
|
29
|
+
removeRow(this.managers.virtualization.pool, row);
|
|
30
|
+
this.components.delete(key);
|
|
31
|
+
}
|
|
25
32
|
}
|
|
26
33
|
update(key) {
|
|
27
34
|
const row = this.components.get(key);
|
|
@@ -23,13 +23,19 @@ var SortManager = class {
|
|
|
23
23
|
addOrSet(event, field) {
|
|
24
24
|
if (event.ctrlKey || event.metaKey) this.add(field);
|
|
25
25
|
else this.set([{
|
|
26
|
-
|
|
26
|
+
field,
|
|
27
27
|
direction: "ascending"
|
|
28
28
|
}]);
|
|
29
29
|
}
|
|
30
30
|
clear() {
|
|
31
|
+
if (this.items.length > 0) {
|
|
32
|
+
this.items.length = 0;
|
|
33
|
+
this.sort();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
destroy() {
|
|
37
|
+
this.handlers = void 0;
|
|
31
38
|
this.items.length = 0;
|
|
32
|
-
this.sort();
|
|
33
39
|
}
|
|
34
40
|
flip(field) {
|
|
35
41
|
const item = this.items.find((item) => item.key === field);
|
|
@@ -49,14 +55,17 @@ var SortManager = class {
|
|
|
49
55
|
else this.clear();
|
|
50
56
|
}
|
|
51
57
|
set(items) {
|
|
52
|
-
this.items.splice(0, this.items.length, ...items)
|
|
58
|
+
this.items.splice(0, this.items.length, ...items.map((item) => ({
|
|
59
|
+
key: item.field,
|
|
60
|
+
direction: item.direction
|
|
61
|
+
})));
|
|
53
62
|
this.sort();
|
|
54
63
|
}
|
|
55
64
|
sort() {
|
|
56
65
|
const { items, managers } = this;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
const { length } = managers.column.items;
|
|
67
|
+
for (let index = 0; index < length; index += 1) {
|
|
68
|
+
const column = managers.column.items[index];
|
|
60
69
|
const sorterIndex = items.findIndex((item) => item.key === column.options.field);
|
|
61
70
|
const sorterItem = items[sorterIndex];
|
|
62
71
|
setAttributes(column.elements.wrapper, {
|
|
@@ -65,6 +74,8 @@ var SortManager = class {
|
|
|
65
74
|
});
|
|
66
75
|
setAttribute(column.elements.sorter, "data-sort-position", sorterIndex > -1 && items.length > 1 ? sorterIndex + 1 : void 0);
|
|
67
76
|
}
|
|
77
|
+
managers.data.values.keys.active = items.length === 0 ? void 0 : sort(managers.data.values.keys.active?.map((key) => managers.data.values.objects.mapped.get(key)) ?? managers.data.values.objects.array, items).map((row) => row[managers.data.field]);
|
|
78
|
+
managers.virtualization.update(true, true);
|
|
68
79
|
}
|
|
69
80
|
toggle(event, field, direction) {
|
|
70
81
|
switch (direction) {
|
|
File without changes
|