@cqa-lib/cqa-ui 0.1.2 → 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 +42 -67
- 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 +4 -4
- 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/esm2020/lib/search-bar/search-bar.component.mjs +3 -3
- package/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 +196 -17
- 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 +29 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +2899 -133
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +2867 -133
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- 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/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 +43 -6
- package/lib/utils/metadata-colors.util.d.ts +50 -0
- package/lib/utils/tw-overlay-container.d.ts +12 -0
- package/package.json +1 -1
- package/public-api.d.ts +28 -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 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { getMetadataValueStyle as getMetadataColorStyle } from '../../utils/metadata-colors.util';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/material/icon";
|
|
5
|
+
import * as i2 from "../../badge/badge.component";
|
|
6
|
+
import * as i3 from "../../button/button.component";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
export class InsightCardComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.title = '';
|
|
11
|
+
this.description = '';
|
|
12
|
+
this._badges = [];
|
|
13
|
+
this.metadataExpanded = true;
|
|
14
|
+
this.isPrerequisiteMissing = false;
|
|
15
|
+
this.isTestDataMissing = false;
|
|
16
|
+
// Track expanded state for sections
|
|
17
|
+
this.sectionExpandedState = new Map();
|
|
18
|
+
// Loading state for main action
|
|
19
|
+
this.isApplying = false;
|
|
20
|
+
this.metadataToggle = new EventEmitter();
|
|
21
|
+
this.sectionToggle = new EventEmitter();
|
|
22
|
+
this.sectionActionClick = new EventEmitter();
|
|
23
|
+
this.onApplySuggestionClick = new EventEmitter();
|
|
24
|
+
this.onAttachPrerequisitesClick = new EventEmitter();
|
|
25
|
+
this.onImportTestDataClick = new EventEmitter();
|
|
26
|
+
}
|
|
27
|
+
set badges(value) {
|
|
28
|
+
this._badges = value;
|
|
29
|
+
}
|
|
30
|
+
get badges() {
|
|
31
|
+
return this._badges;
|
|
32
|
+
}
|
|
33
|
+
toggleMetadata() {
|
|
34
|
+
this.metadataExpanded = !this.metadataExpanded;
|
|
35
|
+
this.metadataToggle.emit(this.metadataExpanded);
|
|
36
|
+
}
|
|
37
|
+
toggleSection(section) {
|
|
38
|
+
const currentState = this.sectionExpandedState.get(section.id) ?? (section.expanded ?? true);
|
|
39
|
+
const newState = !currentState;
|
|
40
|
+
this.sectionExpandedState.set(section.id, newState);
|
|
41
|
+
this.sectionToggle.emit({ id: section.id, expanded: newState });
|
|
42
|
+
}
|
|
43
|
+
onSectionAction(sectionId) {
|
|
44
|
+
this.sectionActionClick.emit(sectionId);
|
|
45
|
+
// Emit specific events for known actions
|
|
46
|
+
if (sectionId === 'prerequisite') {
|
|
47
|
+
this.onAttachPrerequisitesClick.emit();
|
|
48
|
+
}
|
|
49
|
+
else if (sectionId === 'test-data') {
|
|
50
|
+
this.onImportTestDataClick.emit();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
get visibleBadges() {
|
|
54
|
+
const visible = [];
|
|
55
|
+
if (this.isPrerequisiteMissing) {
|
|
56
|
+
visible.push({ label: 'Prerequisite Missing', variant: 'warning' });
|
|
57
|
+
}
|
|
58
|
+
if (this.isTestDataMissing) {
|
|
59
|
+
visible.push({ label: 'Test Data Missing', variant: 'error' });
|
|
60
|
+
}
|
|
61
|
+
// Also include any custom badges
|
|
62
|
+
if (this.badges) {
|
|
63
|
+
visible.push(...this.badges);
|
|
64
|
+
}
|
|
65
|
+
return visible;
|
|
66
|
+
}
|
|
67
|
+
get visibleSections() {
|
|
68
|
+
const visible = [];
|
|
69
|
+
if (this.isPrerequisiteMissing && this.prerequisiteSection) {
|
|
70
|
+
// Use stored state if available, otherwise default to true
|
|
71
|
+
const expanded = this.sectionExpandedState.has('prerequisite')
|
|
72
|
+
? this.sectionExpandedState.get('prerequisite')
|
|
73
|
+
: true;
|
|
74
|
+
visible.push({
|
|
75
|
+
id: 'prerequisite',
|
|
76
|
+
title: 'Prerequisite Missing',
|
|
77
|
+
variant: 'warning',
|
|
78
|
+
reason: this.prerequisiteSection,
|
|
79
|
+
actionButtonLabel: 'Attach Prerequisites',
|
|
80
|
+
expanded: expanded,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (this.isTestDataMissing && this.testDataSection) {
|
|
84
|
+
// Use stored state if available, otherwise default to true
|
|
85
|
+
const expanded = this.sectionExpandedState.has('test-data')
|
|
86
|
+
? this.sectionExpandedState.get('test-data')
|
|
87
|
+
: true;
|
|
88
|
+
visible.push({
|
|
89
|
+
id: 'test-data',
|
|
90
|
+
title: 'Test Data Missing',
|
|
91
|
+
variant: 'error',
|
|
92
|
+
reason: this.testDataSection,
|
|
93
|
+
actionButtonLabel: 'Import Test Data',
|
|
94
|
+
expanded: expanded,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return visible;
|
|
98
|
+
}
|
|
99
|
+
async onMainAction() {
|
|
100
|
+
if (this.isApplying) {
|
|
101
|
+
return; // Prevent multiple clicks
|
|
102
|
+
}
|
|
103
|
+
this.isApplying = true;
|
|
104
|
+
try {
|
|
105
|
+
this.onApplySuggestionClick.emit();
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
// Reset loading state after action completes
|
|
109
|
+
// If you need to keep the loading state longer, call resetApplyingState() manually
|
|
110
|
+
// after your async operation completes
|
|
111
|
+
this.isApplying = false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Method to reset loading state (can be called externally if needed)
|
|
115
|
+
resetApplyingState() {
|
|
116
|
+
this.isApplying = false;
|
|
117
|
+
}
|
|
118
|
+
// Removed getBadgeClasses - now using BadgeComponent
|
|
119
|
+
getSectionBorderClass(section) {
|
|
120
|
+
switch (section.variant) {
|
|
121
|
+
case 'warning':
|
|
122
|
+
return 'cqa-border-l-4 cqa-border-l-yellow-500';
|
|
123
|
+
case 'error':
|
|
124
|
+
return 'cqa-border-l-4 cqa-border-l-red-500';
|
|
125
|
+
default:
|
|
126
|
+
return 'cqa-border-l-4 cqa-border-l-gray-500';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
getMetadataValueClasses(key, value) {
|
|
130
|
+
// Base classes for all values (font-size: 14px, line-height: 18px, font-weight: 400)
|
|
131
|
+
return 'cqa-font-normal cqa-leading-[18px] cqa-tracking-normal';
|
|
132
|
+
}
|
|
133
|
+
getMetadataValue(value) {
|
|
134
|
+
if (typeof value === 'string') {
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
return value.value;
|
|
138
|
+
}
|
|
139
|
+
getMetadataValueStyle(key, value) {
|
|
140
|
+
// Use the shared utility function for consistent colors
|
|
141
|
+
return getMetadataColorStyle(key, value);
|
|
142
|
+
}
|
|
143
|
+
getSectionTitleClasses(section) {
|
|
144
|
+
const baseClasses = ['cqa-text-sm', 'cqa-font-bold'];
|
|
145
|
+
switch (section.variant) {
|
|
146
|
+
case 'warning':
|
|
147
|
+
return [...baseClasses, 'cqa-text-yellow-800'].join(' ');
|
|
148
|
+
case 'error':
|
|
149
|
+
return [...baseClasses, 'cqa-text-red-600'].join(' ');
|
|
150
|
+
default:
|
|
151
|
+
return [...baseClasses, 'cqa-text-ink'].join(' ');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
getSectionIconColor(section) {
|
|
155
|
+
switch (section.variant) {
|
|
156
|
+
case 'warning':
|
|
157
|
+
return 'cqa-text-yellow-800';
|
|
158
|
+
case 'error':
|
|
159
|
+
return 'cqa-text-red-600';
|
|
160
|
+
default:
|
|
161
|
+
return 'cqa-text-gray-400';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
InsightCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: InsightCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
166
|
+
InsightCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: InsightCardComponent, selector: "cqa-insight-card", inputs: { title: "title", description: "description", badges: "badges", metadata: "metadata", prerequisiteSection: "prerequisiteSection", testDataSection: "testDataSection", metadataExpanded: "metadataExpanded", isPrerequisiteMissing: "isPrerequisiteMissing", isTestDataMissing: "isTestDataMissing" }, outputs: { metadataToggle: "metadataToggle", sectionToggle: "sectionToggle", sectionActionClick: "sectionActionClick", onApplySuggestionClick: "onApplySuggestionClick", onAttachPrerequisitesClick: "onAttachPrerequisitesClick", onImportTestDataClick: "onImportTestDataClick" }, ngImport: i0, template: "<div id=\"cqa-ui-root\" style=\"background-color: white; border-radius: 0.5rem; border: 1px solid #E5E7EB; box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-px-[21px] cqa-py-3 cqa-border cqa-border-gray-200 cqa-rounded-2xl\">\n <!-- Section 1: Badges -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"visibleBadges.length > 0\">\n <mat-icon *ngIf=\"isPrerequisiteMissing || isTestDataMissing\"\n class=\"cqa-text-yellow-500 cqa-w-6 cqa-h-6\">warning</mat-icon>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge \n *ngFor=\"let badge of visibleBadges\" \n [label]=\"badge.label\"\n [icon]=\"badge.icon\"\n [variant]=\"badge.variant || 'default'\"\n ></cqa-badge>\n </div>\n </div>\n\n <!-- Section 2: Title & Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <h2 class=\"cqa-font-medium cqa-text-lg cqa-text-title\">\n {{ title }}\n </h2>\n <p class=\"cqa-text-base cqa-font-normal cqa-text-description\">\n {{ description }}\n </p>\n </div>\n\n <!-- Section 3: Metadata Section (always visible) -->\n <div *ngIf=\"metadata\" class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <div class=\"cqa-bg-surface-default cqa-rounded-xl cqa-border cqa-border-border-light cqa-px-4 cqa-py-3 cqa-border-t-2 cqa-border-t-primary-surface\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-3\">\n <ng-container *ngFor=\"let item of metadata | keyvalue; let last = last\">\n <div class=\"cqa-flex cqa-items-baseline cqa-gap-2\">\n <span class=\"cqa-text-xs cqa-font-normal cqa-tracking-normal cqa-font-inter cqa-text-metadata-key\">\n {{ item.key }}:\n </span>\n <span \n [ngClass]=\"getMetadataValueClasses(item.key, item.value)\" \n [ngStyle]=\"getMetadataValueStyle(item.key, item.value)\"\n class=\"cqa-font-normal cqa-leading-[18px] cqa-tracking-normal cqa-font-inter cqa-text-sm\">\n {{ getMetadataValue(item.value) }}\n </span>\n </div>\n <div *ngIf=\"!last\" class=\"cqa-h-4 cqa-w-px cqa-bg-gray-200\"></div>\n </ng-container>\n </div>\n </div>\n\n <!-- Section 4: Metadata toggle -->\n <button *ngIf=\"metadata && (isPrerequisiteMissing || isTestDataMissing)\" type=\"button\"\n class=\"cqa-text-sm cqa-text-primary-hover cqa-font-medium cqa-inline-flex cqa-items-center cqa-gap-1 cqa-cursor-pointer cqa-bg-transparent cqa-border-0 cqa-p-0 cqa-hover:cqa-text-primary cqa-transition-colors\"\n (click)=\"toggleMetadata()\">\n <span>{{ metadataExpanded ? 'Hide details' : 'Show details' }}</span>\n <mat-icon class=\"cqa-w-4 cqa-h-4 cqa-text-[16px] cqa-leading-[16px]\">\n {{ metadataExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n\n <!-- Section 5: Sections (toggle visibility) -->\n <div *ngIf=\"metadataExpanded && visibleSections?.length\" class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <div\n *ngFor=\"let section of visibleSections\"\n class=\"cqa-border cqa-border-gray-200 cqa-rounded-md cqa-bg-white cqa-overflow-hidden\"\n [ngClass]=\"getSectionBorderClass(section)\"\n >\n <div class=\"cqa-p-4 cqa-flex cqa-flex-col cqa-gap-3\">\n <!-- Section Title with Inline Collapse Button -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <h3 [ngClass]=\"getSectionTitleClasses(section)\" class=\"cqa-m-0\">\n {{ section.title }}\n </h3>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-inline-flex cqa-items-center cqa-justify-center cqa-cursor-pointer cqa-bg-transparent cqa-border-0 cqa-p-1 cqa-rounded-full cqa-hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"toggleSection(section)\"\n [attr.aria-label]=\"section.expanded !== false ? 'Collapse section' : 'Expand section'\"\n >\n <mat-icon [ngClass]=\"getSectionIconColor(section)\" class=\"cqa-w-4 cqa-h-4 cqa-text-[16px] cqa-leading-[16px]\">\n {{ section.expanded !== false ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n </div>\n\n <!-- Collapsible Content: Reason and Action Button -->\n <div *ngIf=\"section.expanded !== false\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <!-- Reason -->\n <p class=\"cqa-text-sm cqa-font-normal cqa-leading-4 cqa-text-neutral-600\">\n <strong>Reason:</strong> {{ section.reason }}\n </p>\n \n <!-- Action Button -->\n <div>\n <cqa-button\n variant=\"outlined\"\n (clicked)=\"onSectionAction(section.id)\"\n >\n {{ section.actionButtonLabel }}\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <cqa-button\n variant=\"filled\"\n [icon]=\"isApplying ? 'hourglass_empty' : 'auto_awesome'\"\n iconPosition=\"start\"\n (clicked)=\"onMainAction()\"\n [fullWidth]=\"true\"\n [disabled]=\"isApplying\"\n [iconColor]=\"isApplying ? '#EAB308' : undefined\"\n >\n {{ isApplying ? 'Applying suggestion' : 'Apply suggestion' }}\n </cqa-button>\n </div>\n</div>\n \n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.BadgeComponent, selector: "cqa-badge", inputs: ["label", "icon", "variant", "backgroundColor", "textColor", "iconBackgroundColor", "iconColor"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "keyvalue": i4.KeyValuePipe } });
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: InsightCardComponent, decorators: [{
|
|
168
|
+
type: Component,
|
|
169
|
+
args: [{ selector: 'cqa-insight-card', template: "<div id=\"cqa-ui-root\" style=\"background-color: white; border-radius: 0.5rem; border: 1px solid #E5E7EB; box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-px-[21px] cqa-py-3 cqa-border cqa-border-gray-200 cqa-rounded-2xl\">\n <!-- Section 1: Badges -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"visibleBadges.length > 0\">\n <mat-icon *ngIf=\"isPrerequisiteMissing || isTestDataMissing\"\n class=\"cqa-text-yellow-500 cqa-w-6 cqa-h-6\">warning</mat-icon>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge \n *ngFor=\"let badge of visibleBadges\" \n [label]=\"badge.label\"\n [icon]=\"badge.icon\"\n [variant]=\"badge.variant || 'default'\"\n ></cqa-badge>\n </div>\n </div>\n\n <!-- Section 2: Title & Description -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <h2 class=\"cqa-font-medium cqa-text-lg cqa-text-title\">\n {{ title }}\n </h2>\n <p class=\"cqa-text-base cqa-font-normal cqa-text-description\">\n {{ description }}\n </p>\n </div>\n\n <!-- Section 3: Metadata Section (always visible) -->\n <div *ngIf=\"metadata\" class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <div class=\"cqa-bg-surface-default cqa-rounded-xl cqa-border cqa-border-border-light cqa-px-4 cqa-py-3 cqa-border-t-2 cqa-border-t-primary-surface\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-3\">\n <ng-container *ngFor=\"let item of metadata | keyvalue; let last = last\">\n <div class=\"cqa-flex cqa-items-baseline cqa-gap-2\">\n <span class=\"cqa-text-xs cqa-font-normal cqa-tracking-normal cqa-font-inter cqa-text-metadata-key\">\n {{ item.key }}:\n </span>\n <span \n [ngClass]=\"getMetadataValueClasses(item.key, item.value)\" \n [ngStyle]=\"getMetadataValueStyle(item.key, item.value)\"\n class=\"cqa-font-normal cqa-leading-[18px] cqa-tracking-normal cqa-font-inter cqa-text-sm\">\n {{ getMetadataValue(item.value) }}\n </span>\n </div>\n <div *ngIf=\"!last\" class=\"cqa-h-4 cqa-w-px cqa-bg-gray-200\"></div>\n </ng-container>\n </div>\n </div>\n\n <!-- Section 4: Metadata toggle -->\n <button *ngIf=\"metadata && (isPrerequisiteMissing || isTestDataMissing)\" type=\"button\"\n class=\"cqa-text-sm cqa-text-primary-hover cqa-font-medium cqa-inline-flex cqa-items-center cqa-gap-1 cqa-cursor-pointer cqa-bg-transparent cqa-border-0 cqa-p-0 cqa-hover:cqa-text-primary cqa-transition-colors\"\n (click)=\"toggleMetadata()\">\n <span>{{ metadataExpanded ? 'Hide details' : 'Show details' }}</span>\n <mat-icon class=\"cqa-w-4 cqa-h-4 cqa-text-[16px] cqa-leading-[16px]\">\n {{ metadataExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n\n <!-- Section 5: Sections (toggle visibility) -->\n <div *ngIf=\"metadataExpanded && visibleSections?.length\" class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <div\n *ngFor=\"let section of visibleSections\"\n class=\"cqa-border cqa-border-gray-200 cqa-rounded-md cqa-bg-white cqa-overflow-hidden\"\n [ngClass]=\"getSectionBorderClass(section)\"\n >\n <div class=\"cqa-p-4 cqa-flex cqa-flex-col cqa-gap-3\">\n <!-- Section Title with Inline Collapse Button -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <h3 [ngClass]=\"getSectionTitleClasses(section)\" class=\"cqa-m-0\">\n {{ section.title }}\n </h3>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-inline-flex cqa-items-center cqa-justify-center cqa-cursor-pointer cqa-bg-transparent cqa-border-0 cqa-p-1 cqa-rounded-full cqa-hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"toggleSection(section)\"\n [attr.aria-label]=\"section.expanded !== false ? 'Collapse section' : 'Expand section'\"\n >\n <mat-icon [ngClass]=\"getSectionIconColor(section)\" class=\"cqa-w-4 cqa-h-4 cqa-text-[16px] cqa-leading-[16px]\">\n {{ section.expanded !== false ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n </div>\n\n <!-- Collapsible Content: Reason and Action Button -->\n <div *ngIf=\"section.expanded !== false\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <!-- Reason -->\n <p class=\"cqa-text-sm cqa-font-normal cqa-leading-4 cqa-text-neutral-600\">\n <strong>Reason:</strong> {{ section.reason }}\n </p>\n \n <!-- Action Button -->\n <div>\n <cqa-button\n variant=\"outlined\"\n (clicked)=\"onSectionAction(section.id)\"\n >\n {{ section.actionButtonLabel }}\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <cqa-button\n variant=\"filled\"\n [icon]=\"isApplying ? 'hourglass_empty' : 'auto_awesome'\"\n iconPosition=\"start\"\n (clicked)=\"onMainAction()\"\n [fullWidth]=\"true\"\n [disabled]=\"isApplying\"\n [iconColor]=\"isApplying ? '#EAB308' : undefined\"\n >\n {{ isApplying ? 'Applying suggestion' : 'Apply suggestion' }}\n </cqa-button>\n </div>\n</div>\n \n", styles: [] }]
|
|
170
|
+
}], propDecorators: { title: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], description: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], badges: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], metadata: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}], prerequisiteSection: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], testDataSection: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], metadataExpanded: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], isPrerequisiteMissing: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], isTestDataMissing: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], metadataToggle: [{
|
|
189
|
+
type: Output
|
|
190
|
+
}], sectionToggle: [{
|
|
191
|
+
type: Output
|
|
192
|
+
}], sectionActionClick: [{
|
|
193
|
+
type: Output
|
|
194
|
+
}], onApplySuggestionClick: [{
|
|
195
|
+
type: Output
|
|
196
|
+
}], onAttachPrerequisitesClick: [{
|
|
197
|
+
type: Output
|
|
198
|
+
}], onImportTestDataClick: [{
|
|
199
|
+
type: Output
|
|
200
|
+
}] } });
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zaWdodC1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy9pbnNpZ2h0LWNhcmQvaW5zaWdodC1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy9pbnNpZ2h0LWNhcmQvaW5zaWdodC1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixJQUFJLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7OztBQXdCbEcsTUFBTSxPQUFPLG9CQUFvQjtJQUxqQztRQU1XLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDMUIsWUFBTyxHQUFtQixFQUFFLENBQUM7UUFXNUIscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBQ2pDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2QyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFNUMsb0NBQW9DO1FBQzVCLHlCQUFvQixHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRS9ELGdDQUFnQztRQUNoQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBRWxCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUM3QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDO1FBQ3RFLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDaEQsMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNsRCwrQkFBMEIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3RELDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7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Q0gsQ0FBQzs7aUhBdkxVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLDJuQkN6QmpDLDAxS0FxSEE7MkZENUZhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0I7OEJBS25CLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdGLE1BQU07c0JBRFQsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQVFJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLDBCQUEwQjtzQkFBbkMsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TWV0YWRhdGFWYWx1ZVN0eWxlIGFzIGdldE1ldGFkYXRhQ29sb3JTdHlsZSB9IGZyb20gJy4uLy4uL3V0aWxzL21ldGFkYXRhLWNvbG9ycy51dGlsJztcbmltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50JztcblxuLy8gVXNlIEJhZGdlQ29tcG9uZW50IGlucHV0cyBkaXJlY3RseSBpbnN0ZWFkIG9mIGEgc2VwYXJhdGUgaW50ZXJmYWNlXG5leHBvcnQgdHlwZSBJbnNpZ2h0QmFkZ2UgPSBQaWNrPEJhZGdlQ29tcG9uZW50LCAnbGFiZWwnIHwgJ2ljb24nIHwgJ3ZhcmlhbnQnPjtcblxuZXhwb3J0IGludGVyZmFjZSBJbnNpZ2h0TWV0YWRhdGEge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGhpZ2hsaWdodD86IGJvb2xlYW4gfTtcbn1cblxuaW50ZXJmYWNlIEludGVybmFsSW5zaWdodFNlY3Rpb24ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB2YXJpYW50OiAnd2FybmluZycgfCAnZXJyb3InIHwgJ2RlZmF1bHQnO1xuICByZWFzb246IHN0cmluZztcbiAgYWN0aW9uQnV0dG9uTGFiZWw6IHN0cmluZztcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtaW5zaWdodC1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2luc2lnaHQtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgSW5zaWdodENhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfYmFkZ2VzOiBJbnNpZ2h0QmFkZ2VbXSA9IFtdO1xuICBASW5wdXQoKVxuICBzZXQgYmFkZ2VzKHZhbHVlOiBJbnNpZ2h0QmFkZ2VbXSkge1xuICAgIHRoaXMuX2JhZGdlcyA9IHZhbHVlO1xuICB9XG4gIGdldCBiYWRnZXMoKTogSW5zaWdodEJhZGdlW10ge1xuICAgIHJldHVybiB0aGlzLl9iYWRnZXM7XG4gIH1cbiAgQElucHV0KCkgbWV0YWRhdGE/OiBJbnNpZ2h0TWV0YWRhdGE7XG4gIEBJbnB1dCgpIHByZXJlcXVpc2l0ZVNlY3Rpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRlc3REYXRhU2VjdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgbWV0YWRhdGFFeHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGlzUHJlcmVxdWlzaXRlTWlzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1Rlc3REYXRhTWlzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFRyYWNrIGV4cGFuZGVkIHN0YXRlIGZvciBzZWN0aW9uc1xuICBwcml2YXRlIHNlY3Rpb25FeHBhbmRlZFN0YXRlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIExvYWRpbmcgc3RhdGUgZm9yIG1haW4gYWN0aW9uXG4gIGlzQXBwbHlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgbWV0YWRhdGFUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzZWN0aW9uVG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmc7IGV4cGFuZGVkOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBzZWN0aW9uQWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9uQXBwbHlTdWdnZXN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvbkF0dGFjaFByZXJlcXVpc2l0ZXNDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9uSW1wb3J0VGVzdERhdGFDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICB0b2dnbGVNZXRhZGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGFkYXRhRXhwYW5kZWQgPSAhdGhpcy5tZXRhZGF0YUV4cGFuZGVkO1xuICAgIHRoaXMubWV0YWRhdGFUb2dnbGUuZW1pdCh0aGlzLm1ldGFkYXRhRXhwYW5kZWQpO1xuICB9XG5cbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBJbnRlcm5hbEluc2lnaHRTZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zZWN0aW9uRXhwYW5kZWRTdGF0ZS5nZXQoc2VjdGlvbi5pZCkgPz8gKHNlY3Rpb24uZXhwYW5kZWQgPz8gdHJ1ZSk7XG4gICAgY29uc3QgbmV3U3RhdGUgPSAhY3VycmVudFN0YXRlO1xuICAgIHRoaXMuc2VjdGlvbkV4cGFuZGVkU3RhdGUuc2V0KHNlY3Rpb24uaWQsIG5ld1N0YXRlKTtcbiAgICBcbiAgICB0aGlzLnNlY3Rpb25Ub2dnbGUuZW1pdCh7IGlkOiBzZWN0aW9uLmlkLCBleHBhbmRlZDogbmV3U3RhdGUgfSk7XG4gIH1cblxuICBvblNlY3Rpb25BY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlY3Rpb25BY3Rpb25DbGljay5lbWl0KHNlY3Rpb25JZCk7XG4gICAgXG4gICAgLy8gRW1pdCBzcGVjaWZpYyBldmVudHMgZm9yIGtub3duIGFjdGlvbnNcbiAgICBpZiAoc2VjdGlvbklkID09PSAncHJlcmVxdWlzaXRlJykge1xuICAgICAgdGhpcy5vbkF0dGFjaFByZXJlcXVpc2l0ZXNDbGljay5lbWl0KCk7XG4gICAgfSBlbHNlIGlmIChzZWN0aW9uSWQgPT09ICd0ZXN0LWRhdGEnKSB7XG4gICAgICB0aGlzLm9uSW1wb3J0VGVzdERhdGFDbGljay5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZpc2libGVCYWRnZXMoKTogSW5zaWdodEJhZGdlW10ge1xuICAgIGNvbnN0IHZpc2libGU6IEluc2lnaHRCYWRnZVtdID0gW107XG4gICAgaWYgKHRoaXMuaXNQcmVyZXF1aXNpdGVNaXNzaW5nKSB7XG4gICAgICB2aXNpYmxlLnB1c2goeyBsYWJlbDogJ1ByZXJlcXVpc2l0ZSBNaXNzaW5nJywgdmFyaWFudDogJ3dhcm5pbmcnIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1Rlc3REYXRhTWlzc2luZykge1xuICAgICAgdmlzaWJsZS5wdXNoKHsgbGFiZWw6ICdUZXN0IERhdGEgTWlzc2luZycsIHZhcmlhbnQ6ICdlcnJvcicgfSk7XG4gICAgfVxuICAgIC8vIEFsc28gaW5jbHVkZSBhbnkgY3VzdG9tIGJhZGdlc1xuICAgIGlmICh0aGlzLmJhZGdlcykge1xuICAgICAgdmlzaWJsZS5wdXNoKC4uLnRoaXMuYmFkZ2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGU7XG4gIH1cblxuICBnZXQgdmlzaWJsZVNlY3Rpb25zKCk6IEludGVybmFsSW5zaWdodFNlY3Rpb25bXSB7XG4gICAgY29uc3QgdmlzaWJsZTogSW50ZXJuYWxJbnNpZ2h0U2VjdGlvbltdID0gW107XG4gICAgXG4gICAgaWYgKHRoaXMuaXNQcmVyZXF1aXNpdGVNaXNzaW5nICYmIHRoaXMucHJlcmVxdWlzaXRlU2VjdGlvbikge1xuICAgICAgLy8gVXNlIHN0b3JlZCBzdGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRydWVcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5zZWN0aW9uRXhwYW5kZWRTdGF0ZS5oYXMoJ3ByZXJlcXVpc2l0ZScpIFxuICAgICAgICA/IHRoaXMuc2VjdGlvbkV4cGFuZGVkU3RhdGUuZ2V0KCdwcmVyZXF1aXNpdGUnKSFcbiAgICAgICAgOiB0cnVlO1xuICAgICAgXG4gICAgICB2aXNpYmxlLnB1c2goe1xuICAgICAgICBpZDogJ3ByZXJlcXVpc2l0ZScsXG4gICAgICAgIHRpdGxlOiAnUHJlcmVxdWlzaXRlIE1pc3NpbmcnLFxuICAgICAgICB2YXJpYW50OiAnd2FybmluZycsXG4gICAgICAgIHJlYXNvbjogdGhpcy5wcmVyZXF1aXNpdGVTZWN0aW9uLFxuICAgICAgICBhY3Rpb25CdXR0b25MYWJlbDogJ0F0dGFjaCBQcmVyZXF1aXNpdGVzJyxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLmlzVGVzdERhdGFNaXNzaW5nICYmIHRoaXMudGVzdERhdGFTZWN0aW9uKSB7XG4gICAgICAvLyBVc2Ugc3RvcmVkIHN0YXRlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdHJ1ZVxuICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLnNlY3Rpb25FeHBhbmRlZFN0YXRlLmhhcygndGVzdC1kYXRhJylcbiAgICAgICAgPyB0aGlzLnNlY3Rpb25FeHBhbmRlZFN0YXRlLmdldCgndGVzdC1kYXRhJykhXG4gICAgICAgIDogdHJ1ZTtcbiAgICAgIFxuICAgICAgdmlzaWJsZS5wdXNoKHtcbiAgICAgICAgaWQ6ICd0ZXN0LWRhdGEnLFxuICAgICAgICB0aXRsZTogJ1Rlc3QgRGF0YSBNaXNzaW5nJyxcbiAgICAgICAgdmFyaWFudDogJ2Vycm9yJyxcbiAgICAgICAgcmVhc29uOiB0aGlzLnRlc3REYXRhU2VjdGlvbixcbiAgICAgICAgYWN0aW9uQnV0dG9uTGFiZWw6ICdJbXBvcnQgVGVzdCBEYXRhJyxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB2aXNpYmxlO1xuICB9XG5cbiAgYXN5bmMgb25NYWluQWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQXBwbHlpbmcpIHtcbiAgICAgIHJldHVybjsgLy8gUHJldmVudCBtdWx0aXBsZSBjbGlja3NcbiAgICB9XG4gICAgXG4gICAgdGhpcy5pc0FwcGx5aW5nID0gdHJ1ZTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkFwcGx5U3VnZ2VzdGlvbkNsaWNrLmVtaXQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVzZXQgbG9hZGluZyBzdGF0ZSBhZnRlciBhY3Rpb24gY29tcGxldGVzXG4gICAgICAvLyBJZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBsb2FkaW5nIHN0YXRlIGxvbmdlciwgY2FsbCByZXNldEFwcGx5aW5nU3RhdGUoKSBtYW51YWxseVxuICAgICAgLy8gYWZ0ZXIgeW91ciBhc3luYyBvcGVyYXRpb24gY29tcGxldGVzXG4gICAgICB0aGlzLmlzQXBwbHlpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBNZXRob2QgdG8gcmVzZXQgbG9hZGluZyBzdGF0ZSAoY2FuIGJlIGNhbGxlZCBleHRlcm5hbGx5IGlmIG5lZWRlZClcbiAgcmVzZXRBcHBseWluZ1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNBcHBseWluZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gUmVtb3ZlZCBnZXRCYWRnZUNsYXNzZXMgLSBub3cgdXNpbmcgQmFkZ2VDb21wb25lbnRcblxuICBnZXRTZWN0aW9uQm9yZGVyQ2xhc3Moc2VjdGlvbjogSW50ZXJuYWxJbnNpZ2h0U2VjdGlvbik6IHN0cmluZyB7XG4gICAgc3dpdGNoIChzZWN0aW9uLnZhcmlhbnQpIHtcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICByZXR1cm4gJ2NxYS1ib3JkZXItbC00IGNxYS1ib3JkZXItbC15ZWxsb3ctNTAwJztcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuICdjcWEtYm9yZGVyLWwtNCBjcWEtYm9yZGVyLWwtcmVkLTUwMCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS1ib3JkZXItbC00IGNxYS1ib3JkZXItbC1ncmF5LTUwMCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWV0YWRhdGFWYWx1ZUNsYXNzZXMoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGhpZ2hsaWdodD86IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gICAgLy8gQmFzZSBjbGFzc2VzIGZvciBhbGwgdmFsdWVzIChmb250LXNpemU6IDE0cHgsIGxpbmUtaGVpZ2h0OiAxOHB4LCBmb250LXdlaWdodDogNDAwKVxuICAgIHJldHVybiAnY3FhLWZvbnQtbm9ybWFsIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdHJhY2tpbmctbm9ybWFsJztcbiAgfVxuXG4gIGdldE1ldGFkYXRhVmFsdWUodmFsdWU6IHN0cmluZyB8IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgaGlnaGxpZ2h0PzogYm9vbGVhbiB9KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gIH1cblxuICBnZXRNZXRhZGF0YVZhbHVlU3R5bGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGhpZ2hsaWdodD86IGJvb2xlYW4gfSk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIC8vIFVzZSB0aGUgc2hhcmVkIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnNpc3RlbnQgY29sb3JzXG4gICAgcmV0dXJuIGdldE1ldGFkYXRhQ29sb3JTdHlsZShrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldFNlY3Rpb25UaXRsZUNsYXNzZXMoc2VjdGlvbjogSW50ZXJuYWxJbnNpZ2h0U2VjdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbJ2NxYS10ZXh0LXNtJywgJ2NxYS1mb250LWJvbGQnXTtcbiAgICBcbiAgICBzd2l0Y2ggKHNlY3Rpb24udmFyaWFudCkge1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiBbLi4uYmFzZUNsYXNzZXMsICdjcWEtdGV4dC15ZWxsb3ctODAwJ10uam9pbignICcpO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gWy4uLmJhc2VDbGFzc2VzLCAnY3FhLXRleHQtcmVkLTYwMCddLmpvaW4oJyAnKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFsuLi5iYXNlQ2xhc3NlcywgJ2NxYS10ZXh0LWluayddLmpvaW4oJyAnKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWN0aW9uSWNvbkNvbG9yKHNlY3Rpb246IEludGVybmFsSW5zaWdodFNlY3Rpb24pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc2VjdGlvbi52YXJpYW50KSB7XG4gICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC15ZWxsb3ctODAwJztcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1yZWQtNjAwJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtZ3JheS00MDAnO1xuICAgIH1cbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDAuNXJlbTsgYm9yZGVyOiAxcHggc29saWQgI0U1RTdFQjsgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1weC1bMjFweF0gY3FhLXB5LTMgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS1yb3VuZGVkLTJ4bFwiPlxuICAgIDwhLS0gU2VjdGlvbiAxOiBCYWRnZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCIgKm5nSWY9XCJ2aXNpYmxlQmFkZ2VzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImlzUHJlcmVxdWlzaXRlTWlzc2luZyB8fCBpc1Rlc3REYXRhTWlzc2luZ1wiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQteWVsbG93LTUwMCBjcWEtdy02IGNxYS1oLTZcIj53YXJuaW5nPC9tYXQtaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtMlwiPlxuICAgICAgICA8Y3FhLWJhZGdlIFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBiYWRnZSBvZiB2aXNpYmxlQmFkZ2VzXCIgXG4gICAgICAgICAgW2xhYmVsXT1cImJhZGdlLmxhYmVsXCJcbiAgICAgICAgICBbaWNvbl09XCJiYWRnZS5pY29uXCJcbiAgICAgICAgICBbdmFyaWFudF09XCJiYWRnZS52YXJpYW50IHx8ICdkZWZhdWx0J1wiXG4gICAgICAgID48L2NxYS1iYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTZWN0aW9uIDI6IFRpdGxlICYgRGVzY3JpcHRpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICAgIDxoMiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1sZyBjcWEtdGV4dC10aXRsZVwiPlxuICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgPC9oMj5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtYmFzZSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtZGVzY3JpcHRpb25cIj5cbiAgICAgICAge3sgZGVzY3JpcHRpb24gfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICA8IS0tIFNlY3Rpb24gMzogTWV0YWRhdGEgU2VjdGlvbiAoYWx3YXlzIHZpc2libGUpIC0tPlxuICA8ZGl2ICpuZ0lmPVwibWV0YWRhdGFcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWJnLXN1cmZhY2UtZGVmYXVsdCBjcWEtcm91bmRlZC14bCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItYm9yZGVyLWxpZ2h0IGNxYS1weC00IGNxYS1weS0zIGNxYS1ib3JkZXItdC0yIGNxYS1ib3JkZXItdC1wcmltYXJ5LXN1cmZhY2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWV0YWRhdGEgfCBrZXl2YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1iYXNlbGluZSBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLWZvbnQtbm9ybWFsIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtbWV0YWRhdGEta2V5XCI+XG4gICAgICAgICAgICAgIHt7IGl0ZW0ua2V5IH19OlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE1ldGFkYXRhVmFsdWVDbGFzc2VzKGl0ZW0ua2V5LCBpdGVtLnZhbHVlKVwiIFxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRNZXRhZGF0YVZhbHVlU3R5bGUoaXRlbS5rZXksIGl0ZW0udmFsdWUpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZm9udC1ub3JtYWwgY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10cmFja2luZy1ub3JtYWwgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgICAge3sgZ2V0TWV0YWRhdGFWYWx1ZShpdGVtLnZhbHVlKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbGFzdFwiIGNsYXNzPVwiY3FhLWgtNCBjcWEtdy1weCBjcWEtYmctZ3JheS0yMDBcIj48L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VjdGlvbiA0OiBNZXRhZGF0YSB0b2dnbGUgLS0+XG4gICAgPGJ1dHRvbiAqbmdJZj1cIm1ldGFkYXRhICYmIChpc1ByZXJlcXVpc2l0ZU1pc3NpbmcgfHwgaXNUZXN0RGF0YU1pc3NpbmcpXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LXByaW1hcnktaG92ZXIgY3FhLWZvbnQtbWVkaXVtIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItMCBjcWEtcC0wIGNxYS1ob3ZlcjpjcWEtdGV4dC1wcmltYXJ5IGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTWV0YWRhdGEoKVwiPlxuICAgICAgPHNwYW4+e3sgbWV0YWRhdGFFeHBhbmRlZCA/ICdIaWRlIGRldGFpbHMnIDogJ1Nob3cgZGV0YWlscycgfX08L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsxNnB4XVwiPlxuICAgICAgICB7eyBtZXRhZGF0YUV4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgIDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgPCEtLSBTZWN0aW9uIDU6IFNlY3Rpb25zICh0b2dnbGUgdmlzaWJpbGl0eSkgLS0+XG4gIDxkaXYgKm5nSWY9XCJtZXRhZGF0YUV4cGFuZGVkICYmIHZpc2libGVTZWN0aW9ucz8ubGVuZ3RoXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgdmlzaWJsZVNlY3Rpb25zXCJcbiAgICAgIGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS1yb3VuZGVkLW1kIGNxYS1iZy13aGl0ZSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgIFtuZ0NsYXNzXT1cImdldFNlY3Rpb25Cb3JkZXJDbGFzcyhzZWN0aW9uKVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICA8IS0tIFNlY3Rpb24gVGl0bGUgd2l0aCBJbmxpbmUgQ29sbGFwc2UgQnV0dG9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8aDMgW25nQ2xhc3NdPVwiZ2V0U2VjdGlvblRpdGxlQ2xhc3NlcyhzZWN0aW9uKVwiIGNsYXNzPVwiY3FhLW0tMFwiPlxuICAgICAgICAgICAge3sgc2VjdGlvbi50aXRsZSB9fVxuICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1tbC1hdXRvIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItMCBjcWEtcC0xIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oc2VjdGlvbilcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzZWN0aW9uLmV4cGFuZGVkICE9PSBmYWxzZSA/ICdDb2xsYXBzZSBzZWN0aW9uJyA6ICdFeHBhbmQgc2VjdGlvbidcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdDbGFzc109XCJnZXRTZWN0aW9uSWNvbkNvbG9yKHNlY3Rpb24pXCIgY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsxNnB4XVwiPlxuICAgICAgICAgICAgICB7eyBzZWN0aW9uLmV4cGFuZGVkICE9PSBmYWxzZSA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIENvbGxhcHNpYmxlIENvbnRlbnQ6IFJlYXNvbiBhbmQgQWN0aW9uIEJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlY3Rpb24uZXhwYW5kZWQgIT09IGZhbHNlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgPCEtLSBSZWFzb24gLS0+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1ub3JtYWwgY3FhLWxlYWRpbmctNCBjcWEtdGV4dC1uZXV0cmFsLTYwMFwiPlxuICAgICAgICAgICAgPHN0cm9uZz5SZWFzb246PC9zdHJvbmc+IHt7IHNlY3Rpb24ucmVhc29uIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbiAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25TZWN0aW9uQWN0aW9uKHNlY3Rpb24uaWQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgc2VjdGlvbi5hY3Rpb25CdXR0b25MYWJlbCB9fVxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgXG4gIDxjcWEtYnV0dG9uXG4gICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgIFtpY29uXT1cImlzQXBwbHlpbmcgPyAnaG91cmdsYXNzX2VtcHR5JyA6ICdhdXRvX2F3ZXNvbWUnXCJcbiAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgIChjbGlja2VkKT1cIm9uTWFpbkFjdGlvbigpXCJcbiAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiaXNBcHBseWluZ1wiXG4gICAgICBbaWNvbkNvbG9yXT1cImlzQXBwbHlpbmcgPyAnI0VBQjMwOCcgOiB1bmRlZmluZWRcIlxuICAgID5cbiAgICAgIHt7IGlzQXBwbHlpbmcgPyAnQXBwbHlpbmcgc3VnZ2VzdGlvbicgOiAnQXBwbHkgc3VnZ2VzdGlvbicgfX1cbiAgICA8L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4gXG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } 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 MetricsBlockComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.progress = '0%';
|
|
8
|
+
this.layout = '1';
|
|
9
|
+
this.itemslength = '0';
|
|
10
|
+
}
|
|
11
|
+
formatPercent(value) {
|
|
12
|
+
if (value === undefined || value === null || Number.isNaN(value))
|
|
13
|
+
return '';
|
|
14
|
+
const sign = value > 0 ? '+' : value < 0 ? '' : '';
|
|
15
|
+
return `${sign}${value}%`;
|
|
16
|
+
}
|
|
17
|
+
percentClass(value) {
|
|
18
|
+
if (value === undefined || value === null || Number.isNaN(value))
|
|
19
|
+
return 'cqa-text-[#6B7280]';
|
|
20
|
+
if (value > 0)
|
|
21
|
+
return 'cqa-text-[#10B981]';
|
|
22
|
+
if (value < 0)
|
|
23
|
+
return 'cqa-text-[#EF4444]';
|
|
24
|
+
return 'cqa-text-[#6B7280]';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
MetricsBlockComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MetricsBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
28
|
+
MetricsBlockComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MetricsBlockComponent, selector: "cqa-metrics-block", inputs: { item: "item", progress: "progress", layout: "layout", itemslength: "itemslength" }, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div\n [ngClass]=\"[layout === '1'\n ? 'cqa-flex cqa-justify-center cqa-items-center cqa-py-3 md:cqa-pt-1 md:cqa-pb-0.5 cqa-px-5 cqa-gap-3 cqa-w-full md:cqa-h-[62px] cqa-border-b-0 cqa-border-[#E5E7EB]'\n : 'cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-py-3 md:cqa-py-1 lg:cqa-px-5 cqa-px-2 cqa-w-full md:cqa-h-[53px]', itemslength == item.id ? 'cqa-border-l md:cqa-border-l-0 md:cqa-border-l' : '' , item.id == '1' && layout === '1' ? 'cqa-border-l md:cqa-border-r' : '']\">\n <ng-container *ngIf=\"layout === '1'; else layout2\">\n <!-- [ngClass]=\"{ 'border-l md:border-l-0': itemslength == item.id }\" -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-min-w-[40px] cqa-rounded-[10px]\"\n [ngClass]=\"item.accentBgClass || 'cqa-bg-[#EEF2FF]'\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\" [ngClass]=\"item.iconColorClass || 'cqa-text-[#3F43EE]'\"\n *ngIf=\"item.icon\">{{ item.icon }}</mat-icon>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-start cqa-gap-0.5 cqa-w-full cqa-h-auto cqa-flex-1 cqa-truncate\">\n <div class=\"cqa-w-full cqa-h-4 cqa-text-[12px] cqa-leading-4 cqa-font-medium cqa-text-[#6A7282]\">{{ item.label\n }}</div>\n <div class=\"cqa-w-full cqa-h-7 cqa-gap-2 cqa-flex\"\n [ngClass]=\"item.subtext ? 'cqa-justify-between cqa-items-center' : 'cqa-justify-start cqa-items-center'\">\n <div\n class=\"cqa-text-[20px] cqa-leading-[28px] cqa-font-semibold cqa-tracking-[-0.449219px] cqa-text-[#101828]\">\n {{ item.value | number }}</div>\n <div *ngIf=\"item.subtext\"\n class=\"cqa-text-[12px] cqa-leading-4 cqa-text-[#6A7282] cqa-truncate cqa-hidden sm:cqa-block\">{{\n item.subtext }}</div>\n </div>\n <div class=\"cqa-w-full cqa-h-1 cqa-rounded-full cqa-bg-[#F3F4F6] cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-rounded-full\" [ngClass]=\"item.colorClass || 'cqa-bg-[#3F43EE]'\"\n [style.width]=\"progress\"></div>\n </div>\n </div>\n </ng-container>\n <ng-template #layout2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[16px]\" [ngClass]=\"item.iconColorClass || 'cqa-text-[#3F43EE]'\"\n *ngIf=\"item.icon\">{{ item.icon }}</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-4 cqa-text-[#6B7280]\">{{ item.label }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-w-full cqa-justify-between\">\n <h6 class=\"cqa-text-[16px] cqa-leading-7 cqa-tracking-[-0.45px] cqa-text-[#111827]\">{{ item.value | number }}\n </h6>\n <span *ngIf=\"item.percent !== undefined\" class=\"cqa-text-[10px] cqa-leading-4\"\n [ngClass]=\"percentClass(item.percent)\">{{ formatPercent(item.percent) }}</span>\n </div>\n </ng-template>\n </div>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "number": i2.DecimalPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MetricsBlockComponent, decorators: [{
|
|
30
|
+
type: Component,
|
|
31
|
+
args: [{ selector: 'cqa-metrics-block', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div\n [ngClass]=\"[layout === '1'\n ? 'cqa-flex cqa-justify-center cqa-items-center cqa-py-3 md:cqa-pt-1 md:cqa-pb-0.5 cqa-px-5 cqa-gap-3 cqa-w-full md:cqa-h-[62px] cqa-border-b-0 cqa-border-[#E5E7EB]'\n : 'cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-py-3 md:cqa-py-1 lg:cqa-px-5 cqa-px-2 cqa-w-full md:cqa-h-[53px]', itemslength == item.id ? 'cqa-border-l md:cqa-border-l-0 md:cqa-border-l' : '' , item.id == '1' && layout === '1' ? 'cqa-border-l md:cqa-border-r' : '']\">\n <ng-container *ngIf=\"layout === '1'; else layout2\">\n <!-- [ngClass]=\"{ 'border-l md:border-l-0': itemslength == item.id }\" -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-min-w-[40px] cqa-rounded-[10px]\"\n [ngClass]=\"item.accentBgClass || 'cqa-bg-[#EEF2FF]'\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\" [ngClass]=\"item.iconColorClass || 'cqa-text-[#3F43EE]'\"\n *ngIf=\"item.icon\">{{ item.icon }}</mat-icon>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-start cqa-gap-0.5 cqa-w-full cqa-h-auto cqa-flex-1 cqa-truncate\">\n <div class=\"cqa-w-full cqa-h-4 cqa-text-[12px] cqa-leading-4 cqa-font-medium cqa-text-[#6A7282]\">{{ item.label\n }}</div>\n <div class=\"cqa-w-full cqa-h-7 cqa-gap-2 cqa-flex\"\n [ngClass]=\"item.subtext ? 'cqa-justify-between cqa-items-center' : 'cqa-justify-start cqa-items-center'\">\n <div\n class=\"cqa-text-[20px] cqa-leading-[28px] cqa-font-semibold cqa-tracking-[-0.449219px] cqa-text-[#101828]\">\n {{ item.value | number }}</div>\n <div *ngIf=\"item.subtext\"\n class=\"cqa-text-[12px] cqa-leading-4 cqa-text-[#6A7282] cqa-truncate cqa-hidden sm:cqa-block\">{{\n item.subtext }}</div>\n </div>\n <div class=\"cqa-w-full cqa-h-1 cqa-rounded-full cqa-bg-[#F3F4F6] cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-rounded-full\" [ngClass]=\"item.colorClass || 'cqa-bg-[#3F43EE]'\"\n [style.width]=\"progress\"></div>\n </div>\n </div>\n </ng-container>\n <ng-template #layout2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[16px]\" [ngClass]=\"item.iconColorClass || 'cqa-text-[#3F43EE]'\"\n *ngIf=\"item.icon\">{{ item.icon }}</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-4 cqa-text-[#6B7280]\">{{ item.label }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-w-full cqa-justify-between\">\n <h6 class=\"cqa-text-[16px] cqa-leading-7 cqa-tracking-[-0.45px] cqa-text-[#111827]\">{{ item.value | number }}\n </h6>\n <span *ngIf=\"item.percent !== undefined\" class=\"cqa-text-[10px] cqa-leading-4\"\n [ngClass]=\"percentClass(item.percent)\">{{ formatPercent(item.percent) }}</span>\n </div>\n </ng-template>\n </div>\n</div>", styles: [] }]
|
|
32
|
+
}], propDecorators: { item: [{
|
|
33
|
+
type: Input
|
|
34
|
+
}], progress: [{
|
|
35
|
+
type: Input
|
|
36
|
+
}], layout: [{
|
|
37
|
+
type: Input
|
|
38
|
+
}], itemslength: [{
|
|
39
|
+
type: Input
|
|
40
|
+
}] } });
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy1ibG9jay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rhc2hib2FyZHMvbWV0cmljcy1jYXJkL21ldHJpY3MtYmxvY2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kYXNoYm9hcmRzL21ldHJpY3MtY2FyZC9tZXRyaWNzLWJsb2NrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBUzFFLE1BQU0sT0FBTyxxQkFBcUI7SUFObEM7UUFRVyxhQUFRLEdBQVcsSUFBSSxDQUFDO1FBQ3hCLFdBQU0sR0FBVyxHQUFHLENBQUM7UUFDckIsZ0JBQVcsR0FBVyxHQUFHLENBQUM7S0FjcEM7SUFaQyxhQUFhLENBQUMsS0FBYztRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVFLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWM7UUFDekIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLG9CQUFvQixDQUFDO1FBQzlGLElBQUksS0FBSyxHQUFHLENBQUM7WUFBRSxPQUFPLG9CQUFvQixDQUFDO1FBQzNDLElBQUksS0FBSyxHQUFHLENBQUM7WUFBRSxPQUFPLG9CQUFvQixDQUFDO1FBQzNDLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQzs7a0hBakJVLHFCQUFxQjtzR0FBckIscUJBQXFCLHVKQ1RsQyxpOUZBNENNOzJGRG5DTyxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU07OEJBR3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1ldHJpY3NDYXJkSXRlbSB9IGZyb20gJy4vbWV0cmljcy1jYXJkLWl0ZW0uaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLW1ldHJpY3MtYmxvY2snLFxuICB0ZW1wbGF0ZVVybDogJy4vbWV0cmljcy1ibG9jay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZXRyaWNzQmxvY2tDb21wb25lbnQge1xuICBASW5wdXQoKSBpdGVtITogTWV0cmljc0NhcmRJdGVtO1xuICBASW5wdXQoKSBwcm9ncmVzczogc3RyaW5nID0gJzAlJztcbiAgQElucHV0KCkgbGF5b3V0OiBzdHJpbmcgPSAnMSc7XG4gIEBJbnB1dCgpIGl0ZW1zbGVuZ3RoOiBzdHJpbmcgPSAnMCc7XG5cbiAgZm9ybWF0UGVyY2VudCh2YWx1ZT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHNpZ24gPSB2YWx1ZSA+IDAgPyAnKycgOiB2YWx1ZSA8IDAgPyAnJyA6ICcnO1xuICAgIHJldHVybiBgJHtzaWdufSR7dmFsdWV9JWA7XG4gIH1cblxuICBwZXJjZW50Q2xhc3ModmFsdWU/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiAnY3FhLXRleHQtWyM2QjcyODBdJztcbiAgICBpZiAodmFsdWUgPiAwKSByZXR1cm4gJ2NxYS10ZXh0LVsjMTBCOTgxXSc7XG4gICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuICdjcWEtdGV4dC1bI0VGNDQ0NF0nO1xuICAgIHJldHVybiAnY3FhLXRleHQtWyM2QjcyODBdJztcbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2XG4gICAgW25nQ2xhc3NdPVwiW2xheW91dCA9PT0gJzEnXG4gICAgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB5LTMgbWQ6Y3FhLXB0LTEgbWQ6Y3FhLXBiLTAuNSBjcWEtcHgtNSBjcWEtZ2FwLTMgY3FhLXctZnVsbCBtZDpjcWEtaC1bNjJweF0gY3FhLWJvcmRlci1iLTAgY3FhLWJvcmRlci1bI0U1RTdFQl0nXG4gICAgOiAnY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1pdGVtcy1zdGFydCBjcWEtcHktMyBtZDpjcWEtcHktMSBsZzpjcWEtcHgtNSBjcWEtcHgtMiBjcWEtdy1mdWxsIG1kOmNxYS1oLVs1M3B4XScsIGl0ZW1zbGVuZ3RoID09IGl0ZW0uaWQgPyAnY3FhLWJvcmRlci1sIG1kOmNxYS1ib3JkZXItbC0wIG1kOmNxYS1ib3JkZXItbCcgOiAnJyAsIGl0ZW0uaWQgPT0gJzEnICYmIGxheW91dCA9PT0gJzEnID8gJ2NxYS1ib3JkZXItbCBtZDpjcWEtYm9yZGVyLXInIDogJyddXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dCA9PT0gJzEnOyBlbHNlIGxheW91dDJcIj5cbiAgICAgIDwhLS0gW25nQ2xhc3NdPVwieyAnYm9yZGVyLWwgbWQ6Ym9yZGVyLWwtMCc6IGl0ZW1zbGVuZ3RoID09IGl0ZW0uaWQgfVwiIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTEwIGNxYS1oLTEwIGNxYS1taW4tdy1bNDBweF0gY3FhLXJvdW5kZWQtWzEwcHhdXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5hY2NlbnRCZ0NsYXNzIHx8ICdjcWEtYmctWyNFRUYyRkZdJ1wiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdXCIgW25nQ2xhc3NdPVwiaXRlbS5pY29uQ29sb3JDbGFzcyB8fCAnY3FhLXRleHQtWyMzRjQzRUVdJ1wiXG4gICAgICAgICAgKm5nSWY9XCJpdGVtLmljb25cIj57eyBpdGVtLmljb24gfX08L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTAuNSBjcWEtdy1mdWxsIGNxYS1oLWF1dG8gY3FhLWZsZXgtMSBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtNCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctNCBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QTcyODJdXCI+e3sgaXRlbS5sYWJlbFxuICAgICAgICAgIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLTcgY3FhLWdhcC0yIGNxYS1mbGV4XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJpdGVtLnN1YnRleHQgPyAnY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtaXRlbXMtY2VudGVyJyA6ICdjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtY2VudGVyJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzIwcHhdIGNxYS1sZWFkaW5nLVsyOHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdHJhY2tpbmctWy0wLjQ0OTIxOXB4XSBjcWEtdGV4dC1bIzEwMTgyOF1cIj5cbiAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfCBudW1iZXIgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5zdWJ0ZXh0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLTQgY3FhLXRleHQtWyM2QTcyODJdIGNxYS10cnVuY2F0ZSBjcWEtaGlkZGVuIHNtOmNxYS1ibG9ja1wiPnt7XG4gICAgICAgICAgICBpdGVtLnN1YnRleHQgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLTEgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1vdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtcm91bmRlZC1mdWxsXCIgW25nQ2xhc3NdPVwiaXRlbS5jb2xvckNsYXNzIHx8ICdjcWEtYmctWyMzRjQzRUVdJ1wiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwicHJvZ3Jlc3NcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2xheW91dDI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTUgIWNxYS1oLTUgIWNxYS10ZXh0LVsxNnB4XVwiIFtuZ0NsYXNzXT1cIml0ZW0uaWNvbkNvbG9yQ2xhc3MgfHwgJ2NxYS10ZXh0LVsjM0Y0M0VFXSdcIlxuICAgICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCI+e3sgaXRlbS5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctNCBjcWEtdGV4dC1bIzZCNzI4MF1cIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtdy1mdWxsIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGg2IGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLTcgY3FhLXRyYWNraW5nLVstMC40NXB4XSBjcWEtdGV4dC1bIzExMTgyN11cIj57eyBpdGVtLnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvaDY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5wZXJjZW50ICE9PSB1bmRlZmluZWRcIiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy00XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJwZXJjZW50Q2xhc3MoaXRlbS5wZXJjZW50KVwiPnt7IGZvcm1hdFBlcmNlbnQoaXRlbS5wZXJjZW50KSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy1jYXJkLWl0ZW0uaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kYXNoYm9hcmRzL21ldHJpY3MtY2FyZC9tZXRyaWNzLWNhcmQtaXRlbS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTWV0cmljc0NhcmRJdGVtIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgaWNvbj86IHN0cmluZztcbiAgY29sb3JDbGFzcz86IHN0cmluZztcbiAgYWNjZW50QmdDbGFzcz86IHN0cmluZztcbiAgaWNvbkNvbG9yQ2xhc3M/OiBzdHJpbmc7XG4gIHN1YnRleHQ/OiBzdHJpbmc7XG4gIHBlcmNlbnQ/OiBudW1iZXI7IC8vIE9wdGlvbmFsIHBlcmNlbnQgZGVsdGEgZm9yIGxheW91dCAyXG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./metrics-block.component";
|
|
4
|
+
import * as i2 from "@angular/material/icon";
|
|
5
|
+
import * as i3 from "@angular/common";
|
|
6
|
+
export class MetricsCardComponent {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.icon = 'text_snippet';
|
|
9
|
+
this.title = 'Total Test Cases';
|
|
10
|
+
this.total = 0;
|
|
11
|
+
this.items = [];
|
|
12
|
+
this.cardClass = '';
|
|
13
|
+
this.layout = '1';
|
|
14
|
+
}
|
|
15
|
+
progressWidth(item) {
|
|
16
|
+
const max = item.max ?? this.inferMax();
|
|
17
|
+
if (!max || max <= 0)
|
|
18
|
+
return '0%';
|
|
19
|
+
const pct = Math.max(0, Math.min(100, (item.value / max) * 100));
|
|
20
|
+
return pct.toFixed(1) + '%';
|
|
21
|
+
}
|
|
22
|
+
inferMax() {
|
|
23
|
+
const maxFromItems = this.items.reduce((m, it) => Math.max(m, it.value), 0);
|
|
24
|
+
return maxFromItems || 1;
|
|
25
|
+
}
|
|
26
|
+
formatPercent(value) {
|
|
27
|
+
if (value === undefined || value === null || Number.isNaN(value))
|
|
28
|
+
return '';
|
|
29
|
+
const sign = value > 0 ? '+' : value < 0 ? '' : '';
|
|
30
|
+
return `${sign}${value}%`;
|
|
31
|
+
}
|
|
32
|
+
percentClass(value) {
|
|
33
|
+
if (value === undefined || value === null || Number.isNaN(value))
|
|
34
|
+
return 'cqa-text-[#6B7280]';
|
|
35
|
+
if (value > 0)
|
|
36
|
+
return 'cqa-text-[#10B981]'; // green
|
|
37
|
+
if (value < 0)
|
|
38
|
+
return 'cqa-text-[#EF4444]'; // red
|
|
39
|
+
return 'cqa-text-[#6B7280]'; // neutral
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
MetricsCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MetricsCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
43
|
+
MetricsCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MetricsCardComponent, selector: "cqa-metrics-card", inputs: { icon: "icon", title: "title", total: "total", items: "items", cardClass: "cardClass", layout: "layout", totalPercent: "totalPercent" }, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div *ngIf=\"layout === '1'\"\n class=\"cqa-w-full cqa-box-border cqa-flex cqa-flex-col cqa-items-start cqa-px-px cqa-pb-px md:cqa-h-[63px] cqa-bg-white cqa-border-t-2 cqa-border-r cqa-border-b-0 cqa-border-l cqa-border-solid cqa-border-[#3F43EE] cqa-rounded-[10px] cqa-flex-none cqa-order-0 cqa-self-stretch cqa-grow-0\"\n [ngClass]=\"cardClass\">\n <!-- Metric blocks -->\n <div\n class=\"cqa-flex-1 cqa-w-full cqa-grid cqa-grid-cols-2 md:cqa-gap-0 cqa-gap-y-2 cqa-py-1 md:cqa-p-0 sm:cqa-grid-cols-2 md:cqa-grid-cols-4 sm:cqa-border-r cqa-border-[#E5E7EB]\">\n <!-- Left total block -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-justify-center cqa-items-start cqa-py-3 md:cqa-pt-1 md:cqa-pb-0.5 cqa-px-6 cqa-gap-1 cqa-w-full sm:cqa-w-[100%] md:cqa-w-[180px] lg:cqa-w-[290px] md:cqa-h-[61px] cqa-border-b-1 sm:cqa-border-b-0 md:cqa-border-b-0 cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[12px] cqa-leading-[16px] cqa-font-medium cqa-text-[#6A7282]\"> {{ title }} </span>\n <h3 class=\"cqa-text-[30px] cqa-leading-[36px] cqa-font-bold cqa-tracking-[0.395508px] cqa-text-[#101828]\"> {{\n total | number }} </h3>\n </div>\n <cqa-metrics-block *ngFor=\"let it of items;\" [item]=\"it\" [itemslength]=\"items.length.toString()\"\n [progress]=\"progressWidth(it)\">\n </cqa-metrics-block>\n </div>\n </div>\n\n <div *ngIf=\"layout === '2'\"\n class=\"cqa-w-full cqa-box-border cqa-flex cqa-flex-col cqa-items-start cqa-px-px cqa-pb-px md:cqa-h-[63px] cqa-bg-white cqa-flex-none cqa-order-0 cqa-self-stretch cqa-grow-0\"\n [ngClass]=\"cardClass\">\n <div\n class=\"cqa-flex cqa-flex-col md:cqa-flex-row cqa-flex-wrap cqa-items-stretch cqa-w-full cqa-min-h-[53px] cqa-rounded-none cqa-flex-none cqa-order-0 cqa-self-stretch cqa-grow-0 cqa-gap-4\">\n <!-- Left total block -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-justify-center cqa-items-start cqa-py-3 md:cqa-py-1 cqa-px-4 sm:cqa-px-6 cqa-gap-1 cqa-w-full sm:cqa-w-[100%] md:cqa-w-[240px] lg:cqa-w-[290px] md:cqa-h-[61px] cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-relative cqa-overflow-hidden before:cqa-content-[''] before:cqa-bg-[#4C4C51] before:cqa-h-[2px] before:cqa-w-full before:cqa-absolute before:cqa-top-0 before:cqa-left-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-justify-between cqa-w-full\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#6B7280]\">{{ icon }}</mat-icon>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-4\">{{ title }}</span>\n <div class=\"cqa-flex cqa-items-end cqa-gap-2 cqa-ml-auto\">\n <h4 class=\"cqa-text-[28px] cqa-leading-7 cqa-tracking-[-0.45px] cqa-text-[#111827]\">{{ total | number }}\n </h4>\n <span *ngIf=\"totalPercent !== undefined\" class=\"cqa-text-[10px] cqa-leading-4\"\n [ngClass]=\"percentClass(totalPercent)\">{{ formatPercent(totalPercent) }}</span>\n </div>\n </div>\n\n </div>\n <!-- Metric blocks -->\n <div\n class=\"cqa-flex-1 cqa-w-full cqa-grid cqa-grid-cols-2 md:cqa-grid-cols-3 cqa-items-center cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-relative cqa-overflow-hidden\">\n <span class=\"cqa-h-[2px] cqa-w-full cqa-absolute cqa-top-0 cqa-left-0\"\n [style.background]=\"'linear-gradient(90deg, #3B82F6 0%, rgba(0, 0, 0, 0) 100%)'\"></span>\n <cqa-metrics-block *ngFor=\"let it of items; let i = index\" [item]=\"it\" [layout]=\"layout\">\n </cqa-metrics-block>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i1.MetricsBlockComponent, selector: "cqa-metrics-block", inputs: ["item", "progress", "layout", "itemslength"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "number": i3.DecimalPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MetricsCardComponent, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'cqa-metrics-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div *ngIf=\"layout === '1'\"\n class=\"cqa-w-full cqa-box-border cqa-flex cqa-flex-col cqa-items-start cqa-px-px cqa-pb-px md:cqa-h-[63px] cqa-bg-white cqa-border-t-2 cqa-border-r cqa-border-b-0 cqa-border-l cqa-border-solid cqa-border-[#3F43EE] cqa-rounded-[10px] cqa-flex-none cqa-order-0 cqa-self-stretch cqa-grow-0\"\n [ngClass]=\"cardClass\">\n <!-- Metric blocks -->\n <div\n class=\"cqa-flex-1 cqa-w-full cqa-grid cqa-grid-cols-2 md:cqa-gap-0 cqa-gap-y-2 cqa-py-1 md:cqa-p-0 sm:cqa-grid-cols-2 md:cqa-grid-cols-4 sm:cqa-border-r cqa-border-[#E5E7EB]\">\n <!-- Left total block -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-justify-center cqa-items-start cqa-py-3 md:cqa-pt-1 md:cqa-pb-0.5 cqa-px-6 cqa-gap-1 cqa-w-full sm:cqa-w-[100%] md:cqa-w-[180px] lg:cqa-w-[290px] md:cqa-h-[61px] cqa-border-b-1 sm:cqa-border-b-0 md:cqa-border-b-0 cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[12px] cqa-leading-[16px] cqa-font-medium cqa-text-[#6A7282]\"> {{ title }} </span>\n <h3 class=\"cqa-text-[30px] cqa-leading-[36px] cqa-font-bold cqa-tracking-[0.395508px] cqa-text-[#101828]\"> {{\n total | number }} </h3>\n </div>\n <cqa-metrics-block *ngFor=\"let it of items;\" [item]=\"it\" [itemslength]=\"items.length.toString()\"\n [progress]=\"progressWidth(it)\">\n </cqa-metrics-block>\n </div>\n </div>\n\n <div *ngIf=\"layout === '2'\"\n class=\"cqa-w-full cqa-box-border cqa-flex cqa-flex-col cqa-items-start cqa-px-px cqa-pb-px md:cqa-h-[63px] cqa-bg-white cqa-flex-none cqa-order-0 cqa-self-stretch cqa-grow-0\"\n [ngClass]=\"cardClass\">\n <div\n class=\"cqa-flex cqa-flex-col md:cqa-flex-row cqa-flex-wrap cqa-items-stretch cqa-w-full cqa-min-h-[53px] cqa-rounded-none cqa-flex-none cqa-order-0 cqa-self-stretch cqa-grow-0 cqa-gap-4\">\n <!-- Left total block -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-justify-center cqa-items-start cqa-py-3 md:cqa-py-1 cqa-px-4 sm:cqa-px-6 cqa-gap-1 cqa-w-full sm:cqa-w-[100%] md:cqa-w-[240px] lg:cqa-w-[290px] md:cqa-h-[61px] cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-relative cqa-overflow-hidden before:cqa-content-[''] before:cqa-bg-[#4C4C51] before:cqa-h-[2px] before:cqa-w-full before:cqa-absolute before:cqa-top-0 before:cqa-left-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-justify-between cqa-w-full\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#6B7280]\">{{ icon }}</mat-icon>\n <span class=\"cqa-text-[#6B7280] cqa-text-[14px] cqa-leading-4\">{{ title }}</span>\n <div class=\"cqa-flex cqa-items-end cqa-gap-2 cqa-ml-auto\">\n <h4 class=\"cqa-text-[28px] cqa-leading-7 cqa-tracking-[-0.45px] cqa-text-[#111827]\">{{ total | number }}\n </h4>\n <span *ngIf=\"totalPercent !== undefined\" class=\"cqa-text-[10px] cqa-leading-4\"\n [ngClass]=\"percentClass(totalPercent)\">{{ formatPercent(totalPercent) }}</span>\n </div>\n </div>\n\n </div>\n <!-- Metric blocks -->\n <div\n class=\"cqa-flex-1 cqa-w-full cqa-grid cqa-grid-cols-2 md:cqa-grid-cols-3 cqa-items-center cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-relative cqa-overflow-hidden\">\n <span class=\"cqa-h-[2px] cqa-w-full cqa-absolute cqa-top-0 cqa-left-0\"\n [style.background]=\"'linear-gradient(90deg, #3B82F6 0%, rgba(0, 0, 0, 0) 100%)'\"></span>\n <cqa-metrics-block *ngFor=\"let it of items; let i = index\" [item]=\"it\" [layout]=\"layout\">\n </cqa-metrics-block>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
|
|
47
|
+
}], propDecorators: { icon: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], title: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], total: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}], items: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], cardClass: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], layout: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], totalPercent: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}] } });
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy9tZXRyaWNzLWNhcmQvbWV0cmljcy1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy9tZXRyaWNzLWNhcmQvbWV0cmljcy1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVMxRSxNQUFNLE9BQU8sb0JBQW9CO0lBTmpDO1FBT1csU0FBSSxHQUFXLGNBQWMsQ0FBQztRQUM5QixVQUFLLEdBQVcsa0JBQWtCLENBQUM7UUFDbkMsVUFBSyxHQUFvQixDQUFDLENBQUM7UUFDM0IsVUFBSyxHQUFzQixFQUFFLENBQUM7UUFDOUIsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixXQUFNLEdBQVcsR0FBRyxDQUFDO0tBMkIvQjtJQXhCQyxhQUFhLENBQUMsSUFBcUI7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDOUIsQ0FBQztJQUVPLFFBQVE7UUFDZCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RSxPQUFPLFlBQVksSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFjO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUUsTUFBTSxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxPQUFPLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDO0lBQzVCLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYztRQUN6QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sb0JBQW9CLENBQUM7UUFDOUYsSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxRQUFRO1FBQ3BELElBQUksS0FBSyxHQUFHLENBQUM7WUFBRSxPQUFPLG9CQUFvQixDQUFDLENBQUMsTUFBTTtRQUNsRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsVUFBVTtJQUN6QyxDQUFDOztpSEFoQ1Usb0JBQW9CO3FHQUFwQixvQkFBb0IsME1DVGpDLDRvSEFrRE07MkZEekNPLG9CQUFvQjtrQkFOaEMsU0FBUzsrQkFDRSxrQkFBa0IsbUJBR1gsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWV0cmljc0NhcmRJdGVtIH0gZnJvbSAnLi9tZXRyaWNzLWNhcmQtaXRlbS5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbWV0cmljcy1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21ldHJpY3MtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZXRyaWNzQ2FyZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGljb246IHN0cmluZyA9ICd0ZXh0X3NuaXBwZXQnO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ1RvdGFsIFRlc3QgQ2FzZXMnO1xuICBASW5wdXQoKSB0b3RhbDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgQElucHV0KCkgaXRlbXM6IE1ldHJpY3NDYXJkSXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGNhcmRDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGxheW91dDogc3RyaW5nID0gJzEnO1xuICBASW5wdXQoKSB0b3RhbFBlcmNlbnQ/OiBudW1iZXI7IC8vIE9wdGlvbmFsIG92ZXJhbGwgcGVyY2VudCBkZWx0YSBmb3IgbGF5b3V0IDJcblxuICBwcm9ncmVzc1dpZHRoKGl0ZW06IE1ldHJpY3NDYXJkSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4ID0gaXRlbS5tYXggPz8gdGhpcy5pbmZlck1heCgpO1xuICAgIGlmICghbWF4IHx8IG1heCA8PSAwKSByZXR1cm4gJzAlJztcbiAgICBjb25zdCBwY3QgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIChpdGVtLnZhbHVlIC8gbWF4KSAqIDEwMCkpO1xuICAgIHJldHVybiBwY3QudG9GaXhlZCgxKSArICclJztcbiAgfVxuXG4gIHByaXZhdGUgaW5mZXJNYXgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXhGcm9tSXRlbXMgPSB0aGlzLml0ZW1zLnJlZHVjZSgobSwgaXQpID0+IE1hdGgubWF4KG0sIGl0LnZhbHVlKSwgMCk7XG4gICAgcmV0dXJuIG1heEZyb21JdGVtcyB8fCAxO1xuICB9XG5cbiAgZm9ybWF0UGVyY2VudCh2YWx1ZT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHNpZ24gPSB2YWx1ZSA+IDAgPyAnKycgOiB2YWx1ZSA8IDAgPyAnJyA6ICcnO1xuICAgIHJldHVybiBgJHtzaWdufSR7dmFsdWV9JWA7XG4gIH1cblxuICBwZXJjZW50Q2xhc3ModmFsdWU/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiAnY3FhLXRleHQtWyM2QjcyODBdJztcbiAgICBpZiAodmFsdWUgPiAwKSByZXR1cm4gJ2NxYS10ZXh0LVsjMTBCOTgxXSc7IC8vIGdyZWVuXG4gICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuICdjcWEtdGV4dC1bI0VGNDQ0NF0nOyAvLyByZWRcbiAgICByZXR1cm4gJ2NxYS10ZXh0LVsjNkI3MjgwXSc7IC8vIG5ldXRyYWxcbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2ICpuZ0lmPVwibGF5b3V0ID09PSAnMSdcIlxuICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYm94LWJvcmRlciBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLXN0YXJ0IGNxYS1weC1weCBjcWEtcGItcHggbWQ6Y3FhLWgtWzYzcHhdIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyLXQtMiBjcWEtYm9yZGVyLXIgY3FhLWJvcmRlci1iLTAgY3FhLWJvcmRlci1sIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzNGNDNFRV0gY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1mbGV4LW5vbmUgY3FhLW9yZGVyLTAgY3FhLXNlbGYtc3RyZXRjaCBjcWEtZ3Jvdy0wXCJcbiAgICBbbmdDbGFzc109XCJjYXJkQ2xhc3NcIj5cbiAgICA8IS0tIE1ldHJpYyBibG9ja3MgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS13LWZ1bGwgY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIG1kOmNxYS1nYXAtMCBjcWEtZ2FwLXktMiBjcWEtcHktMSBtZDpjcWEtcC0wIHNtOmNxYS1ncmlkLWNvbHMtMiBtZDpjcWEtZ3JpZC1jb2xzLTQgc206Y3FhLWJvcmRlci1yIGNxYS1ib3JkZXItWyNFNUU3RUJdXCI+XG4gICAgICA8IS0tIExlZnQgdG90YWwgYmxvY2sgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtc3RhcnQgY3FhLXB5LTMgbWQ6Y3FhLXB0LTEgbWQ6Y3FhLXBiLTAuNSBjcWEtcHgtNiBjcWEtZ2FwLTEgY3FhLXctZnVsbCBzbTpjcWEtdy1bMTAwJV0gbWQ6Y3FhLXctWzE4MHB4XSBsZzpjcWEtdy1bMjkwcHhdIG1kOmNxYS1oLVs2MXB4XSBjcWEtYm9yZGVyLWItMSBzbTpjcWEtYm9yZGVyLWItMCBtZDpjcWEtYm9yZGVyLWItMCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTZweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkE3MjgyXVwiPiB7eyB0aXRsZSB9fSA8L3NwYW4+XG4gICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVszMHB4XSBjcWEtbGVhZGluZy1bMzZweF0gY3FhLWZvbnQtYm9sZCBjcWEtdHJhY2tpbmctWzAuMzk1NTA4cHhdIGNxYS10ZXh0LVsjMTAxODI4XVwiPiB7e1xuICAgICAgICAgIHRvdGFsIHwgbnVtYmVyIH19IDwvaDM+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjcWEtbWV0cmljcy1ibG9jayAqbmdGb3I9XCJsZXQgaXQgb2YgaXRlbXM7XCIgW2l0ZW1dPVwiaXRcIiBbaXRlbXNsZW5ndGhdPVwiaXRlbXMubGVuZ3RoLnRvU3RyaW5nKClcIlxuICAgICAgICBbcHJvZ3Jlc3NdPVwicHJvZ3Jlc3NXaWR0aChpdClcIj5cbiAgICAgIDwvY3FhLW1ldHJpY3MtYmxvY2s+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJsYXlvdXQgPT09ICcyJ1wiXG4gICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1ib3gtYm9yZGVyIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtc3RhcnQgY3FhLXB4LXB4IGNxYS1wYi1weCBtZDpjcWEtaC1bNjNweF0gY3FhLWJnLXdoaXRlIGNxYS1mbGV4LW5vbmUgY3FhLW9yZGVyLTAgY3FhLXNlbGYtc3RyZXRjaCBjcWEtZ3Jvdy0wXCJcbiAgICBbbmdDbGFzc109XCJjYXJkQ2xhc3NcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBtZDpjcWEtZmxleC1yb3cgY3FhLWZsZXgtd3JhcCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtdy1mdWxsIGNxYS1taW4taC1bNTNweF0gY3FhLXJvdW5kZWQtbm9uZSBjcWEtZmxleC1ub25lIGNxYS1vcmRlci0wIGNxYS1zZWxmLXN0cmV0Y2ggY3FhLWdyb3ctMCBjcWEtZ2FwLTRcIj5cbiAgICAgIDwhLS0gTGVmdCB0b3RhbCBibG9jayAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1zdGFydCBjcWEtcHktMyBtZDpjcWEtcHktMSBjcWEtcHgtNCBzbTpjcWEtcHgtNiBjcWEtZ2FwLTEgY3FhLXctZnVsbCBzbTpjcWEtdy1bMTAwJV0gbWQ6Y3FhLXctWzI0MHB4XSBsZzpjcWEtdy1bMjkwcHhdIG1kOmNxYS1oLVs2MXB4XSBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yZWxhdGl2ZSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGJlZm9yZTpjcWEtY29udGVudC1bJyddIGJlZm9yZTpjcWEtYmctWyM0QzRDNTFdIGJlZm9yZTpjcWEtaC1bMnB4XSBiZWZvcmU6Y3FhLXctZnVsbCBiZWZvcmU6Y3FhLWFic29sdXRlIGJlZm9yZTpjcWEtdG9wLTAgYmVmb3JlOmNxYS1sZWZ0LTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+e3sgaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLTRcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWVuZCBjcWEtZ2FwLTIgY3FhLW1sLWF1dG9cIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cImNxYS10ZXh0LVsyOHB4XSBjcWEtbGVhZGluZy03IGNxYS10cmFja2luZy1bLTAuNDVweF0gY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgdG90YWwgfCBudW1iZXIgfX1cbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRvdGFsUGVyY2VudCAhPT0gdW5kZWZpbmVkXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctNFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBlcmNlbnRDbGFzcyh0b3RhbFBlcmNlbnQpXCI+e3sgZm9ybWF0UGVyY2VudCh0b3RhbFBlcmNlbnQpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIE1ldHJpYyBibG9ja3MgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdy1mdWxsIGNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMiBtZDpjcWEtZ3JpZC1jb2xzLTMgY3FhLWl0ZW1zLWNlbnRlciBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yZWxhdGl2ZSBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWgtWzJweF0gY3FhLXctZnVsbCBjcWEtYWJzb2x1dGUgY3FhLXRvcC0wIGNxYS1sZWZ0LTBcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIidsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzQjgyRjYgMCUsIHJnYmEoMCwgMCwgMCwgMCkgMTAwJSknXCI+PC9zcGFuPlxuICAgICAgICA8Y3FhLW1ldHJpY3MtYmxvY2sgKm5nRm9yPVwibGV0IGl0IG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCIgW2l0ZW1dPVwiaXRcIiBbbGF5b3V0XT1cImxheW91dFwiPlxuICAgICAgICA8L2NxYS1tZXRyaWNzLWJsb2NrPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export class ProgressTextCardComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.value = 0; // 0 - 100
|
|
7
|
+
this.label = 'Test Success Rate';
|
|
8
|
+
this.deltaSuffix = 'since last run';
|
|
9
|
+
this.cardClass = '';
|
|
10
|
+
}
|
|
11
|
+
get percentText() {
|
|
12
|
+
const v = Math.max(0, Math.min(100, Number(this.value) || 0));
|
|
13
|
+
return `${v}%`;
|
|
14
|
+
}
|
|
15
|
+
get fillWidth() {
|
|
16
|
+
const v = Math.max(0, Math.min(100, Number(this.value) || 0));
|
|
17
|
+
return v + '%';
|
|
18
|
+
}
|
|
19
|
+
deltaClass() {
|
|
20
|
+
if (this.deltaPercent === undefined || this.deltaPercent === null || Number.isNaN(this.deltaPercent)) {
|
|
21
|
+
return 'text-[#6B7280]';
|
|
22
|
+
}
|
|
23
|
+
if (this.deltaPercent > 0)
|
|
24
|
+
return 'text-[#10B981]';
|
|
25
|
+
if (this.deltaPercent < 0)
|
|
26
|
+
return 'text-[#EF4444]';
|
|
27
|
+
return 'text-[#6B7280]';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
ProgressTextCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ProgressTextCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
31
|
+
ProgressTextCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ProgressTextCardComponent, selector: "cqa-progress-text-card", inputs: { value: "value", label: "label", deltaPercent: "deltaPercent", deltaSuffix: "deltaSuffix", cardClass: "cardClass" }, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div\n class=\"cqa-w-full cqa-box-border cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-rounded-[10px] cqa-p-4 sm:cqa-p-5\"\n [ngClass]=\"cardClass\">\n <div class=\"cqa-flex cqa-items-baseline cqa-gap-2\">\n <div\n class=\"cqa-text-[28px] sm:cqa-text-[32px] cqa-leading-[36px] cqa-font-bold cqa-tracking-[-0.3px] cqa-text-[#111827]\">\n {{ percentText }}</div>\n <div class=\"cqa-text-[18px] sm:cqa-text-[20px] cqa-leading-[28px] cqa-text-[#111827]\">{{ label }}</div>\n </div>\n <div class=\"cqa-mt-4 cqa-w-full cqa-h-[14px] cqa-bg-[#E5E7EB] cqa-rounded-full cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-rounded-full\" [style.width]=\"fillWidth\"\n [style.background]=\"'linear-gradient(90deg, #DD5A38 0%, #F59E0B 40%, #10B981 100%)'\">\n </div>\n </div>\n <div class=\"cqa-mt-2 cqa-text-[14px] cqa-leading-5\" [ngClass]=\"deltaClass()\" *ngIf=\"deltaPercent !== undefined\">\n {{ deltaPercent > 0 ? '+' : ''}}{{ deltaPercent }}% {{ deltaSuffix }}\n </div>\n </div>\n</div>", directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ProgressTextCardComponent, decorators: [{
|
|
33
|
+
type: Component,
|
|
34
|
+
args: [{ selector: 'cqa-progress-text-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div\n class=\"cqa-w-full cqa-box-border cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-rounded-[10px] cqa-p-4 sm:cqa-p-5\"\n [ngClass]=\"cardClass\">\n <div class=\"cqa-flex cqa-items-baseline cqa-gap-2\">\n <div\n class=\"cqa-text-[28px] sm:cqa-text-[32px] cqa-leading-[36px] cqa-font-bold cqa-tracking-[-0.3px] cqa-text-[#111827]\">\n {{ percentText }}</div>\n <div class=\"cqa-text-[18px] sm:cqa-text-[20px] cqa-leading-[28px] cqa-text-[#111827]\">{{ label }}</div>\n </div>\n <div class=\"cqa-mt-4 cqa-w-full cqa-h-[14px] cqa-bg-[#E5E7EB] cqa-rounded-full cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-rounded-full\" [style.width]=\"fillWidth\"\n [style.background]=\"'linear-gradient(90deg, #DD5A38 0%, #F59E0B 40%, #10B981 100%)'\">\n </div>\n </div>\n <div class=\"cqa-mt-2 cqa-text-[14px] cqa-leading-5\" [ngClass]=\"deltaClass()\" *ngIf=\"deltaPercent !== undefined\">\n {{ deltaPercent > 0 ? '+' : ''}}{{ deltaPercent }}% {{ deltaSuffix }}\n </div>\n </div>\n</div>", styles: [] }]
|
|
35
|
+
}], propDecorators: { value: [{
|
|
36
|
+
type: Input
|
|
37
|
+
}], label: [{
|
|
38
|
+
type: Input
|
|
39
|
+
}], deltaPercent: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], deltaSuffix: [{
|
|
42
|
+
type: Input
|
|
43
|
+
}], cardClass: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}] } });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtdGV4dC1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy9wcm9ncmVzcy10ZXh0LWNhcmQvcHJvZ3Jlc3MtdGV4dC1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy9wcm9ncmVzcy10ZXh0LWNhcmQvcHJvZ3Jlc3MtdGV4dC1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFRMUUsTUFBTSxPQUFPLHlCQUF5QjtJQU50QztRQU9XLFVBQUssR0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVO1FBQzdCLFVBQUssR0FBVyxtQkFBbUIsQ0FBQztRQUVwQyxnQkFBVyxHQUFXLGdCQUFnQixDQUFDO1FBQ3ZDLGNBQVMsR0FBVyxFQUFFLENBQUM7S0FvQmpDO0lBbEJDLElBQUksV0FBVztRQUNiLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3BHLE9BQU8sZ0JBQWdCLENBQUM7U0FDekI7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQztZQUFFLE9BQU8sZ0JBQWdCLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUM7WUFBRSxPQUFPLGdCQUFnQixDQUFDO1FBQ25ELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzs7c0hBeEJVLHlCQUF5QjswR0FBekIseUJBQXlCLDRMQ1J0QyxxbUNBbUJNOzJGRFhPLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx3QkFBd0IsbUJBR2pCLHVCQUF1QixDQUFDLE1BQU07OEJBR3RDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtcHJvZ3Jlc3MtdGV4dC1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2dyZXNzLXRleHQtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1RleHRDYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IDA7IC8vIDAgLSAxMDBcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdUZXN0IFN1Y2Nlc3MgUmF0ZSc7XG4gIEBJbnB1dCgpIGRlbHRhUGVyY2VudD86IG51bWJlcjsgLy8gZS5nLiwgKzhcbiAgQElucHV0KCkgZGVsdGFTdWZmaXg6IHN0cmluZyA9ICdzaW5jZSBsYXN0IHJ1bic7XG4gIEBJbnB1dCgpIGNhcmRDbGFzczogc3RyaW5nID0gJyc7XG5cbiAgZ2V0IHBlcmNlbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgTnVtYmVyKHRoaXMudmFsdWUpIHx8IDApKTtcbiAgICByZXR1cm4gYCR7dn0lYDtcbiAgfVxuXG4gIGdldCBmaWxsV2lkdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBOdW1iZXIodGhpcy52YWx1ZSkgfHwgMCkpO1xuICAgIHJldHVybiB2ICsgJyUnO1xuICB9XG5cbiAgZGVsdGFDbGFzcygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRlbHRhUGVyY2VudCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZGVsdGFQZXJjZW50ID09PSBudWxsIHx8IE51bWJlci5pc05hTih0aGlzLmRlbHRhUGVyY2VudCkpIHtcbiAgICAgIHJldHVybiAndGV4dC1bIzZCNzI4MF0nO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWx0YVBlcmNlbnQgPiAwKSByZXR1cm4gJ3RleHQtWyMxMEI5ODFdJztcbiAgICBpZiAodGhpcy5kZWx0YVBlcmNlbnQgPCAwKSByZXR1cm4gJ3RleHQtWyNFRjQ0NDRdJztcbiAgICByZXR1cm4gJ3RleHQtWyM2QjcyODBdJztcbiAgfVxufVxuXG5cbiIsIjxkaXYgaWQ9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1ib3gtYm9yZGVyIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtcC00IHNtOmNxYS1wLTVcIlxuICAgIFtuZ0NsYXNzXT1cImNhcmRDbGFzc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtYmFzZWxpbmUgY3FhLWdhcC0yXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzI4cHhdIHNtOmNxYS10ZXh0LVszMnB4XSBjcWEtbGVhZGluZy1bMzZweF0gY3FhLWZvbnQtYm9sZCBjcWEtdHJhY2tpbmctWy0wLjNweF0gY3FhLXRleHQtWyMxMTE4MjddXCI+XG4gICAgICAgIHt7IHBlcmNlbnRUZXh0IH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIHNtOmNxYS10ZXh0LVsyMHB4XSBjcWEtbGVhZGluZy1bMjhweF0gY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgbGFiZWwgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW10LTQgY3FhLXctZnVsbCBjcWEtaC1bMTRweF0gY3FhLWJnLVsjRTVFN0VCXSBjcWEtcm91bmRlZC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1yb3VuZGVkLWZ1bGxcIiBbc3R5bGUud2lkdGhdPVwiZmlsbFdpZHRoXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiJ2xpbmVhci1ncmFkaWVudCg5MGRlZywgI0RENUEzOCAwJSwgI0Y1OUUwQiA0MCUsICMxMEI5ODEgMTAwJSknXCI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW10LTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLTVcIiBbbmdDbGFzc109XCJkZWx0YUNsYXNzKClcIiAqbmdJZj1cImRlbHRhUGVyY2VudCAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICB7eyBkZWx0YVBlcmNlbnQgPiAwID8gJysnIDogJyd9fXt7IGRlbHRhUGVyY2VudCB9fSUge3sgZGVsdGFTdWZmaXggfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } 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 TestDistributionCardComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.title = 'Test Distribution';
|
|
8
|
+
this.segments = [];
|
|
9
|
+
this.items = [];
|
|
10
|
+
}
|
|
11
|
+
totalSegments() {
|
|
12
|
+
return this.segments.reduce((sum, s) => sum + (s.value || 0), 0) || 1;
|
|
13
|
+
}
|
|
14
|
+
segmentWidth(segment) {
|
|
15
|
+
const total = this.totalSegments();
|
|
16
|
+
const pct = Math.max(0, Math.min(100, (segment.value / total) * 100));
|
|
17
|
+
return pct + '%';
|
|
18
|
+
}
|
|
19
|
+
segmentColor(segment, fallback) {
|
|
20
|
+
return segment.colorClass || fallback;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
TestDistributionCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDistributionCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
+
TestDistributionCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDistributionCardComponent, selector: "cqa-test-distribution-card", inputs: { title: "title", segments: "segments", items: "items" }, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-bg-white cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-p-4\">\n <!-- Title -->\n <h3 class=\"cqa-text-[16px] cqa-leading-6 cqa-font-medium cqa-text-[#111827] cqa-mb-3\">{{ title }}</h3>\n\n <!-- Stacked segments pill -->\n <div class=\"cqa-w-full cqa-h-[28px] cqa-rounded-full cqa-bg-[#F3F4F6] cqa-overflow-hidden cqa-flex cqa-mb-3\">\n <ng-container *ngFor=\"let s of segments; let i = index; let last = last\">\n <div\n class=\"cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-text-white cqa-text-[12px] cqa-leading-[12px]\"\n [ngClass]=\"[\n segmentColor(s, i === 0 ? 'cqa-bg-[#4F46E5]' : i === segments.length - 1 ? 'cqa-bg-[#10B981]' : 'cqa-bg-[#8B5CF6]'),\n i === 0 ? 'cqa-rounded-l-full' : '',\n last ? 'cqa-rounded-r-full' : ''\n ]\" [style.width]=\"segmentWidth(s)\">\n {{ s.label }}\n </div>\n </ng-container>\n </div>\n\n <!-- Items list -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let it of items\" class=\"cqa-flex cqa-flex-col\">\n <!-- Parent row -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-py-1\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-icon class=\"cqa-text-[#6B7280]\" [style.width.px]=\"16\" [style.height.px]=\"16\" [style.fontSize.px]=\"16\"\n *ngIf=\"it.icon\">{{ it.icon }}</mat-icon>\n <span class=\"cqa-text-[14px] cqa-leading-5 cqa-text-[#111827]\">{{ it.label }}</span>\n </div>\n <div class=\"cqa-text-[14px] cqa-leading-5 cqa-font-semibold cqa-text-[#111827]\">{{ it.value | number }}</div>\n </div>\n\n <!-- Children rows -->\n <div *ngIf=\"it.children?.length\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let ch of it.children\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-2 cqa-py-1 cqa-rounded-md cqa-bg-[#F9FAFB] cqa-text-[#6B7280]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <span class=\"cqa-w-[6px] cqa-h-[14px] cqa-rounded-full\"\n [ngClass]=\"ch.colorClass || 'cqa-bg-[#8B5CF6]'\"></span>\n <span class=\"cqa-text-[12px] cqa-leading-5\">\n {{ ch.label }}\n <span class=\"cqa-font-semibold cqa-text-[#111827]\">{{ ch.value }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "number": i2.DecimalPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDistributionCardComponent, decorators: [{
|
|
26
|
+
type: Component,
|
|
27
|
+
args: [{ selector: 'cqa-test-distribution-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-bg-white cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-p-4\">\n <!-- Title -->\n <h3 class=\"cqa-text-[16px] cqa-leading-6 cqa-font-medium cqa-text-[#111827] cqa-mb-3\">{{ title }}</h3>\n\n <!-- Stacked segments pill -->\n <div class=\"cqa-w-full cqa-h-[28px] cqa-rounded-full cqa-bg-[#F3F4F6] cqa-overflow-hidden cqa-flex cqa-mb-3\">\n <ng-container *ngFor=\"let s of segments; let i = index; let last = last\">\n <div\n class=\"cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-text-white cqa-text-[12px] cqa-leading-[12px]\"\n [ngClass]=\"[\n segmentColor(s, i === 0 ? 'cqa-bg-[#4F46E5]' : i === segments.length - 1 ? 'cqa-bg-[#10B981]' : 'cqa-bg-[#8B5CF6]'),\n i === 0 ? 'cqa-rounded-l-full' : '',\n last ? 'cqa-rounded-r-full' : ''\n ]\" [style.width]=\"segmentWidth(s)\">\n {{ s.label }}\n </div>\n </ng-container>\n </div>\n\n <!-- Items list -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let it of items\" class=\"cqa-flex cqa-flex-col\">\n <!-- Parent row -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-py-1\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-icon class=\"cqa-text-[#6B7280]\" [style.width.px]=\"16\" [style.height.px]=\"16\" [style.fontSize.px]=\"16\"\n *ngIf=\"it.icon\">{{ it.icon }}</mat-icon>\n <span class=\"cqa-text-[14px] cqa-leading-5 cqa-text-[#111827]\">{{ it.label }}</span>\n </div>\n <div class=\"cqa-text-[14px] cqa-leading-5 cqa-font-semibold cqa-text-[#111827]\">{{ it.value | number }}</div>\n </div>\n\n <!-- Children rows -->\n <div *ngIf=\"it.children?.length\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let ch of it.children\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-2 cqa-py-1 cqa-rounded-md cqa-bg-[#F9FAFB] cqa-text-[#6B7280]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <span class=\"cqa-w-[6px] cqa-h-[14px] cqa-rounded-full\"\n [ngClass]=\"ch.colorClass || 'cqa-bg-[#8B5CF6]'\"></span>\n <span class=\"cqa-text-[12px] cqa-leading-5\">\n {{ ch.label }}\n <span class=\"cqa-font-semibold cqa-text-[#111827]\">{{ ch.value }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
|
|
28
|
+
}], propDecorators: { title: [{
|
|
29
|
+
type: Input
|
|
30
|
+
}], segments: [{
|
|
31
|
+
type: Input
|
|
32
|
+
}], items: [{
|
|
33
|
+
type: Input
|
|
34
|
+
}] } });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kaXN0cmlidXRpb24tY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rhc2hib2FyZHMvdGVzdC1kaXN0cmlidXRpb24tY2FyZC90ZXN0LWRpc3RyaWJ1dGlvbi1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy90ZXN0LWRpc3RyaWJ1dGlvbi1jYXJkL3Rlc3QtZGlzdHJpYnV0aW9uLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUE2QjFFLE1BQU0sT0FBTyw2QkFBNkI7SUFOMUM7UUFPVyxVQUFLLEdBQVcsbUJBQW1CLENBQUM7UUFDcEMsYUFBUSxHQUEwQixFQUFFLENBQUM7UUFDckMsVUFBSyxHQUF1QixFQUFFLENBQUM7S0FlekM7SUFiQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBNEI7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQTRCLEVBQUUsUUFBZ0I7UUFDekQsT0FBTyxPQUFPLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQztJQUN4QyxDQUFDOzswSEFqQlUsNkJBQTZCOzhHQUE3Qiw2QkFBNkIsb0lDN0IxQyxta0ZBa0RNOzJGRHJCTyw2QkFBNkI7a0JBTnpDLFNBQVM7K0JBQ0UsNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvblNlZ21lbnQge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICAvKiogVGFpbHdpbmQtbGlrZSBjbGFzcyBvciBoZXggYmcgY29sb3IgKi9cbiAgY29sb3JDbGFzcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXN0cmlidXRpb25DaGlsZEl0ZW0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBjb2xvckNsYXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkl0ZW0ge1xuICBpY29uPzogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBjb2xvckNsYXNzPzogc3RyaW5nOyAvLyB1c2VkIGZvciBpY29uL2FjY2VudCBpZiBkZXNpcmVkXG4gIGNoaWxkcmVuPzogRGlzdHJpYnV0aW9uQ2hpbGRJdGVtW107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRpc3RyaWJ1dGlvbi1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rlc3QtZGlzdHJpYnV0aW9uLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERpc3RyaWJ1dGlvbkNhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ1Rlc3QgRGlzdHJpYnV0aW9uJztcbiAgQElucHV0KCkgc2VnbWVudHM6IERpc3RyaWJ1dGlvblNlZ21lbnRbXSA9IFtdO1xuICBASW5wdXQoKSBpdGVtczogRGlzdHJpYnV0aW9uSXRlbVtdID0gW107XG5cbiAgdG90YWxTZWdtZW50cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyAocy52YWx1ZSB8fCAwKSwgMCkgfHwgMTtcbiAgfVxuXG4gIHNlZ21lbnRXaWR0aChzZWdtZW50OiBEaXN0cmlidXRpb25TZWdtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxTZWdtZW50cygpO1xuICAgIGNvbnN0IHBjdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgKHNlZ21lbnQudmFsdWUgLyB0b3RhbCkgKiAxMDApKTtcbiAgICByZXR1cm4gcGN0ICsgJyUnO1xuICB9XG5cbiAgc2VnbWVudENvbG9yKHNlZ21lbnQ6IERpc3RyaWJ1dGlvblNlZ21lbnQsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZWdtZW50LmNvbG9yQ2xhc3MgfHwgZmFsbGJhY2s7XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXAtNFwiPlxuICAgIDwhLS0gVGl0bGUgLS0+XG4gICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLTYgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbWItM1wiPnt7IHRpdGxlIH19PC9oMz5cblxuICAgIDwhLS0gU3RhY2tlZCBzZWdtZW50cyBwaWxsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLVsyOHB4XSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0YzRjRGNl0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtZmxleCBjcWEtbWItM1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBzZWdtZW50czsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxMnB4XVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgc2VnbWVudENvbG9yKHMsIGkgPT09IDAgPyAnY3FhLWJnLVsjNEY0NkU1XScgOiBpID09PSBzZWdtZW50cy5sZW5ndGggLSAxID8gJ2NxYS1iZy1bIzEwQjk4MV0nIDogJ2NxYS1iZy1bIzhCNUNGNl0nKSxcbiAgICAgICAgICAgIGkgPT09IDAgPyAnY3FhLXJvdW5kZWQtbC1mdWxsJyA6ICcnLFxuICAgICAgICAgICAgbGFzdCA/ICdjcWEtcm91bmRlZC1yLWZ1bGwnIDogJydcbiAgICAgICAgICBdXCIgW3N0eWxlLndpZHRoXT1cInNlZ21lbnRXaWR0aChzKVwiPlxuICAgICAgICAgIHt7IHMubGFiZWwgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSXRlbXMgbGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXQgb2YgaXRlbXNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICA8IS0tIFBhcmVudCByb3cgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXB5LTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiIFtzdHlsZS53aWR0aC5weF09XCIxNlwiIFtzdHlsZS5oZWlnaHQucHhdPVwiMTZcIiBbc3R5bGUuZm9udFNpemUucHhdPVwiMTZcIlxuICAgICAgICAgICAgICAqbmdJZj1cIml0Lmljb25cIj57eyBpdC5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLTUgY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy01IGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGl0LnZhbHVlIHwgbnVtYmVyIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ2hpbGRyZW4gcm93cyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIml0LmNoaWxkcmVuPy5sZW5ndGhcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaCBvZiBpdC5jaGlsZHJlblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtMiBjcWEtcHktMSBjcWEtcm91bmRlZC1tZCBjcWEtYmctWyNGOUZBRkJdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctWzZweF0gY3FhLWgtWzE0cHhdIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNoLmNvbG9yQ2xhc3MgfHwgJ2NxYS1iZy1bIzhCNUNGNl0nXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy01XCI+XG4gICAgICAgICAgICAgICAge3sgY2gubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGNoLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|