@oscarpalmer/tabela 0.4.0 → 0.5.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 (64) hide show
  1. package/dist/components/body.component.js +32 -55
  2. package/dist/components/column.component.js +20 -25
  3. package/dist/components/footer.component.js +33 -34
  4. package/dist/components/header.component.js +21 -26
  5. package/dist/components/row.component.js +30 -36
  6. package/dist/helpers/dom.helpers.js +35 -30
  7. package/dist/index.js +5 -5
  8. package/dist/managers/column.manager.js +19 -0
  9. package/dist/managers/data.manager.js +34 -0
  10. package/dist/managers/row.manager.js +21 -0
  11. package/dist/managers/virtualization.manager.js +81 -85
  12. package/dist/models/column.model.js +0 -1
  13. package/dist/models/tabela.options.js +0 -1
  14. package/dist/tabela.full.js +851 -0
  15. package/dist/tabela.js +43 -43
  16. package/package.json +22 -24
  17. package/src/components/body.component.ts +19 -46
  18. package/src/components/column.component.ts +14 -8
  19. package/src/components/footer.component.ts +16 -9
  20. package/src/components/header.component.ts +7 -9
  21. package/src/components/row.component.ts +31 -31
  22. package/src/helpers/dom.helpers.ts +50 -15
  23. package/src/index.ts +8 -1
  24. package/src/managers/column.manager.ts +32 -0
  25. package/src/managers/data.manager.ts +66 -0
  26. package/src/managers/row.manager.ts +32 -0
  27. package/src/managers/virtualization.manager.ts +86 -59
  28. package/src/models/column.model.ts +1 -7
  29. package/src/models/tabela.options.ts +2 -0
  30. package/src/tabela.ts +62 -36
  31. package/types/components/body.component.d.ts +0 -7
  32. package/types/components/footer.component.d.ts +2 -0
  33. package/types/components/header.component.d.ts +2 -2
  34. package/types/components/row.component.d.ts +5 -6
  35. package/types/helpers/dom.helpers.d.ts +1 -0
  36. package/types/index.d.ts +4 -1
  37. package/types/managers/column.manager.d.ts +10 -0
  38. package/types/managers/data.manager.d.ts +25 -0
  39. package/types/managers/row.manager.d.ts +11 -0
  40. package/types/managers/virtualization.manager.d.ts +7 -8
  41. package/types/models/tabela.options.d.ts +2 -0
  42. package/types/tabela.d.ts +17 -5
  43. package/dist/components/body.component.cjs +0 -58
  44. package/dist/components/column.component.cjs +0 -27
  45. package/dist/components/footer.component.cjs +0 -35
  46. package/dist/components/header.component.cjs +0 -28
  47. package/dist/components/row.component.cjs +0 -38
  48. package/dist/helpers/dom.helpers.cjs +0 -36
  49. package/dist/index.cjs +0 -5
  50. package/dist/managers/virtualization.manager.cjs +0 -88
  51. package/dist/models/column.model.cjs +0 -1
  52. package/dist/models/tabela.options.cjs +0 -1
  53. package/dist/tabela.cjs +0 -47
  54. package/types/components/body.component.d.cts +0 -98
  55. package/types/components/column.component.d.cts +0 -98
  56. package/types/components/footer.component.d.cts +0 -98
  57. package/types/components/header.component.d.cts +0 -98
  58. package/types/components/row.component.d.cts +0 -98
  59. package/types/helpers/dom.helpers.d.cts +0 -12
  60. package/types/index.d.cts +0 -99
  61. package/types/managers/virtualization.manager.d.cts +0 -98
  62. package/types/models/column.model.d.cts +0 -17
  63. package/types/models/tabela.options.d.cts +0 -18
  64. package/types/tabela.d.cts +0 -99
@@ -0,0 +1,32 @@
1
+ import type {Key} from '@oscarpalmer/atoms/models';
2
+ import {RowComponent} from '../components/row.component';
3
+ import type {Tabela} from '../tabela';
4
+
5
+ export class RowManager {
6
+ readonly components: Map<Key, RowComponent> = new Map();
7
+
8
+ readonly height: number;
9
+
10
+ constructor(
11
+ readonly tabela: Tabela,
12
+ rowHeight: number,
13
+ ) {
14
+ this.height = rowHeight;
15
+ }
16
+
17
+ destroy(): void {
18
+ this.components.clear();
19
+ }
20
+
21
+ get(key: Key): RowComponent | undefined {
22
+ let row = this.components.get(key);
23
+
24
+ if (row == null) {
25
+ row = new RowComponent(key);
26
+
27
+ this.components.set(key, row);
28
+ }
29
+
30
+ return row;
31
+ }
32
+ }
@@ -1,5 +1,12 @@
1
- import type {BodyComponent} from '../components/body.component';
2
- import type {RowComponent} from '../components/row.component';
1
+ import {on} from '@oscarpalmer/toretto/event';
2
+ import type {RemovableEventListener} from '@oscarpalmer/toretto/models';
3
+ import {removeRow, renderRow, RowComponent} from '../components/row.component';
4
+ import type {Tabela} from '../tabela';
5
+
6
+ type Bound = {
7
+ manager: VirtualizationManager;
8
+ state: State;
9
+ };
3
10
 
4
11
  export type ElementPool = {
5
12
  cells: Record<string, HTMLDivElement[]>;
@@ -11,113 +18,133 @@ type Range = {
11
18
  start: number;
12
19
  };
13
20
 
14
- function getRange(body: BodyComponent, down: boolean): Range {
15
- const {elements, rows} = body;
16
- const {clientHeight, scrollTop} = elements.group;
21
+ type State = {
22
+ active: boolean;
23
+ top: number;
24
+ };
17
25
 
18
- const first = Math.floor(scrollTop / 32);
26
+ function getRange(tabela: Tabela, down: boolean): Range {
27
+ const {components, managers} = tabela;
28
+ const {body} = components;
29
+ const {data, rows} = managers;
30
+ const {clientHeight, scrollTop} = body.elements.group;
19
31
 
20
- const last = Math.min(
21
- rows.length - 1,
22
- Math.ceil((scrollTop + clientHeight) / 32) - 1,
23
- );
32
+ const first = Math.floor(scrollTop / rows.height);
33
+ const last = Math.min(data.length - 1, Math.ceil((scrollTop + clientHeight) / rows.height) - 1);
24
34
 
25
- const before = Math.ceil(clientHeight / 32) * (down ? 1 : 2);
26
- const after = Math.ceil(clientHeight / 32) * (down ? 2 : 1);
35
+ const before = Math.ceil(clientHeight / rows.height) * (down ? 1 : 2);
36
+ const after = Math.ceil(clientHeight / rows.height) * (down ? 2 : 1);
27
37
 
28
38
  const start = Math.max(0, first - before);
29
- const end = Math.min(rows.length - 1, last + after);
39
+ const end = Math.min(data.length - 1, last + after);
30
40
 
31
41
  return {end, start};
32
42
  }
33
43
 
44
+ function onScroll(this: Bound): void {
45
+ if (!this.state.active) {
46
+ requestAnimationFrame(() => {
47
+ const top = this.manager.tabela.components.body.elements.group.scrollTop;
48
+
49
+ this.manager.update(top > this.state.top);
50
+
51
+ this.state.active = false;
52
+ this.state.top = top;
53
+ });
54
+
55
+ this.state.active = true;
56
+ }
57
+ }
58
+
34
59
  export class VirtualizationManager {
35
- private active = false;
60
+ fragment!: DocumentFragment;
36
61
 
37
- private readonly pool: ElementPool = {
62
+ listener: RemovableEventListener;
63
+
64
+ readonly #pool: ElementPool = {
38
65
  cells: {},
39
66
  rows: [],
40
67
  };
41
68
 
42
- private top = 0;
69
+ readonly #state: State = {
70
+ active: false,
71
+ top: 0,
72
+ };
43
73
 
44
- private readonly visible = new Map<number, RowComponent>();
74
+ readonly #visible = new Map<number, RowComponent>();
45
75
 
46
- constructor(private readonly body: BodyComponent) {
47
- this.body.elements.group.addEventListener(
76
+ constructor(readonly tabela: Tabela) {
77
+ this.listener = on(
78
+ tabela.components.body.elements.group,
48
79
  'scroll',
49
- () => {
50
- this.onScroll();
51
- },
52
- {
53
- passive: true,
54
- },
80
+ onScroll.bind({
81
+ manager: this,
82
+ state: this.#state,
83
+ }),
55
84
  );
56
85
  }
57
86
 
58
87
  destroy(): void {
59
- const {visible, pool} = this;
88
+ this.listener();
60
89
 
61
- for (const [index, row] of visible) {
62
- row.remove(pool);
63
- visible.delete(index);
90
+ for (const [index, row] of this.#visible) {
91
+ removeRow(row, this.#pool);
92
+
93
+ this.#visible.delete(index);
64
94
  }
65
95
 
66
- pool.cells = {};
67
- pool.rows = [];
96
+ this.#pool.cells = {};
97
+ this.#pool.rows = [];
68
98
  }
69
99
 
70
100
  update(down: boolean): void {
71
- const {body, pool, visible} = this;
101
+ const {tabela} = this;
102
+ const {rows} = tabela.managers;
72
103
 
73
104
  const indices = new Set<number>();
74
- const range = getRange(body, down);
105
+ const range = getRange(tabela, down);
75
106
 
76
107
  for (let index = range.start; index <= range.end; index += 1) {
77
108
  indices.add(index);
78
109
  }
79
110
 
80
- for (const [index, row] of visible) {
111
+ for (const [index, row] of this.#visible) {
81
112
  if (!indices.has(index)) {
82
- visible.delete(index);
113
+ this.#visible.delete(index);
83
114
 
84
- row.remove(pool);
115
+ removeRow(row, this.#pool);
85
116
  }
86
117
  }
87
118
 
88
- const fragment = document.createDocumentFragment();
119
+ this.fragment ??= document.createDocumentFragment();
89
120
 
90
- for (let index = range.start; index <= range.end; index += 1) {
91
- if (!visible.has(index)) {
92
- const row = body.rows[index];
121
+ this.fragment.replaceChildren();
93
122
 
94
- row.render(pool);
123
+ const keys =
124
+ tabela.managers.data.values.keys.active ?? tabela.managers.data.values.keys.original;
95
125
 
96
- visible.set(index, row);
126
+ for (let index = range.start; index <= range.end; index += 1) {
127
+ if (this.#visible.has(index)) {
128
+ continue;
129
+ }
97
130
 
98
- if (row.element != null) {
99
- row.element.style.transform = `translateY(${index * 32}px)`;
131
+ const row = tabela.managers.rows.get(keys[index]);
100
132
 
101
- fragment.append(row.element);
102
- }
133
+ if (row == null) {
134
+ continue;
103
135
  }
104
136
 
105
- body.elements.group.append(fragment);
106
- }
107
- }
108
-
109
- private onScroll(): void {
110
- if (!this.active) {
111
- requestAnimationFrame(() => {
112
- const top = this.body.elements.group.scrollTop;
137
+ renderRow(tabela, this.#pool, row);
113
138
 
114
- this.update(top > this.top);
139
+ this.#visible.set(index, row);
115
140
 
116
- this.active = false;
117
- this.top = top;
118
- });
141
+ if (row.element != null) {
142
+ row.element.style.transform = `translateY(${index * rows.height}px)`;
119
143
 
120
- this.active = true;
144
+ this.fragment.append(row.element);
145
+ }
121
146
  }
147
+
148
+ tabela.components.body.elements.group.append(this.fragment);
122
149
  }
123
150
  }
@@ -12,10 +12,4 @@ export type TabelaColumnOptions = {
12
12
  width?: number;
13
13
  };
14
14
 
15
- export type TabelaColumnType =
16
- | 'boolean'
17
- | 'date'
18
- | 'date-time'
19
- | 'number'
20
- | 'string'
21
- | 'time';
15
+ export type TabelaColumnType = 'boolean' | 'date' | 'date-time' | 'number' | 'string' | 'time';
@@ -4,5 +4,7 @@ import type {TabelaColumnOptions} from './column.model';
4
4
  export type TabelaOptions = {
5
5
  columns: TabelaColumnOptions[];
6
6
  data: PlainObject[];
7
+ key: string;
7
8
  label: string;
9
+ rowHeight: number;
8
10
  };
package/src/tabela.ts CHANGED
@@ -1,54 +1,80 @@
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 {ColumnManager} from './managers/column.manager';
5
+ import {DataManager} from './managers/data.manager';
6
+ import {RowManager} from './managers/row.manager';
4
7
  import type {TabelaOptions} from './models/tabela.options';
5
8
 
6
- export class Tabela {
7
- readonly body: BodyComponent;
8
- readonly footer: FooterComponent;
9
- readonly header: HeaderComponent;
9
+ type Components = {
10
+ body: BodyComponent;
11
+ footer: FooterComponent;
12
+ header: HeaderComponent;
13
+ };
10
14
 
11
- constructor(
12
- public element: HTMLElement,
13
- readonly options: TabelaOptions,
14
- ) {
15
- element.innerHTML = '';
16
- element.role = 'table';
15
+ type Managers = {
16
+ columns: ColumnManager;
17
+ data: DataManager;
18
+ rows: RowManager;
19
+ };
17
20
 
18
- element.classList.add('tabela');
21
+ export class Tabela {
22
+ readonly components: Components;
23
+ readonly key: string;
24
+ readonly managers: Managers;
19
25
 
20
- element.setAttribute('aria-label', options.label);
26
+ constructor(
27
+ public element: HTMLElement,
28
+ options: TabelaOptions,
29
+ ) {
30
+ element.innerHTML = '';
31
+ element.role = 'table';
21
32
 
22
- this.header = new HeaderComponent(this);
23
- this.body = new BodyComponent(this);
24
- this.footer = new FooterComponent(this);
33
+ element.classList.add('tabela');
25
34
 
26
- element.append(
27
- this.header.elements.group,
28
- this.body.elements.group,
29
- this.footer.elements.group,
30
- );
31
- }
35
+ element.setAttribute('aria-label', options.label);
32
36
 
33
- destroy(): void {
34
- this.body.destroy();
35
- this.footer.destroy();
36
- this.header.destroy();
37
+ this.key = options.key;
37
38
 
38
- this.options.columns = [];
39
- this.options.data = [];
39
+ this.components = {
40
+ header: new HeaderComponent(this),
41
+ body: new BodyComponent(this),
42
+ footer: new FooterComponent(this),
43
+ };
40
44
 
41
- this.element.innerHTML = '';
42
- this.element.role = '';
45
+ this.managers = {
46
+ columns: new ColumnManager(this, options.columns),
47
+ data: new DataManager(this, options.data),
48
+ rows: new RowManager(this, options.rowHeight),
49
+ };
43
50
 
44
- this.element.classList.remove('tabela');
45
- this.element.removeAttribute('aria-label');
46
- this.element.removeAttribute('role');
51
+ element.append(
52
+ this.components.header.elements.group,
53
+ this.components.body.elements.group,
54
+ this.components.footer.elements.group,
55
+ );
47
56
 
48
- this.element = undefined as never;
49
- }
57
+ this.managers.data.update();
50
58
  }
51
59
 
52
- export function tabela(element: HTMLElement, options: TabelaOptions): Tabela {
53
- return new Tabela(element, options);
60
+ destroy(): void {
61
+ const {components, element, managers} = this;
62
+
63
+ components.body.destroy();
64
+ components.footer.destroy();
65
+ components.header.destroy();
66
+
67
+ managers.columns.destroy();
68
+ managers.data.destroy();
69
+ managers.rows.destroy();
70
+
71
+ element.innerHTML = '';
72
+ element.role = '';
73
+
74
+ element.classList.remove('tabela');
75
+ element.removeAttribute('aria-label');
76
+ element.removeAttribute('role');
77
+
78
+ this.element = undefined as never;
79
+ }
54
80
  }
@@ -1,7 +1,4 @@
1
- import type { PlainObject } from '@oscarpalmer/atoms/models';
2
- import { VirtualizationManager } from '../managers/virtualization.manager';
3
1
  import type { Tabela } from '../tabela';
4
- import { RowComponent } from './row.component';
5
2
  type Elements = {
6
3
  faker: HTMLDivElement;
7
4
  group: HTMLDivElement;
@@ -9,11 +6,7 @@ type Elements = {
9
6
  export declare class BodyComponent {
10
7
  readonly tabela: Tabela;
11
8
  readonly elements: Elements;
12
- readonly rows: RowComponent[];
13
- readonly virtualization: VirtualizationManager;
14
9
  constructor(tabela: Tabela);
15
- addData(data: PlainObject[]): Promise<void>;
16
10
  destroy(): void;
17
- private updateVirtualization;
18
11
  }
19
12
  export {};
@@ -1,4 +1,5 @@
1
1
  import type { Tabela } from '../tabela';
2
+ import type { ColumnComponent } from './column.component';
2
3
  type Elements = {
3
4
  cells: HTMLDivElement[];
4
5
  group: HTMLDivElement;
@@ -9,5 +10,6 @@ export declare class FooterComponent {
9
10
  readonly elements: Elements;
10
11
  constructor(tabela: Tabela);
11
12
  destroy(): void;
13
+ update(columns: ColumnComponent[]): void;
12
14
  }
13
15
  export {};
@@ -1,14 +1,14 @@
1
1
  import type { Tabela } from '../tabela';
2
- import { ColumnComponent } from './column.component';
2
+ import type { ColumnComponent } from './column.component';
3
3
  type Elements = {
4
4
  group: HTMLDivElement;
5
5
  row: HTMLDivElement;
6
6
  };
7
7
  export declare class HeaderComponent {
8
8
  readonly tabela: Tabela;
9
- readonly columns: ColumnComponent[];
10
9
  readonly elements: Elements;
11
10
  constructor(tabela: Tabela);
12
11
  destroy(): void;
12
+ update(columns: ColumnComponent[]): void;
13
13
  }
14
14
  export {};
@@ -1,11 +1,10 @@
1
- import type { PlainObject } from '@oscarpalmer/atoms/models';
1
+ import type { Key } from '@oscarpalmer/atoms/models';
2
2
  import type { ElementPool } from '../managers/virtualization.manager';
3
3
  import type { Tabela } from '../tabela';
4
+ export declare function removeRow(row: RowComponent, pool: ElementPool): void;
5
+ export declare function renderRow(tabela: Tabela, pool: ElementPool, row: RowComponent): void;
4
6
  export declare class RowComponent {
5
- readonly tabela: Tabela;
6
- readonly data: PlainObject;
7
+ readonly key: Key;
7
8
  element: HTMLDivElement | undefined;
8
- constructor(tabela: Tabela, data: PlainObject);
9
- remove(pool: ElementPool): void;
10
- render(pool: ElementPool): void;
9
+ constructor(key: Key);
11
10
  }
@@ -3,6 +3,7 @@ type RowGroupWithRow = {
3
3
  row: HTMLDivElement;
4
4
  };
5
5
  export declare function createCell(width: number, body?: boolean): HTMLDivElement;
6
+ export declare function createElement<TagName extends keyof HTMLElementTagNameMap>(tagName: TagName, properties: Partial<HTMLElementTagNameMap[TagName]>, style: Partial<CSSStyleDeclaration>): HTMLElementTagNameMap[TagName];
6
7
  export declare function createRowGroup(): RowGroupWithRow;
7
8
  export declare function createRowGroup(withRow: boolean): HTMLDivElement;
8
9
  export declare function createRow(withStyle?: boolean): HTMLDivElement;
package/types/index.d.ts CHANGED
@@ -1 +1,4 @@
1
- export * from './tabela';
1
+ import type { TabelaOptions } from './models/tabela.options';
2
+ import { Tabela } from './tabela';
3
+ export declare function tabela(element: HTMLElement, options: TabelaOptions): Tabela;
4
+ export type { Tabela, TabelaOptions };
@@ -0,0 +1,10 @@
1
+ import { ColumnComponent } from '../components/column.component';
2
+ import type { TabelaColumnOptions } from '../models/column.model';
3
+ import type { Tabela } from '../tabela';
4
+ export declare class ColumnManager {
5
+ readonly tabela: Tabela;
6
+ readonly components: ColumnComponent[];
7
+ constructor(tabela: Tabela, columns: TabelaColumnOptions[]);
8
+ destroy(): void;
9
+ set(columns: TabelaColumnOptions[]): void;
10
+ }
@@ -0,0 +1,25 @@
1
+ import type { Key, PlainObject } from '@oscarpalmer/atoms/models';
2
+ import type { Tabela } from '../tabela';
3
+ import { VirtualizationManager } from './virtualization.manager';
4
+ type Keys = {
5
+ active?: Key[];
6
+ original: Key[];
7
+ };
8
+ type Objects = {
9
+ array: PlainObject[];
10
+ mapped: Map<Key, PlainObject>;
11
+ };
12
+ type Values = {
13
+ keys: Keys;
14
+ objects: Objects;
15
+ };
16
+ export declare class DataManager {
17
+ readonly tabela: Tabela;
18
+ readonly values: Values;
19
+ readonly virtualization: VirtualizationManager;
20
+ get length(): number;
21
+ constructor(tabela: Tabela, values: PlainObject[]);
22
+ destroy(): void;
23
+ update(): void;
24
+ }
25
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { Key } from '@oscarpalmer/atoms/models';
2
+ import { RowComponent } from '../components/row.component';
3
+ import type { Tabela } from '../tabela';
4
+ export declare class RowManager {
5
+ readonly tabela: Tabela;
6
+ readonly components: Map<Key, RowComponent>;
7
+ readonly height: number;
8
+ constructor(tabela: Tabela, rowHeight: number);
9
+ destroy(): void;
10
+ get(key: Key): RowComponent | undefined;
11
+ }
@@ -1,16 +1,15 @@
1
- import type { BodyComponent } from '../components/body.component';
1
+ import type { RemovableEventListener } from '@oscarpalmer/toretto/models';
2
+ import type { Tabela } from '../tabela';
2
3
  export type ElementPool = {
3
4
  cells: Record<string, HTMLDivElement[]>;
4
5
  rows: HTMLDivElement[];
5
6
  };
6
7
  export declare class VirtualizationManager {
7
- private readonly body;
8
- private active;
9
- private readonly pool;
10
- private top;
11
- private readonly visible;
12
- constructor(body: BodyComponent);
8
+ #private;
9
+ readonly tabela: Tabela;
10
+ fragment: DocumentFragment;
11
+ listener: RemovableEventListener;
12
+ constructor(tabela: Tabela);
13
13
  destroy(): void;
14
14
  update(down: boolean): void;
15
- private onScroll;
16
15
  }
@@ -3,5 +3,7 @@ import type { TabelaColumnOptions } from './column.model';
3
3
  export type TabelaOptions = {
4
4
  columns: TabelaColumnOptions[];
5
5
  data: PlainObject[];
6
+ key: string;
6
7
  label: string;
8
+ rowHeight: number;
7
9
  };
package/types/tabela.d.ts CHANGED
@@ -1,14 +1,26 @@
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 { ColumnManager } from './managers/column.manager';
5
+ import { DataManager } from './managers/data.manager';
6
+ import { RowManager } from './managers/row.manager';
4
7
  import type { TabelaOptions } from './models/tabela.options';
8
+ type Components = {
9
+ body: BodyComponent;
10
+ footer: FooterComponent;
11
+ header: HeaderComponent;
12
+ };
13
+ type Managers = {
14
+ columns: ColumnManager;
15
+ data: DataManager;
16
+ rows: RowManager;
17
+ };
5
18
  export declare class Tabela {
6
19
  element: HTMLElement;
7
- readonly options: TabelaOptions;
8
- readonly body: BodyComponent;
9
- readonly footer: FooterComponent;
10
- readonly header: HeaderComponent;
20
+ readonly components: Components;
21
+ readonly key: string;
22
+ readonly managers: Managers;
11
23
  constructor(element: HTMLElement, options: TabelaOptions);
12
24
  destroy(): void;
13
25
  }
14
- export declare function tabela(element: HTMLElement, options: TabelaOptions): Tabela;
26
+ export {};
@@ -1,58 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const helpers_dom_helpers = require("../helpers/dom.helpers.cjs");
7
- const managers_virtualization_manager = require("../managers/virtualization.manager.cjs");
8
- const components_row_component = require("./row.component.cjs");
9
- function createFaker() {
10
- const element = document.createElement("div");
11
- element.style.height = "0";
12
- element.style.inset = "0 auto auto 0";
13
- element.style.opacity = "0";
14
- element.style.pointerEvents = "none";
15
- element.style.position = "absolute";
16
- element.style.width = "1px";
17
- return element;
18
- }
19
- class BodyComponent {
20
- constructor(tabela) {
21
- __publicField(this, "elements", {
22
- faker: createFaker(),
23
- group: void 0
24
- });
25
- __publicField(this, "rows", []);
26
- __publicField(this, "virtualization");
27
- this.tabela = tabela;
28
- const group = helpers_dom_helpers.createRowGroup(false);
29
- this.elements.group = group;
30
- this.virtualization = new managers_virtualization_manager.VirtualizationManager(this);
31
- group.className += " tabela__rowgroup-body";
32
- group.style.height = "100%";
33
- group.style.overflow = "auto";
34
- group.style.position = "relative";
35
- group.append(this.elements.faker);
36
- void this.addData(tabela.options.data).then(() => {
37
- this.virtualization.update(true);
38
- });
39
- }
40
- async addData(data) {
41
- const { length } = data;
42
- for (let index = 0; index < length; index += 1) {
43
- this.rows.push(new components_row_component.RowComponent(this.tabela, data[index]));
44
- }
45
- this.updateVirtualization();
46
- }
47
- destroy() {
48
- this.virtualization.destroy();
49
- this.elements.faker = void 0;
50
- this.elements.group = void 0;
51
- this.rows.length = 0;
52
- }
53
- updateVirtualization() {
54
- this.elements.faker.style.height = `${this.rows.length * 32}px`;
55
- this.virtualization.update(true);
56
- }
57
- }
58
- exports.BodyComponent = BodyComponent;
@@ -1,27 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- function createElement(title, width) {
7
- const cell = document.createElement("div");
8
- cell.className = "tabela__heading";
9
- cell.role = "columnheader";
10
- cell.style.width = `${width}px`;
11
- cell.textContent = title;
12
- return cell;
13
- }
14
- class ColumnComponent {
15
- constructor(tabela, options) {
16
- __publicField(this, "element");
17
- __publicField(this, "options");
18
- this.tabela = tabela;
19
- const width = Number.parseInt(getComputedStyle(tabela.element).fontSize, 10) * (options.width ?? options.title.length * 1.5);
20
- this.options = {
21
- ...options,
22
- width
23
- };
24
- this.element = createElement(options.title, width);
25
- }
26
- }
27
- exports.ColumnComponent = ColumnComponent;