@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.
Files changed (29) hide show
  1. package/README.md +439 -122
  2. package/esm2022/lib/component/export.manager.mjs +45 -0
  3. package/esm2022/lib/component/group-by.manager.mjs +99 -0
  4. package/esm2022/lib/component/lazy-column-manager.mjs +99 -0
  5. package/esm2022/lib/component/slice-panel/slice-panel.component.mjs +43 -37
  6. package/esm2022/lib/component/slice-panel/slice-panel.model.mjs +1 -1
  7. package/esm2022/lib/component/table-preferences.manager.mjs +38 -0
  8. package/esm2022/lib/component/table.component.mjs +681 -370
  9. package/esm2022/lib/component/table.constants.mjs +31 -0
  10. package/esm2022/lib/component/table.utils.mjs +2 -2
  11. package/esm2022/lib/component/view/view.facade.mjs +298 -0
  12. package/esm2022/lib/jqt-i18n.token.mjs +41 -0
  13. package/esm2022/lib/jquery-table.model.mjs +14 -2
  14. package/esm2022/public-api.mjs +2 -1
  15. package/fesm2022/oneteme-jquery-table.mjs +1377 -408
  16. package/fesm2022/oneteme-jquery-table.mjs.map +1 -1
  17. package/lib/component/export.manager.d.ts +16 -0
  18. package/lib/component/group-by.manager.d.ts +44 -0
  19. package/lib/component/lazy-column-manager.d.ts +26 -0
  20. package/lib/component/slice-panel/slice-panel.component.d.ts +11 -3
  21. package/lib/component/slice-panel/slice-panel.model.d.ts +11 -1
  22. package/lib/component/table-preferences.manager.d.ts +17 -0
  23. package/lib/component/table.component.d.ts +162 -27
  24. package/lib/component/table.constants.d.ts +30 -0
  25. package/lib/component/view/view.facade.d.ts +93 -0
  26. package/lib/jqt-i18n.token.d.ts +87 -0
  27. package/lib/jquery-table.model.d.ts +79 -0
  28. package/package.json +2 -2
  29. 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==