@oscarpalmer/tabela 0.9.0 → 0.11.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 (60) hide show
  1. package/dist/components/body.component.js +3 -15
  2. package/dist/components/footer.component.js +3 -3
  3. package/dist/components/header.component.js +2 -2
  4. package/dist/components/row.component.js +19 -7
  5. package/dist/helpers/dom.helpers.js +5 -10
  6. package/dist/helpers/misc.helpers.js +7 -0
  7. package/dist/helpers/style.helper.js +6 -0
  8. package/dist/managers/column.manager.js +10 -9
  9. package/dist/managers/data.manager.js +26 -22
  10. package/dist/managers/event.manager.js +39 -19
  11. package/dist/managers/filter.manager.js +11 -10
  12. package/dist/managers/navigation.manager.js +73 -0
  13. package/dist/managers/render.manager.js +110 -0
  14. package/dist/managers/row.manager.js +7 -7
  15. package/dist/managers/selection.manager.js +189 -0
  16. package/dist/managers/sort.manager.js +9 -8
  17. package/dist/tabela.full.js +1096 -433
  18. package/dist/tabela.js +34 -11
  19. package/package.json +1 -1
  20. package/src/components/body.component.ts +5 -20
  21. package/src/components/footer.component.ts +3 -3
  22. package/src/components/header.component.ts +2 -2
  23. package/src/components/row.component.ts +30 -10
  24. package/src/helpers/dom.helpers.ts +3 -10
  25. package/src/helpers/misc.helpers.ts +15 -0
  26. package/src/helpers/style.helper.ts +6 -0
  27. package/src/managers/column.manager.ts +12 -14
  28. package/src/managers/data.manager.ts +31 -27
  29. package/src/managers/event.manager.ts +67 -37
  30. package/src/managers/filter.manager.ts +12 -11
  31. package/src/managers/navigation.manager.ts +145 -0
  32. package/src/managers/render.manager.ts +184 -0
  33. package/src/managers/row.manager.ts +9 -14
  34. package/src/managers/selection.manager.ts +332 -0
  35. package/src/managers/sort.manager.ts +14 -14
  36. package/src/models/render.model.ts +16 -0
  37. package/src/models/tabela.model.ts +23 -2
  38. package/src/tabela.ts +42 -10
  39. package/types/components/row.component.d.ts +4 -4
  40. package/types/helpers/dom.helpers.d.ts +1 -1
  41. package/types/helpers/misc.helpers.d.ts +2 -0
  42. package/types/helpers/style.helper.d.ts +1 -0
  43. package/types/managers/column.manager.d.ts +4 -5
  44. package/types/managers/data.manager.d.ts +5 -6
  45. package/types/managers/event.manager.d.ts +3 -6
  46. package/types/managers/filter.manager.d.ts +3 -3
  47. package/types/managers/navigation.manager.d.ts +10 -0
  48. package/types/managers/render.manager.d.ts +16 -0
  49. package/types/managers/row.manager.d.ts +4 -5
  50. package/types/managers/selection.manager.d.ts +18 -0
  51. package/types/managers/sort.manager.d.ts +4 -4
  52. package/types/models/render.model.d.ts +13 -0
  53. package/types/models/tabela.model.d.ts +21 -2
  54. package/types/tabela.d.ts +2 -1
  55. package/dist/managers/virtualization.manager.js +0 -101
  56. package/src/managers/virtualization.manager.ts +0 -176
  57. package/src/models/virtualization.model.ts +0 -14
  58. package/types/managers/virtualization.manager.d.ts +0 -18
  59. package/types/models/virtualization.model.d.ts +0 -12
  60. /package/dist/models/{virtualization.model.js → render.model.js} +0 -0
@@ -0,0 +1,189 @@
1
+ import { createElement } from "../helpers/dom.helpers.js";
2
+ import { getKey } from "../helpers/misc.helpers.js";
3
+ import { dragStyling } from "../helpers/style.helper.js";
4
+ import { setAttribute } from "@oscarpalmer/toretto/attribute";
5
+ import { isKey } from "@oscarpalmer/atoms/is";
6
+ import { getPosition, on } from "@oscarpalmer/toretto/event";
7
+ import { findAncestor } from "@oscarpalmer/toretto";
8
+ var SelectionManager = class {
9
+ handlers = Object.freeze({
10
+ clear: () => this.clear(),
11
+ deselect: (keys) => this.deselect(keys),
12
+ select: (keys) => this.select(keys),
13
+ toggle: () => this.toggle()
14
+ });
15
+ items = /* @__PURE__ */ new Set();
16
+ last;
17
+ constructor(state) {
18
+ this.state = state;
19
+ mapped.set(state.element, this);
20
+ }
21
+ clear() {
22
+ if (this.items.size === 0) return;
23
+ const removed = [...this.items];
24
+ this.items.clear();
25
+ this.update(removed);
26
+ }
27
+ deselect(keys) {
28
+ const { length } = keys;
29
+ const removed = [];
30
+ for (let index = 0; index < length; index += 1) {
31
+ const key = keys[index];
32
+ if (this.items.delete(key)) removed.push(key);
33
+ }
34
+ if (removed.length > 0) this.update(removed);
35
+ }
36
+ destroy() {
37
+ mapped.delete(this.state.element);
38
+ this.handlers = void 0;
39
+ this.items = void 0;
40
+ this.last = void 0;
41
+ this.state = void 0;
42
+ }
43
+ handle(event, target) {
44
+ const key = getKey(target.getAttribute("data-key"));
45
+ if (key == null) return;
46
+ const { items } = this;
47
+ if (event.shiftKey) {
48
+ if (this.last == null) this.state.managers.navigation.setActive(key, false);
49
+ else this.range(this.last, key);
50
+ return;
51
+ }
52
+ this.last = key;
53
+ this.state.managers.navigation.setActive(key, false);
54
+ if (event.ctrlKey || event.metaKey) {
55
+ if (items.has(key)) this.deselect([key]);
56
+ else this.select([key]);
57
+ return;
58
+ }
59
+ this.set([key]);
60
+ }
61
+ range(from, to) {
62
+ const { state } = this;
63
+ const keyed = isKey(from) && isKey(to);
64
+ const fromKey = keyed ? from : getKey(from.getAttribute("data-key"));
65
+ const toKey = keyed ? to : getKey(to.getAttribute("data-key"));
66
+ if (fromKey === toKey) return;
67
+ const keys = state.managers.data.values.keys.active ?? state.managers.data.values.keys.original;
68
+ const fromIndex = state.managers.data.getIndex(fromKey);
69
+ const toIndex = state.managers.data.getIndex(toKey);
70
+ if (fromIndex === -1 || toIndex === -1) return;
71
+ const [start, end] = fromIndex < toIndex ? [fromIndex, toIndex] : [toIndex, fromIndex];
72
+ const selected = [];
73
+ for (let index = start; index <= end; index += 1) selected.push(keys[index]);
74
+ if (keyed) this.select(selected);
75
+ else this.set(selected);
76
+ this.last = toKey;
77
+ this.state.managers.navigation.setActive(toKey, false);
78
+ }
79
+ select(keys) {
80
+ const { length } = keys;
81
+ let update = false;
82
+ for (let index = 0; index < length; index += 1) {
83
+ const key = keys[index];
84
+ if (!this.items.has(key)) {
85
+ this.items.add(key);
86
+ update = true;
87
+ }
88
+ }
89
+ if (update) this.update([]);
90
+ }
91
+ set(keys) {
92
+ const { items } = this;
93
+ const removed = [...items].filter((key) => !keys.includes(key));
94
+ const added = keys.filter((key) => !items.has(key));
95
+ if (removed.length === 0 && added.length === 0) return;
96
+ this.items = new Set(keys);
97
+ this.update(removed);
98
+ }
99
+ toggle() {
100
+ const { items, state } = this;
101
+ const all = state.managers.data.values.keys.active ?? state.managers.data.values.keys.original;
102
+ if (items.size === all.length) this.clear();
103
+ else this.select(all);
104
+ }
105
+ update(removed) {
106
+ const items = [...removed.map((key) => ({
107
+ key,
108
+ removed: true
109
+ })), ...[...this.items].map((key) => ({
110
+ key,
111
+ removed: false
112
+ }))];
113
+ const { length } = items;
114
+ for (let index = 0; index < length; index += 1) {
115
+ const { key, removed } = items[index];
116
+ const row = this.state.managers.row.get(key);
117
+ if (row == null || row.element == null) continue;
118
+ setAttribute(row.element, "aria-selected", String(!removed));
119
+ if (removed) row.element.classList.remove("tabela__row--selected");
120
+ else row.element.classList.add("tabela__row--selected");
121
+ }
122
+ }
123
+ };
124
+ function getPlaceholder() {
125
+ placeholder ??= createElement("div", { className: "tabela__selection--placeholder" }, {}, {});
126
+ return placeholder;
127
+ }
128
+ function onMouseDown(event) {
129
+ if (shifted) {
130
+ const row = findAncestor(event.target, ".tabela__row--body");
131
+ if (!(row instanceof HTMLElement)) return;
132
+ startElement = row;
133
+ startPosition = getPosition(event);
134
+ dragStyling.set();
135
+ }
136
+ }
137
+ function onMouseMove(event) {
138
+ if (startElement == null) return;
139
+ const currentPosition = getPosition(event);
140
+ if (currentPosition == null || startPosition == null) return;
141
+ const element = getPlaceholder();
142
+ if (element.parentElement == null) document.body.append(element);
143
+ const { x: cX, y: cY } = currentPosition;
144
+ const { x: sX, y: sY } = startPosition;
145
+ const top = Math.min(cY, sY);
146
+ const left = Math.min(cX, sX);
147
+ const width = Math.abs(cX - sX);
148
+ const height = Math.abs(cY - sY);
149
+ element.style.inset = `${top}px ${window.innerWidth - left - width}px ${window.innerHeight - top - height}px ${left}px`;
150
+ }
151
+ function onMouseUp(event) {
152
+ if (startElement == null) return;
153
+ if (!event.shiftKey) {
154
+ shifted = false;
155
+ dragStyling.remove();
156
+ }
157
+ getPlaceholder().remove();
158
+ const row = findAncestor(event.target, ".tabela__row--body");
159
+ if (row instanceof HTMLElement) {
160
+ endElement = row;
161
+ const endTable = findAncestor(endElement, ".tabela");
162
+ const startTable = findAncestor(startElement, ".tabela");
163
+ if (startTable != null && startTable === endTable) mapped.get(startTable)?.range(startElement, endElement);
164
+ }
165
+ endElement = void 0;
166
+ startElement = void 0;
167
+ startPosition = void 0;
168
+ }
169
+ function onShift(event, value) {
170
+ if (event.key === "Shift") shifted = value;
171
+ }
172
+ function onShiftDown(event) {
173
+ onShift(event, true);
174
+ }
175
+ function onShiftUp(event) {
176
+ onShift(event, false);
177
+ }
178
+ var mapped = /* @__PURE__ */ new WeakMap();
179
+ var shifted = false;
180
+ var endElement;
181
+ var placeholder;
182
+ var startPosition;
183
+ var startElement;
184
+ on(document, "keydown", onShiftDown);
185
+ on(document, "keyup", onShiftUp);
186
+ on(document, "mousedown", onMouseDown);
187
+ on(document, "mousemove", onMouseMove);
188
+ on(document, "mouseup", onMouseUp);
189
+ export { SelectionManager };
@@ -9,8 +9,8 @@ var SortManager = class {
9
9
  set: (items) => this.set(items)
10
10
  });
11
11
  items = [];
12
- constructor(managers) {
13
- this.managers = managers;
12
+ constructor(state) {
13
+ this.state = state;
14
14
  }
15
15
  add(field, direction) {
16
16
  if (this.items.findIndex((item) => item.key === field) > -1) return;
@@ -35,7 +35,8 @@ var SortManager = class {
35
35
  }
36
36
  destroy() {
37
37
  this.handlers = void 0;
38
- this.items.length = 0;
38
+ this.items = void 0;
39
+ this.state = void 0;
39
40
  }
40
41
  flip(field) {
41
42
  const item = this.items.find((item) => item.key === field);
@@ -62,10 +63,10 @@ var SortManager = class {
62
63
  this.sort();
63
64
  }
64
65
  sort() {
65
- const { items, managers } = this;
66
- const { length } = managers.column.items;
66
+ const { items, state } = this;
67
+ const { length } = state.managers.column.items;
67
68
  for (let index = 0; index < length; index += 1) {
68
- const column = managers.column.items[index];
69
+ const column = state.managers.column.items[index];
69
70
  const sorterIndex = items.findIndex((item) => item.key === column.options.field);
70
71
  const sorterItem = items[sorterIndex];
71
72
  setAttributes(column.elements.wrapper, {
@@ -74,8 +75,8 @@ var SortManager = class {
74
75
  });
75
76
  setAttribute(column.elements.sorter, "data-sort-position", sorterIndex > -1 && items.length > 1 ? sorterIndex + 1 : void 0);
76
77
  }
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);
78
+ state.managers.data.values.keys.active = items.length === 0 ? void 0 : sort(state.managers.data.values.keys.active?.map((key) => state.managers.data.values.objects.mapped.get(key)) ?? state.managers.data.values.objects.array, items).map((row) => row[state.key]);
79
+ state.managers.render.update(true, true);
79
80
  }
80
81
  toggle(event, field, direction) {
81
82
  switch (direction) {