@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.
- package/dist/components/body.component.js +32 -55
- package/dist/components/column.component.js +20 -25
- package/dist/components/footer.component.js +33 -34
- package/dist/components/header.component.js +21 -26
- package/dist/components/row.component.js +30 -36
- package/dist/helpers/dom.helpers.js +35 -30
- package/dist/index.js +5 -5
- package/dist/managers/column.manager.js +19 -0
- package/dist/managers/data.manager.js +34 -0
- package/dist/managers/row.manager.js +21 -0
- package/dist/managers/virtualization.manager.js +81 -85
- package/dist/models/column.model.js +0 -1
- package/dist/models/tabela.options.js +0 -1
- package/dist/tabela.full.js +851 -0
- package/dist/tabela.js +43 -43
- package/package.json +22 -24
- package/src/components/body.component.ts +19 -46
- package/src/components/column.component.ts +14 -8
- package/src/components/footer.component.ts +16 -9
- package/src/components/header.component.ts +7 -9
- package/src/components/row.component.ts +31 -31
- package/src/helpers/dom.helpers.ts +50 -15
- package/src/index.ts +8 -1
- package/src/managers/column.manager.ts +32 -0
- package/src/managers/data.manager.ts +66 -0
- package/src/managers/row.manager.ts +32 -0
- package/src/managers/virtualization.manager.ts +86 -59
- package/src/models/column.model.ts +1 -7
- package/src/models/tabela.options.ts +2 -0
- package/src/tabela.ts +62 -36
- package/types/components/body.component.d.ts +0 -7
- package/types/components/footer.component.d.ts +2 -0
- package/types/components/header.component.d.ts +2 -2
- package/types/components/row.component.d.ts +5 -6
- package/types/helpers/dom.helpers.d.ts +1 -0
- package/types/index.d.ts +4 -1
- package/types/managers/column.manager.d.ts +10 -0
- package/types/managers/data.manager.d.ts +25 -0
- package/types/managers/row.manager.d.ts +11 -0
- package/types/managers/virtualization.manager.d.ts +7 -8
- package/types/models/tabela.options.d.ts +2 -0
- package/types/tabela.d.ts +17 -5
- package/dist/components/body.component.cjs +0 -58
- package/dist/components/column.component.cjs +0 -27
- package/dist/components/footer.component.cjs +0 -35
- package/dist/components/header.component.cjs +0 -28
- package/dist/components/row.component.cjs +0 -38
- package/dist/helpers/dom.helpers.cjs +0 -36
- package/dist/index.cjs +0 -5
- package/dist/managers/virtualization.manager.cjs +0 -88
- package/dist/models/column.model.cjs +0 -1
- package/dist/models/tabela.options.cjs +0 -1
- package/dist/tabela.cjs +0 -47
- package/types/components/body.component.d.cts +0 -98
- package/types/components/column.component.d.cts +0 -98
- package/types/components/footer.component.d.cts +0 -98
- package/types/components/header.component.d.cts +0 -98
- package/types/components/row.component.d.cts +0 -98
- package/types/helpers/dom.helpers.d.cts +0 -12
- package/types/index.d.cts +0 -99
- package/types/managers/virtualization.manager.d.cts +0 -98
- package/types/models/column.model.d.cts +0 -17
- package/types/models/tabela.options.d.cts +0 -18
- package/types/tabela.d.cts +0 -99
|
@@ -1,58 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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 = " ";
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
87
|
-
|
|
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 };
|