@oscarpalmer/tabela 0.12.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 (160) 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} +8 -5
  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} +13 -9
  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} +9 -8
  38. package/dist/managers/filter.manager.d.mts +2 -0
  39. package/dist/managers/{filter.manager.js → filter.manager.mjs} +23 -14
  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.js → render.manager.mjs} +35 -26
  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} +32 -28
  50. package/dist/managers/sort.manager.d.mts +2 -0
  51. package/dist/managers/{sort.manager.js → sort.manager.mjs} +12 -9
  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} +1073 -756
  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 +13 -18
  89. package/src/components/footer.component.ts +8 -3
  90. package/src/components/group.component.ts +48 -6
  91. package/src/components/header.component.ts +3 -2
  92. package/src/components/row.component.ts +8 -6
  93. package/src/helpers/dom.helpers.ts +21 -19
  94. package/src/helpers/style.helper.ts +1 -1
  95. package/src/managers/column.manager.ts +4 -0
  96. package/src/managers/data.manager.ts +170 -100
  97. package/src/managers/event.manager.ts +9 -10
  98. package/src/managers/filter.manager.ts +23 -12
  99. package/src/managers/group.manager.ts +63 -11
  100. package/src/managers/navigation.manager.ts +23 -22
  101. package/src/managers/render.manager.ts +43 -29
  102. package/src/managers/row.manager.ts +21 -9
  103. package/src/managers/selection.manager.ts +28 -21
  104. package/src/managers/sort.manager.ts +22 -20
  105. package/src/managers/style.manager.ts +156 -0
  106. package/src/models/data.model.ts +11 -8
  107. package/src/models/group.model.ts +6 -2
  108. package/src/models/style.model.ts +39 -0
  109. package/src/models/tabela.model.ts +10 -8
  110. package/src/tabela.ts +65 -33
  111. package/dist/components/group.component.js +0 -28
  112. package/dist/helpers/style.helper.js +0 -6
  113. package/dist/managers/data.manager.js +0 -181
  114. package/dist/managers/group.manager.js +0 -46
  115. package/dist/models/body.model.js +0 -0
  116. package/dist/models/column.model.js +0 -0
  117. package/dist/models/data.model.js +0 -0
  118. package/dist/models/filter.model.js +0 -0
  119. package/dist/models/footer.model.js +0 -0
  120. package/dist/models/group.model.js +0 -0
  121. package/dist/models/header.model.js +0 -0
  122. package/dist/models/render.model.js +0 -0
  123. package/dist/models/selection.model.js +0 -0
  124. package/dist/models/sort.model.js +0 -0
  125. package/dist/models/tabela.model.js +0 -0
  126. package/dist/models/tabela.options.js +0 -0
  127. package/dist/tabela.js +0 -105
  128. package/types/components/body.component.d.ts +0 -6
  129. package/types/components/column.component.d.ts +0 -13
  130. package/types/components/footer.component.d.ts +0 -8
  131. package/types/components/group.component.d.ts +0 -14
  132. package/types/components/header.component.d.ts +0 -8
  133. package/types/components/row.component.d.ts +0 -11
  134. package/types/helpers/dom.helpers.d.ts +0 -10
  135. package/types/helpers/misc.helpers.d.ts +0 -2
  136. package/types/helpers/style.helper.d.ts +0 -1
  137. package/types/index.d.ts +0 -4
  138. package/types/managers/column.manager.d.ts +0 -12
  139. package/types/managers/data.manager.d.ts +0 -29
  140. package/types/managers/event.manager.d.ts +0 -7
  141. package/types/managers/filter.manager.d.ts +0 -19
  142. package/types/managers/group.manager.d.ts +0 -17
  143. package/types/managers/navigation.manager.d.ts +0 -10
  144. package/types/managers/render.manager.d.ts +0 -17
  145. package/types/managers/row.manager.d.ts +0 -13
  146. package/types/managers/selection.manager.d.ts +0 -24
  147. package/types/managers/sort.manager.d.ts +0 -28
  148. package/types/models/body.model.d.ts +0 -4
  149. package/types/models/column.model.d.ts +0 -13
  150. package/types/models/data.model.d.ts +0 -24
  151. package/types/models/filter.model.d.ts +0 -13
  152. package/types/models/footer.model.d.ts +0 -5
  153. package/types/models/group.model.d.ts +0 -4
  154. package/types/models/header.model.d.ts +0 -4
  155. package/types/models/render.model.d.ts +0 -13
  156. package/types/models/selection.model.d.ts +0 -8
  157. package/types/models/sort.model.d.ts +0 -12
  158. package/types/models/tabela.model.d.ts +0 -39
  159. package/types/models/tabela.options.d.ts +0 -10
  160. package/types/tabela.d.ts +0 -15
@@ -1,8 +1,10 @@
1
- import {sort, type ArrayKeySorter} from '@oscarpalmer/atoms/array';
1
+ import {sort} from '@oscarpalmer/atoms/array';
2
2
  import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
3
3
  import {compare} from '@oscarpalmer/atoms/value/compare';
4
+ import {getValue} from '@oscarpalmer/atoms/value/handle';
4
5
  import {setAttribute, setAttributes} from '@oscarpalmer/toretto/attribute';
5
6
  import {GroupComponent} from '../components/group.component';
7
+ import type {DataItem} from '../models/data.model';
6
8
  import type {TabelaSort, TabelaSortDirection, TabelaSortItem} from '../models/sort.model';
7
9
  import type {State} from '../models/tabela.model';
8
10
 
@@ -15,7 +17,7 @@ export class SortManager {
15
17
  set: items => this.set(items),
16
18
  } satisfies TabelaSort);
17
19
 
18
- items: ArrayKeySorter<PlainObject>[] = [];
20
+ items: PlainObject[] = [];
19
21
 
20
22
  constructor(public state: State) {}
21
23
 
@@ -120,8 +122,8 @@ export class SortManager {
120
122
  );
121
123
  }
122
124
 
123
- state.managers.data.values.keys.active =
124
- items.length === 0 ? undefined : getSortedKeys(state, items);
125
+ state.managers.data.state.items.active =
126
+ items.length === 0 ? undefined : getSortedItems(state, items);
125
127
 
126
128
  state.managers.render.update(true, true);
127
129
  }
@@ -143,43 +145,40 @@ export class SortManager {
143
145
  }
144
146
  }
145
147
 
146
- function getSortedKeys(
147
- state: State,
148
- sorters: ArrayKeySorter<PlainObject>[],
149
- ): Array<GroupComponent | Key> {
148
+ function getSortedItems(state: State, sorters: PlainObject[]): DataItem[] {
150
149
  const data =
151
- state.managers.data.values.keys.active?.map(key =>
152
- key instanceof GroupComponent ? key : state.managers.data.values.objects.mapped.get(key)!,
153
- ) ?? state.managers.data.values.objects.array.slice();
150
+ state.managers.data.state.items.active?.map(key =>
151
+ key instanceof GroupComponent ? key : state.managers.data.state.values.mapped.get(key)!,
152
+ ) ?? state.managers.data.state.values.array.slice();
154
153
 
155
154
  if (!state.managers.group.enabled) {
156
- return sort(data as PlainObject[], sorters).map(
157
- item => (item as PlainObject)[state.key] as Key,
155
+ return sort(data as PlainObject[], sorters as never).map(
156
+ item => getValue(item, state.key) as Key,
158
157
  );
159
158
  }
160
159
 
161
160
  return sortWithGroups(state, data, sorters).map(item =>
162
- item instanceof GroupComponent ? item : (item[state.key] as Key),
161
+ item instanceof GroupComponent ? item : (getValue(item, state.key) as Key),
163
162
  );
164
163
  }
165
164
 
166
165
  export function sortWithGroups(
167
166
  state: State,
168
167
  data: Array<GroupComponent | PlainObject>,
169
- sorters: ArrayKeySorter<PlainObject>[],
168
+ sorters: PlainObject[],
170
169
  ): Array<GroupComponent | PlainObject> {
171
170
  const {length} = sorters;
172
171
 
173
172
  return data.sort((first, second) => {
174
173
  const firstValue =
175
174
  first instanceof GroupComponent
176
- ? first.value
177
- : (first as PlainObject)[state.managers.group.field];
175
+ ? first.value.stringified
176
+ : getValue(first, state.managers.group.field);
178
177
 
179
178
  const secondValue =
180
179
  second instanceof GroupComponent
181
- ? second.value
182
- : (second as PlainObject)[state.managers.group.field];
180
+ ? second.value.stringified
181
+ : getValue(second, state.managers.group.field);
183
182
 
184
183
  const firstOrder = state.managers.group.order[firstValue as never];
185
184
  const secondOrder = state.managers.group.order[secondValue as never];
@@ -200,7 +199,10 @@ export function sortWithGroups(
200
199
  for (let index = 0; index < length; index += 1) {
201
200
  const sorter = sorters[index];
202
201
 
203
- const comparison = compare(first[sorter.key], second[sorter.key]);
202
+ const comparison = compare(
203
+ getValue(first, (sorter as any).key),
204
+ getValue(second, (sorter as any).key),
205
+ );
204
206
 
205
207
  if (comparison !== 0) {
206
208
  return comparison * (sorter.direction === 'ascending' ? 1 : -1);
@@ -0,0 +1,156 @@
1
+ import type {State} from '../models/tabela.model';
2
+
3
+ export class StyleManager {
4
+ constructor(readonly state: State) {
5
+ if (appended) {
6
+ return;
7
+ }
8
+
9
+ appended = true;
10
+
11
+ const style = document.createElement('style');
12
+
13
+ style.textContent = styling;
14
+
15
+ document.head.appendChild(style);
16
+ }
17
+ }
18
+
19
+ const styling = //css
20
+ `/** Table */
21
+
22
+ :where(.tabela) {
23
+ flex: 1;
24
+ position: relative;
25
+ background-color: var(--oui-absolute);
26
+ border: 1px solid grey;
27
+ }
28
+
29
+ :where(.tabela__table) {
30
+ min-height: 24em;
31
+ display: flex;
32
+ flex-flow: column nowrap;
33
+ flex: 1;
34
+ overflow: auto;
35
+ position: absolute;
36
+ inset: 0;
37
+ }
38
+
39
+ /** Row group */
40
+
41
+ :where(.tabela__rowgroup--header),
42
+ :where(.tabela__rowgroup--footer) {
43
+ background-color: white;
44
+ position: sticky;
45
+ left: 0;
46
+ z-index: 10;
47
+ }
48
+
49
+ :where(.tabela__rowgroup--header) {
50
+ top: 0;
51
+ }
52
+
53
+ :where(.tabela__rowgroup--footer) {
54
+ bottom: 0;
55
+ }
56
+
57
+ :where(.tabela__rowgroup--body) {
58
+ display: flex;
59
+ flex-flow: column nowrap;
60
+ flex: 1;
61
+ }
62
+
63
+ :where(.tabela__rowgroup--body:focus) {
64
+ outline: none;
65
+ }
66
+
67
+ :where(.tabela:has(.tabela__rowgroup--body:focus-visible)) {
68
+ outline: 2px solid var(--oui-blue-6);
69
+ outline-offset: 2px;
70
+ }
71
+
72
+ /** Row */
73
+
74
+ :where(.tabela__row) {
75
+ width: 100%;
76
+ display: flex;
77
+ flex-flow: row nowrap;
78
+ }
79
+
80
+ :where(.tabela__row:last-child .tabela__cell) {
81
+ border-bottom-width: 0;
82
+ }
83
+
84
+ :where(.tabela__row--body),
85
+ :where(.tabela__row--group) {
86
+ flex: 1;
87
+ position: absolute;
88
+ }
89
+
90
+ :where(.tabela__row--selected) {
91
+ background-color: var(--oui-blue-1);
92
+ color: var(--oui-blue-9);
93
+ }
94
+
95
+ :where(.tabela:has(.tabela__rowgroup--body:focus-visible) .tabela__row[data-active="true"]) {
96
+ outline: 2px solid var(--oui-blue-6);
97
+ outline-offset: 2px;
98
+ }
99
+
100
+ /** Cells */
101
+
102
+ :where(.tabela__cell),
103
+ :where(.tabela__heading) {
104
+ padding: 0.5em;
105
+ border-color: gray;
106
+ border-style: solid;
107
+ border-width: 0 1px 1px 0;
108
+ line-height: 1;
109
+ }
110
+
111
+ :where(.tabela__row .tabela__cell:last-child),
112
+ :where(.tabela__row .tabela__heading:last-child) {
113
+ flex: 1;
114
+ border-right-width: 0;
115
+ }
116
+
117
+ :where(.tabela__cell) {
118
+ overflow: hidden;
119
+ text-overflow: ellipsis;
120
+ white-space: nowrap;
121
+ }
122
+
123
+ :where(.tabela__cell--footer) {
124
+ border-top-width: 1px;
125
+ border-bottom-width: 0;
126
+ }
127
+
128
+ :where(.tabela__cell--group) {
129
+ padding: 0;
130
+ display: flex;
131
+ flex-flow: row nowrap;
132
+ align-items: center;
133
+ gap: 0.5em;
134
+ }
135
+
136
+ :where(.tabela__cell--group .tabela__button) {
137
+ margin: 0 0 0 .25rem;
138
+ }
139
+
140
+ /** Misc. */
141
+
142
+ :where(.tabela__button) {
143
+ font-size: .75rem;
144
+ font-weight: bold;
145
+ }
146
+
147
+ :where(.tabela__selection) {
148
+ background-color: color-mix(in oklch, var(--oui-blue-6), transparent);
149
+ border: 1px solid var(--oui-blue-6);
150
+ border-radius: .25rem;
151
+ position: fixed;
152
+ z-index: 1000;
153
+ }
154
+ `.replace(/^\s+|\s+|\s+$/g, ' ');
155
+
156
+ let appended = false;
@@ -1,17 +1,20 @@
1
1
  import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
2
2
  import type {GroupComponent} from '../components/group.component';
3
+ import type {State} from './tabela.model';
3
4
 
4
- export type DataValues = {
5
- keys: DataValuesKeys;
6
- objects: DataValuesObjects;
7
- };
5
+ export type DataItem = GroupComponent | Key;
8
6
 
9
- type DataValuesKeys = {
10
- active?: Array<GroupComponent | Key>;
11
- original: Array<GroupComponent | Key>;
7
+ type DataItems = {
8
+ active?: Array<DataItem>;
9
+ original: Array<DataItem>;
12
10
  };
13
11
 
14
- type DataValuesObjects = {
12
+ export type DataState = {
13
+ items: DataItems;
14
+ values: DataValues;
15
+ } & State;
16
+
17
+ type DataValues = {
15
18
  array: Array<GroupComponent | PlainObject>;
16
19
  mapped: Map<Key, PlainObject>;
17
20
  };
@@ -1,4 +1,8 @@
1
+ export type GroupValue = {
2
+ original: unknown;
3
+ stringified: string;
4
+ };
5
+
1
6
  export type TabelaGroup = {
2
- label: string;
3
- value: unknown;
7
+ set(group?: string): void;
4
8
  };
@@ -0,0 +1,39 @@
1
+ export const CSS_TABELA = 'tabela';
2
+
3
+ export const CSS_TABELA_CELL = 'tabela__cell';
4
+
5
+ export const CSS_TABELA_CELL_BODY = 'tabela__cell--body';
6
+
7
+ export const CSS_TABELA_CELL_FOOTER = 'tabela__cell--footer';
8
+
9
+ export const CSS_TABELA_FAKER = 'tabela__faker';
10
+
11
+ export const CSS_TABELA_HEADING = 'tabela__heading';
12
+
13
+ export const CSS_TABELA_HEADING_CONTENT = 'tabela__heading__content';
14
+
15
+ export const CSS_TABELA_HEADING_SORTER = 'tabela__heading__sorter';
16
+
17
+ export const CSS_TABELA_ROW = 'tabela__row';
18
+
19
+ export const CSS_TABELA_ROW_BODY = 'tabela__row--body';
20
+
21
+ export const CSS_TABELA_ROW_FOOTER = 'tabela__row--footer';
22
+
23
+ export const CSS_TABELA_ROW_GROUP = 'tabela__row--group tabela__group';
24
+
25
+ export const CSS_TABELA_ROW_HEADER = 'tabela__row--header';
26
+
27
+ export const CSS_TABELA_ROW_SELECTED = 'tabela__row--selected';
28
+
29
+ export const CSS_TABELA_ROWGROUP = 'tabela__rowgroup';
30
+
31
+ export const CSS_TABELA_ROWGROUP_BODY = 'tabela__rowgroup--body';
32
+
33
+ export const CSS_TABELA_ROWGROUP_FOOTER = 'tabela__rowgroup--footer';
34
+
35
+ export const CSS_TABELA_ROWGROUP_HEADER = 'tabela__rowgroup--header';
36
+
37
+ export const CSS_TABELA_SELECTION = 'tabela__selection';
38
+
39
+ export const CSS_TABELA_TABLE = 'tabela__table';
@@ -5,12 +5,13 @@ import type {ColumnManager} from '../managers/column.manager';
5
5
  import type {DataManager} from '../managers/data.manager';
6
6
  import type {EventManager} from '../managers/event.manager';
7
7
  import type {FilterManager} from '../managers/filter.manager';
8
- import type { GroupManager } from '../managers/group.manager';
8
+ import type {GroupManager} from '../managers/group.manager';
9
9
  import type {NavigationManager} from '../managers/navigation.manager';
10
10
  import type {RenderManager} from '../managers/render.manager';
11
11
  import type {RowManager} from '../managers/row.manager';
12
12
  import type {SelectionManager} from '../managers/selection.manager';
13
13
  import type {SortManager} from '../managers/sort.manager';
14
+ import type {StyleManager} from '../managers/style.manager';
14
15
  import type {TabelaOptions} from './tabela.options';
15
16
 
16
17
  export type Components = {
@@ -26,17 +27,18 @@ export type Managers = {
26
27
  filter: FilterManager;
27
28
  group: GroupManager;
28
29
  navigation: NavigationManager;
30
+ render: RenderManager;
29
31
  row: RowManager;
30
32
  selection: SelectionManager;
31
33
  sort: SortManager;
32
- render: RenderManager;
34
+ style: StyleManager;
33
35
  };
34
36
 
35
37
  export type State = {
36
- readonly components: Components;
37
- readonly element: HTMLElement;
38
- readonly id: number;
39
- readonly key: string;
40
- readonly managers: Managers;
41
- readonly options: TabelaOptions;
38
+ components: Components;
39
+ element: HTMLElement;
40
+ id: number;
41
+ key: string;
42
+ managers: Managers;
43
+ options: TabelaOptions;
42
44
  };
package/src/tabela.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import {BodyComponent} from './components/body.component';
2
2
  import {FooterComponent} from './components/footer.component';
3
3
  import {HeaderComponent} from './components/header.component';
4
+ import {createElement} from './helpers/dom.helpers';
4
5
  import {ColumnManager} from './managers/column.manager';
5
6
  import {DataManager} from './managers/data.manager';
6
7
  import {EventManager} from './managers/event.manager';
@@ -11,27 +12,28 @@ import {RenderManager} from './managers/render.manager';
11
12
  import {RowManager} from './managers/row.manager';
12
13
  import {SelectionManager} from './managers/selection.manager';
13
14
  import {SortManager} from './managers/sort.manager';
15
+ import {StyleManager} from './managers/style.manager';
14
16
  import type {TabelaData} from './models/data.model';
15
17
  import type {TabelaFilter} from './models/filter.model';
18
+ import type {TabelaGroup} from './models/group.model';
16
19
  import type {TabelaSelection} from './models/selection.model';
17
20
  import type {TabelaSort} from './models/sort.model';
21
+ import {CSS_TABELA, CSS_TABELA_TABLE} from './models/style.model';
18
22
  import type {Components, Managers, State} from './models/tabela.model';
19
23
  import type {TabelaOptions} from './models/tabela.options';
20
24
 
21
25
  export class Tabela {
22
- readonly #components: Components = {
23
- header: undefined as never,
24
- body: undefined as never,
25
- footer: undefined as never,
26
- };
26
+ #components: Components;
27
27
 
28
28
  #element: HTMLElement;
29
29
 
30
30
  #id = getId();
31
31
 
32
- readonly #key: string;
32
+ #table: HTMLElement;
33
+
34
+ #key: string;
33
35
 
34
- readonly #managers: Managers = {
36
+ #managers: Managers = {
35
37
  column: undefined as never,
36
38
  data: undefined as never,
37
39
  event: undefined as never,
@@ -42,12 +44,17 @@ export class Tabela {
42
44
  row: undefined as never,
43
45
  selection: undefined as never,
44
46
  sort: undefined as never,
47
+ style: undefined as never,
45
48
  };
46
49
 
50
+ #state: State;
51
+
47
52
  readonly data: TabelaData;
48
53
 
49
54
  readonly filter: TabelaFilter;
50
55
 
56
+ readonly group: TabelaGroup;
57
+
51
58
  readonly selection: TabelaSelection;
52
59
 
53
60
  readonly sort: TabelaSort;
@@ -60,48 +67,62 @@ export class Tabela {
60
67
  this.#element = element;
61
68
 
62
69
  element.innerHTML = '';
63
- element.role = 'table';
64
-
65
- element.classList.add('tabela');
66
70
 
67
- element.setAttribute('aria-label', options.label);
71
+ element.classList.add(CSS_TABELA);
72
+
73
+ this.#table = createElement(
74
+ 'div',
75
+ {
76
+ className: CSS_TABELA_TABLE,
77
+ role: 'table',
78
+ },
79
+ {
80
+ 'aria-label': options.label,
81
+ },
82
+ );
68
83
 
69
84
  this.#key = options.key;
70
85
 
71
- this.#components.header = new HeaderComponent();
72
- this.#components.body = new BodyComponent();
73
- this.#components.footer = new FooterComponent();
86
+ this.#components = {
87
+ body: new BodyComponent(),
88
+ footer: new FooterComponent(),
89
+ header: new HeaderComponent(),
90
+ };
74
91
 
75
- const state: State = {
76
- element,
92
+ this.#state = {
77
93
  options,
78
94
  components: this.#components,
95
+ element: this.#table,
79
96
  id: this.#id,
80
97
  key: this.#key,
81
98
  managers: this.#managers,
82
99
  };
83
100
 
84
- this.#managers.column = new ColumnManager(state);
85
- this.#managers.data = new DataManager(state);
86
- this.#managers.event = new EventManager(state);
87
- this.#managers.filter = new FilterManager(state);
88
- this.#managers.group = new GroupManager(state);
89
- this.#managers.navigation = new NavigationManager(state);
90
- this.#managers.render = new RenderManager(state);
91
- this.#managers.row = new RowManager(state);
92
- this.#managers.selection = new SelectionManager(state);
93
- this.#managers.sort = new SortManager(state);
94
-
95
- element.append(
101
+ this.#managers.column = new ColumnManager(this.#state);
102
+ this.#managers.data = new DataManager(this.#state);
103
+ this.#managers.event = new EventManager(this.#state);
104
+ this.#managers.filter = new FilterManager(this.#state);
105
+ this.#managers.group = new GroupManager(this.#state);
106
+ this.#managers.navigation = new NavigationManager(this.#state);
107
+ this.#managers.render = new RenderManager(this.#state);
108
+ this.#managers.row = new RowManager(this.#state);
109
+ this.#managers.selection = new SelectionManager(this.#state);
110
+ this.#managers.sort = new SortManager(this.#state);
111
+ this.#managers.style = new StyleManager(this.#state);
112
+
113
+ this.#table.append(
96
114
  this.#components.header.elements.group,
97
115
  this.#components.body.elements.group,
98
116
  this.#components.footer.elements.group,
99
117
  );
100
118
 
119
+ element.append(this.#table);
120
+
101
121
  this.#managers.data.set(options.data);
102
122
 
103
123
  this.data = this.#managers.data.handlers;
104
124
  this.filter = this.#managers.filter.handlers;
125
+ this.group = this.#managers.group.handlers;
105
126
  this.selection = this.#managers.selection.handlers;
106
127
  this.sort = this.#managers.sort.handlers;
107
128
  }
@@ -110,6 +131,7 @@ export class Tabela {
110
131
  const components = this.#components;
111
132
  const managers = this.#managers;
112
133
  const element = this.#element;
134
+ const table = this.#table;
113
135
 
114
136
  components.body.destroy();
115
137
  components.footer.destroy();
@@ -119,20 +141,30 @@ export class Tabela {
119
141
  managers.data.destroy();
120
142
  managers.event.destroy();
121
143
  managers.filter.destroy();
122
- // managers.navigation.destroy();
144
+ managers.group.destroy();
145
+ managers.navigation.destroy();
123
146
  managers.render.destroy();
124
147
  managers.row.destroy();
125
148
  managers.selection.destroy();
126
149
  managers.sort.destroy();
127
150
 
128
151
  element.innerHTML = '';
129
- element.role = '';
130
152
 
131
- element.classList.remove('tabela');
132
- element.removeAttribute('aria-label');
133
- element.removeAttribute('role');
153
+ table.innerHTML = '';
154
+ table.role = '';
155
+
156
+ element.classList.remove(CSS_TABELA);
157
+
158
+ table.removeAttribute('aria-label');
159
+ table.removeAttribute('role');
160
+
161
+ this.#state.components = undefined as never;
162
+ this.#state.managers = undefined as never;
163
+ this.#state.element = undefined as never;
164
+ this.#state.options = undefined as never;
134
165
 
135
166
  this.#element = undefined as never;
167
+ this.#table = undefined as never;
136
168
  }
137
169
  }
138
170
 
@@ -1,28 +0,0 @@
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 +0,0 @@
1
- import { toggleStyles } from "@oscarpalmer/toretto/style";
2
- const dragStyling = toggleStyles(document.body, {
3
- userSelect: "none",
4
- webkitUserSelect: "none"
5
- });
6
- export { dragStyling };