@oscarpalmer/tabela 0.11.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 (159) 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} +12 -9
  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} +14 -10
  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} +12 -8
  38. package/dist/managers/filter.manager.d.mts +2 -0
  39. package/dist/managers/{filter.manager.js → filter.manager.mjs} +25 -11
  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.mjs +144 -0
  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} +57 -48
  50. package/dist/managers/sort.manager.d.mts +2 -0
  51. package/dist/managers/{sort.manager.js → sort.manager.mjs} +32 -2
  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} +1407 -1124
  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 +19 -24
  89. package/src/components/footer.component.ts +8 -3
  90. package/src/components/group.component.ts +85 -0
  91. package/src/components/header.component.ts +3 -2
  92. package/src/components/row.component.ts +10 -8
  93. package/src/helpers/dom.helpers.ts +24 -20
  94. package/src/helpers/style.helper.ts +1 -1
  95. package/src/managers/column.manager.ts +8 -4
  96. package/src/managers/data.manager.ts +265 -61
  97. package/src/managers/event.manager.ts +14 -11
  98. package/src/managers/filter.manager.ts +38 -19
  99. package/src/managers/group.manager.ts +131 -0
  100. package/src/managers/navigation.manager.ts +25 -23
  101. package/src/managers/render.manager.ts +84 -32
  102. package/src/managers/row.manager.ts +23 -11
  103. package/src/managers/selection.manager.ts +68 -54
  104. package/src/managers/sort.manager.ts +81 -16
  105. package/src/managers/style.manager.ts +156 -0
  106. package/src/models/column.model.ts +2 -2
  107. package/src/models/data.model.ts +23 -9
  108. package/src/models/filter.model.ts +11 -3
  109. package/src/models/group.model.ts +8 -0
  110. package/src/models/render.model.ts +2 -2
  111. package/src/models/selection.model.ts +9 -0
  112. package/src/models/sort.model.ts +11 -3
  113. package/src/models/style.model.ts +39 -0
  114. package/src/models/tabela.model.ts +14 -46
  115. package/src/models/tabela.options.ts +3 -2
  116. package/src/tabela.ts +72 -41
  117. package/dist/helpers/style.helper.js +0 -6
  118. package/dist/managers/data.manager.js +0 -120
  119. package/dist/managers/render.manager.js +0 -110
  120. package/dist/models/body.model.js +0 -0
  121. package/dist/models/column.model.js +0 -0
  122. package/dist/models/data.model.js +0 -0
  123. package/dist/models/filter.model.js +0 -0
  124. package/dist/models/footer.model.js +0 -0
  125. package/dist/models/header.model.js +0 -0
  126. package/dist/models/render.model.js +0 -0
  127. package/dist/models/sort.model.js +0 -0
  128. package/dist/models/tabela.model.js +0 -0
  129. package/dist/models/tabela.options.js +0 -0
  130. package/dist/tabela.js +0 -102
  131. package/types/components/body.component.d.ts +0 -6
  132. package/types/components/column.component.d.ts +0 -13
  133. package/types/components/footer.component.d.ts +0 -8
  134. package/types/components/header.component.d.ts +0 -8
  135. package/types/components/row.component.d.ts +0 -11
  136. package/types/helpers/dom.helpers.d.ts +0 -10
  137. package/types/helpers/misc.helpers.d.ts +0 -2
  138. package/types/helpers/style.helper.d.ts +0 -1
  139. package/types/index.d.ts +0 -4
  140. package/types/managers/column.manager.d.ts +0 -12
  141. package/types/managers/data.manager.d.ts +0 -27
  142. package/types/managers/event.manager.d.ts +0 -7
  143. package/types/managers/filter.manager.d.ts +0 -19
  144. package/types/managers/navigation.manager.d.ts +0 -10
  145. package/types/managers/render.manager.d.ts +0 -16
  146. package/types/managers/row.manager.d.ts +0 -13
  147. package/types/managers/selection.manager.d.ts +0 -18
  148. package/types/managers/sort.manager.d.ts +0 -26
  149. package/types/models/body.model.d.ts +0 -4
  150. package/types/models/column.model.d.ts +0 -13
  151. package/types/models/data.model.d.ts +0 -14
  152. package/types/models/filter.model.d.ts +0 -6
  153. package/types/models/footer.model.d.ts +0 -5
  154. package/types/models/header.model.d.ts +0 -4
  155. package/types/models/render.model.d.ts +0 -13
  156. package/types/models/sort.model.d.ts +0 -5
  157. package/types/models/tabela.model.d.ts +0 -69
  158. package/types/models/tabela.options.d.ts +0 -9
  159. package/types/tabela.d.ts +0 -12
@@ -1,6 +1,8 @@
1
- import { getKey } from "../helpers/misc.helpers.js";
1
+ import { GroupComponent } from "../components/group.component.mjs";
2
+ import { getKey } from "../helpers/misc.helpers.mjs";
2
3
  import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
3
4
  import { clamp } from "@oscarpalmer/atoms/number";
5
+ //#region src/managers/navigation.manager.ts
4
6
  var NavigationManager = class {
5
7
  active;
6
8
  constructor(state) {
@@ -14,28 +16,28 @@ var NavigationManager = class {
14
16
  event.preventDefault();
15
17
  const { components, id, managers } = this.state;
16
18
  const activeDescendant = components.body.elements.group.getAttribute("aria-activedescendant");
17
- const keys = managers.data.values.keys.active ?? managers.data.values.keys.original;
18
- const { length } = keys;
19
+ const { items } = managers.data;
20
+ const { length } = items;
19
21
  let next;
20
22
  if (isNullableOrWhitespace(activeDescendant)) next = getDefaultIndex(event.key, length);
21
- else next = getIndex(event, activeDescendant, id, keys);
22
- if (next != null) this.setActive(keys.at(next));
23
+ else next = getIndex(this.state, event, activeDescendant, id);
24
+ if (next != null) this.setActive(items.at(next));
23
25
  }
24
- setActive(key, scroll) {
25
- const { components, managers, options } = this.state;
26
- this.active = key;
26
+ setActive(item, scroll) {
27
+ const { components, id, managers, options } = this.state;
28
+ this.active = item;
27
29
  const active = components.body.elements.group.querySelectorAll("[data-active=\"true\"]");
28
30
  for (const item of active) item.setAttribute("data-active", "false");
29
- const row = managers.row.get(key);
30
- if (row != null) {
31
- row.element?.setAttribute("data-active", "true");
32
- if (scroll ?? true) if (row.element == null) components.body.elements.group.scrollTo({
33
- top: managers.data.getIndex(key) * options.rowHeight,
31
+ const component = item instanceof GroupComponent ? item : managers.row.get(item, false);
32
+ if (component != null) {
33
+ component.element?.setAttribute("data-active", "true");
34
+ if (scroll ?? true) if (component.element == null) components.body.elements.group.scrollTo({
35
+ top: managers.data.getIndex(item) * options.rowHeight,
34
36
  behavior: "smooth"
35
37
  });
36
- else row.element.scrollIntoView({ block: "nearest" });
38
+ else component.element.scrollIntoView({ block: "nearest" });
37
39
  }
38
- components.body.elements.group.setAttribute("aria-activedescendant", row == null ? "" : `tabela_${this.state.id}_row_${key}`);
40
+ components.body.elements.group.setAttribute("aria-activedescendant", component == null ? "" : `tabela_${id}_${component.key}`);
39
41
  }
40
42
  };
41
43
  function getDefaultIndex(key, max) {
@@ -46,11 +48,11 @@ function getDefaultIndex(key, max) {
46
48
  default: return 0;
47
49
  }
48
50
  }
49
- function getIndex(event, active, id, keys) {
50
- const key = getKey(active.replace(`tabela_${id}_row_`, ""));
51
+ function getIndex(state, event, active, id) {
52
+ const key = getKey(active.replace(`tabela_${id}_`, ""));
51
53
  if (key == null) return;
52
- if (absoluteKeys.has(event.key)) return event.key === "Home" ? 0 : keys.length - 1;
53
- return clamp(keys.indexOf(key) + getOffset(event.key), 0, keys.length - 1, true);
54
+ if (absoluteKeys.has(event.key)) return event.key === "Home" ? 0 : state.managers.data.size - 1;
55
+ return clamp(state.managers.data.getIndex(key) + getOffset(event.key), 0, state.managers.data.size - 1, true);
54
56
  }
55
57
  function getOffset(key) {
56
58
  switch (key) {
@@ -61,13 +63,14 @@ function getOffset(key) {
61
63
  default: return 0;
62
64
  }
63
65
  }
64
- var absoluteKeys = new Set(["End", "Home"]);
65
- var arrowKeys = new Set(["ArrowDown", "ArrowUp"]);
66
- var negativeDefaultKeys = new Set(["ArrowUp", "End"]);
67
- var pageKeys = new Set(["PageDown", "PageUp"]);
68
- var allKeys = new Set([
66
+ const absoluteKeys = new Set(["End", "Home"]);
67
+ const arrowKeys = new Set(["ArrowDown", "ArrowUp"]);
68
+ const negativeDefaultKeys = new Set(["ArrowUp", "End"]);
69
+ const pageKeys = new Set(["PageDown", "PageUp"]);
70
+ const allKeys = new Set([
69
71
  ...absoluteKeys,
70
72
  ...arrowKeys,
71
73
  ...pageKeys
72
74
  ]);
75
+ //#endregion
73
76
  export { NavigationManager };
@@ -0,0 +1,2 @@
1
+ import { g as RenderManager } from "../group.component-Cq1YYbfJ.mjs";
2
+ export { RenderManager };
@@ -0,0 +1,144 @@
1
+ import { GroupComponent, renderGroup } from "../components/group.component.mjs";
2
+ import { removeRow, renderRow } from "../components/row.component.mjs";
3
+ import { on } from "@oscarpalmer/toretto/event";
4
+ //#region src/managers/render.manager.ts
5
+ function getRange(state, down) {
6
+ const { element, managers, options } = state;
7
+ const { clientHeight, scrollTop } = element;
8
+ const { items } = managers.data;
9
+ const firstIndex = Math.floor(scrollTop / options.rowHeight);
10
+ const lastIndex = items.length - managers.group.collapsed.size - 1;
11
+ const last = Math.min(lastIndex, Math.ceil((scrollTop + clientHeight) / options.rowHeight) - 1);
12
+ const visible = clientHeight / options.rowHeight;
13
+ const before = Math.ceil(visible) * (down ? 1 : 2);
14
+ const after = Math.ceil(visible) * (down ? 2 : 1);
15
+ const start = Math.max(0, firstIndex - before);
16
+ return {
17
+ end: Math.min(lastIndex, last + after),
18
+ start
19
+ };
20
+ }
21
+ function onScroll() {
22
+ const { state } = this;
23
+ if (!state.active) {
24
+ requestAnimationFrame(() => {
25
+ const top = state.element.scrollTop;
26
+ this.update(top > state.top);
27
+ state.active = false;
28
+ state.top = top;
29
+ });
30
+ state.active = true;
31
+ }
32
+ }
33
+ var RenderManager = class {
34
+ fragment;
35
+ listener;
36
+ pool = {
37
+ cells: {},
38
+ rows: []
39
+ };
40
+ state;
41
+ visible = /* @__PURE__ */ new Map();
42
+ constructor(state) {
43
+ this.listener = on(state.element, "scroll", onScroll.bind(this));
44
+ this.state = {
45
+ ...state,
46
+ active: false,
47
+ top: 0
48
+ };
49
+ }
50
+ destroy() {
51
+ const { listener, pool, visible } = this;
52
+ listener();
53
+ visible.clear();
54
+ const cells = Object.values(pool.cells).flat();
55
+ let { length } = cells;
56
+ for (let index = 0; index < length; index += 1) cells[index].remove();
57
+ length = pool.rows.length;
58
+ for (let index = 0; index < length; index += 1) pool.rows[index].remove();
59
+ pool.cells = {};
60
+ pool.rows = [];
61
+ this.fragment = void 0;
62
+ this.listener = void 0;
63
+ this.pool = void 0;
64
+ this.state = void 0;
65
+ this.visible = void 0;
66
+ }
67
+ removeCells(fields) {
68
+ const { pool, state, visible } = this;
69
+ const { length } = fields;
70
+ for (let index = 0; index < length; index += 1) delete pool.cells[fields[index]];
71
+ for (const [, key] of visible) {
72
+ if (key instanceof GroupComponent) continue;
73
+ const row = state.managers.row.get(key, false);
74
+ if (row == null || row.element == null) continue;
75
+ for (let index = 0; index < length; index += 1) {
76
+ row.cells[fields[index]].innerHTML = "";
77
+ row.cells[fields[index]].remove();
78
+ delete row.cells[fields[index]];
79
+ }
80
+ }
81
+ }
82
+ getFragment() {
83
+ this.fragment ??= document.createDocumentFragment();
84
+ this.fragment.replaceChildren();
85
+ return this.fragment;
86
+ }
87
+ update(down, rerender) {
88
+ const { state, pool, visible } = this;
89
+ const { components, managers, options } = state;
90
+ components.body.elements.faker.style.height = `${(managers.data.size - managers.group.collapsed.size) * options.rowHeight}px`;
91
+ const indices = /* @__PURE__ */ new Set();
92
+ const range = getRange(state, down);
93
+ for (let index = range.start; index <= range.end; index += 1) indices.add(index);
94
+ let remove = rerender ?? false;
95
+ for (const [index, key] of visible) {
96
+ if (key instanceof GroupComponent) {
97
+ if (remove || !indices.has(index)) {
98
+ visible.delete(index);
99
+ key.element?.remove();
100
+ }
101
+ continue;
102
+ }
103
+ const row = managers.row.get(key, false);
104
+ if (remove || row == null || !indices.has(index) || managers.group.collapsed.has(key)) {
105
+ visible.delete(index);
106
+ if (row != null) removeRow(pool, row);
107
+ }
108
+ }
109
+ const fragment = this.getFragment();
110
+ const { items } = managers.data;
111
+ let count = 0;
112
+ let offset = 0;
113
+ for (let index = range.start; index <= range.end + offset; index += 1) {
114
+ if (visible.has(index)) continue;
115
+ const item = items[index];
116
+ if (item instanceof GroupComponent) {
117
+ count += 1;
118
+ renderGroup(state, item);
119
+ visible.set(index, item);
120
+ if (item.element != null) {
121
+ item.element.style.transform = `translateY(${(index - offset) * options.rowHeight}px)`;
122
+ fragment.append(item.element);
123
+ }
124
+ continue;
125
+ }
126
+ const row = managers.row.get(item, true);
127
+ if (row == null) continue;
128
+ if (managers.group.collapsed.has(item)) {
129
+ offset += 1;
130
+ continue;
131
+ }
132
+ count += 1;
133
+ renderRow(state, row);
134
+ visible.set(index, item);
135
+ if (row.element != null) {
136
+ row.element.style.transform = `translateY(${(index - offset) * options.rowHeight}px)`;
137
+ fragment.append(row.element);
138
+ }
139
+ }
140
+ if (count > 0) components.body.elements.group[down ? "append" : "prepend"](fragment);
141
+ }
142
+ };
143
+ //#endregion
144
+ export { RenderManager };
@@ -0,0 +1,2 @@
1
+ import { f as RowManager } from "../group.component-Cq1YYbfJ.mjs";
2
+ export { RowManager };
@@ -1,20 +1,25 @@
1
- import { RowComponent, removeRow, renderRow } from "../components/row.component.js";
1
+ import { RowComponent, removeRow, renderRow } from "../components/row.component.mjs";
2
+ //#region src/managers/row.manager.ts
2
3
  var RowManager = class {
3
4
  components = /* @__PURE__ */ new Map();
4
5
  constructor(state) {
5
6
  this.state = state;
6
7
  }
8
+ clear() {
9
+ const { components } = this;
10
+ const rows = [...components.values()];
11
+ const { length } = rows;
12
+ for (let index = 0; index < length; index += 1) this.removeRow(rows[index]);
13
+ components.clear();
14
+ }
7
15
  destroy() {
8
- const components = [...this.components.values()];
9
- const { length } = components;
10
- for (let index = 0; index < length; index += 1) removeRow(this.state.managers.render.pool, components[index]);
11
- this.components.clear();
16
+ this.clear();
12
17
  this.components = void 0;
13
18
  this.state = void 0;
14
19
  }
15
- get(key) {
20
+ get(key, create) {
16
21
  let row = this.components.get(key);
17
- if (row == null) {
22
+ if (row == null && create) {
18
23
  row = new RowComponent(key);
19
24
  this.components.set(key, row);
20
25
  }
@@ -25,14 +30,16 @@ var RowManager = class {
25
30
  }
26
31
  remove(key) {
27
32
  const row = this.components.get(key);
28
- if (row != null) {
29
- removeRow(this.state.managers.render.pool, row);
30
- this.components.delete(key);
31
- }
33
+ if (row != null) this.removeRow(row);
34
+ }
35
+ removeRow(row) {
36
+ if (row.element != null) removeRow(this.state.managers.render.pool, row);
37
+ this.components.delete(row.key);
32
38
  }
33
39
  update(key) {
34
40
  const row = this.components.get(key);
35
41
  if (row != null) renderRow(this.state, row);
36
42
  }
37
43
  };
44
+ //#endregion
38
45
  export { RowManager };
@@ -0,0 +1,2 @@
1
+ import { d as SelectionManager } from "../group.component-Cq1YYbfJ.mjs";
2
+ export { SelectionManager };
@@ -1,15 +1,19 @@
1
- import { createElement } from "../helpers/dom.helpers.js";
2
- import { getKey } from "../helpers/misc.helpers.js";
3
- import { dragStyling } from "../helpers/style.helper.js";
1
+ import { CSS_TABELA_ROW_BODY, CSS_TABELA_ROW_SELECTED, CSS_TABELA_SELECTION } from "../models/style.model.mjs";
2
+ import { createElement } from "../helpers/dom.helpers.mjs";
3
+ import { GroupComponent } from "../components/group.component.mjs";
4
+ import { getKey } from "../helpers/misc.helpers.mjs";
5
+ import { preventSelection } from "../helpers/style.helper.mjs";
4
6
  import { setAttribute } from "@oscarpalmer/toretto/attribute";
5
7
  import { isKey } from "@oscarpalmer/atoms/is";
6
8
  import { getPosition, on } from "@oscarpalmer/toretto/event";
7
- import { findAncestor } from "@oscarpalmer/toretto";
9
+ import { findAncestor } from "@oscarpalmer/toretto/find";
10
+ //#region src/managers/selection.manager.ts
8
11
  var SelectionManager = class {
9
12
  handlers = Object.freeze({
13
+ add: (keys) => this.add(keys),
10
14
  clear: () => this.clear(),
11
- deselect: (keys) => this.deselect(keys),
12
- select: (keys) => this.select(keys),
15
+ remove: (keys) => this.remove(keys),
16
+ set: (keys) => this.set(keys),
13
17
  toggle: () => this.toggle()
14
18
  });
15
19
  items = /* @__PURE__ */ new Set();
@@ -18,21 +22,24 @@ var SelectionManager = class {
18
22
  this.state = state;
19
23
  mapped.set(state.element, this);
20
24
  }
25
+ add(keys) {
26
+ const { length } = keys;
27
+ let update = false;
28
+ for (let index = 0; index < length; index += 1) {
29
+ const key = keys[index];
30
+ if (!this.items.has(key)) {
31
+ this.items.add(key);
32
+ update = true;
33
+ }
34
+ }
35
+ if (update) this.update([]);
36
+ }
21
37
  clear() {
22
38
  if (this.items.size === 0) return;
23
39
  const removed = [...this.items];
24
40
  this.items.clear();
25
41
  this.update(removed);
26
42
  }
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
43
  destroy() {
37
44
  mapped.delete(this.state.element);
38
45
  this.handlers = void 0;
@@ -52,8 +59,8 @@ var SelectionManager = class {
52
59
  this.last = key;
53
60
  this.state.managers.navigation.setActive(key, false);
54
61
  if (event.ctrlKey || event.metaKey) {
55
- if (items.has(key)) this.deselect([key]);
56
- else this.select([key]);
62
+ if (items.has(key)) this.remove([key]);
63
+ else this.add([key]);
57
64
  return;
58
65
  }
59
66
  this.set([key]);
@@ -64,29 +71,29 @@ var SelectionManager = class {
64
71
  const fromKey = keyed ? from : getKey(from.getAttribute("data-key"));
65
72
  const toKey = keyed ? to : getKey(to.getAttribute("data-key"));
66
73
  if (fromKey === toKey) return;
67
- const keys = state.managers.data.values.keys.active ?? state.managers.data.values.keys.original;
74
+ const { items } = state.managers.data;
68
75
  const fromIndex = state.managers.data.getIndex(fromKey);
69
76
  const toIndex = state.managers.data.getIndex(toKey);
70
77
  if (fromIndex === -1 || toIndex === -1) return;
71
78
  const [start, end] = fromIndex < toIndex ? [fromIndex, toIndex] : [toIndex, fromIndex];
72
79
  const selected = [];
73
- for (let index = start; index <= end; index += 1) selected.push(keys[index]);
74
- if (keyed) this.select(selected);
80
+ for (let index = start; index <= end; index += 1) {
81
+ const item = items[index];
82
+ if (!(item instanceof GroupComponent)) selected.push(item);
83
+ }
84
+ if (keyed) this.add(selected);
75
85
  else this.set(selected);
76
86
  this.last = toKey;
77
87
  this.state.managers.navigation.setActive(toKey, false);
78
88
  }
79
- select(keys) {
89
+ remove(keys) {
80
90
  const { length } = keys;
81
- let update = false;
91
+ const removed = [];
82
92
  for (let index = 0; index < length; index += 1) {
83
93
  const key = keys[index];
84
- if (!this.items.has(key)) {
85
- this.items.add(key);
86
- update = true;
87
- }
94
+ if (this.items.delete(key)) removed.push(key);
88
95
  }
89
- if (update) this.update([]);
96
+ if (removed.length > 0) this.update(removed);
90
97
  }
91
98
  set(keys) {
92
99
  const { items } = this;
@@ -98,11 +105,12 @@ var SelectionManager = class {
98
105
  }
99
106
  toggle() {
100
107
  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);
108
+ const data = state.managers.data.items;
109
+ if (items.size === data.length - state.managers.group.items.length) this.clear();
110
+ else this.set(data.filter((key) => !(key instanceof GroupComponent)));
104
111
  }
105
112
  update(removed) {
113
+ const { state } = this;
106
114
  const items = [...removed.map((key) => ({
107
115
  key,
108
116
  removed: true
@@ -110,28 +118,28 @@ var SelectionManager = class {
110
118
  key,
111
119
  removed: false
112
120
  }))];
113
- const { length } = items;
121
+ let { length } = items;
114
122
  for (let index = 0; index < length; index += 1) {
115
123
  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");
124
+ const element = state.managers.row.get(key, false)?.element;
125
+ if (element == null) continue;
126
+ setAttribute(element, "aria-selected", String(!removed));
127
+ if (removed) element.classList.remove(CSS_TABELA_ROW_SELECTED);
128
+ else element.classList.add(CSS_TABELA_ROW_SELECTED);
121
129
  }
122
130
  }
123
131
  };
124
132
  function getPlaceholder() {
125
- placeholder ??= createElement("div", { className: "tabela__selection--placeholder" }, {}, {});
133
+ placeholder ??= createElement("div", { className: CSS_TABELA_SELECTION }, {}, {});
126
134
  return placeholder;
127
135
  }
128
136
  function onMouseDown(event) {
129
137
  if (shifted) {
130
- const row = findAncestor(event.target, ".tabela__row--body");
138
+ const row = findAncestor(event.target, `.${CSS_TABELA_ROW_BODY}`);
131
139
  if (!(row instanceof HTMLElement)) return;
132
140
  startElement = row;
133
141
  startPosition = getPosition(event);
134
- dragStyling.set();
142
+ preventSelection.set();
135
143
  }
136
144
  }
137
145
  function onMouseMove(event) {
@@ -152,14 +160,14 @@ function onMouseUp(event) {
152
160
  if (startElement == null) return;
153
161
  if (!event.shiftKey) {
154
162
  shifted = false;
155
- dragStyling.remove();
163
+ preventSelection.remove();
156
164
  }
157
165
  getPlaceholder().remove();
158
166
  const row = findAncestor(event.target, ".tabela__row--body");
159
167
  if (row instanceof HTMLElement) {
160
168
  endElement = row;
161
- const endTable = findAncestor(endElement, ".tabela");
162
- const startTable = findAncestor(startElement, ".tabela");
169
+ const endTable = findAncestor(endElement, ".tabela__table");
170
+ const startTable = findAncestor(startElement, ".tabela__table");
163
171
  if (startTable != null && startTable === endTable) mapped.get(startTable)?.range(startElement, endElement);
164
172
  }
165
173
  endElement = void 0;
@@ -175,15 +183,16 @@ function onShiftDown(event) {
175
183
  function onShiftUp(event) {
176
184
  onShift(event, false);
177
185
  }
178
- var mapped = /* @__PURE__ */ new WeakMap();
179
- var shifted = false;
180
- var endElement;
181
- var placeholder;
182
- var startPosition;
183
- var startElement;
186
+ const mapped = /* @__PURE__ */ new WeakMap();
187
+ let shifted = false;
188
+ let endElement;
189
+ let placeholder;
190
+ let startPosition;
191
+ let startElement;
184
192
  on(document, "keydown", onShiftDown);
185
193
  on(document, "keyup", onShiftUp);
186
194
  on(document, "mousedown", onMouseDown);
187
195
  on(document, "mousemove", onMouseMove);
188
196
  on(document, "mouseup", onMouseUp);
197
+ //#endregion
189
198
  export { SelectionManager };
@@ -0,0 +1,2 @@
1
+ import { l as SortManager, u as sortWithGroups } from "../group.component-Cq1YYbfJ.mjs";
2
+ export { SortManager, sortWithGroups };
@@ -1,5 +1,9 @@
1
+ import { GroupComponent } from "../components/group.component.mjs";
1
2
  import { setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
2
3
  import { sort } from "@oscarpalmer/atoms/array";
4
+ import { getValue } from "@oscarpalmer/atoms/value/handle";
5
+ import { compare } from "@oscarpalmer/atoms/value/compare";
6
+ //#region src/managers/sort.manager.ts
3
7
  var SortManager = class {
4
8
  handlers = Object.freeze({
5
9
  add: (field, direction) => this.add(field, direction),
@@ -75,7 +79,7 @@ var SortManager = class {
75
79
  });
76
80
  setAttribute(column.elements.sorter, "data-sort-position", sorterIndex > -1 && items.length > 1 ? sorterIndex + 1 : void 0);
77
81
  }
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]);
82
+ state.managers.data.state.items.active = items.length === 0 ? void 0 : getSortedItems(state, items);
79
83
  state.managers.render.update(true, true);
80
84
  }
81
85
  toggle(event, field, direction) {
@@ -92,4 +96,30 @@ var SortManager = class {
92
96
  }
93
97
  }
94
98
  };
95
- export { SortManager };
99
+ function getSortedItems(state, sorters) {
100
+ const data = state.managers.data.state.items.active?.map((key) => key instanceof GroupComponent ? key : state.managers.data.state.values.mapped.get(key)) ?? state.managers.data.state.values.array.slice();
101
+ if (!state.managers.group.enabled) return sort(data, sorters).map((item) => getValue(item, state.key));
102
+ return sortWithGroups(state, data, sorters).map((item) => item instanceof GroupComponent ? item : getValue(item, state.key));
103
+ }
104
+ function sortWithGroups(state, data, sorters) {
105
+ const { length } = sorters;
106
+ return data.sort((first, second) => {
107
+ const firstValue = first instanceof GroupComponent ? first.value.stringified : getValue(first, state.managers.group.field);
108
+ const secondValue = second instanceof GroupComponent ? second.value.stringified : getValue(second, state.managers.group.field);
109
+ const firstOrder = state.managers.group.order[firstValue];
110
+ const secondOrder = state.managers.group.order[secondValue];
111
+ const groupComparison = compare(firstOrder, secondOrder);
112
+ if (groupComparison !== 0) return groupComparison;
113
+ const firstIsGroup = first instanceof GroupComponent;
114
+ const secondIsGroup = second instanceof GroupComponent;
115
+ if (firstIsGroup || secondIsGroup) return firstIsGroup && secondIsGroup ? 0 : firstIsGroup ? -1 : 1;
116
+ for (let index = 0; index < length; index += 1) {
117
+ const sorter = sorters[index];
118
+ const comparison = compare(getValue(first, sorter.key), getValue(second, sorter.key));
119
+ if (comparison !== 0) return comparison * (sorter.direction === "ascending" ? 1 : -1);
120
+ }
121
+ return 0;
122
+ });
123
+ }
124
+ //#endregion
125
+ export { SortManager, sortWithGroups };
@@ -0,0 +1,2 @@
1
+ import { c as StyleManager } from "../group.component-Cq1YYbfJ.mjs";
2
+ export { StyleManager };