@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
package/dist/tabela.js ADDED
@@ -0,0 +1,105 @@
1
+ import { BodyComponent } from "./components/body.component.js";
2
+ import { FooterComponent } from "./components/footer.component.js";
3
+ import { HeaderComponent } from "./components/header.component.js";
4
+ import { ColumnManager } from "./managers/column.manager.js";
5
+ import { SortManager } from "./managers/sort.manager.js";
6
+ import { DataManager } from "./managers/data.manager.js";
7
+ import { EventManager } from "./managers/event.manager.js";
8
+ import { FilterManager } from "./managers/filter.manager.js";
9
+ import { GroupManager } from "./managers/group.manager.js";
10
+ import { NavigationManager } from "./managers/navigation.manager.js";
11
+ import { RenderManager } from "./managers/render.manager.js";
12
+ import { RowManager } from "./managers/row.manager.js";
13
+ import { SelectionManager } from "./managers/selection.manager.js";
14
+ var Tabela = class {
15
+ #components = {
16
+ header: void 0,
17
+ body: void 0,
18
+ footer: void 0
19
+ };
20
+ #element;
21
+ #id = getId();
22
+ #key;
23
+ #managers = {
24
+ column: void 0,
25
+ data: void 0,
26
+ event: void 0,
27
+ filter: void 0,
28
+ group: void 0,
29
+ navigation: void 0,
30
+ render: void 0,
31
+ row: void 0,
32
+ selection: void 0,
33
+ sort: void 0
34
+ };
35
+ data;
36
+ filter;
37
+ selection;
38
+ sort;
39
+ get key() {
40
+ return this.#key;
41
+ }
42
+ constructor(element, options) {
43
+ this.#element = element;
44
+ element.innerHTML = "";
45
+ element.role = "table";
46
+ element.classList.add("tabela");
47
+ element.setAttribute("aria-label", options.label);
48
+ this.#key = options.key;
49
+ this.#components.header = new HeaderComponent();
50
+ this.#components.body = new BodyComponent();
51
+ this.#components.footer = new FooterComponent();
52
+ const state = {
53
+ element,
54
+ options,
55
+ components: this.#components,
56
+ id: this.#id,
57
+ key: this.#key,
58
+ managers: this.#managers
59
+ };
60
+ this.#managers.column = new ColumnManager(state);
61
+ this.#managers.data = new DataManager(state);
62
+ this.#managers.event = new EventManager(state);
63
+ this.#managers.filter = new FilterManager(state);
64
+ this.#managers.group = new GroupManager(state);
65
+ this.#managers.navigation = new NavigationManager(state);
66
+ this.#managers.render = new RenderManager(state);
67
+ this.#managers.row = new RowManager(state);
68
+ this.#managers.selection = new SelectionManager(state);
69
+ this.#managers.sort = new SortManager(state);
70
+ element.append(this.#components.header.elements.group, this.#components.body.elements.group, this.#components.footer.elements.group);
71
+ this.#managers.data.set(options.data);
72
+ this.data = this.#managers.data.handlers;
73
+ this.filter = this.#managers.filter.handlers;
74
+ this.selection = this.#managers.selection.handlers;
75
+ this.sort = this.#managers.sort.handlers;
76
+ }
77
+ destroy() {
78
+ const components = this.#components;
79
+ const managers = this.#managers;
80
+ const element = this.#element;
81
+ components.body.destroy();
82
+ components.footer.destroy();
83
+ components.header.destroy();
84
+ managers.column.destroy();
85
+ managers.data.destroy();
86
+ managers.event.destroy();
87
+ managers.filter.destroy();
88
+ managers.render.destroy();
89
+ managers.row.destroy();
90
+ managers.selection.destroy();
91
+ managers.sort.destroy();
92
+ element.innerHTML = "";
93
+ element.role = "";
94
+ element.classList.remove("tabela");
95
+ element.removeAttribute("aria-label");
96
+ element.removeAttribute("role");
97
+ this.#element = void 0;
98
+ }
99
+ };
100
+ function getId() {
101
+ id += 1;
102
+ return id;
103
+ }
104
+ var id = 0;
105
+ export { Tabela };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oscarpalmer/tabela",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "A modern table.",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -1,10 +1,13 @@
1
1
  import {createElement, createRowGroup} from '../helpers/dom.helpers';
2
2
  import type {BodyElements} from '../models/body.model';
3
- import {CSS_TABELA_FAKER, CSS_TABELA_ROWGROUP_BODY} from '../models/style.model';
3
+ import {ATTRIBUTE_DATA_EVENT, ELEMENT_DIV} from '../models/dom.model';
4
+ import {EVENT_BODY} from '../models/event.model';
5
+ import {CSS_FAKER, CSS_ROWGROUP_BODY} from '../models/style.model';
6
+ import type {State} from '../models/tabela.model';
4
7
 
5
8
  function createFaker(): HTMLDivElement {
6
- return createElement('div', {
7
- className: CSS_TABELA_FAKER,
9
+ return createElement(ELEMENT_DIV, {
10
+ className: CSS_FAKER,
8
11
  });
9
12
  }
10
13
 
@@ -14,16 +17,16 @@ export class BodyComponent {
14
17
  group: undefined as never,
15
18
  };
16
19
 
17
- constructor() {
18
- const group = createRowGroup(false);
20
+ constructor(state: State) {
21
+ const group = createRowGroup(state.options.rowHeight, false);
19
22
 
20
23
  this.elements.group = group;
21
24
 
22
- group.className += ` ${CSS_TABELA_ROWGROUP_BODY}`;
25
+ group.className += ` ${CSS_ROWGROUP_BODY}`;
23
26
 
24
27
  group.tabIndex = 0;
25
28
 
26
- group.setAttribute('data-event', 'body');
29
+ group.setAttribute(ATTRIBUTE_DATA_EVENT, EVENT_BODY);
27
30
 
28
31
  group.append(this.elements.faker);
29
32
  }
@@ -1,10 +1,14 @@
1
1
  import {createElement} from '../helpers/dom.helpers';
2
2
  import type {Column, TabelaColumn} from '../models/column.model';
3
3
  import {
4
- CSS_TABELA_HEADING,
5
- CSS_TABELA_HEADING_CONTENT,
6
- CSS_TABELA_HEADING_SORTER,
7
- } from '../models/style.model';
4
+ ATTRIBUTE_DATA_EVENT,
5
+ ATTRIBUTE_DATA_FIELD,
6
+ ATTRIBUTE_ROLE,
7
+ ELEMENT_DIV,
8
+ ROLE_COLUMNHEADER,
9
+ } from '../models/dom.model';
10
+ import {EVENT_HEADING} from '../models/event.model';
11
+ import {CSS_HEADING, CSS_HEADING_CONTENT, CSS_HEADING_SORTER} from '../models/style.model';
8
12
 
9
13
  export class ColumnComponent {
10
14
  elements: ColumnElements;
@@ -13,14 +17,14 @@ export class ColumnComponent {
13
17
  constructor(column: TabelaColumn) {
14
18
  const width =
15
19
  Number.parseInt(getComputedStyle(document.body).fontSize, 10) *
16
- (column.width ?? column.title.length * 1.5);
20
+ (column.width ?? column.label.length * 1.5);
17
21
 
18
22
  this.options = {
19
23
  ...column,
20
24
  width,
21
25
  };
22
26
 
23
- this.elements = createHeading(this.options.field, this.options.title, width);
27
+ this.elements = createHeading(this.options.field, this.options.label, width);
24
28
  }
25
29
 
26
30
  destroy(): void {
@@ -41,27 +45,27 @@ type ColumnElements = {
41
45
 
42
46
  function createHeading(field: string, title: string, width: number): ColumnElements {
43
47
  const wrapper = createElement(
44
- 'div',
48
+ ELEMENT_DIV,
45
49
  {
46
- className: CSS_TABELA_HEADING,
47
- role: 'columnheader',
50
+ className: CSS_HEADING,
51
+ [ATTRIBUTE_ROLE]: ROLE_COLUMNHEADER,
48
52
  },
49
53
  {
50
- 'data-event': 'heading',
51
- 'data-field': field,
54
+ [ATTRIBUTE_DATA_EVENT]: EVENT_HEADING,
55
+ [ATTRIBUTE_DATA_FIELD]: field,
52
56
  },
53
57
  {
54
58
  width: `${width}px`,
55
59
  },
56
60
  );
57
61
 
58
- const content = createElement('div', {
59
- className: CSS_TABELA_HEADING_CONTENT,
62
+ const content = createElement(ELEMENT_DIV, {
63
+ className: CSS_HEADING_CONTENT,
60
64
  textContent: title,
61
65
  });
62
66
 
63
- const sorter = createElement('div', {
64
- className: CSS_TABELA_HEADING_SORTER,
67
+ const sorter = createElement(ELEMENT_DIV, {
68
+ className: CSS_HEADING_SORTER,
65
69
  });
66
70
 
67
71
  wrapper.append(content, sorter);
@@ -1,17 +1,14 @@
1
1
  import {createCell, createRowGroup} from '../helpers/dom.helpers';
2
2
  import type {FooterElements} from '../models/footer.model';
3
- import {
4
- CSS_TABELA_CELL_FOOTER,
5
- CSS_TABELA_ROW_FOOTER,
6
- CSS_TABELA_ROWGROUP_FOOTER,
7
- } from '../models/style.model';
3
+ import {CSS_CELL_FOOTER, CSS_ROW_FOOTER, CSS_ROWGROUP_FOOTER} from '../models/style.model';
4
+ import type {State} from '../models/tabela.model';
8
5
  import type {ColumnComponent} from './column.component';
9
6
 
10
7
  export class FooterComponent {
11
8
  readonly elements: FooterElements;
12
9
 
13
- constructor() {
14
- const {group, row} = createRowGroup();
10
+ constructor(state: State) {
11
+ const {group, row} = createRowGroup(state.options.rowHeight);
15
12
 
16
13
  this.elements = {
17
14
  group,
@@ -19,8 +16,8 @@ export class FooterComponent {
19
16
  cells: [],
20
17
  };
21
18
 
22
- group.className += ` ${CSS_TABELA_ROWGROUP_FOOTER}`;
23
- row.className += ` ${CSS_TABELA_ROW_FOOTER}`;
19
+ group.className += ` ${CSS_ROWGROUP_FOOTER}`;
20
+ row.className += ` ${CSS_ROW_FOOTER}`;
24
21
  }
25
22
 
26
23
  destroy(): void {
@@ -40,7 +37,7 @@ export class FooterComponent {
40
37
  for (let index = 0; index < length; index += 1) {
41
38
  const cell = createCell(columns[index].options.width ?? 4, false);
42
39
 
43
- cell.className += ` ${CSS_TABELA_CELL_FOOTER}`;
40
+ cell.className += ` ${CSS_CELL_FOOTER}`;
44
41
  cell.innerHTML = '&nbsp;';
45
42
 
46
43
  elements.cells.push(cell);
@@ -1,8 +1,26 @@
1
1
  import {getString} from '@oscarpalmer/atoms/string';
2
2
  import {createElement} from '../helpers/dom.helpers';
3
- import type {GroupValue} from '../models/group.model';
4
- import {CSS_TABELA_ROW, CSS_TABELA_ROW_GROUP} from '../models/style.model';
3
+ import {GROUP_KEY_PREFIX, type GroupValue} from '../models/group.model';
4
+ import {
5
+ CSS_BUTTON,
6
+ CSS_BUTTON_GROUP,
7
+ CSS_CELL,
8
+ CSS_CELL_GROUP,
9
+ CSS_GROUP_SELECTED,
10
+ CSS_GROUP_TOTAL,
11
+ CSS_ROW,
12
+ CSS_ROW_GROUP,
13
+ } from '../models/style.model';
5
14
  import type {State} from '../models/tabela.model';
15
+ import {
16
+ ATTRIBUTE_DATA_EVENT,
17
+ ATTRIBUTE_DATA_KEY,
18
+ ATTRIBUTE_ROLE,
19
+ ELEMENT_DIV,
20
+ ROLE_CELL,
21
+ ROLE_ROW,
22
+ } from '../models/dom.model';
23
+ import {EVENT_GROUP} from '../models/event.model';
6
24
 
7
25
  export class GroupComponent {
8
26
  element: HTMLElement | undefined;
@@ -25,7 +43,7 @@ export class GroupComponent {
25
43
  ) {
26
44
  const stringified = getString(value);
27
45
 
28
- this.key = `group:${stringified}`;
46
+ this.key = `${GROUP_KEY_PREFIX}${stringified}`;
29
47
 
30
48
  this.value = {
31
49
  stringified,
@@ -46,19 +64,19 @@ export function removeGroup(group: GroupComponent): void {
46
64
 
47
65
  export function renderGroup(state: State, component: GroupComponent): void {
48
66
  component.element ??= createElement(
49
- 'div',
67
+ ELEMENT_DIV,
50
68
  {
51
- className: `${CSS_TABELA_ROW} ${CSS_TABELA_ROW_GROUP}`,
52
- innerHTML: `<div class="tabela__cell tabela__cell--group" role="cell">
53
- <button class="tabela__button tabela__button--group" data-event="group" data-key="tabela_${state.id}_${component.key}" type="button">
69
+ className: `${CSS_ROW} ${CSS_ROW_GROUP}`,
70
+ innerHTML: `<div class="${CSS_CELL} ${CSS_CELL_GROUP}" role="${ROLE_CELL}">
71
+ <button class="${CSS_BUTTON} ${CSS_BUTTON_GROUP}" ${ATTRIBUTE_DATA_EVENT}="${EVENT_GROUP}" ${ATTRIBUTE_DATA_KEY}="${state.prefix}_${component.key}" type="button">
54
72
  <span aria-hidden="true"></span>
55
73
  <span>Open/close</span>
56
74
  </button>
57
75
  <p>${component.label}</p>
58
- <span class="tabela__group__total">${component.total}</span>
59
- <span class="tabela__group__selected">${component.selected === 0 ? '' : component.selected}</span>
76
+ <span class="${CSS_GROUP_TOTAL}">${component.total}</span>
77
+ <span class="${CSS_GROUP_SELECTED}">${component.selected === 0 ? '' : component.selected}</span>
60
78
  </div>`,
61
- role: 'row',
79
+ [ATTRIBUTE_ROLE]: ROLE_ROW,
62
80
  },
63
81
  {},
64
82
  {
@@ -72,8 +90,8 @@ export function updateGroup(state: State, component: GroupComponent): void {
72
90
  return;
73
91
  }
74
92
 
75
- const selected = component.element.querySelector<HTMLSpanElement>('.tabela__group__selected');
76
- const total = component.element.querySelector<HTMLSpanElement>('.tabela__group__total');
93
+ const selected = component.element.querySelector<HTMLSpanElement>(selectedSelector);
94
+ const total = component.element.querySelector<HTMLSpanElement>(totalSelector);
77
95
 
78
96
  if (selected != null) {
79
97
  selected.textContent = component.selected === 0 ? '' : String(component.selected);
@@ -83,3 +101,7 @@ export function updateGroup(state: State, component: GroupComponent): void {
83
101
  total.textContent = String(component.total);
84
102
  }
85
103
  }
104
+
105
+ const selectedSelector = `.${CSS_GROUP_SELECTED}`;
106
+
107
+ const totalSelector = `.${CSS_GROUP_TOTAL}`;
@@ -1,18 +1,19 @@
1
1
  import {createRowGroup} from '../helpers/dom.helpers';
2
2
  import type {HeaderElements} from '../models/header.model';
3
- import {CSS_TABELA_ROW_HEADER, CSS_TABELA_ROWGROUP_HEADER} from '../models/style.model';
3
+ import {CSS_ROW_HEADER, CSS_ROWGROUP_HEADER} from '../models/style.model';
4
+ import type {State} from '../models/tabela.model';
4
5
  import type {ColumnComponent} from './column.component';
5
6
 
6
7
  export class HeaderComponent {
7
8
  readonly elements: HeaderElements;
8
9
 
9
- constructor() {
10
- const {group, row} = createRowGroup();
10
+ constructor(state: State) {
11
+ const {group, row} = createRowGroup(state.options.rowHeight);
11
12
 
12
13
  this.elements = {group, row};
13
14
 
14
- group.className += ` ${CSS_TABELA_ROWGROUP_HEADER}`;
15
- row.className += ` ${CSS_TABELA_ROW_HEADER}`;
15
+ group.className += ` ${CSS_ROWGROUP_HEADER}`;
16
+ row.className += ` ${CSS_ROW_HEADER}`;
16
17
  }
17
18
 
18
19
  destroy(): void {
@@ -3,8 +3,15 @@ import {getValue} from '@oscarpalmer/atoms/value/handle';
3
3
  import {setAttributes} from '@oscarpalmer/toretto/attribute';
4
4
  import {createCell, createRow} from '../helpers/dom.helpers';
5
5
  import type {RenderElementPool} from '../models/render.model';
6
- import {CSS_TABELA_ROW_BODY, CSS_TABELA_ROW_SELECTED} from '../models/style.model';
6
+ import {CSS_ROW_BODY, CSS_ROW_SELECTED} from '../models/style.model';
7
7
  import type {State} from '../models/tabela.model';
8
+ import {
9
+ ARIA_SELECTED,
10
+ ATTRIBUTE_DATA_ACTIVE,
11
+ ATTRIBUTE_DATA_EVENT,
12
+ ATTRIBUTE_DATA_KEY,
13
+ } from '../models/dom.model';
14
+ import {EVENT_ROW} from '../models/event.model';
8
15
 
9
16
  export function removeRow(pool: RenderElementPool, row: RowComponent): void {
10
17
  if (row.element != null) {
@@ -20,36 +27,38 @@ export function removeRow(pool: RenderElementPool, row: RowComponent): void {
20
27
  }
21
28
 
22
29
  export function renderRow(state: State, row: RowComponent): void {
23
- const element = row.element ?? state.managers.render.pool.rows.shift() ?? createRow();
30
+ const {managers, options, prefix} = state;
31
+
32
+ const element = row.element ?? managers.render.pool.rows.shift() ?? createRow(options.rowHeight);
24
33
 
25
34
  row.element = element;
26
35
 
27
36
  element.innerHTML = '';
28
37
 
29
- const selected = state.managers.selection.items.has(row.key);
38
+ const selected = managers.selection.items.has(row.key);
30
39
 
31
40
  const key = String(row.key);
32
41
 
33
42
  setAttributes(element, {
34
- 'aria-selected': String(selected),
35
- 'data-active': String(state.managers.navigation.active === row.key),
36
- 'data-event': 'row',
37
- 'data-key': key,
38
- id: `tabela_${state.id}_${key}`,
43
+ [ARIA_SELECTED]: String(selected),
44
+ [ATTRIBUTE_DATA_ACTIVE]: String(managers.navigation.active === row.key),
45
+ [ATTRIBUTE_DATA_EVENT]: EVENT_ROW,
46
+ [ATTRIBUTE_DATA_KEY]: key,
47
+ id: `${prefix}${key}`,
39
48
  });
40
49
 
41
- element.classList.add(CSS_TABELA_ROW_BODY);
50
+ element.classList.add(CSS_ROW_BODY);
42
51
 
43
52
  if (selected) {
44
- element.classList.add(CSS_TABELA_ROW_SELECTED);
53
+ element.classList.add(CSS_ROW_SELECTED);
45
54
  } else {
46
- element.classList.remove(CSS_TABELA_ROW_SELECTED);
55
+ element.classList.remove(CSS_ROW_SELECTED);
47
56
  }
48
57
 
49
- const columns = state.managers.column.items;
58
+ const columns = managers.column.items;
50
59
  const {length} = columns;
51
60
 
52
- const data = state.managers.data.state.values.mapped.get(row.key);
61
+ const data = managers.data.state.values.mapped.get(row.key);
53
62
 
54
63
  if (data == null) {
55
64
  return;
@@ -57,16 +66,15 @@ export function renderRow(state: State, row: RowComponent): void {
57
66
 
58
67
  for (let index = 0; index < length; index += 1) {
59
68
  const {options} = columns[index];
69
+ const {field, width} = options;
60
70
 
61
- state.managers.render.pool.cells[options.field] ??= [];
71
+ managers.render.pool.cells[field] ??= [];
62
72
 
63
- const cell =
64
- state.managers.render.pool.cells[columns[index].options.field].shift() ??
65
- createCell(options.width);
73
+ const cell = managers.render.pool.cells[field].shift() ?? createCell(width);
66
74
 
67
- cell.textContent = String(getValue(data, options.field));
75
+ cell.textContent = String(getValue(data, field));
68
76
 
69
- row.cells[options.field] = cell;
77
+ row.cells[field] = cell;
70
78
 
71
79
  element.append(cell);
72
80
  }
@@ -1,11 +1,7 @@
1
1
  import {setAttributes} from '@oscarpalmer/toretto/attribute';
2
2
  import {setStyles} from '@oscarpalmer/toretto/style';
3
- import {
4
- CSS_TABELA_CELL,
5
- CSS_TABELA_CELL_BODY,
6
- CSS_TABELA_ROW,
7
- CSS_TABELA_ROWGROUP,
8
- } from '../models/style.model';
3
+ import {ELEMENT_DIV, ROLE_CELL, ROLE_ROW, ROLE_ROWGROUP} from '../models/dom.model';
4
+ import {CSS_CELL, CSS_CELL_BODY, CSS_ROW, CSS_ROWGROUP} from '../models/style.model';
9
5
 
10
6
  type RowGroupWithRow = {
11
7
  group: HTMLDivElement;
@@ -14,10 +10,10 @@ type RowGroupWithRow = {
14
10
 
15
11
  export function createCell(width: number, body?: boolean): HTMLDivElement {
16
12
  const cell = createElement(
17
- 'div',
13
+ ELEMENT_DIV,
18
14
  {
19
- className: CSS_TABELA_CELL,
20
- role: 'cell',
15
+ className: CSS_CELL,
16
+ role: ROLE_CELL,
21
17
  },
22
18
  {},
23
19
  {
@@ -26,7 +22,7 @@ export function createCell(width: number, body?: boolean): HTMLDivElement {
26
22
  );
27
23
 
28
24
  if (body ?? true) {
29
- cell.classList.add(CSS_TABELA_CELL_BODY);
25
+ cell.classList.add(CSS_CELL_BODY);
30
26
  }
31
27
 
32
28
  return cell;
@@ -53,37 +49,37 @@ export function createElement<TagName extends keyof HTMLElementTagNameMap>(
53
49
  return element;
54
50
  }
55
51
 
56
- export function createRowGroup(): RowGroupWithRow;
52
+ export function createRowGroup(height: number): RowGroupWithRow;
57
53
 
58
- export function createRowGroup(withRow: boolean): HTMLDivElement;
54
+ export function createRowGroup(height: number, withRow: boolean): HTMLDivElement;
59
55
 
60
- export function createRowGroup(withRow?: boolean) {
61
- const group = createElement('div', {
62
- className: CSS_TABELA_ROWGROUP,
63
- role: 'rowgroup',
56
+ export function createRowGroup(height: number, withRow?: boolean) {
57
+ const group = createElement(ELEMENT_DIV, {
58
+ className: CSS_ROWGROUP,
59
+ role: ROLE_ROWGROUP,
64
60
  });
65
61
 
66
62
  if (!(withRow ?? true)) {
67
63
  return group;
68
64
  }
69
65
 
70
- const row = createRow();
66
+ const row = createRow(height);
71
67
 
72
68
  group.append(row);
73
69
 
74
70
  return {group, row};
75
71
  }
76
72
 
77
- export function createRow(): HTMLDivElement {
73
+ export function createRow(height: number): HTMLDivElement {
78
74
  const row = createElement(
79
- 'div',
75
+ ELEMENT_DIV,
80
76
  {
81
- className: CSS_TABELA_ROW,
82
- role: 'row',
77
+ className: CSS_ROW,
78
+ role: ROLE_ROW,
83
79
  },
84
80
  {},
85
81
  {
86
- height: '32px',
82
+ height: `${height}px`,
87
83
  },
88
84
  );
89
85
 
@@ -1,4 +1,5 @@
1
1
  import type {Key} from '@oscarpalmer/atoms/models';
2
+ import {GROUP_KEY_EXPRESSION} from '../models/group.model';
2
3
 
3
4
  export function getKey(value: unknown): Key | undefined {
4
5
  if (typeof value === 'number') {
@@ -12,4 +13,8 @@ export function getKey(value: unknown): Key | undefined {
12
13
  return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
13
14
  }
14
15
 
16
+ export function isGroupKey(key: unknown): boolean {
17
+ return typeof key === 'string' && GROUP_KEY_EXPRESSION.test(key);
18
+ }
19
+
15
20
  const integerExpression = /^\d+$/;