@cqa-lib/cqa-ui 1.1.203 → 1.1.205

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.
Files changed (35) hide show
  1. package/esm2020/lib/detail-drawer/detail-drawer-tab/detail-drawer-tab.component.mjs +38 -0
  2. package/esm2020/lib/detail-drawer/detail-drawer-tab-content.directive.mjs +16 -0
  3. package/esm2020/lib/detail-drawer/detail-drawer.component.mjs +121 -0
  4. package/esm2020/lib/detail-side-panel/detail-side-panel.component.mjs +211 -0
  5. package/esm2020/lib/detail-side-panel/detail-side-panel.models.mjs +2 -0
  6. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +7 -9
  7. package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +4 -4
  8. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +121 -23
  9. package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +65 -9
  10. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +8 -9
  11. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +319 -0
  12. package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +634 -0
  13. package/esm2020/lib/test-case-details/test-case-details.component.mjs +138 -0
  14. package/esm2020/lib/test-case-details/test-case-details.models.mjs +167 -0
  15. package/esm2020/lib/ui-kit.module.mjs +42 -3
  16. package/esm2020/public-api.mjs +10 -1
  17. package/fesm2015/cqa-lib-cqa-ui.mjs +1870 -73
  18. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  19. package/fesm2020/cqa-lib-cqa-ui.mjs +1865 -78
  20. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  21. package/lib/detail-drawer/detail-drawer-tab/detail-drawer-tab.component.d.ts +15 -0
  22. package/lib/detail-drawer/detail-drawer-tab-content.directive.d.ts +8 -0
  23. package/lib/detail-drawer/detail-drawer.component.d.ts +39 -0
  24. package/lib/detail-side-panel/detail-side-panel.component.d.ts +86 -0
  25. package/lib/detail-side-panel/detail-side-panel.models.d.ts +20 -0
  26. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +12 -2
  27. package/lib/step-builder/step-builder-document/step-builder-document.component.d.ts +18 -1
  28. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +55 -0
  29. package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +175 -0
  30. package/lib/test-case-details/test-case-details.component.d.ts +62 -0
  31. package/lib/test-case-details/test-case-details.models.d.ts +118 -0
  32. package/lib/ui-kit.module.d.ts +32 -24
  33. package/package.json +1 -1
  34. package/public-api.d.ts +9 -0
  35. package/styles.css +1 -1
@@ -0,0 +1,15 @@
1
+ import { DetailDrawerTabContentDirective } from '../detail-drawer-tab-content.directive';
2
+ import * as i0 from "@angular/core";
3
+ export declare class DetailDrawerTabComponent {
4
+ /** Tab label (shown in tooltip on icon button) */
5
+ label: string;
6
+ /** Tab value (unique identifier) */
7
+ value: string;
8
+ /** Material icon name for the tab button */
9
+ icon: string;
10
+ /** Template for tab content - use with ng-template cqaTabContent */
11
+ contentDirective?: DetailDrawerTabContentDirective;
12
+ get contentTemplate(): import("@angular/core").TemplateRef<unknown>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<DetailDrawerTabComponent, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<DetailDrawerTabComponent, "cqa-detail-drawer-tab", never, { "label": "label"; "value": "value"; "icon": "icon"; }, {}, ["contentDirective"], never>;
15
+ }
@@ -0,0 +1,8 @@
1
+ import { TemplateRef } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class DetailDrawerTabContentDirective {
4
+ templateRef: TemplateRef<unknown>;
5
+ constructor(templateRef: TemplateRef<unknown>);
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<DetailDrawerTabContentDirective, never>;
7
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DetailDrawerTabContentDirective, "[cqaTabContent]", never, {}, {}, never>;
8
+ }
@@ -0,0 +1,39 @@
1
+ import { EventEmitter, QueryList, AfterContentInit, AfterContentChecked } from '@angular/core';
2
+ import { DetailDrawerTabComponent } from './detail-drawer-tab/detail-drawer-tab.component';
3
+ import * as i0 from "@angular/core";
4
+ export declare class DetailDrawerComponent implements AfterContentInit, AfterContentChecked {
5
+ tabComponents: QueryList<DetailDrawerTabComponent>;
6
+ /** Currently active tab value */
7
+ activeTab: string;
8
+ /** Whether to show the close button */
9
+ showCloseButton: boolean;
10
+ /** Whether the drawer is expanded */
11
+ expanded: boolean;
12
+ /** Panel width when expanded */
13
+ expandedWidth: string;
14
+ /** Minimum width when expanded (e.g. '280px') */
15
+ minExpandedWidth?: string;
16
+ /** Maximum width when expanded (e.g. '600px', '30vw'). Default: 30% of viewport */
17
+ maxExpandedWidth: string;
18
+ /** Panel width when collapsed */
19
+ collapsedWidth: string;
20
+ get hostWidth(): string;
21
+ get hostMinWidth(): string | null;
22
+ get hostMaxWidth(): string | null;
23
+ expandTooltip: string;
24
+ collapseTooltip: string;
25
+ closeTooltip: string;
26
+ activeTabChange: EventEmitter<string>;
27
+ expandToggle: EventEmitter<void>;
28
+ close: EventEmitter<void>;
29
+ ngAfterContentInit(): void;
30
+ ngAfterContentChecked(): void;
31
+ private ensureActiveTab;
32
+ onTabClick(tab: DetailDrawerTabComponent): void;
33
+ onExpandToggle(): void;
34
+ onClose(): void;
35
+ trackByValue(_i: number, tab: DetailDrawerTabComponent): string;
36
+ isTabActive(tab: DetailDrawerTabComponent): boolean;
37
+ static ɵfac: i0.ɵɵFactoryDeclaration<DetailDrawerComponent, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<DetailDrawerComponent, "cqa-detail-drawer", never, { "activeTab": "activeTab"; "showCloseButton": "showCloseButton"; "expanded": "expanded"; "expandedWidth": "expandedWidth"; "minExpandedWidth": "minExpandedWidth"; "maxExpandedWidth": "maxExpandedWidth"; "collapsedWidth": "collapsedWidth"; "expandTooltip": "expandTooltip"; "collapseTooltip": "collapseTooltip"; "closeTooltip": "closeTooltip"; }, { "activeTabChange": "activeTabChange"; "expandToggle": "expandToggle"; "close": "close"; }, ["tabComponents"], never>;
39
+ }
@@ -0,0 +1,86 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { DetailSidePanelTab, DetailSidePanelMetadataItem, DetailSidePanelConfigSection } from './detail-side-panel.models';
3
+ import { TestCaseDetailsEditFormData, SelectConfigOverrides } from '../test-case-details/test-case-details-edit/test-case-details-edit.component';
4
+ import * as i0 from "@angular/core";
5
+ export type { DetailSidePanelTab, DetailSidePanelMetadataItem, DetailSidePanelConfigSection } from './detail-side-panel.models';
6
+ export declare class DetailSidePanelComponent {
7
+ /** Tabs - each tab has a side panel icon button; tabs and buttons are 1:1 */
8
+ tabs: DetailSidePanelTab[];
9
+ /** Currently active tab value */
10
+ activeTab: string;
11
+ /** Description section title */
12
+ descriptionTitle: string;
13
+ /** Description text content */
14
+ descriptionContent: string;
15
+ /** Whether to show the Edit button in the Description header */
16
+ showEditButton: boolean;
17
+ /** Metadata items (Created on, Status, Priority, etc.) */
18
+ metadataItems: DetailSidePanelMetadataItem[];
19
+ /** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
20
+ labels: string[];
21
+ /** Configuration sections - full width (e.g. Execution, AI Configuration) */
22
+ configSections: DetailSidePanelConfigSection[];
23
+ /** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
24
+ configSectionsRow2: DetailSidePanelConfigSection[];
25
+ /** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings. */
26
+ platform: 'web' | 'mobile';
27
+ /** Configuration section title */
28
+ configTitle: string;
29
+ /** Whether to show the close button in the side menu */
30
+ showCloseButton: boolean;
31
+ /** When true, test case details start in edit mode (useful for Storybook). */
32
+ startInEditMode: boolean;
33
+ /** Override config per select for API-driven options, server search, load more. */
34
+ selectConfigOverrides: SelectConfigOverrides;
35
+ /** Whether the panel is expanded (affects expand button icon and panel width) */
36
+ expanded: boolean;
37
+ /** Panel width when expanded (e.g. '480px', '25%') */
38
+ expandedWidth: string;
39
+ /** Panel width when collapsed (e.g. '56px' - fits icon bar + back button) */
40
+ collapsedWidth: string;
41
+ get hostWidth(): string;
42
+ get hostMinWidth(): string;
43
+ get hostMaxWidth(): string;
44
+ hostOverflow: string;
45
+ /** Tooltip for expand button when panel is collapsed */
46
+ expandTooltip: string;
47
+ /** Tooltip for expand button when panel is expanded (collapse) */
48
+ collapseTooltip: string;
49
+ /** Tooltip for close button */
50
+ closeTooltip: string;
51
+ back: EventEmitter<void>;
52
+ tabChange: EventEmitter<string>;
53
+ editDescription: EventEmitter<void>;
54
+ saveChanges: EventEmitter<TestCaseDetailsEditFormData>;
55
+ metadataLinkClick: EventEmitter<DetailSidePanelMetadataItem>;
56
+ selectSearch: EventEmitter<{
57
+ key: string;
58
+ query: string;
59
+ }>;
60
+ selectLoadMore: EventEmitter<{
61
+ key: string;
62
+ query: string;
63
+ }>;
64
+ selectOpened: EventEmitter<{
65
+ key: string;
66
+ }>;
67
+ selectionChange: EventEmitter<{
68
+ key: string;
69
+ value: unknown;
70
+ }>;
71
+ expandToggle: EventEmitter<void>;
72
+ close: EventEmitter<void>;
73
+ trackByTabValue(_i: number, tab: DetailSidePanelTab): string;
74
+ trackByMetadataLabel(_i: number, item: DetailSidePanelMetadataItem): string;
75
+ trackByConfigTitle(_i: number, section: DetailSidePanelConfigSection): string;
76
+ onBack(): void;
77
+ onTabClick(tab: DetailSidePanelTab): void;
78
+ onEditDescription(): void;
79
+ onSaveChanges(data: TestCaseDetailsEditFormData): void;
80
+ onExpandToggle(): void;
81
+ onClose(): void;
82
+ onMetadataLinkClick(item: DetailSidePanelMetadataItem): void;
83
+ getStatusDotClass(item: DetailSidePanelMetadataItem): string;
84
+ static ɵfac: i0.ɵɵFactoryDeclaration<DetailSidePanelComponent, never>;
85
+ static ɵcmp: i0.ɵɵComponentDeclaration<DetailSidePanelComponent, "cqa-detail-side-panel", never, { "tabs": "tabs"; "activeTab": "activeTab"; "descriptionTitle": "descriptionTitle"; "descriptionContent": "descriptionContent"; "showEditButton": "showEditButton"; "metadataItems": "metadataItems"; "labels": "labels"; "configSections": "configSections"; "configSectionsRow2": "configSectionsRow2"; "platform": "platform"; "configTitle": "configTitle"; "showCloseButton": "showCloseButton"; "startInEditMode": "startInEditMode"; "selectConfigOverrides": "selectConfigOverrides"; "expanded": "expanded"; "expandedWidth": "expandedWidth"; "collapsedWidth": "collapsedWidth"; "expandTooltip": "expandTooltip"; "collapseTooltip": "collapseTooltip"; "closeTooltip": "closeTooltip"; }, { "back": "back"; "tabChange": "tabChange"; "editDescription": "editDescription"; "saveChanges": "saveChanges"; "metadataLinkClick": "metadataLinkClick"; "selectSearch": "selectSearch"; "selectLoadMore": "selectLoadMore"; "selectOpened": "selectOpened"; "selectionChange": "selectionChange"; "expandToggle": "expandToggle"; "close": "close"; }, never, never>;
86
+ }
@@ -0,0 +1,20 @@
1
+ import { ConfigurationItem } from '../configuration-card/configuration-card.component';
2
+ export interface DetailSidePanelTab {
3
+ label: string;
4
+ value: string;
5
+ /** Material icon name for the side panel button */
6
+ icon?: string;
7
+ }
8
+ export interface DetailSidePanelMetadataItem {
9
+ label: string;
10
+ value: string;
11
+ icon?: string;
12
+ iconLibrary?: 'mat' | 'fa';
13
+ link?: string;
14
+ statusColor?: 'yellow' | 'red' | 'green' | 'gray';
15
+ }
16
+ export interface DetailSidePanelConfigSection {
17
+ title: string;
18
+ icon?: string;
19
+ items: ConfigurationItem[];
20
+ }
@@ -1,4 +1,4 @@
1
- import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
1
+ import { EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
2
2
  import { FormArray, FormBuilder, FormGroup } from '@angular/forms';
3
3
  import { DynamicSelectFieldConfig, SelectOption } from '../../dynamic-select/dynamic-select-field.component';
4
4
  import { ActionTemplate } from '../step-builder-action/step-builder-action.component';
@@ -17,6 +17,7 @@ export interface ConditionFormData {
17
17
  }
18
18
  export declare class StepBuilderConditionComponent implements OnInit, OnChanges {
19
19
  private fb;
20
+ private cdr;
20
21
  /** Options for operator dropdown */
21
22
  operatorOptions: SelectOption[];
22
23
  /** List of action templates to display in value dropdown */
@@ -30,12 +31,16 @@ export declare class StepBuilderConditionComponent implements OnInit, OnChanges
30
31
  conditionForm: FormGroup;
31
32
  includeElse: boolean;
32
33
  private valueConfigCache;
34
+ private operatorConfigCache;
35
+ private valueConfigsWithHandlers;
33
36
  private selectedTemplates;
34
37
  private conditionTemplateVariables;
35
38
  private conditionVariablesForms;
36
- constructor(fb: FormBuilder);
39
+ private conditionFormGroupCache;
40
+ constructor(fb: FormBuilder, cdr: ChangeDetectorRef);
37
41
  ngOnInit(): void;
38
42
  ngOnChanges(changes: SimpleChanges): void;
43
+ private updateOperatorConfigCache;
39
44
  get conditionsFormArray(): FormArray;
40
45
  addCondition(conditionType: string): void;
41
46
  removeCondition(index: number): void;
@@ -53,6 +58,11 @@ export declare class StepBuilderConditionComponent implements OnInit, OnChanges
53
58
  onConditionVariableInputChange(conditionIndex: number, variableName: string, value: any): void;
54
59
  onConditionVariableBooleanChange(conditionIndex: number, variableName: string, value: boolean): void;
55
60
  getConditionFormGroup(index: number): FormGroup;
61
+ getConditionFieldValue(index: number): string;
62
+ isConditionIf(index: number): boolean;
63
+ isConditionElseIf(index: number): boolean;
64
+ getConditionLabel(index: number): string;
65
+ trackByConditionIndex(index: number): number;
56
66
  onIncludeElseChange(checked: boolean): void;
57
67
  onCancel(): void;
58
68
  onCreateStep(): void;
@@ -12,6 +12,10 @@ export interface DocumentMappingRow {
12
12
  export interface DocumentFormData {
13
13
  documentType: string;
14
14
  outputVariable: string;
15
+ fileName?: string;
16
+ seprator?: string;
17
+ delimeter?: string;
18
+ fileFormatHeader?: string;
15
19
  templateSource: TemplateSourceType;
16
20
  templateId?: string;
17
21
  /** Uploaded template file when templateSource is 'upload' */
@@ -30,6 +34,8 @@ export declare class StepBuilderDocumentComponent implements OnInit, OnChanges {
30
34
  templateOptions: SelectOption[];
31
35
  /** Options for value type dropdown in document mapper */
32
36
  valueTypeOptions: SelectOption[];
37
+ /** Options for delimeter type dropdown (shown when documentType is 'csv') */
38
+ delimeterTypeOptions: SelectOption[];
33
39
  /** Optional URL for "Need help?" link in Document Mapper section */
34
40
  mapperHelpUrl: string;
35
41
  /** Tooltip text when hovering over "Need help?" (same as custom-edit-step) */
@@ -48,6 +54,14 @@ export declare class StepBuilderDocumentComponent implements OnInit, OnChanges {
48
54
  initialTemplateDescription?: string;
49
55
  /** Initial mappings for edit mode */
50
56
  initialMappings?: DocumentMappingRow[];
57
+ /** Initial file name for edit mode */
58
+ initialFileName?: string;
59
+ /** Initial seprator for edit mode */
60
+ initialSeprator?: string;
61
+ /** Initial delimeter for edit mode */
62
+ initialDelimeter?: string;
63
+ /** Initial file format header for edit mode */
64
+ initialFileFormatHeader?: string;
51
65
  /** Whether in edit mode */
52
66
  editMode?: boolean;
53
67
  /** Whether the help tooltip is visible */
@@ -75,6 +89,9 @@ export declare class StepBuilderDocumentComponent implements OnInit, OnChanges {
75
89
  getDocumentTypeConfig(): DynamicSelectFieldConfig;
76
90
  getTemplateSelectConfig(): DynamicSelectFieldConfig;
77
91
  getValueTypeConfig(index: number): DynamicSelectFieldConfig;
92
+ getDelimeterConfig(): DynamicSelectFieldConfig;
93
+ get isTxtSelected(): boolean;
94
+ get isCsvSelected(): boolean;
78
95
  onTemplateSourceChange(value: string): void;
79
96
  onCreateTemplate(): void;
80
97
  onFileSelected(event: Event): void;
@@ -95,5 +112,5 @@ export declare class StepBuilderDocumentComponent implements OnInit, OnChanges {
95
112
  onCreateStep(): void;
96
113
  onMapperHelpClick(event: Event): void;
97
114
  static ɵfac: i0.ɵɵFactoryDeclaration<StepBuilderDocumentComponent, never>;
98
- static ɵcmp: i0.ɵɵComponentDeclaration<StepBuilderDocumentComponent, "cqa-step-builder-document", never, { "documentTypeOptions": "documentTypeOptions"; "templateOptions": "templateOptions"; "valueTypeOptions": "valueTypeOptions"; "mapperHelpUrl": "mapperHelpUrl"; "mapperHelpTooltipText": "mapperHelpTooltipText"; "initialDocumentType": "initialDocumentType"; "initialOutputVariable": "initialOutputVariable"; "initialTemplateSource": "initialTemplateSource"; "initialTemplateId": "initialTemplateId"; "initialTemplateName": "initialTemplateName"; "initialTemplateDescription": "initialTemplateDescription"; "initialMappings": "initialMappings"; "editMode": "editMode"; }, { "createStep": "createStep"; "cancelled": "cancelled"; "createTemplate": "createTemplate"; }, never, never>;
115
+ static ɵcmp: i0.ɵɵComponentDeclaration<StepBuilderDocumentComponent, "cqa-step-builder-document", never, { "documentTypeOptions": "documentTypeOptions"; "templateOptions": "templateOptions"; "valueTypeOptions": "valueTypeOptions"; "delimeterTypeOptions": "delimeterTypeOptions"; "mapperHelpUrl": "mapperHelpUrl"; "mapperHelpTooltipText": "mapperHelpTooltipText"; "initialDocumentType": "initialDocumentType"; "initialOutputVariable": "initialOutputVariable"; "initialTemplateSource": "initialTemplateSource"; "initialTemplateId": "initialTemplateId"; "initialTemplateName": "initialTemplateName"; "initialTemplateDescription": "initialTemplateDescription"; "initialMappings": "initialMappings"; "initialFileName": "initialFileName"; "initialSeprator": "initialSeprator"; "initialDelimeter": "initialDelimeter"; "initialFileFormatHeader": "initialFileFormatHeader"; "editMode": "editMode"; }, { "createStep": "createStep"; "cancelled": "cancelled"; "createTemplate": "createTemplate"; }, never, never>;
99
116
  }
@@ -0,0 +1,55 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import { DynamicSelectFieldConfig, SelectOption } from '../../dynamic-select/dynamic-select-field.component';
4
+ import * as i0 from "@angular/core";
5
+ export interface TemplateVariable {
6
+ name: string;
7
+ label: string;
8
+ value: any;
9
+ type?: string;
10
+ options?: string[];
11
+ }
12
+ export declare class TemplateVariablesFormComponent implements OnChanges {
13
+ private cdr;
14
+ templateVariables: TemplateVariable[];
15
+ variablesForm: FormGroup;
16
+ metadata: string;
17
+ description: string;
18
+ variableValueChange: EventEmitter<{
19
+ name: string;
20
+ value: any;
21
+ }>;
22
+ variableBooleanChange: EventEmitter<{
23
+ name: string;
24
+ value: boolean;
25
+ }>;
26
+ metadataChange: EventEmitter<string>;
27
+ descriptionChange: EventEmitter<string>;
28
+ private selectConfigCache;
29
+ private dataTypeSelectConfigCache;
30
+ private variableDataTypes;
31
+ private variableRawValues;
32
+ private needsDataTypeDropdownCache;
33
+ private shouldShowDropdownCache;
34
+ private readonly dataTypeOptions;
35
+ constructor(cdr: ChangeDetectorRef);
36
+ ngOnChanges(changes: SimpleChanges): void;
37
+ private initializeTestDataVariables;
38
+ private precomputeConfigs;
39
+ private parseTestDataValue;
40
+ private formatTestDataValue;
41
+ trackByVariable(index: number, variable: TemplateVariable): any;
42
+ getSelectConfig(variable: TemplateVariable): DynamicSelectFieldConfig;
43
+ onVariableValueChange(variableName: string, value: any): void;
44
+ onVariableBooleanChange(variableName: string, value: boolean): void;
45
+ shouldShowDropdown(variable: TemplateVariable): boolean;
46
+ needsDataTypeDropdown(variable: TemplateVariable): boolean;
47
+ getDataTypeOptions(): SelectOption[];
48
+ getDataTypeSelectConfig(variable: TemplateVariable): DynamicSelectFieldConfig;
49
+ getCurrentDataType(variable: TemplateVariable): 'plain-text' | 'parameter' | 'runtime' | 'environment';
50
+ getRawValue(variable: TemplateVariable): string;
51
+ onDataTypeChange(variableName: string, dataType: 'plain-text' | 'parameter' | 'runtime' | 'environment'): void;
52
+ onTestDataValueChange(variableName: string, rawValue: string): void;
53
+ static ɵfac: i0.ɵɵFactoryDeclaration<TemplateVariablesFormComponent, never>;
54
+ static ɵcmp: i0.ɵɵComponentDeclaration<TemplateVariablesFormComponent, "cqa-template-variables-form", never, { "templateVariables": "templateVariables"; "variablesForm": "variablesForm"; "metadata": "metadata"; "description": "description"; }, { "variableValueChange": "variableValueChange"; "variableBooleanChange": "variableBooleanChange"; "metadataChange": "metadataChange"; "descriptionChange": "descriptionChange"; }, never, never>;
55
+ }
@@ -0,0 +1,175 @@
1
+ import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import { TestCaseDetailsConfigSection, TestCaseDetailsMetadataItem } from '../test-case-details.models';
4
+ import { DynamicSelectFieldConfig, SelectOption } from '../../dynamic-select/dynamic-select-field.component';
5
+ import * as i0 from "@angular/core";
6
+ /** Override config for a specific select. Use for server-side search, load more, custom options. */
7
+ export interface SelectConfigOverride {
8
+ /** Replace options (e.g. from API). Update when API returns. */
9
+ options?: SelectOption[];
10
+ /** Enable server-side search; component emits selectSearch instead of local filtering. */
11
+ serverSearch?: boolean;
12
+ /** Indicates more results available for infinite scroll. */
13
+ hasMore?: boolean;
14
+ /** Loading state (e.g. during API call). */
15
+ isLoading?: boolean;
16
+ /** Enable search input in the select. */
17
+ searchable?: boolean;
18
+ /** When true, triggers initial search on panel open (serverSearch mode). */
19
+ initialFetchOnOpen?: boolean;
20
+ /** Callback when user types in search. Call API, then update options via selectConfigOverrides. */
21
+ onSearch?: (query: string) => void;
22
+ /** Callback when user scrolls to load more. Call API, append options via selectConfigOverrides. */
23
+ onLoadMore?: (query?: string) => void;
24
+ }
25
+ /** Map of select key -> config override. Enables API-driven options, infinite search, load more. */
26
+ export declare type SelectConfigOverrides = Partial<Record<string, SelectConfigOverride>>;
27
+ /** Keys for each dynamic select in test-case-details-edit. Use these with selectConfigOverrides. */
28
+ export declare const TEST_CASE_DETAILS_SELECT_KEYS: {
29
+ readonly status: "status";
30
+ readonly priority: "priority";
31
+ readonly prerequisiteCases: "prerequisiteCases";
32
+ readonly videoRecording: "videoRecording";
33
+ readonly enableAiSmartness: "enableAiSmartness";
34
+ readonly defaultAiAction: "defaultAiAction";
35
+ readonly knowledgeBaseDefaultTestCase: "knowledgeBaseDefaultTestCase";
36
+ readonly useAiMetadata: "useAiMetadata";
37
+ readonly defaultBrowser: "defaultBrowser";
38
+ readonly defaultViewport: "defaultViewport";
39
+ readonly deviceType: "deviceType";
40
+ readonly deviceOS: "deviceOS";
41
+ };
42
+ export interface TestCaseDetailsEditFormData {
43
+ descriptionContent: string;
44
+ status: string;
45
+ priority: string;
46
+ labels: string[];
47
+ configSections: TestCaseDetailsConfigSection[];
48
+ configSectionsRow2: TestCaseDetailsConfigSection[];
49
+ }
50
+ export declare class TestCaseDetailsEditComponent implements OnInit, OnChanges {
51
+ descriptionTitle: string;
52
+ descriptionContent: string;
53
+ metadataItems: TestCaseDetailsMetadataItem[];
54
+ labels: string[];
55
+ configTitle: string;
56
+ configSections: TestCaseDetailsConfigSection[];
57
+ configSectionsRow2: TestCaseDetailsConfigSection[];
58
+ /** Optional list of prerequisite test case options for the multi-select. If not provided, uses default sample options. */
59
+ prerequisiteCaseOptions: {
60
+ value: string;
61
+ name: string;
62
+ }[];
63
+ /** Platform: 'web' shows Default Browser + Viewport; 'mobile' shows Device Type + OS. Defaults to 'web'. */
64
+ platform: 'web' | 'mobile';
65
+ /**
66
+ * Override config per select key. Use for:
67
+ * - API-driven options: pass options array (update when API returns)
68
+ * - Server-side search: serverSearch: true, onSearch in override or listen to selectSearch
69
+ * - Infinite scroll: hasMore: true, onLoadMore in override or listen to selectLoadMore
70
+ * - Initial fetch on open: initialFetchOnOpen: true
71
+ */
72
+ selectConfigOverrides: SelectConfigOverrides;
73
+ save: EventEmitter<TestCaseDetailsEditFormData>;
74
+ cancel: EventEmitter<void>;
75
+ /** Emitted when user searches in a select (serverSearch mode). Call API and update options via selectConfigOverrides. */
76
+ selectSearch: EventEmitter<{
77
+ key: string;
78
+ query: string;
79
+ }>;
80
+ /** Emitted when user scrolls to load more. Call API, append to options via selectConfigOverrides. */
81
+ selectLoadMore: EventEmitter<{
82
+ key: string;
83
+ query: string;
84
+ }>;
85
+ /** Emitted when a select panel is opened. Use to call API for initial load (e.g. when initialFetchOnOpen). */
86
+ selectOpened: EventEmitter<{
87
+ key: string;
88
+ }>;
89
+ /** Emitted when selection changes in any select. */
90
+ selectionChange: EventEmitter<{
91
+ key: string;
92
+ value: unknown;
93
+ }>;
94
+ /** Form state */
95
+ editDescription: string;
96
+ editStatus: string;
97
+ editPriority: string;
98
+ editLabels: string[];
99
+ labelSearch: string;
100
+ testCaseTimeout: string;
101
+ waitTimeoutLocators: string;
102
+ autoWaitEnabled: boolean;
103
+ retryFailedSteps: string;
104
+ configExpanded: boolean;
105
+ executionExpanded: boolean;
106
+ aiConfigExpanded: boolean;
107
+ waitsRetriesExpanded: boolean;
108
+ deviceExpanded: boolean;
109
+ keyFlagsExpanded: boolean;
110
+ mobileTestingEnabled: boolean;
111
+ extensionUseEnabled: boolean;
112
+ dataDrivenEnabled: boolean;
113
+ readonly frequentlyUsedLabels: string[];
114
+ /** FormGroup for cqa-dynamic-select bindings */
115
+ editForm: FormGroup;
116
+ get statusItem(): TestCaseDetailsMetadataItem | undefined;
117
+ get priorityItem(): TestCaseDetailsMetadataItem | undefined;
118
+ get statusOptions(): string[];
119
+ get priorityOptions(): string[];
120
+ /** Cached configs to avoid new object refs each change detection (prevents infinite loops) */
121
+ readonly statusSelectConfig: DynamicSelectFieldConfig;
122
+ private readonly defaultPrerequisiteCaseOptions;
123
+ readonly videoRecordingSelectConfig: DynamicSelectFieldConfig;
124
+ readonly aiMetadataCollectionSelectConfig: DynamicSelectFieldConfig;
125
+ prerequisiteCaseSelectConfig: DynamicSelectFieldConfig;
126
+ readonly defaultViewportSelectConfig: DynamicSelectFieldConfig;
127
+ readonly deviceTypeSelectConfig: DynamicSelectFieldConfig;
128
+ readonly deviceOSSelectConfig: DynamicSelectFieldConfig;
129
+ readonly defaultBrowserSelectConfig: DynamicSelectFieldConfig;
130
+ readonly prioritySelectConfig: DynamicSelectFieldConfig;
131
+ readonly enableAiSmartnessSelectConfig: DynamicSelectFieldConfig;
132
+ readonly defaultAiActionSelectConfig: DynamicSelectFieldConfig;
133
+ readonly knowledgeBaseDefaultTestCaseSelectConfig: DynamicSelectFieldConfig;
134
+ /**
135
+ * Returns merged config for a select: base config + override.
136
+ * Wires onSearch, onLoadMore to both override callbacks and output events.
137
+ */
138
+ getConfigForSelect(key: string, baseConfig: DynamicSelectFieldConfig): DynamicSelectFieldConfig;
139
+ onSelectOpened(key: string): void;
140
+ onSelectSearch(event: {
141
+ key: string;
142
+ query: string;
143
+ }): void;
144
+ onSelectLoadMore(event: {
145
+ key: string;
146
+ query: string;
147
+ }): void;
148
+ onSelectionChange(event: {
149
+ key: string;
150
+ value: unknown;
151
+ }): void;
152
+ private getConfigItemValue;
153
+ private getPrerequisiteCasesFromConfig;
154
+ ngOnInit(): void;
155
+ private normalizeBooleanSelectValue;
156
+ ngOnChanges(changes: SimpleChanges): void;
157
+ onRemoveLabel(label: string): void;
158
+ onClearAllLabels(): void;
159
+ onAddFrequentLabel(label: string): void;
160
+ onAddSearchedLabel(): void;
161
+ onSave(): void;
162
+ private mergeConfigSections;
163
+ private mergeConfigSectionsRow2;
164
+ onCancel(): void;
165
+ trackByLabel(_i: number, label: string): string;
166
+ trackByConfigTitle(_i: number, section: TestCaseDetailsConfigSection): string;
167
+ /** Current labels use consistent indigo style */
168
+ private readonly LABEL_CHIP_STYLE;
169
+ getCurrentLabelChipStyle(_label: string): {
170
+ [key: string]: string;
171
+ };
172
+ getLabelCloseIconColor(_label: string): string;
173
+ static ɵfac: i0.ɵɵFactoryDeclaration<TestCaseDetailsEditComponent, never>;
174
+ static ɵcmp: i0.ɵɵComponentDeclaration<TestCaseDetailsEditComponent, "cqa-test-case-details-edit", never, { "descriptionTitle": "descriptionTitle"; "descriptionContent": "descriptionContent"; "metadataItems": "metadataItems"; "labels": "labels"; "configTitle": "configTitle"; "configSections": "configSections"; "configSectionsRow2": "configSectionsRow2"; "prerequisiteCaseOptions": "prerequisiteCaseOptions"; "platform": "platform"; "selectConfigOverrides": "selectConfigOverrides"; }, { "save": "save"; "cancel": "cancel"; "selectSearch": "selectSearch"; "selectLoadMore": "selectLoadMore"; "selectOpened": "selectOpened"; "selectionChange": "selectionChange"; }, never, never>;
175
+ }
@@ -0,0 +1,62 @@
1
+ import { EventEmitter, ChangeDetectorRef, OnInit } from '@angular/core';
2
+ import { TestCaseDetailsConfigSection, TestCaseDetailsMetadataItem } from './test-case-details.models';
3
+ import { TestCaseDetailsEditFormData, SelectConfigOverrides } from './test-case-details-edit/test-case-details-edit.component';
4
+ import * as i0 from "@angular/core";
5
+ export declare class TestCaseDetailsComponent implements OnInit {
6
+ private cdr;
7
+ /** Whether the component is in edit mode */
8
+ editing: boolean;
9
+ /** When true, start in edit mode (useful for Storybook). */
10
+ startInEditMode: boolean;
11
+ constructor(cdr: ChangeDetectorRef);
12
+ ngOnInit(): void;
13
+ /** Description section title */
14
+ descriptionTitle: string;
15
+ /** Description text content */
16
+ descriptionContent: string;
17
+ /** Whether to show the Edit button in the Description header */
18
+ showEditButton: boolean;
19
+ /** Metadata items (createdOn, status, priority, environment, version, testPlanName, etc.) */
20
+ metadataItems: TestCaseDetailsMetadataItem[];
21
+ /** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
22
+ labels: string[];
23
+ /** Configuration section title */
24
+ configTitle: string;
25
+ /** Configuration sections (e.g. Execution, AI Configuration) */
26
+ configSections: TestCaseDetailsConfigSection[];
27
+ /** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
28
+ configSectionsRow2: TestCaseDetailsConfigSection[];
29
+ /** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings fields. */
30
+ platform: 'web' | 'mobile';
31
+ /** Override config per select for API-driven options, server search, load more. */
32
+ selectConfigOverrides: SelectConfigOverrides;
33
+ editDescription: EventEmitter<void>;
34
+ saveChanges: EventEmitter<TestCaseDetailsEditFormData>;
35
+ metadataLinkClick: EventEmitter<TestCaseDetailsMetadataItem>;
36
+ selectSearch: EventEmitter<{
37
+ key: string;
38
+ query: string;
39
+ }>;
40
+ selectLoadMore: EventEmitter<{
41
+ key: string;
42
+ query: string;
43
+ }>;
44
+ selectOpened: EventEmitter<{
45
+ key: string;
46
+ }>;
47
+ selectionChange: EventEmitter<{
48
+ key: string;
49
+ value: unknown;
50
+ }>;
51
+ onEditClick(): void;
52
+ onSaveChanges(data: TestCaseDetailsEditFormData): void;
53
+ onCancelEdit(): void;
54
+ trackByConfigTitle(_i: number, section: TestCaseDetailsConfigSection): string;
55
+ trackByMetadataLabel(_i: number, item: TestCaseDetailsMetadataItem): string;
56
+ onMetadataLinkClick(item: TestCaseDetailsMetadataItem): void;
57
+ getStatusDotClass(item: TestCaseDetailsMetadataItem): string;
58
+ /** Text color for metadata value (e.g. red for critical priority) */
59
+ getValueTextClass(item: TestCaseDetailsMetadataItem): string;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<TestCaseDetailsComponent, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<TestCaseDetailsComponent, "cqa-test-case-details", never, { "startInEditMode": "startInEditMode"; "descriptionTitle": "descriptionTitle"; "descriptionContent": "descriptionContent"; "showEditButton": "showEditButton"; "metadataItems": "metadataItems"; "labels": "labels"; "configTitle": "configTitle"; "configSections": "configSections"; "configSectionsRow2": "configSectionsRow2"; "platform": "platform"; "selectConfigOverrides": "selectConfigOverrides"; }, { "editDescription": "editDescription"; "saveChanges": "saveChanges"; "metadataLinkClick": "metadataLinkClick"; "selectSearch": "selectSearch"; "selectLoadMore": "selectLoadMore"; "selectOpened": "selectOpened"; "selectionChange": "selectionChange"; }, never, never>;
62
+ }