@oneteme/jquery-table 0.0.1 → 0.0.2
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/README.md +439 -122
- package/esm2022/lib/component/export.manager.mjs +45 -0
- package/esm2022/lib/component/group-by.manager.mjs +99 -0
- package/esm2022/lib/component/lazy-column-manager.mjs +99 -0
- package/esm2022/lib/component/slice-panel/slice-panel.component.mjs +43 -37
- package/esm2022/lib/component/slice-panel/slice-panel.model.mjs +1 -1
- package/esm2022/lib/component/table-preferences.manager.mjs +38 -0
- package/esm2022/lib/component/table.component.mjs +681 -370
- package/esm2022/lib/component/table.constants.mjs +31 -0
- package/esm2022/lib/component/table.utils.mjs +2 -2
- package/esm2022/lib/component/view/view.facade.mjs +298 -0
- package/esm2022/lib/jqt-i18n.token.mjs +41 -0
- package/esm2022/lib/jquery-table.model.mjs +14 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/oneteme-jquery-table.mjs +1377 -408
- package/fesm2022/oneteme-jquery-table.mjs.map +1 -1
- package/lib/component/export.manager.d.ts +16 -0
- package/lib/component/group-by.manager.d.ts +44 -0
- package/lib/component/lazy-column-manager.d.ts +26 -0
- package/lib/component/slice-panel/slice-panel.component.d.ts +11 -3
- package/lib/component/slice-panel/slice-panel.model.d.ts +11 -1
- package/lib/component/table-preferences.manager.d.ts +17 -0
- package/lib/component/table.component.d.ts +162 -27
- package/lib/component/table.constants.d.ts +30 -0
- package/lib/component/view/view.facade.d.ts +93 -0
- package/lib/jqt-i18n.token.d.ts +87 -0
- package/lib/jquery-table.model.d.ts +79 -0
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExportManager
|
|
3
|
+
*
|
|
4
|
+
* Encapsule l'export CSV : construction du fichier BOM/UTF-8, échappement et déclenchement du téléchargement.
|
|
5
|
+
* Aucune dépendance Angular — indépendant du cycle de vie du composant.
|
|
6
|
+
*/
|
|
7
|
+
export class ExportManager {
|
|
8
|
+
constructor(getRows, getColumns, getConfig, resolveCellValue) {
|
|
9
|
+
this.getRows = getRows;
|
|
10
|
+
this.getColumns = getColumns;
|
|
11
|
+
this.getConfig = getConfig;
|
|
12
|
+
this.resolveCellValue = resolveCellValue;
|
|
13
|
+
}
|
|
14
|
+
export() {
|
|
15
|
+
const cfg = this.getConfig();
|
|
16
|
+
if (!cfg?.enabled)
|
|
17
|
+
return;
|
|
18
|
+
const rows = this.getRows();
|
|
19
|
+
const columns = this.getColumns();
|
|
20
|
+
const filename = (cfg.filename || 'export') + '.csv';
|
|
21
|
+
const header = columns.map(c => this._csvEscape(c.header || c.key)).join(',');
|
|
22
|
+
const lines = rows.map((row, idx) => {
|
|
23
|
+
if (cfg.transform) {
|
|
24
|
+
const t = cfg.transform(row);
|
|
25
|
+
return columns.map(c => this._csvEscape(String(t[c.key] ?? ''))).join(',');
|
|
26
|
+
}
|
|
27
|
+
return columns.map(c => this._csvEscape(String(this.resolveCellValue(c, row, idx) ?? ''))).join(',');
|
|
28
|
+
});
|
|
29
|
+
// BOM UTF-8 pour une ouverture correcte sous Excel
|
|
30
|
+
const blob = new Blob(['\uFEFF' + [header, ...lines].join('\n')], { type: 'text/csv;charset=utf-8' });
|
|
31
|
+
const url = URL.createObjectURL(blob);
|
|
32
|
+
const a = document.createElement('a');
|
|
33
|
+
a.href = url;
|
|
34
|
+
a.download = filename.endsWith('.csv') ? filename : filename + '.csv';
|
|
35
|
+
a.click();
|
|
36
|
+
URL.revokeObjectURL(url);
|
|
37
|
+
}
|
|
38
|
+
_csvEscape(value) {
|
|
39
|
+
if (value.includes(',') || value.includes('"') || value.includes('\n')) {
|
|
40
|
+
return '"' + value.replace(/"/g, '""') + '"';
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0Lm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS10YWJsZS9zcmMvbGliL2NvbXBvbmVudC9leHBvcnQubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ21CLE9BQWtCLEVBQ2xCLFVBQTBDLEVBQzFDLFNBQWlELEVBQ2pELGdCQUE2RTtRQUg3RSxZQUFPLEdBQVAsT0FBTyxDQUFXO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQWdDO1FBQzFDLGNBQVMsR0FBVCxTQUFTLENBQXdDO1FBQ2pELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNkQ7SUFDN0YsQ0FBQztJQUVKLE1BQU07UUFDSixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPO1lBQUUsT0FBTztRQUMxQixNQUFNLElBQUksR0FBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFFckQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNsQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2pCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM1RTtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkcsQ0FBQyxDQUFDLENBQUM7UUFFSCxtREFBbUQ7UUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDdEcsTUFBTSxHQUFHLEdBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsR0FBTSxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDdEUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1YsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQWE7UUFDOUIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0RSxPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDOUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhYmxlQ29sdW1uUHJvdmlkZXIsIFRhYmxlRXhwb3J0Q29uZmlnIH0gZnJvbSAnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJztcblxuLyoqXG4gKiBFeHBvcnRNYW5hZ2VyXG4gKlxuICogRW5jYXBzdWxlIGwnZXhwb3J0IENTViA6IGNvbnN0cnVjdGlvbiBkdSBmaWNoaWVyIEJPTS9VVEYtOCwgw6ljaGFwcGVtZW50IGV0IGTDqWNsZW5jaGVtZW50IGR1IHTDqWzDqWNoYXJnZW1lbnQuXG4gKiBBdWN1bmUgZMOpcGVuZGFuY2UgQW5ndWxhciDigJQgaW5kw6lwZW5kYW50IGR1IGN5Y2xlIGRlIHZpZSBkdSBjb21wb3NhbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHBvcnRNYW5hZ2VyPFQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZXRSb3dzOiAoKSA9PiBUW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZXRDb2x1bW5zOiAoKSA9PiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZXRDb25maWc6ICgpID0+IFRhYmxlRXhwb3J0Q29uZmlnPFQ+IHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZUNlbGxWYWx1ZTogKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBULCBpbmRleDogbnVtYmVyKSA9PiBhbnksXG4gICkge31cblxuICBleHBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNmZz8uZW5hYmxlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvd3MgICAgPSB0aGlzLmdldFJvd3MoKTtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRDb2x1bW5zKCk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSAoY2ZnLmZpbGVuYW1lIHx8ICdleHBvcnQnKSArICcuY3N2JztcblxuICAgIGNvbnN0IGhlYWRlciA9IGNvbHVtbnMubWFwKGMgPT4gdGhpcy5fY3N2RXNjYXBlKGMuaGVhZGVyIHx8IGMua2V5KSkuam9pbignLCcpO1xuICAgIGNvbnN0IGxpbmVzID0gcm93cy5tYXAoKHJvdywgaWR4KSA9PiB7XG4gICAgICBpZiAoY2ZnLnRyYW5zZm9ybSkge1xuICAgICAgICBjb25zdCB0ID0gY2ZnLnRyYW5zZm9ybShyb3cpO1xuICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoYyA9PiB0aGlzLl9jc3ZFc2NhcGUoU3RyaW5nKHRbYy5rZXldID8/ICcnKSkpLmpvaW4oJywnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW5zLm1hcChjID0+IHRoaXMuX2NzdkVzY2FwZShTdHJpbmcodGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGMsIHJvdywgaWR4KSA/PyAnJykpKS5qb2luKCcsJyk7XG4gICAgfSk7XG5cbiAgICAvLyBCT00gVVRGLTggcG91ciB1bmUgb3V2ZXJ0dXJlIGNvcnJlY3RlIHNvdXMgRXhjZWxcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoWydcXHVGRUZGJyArIFtoZWFkZXIsIC4uLmxpbmVzXS5qb2luKCdcXG4nKV0sIHsgdHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTgnIH0pO1xuICAgIGNvbnN0IHVybCAgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZS5lbmRzV2l0aCgnLmNzdicpID8gZmlsZW5hbWUgOiBmaWxlbmFtZSArICcuY3N2JztcbiAgICBhLmNsaWNrKCk7XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3N2RXNjYXBlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnLCcpIHx8IHZhbHVlLmluY2x1ZGVzKCdcIicpIHx8IHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpICsgJ1wiJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GroupByManager
|
|
3
|
+
*
|
|
4
|
+
* Encapsule tout l'état et la logique liés au mode Group By :
|
|
5
|
+
* - état collapsed / expanded des groupes
|
|
6
|
+
* - pagination interne par groupe
|
|
7
|
+
* - tri des groupes (asc / desc)
|
|
8
|
+
* - scroll vers un groupe
|
|
9
|
+
*
|
|
10
|
+
* Le composant TableComponent l'instancie et lui passe deux callbacks :
|
|
11
|
+
* - `onNeedProjection` : demande une reprojection légère de la page courante
|
|
12
|
+
* - `onNeedRender` : demande un rebuild complet (tri changé etc.)
|
|
13
|
+
*/
|
|
14
|
+
export class GroupByManager {
|
|
15
|
+
constructor(onNeedProjection, onNeedRender) {
|
|
16
|
+
this.onNeedProjection = onNeedProjection;
|
|
17
|
+
this.onNeedRender = onNeedRender;
|
|
18
|
+
/** Groupes actuellement ouverts (mode default-collapsed) ou fermés (mode default-expanded). */
|
|
19
|
+
this._collapsedGroups = new Set();
|
|
20
|
+
/** Page courante par clé de groupe. */
|
|
21
|
+
this._groupPages = new Map();
|
|
22
|
+
/** Taille de page pour la pagination interne des groupes. */
|
|
23
|
+
this.groupPageSize = 5;
|
|
24
|
+
/** Ordre de tri des groupes ('asc' | 'desc'). */
|
|
25
|
+
this.groupSortOrder = 'asc';
|
|
26
|
+
/**
|
|
27
|
+
* Quand `true`, tous les groupes sont collapsés par défaut.
|
|
28
|
+
* `_collapsedGroups` contient alors le seul groupe ouvert.
|
|
29
|
+
*/
|
|
30
|
+
this._defaultGroupCollapsed = false;
|
|
31
|
+
}
|
|
32
|
+
// ── API publique
|
|
33
|
+
/** Initialise le mode par défaut selon qu'un groupBy vient d'être activé. */
|
|
34
|
+
setDefaultCollapsed(collapsed) {
|
|
35
|
+
this._defaultGroupCollapsed = collapsed;
|
|
36
|
+
}
|
|
37
|
+
/** Réinitialise l'état (à appeler quand le groupBy change de colonne). */
|
|
38
|
+
reset() {
|
|
39
|
+
this._collapsedGroups.clear();
|
|
40
|
+
this._groupPages.clear();
|
|
41
|
+
}
|
|
42
|
+
isGroupCollapsed(groupKey) {
|
|
43
|
+
return this._defaultGroupCollapsed
|
|
44
|
+
? !this._collapsedGroups.has(groupKey)
|
|
45
|
+
: this._collapsedGroups.has(groupKey);
|
|
46
|
+
}
|
|
47
|
+
toggleGroupCollapse(groupKey, scrollTo) {
|
|
48
|
+
if (this._collapsedGroups.has(groupKey)) {
|
|
49
|
+
this._collapsedGroups.delete(groupKey);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this._collapsedGroups.clear();
|
|
53
|
+
this._collapsedGroups.add(groupKey);
|
|
54
|
+
scrollTo(groupKey);
|
|
55
|
+
}
|
|
56
|
+
this.onNeedProjection();
|
|
57
|
+
}
|
|
58
|
+
/** Retourne le groupe actuellement ouvert (seulement en mode default-collapsed avec exactement 1 ouvert). */
|
|
59
|
+
getSingleOpenGroup() {
|
|
60
|
+
return this._defaultGroupCollapsed && this._collapsedGroups.size === 1
|
|
61
|
+
? [...this._collapsedGroups][0]
|
|
62
|
+
: null;
|
|
63
|
+
}
|
|
64
|
+
// ── Pagination par groupe
|
|
65
|
+
getPage(groupKey) {
|
|
66
|
+
return this._groupPages.get(groupKey) ?? 0;
|
|
67
|
+
}
|
|
68
|
+
groupPageBack(groupKey) {
|
|
69
|
+
const current = this._groupPages.get(groupKey) ?? 0;
|
|
70
|
+
if (current > 0) {
|
|
71
|
+
this._groupPages.set(groupKey, current - 1);
|
|
72
|
+
this.onNeedProjection();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
groupPageForward(groupKey, totalCount) {
|
|
76
|
+
const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;
|
|
77
|
+
const current = this._groupPages.get(groupKey) ?? 0;
|
|
78
|
+
if (current < maxPage) {
|
|
79
|
+
this._groupPages.set(groupKey, current + 1);
|
|
80
|
+
this.onNeedProjection();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
onGroupPageSizeChange(size) {
|
|
84
|
+
this.groupPageSize = size;
|
|
85
|
+
this._groupPages.clear();
|
|
86
|
+
this.onNeedRender();
|
|
87
|
+
}
|
|
88
|
+
onGroupSortToggle(dir, scrollTo) {
|
|
89
|
+
if (this.groupSortOrder === dir)
|
|
90
|
+
return;
|
|
91
|
+
this.groupSortOrder = dir;
|
|
92
|
+
this._groupPages.clear();
|
|
93
|
+
this.onNeedRender();
|
|
94
|
+
const openGroup = this.getSingleOpenGroup();
|
|
95
|
+
if (openGroup)
|
|
96
|
+
scrollTo(openGroup);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnkubWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZXRlbWUvanF1ZXJ5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50L2dyb3VwLWJ5Lm1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFtQnpCLFlBQ21CLGdCQUE0QixFQUM1QixZQUF3QjtRQUR4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVk7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQVk7UUFwQjNDLCtGQUErRjtRQUM5RSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRXRELHVDQUF1QztRQUN0QixnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRXpELDZEQUE2RDtRQUM3RCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixpREFBaUQ7UUFDakQsbUJBQWMsR0FBbUIsS0FBSyxDQUFDO1FBRXZDOzs7V0FHRztRQUNLLDJCQUFzQixHQUFHLEtBQUssQ0FBQztJQUtwQyxDQUFDO0lBRUosa0JBQWtCO0lBRWxCLDZFQUE2RTtJQUM3RSxtQkFBbUIsQ0FBQyxTQUFrQjtRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsS0FBSztRQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUMvQixPQUFPLElBQUksQ0FBQyxzQkFBc0I7WUFDaEMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQWdCLEVBQUUsUUFBK0I7UUFDbkUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw2R0FBNkc7SUFDN0csa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVELDJCQUEyQjtJQUUzQixPQUFPLENBQUMsUUFBZ0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQjtRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksT0FBTyxHQUFHLE9BQU8sRUFBRTtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQVk7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQW1CLEVBQUUsUUFBK0I7UUFDcEUsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQUc7WUFBRSxPQUFPO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLElBQUksU0FBUztZQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3VwQnlNYW5hZ2VyXG4gKlxuICogRW5jYXBzdWxlIHRvdXQgbCfDqXRhdCBldCBsYSBsb2dpcXVlIGxpw6lzIGF1IG1vZGUgR3JvdXAgQnkgOlxuICogLSDDqXRhdCBjb2xsYXBzZWQgLyBleHBhbmRlZCBkZXMgZ3JvdXBlc1xuICogLSBwYWdpbmF0aW9uIGludGVybmUgcGFyIGdyb3VwZVxuICogLSB0cmkgZGVzIGdyb3VwZXMgKGFzYyAvIGRlc2MpXG4gKiAtIHNjcm9sbCB2ZXJzIHVuIGdyb3VwZVxuICpcbiAqIExlIGNvbXBvc2FudCBUYWJsZUNvbXBvbmVudCBsJ2luc3RhbmNpZSBldCBsdWkgcGFzc2UgZGV1eCBjYWxsYmFja3MgOlxuICogICAtIGBvbk5lZWRQcm9qZWN0aW9uYCA6IGRlbWFuZGUgdW5lIHJlcHJvamVjdGlvbiBsw6lnw6hyZSBkZSBsYSBwYWdlIGNvdXJhbnRlXG4gKiAgIC0gYG9uTmVlZFJlbmRlcmAgICAgIDogZGVtYW5kZSB1biByZWJ1aWxkIGNvbXBsZXQgKHRyaSBjaGFuZ8OpIGV0Yy4pXG4gKi9cbmV4cG9ydCBjbGFzcyBHcm91cEJ5TWFuYWdlciB7XG4gIC8qKiBHcm91cGVzIGFjdHVlbGxlbWVudCBvdXZlcnRzIChtb2RlIGRlZmF1bHQtY29sbGFwc2VkKSBvdSBmZXJtw6lzIChtb2RlIGRlZmF1bHQtZXhwYW5kZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb2xsYXBzZWRHcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogUGFnZSBjb3VyYW50ZSBwYXIgY2zDqSBkZSBncm91cGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyb3VwUGFnZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8qKiBUYWlsbGUgZGUgcGFnZSBwb3VyIGxhIHBhZ2luYXRpb24gaW50ZXJuZSBkZXMgZ3JvdXBlcy4gKi9cbiAgZ3JvdXBQYWdlU2l6ZSA9IDU7XG5cbiAgLyoqIE9yZHJlIGRlIHRyaSBkZXMgZ3JvdXBlcyAoJ2FzYycgfCAnZGVzYycpLiAqL1xuICBncm91cFNvcnRPcmRlcjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogUXVhbmQgYHRydWVgLCB0b3VzIGxlcyBncm91cGVzIHNvbnQgY29sbGFwc8OpcyBwYXIgZMOpZmF1dC5cbiAgICogYF9jb2xsYXBzZWRHcm91cHNgIGNvbnRpZW50IGFsb3JzIGxlIHNldWwgZ3JvdXBlIG91dmVydC5cbiAgICovXG4gIHByaXZhdGUgX2RlZmF1bHRHcm91cENvbGxhcHNlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25OZWVkUHJvamVjdGlvbjogKCkgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uTmVlZFJlbmRlcjogKCkgPT4gdm9pZCxcbiAgKSB7fVxuXG4gIC8vIOKUgOKUgCBBUEkgcHVibGlxdWVcblxuICAvKiogSW5pdGlhbGlzZSBsZSBtb2RlIHBhciBkw6lmYXV0IHNlbG9uIHF1J3VuIGdyb3VwQnkgdmllbnQgZCfDqnRyZSBhY3RpdsOpLiAqL1xuICBzZXREZWZhdWx0Q29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2RlZmF1bHRHcm91cENvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgfVxuXG4gIC8qKiBSw6lpbml0aWFsaXNlIGwnw6l0YXQgKMOgIGFwcGVsZXIgcXVhbmQgbGUgZ3JvdXBCeSBjaGFuZ2UgZGUgY29sb25uZSkuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5jbGVhcigpO1xuICAgIHRoaXMuX2dyb3VwUGFnZXMuY2xlYXIoKTtcbiAgfVxuXG4gIGlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0R3JvdXBDb2xsYXBzZWRcbiAgICAgID8gIXRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXBLZXkpXG4gICAgICA6IHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXBLZXkpO1xuICB9XG5cbiAgdG9nZ2xlR3JvdXBDb2xsYXBzZShncm91cEtleTogc3RyaW5nLCBzY3JvbGxUbzogKGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXBLZXkpKSB7XG4gICAgICB0aGlzLl9jb2xsYXBzZWRHcm91cHMuZGVsZXRlKGdyb3VwS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29sbGFwc2VkR3JvdXBzLmNsZWFyKCk7XG4gICAgICB0aGlzLl9jb2xsYXBzZWRHcm91cHMuYWRkKGdyb3VwS2V5KTtcbiAgICAgIHNjcm9sbFRvKGdyb3VwS2V5KTtcbiAgICB9XG4gICAgdGhpcy5vbk5lZWRQcm9qZWN0aW9uKCk7XG4gIH1cblxuICAvKiogUmV0b3VybmUgbGUgZ3JvdXBlIGFjdHVlbGxlbWVudCBvdXZlcnQgKHNldWxlbWVudCBlbiBtb2RlIGRlZmF1bHQtY29sbGFwc2VkIGF2ZWMgZXhhY3RlbWVudCAxIG91dmVydCkuICovXG4gIGdldFNpbmdsZU9wZW5Hcm91cCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEdyb3VwQ29sbGFwc2VkICYmIHRoaXMuX2NvbGxhcHNlZEdyb3Vwcy5zaXplID09PSAxXG4gICAgICA/IFsuLi50aGlzLl9jb2xsYXBzZWRHcm91cHNdWzBdXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgUGFnaW5hdGlvbiBwYXIgZ3JvdXBlXG5cbiAgZ2V0UGFnZShncm91cEtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBQYWdlcy5nZXQoZ3JvdXBLZXkpID8/IDA7XG4gIH1cblxuICBncm91cFBhZ2VCYWNrKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ3JvdXBQYWdlcy5nZXQoZ3JvdXBLZXkpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPiAwKSB7XG4gICAgICB0aGlzLl9ncm91cFBhZ2VzLnNldChncm91cEtleSwgY3VycmVudCAtIDEpO1xuICAgICAgdGhpcy5vbk5lZWRQcm9qZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZ3JvdXBQYWdlRm9yd2FyZChncm91cEtleTogc3RyaW5nLCB0b3RhbENvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5jZWlsKHRvdGFsQ291bnQgLyB0aGlzLmdyb3VwUGFnZVNpemUpIC0gMTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ3JvdXBQYWdlcy5nZXQoZ3JvdXBLZXkpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPCBtYXhQYWdlKSB7XG4gICAgICB0aGlzLl9ncm91cFBhZ2VzLnNldChncm91cEtleSwgY3VycmVudCArIDEpO1xuICAgICAgdGhpcy5vbk5lZWRQcm9qZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBQYWdlU2l6ZSA9IHNpemU7XG4gICAgdGhpcy5fZ3JvdXBQYWdlcy5jbGVhcigpO1xuICAgIHRoaXMub25OZWVkUmVuZGVyKCk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnLCBzY3JvbGxUbzogKGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JvdXBTb3J0T3JkZXIgPT09IGRpcikgcmV0dXJuO1xuICAgIHRoaXMuZ3JvdXBTb3J0T3JkZXIgPSBkaXI7XG4gICAgdGhpcy5fZ3JvdXBQYWdlcy5jbGVhcigpO1xuICAgIHRoaXMub25OZWVkUmVuZGVyKCk7XG4gICAgY29uc3Qgb3Blbkdyb3VwID0gdGhpcy5nZXRTaW5nbGVPcGVuR3JvdXAoKTtcbiAgICBpZiAob3Blbkdyb3VwKSBzY3JvbGxUbyhvcGVuR3JvdXApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Subject, take, takeUntil } from 'rxjs';
|
|
2
|
+
import { LAZY_LOADING_VALUE, LAZY_ERROR_VALUE } from './table.constants';
|
|
3
|
+
/**
|
|
4
|
+
* Gère le cycle de vie des colonnes à chargement différé (lazy) :
|
|
5
|
+
* statuts, données, annulation des requêtes en cours.
|
|
6
|
+
*
|
|
7
|
+
* Pas de dépendance Angular/DOM — peut être instancié manuellement dans le composant.
|
|
8
|
+
*/
|
|
9
|
+
export class LazyColumnManager {
|
|
10
|
+
constructor() {
|
|
11
|
+
this._status = new Map();
|
|
12
|
+
this._data = new Map();
|
|
13
|
+
this._cancels = new Map();
|
|
14
|
+
}
|
|
15
|
+
get status() {
|
|
16
|
+
return this._status;
|
|
17
|
+
}
|
|
18
|
+
get data() {
|
|
19
|
+
return this._data;
|
|
20
|
+
}
|
|
21
|
+
getStatus(key) {
|
|
22
|
+
return this._status.get(key) ?? 'idle';
|
|
23
|
+
}
|
|
24
|
+
getRenderType(rowValue) {
|
|
25
|
+
if (rowValue === LAZY_LOADING_VALUE)
|
|
26
|
+
return 'loading';
|
|
27
|
+
if (rowValue === LAZY_ERROR_VALUE)
|
|
28
|
+
return 'error';
|
|
29
|
+
return 'value';
|
|
30
|
+
}
|
|
31
|
+
/** Annule tous les fetches en cours et réinitialise l'état (appeler lors d'un changement de données). */
|
|
32
|
+
cancelAll() {
|
|
33
|
+
this._cancels.forEach(s => { s.next(); s.complete(); });
|
|
34
|
+
this._cancels.clear();
|
|
35
|
+
this._status = new Map();
|
|
36
|
+
this._data = new Map();
|
|
37
|
+
}
|
|
38
|
+
/** Réinitialise une colonne et relance son fetch. */
|
|
39
|
+
retry(column, resolvedData, callbacks) {
|
|
40
|
+
const k = column.key;
|
|
41
|
+
const prev = this._cancels.get(k);
|
|
42
|
+
if (prev) {
|
|
43
|
+
prev.next();
|
|
44
|
+
prev.complete();
|
|
45
|
+
}
|
|
46
|
+
this._cancels.delete(k);
|
|
47
|
+
const newStatus = new Map(this._status);
|
|
48
|
+
newStatus.delete(k);
|
|
49
|
+
this._status = newStatus;
|
|
50
|
+
const newData = new Map(this._data);
|
|
51
|
+
newData.delete(k);
|
|
52
|
+
this._data = newData;
|
|
53
|
+
this.fetch(column, resolvedData, callbacks);
|
|
54
|
+
}
|
|
55
|
+
/** Lance le chargement différé d'une colonne. No-op si déjà en cours. */
|
|
56
|
+
fetch(column, resolvedData, callbacks) {
|
|
57
|
+
if (!column.lazy)
|
|
58
|
+
return;
|
|
59
|
+
const k = column.key;
|
|
60
|
+
if (this._status.get(k) === 'loading')
|
|
61
|
+
return;
|
|
62
|
+
const prev = this._cancels.get(k);
|
|
63
|
+
if (prev) {
|
|
64
|
+
prev.next();
|
|
65
|
+
prev.complete();
|
|
66
|
+
}
|
|
67
|
+
const cancel$ = new Subject();
|
|
68
|
+
this._cancels.set(k, cancel$);
|
|
69
|
+
const newStatus = new Map(this._status);
|
|
70
|
+
newStatus.set(k, 'loading');
|
|
71
|
+
this._status = newStatus;
|
|
72
|
+
callbacks.onRefresh();
|
|
73
|
+
column.lazy.fetchFn().pipe(take(1), takeUntil(cancel$)).subscribe({
|
|
74
|
+
next: (values) => {
|
|
75
|
+
const rowMap = new Map();
|
|
76
|
+
values.forEach((value, i) => {
|
|
77
|
+
if (i < resolvedData.length)
|
|
78
|
+
rowMap.set(resolvedData[i], value);
|
|
79
|
+
});
|
|
80
|
+
const newData = new Map(this._data);
|
|
81
|
+
newData.set(k, rowMap);
|
|
82
|
+
this._data = newData;
|
|
83
|
+
const newStatus2 = new Map(this._status);
|
|
84
|
+
newStatus2.set(k, 'loaded');
|
|
85
|
+
this._status = newStatus2;
|
|
86
|
+
callbacks.onRefresh();
|
|
87
|
+
callbacks.onMarkForCheck();
|
|
88
|
+
},
|
|
89
|
+
error: () => {
|
|
90
|
+
const newStatusErr = new Map(this._status);
|
|
91
|
+
newStatusErr.set(k, 'error');
|
|
92
|
+
this._status = newStatusErr;
|
|
93
|
+
callbacks.onRefresh();
|
|
94
|
+
callbacks.onMarkForCheck();
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1jb2x1bW4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZXRlbWUvanF1ZXJ5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50L2xhenktY29sdW1uLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT3pFOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUE5QjtRQUVVLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztRQUNyRSxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7UUFDekMsYUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBNEZ0RCxDQUFDO0lBMUZDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsYUFBYSxDQUFDLFFBQWE7UUFDekIsSUFBSSxRQUFRLEtBQUssa0JBQWtCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEQsSUFBSSxRQUFRLEtBQUssZ0JBQWdCO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDbEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHlHQUF5RztJQUN6RyxTQUFTO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QU07d0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUVyQixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztnQkFFMUIsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7Z0JBRTVCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0LCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uUHJvdmlkZXIgfSBmcm9tICcuLi9qcXVlcnktdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgTEFaWV9MT0FESU5HX1ZBTFVFLCBMQVpZX0VSUk9SX1ZBTFVFIH0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExhenlDYWxsYmFja3Mge1xuICBvblJlZnJlc2goKTogdm9pZDtcbiAgb25NYXJrRm9yQ2hlY2soKTogdm9pZDtcbn1cblxuLyoqXG4gKiBHw6hyZSBsZSBjeWNsZSBkZSB2aWUgZGVzIGNvbG9ubmVzIMOgIGNoYXJnZW1lbnQgZGlmZsOpcsOpIChsYXp5KSA6XG4gKiBzdGF0dXRzLCBkb25uw6llcywgYW5udWxhdGlvbiBkZXMgcmVxdcOqdGVzIGVuIGNvdXJzLlxuICpcbiAqIFBhcyBkZSBkw6lwZW5kYW5jZSBBbmd1bGFyL0RPTSDigJQgcGV1dCDDqnRyZSBpbnN0YW5jacOpIG1hbnVlbGxlbWVudCBkYW5zIGxlIGNvbXBvc2FudC5cbiAqL1xuZXhwb3J0IGNsYXNzIExhenlDb2x1bW5NYW5hZ2VyPFQgPSBhbnk+IHtcblxuICBwcml2YXRlIF9zdGF0dXMgPSBuZXcgTWFwPHN0cmluZywgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InPigpO1xuICBwcml2YXRlIF9kYXRhID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxhbnksIGFueT4+KCk7XG4gIHByaXZhdGUgX2NhbmNlbHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDx2b2lkPj4oKTtcblxuICBnZXQgc3RhdHVzKCk6IE1hcDxzdHJpbmcsICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cblxuICBnZXQgZGF0YSgpOiBNYXA8c3RyaW5nLCBNYXA8YW55LCBhbnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBnZXRTdGF0dXMoa2V5OiBzdHJpbmcpOiAnaWRsZScgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8ICdlcnJvcicge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMuZ2V0KGtleSkgPz8gJ2lkbGUnO1xuICB9XG5cbiAgZ2V0UmVuZGVyVHlwZShyb3dWYWx1ZTogYW55KTogJ2xvYWRpbmcnIHwgJ2Vycm9yJyB8ICd2YWx1ZScge1xuICAgIGlmIChyb3dWYWx1ZSA9PT0gTEFaWV9MT0FESU5HX1ZBTFVFKSByZXR1cm4gJ2xvYWRpbmcnO1xuICAgIGlmIChyb3dWYWx1ZSA9PT0gTEFaWV9FUlJPUl9WQUxVRSkgcmV0dXJuICdlcnJvcic7XG4gICAgcmV0dXJuICd2YWx1ZSc7XG4gIH1cblxuICAvKiogQW5udWxlIHRvdXMgbGVzIGZldGNoZXMgZW4gY291cnMgZXQgcsOpaW5pdGlhbGlzZSBsJ8OpdGF0IChhcHBlbGVyIGxvcnMgZCd1biBjaGFuZ2VtZW50IGRlIGRvbm7DqWVzKS4gKi9cbiAgY2FuY2VsQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbmNlbHMuZm9yRWFjaChzID0+IHsgcy5uZXh0KCk7IHMuY29tcGxldGUoKTsgfSk7XG4gICAgdGhpcy5fY2FuY2Vscy5jbGVhcigpO1xuICAgIHRoaXMuX3N0YXR1cyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgLyoqIFLDqWluaXRpYWxpc2UgdW5lIGNvbG9ubmUgZXQgcmVsYW5jZSBzb24gZmV0Y2guICovXG4gIHJldHJ5KGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcmVzb2x2ZWREYXRhOiBUW10sIGNhbGxiYWNrczogTGF6eUNhbGxiYWNrcyk6IHZvaWQge1xuICAgIGNvbnN0IGsgPSBjb2x1bW4ua2V5O1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLl9jYW5jZWxzLmdldChrKTtcbiAgICBpZiAocHJldikgeyBwcmV2Lm5leHQoKTsgcHJldi5jb21wbGV0ZSgpOyB9XG4gICAgdGhpcy5fY2FuY2Vscy5kZWxldGUoayk7XG5cbiAgICBjb25zdCBuZXdTdGF0dXMgPSBuZXcgTWFwKHRoaXMuX3N0YXR1cyk7XG4gICAgbmV3U3RhdHVzLmRlbGV0ZShrKTtcbiAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXM7XG5cbiAgICBjb25zdCBuZXdEYXRhID0gbmV3IE1hcCh0aGlzLl9kYXRhKTtcbiAgICBuZXdEYXRhLmRlbGV0ZShrKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3RGF0YTtcblxuICAgIHRoaXMuZmV0Y2goY29sdW1uLCByZXNvbHZlZERhdGEsIGNhbGxiYWNrcyk7XG4gIH1cblxuICAvKiogTGFuY2UgbGUgY2hhcmdlbWVudCBkaWZmw6lyw6kgZCd1bmUgY29sb25uZS4gTm8tb3Agc2kgZMOpasOgIGVuIGNvdXJzLiAqL1xuICBmZXRjaChjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4sIHJlc29sdmVkRGF0YTogVFtdLCBjYWxsYmFja3M6IExhenlDYWxsYmFja3MpOiB2b2lkIHtcbiAgICBpZiAoIWNvbHVtbi5sYXp5KSByZXR1cm47XG4gICAgY29uc3QgayA9IGNvbHVtbi5rZXk7XG4gICAgaWYgKHRoaXMuX3N0YXR1cy5nZXQoaykgPT09ICdsb2FkaW5nJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldiA9IHRoaXMuX2NhbmNlbHMuZ2V0KGspO1xuICAgIGlmIChwcmV2KSB7IHByZXYubmV4dCgpOyBwcmV2LmNvbXBsZXRlKCk7IH1cbiAgICBjb25zdCBjYW5jZWwkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLl9jYW5jZWxzLnNldChrLCBjYW5jZWwkKTtcblxuICAgIGNvbnN0IG5ld1N0YXR1cyA9IG5ldyBNYXAodGhpcy5fc3RhdHVzKTtcbiAgICBuZXdTdGF0dXMuc2V0KGssICdsb2FkaW5nJyk7XG4gICAgdGhpcy5fc3RhdHVzID0gbmV3U3RhdHVzO1xuICAgIGNhbGxiYWNrcy5vblJlZnJlc2goKTtcblxuICAgIGNvbHVtbi5sYXp5LmZldGNoRm4oKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHRha2VVbnRpbChjYW5jZWwkKSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodmFsdWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPGFueSwgYW55PigpO1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGkpID0+IHtcbiAgICAgICAgICBpZiAoaSA8IHJlc29sdmVkRGF0YS5sZW5ndGgpIHJvd01hcC5zZXQocmVzb2x2ZWREYXRhW2ldLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IE1hcCh0aGlzLl9kYXRhKTtcbiAgICAgICAgbmV3RGF0YS5zZXQoaywgcm93TWFwKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IG5ld0RhdGE7XG5cbiAgICAgICAgY29uc3QgbmV3U3RhdHVzMiA9IG5ldyBNYXAodGhpcy5fc3RhdHVzKTtcbiAgICAgICAgbmV3U3RhdHVzMi5zZXQoaywgJ2xvYWRlZCcpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXMyO1xuXG4gICAgICAgIGNhbGxiYWNrcy5vblJlZnJlc2goKTtcbiAgICAgICAgY2FsbGJhY2tzLm9uTWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3U3RhdHVzRXJyID0gbmV3IE1hcCh0aGlzLl9zdGF0dXMpO1xuICAgICAgICBuZXdTdGF0dXNFcnIuc2V0KGssICdlcnJvcicpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBuZXdTdGF0dXNFcnI7XG5cbiAgICAgICAgY2FsbGJhY2tzLm9uUmVmcmVzaCgpO1xuICAgICAgICBjYWxsYmFja3Mub25NYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|