@oscarpalmer/tabela 0.13.0 → 0.14.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 (131) hide show
  1. package/dist/components/{body.component.mjs → body.component.js} +3 -6
  2. package/dist/components/{column.component.mjs → column.component.js} +5 -8
  3. package/dist/components/{footer.component.mjs → footer.component.js} +4 -7
  4. package/dist/components/group.component.js +28 -0
  5. package/dist/components/{header.component.mjs → header.component.js} +3 -6
  6. package/dist/components/{row.component.mjs → row.component.js} +7 -11
  7. package/dist/helpers/{dom.helpers.mjs → dom.helpers.js} +9 -13
  8. package/dist/helpers/{misc.helpers.mjs → misc.helpers.js} +1 -3
  9. package/dist/helpers/style.helper.js +6 -0
  10. package/dist/{index.mjs → index.js} +1 -3
  11. package/dist/managers/{column.manager.mjs → column.manager.js} +1 -6
  12. package/dist/managers/data.manager.js +181 -0
  13. package/dist/managers/{event.manager.mjs → event.manager.js} +8 -9
  14. package/dist/managers/{filter.manager.mjs → filter.manager.js} +14 -23
  15. package/dist/managers/group.manager.js +46 -0
  16. package/dist/managers/{navigation.manager.mjs → navigation.manager.js} +24 -27
  17. package/dist/managers/{render.manager.mjs → render.manager.js} +26 -35
  18. package/dist/managers/{row.manager.mjs → row.manager.js} +11 -18
  19. package/dist/managers/{selection.manager.mjs → selection.manager.js} +28 -32
  20. package/dist/managers/{sort.manager.mjs → sort.manager.js} +9 -12
  21. package/dist/models/body.model.js +0 -0
  22. package/dist/models/column.model.js +0 -0
  23. package/dist/models/data.model.js +0 -0
  24. package/dist/models/filter.model.js +0 -0
  25. package/dist/models/footer.model.js +0 -0
  26. package/dist/models/group.model.js +0 -0
  27. package/dist/models/header.model.js +0 -0
  28. package/dist/models/render.model.js +0 -0
  29. package/dist/models/selection.model.js +0 -0
  30. package/dist/models/sort.model.js +0 -0
  31. package/dist/models/tabela.model.js +0 -0
  32. package/dist/models/tabela.options.js +0 -0
  33. package/dist/{tabela.full.mjs → tabela.full.js} +860 -1049
  34. package/dist/tabela.js +105 -0
  35. package/package.json +1 -1
  36. package/src/components/body.component.ts +10 -7
  37. package/src/components/column.component.ts +19 -15
  38. package/src/components/footer.component.ts +7 -10
  39. package/src/components/group.component.ts +34 -12
  40. package/src/components/header.component.ts +6 -5
  41. package/src/components/row.component.ts +27 -19
  42. package/src/helpers/dom.helpers.ts +18 -22
  43. package/src/helpers/misc.helpers.ts +5 -0
  44. package/src/managers/data.manager.ts +80 -77
  45. package/src/managers/event.manager.ts +21 -10
  46. package/src/managers/filter.manager.ts +34 -21
  47. package/src/managers/group.manager.ts +18 -9
  48. package/src/managers/navigation.manager.ts +46 -49
  49. package/src/managers/render.manager.ts +34 -21
  50. package/src/managers/row.manager.ts +1 -1
  51. package/src/managers/selection.manager.ts +37 -35
  52. package/src/managers/sort.manager.ts +47 -34
  53. package/src/managers/style.manager.ts +40 -25
  54. package/src/models/column.model.ts +2 -6
  55. package/src/models/data.model.ts +7 -8
  56. package/src/models/dom.model.ts +33 -0
  57. package/src/models/event.model.ts +7 -0
  58. package/src/models/filter.model.ts +20 -0
  59. package/src/models/group.model.ts +4 -0
  60. package/src/models/sort.model.ts +4 -0
  61. package/src/models/style.model.ts +32 -20
  62. package/src/models/tabela.model.ts +1 -0
  63. package/src/tabela.ts +20 -22
  64. package/dist/body.component-_VDOpJhV.d.mts +0 -10
  65. package/dist/body.model-2iwsovAV.d.mts +0 -7
  66. package/dist/column.component-Bx46r3JI.d.mts +0 -16
  67. package/dist/column.model-D-aw4EU4.d.mts +0 -16
  68. package/dist/components/body.component.d.mts +0 -2
  69. package/dist/components/column.component.d.mts +0 -2
  70. package/dist/components/footer.component.d.mts +0 -2
  71. package/dist/components/group.component.d.mts +0 -2
  72. package/dist/components/group.component.mjs +0 -51
  73. package/dist/components/header.component.d.mts +0 -2
  74. package/dist/components/row.component.d.mts +0 -2
  75. package/dist/filter.model-7ukJrtil.d.mts +0 -16
  76. package/dist/footer.component-Curiab8j.d.mts +0 -12
  77. package/dist/footer.model-DhqoS6ds.d.mts +0 -8
  78. package/dist/group.component-Cq1YYbfJ.d.mts +0 -285
  79. package/dist/group.model-BsKFwHbt.d.mts +0 -10
  80. package/dist/header.component-BjjlpZIg.d.mts +0 -12
  81. package/dist/header.model-DN_KzUCV.d.mts +0 -7
  82. package/dist/helpers/dom.helpers.d.mts +0 -12
  83. package/dist/helpers/misc.helpers.d.mts +0 -6
  84. package/dist/helpers/style.helper.d.mts +0 -6
  85. package/dist/helpers/style.helper.mjs +0 -8
  86. package/dist/index.d.mts +0 -7
  87. package/dist/managers/column.manager.d.mts +0 -2
  88. package/dist/managers/data.manager.d.mts +0 -2
  89. package/dist/managers/data.manager.mjs +0 -222
  90. package/dist/managers/event.manager.d.mts +0 -2
  91. package/dist/managers/filter.manager.d.mts +0 -2
  92. package/dist/managers/group.manager.d.mts +0 -2
  93. package/dist/managers/group.manager.mjs +0 -73
  94. package/dist/managers/navigation.manager.d.mts +0 -2
  95. package/dist/managers/render.manager.d.mts +0 -2
  96. package/dist/managers/row.manager.d.mts +0 -2
  97. package/dist/managers/selection.manager.d.mts +0 -2
  98. package/dist/managers/sort.manager.d.mts +0 -2
  99. package/dist/managers/style.manager.d.mts +0 -2
  100. package/dist/managers/style.manager.mjs +0 -149
  101. package/dist/models/body.model.d.mts +0 -2
  102. package/dist/models/body.model.mjs +0 -1
  103. package/dist/models/column.model.d.mts +0 -2
  104. package/dist/models/column.model.mjs +0 -1
  105. package/dist/models/data.model.d.mts +0 -2
  106. package/dist/models/data.model.mjs +0 -1
  107. package/dist/models/filter.model.d.mts +0 -2
  108. package/dist/models/filter.model.mjs +0 -1
  109. package/dist/models/footer.model.d.mts +0 -2
  110. package/dist/models/footer.model.mjs +0 -1
  111. package/dist/models/group.model.d.mts +0 -2
  112. package/dist/models/group.model.mjs +0 -1
  113. package/dist/models/header.model.d.mts +0 -2
  114. package/dist/models/header.model.mjs +0 -1
  115. package/dist/models/render.model.d.mts +0 -2
  116. package/dist/models/render.model.mjs +0 -1
  117. package/dist/models/selection.model.d.mts +0 -2
  118. package/dist/models/selection.model.mjs +0 -1
  119. package/dist/models/sort.model.d.mts +0 -2
  120. package/dist/models/sort.model.mjs +0 -1
  121. package/dist/models/style.model.d.mts +0 -23
  122. package/dist/models/style.model.mjs +0 -23
  123. package/dist/models/tabela.model.d.mts +0 -2
  124. package/dist/models/tabela.model.mjs +0 -1
  125. package/dist/models/tabela.options.d.mts +0 -2
  126. package/dist/models/tabela.options.mjs +0 -1
  127. package/dist/selection.model-rwQe9fco.d.mts +0 -12
  128. package/dist/sort.model-CauImaLu.d.mts +0 -15
  129. package/dist/tabela.d.mts +0 -21
  130. package/dist/tabela.mjs +0 -126
  131. package/dist/tabela.options-RkZvfptB.d.mts +0 -14
@@ -1,8 +1,6 @@
1
- import { CSS_TABELA_FAKER, CSS_TABELA_ROWGROUP_BODY } from "../models/style.model.mjs";
2
- import { createElement, createRowGroup } from "../helpers/dom.helpers.mjs";
3
- //#region src/components/body.component.ts
1
+ import { createElement, createRowGroup } from "../helpers/dom.helpers.js";
4
2
  function createFaker() {
5
- return createElement("div", { className: CSS_TABELA_FAKER });
3
+ return createElement("div", { className: "tabela__faker" }, {}, {});
6
4
  }
7
5
  var BodyComponent = class {
8
6
  elements = {
@@ -12,7 +10,7 @@ var BodyComponent = class {
12
10
  constructor() {
13
11
  const group = createRowGroup(false);
14
12
  this.elements.group = group;
15
- group.className += ` ${CSS_TABELA_ROWGROUP_BODY}`;
13
+ group.className += " tabela__rowgroup--body";
16
14
  group.tabIndex = 0;
17
15
  group.setAttribute("data-event", "body");
18
16
  group.append(this.elements.faker);
@@ -22,5 +20,4 @@ var BodyComponent = class {
22
20
  this.elements.group = void 0;
23
21
  }
24
22
  };
25
- //#endregion
26
23
  export { BodyComponent };
@@ -1,6 +1,4 @@
1
- import { CSS_TABELA_HEADING, CSS_TABELA_HEADING_CONTENT, CSS_TABELA_HEADING_SORTER } from "../models/style.model.mjs";
2
- import { createElement } from "../helpers/dom.helpers.mjs";
3
- //#region src/components/column.component.ts
1
+ import { createElement } from "../helpers/dom.helpers.js";
4
2
  var ColumnComponent = class {
5
3
  elements;
6
4
  options;
@@ -22,17 +20,17 @@ var ColumnComponent = class {
22
20
  };
23
21
  function createHeading(field, title, width) {
24
22
  const wrapper = createElement("div", {
25
- className: CSS_TABELA_HEADING,
23
+ className: "tabela__heading",
26
24
  role: "columnheader"
27
25
  }, {
28
26
  "data-event": "heading",
29
27
  "data-field": field
30
28
  }, { width: `${width}px` });
31
29
  const content = createElement("div", {
32
- className: CSS_TABELA_HEADING_CONTENT,
30
+ className: "tabela__heading__content",
33
31
  textContent: title
34
- });
35
- const sorter = createElement("div", { className: CSS_TABELA_HEADING_SORTER });
32
+ }, {}, {});
33
+ const sorter = createElement("div", { className: "tabela__heading__sorter" }, {}, {});
36
34
  wrapper.append(content, sorter);
37
35
  return {
38
36
  content,
@@ -40,5 +38,4 @@ function createHeading(field, title, width) {
40
38
  wrapper
41
39
  };
42
40
  }
43
- //#endregion
44
41
  export { ColumnComponent };
@@ -1,6 +1,4 @@
1
- import { CSS_TABELA_CELL_FOOTER, CSS_TABELA_ROWGROUP_FOOTER, CSS_TABELA_ROW_FOOTER } from "../models/style.model.mjs";
2
- import { createCell, createRowGroup } from "../helpers/dom.helpers.mjs";
3
- //#region src/components/footer.component.ts
1
+ import { createCell, createRowGroup } from "../helpers/dom.helpers.js";
4
2
  var FooterComponent = class {
5
3
  elements;
6
4
  constructor() {
@@ -10,8 +8,8 @@ var FooterComponent = class {
10
8
  row,
11
9
  cells: []
12
10
  };
13
- group.className += ` ${CSS_TABELA_ROWGROUP_FOOTER}`;
14
- row.className += ` ${CSS_TABELA_ROW_FOOTER}`;
11
+ group.className += " tabela__rowgroup--footer";
12
+ row.className += " tabela__row--footer";
15
13
  }
16
14
  destroy() {
17
15
  this.elements.cells.length = 0;
@@ -25,12 +23,11 @@ var FooterComponent = class {
25
23
  elements.row.innerHTML = "";
26
24
  for (let index = 0; index < length; index += 1) {
27
25
  const cell = createCell(columns[index].options.width ?? 4, false);
28
- cell.className += ` ${CSS_TABELA_CELL_FOOTER}`;
26
+ cell.className += " tabela__cell--footer";
29
27
  cell.innerHTML = "&nbsp;";
30
28
  elements.cells.push(cell);
31
29
  elements.row.append(cell);
32
30
  }
33
31
  }
34
32
  };
35
- //#endregion
36
33
  export { FooterComponent };
@@ -0,0 +1,28 @@
1
+ import { createElement } from "../helpers/dom.helpers.js";
2
+ var GroupComponent = class {
3
+ element;
4
+ expanded = true;
5
+ filtered = 0;
6
+ selected = 0;
7
+ total = 0;
8
+ constructor(key, label, value) {
9
+ this.key = key;
10
+ this.label = label;
11
+ this.value = value;
12
+ }
13
+ };
14
+ function renderGroup(state, component) {
15
+ component.element ??= createElement("div", {
16
+ className: "tabela__row tabela__row--group",
17
+ innerHTML: `<div class="tabela__cell tabela__cell--group" role="cell">
18
+ <button class="tabela__button tabela__button--group" data-event="group" data-key="${component.key}" type="button">
19
+ <span aria-hidden="true"></span>
20
+ <span>Open/close</span>
21
+ </button>
22
+ <p>${component.label}</p>
23
+ </div>`,
24
+ role: "row"
25
+ }, {}, { height: `${state.options.rowHeight}px` });
26
+ }
27
+ function updateGroup(state, component) {}
28
+ export { GroupComponent, renderGroup, updateGroup };
@@ -1,6 +1,4 @@
1
- import { CSS_TABELA_ROWGROUP_HEADER, CSS_TABELA_ROW_HEADER } from "../models/style.model.mjs";
2
- import { createRowGroup } from "../helpers/dom.helpers.mjs";
3
- //#region src/components/header.component.ts
1
+ import { createRowGroup } from "../helpers/dom.helpers.js";
4
2
  var HeaderComponent = class {
5
3
  elements;
6
4
  constructor() {
@@ -9,8 +7,8 @@ var HeaderComponent = class {
9
7
  group,
10
8
  row
11
9
  };
12
- group.className += ` ${CSS_TABELA_ROWGROUP_HEADER}`;
13
- row.className += ` ${CSS_TABELA_ROW_HEADER}`;
10
+ group.className += " tabela__rowgroup--header";
11
+ row.className += " tabela__row--header";
14
12
  }
15
13
  destroy() {
16
14
  this.elements.group = void 0;
@@ -21,5 +19,4 @@ var HeaderComponent = class {
21
19
  this.elements.row.append(...columns.map((column) => column.elements.wrapper));
22
20
  }
23
21
  };
24
- //#endregion
25
22
  export { HeaderComponent };
@@ -1,8 +1,5 @@
1
- import { CSS_TABELA_ROW_BODY, CSS_TABELA_ROW_SELECTED } from "../models/style.model.mjs";
2
- import { createCell, createRow } from "../helpers/dom.helpers.mjs";
1
+ import { createCell, createRow } from "../helpers/dom.helpers.js";
3
2
  import { setAttributes } from "@oscarpalmer/toretto/attribute";
4
- import { getValue } from "@oscarpalmer/atoms/value/handle";
5
- //#region src/components/row.component.ts
6
3
  function removeRow(pool, row) {
7
4
  if (row.element != null) {
8
5
  row.element.innerHTML = "";
@@ -23,20 +20,20 @@ function renderRow(state, row) {
23
20
  "data-active": String(state.managers.navigation.active === row.key),
24
21
  "data-event": "row",
25
22
  "data-key": key,
26
- id: `tabela_${state.id}_${key}`
23
+ id: `tabela_${state.id}_row_${key}`
27
24
  });
28
- element.classList.add(CSS_TABELA_ROW_BODY);
29
- if (selected) element.classList.add(CSS_TABELA_ROW_SELECTED);
30
- else element.classList.remove(CSS_TABELA_ROW_SELECTED);
25
+ element.classList.add("tabela__row--body");
26
+ if (selected) element.classList.add("tabela__row--selected");
27
+ else element.classList.remove("tabela__row--selected");
31
28
  const columns = state.managers.column.items;
32
29
  const { length } = columns;
33
- const data = state.managers.data.state.values.mapped.get(row.key);
30
+ const data = state.managers.data.values.objects.mapped.get(row.key);
34
31
  if (data == null) return;
35
32
  for (let index = 0; index < length; index += 1) {
36
33
  const { options } = columns[index];
37
34
  state.managers.render.pool.cells[options.field] ??= [];
38
35
  const cell = state.managers.render.pool.cells[columns[index].options.field].shift() ?? createCell(options.width);
39
- cell.textContent = String(getValue(data, options.field));
36
+ cell.textContent = String(data[options.field]);
40
37
  row.cells[options.field] = cell;
41
38
  element.append(cell);
42
39
  }
@@ -48,5 +45,4 @@ var RowComponent = class {
48
45
  this.key = key;
49
46
  }
50
47
  };
51
- //#endregion
52
48
  export { RowComponent, removeRow, renderRow };
@@ -1,29 +1,26 @@
1
- import { CSS_TABELA_CELL, CSS_TABELA_CELL_BODY, CSS_TABELA_ROW, CSS_TABELA_ROWGROUP } from "../models/style.model.mjs";
2
1
  import { setAttributes } from "@oscarpalmer/toretto/attribute";
3
2
  import { setStyles } from "@oscarpalmer/toretto/style";
4
- //#region src/helpers/dom.helpers.ts
5
3
  function createCell(width, body) {
6
4
  const cell = createElement("div", {
7
- className: CSS_TABELA_CELL,
5
+ className: "tabela__cell",
8
6
  role: "cell"
9
7
  }, {}, { width: `${width}px` });
10
- if (body ?? true) cell.classList.add(CSS_TABELA_CELL_BODY);
8
+ if (body ?? true) cell.classList.add("tabela__cell--body");
11
9
  return cell;
12
10
  }
13
11
  function createElement(tagName, properties, attributes, style) {
14
12
  const element = document.createElement(tagName);
15
- const props = properties ?? {};
16
- const keys = Object.keys(props);
17
- for (const key of keys) element[key] = props[key];
18
- setAttributes(element, attributes ?? {});
19
- setStyles(element, style ?? {});
13
+ const keys = Object.keys(properties);
14
+ for (const key of keys) element[key] = properties[key];
15
+ setAttributes(element, attributes);
16
+ setStyles(element, style);
20
17
  return element;
21
18
  }
22
19
  function createRowGroup(withRow) {
23
20
  const group = createElement("div", {
24
- className: CSS_TABELA_ROWGROUP,
21
+ className: "tabela__rowgroup",
25
22
  role: "rowgroup"
26
- });
23
+ }, {}, {});
27
24
  if (!(withRow ?? true)) return group;
28
25
  const row = createRow();
29
26
  group.append(row);
@@ -34,9 +31,8 @@ function createRowGroup(withRow) {
34
31
  }
35
32
  function createRow() {
36
33
  return createElement("div", {
37
- className: CSS_TABELA_ROW,
34
+ className: "tabela__row",
38
35
  role: "row"
39
36
  }, {}, { height: "32px" });
40
37
  }
41
- //#endregion
42
38
  export { createCell, createElement, createRow, createRowGroup };
@@ -1,9 +1,7 @@
1
- //#region src/helpers/misc.helpers.ts
2
1
  function getKey(value) {
3
2
  if (typeof value === "number") return value;
4
3
  if (typeof value !== "string") return;
5
4
  return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
6
5
  }
7
- const integerExpression = /^\d+$/;
8
- //#endregion
6
+ var integerExpression = /^\d+$/;
9
7
  export { getKey };
@@ -0,0 +1,6 @@
1
+ import { toggleStyles } from "@oscarpalmer/toretto/style";
2
+ const dragStyling = toggleStyles(document.body, {
3
+ userSelect: "none",
4
+ webkitUserSelect: "none"
5
+ });
6
+ export { dragStyling };
@@ -1,7 +1,5 @@
1
- import { Tabela } from "./tabela.mjs";
2
- //#region src/index.ts
1
+ import { Tabela } from "./tabela.js";
3
2
  function tabela(element, options) {
4
3
  return new Tabela(element, options);
5
4
  }
6
- //#endregion
7
5
  export { tabela };
@@ -1,5 +1,4 @@
1
- import { ColumnComponent } from "../components/column.component.mjs";
2
- //#region src/managers/column.manager.ts
1
+ import { ColumnComponent } from "../components/column.component.js";
3
2
  var ColumnManager = class {
4
3
  items = [];
5
4
  constructor(state) {
@@ -12,9 +11,6 @@ var ColumnManager = class {
12
11
  this.items = void 0;
13
12
  this.state = void 0;
14
13
  }
15
- get(field) {
16
- return this.items.find((item) => item.options.field === field);
17
- }
18
14
  remove(value) {
19
15
  const { items, state } = this;
20
16
  const { components, managers } = state;
@@ -40,5 +36,4 @@ var ColumnManager = class {
40
36
  footer.update(items);
41
37
  }
42
38
  };
43
- //#endregion
44
39
  export { ColumnManager };
@@ -0,0 +1,181 @@
1
+ import { GroupComponent } from "../components/group.component.js";
2
+ import { sortWithGroups } from "./sort.manager.js";
3
+ import { select, sort } from "@oscarpalmer/atoms/array";
4
+ import { toMap } from "@oscarpalmer/atoms/array/to-map";
5
+ import { toRecord } from "@oscarpalmer/atoms/array/to-record";
6
+ import { isPlainObject } from "@oscarpalmer/atoms/is";
7
+ var DataManager = class {
8
+ handlers = Object.freeze({
9
+ add: (data) => void this.add(data, true),
10
+ clear: () => void this.clear(),
11
+ get: (active) => this.get(active),
12
+ remove: (items) => void this.remove(items, true),
13
+ synchronize: (data, remove) => void this.synchronize(data, remove),
14
+ update: (data) => void this.update(data)
15
+ });
16
+ values = {
17
+ keys: { original: [] },
18
+ objects: {
19
+ mapped: /* @__PURE__ */ new Map(),
20
+ array: []
21
+ }
22
+ };
23
+ get keys() {
24
+ return this.values.keys.active ?? this.values.keys.original;
25
+ }
26
+ get size() {
27
+ return this.keys.length;
28
+ }
29
+ constructor(state) {
30
+ this.state = state;
31
+ }
32
+ async add(data, render) {
33
+ const { state, values } = this;
34
+ const { length } = data;
35
+ const updates = [];
36
+ for (let index = 0; index < length; index += 1) {
37
+ const item = data[index];
38
+ const key = item[state.key];
39
+ if (values.objects.mapped.has(key)) {
40
+ updates.push(item);
41
+ continue;
42
+ }
43
+ values.objects.array.push(item);
44
+ values.objects.mapped.set(key, item);
45
+ if (!state.managers.group.enabled) continue;
46
+ const groupKey = item[state.managers.group.field];
47
+ let group = state.managers.group.get(groupKey);
48
+ if (group == null) {
49
+ group = new GroupComponent(String(groupKey), String(groupKey), groupKey);
50
+ values.objects.array.push(group);
51
+ state.managers.group.add(group);
52
+ }
53
+ if (!group.expanded) state.managers.group.collapsed.add(key);
54
+ group.total += 1;
55
+ }
56
+ if (updates.length > 0) this.update(updates);
57
+ else if (render) this.render();
58
+ }
59
+ clear() {
60
+ if (this.values.objects.array.length > 0) this.set([]);
61
+ }
62
+ destroy() {
63
+ const { values } = this;
64
+ values.objects.mapped.clear();
65
+ values.keys.active = void 0;
66
+ values.keys.original.length = 0;
67
+ values.objects.array.length = 0;
68
+ this.handlers = void 0;
69
+ this.state = void 0;
70
+ this.values = void 0;
71
+ }
72
+ get(active) {
73
+ const { values } = this;
74
+ return active ?? false ? select(values.keys.active ?? [], (key) => !(key instanceof GroupComponent), (key) => values.objects.mapped.get(key)) : values.objects.array.filter((item) => !(item instanceof GroupComponent));
75
+ }
76
+ getIndex(key) {
77
+ return this.keys.indexOf(key);
78
+ }
79
+ async remove(items, render) {
80
+ const { state, values } = this;
81
+ const keys = items.map((value) => isPlainObject(value) ? value[state.key] : value).filter((key) => values.objects.mapped.has(key));
82
+ const { length } = keys;
83
+ if (length === 0) return;
84
+ for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
85
+ const key = keys[keyIndex];
86
+ values.objects.mapped.delete(key);
87
+ const arrayIndex = values.objects.array.findIndex((item) => !(item instanceof GroupComponent) && item[state.key] === key);
88
+ let item;
89
+ if (arrayIndex > -1) [item] = values.objects.array.splice(arrayIndex, 1);
90
+ values.keys.original.splice(values.keys.original.indexOf(key), 1);
91
+ state.managers.row.remove(key);
92
+ if (!state.managers.group.enabled || item == null) continue;
93
+ state.managers.group.collapsed.delete(key);
94
+ const groupKey = item[state.managers.group.field];
95
+ const group = state.managers.group.get(groupKey);
96
+ if (group == null) continue;
97
+ group.total -= 1;
98
+ if (group.total > 0) continue;
99
+ const groupIndex = values.objects.array.findIndex((item) => item instanceof GroupComponent && item.value === groupKey);
100
+ if (groupIndex > -1) values.objects.array.splice(groupIndex, 1);
101
+ state.managers.group.remove(group);
102
+ }
103
+ if (render) this.render();
104
+ }
105
+ render() {
106
+ const { state, values } = this;
107
+ if (state.managers.group.enabled) sortWithGroups(state, values.objects.array, [{
108
+ direction: "ascending",
109
+ key: state.key
110
+ }]);
111
+ else sort(values.objects.array, [{
112
+ direction: "ascending",
113
+ key: state.key
114
+ }]);
115
+ values.keys.original = values.objects.array.map((item) => item instanceof GroupComponent ? item : item[state.key]);
116
+ values.objects.mapped = toMap(values.objects.array.filter((item) => !(item instanceof GroupComponent)), (item) => item[state.key]);
117
+ if (Object.keys(state.managers.filter.items).length > 0) state.managers.filter.filter();
118
+ else if (state.managers.sort.items.length > 0) state.managers.sort.sort();
119
+ else state.managers.render.update(true, true);
120
+ }
121
+ set(data) {
122
+ const { state, values } = this;
123
+ const array = data.slice();
124
+ if (state.managers.group.enabled) {
125
+ const grouped = toRecord.arrays(data, state.managers.group.field);
126
+ const entries = Object.entries(grouped);
127
+ const { length } = entries;
128
+ const groups = [];
129
+ for (let index = 0; index < length; index += 1) {
130
+ const [value, items] = entries[index];
131
+ const key = String(value);
132
+ const group = new GroupComponent(key, key, value);
133
+ group.total = items.length;
134
+ groups.push(group);
135
+ array.push(group);
136
+ }
137
+ state.managers.group.set(groups);
138
+ }
139
+ values.objects.array = array;
140
+ this.render();
141
+ }
142
+ async synchronize(data, remove) {
143
+ const { state, values } = this;
144
+ const add = [];
145
+ const updated = [];
146
+ const keys = /* @__PURE__ */ new Set([]);
147
+ const { length } = data;
148
+ for (let index = 0; index < length; index += 1) {
149
+ const object = data[index];
150
+ const key = object[state.key];
151
+ if (values.objects.mapped.has(key)) updated.push(object);
152
+ else add.push(object);
153
+ keys.add(key);
154
+ }
155
+ if (keys.size === 0) return;
156
+ if (remove ?? false) {
157
+ const toRemove = values.keys.original.filter((key) => !(key instanceof GroupComponent) && !keys.has(key));
158
+ if (toRemove.length > 0) await this.remove(toRemove, false);
159
+ }
160
+ await this.update(updated);
161
+ if (add.length > 0) await this.add(add, false);
162
+ if (add.length > 0 || (remove ?? false)) this.render();
163
+ }
164
+ async update(data) {
165
+ const { state, values } = this;
166
+ const { length } = data;
167
+ for (let index = 0; index < length; index += 1) {
168
+ const object = data[index];
169
+ const key = object[state.key];
170
+ const value = values.objects.mapped.get(key);
171
+ if (value != null) {
172
+ values.objects.mapped.set(key, {
173
+ ...value,
174
+ ...object
175
+ });
176
+ state.managers.row.update(key);
177
+ }
178
+ }
179
+ }
180
+ };
181
+ export { DataManager };
@@ -1,6 +1,5 @@
1
1
  import { on } from "@oscarpalmer/toretto/event";
2
2
  import { findAncestor } from "@oscarpalmer/toretto/find";
3
- //#region src/managers/event.manager.ts
4
3
  var EventManager = class {
5
4
  constructor(state) {
6
5
  this.state = state;
@@ -18,7 +17,7 @@ var EventManager = class {
18
17
  };
19
18
  function onClick(event) {
20
19
  const target = findAncestor(event, "[data-event]");
21
- const table = findAncestor(event, ".tabela__table");
20
+ const table = findAncestor(event, ".tabela");
22
21
  if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) return;
23
22
  const manager = mapped.get(table);
24
23
  if (manager == null) return;
@@ -37,18 +36,18 @@ function onClick(event) {
37
36
  }
38
37
  function onKeydown(event) {
39
38
  const target = findAncestor(event, "[data-event]");
40
- const table = findAncestor(event, ".tabela__table");
39
+ const table = findAncestor(event, ".tabela");
41
40
  if (!(target instanceof HTMLElement) || !(table instanceof HTMLElement)) return;
42
41
  const manager = mapped.get(table);
43
42
  if (manager == null) return;
44
- if (event.key === " ") {
45
- event.preventDefault();
46
- return;
43
+ switch (target?.getAttribute("data-event")) {
44
+ case "body":
45
+ manager.state.managers.navigation.handle(event);
46
+ break;
47
+ default: break;
47
48
  }
48
- manager.state.managers.navigation.handle(event);
49
49
  }
50
- const mapped = /* @__PURE__ */ new WeakMap();
50
+ var mapped = /* @__PURE__ */ new WeakMap();
51
51
  on(document, "click", onClick);
52
52
  on(document, "keydown", onKeydown, { passive: false });
53
- //#endregion
54
53
  export { EventManager };
@@ -1,9 +1,8 @@
1
- import { GroupComponent } from "../components/group.component.mjs";
2
- import { getString } from "@oscarpalmer/atoms/string";
1
+ import { GroupComponent } from "../components/group.component.js";
3
2
  import { getNumber } from "@oscarpalmer/atoms/number";
3
+ import { getString } from "@oscarpalmer/atoms/string";
4
4
  import { endsWith, includes, startsWith } from "@oscarpalmer/atoms/string/match";
5
5
  import { equal } from "@oscarpalmer/atoms/value/equal";
6
- //#region src/managers/filter.manager.ts
7
6
  var FilterManager = class {
8
7
  handlers = Object.freeze({
9
8
  add: (item) => this.add(item),
@@ -17,7 +16,7 @@ var FilterManager = class {
17
16
  }
18
17
  add(item) {
19
18
  if (this.items[item.field] == null) this.items[item.field] = [];
20
- else if (this.items[item.field].findIndex((existing) => equal(existing, item)) > -1) return;
19
+ else if (this.items[item.field].findIndex((existing) => equal(existing, item)) !== -1) return;
21
20
  this.items[item.field].push(item);
22
21
  this.filter();
23
22
  }
@@ -36,14 +35,14 @@ var FilterManager = class {
36
35
  const { state } = this;
37
36
  const filtered = [];
38
37
  const filters = Object.entries(this.items);
39
- const itemsLength = state.managers.data.state.items.original.length;
40
- rowLoop: for (let itemIndex = 0; itemIndex < itemsLength; itemIndex += 1) {
41
- const item = state.managers.data.state.items.original[itemIndex];
42
- if (item instanceof GroupComponent) {
43
- filtered.push(item);
38
+ const keysLength = state.managers.data.values.keys.original.length;
39
+ rowLoop: for (let keyIndex = 0; keyIndex < keysLength; keyIndex += 1) {
40
+ const key = state.managers.data.values.keys.original[keyIndex];
41
+ if (key instanceof GroupComponent) {
42
+ filtered.push(key);
44
43
  continue;
45
44
  }
46
- const row = state.managers.data.state.values.mapped.get(item);
45
+ const row = state.managers.data.values.objects.mapped.get(key);
47
46
  if (row == null) continue;
48
47
  filterLoop: for (let filterIndex = 0; filterIndex < filters.length; filterIndex += 1) {
49
48
  const [field, items] = filters[filterIndex];
@@ -54,23 +53,16 @@ var FilterManager = class {
54
53
  }
55
54
  continue rowLoop;
56
55
  }
57
- filtered.push(item);
56
+ filtered.push(key);
58
57
  }
59
- state.managers.data.state.items.active = filtered;
58
+ state.managers.data.values.keys.active = filtered;
60
59
  if (state.managers.sort.items.length > 0) state.managers.sort.sort();
61
60
  else state.managers.render.update(true, true);
62
61
  }
63
62
  remove(value) {
64
63
  if (typeof value === "string") {
65
64
  if (this.items[value] == null) return;
66
- const keyed = {};
67
- const filters = Object.keys(this.items);
68
- const { length } = filters;
69
- for (let index = 0; index < length; index += 1) {
70
- const field = filters[index];
71
- if (field !== value) keyed[field] = this.items[field];
72
- }
73
- this.items = keyed;
65
+ this.items = {};
74
66
  } else {
75
67
  const { field } = value;
76
68
  if (this.items[field] == null) return;
@@ -90,7 +82,7 @@ var FilterManager = class {
90
82
  this.filter();
91
83
  }
92
84
  };
93
- const comparators = {
85
+ var comparators = {
94
86
  contains: (row, filter) => includes(getString(row), getString(filter), true),
95
87
  "ends-with": (row, filter) => endsWith(getString(row), getString(filter), true),
96
88
  equals: (row, filter) => equalizer(row, filter),
@@ -102,6 +94,5 @@ const comparators = {
102
94
  "not-equals": (row, filter) => !equalizer(row, filter),
103
95
  "starts-with": (row, filter) => startsWith(getString(row), getString(filter), true)
104
96
  };
105
- const equalizer = equal.initialize({ ignoreCase: true });
106
- //#endregion
97
+ var equalizer = equal.initialize({ ignoreCase: true });
107
98
  export { FilterManager };
@@ -0,0 +1,46 @@
1
+ import { sort } from "@oscarpalmer/atoms/array";
2
+ import { toRecord } from "@oscarpalmer/atoms/array/to-record";
3
+ import { isNullableOrWhitespace } from "@oscarpalmer/atoms/is";
4
+ var GroupManager = class {
5
+ collapsed = /* @__PURE__ */ new Set();
6
+ enabled = false;
7
+ field;
8
+ items = [];
9
+ order = {};
10
+ constructor(state) {
11
+ this.state = state;
12
+ if (isNullableOrWhitespace(state.options.grouping)) return;
13
+ this.enabled = true;
14
+ this.field = state.options.grouping;
15
+ }
16
+ add(group) {
17
+ this.set([...this.items, group]);
18
+ }
19
+ get(value) {
20
+ return this.items.find((item) => item.value === value);
21
+ }
22
+ handle(button) {
23
+ const key = button.dataset.key;
24
+ const group = this.get(key);
25
+ if (group == null) return;
26
+ const { collapsed, items, state } = this;
27
+ group.expanded = !group.expanded;
28
+ const index = items.indexOf(group);
29
+ let first = state.managers.data.values.keys.original.indexOf(items[index]) + 1;
30
+ const last = items[index + 1] == null ? state.managers.data.keys.length - 1 : state.managers.data.values.keys.original.indexOf(items[index + 1]) - 1;
31
+ for (; first <= last; first += 1) {
32
+ const key = state.managers.data.values.keys.original[first];
33
+ if (group.expanded) collapsed.delete(key);
34
+ else collapsed.add(key);
35
+ }
36
+ state.managers.render.update(true, true);
37
+ }
38
+ remove(group) {
39
+ this.set(this.items.filter((item) => item !== group));
40
+ }
41
+ set(items) {
42
+ this.items = sort(items, (item) => item.label);
43
+ this.order = toRecord(items, "value", (_, index) => index);
44
+ }
45
+ };
46
+ export { GroupManager };