@cqa-lib/cqa-ui 0.1.1 → 1.0.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/esm2020/lib/action-menu/action-menu.component.mjs +42 -0
- package/esm2020/lib/assets/images/image-assets.constants.mjs +28 -0
- package/esm2020/lib/badge/badge.component.mjs +141 -0
- package/esm2020/lib/button/button.component.mjs +232 -0
- package/esm2020/lib/column-visibility/column-visibility.component.mjs +69 -0
- package/esm2020/lib/dashboards/chart-card/chart-card.component.mjs +22 -0
- package/esm2020/lib/dashboards/coverage-module-card/coverage-module-card.component.mjs +104 -0
- package/esm2020/lib/dashboards/dashboard-header/dashboard-header.component.mjs +82 -0
- package/esm2020/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.mjs +60 -0
- package/esm2020/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.mjs +45 -0
- package/esm2020/lib/dashboards/insight-card/insight-card.component.mjs +201 -0
- package/esm2020/lib/dashboards/metrics-card/metrics-block.component.mjs +41 -0
- package/esm2020/lib/dashboards/metrics-card/metrics-card-item.interface.mjs +2 -0
- package/esm2020/lib/dashboards/metrics-card/metrics-card.component.mjs +62 -0
- package/esm2020/lib/dashboards/progress-text-card/progress-text-card.component.mjs +46 -0
- package/esm2020/lib/dashboards/test-distribution-card/test-distribution-card.component.mjs +35 -0
- package/esm2020/lib/dialog/dialog.component.mjs +127 -0
- package/esm2020/lib/dropdown-button/dropdown-button.component.mjs +189 -0
- package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +160 -0
- package/esm2020/lib/empty-state/empty-state.component.mjs +37 -0
- package/esm2020/lib/filters/dynamic-filter/dynamic-filter.component.mjs +239 -0
- package/esm2020/lib/full-table-loader/full-table-loader.component.mjs +16 -0
- package/esm2020/lib/inline-sort/inline-sort.component.mjs +58 -0
- package/esm2020/lib/other-button/other-button.component.mjs +76 -0
- package/esm2020/lib/pagination/pagination.component.mjs +102 -0
- package/{dist/cqa-ui/esm2020 → esm2020}/lib/search-bar/search-bar.component.mjs +3 -3
- package/{dist/cqa-ui/esm2020 → esm2020}/lib/segment-control/segment-control.component.mjs +3 -3
- package/esm2020/lib/selected-filters/selected-filters.component.mjs +27 -0
- package/esm2020/lib/table/dynamic-table/dynamic-cell.directive.mjs +35 -0
- package/esm2020/lib/table/dynamic-table/dynamic-table.component.mjs +258 -0
- package/esm2020/lib/table-action-toolbar/table-action-toolbar.component.mjs +52 -0
- package/esm2020/lib/table-data-loader/table-data-loader.component.mjs +19 -0
- package/esm2020/lib/templates/table-template.component.mjs +365 -0
- package/esm2020/lib/ui-kit.module.mjs +248 -0
- package/esm2020/lib/utils/metadata-colors.util.mjs +100 -0
- package/esm2020/lib/utils/tw-overlay-container.mjs +22 -0
- package/esm2020/public-api.mjs +38 -0
- package/fesm2015/cqa-lib-cqa-ui.mjs +3661 -0
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -0
- package/fesm2020/cqa-lib-cqa-ui.mjs +3615 -0
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -0
- package/lib/action-menu/action-menu.component.d.ts +17 -0
- package/lib/assets/images/image-assets.constants.d.ts +20 -0
- package/lib/badge/badge.component.d.ts +25 -0
- package/{dist/cqa-ui/lib → lib}/button/button.component.d.ts +6 -5
- package/lib/column-visibility/column-visibility.component.d.ts +33 -0
- package/lib/dashboards/chart-card/chart-card.component.d.ts +8 -0
- package/lib/dashboards/coverage-module-card/coverage-module-card.component.d.ts +44 -0
- package/lib/dashboards/dashboard-header/dashboard-header.component.d.ts +30 -0
- package/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.d.ts +28 -0
- package/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.d.ts +14 -0
- package/lib/dashboards/insight-card/insight-card.component.d.ts +73 -0
- package/lib/dashboards/metrics-card/metrics-block.component.d.ts +12 -0
- package/lib/dashboards/metrics-card/metrics-card-item.interface.d.ts +12 -0
- package/lib/dashboards/metrics-card/metrics-card.component.d.ts +17 -0
- package/lib/dashboards/progress-text-card/progress-text-card.component.d.ts +13 -0
- package/lib/dashboards/test-distribution-card/test-distribution-card.component.d.ts +29 -0
- package/lib/dropdown-button/dropdown-button.component.d.ts +32 -0
- package/lib/dynamic-select/dynamic-select-field.component.d.ts +43 -0
- package/lib/empty-state/empty-state.component.d.ts +20 -0
- package/lib/filters/dynamic-filter/dynamic-filter.component.d.ts +56 -0
- package/lib/full-table-loader/full-table-loader.component.d.ts +6 -0
- package/lib/inline-sort/inline-sort.component.d.ts +12 -0
- package/lib/other-button/other-button.component.d.ts +37 -0
- package/lib/pagination/pagination.component.d.ts +37 -0
- package/lib/selected-filters/selected-filters.component.d.ts +17 -0
- package/lib/table/dynamic-table/dynamic-cell.directive.d.ts +16 -0
- package/lib/table/dynamic-table/dynamic-table.component.d.ts +72 -0
- package/lib/table-action-toolbar/table-action-toolbar.component.d.ts +34 -0
- package/lib/table-data-loader/table-data-loader.component.d.ts +7 -0
- package/lib/templates/table-template.component.d.ts +90 -0
- package/lib/ui-kit.module.d.ts +52 -0
- package/lib/utils/metadata-colors.util.d.ts +50 -0
- package/lib/utils/tw-overlay-container.d.ts +12 -0
- package/package.json +23 -49
- package/public-api.d.ts +37 -0
- package/src/lib/assets/images/.gitkeep +0 -0
- package/src/lib/assets/images/DashboardIcon.png +0 -0
- package/src/lib/assets/images/FilesIcon.png +0 -0
- package/src/lib/assets/images/README.md +66 -0
- package/src/lib/assets/images/ReportsIcon.png +0 -0
- package/src/lib/assets/images/SearchIcon.png +0 -0
- package/src/lib/assets/images/StepsIcon.png +0 -0
- package/src/lib/assets/images/TestCaseIcon.png +0 -0
- package/src/lib/assets/images/analytics-chart-icon.svg +11 -0
- package/src/lib/assets/images/checklist-add-icon.svg +10 -0
- package/src/lib/assets/images/document-gear-icon.svg +9 -0
- package/src/lib/assets/images/empty-state-default-icon.svg +8 -0
- package/src/lib/assets/images/image-assets.constants.ts +38 -0
- package/src/lib/assets/images/search-debug-icon.svg +8 -0
- package/src/lib/assets/images/test-case-icon.svg +9 -0
- package/src/lib/assets/images/upload-folder-icon.svg +7 -0
- package/src/lib/utils/metadata-colors.constants.js +33 -0
- package/storybook-static/assets/images/README.md +66 -0
- package/styles.css +1 -0
- package/dist/cqa-ui/README.md +0 -226
- package/dist/cqa-ui/esm2020/lib/button/button.component.mjs +0 -257
- package/dist/cqa-ui/esm2020/lib/dialog/dialog.component.mjs +0 -127
- package/dist/cqa-ui/esm2020/lib/ui-kit.module.mjs +0 -69
- package/dist/cqa-ui/esm2020/public-api.mjs +0 -10
- package/dist/cqa-ui/fesm2015/cqa-lib-cqa-ui.mjs +0 -895
- package/dist/cqa-ui/fesm2015/cqa-lib-cqa-ui.mjs.map +0 -1
- package/dist/cqa-ui/fesm2020/cqa-lib-cqa-ui.mjs +0 -881
- package/dist/cqa-ui/fesm2020/cqa-lib-cqa-ui.mjs.map +0 -1
- package/dist/cqa-ui/lib/ui-kit.module.d.ts +0 -15
- package/dist/cqa-ui/package.json +0 -56
- package/dist/cqa-ui/public-api.d.ts +0 -9
- package/dist/cqa-ui/styles.css +0 -1
- /package/{dist/cqa-ui/cqa-lib-cqa-ui.d.ts → cqa-lib-cqa-ui.d.ts} +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/cqa-lib-cqa-ui.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog-ref.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog.models.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog.service.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog.tokens.mjs +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog-ref.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.component.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.models.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.service.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.tokens.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/search-bar/search-bar.component.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/segment-control/segment-control.component.d.ts +0 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Component, ContentChild, ContentChildren, Input, TemplateRef, EventEmitter, Output } from "@angular/core";
|
|
2
|
+
import { DynamicCellTemplateDirective, DynamicHeaderTemplateDirective } from "./dynamic-cell.directive";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../full-table-loader/full-table-loader.component";
|
|
5
|
+
import * as i2 from "../../table-data-loader/table-data-loader.component";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
export class DynamicTableComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.data = [];
|
|
10
|
+
this.columns = [];
|
|
11
|
+
// Enable built-in select-all behavior for a 'checkbox' column
|
|
12
|
+
this.enableSelectAll = true;
|
|
13
|
+
// Enable simple client-side sorting when clicking sortable headers (no custom header)
|
|
14
|
+
this.enableLocalSort = true;
|
|
15
|
+
// Emit sort changes so parent can perform server-side sort if desired
|
|
16
|
+
this.sortChange = new EventEmitter();
|
|
17
|
+
this._sortDirection = null;
|
|
18
|
+
}
|
|
19
|
+
get isXs() {
|
|
20
|
+
const w = this.screenWidth || window.innerWidth;
|
|
21
|
+
return w <= 480;
|
|
22
|
+
}
|
|
23
|
+
get isSm() {
|
|
24
|
+
const w = this.screenWidth || window.innerWidth;
|
|
25
|
+
return w <= 768;
|
|
26
|
+
}
|
|
27
|
+
get isMd() {
|
|
28
|
+
const w = this.screenWidth || window.innerWidth;
|
|
29
|
+
return w <= 992;
|
|
30
|
+
}
|
|
31
|
+
get visibleColumns() {
|
|
32
|
+
const responsiveFilter = (c) => {
|
|
33
|
+
const r = c?.responsive || {};
|
|
34
|
+
if (r.xs && this.isXs)
|
|
35
|
+
return false;
|
|
36
|
+
if (r.sm && this.isSm)
|
|
37
|
+
return false;
|
|
38
|
+
if (r.md && this.isMd)
|
|
39
|
+
return false;
|
|
40
|
+
return true;
|
|
41
|
+
};
|
|
42
|
+
return (this.columns || []).filter(c => c.isShow !== false).filter(responsiveFilter);
|
|
43
|
+
}
|
|
44
|
+
getHeaderTemplate(colId) {
|
|
45
|
+
const tpl = this.headerTemplates?.find(t => t.name === colId);
|
|
46
|
+
return tpl ? tpl.template : null;
|
|
47
|
+
}
|
|
48
|
+
getCellTemplate(colId) {
|
|
49
|
+
const tpl = this.cellTemplates?.find(t => t.name === colId);
|
|
50
|
+
return tpl ? tpl.template : null;
|
|
51
|
+
}
|
|
52
|
+
getCellValue(row, path) {
|
|
53
|
+
if (!row || !path)
|
|
54
|
+
return "";
|
|
55
|
+
const parts = path.split(".");
|
|
56
|
+
let current = row;
|
|
57
|
+
for (const part of parts) {
|
|
58
|
+
if (current == null)
|
|
59
|
+
return "";
|
|
60
|
+
current = current[part];
|
|
61
|
+
}
|
|
62
|
+
return current ?? "";
|
|
63
|
+
}
|
|
64
|
+
trackByIndex(index) {
|
|
65
|
+
return index;
|
|
66
|
+
}
|
|
67
|
+
// Compute grid-template-columns string from column config
|
|
68
|
+
get computedGridTemplate() {
|
|
69
|
+
if (this.gridTemplateColumns) {
|
|
70
|
+
return this.gridTemplateColumns;
|
|
71
|
+
}
|
|
72
|
+
const cols = this.visibleColumns;
|
|
73
|
+
if (!cols?.length)
|
|
74
|
+
return '';
|
|
75
|
+
const fixedPx = cols.reduce((sum, c) => sum + (c.fixedPx || 0), 0);
|
|
76
|
+
const dynamicCols = cols.filter(c => !c.fixedPx);
|
|
77
|
+
const totalWeight = dynamicCols.reduce((sum, c) => sum + (c.weight || 1), 0) || 1;
|
|
78
|
+
const parts = cols.map(c => {
|
|
79
|
+
if (c.fixedPx && c.fixedPx > 0) {
|
|
80
|
+
return `${c.fixedPx}px`;
|
|
81
|
+
}
|
|
82
|
+
const share = (c.weight || 1) / totalWeight;
|
|
83
|
+
return `calc((100% - ${fixedPx}px) * ${share.toFixed(4)})`;
|
|
84
|
+
});
|
|
85
|
+
return parts.join(' ');
|
|
86
|
+
}
|
|
87
|
+
// Compute per-column widths for use with <colgroup>
|
|
88
|
+
get computedColumnWidths() {
|
|
89
|
+
const cols = this.visibleColumns;
|
|
90
|
+
if (!cols?.length)
|
|
91
|
+
return [];
|
|
92
|
+
const fixedPx = cols.reduce((sum, c) => sum + (c.fixedPx || 0), 0);
|
|
93
|
+
const dynamicCols = cols.filter(c => !c.fixedPx);
|
|
94
|
+
const totalWeight = dynamicCols.reduce((sum, c) => sum + (c.weight || 1), 0) || 1;
|
|
95
|
+
return cols.map(c => {
|
|
96
|
+
if (c.fixedPx && c.fixedPx > 0) {
|
|
97
|
+
return `${c.fixedPx}px`;
|
|
98
|
+
}
|
|
99
|
+
const share = (c.weight || 1) / totalWeight;
|
|
100
|
+
return `calc((100% - ${fixedPx}px) * ${share.toFixed(4)})`;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Selection helpers
|
|
104
|
+
get allSelected() {
|
|
105
|
+
const rows = this.data || [];
|
|
106
|
+
if (!rows.length)
|
|
107
|
+
return false;
|
|
108
|
+
return rows.every(r => !!r?.isSelected);
|
|
109
|
+
}
|
|
110
|
+
get someSelected() {
|
|
111
|
+
const rows = this.data || [];
|
|
112
|
+
if (!rows.length)
|
|
113
|
+
return false;
|
|
114
|
+
const anySelected = rows.some(r => !!r?.isSelected);
|
|
115
|
+
return anySelected && !this.allSelected;
|
|
116
|
+
}
|
|
117
|
+
onSelectAllChange(event) {
|
|
118
|
+
const target = event.target;
|
|
119
|
+
this.toggleSelectAll(target.checked);
|
|
120
|
+
}
|
|
121
|
+
onRowSelectChange(event, row) {
|
|
122
|
+
const target = event.target;
|
|
123
|
+
row.isSelected = target.checked;
|
|
124
|
+
}
|
|
125
|
+
toggleSelectAll(checked) {
|
|
126
|
+
const rows = this.data || [];
|
|
127
|
+
for (const row of rows) {
|
|
128
|
+
if (row) {
|
|
129
|
+
row.isSelected = checked;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
get computedData() {
|
|
134
|
+
const source = this.data || [];
|
|
135
|
+
if (!this.enableLocalSort || !this._sortActive || !this._sortDirection) {
|
|
136
|
+
return source;
|
|
137
|
+
}
|
|
138
|
+
const col = this.visibleColumns.find(c => c.fieldId === this._sortActive);
|
|
139
|
+
if (!col || !col.fieldValue) {
|
|
140
|
+
return source;
|
|
141
|
+
}
|
|
142
|
+
const dir = this._sortDirection === 'asc' ? 1 : -1;
|
|
143
|
+
const fieldPath = col.fieldValue;
|
|
144
|
+
const out = [...source];
|
|
145
|
+
out.sort((a, b) => dir * this.compareValues(this.getCellValue(a, fieldPath), this.getCellValue(b, fieldPath)));
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
// Computed loading flags to support backward compatibility
|
|
149
|
+
get showTableLoading() {
|
|
150
|
+
return this.isTableLoading ?? false;
|
|
151
|
+
}
|
|
152
|
+
get showTableDataLoading() {
|
|
153
|
+
return this.isTableDataLoading ?? false;
|
|
154
|
+
}
|
|
155
|
+
// True when table has no data and is not currently loading — used to show an empty state
|
|
156
|
+
get isEmpty() {
|
|
157
|
+
const anyLoading = this.showTableLoading || this.showTableDataLoading;
|
|
158
|
+
return !anyLoading && (!(this.data && this.data.length) || this.data.length === 0);
|
|
159
|
+
}
|
|
160
|
+
isSortedAsc(colId) {
|
|
161
|
+
return this._sortActive === colId && this._sortDirection === 'asc';
|
|
162
|
+
}
|
|
163
|
+
isSortedDesc(colId) {
|
|
164
|
+
return this._sortActive === colId && this._sortDirection === 'desc';
|
|
165
|
+
}
|
|
166
|
+
toggleSort(col) {
|
|
167
|
+
if (!col?.sortable)
|
|
168
|
+
return;
|
|
169
|
+
const colId = col.fieldId;
|
|
170
|
+
if (this._sortActive !== colId) {
|
|
171
|
+
this._sortActive = colId;
|
|
172
|
+
this._sortDirection = 'asc';
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// cycle asc -> desc -> null -> asc
|
|
176
|
+
if (this._sortDirection === 'asc')
|
|
177
|
+
this._sortDirection = 'desc';
|
|
178
|
+
else if (this._sortDirection === 'desc')
|
|
179
|
+
this._sortDirection = null;
|
|
180
|
+
else
|
|
181
|
+
this._sortDirection = 'asc';
|
|
182
|
+
}
|
|
183
|
+
this.sortChange.emit({ fieldId: this._sortActive, fieldValue: col.fieldValue, direction: this._sortDirection });
|
|
184
|
+
}
|
|
185
|
+
compareValues(a, b) {
|
|
186
|
+
if (a == null && b == null)
|
|
187
|
+
return 0;
|
|
188
|
+
if (a == null)
|
|
189
|
+
return 1; // nulls last in asc (handled by dir multiplier)
|
|
190
|
+
if (b == null)
|
|
191
|
+
return -1;
|
|
192
|
+
const numA = typeof a === 'number' ? a : Number(a);
|
|
193
|
+
const numB = typeof b === 'number' ? b : Number(b);
|
|
194
|
+
const aIsNum = !isNaN(numA) && a !== '' && a !== null && a !== false;
|
|
195
|
+
const bIsNum = !isNaN(numB) && b !== '' && b !== null && b !== false;
|
|
196
|
+
if (aIsNum && bIsNum) {
|
|
197
|
+
if (numA < numB)
|
|
198
|
+
return -1;
|
|
199
|
+
if (numA > numB)
|
|
200
|
+
return 1;
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
// Date detection: attempt parse when both values are strings and parseable
|
|
204
|
+
if (typeof a === 'string' && typeof b === 'string') {
|
|
205
|
+
const tsA = Date.parse(a);
|
|
206
|
+
const tsB = Date.parse(b);
|
|
207
|
+
if (!isNaN(tsA) && !isNaN(tsB)) {
|
|
208
|
+
if (tsA < tsB)
|
|
209
|
+
return -1;
|
|
210
|
+
if (tsA > tsB)
|
|
211
|
+
return 1;
|
|
212
|
+
return 0;
|
|
213
|
+
}
|
|
214
|
+
// localeCompare, case-insensitive
|
|
215
|
+
return a.localeCompare(b, undefined, { sensitivity: 'base', numeric: true });
|
|
216
|
+
}
|
|
217
|
+
// Fallback to string comparison
|
|
218
|
+
const sa = String(a);
|
|
219
|
+
const sb = String(b);
|
|
220
|
+
return sa.localeCompare(sb, undefined, { sensitivity: 'base', numeric: true });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
DynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
224
|
+
DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-relative\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full\" [class.is-loading]=\"true\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-left cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\">{{ getCellValue(row, col.fieldValue) }}</span>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", components: [{ type: i1.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i2.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
225
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, decorators: [{
|
|
226
|
+
type: Component,
|
|
227
|
+
args: [{ selector: "app-dynamic-table", template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-relative\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full\" [class.is-loading]=\"true\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-left cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\" [ngClass]=\"col.fieldId + '-cell'\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\">{{ getCellValue(row, col.fieldValue) }}</span>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [] }]
|
|
228
|
+
}], propDecorators: { data: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], columns: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], emptyState: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], gridTemplateColumns: [{
|
|
235
|
+
type: Input
|
|
236
|
+
}], screenWidth: [{
|
|
237
|
+
type: Input
|
|
238
|
+
}], enableSelectAll: [{
|
|
239
|
+
type: Input
|
|
240
|
+
}], enableLocalSort: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], isTableLoading: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], isTableDataLoading: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], sortChange: [{
|
|
247
|
+
type: Output
|
|
248
|
+
}], cellTemplates: [{
|
|
249
|
+
type: ContentChildren,
|
|
250
|
+
args: [DynamicCellTemplateDirective]
|
|
251
|
+
}], headerTemplates: [{
|
|
252
|
+
type: ContentChildren,
|
|
253
|
+
args: [DynamicHeaderTemplateDirective]
|
|
254
|
+
}], emptyTableTpl: [{
|
|
255
|
+
type: ContentChild,
|
|
256
|
+
args: ['emptyTableTpl', { read: TemplateRef }]
|
|
257
|
+
}] } });
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlILE9BQU8sRUFBRSw0QkFBNEIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQW9CeEcsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQU1XLFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsWUFBTyxHQUF5QixFQUFFLENBQUM7UUFTNUMsOERBQThEO1FBQ3JELG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3pDLHNGQUFzRjtRQUM3RSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQU96QyxzRUFBc0U7UUFDNUQsZUFBVSxHQUFHLElBQUksWUFBWSxFQUE4RSxDQUFDO1FBZ0k5RyxtQkFBYyxHQUEwQixJQUFJLENBQUM7S0F5RnREO0lBak5DLElBQVksSUFBSTtRQUNkLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNoRCxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQVksSUFBSTtRQUNkLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNoRCxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUNE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V0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgSW5wdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIER5bmFtaWNIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL2R5bmFtaWMtY2VsbC5kaXJlY3RpdmVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljVGFibGVDb2x1bW4ge1xuICBmaWVsZElkOiBzdHJpbmc7XG4gIGZpZWxkTmFtZT86IHN0cmluZztcbiAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgaXNEZWZhdWx0PzogYm9vbGVhbjtcbiAgc29ydGFibGU/OiBib29sZWFuO1xuICBpc1Nob3c/OiBib29sZWFuO1xuICAvLyBOZXcgY29uZmlndXJhdGlvbiBmaWVsZHMgdG8gdW5pZnkgbGF5b3V0IGxvZ2ljXG4gIHdlaWdodD86IG51bWJlcjsgLy8gcmVsYXRpdmUgd2VpZ2h0IGZvciBkeW5hbWljIHNoYXJlXG4gIGZpeGVkUHg/OiBudW1iZXI7IC8vIGZpeGVkIHdpZHRoIGluIHB4IChlLmcuIGNoZWNrYm94L2FjdGlvbnMpXG4gIHJlc3BvbnNpdmU/OiB7IHhzPzogYm9vbGVhbjsgc20/OiBib29sZWFuOyBtZD86IGJvb2xlYW4gfTsgLy8gaGlkZSBhdCBzcGVjaWZpYyBicmVha3BvaW50c1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXBwLWR5bmFtaWMtdGFibGVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9keW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1RhYmxlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgd2hlbiBubyBjdXN0b20gZW1wdHkgdGVtcGxhdGUgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSBlbXB0eVN0YXRlPzogeyB0aXRsZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGltYWdlVXJsPzogc3RyaW5nOyBhY3Rpb25zPzogYW55W10gfTtcbiAgLy8gT3B0aW9uYWwgb3ZlcnJpZGU7IGlmIG9taXR0ZWQgd2UgY29tcHV0ZSBmcm9tIGNvbHVtbnNcbiAgQElucHV0KCkgZ3JpZFRlbXBsYXRlQ29sdW1ucz86IHN0cmluZztcbiAgLy8gQnJlYWtwb2ludC1hd2FyZSBzaXppbmc7IHByb3ZpZGUgZnJvbSBwYXJlbnQgdG8gYXZvaWQgZXh0cmEgbGlzdGVuZXJzXG4gIEBJbnB1dCgpIHNjcmVlbldpZHRoPzogbnVtYmVyO1xuICAvLyBFbmFibGUgYnVpbHQtaW4gc2VsZWN0LWFsbCBiZWhhdmlvciBmb3IgYSAnY2hlY2tib3gnIGNvbHVtblxuICBASW5wdXQoKSBlbmFibGVTZWxlY3RBbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBFbmFibGUgc2ltcGxlIGNsaWVudC1zaWRlIHNvcnRpbmcgd2hlbiBjbGlja2luZyBzb3J0YWJsZSBoZWFkZXJzIChubyBjdXN0b20gaGVhZGVyKVxuICBASW5wdXQoKSBlbmFibGVMb2NhbFNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBCYWNrd2FyZC1jb21wYXQgbG9hZGluZyBmbGFnIChhcHBsaWVzIHRvIGJvdGggbG9hZGVycyBpZiBzcGVjaWZpYyBmbGFncyBub3QgcHJvdmlkZWQpXG4gIFxuICAvLyBOZXc6IGNvbnRyb2xzIHRoZSBmdWxsIHRhYmxlIG92ZXJsYXkgbG9hZGVyXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gTmV3OiBjb250cm9scyB0aGUgaW5saW5lIGRhdGEgbG9hZGVyIGFib3ZlIHRoZSB0YWJsZVxuICBASW5wdXQoKSBpc1RhYmxlRGF0YUxvYWRpbmc/OiBib29sZWFuO1xuICAvLyBFbWl0IHNvcnQgY2hhbmdlcyBzbyBwYXJlbnQgY2FuIHBlcmZvcm0gc2VydmVyLXNpZGUgc29ydCBpZiBkZXNpcmVkXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkSWQ6IHN0cmluZzsgZmllbGRWYWx1ZT86IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgfT4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUpIGNlbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKSBoZWFkZXJUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgLy8gQWxsb3cgY29uc3VtZXJzIHRvIHByb2plY3QgYSBjdXN0b20gZW1wdHktc3RhdGUgdGVtcGxhdGUgdXNpbmcgYSB0ZW1wbGF0ZSByZWYgbmFtZVxuICAvLyBlLmcuIDxuZy10ZW1wbGF0ZSAjZW1wdHlUYWJsZVRwbD5DdXN0b20gZW1wdHkgVUk8L25nLXRlbXBsYXRlPlxuICBAQ29udGVudENoaWxkKCdlbXB0eVRhYmxlVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBlbXB0eVRhYmxlVHBsPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwcml2YXRlIGdldCBpc1hzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDQ4MDtcbiAgfVxuICBwcml2YXRlIGdldCBpc1NtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDc2ODtcbiAgfVxuICBwcml2YXRlIGdldCBpc01kKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHcgPSB0aGlzLnNjcmVlbldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB3IDw9IDk5MjtcbiAgfVxuXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpOiBEeW5hbWljVGFibGVDb2x1bW5bXSB7XG4gICAgY29uc3QgcmVzcG9uc2l2ZUZpbHRlciA9IChjOiBEeW5hbWljVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHIgPSBjPy5yZXNwb25zaXZlIHx8IHt9O1xuICAgICAgaWYgKHIueHMgJiYgdGhpcy5pc1hzKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoci5zbSAmJiB0aGlzLmlzU20pIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChyLm1kICYmIHRoaXMuaXNNZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmlsdGVyKGMgPT4gYy5pc1Nob3cgIT09IGZhbHNlKS5maWx0ZXIocmVzcG9uc2l2ZUZpbHRlcik7XG4gIH1cblxuICBnZXRIZWFkZXJUZW1wbGF0ZShjb2xJZDogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IHRwbCA9IHRoaXMuaGVhZGVyVGVtcGxhdGVzPy5maW5kKHQgPT4gdC5uYW1lID09PSBjb2xJZCk7XG4gICAgcmV0dXJuIHRwbCA/IHRwbC50ZW1wbGF0ZSA6IG51bGw7XG4gIH1cblxuICBnZXRDZWxsVGVtcGxhdGUoY29sSWQ6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCB0cGwgPSB0aGlzLmNlbGxUZW1wbGF0ZXM/LmZpbmQodCA9PiB0Lm5hbWUgPT09IGNvbElkKTtcbiAgICByZXR1cm4gdHBsID8gdHBsLnRlbXBsYXRlIDogbnVsbDtcbiAgfVxuXG4gIGdldENlbGxWYWx1ZShyb3c6IGFueSwgcGF0aD86IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFyb3cgfHwgIXBhdGgpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGN1cnJlbnQgPSByb3c7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudCA/PyBcIlwiO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHN0cmluZyBmcm9tIGNvbHVtbiBjb25maWdcbiAgZ2V0IGNvbXB1dGVkR3JpZFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKCFjb2xzPy5sZW5ndGgpIHJldHVybiAnJztcbiAgICBjb25zdCBmaXhlZFB4ID0gY29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCB8fCAwKSwgMCk7XG4gICAgY29uc3QgZHluYW1pY0NvbHMgPSBjb2xzLmZpbHRlcihjID0+ICFjLmZpeGVkUHgpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gZHluYW1pY0NvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLndlaWdodCB8fCAxKSwgMCkgfHwgMTtcbiAgICBjb25zdCBwYXJ0cyA9IGNvbHMubWFwKGMgPT4ge1xuICAgICAgaWYgKGMuZml4ZWRQeCAmJiBjLmZpeGVkUHggPiAwKSB7XG4gICAgICAgIHJldHVybiBgJHtjLmZpeGVkUHh9cHhgO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2hhcmUgPSAoYy53ZWlnaHQgfHwgMSkgLyB0b3RhbFdlaWdodDtcbiAgICAgIHJldHVybiBgY2FsYygoMTAwJSAtICR7Zml4ZWRQeH1weCkgKiAke3NoYXJlLnRvRml4ZWQoNCl9KWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgcGVyLWNvbHVtbiB3aWR0aHMgZm9yIHVzZSB3aXRoIDxjb2xncm91cD5cbiAgZ2V0IGNvbXB1dGVkQ29sdW1uV2lkdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAoIWNvbHM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGZpeGVkUHggPSBjb2xzLnJlZHVjZSgoc3VtLCBjKSA9PiBzdW0gKyAoYy5maXhlZFB4IHx8IDApLCAwKTtcbiAgICBjb25zdCBkeW5hbWljQ29scyA9IGNvbHMuZmlsdGVyKGMgPT4gIWMuZml4ZWRQeCk7XG4gICAgY29uc3QgdG90YWxXZWlnaHQgPSBkeW5hbWljQ29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMud2VpZ2h0IHx8IDEpLCAwKSB8fCAxO1xuICAgIHJldHVybiBjb2xzLm1hcChjID0+IHtcbiAgICAgIGlmIChjLmZpeGVkUHggJiYgYy5maXhlZFB4ID4gMCkge1xuICAgICAgICByZXR1cm4gYCR7Yy5maXhlZFB4fXB4YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNoYXJlID0gKGMud2VpZ2h0IHx8IDEpIC8gdG90YWxXZWlnaHQ7XG4gICAgICByZXR1cm4gYGNhbGMoKDEwMCUgLSAke2ZpeGVkUHh9cHgpICogJHtzaGFyZS50b0ZpeGVkKDQpfSlgO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU2VsZWN0aW9uIGhlbHBlcnNcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3dzLmV2ZXJ5KHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgfVxuXG4gIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW55U2VsZWN0ZWQgPSByb3dzLnNvbWUociA9PiAhIXI/LmlzU2VsZWN0ZWQpO1xuICAgIHJldHVybiBhbnlTZWxlY3RlZCAmJiAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMudG9nZ2xlU2VsZWN0QWxsKHRhcmdldC5jaGVja2VkKTtcbiAgfVxuXG4gIG9uUm93U2VsZWN0Q2hhbmdlKGV2ZW50OiBFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICByb3cuaXNTZWxlY3RlZCA9IHRhcmdldC5jaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNvcnRpbmcgc3VwcG9ydCA9PT09PVxuICBwcml2YXRlIF9zb3J0QWN0aXZlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBjb21wdXRlZERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTG9jYWxTb3J0IHx8ICF0aGlzLl9zb3J0QWN0aXZlIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBjb25zdCBjb2wgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkSWQgPT09IHRoaXMuX3NvcnRBY3RpdmUpO1xuICAgIGlmICghY29sIHx8ICFjb2wuZmllbGRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgY29uc3QgZGlyID0gdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgY29uc3QgZmllbGRQYXRoID0gY29sLmZpZWxkVmFsdWU7XG4gICAgY29uc3Qgb3V0ID0gWy4uLnNvdXJjZV07XG4gICAgb3V0LnNvcnQoKGEsIGIpID0+IGRpciAqIHRoaXMuY29tcGFyZVZhbHVlcyh0aGlzLmdldENlbGxWYWx1ZShhLCBmaWVsZFBhdGgpLCB0aGlzLmdldENlbGxWYWx1ZShiLCBmaWVsZFBhdGgpKSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIGxvYWRpbmcgZmxhZ3MgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGdldCBzaG93VGFibGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVMb2FkaW5nID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZURhdGFMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVEYXRhTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0YWJsZSBoYXMgbm8gZGF0YSBhbmQgaXMgbm90IGN1cnJlbnRseSBsb2FkaW5nIOKAlCB1c2VkIHRvIHNob3cgYW4gZW1wdHkgc3RhdGVcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW55TG9hZGluZyA9IHRoaXMuc2hvd1RhYmxlTG9hZGluZyB8fCB0aGlzLnNob3dUYWJsZURhdGFMb2FkaW5nO1xuICAgIHJldHVybiAhYW55TG9hZGluZyAmJiAoISh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICBpc1NvcnRlZEFzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnO1xuICB9XG5cbiAgaXNTb3J0ZWREZXNjKGNvbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEFjdGl2ZSA9PT0gY29sSWQgJiYgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICB9XG5cbiAgdG9nZ2xlU29ydChjb2w6IER5bmFtaWNUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbElkID0gY29sLmZpZWxkSWQ7XG4gICAgaWYgKHRoaXMuX3NvcnRBY3RpdmUgIT09IGNvbElkKSB7XG4gICAgICB0aGlzLl9zb3J0QWN0aXZlID0gY29sSWQ7XG4gICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN5Y2xlIGFzYyAtPiBkZXNjIC0+IG51bGwgLT4gYXNjXG4gICAgICBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgZWxzZSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgZmllbGRJZDogdGhpcy5fc29ydEFjdGl2ZSwgZmllbGRWYWx1ZTogY29sLmZpZWxkVmFsdWUsIGRpcmVjdGlvbjogdGhpcy5fc29ydERpcmVjdGlvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwO1xuICAgIGlmIChhID09IG51bGwpIHJldHVybiAxOyAvLyBudWxscyBsYXN0IGluIGFzYyAoaGFuZGxlZCBieSBkaXIgbXVsdGlwbGllcilcbiAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gLTE7XG5cbiAgICBjb25zdCBudW1BID0gdHlwZW9mIGEgPT09ICdudW1iZXInID8gYSA6IE51bWJlcihhKTtcbiAgICBjb25zdCBudW1CID0gdHlwZW9mIGIgPT09ICdudW1iZXInID8gYiA6IE51bWJlcihiKTtcbiAgICBjb25zdCBhSXNOdW0gPSAhaXNOYU4obnVtQSkgJiYgYSAhPT0gJycgJiYgYSAhPT0gbnVsbCAmJiBhICE9PSBmYWxzZTtcbiAgICBjb25zdCBiSXNOdW0gPSAhaXNOYU4obnVtQikgJiYgYiAhPT0gJycgJiYgYiAhPT0gbnVsbCAmJiBiICE9PSBmYWxzZTtcbiAgICBpZiAoYUlzTnVtICYmIGJJc051bSkge1xuICAgICAgaWYgKG51bUEgPCBudW1CKSByZXR1cm4gLTE7XG4gICAgICBpZiAobnVtQSA+IG51bUIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gRGF0ZSBkZXRlY3Rpb246IGF0dGVtcHQgcGFyc2Ugd2hlbiBib3RoIHZhbHVlcyBhcmUgc3RyaW5ncyBhbmQgcGFyc2VhYmxlXG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRzQSA9IERhdGUucGFyc2UoYSk7XG4gICAgICBjb25zdCB0c0IgPSBEYXRlLnBhcnNlKGIpO1xuICAgICAgaWYgKCFpc05hTih0c0EpICYmICFpc05hTih0c0IpKSB7XG4gICAgICAgIGlmICh0c0EgPCB0c0IpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKHRzQSA+IHRzQikgcmV0dXJuIDE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLy8gbG9jYWxlQ29tcGFyZSwgY2FzZS1pbnNlbnNpdGl2ZVxuICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBzdHJpbmcgY29tcGFyaXNvblxuICAgIGNvbnN0IHNhID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHNiID0gU3RyaW5nKGIpO1xuICAgIHJldHVybiBzYS5sb2NhbGVDb21wYXJlKHNiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlXCI+XG4gICAgPGNxYS1mdWxsLXRhYmxlLWxvYWRlciAqbmdJZj1cInNob3dUYWJsZUxvYWRpbmdcIj48L2NxYS1mdWxsLXRhYmxlLWxvYWRlcj5cbiAgICA8Y3FhLXRhYmxlLWRhdGEtbG9hZGVyICpuZ0lmPVwic2hvd1RhYmxlRGF0YUxvYWRpbmdcIj48L2NxYS10YWJsZS1kYXRhLWxvYWRlcj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZS1pbm5lciBjcWEtdy1mdWxsXCIgW2NsYXNzLmlzLWxvYWRpbmddPVwidHJ1ZVwiPlxuICAgICAgPGNvbGdyb3VwPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWR0aCBvZiBjb21wdXRlZENvbHVtbldpZHRoczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgPGNvbCBbc3R5bGUud2lkdGhdPVwid2lkdGhcIiAvPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvY29sZ3JvdXA+XG5cbiAgICAgIDx0aGVhZCAqbmdJZj1cImRhdGE/Lmxlbmd0aFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1oZWFkZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY2VsbCBjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYmctWyNlZmYwZjddXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmZpZWxkSWQgKyAnLWNlbGwnXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gc2VsZWN0LWFsbCBmb3IgY2hlY2tib3ggY29sdW1uIHdoZW4gZW5hYmxlZCBhbmQgbm8gY3VzdG9tIGhlYWRlciB0ZW1wbGF0ZSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmZpZWxkSWQgPT09ICdjaGVja2JveCcgJiYgZW5hYmxlU2VsZWN0QWxsICYmICFnZXRIZWFkZXJUZW1wbGF0ZShjb2wuZmllbGRJZCk7IGVsc2UgaGVhZGVyVHBsT3JEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3hcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFsbCByb3dzXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVNlbGVjdGVkXCIgKGNoYW5nZSk9XCJvblNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCIgY2xhc3M9XCJoaWRkZW4tY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtbGFiZWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNoZWFkZXJUcGxPckRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKSBhcyBoZWFkZXJUcGw7IGVsc2UgZGVmYXVsdEhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuc29ydGFibGU7IGVsc2UgcGxhaW5IZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoZWFkZXItdGV4dCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTb3J0KGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidTb3J0IGJ5ICcgKyAoY29sLmZpZWxkTmFtZSB8fCBjb2wuZmllbGRJZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMi4zcHhdIGNxYS1sZWFkaW5nLVsxNy41cHhdIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtZm9udC1tZWRpdW1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmZpZWxkTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU29ydGVkQXNjKGNvbC5maWVsZElkKVwiPuKWsjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU29ydGVkRGVzYyhjb2wuZmllbGRJZClcIj7ilrw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10ZXh0XCI+e3sgY29sLmZpZWxkTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuXG4gICAgICA8dGJvZHkgY2xhc3M9XCJ0YWJsZS1ib2R5IGNxYS13LWZ1bGxcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtcm93IGNxYS1iZy1zdXJmYWNlLWRlZmF1bHQgaG92ZXI6Y3FhLWJnLXN1cmZhY2UtaG92ZXJcIiAqbmdGb3I9XCJsZXQgcm93IG9mIGNvbXB1dGVkRGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJvdz8uaXNTZWxlY3RlZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjZWxsIGNxYS1weC1bMTAuNXB4XSBjcWEtcHktWzExcHhdXCIgW25nQ2xhc3NdPVwiY29sLmZpZWxkSWQgKyAnLWNlbGwnXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gY2hlY2tib3ggY2VsbCB3aGVuIG5vIGN1c3RvbSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZElkID09PSAnY2hlY2tib3gnICYmICFnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpOyBlbHNlIHJlZ3VsYXJDZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvdz8uaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Sb3dTZWxlY3RDaGFuZ2UoJGV2ZW50LCByb3cpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmZvcl09XCIncm93LWNoZWNrYm94LScgKyByb3dJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhckNlbGw+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENlbGxUZW1wbGF0ZShjb2wuZmllbGRJZCkgYXMgY2VsbFRwbDsgZWxzZSBkZWZhdWx0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxUcGw7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvdywgcm93OiByb3csIHZhbHVlOiBnZXRDZWxsVmFsdWUocm93LCBjb2wuZmllbGRWYWx1ZSl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmZpZWxkVmFsdWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/icon";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
export class TableActionToolbarComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.selectedItems = [];
|
|
8
|
+
this.actions = [];
|
|
9
|
+
this.actionClick = new EventEmitter();
|
|
10
|
+
}
|
|
11
|
+
get hasSelection() {
|
|
12
|
+
return (this.selectedItems?.length || 0) > 0;
|
|
13
|
+
}
|
|
14
|
+
get isSingleSelection() {
|
|
15
|
+
return this.selectedItems?.length === 1;
|
|
16
|
+
}
|
|
17
|
+
get selectionLabel() {
|
|
18
|
+
const n = this.selectedItems?.length || 0;
|
|
19
|
+
return n === 1 ? '1 selected' : `${n} selected`;
|
|
20
|
+
}
|
|
21
|
+
visibleActions() {
|
|
22
|
+
const ctx = { selected: this.selectedItems || [] };
|
|
23
|
+
return (this.actions || []).filter(a => (a.show ? a.show(ctx) : true));
|
|
24
|
+
}
|
|
25
|
+
isDisabled(action) {
|
|
26
|
+
const ctx = { selected: this.selectedItems || [] };
|
|
27
|
+
return action.disabled ? !!action.disabled(ctx) : false;
|
|
28
|
+
}
|
|
29
|
+
onAction(action) {
|
|
30
|
+
if (this.isDisabled(action)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const context = { id: action.id, selected: this.selectedItems || [] };
|
|
34
|
+
if (action.onClick) {
|
|
35
|
+
action.onClick(context);
|
|
36
|
+
}
|
|
37
|
+
this.actionClick.emit(context);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
TableActionToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableActionToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
41
|
+
TableActionToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TableActionToolbarComponent, selector: "cqa-table-action-toolbar", inputs: { selectedItems: "selectedItems", actions: "actions" }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div\n class=\"action-toolbar cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-flex-wrap cqa-py-[15.5px] sm:cqa-px-[34px] cqa-px-[20px] cqa-bg-primary cqa-text-white cqa-rounded-[7px]\"\n *ngIf=\"hasSelection\">\n <div class=\"action-toolbar-left cqa-text-[14px] cqa-leading-[21px] cqa-font-medium\">\n {{ selectionLabel }}\n </div>\n <div class=\"action-toolbar-right cqa-flex cqa-items-center cqa-gap-[7px]\">\n <ng-container *ngFor=\"let action of visibleActions()\">\n <div [attr.aria-disabled]=\"isDisabled(action)\" [class.cqa-opacity-50]=\"isDisabled(action)\" [class.cqa-cursor-not-allowed]=\"isDisabled(action)\" (click)=\"!isDisabled(action) && onAction(action)\"\n class=\"cqa-flex cqa-items-center cqa-gap-[8.75px] cqa-py-[5px] cqa-px-[8.75px] cqa-cursor-pointer cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium\">\n <mat-icon class=\"!cqa-w-[16px] !cqa-h-[16px] !cqa-text-[16px]\">{{ action.icon }}</mat-icon>\n <span class=\"md:cqa-flex cqa-hidden\">{{ action.label }}</span>\n </div>\n </ng-container>\n </div>\n <!-- Forwards clicks inside toolbar without affecting outer selections -->\n </div>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableActionToolbarComponent, decorators: [{
|
|
43
|
+
type: Component,
|
|
44
|
+
args: [{ selector: 'cqa-table-action-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div\n class=\"action-toolbar cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-flex-wrap cqa-py-[15.5px] sm:cqa-px-[34px] cqa-px-[20px] cqa-bg-primary cqa-text-white cqa-rounded-[7px]\"\n *ngIf=\"hasSelection\">\n <div class=\"action-toolbar-left cqa-text-[14px] cqa-leading-[21px] cqa-font-medium\">\n {{ selectionLabel }}\n </div>\n <div class=\"action-toolbar-right cqa-flex cqa-items-center cqa-gap-[7px]\">\n <ng-container *ngFor=\"let action of visibleActions()\">\n <div [attr.aria-disabled]=\"isDisabled(action)\" [class.cqa-opacity-50]=\"isDisabled(action)\" [class.cqa-cursor-not-allowed]=\"isDisabled(action)\" (click)=\"!isDisabled(action) && onAction(action)\"\n class=\"cqa-flex cqa-items-center cqa-gap-[8.75px] cqa-py-[5px] cqa-px-[8.75px] cqa-cursor-pointer cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium\">\n <mat-icon class=\"!cqa-w-[16px] !cqa-h-[16px] !cqa-text-[16px]\">{{ action.icon }}</mat-icon>\n <span class=\"md:cqa-flex cqa-hidden\">{{ action.label }}</span>\n </div>\n </ng-container>\n </div>\n <!-- Forwards clicks inside toolbar without affecting outer selections -->\n </div>\n</div>", styles: [] }]
|
|
45
|
+
}], propDecorators: { selectedItems: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], actions: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], actionClick: [{
|
|
50
|
+
type: Output
|
|
51
|
+
}] } });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWN0aW9uLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90YWJsZS1hY3Rpb24tdG9vbGJhci90YWJsZS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlLWFjdGlvbi10b29sYmFyL3RhYmxlLWFjdGlvbi10b29sYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFrQmhHLE1BQU0sT0FBTywyQkFBMkI7SUFOeEM7UUFPVyxrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQixZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUUzQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO0tBbUM3RTtJQWpDQyxJQUFJLFlBQVk7UUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztJQUNsRCxDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbkQsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBbUI7UUFDNUIsTUFBTSxHQUFHLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFtQjtRQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBQ0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0RSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7O3dIQXRDVSwyQkFBMkI7NEdBQTNCLDJCQUEyQix5S0NsQnhDLDR0Q0FrQk07MkZEQU8sMkJBQTJCO2tCQU52QyxTQUFTOytCQUNFLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQWN0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICB0b29sdGlwPzogc3RyaW5nO1xuICBzaG93PzogKGNvbnRleHQ6IHsgc2VsZWN0ZWQ6IGFueVtdIH0pID0+IGJvb2xlYW47XG4gIGRpc2FibGVkPzogKGNvbnRleHQ6IHsgc2VsZWN0ZWQ6IGFueVtdIH0pID0+IGJvb2xlYW47XG4gIG9uQ2xpY2s/OiAoY29udGV4dDogeyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfSkgPT4gdm9pZDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRhYmxlLWFjdGlvbi10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWFjdGlvbi10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVBY3Rpb25Ub29sYmFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgYWN0aW9uczogVGFibGVBY3Rpb25bXSA9IFtdO1xuXG4gIEBPdXRwdXQoKSBhY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfT4oKTtcblxuICBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5zZWxlY3RlZEl0ZW1zPy5sZW5ndGggfHwgMCkgPiAwO1xuICB9XG5cbiAgZ2V0IGlzU2luZ2xlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXM/Lmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25MYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG4gPSB0aGlzLnNlbGVjdGVkSXRlbXM/Lmxlbmd0aCB8fCAwO1xuICAgIHJldHVybiBuID09PSAxID8gJzEgc2VsZWN0ZWQnIDogYCR7bn0gc2VsZWN0ZWRgO1xuICB9XG5cbiAgdmlzaWJsZUFjdGlvbnMoKTogVGFibGVBY3Rpb25bXSB7XG4gICAgY29uc3QgY3R4ID0geyBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZEl0ZW1zIHx8IFtdIH07XG4gICAgcmV0dXJuICh0aGlzLmFjdGlvbnMgfHwgW10pLmZpbHRlcihhID0+IChhLnNob3cgPyBhLnNob3coY3R4KSA6IHRydWUpKTtcbiAgfVxuXG4gIGlzRGlzYWJsZWQoYWN0aW9uOiBUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN0eCA9IHsgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWRJdGVtcyB8fCBbXSB9O1xuICAgIHJldHVybiBhY3Rpb24uZGlzYWJsZWQgPyAhIWFjdGlvbi5kaXNhYmxlZChjdHgpIDogZmFsc2U7XG4gIH1cblxuICBvbkFjdGlvbihhY3Rpb246IFRhYmxlQWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZChhY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB7IGlkOiBhY3Rpb24uaWQsIHNlbGVjdGVkOiB0aGlzLnNlbGVjdGVkSXRlbXMgfHwgW10gfTtcbiAgICBpZiAoYWN0aW9uLm9uQ2xpY2spIHtcbiAgICAgIGFjdGlvbi5vbkNsaWNrKGNvbnRleHQpO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbkNsaWNrLmVtaXQoY29udGV4dCk7XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiYWN0aW9uLXRvb2xiYXIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMiBjcWEtZmxleC13cmFwIGNxYS1weS1bMTUuNXB4XSBzbTpjcWEtcHgtWzM0cHhdIGNxYS1weC1bMjBweF0gY3FhLWJnLXByaW1hcnkgY3FhLXRleHQtd2hpdGUgY3FhLXJvdW5kZWQtWzdweF1cIlxuICAgICpuZ0lmPVwiaGFzU2VsZWN0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbi10b29sYmFyLWxlZnQgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMXB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgIHt7IHNlbGVjdGlvbkxhYmVsIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbi10b29sYmFyLXJpZ2h0IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bN3B4XVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHZpc2libGVBY3Rpb25zKClcIj5cbiAgICAgICAgPGRpdiBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzRGlzYWJsZWQoYWN0aW9uKVwiIFtjbGFzcy5jcWEtb3BhY2l0eS01MF09XCJpc0Rpc2FibGVkKGFjdGlvbilcIiBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJpc0Rpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwiIWlzRGlzYWJsZWQoYWN0aW9uKSAmJiBvbkFjdGlvbihhY3Rpb24pXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bOC43NXB4XSBjcWEtcHktWzVweF0gY3FhLXB4LVs4Ljc1cHhdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1bMTIuM3B4XSBjcWEtbGVhZGluZy1bMTcuNXB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctWzE2cHhdICFjcWEtaC1bMTZweF0gIWNxYS10ZXh0LVsxNnB4XVwiPnt7IGFjdGlvbi5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1kOmNxYS1mbGV4IGNxYS1oaWRkZW5cIj57eyBhY3Rpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBGb3J3YXJkcyBjbGlja3MgaW5zaWRlIHRvb2xiYXIgd2l0aG91dCBhZmZlY3Rpbmcgb3V0ZXIgc2VsZWN0aW9ucyAtLT5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class TableDataLoaderComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.label = 'Loading...';
|
|
6
|
+
this.size = 24;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
TableDataLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableDataLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
10
|
+
TableDataLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: { label: "label", size: "size" }, ngImport: i0, template: "<div class=\"loading-spinner-simple cqa-py-2 cqa-flex cqa-flex-row cqa-items-center cqa-justify-center cqa-gap-3 cqa-text-center\">\n <svg class=\"cqa-animate-spin cqa-text-primary\" [attr.width]=\"size\" [attr.height]=\"size\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"cqa-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"cqa-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"cqa-text-primary\">{{ label }}</span>\n </div>\n\n\n" });
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableDataLoaderComponent, decorators: [{
|
|
12
|
+
type: Component,
|
|
13
|
+
args: [{ selector: 'cqa-table-data-loader', template: "<div class=\"loading-spinner-simple cqa-py-2 cqa-flex cqa-flex-row cqa-items-center cqa-justify-center cqa-gap-3 cqa-text-center\">\n <svg class=\"cqa-animate-spin cqa-text-primary\" [attr.width]=\"size\" [attr.height]=\"size\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"cqa-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"cqa-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"cqa-text-primary\">{{ label }}</span>\n </div>\n\n\n", styles: [] }]
|
|
14
|
+
}], propDecorators: { label: [{
|
|
15
|
+
type: Input
|
|
16
|
+
}], size: [{
|
|
17
|
+
type: Input
|
|
18
|
+
}] } });
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1sb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90YWJsZS1kYXRhLWxvYWRlci90YWJsZS1kYXRhLWxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlLWRhdGEtbG9hZGVyL3RhYmxlLWRhdGEtbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU9qRCxNQUFNLE9BQU8sd0JBQXdCO0lBTHJDO1FBTVcsVUFBSyxHQUFXLFlBQVksQ0FBQztRQUM3QixTQUFJLEdBQVcsRUFBRSxDQUFDO0tBQzVCOztxSEFIWSx3QkFBd0I7eUdBQXhCLHdCQUF3Qix1R0NQckMsaXJCQVNBOzJGREZhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSx1QkFBdUI7OEJBS3hCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10YWJsZS1kYXRhLWxvYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1kYXRhLWxvYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVEYXRhTG9hZGVyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgc2l6ZTogbnVtYmVyID0gMjQ7XG59XG5cblxuIiwiPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lci1zaW1wbGUgY3FhLXB5LTIgY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMyBjcWEtdGV4dC1jZW50ZXJcIj5cbiAgPHN2ZyBjbGFzcz1cImNxYS1hbmltYXRlLXNwaW4gY3FhLXRleHQtcHJpbWFyeVwiIFthdHRyLndpZHRoXT1cInNpemVcIiBbYXR0ci5oZWlnaHRdPVwic2l6ZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8Y2lyY2xlIGNsYXNzPVwiY3FhLW9wYWNpdHktMjVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cbiAgICA8cGF0aCBjbGFzcz1cImNxYS1vcGFjaXR5LTc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNNCAxMmE4IDggMCAwMTgtOFYwQzUuMzczIDAgMCA1LjM3MyAwIDEyaDR6bTIgNS4yOTFBNy45NjIgNy45NjIgMCAwMTQgMTJIMGMwIDMuMDQyIDEuMTM1IDUuODI0IDMgNy45MzhsMy0yLjY0N3pcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXByaW1hcnlcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG5cblxuIl19
|