@cqa-lib/cqa-ui 1.1.264 → 1.1.265
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/detail-side-panel/detail-side-panel.component.mjs +9 -127
- package/fesm2015/cqa-lib-cqa-ui.mjs +313 -430
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +313 -430
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/detail-side-panel/detail-side-panel.component.d.ts +4 -62
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -33524,6 +33524,280 @@ const DETAIL_SIDE_PANEL_SCROLL_STYLES = `
|
|
|
33524
33524
|
}
|
|
33525
33525
|
`;
|
|
33526
33526
|
|
|
33527
|
+
class DetailSidePanelComponent {
|
|
33528
|
+
constructor() {
|
|
33529
|
+
/** Tabs - each tab has a side panel icon button; tabs and buttons are 1:1. Host defines tabs and content. */
|
|
33530
|
+
this.tabs = [
|
|
33531
|
+
{ label: 'Test Case', value: 'test-case', icon: 'description' },
|
|
33532
|
+
{ label: 'Data Library', value: 'data-library', icon: 'folder' },
|
|
33533
|
+
{ label: 'Variables', value: 'variables', icon: 'code' },
|
|
33534
|
+
];
|
|
33535
|
+
/** Currently active tab value */
|
|
33536
|
+
this.activeTab = 'test-case';
|
|
33537
|
+
/** Whether to show the close button in the side menu */
|
|
33538
|
+
this.showCloseButton = false;
|
|
33539
|
+
/** Whether the panel is expanded (affects expand button icon and panel width) */
|
|
33540
|
+
this.expanded = true;
|
|
33541
|
+
/** Panel width when expanded (e.g. '480px', '25%') */
|
|
33542
|
+
this.expandedWidth = '380px';
|
|
33543
|
+
/** Panel width when collapsed (e.g. '56px' - fits icon bar + back button) */
|
|
33544
|
+
this.collapsedWidth = '56px';
|
|
33545
|
+
this.hostOverflow = 'hidden';
|
|
33546
|
+
/** Tooltip for expand button when panel is collapsed */
|
|
33547
|
+
this.expandTooltip = 'Expand';
|
|
33548
|
+
/** Tooltip for expand button when panel is expanded (collapse) */
|
|
33549
|
+
this.collapseTooltip = 'Collapse';
|
|
33550
|
+
/** Tooltip for close button */
|
|
33551
|
+
this.closeTooltip = 'Close';
|
|
33552
|
+
this.back = new EventEmitter();
|
|
33553
|
+
this.tabChange = new EventEmitter();
|
|
33554
|
+
this.expandToggle = new EventEmitter();
|
|
33555
|
+
this.close = new EventEmitter();
|
|
33556
|
+
}
|
|
33557
|
+
get hostWidth() {
|
|
33558
|
+
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
33559
|
+
}
|
|
33560
|
+
get hostMinWidth() {
|
|
33561
|
+
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
33562
|
+
}
|
|
33563
|
+
get hostMaxWidth() {
|
|
33564
|
+
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
33565
|
+
}
|
|
33566
|
+
trackByTabValue(_i, tab) {
|
|
33567
|
+
return tab.value;
|
|
33568
|
+
}
|
|
33569
|
+
onBack() {
|
|
33570
|
+
this.back.emit();
|
|
33571
|
+
}
|
|
33572
|
+
onTabClick(tab) {
|
|
33573
|
+
if (!this.expanded) {
|
|
33574
|
+
this.expandToggle.emit();
|
|
33575
|
+
}
|
|
33576
|
+
if (tab.value !== this.activeTab) {
|
|
33577
|
+
this.tabChange.emit(tab.value);
|
|
33578
|
+
}
|
|
33579
|
+
}
|
|
33580
|
+
onExpandToggle() {
|
|
33581
|
+
this.expandToggle.emit();
|
|
33582
|
+
}
|
|
33583
|
+
onClose() {
|
|
33584
|
+
this.close.emit();
|
|
33585
|
+
}
|
|
33586
|
+
}
|
|
33587
|
+
DetailSidePanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
33588
|
+
DetailSidePanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailSidePanelComponent, selector: "cqa-detail-side-panel", inputs: { tabs: "tabs", activeTab: "activeTab", showCloseButton: "showCloseButton", expanded: "expanded", expandedWidth: "expandedWidth", collapsedWidth: "collapsedWidth", expandTooltip: "expandTooltip", collapseTooltip: "collapseTooltip", closeTooltip: "closeTooltip" }, outputs: { back: "back", tabChange: "tabChange", expandToggle: "expandToggle", close: "close" }, host: { properties: { "style.width": "this.hostWidth", "style.min-width": "this.hostMinWidth", "style.max-width": "this.hostMaxWidth", "style.overflow": "this.hostOverflow" }, styleAttribute: "transition: width 0.3s ease-in-out", classAttribute: "cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-flex-shrink-0 cqa-flex-grow-0 cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Tab content: fully provided by host via content projection. Host uses *ngIf per tab so only active content is projected. Add/remove tabs in the host without changing cqa-ui-lib. -->\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n", styles: [".detail-side-panel-scroll{overflow-y:auto!important;overflow-x:hidden!important;min-height:0!important;-webkit-overflow-scrolling:touch}\n"], components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
33589
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, decorators: [{
|
|
33590
|
+
type: Component,
|
|
33591
|
+
args: [{ selector: 'cqa-detail-side-panel', styles: [DETAIL_SIDE_PANEL_SCROLL_STYLES], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
33592
|
+
class: 'cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-flex-shrink-0 cqa-flex-grow-0 cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]',
|
|
33593
|
+
style: 'transition: width 0.3s ease-in-out',
|
|
33594
|
+
}, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Tab content: fully provided by host via content projection. Host uses *ngIf per tab so only active content is projected. Add/remove tabs in the host without changing cqa-ui-lib. -->\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
33595
|
+
}], propDecorators: { tabs: [{
|
|
33596
|
+
type: Input
|
|
33597
|
+
}], activeTab: [{
|
|
33598
|
+
type: Input
|
|
33599
|
+
}], showCloseButton: [{
|
|
33600
|
+
type: Input
|
|
33601
|
+
}], expanded: [{
|
|
33602
|
+
type: Input
|
|
33603
|
+
}], expandedWidth: [{
|
|
33604
|
+
type: Input
|
|
33605
|
+
}], collapsedWidth: [{
|
|
33606
|
+
type: Input
|
|
33607
|
+
}], hostWidth: [{
|
|
33608
|
+
type: HostBinding,
|
|
33609
|
+
args: ['style.width']
|
|
33610
|
+
}], hostMinWidth: [{
|
|
33611
|
+
type: HostBinding,
|
|
33612
|
+
args: ['style.min-width']
|
|
33613
|
+
}], hostMaxWidth: [{
|
|
33614
|
+
type: HostBinding,
|
|
33615
|
+
args: ['style.max-width']
|
|
33616
|
+
}], hostOverflow: [{
|
|
33617
|
+
type: HostBinding,
|
|
33618
|
+
args: ['style.overflow']
|
|
33619
|
+
}], expandTooltip: [{
|
|
33620
|
+
type: Input
|
|
33621
|
+
}], collapseTooltip: [{
|
|
33622
|
+
type: Input
|
|
33623
|
+
}], closeTooltip: [{
|
|
33624
|
+
type: Input
|
|
33625
|
+
}], back: [{
|
|
33626
|
+
type: Output
|
|
33627
|
+
}], tabChange: [{
|
|
33628
|
+
type: Output
|
|
33629
|
+
}], expandToggle: [{
|
|
33630
|
+
type: Output
|
|
33631
|
+
}], close: [{
|
|
33632
|
+
type: Output
|
|
33633
|
+
}] } });
|
|
33634
|
+
|
|
33635
|
+
class DetailDrawerTabContentDirective {
|
|
33636
|
+
constructor(templateRef) {
|
|
33637
|
+
this.templateRef = templateRef;
|
|
33638
|
+
}
|
|
33639
|
+
}
|
|
33640
|
+
DetailDrawerTabContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
33641
|
+
DetailDrawerTabContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerTabContentDirective, selector: "[cqaTabContent]", ngImport: i0 });
|
|
33642
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, decorators: [{
|
|
33643
|
+
type: Directive,
|
|
33644
|
+
args: [{
|
|
33645
|
+
selector: '[cqaTabContent]',
|
|
33646
|
+
}]
|
|
33647
|
+
}], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
|
|
33648
|
+
|
|
33649
|
+
class DetailDrawerTabComponent {
|
|
33650
|
+
constructor() {
|
|
33651
|
+
/** Tab label (shown in tooltip on icon button) */
|
|
33652
|
+
this.label = '';
|
|
33653
|
+
/** Tab value (unique identifier) */
|
|
33654
|
+
this.value = '';
|
|
33655
|
+
/** Material icon name for the tab button */
|
|
33656
|
+
this.icon = 'folder';
|
|
33657
|
+
}
|
|
33658
|
+
get contentTemplate() {
|
|
33659
|
+
var _a, _b;
|
|
33660
|
+
return (_b = (_a = this.contentDirective) === null || _a === void 0 ? void 0 : _a.templateRef) !== null && _b !== void 0 ? _b : null;
|
|
33661
|
+
}
|
|
33662
|
+
}
|
|
33663
|
+
DetailDrawerTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
33664
|
+
DetailDrawerTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerTabComponent, selector: "cqa-detail-drawer-tab", inputs: { label: "label", value: "value", icon: "icon" }, host: { styleAttribute: "display: contents" }, queries: [{ propertyName: "contentDirective", first: true, predicate: DetailDrawerTabContentDirective, descendants: true }], ngImport: i0, template: '', isInline: true });
|
|
33665
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, decorators: [{
|
|
33666
|
+
type: Component,
|
|
33667
|
+
args: [{
|
|
33668
|
+
selector: 'cqa-detail-drawer-tab',
|
|
33669
|
+
template: '',
|
|
33670
|
+
host: {
|
|
33671
|
+
style: 'display: contents',
|
|
33672
|
+
},
|
|
33673
|
+
}]
|
|
33674
|
+
}], propDecorators: { label: [{
|
|
33675
|
+
type: Input
|
|
33676
|
+
}], value: [{
|
|
33677
|
+
type: Input
|
|
33678
|
+
}], icon: [{
|
|
33679
|
+
type: Input
|
|
33680
|
+
}], contentDirective: [{
|
|
33681
|
+
type: ContentChild,
|
|
33682
|
+
args: [DetailDrawerTabContentDirective]
|
|
33683
|
+
}] } });
|
|
33684
|
+
|
|
33685
|
+
class DetailDrawerComponent {
|
|
33686
|
+
constructor() {
|
|
33687
|
+
/** Currently active tab value */
|
|
33688
|
+
this.activeTab = '';
|
|
33689
|
+
/** Whether to show the close button */
|
|
33690
|
+
this.showCloseButton = true;
|
|
33691
|
+
/** Whether the drawer is expanded */
|
|
33692
|
+
this.expanded = true;
|
|
33693
|
+
/** Panel width when expanded */
|
|
33694
|
+
this.expandedWidth = '280px';
|
|
33695
|
+
/** Maximum width when expanded (e.g. '600px', '30vw'). Default: 30% of viewport */
|
|
33696
|
+
this.maxExpandedWidth = '30vw';
|
|
33697
|
+
/** Panel width when collapsed */
|
|
33698
|
+
this.collapsedWidth = '56px';
|
|
33699
|
+
this.expandTooltip = 'Expand';
|
|
33700
|
+
this.collapseTooltip = 'Collapse';
|
|
33701
|
+
this.closeTooltip = 'Close';
|
|
33702
|
+
this.activeTabChange = new EventEmitter();
|
|
33703
|
+
this.expandToggle = new EventEmitter();
|
|
33704
|
+
this.close = new EventEmitter();
|
|
33705
|
+
}
|
|
33706
|
+
get hostWidth() {
|
|
33707
|
+
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
33708
|
+
}
|
|
33709
|
+
get hostMinWidth() {
|
|
33710
|
+
return this.expanded && this.minExpandedWidth ? this.minExpandedWidth : null;
|
|
33711
|
+
}
|
|
33712
|
+
get hostMaxWidth() {
|
|
33713
|
+
return this.expanded ? this.maxExpandedWidth : null;
|
|
33714
|
+
}
|
|
33715
|
+
ngAfterContentInit() {
|
|
33716
|
+
this.ensureActiveTab();
|
|
33717
|
+
}
|
|
33718
|
+
ngAfterContentChecked() {
|
|
33719
|
+
this.ensureActiveTab();
|
|
33720
|
+
}
|
|
33721
|
+
ensureActiveTab() {
|
|
33722
|
+
var _a, _b;
|
|
33723
|
+
const tabs = (_b = (_a = this.tabComponents) === null || _a === void 0 ? void 0 : _a.toArray()) !== null && _b !== void 0 ? _b : [];
|
|
33724
|
+
if (tabs.length > 0 && !this.activeTab) {
|
|
33725
|
+
this.activeTab = tabs[0].value;
|
|
33726
|
+
this.activeTabChange.emit(this.activeTab);
|
|
33727
|
+
}
|
|
33728
|
+
}
|
|
33729
|
+
onTabClick(tab) {
|
|
33730
|
+
// If drawer is collapsed, open it (but never close on tab click)
|
|
33731
|
+
if (!this.expanded) {
|
|
33732
|
+
this.expandToggle.emit();
|
|
33733
|
+
}
|
|
33734
|
+
// Select the tab
|
|
33735
|
+
if (tab.value !== this.activeTab) {
|
|
33736
|
+
this.activeTab = tab.value;
|
|
33737
|
+
this.activeTabChange.emit(this.activeTab);
|
|
33738
|
+
}
|
|
33739
|
+
}
|
|
33740
|
+
onExpandToggle() {
|
|
33741
|
+
this.expandToggle.emit();
|
|
33742
|
+
}
|
|
33743
|
+
onClose() {
|
|
33744
|
+
this.close.emit();
|
|
33745
|
+
}
|
|
33746
|
+
trackByValue(_i, tab) {
|
|
33747
|
+
return tab.value;
|
|
33748
|
+
}
|
|
33749
|
+
isTabActive(tab) {
|
|
33750
|
+
return tab.value === this.activeTab;
|
|
33751
|
+
}
|
|
33752
|
+
}
|
|
33753
|
+
DetailDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
33754
|
+
DetailDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerComponent, selector: "cqa-detail-drawer", inputs: { activeTab: "activeTab", showCloseButton: "showCloseButton", expanded: "expanded", expandedWidth: "expandedWidth", minExpandedWidth: "minExpandedWidth", maxExpandedWidth: "maxExpandedWidth", collapsedWidth: "collapsedWidth", expandTooltip: "expandTooltip", collapseTooltip: "collapseTooltip", closeTooltip: "closeTooltip" }, outputs: { activeTabChange: "activeTabChange", expandToggle: "expandToggle", close: "close" }, host: { properties: { "style.width": "this.hostWidth", "style.min-width": "this.hostMinWidth", "style.max-width": "this.hostMaxWidth" }, styleAttribute: "transition: width 0.3s ease-in-out", classAttribute: "cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]" }, queries: [{ propertyName: "tabComponents", predicate: DetailDrawerTabComponent }], ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\">\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon bar: one button per tab -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-min-h-0 cqa-items-center cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#E2E8F0] cqa-bg-[#FAFAFA] cqa-flex-shrink-0\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'unfold_less' : 'unfold_more' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons: equally distributed in remaining space -->\n <div class=\"cqa-flex cqa-flex-1 cqa-flex-col cqa-justify-evenly cqa-items-center cqa-w-full\">\n <button\n *ngFor=\"let tab of tabComponents; trackBy: trackByValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"isTabActive(tab)\"\n [matTooltip]=\"tab.label\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n [ngClass]=\"{\n 'cqa-bg-[#3F43EE] cqa-text-white': isTabActive(tab),\n 'cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155]': !isTabActive(tab)\n }\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon }}</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Content area: show only the active tab's content -->\n <div class=\"cqa-min-w-0 cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-overflow-y-auto cqa-p-4\">\n <ng-container *ngFor=\"let tab of tabComponents\">\n <ng-container *ngIf=\"tab.value === activeTab && tab.contentTemplate\" [ngTemplateOutlet]=\"tab.contentTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
33755
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, decorators: [{
|
|
33756
|
+
type: Component,
|
|
33757
|
+
args: [{ selector: 'cqa-detail-drawer', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
33758
|
+
class: 'cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]',
|
|
33759
|
+
style: 'transition: width 0.3s ease-in-out',
|
|
33760
|
+
}, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\">\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon bar: one button per tab -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-min-h-0 cqa-items-center cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#E2E8F0] cqa-bg-[#FAFAFA] cqa-flex-shrink-0\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'unfold_less' : 'unfold_more' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons: equally distributed in remaining space -->\n <div class=\"cqa-flex cqa-flex-1 cqa-flex-col cqa-justify-evenly cqa-items-center cqa-w-full\">\n <button\n *ngFor=\"let tab of tabComponents; trackBy: trackByValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"isTabActive(tab)\"\n [matTooltip]=\"tab.label\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n [ngClass]=\"{\n 'cqa-bg-[#3F43EE] cqa-text-white': isTabActive(tab),\n 'cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155]': !isTabActive(tab)\n }\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon }}</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Content area: show only the active tab's content -->\n <div class=\"cqa-min-w-0 cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-overflow-y-auto cqa-p-4\">\n <ng-container *ngFor=\"let tab of tabComponents\">\n <ng-container *ngIf=\"tab.value === activeTab && tab.contentTemplate\" [ngTemplateOutlet]=\"tab.contentTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
33761
|
+
}], propDecorators: { tabComponents: [{
|
|
33762
|
+
type: ContentChildren,
|
|
33763
|
+
args: [DetailDrawerTabComponent]
|
|
33764
|
+
}], activeTab: [{
|
|
33765
|
+
type: Input
|
|
33766
|
+
}], showCloseButton: [{
|
|
33767
|
+
type: Input
|
|
33768
|
+
}], expanded: [{
|
|
33769
|
+
type: Input
|
|
33770
|
+
}], expandedWidth: [{
|
|
33771
|
+
type: Input
|
|
33772
|
+
}], minExpandedWidth: [{
|
|
33773
|
+
type: Input
|
|
33774
|
+
}], maxExpandedWidth: [{
|
|
33775
|
+
type: Input
|
|
33776
|
+
}], collapsedWidth: [{
|
|
33777
|
+
type: Input
|
|
33778
|
+
}], hostWidth: [{
|
|
33779
|
+
type: HostBinding,
|
|
33780
|
+
args: ['style.width']
|
|
33781
|
+
}], hostMinWidth: [{
|
|
33782
|
+
type: HostBinding,
|
|
33783
|
+
args: ['style.min-width']
|
|
33784
|
+
}], hostMaxWidth: [{
|
|
33785
|
+
type: HostBinding,
|
|
33786
|
+
args: ['style.max-width']
|
|
33787
|
+
}], expandTooltip: [{
|
|
33788
|
+
type: Input
|
|
33789
|
+
}], collapseTooltip: [{
|
|
33790
|
+
type: Input
|
|
33791
|
+
}], closeTooltip: [{
|
|
33792
|
+
type: Input
|
|
33793
|
+
}], activeTabChange: [{
|
|
33794
|
+
type: Output
|
|
33795
|
+
}], expandToggle: [{
|
|
33796
|
+
type: Output
|
|
33797
|
+
}], close: [{
|
|
33798
|
+
type: Output
|
|
33799
|
+
}] } });
|
|
33800
|
+
|
|
33527
33801
|
/** Keys for each dynamic select in test-case-details-edit. Use these with selectConfigOverrides. */
|
|
33528
33802
|
const TEST_CASE_DETAILS_SELECT_KEYS = {
|
|
33529
33803
|
status: 'status',
|
|
@@ -34459,231 +34733,40 @@ class TestCaseDetailsComponent {
|
|
|
34459
34733
|
if (this.startInEditMode) {
|
|
34460
34734
|
this._editing = true;
|
|
34461
34735
|
}
|
|
34462
|
-
}
|
|
34463
|
-
/** Filtered metadata items - excludes Priority and Type for step groups */
|
|
34464
|
-
get filteredMetadataItems() {
|
|
34465
|
-
if (!this.isStepGroup) {
|
|
34466
|
-
return this.metadataItems;
|
|
34467
|
-
}
|
|
34468
|
-
return this.metadataItems.filter((item) => { var _a, _b; return !this.stepGroupExcludedMetadataLabels.includes((_b = (_a = item.label) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== null && _b !== void 0 ? _b : ''); });
|
|
34469
|
-
}
|
|
34470
|
-
onEditClick() {
|
|
34471
|
-
if (this.editing === undefined) {
|
|
34472
|
-
this._editing = true;
|
|
34473
|
-
this.cdr.detectChanges();
|
|
34474
|
-
}
|
|
34475
|
-
this.editDescription.emit();
|
|
34476
|
-
}
|
|
34477
|
-
onSaveChanges(data) {
|
|
34478
|
-
if (this.editing === undefined) {
|
|
34479
|
-
this._editing = false;
|
|
34480
|
-
}
|
|
34481
|
-
this.cdr.detectChanges();
|
|
34482
|
-
this.saveChanges.emit(data);
|
|
34483
|
-
}
|
|
34484
|
-
onCancelEdit() {
|
|
34485
|
-
this.cancel.emit();
|
|
34486
|
-
if (this.editing === undefined) {
|
|
34487
|
-
this._editing = false;
|
|
34488
|
-
}
|
|
34489
|
-
this.cdr.detectChanges();
|
|
34490
|
-
}
|
|
34491
|
-
trackByConfigTitle(_i, section) {
|
|
34492
|
-
return section.title;
|
|
34493
|
-
}
|
|
34494
|
-
trackByMetadataLabel(_i, item) {
|
|
34495
|
-
return item.label;
|
|
34496
|
-
}
|
|
34497
|
-
onMetadataLinkClick(item) {
|
|
34498
|
-
if (item.link) {
|
|
34499
|
-
this.metadataLinkClick.emit(item);
|
|
34500
|
-
}
|
|
34501
|
-
}
|
|
34502
|
-
getStatusDotClass(item) {
|
|
34503
|
-
if (!item.statusColor)
|
|
34504
|
-
return '';
|
|
34505
|
-
switch (item.statusColor) {
|
|
34506
|
-
case 'yellow':
|
|
34507
|
-
return 'cqa-bg-[#EAB308]';
|
|
34508
|
-
case 'red':
|
|
34509
|
-
return 'cqa-bg-[#DC2626]';
|
|
34510
|
-
case 'green':
|
|
34511
|
-
return 'cqa-bg-[#16A34A]';
|
|
34512
|
-
case 'gray':
|
|
34513
|
-
default:
|
|
34514
|
-
return 'cqa-bg-[#94A3B8]';
|
|
34515
|
-
}
|
|
34516
|
-
}
|
|
34517
|
-
/** Text color for metadata value (e.g. red for critical priority) */
|
|
34518
|
-
getValueTextClass(item) {
|
|
34519
|
-
if (item.statusColor === 'red') {
|
|
34520
|
-
return 'cqa-text-[#DC2626]';
|
|
34521
|
-
}
|
|
34522
|
-
return 'cqa-text-[#111827]';
|
|
34523
|
-
}
|
|
34524
|
-
}
|
|
34525
|
-
TestCaseDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
34526
|
-
TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { editing: "editing", startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides" }, outputs: { editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded" }, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-flex cqa-justify-end cqa-items-center cqa-gap-2 cqa-text-[#A3A3A3] cqa-text-xs cqa-font-semibold hover:cqa-text-[#737373] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-4 cqa-h-4\">edit</mat-icon>\n Edit\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start\">\n <div *ngIf=\"enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\" [innerHTML]=\"descriptionContent\"></div>\n <div *ngIf=\"!enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\">{{ descriptionContent }}</div>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-3.5 cqa-h-3.5 cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: ["descriptionTitle", "descriptionContent", "enableMarkdown", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "prerequisiteCaseOptions", "platform", "isStepGroup", "selectConfigOverrides"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded"] }, { type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading"] }, { type: ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: ["icon", "title", "data"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
34527
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, decorators: [{
|
|
34528
|
-
type: Component,
|
|
34529
|
-
args: [{ selector: 'cqa-test-case-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-flex cqa-justify-end cqa-items-center cqa-gap-2 cqa-text-[#A3A3A3] cqa-text-xs cqa-font-semibold hover:cqa-text-[#737373] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-4 cqa-h-4\">edit</mat-icon>\n Edit\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start\">\n <div *ngIf=\"enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\" [innerHTML]=\"descriptionContent\"></div>\n <div *ngIf=\"!enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\">{{ descriptionContent }}</div>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-3.5 cqa-h-3.5 cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
34530
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { editing: [{
|
|
34531
|
-
type: Input
|
|
34532
|
-
}], startInEditMode: [{
|
|
34533
|
-
type: Input
|
|
34534
|
-
}], descriptionTitle: [{
|
|
34535
|
-
type: Input
|
|
34536
|
-
}], descriptionContent: [{
|
|
34537
|
-
type: Input
|
|
34538
|
-
}], enableMarkdown: [{
|
|
34539
|
-
type: Input
|
|
34540
|
-
}], showEditButton: [{
|
|
34541
|
-
type: Input
|
|
34542
|
-
}], metadataItems: [{
|
|
34543
|
-
type: Input
|
|
34544
|
-
}], labels: [{
|
|
34545
|
-
type: Input
|
|
34546
|
-
}], configTitle: [{
|
|
34547
|
-
type: Input
|
|
34548
|
-
}], configSections: [{
|
|
34549
|
-
type: Input
|
|
34550
|
-
}], configSectionsRow2: [{
|
|
34551
|
-
type: Input
|
|
34552
|
-
}], platform: [{
|
|
34553
|
-
type: Input
|
|
34554
|
-
}], isStepGroup: [{
|
|
34555
|
-
type: Input
|
|
34556
|
-
}], selectConfigOverrides: [{
|
|
34557
|
-
type: Input
|
|
34558
|
-
}], editDescription: [{
|
|
34559
|
-
type: Output
|
|
34560
|
-
}], cancel: [{
|
|
34561
|
-
type: Output
|
|
34562
|
-
}], saveChanges: [{
|
|
34563
|
-
type: Output
|
|
34564
|
-
}], metadataLinkClick: [{
|
|
34565
|
-
type: Output
|
|
34566
|
-
}], selectSearch: [{
|
|
34567
|
-
type: Output
|
|
34568
|
-
}], selectLoadMore: [{
|
|
34569
|
-
type: Output
|
|
34570
|
-
}], selectOpened: [{
|
|
34571
|
-
type: Output
|
|
34572
|
-
}], selectionChange: [{
|
|
34573
|
-
type: Output
|
|
34574
|
-
}], labelAdded: [{
|
|
34575
|
-
type: Output
|
|
34576
|
-
}] } });
|
|
34577
|
-
|
|
34578
|
-
class DetailSidePanelComponent {
|
|
34579
|
-
constructor(cdr) {
|
|
34580
|
-
this.cdr = cdr;
|
|
34581
|
-
/** Tabs - each tab has a side panel icon button; tabs and buttons are 1:1 */
|
|
34582
|
-
this.tabs = [
|
|
34583
|
-
{ label: 'Test Case', value: 'test-case', icon: 'description' },
|
|
34584
|
-
{ label: 'Data Library', value: 'data-library', icon: 'folder' },
|
|
34585
|
-
{ label: 'Variables', value: 'variables', icon: 'code' },
|
|
34586
|
-
];
|
|
34587
|
-
/** Currently active tab value */
|
|
34588
|
-
this.activeTab = 'test-case';
|
|
34589
|
-
/** Description section title */
|
|
34590
|
-
this.descriptionTitle = 'Description';
|
|
34591
|
-
/** Description text content */
|
|
34592
|
-
this.descriptionContent = '';
|
|
34593
|
-
/** When true, description uses rich text editor and renders as HTML. Host app must load Trix. */
|
|
34594
|
-
this.enableMarkdown = false;
|
|
34595
|
-
/** Whether to show the Edit button in the Description header */
|
|
34596
|
-
this.showEditButton = true;
|
|
34597
|
-
/** Metadata items (Created on, Status, Priority, etc.) */
|
|
34598
|
-
this.metadataItems = [];
|
|
34599
|
-
/** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
|
|
34600
|
-
this.labels = [];
|
|
34601
|
-
/** Configuration sections - full width (e.g. Execution, AI Configuration) */
|
|
34602
|
-
this.configSections = [];
|
|
34603
|
-
/** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
|
|
34604
|
-
this.configSectionsRow2 = [];
|
|
34605
|
-
/** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings. */
|
|
34606
|
-
this.platform = 'web';
|
|
34607
|
-
/** When true, hides Priority, Type, Test Data Set, and Prerequisite Case (step groups don't have these). Defaults to false. */
|
|
34608
|
-
this.isStepGroup = false;
|
|
34609
|
-
/** Configuration section title */
|
|
34610
|
-
this.configTitle = 'Configuration';
|
|
34611
|
-
/** Whether to show the close button in the side menu */
|
|
34612
|
-
this.showCloseButton = false;
|
|
34613
|
-
/** When true, test case details start in edit mode (useful for Storybook). */
|
|
34614
|
-
this.startInEditMode = false;
|
|
34615
|
-
/** Override config per select for API-driven options, server search, load more. */
|
|
34616
|
-
this.selectConfigOverrides = {};
|
|
34617
|
-
/** Whether the panel is expanded (affects expand button icon and panel width) */
|
|
34618
|
-
this.expanded = true;
|
|
34619
|
-
/** Panel width when expanded (e.g. '480px', '25%') */
|
|
34620
|
-
this.expandedWidth = '380px';
|
|
34621
|
-
/** Panel width when collapsed (e.g. '56px' - fits icon bar + back button) */
|
|
34622
|
-
this.collapsedWidth = '56px';
|
|
34623
|
-
this.hostOverflow = 'hidden';
|
|
34624
|
-
/** Tooltip for expand button when panel is collapsed */
|
|
34625
|
-
this.expandTooltip = 'Expand';
|
|
34626
|
-
/** Tooltip for expand button when panel is expanded (collapse) */
|
|
34627
|
-
this.collapseTooltip = 'Collapse';
|
|
34628
|
-
/** Tooltip for close button */
|
|
34629
|
-
this.closeTooltip = 'Close';
|
|
34630
|
-
this.back = new EventEmitter();
|
|
34631
|
-
this.tabChange = new EventEmitter();
|
|
34632
|
-
this.editDescription = new EventEmitter();
|
|
34633
|
-
this.cancel = new EventEmitter();
|
|
34634
|
-
this.saveChanges = new EventEmitter();
|
|
34635
|
-
this.metadataLinkClick = new EventEmitter();
|
|
34636
|
-
this.selectSearch = new EventEmitter();
|
|
34637
|
-
this.selectLoadMore = new EventEmitter();
|
|
34638
|
-
this.selectOpened = new EventEmitter();
|
|
34639
|
-
this.selectionChange = new EventEmitter();
|
|
34640
|
-
this.labelAdded = new EventEmitter();
|
|
34641
|
-
this.expandToggle = new EventEmitter();
|
|
34642
|
-
this.close = new EventEmitter();
|
|
34643
|
-
}
|
|
34644
|
-
get hostWidth() {
|
|
34645
|
-
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
34646
|
-
}
|
|
34647
|
-
get hostMinWidth() {
|
|
34648
|
-
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
34649
|
-
}
|
|
34650
|
-
get hostMaxWidth() {
|
|
34651
|
-
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
34652
|
-
}
|
|
34653
|
-
trackByTabValue(_i, tab) {
|
|
34654
|
-
return tab.value;
|
|
34655
|
-
}
|
|
34656
|
-
trackByMetadataLabel(_i, item) {
|
|
34657
|
-
return item.label;
|
|
34658
|
-
}
|
|
34659
|
-
trackByConfigTitle(_i, section) {
|
|
34660
|
-
return section.title;
|
|
34661
|
-
}
|
|
34662
|
-
onBack() {
|
|
34663
|
-
this.back.emit();
|
|
34664
|
-
}
|
|
34665
|
-
onTabClick(tab) {
|
|
34666
|
-
if (!this.expanded) {
|
|
34667
|
-
this.expandToggle.emit();
|
|
34668
|
-
}
|
|
34669
|
-
if (tab.value !== this.activeTab) {
|
|
34670
|
-
this.tabChange.emit(tab.value);
|
|
34736
|
+
}
|
|
34737
|
+
/** Filtered metadata items - excludes Priority and Type for step groups */
|
|
34738
|
+
get filteredMetadataItems() {
|
|
34739
|
+
if (!this.isStepGroup) {
|
|
34740
|
+
return this.metadataItems;
|
|
34671
34741
|
}
|
|
34742
|
+
return this.metadataItems.filter((item) => { var _a, _b; return !this.stepGroupExcludedMetadataLabels.includes((_b = (_a = item.label) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== null && _b !== void 0 ? _b : ''); });
|
|
34672
34743
|
}
|
|
34673
|
-
|
|
34744
|
+
onEditClick() {
|
|
34745
|
+
if (this.editing === undefined) {
|
|
34746
|
+
this._editing = true;
|
|
34747
|
+
this.cdr.detectChanges();
|
|
34748
|
+
}
|
|
34674
34749
|
this.editDescription.emit();
|
|
34675
34750
|
}
|
|
34676
34751
|
onSaveChanges(data) {
|
|
34752
|
+
if (this.editing === undefined) {
|
|
34753
|
+
this._editing = false;
|
|
34754
|
+
}
|
|
34755
|
+
this.cdr.detectChanges();
|
|
34677
34756
|
this.saveChanges.emit(data);
|
|
34678
34757
|
}
|
|
34679
|
-
|
|
34758
|
+
onCancelEdit() {
|
|
34680
34759
|
this.cancel.emit();
|
|
34760
|
+
if (this.editing === undefined) {
|
|
34761
|
+
this._editing = false;
|
|
34762
|
+
}
|
|
34763
|
+
this.cdr.detectChanges();
|
|
34681
34764
|
}
|
|
34682
|
-
|
|
34683
|
-
|
|
34765
|
+
trackByConfigTitle(_i, section) {
|
|
34766
|
+
return section.title;
|
|
34684
34767
|
}
|
|
34685
|
-
|
|
34686
|
-
|
|
34768
|
+
trackByMetadataLabel(_i, item) {
|
|
34769
|
+
return item.label;
|
|
34687
34770
|
}
|
|
34688
34771
|
onMetadataLinkClick(item) {
|
|
34689
34772
|
if (item.link) {
|
|
@@ -34705,18 +34788,22 @@ class DetailSidePanelComponent {
|
|
|
34705
34788
|
return 'cqa-bg-[#94A3B8]';
|
|
34706
34789
|
}
|
|
34707
34790
|
}
|
|
34791
|
+
/** Text color for metadata value (e.g. red for critical priority) */
|
|
34792
|
+
getValueTextClass(item) {
|
|
34793
|
+
if (item.statusColor === 'red') {
|
|
34794
|
+
return 'cqa-text-[#DC2626]';
|
|
34795
|
+
}
|
|
34796
|
+
return 'cqa-text-[#111827]';
|
|
34797
|
+
}
|
|
34708
34798
|
}
|
|
34709
|
-
|
|
34710
|
-
|
|
34711
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type:
|
|
34799
|
+
TestCaseDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
34800
|
+
TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { editing: "editing", startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides" }, outputs: { editDescription: "editDescription", cancel: "cancel", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded" }, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-flex cqa-justify-end cqa-items-center cqa-gap-2 cqa-text-[#A3A3A3] cqa-text-xs cqa-font-semibold hover:cqa-text-[#737373] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-4 cqa-h-4\">edit</mat-icon>\n Edit\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start\">\n <div *ngIf=\"enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\" [innerHTML]=\"descriptionContent\"></div>\n <div *ngIf=\"!enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\">{{ descriptionContent }}</div>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-3.5 cqa-h-3.5 cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: ["descriptionTitle", "descriptionContent", "enableMarkdown", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "prerequisiteCaseOptions", "platform", "isStepGroup", "selectConfigOverrides"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange", "labelAdded"] }, { type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading"] }, { type: ConfigurationCardComponent, selector: "cqa-configuration-card", inputs: ["icon", "title", "data"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
34801
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, decorators: [{
|
|
34712
34802
|
type: Component,
|
|
34713
|
-
args: [{ selector: 'cqa-
|
|
34714
|
-
|
|
34715
|
-
style: 'transition: width 0.3s ease-in-out',
|
|
34716
|
-
}, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-min-w-0 cqa-bg-white\">\n <!-- Main content: Side menu + Scrollable content -->\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon menu -->\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#F5F5F5] cqa-flex-shrink-0 cqa-text-[#0A0A0A]\"\n style=\"box-shadow: 1px 4px 12px 1px rgba(0, 0, 0, 0.05);\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'chevron_left' : 'chevron_right' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons (1:1 with tabs) -->\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n [matTooltip]=\"tab.label\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon || 'circle' }}</mat-icon>\n </button>\n </div>\n\n <!-- Scrollable content area (collapses with animation when expanded is false) -->\n <div class=\"cqa-flex cqa-flex-col cqa-min-h-0 cqa-min-w-0 cqa-overflow-hidden cqa-w-full cqa-h-full\">\n <div class=\"detail-side-panel-scroll cqa-flex-1 cqa-min-h-0 cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\" style=\"overflow-y: auto; overflow-x: hidden; min-height: 0; -webkit-overflow-scrolling: touch;\">\n <!-- Tabs: equally distributed (Figma: purple active, gray inactive) -->\n <div class=\"cqa-flex cqa-gap-[3.5px] cqa-p-[3.5px] cqa-bg-[#F1F5F9] cqa-rounded-lg cqa-w-full\" role=\"tablist\">\n <button\n *ngFor=\"let tab of tabs; trackBy: trackByTabValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.value\"\n [class.cqa-bg-[#3F43EE]]=\"activeTab === tab.value\"\n [class.cqa-text-white]=\"activeTab === tab.value\"\n [class.cqa-text-[#64748B]]=\"activeTab !== tab.value\"\n class=\"cqa-flex-1 cqa-flex cqa-justify-center cqa-items-center cqa-py-2 cqa-rounded-lg cqa-text-xs cqa-font-medium cqa-transition-colors hover:cqa-opacity-90 focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onTabClick(tab)\">\n {{ tab.label }}\n </button>\n </div>\n\n <!-- Test Case tab: use cqa-test-case-details (Figma design) -->\n <cqa-test-case-details\n *ngIf=\"activeTab === 'test-case'\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [editing]=\"editing\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n (editDescription)=\"onEditDescription()\"\n (cancel)=\"onCancel()\"\n (saveChanges)=\"onSaveChanges($event)\"\n (metadataLinkClick)=\"onMetadataLinkClick($event)\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n </cqa-test-case-details>\n\n <!-- Placeholder for other tabs (Data Library, Variables) -->\n <div *ngIf=\"activeTab !== 'test-case'\" class=\"cqa-p-4 cqa-text-[#64748B] cqa-text-sm\">\n {{ activeTab === 'data-library' ? 'Data Library content' : 'Variables content' }} \u2013 coming soon\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
34717
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { tabs: [{
|
|
34803
|
+
args: [{ selector: 'cqa-test-case-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"isEditing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [enableMarkdown]=\"enableMarkdown\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n [isStepGroup]=\"isStepGroup\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n (save)=\"onSaveChanges($event)\"\n (cancel)=\"onCancelEdit()\"\n (selectSearch)=\"selectSearch.emit($event)\"\n (selectLoadMore)=\"selectLoadMore.emit($event)\"\n (selectOpened)=\"selectOpened.emit($event)\"\n (selectionChange)=\"selectionChange.emit($event)\"\n (labelAdded)=\"labelAdded.emit($event)\">\n</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!isEditing\" class=\"cqa-self-stretch cqa-py-4 cqa-px-0 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <!-- Description Section -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-between cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <button\n *ngIf=\"showEditButton\"\n type=\"button\"\n class=\"cqa-flex cqa-justify-end cqa-items-center cqa-gap-2 cqa-text-[#A3A3A3] cqa-text-xs cqa-font-semibold hover:cqa-text-[#737373] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2\"\n (click)=\"onEditClick()\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-4 cqa-h-4\">edit</mat-icon>\n Edit\n </button>\n </div>\n <div *ngIf=\"descriptionContent\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start\">\n <div *ngIf=\"enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-prose cqa-prose-sm cqa-max-w-none\" [innerHTML]=\"descriptionContent\"></div>\n <div *ngIf=\"!enableMarkdown\" class=\"cqa-self-stretch cqa-text-[#111827] cqa-text-sm cqa-leading-[19.6px] cqa-font-normal\">{{ descriptionContent }}</div>\n </div>\n </div>\n\n <!-- Metadata Section -->\n <div *ngIf=\"filteredMetadataItems.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-2 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of filteredMetadataItems; trackBy: trackByMetadataLabel\">\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5\">\n <div class=\"cqa-text-[#6B7280] cqa-text-xs cqa-leading-[15px] cqa-font-medium\">{{ item.label }}</div>\n <div\n class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-[5px] cqa-min-w-0 cqa-w-full cqa-text-left cqa-text-[#0A0A0A] cqa-border cqa-border-[#F5F5F5]\">\n <mat-icon *ngIf=\"item.icon && (!item.iconLibrary || item.iconLibrary === 'mat')\" class=\"cqa-text-[#6B7280] cqa-text-sm cqa-w-4 cqa-h-4\">\n {{ item.icon }}\n </mat-icon>\n <span *ngIf=\"item.statusColor\" class=\"cqa-w-3.5 cqa-h-3.5 cqa-rounded-full cqa-flex-shrink-0\" [ngClass]=\"getStatusDotClass(item)\"></span>\n <a\n *ngIf=\"item.link\"\n href=\"javascript:void(0)\"\n class=\"cqa-text-[#2563EB] cqa-text-xs cqa-leading-[12px] cqa-font-normal hover:cqa-underline cqa-cursor-pointer cqa-block cqa-truncate cqa-min-w-0\"\n (click)=\"onMetadataLinkClick(item); $event.preventDefault()\">\n {{ item.value }}\n </a>\n <span *ngIf=\"!item.link\" class=\"cqa-text-xs cqa-leading-[12px] cqa-font-normal cqa-align-middle\" [ngClass]=\"getValueTextClass(item)\">\n {{ item.value }}\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Labels (Figma: Labels title, cqa-badge chips with tag icon) -->\n <div *ngIf=\"labels.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2 cqa-text-sm cqa-leading-[19.6px]\">\n <span class=\"cqa-text-[#111827] cqa-text-sm cqa-font-medium cqa-leading-5\">Labels</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <cqa-badge\n *ngFor=\"let label of labels\"\n [label]=\"label\"\n icon=\"label\"\n variant=\"outline\"\n size=\"small\"\n backgroundColor=\"#ffffff\"\n textColor=\"#475569\"\n borderColor=\"#E2E8F0\"\n iconColor=\"#94A3B8\">\n </cqa-badge>\n </div>\n </div>\n\n <!-- Configuration Section -->\n <div *ngIf=\"configSections.length || configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-inline-flex cqa-justify-start cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ configTitle }}</span>\n </div>\n </div>\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-2.5\">\n <div class=\"cqa-self-stretch cqa-grid cqa-grid-cols-1 cqa-gap-2.5\">\n <ng-container *ngFor=\"let section of configSections; trackBy: trackByConfigTitle\">\n <cqa-configuration-card\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </ng-container>\n </div>\n <div *ngIf=\"configSectionsRow2.length\" class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px]\">\n <cqa-configuration-card\n *ngFor=\"let section of configSectionsRow2; trackBy: trackByConfigTitle\"\n [icon]=\"section.icon || 'tune'\"\n [title]=\"section.title\"\n [data]=\"section.items\">\n </cqa-configuration-card>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
34804
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { editing: [{
|
|
34718
34805
|
type: Input
|
|
34719
|
-
}],
|
|
34806
|
+
}], startInEditMode: [{
|
|
34720
34807
|
type: Input
|
|
34721
34808
|
}], descriptionTitle: [{
|
|
34722
34809
|
type: Input
|
|
@@ -34730,6 +34817,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
34730
34817
|
type: Input
|
|
34731
34818
|
}], labels: [{
|
|
34732
34819
|
type: Input
|
|
34820
|
+
}], configTitle: [{
|
|
34821
|
+
type: Input
|
|
34733
34822
|
}], configSections: [{
|
|
34734
34823
|
type: Input
|
|
34735
34824
|
}], configSectionsRow2: [{
|
|
@@ -34738,44 +34827,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
34738
34827
|
type: Input
|
|
34739
34828
|
}], isStepGroup: [{
|
|
34740
34829
|
type: Input
|
|
34741
|
-
}], configTitle: [{
|
|
34742
|
-
type: Input
|
|
34743
|
-
}], showCloseButton: [{
|
|
34744
|
-
type: Input
|
|
34745
|
-
}], startInEditMode: [{
|
|
34746
|
-
type: Input
|
|
34747
|
-
}], editing: [{
|
|
34748
|
-
type: Input
|
|
34749
34830
|
}], selectConfigOverrides: [{
|
|
34750
34831
|
type: Input
|
|
34751
|
-
}], expanded: [{
|
|
34752
|
-
type: Input
|
|
34753
|
-
}], expandedWidth: [{
|
|
34754
|
-
type: Input
|
|
34755
|
-
}], collapsedWidth: [{
|
|
34756
|
-
type: Input
|
|
34757
|
-
}], hostWidth: [{
|
|
34758
|
-
type: HostBinding,
|
|
34759
|
-
args: ['style.width']
|
|
34760
|
-
}], hostMinWidth: [{
|
|
34761
|
-
type: HostBinding,
|
|
34762
|
-
args: ['style.min-width']
|
|
34763
|
-
}], hostMaxWidth: [{
|
|
34764
|
-
type: HostBinding,
|
|
34765
|
-
args: ['style.max-width']
|
|
34766
|
-
}], hostOverflow: [{
|
|
34767
|
-
type: HostBinding,
|
|
34768
|
-
args: ['style.overflow']
|
|
34769
|
-
}], expandTooltip: [{
|
|
34770
|
-
type: Input
|
|
34771
|
-
}], collapseTooltip: [{
|
|
34772
|
-
type: Input
|
|
34773
|
-
}], closeTooltip: [{
|
|
34774
|
-
type: Input
|
|
34775
|
-
}], back: [{
|
|
34776
|
-
type: Output
|
|
34777
|
-
}], tabChange: [{
|
|
34778
|
-
type: Output
|
|
34779
34832
|
}], editDescription: [{
|
|
34780
34833
|
type: Output
|
|
34781
34834
|
}], cancel: [{
|
|
@@ -34794,176 +34847,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
34794
34847
|
type: Output
|
|
34795
34848
|
}], labelAdded: [{
|
|
34796
34849
|
type: Output
|
|
34797
|
-
}], expandToggle: [{
|
|
34798
|
-
type: Output
|
|
34799
|
-
}], close: [{
|
|
34800
|
-
type: Output
|
|
34801
|
-
}] } });
|
|
34802
|
-
|
|
34803
|
-
class DetailDrawerTabContentDirective {
|
|
34804
|
-
constructor(templateRef) {
|
|
34805
|
-
this.templateRef = templateRef;
|
|
34806
|
-
}
|
|
34807
|
-
}
|
|
34808
|
-
DetailDrawerTabContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
34809
|
-
DetailDrawerTabContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerTabContentDirective, selector: "[cqaTabContent]", ngImport: i0 });
|
|
34810
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, decorators: [{
|
|
34811
|
-
type: Directive,
|
|
34812
|
-
args: [{
|
|
34813
|
-
selector: '[cqaTabContent]',
|
|
34814
|
-
}]
|
|
34815
|
-
}], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
|
|
34816
|
-
|
|
34817
|
-
class DetailDrawerTabComponent {
|
|
34818
|
-
constructor() {
|
|
34819
|
-
/** Tab label (shown in tooltip on icon button) */
|
|
34820
|
-
this.label = '';
|
|
34821
|
-
/** Tab value (unique identifier) */
|
|
34822
|
-
this.value = '';
|
|
34823
|
-
/** Material icon name for the tab button */
|
|
34824
|
-
this.icon = 'folder';
|
|
34825
|
-
}
|
|
34826
|
-
get contentTemplate() {
|
|
34827
|
-
var _a, _b;
|
|
34828
|
-
return (_b = (_a = this.contentDirective) === null || _a === void 0 ? void 0 : _a.templateRef) !== null && _b !== void 0 ? _b : null;
|
|
34829
|
-
}
|
|
34830
|
-
}
|
|
34831
|
-
DetailDrawerTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
34832
|
-
DetailDrawerTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerTabComponent, selector: "cqa-detail-drawer-tab", inputs: { label: "label", value: "value", icon: "icon" }, host: { styleAttribute: "display: contents" }, queries: [{ propertyName: "contentDirective", first: true, predicate: DetailDrawerTabContentDirective, descendants: true }], ngImport: i0, template: '', isInline: true });
|
|
34833
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, decorators: [{
|
|
34834
|
-
type: Component,
|
|
34835
|
-
args: [{
|
|
34836
|
-
selector: 'cqa-detail-drawer-tab',
|
|
34837
|
-
template: '',
|
|
34838
|
-
host: {
|
|
34839
|
-
style: 'display: contents',
|
|
34840
|
-
},
|
|
34841
|
-
}]
|
|
34842
|
-
}], propDecorators: { label: [{
|
|
34843
|
-
type: Input
|
|
34844
|
-
}], value: [{
|
|
34845
|
-
type: Input
|
|
34846
|
-
}], icon: [{
|
|
34847
|
-
type: Input
|
|
34848
|
-
}], contentDirective: [{
|
|
34849
|
-
type: ContentChild,
|
|
34850
|
-
args: [DetailDrawerTabContentDirective]
|
|
34851
|
-
}] } });
|
|
34852
|
-
|
|
34853
|
-
class DetailDrawerComponent {
|
|
34854
|
-
constructor() {
|
|
34855
|
-
/** Currently active tab value */
|
|
34856
|
-
this.activeTab = '';
|
|
34857
|
-
/** Whether to show the close button */
|
|
34858
|
-
this.showCloseButton = true;
|
|
34859
|
-
/** Whether the drawer is expanded */
|
|
34860
|
-
this.expanded = true;
|
|
34861
|
-
/** Panel width when expanded */
|
|
34862
|
-
this.expandedWidth = '280px';
|
|
34863
|
-
/** Maximum width when expanded (e.g. '600px', '30vw'). Default: 30% of viewport */
|
|
34864
|
-
this.maxExpandedWidth = '30vw';
|
|
34865
|
-
/** Panel width when collapsed */
|
|
34866
|
-
this.collapsedWidth = '56px';
|
|
34867
|
-
this.expandTooltip = 'Expand';
|
|
34868
|
-
this.collapseTooltip = 'Collapse';
|
|
34869
|
-
this.closeTooltip = 'Close';
|
|
34870
|
-
this.activeTabChange = new EventEmitter();
|
|
34871
|
-
this.expandToggle = new EventEmitter();
|
|
34872
|
-
this.close = new EventEmitter();
|
|
34873
|
-
}
|
|
34874
|
-
get hostWidth() {
|
|
34875
|
-
return this.expanded ? this.expandedWidth : this.collapsedWidth;
|
|
34876
|
-
}
|
|
34877
|
-
get hostMinWidth() {
|
|
34878
|
-
return this.expanded && this.minExpandedWidth ? this.minExpandedWidth : null;
|
|
34879
|
-
}
|
|
34880
|
-
get hostMaxWidth() {
|
|
34881
|
-
return this.expanded ? this.maxExpandedWidth : null;
|
|
34882
|
-
}
|
|
34883
|
-
ngAfterContentInit() {
|
|
34884
|
-
this.ensureActiveTab();
|
|
34885
|
-
}
|
|
34886
|
-
ngAfterContentChecked() {
|
|
34887
|
-
this.ensureActiveTab();
|
|
34888
|
-
}
|
|
34889
|
-
ensureActiveTab() {
|
|
34890
|
-
var _a, _b;
|
|
34891
|
-
const tabs = (_b = (_a = this.tabComponents) === null || _a === void 0 ? void 0 : _a.toArray()) !== null && _b !== void 0 ? _b : [];
|
|
34892
|
-
if (tabs.length > 0 && !this.activeTab) {
|
|
34893
|
-
this.activeTab = tabs[0].value;
|
|
34894
|
-
this.activeTabChange.emit(this.activeTab);
|
|
34895
|
-
}
|
|
34896
|
-
}
|
|
34897
|
-
onTabClick(tab) {
|
|
34898
|
-
// If drawer is collapsed, open it (but never close on tab click)
|
|
34899
|
-
if (!this.expanded) {
|
|
34900
|
-
this.expandToggle.emit();
|
|
34901
|
-
}
|
|
34902
|
-
// Select the tab
|
|
34903
|
-
if (tab.value !== this.activeTab) {
|
|
34904
|
-
this.activeTab = tab.value;
|
|
34905
|
-
this.activeTabChange.emit(this.activeTab);
|
|
34906
|
-
}
|
|
34907
|
-
}
|
|
34908
|
-
onExpandToggle() {
|
|
34909
|
-
this.expandToggle.emit();
|
|
34910
|
-
}
|
|
34911
|
-
onClose() {
|
|
34912
|
-
this.close.emit();
|
|
34913
|
-
}
|
|
34914
|
-
trackByValue(_i, tab) {
|
|
34915
|
-
return tab.value;
|
|
34916
|
-
}
|
|
34917
|
-
isTabActive(tab) {
|
|
34918
|
-
return tab.value === this.activeTab;
|
|
34919
|
-
}
|
|
34920
|
-
}
|
|
34921
|
-
DetailDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
34922
|
-
DetailDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerComponent, selector: "cqa-detail-drawer", inputs: { activeTab: "activeTab", showCloseButton: "showCloseButton", expanded: "expanded", expandedWidth: "expandedWidth", minExpandedWidth: "minExpandedWidth", maxExpandedWidth: "maxExpandedWidth", collapsedWidth: "collapsedWidth", expandTooltip: "expandTooltip", collapseTooltip: "collapseTooltip", closeTooltip: "closeTooltip" }, outputs: { activeTabChange: "activeTabChange", expandToggle: "expandToggle", close: "close" }, host: { properties: { "style.width": "this.hostWidth", "style.min-width": "this.hostMinWidth", "style.max-width": "this.hostMaxWidth" }, styleAttribute: "transition: width 0.3s ease-in-out", classAttribute: "cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]" }, queries: [{ propertyName: "tabComponents", predicate: DetailDrawerTabComponent }], ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\">\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon bar: one button per tab -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-min-h-0 cqa-items-center cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#E2E8F0] cqa-bg-[#FAFAFA] cqa-flex-shrink-0\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'unfold_less' : 'unfold_more' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons: equally distributed in remaining space -->\n <div class=\"cqa-flex cqa-flex-1 cqa-flex-col cqa-justify-evenly cqa-items-center cqa-w-full\">\n <button\n *ngFor=\"let tab of tabComponents; trackBy: trackByValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"isTabActive(tab)\"\n [matTooltip]=\"tab.label\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n [ngClass]=\"{\n 'cqa-bg-[#3F43EE] cqa-text-white': isTabActive(tab),\n 'cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155]': !isTabActive(tab)\n }\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon }}</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Content area: show only the active tab's content -->\n <div class=\"cqa-min-w-0 cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-overflow-y-auto cqa-p-4\">\n <ng-container *ngFor=\"let tab of tabComponents\">\n <ng-container *ngIf=\"tab.value === activeTab && tab.contentTemplate\" [ngTemplateOutlet]=\"tab.contentTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
34923
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, decorators: [{
|
|
34924
|
-
type: Component,
|
|
34925
|
-
args: [{ selector: 'cqa-detail-drawer', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
34926
|
-
class: 'cqa-ui-root cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-shadow-[-4px_0_6px_-1px_rgba(0,0,0,0.05)]',
|
|
34927
|
-
style: 'transition: width 0.3s ease-in-out',
|
|
34928
|
-
}, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\">\n <div\n class=\"cqa-grid cqa-flex-1 cqa-min-h-0 cqa-overflow-hidden\"\n [style.grid-template-columns]=\"expanded ? 'auto 1fr' : 'auto 0fr'\"\n style=\"transition: grid-template-columns 0.3s ease-in-out\">\n <!-- Left vertical icon bar: one button per tab -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-min-h-0 cqa-items-center cqa-py-4 cqa-px-2 cqa-border-r cqa-border-[#E2E8F0] cqa-bg-[#FAFAFA] cqa-flex-shrink-0\">\n <!-- Expand / Collapse button (always visible) -->\n <button\n type=\"button\"\n [matTooltip]=\"expanded ? collapseTooltip : expandTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onExpandToggle()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ expanded ? 'unfold_less' : 'unfold_more' }}</mat-icon>\n </button>\n <!-- Close button -->\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n [matTooltip]=\"closeTooltip\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155] cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n (click)=\"onClose()\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">close</mat-icon>\n </button>\n <!-- Tab buttons: equally distributed in remaining space -->\n <div class=\"cqa-flex cqa-flex-1 cqa-flex-col cqa-justify-evenly cqa-items-center cqa-w-full\">\n <button\n *ngFor=\"let tab of tabComponents; trackBy: trackByValue\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"isTabActive(tab)\"\n [matTooltip]=\"tab.label\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-9 cqa-h-9 cqa-rounded-lg cqa-transition-colors focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] focus-visible:cqa-ring-offset-2 cqa-flex-shrink-0\"\n [ngClass]=\"{\n 'cqa-bg-[#3F43EE] cqa-text-white': isTabActive(tab),\n 'cqa-text-[#64748B] hover:cqa-bg-[#E2E8F0] hover:cqa-text-[#334155]': !isTabActive(tab)\n }\"\n (click)=\"onTabClick(tab)\">\n <mat-icon class=\"cqa-text-[20px] cqa-w-5 cqa-h-5\">{{ tab.icon }}</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Content area: show only the active tab's content -->\n <div class=\"cqa-min-w-0 cqa-overflow-hidden\">\n <div class=\"cqa-h-full cqa-overflow-y-auto cqa-p-4\">\n <ng-container *ngFor=\"let tab of tabComponents\">\n <ng-container *ngIf=\"tab.value === activeTab && tab.contentTemplate\" [ngTemplateOutlet]=\"tab.contentTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
34929
|
-
}], propDecorators: { tabComponents: [{
|
|
34930
|
-
type: ContentChildren,
|
|
34931
|
-
args: [DetailDrawerTabComponent]
|
|
34932
|
-
}], activeTab: [{
|
|
34933
|
-
type: Input
|
|
34934
|
-
}], showCloseButton: [{
|
|
34935
|
-
type: Input
|
|
34936
|
-
}], expanded: [{
|
|
34937
|
-
type: Input
|
|
34938
|
-
}], expandedWidth: [{
|
|
34939
|
-
type: Input
|
|
34940
|
-
}], minExpandedWidth: [{
|
|
34941
|
-
type: Input
|
|
34942
|
-
}], maxExpandedWidth: [{
|
|
34943
|
-
type: Input
|
|
34944
|
-
}], collapsedWidth: [{
|
|
34945
|
-
type: Input
|
|
34946
|
-
}], hostWidth: [{
|
|
34947
|
-
type: HostBinding,
|
|
34948
|
-
args: ['style.width']
|
|
34949
|
-
}], hostMinWidth: [{
|
|
34950
|
-
type: HostBinding,
|
|
34951
|
-
args: ['style.min-width']
|
|
34952
|
-
}], hostMaxWidth: [{
|
|
34953
|
-
type: HostBinding,
|
|
34954
|
-
args: ['style.max-width']
|
|
34955
|
-
}], expandTooltip: [{
|
|
34956
|
-
type: Input
|
|
34957
|
-
}], collapseTooltip: [{
|
|
34958
|
-
type: Input
|
|
34959
|
-
}], closeTooltip: [{
|
|
34960
|
-
type: Input
|
|
34961
|
-
}], activeTabChange: [{
|
|
34962
|
-
type: Output
|
|
34963
|
-
}], expandToggle: [{
|
|
34964
|
-
type: Output
|
|
34965
|
-
}], close: [{
|
|
34966
|
-
type: Output
|
|
34967
34850
|
}] } });
|
|
34968
34851
|
|
|
34969
34852
|
class StepBuilderGroupComponent {
|