@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.
@@ -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) items.splice(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.push(...data);
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.sort.items.length > 0) managers.sort.sort();
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) {
@@ -4,7 +4,7 @@ var EventManager = class {
4
4
  listener;
5
5
  constructor(managers, element) {
6
6
  this.managers = managers;
7
- on(element, "click", (event) => {
7
+ this.listener = on(element, "click", (event) => {
8
8
  this.onClick(event);
9
9
  }, { passive: false });
10
10
  }
@@ -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.delete(key);
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
- key: field,
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
- managers.data.values.keys.active = items.length === 0 ? void 0 : sort(managers.data.values.objects.array, items).map((row) => row[managers.data.field]);
58
- managers.virtualization.update(true, true);
59
- for (const column of managers.column.items) {
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) {
@@ -49,6 +49,8 @@ var VirtualizationManager = class {
49
49
  }
50
50
  this.pool.cells = {};
51
51
  this.pool.rows = [];
52
+ this.listener = void 0;
53
+ this.visible = void 0;
52
54
  }
53
55
  removeCells(fields) {
54
56
  const { length } = fields;
File without changes