@oscarpalmer/tabela 0.14.0 → 0.15.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 (126) hide show
  1. package/dist/components/body.component.d.mts +11 -0
  2. package/dist/components/body.component.mjs +28 -0
  3. package/dist/components/column.component.d.mts +16 -0
  4. package/dist/components/column.component.mjs +46 -0
  5. package/dist/components/footer.component.d.mts +13 -0
  6. package/dist/components/{footer.component.js → footer.component.mjs} +9 -6
  7. package/dist/components/group.component.d.mts +20 -0
  8. package/dist/components/group.component.mjs +57 -0
  9. package/dist/components/header.component.d.mts +13 -0
  10. package/dist/components/header.component.mjs +25 -0
  11. package/dist/components/row.component.d.mts +15 -0
  12. package/dist/components/row.component.mjs +56 -0
  13. package/dist/helpers/dom.helpers.d.mts +12 -0
  14. package/dist/helpers/dom.helpers.mjs +43 -0
  15. package/dist/helpers/misc.helpers.d.mts +12 -0
  16. package/dist/helpers/misc.helpers.mjs +20 -0
  17. package/dist/helpers/style.helper.d.mts +6 -0
  18. package/dist/helpers/style.helper.mjs +8 -0
  19. package/dist/index.d.mts +7 -0
  20. package/dist/{index.js → index.mjs} +3 -1
  21. package/dist/managers/column.manager.d.mts +17 -0
  22. package/dist/managers/{column.manager.js → column.manager.mjs} +11 -6
  23. package/dist/managers/data.manager.d.mts +27 -0
  24. package/dist/managers/data.manager.mjs +256 -0
  25. package/dist/managers/event.manager.d.mts +18 -0
  26. package/dist/managers/event.manager.mjs +79 -0
  27. package/dist/managers/filter.manager.d.mts +18 -0
  28. package/dist/managers/filter.manager.mjs +115 -0
  29. package/dist/managers/group.manager.d.mts +27 -0
  30. package/dist/managers/group.manager.mjs +93 -0
  31. package/dist/managers/navigation.manager.d.mts +15 -0
  32. package/dist/managers/navigation.manager.mjs +80 -0
  33. package/dist/managers/render.manager.d.mts +19 -0
  34. package/dist/managers/render.manager.mjs +157 -0
  35. package/dist/managers/row.manager.d.mts +19 -0
  36. package/dist/managers/row.manager.mjs +45 -0
  37. package/dist/managers/selection.manager.d.mts +23 -0
  38. package/dist/managers/{selection.manager.js → selection.manager.mjs} +38 -31
  39. package/dist/managers/sort.manager.d.mts +23 -0
  40. package/dist/managers/sort.manager.mjs +147 -0
  41. package/dist/managers/style.manager.d.mts +9 -0
  42. package/dist/managers/style.manager.mjs +181 -0
  43. package/dist/models/body.model.d.mts +7 -0
  44. package/dist/models/body.model.mjs +1 -0
  45. package/dist/models/column.model.d.mts +13 -0
  46. package/dist/models/column.model.mjs +1 -0
  47. package/dist/models/data.model.d.mts +28 -0
  48. package/dist/models/data.model.mjs +1 -0
  49. package/dist/models/dom.model.d.mts +19 -0
  50. package/dist/models/dom.model.mjs +19 -0
  51. package/dist/models/event.model.d.mts +99 -0
  52. package/dist/models/event.model.mjs +53 -0
  53. package/dist/models/filter.model.d.mts +26 -0
  54. package/dist/models/filter.model.mjs +13 -0
  55. package/dist/models/footer.model.d.mts +8 -0
  56. package/dist/models/footer.model.mjs +1 -0
  57. package/dist/models/group.model.d.mts +19 -0
  58. package/dist/models/group.model.mjs +5 -0
  59. package/dist/models/header.model.d.mts +7 -0
  60. package/dist/models/header.model.mjs +1 -0
  61. package/dist/models/render.model.d.mts +22 -0
  62. package/dist/models/render.model.mjs +1 -0
  63. package/dist/models/selection.model.d.mts +12 -0
  64. package/dist/models/selection.model.mjs +1 -0
  65. package/dist/models/sort.model.d.mts +19 -0
  66. package/dist/models/sort.model.mjs +5 -0
  67. package/dist/models/style.model.d.mts +29 -0
  68. package/dist/models/style.model.mjs +29 -0
  69. package/dist/models/tabela.model.d.mts +46 -0
  70. package/dist/models/tabela.model.mjs +1 -0
  71. package/dist/models/tabela.options.d.mts +14 -0
  72. package/dist/models/tabela.options.mjs +1 -0
  73. package/dist/tabela.d.mts +22 -0
  74. package/dist/{tabela.full.js → tabela.full.mjs} +1501 -803
  75. package/dist/tabela.mjs +126 -0
  76. package/package.json +2 -4
  77. package/src/components/column.component.ts +4 -4
  78. package/src/components/group.component.ts +6 -2
  79. package/src/components/row.component.ts +5 -5
  80. package/src/helpers/misc.helpers.ts +13 -1
  81. package/src/managers/column.manager.ts +9 -9
  82. package/src/managers/data.manager.ts +139 -53
  83. package/src/managers/event.manager.ts +52 -6
  84. package/src/managers/filter.manager.ts +36 -20
  85. package/src/managers/group.manager.ts +43 -10
  86. package/src/managers/render.manager.ts +30 -17
  87. package/src/managers/sort.manager.ts +81 -52
  88. package/src/managers/style.manager.ts +33 -0
  89. package/src/models/column.model.ts +2 -2
  90. package/src/models/data.model.ts +6 -6
  91. package/src/models/dom.model.ts +0 -2
  92. package/src/models/event.model.ts +168 -0
  93. package/src/models/filter.model.ts +2 -2
  94. package/src/models/group.model.ts +9 -0
  95. package/src/models/render.model.ts +6 -0
  96. package/src/models/sort.model.ts +7 -5
  97. package/src/tabela.ts +6 -2
  98. package/dist/components/body.component.js +0 -23
  99. package/dist/components/column.component.js +0 -41
  100. package/dist/components/group.component.js +0 -28
  101. package/dist/components/header.component.js +0 -22
  102. package/dist/components/row.component.js +0 -48
  103. package/dist/helpers/dom.helpers.js +0 -38
  104. package/dist/helpers/misc.helpers.js +0 -7
  105. package/dist/helpers/style.helper.js +0 -6
  106. package/dist/managers/data.manager.js +0 -181
  107. package/dist/managers/event.manager.js +0 -53
  108. package/dist/managers/filter.manager.js +0 -98
  109. package/dist/managers/group.manager.js +0 -46
  110. package/dist/managers/navigation.manager.js +0 -73
  111. package/dist/managers/render.manager.js +0 -135
  112. package/dist/managers/row.manager.js +0 -38
  113. package/dist/managers/sort.manager.js +0 -122
  114. package/dist/models/body.model.js +0 -0
  115. package/dist/models/column.model.js +0 -0
  116. package/dist/models/data.model.js +0 -0
  117. package/dist/models/filter.model.js +0 -0
  118. package/dist/models/footer.model.js +0 -0
  119. package/dist/models/group.model.js +0 -0
  120. package/dist/models/header.model.js +0 -0
  121. package/dist/models/render.model.js +0 -0
  122. package/dist/models/selection.model.js +0 -0
  123. package/dist/models/sort.model.js +0 -0
  124. package/dist/models/tabela.model.js +0 -0
  125. package/dist/models/tabela.options.js +0 -0
  126. package/dist/tabela.js +0 -105
@@ -0,0 +1,126 @@
1
+ import { ARIA_LABEL, ATTRIBUTE_ROLE, ROLE_TABLE } from "./models/dom.model.mjs";
2
+ import { CSS_TABLE, CSS_WRAPPER } from "./models/style.model.mjs";
3
+ import { createElement } from "./helpers/dom.helpers.mjs";
4
+ import { BodyComponent } from "./components/body.component.mjs";
5
+ import { FooterComponent } from "./components/footer.component.mjs";
6
+ import { HeaderComponent } from "./components/header.component.mjs";
7
+ import { ColumnManager } from "./managers/column.manager.mjs";
8
+ import { SortManager } from "./managers/sort.manager.mjs";
9
+ import { DataManager } from "./managers/data.manager.mjs";
10
+ import { EventManager } from "./managers/event.manager.mjs";
11
+ import { FilterManager } from "./managers/filter.manager.mjs";
12
+ import { GroupManager } from "./managers/group.manager.mjs";
13
+ import { NavigationManager } from "./managers/navigation.manager.mjs";
14
+ import { RenderManager } from "./managers/render.manager.mjs";
15
+ import { RowManager } from "./managers/row.manager.mjs";
16
+ import { SelectionManager } from "./managers/selection.manager.mjs";
17
+ import { StyleManager } from "./managers/style.manager.mjs";
18
+ //#region src/tabela.ts
19
+ var Tabela = class {
20
+ #components;
21
+ #element;
22
+ #id = getId();
23
+ #key;
24
+ #managers = {
25
+ column: void 0,
26
+ data: void 0,
27
+ event: void 0,
28
+ filter: void 0,
29
+ group: void 0,
30
+ navigation: void 0,
31
+ render: void 0,
32
+ row: void 0,
33
+ selection: void 0,
34
+ sort: void 0,
35
+ style: void 0
36
+ };
37
+ #prefix = `tabela_${this.#id}_`;
38
+ #state;
39
+ #table;
40
+ data;
41
+ events;
42
+ filter;
43
+ group;
44
+ selection;
45
+ sort;
46
+ constructor(element, options) {
47
+ this.#element = element;
48
+ element.innerHTML = "";
49
+ element.classList.add(CSS_WRAPPER);
50
+ this.#table = createElement("div", {
51
+ className: CSS_TABLE,
52
+ role: ROLE_TABLE
53
+ }, { [ARIA_LABEL]: options.label });
54
+ this.#key = options.key;
55
+ this.#components = {};
56
+ this.#state = {
57
+ options,
58
+ components: this.#components,
59
+ element: this.#table,
60
+ id: this.#id,
61
+ key: this.#key,
62
+ managers: this.#managers,
63
+ prefix: this.#prefix
64
+ };
65
+ this.#components.body = new BodyComponent(this.#state);
66
+ this.#components.footer = new FooterComponent(this.#state);
67
+ this.#components.header = new HeaderComponent(this.#state);
68
+ this.#managers.column = new ColumnManager(this.#state);
69
+ this.#managers.data = new DataManager(this.#state);
70
+ this.#managers.event = new EventManager(this.#state);
71
+ this.#managers.filter = new FilterManager(this.#state);
72
+ this.#managers.group = new GroupManager(this.#state);
73
+ this.#managers.navigation = new NavigationManager(this.#state);
74
+ this.#managers.render = new RenderManager(this.#state);
75
+ this.#managers.row = new RowManager(this.#state);
76
+ this.#managers.selection = new SelectionManager(this.#state);
77
+ this.#managers.sort = new SortManager(this.#state);
78
+ this.#managers.style = new StyleManager(this.#state);
79
+ this.#table.append(this.#components.header.elements.group, this.#components.body.elements.group, this.#components.footer.elements.group);
80
+ element.append(this.#table);
81
+ this.#managers.data.set(options.data);
82
+ this.data = this.#managers.data.handlers;
83
+ this.events = this.#managers.event.handlers;
84
+ this.filter = this.#managers.filter.handlers;
85
+ this.group = this.#managers.group.handlers;
86
+ this.selection = this.#managers.selection.handlers;
87
+ this.sort = this.#managers.sort.handlers;
88
+ }
89
+ destroy() {
90
+ const components = this.#components;
91
+ const managers = this.#managers;
92
+ const element = this.#element;
93
+ const table = this.#table;
94
+ components.body.destroy();
95
+ components.footer.destroy();
96
+ components.header.destroy();
97
+ managers.column.destroy();
98
+ managers.data.destroy();
99
+ managers.event.destroy();
100
+ managers.filter.destroy();
101
+ managers.group.destroy();
102
+ managers.navigation.destroy();
103
+ managers.render.destroy();
104
+ managers.row.destroy();
105
+ managers.selection.destroy();
106
+ managers.sort.destroy();
107
+ element.innerHTML = "";
108
+ table.innerHTML = "";
109
+ element.classList.remove(CSS_WRAPPER);
110
+ table.removeAttribute(ARIA_LABEL);
111
+ table.removeAttribute(ATTRIBUTE_ROLE);
112
+ this.#state.components = void 0;
113
+ this.#state.managers = void 0;
114
+ this.#state.element = void 0;
115
+ this.#state.options = void 0;
116
+ this.#element = void 0;
117
+ this.#table = void 0;
118
+ }
119
+ };
120
+ function getId() {
121
+ id += 1;
122
+ return id;
123
+ }
124
+ let id = 0;
125
+ //#endregion
126
+ export { Tabela };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oscarpalmer/tabela",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "A modern table.",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -37,12 +37,10 @@
37
37
  "www:js": "vpx tsdown -c ./www/.app/js/tsdown.config.ts --watch"
38
38
  },
39
39
  "dependencies": {
40
- "@oscarpalmer/atoms": "^0.165",
40
+ "@oscarpalmer/atoms": "^0.166",
41
41
  "@oscarpalmer/toretto": "^0.41"
42
42
  },
43
43
  "devDependencies": {
44
- "@oscarpalmer/abydon": "^0.19",
45
- "@oscarpalmer/oui": "^0.19",
46
44
  "@types/node": "^25.5",
47
45
  "@vitest/coverage-istanbul": "^4.1",
48
46
  "concurrently": "^9.2",
@@ -2,7 +2,7 @@ import {createElement} from '../helpers/dom.helpers';
2
2
  import type {Column, TabelaColumn} from '../models/column.model';
3
3
  import {
4
4
  ATTRIBUTE_DATA_EVENT,
5
- ATTRIBUTE_DATA_FIELD,
5
+ ATTRIBUTE_DATA_KEY,
6
6
  ATTRIBUTE_ROLE,
7
7
  ELEMENT_DIV,
8
8
  ROLE_COLUMNHEADER,
@@ -24,7 +24,7 @@ export class ColumnComponent {
24
24
  width,
25
25
  };
26
26
 
27
- this.elements = createHeading(this.options.field, this.options.label, width);
27
+ this.elements = createHeading(this.options.key, this.options.label, width);
28
28
  }
29
29
 
30
30
  destroy(): void {
@@ -43,7 +43,7 @@ type ColumnElements = {
43
43
  wrapper: HTMLDivElement;
44
44
  };
45
45
 
46
- function createHeading(field: string, title: string, width: number): ColumnElements {
46
+ function createHeading(key: string, title: string, width: number): ColumnElements {
47
47
  const wrapper = createElement(
48
48
  ELEMENT_DIV,
49
49
  {
@@ -52,7 +52,7 @@ function createHeading(field: string, title: string, width: number): ColumnEleme
52
52
  },
53
53
  {
54
54
  [ATTRIBUTE_DATA_EVENT]: EVENT_HEADING,
55
- [ATTRIBUTE_DATA_FIELD]: field,
55
+ [ATTRIBUTE_DATA_KEY]: key,
56
56
  },
57
57
  {
58
58
  width: `${width}px`,
@@ -20,7 +20,7 @@ import {
20
20
  ROLE_CELL,
21
21
  ROLE_ROW,
22
22
  } from '../models/dom.model';
23
- import {EVENT_GROUP} from '../models/event.model';
23
+ import {EVENT_GROUP, EVENT_GROUP_UPDATE} from '../models/event.model';
24
24
 
25
25
  export class GroupComponent {
26
26
  element: HTMLElement | undefined;
@@ -85,7 +85,7 @@ export function renderGroup(state: State, component: GroupComponent): void {
85
85
  );
86
86
  }
87
87
 
88
- export function updateGroup(state: State, component: GroupComponent): void {
88
+ export function updateGroup(state: State, component: GroupComponent, emit: boolean): void {
89
89
  if (component.element == null) {
90
90
  return;
91
91
  }
@@ -100,6 +100,10 @@ export function updateGroup(state: State, component: GroupComponent): void {
100
100
  if (total != null) {
101
101
  total.textContent = String(component.total);
102
102
  }
103
+
104
+ if (emit) {
105
+ state.managers.event.emit(EVENT_GROUP_UPDATE, [component]);
106
+ }
103
107
  }
104
108
 
105
109
  const selectedSelector = `.${CSS_GROUP_SELECTED}`;
@@ -66,15 +66,15 @@ export function renderRow(state: State, row: RowComponent): void {
66
66
 
67
67
  for (let index = 0; index < length; index += 1) {
68
68
  const {options} = columns[index];
69
- const {field, width} = options;
69
+ const {key, width} = options;
70
70
 
71
- managers.render.pool.cells[field] ??= [];
71
+ managers.render.pool.cells[key] ??= [];
72
72
 
73
- const cell = managers.render.pool.cells[field].shift() ?? createCell(width);
73
+ const cell = managers.render.pool.cells[key].shift() ?? createCell(width);
74
74
 
75
- cell.textContent = String(getValue(data, field));
75
+ cell.textContent = String(getValue(data, key));
76
76
 
77
- row.cells[field] = cell;
77
+ row.cells[key] = cell;
78
78
 
79
79
  element.append(cell);
80
80
  }
@@ -1,5 +1,13 @@
1
1
  import type {Key} from '@oscarpalmer/atoms/models';
2
- import {GROUP_KEY_EXPRESSION} from '../models/group.model';
2
+ import type {GroupComponent} from '../components/group.component';
3
+ import {EVENTS_NAMES, type EventName} from '../models/event.model';
4
+ import {GROUP_KEY_EXPRESSION, type TabelaGroup} from '../models/group.model';
5
+
6
+ export function getGroup(group: GroupComponent): TabelaGroup {
7
+ return {
8
+ value: group.value.original,
9
+ };
10
+ }
3
11
 
4
12
  export function getKey(value: unknown): Key | undefined {
5
13
  if (typeof value === 'number') {
@@ -13,6 +21,10 @@ export function getKey(value: unknown): Key | undefined {
13
21
  return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
14
22
  }
15
23
 
24
+ export function isEvent(value: unknown): value is EventName {
25
+ return EVENTS_NAMES.has(value as EventName);
26
+ }
27
+
16
28
  export function isGroupKey(key: unknown): boolean {
17
29
  return typeof key === 'string' && GROUP_KEY_EXPRESSION.test(key);
18
30
  }
@@ -20,31 +20,31 @@ export class ColumnManager {
20
20
  this.state = undefined as never;
21
21
  }
22
22
 
23
- get(field: string): ColumnComponent | undefined {
24
- return this.items.find(item => item.options.field === field);
23
+ get(key: string): ColumnComponent | undefined {
24
+ return this.items.find(item => item.options.key === key);
25
25
  }
26
26
 
27
- remove(field: string): void;
27
+ remove(key: string): void;
28
28
 
29
- remove(fields: string[]): void;
29
+ remove(keys: string[]): void;
30
30
 
31
31
  remove(value: unknown): void {
32
32
  const {items, state} = this;
33
33
  const {components, managers} = state;
34
34
 
35
- const fields = (Array.isArray(value) ? value : [value]).filter(
35
+ const keys = (Array.isArray(value) ? value : [value]).filter(
36
36
  item => typeof item === 'string',
37
37
  );
38
38
 
39
- const {length} = fields;
39
+ const {length} = keys;
40
40
 
41
41
  if (length === 0) {
42
42
  return;
43
43
  }
44
44
 
45
- for (let fieldIndex = 0; fieldIndex < length; fieldIndex += 1) {
45
+ for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
46
46
  const itemIndex = items.findIndex(
47
- component => component.options.field === fields[fieldIndex],
47
+ component => component.options.key === keys[keyIndex],
48
48
  );
49
49
 
50
50
  if (itemIndex > -1) {
@@ -57,7 +57,7 @@ export class ColumnManager {
57
57
  components.header.update(items);
58
58
  components.footer.update(items);
59
59
 
60
- managers.render.removeCells(fields);
60
+ managers.render.removeCells(keys);
61
61
  }
62
62
 
63
63
  set(columns: TabelaColumn[]): void {