@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,37 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../button/button.component";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
export class EmptyStateComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.title = '';
|
|
8
|
+
this.description = '';
|
|
9
|
+
this.actions = [];
|
|
10
|
+
this.actionClick = new EventEmitter();
|
|
11
|
+
}
|
|
12
|
+
onActionClick(action, event) {
|
|
13
|
+
if (!action.disabled) {
|
|
14
|
+
if (action.onClick) {
|
|
15
|
+
action.onClick();
|
|
16
|
+
}
|
|
17
|
+
this.actionClick.emit(action);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
EmptyStateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: EmptyStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22
|
+
EmptyStateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: EmptyStateComponent, selector: "cqa-empty-state", inputs: { imageUrl: "imageUrl", title: "title", description: "description", actions: "actions" }, outputs: { actionClick: "actionClick" }, ngImport: i0, template: "<div id=\"cqa-ui-root\" style=\"background-color: white; border-radius: 14px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 84.63px 33px 84.62px 33px;\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[62px] cqa-items-center\">\n <!-- Icon Container -->\n <div *ngIf=\"imageUrl\" class=\"cqa-relative cqa-shrink-0 cqa-w-32 cqa-h-32\">\n <!-- Main Icon Container with Gradient Background and Shadow -->\n <div class=\"cqa-relative cqa-rounded-3xl cqa-w-32 cqa-h-32 cqa-shadow-sm\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-bg-gradient-to-br cqa-from-indigo-500 cqa-to-violet-950 cqa-rounded-3xl cqa-opacity-10\"></div>\n <!-- Icon/Image centered inside on top layer - fully opaque -->\n <div class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-rounded-3xl\">\n <div class=\"cqa-w-20 cqa-h-20 cqa-flex cqa-items-center cqa-justify-center cqa-relative\">\n <img [src]=\"imageUrl\" alt=\"\" width=\"80px\" height=\"80px\" class=\"cqa-block cqa-max-w-none cqa-w-20 cqa-h-20 cqa-object-contain\" />\n </div>\n </div>\n </div>\n <!-- Decorative Dots -->\n <div class=\"cqa-absolute cqa-rounded-full cqa-bg-primary-300 cqa-opacity-[0.815]\" style=\"left: 120.79px; top: -9.21px; width: 18.416px; height: 18.416px; z-index: 20;\"></div>\n <div class=\"cqa-absolute cqa-rounded-full cqa-bg-primary-300 cqa-opacity-[0.695]\" style=\"left: -9.02px; top: 124.98px; width: 14.044px; height: 14.044px; z-index: 20;\"></div>\n </div>\n\n <!-- Content Container -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-9 cqa-items-center\">\n <!-- Title and Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-items-center cqa-w-full\">\n <!-- Title -->\n <div *ngIf=\"title\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-w-full\">\n <h3 class=\"cqa-font-inter cqa-text-lg cqa-font-medium cqa-leading-[18px] cqa-text-center cqa-text-neutral-900\">\n {{ title }}\n </h3>\n </div>\n <!-- Description -->\n <div *ngIf=\"description\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-w-full\">\n <p class=\"cqa-font-inter cqa-font-medium cqa-text-sm cqa-leading-[14px] cqa-text-center cqa-text-neutral-500\">\n {{ description }}\n </p>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div\n *ngIf=\"actions && actions.length > 0\"\n class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [ngClass]=\"actions.length > 1 ? 'cqa-flex-row cqa-flex-wrap cqa-gap-4' : 'cqa-flex-col cqa-gap-2'\"\n >\n <cqa-button\n *ngFor=\"let action of actions\"\n [variant]=\"action.variant || 'filled'\"\n [icon]=\"action.icon\"\n [iconPosition]=\"action.iconPosition || 'start'\"\n [disabled]=\"action.disabled\"\n (clicked)=\"onActionClick(action, $event)\"\n >\n {{ action.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass"], outputs: ["clicked"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: EmptyStateComponent, decorators: [{
|
|
24
|
+
type: Component,
|
|
25
|
+
args: [{ selector: 'cqa-empty-state', template: "<div id=\"cqa-ui-root\" style=\"background-color: white; border-radius: 14px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 84.63px 33px 84.62px 33px;\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[62px] cqa-items-center\">\n <!-- Icon Container -->\n <div *ngIf=\"imageUrl\" class=\"cqa-relative cqa-shrink-0 cqa-w-32 cqa-h-32\">\n <!-- Main Icon Container with Gradient Background and Shadow -->\n <div class=\"cqa-relative cqa-rounded-3xl cqa-w-32 cqa-h-32 cqa-shadow-sm\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-bg-gradient-to-br cqa-from-indigo-500 cqa-to-violet-950 cqa-rounded-3xl cqa-opacity-10\"></div>\n <!-- Icon/Image centered inside on top layer - fully opaque -->\n <div class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-rounded-3xl\">\n <div class=\"cqa-w-20 cqa-h-20 cqa-flex cqa-items-center cqa-justify-center cqa-relative\">\n <img [src]=\"imageUrl\" alt=\"\" width=\"80px\" height=\"80px\" class=\"cqa-block cqa-max-w-none cqa-w-20 cqa-h-20 cqa-object-contain\" />\n </div>\n </div>\n </div>\n <!-- Decorative Dots -->\n <div class=\"cqa-absolute cqa-rounded-full cqa-bg-primary-300 cqa-opacity-[0.815]\" style=\"left: 120.79px; top: -9.21px; width: 18.416px; height: 18.416px; z-index: 20;\"></div>\n <div class=\"cqa-absolute cqa-rounded-full cqa-bg-primary-300 cqa-opacity-[0.695]\" style=\"left: -9.02px; top: 124.98px; width: 14.044px; height: 14.044px; z-index: 20;\"></div>\n </div>\n\n <!-- Content Container -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-9 cqa-items-center\">\n <!-- Title and Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-items-center cqa-w-full\">\n <!-- Title -->\n <div *ngIf=\"title\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-w-full\">\n <h3 class=\"cqa-font-inter cqa-text-lg cqa-font-medium cqa-leading-[18px] cqa-text-center cqa-text-neutral-900\">\n {{ title }}\n </h3>\n </div>\n <!-- Description -->\n <div *ngIf=\"description\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-w-full\">\n <p class=\"cqa-font-inter cqa-font-medium cqa-text-sm cqa-leading-[14px] cqa-text-center cqa-text-neutral-500\">\n {{ description }}\n </p>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div\n *ngIf=\"actions && actions.length > 0\"\n class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [ngClass]=\"actions.length > 1 ? 'cqa-flex-row cqa-flex-wrap cqa-gap-4' : 'cqa-flex-col cqa-gap-2'\"\n >\n <cqa-button\n *ngFor=\"let action of actions\"\n [variant]=\"action.variant || 'filled'\"\n [icon]=\"action.icon\"\n [iconPosition]=\"action.iconPosition || 'start'\"\n [disabled]=\"action.disabled\"\n (clicked)=\"onActionClick(action, $event)\"\n >\n {{ action.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
26
|
+
}], propDecorators: { imageUrl: [{
|
|
27
|
+
type: Input
|
|
28
|
+
}], title: [{
|
|
29
|
+
type: Input
|
|
30
|
+
}], description: [{
|
|
31
|
+
type: Input
|
|
32
|
+
}], actions: [{
|
|
33
|
+
type: Input
|
|
34
|
+
}], actionClick: [{
|
|
35
|
+
type: Output
|
|
36
|
+
}] } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktc3RhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFnQnZFLE1BQU0sT0FBTyxtQkFBbUI7SUFMaEM7UUFPVyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLFlBQU8sR0FBdUIsRUFBRSxDQUFDO1FBRWhDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7S0FVOUQ7SUFSQyxhQUFhLENBQUMsTUFBd0IsRUFBRSxLQUFpQjtRQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNwQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNsQjtZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQzs7Z0hBZlUsbUJBQW1CO29HQUFuQixtQkFBbUIsa01DaEJoQyx3a0dBMERBOzJGRDFDYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCOzhCQUtsQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbXB0eVN0YXRlQWN0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFyaWFudD86ICdmaWxsZWQnIHwgJ291dGxpbmVkJyB8ICd0ZXh0JyB8ICdlbGV2YXRlZCcgfCAndG9uYWwnO1xuICBpY29uPzogc3RyaW5nO1xuICBpY29uUG9zaXRpb24/OiAnc3RhcnQnIHwgJ2VuZCc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgb25DbGljaz86ICgpID0+IHZvaWQ7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1lbXB0eS1zdGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbXB0eS1zdGF0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRW1wdHlTdGF0ZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGltYWdlVXJsPzogc3RyaW5nOyAvLyBVUkwgZm9yIGltYWdlXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBhY3Rpb25zOiBFbXB0eVN0YXRlQWN0aW9uW10gPSBbXTtcblxuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEVtcHR5U3RhdGVBY3Rpb24+KCk7XG5cbiAgb25BY3Rpb25DbGljayhhY3Rpb246IEVtcHR5U3RhdGVBY3Rpb24sIGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCFhY3Rpb24uZGlzYWJsZWQpIHtcbiAgICAgIGlmIChhY3Rpb24ub25DbGljaykge1xuICAgICAgICBhY3Rpb24ub25DbGljaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3Rpb25DbGljay5lbWl0KGFjdGlvbik7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDE0cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwYWRkaW5nOiA4NC42M3B4IDMzcHggODQuNjJweCAzM3B4O1wiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzYycHhdIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICA8IS0tIEljb24gQ29udGFpbmVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpbWFnZVVybFwiIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1zaHJpbmstMCBjcWEtdy0zMiBjcWEtaC0zMlwiPlxuICAgICAgPCEtLSBNYWluIEljb24gQ29udGFpbmVyIHdpdGggR3JhZGllbnQgQmFja2dyb3VuZCBhbmQgU2hhZG93IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtcm91bmRlZC0zeGwgY3FhLXctMzIgY3FhLWgtMzIgY3FhLXNoYWRvdy1zbVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1ncmFkaWVudC10by1iciBjcWEtZnJvbS1pbmRpZ28tNTAwIGNxYS10by12aW9sZXQtOTUwIGNxYS1yb3VuZGVkLTN4bCBjcWEtb3BhY2l0eS0xMFwiPjwvZGl2PlxuICAgICAgICA8IS0tIEljb24vSW1hZ2UgY2VudGVyZWQgaW5zaWRlIG9uIHRvcCBsYXllciAtIGZ1bGx5IG9wYXF1ZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC0zeGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctMjAgY3FhLWgtMjAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmxcIiBhbHQ9XCJcIiB3aWR0aD1cIjgwcHhcIiBoZWlnaHQ9XCI4MHB4XCIgY2xhc3M9XCJjcWEtYmxvY2sgY3FhLW1heC13LW5vbmUgY3FhLXctMjAgY3FhLWgtMjAgY3FhLW9iamVjdC1jb250YWluXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gRGVjb3JhdGl2ZSBEb3RzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1wcmltYXJ5LTMwMCBjcWEtb3BhY2l0eS1bMC44MTVdXCIgc3R5bGU9XCJsZWZ0OiAxMjAuNzlweDsgdG9wOiAtOS4yMXB4OyB3aWR0aDogMTguNDE2cHg7IGhlaWdodDogMTguNDE2cHg7IHotaW5kZXg6IDIwO1wiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1wcmltYXJ5LTMwMCBjcWEtb3BhY2l0eS1bMC42OTVdXCIgc3R5bGU9XCJsZWZ0OiAtOS4wMnB4OyB0b3A6IDEyNC45OHB4OyB3aWR0aDogMTQuMDQ0cHg7IGhlaWdodDogMTQuMDQ0cHg7IHotaW5kZXg6IDIwO1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250ZW50IENvbnRhaW5lciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtOSBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICA8IS0tIFRpdGxlIGFuZCBEZXNjcmlwdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICA8IS0tIFRpdGxlIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidGl0bGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1sZyBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1uZXV0cmFsLTkwMFwiPlxuICAgICAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgICAgICA8L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtZm9udC1pbnRlciBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE0cHhdIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1uZXV0cmFsLTUwMFwiPlxuICAgICAgICAgICAge3sgZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9ucy5sZW5ndGggPiAxID8gJ2NxYS1mbGV4LXJvdyBjcWEtZmxleC13cmFwIGNxYS1nYXAtNCcgOiAnY3FhLWZsZXgtY29sIGNxYS1nYXAtMidcIlxuICAgICAgPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiYWN0aW9uLnZhcmlhbnQgfHwgJ2ZpbGxlZCdcIlxuICAgICAgICAgIFtpY29uXT1cImFjdGlvbi5pY29uXCJcbiAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cImFjdGlvbi5pY29uUG9zaXRpb24gfHwgJ3N0YXJ0J1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwib25BY3Rpb25DbGljayhhY3Rpb24sICRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "../../dynamic-select/dynamic-select-field.component";
|
|
6
|
+
import * as i3 from "@angular/material/form-field";
|
|
7
|
+
import * as i4 from "@angular/material/datepicker";
|
|
8
|
+
import * as i5 from "@angular/material/button";
|
|
9
|
+
import * as i6 from "@angular/common";
|
|
10
|
+
export class DynamicFilterComponent {
|
|
11
|
+
constructor(fb) {
|
|
12
|
+
this.fb = fb;
|
|
13
|
+
this.config = [];
|
|
14
|
+
this.model = {};
|
|
15
|
+
this.showFilterPanel = true;
|
|
16
|
+
this.filtersApplied = new EventEmitter();
|
|
17
|
+
this.filtersChanged = new EventEmitter();
|
|
18
|
+
this.resetAction = new EventEmitter();
|
|
19
|
+
this.form = this.fb.group({});
|
|
20
|
+
this.maxDate = new Date();
|
|
21
|
+
this.searchTextByKey = {};
|
|
22
|
+
this.selectOutsideCleanup = new Map();
|
|
23
|
+
}
|
|
24
|
+
ngOnChanges(changes) {
|
|
25
|
+
if (changes['config'] || changes['model']) {
|
|
26
|
+
this.buildForm();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
onDateChange(event, key) {
|
|
30
|
+
const formGroup = this.getDateGroup(key);
|
|
31
|
+
const start = formGroup.get('start')?.value;
|
|
32
|
+
const end = formGroup.get('end')?.value;
|
|
33
|
+
// When both dates are selected, auto-apply
|
|
34
|
+
// if (start && end) {
|
|
35
|
+
// this.applyDateRange(key, { start, end });
|
|
36
|
+
// }
|
|
37
|
+
}
|
|
38
|
+
buildForm() {
|
|
39
|
+
const ctrls = {};
|
|
40
|
+
(this.config || []).forEach(c => {
|
|
41
|
+
if (c.hidden)
|
|
42
|
+
return;
|
|
43
|
+
if (c.type === 'date-range') {
|
|
44
|
+
ctrls[c.key] = this.fb.group({ start: new FormControl(), end: new FormControl() });
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const initial = this.model?.[c.key];
|
|
48
|
+
if (c.multiple) {
|
|
49
|
+
const value = Array.isArray(initial) ? initial : (initial != null ? [initial] : []);
|
|
50
|
+
ctrls[c.key] = new FormControl(value);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
ctrls[c.key] = new FormControl(Array.isArray(initial) ? (initial.length ? initial[0] : undefined) : initial);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
this.form = this.fb.group(ctrls);
|
|
58
|
+
this.form.valueChanges.subscribe(() => this.filtersChanged.emit(this.serialize()));
|
|
59
|
+
}
|
|
60
|
+
onSelectOpenedChange(opened, select) {
|
|
61
|
+
if (opened) {
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
const onDocDown = (e) => {
|
|
64
|
+
const panel = document.querySelector('.cdk-overlay-pane .mat-select-panel');
|
|
65
|
+
const target = e.target;
|
|
66
|
+
const originEl = select?._elementRef?.nativeElement || null;
|
|
67
|
+
const insidePanel = !!(panel && target && panel.contains(target));
|
|
68
|
+
const insideOrigin = !!(originEl && target && originEl.contains(target));
|
|
69
|
+
if (!insidePanel && !insideOrigin) {
|
|
70
|
+
select.close();
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
document.addEventListener('mousedown', onDocDown, true);
|
|
74
|
+
this.selectOutsideCleanup.set(select, () => document.removeEventListener('mousedown', onDocDown, true));
|
|
75
|
+
}, 0);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const cleanup = this.selectOutsideCleanup.get(select);
|
|
79
|
+
if (cleanup)
|
|
80
|
+
cleanup();
|
|
81
|
+
this.selectOutsideCleanup.delete(select);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
onSearch(key, text) {
|
|
85
|
+
this.searchTextByKey[key] = (text || '').toLowerCase();
|
|
86
|
+
}
|
|
87
|
+
filteredOptions(item) {
|
|
88
|
+
const options = item?.options || [];
|
|
89
|
+
const q = (this.searchTextByKey[item.key] || '').trim();
|
|
90
|
+
if (!q)
|
|
91
|
+
return options;
|
|
92
|
+
return options.filter(opt => {
|
|
93
|
+
const name = (opt.name ?? opt.label ?? String(opt.value ?? '')).toLowerCase();
|
|
94
|
+
return name.includes(q);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
getDateGroup(key) {
|
|
98
|
+
return this.form.get(key);
|
|
99
|
+
}
|
|
100
|
+
getSelectConfig(item) {
|
|
101
|
+
return {
|
|
102
|
+
key: item.key,
|
|
103
|
+
label: item.label,
|
|
104
|
+
placeholder: item.placeholder,
|
|
105
|
+
disabled: item.disabled,
|
|
106
|
+
multiple: item.multiple,
|
|
107
|
+
searchable: item.searchable,
|
|
108
|
+
options: item.options || []
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
apply() {
|
|
112
|
+
this.filtersApplied.emit(this.serialize());
|
|
113
|
+
}
|
|
114
|
+
reset() {
|
|
115
|
+
Object.keys(this.form.controls).forEach(key => {
|
|
116
|
+
const ctrl = this.form.get(key);
|
|
117
|
+
if (ctrl instanceof FormGroup) {
|
|
118
|
+
ctrl.get('start')?.setValue(undefined);
|
|
119
|
+
ctrl.get('end')?.setValue(undefined);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
ctrl?.setValue(undefined);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
this.resetAction.emit();
|
|
126
|
+
this.filtersChanged.emit(this.serialize());
|
|
127
|
+
}
|
|
128
|
+
serialize() {
|
|
129
|
+
const result = {};
|
|
130
|
+
(this.config || []).forEach(c => {
|
|
131
|
+
const ctrl = this.form.get(c.key);
|
|
132
|
+
if (!ctrl)
|
|
133
|
+
return;
|
|
134
|
+
let val = ctrl instanceof FormGroup ? ctrl.getRawValue() : ctrl.value;
|
|
135
|
+
if (c.type === 'date-range') {
|
|
136
|
+
const start = val?.start;
|
|
137
|
+
const end = val?.end;
|
|
138
|
+
if (start || end)
|
|
139
|
+
result[c.key] = { start, end };
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (val !== undefined && val !== null && (Array.isArray(val) ? val.length > 0 : val !== '')) {
|
|
143
|
+
result[c.key] = val;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
// Mat date range picker overlay preset helpers
|
|
150
|
+
applyPresetToGroup(key, presetKey) {
|
|
151
|
+
const dateGroup = this.getDateGroup(key);
|
|
152
|
+
if (!dateGroup)
|
|
153
|
+
return;
|
|
154
|
+
const { start, end } = this.getPresetDates(presetKey);
|
|
155
|
+
dateGroup.patchValue({ start, end });
|
|
156
|
+
this.filtersChanged.emit(this.serialize());
|
|
157
|
+
}
|
|
158
|
+
getPresetDates(presetKey) {
|
|
159
|
+
const today = new Date();
|
|
160
|
+
const clampToEndOfToday = (d) => { const nd = new Date(d); nd.setHours(23, 59, 59, 999); return nd; };
|
|
161
|
+
switch (presetKey) {
|
|
162
|
+
case 'today':
|
|
163
|
+
return { start: today, end: today };
|
|
164
|
+
case 'last7days': {
|
|
165
|
+
const start = new Date();
|
|
166
|
+
start.setDate(start.getDate() - 6);
|
|
167
|
+
return { start, end: today };
|
|
168
|
+
}
|
|
169
|
+
case 'last30days': {
|
|
170
|
+
const start = new Date();
|
|
171
|
+
start.setDate(start.getDate() - 29);
|
|
172
|
+
return { start, end: today };
|
|
173
|
+
}
|
|
174
|
+
case 'last90days': {
|
|
175
|
+
const start = new Date();
|
|
176
|
+
start.setDate(start.getDate() - 89);
|
|
177
|
+
return { start, end: today };
|
|
178
|
+
}
|
|
179
|
+
case 'thismonth': {
|
|
180
|
+
const start = new Date(today.getFullYear(), today.getMonth(), 1);
|
|
181
|
+
return { start, end: today };
|
|
182
|
+
}
|
|
183
|
+
case 'lastmonth': {
|
|
184
|
+
const start = new Date(today.getFullYear(), today.getMonth() - 1, 1);
|
|
185
|
+
const end = new Date(today.getFullYear(), today.getMonth(), 0);
|
|
186
|
+
return { start, end: clampToEndOfToday(end) };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
getDateValidationError(key) {
|
|
191
|
+
const dateGroup = this.getDateGroup(key);
|
|
192
|
+
if (!dateGroup)
|
|
193
|
+
return null;
|
|
194
|
+
const startCtrl = dateGroup.controls['start'];
|
|
195
|
+
const endCtrl = dateGroup.controls['end'];
|
|
196
|
+
const startVal = startCtrl?.value;
|
|
197
|
+
const endVal = endCtrl?.value;
|
|
198
|
+
const startParseErr = startCtrl?.errors?.['matDatepickerParse']?.text;
|
|
199
|
+
const endParseErr = endCtrl?.errors?.['matDatepickerParse']?.text;
|
|
200
|
+
if (!startVal && !endVal && !startParseErr && !endParseErr)
|
|
201
|
+
return null;
|
|
202
|
+
if (startParseErr)
|
|
203
|
+
return `Invalid start date format`;
|
|
204
|
+
if (endParseErr)
|
|
205
|
+
return `Invalid end date format`;
|
|
206
|
+
if (startVal && !endVal)
|
|
207
|
+
return `Please select an end date`;
|
|
208
|
+
if (!startVal && endVal)
|
|
209
|
+
return `Please select a start date`;
|
|
210
|
+
if (dateGroup.hasError('matStartDateInvalid'))
|
|
211
|
+
return `Start date must be before end date`;
|
|
212
|
+
if (dateGroup.hasError('matEndDateInvalid'))
|
|
213
|
+
return `End date must be after start date`;
|
|
214
|
+
if (dateGroup.invalid) {
|
|
215
|
+
const config = this.config?.find(c => c.key === key);
|
|
216
|
+
return config ? `${config.label} is invalid` : 'Date range is invalid';
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
DynamicFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicFilterComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
222
|
+
DynamicFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicFilterComponent, selector: "cqa-dynamic-filter", inputs: { config: "config", model: "model", showFilterPanel: "showFilterPanel" }, outputs: { filtersApplied: "filtersApplied", filtersChanged: "filtersChanged", resetAction: "resetAction" }, usesOnChanges: true, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-filter cqa-mb-[28px]\" *ngIf=\"showFilterPanel\">\n <form class=\"ts-form cqa-grid lg:cqa-grid-cols-4 md:cqa-grid-cols-2 cqa-gap-4\" [formGroup]=\"form\"\n (keydown.enter)=\"(false)\" novalidate=\"novalidate\">\n <ng-container *ngFor=\"let c of config\">\n <ng-container *ngIf=\"!c.hidden\">\n <div class=\"form-group cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Select -->\n <ng-container *ngIf=\"c.type === 'select'\">\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(c)\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Date Range --> \n <ng-container *ngIf=\"c.type === 'date-range'\">\n <label\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4]\">{{\n c.label }}</label>\n <mat-form-field class=\"mat-date-custom\" appearance=\"fill\">\n <mat-date-range-input [rangePicker]=\"picker\" [formGroup]=\"getDateGroup(c.key)\" [max]=\"maxDate\">\n <input matStartDate formControlName=\"start\" placeholder=\"Start date\" [max]=\"maxDate\" required\n [readonly]=\"true\" (focus)=\"picker.open()\" (click)=\"picker.open()\" />\n <input matEndDate formControlName=\"end\" placeholder=\"End date\" [max]=\"maxDate\" required\n [readonly]=\"true\" (focus)=\"picker.open()\" (click)=\"picker.open()\" />\n </mat-date-range-input>\n <mat-date-range-picker #picker (dateChange)=\"onDateChange($event, c.key)\"\n [panelClass]=\"'ctc-date-range-panel'\">\n <mat-datepicker-actions>\n <div class=\"ctc-date-presets\">\n <div class=\"cqa-mb-2 cqa-font-medium\">Quick Presets</div>\n <div class=\"btn-group\">\n <button type=\"button\" class=\"preset-btn today\"\n (click)=\"applyPresetToGroup(c.key, 'today'); picker.close()\">Today</button>\n <button type=\"button\" class=\"preset-btn last7days\"\n (click)=\"applyPresetToGroup(c.key, 'last7days'); picker.close()\">Last 7 days</button>\n <button type=\"button\" class=\"preset-btn last30days\"\n (click)=\"applyPresetToGroup(c.key, 'last30days'); picker.close()\">Last 30 days</button>\n <button type=\"button\" class=\"preset-btn last90days\"\n (click)=\"applyPresetToGroup(c.key, 'last90days'); picker.close()\">Last 90 days</button>\n <button type=\"button\" class=\"preset-btn thismonth\"\n (click)=\"applyPresetToGroup(c.key, 'thismonth'); picker.close()\">This month</button>\n <button type=\"button\" class=\"preset-btn lastmonth\"\n (click)=\"applyPresetToGroup(c.key, 'lastmonth'); picker.close()\">Last month</button>\n </div>\n </div>\n <div class=\"cqa-font-medium cqa-mb-2 cqa-mt-[10px] cqa-w-full\">Custom Range</div>\n <button\n class=\"cqa-font-medium !cqa-mb-2 !cqa-mt-[10px] cqa-w-[calc(100%-32px)] !cqa-absolute cqa-bottom-[2px]\"\n mat-flat-button color=\"primary\" matDatepickerApply>Apply</button>\n </mat-datepicker-actions>\n </mat-date-range-picker>\n <div (click)=\"picker.open()\" class=\"cqa-cursor-pointer\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33398 1.33203V3.9987\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M10.666 1.33203V3.9987\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M12.6667 2.66797H3.33333C2.59695 2.66797 2 3.26492 2 4.0013V13.3346C2 14.071 2.59695 14.668 3.33333 14.668H12.6667C13.403 14.668 14 14.071 14 13.3346V4.0013C14 3.26492 13.403 2.66797 12.6667 2.66797Z\"\n stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 6.66797H14\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n <!-- Specific validation messages -->\n <mat-error *ngIf=\"getDateValidationError(c.key) && !picker.opened\">\n {{ getDateValidationError(c.key) }}\n </mat-error>\n\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </form>\n\n <div class=\"cqa-flex cqa-justify-end cqa-items-stretch cqa-gap-2 cqa-mt-4\">\n <button type=\"button\"\n class=\"cqa-text-[13.33px] cqa-leading-[1] cqa-flex cqa-flex-row cqa-justify-center cqa-items-center cqa-px-[11px] cqa-py-[1px] cqa-gap-[14px] cqa-h-8 cqa-border cqa-border-[#0B0B0C] cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-rounded-lg cqa-text-[#0B0B0C]\"\n (click)=\"reset()\">Reset</button>\n <button type=\"button\"\n class=\"cqa-text-[13.33px] cqa-leading-[1] cqa-flex cqa-flex-row cqa-justify-center cqa-items-center cqa-px-[11px] cqa-py-[1px] cqa-gap-[14px] cqa-h-8 cqa-bg-[#0B0B0C] cqa-border cqa-border-[#E5E5E5] cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-rounded-lg cqa-text-white\"\n (click)=\"apply()\">Apply Filter</button>\n </div>\n </div>\n</div>", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"] }, { type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i4.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { type: i4.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { type: i4.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { type: i4.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { type: i3.MatError, selector: "mat-error", inputs: ["id"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
223
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicFilterComponent, decorators: [{
|
|
224
|
+
type: Component,
|
|
225
|
+
args: [{ selector: 'cqa-dynamic-filter', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-filter cqa-mb-[28px]\" *ngIf=\"showFilterPanel\">\n <form class=\"ts-form cqa-grid lg:cqa-grid-cols-4 md:cqa-grid-cols-2 cqa-gap-4\" [formGroup]=\"form\"\n (keydown.enter)=\"(false)\" novalidate=\"novalidate\">\n <ng-container *ngFor=\"let c of config\">\n <ng-container *ngIf=\"!c.hidden\">\n <div class=\"form-group cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Select -->\n <ng-container *ngIf=\"c.type === 'select'\">\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(c)\"></cqa-dynamic-select>\n </ng-container>\n\n <!-- Date Range --> \n <ng-container *ngIf=\"c.type === 'date-range'\">\n <label\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4]\">{{\n c.label }}</label>\n <mat-form-field class=\"mat-date-custom\" appearance=\"fill\">\n <mat-date-range-input [rangePicker]=\"picker\" [formGroup]=\"getDateGroup(c.key)\" [max]=\"maxDate\">\n <input matStartDate formControlName=\"start\" placeholder=\"Start date\" [max]=\"maxDate\" required\n [readonly]=\"true\" (focus)=\"picker.open()\" (click)=\"picker.open()\" />\n <input matEndDate formControlName=\"end\" placeholder=\"End date\" [max]=\"maxDate\" required\n [readonly]=\"true\" (focus)=\"picker.open()\" (click)=\"picker.open()\" />\n </mat-date-range-input>\n <mat-date-range-picker #picker (dateChange)=\"onDateChange($event, c.key)\"\n [panelClass]=\"'ctc-date-range-panel'\">\n <mat-datepicker-actions>\n <div class=\"ctc-date-presets\">\n <div class=\"cqa-mb-2 cqa-font-medium\">Quick Presets</div>\n <div class=\"btn-group\">\n <button type=\"button\" class=\"preset-btn today\"\n (click)=\"applyPresetToGroup(c.key, 'today'); picker.close()\">Today</button>\n <button type=\"button\" class=\"preset-btn last7days\"\n (click)=\"applyPresetToGroup(c.key, 'last7days'); picker.close()\">Last 7 days</button>\n <button type=\"button\" class=\"preset-btn last30days\"\n (click)=\"applyPresetToGroup(c.key, 'last30days'); picker.close()\">Last 30 days</button>\n <button type=\"button\" class=\"preset-btn last90days\"\n (click)=\"applyPresetToGroup(c.key, 'last90days'); picker.close()\">Last 90 days</button>\n <button type=\"button\" class=\"preset-btn thismonth\"\n (click)=\"applyPresetToGroup(c.key, 'thismonth'); picker.close()\">This month</button>\n <button type=\"button\" class=\"preset-btn lastmonth\"\n (click)=\"applyPresetToGroup(c.key, 'lastmonth'); picker.close()\">Last month</button>\n </div>\n </div>\n <div class=\"cqa-font-medium cqa-mb-2 cqa-mt-[10px] cqa-w-full\">Custom Range</div>\n <button\n class=\"cqa-font-medium !cqa-mb-2 !cqa-mt-[10px] cqa-w-[calc(100%-32px)] !cqa-absolute cqa-bottom-[2px]\"\n mat-flat-button color=\"primary\" matDatepickerApply>Apply</button>\n </mat-datepicker-actions>\n </mat-date-range-picker>\n <div (click)=\"picker.open()\" class=\"cqa-cursor-pointer\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33398 1.33203V3.9987\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M10.666 1.33203V3.9987\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M12.6667 2.66797H3.33333C2.59695 2.66797 2 3.26492 2 4.0013V13.3346C2 14.071 2.59695 14.668 3.33333 14.668H12.6667C13.403 14.668 14 14.071 14 13.3346V4.0013C14 3.26492 13.403 2.66797 12.6667 2.66797Z\"\n stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M2 6.66797H14\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n <!-- Specific validation messages -->\n <mat-error *ngIf=\"getDateValidationError(c.key) && !picker.opened\">\n {{ getDateValidationError(c.key) }}\n </mat-error>\n\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </form>\n\n <div class=\"cqa-flex cqa-justify-end cqa-items-stretch cqa-gap-2 cqa-mt-4\">\n <button type=\"button\"\n class=\"cqa-text-[13.33px] cqa-leading-[1] cqa-flex cqa-flex-row cqa-justify-center cqa-items-center cqa-px-[11px] cqa-py-[1px] cqa-gap-[14px] cqa-h-8 cqa-border cqa-border-[#0B0B0C] cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-rounded-lg cqa-text-[#0B0B0C]\"\n (click)=\"reset()\">Reset</button>\n <button type=\"button\"\n class=\"cqa-text-[13.33px] cqa-leading-[1] cqa-flex cqa-flex-row cqa-justify-center cqa-items-center cqa-px-[11px] cqa-py-[1px] cqa-gap-[14px] cqa-h-8 cqa-bg-[#0B0B0C] cqa-border cqa-border-[#E5E5E5] cqa-shadow-[0_1px_2px_rgba(0,0,0,0.05)] cqa-rounded-lg cqa-text-white\"\n (click)=\"apply()\">Apply Filter</button>\n </div>\n </div>\n</div>", styles: [] }]
|
|
226
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { config: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], model: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], showFilterPanel: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], filtersApplied: [{
|
|
233
|
+
type: Output
|
|
234
|
+
}], filtersChanged: [{
|
|
235
|
+
type: Output
|
|
236
|
+
}], resetAction: [{
|
|
237
|
+
type: Output
|
|
238
|
+
}] } });
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9maWx0ZXJzL2R5bmFtaWMtZmlsdGVyL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZmlsdGVycy9keW5hbWljLWZpbHRlci9keW5hbWljLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMxSCxPQUFPLEVBQWUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQWtDckUsTUFBTSxPQUFPLHNCQUFzQjtJQWFqQyxZQUE2QixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQVpuQyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUNqQyxVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUNoQyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUMvQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3pELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFDekQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRWpELFNBQUksR0FBYyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQyxZQUFPLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixvQkFBZSxHQUEyQixFQUFFLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFFWCxDQUFDO0lBRWhELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFP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dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxudHlwZSBGaWx0ZXJUeXBlID0gJ3NlbGVjdCcgfCAnZGF0ZS1yYW5nZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY0ZpbHRlck9wdGlvbiB7XG4gIGlkPzogbnVtYmVyIHwgc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICB2YWx1ZT86IGFueTtcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY0ZpbHRlckl0ZW0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdHlwZTogRmlsdGVyVHlwZTtcbiAga2V5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBEeW5hbWljRmlsdGVyT3B0aW9uW107XG4gIG11bHRpcGxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBoaWRkZW4/OiBib29sZWFuO1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljRmlsdGVyVmFsdWVzIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZHluYW1pYy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZHluYW1pYy1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnOiBEeW5hbWljRmlsdGVySXRlbVtdID0gW107XG4gIEBJbnB1dCgpIG1vZGVsOiBEeW5hbWljRmlsdGVyVmFsdWVzID0ge307XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJQYW5lbDogYm9vbGVhbiA9IHRydWU7XG4gIEBPdXRwdXQoKSBmaWx0ZXJzQXBwbGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0ZpbHRlclZhbHVlcz4oKTtcbiAgQE91dHB1dCgpIGZpbHRlcnNDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRmlsdGVyVmFsdWVzPigpO1xuICBAT3V0cHV0KCkgcmVzZXRBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybTogRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIG1heERhdGUgPSBuZXcgRGF0ZSgpO1xuICBzZWFyY2hUZXh0QnlLZXk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBzZWxlY3RPdXRzaWRlQ2xlYW51cCA9IG5ldyBNYXA8YW55LCAoKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gfHwgY2hhbmdlc1snbW9kZWwnXSkge1xuICAgICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVDaGFuZ2UoZXZlbnQ6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmdldERhdGVHcm91cChrZXkpO1xuICAgIGNvbnN0IHN0YXJ0ID0gZm9ybUdyb3VwLmdldCgnc3RhcnQnKT8udmFsdWU7XG4gICAgY29uc3QgZW5kID0gZm9ybUdyb3VwLmdldCgnZW5kJyk/LnZhbHVlO1xuXG4gICAgLy8gV2hlbiBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZCwgYXV0by1hcHBseVxuICAgIC8vIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAvLyAgIHRoaXMuYXBwbHlEYXRlUmFuZ2Uoa2V5LCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm0oKTogdm9pZCB7XG4gICAgY29uc3QgY3RybHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAodGhpcy5jb25maWcgfHwgW10pLmZvckVhY2goYyA9PiB7XG4gICAgICBpZiAoYy5oaWRkZW4pIHJldHVybjtcbiAgICAgIGlmIChjLnR5cGUgPT09ICdkYXRlLXJhbmdlJykge1xuICAgICAgICBjdHJsc1tjLmtleV0gPSB0aGlzLmZiLmdyb3VwKHsgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbCgpLCBlbmQ6IG5ldyBGb3JtQ29udHJvbCgpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IHRoaXMubW9kZWw/LltjLmtleV07XG4gICAgICAgIGlmIChjLm11bHRpcGxlKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KGluaXRpYWwpID8gaW5pdGlhbCA6IChpbml0aWFsICE9IG51bGwgPyBbaW5pdGlhbF0gOiBbXSk7XG4gICAgICAgICAgY3RybHNbYy5rZXldID0gbmV3IEZvcm1Db250cm9sKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHJsc1tjLmtleV0gPSBuZXcgRm9ybUNvbnRyb2woQXJyYXkuaXNBcnJheShpbml0aWFsKSA/IChpbml0aWFsLmxlbmd0aCA/IGluaXRpYWxbMF0gOiB1bmRlZmluZWQpIDogaW5pdGlhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGN0cmxzKTtcbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmZpbHRlcnNDaGFuZ2VkLmVtaXQodGhpcy5zZXJpYWxpemUoKSkpO1xuICB9XG5cbiAgb25TZWxlY3RPcGVuZWRDaGFuZ2Uob3BlbmVkOiBib29sZWFuLCBzZWxlY3Q6IGFueSk6IHZvaWQge1xuICAgIGlmIChvcGVuZWQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvbkRvY0Rvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNkay1vdmVybGF5LXBhbmUgLm1hdC1zZWxlY3QtcGFuZWwnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgTm9kZSB8IG51bGw7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luRWwgPSAoc2VsZWN0Py5fZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkgfHwgbnVsbDtcbiAgICAgICAgICBjb25zdCBpbnNpZGVQYW5lbCA9ICEhKHBhbmVsICYmIHRhcmdldCAmJiBwYW5lbC5jb250YWlucyh0YXJnZXQpKTtcbiAgICAgICAgICBjb25zdCBpbnNpZGVPcmlnaW4gPSAhIShvcmlnaW5FbCAmJiB0YXJnZXQgJiYgb3JpZ2luRWwuY29udGFpbnModGFyZ2V0KSk7XG4gICAgICAgICAgaWYgKCFpbnNpZGVQYW5lbCAmJiAhaW5zaWRlT3JpZ2luKSB7XG4gICAgICAgICAgICBzZWxlY3QuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG9jRG93biwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0T3V0c2lkZUNsZWFudXAuc2V0KHNlbGVjdCwgKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Eb2NEb3duLCB0cnVlKSk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMuc2VsZWN0T3V0c2lkZUNsZWFudXAuZ2V0KHNlbGVjdCk7XG4gICAgICBpZiAoY2xlYW51cCkgY2xlYW51cCgpO1xuICAgICAgdGhpcy5zZWxlY3RPdXRzaWRlQ2xlYW51cC5kZWxldGUoc2VsZWN0KTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaChrZXk6IHN0cmluZywgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9ICh0ZXh0IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZmlsdGVyZWRPcHRpb25zKGl0ZW06IER5bmFtaWNGaWx0ZXJJdGVtKTogRHluYW1pY0ZpbHRlck9wdGlvbltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gaXRlbT8ub3B0aW9ucyB8fCBbXTtcbiAgICBjb25zdCBxID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2l0ZW0ua2V5XSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghcSkgcmV0dXJuIG9wdGlvbnM7XG4gICAgcmV0dXJuIG9wdGlvbnMuZmlsdGVyKG9wdCA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gKG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBTdHJpbmcob3B0LnZhbHVlID8/ICcnKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBuYW1lLmluY2x1ZGVzKHEpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF0ZUdyb3VwKGtleTogc3RyaW5nKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldChrZXkpIGFzIEZvcm1Hcm91cDtcbiAgfVxuXG4gIGdldFNlbGVjdENvbmZpZyhpdGVtOiBEeW5hbWljRmlsdGVySXRlbSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgIHBsYWNlaG9sZGVyOiBpdGVtLnBsYWNlaG9sZGVyLFxuICAgICAgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQsXG4gICAgICBtdWx0aXBsZTogaXRlbS5tdWx0aXBsZSxcbiAgICAgIHNlYXJjaGFibGU6IGl0ZW0uc2VhcmNoYWJsZSxcbiAgICAgIG9wdGlvbnM6IGl0ZW0ub3B0aW9ucyB8fCBbXVxuICAgIH07XG4gIH1cblxuICBhcHBseSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQodGhpcy5zZXJpYWxpemUoKSk7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgICBpZiAoY3RybCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICBjdHJsLmdldCgnc3RhcnQnKT8uc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgY3RybC5nZXQoJ2VuZCcpPy5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3RybD8uc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlc2V0QWN0aW9uLmVtaXQoKTtcbiAgICB0aGlzLmZpbHRlcnNDaGFuZ2VkLmVtaXQodGhpcy5zZXJpYWxpemUoKSk7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZSgpOiBEeW5hbWljRmlsdGVyVmFsdWVzIHtcbiAgICBjb25zdCByZXN1bHQ6IER5bmFtaWNGaWx0ZXJWYWx1ZXMgPSB7fTtcbiAgICAodGhpcy5jb25maWcgfHwgW10pLmZvckVhY2goYyA9PiB7XG4gICAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtLmdldChjLmtleSk7XG4gICAgICBpZiAoIWN0cmwpIHJldHVybjtcbiAgICAgIGxldCB2YWw6IGFueSA9IGN0cmwgaW5zdGFuY2VvZiBGb3JtR3JvdXAgPyAoY3RybCBhcyBGb3JtR3JvdXApLmdldFJhd1ZhbHVlKCkgOiBjdHJsLnZhbHVlO1xuICAgICAgaWYgKGMudHlwZSA9PT0gJ2RhdGUtcmFuZ2UnKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdmFsPy5zdGFydDsgY29uc3QgZW5kID0gdmFsPy5lbmQ7XG4gICAgICAgIGlmIChzdGFydCB8fCBlbmQpIHJlc3VsdFtjLmtleV0gPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwgJiYgKEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbC5sZW5ndGggPiAwIDogdmFsICE9PSAnJykpIHtcbiAgICAgICAgICByZXN1bHRbYy5rZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIE1hdCBkYXRlIHJhbmdlIHBpY2tlciBvdmVybGF5IHByZXNldCBoZWxwZXJzXG4gIGFwcGx5UHJlc2V0VG9Hcm91cChrZXk6IHN0cmluZywgcHJlc2V0S2V5OiAndG9kYXknIHwgJ2xhc3Q3ZGF5cycgfCAnbGFzdDMwZGF5cycgfCAnbGFzdDkwZGF5cycgfCAndGhpc21vbnRoJyB8ICdsYXN0bW9udGgnKTogdm9pZCB7XG4gICAgY29uc3QgZGF0ZUdyb3VwID0gdGhpcy5nZXREYXRlR3JvdXAoa2V5KTtcbiAgICBpZiAoIWRhdGVHcm91cCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5nZXRQcmVzZXREYXRlcyhwcmVzZXRLZXkpO1xuICAgIGRhdGVHcm91cC5wYXRjaFZhbHVlKHsgc3RhcnQsIGVuZCB9KTtcbiAgICB0aGlzLmZpbHRlcnNDaGFuZ2VkLmVtaXQodGhpcy5zZXJpYWxpemUoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXNldERhdGVzKHByZXNldEtleTogJ3RvZGF5JyB8ICdsYXN0N2RheXMnIHwgJ2xhc3QzMGRheXMnIHwgJ2xhc3Q5MGRheXMnIHwgJ3RoaXNtb250aCcgfCAnbGFzdG1vbnRoJyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgY2xhbXBUb0VuZE9mVG9kYXkgPSAoZDogRGF0ZSkgPT4geyBjb25zdCBuZCA9IG5ldyBEYXRlKGQpOyBuZC5zZXRIb3VycygyMyw1OSw1OSw5OTkpOyByZXR1cm4gbmQ7IH07XG4gICAgc3dpdGNoIChwcmVzZXRLZXkpIHtcbiAgICAgIGNhc2UgJ3RvZGF5JzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHRvZGF5LCBlbmQ6IHRvZGF5IH07XG4gICAgICBjYXNlICdsYXN0N2RheXMnOiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTsgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgLSA2KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZDogdG9kYXkgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3QzMGRheXMnOiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTsgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgLSAyOSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQ6IHRvZGF5IH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0OTBkYXlzJzoge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7IHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gODkpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kOiB0b2RheSB9O1xuICAgICAgfVxuICAgICAgY2FzZSAndGhpc21vbnRoJzoge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kOiB0b2RheSB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdG1vbnRoJzoge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgMCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQ6IGNsYW1wVG9FbmRPZlRvZGF5KGVuZCkgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0RGF0ZVZhbGlkYXRpb25FcnJvcihrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVHcm91cCA9IHRoaXMuZ2V0RGF0ZUdyb3VwKGtleSk7XG4gICAgaWYgKCFkYXRlR3JvdXApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgc3RhcnRDdHJsID0gZGF0ZUdyb3VwLmNvbnRyb2xzWydzdGFydCddO1xuICAgIGNvbnN0IGVuZEN0cmwgPSBkYXRlR3JvdXAuY29udHJvbHNbJ2VuZCddO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gc3RhcnRDdHJsPy52YWx1ZTtcbiAgICBjb25zdCBlbmRWYWwgPSBlbmRDdHJsPy52YWx1ZTtcbiAgICBjb25zdCBzdGFydFBhcnNlRXJyID0gc3RhcnRDdHJsPy5lcnJvcnM/LlsnbWF0RGF0ZXBpY2tlclBhcnNlJ10/LnRleHQ7XG4gICAgY29uc3QgZW5kUGFyc2VFcnIgPSBlbmRDdHJsPy5lcnJvcnM/LlsnbWF0RGF0ZXBpY2tlclBhcnNlJ10/LnRleHQ7XG5cbiAgICBpZiAoIXN0YXJ0VmFsICYmICFlbmRWYWwgJiYgIXN0YXJ0UGFyc2VFcnIgJiYgIWVuZFBhcnNlRXJyKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChzdGFydFBhcnNlRXJyKSByZXR1cm4gYEludmFsaWQgc3RhcnQgZGF0ZSBmb3JtYXRgO1xuICAgIGlmIChlbmRQYXJzZUVycikgcmV0dXJuIGBJbnZhbGlkIGVuZCBkYXRlIGZvcm1hdGA7XG5cbiAgICBpZiAoc3RhcnRWYWwgJiYgIWVuZFZhbCkgcmV0dXJuIGBQbGVhc2Ugc2VsZWN0IGFuIGVuZCBkYXRlYDtcbiAgICBpZiAoIXN0YXJ0VmFsICYmIGVuZFZhbCkgcmV0dXJuIGBQbGVhc2Ugc2VsZWN0IGEgc3RhcnQgZGF0ZWA7XG5cbiAgICBpZiAoZGF0ZUdyb3VwLmhhc0Vycm9yKCdtYXRTdGFydERhdGVJbnZhbGlkJykpIHJldHVybiBgU3RhcnQgZGF0ZSBtdXN0IGJlIGJlZm9yZSBlbmQgZGF0ZWA7XG4gICAgaWYgKGRhdGVHcm91cC5oYXNFcnJvcignbWF0RW5kRGF0ZUludmFsaWQnKSkgcmV0dXJuIGBFbmQgZGF0ZSBtdXN0IGJlIGFmdGVyIHN0YXJ0IGRhdGVgO1xuXG4gICAgaWYgKGRhdGVHcm91cC5pbnZhbGlkKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZz8uZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgICAgcmV0dXJuIGNvbmZpZyA/IGAke2NvbmZpZy5sYWJlbH0gaXMgaW52YWxpZGAgOiAnRGF0ZSByYW5nZSBpcyBpbnZhbGlkJztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBEeW5hbWljIERhdGUgUGlja2VyIEludGVncmF0aW9uIE1ldGhvZHMgcmVtb3ZlZCAoY29tcG9uZW50IG5vIGxvbmdlciB1c2VkKVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZpbHRlciBjcWEtbWItWzI4cHhdXCIgKm5nSWY9XCJzaG93RmlsdGVyUGFuZWxcIj5cbiAgICA8Zm9ybSBjbGFzcz1cInRzLWZvcm0gY3FhLWdyaWQgbGc6Y3FhLWdyaWQtY29scy00IG1kOmNxYS1ncmlkLWNvbHMtMiBjcWEtZ2FwLTRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwiKGZhbHNlKVwiIG5vdmFsaWRhdGU9XCJub3ZhbGlkYXRlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGNvbmZpZ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWMuaGlkZGVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPCEtLSBTZWxlY3QgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYy50eXBlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhjKVwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gRGF0ZSBSYW5nZSAtLT4gXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYy50eXBlID09PSAnZGF0ZS1yYW5nZSdcIj5cbiAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWxhYmVsIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1ibG9jayBjcWEtbGVhZGluZy1bMS40XVwiPnt7XG4gICAgICAgICAgICAgICAgYy5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1kYXRlLWN1c3RvbVwiIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlLXJhbmdlLWlucHV0IFtyYW5nZVBpY2tlcl09XCJwaWNrZXJcIiBbZm9ybUdyb3VwXT1cImdldERhdGVHcm91cChjLmtleSlcIiBbbWF4XT1cIm1heERhdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRTdGFydERhdGUgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnRcIiBwbGFjZWhvbGRlcj1cIlN0YXJ0IGRhdGVcIiBbbWF4XT1cIm1heERhdGVcIiByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiIChmb2N1cyk9XCJwaWNrZXIub3BlbigpXCIgKGNsaWNrKT1cInBpY2tlci5vcGVuKClcIiAvPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdEVuZERhdGUgZm9ybUNvbnRyb2xOYW1lPVwiZW5kXCIgcGxhY2Vob2xkZXI9XCJFbmQgZGF0ZVwiIFttYXhdPVwibWF4RGF0ZVwiIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCIgKGZvY3VzKT1cInBpY2tlci5vcGVuKClcIiAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiIC8+XG4gICAgICAgICAgICAgICAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyICNwaWNrZXIgKGRhdGVDaGFuZ2UpPVwib25EYXRlQ2hhbmdlKCRldmVudCwgYy5rZXkpXCJcbiAgICAgICAgICAgICAgICAgIFtwYW5lbENsYXNzXT1cIidjdGMtZGF0ZS1yYW5nZS1wYW5lbCdcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci1hY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3RjLWRhdGUtcHJlc2V0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItMiBjcWEtZm9udC1tZWRpdW1cIj5RdWljayBQcmVzZXRzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuIHRvZGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0VG9Hcm91cChjLmtleSwgJ3RvZGF5Jyk7IHBpY2tlci5jbG9zZSgpXCI+VG9kYXk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0biBsYXN0N2RheXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXRUb0dyb3VwKGMua2V5LCAnbGFzdDdkYXlzJyk7IHBpY2tlci5jbG9zZSgpXCI+TGFzdCA3IGRheXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0biBsYXN0MzBkYXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0VG9Hcm91cChjLmtleSwgJ2xhc3QzMGRheXMnKTsgcGlja2VyLmNsb3NlKClcIj5MYXN0IDMwIGRheXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0biBsYXN0OTBkYXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0VG9Hcm91cChjLmtleSwgJ2xhc3Q5MGRheXMnKTsgcGlja2VyLmNsb3NlKClcIj5MYXN0IDkwIGRheXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0biB0aGlzbW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXRUb0dyb3VwKGMua2V5LCAndGhpc21vbnRoJyk7IHBpY2tlci5jbG9zZSgpXCI+VGhpcyBtb250aDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuIGxhc3Rtb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldFRvR3JvdXAoYy5rZXksICdsYXN0bW9udGgnKTsgcGlja2VyLmNsb3NlKClcIj5MYXN0IG1vbnRoPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS1tYi0yIGNxYS1tdC1bMTBweF0gY3FhLXctZnVsbFwiPkN1c3RvbSBSYW5nZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gIWNxYS1tYi0yICFjcWEtbXQtWzEwcHhdIGNxYS13LVtjYWxjKDEwMCUtMzJweCldICFjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1bMnB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdERhdGVwaWNrZXJBcHBseT5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci1hY3Rpb25zPlxuICAgICAgICAgICAgICAgIDwvbWF0LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInBpY2tlci5vcGVuKClcIiBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS4zMzM5OCAxLjMzMjAzVjMuOTk4N1wiIHN0cm9rZT1cIiMwQTBBMEFcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjY2NiAxLjMzMjAzVjMuOTk4N1wiIHN0cm9rZT1cIiMwQTBBMEFcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNjY2NyAyLjY2Nzk3SDMuMzMzMzNDMi41OTY5NSAyLjY2Nzk3IDIgMy4yNjQ5MiAyIDQuMDAxM1YxMy4zMzQ2QzIgMTQuMDcxIDIuNTk2OTUgMTQuNjY4IDMuMzMzMzMgMTQuNjY4SDEyLjY2NjdDMTMuNDAzIDE0LjY2OCAxNCAxNC4wNzEgMTQgMTMuMzM0NlY0LjAwMTNDMTQgMy4yNjQ5MiAxMy40MDMgMi42Njc5NyAxMi42NjY3IDIuNjY3OTdaXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMEEwQTBBXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiA2LjY2Nzk3SDE0XCIgc3Ryb2tlPVwiIzBBMEEwQVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPCEtLSBTcGVjaWZpYyB2YWxpZGF0aW9uIG1lc3NhZ2VzIC0tPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ2V0RGF0ZVZhbGlkYXRpb25FcnJvcihjLmtleSkgJiYgIXBpY2tlci5vcGVuZWRcIj5cbiAgICAgICAgICAgICAgICB7eyBnZXREYXRlVmFsaWRhdGlvbkVycm9yKGMua2V5KSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9mb3JtPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtZ2FwLTIgY3FhLW10LTRcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzEzLjMzcHhdIGNxYS1sZWFkaW5nLVsxXSBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LVsxMXB4XSBjcWEtcHktWzFweF0gY3FhLWdhcC1bMTRweF0gY3FhLWgtOCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyMwQjBCMENdIGNxYS1zaGFkb3ctWzBfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMDUpXSBjcWEtcm91bmRlZC1sZyBjcWEtdGV4dC1bIzBCMEIwQ11cIlxuICAgICAgICAoY2xpY2spPVwicmVzZXQoKVwiPlJlc2V0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsxMy4zM3B4XSBjcWEtbGVhZGluZy1bMV0gY3FhLWZsZXggY3FhLWZsZXgtcm93IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyIGNxYS1weC1bMTFweF0gY3FhLXB5LVsxcHhdIGNxYS1nYXAtWzE0cHhdIGNxYS1oLTggY3FhLWJnLVsjMEIwQjBDXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1zaGFkb3ctWzBfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMDUpXSBjcWEtcm91bmRlZC1sZyBjcWEtdGV4dC13aGl0ZVwiXG4gICAgICAgIChjbGljayk9XCJhcHBseSgpXCI+QXBwbHkgRmlsdGVyPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class FullTableLoaderComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.label = 'Loading...';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
FullTableLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FullTableLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9
|
+
FullTableLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: { label: "label" }, ngImport: i0, template: "<div\n class=\"table-loading-overlay cqa-absolute cqa-top-0 cqa-bottom-0 cqa-left-0 cqa-right-0 cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-z-[1000]\">\n <div\n class=\"blur-backdrop cqa-absolute cqa-top-0 cqa-bottom-0 cqa-left-0 cqa-right-0 cqa-bg-white/70 cqa-backdrop-blur-[4px] cqa-z-[1]\">\n </div>\n <div\n class=\"loading-spinner cqa-flex cqa-flex-row cqa-items-center cqa-justify-center cqa-gap-3 cqa-text-center cqa-relative cqa-z-20 cqa-bg-white cqa-py-4 cqa-px-6 cqa-rounded-xl cqa-shadow-lg\">\n <svg class=\"cqa-animate-spin cqa-text-primary\" width=\"32\" height=\"32\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n 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\"\n 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\">\n </path>\n </svg>\n <span class=\"cqa-text-primary\">{{ label }}</span>\n </div>\n</div>\n\n\n" });
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FullTableLoaderComponent, decorators: [{
|
|
11
|
+
type: Component,
|
|
12
|
+
args: [{ selector: 'cqa-full-table-loader', template: "<div\n class=\"table-loading-overlay cqa-absolute cqa-top-0 cqa-bottom-0 cqa-left-0 cqa-right-0 cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-z-[1000]\">\n <div\n class=\"blur-backdrop cqa-absolute cqa-top-0 cqa-bottom-0 cqa-left-0 cqa-right-0 cqa-bg-white/70 cqa-backdrop-blur-[4px] cqa-z-[1]\">\n </div>\n <div\n class=\"loading-spinner cqa-flex cqa-flex-row cqa-items-center cqa-justify-center cqa-gap-3 cqa-text-center cqa-relative cqa-z-20 cqa-bg-white cqa-py-4 cqa-px-6 cqa-rounded-xl cqa-shadow-lg\">\n <svg class=\"cqa-animate-spin cqa-text-primary\" width=\"32\" height=\"32\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n 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\"\n 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\">\n </path>\n </svg>\n <span class=\"cqa-text-primary\">{{ label }}</span>\n </div>\n</div>\n\n\n", styles: [] }]
|
|
13
|
+
}], propDecorators: { label: [{
|
|
14
|
+
type: Input
|
|
15
|
+
}] } });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbC10YWJsZS1sb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9mdWxsLXRhYmxlLWxvYWRlci9mdWxsLXRhYmxlLWxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Z1bGwtdGFibGUtbG9hZGVyL2Z1bGwtdGFibGUtbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU9qRCxNQUFNLE9BQU8sd0JBQXdCO0lBTHJDO1FBTVcsVUFBSyxHQUFXLFlBQVksQ0FBQztLQUN2Qzs7cUhBRlksd0JBQXdCO3lHQUF4Qix3QkFBd0IseUZDUHJDLG9tQ0FtQkE7MkZEWmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHVCQUF1Qjs4QkFLeEIsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZnVsbC10YWJsZS1sb2FkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZnVsbC10YWJsZS1sb2FkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIEZ1bGxUYWJsZUxvYWRlckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnTG9hZGluZy4uLic7XG59XG5cblxuIiwiPGRpdlxuICBjbGFzcz1cInRhYmxlLWxvYWRpbmctb3ZlcmxheSBjcWEtYWJzb2x1dGUgY3FhLXRvcC0wIGNxYS1ib3R0b20tMCBjcWEtbGVmdC0wIGNxYS1yaWdodC0wIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei1bMTAwMF1cIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiYmx1ci1iYWNrZHJvcCBjcWEtYWJzb2x1dGUgY3FhLXRvcC0wIGNxYS1ib3R0b20tMCBjcWEtbGVmdC0wIGNxYS1yaWdodC0wIGNxYS1iZy13aGl0ZS83MCBjcWEtYmFja2Ryb3AtYmx1ci1bNHB4XSBjcWEtei1bMV1cIj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxvYWRpbmctc3Bpbm5lciBjcWEtZmxleCBjcWEtZmxleC1yb3cgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWNlbnRlciBjcWEtcmVsYXRpdmUgY3FhLXotMjAgY3FhLWJnLXdoaXRlIGNxYS1weS00IGNxYS1weC02IGNxYS1yb3VuZGVkLXhsIGNxYS1zaGFkb3ctbGdcIj5cbiAgICA8c3ZnIGNsYXNzPVwiY3FhLWFuaW1hdGUtc3BpbiBjcWEtdGV4dC1wcmltYXJ5XCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCJcbiAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgIDxjaXJjbGUgY2xhc3M9XCJjcWEtb3BhY2l0eS0yNVwiIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxuICAgICAgPHBhdGggY2xhc3M9XCJjcWEtb3BhY2l0eS03NVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICBkPVwiTTQgMTJhOCA4IDAgMDE4LThWMEM1LjM3MyAwIDAgNS4zNzMgMCAxMmg0em0yIDUuMjkxQTcuOTYyIDcuOTYyIDAgMDE0IDEySDBjMCAzLjA0MiAxLjEzNSA1LjgyNCAzIDcuOTM4bDMtMi42NDd6XCI+XG4gICAgICA8L3BhdGg+XG4gICAgPC9zdmc+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuIl19
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/tooltip";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
export class InlineSortComponent {
|
|
6
|
+
get getToolTip() {
|
|
7
|
+
if (this.ascending == true)
|
|
8
|
+
return this.heading?.includes('created_at') ? 'message.common.sort_by.old' : 'message.common.sort_by.ascending';
|
|
9
|
+
else if (this.ascending == false)
|
|
10
|
+
return this.heading?.includes('created_at') ? 'message.common.sort_by.new' : 'message.common.sort_by.descending';
|
|
11
|
+
else
|
|
12
|
+
return 'message.common.sort';
|
|
13
|
+
}
|
|
14
|
+
ngOnChanges() {
|
|
15
|
+
if (this.ascending != undefined) {
|
|
16
|
+
this.tooltipDiv?.hide();
|
|
17
|
+
this.tooltipDiv?.show(200);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
InlineSortComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: InlineSortComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22
|
+
InlineSortComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: InlineSortComponent, selector: "app-inline-sort, cqa-inline-sort", inputs: { ascending: "ascending", heading: "heading" }, viewQueries: [{ propertyName: "tooltipDiv", first: true, predicate: ["tooltipDiv"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
23
|
+
<div #tooltipDiv="matTooltip"
|
|
24
|
+
class="w-fit-content sort-header"
|
|
25
|
+
[matTooltip]="getToolTip"
|
|
26
|
+
[matTooltipPosition]="'after'">
|
|
27
|
+
<span>{{ heading }}</span>
|
|
28
|
+
<span *ngIf="ascending" class='fa-down-sort'></span>
|
|
29
|
+
<span *ngIf="ascending==false" class='fa-up-sort'></span>
|
|
30
|
+
<span *ngIf="ascending==undefined" class='fa-down-sort opaque-50'></span>
|
|
31
|
+
</div>
|
|
32
|
+
`, isInline: true, directives: [{ type: i1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: InlineSortComponent, decorators: [{
|
|
34
|
+
type: Component,
|
|
35
|
+
args: [{
|
|
36
|
+
selector: 'app-inline-sort, cqa-inline-sort',
|
|
37
|
+
template: `
|
|
38
|
+
<div #tooltipDiv="matTooltip"
|
|
39
|
+
class="w-fit-content sort-header"
|
|
40
|
+
[matTooltip]="getToolTip"
|
|
41
|
+
[matTooltipPosition]="'after'">
|
|
42
|
+
<span>{{ heading }}</span>
|
|
43
|
+
<span *ngIf="ascending" class='fa-down-sort'></span>
|
|
44
|
+
<span *ngIf="ascending==false" class='fa-up-sort'></span>
|
|
45
|
+
<span *ngIf="ascending==undefined" class='fa-down-sort opaque-50'></span>
|
|
46
|
+
</div>
|
|
47
|
+
`,
|
|
48
|
+
styles: []
|
|
49
|
+
}]
|
|
50
|
+
}], propDecorators: { ascending: [{
|
|
51
|
+
type: Input
|
|
52
|
+
}], heading: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], tooltipDiv: [{
|
|
55
|
+
type: ViewChild,
|
|
56
|
+
args: ['tooltipDiv']
|
|
57
|
+
}] } });
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLXNvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbmxpbmUtc29ydC9pbmxpbmUtc29ydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7O0FBbUIxRCxNQUFNLE9BQU8sbUJBQW1CO0lBTTlCLElBQUksVUFBVTtRQUNaLElBQUcsSUFBSSxDQUFDLFNBQVMsSUFBRSxJQUFJO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUEsQ0FBQyxDQUFBLDRCQUE0QixDQUFBLENBQUMsQ0FBQSxrQ0FBa0MsQ0FBQzthQUN6RyxJQUFHLElBQUksQ0FBQyxTQUFTLElBQUUsS0FBSztZQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBLENBQUMsQ0FBQSw0QkFBNEIsQ0FBQSxDQUFDLENBQUEsbUNBQW1DLENBQUM7O1lBRTdHLE9BQU8scUJBQXFCLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFHLElBQUksQ0FBQyxTQUFTLElBQUUsU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUE7WUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDOztnSEFwQlUsbUJBQW1CO29HQUFuQixtQkFBbUIsK1BBZHBCOzs7Ozs7Ozs7O0dBVVQ7MkZBSVUsbUJBQW1CO2tCQWhCL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0NBQWtDO29CQUM1QyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7R0FVVDtvQkFDRCxNQUFNLEVBQUUsRUFDUDtpQkFDRjs4QkFFVSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDa0IsVUFBVTtzQkFBakMsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRUb29sdGlwfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaW5saW5lLXNvcnQsIGNxYS1pbmxpbmUtc29ydCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAjdG9vbHRpcERpdj1cIm1hdFRvb2x0aXBcIlxuICAgICAgICAgY2xhc3M9XCJ3LWZpdC1jb250ZW50IHNvcnQtaGVhZGVyXCJcbiAgICAgICAgIFttYXRUb29sdGlwXT1cImdldFRvb2xUaXBcIlxuICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWZ0ZXInXCI+XG4gICAgICA8c3Bhbj57eyBoZWFkaW5nIH19PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJhc2NlbmRpbmdcIiBjbGFzcz0nZmEtZG93bi1zb3J0Jz48L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cImFzY2VuZGluZz09ZmFsc2VcIiBjbGFzcz0nZmEtdXAtc29ydCc+PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJhc2NlbmRpbmc9PXVuZGVmaW5lZFwiIGNsYXNzPSdmYS1kb3duLXNvcnQgb3BhcXVlLTUwJz48L3NwYW4+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIElubGluZVNvcnRDb21wb25lbnR7XG4gIEBJbnB1dCgpIGFzY2VuZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGhlYWRpbmc/OiBzdHJpbmc7XG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXBEaXYnKXRvb2x0aXBEaXY/OiBNYXRUb29sdGlwO1xuICB0b29sVGlwOiBhbnk7XG5cbiAgZ2V0IGdldFRvb2xUaXAoKXtcbiAgICBpZih0aGlzLmFzY2VuZGluZz09dHJ1ZSlcbiAgICAgIHJldHVybiB0aGlzLmhlYWRpbmc/LmluY2x1ZGVzKCdjcmVhdGVkX2F0Jyk/J21lc3NhZ2UuY29tbW9uLnNvcnRfYnkub2xkJzonbWVzc2FnZS5jb21tb24uc29ydF9ieS5hc2NlbmRpbmcnO1xuICAgIGVsc2UgaWYodGhpcy5hc2NlbmRpbmc9PWZhbHNlKVxuICAgICAgcmV0dXJuIHRoaXMuaGVhZGluZz8uaW5jbHVkZXMoJ2NyZWF0ZWRfYXQnKT8nbWVzc2FnZS5jb21tb24uc29ydF9ieS5uZXcnOidtZXNzYWdlLmNvbW1vbi5zb3J0X2J5LmRlc2NlbmRpbmcnO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAnbWVzc2FnZS5jb21tb24uc29ydCc7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZih0aGlzLmFzY2VuZGluZyE9dW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRvb2x0aXBEaXY/LmhpZGUoKVxuICAgICAgdGhpcy50b29sdGlwRGl2Py5zaG93KDIwMCk7XG4gICAgfVxuICB9XG5cbn1cblxuXG5cbiJdfQ==
|
|
@@ -0,0 +1,76 @@
|
|
|
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 OtherButtonComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
// Single button API (backwards compatible)
|
|
8
|
+
this.icon = '';
|
|
9
|
+
this.label = '';
|
|
10
|
+
this.classes = '';
|
|
11
|
+
this.colorClass = '';
|
|
12
|
+
this.buttonClass = '';
|
|
13
|
+
this.disabled = false;
|
|
14
|
+
this.type = 'button';
|
|
15
|
+
// Group buttons API (new)
|
|
16
|
+
this.buttons = null;
|
|
17
|
+
/** Extra classes for the button group container */
|
|
18
|
+
this.groupClass = '';
|
|
19
|
+
/** Gap utility class; defaults to Tailwind spacing applied in template */
|
|
20
|
+
this.gapClass = 'cqa-gap-2';
|
|
21
|
+
/** When true, allows wrapping to next line on smaller screens */
|
|
22
|
+
this.wrap = true;
|
|
23
|
+
this.clicked = new EventEmitter();
|
|
24
|
+
/** Emits the config of the clicked button in a group, along with the event */
|
|
25
|
+
this.buttonClick = new EventEmitter();
|
|
26
|
+
}
|
|
27
|
+
onClick(event) {
|
|
28
|
+
if (this.disabled) {
|
|
29
|
+
event.preventDefault();
|
|
30
|
+
event.stopPropagation();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.clicked.emit(event);
|
|
34
|
+
}
|
|
35
|
+
onItemClick(event, item) {
|
|
36
|
+
if (item?.disabled) {
|
|
37
|
+
event.preventDefault();
|
|
38
|
+
event.stopPropagation();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.buttonClick.emit({ event, item });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
OtherButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: OtherButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
45
|
+
OtherButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: OtherButtonComponent, selector: "cqa-other-button", inputs: { icon: "icon", label: "label", classes: "classes", colorClass: "colorClass", buttonClass: "buttonClass", disabled: "disabled", type: "type", buttons: "buttons", groupClass: "groupClass", gapClass: "gapClass", wrap: "wrap" }, outputs: { clicked: "clicked", buttonClick: "buttonClick" }, ngImport: i0, template: "<div id=\"cqa-ui-root\" >\n <!-- Group rendering if buttons are provided -->\n <ng-container *ngIf=\"buttons?.length; else singleButton\">\n <div class=\"cqa-inline-flex cqa-items-center\" [ngClass]=\"[wrap ? 'cqa-flex-wrap' : '', gapClass, groupClass]\">\n <button *ngFor=\"let b of buttons\"\n [type]=\"b.type || 'button'\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-[5.75px] cqa-px-[11.5px] cqa-rounded-[5px] cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium cqa-border\"\n [ngClass]=\"[b.classes || classes, buttonClass, b.colorClass || colorClass]\"\n [disabled]=\"b.disabled\"\n (click)=\"onItemClick($event, b)\">\n <mat-icon *ngIf=\"b.icon || icon\" class=\"!cqa-w-[16px] !cqa-h-[16px] !cqa-text-[16px]\">{{ b.icon || icon }}</mat-icon>\n <span>{{ b.label }}</span>\n </button>\n </div>\n </ng-container>\n\n <!-- Single button (backwards compatible) -->\n <ng-template #singleButton>\n <button [type]=\"type\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-[5.75px] cqa-px-[11.5px] cqa-rounded-[5px] cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium cqa-border\"\n [ngClass]=\"[classes, buttonClass, colorClass]\" [disabled]=\"disabled\" (click)=\"onClick($event)\">\n <mat-icon *ngIf=\"icon\" class=\"!cqa-w-[16px] !cqa-h-[16px] !cqa-text-[16px]\">{{ icon }}</mat-icon>\n <span>{{ label }}</span>\n </button>\n </ng-template>\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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: OtherButtonComponent, decorators: [{
|
|
47
|
+
type: Component,
|
|
48
|
+
args: [{ selector: 'cqa-other-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\" >\n <!-- Group rendering if buttons are provided -->\n <ng-container *ngIf=\"buttons?.length; else singleButton\">\n <div class=\"cqa-inline-flex cqa-items-center\" [ngClass]=\"[wrap ? 'cqa-flex-wrap' : '', gapClass, groupClass]\">\n <button *ngFor=\"let b of buttons\"\n [type]=\"b.type || 'button'\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-[5.75px] cqa-px-[11.5px] cqa-rounded-[5px] cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium cqa-border\"\n [ngClass]=\"[b.classes || classes, buttonClass, b.colorClass || colorClass]\"\n [disabled]=\"b.disabled\"\n (click)=\"onItemClick($event, b)\">\n <mat-icon *ngIf=\"b.icon || icon\" class=\"!cqa-w-[16px] !cqa-h-[16px] !cqa-text-[16px]\">{{ b.icon || icon }}</mat-icon>\n <span>{{ b.label }}</span>\n </button>\n </div>\n </ng-container>\n\n <!-- Single button (backwards compatible) -->\n <ng-template #singleButton>\n <button [type]=\"type\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-py-[5.75px] cqa-px-[11.5px] cqa-rounded-[5px] cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium cqa-border\"\n [ngClass]=\"[classes, buttonClass, colorClass]\" [disabled]=\"disabled\" (click)=\"onClick($event)\">\n <mat-icon *ngIf=\"icon\" class=\"!cqa-w-[16px] !cqa-h-[16px] !cqa-text-[16px]\">{{ icon }}</mat-icon>\n <span>{{ label }}</span>\n </button>\n </ng-template>\n</div>", styles: [] }]
|
|
49
|
+
}], propDecorators: { icon: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], label: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}], classes: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], colorClass: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], buttonClass: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], disabled: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], type: [{
|
|
62
|
+
type: Input
|
|
63
|
+
}], buttons: [{
|
|
64
|
+
type: Input
|
|
65
|
+
}], groupClass: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}], gapClass: [{
|
|
68
|
+
type: Input
|
|
69
|
+
}], wrap: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}], clicked: [{
|
|
72
|
+
type: Output
|
|
73
|
+
}], buttonClick: [{
|
|
74
|
+
type: Output
|
|
75
|
+
}] } });
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RoZXItYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvb3RoZXItYnV0dG9uL290aGVyLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL290aGVyLWJ1dHRvbi9vdGhlci1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQWtCaEcsTUFBTSxPQUFPLG9CQUFvQjtJQU5qQztRQU9FLDJDQUEyQztRQUNsQyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsWUFBTyxHQUFnRCxFQUFFLENBQUM7UUFDMUQsZUFBVSxHQUFnRCxFQUFFLENBQUM7UUFDN0QsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixTQUFJLEdBQWtDLFFBQVEsQ0FBQztRQUV4RCwwQkFBMEI7UUFDakIsWUFBTyxHQUE2QixJQUFJLENBQUM7UUFDbEQsbURBQW1EO1FBQzFDLGVBQVUsR0FBZ0QsRUFBRSxDQUFDO1FBQ3RFLDBFQUEwRTtRQUNqRSxhQUFRLEdBQVcsV0FBVyxDQUFDO1FBQ3hDLGlFQUFpRTtRQUN4RCxTQUFJLEdBQVksSUFBSSxDQUFDO1FBRXBCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ25ELDhFQUE4RTtRQUNwRSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFnRCxDQUFDO0tBbUIxRjtJQWpCQyxPQUFPLENBQUMsS0FBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQixFQUFFLElBQXFCO1FBQ2xELElBQUksSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNsQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7aUhBdkNVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLCtWQ2xCakMsMDhDQXlCTTsyRkRQTyxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFSSxPQUFPO3NCQUFoQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBPdGhlckJ1dHRvbkl0ZW0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBjbGFzc2VzPzogc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgY29sb3JDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdHlwZT86ICdidXR0b24nIHwgJ3N1Ym1pdCcgfCAncmVzZXQnO1xuICB2YWx1ZT86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLW90aGVyLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vdGhlci1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBPdGhlckJ1dHRvbkNvbXBvbmVudCB7XG4gIC8vIFNpbmdsZSBidXR0b24gQVBJIChiYWNrd2FyZHMgY29tcGF0aWJsZSlcbiAgQElucHV0KCkgaWNvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY2xhc3Nlczogc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9ICcnO1xuICBASW5wdXQoKSBjb2xvckNsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gJyc7XG4gIEBJbnB1dCgpIGJ1dHRvbkNsYXNzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdHlwZTogJ2J1dHRvbicgfCAnc3VibWl0JyB8ICdyZXNldCcgPSAnYnV0dG9uJztcblxuICAvLyBHcm91cCBidXR0b25zIEFQSSAobmV3KVxuICBASW5wdXQoKSBidXR0b25zOiBPdGhlckJ1dHRvbkl0ZW1bXSB8IG51bGwgPSBudWxsO1xuICAvKiogRXh0cmEgY2xhc3NlcyBmb3IgdGhlIGJ1dHRvbiBncm91cCBjb250YWluZXIgKi9cbiAgQElucHV0KCkgZ3JvdXBDbGFzczogc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9ICcnO1xuICAvKiogR2FwIHV0aWxpdHkgY2xhc3M7IGRlZmF1bHRzIHRvIFRhaWx3aW5kIHNwYWNpbmcgYXBwbGllZCBpbiB0ZW1wbGF0ZSAqL1xuICBASW5wdXQoKSBnYXBDbGFzczogc3RyaW5nID0gJ2NxYS1nYXAtMic7XG4gIC8qKiBXaGVuIHRydWUsIGFsbG93cyB3cmFwcGluZyB0byBuZXh0IGxpbmUgb24gc21hbGxlciBzY3JlZW5zICovXG4gIEBJbnB1dCgpIHdyYXA6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICAvKiogRW1pdHMgdGhlIGNvbmZpZyBvZiB0aGUgY2xpY2tlZCBidXR0b24gaW4gYSBncm91cCwgYWxvbmcgd2l0aCB0aGUgZXZlbnQgKi9cbiAgQE91dHB1dCgpIGJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyBpdGVtOiBPdGhlckJ1dHRvbkl0ZW0gfT4oKTtcblxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbGlja2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25JdGVtQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IE90aGVyQnV0dG9uSXRlbSk6IHZvaWQge1xuICAgIGlmIChpdGVtPy5kaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoeyBldmVudCwgaXRlbSB9KTtcbiAgfVxufVxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIiA+XG4gIDwhLS0gR3JvdXAgcmVuZGVyaW5nIGlmIGJ1dHRvbnMgYXJlIHByb3ZpZGVkIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnV0dG9ucz8ubGVuZ3RoOyBlbHNlIHNpbmdsZUJ1dHRvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiIFtuZ0NsYXNzXT1cIlt3cmFwID8gJ2NxYS1mbGV4LXdyYXAnIDogJycsIGdhcENsYXNzLCBncm91cENsYXNzXVwiPlxuICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgYiBvZiBidXR0b25zXCJcbiAgICAgICAgW3R5cGVdPVwiYi50eXBlIHx8ICdidXR0b24nXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LVs1Ljc1cHhdIGNxYS1weC1bMTEuNXB4XSBjcWEtcm91bmRlZC1bNXB4XSBjcWEtdGV4dC1bMTIuM3B4XSBjcWEtbGVhZGluZy1bMTcuNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJvcmRlclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIltiLmNsYXNzZXMgfHwgY2xhc3NlcywgYnV0dG9uQ2xhc3MsIGIuY29sb3JDbGFzcyB8fCBjb2xvckNsYXNzXVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJiLmRpc2FibGVkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKCRldmVudCwgYilcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiYi5pY29uIHx8IGljb25cIiBjbGFzcz1cIiFjcWEtdy1bMTZweF0gIWNxYS1oLVsxNnB4XSAhY3FhLXRleHQtWzE2cHhdXCI+e3sgYi5pY29uIHx8IGljb24gfX08L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBiLmxhYmVsIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gU2luZ2xlIGJ1dHRvbiAoYmFja3dhcmRzIGNvbXBhdGlibGUpIC0tPlxuICA8bmctdGVtcGxhdGUgI3NpbmdsZUJ1dHRvbj5cbiAgICA8YnV0dG9uIFt0eXBlXT1cInR5cGVcIlxuICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXB5LVs1Ljc1cHhdIGNxYS1weC1bMTEuNXB4XSBjcWEtcm91bmRlZC1bNXB4XSBjcWEtdGV4dC1bMTIuM3B4XSBjcWEtbGVhZGluZy1bMTcuNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJvcmRlclwiXG4gICAgICBbbmdDbGFzc109XCJbY2xhc3NlcywgYnV0dG9uQ2xhc3MsIGNvbG9yQ2xhc3NdXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgPG1hdC1pY29uICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwiIWNxYS13LVsxNnB4XSAhY3FhLWgtWzE2cHhdICFjcWEtdGV4dC1bMTZweF1cIj57eyBpY29uIH19PC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+Il19
|