@seniorsistemas/data-seniorx-core 3.3.0 → 3.4.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/core/constants/nested-table.const.d.ts +3 -0
- package/core/types/nested-table.type.d.ts +18 -0
- package/esm2022/core/constants/nested-table.const.mjs +4 -0
- package/esm2022/core/types/nested-table.type.mjs +2 -0
- package/esm2022/features/nested-table/nested-table.component.mjs +132 -0
- package/esm2022/features/table/table.component.mjs +6 -63
- package/esm2022/features/table/utils/table-data.util.mjs +40 -1
- package/esm2022/locales/en.json +5 -0
- package/esm2022/locales/es-CO.json +5 -0
- package/esm2022/locales/pt.json +5 -0
- package/esm2022/providers/features.provider.mjs +3 -1
- package/esm2022/public-api.mjs +2 -1
- package/features/nested-table/nested-table.component.d.ts +47 -0
- package/features/table/table.component.d.ts +0 -1
- package/features/table/utils/table-data.util.d.ts +7 -1
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +183 -62
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/locales/en.json +5 -0
- package/src/locales/es-CO.json +5 -0
- package/src/locales/pt.json +5 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const NESTED_TABLE_DEFAULT_GROUP_TOGGLE_ARIA_LABEL = "platform.datacore.accessibility_nested_table_group_toggle";
|
|
2
|
+
export declare const NESTED_TABLE_DEFAULT_HINT_ARIA_LABEL = "platform.datacore.accessibility_nested_table_hint";
|
|
3
|
+
export declare const NESTED_TABLE_DEFAULT_ROW_LABEL = "platform.datacore.accessibility_nested_table_row";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RowBase } from './table-shared.type';
|
|
2
|
+
import type { TableColumn } from './table-column.type';
|
|
3
|
+
import type { TableOptions } from './table-options.type';
|
|
4
|
+
export interface NestedTableGroup<TGroup extends RowBase = RowBase, TItem extends RowBase = RowBase> {
|
|
5
|
+
group: TGroup;
|
|
6
|
+
items: TItem[];
|
|
7
|
+
}
|
|
8
|
+
export interface NestedTableOptions<TGroup extends RowBase = RowBase, TItem extends RowBase = RowBase> {
|
|
9
|
+
groupTableConfig?: TableOptions<TGroup>;
|
|
10
|
+
itemTableConfig?: TableOptions<TItem>;
|
|
11
|
+
summaryLabel?: string;
|
|
12
|
+
headerHint?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface NestedTableActionEvent<T extends RowBase = RowBase> {
|
|
15
|
+
column: TableColumn<T>;
|
|
16
|
+
row: T;
|
|
17
|
+
value: unknown;
|
|
18
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export const NESTED_TABLE_DEFAULT_GROUP_TOGGLE_ARIA_LABEL = 'platform.datacore.accessibility_nested_table_group_toggle';
|
|
2
|
+
export const NESTED_TABLE_DEFAULT_HINT_ARIA_LABEL = 'platform.datacore.accessibility_nested_table_hint';
|
|
3
|
+
export const NESTED_TABLE_DEFAULT_ROW_LABEL = 'platform.datacore.accessibility_nested_table_row';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLXRhYmxlLmNvbnN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9jb3JlL2NvbnN0YW50cy9uZXN0ZWQtdGFibGUuY29uc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sNENBQTRDLEdBQUcsMkRBQTJELENBQUM7QUFDeEgsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsbURBQW1ELENBQUM7QUFDeEcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsa0RBQWtELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTkVTVEVEX1RBQkxFX0RFRkFVTFRfR1JPVVBfVE9HR0xFX0FSSUFfTEFCRUwgPSAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9uZXN0ZWRfdGFibGVfZ3JvdXBfdG9nZ2xlJztcbmV4cG9ydCBjb25zdCBORVNURURfVEFCTEVfREVGQVVMVF9ISU5UX0FSSUFfTEFCRUwgPSAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9uZXN0ZWRfdGFibGVfaGludCc7XG5leHBvcnQgY29uc3QgTkVTVEVEX1RBQkxFX0RFRkFVTFRfUk9XX0xBQkVMID0gJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfbmVzdGVkX3RhYmxlX3Jvdyc7XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLXRhYmxlLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2NvcmUvdHlwZXMvbmVzdGVkLXRhYmxlLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUm93QmFzZSB9IGZyb20gJy4vdGFibGUtc2hhcmVkLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4vdGFibGUtY29sdW1uLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBUYWJsZU9wdGlvbnMgfSBmcm9tICcuL3RhYmxlLW9wdGlvbnMudHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVzdGVkVGFibGVHcm91cDxUR3JvdXAgZXh0ZW5kcyBSb3dCYXNlID0gUm93QmFzZSwgVEl0ZW0gZXh0ZW5kcyBSb3dCYXNlID0gUm93QmFzZT4ge1xuICBncm91cDogVEdyb3VwO1xuICBpdGVtczogVEl0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXN0ZWRUYWJsZU9wdGlvbnM8VEdyb3VwIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2UsIFRJdGVtIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgZ3JvdXBUYWJsZUNvbmZpZz86IFRhYmxlT3B0aW9uczxUR3JvdXA+O1xuICBpdGVtVGFibGVDb25maWc/OiBUYWJsZU9wdGlvbnM8VEl0ZW0+O1xuICAvLyBUZXh0byBqYSBmb3JtYXRhZG8gcGVsbyBjb25zdW1pZG9yIChleC46IFwiNiBkZSA4IG1hc3RlciBkYXRhcyBhdGl2YWRhc1wiKSAtIGEgbGliIG5hb1xuICAvLyBjb25oZWNlIGEgcmVncmEgZGUgbmVnb2NpbyBwb3IgdHJhcyBkYSBjb250YWdlbSwgc28gZXhpYmUgbyB0ZXh0byBwcm9udG8uXG4gIHN1bW1hcnlMYWJlbD86IHN0cmluZztcbiAgLy8gQ2hhdmUgZGUgdHJhZHVjYW8gZXhpYmlkYSBubyBiYWxhbyBkbyBpY29uZSBkZSBpbmZvcm1hY2FvIGRvIGNhYmVjYWxobywgbWVzbW9cbiAgLy8gbWVjYW5pc21vIGRvIFRhYmxlQ29sdW1uLmhlYWRlclRvb2x0aXAuXG4gIGhlYWRlckhpbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmVzdGVkVGFibGVBY3Rpb25FdmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgY29sdW1uOiBUYWJsZUNvbHVtbjxUPjtcbiAgcm93OiBUO1xuICB2YWx1ZTogdW5rbm93bjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, computed, inject, signal } from '@angular/core';
|
|
2
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
3
|
+
import { NESTED_TABLE_DEFAULT_GROUP_TOGGLE_ARIA_LABEL, NESTED_TABLE_DEFAULT_HINT_ARIA_LABEL, NESTED_TABLE_DEFAULT_ROW_LABEL } from '../../core/constants/nested-table.const';
|
|
4
|
+
import { nextSequentialId } from '../../core/utils/id.util';
|
|
5
|
+
import { resolveTranslatableText } from '../../core/utils/i18n.util';
|
|
6
|
+
import { TableComponent } from '../table/table.component';
|
|
7
|
+
import { TableCellContentComponent } from '../table/components/table-cell-content.component';
|
|
8
|
+
import { TableSortIndicatorComponent } from '../table/components/table-sort-indicator.component';
|
|
9
|
+
import { buildTableCellConfigMap } from '../table/utils/table-config.util';
|
|
10
|
+
import { cycleSortState, getNestedValue, resolveRowSelectionKey, sortTableRows } from '../table/utils/table-data.util';
|
|
11
|
+
import { TooltipComponent } from '../tooltip/tooltip.component';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@ngx-translate/core";
|
|
14
|
+
export class NestedTableComponent {
|
|
15
|
+
translate = inject(TranslateService);
|
|
16
|
+
instanceId = nextSequentialId('sdc-nested-table');
|
|
17
|
+
groupPathPartsCache = new Map();
|
|
18
|
+
groupsSignal = signal([]);
|
|
19
|
+
openKeysSignal = signal(new Set());
|
|
20
|
+
configSignal = signal({});
|
|
21
|
+
groupSortField = signal(null);
|
|
22
|
+
groupSortOrder = signal(0);
|
|
23
|
+
set groups(value) {
|
|
24
|
+
const next = value ?? [];
|
|
25
|
+
this.groupsSignal.set(next);
|
|
26
|
+
const validKeys = new Set(next.map((entry) => this.groupKey(entry)));
|
|
27
|
+
this.openKeysSignal.update((current) => {
|
|
28
|
+
const filtered = new Set([...current].filter((key) => validKeys.has(key)));
|
|
29
|
+
return filtered.size === current.size ? current : filtered;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
get groups() {
|
|
33
|
+
return this.groupsSignal();
|
|
34
|
+
}
|
|
35
|
+
groupCols = [];
|
|
36
|
+
itemCols = [];
|
|
37
|
+
set config(value) {
|
|
38
|
+
this.configSignal.set(value ?? {});
|
|
39
|
+
}
|
|
40
|
+
get config() {
|
|
41
|
+
return this.configSignal();
|
|
42
|
+
}
|
|
43
|
+
loading = false;
|
|
44
|
+
ariaLabel = '';
|
|
45
|
+
groupExpanded = new EventEmitter();
|
|
46
|
+
groupCollapsed = new EventEmitter();
|
|
47
|
+
itemAction = new EventEmitter();
|
|
48
|
+
hintAriaLabel = NESTED_TABLE_DEFAULT_HINT_ARIA_LABEL;
|
|
49
|
+
rowLabel = NESTED_TABLE_DEFAULT_ROW_LABEL;
|
|
50
|
+
groupToggleAriaLabel = NESTED_TABLE_DEFAULT_GROUP_TOGGLE_ARIA_LABEL;
|
|
51
|
+
summaryLabel = computed(() => this.configSignal().summaryLabel ?? '');
|
|
52
|
+
headerHint = computed(() => this.configSignal().headerHint ?? '');
|
|
53
|
+
groupCellConfigs = computed(() => buildTableCellConfigMap(this.configSignal().groupTableConfig ?? {}));
|
|
54
|
+
itemTableConfig = computed(() => this.configSignal().itemTableConfig);
|
|
55
|
+
resolveGroupValue = (row, path) => getNestedValue(row, path, this.groupPathPartsCache);
|
|
56
|
+
sortedGroups = computed(() => sortTableRows(this.groupsSignal(), this.groupSortField(), this.groupSortOrder(), (entry, path) => this.resolveGroupValue(entry.group, path)));
|
|
57
|
+
isSortableColumn(col) {
|
|
58
|
+
return (col.sortable ?? true) && !!col.field;
|
|
59
|
+
}
|
|
60
|
+
isActiveSort(col) {
|
|
61
|
+
return this.groupSortField() === col.field;
|
|
62
|
+
}
|
|
63
|
+
toggleGroupSort(col) {
|
|
64
|
+
if (!this.isSortableColumn(col) || !col.field) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const next = cycleSortState(this.groupSortField(), this.groupSortOrder(), col.field);
|
|
68
|
+
this.groupSortField.set(next.field);
|
|
69
|
+
this.groupSortOrder.set(next.order);
|
|
70
|
+
}
|
|
71
|
+
groupKey(entry) {
|
|
72
|
+
return resolveRowSelectionKey(entry.group);
|
|
73
|
+
}
|
|
74
|
+
isOpen(entry) {
|
|
75
|
+
return this.openKeysSignal().has(this.groupKey(entry));
|
|
76
|
+
}
|
|
77
|
+
groupContentId(entry) {
|
|
78
|
+
return `${this.instanceId}-content-${this.groupKey(entry)}`;
|
|
79
|
+
}
|
|
80
|
+
sortHintId(col) {
|
|
81
|
+
return `${this.instanceId}-sort-hint-${col.field}`;
|
|
82
|
+
}
|
|
83
|
+
toggleGroup(entry) {
|
|
84
|
+
const key = this.groupKey(entry);
|
|
85
|
+
const next = new Set(this.openKeysSignal());
|
|
86
|
+
if (next.has(key)) {
|
|
87
|
+
next.delete(key);
|
|
88
|
+
this.openKeysSignal.set(next);
|
|
89
|
+
this.groupCollapsed.emit(entry.group);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
next.add(key);
|
|
93
|
+
this.openKeysSignal.set(next);
|
|
94
|
+
this.groupExpanded.emit(entry.group);
|
|
95
|
+
}
|
|
96
|
+
resolveGroupToggleAriaLabel(entry) {
|
|
97
|
+
const action = resolveTranslatableText(this.translate, this.groupToggleAriaLabel);
|
|
98
|
+
const verbKey = this.isOpen(entry)
|
|
99
|
+
? 'platform.datacore.accessibility_panel_collapse'
|
|
100
|
+
: 'platform.datacore.accessibility_panel_expand';
|
|
101
|
+
const verb = resolveTranslatableText(this.translate, verbKey);
|
|
102
|
+
return [action, verb].filter(Boolean).join(' - ');
|
|
103
|
+
}
|
|
104
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NestedTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
105
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NestedTableComponent, isStandalone: true, selector: "sdc-nested-table", inputs: { groups: "groups", groupCols: "groupCols", itemCols: "itemCols", config: "config", loading: "loading", ariaLabel: "ariaLabel" }, outputs: { groupExpanded: "groupExpanded", groupCollapsed: "groupCollapsed", itemAction: "itemAction" }, ngImport: i0, template: "<div class=\"sdc-nested-table\" [attr.aria-label]=\"ariaLabel || null\">\n @if (summaryLabel() || headerHint()) {\n <div class=\"sdc-nested-table__meta\">\n @if (headerHint()) {\n <sdc-tooltip [pTooltip]=\"headerHint() | translate\" [tooltipPosition]=\"'right'\" [tooltipEvent]=\"'both'\">\n <button type=\"button\" class=\"sdc-nested-table__hint\" [attr.aria-label]=\"hintAriaLabel | translate\">\n <i class=\"fas fa-info-circle sdc-nested-table__hint-icon\" aria-hidden=\"true\"></i>\n </button>\n </sdc-tooltip>\n }\n\n @if (summaryLabel()) {\n <span class=\"sdc-nested-table__summary\">{{ summaryLabel() }}</span>\n }\n </div>\n }\n\n <table class=\"sdc-nested-table__groups\">\n <thead>\n <tr>\n <th class=\"sdc-nested-table__toggle-col\" scope=\"col\">\n <span class=\"sr-only\">{{ groupToggleAriaLabel | translate }}</span>\n </th>\n\n @for (col of groupCols; track $index) {\n <th\n class=\"sdc-nested-table__th\"\n [class.sdc-nested-table__th--sortable]=\"isSortableColumn(col)\"\n scope=\"col\"\n [attr.aria-sort]=\"\n isSortableColumn(col)\n ? isActiveSort(col)\n ? (groupSortOrder() === 1 ? 'ascending' : 'descending')\n : 'none'\n : null\n \"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-describedby]=\"isSortableColumn(col) ? sortHintId(col) : null\"\n (click)=\"toggleGroupSort(col)\"\n (keydown.enter)=\"toggleGroupSort(col)\"\n (keydown.space)=\"$event.preventDefault(); toggleGroupSort(col)\"\n >\n <span class=\"sdc-nested-table__th-label\">{{ col.header | translate }}</span>\n\n @if (isSortableColumn(col)) {\n <span class=\"sr-only\" [id]=\"sortHintId(col)\">{{\n 'platform.datacore.accessibility_sortable_column' | translate\n }}</span>\n }\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-nested-table__th-tooltip\"\n [pTooltip]=\"col.headerTooltip | translate\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <sdc-table-sort-indicator\n [columnField]=\"col.field ?? null\"\n [columnType]=\"col.type\"\n [sortField]=\"groupSortField()\"\n [sortOrder]=\"groupSortOrder()\"\n [sortable]=\"isSortableColumn(col)\"\n ></sdc-table-sort-indicator>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (entry of sortedGroups(); track groupKey(entry)) {\n <tr class=\"sdc-nested-table__group-row\">\n <td class=\"sdc-nested-table__toggle-col\">\n <button\n type=\"button\"\n class=\"sdc-nested-table__toggle\"\n [attr.aria-expanded]=\"isOpen(entry)\"\n [attr.aria-controls]=\"groupContentId(entry)\"\n [attr.aria-label]=\"resolveGroupToggleAriaLabel(entry)\"\n (click)=\"toggleGroup(entry)\"\n >\n <i class=\"fas\" [class.fa-plus]=\"!isOpen(entry)\" [class.fa-minus]=\"isOpen(entry)\" aria-hidden=\"true\"></i>\n </button>\n </td>\n\n @for (col of groupCols; track $index) {\n <td class=\"sdc-nested-table__td\">\n <sdc-table-cell-content\n [cellConfigs]=\"groupCellConfigs()\"\n [col]=\"col\"\n [resolveValue]=\"resolveGroupValue\"\n [row]=\"entry.group\"\n [rowLabel]=\"rowLabel\"\n ></sdc-table-cell-content>\n </td>\n }\n </tr>\n\n @if (isOpen(entry)) {\n <tr class=\"sdc-nested-table__item-row\">\n <td class=\"sdc-nested-table__item-cell\" [attr.colspan]=\"groupCols.length + 1\" [id]=\"groupContentId(entry)\">\n <sdc-table\n [cols]=\"itemCols\"\n [data]=\"entry.items\"\n [config]=\"itemTableConfig() ?? {}\"\n [loading]=\"loading\"\n (action)=\"itemAction.emit($event)\"\n ></sdc-table>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n", styles: [":host{display:block;width:100%}.sr-only{border-width:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}table{width:100%;border-collapse:collapse}.sdc-nested-table__meta{align-items:center;display:flex;gap:.5rem;margin-bottom:.75rem}.sdc-nested-table__hint{align-items:center;background:transparent;border:0;display:inline-flex;padding:0}.sdc-nested-table__hint:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__hint-icon{font-size:.875rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__summary{background:var(--sdc-nested-table-summary-bg, #eef1f4);border-radius:9999px;color:var(--sdc-text-muted, #4b5563);font-size:.75rem;font-weight:600;padding:.2rem .65rem}.sdc-nested-table__toggle-col{width:2.5rem}.sdc-nested-table__th{border-bottom:1px solid var(--sdc-table-border-gray, #e5e7eb);color:#333;font-size:.8125rem;font-weight:700;padding:.5rem var(--sdc-table-padding-cell, .75rem);position:relative;text-align:left;text-transform:uppercase;white-space:nowrap}.sdc-nested-table__th--sortable{cursor:pointer;padding-right:1.75rem}.sdc-nested-table__th-label{margin-right:.35rem}.sdc-nested-table__th-tooltip{display:inline-flex;align-items:center;margin-right:.35rem}.sdc-nested-table__th-tooltip i{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__group-row td{border-bottom:1px solid var(--sdc-table-border-gray, #e5e7eb);padding:.5rem var(--sdc-table-padding-cell, .75rem);vertical-align:middle}.sdc-nested-table__toggle{align-items:center;background:transparent;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:4px;color:var(--sdc-text-default, #111827);cursor:pointer;display:inline-flex;font-size:.75rem;height:1.5rem;justify-content:center;width:1.5rem}.sdc-nested-table__toggle:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__item-row td{background:var(--sdc-nested-table-item-bg, #eaf2fb);padding:.75rem var(--sdc-table-padding-cell, .75rem)}.sdc-nested-table__item-cell ::ng-deep .sdc-table-shell{background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: TableComponent, selector: "sdc-table", inputs: ["cols", "data", "selection", "loading", "loadingIndicator", "config", "ariaLabel"], outputs: ["action", "rowClick", "lazyLoad", "selectionChange"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
106
|
+
}
|
|
107
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NestedTableComponent, decorators: [{
|
|
108
|
+
type: Component,
|
|
109
|
+
args: [{ selector: 'sdc-nested-table', standalone: true, imports: [TranslateModule, TableComponent, TableCellContentComponent, TableSortIndicatorComponent, TooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-nested-table\" [attr.aria-label]=\"ariaLabel || null\">\n @if (summaryLabel() || headerHint()) {\n <div class=\"sdc-nested-table__meta\">\n @if (headerHint()) {\n <sdc-tooltip [pTooltip]=\"headerHint() | translate\" [tooltipPosition]=\"'right'\" [tooltipEvent]=\"'both'\">\n <button type=\"button\" class=\"sdc-nested-table__hint\" [attr.aria-label]=\"hintAriaLabel | translate\">\n <i class=\"fas fa-info-circle sdc-nested-table__hint-icon\" aria-hidden=\"true\"></i>\n </button>\n </sdc-tooltip>\n }\n\n @if (summaryLabel()) {\n <span class=\"sdc-nested-table__summary\">{{ summaryLabel() }}</span>\n }\n </div>\n }\n\n <table class=\"sdc-nested-table__groups\">\n <thead>\n <tr>\n <th class=\"sdc-nested-table__toggle-col\" scope=\"col\">\n <span class=\"sr-only\">{{ groupToggleAriaLabel | translate }}</span>\n </th>\n\n @for (col of groupCols; track $index) {\n <th\n class=\"sdc-nested-table__th\"\n [class.sdc-nested-table__th--sortable]=\"isSortableColumn(col)\"\n scope=\"col\"\n [attr.aria-sort]=\"\n isSortableColumn(col)\n ? isActiveSort(col)\n ? (groupSortOrder() === 1 ? 'ascending' : 'descending')\n : 'none'\n : null\n \"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-describedby]=\"isSortableColumn(col) ? sortHintId(col) : null\"\n (click)=\"toggleGroupSort(col)\"\n (keydown.enter)=\"toggleGroupSort(col)\"\n (keydown.space)=\"$event.preventDefault(); toggleGroupSort(col)\"\n >\n <span class=\"sdc-nested-table__th-label\">{{ col.header | translate }}</span>\n\n @if (isSortableColumn(col)) {\n <span class=\"sr-only\" [id]=\"sortHintId(col)\">{{\n 'platform.datacore.accessibility_sortable_column' | translate\n }}</span>\n }\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-nested-table__th-tooltip\"\n [pTooltip]=\"col.headerTooltip | translate\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <sdc-table-sort-indicator\n [columnField]=\"col.field ?? null\"\n [columnType]=\"col.type\"\n [sortField]=\"groupSortField()\"\n [sortOrder]=\"groupSortOrder()\"\n [sortable]=\"isSortableColumn(col)\"\n ></sdc-table-sort-indicator>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (entry of sortedGroups(); track groupKey(entry)) {\n <tr class=\"sdc-nested-table__group-row\">\n <td class=\"sdc-nested-table__toggle-col\">\n <button\n type=\"button\"\n class=\"sdc-nested-table__toggle\"\n [attr.aria-expanded]=\"isOpen(entry)\"\n [attr.aria-controls]=\"groupContentId(entry)\"\n [attr.aria-label]=\"resolveGroupToggleAriaLabel(entry)\"\n (click)=\"toggleGroup(entry)\"\n >\n <i class=\"fas\" [class.fa-plus]=\"!isOpen(entry)\" [class.fa-minus]=\"isOpen(entry)\" aria-hidden=\"true\"></i>\n </button>\n </td>\n\n @for (col of groupCols; track $index) {\n <td class=\"sdc-nested-table__td\">\n <sdc-table-cell-content\n [cellConfigs]=\"groupCellConfigs()\"\n [col]=\"col\"\n [resolveValue]=\"resolveGroupValue\"\n [row]=\"entry.group\"\n [rowLabel]=\"rowLabel\"\n ></sdc-table-cell-content>\n </td>\n }\n </tr>\n\n @if (isOpen(entry)) {\n <tr class=\"sdc-nested-table__item-row\">\n <td class=\"sdc-nested-table__item-cell\" [attr.colspan]=\"groupCols.length + 1\" [id]=\"groupContentId(entry)\">\n <sdc-table\n [cols]=\"itemCols\"\n [data]=\"entry.items\"\n [config]=\"itemTableConfig() ?? {}\"\n [loading]=\"loading\"\n (action)=\"itemAction.emit($event)\"\n ></sdc-table>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n", styles: [":host{display:block;width:100%}.sr-only{border-width:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}table{width:100%;border-collapse:collapse}.sdc-nested-table__meta{align-items:center;display:flex;gap:.5rem;margin-bottom:.75rem}.sdc-nested-table__hint{align-items:center;background:transparent;border:0;display:inline-flex;padding:0}.sdc-nested-table__hint:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__hint-icon{font-size:.875rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__summary{background:var(--sdc-nested-table-summary-bg, #eef1f4);border-radius:9999px;color:var(--sdc-text-muted, #4b5563);font-size:.75rem;font-weight:600;padding:.2rem .65rem}.sdc-nested-table__toggle-col{width:2.5rem}.sdc-nested-table__th{border-bottom:1px solid var(--sdc-table-border-gray, #e5e7eb);color:#333;font-size:.8125rem;font-weight:700;padding:.5rem var(--sdc-table-padding-cell, .75rem);position:relative;text-align:left;text-transform:uppercase;white-space:nowrap}.sdc-nested-table__th--sortable{cursor:pointer;padding-right:1.75rem}.sdc-nested-table__th-label{margin-right:.35rem}.sdc-nested-table__th-tooltip{display:inline-flex;align-items:center;margin-right:.35rem}.sdc-nested-table__th-tooltip i{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__group-row td{border-bottom:1px solid var(--sdc-table-border-gray, #e5e7eb);padding:.5rem var(--sdc-table-padding-cell, .75rem);vertical-align:middle}.sdc-nested-table__toggle{align-items:center;background:transparent;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:4px;color:var(--sdc-text-default, #111827);cursor:pointer;display:inline-flex;font-size:.75rem;height:1.5rem;justify-content:center;width:1.5rem}.sdc-nested-table__toggle:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__item-row td{background:var(--sdc-nested-table-item-bg, #eaf2fb);padding:.75rem var(--sdc-table-padding-cell, .75rem)}.sdc-nested-table__item-cell ::ng-deep .sdc-table-shell{background:transparent}\n"] }]
|
|
110
|
+
}], propDecorators: { groups: [{
|
|
111
|
+
type: Input,
|
|
112
|
+
args: [{ required: true }]
|
|
113
|
+
}], groupCols: [{
|
|
114
|
+
type: Input,
|
|
115
|
+
args: [{ required: true }]
|
|
116
|
+
}], itemCols: [{
|
|
117
|
+
type: Input,
|
|
118
|
+
args: [{ required: true }]
|
|
119
|
+
}], config: [{
|
|
120
|
+
type: Input
|
|
121
|
+
}], loading: [{
|
|
122
|
+
type: Input
|
|
123
|
+
}], ariaLabel: [{
|
|
124
|
+
type: Input
|
|
125
|
+
}], groupExpanded: [{
|
|
126
|
+
type: Output
|
|
127
|
+
}], groupCollapsed: [{
|
|
128
|
+
type: Output
|
|
129
|
+
}], itemAction: [{
|
|
130
|
+
type: Output
|
|
131
|
+
}] } });
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvbmVzdGVkLXRhYmxlL25lc3RlZC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL25lc3RlZC10YWJsZS9uZXN0ZWQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsNENBQTRDLEVBQzVDLG9DQUFvQyxFQUNwQyw4QkFBOEIsRUFDL0IsTUFBTSx5Q0FBeUMsQ0FBQztBQUtqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDakcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQVdoRSxNQUFN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U0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHtcbiAgTkVTVEVEX1RBQkxFX0RFRkFVTFRfR1JPVVBfVE9HR0xFX0FSSUFfTEFCRUwsXG4gIE5FU1RFRF9UQUJMRV9ERUZBVUxUX0hJTlRfQVJJQV9MQUJFTCxcbiAgTkVTVEVEX1RBQkxFX0RFRkFVTFRfUk9XX0xBQkVMXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL25lc3RlZC10YWJsZS5jb25zdCc7XG5pbXBvcnQgdHlwZSB7IE5lc3RlZFRhYmxlQWN0aW9uRXZlbnQsIE5lc3RlZFRhYmxlR3JvdXAsIE5lc3RlZFRhYmxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvbmVzdGVkLXRhYmxlLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvdGFibGUtY29sdW1uLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBUYWJsZUNlbGxDb25maWdNYXAsIFRhYmxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvdGFibGUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB0eXBlIHsgUm93QmFzZSwgU29ydE9yZGVyIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90YWJsZS1zaGFyZWQudHlwZSc7XG5pbXBvcnQgeyBuZXh0U2VxdWVudGlhbElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pZC51dGlsJztcbmltcG9ydCB7IHJlc29sdmVUcmFuc2xhdGFibGVUZXh0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pMThuLnV0aWwnO1xuaW1wb3J0IHsgVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVDZWxsQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uL3RhYmxlL2NvbXBvbmVudHMvdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS9jb21wb25lbnRzL3RhYmxlLXNvcnQtaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCB9IGZyb20gJy4uL3RhYmxlL3V0aWxzL3RhYmxlLWNvbmZpZy51dGlsJztcbmltcG9ydCB7IGN5Y2xlU29ydFN0YXRlLCBnZXROZXN0ZWRWYWx1ZSwgcmVzb2x2ZVJvd1NlbGVjdGlvbktleSwgc29ydFRhYmxlUm93cyB9IGZyb20gJy4uL3RhYmxlL3V0aWxzL3RhYmxlLWRhdGEudXRpbCc7XG5pbXBvcnQgeyBUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1uZXN0ZWQtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBUYWJsZUNvbXBvbmVudCwgVGFibGVDZWxsQ29udGVudENvbXBvbmVudCwgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50LCBUb29sdGlwQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL25lc3RlZC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9uZXN0ZWQtdGFibGUuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRcbn0pXG5leHBvcnQgY2xhc3MgTmVzdGVkVGFibGVDb21wb25lbnQ8VEdyb3VwIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2UsIFRJdGVtIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VJZCA9IG5leHRTZXF1ZW50aWFsSWQoJ3NkYy1uZXN0ZWQtdGFibGUnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cFBhdGhQYXJ0c0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBzU2lnbmFsID0gc2lnbmFsPE5lc3RlZFRhYmxlR3JvdXA8VEdyb3VwLCBUSXRlbT5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wZW5LZXlzU2lnbmFsID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2lnbmFsID0gc2lnbmFsPE5lc3RlZFRhYmxlT3B0aW9uczxUR3JvdXAsIFRJdGVtPj4oe30pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBncm91cFNvcnRGaWVsZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyb3VwU29ydE9yZGVyID0gc2lnbmFsPFNvcnRPcmRlcj4oMCk7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGdyb3Vwcyh2YWx1ZTogTmVzdGVkVGFibGVHcm91cDxUR3JvdXAsIFRJdGVtPltdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyBbXTtcbiAgICB0aGlzLmdyb3Vwc1NpZ25hbC5zZXQobmV4dCk7XG5cbiAgICBjb25zdCB2YWxpZEtleXMgPSBuZXcgU2V0KG5leHQubWFwKChlbnRyeSkgPT4gdGhpcy5ncm91cEtleShlbnRyeSkpKTtcbiAgICB0aGlzLm9wZW5LZXlzU2lnbmFsLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBuZXcgU2V0KFsuLi5jdXJyZW50XS5maWx0ZXIoKGtleSkgPT4gdmFsaWRLZXlzLmhhcyhrZXkpKSk7XG4gICAgICByZXR1cm4gZmlsdGVyZWQuc2l6ZSA9PT0gY3VycmVudC5zaXplID8gY3VycmVudCA6IGZpbHRlcmVkO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGdyb3VwcygpOiBOZXN0ZWRUYWJsZUdyb3VwPFRHcm91cCwgVEl0ZW0+W10ge1xuICAgIHJldHVybiB0aGlzLmdyb3Vwc1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZ3JvdXBDb2xzOiBUYWJsZUNvbHVtbjxUR3JvdXA+W10gPSBbXTtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgaXRlbUNvbHM6IFRhYmxlQ29sdW1uPFRJdGVtPltdID0gW107XG5cbiAgQElucHV0KClcbiAgc2V0IGNvbmZpZyh2YWx1ZTogTmVzdGVkVGFibGVPcHRpb25zPFRHcm91cCwgVEl0ZW0+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29uZmlnU2lnbmFsLnNldCh2YWx1ZSA/PyB7fSk7XG4gIH1cblxuICBnZXQgY29uZmlnKCk6IE5lc3RlZFRhYmxlT3B0aW9uczxUR3JvdXAsIFRJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICcnO1xuXG4gIEBPdXRwdXQoKSBncm91cEV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUR3JvdXA+KCk7XG4gIEBPdXRwdXQoKSBncm91cENvbGxhcHNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VEdyb3VwPigpO1xuICBAT3V0cHV0KCkgaXRlbUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8TmVzdGVkVGFibGVBY3Rpb25FdmVudDxUSXRlbT4+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhpbnRBcmlhTGFiZWwgPSBORVNURURfVEFCTEVfREVGQVVMVF9ISU5UX0FSSUFfTEFCRUw7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3dMYWJlbCA9IE5FU1RFRF9UQUJMRV9ERUZBVUxUX1JPV19MQUJFTDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyb3VwVG9nZ2xlQXJpYUxhYmVsID0gTkVTVEVEX1RBQkxFX0RFRkFVTFRfR1JPVVBfVE9HR0xFX0FSSUFfTEFCRUw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1bW1hcnlMYWJlbCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKS5zdW1tYXJ5TGFiZWwgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGVhZGVySGludCA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKS5oZWFkZXJIaW50ID8/ICcnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ3JvdXBDZWxsQ29uZmlncyA9IGNvbXB1dGVkPFRhYmxlQ2VsbENvbmZpZ01hcDxUR3JvdXA+PigoKSA9PlxuICAgIGJ1aWxkVGFibGVDZWxsQ29uZmlnTWFwKHRoaXMuY29uZmlnU2lnbmFsKCkuZ3JvdXBUYWJsZUNvbmZpZyA/PyB7fSlcbiAgKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbVRhYmxlQ29uZmlnID0gY29tcHV0ZWQ8VGFibGVPcHRpb25zPFRJdGVtPiB8IHVuZGVmaW5lZD4oKCkgPT5cbiAgICB0aGlzLmNvbmZpZ1NpZ25hbCgpLml0ZW1UYWJsZUNvbmZpZ1xuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlR3JvdXBWYWx1ZSA9IChyb3c6IFRHcm91cCwgcGF0aD86IHN0cmluZyk6IHVua25vd24gPT5cbiAgICBnZXROZXN0ZWRWYWx1ZShyb3csIHBhdGgsIHRoaXMuZ3JvdXBQYXRoUGFydHNDYWNoZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvcnRlZEdyb3VwcyA9IGNvbXB1dGVkPE5lc3RlZFRhYmxlR3JvdXA8VEdyb3VwLCBUSXRlbT5bXT4oKCkgPT5cbiAgICBzb3J0VGFibGVSb3dzKFxuICAgICAgdGhpcy5ncm91cHNTaWduYWwoKSxcbiAgICAgIHRoaXMuZ3JvdXBTb3J0RmllbGQoKSxcbiAgICAgIHRoaXMuZ3JvdXBTb3J0T3JkZXIoKSxcbiAgICAgIChlbnRyeTogTmVzdGVkVGFibGVHcm91cDxUR3JvdXAsIFRJdGVtPiwgcGF0aD86IHN0cmluZykgPT4gdGhpcy5yZXNvbHZlR3JvdXBWYWx1ZShlbnRyeS5ncm91cCwgcGF0aClcbiAgICApXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlzU29ydGFibGVDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUR3JvdXA+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjb2wuc29ydGFibGUgPz8gdHJ1ZSkgJiYgISFjb2wuZmllbGQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3RpdmVTb3J0KGNvbDogVGFibGVDb2x1bW48VEdyb3VwPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyb3VwU29ydEZpZWxkKCkgPT09IGNvbC5maWVsZDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVHcm91cFNvcnQoY29sOiBUYWJsZUNvbHVtbjxUR3JvdXA+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU29ydGFibGVDb2x1bW4oY29sKSB8fCAhY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGN5Y2xlU29ydFN0YXRlKHRoaXMuZ3JvdXBTb3J0RmllbGQoKSwgdGhpcy5ncm91cFNvcnRPcmRlcigpLCBjb2wuZmllbGQpO1xuICAgIHRoaXMuZ3JvdXBTb3J0RmllbGQuc2V0KG5leHQuZmllbGQpO1xuICAgIHRoaXMuZ3JvdXBTb3J0T3JkZXIuc2V0KG5leHQub3JkZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdyb3VwS2V5KGVudHJ5OiBOZXN0ZWRUYWJsZUdyb3VwPFRHcm91cCwgVEl0ZW0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJvd1NlbGVjdGlvbktleShlbnRyeS5ncm91cCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNPcGVuKGVudHJ5OiBOZXN0ZWRUYWJsZUdyb3VwPFRHcm91cCwgVEl0ZW0+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbktleXNTaWduYWwoKS5oYXModGhpcy5ncm91cEtleShlbnRyeSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdyb3VwQ29udGVudElkKGVudHJ5OiBOZXN0ZWRUYWJsZUdyb3VwPFRHcm91cCwgVEl0ZW0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pbnN0YW5jZUlkfS1jb250ZW50LSR7dGhpcy5ncm91cEtleShlbnRyeSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzb3J0SGludElkKGNvbDogVGFibGVDb2x1bW48VEdyb3VwPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaW5zdGFuY2VJZH0tc29ydC1oaW50LSR7Y29sLmZpZWxkfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlR3JvdXAoZW50cnk6IE5lc3RlZFRhYmxlR3JvdXA8VEdyb3VwLCBUSXRlbT4pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdyb3VwS2V5KGVudHJ5KTtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLm9wZW5LZXlzU2lnbmFsKCkpO1xuXG4gICAgaWYgKG5leHQuaGFzKGtleSkpIHtcbiAgICAgIG5leHQuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLm9wZW5LZXlzU2lnbmFsLnNldChuZXh0KTtcbiAgICAgIHRoaXMuZ3JvdXBDb2xsYXBzZWQuZW1pdChlbnRyeS5ncm91cCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dC5hZGQoa2V5KTtcbiAgICB0aGlzLm9wZW5LZXlzU2lnbmFsLnNldChuZXh0KTtcbiAgICB0aGlzLmdyb3VwRXhwYW5kZWQuZW1pdChlbnRyeS5ncm91cCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUdyb3VwVG9nZ2xlQXJpYUxhYmVsKGVudHJ5OiBOZXN0ZWRUYWJsZUdyb3VwPFRHcm91cCwgVEl0ZW0+KTogc3RyaW5nIHtcbiAgICBjb25zdCBhY3Rpb24gPSByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCh0aGlzLnRyYW5zbGF0ZSwgdGhpcy5ncm91cFRvZ2dsZUFyaWFMYWJlbCk7XG4gICAgY29uc3QgdmVyYktleSA9IHRoaXMuaXNPcGVuKGVudHJ5KVxuICAgICAgPyAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9wYW5lbF9jb2xsYXBzZSdcbiAgICAgIDogJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfcGFuZWxfZXhwYW5kJztcbiAgICBjb25zdCB2ZXJiID0gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQodGhpcy50cmFuc2xhdGUsIHZlcmJLZXkpO1xuICAgIHJldHVybiBbYWN0aW9uLCB2ZXJiXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgfHwgbnVsbFwiPlxuICBAaWYgKHN1bW1hcnlMYWJlbCgpIHx8IGhlYWRlckhpbnQoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlX19tZXRhXCI+XG4gICAgICBAaWYgKGhlYWRlckhpbnQoKSkge1xuICAgICAgICA8c2RjLXRvb2x0aXAgW3BUb29sdGlwXT1cImhlYWRlckhpbnQoKSB8IHRyYW5zbGF0ZVwiIFt0b29sdGlwUG9zaXRpb25dPVwiJ3JpZ2h0J1wiIFt0b29sdGlwRXZlbnRdPVwiJ2JvdGgnXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlX19oaW50XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50QXJpYUxhYmVsIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZSBzZGMtbmVzdGVkLXRhYmxlX19oaW50LWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvc2RjLXRvb2x0aXA+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc3VtbWFyeUxhYmVsKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlX19zdW1tYXJ5XCI+e3sgc3VtbWFyeUxhYmVsKCkgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8dGFibGUgY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlX19ncm91cHNcIj5cbiAgICA8dGhlYWQ+XG4gICAgICA8dHI+XG4gICAgICAgIDx0aCBjbGFzcz1cInNkYy1uZXN0ZWQtdGFibGVfX3RvZ2dsZS1jb2xcIiBzY29wZT1cImNvbFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7IGdyb3VwVG9nZ2xlQXJpYUxhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L3RoPlxuXG4gICAgICAgIEBmb3IgKGNvbCBvZiBncm91cENvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlX190aFwiXG4gICAgICAgICAgICBbY2xhc3Muc2RjLW5lc3RlZC10YWJsZV9fdGgtLXNvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiXG4gICAgICAgICAgICAgIGlzU29ydGFibGVDb2x1bW4oY29sKVxuICAgICAgICAgICAgICAgID8gaXNBY3RpdmVTb3J0KGNvbClcbiAgICAgICAgICAgICAgICAgID8gKGdyb3VwU29ydE9yZGVyKCkgPT09IDEgPyAnYXNjZW5kaW5nJyA6ICdkZXNjZW5kaW5nJylcbiAgICAgICAgICAgICAgICAgIDogJ25vbmUnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpID8gMCA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbCkgPyBzb3J0SGludElkKGNvbCkgOiBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVHcm91cFNvcnQoY29sKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVHcm91cFNvcnQoY29sKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlR3JvdXBTb3J0KGNvbClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLW5lc3RlZC10YWJsZV9fdGgtbGFiZWxcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICAgICAgICBAaWYgKGlzU29ydGFibGVDb2x1bW4oY29sKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIiBbaWRdPVwic29ydEhpbnRJZChjb2wpXCI+e3tcbiAgICAgICAgICAgICAgICAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGNvbC5oZWFkZXJUb29sdGlwKSB7XG4gICAgICAgICAgICAgIDxzZGMtdG9vbHRpcFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLW5lc3RlZC10YWJsZV9fdGgtdG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cImNvbC5oZWFkZXJUb29sdGlwIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImNvbC5oZWFkZXJUb29sdGlwUG9zaXRpb24gPz8gJ3RvcCdcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwRXZlbnRdPVwiY29sLmhlYWRlclRvb2x0aXBFdmVudCA/PyAnaG92ZXInXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvc2RjLXRvb2x0aXA+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxzZGMtdGFibGUtc29ydC1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgW2NvbHVtbkZpZWxkXT1cImNvbC5maWVsZCA/PyBudWxsXCJcbiAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICBbc29ydEZpZWxkXT1cImdyb3VwU29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cImdyb3VwU29ydE9yZGVyKClcIlxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgID48L3NkYy10YWJsZS1zb3J0LWluZGljYXRvcj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG5cbiAgICA8dGJvZHk+XG4gICAgICBAZm9yIChlbnRyeSBvZiBzb3J0ZWRHcm91cHMoKTsgdHJhY2sgZ3JvdXBLZXkoZW50cnkpKSB7XG4gICAgICAgIDx0ciBjbGFzcz1cInNkYy1uZXN0ZWQtdGFibGVfX2dyb3VwLXJvd1wiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInNkYy1uZXN0ZWQtdGFibGVfX3RvZ2dsZS1jb2xcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLW5lc3RlZC10YWJsZV9fdG9nZ2xlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oZW50cnkpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJncm91cENvbnRlbnRJZChlbnRyeSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlc29sdmVHcm91cFRvZ2dsZUFyaWFMYWJlbChlbnRyeSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlR3JvdXAoZW50cnkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXNcIiBbY2xhc3MuZmEtcGx1c109XCIhaXNPcGVuKGVudHJ5KVwiIFtjbGFzcy5mYS1taW51c109XCJpc09wZW4oZW50cnkpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC90ZD5cblxuICAgICAgICAgIEBmb3IgKGNvbCBvZiBncm91cENvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2RjLW5lc3RlZC10YWJsZV9fdGRcIj5cbiAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiZ3JvdXBDZWxsQ29uZmlncygpXCJcbiAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlR3JvdXBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd109XCJlbnRyeS5ncm91cFwiXG4gICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cInJvd0xhYmVsXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgIEBpZiAoaXNPcGVuKGVudHJ5KSkge1xuICAgICAgICAgIDx0ciBjbGFzcz1cInNkYy1uZXN0ZWQtdGFibGVfX2l0ZW0tcm93XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJzZGMtbmVzdGVkLXRhYmxlX19pdGVtLWNlbGxcIiBbYXR0ci5jb2xzcGFuXT1cImdyb3VwQ29scy5sZW5ndGggKyAxXCIgW2lkXT1cImdyb3VwQ29udGVudElkKGVudHJ5KVwiPlxuICAgICAgICAgICAgICA8c2RjLXRhYmxlXG4gICAgICAgICAgICAgICAgW2NvbHNdPVwiaXRlbUNvbHNcIlxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImVudHJ5Lml0ZW1zXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cIml0ZW1UYWJsZUNvbmZpZygpID8/IHt9XCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAoYWN0aW9uKT1cIml0ZW1BY3Rpb24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC90Ym9keT5cbiAgPC90YWJsZT5cbjwvZGl2PlxuIl19
|