@oscarpalmer/tabela 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/body.component-_VDOpJhV.d.mts +10 -0
  2. package/dist/body.model-2iwsovAV.d.mts +7 -0
  3. package/dist/column.component-Bx46r3JI.d.mts +16 -0
  4. package/dist/column.model-D-aw4EU4.d.mts +16 -0
  5. package/dist/components/body.component.d.mts +2 -0
  6. package/dist/components/{body.component.js → body.component.mjs} +6 -3
  7. package/dist/components/column.component.d.mts +2 -0
  8. package/dist/components/{column.component.js → column.component.mjs} +12 -9
  9. package/dist/components/footer.component.d.mts +2 -0
  10. package/dist/components/{footer.component.js → footer.component.mjs} +7 -4
  11. package/dist/components/group.component.d.mts +2 -0
  12. package/dist/components/group.component.mjs +51 -0
  13. package/dist/components/header.component.d.mts +2 -0
  14. package/dist/components/{header.component.js → header.component.mjs} +6 -3
  15. package/dist/components/row.component.d.mts +2 -0
  16. package/dist/components/{row.component.js → row.component.mjs} +11 -7
  17. package/dist/filter.model-7ukJrtil.d.mts +16 -0
  18. package/dist/footer.component-Curiab8j.d.mts +12 -0
  19. package/dist/footer.model-DhqoS6ds.d.mts +8 -0
  20. package/dist/group.component-Cq1YYbfJ.d.mts +285 -0
  21. package/dist/group.model-BsKFwHbt.d.mts +10 -0
  22. package/dist/header.component-BjjlpZIg.d.mts +12 -0
  23. package/dist/header.model-DN_KzUCV.d.mts +7 -0
  24. package/dist/helpers/dom.helpers.d.mts +12 -0
  25. package/dist/helpers/{dom.helpers.js → dom.helpers.mjs} +14 -10
  26. package/dist/helpers/misc.helpers.d.mts +6 -0
  27. package/dist/helpers/{misc.helpers.js → misc.helpers.mjs} +3 -1
  28. package/dist/helpers/style.helper.d.mts +6 -0
  29. package/dist/helpers/style.helper.mjs +8 -0
  30. package/dist/index.d.mts +7 -0
  31. package/dist/{index.js → index.mjs} +3 -1
  32. package/dist/managers/column.manager.d.mts +2 -0
  33. package/dist/managers/{column.manager.js → column.manager.mjs} +6 -1
  34. package/dist/managers/data.manager.d.mts +2 -0
  35. package/dist/managers/data.manager.mjs +222 -0
  36. package/dist/managers/event.manager.d.mts +2 -0
  37. package/dist/managers/{event.manager.js → event.manager.mjs} +12 -8
  38. package/dist/managers/filter.manager.d.mts +2 -0
  39. package/dist/managers/{filter.manager.js → filter.manager.mjs} +25 -11
  40. package/dist/managers/group.manager.d.mts +2 -0
  41. package/dist/managers/group.manager.mjs +73 -0
  42. package/dist/managers/navigation.manager.d.mts +2 -0
  43. package/dist/managers/{navigation.manager.js → navigation.manager.mjs} +27 -24
  44. package/dist/managers/render.manager.d.mts +2 -0
  45. package/dist/managers/render.manager.mjs +144 -0
  46. package/dist/managers/row.manager.d.mts +2 -0
  47. package/dist/managers/{row.manager.js → row.manager.mjs} +18 -11
  48. package/dist/managers/selection.manager.d.mts +2 -0
  49. package/dist/managers/{selection.manager.js → selection.manager.mjs} +57 -48
  50. package/dist/managers/sort.manager.d.mts +2 -0
  51. package/dist/managers/{sort.manager.js → sort.manager.mjs} +32 -2
  52. package/dist/managers/style.manager.d.mts +2 -0
  53. package/dist/managers/style.manager.mjs +149 -0
  54. package/dist/models/body.model.d.mts +2 -0
  55. package/dist/models/body.model.mjs +1 -0
  56. package/dist/models/column.model.d.mts +2 -0
  57. package/dist/models/column.model.mjs +1 -0
  58. package/dist/models/data.model.d.mts +2 -0
  59. package/dist/models/data.model.mjs +1 -0
  60. package/dist/models/filter.model.d.mts +2 -0
  61. package/dist/models/filter.model.mjs +1 -0
  62. package/dist/models/footer.model.d.mts +2 -0
  63. package/dist/models/footer.model.mjs +1 -0
  64. package/dist/models/group.model.d.mts +2 -0
  65. package/dist/models/group.model.mjs +1 -0
  66. package/dist/models/header.model.d.mts +2 -0
  67. package/dist/models/header.model.mjs +1 -0
  68. package/dist/models/render.model.d.mts +2 -0
  69. package/dist/models/render.model.mjs +1 -0
  70. package/dist/models/selection.model.d.mts +2 -0
  71. package/dist/models/selection.model.mjs +1 -0
  72. package/dist/models/sort.model.d.mts +2 -0
  73. package/dist/models/sort.model.mjs +1 -0
  74. package/dist/models/style.model.d.mts +23 -0
  75. package/dist/models/style.model.mjs +23 -0
  76. package/dist/models/tabela.model.d.mts +2 -0
  77. package/dist/models/tabela.model.mjs +1 -0
  78. package/dist/models/tabela.options.d.mts +2 -0
  79. package/dist/models/tabela.options.mjs +1 -0
  80. package/dist/selection.model-rwQe9fco.d.mts +12 -0
  81. package/dist/sort.model-CauImaLu.d.mts +15 -0
  82. package/dist/tabela.d.mts +21 -0
  83. package/dist/{tabela.full.js → tabela.full.mjs} +1407 -1124
  84. package/dist/tabela.mjs +126 -0
  85. package/dist/tabela.options-RkZvfptB.d.mts +14 -0
  86. package/package.json +45 -37
  87. package/src/components/body.component.ts +4 -3
  88. package/src/components/column.component.ts +19 -24
  89. package/src/components/footer.component.ts +8 -3
  90. package/src/components/group.component.ts +85 -0
  91. package/src/components/header.component.ts +3 -2
  92. package/src/components/row.component.ts +10 -8
  93. package/src/helpers/dom.helpers.ts +24 -20
  94. package/src/helpers/style.helper.ts +1 -1
  95. package/src/managers/column.manager.ts +8 -4
  96. package/src/managers/data.manager.ts +265 -61
  97. package/src/managers/event.manager.ts +14 -11
  98. package/src/managers/filter.manager.ts +38 -19
  99. package/src/managers/group.manager.ts +131 -0
  100. package/src/managers/navigation.manager.ts +25 -23
  101. package/src/managers/render.manager.ts +84 -32
  102. package/src/managers/row.manager.ts +23 -11
  103. package/src/managers/selection.manager.ts +68 -54
  104. package/src/managers/sort.manager.ts +81 -16
  105. package/src/managers/style.manager.ts +156 -0
  106. package/src/models/column.model.ts +2 -2
  107. package/src/models/data.model.ts +23 -9
  108. package/src/models/filter.model.ts +11 -3
  109. package/src/models/group.model.ts +8 -0
  110. package/src/models/render.model.ts +2 -2
  111. package/src/models/selection.model.ts +9 -0
  112. package/src/models/sort.model.ts +11 -3
  113. package/src/models/style.model.ts +39 -0
  114. package/src/models/tabela.model.ts +14 -46
  115. package/src/models/tabela.options.ts +3 -2
  116. package/src/tabela.ts +72 -41
  117. package/dist/helpers/style.helper.js +0 -6
  118. package/dist/managers/data.manager.js +0 -120
  119. package/dist/managers/render.manager.js +0 -110
  120. package/dist/models/body.model.js +0 -0
  121. package/dist/models/column.model.js +0 -0
  122. package/dist/models/data.model.js +0 -0
  123. package/dist/models/filter.model.js +0 -0
  124. package/dist/models/footer.model.js +0 -0
  125. package/dist/models/header.model.js +0 -0
  126. package/dist/models/render.model.js +0 -0
  127. package/dist/models/sort.model.js +0 -0
  128. package/dist/models/tabela.model.js +0 -0
  129. package/dist/models/tabela.options.js +0 -0
  130. package/dist/tabela.js +0 -102
  131. package/types/components/body.component.d.ts +0 -6
  132. package/types/components/column.component.d.ts +0 -13
  133. package/types/components/footer.component.d.ts +0 -8
  134. package/types/components/header.component.d.ts +0 -8
  135. package/types/components/row.component.d.ts +0 -11
  136. package/types/helpers/dom.helpers.d.ts +0 -10
  137. package/types/helpers/misc.helpers.d.ts +0 -2
  138. package/types/helpers/style.helper.d.ts +0 -1
  139. package/types/index.d.ts +0 -4
  140. package/types/managers/column.manager.d.ts +0 -12
  141. package/types/managers/data.manager.d.ts +0 -27
  142. package/types/managers/event.manager.d.ts +0 -7
  143. package/types/managers/filter.manager.d.ts +0 -19
  144. package/types/managers/navigation.manager.d.ts +0 -10
  145. package/types/managers/render.manager.d.ts +0 -16
  146. package/types/managers/row.manager.d.ts +0 -13
  147. package/types/managers/selection.manager.d.ts +0 -18
  148. package/types/managers/sort.manager.d.ts +0 -26
  149. package/types/models/body.model.d.ts +0 -4
  150. package/types/models/column.model.d.ts +0 -13
  151. package/types/models/data.model.d.ts +0 -14
  152. package/types/models/filter.model.d.ts +0 -6
  153. package/types/models/footer.model.d.ts +0 -5
  154. package/types/models/header.model.d.ts +0 -4
  155. package/types/models/render.model.d.ts +0 -13
  156. package/types/models/sort.model.d.ts +0 -5
  157. package/types/models/tabela.model.d.ts +0 -69
  158. package/types/models/tabela.options.d.ts +0 -9
  159. package/types/tabela.d.ts +0 -12
@@ -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';
@@ -1,4 +1,3 @@
1
- import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
2
1
  import type {BodyComponent} from '../components/body.component';
3
2
  import type {FooterComponent} from '../components/footer.component';
4
3
  import type {HeaderComponent} from '../components/header.component';
@@ -6,71 +5,40 @@ import type {ColumnManager} from '../managers/column.manager';
6
5
  import type {DataManager} from '../managers/data.manager';
7
6
  import type {EventManager} from '../managers/event.manager';
8
7
  import type {FilterManager} from '../managers/filter.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 {FilterItem} from './filter.model';
15
- import type {SortDirection, SortItem} from './sort.model';
14
+ import type {StyleManager} from '../managers/style.manager';
16
15
  import type {TabelaOptions} from './tabela.options';
17
16
 
18
- export type TabelaComponents = {
17
+ export type Components = {
19
18
  body: BodyComponent;
20
19
  footer: FooterComponent;
21
20
  header: HeaderComponent;
22
21
  };
23
22
 
24
- export type TabelaData = {
25
- add(data: PlainObject[]): void;
26
- clear(): void;
27
- get(active?: boolean): PlainObject[];
28
- remove(keys: Key[]): void;
29
- remove(data: PlainObject[]): void;
30
- synchronize(data: PlainObject[], remove?: boolean): void;
31
- update(data: PlainObject[]): void;
32
- };
33
-
34
- export type TabelaFilter = {
35
- add(item: FilterItem): void;
36
- clear(): void;
37
- remove(field: string): void;
38
- remove(item: FilterItem): void;
39
- set(items: FilterItem[]): void;
40
- };
41
-
42
- export type TabelaManagers = {
23
+ export type Managers = {
43
24
  column: ColumnManager;
44
25
  data: DataManager;
45
26
  event: EventManager;
46
27
  filter: FilterManager;
28
+ group: GroupManager;
47
29
  navigation: NavigationManager;
30
+ render: RenderManager;
48
31
  row: RowManager;
49
32
  selection: SelectionManager;
50
33
  sort: SortManager;
51
- render: RenderManager;
52
- };
53
-
54
- export type TabelaSelection = {
55
- clear(): void;
56
- deselect(keys: Key[]): void;
57
- select(keys: Key[]): void;
58
- toggle(): void;
59
- };
60
-
61
- export type TabelaSort = {
62
- add(field: string, direction?: SortDirection): void;
63
- clear(): void;
64
- flip(field: string): void;
65
- remove(field: string): void;
66
- set(items: SortItem[]): void;
34
+ style: StyleManager;
67
35
  };
68
36
 
69
- export type TabelaState = {
70
- readonly components: TabelaComponents;
71
- readonly element: HTMLElement;
72
- readonly id: number;
73
- readonly key: string;
74
- readonly managers: TabelaManagers;
75
- readonly options: TabelaOptions;
37
+ export type State = {
38
+ components: Components;
39
+ element: HTMLElement;
40
+ id: number;
41
+ key: string;
42
+ managers: Managers;
43
+ options: TabelaOptions;
76
44
  };
@@ -1,9 +1,10 @@
1
1
  import type {PlainObject} from '@oscarpalmer/atoms/models';
2
- import type {TabelaColumnOptions} from './column.model';
2
+ import type {TabelaColumn} from './column.model';
3
3
 
4
4
  export type TabelaOptions = {
5
- columns: TabelaColumnOptions[];
5
+ columns: TabelaColumn[];
6
6
  data: PlainObject[];
7
+ grouping?: string;
7
8
  key: string;
8
9
  label: string;
9
10
  rowHeight: number;
package/src/tabela.ts CHANGED
@@ -1,55 +1,60 @@
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';
7
8
  import {FilterManager} from './managers/filter.manager';
9
+ import {GroupManager} from './managers/group.manager';
8
10
  import {NavigationManager} from './managers/navigation.manager';
9
11
  import {RenderManager} from './managers/render.manager';
10
12
  import {RowManager} from './managers/row.manager';
11
13
  import {SelectionManager} from './managers/selection.manager';
12
14
  import {SortManager} from './managers/sort.manager';
13
- import type {
14
- TabelaComponents,
15
- TabelaData,
16
- TabelaFilter,
17
- TabelaManagers,
18
- TabelaSelection,
19
- TabelaSort,
20
- TabelaState,
21
- } from './models/tabela.model';
15
+ import {StyleManager} from './managers/style.manager';
16
+ import type {TabelaData} from './models/data.model';
17
+ import type {TabelaFilter} from './models/filter.model';
18
+ import type {TabelaGroup} from './models/group.model';
19
+ import type {TabelaSelection} from './models/selection.model';
20
+ import type {TabelaSort} from './models/sort.model';
21
+ import {CSS_TABELA, CSS_TABELA_TABLE} from './models/style.model';
22
+ import type {Components, Managers, State} from './models/tabela.model';
22
23
  import type {TabelaOptions} from './models/tabela.options';
23
24
 
24
25
  export class Tabela {
25
- readonly #components: TabelaComponents = {
26
- header: undefined as never,
27
- body: undefined as never,
28
- footer: undefined as never,
29
- };
26
+ #components: Components;
30
27
 
31
28
  #element: HTMLElement;
32
29
 
33
30
  #id = getId();
34
31
 
35
- readonly #key: string;
32
+ #table: HTMLElement;
33
+
34
+ #key: string;
36
35
 
37
- readonly #managers: TabelaManagers = {
36
+ #managers: Managers = {
38
37
  column: undefined as never,
39
38
  data: undefined as never,
40
39
  event: undefined as never,
41
40
  filter: undefined as never,
41
+ group: undefined as never,
42
42
  navigation: undefined as never,
43
43
  render: undefined as never,
44
44
  row: undefined as never,
45
45
  selection: undefined as never,
46
46
  sort: undefined as never,
47
+ style: undefined as never,
47
48
  };
48
49
 
50
+ #state: State;
51
+
49
52
  readonly data: TabelaData;
50
53
 
51
54
  readonly filter: TabelaFilter;
52
55
 
56
+ readonly group: TabelaGroup;
57
+
53
58
  readonly selection: TabelaSelection;
54
59
 
55
60
  readonly sort: TabelaSort;
@@ -62,47 +67,62 @@ export class Tabela {
62
67
  this.#element = element;
63
68
 
64
69
  element.innerHTML = '';
65
- element.role = 'table';
66
-
67
- element.classList.add('tabela');
68
70
 
69
- 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
+ );
70
83
 
71
84
  this.#key = options.key;
72
85
 
73
- this.#components.header = new HeaderComponent();
74
- this.#components.body = new BodyComponent();
75
- this.#components.footer = new FooterComponent();
86
+ this.#components = {
87
+ body: new BodyComponent(),
88
+ footer: new FooterComponent(),
89
+ header: new HeaderComponent(),
90
+ };
76
91
 
77
- const state: TabelaState = {
78
- element,
92
+ this.#state = {
79
93
  options,
80
94
  components: this.#components,
95
+ element: this.#table,
81
96
  id: this.#id,
82
97
  key: this.#key,
83
98
  managers: this.#managers,
84
99
  };
85
100
 
86
- this.#managers.column = new ColumnManager(state);
87
- this.#managers.data = new DataManager(state);
88
- this.#managers.event = new EventManager(state);
89
- this.#managers.filter = new FilterManager(state);
90
- this.#managers.navigation = new NavigationManager(state);
91
- this.#managers.render = new RenderManager(state);
92
- this.#managers.row = new RowManager(state);
93
- this.#managers.selection = new SelectionManager(state);
94
- this.#managers.sort = new SortManager(state);
95
-
96
- 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(
97
114
  this.#components.header.elements.group,
98
115
  this.#components.body.elements.group,
99
116
  this.#components.footer.elements.group,
100
117
  );
101
118
 
119
+ element.append(this.#table);
120
+
102
121
  this.#managers.data.set(options.data);
103
122
 
104
123
  this.data = this.#managers.data.handlers;
105
124
  this.filter = this.#managers.filter.handlers;
125
+ this.group = this.#managers.group.handlers;
106
126
  this.selection = this.#managers.selection.handlers;
107
127
  this.sort = this.#managers.sort.handlers;
108
128
  }
@@ -111,6 +131,7 @@ export class Tabela {
111
131
  const components = this.#components;
112
132
  const managers = this.#managers;
113
133
  const element = this.#element;
134
+ const table = this.#table;
114
135
 
115
136
  components.body.destroy();
116
137
  components.footer.destroy();
@@ -120,20 +141,30 @@ export class Tabela {
120
141
  managers.data.destroy();
121
142
  managers.event.destroy();
122
143
  managers.filter.destroy();
123
- // managers.navigation.destroy();
144
+ managers.group.destroy();
145
+ managers.navigation.destroy();
124
146
  managers.render.destroy();
125
147
  managers.row.destroy();
126
148
  managers.selection.destroy();
127
149
  managers.sort.destroy();
128
150
 
129
151
  element.innerHTML = '';
130
- element.role = '';
131
152
 
132
- element.classList.remove('tabela');
133
- element.removeAttribute('aria-label');
134
- 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;
135
165
 
136
166
  this.#element = undefined as never;
167
+ this.#table = undefined as never;
137
168
  }
138
169
  }
139
170
 
@@ -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 };
@@ -1,120 +0,0 @@
1
- import { push, sort } from "@oscarpalmer/atoms/array";
2
- import { toMap } from "@oscarpalmer/atoms/array/to-map";
3
- import { isPlainObject } from "@oscarpalmer/atoms/is";
4
- var DataManager = class {
5
- handlers = Object.freeze({
6
- add: (data) => void this.add(data, true),
7
- clear: () => void this.clear(),
8
- get: (active) => this.get(active),
9
- remove: (items) => void this.remove(items, true),
10
- synchronize: (data, remove) => void this.synchronize(data, remove),
11
- update: (data) => void this.update(data)
12
- });
13
- values = {
14
- keys: { original: [] },
15
- objects: {
16
- mapped: /* @__PURE__ */ new Map(),
17
- array: []
18
- }
19
- };
20
- get size() {
21
- return this.values.keys.active?.length ?? this.values.keys.original.length;
22
- }
23
- constructor(state) {
24
- this.state = state;
25
- }
26
- async add(data, render) {
27
- const { state, values } = this;
28
- push(values.objects.array, data);
29
- values.objects.mapped = toMap(values.objects.array, state.key);
30
- if (render) this.render();
31
- }
32
- clear() {
33
- if (this.values.objects.array.length > 0) this.set([]);
34
- }
35
- destroy() {
36
- const { values } = this;
37
- values.objects.mapped.clear();
38
- values.keys.active = void 0;
39
- values.keys.original.length = 0;
40
- values.objects.array.length = 0;
41
- this.handlers = void 0;
42
- this.state = void 0;
43
- this.values = void 0;
44
- }
45
- get(active) {
46
- const { values } = this;
47
- return active ?? false ? values.keys.active?.map((key) => values.objects.mapped.get(key)) ?? [] : values.objects.array;
48
- }
49
- getIndex(key) {
50
- const { values } = this;
51
- return (values.keys.active ?? values.keys.original).indexOf(key);
52
- }
53
- async remove(items, render) {
54
- const { state, values } = this;
55
- const keys = items.map((value) => isPlainObject(value) ? value[state.key] : value).filter((key) => values.objects.mapped.has(key));
56
- const { length } = keys;
57
- if (length === 0) return;
58
- for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
59
- const key = keys[keyIndex];
60
- values.objects.mapped.delete(key);
61
- const arrayIndex = values.objects.array.findIndex((object) => object[state.key] === key);
62
- if (arrayIndex > -1) values.objects.array.splice(arrayIndex, 1);
63
- values.keys.original.splice(values.keys.original.indexOf(key), 1);
64
- state.managers.row.remove(key);
65
- }
66
- if (render) this.render();
67
- }
68
- render() {
69
- const { state, values } = this;
70
- values.keys.original = sort(values.objects.array.map((item) => item[state.key]));
71
- if (Object.keys(state.managers.filter.items).length > 0) state.managers.filter.filter();
72
- else if (state.managers.sort.items.length > 0) state.managers.sort.sort();
73
- else state.managers.render.update(true);
74
- }
75
- set(data) {
76
- const { state, values } = this;
77
- values.objects.mapped = toMap(data, state.key);
78
- values.objects.array = data;
79
- this.render();
80
- }
81
- async synchronize(data, remove) {
82
- const { state, values } = this;
83
- const add = [];
84
- const updated = [];
85
- const keys = /* @__PURE__ */ new Set([]);
86
- const { length } = data;
87
- for (let index = 0; index < length; index += 1) {
88
- const object = data[index];
89
- const key = object[state.key];
90
- if (values.objects.mapped.has(key)) updated.push(object);
91
- else add.push(object);
92
- keys.add(key);
93
- }
94
- if (keys.size === 0) return;
95
- if (remove ?? false) {
96
- const toRemove = values.keys.original.filter((key) => !keys.has(key));
97
- if (toRemove.length > 0) await this.remove(toRemove, false);
98
- }
99
- await this.update(updated);
100
- if (add.length > 0) await this.add(add, false);
101
- if (add.length > 0 || (remove ?? false)) this.render();
102
- }
103
- async update(data) {
104
- const { state, values } = this;
105
- const { length } = data;
106
- for (let index = 0; index < length; index += 1) {
107
- const object = data[index];
108
- const key = object[state.key];
109
- const value = values.objects.mapped.get(key);
110
- if (value != null) {
111
- values.objects.mapped.set(key, {
112
- ...value,
113
- ...object
114
- });
115
- state.managers.row.update(key);
116
- }
117
- }
118
- }
119
- };
120
- export { DataManager };
@@ -1,110 +0,0 @@
1
- import { removeRow, renderRow } from "../components/row.component.js";
2
- import { on } from "@oscarpalmer/toretto/event";
3
- function getRange(down) {
4
- const { components, managers, options } = this.state;
5
- const { clientHeight, scrollTop } = components.body.elements.group;
6
- const first = Math.floor(scrollTop / options.rowHeight);
7
- const last = Math.min((managers.data.values.keys.active?.length ?? managers.data.values.keys.original.length) - 1, Math.ceil((scrollTop + clientHeight) / options.rowHeight) - 1);
8
- const before = Math.ceil(clientHeight / options.rowHeight) * (down ? 1 : 2);
9
- const after = Math.ceil(clientHeight / options.rowHeight) * (down ? 2 : 1);
10
- const start = Math.max(0, first - before);
11
- return {
12
- end: Math.min((managers.data.values.keys.active?.length ?? managers.data.values.keys.original.length) - 1, last + after),
13
- start
14
- };
15
- }
16
- function onScroll() {
17
- const { state } = this;
18
- if (!state.active) {
19
- requestAnimationFrame(() => {
20
- const top = state.components.body.elements.group.scrollTop;
21
- this.update(top > state.top);
22
- state.active = false;
23
- state.top = top;
24
- });
25
- state.active = true;
26
- }
27
- }
28
- var RenderManager = class {
29
- fragment;
30
- listener;
31
- pool = {
32
- cells: {},
33
- rows: []
34
- };
35
- state;
36
- visible = /* @__PURE__ */ new Map();
37
- constructor(state) {
38
- this.listener = on(state.components.body.elements.group, "scroll", onScroll.bind(this));
39
- this.state = {
40
- ...state,
41
- active: false,
42
- top: 0
43
- };
44
- }
45
- destroy() {
46
- const { listener, pool, visible } = this;
47
- listener();
48
- visible.clear();
49
- pool.cells = {};
50
- pool.rows = [];
51
- this.fragment = void 0;
52
- this.listener = void 0;
53
- this.pool = void 0;
54
- this.state = void 0;
55
- this.visible = void 0;
56
- }
57
- removeCells(fields) {
58
- const { pool, state, visible } = this;
59
- const { length } = fields;
60
- for (let index = 0; index < length; index += 1) delete pool.cells[fields[index]];
61
- for (const [, key] of visible) {
62
- const row = state.managers.row.get(key);
63
- if (row == null || row.element == null) continue;
64
- for (let index = 0; index < length; index += 1) {
65
- row.cells[fields[index]].innerHTML = "";
66
- row.cells[fields[index]].remove();
67
- delete row.cells[fields[index]];
68
- }
69
- }
70
- }
71
- getFragment() {
72
- this.fragment ??= document.createDocumentFragment();
73
- this.fragment.replaceChildren();
74
- return this.fragment;
75
- }
76
- update(down, rerender) {
77
- const { state, pool, visible } = this;
78
- const { components, managers, options } = state;
79
- components.body.elements.faker.style.height = `${managers.data.size * options.rowHeight}px`;
80
- const indices = /* @__PURE__ */ new Set();
81
- const range = getRange.call(this, down);
82
- for (let index = range.start; index <= range.end; index += 1) indices.add(index);
83
- let remove = rerender ?? false;
84
- for (const [index, key] of visible) {
85
- const row = managers.row.get(key);
86
- if (remove || row == null || !indices.has(index)) {
87
- visible.delete(index);
88
- if (row != null) removeRow(pool, row);
89
- }
90
- }
91
- const fragment = this.getFragment();
92
- const keys = managers.data.values.keys.active ?? managers.data.values.keys.original;
93
- let count = 0;
94
- for (let index = range.start; index <= range.end; index += 1) {
95
- if (visible.has(index)) continue;
96
- const key = keys[index];
97
- const row = managers.row.get(key);
98
- if (row == null) continue;
99
- count += 1;
100
- renderRow(state, row);
101
- visible.set(index, key);
102
- if (row.element != null) {
103
- row.element.style.transform = `translateY(${index * options.rowHeight}px)`;
104
- fragment.append(row.element);
105
- }
106
- }
107
- if (count > 0) components.body.elements.group[down ? "append" : "prepend"](fragment);
108
- }
109
- };
110
- export { RenderManager };
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes