@cqa-lib/cqa-ui 1.1.4 → 1.1.6
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/badge/badge.component.mjs +19 -5
- package/esm2020/lib/compare-runs/compare-runs.component.mjs +5 -7
- package/esm2020/lib/configuration-card/configuration-card.component.mjs +3 -3
- package/esm2020/lib/custom-input/custom-input.component.mjs +137 -0
- package/esm2020/lib/failed-step-card/failed-step-card.component.mjs +45 -0
- package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +174 -0
- package/esm2020/lib/run-history-card/run-history-card.component.mjs +5 -4
- package/esm2020/lib/ui-kit.module.mjs +20 -5
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +401 -20
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +391 -20
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/badge/badge.component.d.ts +1 -1
- package/lib/compare-runs/compare-runs.component.d.ts +9 -10
- package/lib/custom-input/custom-input.component.d.ts +39 -0
- package/lib/failed-step-card/failed-step-card.component.d.ts +30 -0
- package/lib/iterations-loop/iterations-loop.component.d.ts +39 -0
- package/lib/ui-kit.module.d.ts +19 -16
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
- package/styles.css +1 -1
|
@@ -60,10 +60,10 @@ export class ConfigurationCardComponent {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
ConfigurationCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ConfigurationCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
63
|
-
ConfigurationCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: { icon: "icon", title: "title", data: "data" }, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%; height: 100%; min-width: 180px
|
|
63
|
+
ConfigurationCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: { icon: "icon", title: "title", data: "data" }, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%; height: 100%; min-width: 180px;\">\n\t<div class=\"cqa-bg-white cqa-rounded-lg\" style=\"border: 1px solid #E2E8F0; height: 100%;\">\n\t\t<!-- Section Header -->\n\t\t<div class=\"cqa-p-3 cqa-pb-2 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F5F5F566]\"\n\t\t\tstyle=\"border-bottom: 1px solid #E2E8F0;\">\n\t\t\t<ng-container *ngIf=\"icon\">\n\t\t\t\t<mat-icon [ngStyle]=\"headerIconStyles\">\n\t\t\t\t\t{{ icon }}\n\t\t\t\t</mat-icon>\n\t\t\t</ng-container>\n\t\t\t<div class=\"cqa-text-xs cqa-font-semibold cqa-color-[#636363] cqa-leading-normal\">\n\t\t\t\t{{ title }}\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Configuration Items -->\n\t\t<div class=\"cqa-p-4 cqa-pt-3\" *ngIf=\"data.length > 0\">\n\t\t\t<div class=\"cqa-grid cqa-grid-cols-1 cqa-gap-y-[10px]\">\n\t\t\t\t<ng-container *ngFor=\"let item of data\">\n\t\t\t\t\t<!-- *ngIf=\"!isBoolean(item.value)\" -->\n\t\t\t\t\t<div class=\"cqa-flex cqa-gap-2 cqa-justify-between cqa-items-center cqa-h-[15px]\"\n\t\t\t\t\t\t[ngClass]=\"{ 'cqa-h-[21px]': isBoolean(item.value) || item.isFlag }\">\n\t\t\t\t\t\t<!-- Label -->\n\t\t\t\t\t\t<span class=\"cqa-text-xs cqa-text-[#64748B] cqa-font-regular\">\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t<!-- Value -->\n\t\t\t\t\t\t<div class=\"cqa-flex cqa-items-center cqa-gap-[6px]\">\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"item.icon\" class=\"material-icons cqa-text-[#94A3B8] cqa-text-[12px]\n\t\t\t\t\t\t\t\tcqa-w-3 cqa-h-3\">\n\t\t\t\t\t\t\t\t{{ item.icon }}\n\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t<ng-container *ngIf=\"!item.isFlag\">\n\t\t\t\t\t\t\t\t<span *ngIf=\"!isBoolean(item.value)\" class=\"cqa-text-xs cqa-text-[#334155] cqa-font-regular\">\n\t\t\t\t\t\t\t\t\t{{ getDisplayValue(item) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span *ngIf=\"isBoolean(item.value)\" class=\"cqa-text-xs cqa-text-[#475569] cqa-bg-[#F1F5F9] cqa-rounded-[4px] cqa-font-regular cqa-py-1 cqa-px-[6px]\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"{ border: '1px solid #E2E8F0' }\">\n\t\t\t\t\t\t\t\t\t{{ getDisplayValue(item) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t\t<span *ngIf=\"item.isFlag\" class=\"cqa-text-xs cqa-rounded-[4px] cqa-font-medium cqa-py-1 cqa-px-[6px]\"\n\t\t\t\t\t\t\t\t[ngClass]=\"getValueClass(item)\"\n\t\t\t\t\t\t\t\t[ngStyle]=\"{ border: getValueBorder(item) }\">\n\t\t\t\t\t\t\t\t{{ getDisplayValue(item) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-container>\n\t\t\t</div>\n\t\t</div>\n\t</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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
64
64
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ConfigurationCardComponent, decorators: [{
|
|
65
65
|
type: Component,
|
|
66
|
-
args: [{ selector: 'cqa-configuration-card', template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%; height: 100%; min-width: 180px
|
|
66
|
+
args: [{ selector: 'cqa-configuration-card', template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%; height: 100%; min-width: 180px;\">\n\t<div class=\"cqa-bg-white cqa-rounded-lg\" style=\"border: 1px solid #E2E8F0; height: 100%;\">\n\t\t<!-- Section Header -->\n\t\t<div class=\"cqa-p-3 cqa-pb-2 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F5F5F566]\"\n\t\t\tstyle=\"border-bottom: 1px solid #E2E8F0;\">\n\t\t\t<ng-container *ngIf=\"icon\">\n\t\t\t\t<mat-icon [ngStyle]=\"headerIconStyles\">\n\t\t\t\t\t{{ icon }}\n\t\t\t\t</mat-icon>\n\t\t\t</ng-container>\n\t\t\t<div class=\"cqa-text-xs cqa-font-semibold cqa-color-[#636363] cqa-leading-normal\">\n\t\t\t\t{{ title }}\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Configuration Items -->\n\t\t<div class=\"cqa-p-4 cqa-pt-3\" *ngIf=\"data.length > 0\">\n\t\t\t<div class=\"cqa-grid cqa-grid-cols-1 cqa-gap-y-[10px]\">\n\t\t\t\t<ng-container *ngFor=\"let item of data\">\n\t\t\t\t\t<!-- *ngIf=\"!isBoolean(item.value)\" -->\n\t\t\t\t\t<div class=\"cqa-flex cqa-gap-2 cqa-justify-between cqa-items-center cqa-h-[15px]\"\n\t\t\t\t\t\t[ngClass]=\"{ 'cqa-h-[21px]': isBoolean(item.value) || item.isFlag }\">\n\t\t\t\t\t\t<!-- Label -->\n\t\t\t\t\t\t<span class=\"cqa-text-xs cqa-text-[#64748B] cqa-font-regular\">\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t<!-- Value -->\n\t\t\t\t\t\t<div class=\"cqa-flex cqa-items-center cqa-gap-[6px]\">\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"item.icon\" class=\"material-icons cqa-text-[#94A3B8] cqa-text-[12px]\n\t\t\t\t\t\t\t\tcqa-w-3 cqa-h-3\">\n\t\t\t\t\t\t\t\t{{ item.icon }}\n\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t<ng-container *ngIf=\"!item.isFlag\">\n\t\t\t\t\t\t\t\t<span *ngIf=\"!isBoolean(item.value)\" class=\"cqa-text-xs cqa-text-[#334155] cqa-font-regular\">\n\t\t\t\t\t\t\t\t\t{{ getDisplayValue(item) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span *ngIf=\"isBoolean(item.value)\" class=\"cqa-text-xs cqa-text-[#475569] cqa-bg-[#F1F5F9] cqa-rounded-[4px] cqa-font-regular cqa-py-1 cqa-px-[6px]\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"{ border: '1px solid #E2E8F0' }\">\n\t\t\t\t\t\t\t\t\t{{ getDisplayValue(item) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t\t<span *ngIf=\"item.isFlag\" class=\"cqa-text-xs cqa-rounded-[4px] cqa-font-medium cqa-py-1 cqa-px-[6px]\"\n\t\t\t\t\t\t\t\t[ngClass]=\"getValueClass(item)\"\n\t\t\t\t\t\t\t\t[ngStyle]=\"{ border: getValueBorder(item) }\">\n\t\t\t\t\t\t\t\t{{ getDisplayValue(item) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</ng-container>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>", styles: [] }]
|
|
67
67
|
}], propDecorators: { icon: [{
|
|
68
68
|
type: Input
|
|
69
69
|
}], title: [{
|
|
@@ -71,4 +71,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
71
71
|
}], data: [{
|
|
72
72
|
type: Input
|
|
73
73
|
}] } });
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29uZmlndXJhdGlvbi1jYXJkL2NvbmZpZ3VyYXRpb24tY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRpb24tY2FyZC9jb25maWd1cmF0aW9uLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFlakQsTUFBTSxPQUFPLDBCQUEwQjtJQUx2QztRQVFXLFNBQUksR0FBd0IsRUFBRSxDQUFDO0tBK0R6QztJQTdEQyx5Q0FBeUM7SUFDekMsWUFBWSxDQUFDLEtBQWdCO1FBQzNCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixTQUFTLENBQUMsS0FBZ0I7UUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVELDZCQUE2QjtJQUM3QixlQUFlLENBQUMsSUFBdUI7UUFDckMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQyxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNsQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQjtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBR0QsYUFBYSxDQUFDLElBQXVCO1FBQ25DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsUUFBUSxLQUFLLEVBQUU7WUFDYixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxxQ0FBcUMsQ0FBQztZQUMvQyxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxxQ0FBcUMsQ0FBQztZQUMvQztnQkFDRSxPQUFPLHFDQUFxQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUF1QjtRQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLFFBQVEsS0FBSyxFQUFFO1lBQ2IsS0FBSyxTQUFTO2dCQUNaLE9BQU8sbUJBQW1CLENBQUM7WUFDN0IsS0FBSyxZQUFZO2dCQUNmLE9BQU8sbUJBQW1CLENBQUM7WUFDN0I7Z0JBQ0UsT0FBTyxtQkFBbUIsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCx5QkFBeUI7SUFDekIsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFdBQVcsRUFBRSxNQUFNO1lBQ25CLE9BQU8sRUFBRSxNQUFNO1lBQ2YsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQztJQUNKLENBQUM7O3VIQWpFVSwwQkFBMEI7MkdBQTFCLDBCQUEwQixzSENmdkMsb2dGQXNETTsyRkR2Q08sMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHdCQUF3Qjs4QkFLekIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxudHlwZSBWYWx1ZVR5cGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvbkl0ZW0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogVmFsdWVUeXBlO1xuICBpY29uPzogc3RyaW5nO1xuICBpc0ZsYWc/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtY29uZmlndXJhdGlvbi1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpZ3VyYXRpb24tY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkNhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSBpY29uITogc3RyaW5nO1xuICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcbiAgQElucHV0KCkgZGF0YTogQ29uZmlndXJhdGlvbkl0ZW1bXSA9IFtdO1xuXG4gIC8vIENoZWNrIGlmIHZhbHVlIGlzIGVtcHR5L251bGwvdW5kZWZpbmVkXG4gIGlzRW1wdHlWYWx1ZSh2YWx1ZTogVmFsdWVUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgYm9vbGVhblxuICBpc0Jvb2xlYW4odmFsdWU6IFZhbHVlVHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgfVxuXG4gIC8vIEdldCBkaXNwbGF5IHZhbHVlIGZvciBpdGVtXG4gIGdldERpc3BsYXlWYWx1ZShpdGVtOiBDb25maWd1cmF0aW9uSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eVZhbHVlKGl0ZW0udmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ05vdCBzZXQnO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5pc0Jvb2xlYW4oaXRlbS52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlID8gJ09uJyA6ICdPZmYnO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmlzRmxhZyAmJiBpdGVtLnZhbHVlKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gU3RyaW5nKGl0ZW0udmFsdWUpO1xuICB9XG5cblxuICBnZXRWYWx1ZUNsYXNzKGl0ZW06IENvbmZpZ3VyYXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhpdGVtLnZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgJ2VuYWJsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsjMDU5NjY5XSBjcWEtYmctWyNFQ0ZERjVdJztcbiAgICAgIGNhc2UgJ29uIGZhaWx1cmUnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsjRDk3NzA2XSBjcWEtYmctWyNGRkZCRUJdJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWyM0NzU1NjldIGNxYS1iZy1bI0YxRjVGOV0nO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlQm9yZGVyKGl0ZW06IENvbmZpZ3VyYXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhpdGVtLnZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgJ2VuYWJsZWQnOlxuICAgICAgICByZXR1cm4gJzFweCBzb2xpZCAjRDFGQUU1JztcbiAgICAgIGNhc2UgJ29uIGZhaWx1cmUnOlxuICAgICAgICByZXR1cm4gJzFweCBzb2xpZCAjRkVGM0M3JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnMXB4IHNvbGlkICNFMkU4RjAnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0eWxlcyBmb3IgaGVhZGVyIGljb25cbiAgZ2V0IGhlYWRlckljb25TdHlsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdjb2xvcic6ICcjMUE0RURBJyxcbiAgICAgICdmb250LXNpemUnOiAnMTZweCcsXG4gICAgICAnd2lkdGgnOiAnMTZweCcsXG4gICAgICAnaGVpZ2h0JzogJzE2cHgnXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgbWluLXdpZHRoOiAxODBweDtcIj5cblx0PGRpdiBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZ1wiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI0UyRThGMDsgaGVpZ2h0OiAxMDAlO1wiPlxuXHRcdDwhLS0gU2VjdGlvbiBIZWFkZXIgLS0+XG5cdFx0PGRpdiBjbGFzcz1cImNxYS1wLTMgY3FhLXBiLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWJnLVsjRjVGNUY1NjZdXCJcblx0XHRcdHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFMkU4RjA7XCI+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaWNvblwiPlxuXHRcdFx0XHQ8bWF0LWljb24gW25nU3R5bGVdPVwiaGVhZGVySWNvblN0eWxlc1wiPlxuXHRcdFx0XHRcdHt7IGljb24gfX1cblx0XHRcdFx0PC9tYXQtaWNvbj5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1mb250LXNlbWlib2xkIGNxYS1jb2xvci1bIzYzNjM2M10gY3FhLWxlYWRpbmctbm9ybWFsXCI+XG5cdFx0XHRcdHt7IHRpdGxlIH19XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblxuXHRcdDwhLS0gQ29uZmlndXJhdGlvbiBJdGVtcyAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwiY3FhLXAtNCBjcWEtcHQtM1wiICpuZ0lmPVwiZGF0YS5sZW5ndGggPiAwXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0xIGNxYS1nYXAteS1bMTBweF1cIj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhXCI+XG5cdFx0XHRcdFx0PCEtLSAqbmdJZj1cIiFpc0Jvb2xlYW4oaXRlbS52YWx1ZSlcIiAtLT5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0yIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWl0ZW1zLWNlbnRlciBjcWEtaC1bMTVweF1cIlxuXHRcdFx0XHRcdFx0W25nQ2xhc3NdPVwieyAnY3FhLWgtWzIxcHhdJzogaXNCb29sZWFuKGl0ZW0udmFsdWUpIHx8IGl0ZW0uaXNGbGFnIH1cIj5cblx0XHRcdFx0XHRcdDwhLS0gTGFiZWwgLS0+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtZm9udC1yZWd1bGFyXCI+XG5cdFx0XHRcdFx0XHRcdHt7IGl0ZW0ubGFiZWwgfX1cblx0XHRcdFx0XHRcdDwvc3Bhbj5cblxuXHRcdFx0XHRcdFx0PCEtLSBWYWx1ZSAtLT5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzZweF1cIj5cblx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjcWEtdGV4dC1bIzk0QTNCOF0gY3FhLXRleHQtWzEycHhdXG5cdFx0XHRcdFx0XHRcdFx0Y3FhLXctMyBjcWEtaC0zXCI+XG5cdFx0XHRcdFx0XHRcdFx0e3sgaXRlbS5pY29uIH19XG5cdFx0XHRcdFx0XHRcdDwvbWF0LWljb24+XG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pc0ZsYWdcIj5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIiFpc0Jvb2xlYW4oaXRlbS52YWx1ZSlcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMzM0MTU1XSBjcWEtZm9udC1yZWd1bGFyXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHR7eyBnZXREaXNwbGF5VmFsdWUoaXRlbSkgfX1cblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJpc0Jvb2xlYW4oaXRlbS52YWx1ZSlcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNDc1NTY5XSBjcWEtYmctWyNGMUY1RjldIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1mb250LXJlZ3VsYXIgY3FhLXB5LTEgY3FhLXB4LVs2cHhdXCJcblx0XHRcdFx0XHRcdFx0XHRcdFtuZ1N0eWxlXT1cInsgYm9yZGVyOiAnMXB4IHNvbGlkICNFMkU4RjAnIH1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdHt7IGdldERpc3BsYXlWYWx1ZShpdGVtKSB9fVxuXHRcdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJpdGVtLmlzRmxhZ1wiIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1weS0xIGNxYS1weC1bNnB4XVwiXG5cdFx0XHRcdFx0XHRcdFx0W25nQ2xhc3NdPVwiZ2V0VmFsdWVDbGFzcyhpdGVtKVwiXG5cdFx0XHRcdFx0XHRcdFx0W25nU3R5bGVdPVwieyBib3JkZXI6IGdldFZhbHVlQm9yZGVyKGl0ZW0pIH1cIj5cblx0XHRcdFx0XHRcdFx0XHR7eyBnZXREaXNwbGF5VmFsdWUoaXRlbSkgfX1cblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export class CustomInputComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.label = '';
|
|
7
|
+
this.type = 'text';
|
|
8
|
+
this.placeholder = '';
|
|
9
|
+
this.value = '';
|
|
10
|
+
this.disabled = false;
|
|
11
|
+
this.errors = [];
|
|
12
|
+
this.required = false;
|
|
13
|
+
this.ariaLabel = '';
|
|
14
|
+
this.size = 'md';
|
|
15
|
+
this.fullWidth = false;
|
|
16
|
+
this.showCharCount = false;
|
|
17
|
+
this.valueChange = new EventEmitter();
|
|
18
|
+
this.blurred = new EventEmitter();
|
|
19
|
+
this.focused = new EventEmitter();
|
|
20
|
+
this.enterPressed = new EventEmitter();
|
|
21
|
+
this.inputValue = '';
|
|
22
|
+
this.isFocused = false;
|
|
23
|
+
}
|
|
24
|
+
ngOnChanges(changes) {
|
|
25
|
+
if (changes['value'] && changes['value'].currentValue !== undefined) {
|
|
26
|
+
let newValue = changes['value'].currentValue ?? '';
|
|
27
|
+
if (this.maxLength && newValue.length > this.maxLength) {
|
|
28
|
+
newValue = newValue.substring(0, this.maxLength);
|
|
29
|
+
}
|
|
30
|
+
if (newValue !== this.inputValue) {
|
|
31
|
+
this.inputValue = newValue;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
get hasError() {
|
|
36
|
+
return this.errors && this.errors.length > 0;
|
|
37
|
+
}
|
|
38
|
+
get inputSizeClasses() {
|
|
39
|
+
switch (this.size) {
|
|
40
|
+
case 'sm':
|
|
41
|
+
return 'cqa-px-3 cqa-py-2 cqa-text-xs';
|
|
42
|
+
case 'md':
|
|
43
|
+
return 'cqa-px-4 cqa-py-2.5 cqa-text-sm';
|
|
44
|
+
case 'lg':
|
|
45
|
+
return 'cqa-px-5 cqa-py-3 cqa-text-base';
|
|
46
|
+
default:
|
|
47
|
+
return 'cqa-px-4 cqa-py-2.5 cqa-text-sm';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
get labelSizeClasses() {
|
|
51
|
+
switch (this.size) {
|
|
52
|
+
case 'sm':
|
|
53
|
+
return 'cqa-text-xs cqa-mb-1';
|
|
54
|
+
case 'md':
|
|
55
|
+
return 'cqa-text-sm cqa-mb-1.5';
|
|
56
|
+
case 'lg':
|
|
57
|
+
return 'cqa-text-base cqa-mb-2';
|
|
58
|
+
default:
|
|
59
|
+
return 'cqa-text-sm cqa-mb-1.5';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
onInput(event) {
|
|
63
|
+
const target = event.target;
|
|
64
|
+
let nextValue = target?.value ?? '';
|
|
65
|
+
if (this.showCharCount && this.maxLength && nextValue.length > this.maxLength) {
|
|
66
|
+
nextValue = nextValue.substring(0, this.maxLength);
|
|
67
|
+
if (target) {
|
|
68
|
+
target.value = nextValue;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.inputValue = nextValue;
|
|
72
|
+
this.valueChange.emit(this.inputValue);
|
|
73
|
+
}
|
|
74
|
+
onFocus(event) {
|
|
75
|
+
this.isFocused = true;
|
|
76
|
+
this.focused.emit(event);
|
|
77
|
+
}
|
|
78
|
+
onBlur(event) {
|
|
79
|
+
this.isFocused = false;
|
|
80
|
+
this.blurred.emit(event);
|
|
81
|
+
}
|
|
82
|
+
onKeyDown(event) {
|
|
83
|
+
if (event.key === 'Enter') {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
this.enterPressed.emit(this.inputValue.trim());
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
get inputStyles() {
|
|
89
|
+
return this.inputInlineStyle || '';
|
|
90
|
+
}
|
|
91
|
+
get labelStyles() {
|
|
92
|
+
return this.labelInlineStyle || '';
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
CustomInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CustomInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
96
|
+
CustomInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CustomInputComponent, selector: "cqa-custom-input", inputs: { label: "label", type: "type", placeholder: "placeholder", value: "value", disabled: "disabled", errors: "errors", required: "required", ariaLabel: "ariaLabel", size: "size", fullWidth: "fullWidth", maxLength: "maxLength", showCharCount: "showCharCount", inputInlineStyle: "inputInlineStyle", labelInlineStyle: "labelInlineStyle" }, outputs: { valueChange: "valueChange", blurred: "blurred", focused: "focused", enterPressed: "enterPressed" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" [style.display]=\"'block'\" [style.width]=\"fullWidth ? '100%' : 'auto'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"fullWidth ? '100%' : 'auto'\">\n <label \n *ngIf=\"label\"\n class=\"cqa-font-medium cqa-text-[#374151]\"\n [ngClass]=\"labelSizeClasses\"\n [style]=\"labelStyles\">\n {{ label }}\n <span *ngIf=\"required\" class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n\n <div class=\"cqa-relative\" [style.width]=\"fullWidth ? '100%' : 'auto'\">\n <input\n [type]=\"type\"\n class=\"cqa-w-full !cqa-border !cqa-border-solid !cqa-border-gray-200 cqa-rounded-md cqa-bg-white cqa-font-['SF_Pro_Text'] cqa-font-normal cqa-leading-normal cqa-tracking-normal cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] cqa-transition-all cqa-duration-200 cqa-outline-none\"\n [ngClass]=\"{\n 'cqa-border-[#D1D5DB] focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]': !hasError,\n 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-1 focus:cqa-ring-[#EF4444]': hasError,\n 'cqa-bg-[#F9FAFB] cqa-cursor-not-allowed cqa-text-[#9CA3AF]': disabled,\n 'cqa-outline-none': true\n }\"\n [ngClass]=\"inputSizeClasses\"\n [style]=\"inputStyles\"\n [placeholder]=\"placeholder\"\n [value]=\"inputValue\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keydown)=\"onKeyDown($event)\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ariaLabel || label\"\n [attr.aria-invalid]=\"hasError\"\n [attr.aria-required]=\"required\"\n autocomplete=\"off\"\n />\n </div>\n\n <div *ngIf=\"showCharCount && maxLength\" class=\"cqa-flex cqa-justify-end cqa-mt-1\">\n <span class=\"cqa-text-xs cqa-text-[#6B7280]\">\n {{ inputValue.length }}/{{ maxLength }}\n </span>\n </div>\n\n <div *ngIf=\"hasError\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-mt-1.5\">\n <div *ngFor=\"let error of errors\" class=\"cqa-flex cqa-items-start cqa-gap-1.5\">\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 14 14\" \n fill=\"none\"\n class=\"cqa-flex-shrink-0 cqa-mt-0.5\">\n <path d=\"M7 1.75C4.1 1.75 1.75 4.1 1.75 7C1.75 9.9 4.1 12.25 7 12.25C9.9 12.25 12.25 9.9 12.25 7C12.25 4.1 9.9 1.75 7 1.75ZM7 9.625C6.65625 9.625 6.375 9.34375 6.375 9V7C6.375 6.65625 6.65625 6.375 7 6.375C7.34375 6.375 7.625 6.65625 7.625 7V9C7.625 9.34375 7.34375 9.625 7 9.625ZM7.625 5.25H6.375V4H7.625V5.25Z\" fill=\"#EF4444\"/>\n </svg>\n <span class=\"cqa-text-xs cqa-text-[#EF4444] cqa-font-medium cqa-leading-[18px]\">\n {{ error }}\n </span>\n </div>\n </div>\n </div>\n</div>\n\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CustomInputComponent, decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{ selector: 'cqa-custom-input', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-ui-root\" [style.display]=\"'block'\" [style.width]=\"fullWidth ? '100%' : 'auto'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"fullWidth ? '100%' : 'auto'\">\n <label \n *ngIf=\"label\"\n class=\"cqa-font-medium cqa-text-[#374151]\"\n [ngClass]=\"labelSizeClasses\"\n [style]=\"labelStyles\">\n {{ label }}\n <span *ngIf=\"required\" class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n\n <div class=\"cqa-relative\" [style.width]=\"fullWidth ? '100%' : 'auto'\">\n <input\n [type]=\"type\"\n class=\"cqa-w-full !cqa-border !cqa-border-solid !cqa-border-gray-200 cqa-rounded-md cqa-bg-white cqa-font-['SF_Pro_Text'] cqa-font-normal cqa-leading-normal cqa-tracking-normal cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] cqa-transition-all cqa-duration-200 cqa-outline-none\"\n [ngClass]=\"{\n 'cqa-border-[#D1D5DB] focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]': !hasError,\n 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-1 focus:cqa-ring-[#EF4444]': hasError,\n 'cqa-bg-[#F9FAFB] cqa-cursor-not-allowed cqa-text-[#9CA3AF]': disabled,\n 'cqa-outline-none': true\n }\"\n [ngClass]=\"inputSizeClasses\"\n [style]=\"inputStyles\"\n [placeholder]=\"placeholder\"\n [value]=\"inputValue\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n (keydown)=\"onKeyDown($event)\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ariaLabel || label\"\n [attr.aria-invalid]=\"hasError\"\n [attr.aria-required]=\"required\"\n autocomplete=\"off\"\n />\n </div>\n\n <div *ngIf=\"showCharCount && maxLength\" class=\"cqa-flex cqa-justify-end cqa-mt-1\">\n <span class=\"cqa-text-xs cqa-text-[#6B7280]\">\n {{ inputValue.length }}/{{ maxLength }}\n </span>\n </div>\n\n <div *ngIf=\"hasError\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-mt-1.5\">\n <div *ngFor=\"let error of errors\" class=\"cqa-flex cqa-items-start cqa-gap-1.5\">\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 14 14\" \n fill=\"none\"\n class=\"cqa-flex-shrink-0 cqa-mt-0.5\">\n <path d=\"M7 1.75C4.1 1.75 1.75 4.1 1.75 7C1.75 9.9 4.1 12.25 7 12.25C9.9 12.25 12.25 9.9 12.25 7C12.25 4.1 9.9 1.75 7 1.75ZM7 9.625C6.65625 9.625 6.375 9.34375 6.375 9V7C6.375 6.65625 6.65625 6.375 7 6.375C7.34375 6.375 7.625 6.65625 7.625 7V9C7.625 9.34375 7.34375 9.625 7 9.625ZM7.625 5.25H6.375V4H7.625V5.25Z\" fill=\"#EF4444\"/>\n </svg>\n <span class=\"cqa-text-xs cqa-text-[#EF4444] cqa-font-medium cqa-leading-[18px]\">\n {{ error }}\n </span>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
100
|
+
}], propDecorators: { label: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], type: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], placeholder: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], value: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], disabled: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], errors: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], required: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], ariaLabel: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], size: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], fullWidth: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], maxLength: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], showCharCount: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], inputInlineStyle: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], labelInlineStyle: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], valueChange: [{
|
|
129
|
+
type: Output
|
|
130
|
+
}], blurred: [{
|
|
131
|
+
type: Output
|
|
132
|
+
}], focused: [{
|
|
133
|
+
type: Output
|
|
134
|
+
}], enterPressed: [{
|
|
135
|
+
type: Output
|
|
136
|
+
}] } });
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY3VzdG9tLWlucHV0L2N1c3RvbS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2N1c3RvbS1pbnB1dC9jdXN0b20taW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7OztBQVdqRyxNQUFNLE9BQU8sb0JBQW9CO0lBTmpDO1FBUVcsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFNBQUksR0FBYyxNQUFNLENBQUM7UUFFekIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFakIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUV0QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZixTQUFJLEdBQWMsSUFBSSxDQUFDO1FBRXZCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFJbEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFNckIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXpDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXpDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXpDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVwRCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxLQUFLLENBQUM7S0FxRm5CO0lBbkZDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENB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QUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztJQUNyQyxDQUFDOztpSEEzSFUsb0JBQW9CO3FHQUFwQixvQkFBb0IsMmpCQ1hqQyw0M0ZBOERBOzJGRG5EYSxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usa0JBQWtCLFFBR3RCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTs4QkFJckIsS0FBSztzQkFBYixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxPQUFPO3NCQUFoQixNQUFNO2dCQUVHLE9BQU87c0JBQWhCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxudHlwZSBJbnB1dFR5cGUgPSAndGV4dCcgfCAncGFzc3dvcmQnIHwgJ2VtYWlsJyB8ICdudW1iZXInIHwgJ3RlbCcgfCAndXJsJztcbnR5cGUgSW5wdXRTaXplID0gJ3NtJyB8ICdtZCcgfCAnbGcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtY3VzdG9tLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21JbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgbGFiZWwgPSAnJztcblxuICBASW5wdXQoKSB0eXBlOiBJbnB1dFR5cGUgPSAndGV4dCc7XG5cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XG5cbiAgQElucHV0KCkgc2l6ZTogSW5wdXRTaXplID0gJ21kJztcblxuICBASW5wdXQoKSBmdWxsV2lkdGggPSBmYWxzZTtcblxuICBASW5wdXQoKSBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgQElucHV0KCkgc2hvd0NoYXJDb3VudCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGlucHV0SW5saW5lU3R5bGU/OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbGFiZWxJbmxpbmVTdHlsZT86IHN0cmluZztcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KCkgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgZW50ZXJQcmVzc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgaW5wdXRWYWx1ZSA9ICcnO1xuICBpc0ZvY3VzZWQgPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZhbHVlJ10gJiYgY2hhbmdlc1sndmFsdWUnXS5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IG5ld1ZhbHVlID0gY2hhbmdlc1sndmFsdWUnXS5jdXJyZW50VmFsdWUgPz8gJyc7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLm1heExlbmd0aCAmJiBuZXdWYWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlLnN1YnN0cmluZygwLCB0aGlzLm1heExlbmd0aCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBpbnB1dFNpemVDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLnNpemUpIHtcbiAgICAgIGNhc2UgJ3NtJzpcbiAgICAgICAgcmV0dXJuICdjcWEtcHgtMyBjcWEtcHktMiBjcWEtdGV4dC14cyc7XG4gICAgICBjYXNlICdtZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXB4LTQgY3FhLXB5LTIuNSBjcWEtdGV4dC1zbSc7XG4gICAgICBjYXNlICdsZyc6XG4gICAgICAgIHJldHVybiAnY3FhLXB4LTUgY3FhLXB5LTMgY3FhLXRleHQtYmFzZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS1weC00IGNxYS1weS0yLjUgY3FhLXRleHQtc20nO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYWJlbFNpemVDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLnNpemUpIHtcbiAgICAgIGNhc2UgJ3NtJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC14cyBjcWEtbWItMSc7XG4gICAgICBjYXNlICdtZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtc20gY3FhLW1iLTEuNSc7XG4gICAgICBjYXNlICdsZyc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtYmFzZSBjcWEtbWItMic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LXNtIGNxYS1tYi0xLjUnO1xuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIGxldCBuZXh0VmFsdWUgPSB0YXJnZXQ/LnZhbHVlID8/ICcnO1xuICAgIFxuICAgIGlmICh0aGlzLnNob3dDaGFyQ291bnQgJiYgdGhpcy5tYXhMZW5ndGggJiYgbmV4dFZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICBuZXh0VmFsdWUgPSBuZXh0VmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMubWF4TGVuZ3RoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LnZhbHVlID0gbmV4dFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmlucHV0VmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuaW5wdXRWYWx1ZSk7XG4gIH1cblxuICBvbkZvY3VzKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZW50ZXJQcmVzc2VkLmVtaXQodGhpcy5pbnB1dFZhbHVlLnRyaW0oKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlucHV0U3R5bGVzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJbmxpbmVTdHlsZSB8fCAnJztcbiAgfVxuXG4gIGdldCBsYWJlbFN0eWxlcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxhYmVsSW5saW5lU3R5bGUgfHwgJyc7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgW3N0eWxlLmRpc3BsYXldPVwiJ2Jsb2NrJ1wiIFtzdHlsZS53aWR0aF09XCJmdWxsV2lkdGggPyAnMTAwJScgOiAnYXV0bydcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJmdWxsV2lkdGggPyAnMTAwJScgOiAnYXV0bydcIj5cbiAgICA8bGFiZWwgXG4gICAgICAqbmdJZj1cImxhYmVsXCJcbiAgICAgIGNsYXNzPVwiY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiXG4gICAgICBbbmdDbGFzc109XCJsYWJlbFNpemVDbGFzc2VzXCJcbiAgICAgIFtzdHlsZV09XCJsYWJlbFN0eWxlc1wiPlxuICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cImNxYS10ZXh0LVsjRUY0NDQ0XSBjcWEtbWwtMC41XCI+Kjwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZVwiIFtzdHlsZS53aWR0aF09XCJmdWxsV2lkdGggPyAnMTAwJScgOiAnYXV0bydcIj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS1yb3VuZGVkLW1kIGNxYS1iZy13aGl0ZSBjcWEtZm9udC1bJ1NGX1Byb19UZXh0J10gY3FhLWZvbnQtbm9ybWFsIGNxYS1sZWFkaW5nLW5vcm1hbCBjcWEtdHJhY2tpbmctbm9ybWFsIGNxYS10ZXh0LVsjMEEwQTBBXSBwbGFjZWhvbGRlcjpjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnY3FhLWJvcmRlci1bI0QxRDVEQl0gZm9jdXM6Y3FhLWJvcmRlci1bIzNCODJGNl0gZm9jdXM6Y3FhLXJpbmctMSBmb2N1czpjcWEtcmluZy1bIzNCODJGNl0nOiAhaGFzRXJyb3IsXG4gICAgICAgICAgJ2NxYS1ib3JkZXItWyNFRjQ0NDRdIGZvY3VzOmNxYS1ib3JkZXItWyNFRjQ0NDRdIGZvY3VzOmNxYS1yaW5nLTEgZm9jdXM6Y3FhLXJpbmctWyNFRjQ0NDRdJzogaGFzRXJyb3IsXG4gICAgICAgICAgJ2NxYS1iZy1bI0Y5RkFGQl0gY3FhLWN1cnNvci1ub3QtYWxsb3dlZCBjcWEtdGV4dC1bIzlDQTNBRl0nOiBkaXNhYmxlZCxcbiAgICAgICAgICAnY3FhLW91dGxpbmUtbm9uZSc6IHRydWVcbiAgICAgICAgfVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlucHV0U2l6ZUNsYXNzZXNcIlxuICAgICAgICBbc3R5bGVdPVwiaW5wdXRTdHlsZXNcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IGxhYmVsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImhhc0Vycm9yXCJcbiAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dDaGFyQ291bnQgJiYgbWF4TGVuZ3RoXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQgY3FhLW10LTFcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2QjcyODBdXCI+XG4gICAgICAgIHt7IGlucHV0VmFsdWUubGVuZ3RoIH19L3t7IG1heExlbmd0aCB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImhhc0Vycm9yXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1tdC0xLjVcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVycm9yIG9mIGVycm9yc1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMS41XCI+XG4gICAgICAgIDxzdmcgXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIFxuICAgICAgICAgIHdpZHRoPVwiMTRcIiBcbiAgICAgICAgICBoZWlnaHQ9XCIxNFwiIFxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtbXQtMC41XCI+XG4gICAgICAgICAgPHBhdGggZD1cIk03IDEuNzVDNC4xIDEuNzUgMS43NSA0LjEgMS43NSA3QzEuNzUgOS45IDQuMSAxMi4yNSA3IDEyLjI1QzkuOSAxMi4yNSAxMi4yNSA5LjkgMTIuMjUgN0MxMi4yNSA0LjEgOS45IDEuNzUgNyAxLjc1Wk03IDkuNjI1QzYuNjU2MjUgOS42MjUgNi4zNzUgOS4zNDM3NSA2LjM3NSA5VjdDNi4zNzUgNi42NTYyNSA2LjY1NjI1IDYuMzc1IDcgNi4zNzVDNy4zNDM3NSA2LjM3NSA3LjYyNSA2LjY1NjI1IDcuNjI1IDdWOUM3LjYyNSA5LjM0Mzc1IDcuMzQzNzUgOS42MjUgNyA5LjYyNVpNNy42MjUgNS4yNUg2LjM3NVY0SDcuNjI1VjUuMjVaXCIgZmlsbD1cIiNFRjQ0NDRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjRUY0NDQ0XSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctWzE4cHhdXCI+XG4gICAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class FailedStepCardComponent {
|
|
4
|
+
get headerTitle() {
|
|
5
|
+
if (this.failedStepData?.stepTitle) {
|
|
6
|
+
return `Failed at Step ${this.failedStepData.failed_step_index}: ${this.failedStepData.stepTitle}`;
|
|
7
|
+
}
|
|
8
|
+
return `Failed at Step ${this.failedStepData?.failed_step_index || ''}`;
|
|
9
|
+
}
|
|
10
|
+
get errorText() {
|
|
11
|
+
return this.failedStepData?.errorMessage || this.failedStepData?.reason || 'An error occurred';
|
|
12
|
+
}
|
|
13
|
+
get videoTimestamp() {
|
|
14
|
+
return this.failedStepData?.timestamp || '00:00';
|
|
15
|
+
}
|
|
16
|
+
get durationText() {
|
|
17
|
+
return this.failedStepData?.duration || '0s';
|
|
18
|
+
}
|
|
19
|
+
get expectedResult() {
|
|
20
|
+
return this.failedStepData?.expected_result || '';
|
|
21
|
+
}
|
|
22
|
+
get actualResult() {
|
|
23
|
+
return this.failedStepData?.actual_result || '';
|
|
24
|
+
}
|
|
25
|
+
get suggestions() {
|
|
26
|
+
return this.failedStepData?.suggestions || '';
|
|
27
|
+
}
|
|
28
|
+
get hasSuggestions() {
|
|
29
|
+
return !!this.failedStepData?.suggestions && this.failedStepData.suggestions.trim().length > 0;
|
|
30
|
+
}
|
|
31
|
+
getFormattedSuggestions() {
|
|
32
|
+
if (!this.suggestions)
|
|
33
|
+
return [];
|
|
34
|
+
return this.suggestions.split('\n').filter(s => s.trim().length > 0);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
FailedStepCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FailedStepCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
FailedStepCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FailedStepCardComponent, selector: "cqa-failed-step-card", inputs: { failedStepData: "failedStepData" }, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-bg-[#FEF2F2] cqa-p-[17px] cqa-rounded-lg cqa-overflow-hidden cqa-flex cqa-flex-col cqa-gap-3\" style=\"border: 1px solid #FECACA;\">\n <div>\n <h3 class=\"cqa-text-sm cqa-leading-[18px] cqa-text-[#111827] cqa-mb-1\">{{ headerTitle }}</h3>\n <div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-3 cqa-text-xs\">\n <span class=\"cqa-text-[12px] cqa-text-[#B91C1C]\">Error: {{ errorText }}</span>\n <span class=\"cqa-text-[#636363]\">\u2022</span>\n <span class=\"cqa-text-[#636363]\">Video timestamp: {{ videoTimestamp }}</span>\n <span class=\"cqa-text-[#636363]\">\u2022</span>\n <span class=\"cqa-text-[#636363]\">Duration: {{ durationText }}</span>\n </div>\n </div>\n\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-0 cqa-rounded-[4px] cqa-overflow-hidden\" style=\"border: 1px solid #E5E7EB\">\n <div class=\"cqa-bg-white cqa-px-2 cqa-py-1 md:cqa-border-r cqa-flex cqa-flex-col cqa-h-[114px]\" style=\"border-right: 1px solid #E5E7EB\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-uppercase cqa-tracking-wide\">EXPECTED</span>\n <div class=\"cqa-text-[10px] cqa-text-[#0B0B0B] cqa-leading-relaxed cqa-h-[91px] cqa-max-h-[91px] cqa-overflow-y-auto cqa-font-medium\">\n {{ expectedResult }}\n </div>\n </div>\n </div>\n\n <div class=\"cqa-bg-[#FFF9F9] cqa-px-2 cqa-py-1 cqa-flex cqa-flex-col\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-uppercase cqa-tracking-wide\">ACTUAL</span>\n <div class=\"cqa-text-[10px] cqa-text-[#C10007] cqa-leading-relaxed cqa-h-[91px] cqa-max-h-[91px] cqa-overflow-y-auto cqa-font-medium\">\n {{ actualResult }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n" });
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FailedStepCardComponent, decorators: [{
|
|
40
|
+
type: Component,
|
|
41
|
+
args: [{ selector: 'cqa-failed-step-card', template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-bg-[#FEF2F2] cqa-p-[17px] cqa-rounded-lg cqa-overflow-hidden cqa-flex cqa-flex-col cqa-gap-3\" style=\"border: 1px solid #FECACA;\">\n <div>\n <h3 class=\"cqa-text-sm cqa-leading-[18px] cqa-text-[#111827] cqa-mb-1\">{{ headerTitle }}</h3>\n <div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-3 cqa-text-xs\">\n <span class=\"cqa-text-[12px] cqa-text-[#B91C1C]\">Error: {{ errorText }}</span>\n <span class=\"cqa-text-[#636363]\">\u2022</span>\n <span class=\"cqa-text-[#636363]\">Video timestamp: {{ videoTimestamp }}</span>\n <span class=\"cqa-text-[#636363]\">\u2022</span>\n <span class=\"cqa-text-[#636363]\">Duration: {{ durationText }}</span>\n </div>\n </div>\n\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-0 cqa-rounded-[4px] cqa-overflow-hidden\" style=\"border: 1px solid #E5E7EB\">\n <div class=\"cqa-bg-white cqa-px-2 cqa-py-1 md:cqa-border-r cqa-flex cqa-flex-col cqa-h-[114px]\" style=\"border-right: 1px solid #E5E7EB\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-uppercase cqa-tracking-wide\">EXPECTED</span>\n <div class=\"cqa-text-[10px] cqa-text-[#0B0B0B] cqa-leading-relaxed cqa-h-[91px] cqa-max-h-[91px] cqa-overflow-y-auto cqa-font-medium\">\n {{ expectedResult }}\n </div>\n </div>\n </div>\n\n <div class=\"cqa-bg-[#FFF9F9] cqa-px-2 cqa-py-1 cqa-flex cqa-flex-col\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-uppercase cqa-tracking-wide\">ACTUAL</span>\n <div class=\"cqa-text-[10px] cqa-text-[#C10007] cqa-leading-relaxed cqa-h-[91px] cqa-max-h-[91px] cqa-overflow-y-auto cqa-font-medium\">\n {{ actualResult }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
42
|
+
}], propDecorators: { failedStepData: [{
|
|
43
|
+
type: Input
|
|
44
|
+
}] } });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpbGVkLXN0ZXAtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ZhaWxlZC1zdGVwLWNhcmQvZmFpbGVkLXN0ZXAtY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ZhaWxlZC1zdGVwLWNhcmQvZmFpbGVkLXN0ZXAtY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBd0IsTUFBTSxlQUFlLENBQUM7O0FBdUJ2RSxNQUFNLE9BQU8sdUJBQXVCO0lBR2xDLElBQUksV0FBVztRQUNiLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUU7WUFDbEMsT0FBTyxrQkFBa0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3BHO1FBQ0QsT0FBTyxrQkFBa0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQztJQUNqRyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLElBQUksT0FBTyxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxlQUFlLElBQUksRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7O29IQXpDVSx1QkFBdUI7d0dBQXZCLHVCQUF1QiwwR0N2QnBDLDYvREFtQ0E7MkZEWmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHNCQUFzQjs4QkFLdkIsY0FBYztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbGVkU3RlcERhdGEge1xuICBleHBlY3RlZF9yZXN1bHQ6IHN0cmluZztcbiAgYWN0dWFsX3Jlc3VsdDogc3RyaW5nO1xuICBmYWlsZWRfc3RlcF9pZDogc3RyaW5nO1xuICBpc1RpbWVvdXRlcnJvcjogYm9vbGVhbjtcbiAgZmFpbGVkX3N0ZXBfaW5kZXg6IHN0cmluZztcbiAgc3RlcHM6IGFueVtdO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgZHVyYXRpb246IHN0cmluZztcbiAgc3RlcFNjcmVlbnNob3RVcmw6IHN0cmluZyB8IG51bGw7XG4gIHN1Z2dlc3Rpb25zOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBzdGVwVGl0bGU/OiBzdHJpbmc7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWZhaWxlZC1zdGVwLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmFpbGVkLXN0ZXAtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRmFpbGVkU3RlcENhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSBmYWlsZWRTdGVwRGF0YSE6IEZhaWxlZFN0ZXBEYXRhO1xuXG4gIGdldCBoZWFkZXJUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZhaWxlZFN0ZXBEYXRhPy5zdGVwVGl0bGUpIHtcbiAgICAgIHJldHVybiBgRmFpbGVkIGF0IFN0ZXAgJHt0aGlzLmZhaWxlZFN0ZXBEYXRhLmZhaWxlZF9zdGVwX2luZGV4fTogJHt0aGlzLmZhaWxlZFN0ZXBEYXRhLnN0ZXBUaXRsZX1gO1xuICAgIH1cbiAgICByZXR1cm4gYEZhaWxlZCBhdCBTdGVwICR7dGhpcy5mYWlsZWRTdGVwRGF0YT8uZmFpbGVkX3N0ZXBfaW5kZXggfHwgJyd9YDtcbiAgfVxuXG4gIGdldCBlcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsZWRTdGVwRGF0YT8uZXJyb3JNZXNzYWdlIHx8IHRoaXMuZmFpbGVkU3RlcERhdGE/LnJlYXNvbiB8fCAnQW4gZXJyb3Igb2NjdXJyZWQnO1xuICB9XG5cbiAgZ2V0IHZpZGVvVGltZXN0YW1wKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbGVkU3RlcERhdGE/LnRpbWVzdGFtcCB8fCAnMDA6MDAnO1xuICB9XG5cbiAgZ2V0IGR1cmF0aW9uVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZhaWxlZFN0ZXBEYXRhPy5kdXJhdGlvbiB8fCAnMHMnO1xuICB9XG5cbiAgZ2V0IGV4cGVjdGVkUmVzdWx0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbGVkU3RlcERhdGE/LmV4cGVjdGVkX3Jlc3VsdCB8fCAnJztcbiAgfVxuXG4gIGdldCBhY3R1YWxSZXN1bHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsZWRTdGVwRGF0YT8uYWN0dWFsX3Jlc3VsdCB8fCAnJztcbiAgfVxuXG4gIGdldCBzdWdnZXN0aW9ucygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZhaWxlZFN0ZXBEYXRhPy5zdWdnZXN0aW9ucyB8fCAnJztcbiAgfVxuXG4gIGdldCBoYXNTdWdnZXN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmZhaWxlZFN0ZXBEYXRhPy5zdWdnZXN0aW9ucyAmJiB0aGlzLmZhaWxlZFN0ZXBEYXRhLnN1Z2dlc3Rpb25zLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0Rm9ybWF0dGVkU3VnZ2VzdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5zdWdnZXN0aW9ucykgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLnNwbGl0KCdcXG4nKS5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTtcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1iZy1bI0ZFRjJGMl0gY3FhLXAtWzE3cHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI0ZFQ0FDQTtcIj5cbiAgICA8ZGl2PlxuICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbWItMVwiPnt7IGhlYWRlclRpdGxlIH19PC9oMz5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LXhzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjQjkxQzFDXVwiPkVycm9yOiB7eyBlcnJvclRleHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2MzYzNjNdXCI+4oCiPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNjM2MzYzXVwiPlZpZGVvIHRpbWVzdGFtcDoge3sgdmlkZW9UaW1lc3RhbXAgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2MzYzNjNdXCI+4oCiPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNjM2MzYzXVwiPkR1cmF0aW9uOiB7eyBkdXJhdGlvblRleHQgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTIgY3FhLWdhcC0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1vdmVyZmxvdy1oaWRkZW5cIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNFNUU3RUJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXB4LTIgY3FhLXB5LTEgbWQ6Y3FhLWJvcmRlci1yIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1bMTE0cHhdXCIgc3R5bGU9XCJib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjRTVFN0VCXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS11cHBlcmNhc2UgY3FhLXRyYWNraW5nLXdpZGVcIj5FWFBFQ1RFRDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtbGVhZGluZy1yZWxheGVkIGNxYS1oLVs5MXB4XSBjcWEtbWF4LWgtWzkxcHhdIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLWZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyBleHBlY3RlZFJlc3VsdCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJnLVsjRkZGOUY5XSBjcWEtcHgtMiBjcWEtcHktMSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXVwcGVyY2FzZSBjcWEtdHJhY2tpbmctd2lkZVwiPkFDVFVBTDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjQzEwMDA3XSBjcWEtbGVhZGluZy1yZWxheGVkIGNxYS1oLVs5MXB4XSBjcWEtbWF4LWgtWzkxcHhdIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLWZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyBhY3R1YWxSZXN1bHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { EMPTY_STATE_IMAGES } from '../assets/images/image-assets.constants';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../templates/table-template.component";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
export class IterationsLoopComponent {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.iterations = [];
|
|
9
|
+
this.isTableDataLoading = false;
|
|
10
|
+
this.tableColumns = [];
|
|
11
|
+
this.pageIndex = 0;
|
|
12
|
+
this.pageSize = 5;
|
|
13
|
+
this.emptyStateConfig = {
|
|
14
|
+
title: 'No Iterations',
|
|
15
|
+
description: 'There are no iterations to display for this loop.',
|
|
16
|
+
imageUrl: EMPTY_STATE_IMAGES.DASHBOARD,
|
|
17
|
+
actions: []
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this.setupTableColumns();
|
|
22
|
+
}
|
|
23
|
+
ngOnChanges(changes) {
|
|
24
|
+
if (changes['iterations']) {
|
|
25
|
+
this.pageIndex = 0;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
setupTableColumns() {
|
|
29
|
+
this.tableColumns = [
|
|
30
|
+
{
|
|
31
|
+
fieldId: 'index',
|
|
32
|
+
fieldName: '#',
|
|
33
|
+
fieldValue: 'index',
|
|
34
|
+
isShow: true,
|
|
35
|
+
weight: 0.5,
|
|
36
|
+
render: (row) => {
|
|
37
|
+
return `<span class="cqa-text-[16px] cqa-text-[#0A0A0A] cqa-font-regular">${row.index}</span>`;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
fieldId: 'datasetId',
|
|
42
|
+
fieldName: 'Dataset ID',
|
|
43
|
+
fieldValue: 'datasetId',
|
|
44
|
+
isShow: true,
|
|
45
|
+
weight: 1.5,
|
|
46
|
+
render: (row) => {
|
|
47
|
+
return `<span class="cqa-text-sm cqa-text-[#0A0A0A] cqa-font-regular">${row.datasetId}</span>`;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
fieldId: 'variables',
|
|
52
|
+
fieldName: 'Variables',
|
|
53
|
+
isShow: true,
|
|
54
|
+
weight: 2,
|
|
55
|
+
render: (row) => {
|
|
56
|
+
const variableEntries = Object.entries(row.variables || {});
|
|
57
|
+
const variablesHtml = variableEntries.map(([key, value], index) => {
|
|
58
|
+
return `<div class="cqa-flex cqa-items-center cqa-gap-0.5 ${index === variableEntries.length - 1 ? 'cqa-mb-0' : 'cqa-mb-1'}">
|
|
59
|
+
<span class="cqa-px-1 cqa-text-[12px] cqa-text-[#4A5565] cqa-bg-[#F3F4F6] cqa-rounded-[4px]">${key}:</span>
|
|
60
|
+
<span class="cqa-text-sm cqa-text-[#4A5565] cqa-font-medium">${value}</span>
|
|
61
|
+
</div>`;
|
|
62
|
+
}).join('');
|
|
63
|
+
return `<div class="cqa-flex cqa-flex-col">${variablesHtml}</div>`;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
fieldId: 'status',
|
|
68
|
+
fieldName: 'Status',
|
|
69
|
+
fieldValue: 'status',
|
|
70
|
+
isShow: true,
|
|
71
|
+
weight: 1,
|
|
72
|
+
render: (row) => {
|
|
73
|
+
return this.renderStatusIcon(row.status);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
fieldId: 'duration',
|
|
78
|
+
fieldName: 'Duration',
|
|
79
|
+
isShow: true,
|
|
80
|
+
weight: 1,
|
|
81
|
+
render: (row) => {
|
|
82
|
+
return `
|
|
83
|
+
<div class="cqa-flex cqa-items-center cqa-gap-1">
|
|
84
|
+
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
85
|
+
<path d="M7.00002 12.8337C10.2217 12.8337 12.8334 10.222 12.8334 7.00033C12.8334 3.77866 10.2217 1.16699 7.00002 1.16699C3.77836 1.16699 1.16669 3.77866 1.16669 7.00033C1.16669 10.222 3.77836 12.8337 7.00002 12.8337Z" stroke="#636363" stroke-width="1.16667" stroke-linecap="round" stroke-linejoin="round"/>
|
|
86
|
+
<path d="M7 3.5V7L9.33333 8.16667" stroke="#636363" stroke-width="1.16667" stroke-linecap="round" stroke-linejoin="round"/>
|
|
87
|
+
</svg>
|
|
88
|
+
<span class="cqa-text-xs cqa-text-[#4A5565]">${this.formatDuration(row.duration)}</span>
|
|
89
|
+
</div>
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
renderStatusIcon(status) {
|
|
96
|
+
const upperStatus = status.toUpperCase();
|
|
97
|
+
if (upperStatus === 'PASS') {
|
|
98
|
+
return `
|
|
99
|
+
<div class="cqa-flex cqa-items-center cqa-gap-1.5">
|
|
100
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
101
|
+
<circle cx="8" cy="8" r="7" stroke="#008236" stroke-width="1.5" fill="none"/>
|
|
102
|
+
<path d="M5.5 8L7 9.5L10.5 6" stroke="#008236" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
103
|
+
</svg>
|
|
104
|
+
<span class="cqa-rounded-[4px] cqa-leading-4 cqa-px-2 cqa-py-0.5 cqa-bg-[#DCFCE7] cqa-text-xs cqa-text-[#008236]">Pass</span>
|
|
105
|
+
</div>
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
else if (upperStatus === 'FAIL') {
|
|
109
|
+
return `
|
|
110
|
+
<div class="cqa-flex cqa-items-center cqa-gap-1.5">
|
|
111
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
112
|
+
<circle cx="8" cy="8" r="7" stroke="#C10007" stroke-width="1.5" fill="none"/>
|
|
113
|
+
<path d="M10 6L6 10M6 6L10 10" stroke="#C10007" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
114
|
+
</svg>
|
|
115
|
+
<span class="cqa-rounded-[4px] cqa-leading-4 cqa-px-2 cqa-py-0.5 cqa-bg-[#FFE2E2] cqa-text-xs cqa-text-[#C10007]">Fail</span>
|
|
116
|
+
</div>
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
else if (upperStatus === 'IN_PROGRESS') {
|
|
120
|
+
return `
|
|
121
|
+
<div class="cqa-flex cqa-items-center cqa-gap-1.5">
|
|
122
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
123
|
+
<circle cx="8" cy="8" r="7" stroke="#3B82F6" stroke-width="1.5" fill="none"/>
|
|
124
|
+
</svg>
|
|
125
|
+
<span class="cqa-rounded-[4px] cqa-leading-4 cqa-px-2 cqa-py-0.5 cqa-bg-[#EFF6FF] cqa-text-xs cqa-text-[#3B82F6]">In Progress</span>
|
|
126
|
+
</div>
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
return `<span class="cqa-rounded-[4px] cqa-leading-4 cqa-px-2 cqa-py-0.5 cqa-text-xs cqa-text-[#9CA3AF]">—</span>`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
formatDuration(milliseconds) {
|
|
134
|
+
const seconds = milliseconds / 1000;
|
|
135
|
+
if (seconds < 60) {
|
|
136
|
+
return `${seconds.toFixed(1)}s`;
|
|
137
|
+
}
|
|
138
|
+
const minutes = Math.floor(seconds / 60);
|
|
139
|
+
const remainingSeconds = Math.floor(seconds % 60);
|
|
140
|
+
return `${minutes}m ${remainingSeconds}s`;
|
|
141
|
+
}
|
|
142
|
+
onPageChange(event) {
|
|
143
|
+
this.pageIndex = event.pageIndex;
|
|
144
|
+
this.pageSize = event.pageSize;
|
|
145
|
+
}
|
|
146
|
+
get isEmptyState() {
|
|
147
|
+
return !this.iterations || this.iterations.length === 0;
|
|
148
|
+
}
|
|
149
|
+
get computedSummary() {
|
|
150
|
+
if (this.summary) {
|
|
151
|
+
return this.summary;
|
|
152
|
+
}
|
|
153
|
+
const passed = this.iterations.filter(i => i.status === 'PASS').length;
|
|
154
|
+
const failed = this.iterations.filter(i => i.status === 'FAIL').length;
|
|
155
|
+
return {
|
|
156
|
+
totalIterations: this.iterations.length,
|
|
157
|
+
passed,
|
|
158
|
+
failed
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
IterationsLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: IterationsLoopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
163
|
+
IterationsLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: IterationsLoopComponent, selector: "cqa-iterations-loop", inputs: { iterations: "iterations", summary: "summary", isTableDataLoading: "isTableDataLoading" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-bg-white\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"iterations\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n <div *ngIf=\"!isEmptyState\" class=\"cqa-p-[17px] cqa-mt-6 cqa-bg-[#FBFCFF] cqa-rounded-[5px]\" style=\"border: 1px solid #E5E5E5;\">\n <h4 class=\"cqa-text-[16px] cqa-text-[#111827] cqa-mb-3\">Summary</h4>\n <div class=\"cqa-grid cqa-grid-cols-3 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Total Iterations</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#0B0B0B]\">{{ computedSummary.totalIterations }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Passed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#00C950]\">{{ computedSummary.passed }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Failed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#FB2C36]\">{{ computedSummary.failed }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", components: [{ type: i1.TableTemplateComponent, selector: "cqa-table-template", inputs: ["searchPlaceholder", "searchValue", "showClear", "showSearchBar", "filterConfig", "showFilterPanel", "showFilterButton", "otherButtonLabel", "otherButtonVariant", "showOtherButton", "showActionButton", "showSettingsButton", "showAutoRefreshButton", "data", "isEmptyState", "emptyStateConfig", "actions", "chips", "filterApplied", "columns", "selectedAutoRefreshInterval", "pageIndex", "pageSize", "serverSidePagination", "totalElements", "isTableLoading", "isTableDataLoading"], outputs: ["onSearchChange", "onApplyFilterClick", "onResetFilterClick", "onClearAll", "removeChip", "pageChange", "onReload", "onAutoRefreshClick"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: IterationsLoopComponent, decorators: [{
|
|
165
|
+
type: Component,
|
|
166
|
+
args: [{ selector: 'cqa-iterations-loop', template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-bg-white\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"iterations\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n <div *ngIf=\"!isEmptyState\" class=\"cqa-p-[17px] cqa-mt-6 cqa-bg-[#FBFCFF] cqa-rounded-[5px]\" style=\"border: 1px solid #E5E5E5;\">\n <h4 class=\"cqa-text-[16px] cqa-text-[#111827] cqa-mb-3\">Summary</h4>\n <div class=\"cqa-grid cqa-grid-cols-3 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Total Iterations</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#0B0B0B]\">{{ computedSummary.totalIterations }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Passed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#00C950]\">{{ computedSummary.passed }}</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mb-1\">Failed</span>\n <span class=\"cqa-text-[22px] cqa-leading-[28px] cqa-font-semibold cqa-text-[#FB2C36]\">{{ computedSummary.failed }}</span>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [] }]
|
|
167
|
+
}], propDecorators: { iterations: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], summary: [{
|
|
170
|
+
type: Input
|
|
171
|
+
}], isTableDataLoading: [{
|
|
172
|
+
type: Input
|
|
173
|
+
}] } });
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0aW9ucy1sb29wLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaXRlcmF0aW9ucy1sb29wL2l0ZXJhdGlvbnMtbG9vcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2l0ZXJhdGlvbnMtbG9vcC9pdGVyYXRpb25zLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBR25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7O0FBc0I3RSxNQUFNLE9BQU8sdUJBQXVCO0lBTHBDO1FBTVcsZUFBVSxHQUFvQixFQUFFLENBQUM7UUFFakMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRTdDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFckIscUJBQWdCLEdBQXFCO1lBQ25DLEtBQUssRUFBRSxlQUFlO1lBQ3RCLFdBQVcsRUFBRSxtREFBbUQ7WUFDaEUsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFNBQVM7WUFDdEMsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO0tBcUpIO0lBbkpDLFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCO2dCQUNFLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixTQUFTLEVBQUUsR0FBRztnQkFDZCxVQUFV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RSxxQkFBcUI7OEJBS3RCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVDb2x1bW4gfSBmcm9tICcuLi90YWJsZS9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb25maWcgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVNUFRZX1NUQVRFX0lNQUdFUyB9IGZyb20gJy4uL2Fzc2V0cy9pbWFnZXMvaW1hZ2UtYXNzZXRzLmNvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlcmF0aW9uRGF0YSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIGRhdGFzZXRJZDogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHN0YXR1czogJ1BBU1MnIHwgJ0ZBSUwnIHwgJ0lOX1BST0dSRVNTJyB8ICdBQk9SVEVEJztcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZXJhdGlvblN1bW1hcnkge1xuICB0b3RhbEl0ZXJhdGlvbnM6IG51bWJlcjtcbiAgcGFzc2VkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtaXRlcmF0aW9ucy1sb29wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2l0ZXJhdGlvbnMtbG9vcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgSXRlcmF0aW9uc0xvb3BDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGl0ZXJhdGlvbnM6IEl0ZXJhdGlvbkRhdGFbXSA9IFtdO1xuICBASW5wdXQoKSBzdW1tYXJ5PzogSXRlcmF0aW9uU3VtbWFyeTtcbiAgQElucHV0KCkgaXNUYWJsZURhdGFMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdGFibGVDb2x1bW5zOiBEeW5hbWljVGFibGVDb2x1bW5bXSA9IFtdO1xuICBwYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSA1O1xuXG4gIGVtcHR5U3RhdGVDb25maWc6IEVtcHR5U3RhdGVDb25maWcgPSB7XG4gICAgdGl0bGU6ICdObyBJdGVyYXRpb25zJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZXJlIGFyZSBubyBpdGVyYXRpb25zIHRvIGRpc3BsYXkgZm9yIHRoaXMgbG9vcC4nLFxuICAgIGltYWdlVXJsOiBFTVBUWV9TVEFURV9JTUFHRVMuREFTSEJPQVJELFxuICAgIGFjdGlvbnM6IFtdXG4gIH07XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFRhYmxlQ29sdW1ucygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpdGVyYXRpb25zJ10pIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwVGFibGVDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVDb2x1bW5zID0gW1xuICAgICAge1xuICAgICAgICBmaWVsZElkOiAnaW5kZXgnLFxuICAgICAgICBmaWVsZE5hbWU6ICcjJyxcbiAgICAgICAgZmllbGRWYWx1ZTogJ2luZGV4JyxcbiAgICAgICAgaXNTaG93OiB0cnVlLFxuICAgICAgICB3ZWlnaHQ6IDAuNSxcbiAgICAgICAgcmVuZGVyOiAocm93OiBJdGVyYXRpb25EYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWZvbnQtcmVndWxhclwiPiR7cm93LmluZGV4fTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWVsZElkOiAnZGF0YXNldElkJyxcbiAgICAgICAgZmllbGROYW1lOiAnRGF0YXNldCBJRCcsXG4gICAgICAgIGZpZWxkVmFsdWU6ICdkYXRhc2V0SWQnLFxuICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgIHdlaWdodDogMS41LFxuICAgICAgICByZW5kZXI6IChyb3c6IEl0ZXJhdGlvbkRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LXJlZ3VsYXJcIj4ke3Jvdy5kYXRhc2V0SWR9PC9zcGFuPmA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkSWQ6ICd2YXJpYWJsZXMnLFxuICAgICAgICBmaWVsZE5hbWU6ICdWYXJpYWJsZXMnLFxuICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgIHdlaWdodDogMixcbiAgICAgICAgcmVuZGVyOiAocm93OiBJdGVyYXRpb25EYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFyaWFibGVFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocm93LnZhcmlhYmxlcyB8fCB7fSk7XG4gICAgICAgICAgY29uc3QgdmFyaWFibGVzSHRtbCA9IHZhcmlhYmxlRW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wLjUgJHtpbmRleCA9PT0gdmFyaWFibGVFbnRyaWVzLmxlbmd0aCAtIDEgPyAnY3FhLW1iLTAnIDogJ2NxYS1tYi0xJ31cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMSBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXJvdW5kZWQtWzRweF1cIj4ke2tleX06PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtZm9udC1tZWRpdW1cIj4ke3ZhbHVlfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgfSkuam9pbignJyk7XG4gICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+JHt2YXJpYWJsZXNIdG1sfTwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkSWQ6ICdzdGF0dXMnLFxuICAgICAgICBmaWVsZE5hbWU6ICdTdGF0dXMnLFxuICAgICAgICBmaWVsZFZhbHVlOiAnc3RhdHVzJyxcbiAgICAgICAgaXNTaG93OiB0cnVlLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIHJlbmRlcjogKHJvdzogSXRlcmF0aW9uRGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclN0YXR1c0ljb24ocm93LnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkSWQ6ICdkdXJhdGlvbicsXG4gICAgICAgIGZpZWxkTmFtZTogJ0R1cmF0aW9uJyxcbiAgICAgICAgaXNTaG93OiB0cnVlLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIHJlbmRlcjogKHJvdzogSXRlcmF0aW9uRGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjAwMDAyIDEyLjgzMzdDMTAuMjIxNyAxMi44MzM3IDEyLjgzMzQgMTAuMjIyIDEyLjgzMzQgNy4wMDAzM0MxMi44MzM0IDMuNzc4NjYgMTAuMjIxNyAxLjE2Njk5IDcuMDAwMDIgMS4xNjY5OUMzLjc3ODM2IDEuMTY2OTkgMS4xNjY2OSAzLjc3ODY2IDEuMTY2NjkgNy4wMDAzM0MxLjE2NjY5IDEwLjIyMiAzLjc3ODM2IDEyLjgzMzcgNy4wMDAwMiAxMi44MzM3WlwiIHN0cm9rZT1cIiM2MzYzNjNcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAzLjVWN0w5LjMzMzMzIDguMTY2NjdcIiBzdHJva2U9XCIjNjM2MzYzXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdXCI+JHt0aGlzLmZvcm1hdER1cmF0aW9uKHJvdy5kdXJhdGlvbil9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclN0YXR1c0ljb24oc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVwcGVyU3RhdHVzID0gc3RhdHVzLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKHVwcGVyU3RhdHVzID09PSAnUEFTUycpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI3XCIgc3Ryb2tlPVwiIzAwODIzNlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01LjUgOEw3IDkuNUwxMC41IDZcIiBzdHJva2U9XCIjMDA4MjM2XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJvdW5kZWQtWzRweF0gY3FhLWxlYWRpbmctNCBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1iZy1bI0RDRkNFN10gY3FhLXRleHQteHMgY3FhLXRleHQtWyMwMDgyMzZdXCI+UGFzczwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAodXBwZXJTdGF0dXMgPT09ICdGQUlMJykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjdcIiBzdHJva2U9XCIjQzEwMDA3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZMNiAxME02IDZMMTAgMTBcIiBzdHJva2U9XCIjQzEwMDA3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJvdW5kZWQtWzRweF0gY3FhLWxlYWRpbmctNCBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1iZy1bI0ZGRTJFMl0gY3FhLXRleHQteHMgY3FhLXRleHQtWyNDMTAwMDddXCI+RmFpbDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAodXBwZXJTdGF0dXMgPT09ICdJTl9QUk9HUkVTUycpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI3XCIgc3Ryb2tlPVwiIzNCODJGNlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJvdW5kZWQtWzRweF0gY3FhLWxlYWRpbmctNCBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1iZy1bI0VGRjZGRl0gY3FhLXRleHQteHMgY3FhLXRleHQtWyMzQjgyRjZdXCI+SW4gUHJvZ3Jlc3M8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImNxYS1yb3VuZGVkLVs0cHhdIGNxYS1sZWFkaW5nLTQgY3FhLXB4LTIgY3FhLXB5LTAuNSBjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzlDQTNBRl1cIj7igJQ8L3NwYW4+YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBpZiAoc2Vjb25kcyA8IDYwKSB7XG4gICAgICByZXR1cm4gYCR7c2Vjb25kcy50b0ZpeGVkKDEpfXNgO1xuICAgIH1cbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IHsgcGFnZUluZGV4OiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xuICAgIHRoaXMucGFnZVNpemUgPSBldmVudC5wYWdlU2l6ZTtcbiAgfVxuXG4gIGdldCBpc0VtcHR5U3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLml0ZXJhdGlvbnMgfHwgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBjb21wdXRlZFN1bW1hcnkoKTogSXRlcmF0aW9uU3VtbWFyeSB7XG4gICAgaWYgKHRoaXMuc3VtbWFyeSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcGFzc2VkID0gdGhpcy5pdGVyYXRpb25zLmZpbHRlcihpID0+IGkuc3RhdHVzID09PSAnUEFTUycpLmxlbmd0aDtcbiAgICBjb25zdCBmYWlsZWQgPSB0aGlzLml0ZXJhdGlvbnMuZmlsdGVyKGkgPT4gaS5zdGF0dXMgPT09ICdGQUlMJykubGVuZ3RoO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEl0ZXJhdGlvbnM6IHRoaXMuaXRlcmF0aW9ucy5sZW5ndGgsXG4gICAgICBwYXNzZWQsXG4gICAgICBmYWlsZWRcbiAgICB9O1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlO1wiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1iZy13aGl0ZVwiPlxuICAgICAgPGNxYS10YWJsZS10ZW1wbGF0ZVxuICAgICAgICBbY29sdW1uc109XCJ0YWJsZUNvbHVtbnNcIlxuICAgICAgICBbZGF0YV09XCJpdGVyYXRpb25zXCJcbiAgICAgICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxuICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICBbaXNFbXB0eVN0YXRlXT1cImlzRW1wdHlTdGF0ZVwiXG4gICAgICAgIFtlbXB0eVN0YXRlQ29uZmlnXT1cImVtcHR5U3RhdGVDb25maWdcIlxuICAgICAgICBbaXNUYWJsZURhdGFMb2FkaW5nXT1cImlzVGFibGVEYXRhTG9hZGluZ1wiXG4gICAgICAgIFtzaG93U2VhcmNoQmFyXT1cImZhbHNlXCJcbiAgICAgICAgW3Nob3dGaWx0ZXJCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICBbc2hvd1NldHRpbmdzQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgW3Nob3dBdXRvUmVmcmVzaEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgIFtzaG93T3RoZXJCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICBbc2hvd0ZpbHRlclBhbmVsXT1cImZhbHNlXCJcbiAgICAgICAgW3NlcnZlclNpZGVQYWdpbmF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLXRhYmxlLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0VtcHR5U3RhdGVcIiBjbGFzcz1cImNxYS1wLVsxN3B4XSBjcWEtbXQtNiBjcWEtYmctWyNGQkZDRkZdIGNxYS1yb3VuZGVkLVs1cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRTVFNUU1O1wiPlxuICAgICAgPGg0IGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbWItM1wiPlN1bW1hcnk8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMyBjcWEtZ2FwLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG90YWwgSXRlcmF0aW9uczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsyMnB4XSBjcWEtbGVhZGluZy1bMjhweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMwQjBCMEJdXCI+e3sgY29tcHV0ZWRTdW1tYXJ5LnRvdGFsSXRlcmF0aW9ucyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtbWItMVwiPlBhc3NlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsyMnB4XSBjcWEtbGVhZGluZy1bMjhweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMwMEM5NTBdXCI+e3sgY29tcHV0ZWRTdW1tYXJ5LnBhc3NlZCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtbWItMVwiPkZhaWxlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsyMnB4XSBjcWEtbGVhZGluZy1bMjhweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyNGQjJDMzZdXCI+e3sgY29tcHV0ZWRTdW1tYXJ5LmZhaWxlZCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
|