@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
@@ -1,58 +1,35 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { createRowGroup } from "../helpers/dom.helpers.js";
5
- import { VirtualizationManager } from "../managers/virtualization.manager.js";
6
- import { RowComponent } from "./row.component.js";
1
+ import { createElement, createRowGroup } from "../helpers/dom.helpers.js";
2
+ import { setStyles } from "@oscarpalmer/toretto/style";
7
3
  function createFaker() {
8
- const element = document.createElement("div");
9
- element.style.height = "0";
10
- element.style.inset = "0 auto auto 0";
11
- element.style.opacity = "0";
12
- element.style.pointerEvents = "none";
13
- element.style.position = "absolute";
14
- element.style.width = "1px";
15
- return element;
4
+ return createElement("div", {}, {
5
+ height: "0",
6
+ inset: "0 auto auto 0",
7
+ opacity: "0",
8
+ pointerEvents: "none",
9
+ position: "absolute",
10
+ width: "1px"
11
+ });
16
12
  }
17
- class BodyComponent {
18
- constructor(tabela) {
19
- __publicField(this, "elements", {
20
- faker: createFaker(),
21
- group: void 0
22
- });
23
- __publicField(this, "rows", []);
24
- __publicField(this, "virtualization");
25
- this.tabela = tabela;
26
- const group = createRowGroup(false);
27
- this.elements.group = group;
28
- this.virtualization = new VirtualizationManager(this);
29
- group.className += " tabela__rowgroup-body";
30
- group.style.height = "100%";
31
- group.style.overflow = "auto";
32
- group.style.position = "relative";
33
- group.append(this.elements.faker);
34
- void this.addData(tabela.options.data).then(() => {
35
- this.virtualization.update(true);
36
- });
37
- }
38
- async addData(data) {
39
- const { length } = data;
40
- for (let index = 0; index < length; index += 1) {
41
- this.rows.push(new RowComponent(this.tabela, data[index]));
42
- }
43
- this.updateVirtualization();
44
- }
45
- destroy() {
46
- this.virtualization.destroy();
47
- this.elements.faker = void 0;
48
- this.elements.group = void 0;
49
- this.rows.length = 0;
50
- }
51
- updateVirtualization() {
52
- this.elements.faker.style.height = `${this.rows.length * 32}px`;
53
- this.virtualization.update(true);
54
- }
55
- }
56
- export {
57
- BodyComponent
13
+ var BodyComponent = class {
14
+ elements = {
15
+ faker: createFaker(),
16
+ group: void 0
17
+ };
18
+ constructor(tabela) {
19
+ this.tabela = tabela;
20
+ const group = createRowGroup(false);
21
+ this.elements.group = group;
22
+ group.className += " tabela__rowgroup-body";
23
+ setStyles(group, {
24
+ height: "100%",
25
+ overflow: "auto",
26
+ position: "relative"
27
+ });
28
+ group.append(this.elements.faker);
29
+ }
30
+ destroy() {
31
+ this.elements.faker = void 0;
32
+ this.elements.group = void 0;
33
+ }
58
34
  };
35
+ export { BodyComponent };
@@ -1,27 +1,22 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- function createElement(title, width) {
5
- const cell = document.createElement("div");
6
- cell.className = "tabela__heading";
7
- cell.role = "columnheader";
8
- cell.style.width = `${width}px`;
9
- cell.textContent = title;
10
- return cell;
1
+ import { createElement } from "../helpers/dom.helpers.js";
2
+ function createHeading(title, width) {
3
+ return createElement("div", {
4
+ className: "tabela__heading",
5
+ role: "columnheader",
6
+ textContent: title
7
+ }, { width: `${width}px` });
11
8
  }
12
- class ColumnComponent {
13
- constructor(tabela, options) {
14
- __publicField(this, "element");
15
- __publicField(this, "options");
16
- this.tabela = tabela;
17
- const width = Number.parseInt(getComputedStyle(tabela.element).fontSize, 10) * (options.width ?? options.title.length * 1.5);
18
- this.options = {
19
- ...options,
20
- width
21
- };
22
- this.element = createElement(options.title, width);
23
- }
24
- }
25
- export {
26
- ColumnComponent
9
+ var ColumnComponent = class {
10
+ element;
11
+ options;
12
+ constructor(tabela, options) {
13
+ this.tabela = tabela;
14
+ const width = Number.parseInt(getComputedStyle(tabela.element).fontSize, 10) * (options.width ?? options.title.length * 1.5);
15
+ this.options = {
16
+ ...options,
17
+ width
18
+ };
19
+ this.element = createHeading(options.title, width);
20
+ }
27
21
  };
22
+ export { ColumnComponent };
@@ -1,35 +1,34 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { createRowGroup, createCell } from "../helpers/dom.helpers.js";
5
- class FooterComponent {
6
- constructor(tabela) {
7
- __publicField(this, "elements");
8
- this.tabela = tabela;
9
- const { group, row } = createRowGroup();
10
- this.elements = {
11
- group,
12
- row,
13
- cells: []
14
- };
15
- group.className += " tabela__rowgroup-footer";
16
- row.className += " tabela__row-footer";
17
- const { columns } = tabela.header;
18
- const { length } = columns;
19
- for (let index = 0; index < length; index += 1) {
20
- const cell = createCell(columns[index].options.width ?? 4, false);
21
- cell.className += " tabela__cell-footer";
22
- cell.innerHTML = "&nbsp;";
23
- this.elements.cells.push(cell);
24
- row.append(cell);
25
- }
26
- }
27
- destroy() {
28
- this.elements.cells = [];
29
- this.elements.group = void 0;
30
- this.elements.row = void 0;
31
- }
32
- }
33
- export {
34
- FooterComponent
1
+ import { createCell, createRowGroup } from "../helpers/dom.helpers.js";
2
+ var FooterComponent = class {
3
+ elements;
4
+ constructor(tabela) {
5
+ this.tabela = tabela;
6
+ const { group, row } = createRowGroup();
7
+ this.elements = {
8
+ group,
9
+ row,
10
+ cells: []
11
+ };
12
+ group.className += " tabela__rowgroup-footer";
13
+ row.className += " tabela__row-footer";
14
+ }
15
+ destroy() {
16
+ this.elements.cells.length = 0;
17
+ this.elements.group = void 0;
18
+ this.elements.row = void 0;
19
+ }
20
+ update(columns) {
21
+ const { elements } = this;
22
+ const { length } = columns;
23
+ elements.cells.length = 0;
24
+ elements.row.innerHTML = "";
25
+ for (let index = 0; index < length; index += 1) {
26
+ const cell = createCell(columns[index].options.width ?? 4, false);
27
+ cell.className += " tabela__cell-footer";
28
+ cell.innerHTML = "&nbsp;";
29
+ elements.cells.push(cell);
30
+ elements.row.append(cell);
31
+ }
32
+ }
35
33
  };
34
+ export { FooterComponent };
@@ -1,28 +1,23 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
1
  import { createRowGroup } from "../helpers/dom.helpers.js";
5
- import { ColumnComponent } from "./column.component.js";
6
- class HeaderComponent {
7
- constructor(tabela) {
8
- __publicField(this, "columns");
9
- __publicField(this, "elements");
10
- this.tabela = tabela;
11
- this.columns = tabela.options.columns.map(
12
- (column) => new ColumnComponent(tabela, column)
13
- );
14
- const { group, row } = createRowGroup();
15
- this.elements = { group, row };
16
- group.className += " tabela__rowgroup-header";
17
- row.className += " tabela__row-header";
18
- row.append(...this.columns.map((column) => column.element));
19
- }
20
- destroy() {
21
- this.columns.length = 0;
22
- this.elements.group = void 0;
23
- this.elements.row = void 0;
24
- }
25
- }
26
- export {
27
- HeaderComponent
2
+ var HeaderComponent = class {
3
+ elements;
4
+ constructor(tabela) {
5
+ this.tabela = tabela;
6
+ const { group, row } = createRowGroup();
7
+ this.elements = {
8
+ group,
9
+ row
10
+ };
11
+ group.className += " tabela__rowgroup-header";
12
+ row.className += " tabela__row-header";
13
+ }
14
+ destroy() {
15
+ this.elements.group = void 0;
16
+ this.elements.row = void 0;
17
+ }
18
+ update(columns) {
19
+ this.elements.row.innerHTML = "";
20
+ this.elements.row.append(...columns.map((column) => column.element));
21
+ }
28
22
  };
23
+ export { HeaderComponent };
@@ -1,38 +1,32 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { createRow, createCell } from "../helpers/dom.helpers.js";
5
- class RowComponent {
6
- constructor(tabela, data) {
7
- __publicField(this, "element");
8
- this.tabela = tabela;
9
- this.data = data;
10
- }
11
- remove(pool) {
12
- if (this.element != null) {
13
- this.element.innerHTML = "";
14
- pool.rows.push(this.element);
15
- this.element.remove();
16
- this.element = void 0;
17
- }
18
- }
19
- render(pool) {
20
- var _a, _b;
21
- const element = this.element ?? pool.rows.shift() ?? createRow();
22
- this.element = element;
23
- element.innerHTML = "";
24
- const { tabela } = this;
25
- const { columns } = tabela.header;
26
- const { length } = columns;
27
- for (let index = 0; index < length; index += 1) {
28
- const { options } = columns[index];
29
- (_a = pool.cells)[_b = options.field] ?? (_a[_b] = []);
30
- const cell = pool.cells[columns[index].options.field].shift() ?? createCell(options.width);
31
- cell.textContent = String(this.data[options.field]);
32
- element.append(cell);
33
- }
34
- }
1
+ import { createCell, createRow } from "../helpers/dom.helpers.js";
2
+ function removeRow(row, pool) {
3
+ if (row.element != null) {
4
+ row.element.innerHTML = "";
5
+ pool.rows.push(row.element);
6
+ row.element.remove();
7
+ row.element = void 0;
8
+ }
35
9
  }
36
- export {
37
- RowComponent
10
+ function renderRow(tabela, pool, row) {
11
+ const element = row.element ?? pool.rows.shift() ?? createRow();
12
+ row.element = element;
13
+ element.innerHTML = "";
14
+ const columns = tabela.managers.columns.components;
15
+ const { length } = columns;
16
+ const data = tabela.managers.data.values.objects.mapped.get(row.key);
17
+ if (data == null) return;
18
+ for (let index = 0; index < length; index += 1) {
19
+ const { options } = columns[index];
20
+ pool.cells[options.field] ??= [];
21
+ const cell = pool.cells[columns[index].options.field].shift() ?? createCell(options.width);
22
+ cell.textContent = String(data[options.field]);
23
+ element.append(cell);
24
+ }
25
+ }
26
+ var RowComponent = class {
27
+ element;
28
+ constructor(key) {
29
+ this.key = key;
30
+ }
38
31
  };
32
+ export { RowComponent, removeRow, renderRow };
@@ -1,36 +1,41 @@
1
+ import { setStyles } from "@oscarpalmer/toretto/style";
1
2
  function createCell(width, body) {
2
- const cell = document.createElement("div");
3
- cell.className = "tabela__cell";
4
- cell.role = "cell";
5
- cell.style.width = `${width}px`;
6
- if (body ?? true) {
7
- cell.classList.add("tabela__cell-body");
8
- }
9
- return cell;
3
+ const cell = createElement("div", {
4
+ className: "tabela__cell",
5
+ role: "cell"
6
+ }, { width: `${width}px` });
7
+ if (body ?? true) cell.classList.add("tabela__cell-body");
8
+ return cell;
9
+ }
10
+ function createElement(tagName, properties, style) {
11
+ const element = document.createElement(tagName);
12
+ const keys = Object.keys(properties);
13
+ for (const key of keys) element[key] = properties[key];
14
+ setStyles(element, style);
15
+ return element;
10
16
  }
11
17
  function createRowGroup(withRow) {
12
- const group = document.createElement("div");
13
- group.className = "tabela__rowgroup";
14
- group.role = "rowgroup";
15
- if (!(withRow ?? true)) {
16
- return group;
17
- }
18
- const row = createRow(false);
19
- group.append(row);
20
- return { group, row };
18
+ const group = createElement("div", {
19
+ className: "tabela__rowgroup",
20
+ role: "rowgroup"
21
+ }, {});
22
+ if (!(withRow ?? true)) return group;
23
+ const row = createRow(false);
24
+ group.append(row);
25
+ return {
26
+ group,
27
+ row
28
+ };
21
29
  }
22
30
  function createRow(withStyle) {
23
- const row = document.createElement("div");
24
- row.className = "tabela__row";
25
- row.role = "row";
26
- if (withStyle ?? true) {
27
- row.style.inset = "0 auto auto 0";
28
- row.style.position = "absolute";
29
- }
30
- return row;
31
+ const row = createElement("div", {
32
+ className: "tabela__row",
33
+ role: "row"
34
+ }, {});
35
+ if (withStyle ?? true) setStyles(row, {
36
+ inset: "0 auto auto 0",
37
+ position: "absolute"
38
+ });
39
+ return row;
31
40
  }
32
- export {
33
- createCell,
34
- createRow,
35
- createRowGroup
36
- };
41
+ export { createCell, createElement, createRow, createRowGroup };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Tabela, tabela } from "./tabela.js";
2
- export {
3
- Tabela,
4
- tabela
5
- };
1
+ import { Tabela } from "./tabela.js";
2
+ function tabela(element, options) {
3
+ return new Tabela(element, options);
4
+ }
5
+ export { tabela };
@@ -0,0 +1,19 @@
1
+ import { ColumnComponent } from "../components/column.component.js";
2
+ var ColumnManager = class {
3
+ components = [];
4
+ constructor(tabela, columns) {
5
+ this.tabela = tabela;
6
+ this.set(columns);
7
+ }
8
+ destroy() {
9
+ this.components.length = 0;
10
+ }
11
+ set(columns) {
12
+ const { components, tabela } = this;
13
+ const { footer, header } = tabela.components;
14
+ components.splice(0, components.length, ...columns.map((column) => new ColumnComponent(tabela, column)));
15
+ header.update(components);
16
+ footer.update(components);
17
+ }
18
+ };
19
+ export { ColumnManager };
@@ -0,0 +1,34 @@
1
+ import { VirtualizationManager } from "./virtualization.manager.js";
2
+ import { toMap } from "@oscarpalmer/atoms/array";
3
+ var DataManager = class {
4
+ values;
5
+ virtualization;
6
+ get length() {
7
+ return this.values.keys.active?.length ?? this.values.keys.original.length;
8
+ }
9
+ constructor(tabela, values) {
10
+ this.tabela = tabela;
11
+ const mapped = toMap(values, tabela.key);
12
+ this.values = {
13
+ keys: { original: [...mapped.keys()] },
14
+ objects: {
15
+ mapped,
16
+ array: values
17
+ }
18
+ };
19
+ this.virtualization = new VirtualizationManager(tabela);
20
+ }
21
+ destroy() {
22
+ const { values, virtualization } = this;
23
+ virtualization.destroy();
24
+ values.objects.mapped.clear();
25
+ values.keys.active = void 0;
26
+ values.keys.original.length = 0;
27
+ values.objects.array.length = 0;
28
+ }
29
+ update() {
30
+ this.tabela.components.body.elements.faker.style.height = `${this.length * this.tabela.managers.rows.height}px`;
31
+ this.virtualization.update(true);
32
+ }
33
+ };
34
+ export { DataManager };
@@ -0,0 +1,21 @@
1
+ import { RowComponent } from "../components/row.component.js";
2
+ var RowManager = class {
3
+ components = /* @__PURE__ */ new Map();
4
+ height;
5
+ constructor(tabela, rowHeight) {
6
+ this.tabela = tabela;
7
+ this.height = rowHeight;
8
+ }
9
+ destroy() {
10
+ this.components.clear();
11
+ }
12
+ get(key) {
13
+ let row = this.components.get(key);
14
+ if (row == null) {
15
+ row = new RowComponent(key);
16
+ this.components.set(key, row);
17
+ }
18
+ return row;
19
+ }
20
+ };
21
+ export { RowManager };
@@ -1,88 +1,84 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- function getRange(body, down) {
5
- const { elements, rows } = body;
6
- const { clientHeight, scrollTop } = elements.group;
7
- const first = Math.floor(scrollTop / 32);
8
- const last = Math.min(
9
- rows.length - 1,
10
- Math.ceil((scrollTop + clientHeight) / 32) - 1
11
- );
12
- const before = Math.ceil(clientHeight / 32) * (down ? 1 : 2);
13
- const after = Math.ceil(clientHeight / 32) * (down ? 2 : 1);
14
- const start = Math.max(0, first - before);
15
- const end = Math.min(rows.length - 1, last + after);
16
- return { end, start };
1
+ import { removeRow, renderRow } from "../components/row.component.js";
2
+ import { on } from "@oscarpalmer/toretto/event";
3
+ function getRange(tabela, down) {
4
+ const { components, managers } = tabela;
5
+ const { body } = components;
6
+ const { data, rows } = managers;
7
+ const { clientHeight, scrollTop } = body.elements.group;
8
+ const first = Math.floor(scrollTop / rows.height);
9
+ const last = Math.min(data.length - 1, Math.ceil((scrollTop + clientHeight) / rows.height) - 1);
10
+ const before = Math.ceil(clientHeight / rows.height) * (down ? 1 : 2);
11
+ const after = Math.ceil(clientHeight / rows.height) * (down ? 2 : 1);
12
+ const start = Math.max(0, first - before);
13
+ return {
14
+ end: Math.min(data.length - 1, last + after),
15
+ start
16
+ };
17
17
  }
18
- class VirtualizationManager {
19
- constructor(body) {
20
- __publicField(this, "active", false);
21
- __publicField(this, "pool", {
22
- cells: {},
23
- rows: []
24
- });
25
- __publicField(this, "top", 0);
26
- __publicField(this, "visible", /* @__PURE__ */ new Map());
27
- this.body = body;
28
- this.body.elements.group.addEventListener(
29
- "scroll",
30
- () => {
31
- this.onScroll();
32
- },
33
- {
34
- passive: true
35
- }
36
- );
37
- }
38
- destroy() {
39
- const { visible, pool } = this;
40
- for (const [index, row] of visible) {
41
- row.remove(pool);
42
- visible.delete(index);
43
- }
44
- pool.cells = {};
45
- pool.rows = [];
46
- }
47
- update(down) {
48
- const { body, pool, visible } = this;
49
- const indices = /* @__PURE__ */ new Set();
50
- const range = getRange(body, down);
51
- for (let index = range.start; index <= range.end; index += 1) {
52
- indices.add(index);
53
- }
54
- for (const [index, row] of visible) {
55
- if (!indices.has(index)) {
56
- visible.delete(index);
57
- row.remove(pool);
58
- }
59
- }
60
- const fragment = document.createDocumentFragment();
61
- for (let index = range.start; index <= range.end; index += 1) {
62
- if (!visible.has(index)) {
63
- const row = body.rows[index];
64
- row.render(pool);
65
- visible.set(index, row);
66
- if (row.element != null) {
67
- row.element.style.transform = `translateY(${index * 32}px)`;
68
- fragment.append(row.element);
69
- }
70
- }
71
- body.elements.group.append(fragment);
72
- }
73
- }
74
- onScroll() {
75
- if (!this.active) {
76
- requestAnimationFrame(() => {
77
- const top = this.body.elements.group.scrollTop;
78
- this.update(top > this.top);
79
- this.active = false;
80
- this.top = top;
81
- });
82
- this.active = true;
83
- }
84
- }
18
+ function onScroll() {
19
+ if (!this.state.active) {
20
+ requestAnimationFrame(() => {
21
+ const top = this.manager.tabela.components.body.elements.group.scrollTop;
22
+ this.manager.update(top > this.state.top);
23
+ this.state.active = false;
24
+ this.state.top = top;
25
+ });
26
+ this.state.active = true;
27
+ }
85
28
  }
86
- export {
87
- VirtualizationManager
29
+ var VirtualizationManager = class {
30
+ fragment;
31
+ listener;
32
+ #pool = {
33
+ cells: {},
34
+ rows: []
35
+ };
36
+ #state = {
37
+ active: false,
38
+ top: 0
39
+ };
40
+ #visible = /* @__PURE__ */ new Map();
41
+ constructor(tabela) {
42
+ this.tabela = tabela;
43
+ this.listener = on(tabela.components.body.elements.group, "scroll", onScroll.bind({
44
+ manager: this,
45
+ state: this.#state
46
+ }));
47
+ }
48
+ destroy() {
49
+ this.listener();
50
+ for (const [index, row] of this.#visible) {
51
+ removeRow(row, this.#pool);
52
+ this.#visible.delete(index);
53
+ }
54
+ this.#pool.cells = {};
55
+ this.#pool.rows = [];
56
+ }
57
+ update(down) {
58
+ const { tabela } = this;
59
+ const { rows } = tabela.managers;
60
+ const indices = /* @__PURE__ */ new Set();
61
+ const range = getRange(tabela, down);
62
+ for (let index = range.start; index <= range.end; index += 1) indices.add(index);
63
+ for (const [index, row] of this.#visible) if (!indices.has(index)) {
64
+ this.#visible.delete(index);
65
+ removeRow(row, this.#pool);
66
+ }
67
+ this.fragment ??= document.createDocumentFragment();
68
+ this.fragment.replaceChildren();
69
+ const keys = tabela.managers.data.values.keys.active ?? tabela.managers.data.values.keys.original;
70
+ for (let index = range.start; index <= range.end; index += 1) {
71
+ if (this.#visible.has(index)) continue;
72
+ const row = tabela.managers.rows.get(keys[index]);
73
+ if (row == null) continue;
74
+ renderRow(tabela, this.#pool, row);
75
+ this.#visible.set(index, row);
76
+ if (row.element != null) {
77
+ row.element.style.transform = `translateY(${index * rows.height}px)`;
78
+ this.fragment.append(row.element);
79
+ }
80
+ }
81
+ tabela.components.body.elements.group.append(this.fragment);
82
+ }
88
83
  };
84
+ export { VirtualizationManager };