@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
@@ -1,7 +1,175 @@
1
+ import type {Key, PlainObject} from '@oscarpalmer/atoms/models';
2
+ import type {TabelaFilterItem} from './filter.model';
3
+ import type {TabelaGroup, TabelaGroupToggle} from './group.model';
4
+ import type {TabelaSortItem} from './sort.model';
5
+
6
+ export type EventDataAdd = (data: PlainObject[]) => void;
7
+
8
+ export type EventDataClear = () => void;
9
+
10
+ export type EventDataFiltered = (data: PlainObject[]) => void;
11
+
12
+ export type EventDataRemove = (data: PlainObject[]) => void;
13
+
14
+ export type EventDataSorted = (data: PlainObject[]) => void;
15
+
16
+ export type EventDataSynchronize = (data: {
17
+ added: PlainObject[];
18
+ removed: PlainObject[];
19
+ updated: PlainObject[];
20
+ }) => void;
21
+
22
+ export type EventDataUpdate = (data: PlainObject[]) => void;
23
+
24
+ export type EventFilterAdd = (filters: TabelaFilterItem[]) => void;
25
+
26
+ export type EventFilterClear = () => void;
27
+
28
+ export type EventFilterRemove = (filters: TabelaFilterItem[]) => void;
29
+
30
+ export type EventGroupAdd = (groups: TabelaGroup[]) => void;
31
+
32
+ export type EventGroupClear = () => void;
33
+
34
+ export type EventGroupRemove = (groups: TabelaGroup[]) => void;
35
+
36
+ export type EventGroupToggle = (event: TabelaGroupToggle) => void;
37
+
38
+ export type EventGroupUpdate = (groups: TabelaGroup[]) => void;
39
+
40
+ export type EventMap = {
41
+ 'data:add': EventDataAdd;
42
+ 'data:clear': EventDataClear;
43
+ 'data:filtered': EventDataFiltered;
44
+ 'data:remove': EventDataRemove;
45
+ 'data:sorted': EventDataSorted;
46
+ 'data:synchronize': EventDataSynchronize;
47
+ 'data:update': EventDataUpdate;
48
+ 'filter:add': EventFilterAdd;
49
+ 'filter:clear': EventFilterClear;
50
+ 'filter:remove': EventFilterRemove;
51
+ 'group:add': EventGroupAdd;
52
+ 'group:clear': EventGroupClear;
53
+ 'group:remove': EventGroupRemove;
54
+ 'group:toggle': EventGroupToggle;
55
+ 'group:update': EventGroupUpdate;
56
+ 'navigation:active': EventNavigationActive;
57
+ 'render:begin': EventRenderBegin;
58
+ 'render:end': EventRenderEnd;
59
+ 'selection:add': EventSelectionAdd;
60
+ 'selection:clear': EventSelectionClear;
61
+ 'selection:remove': EventSelectionRemove;
62
+ 'selection:toggle': EventSelectionToggle;
63
+ 'sort:add': EventSortAdd;
64
+ 'sort:clear': EventSortClear;
65
+ 'sort:flip': EventSortFlip;
66
+ 'sort:remove': EventSortRemove;
67
+ 'sort:set': EventSortSet;
68
+ };
69
+
70
+ export type EventName = keyof EventMap;
71
+
72
+ export type EventNavigationActive = (active: Key | null) => void;
73
+
74
+ export type EventRenderBegin = () => void;
75
+
76
+ export type EventRenderEnd = () => void;
77
+
78
+ export type EventSelectionAdd = (keys: Key[]) => void;
79
+
80
+ export type EventSelectionClear = () => void;
81
+
82
+ export type EventSelectionRemove = (keys: Key[]) => void;
83
+
84
+ export type EventSelectionToggle = (keys: Key[]) => void;
85
+
86
+ export type EventSortAdd = (sorters: TabelaSortItem[]) => void;
87
+
88
+ export type EventSortClear = () => void;
89
+
90
+ export type EventSortFlip = (sorters: TabelaSortItem[]) => void;
91
+
92
+ export type EventSortRemove = (sorters: TabelaSortItem[]) => void;
93
+
94
+ export type EventSortSet = (sorters: {added: TabelaSortItem[]; removed: TabelaSortItem[]}) => void;
95
+
96
+ export type Events = Partial<{
97
+ [Name in EventName]: Set<EventMap[Name]>;
98
+ }>;
99
+
100
+ export type TabelaEvents = {
101
+ subscribe<Name extends EventName>(name: Name, callback: EventMap[Name]): void;
102
+ unsubscribe<Name extends EventName>(name: Name, callback: EventMap[Name]): void;
103
+ };
104
+
1
105
  export const EVENT_BODY = 'body';
2
106
 
107
+ export const EVENT_DATA_ADD = 'data:add';
108
+
109
+ export const EVENT_DATA_CLEAR = 'data:clear';
110
+
111
+ export const EVENT_DATA_FILTERED = 'data:filtered';
112
+
113
+ export const EVENT_DATA_REMOVE = 'data:remove';
114
+
115
+ export const EVENT_DATA_SORTED = 'data:sorted';
116
+
117
+ export const EVENT_DATA_SYNCHRONIZE = 'data:synchronize';
118
+
119
+ export const EVENT_DATA_UPDATE = 'data:update';
120
+
3
121
  export const EVENT_GROUP = 'group';
4
122
 
123
+ export const EVENT_GROUP_ADD = 'group:add';
124
+
125
+ export const EVENT_GROUP_CLEAR = 'group:clear';
126
+
127
+ export const EVENT_GROUP_REMOVE = 'group:remove';
128
+
129
+ export const EVENT_GROUP_TOGGLE = 'group:toggle';
130
+
131
+ export const EVENT_GROUP_UPDATE = 'group:update';
132
+
5
133
  export const EVENT_HEADING = 'heading';
6
134
 
7
135
  export const EVENT_ROW = 'row';
136
+
137
+ export const EVENT_SORT_ADD = 'sort:add';
138
+
139
+ export const EVENT_SORT_CLEAR = 'sort:clear';
140
+
141
+ export const EVENT_SORT_FLIP = 'sort:flip';
142
+
143
+ export const EVENT_SORT_REMOVE = 'sort:remove';
144
+
145
+ export const EVENT_SORT_SET = 'sort:set';
146
+
147
+ export const EVENTS_NAMES = new Set<EventName>([
148
+ EVENT_DATA_ADD,
149
+ EVENT_DATA_CLEAR,
150
+ EVENT_DATA_FILTERED,
151
+ EVENT_DATA_REMOVE,
152
+ EVENT_DATA_SORTED,
153
+ EVENT_DATA_SYNCHRONIZE,
154
+ EVENT_DATA_UPDATE,
155
+ 'filter:add',
156
+ 'filter:clear',
157
+ 'filter:remove',
158
+ EVENT_GROUP_ADD,
159
+ EVENT_GROUP_CLEAR,
160
+ EVENT_GROUP_REMOVE,
161
+ EVENT_GROUP_TOGGLE,
162
+ EVENT_GROUP_UPDATE,
163
+ 'navigation:active',
164
+ 'render:begin',
165
+ 'render:end',
166
+ 'selection:add',
167
+ 'selection:clear',
168
+ 'selection:remove',
169
+ 'selection:toggle',
170
+ EVENT_SORT_ADD,
171
+ EVENT_SORT_CLEAR,
172
+ EVENT_SORT_FLIP,
173
+ EVENT_SORT_REMOVE,
174
+ EVENT_SORT_SET,
175
+ ] as const) satisfies ReadonlySet<EventName>;
@@ -1,7 +1,7 @@
1
1
  export type TabelaFilter = {
2
2
  add(item: TabelaFilterItem): void;
3
3
  clear(): void;
4
- remove(field: string): void;
4
+ remove(key: string): void;
5
5
  remove(item: TabelaFilterItem): void;
6
6
  set(items: TabelaFilterItem[]): void;
7
7
  };
@@ -20,7 +20,7 @@ export type TabelaFilterComparison =
20
20
 
21
21
  export type TabelaFilterItem = {
22
22
  comparison: TabelaFilterComparison;
23
- field: string;
23
+ key: string;
24
24
  value: unknown;
25
25
  };
26
26
 
@@ -4,9 +4,18 @@ export type GroupValue = {
4
4
  };
5
5
 
6
6
  export type TabelaGroup = {
7
+ value: unknown;
8
+ };
9
+
10
+ export type TabelaGroupHandlers = {
7
11
  set(group?: string): void;
8
12
  };
9
13
 
14
+ export type TabelaGroupToggle = {
15
+ collapsed: TabelaGroup[];
16
+ expanded: TabelaGroup[];
17
+ };
18
+
10
19
  export const GROUP_KEY_EXPRESSION = /^group:(.+)$/;
11
20
 
12
21
  export const GROUP_KEY_PREFIX = 'group:';
@@ -1,3 +1,4 @@
1
+ import type {Key} from '@oscarpalmer/atoms/models';
1
2
  import type {State} from './tabela.model';
2
3
 
3
4
  export type RenderElementPool = {
@@ -14,3 +15,8 @@ export type RenderState = {
14
15
  active: boolean;
15
16
  top: number;
16
17
  } & State;
18
+
19
+ export type RenderVisible = {
20
+ indiced: Map<number, Key>;
21
+ keys: Set<Key>;
22
+ };
@@ -1,16 +1,18 @@
1
+ import type {SortDirection} from '@oscarpalmer/atoms/array';
2
+
1
3
  export type TabelaSort = {
2
- add(field: string, direction?: TabelaSortDirection): void;
4
+ add(key: string, direction?: TabelaSortDirection): void;
3
5
  clear(): void;
4
- flip(field: string): void;
5
- remove(field: string): void;
6
+ flip(key: string): void;
7
+ remove(key: string): void;
6
8
  set(items: TabelaSortItem[]): void;
7
9
  };
8
10
 
9
- export type TabelaSortDirection = 'ascending' | 'descending';
11
+ export type TabelaSortDirection = SortDirection;
10
12
 
11
13
  export type TabelaSortItem = {
12
14
  direction: TabelaSortDirection;
13
- field: string;
15
+ key: string;
14
16
  };
15
17
 
16
18
  export const SORT_ASCENDING: TabelaSortDirection = 'ascending';
package/src/tabela.ts CHANGED
@@ -15,8 +15,9 @@ import {SortManager} from './managers/sort.manager';
15
15
  import {StyleManager} from './managers/style.manager';
16
16
  import type {TabelaData} from './models/data.model';
17
17
  import {ARIA_LABEL, ATTRIBUTE_ROLE, ELEMENT_DIV, ROLE_TABLE} from './models/dom.model';
18
+ import type {TabelaEvents} from './models/event.model';
18
19
  import type {TabelaFilter} from './models/filter.model';
19
- import type {TabelaGroup} from './models/group.model';
20
+ import type {TabelaGroupHandlers} from './models/group.model';
20
21
  import type {TabelaSelection} from './models/selection.model';
21
22
  import type {TabelaSort} from './models/sort.model';
22
23
  import {CSS_TABLE, CSS_WRAPPER} from './models/style.model';
@@ -54,9 +55,11 @@ export class Tabela {
54
55
 
55
56
  readonly data: TabelaData;
56
57
 
58
+ readonly events: TabelaEvents;
59
+
57
60
  readonly filter: TabelaFilter;
58
61
 
59
- readonly group: TabelaGroup;
62
+ readonly group: TabelaGroupHandlers;
60
63
 
61
64
  readonly selection: TabelaSelection;
62
65
 
@@ -121,6 +124,7 @@ export class Tabela {
121
124
  this.#managers.data.set(options.data);
122
125
 
123
126
  this.data = this.#managers.data.handlers;
127
+ this.events = this.#managers.event.handlers;
124
128
  this.filter = this.#managers.filter.handlers;
125
129
  this.group = this.#managers.group.handlers;
126
130
  this.selection = this.#managers.selection.handlers;
@@ -1,23 +0,0 @@
1
- import { createElement, createRowGroup } from "../helpers/dom.helpers.js";
2
- function createFaker() {
3
- return createElement("div", { className: "tabela__faker" }, {}, {});
4
- }
5
- var BodyComponent = class {
6
- elements = {
7
- faker: createFaker(),
8
- group: void 0
9
- };
10
- constructor() {
11
- const group = createRowGroup(false);
12
- this.elements.group = group;
13
- group.className += " tabela__rowgroup--body";
14
- group.tabIndex = 0;
15
- group.setAttribute("data-event", "body");
16
- group.append(this.elements.faker);
17
- }
18
- destroy() {
19
- this.elements.faker = void 0;
20
- this.elements.group = void 0;
21
- }
22
- };
23
- export { BodyComponent };
@@ -1,41 +0,0 @@
1
- import { createElement } from "../helpers/dom.helpers.js";
2
- var ColumnComponent = class {
3
- elements;
4
- options;
5
- constructor(column) {
6
- const width = Number.parseInt(getComputedStyle(document.body).fontSize, 10) * (column.width ?? column.title.length * 1.5);
7
- this.options = {
8
- ...column,
9
- width
10
- };
11
- this.elements = createHeading(this.options.field, this.options.title, width);
12
- }
13
- destroy() {
14
- this.elements.content.remove();
15
- this.elements.wrapper.remove();
16
- this.elements.sorter.remove();
17
- this.elements = void 0;
18
- this.options = void 0;
19
- }
20
- };
21
- function createHeading(field, title, width) {
22
- const wrapper = createElement("div", {
23
- className: "tabela__heading",
24
- role: "columnheader"
25
- }, {
26
- "data-event": "heading",
27
- "data-field": field
28
- }, { width: `${width}px` });
29
- const content = createElement("div", {
30
- className: "tabela__heading__content",
31
- textContent: title
32
- }, {}, {});
33
- const sorter = createElement("div", { className: "tabela__heading__sorter" }, {}, {});
34
- wrapper.append(content, sorter);
35
- return {
36
- content,
37
- sorter,
38
- wrapper
39
- };
40
- }
41
- export { ColumnComponent };
@@ -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,22 +0,0 @@
1
- import { createRowGroup } from "../helpers/dom.helpers.js";
2
- var HeaderComponent = class {
3
- elements;
4
- constructor() {
5
- const { group, row } = createRowGroup();
6
- this.elements = {
7
- group,
8
- row
9
- };
10
- group.className += " tabela__rowgroup--header";
11
- row.className += " tabela__row--header";
12
- }
13
- destroy() {
14
- this.elements.group = void 0;
15
- this.elements.row = void 0;
16
- }
17
- update(columns) {
18
- this.elements.row.innerHTML = "";
19
- this.elements.row.append(...columns.map((column) => column.elements.wrapper));
20
- }
21
- };
22
- export { HeaderComponent };
@@ -1,48 +0,0 @@
1
- import { createCell, createRow } from "../helpers/dom.helpers.js";
2
- import { setAttributes } from "@oscarpalmer/toretto/attribute";
3
- function removeRow(pool, row) {
4
- if (row.element != null) {
5
- row.element.innerHTML = "";
6
- pool.rows.push(row.element);
7
- row.element.remove();
8
- row.element = void 0;
9
- }
10
- row.cells = {};
11
- }
12
- function renderRow(state, row) {
13
- const element = row.element ?? state.managers.render.pool.rows.shift() ?? createRow();
14
- row.element = element;
15
- element.innerHTML = "";
16
- const selected = state.managers.selection.items.has(row.key);
17
- const key = String(row.key);
18
- setAttributes(element, {
19
- "aria-selected": String(selected),
20
- "data-active": String(state.managers.navigation.active === row.key),
21
- "data-event": "row",
22
- "data-key": key,
23
- id: `tabela_${state.id}_row_${key}`
24
- });
25
- element.classList.add("tabela__row--body");
26
- if (selected) element.classList.add("tabela__row--selected");
27
- else element.classList.remove("tabela__row--selected");
28
- const columns = state.managers.column.items;
29
- const { length } = columns;
30
- const data = state.managers.data.values.objects.mapped.get(row.key);
31
- if (data == null) return;
32
- for (let index = 0; index < length; index += 1) {
33
- const { options } = columns[index];
34
- state.managers.render.pool.cells[options.field] ??= [];
35
- const cell = state.managers.render.pool.cells[columns[index].options.field].shift() ?? createCell(options.width);
36
- cell.textContent = String(data[options.field]);
37
- row.cells[options.field] = cell;
38
- element.append(cell);
39
- }
40
- }
41
- var RowComponent = class {
42
- cells = {};
43
- element;
44
- constructor(key) {
45
- this.key = key;
46
- }
47
- };
48
- export { RowComponent, removeRow, renderRow };
@@ -1,38 +0,0 @@
1
- import { setAttributes } from "@oscarpalmer/toretto/attribute";
2
- import { setStyles } from "@oscarpalmer/toretto/style";
3
- function createCell(width, body) {
4
- const cell = createElement("div", {
5
- className: "tabela__cell",
6
- role: "cell"
7
- }, {}, { width: `${width}px` });
8
- if (body ?? true) cell.classList.add("tabela__cell--body");
9
- return cell;
10
- }
11
- function createElement(tagName, properties, attributes, style) {
12
- const element = document.createElement(tagName);
13
- const keys = Object.keys(properties);
14
- for (const key of keys) element[key] = properties[key];
15
- setAttributes(element, attributes);
16
- setStyles(element, style);
17
- return element;
18
- }
19
- function createRowGroup(withRow) {
20
- const group = createElement("div", {
21
- className: "tabela__rowgroup",
22
- role: "rowgroup"
23
- }, {}, {});
24
- if (!(withRow ?? true)) return group;
25
- const row = createRow();
26
- group.append(row);
27
- return {
28
- group,
29
- row
30
- };
31
- }
32
- function createRow() {
33
- return createElement("div", {
34
- className: "tabela__row",
35
- role: "row"
36
- }, {}, { height: "32px" });
37
- }
38
- export { createCell, createElement, createRow, createRowGroup };
@@ -1,7 +0,0 @@
1
- function getKey(value) {
2
- if (typeof value === "number") return value;
3
- if (typeof value !== "string") return;
4
- return integerExpression.test(value) ? Number.parseInt(value, 10) : value;
5
- }
6
- var integerExpression = /^\d+$/;
7
- export { getKey };
@@ -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,181 +0,0 @@
1
- import { GroupComponent } from "../components/group.component.js";
2
- import { sortWithGroups } from "./sort.manager.js";
3
- import { select, sort } from "@oscarpalmer/atoms/array";
4
- import { toMap } from "@oscarpalmer/atoms/array/to-map";
5
- import { toRecord } from "@oscarpalmer/atoms/array/to-record";
6
- import { isPlainObject } from "@oscarpalmer/atoms/is";
7
- var DataManager = class {
8
- handlers = Object.freeze({
9
- add: (data) => void this.add(data, true),
10
- clear: () => void this.clear(),
11
- get: (active) => this.get(active),
12
- remove: (items) => void this.remove(items, true),
13
- synchronize: (data, remove) => void this.synchronize(data, remove),
14
- update: (data) => void this.update(data)
15
- });
16
- values = {
17
- keys: { original: [] },
18
- objects: {
19
- mapped: /* @__PURE__ */ new Map(),
20
- array: []
21
- }
22
- };
23
- get keys() {
24
- return this.values.keys.active ?? this.values.keys.original;
25
- }
26
- get size() {
27
- return this.keys.length;
28
- }
29
- constructor(state) {
30
- this.state = state;
31
- }
32
- async add(data, render) {
33
- const { state, values } = this;
34
- const { length } = data;
35
- const updates = [];
36
- for (let index = 0; index < length; index += 1) {
37
- const item = data[index];
38
- const key = item[state.key];
39
- if (values.objects.mapped.has(key)) {
40
- updates.push(item);
41
- continue;
42
- }
43
- values.objects.array.push(item);
44
- values.objects.mapped.set(key, item);
45
- if (!state.managers.group.enabled) continue;
46
- const groupKey = item[state.managers.group.field];
47
- let group = state.managers.group.get(groupKey);
48
- if (group == null) {
49
- group = new GroupComponent(String(groupKey), String(groupKey), groupKey);
50
- values.objects.array.push(group);
51
- state.managers.group.add(group);
52
- }
53
- if (!group.expanded) state.managers.group.collapsed.add(key);
54
- group.total += 1;
55
- }
56
- if (updates.length > 0) this.update(updates);
57
- else if (render) this.render();
58
- }
59
- clear() {
60
- if (this.values.objects.array.length > 0) this.set([]);
61
- }
62
- destroy() {
63
- const { values } = this;
64
- values.objects.mapped.clear();
65
- values.keys.active = void 0;
66
- values.keys.original.length = 0;
67
- values.objects.array.length = 0;
68
- this.handlers = void 0;
69
- this.state = void 0;
70
- this.values = void 0;
71
- }
72
- get(active) {
73
- const { values } = this;
74
- return active ?? false ? select(values.keys.active ?? [], (key) => !(key instanceof GroupComponent), (key) => values.objects.mapped.get(key)) : values.objects.array.filter((item) => !(item instanceof GroupComponent));
75
- }
76
- getIndex(key) {
77
- return this.keys.indexOf(key);
78
- }
79
- async remove(items, render) {
80
- const { state, values } = this;
81
- const keys = items.map((value) => isPlainObject(value) ? value[state.key] : value).filter((key) => values.objects.mapped.has(key));
82
- const { length } = keys;
83
- if (length === 0) return;
84
- for (let keyIndex = 0; keyIndex < length; keyIndex += 1) {
85
- const key = keys[keyIndex];
86
- values.objects.mapped.delete(key);
87
- const arrayIndex = values.objects.array.findIndex((item) => !(item instanceof GroupComponent) && item[state.key] === key);
88
- let item;
89
- if (arrayIndex > -1) [item] = values.objects.array.splice(arrayIndex, 1);
90
- values.keys.original.splice(values.keys.original.indexOf(key), 1);
91
- state.managers.row.remove(key);
92
- if (!state.managers.group.enabled || item == null) continue;
93
- state.managers.group.collapsed.delete(key);
94
- const groupKey = item[state.managers.group.field];
95
- const group = state.managers.group.get(groupKey);
96
- if (group == null) continue;
97
- group.total -= 1;
98
- if (group.total > 0) continue;
99
- const groupIndex = values.objects.array.findIndex((item) => item instanceof GroupComponent && item.value === groupKey);
100
- if (groupIndex > -1) values.objects.array.splice(groupIndex, 1);
101
- state.managers.group.remove(group);
102
- }
103
- if (render) this.render();
104
- }
105
- render() {
106
- const { state, values } = this;
107
- if (state.managers.group.enabled) sortWithGroups(state, values.objects.array, [{
108
- direction: "ascending",
109
- key: state.key
110
- }]);
111
- else sort(values.objects.array, [{
112
- direction: "ascending",
113
- key: state.key
114
- }]);
115
- values.keys.original = values.objects.array.map((item) => item instanceof GroupComponent ? item : item[state.key]);
116
- values.objects.mapped = toMap(values.objects.array.filter((item) => !(item instanceof GroupComponent)), (item) => item[state.key]);
117
- if (Object.keys(state.managers.filter.items).length > 0) state.managers.filter.filter();
118
- else if (state.managers.sort.items.length > 0) state.managers.sort.sort();
119
- else state.managers.render.update(true, true);
120
- }
121
- set(data) {
122
- const { state, values } = this;
123
- const array = data.slice();
124
- if (state.managers.group.enabled) {
125
- const grouped = toRecord.arrays(data, state.managers.group.field);
126
- const entries = Object.entries(grouped);
127
- const { length } = entries;
128
- const groups = [];
129
- for (let index = 0; index < length; index += 1) {
130
- const [value, items] = entries[index];
131
- const key = String(value);
132
- const group = new GroupComponent(key, key, value);
133
- group.total = items.length;
134
- groups.push(group);
135
- array.push(group);
136
- }
137
- state.managers.group.set(groups);
138
- }
139
- values.objects.array = array;
140
- this.render();
141
- }
142
- async synchronize(data, remove) {
143
- const { state, values } = this;
144
- const add = [];
145
- const updated = [];
146
- const keys = /* @__PURE__ */ new Set([]);
147
- const { length } = data;
148
- for (let index = 0; index < length; index += 1) {
149
- const object = data[index];
150
- const key = object[state.key];
151
- if (values.objects.mapped.has(key)) updated.push(object);
152
- else add.push(object);
153
- keys.add(key);
154
- }
155
- if (keys.size === 0) return;
156
- if (remove ?? false) {
157
- const toRemove = values.keys.original.filter((key) => !(key instanceof GroupComponent) && !keys.has(key));
158
- if (toRemove.length > 0) await this.remove(toRemove, false);
159
- }
160
- await this.update(updated);
161
- if (add.length > 0) await this.add(add, false);
162
- if (add.length > 0 || (remove ?? false)) this.render();
163
- }
164
- async update(data) {
165
- const { state, values } = this;
166
- const { length } = data;
167
- for (let index = 0; index < length; index += 1) {
168
- const object = data[index];
169
- const key = object[state.key];
170
- const value = values.objects.mapped.get(key);
171
- if (value != null) {
172
- values.objects.mapped.set(key, {
173
- ...value,
174
- ...object
175
- });
176
- state.managers.row.update(key);
177
- }
178
- }
179
- }
180
- };
181
- export { DataManager };