@cqa-lib/cqa-ui 1.1.204 → 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 (26) 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/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +634 -0
  7. package/esm2020/lib/test-case-details/test-case-details.component.mjs +138 -0
  8. package/esm2020/lib/test-case-details/test-case-details.models.mjs +167 -0
  9. package/esm2020/lib/ui-kit.module.mjs +31 -1
  10. package/esm2020/public-api.mjs +9 -1
  11. package/fesm2015/cqa-lib-cqa-ui.mjs +1322 -2
  12. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  13. package/fesm2020/cqa-lib-cqa-ui.mjs +1315 -2
  14. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  15. package/lib/detail-drawer/detail-drawer-tab/detail-drawer-tab.component.d.ts +15 -0
  16. package/lib/detail-drawer/detail-drawer-tab-content.directive.d.ts +8 -0
  17. package/lib/detail-drawer/detail-drawer.component.d.ts +39 -0
  18. package/lib/detail-side-panel/detail-side-panel.component.d.ts +86 -0
  19. package/lib/detail-side-panel/detail-side-panel.models.d.ts +20 -0
  20. package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +175 -0
  21. package/lib/test-case-details/test-case-details.component.d.ts +62 -0
  22. package/lib/test-case-details/test-case-details.models.d.ts +118 -0
  23. package/lib/ui-kit.module.d.ts +32 -26
  24. package/package.json +1 -1
  25. package/public-api.d.ts +8 -0
  26. package/styles.css +1 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, HostListener, ViewChildren, ViewChild, ChangeDetectionStrategy, Directive, TemplateRef, ContentChildren, ContentChild, ElementRef, forwardRef, Injectable, InjectionToken, ChangeDetectorRef, SimpleChange, ViewContainerRef, Inject, Optional, Injector, NgModule } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, HostListener, ViewChildren, ViewChild, ChangeDetectionStrategy, Directive, TemplateRef, ContentChildren, ContentChild, ElementRef, forwardRef, Injectable, InjectionToken, ChangeDetectorRef, SimpleChange, ViewContainerRef, Inject, Optional, Injector, HostBinding, NgModule } from '@angular/core';
3
3
  import * as i2 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1$1 from '@angular/forms';
@@ -25799,6 +25799,1128 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
25799
25799
  type: Output
25800
25800
  }] } });
25801
25801
 
25802
+ /** Keys for each dynamic select in test-case-details-edit. Use these with selectConfigOverrides. */
25803
+ const TEST_CASE_DETAILS_SELECT_KEYS = {
25804
+ status: 'status',
25805
+ priority: 'priority',
25806
+ prerequisiteCases: 'prerequisiteCases',
25807
+ videoRecording: 'videoRecording',
25808
+ enableAiSmartness: 'enableAiSmartness',
25809
+ defaultAiAction: 'defaultAiAction',
25810
+ knowledgeBaseDefaultTestCase: 'knowledgeBaseDefaultTestCase',
25811
+ useAiMetadata: 'useAiMetadata',
25812
+ defaultBrowser: 'defaultBrowser',
25813
+ defaultViewport: 'defaultViewport',
25814
+ deviceType: 'deviceType',
25815
+ deviceOS: 'deviceOS',
25816
+ };
25817
+ const FREQUENTLY_USED_LABELS = [
25818
+ 'Case',
25819
+ 'Critical',
25820
+ 'PO',
25821
+ 'Upload',
25822
+ 'Validation',
25823
+ 'Review',
25824
+ 'Edge-cases',
25825
+ 'Security',
25826
+ 'Integration',
25827
+ 'Smoke',
25828
+ ];
25829
+ class TestCaseDetailsEditComponent {
25830
+ constructor() {
25831
+ this.descriptionTitle = 'Description';
25832
+ this.descriptionContent = '';
25833
+ this.metadataItems = [];
25834
+ this.labels = [];
25835
+ this.configTitle = 'Configuration';
25836
+ this.configSections = [];
25837
+ this.configSectionsRow2 = [];
25838
+ /** Optional list of prerequisite test case options for the multi-select. If not provided, uses default sample options. */
25839
+ this.prerequisiteCaseOptions = [];
25840
+ /** Platform: 'web' shows Default Browser + Viewport; 'mobile' shows Device Type + OS. Defaults to 'web'. */
25841
+ this.platform = 'web';
25842
+ /**
25843
+ * Override config per select key. Use for:
25844
+ * - API-driven options: pass options array (update when API returns)
25845
+ * - Server-side search: serverSearch: true, onSearch in override or listen to selectSearch
25846
+ * - Infinite scroll: hasMore: true, onLoadMore in override or listen to selectLoadMore
25847
+ * - Initial fetch on open: initialFetchOnOpen: true
25848
+ */
25849
+ this.selectConfigOverrides = {};
25850
+ this.save = new EventEmitter();
25851
+ this.cancel = new EventEmitter();
25852
+ /** Emitted when user searches in a select (serverSearch mode). Call API and update options via selectConfigOverrides. */
25853
+ this.selectSearch = new EventEmitter();
25854
+ /** Emitted when user scrolls to load more. Call API, append to options via selectConfigOverrides. */
25855
+ this.selectLoadMore = new EventEmitter();
25856
+ /** Emitted when a select panel is opened. Use to call API for initial load (e.g. when initialFetchOnOpen). */
25857
+ this.selectOpened = new EventEmitter();
25858
+ /** Emitted when selection changes in any select. */
25859
+ this.selectionChange = new EventEmitter();
25860
+ /** Form state */
25861
+ this.editDescription = '';
25862
+ this.editStatus = '';
25863
+ this.editPriority = '';
25864
+ this.editLabels = [];
25865
+ this.labelSearch = '';
25866
+ this.testCaseTimeout = '';
25867
+ this.waitTimeoutLocators = '';
25868
+ this.autoWaitEnabled = false;
25869
+ this.retryFailedSteps = '';
25870
+ this.configExpanded = true;
25871
+ this.executionExpanded = true;
25872
+ this.aiConfigExpanded = true;
25873
+ this.waitsRetriesExpanded = true;
25874
+ this.deviceExpanded = true;
25875
+ this.keyFlagsExpanded = true;
25876
+ this.mobileTestingEnabled = false;
25877
+ this.extensionUseEnabled = false;
25878
+ this.dataDrivenEnabled = false;
25879
+ this.frequentlyUsedLabels = FREQUENTLY_USED_LABELS;
25880
+ /** FormGroup for cqa-dynamic-select bindings */
25881
+ this.editForm = new FormGroup({
25882
+ status: new FormControl(''),
25883
+ priority: new FormControl(''),
25884
+ prerequisiteCases: new FormControl([]),
25885
+ defaultBrowser: new FormControl(''),
25886
+ videoRecording: new FormControl(''),
25887
+ defaultViewport: new FormControl(''),
25888
+ deviceType: new FormControl(''),
25889
+ deviceOS: new FormControl(''),
25890
+ enableAiSmartness: new FormControl(''),
25891
+ defaultAiAction: new FormControl(''),
25892
+ knowledgeBaseDefaultTestCase: new FormControl(''),
25893
+ useAiMetadata: new FormControl(''),
25894
+ });
25895
+ /** Cached configs to avoid new object refs each change detection (prevents infinite loops) */
25896
+ this.statusSelectConfig = {
25897
+ key: 'status',
25898
+ label: '',
25899
+ placeholder: 'Status',
25900
+ searchable: false,
25901
+ options: [
25902
+ { value: 'Draft', name: 'Draft' },
25903
+ { value: 'In Review', name: 'In Review' },
25904
+ { value: 'Approved', name: 'Approved' },
25905
+ { value: 'Active', name: 'Active' },
25906
+ { value: 'Inactive', name: 'Inactive' },
25907
+ { value: 'Blocked', name: 'Blocked' },
25908
+ ],
25909
+ };
25910
+ this.defaultPrerequisiteCaseOptions = [
25911
+ { value: 'TC-001', name: 'TC-001: Login flow' },
25912
+ { value: 'TC-002', name: 'TC-002: User registration' },
25913
+ { value: 'TC-003', name: 'TC-003: Password reset' },
25914
+ { value: 'TC-004', name: 'TC-004: Dashboard load' },
25915
+ { value: 'TC-005', name: 'TC-005: API health check' },
25916
+ ];
25917
+ this.videoRecordingSelectConfig = {
25918
+ key: 'videoRecording',
25919
+ label: 'Record test execution video',
25920
+ placeholder: 'Select',
25921
+ searchable: false,
25922
+ options: [
25923
+ { value: 'true', name: 'True' },
25924
+ { value: 'false', name: 'False' },
25925
+ { value: 'Org level', name: 'Org level' },
25926
+ ],
25927
+ };
25928
+ this.aiMetadataCollectionSelectConfig = {
25929
+ key: 'useAiMetadata',
25930
+ label: 'Enable AI metadata collection',
25931
+ placeholder: 'Select',
25932
+ searchable: false,
25933
+ options: [
25934
+ { value: 'true', name: 'True' },
25935
+ { value: 'false', name: 'False' },
25936
+ { value: 'Org level', name: 'Org level' },
25937
+ ],
25938
+ };
25939
+ this.prerequisiteCaseSelectConfig = {
25940
+ key: 'prerequisiteCases',
25941
+ label: 'Prerequisite Case',
25942
+ placeholder: 'Select',
25943
+ searchable: true,
25944
+ multiple: true,
25945
+ optionStyle: 'checkbox',
25946
+ showSelectAll: true,
25947
+ selectAllLabel: 'All',
25948
+ options: [
25949
+ { value: 'TC-001', name: 'TC-001: Login flow' },
25950
+ { value: 'TC-002', name: 'TC-002: User registration' },
25951
+ { value: 'TC-003', name: 'TC-003: Password reset' },
25952
+ { value: 'TC-004', name: 'TC-004: Dashboard load' },
25953
+ { value: 'TC-005', name: 'TC-005: API health check' },
25954
+ ],
25955
+ };
25956
+ this.defaultViewportSelectConfig = {
25957
+ key: 'defaultViewport',
25958
+ label: 'Default Viewport',
25959
+ placeholder: 'Select',
25960
+ searchable: false,
25961
+ options: [
25962
+ { value: '1920x1080', name: '1920x1080' },
25963
+ { value: '1366x768', name: '1366x768' },
25964
+ { value: '1536x864', name: '1536x864' },
25965
+ { value: '1280x720', name: '1280x720' },
25966
+ { value: '1440x900', name: '1440x900' },
25967
+ { value: '2560x1440', name: '2560x1440' },
25968
+ ],
25969
+ };
25970
+ this.deviceTypeSelectConfig = {
25971
+ key: 'deviceType',
25972
+ label: 'Device Type',
25973
+ placeholder: 'Select',
25974
+ searchable: false,
25975
+ options: [
25976
+ { value: 'iPhone 14', name: 'iPhone 14' },
25977
+ { value: 'iPhone 15', name: 'iPhone 15' },
25978
+ { value: 'iPhone 17', name: 'iPhone 17' },
25979
+ { value: 'Iphone 17', name: 'Iphone 17' },
25980
+ { value: 'Samsung Galaxy', name: 'Samsung Galaxy' },
25981
+ { value: 'Pixel', name: 'Pixel' },
25982
+ ],
25983
+ };
25984
+ this.deviceOSSelectConfig = {
25985
+ key: 'deviceOS',
25986
+ label: 'OS',
25987
+ placeholder: 'Select',
25988
+ searchable: false,
25989
+ options: [
25990
+ { value: 'ipa', name: 'iOS (ipa)' },
25991
+ { value: 'apk', name: 'Android (apk)' },
25992
+ { value: 'iOS 16', name: 'iOS 16' },
25993
+ { value: 'iOS 17', name: 'iOS 17' },
25994
+ { value: 'Android 13', name: 'Android 13' },
25995
+ { value: 'Android 14', name: 'Android 14' },
25996
+ ],
25997
+ };
25998
+ this.defaultBrowserSelectConfig = {
25999
+ key: 'defaultBrowser',
26000
+ label: 'Default Browser',
26001
+ placeholder: 'Chrome',
26002
+ searchable: false,
26003
+ options: [
26004
+ { value: 'Chrome', name: 'Chrome' },
26005
+ { value: 'Firefox', name: 'Firefox' },
26006
+ { value: 'Safari', name: 'Safari' },
26007
+ { value: 'Edge', name: 'Edge' },
26008
+ ],
26009
+ };
26010
+ this.prioritySelectConfig = {
26011
+ key: 'priority',
26012
+ label: '',
26013
+ placeholder: 'Priority',
26014
+ searchable: false,
26015
+ options: [
26016
+ { value: 'Critical', name: 'Critical' },
26017
+ { value: 'Major', name: 'Major' },
26018
+ { value: 'High', name: 'High' },
26019
+ { value: 'Medium', name: 'Medium' },
26020
+ { value: 'Low', name: 'Low' },
26021
+ { value: 'Minor', name: 'Minor' },
26022
+ { value: 'Not set', name: 'Not set' },
26023
+ ],
26024
+ };
26025
+ this.enableAiSmartnessSelectConfig = {
26026
+ key: 'enableAiSmartness',
26027
+ label: 'Enable AI Smartness',
26028
+ placeholder: 'Advanced',
26029
+ searchable: false,
26030
+ options: [
26031
+ { value: 'Basic', name: 'Basic' },
26032
+ { value: 'Advanced', name: 'Advanced' },
26033
+ { value: 'Off', name: 'Off' },
26034
+ ],
26035
+ };
26036
+ this.defaultAiActionSelectConfig = {
26037
+ key: 'defaultAiAction',
26038
+ label: 'Default AI Action',
26039
+ placeholder: 'Smart wait',
26040
+ searchable: false,
26041
+ options: [
26042
+ { value: 'Smart wait', name: 'Smart wait' },
26043
+ { value: 'Smart Wait', name: 'Smart Wait' },
26044
+ { value: 'Wait for element', name: 'Wait for element' },
26045
+ { value: 'Retry', name: 'Retry' },
26046
+ { value: 'Skip', name: 'Skip' },
26047
+ ],
26048
+ };
26049
+ this.knowledgeBaseDefaultTestCaseSelectConfig = {
26050
+ key: 'knowledgeBaseDefaultTestCase',
26051
+ label: 'Knowledge Base Default Test Case',
26052
+ placeholder: 'Select',
26053
+ searchable: false,
26054
+ options: [
26055
+ { value: 'Enabled', name: 'Enabled' },
26056
+ { value: 'Disabled', name: 'Disabled' },
26057
+ ],
26058
+ };
26059
+ /** Current labels use consistent indigo style */
26060
+ this.LABEL_CHIP_STYLE = {
26061
+ bg: '#6366F1',
26062
+ border: '#6366F1',
26063
+ text: '#FFFFFF',
26064
+ icon: '#FFFFFF',
26065
+ };
26066
+ }
26067
+ get statusItem() {
26068
+ return this.metadataItems.find((m) => m.label === 'Status');
26069
+ }
26070
+ get priorityItem() {
26071
+ return this.metadataItems.find((m) => m.label === 'Priority');
26072
+ }
26073
+ get statusOptions() {
26074
+ return ['Draft', 'In Review', 'Approved', 'Active', 'Inactive', 'Blocked'];
26075
+ }
26076
+ get priorityOptions() {
26077
+ return ['Critical', 'Major', 'High', 'Medium', 'Low', 'Minor', 'Not set'];
26078
+ }
26079
+ /**
26080
+ * Returns merged config for a select: base config + override.
26081
+ * Wires onSearch, onLoadMore to both override callbacks and output events.
26082
+ */
26083
+ getConfigForSelect(key, baseConfig) {
26084
+ const override = this.selectConfigOverrides?.[key];
26085
+ if (!override)
26086
+ return baseConfig;
26087
+ const merged = {
26088
+ ...baseConfig,
26089
+ ...override,
26090
+ options: override.options ?? baseConfig.options,
26091
+ key: baseConfig.key,
26092
+ };
26093
+ if (override.serverSearch || override.onSearch) {
26094
+ merged.onSearch = (query) => {
26095
+ override.onSearch?.(query);
26096
+ this.selectSearch.emit({ key, query });
26097
+ };
26098
+ }
26099
+ if (override.hasMore || override.onLoadMore) {
26100
+ merged.onLoadMore = (query) => {
26101
+ const q = query ?? '';
26102
+ override.onLoadMore?.(q);
26103
+ this.selectLoadMore.emit({ key, query: q });
26104
+ };
26105
+ }
26106
+ return merged;
26107
+ }
26108
+ onSelectOpened(key) {
26109
+ this.selectOpened.emit({ key });
26110
+ }
26111
+ onSelectSearch(event) {
26112
+ this.selectSearch.emit(event);
26113
+ const override = this.selectConfigOverrides?.[event.key];
26114
+ override?.onSearch?.(event.query);
26115
+ }
26116
+ onSelectLoadMore(event) {
26117
+ this.selectLoadMore.emit(event);
26118
+ const override = this.selectConfigOverrides?.[event.key];
26119
+ override?.onLoadMore?.(event.query);
26120
+ }
26121
+ onSelectionChange(event) {
26122
+ this.selectionChange.emit({ key: event.key, value: event.value });
26123
+ }
26124
+ getConfigItemValue(sectionTitle, itemLabel) {
26125
+ const section = [...this.configSections, ...this.configSectionsRow2].find((s) => s.title === sectionTitle);
26126
+ const item = section?.items?.find((i) => i.label === itemLabel);
26127
+ return item?.value ?? '';
26128
+ }
26129
+ getPrerequisiteCasesFromConfig() {
26130
+ const val = this.getConfigItemValue('Execution', 'Prerequisite Case');
26131
+ if (!val)
26132
+ return [];
26133
+ return val.includes(',') ? val.split(',').map((s) => s.trim()).filter(Boolean) : [val];
26134
+ }
26135
+ ngOnInit() {
26136
+ this.editDescription = this.descriptionContent;
26137
+ this.editStatus = this.statusItem?.value ?? '';
26138
+ this.editPriority = this.priorityItem?.value ?? '';
26139
+ this.editLabels = [...this.labels];
26140
+ const autoWaitVal = this.getConfigItemValue('Waits & Retries', 'Auto Wait');
26141
+ this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '');
26142
+ this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
26143
+ this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
26144
+ this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
26145
+ const enableAiSmartness = this.getConfigItemValue('AI Configuration', 'Enable AI Smartness');
26146
+ const defaultAiAction = this.getConfigItemValue('AI Configuration', 'Default AI Action');
26147
+ const knowledgeBaseDefaultTestCase = this.getConfigItemValue('AI Configuration', 'Knowledge Base Default Test Case');
26148
+ const useAiMetadataRaw = this.getConfigItemValue('AI Configuration', 'Enable AI metadata collection');
26149
+ const useAiMetadata = this.normalizeBooleanSelectValue(useAiMetadataRaw);
26150
+ const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
26151
+ const defaultBrowser = this.platform === 'web'
26152
+ ? this.getConfigItemValue('Device', 'Default Browser') || this.getConfigItemValue('Execution', 'Default Browser')
26153
+ : this.getConfigItemValue('Execution', 'Default Browser');
26154
+ const videoRecordingRaw = this.getConfigItemValue('Execution', 'Video Recording');
26155
+ const videoRecording = this.normalizeBooleanSelectValue(videoRecordingRaw);
26156
+ const defaultViewport = this.getConfigItemValue('Device', 'Default Viewport') || this.getConfigItemValue('Device', 'Viewport') || '';
26157
+ const deviceType = this.getConfigItemValue('Device', 'Type');
26158
+ const deviceOS = this.getConfigItemValue('Device', 'OS');
26159
+ this.editForm.patchValue({
26160
+ status: this.editStatus,
26161
+ priority: this.editPriority,
26162
+ prerequisiteCases,
26163
+ defaultBrowser: defaultBrowser || 'Chrome',
26164
+ videoRecording: videoRecording || '',
26165
+ defaultViewport: defaultViewport || '',
26166
+ deviceType: deviceType || '',
26167
+ deviceOS: deviceOS || '',
26168
+ enableAiSmartness: enableAiSmartness || 'Advanced',
26169
+ defaultAiAction: defaultAiAction || 'Smart wait',
26170
+ knowledgeBaseDefaultTestCase: knowledgeBaseDefaultTestCase || 'Enabled',
26171
+ useAiMetadata: useAiMetadata || '',
26172
+ });
26173
+ }
26174
+ normalizeBooleanSelectValue(val) {
26175
+ if (val === true || val === 'true')
26176
+ return 'true';
26177
+ if (val === false || val === 'false')
26178
+ return 'false';
26179
+ if (val === 'Org level' || val === 'Org Level')
26180
+ return 'Org level';
26181
+ if (val === 'On Wait' || val === 'on wait')
26182
+ return 'true';
26183
+ return val && String(val).trim() ? String(val) : '';
26184
+ }
26185
+ ngOnChanges(changes) {
26186
+ if (changes['descriptionContent'] || changes['labels'] || changes['metadataItems']) {
26187
+ this.editDescription = this.descriptionContent;
26188
+ this.editLabels = [...this.labels];
26189
+ this.editStatus = this.statusItem?.value ?? '';
26190
+ this.editPriority = this.priorityItem?.value ?? '';
26191
+ this.editForm.patchValue({
26192
+ status: this.editStatus,
26193
+ priority: this.editPriority,
26194
+ });
26195
+ }
26196
+ if (changes['prerequisiteCaseOptions'] && this.prerequisiteCaseOptions.length) {
26197
+ this.prerequisiteCaseSelectConfig = {
26198
+ ...this.prerequisiteCaseSelectConfig,
26199
+ options: this.prerequisiteCaseOptions,
26200
+ };
26201
+ }
26202
+ if (changes['configSections'] || changes['configSectionsRow2']) {
26203
+ const enableAiSmartness = this.getConfigItemValue('AI Configuration', 'Enable AI Smartness');
26204
+ const defaultAiAction = this.getConfigItemValue('AI Configuration', 'Default AI Action');
26205
+ const knowledgeBaseDefaultTestCase = this.getConfigItemValue('AI Configuration', 'Knowledge Base Default Test Case');
26206
+ const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
26207
+ const defaultBrowser = this.getConfigItemValue('Execution', 'Default Browser');
26208
+ const videoRecordingRaw = this.getConfigItemValue('Execution', 'Video Recording');
26209
+ const videoRecording = this.normalizeBooleanSelectValue(videoRecordingRaw);
26210
+ const useAiMetadataRaw = this.getConfigItemValue('AI Configuration', 'Enable AI metadata collection');
26211
+ const useAiMetadata = this.normalizeBooleanSelectValue(useAiMetadataRaw);
26212
+ const defaultViewport = this.getConfigItemValue('Device', 'Default Viewport') || this.getConfigItemValue('Device', 'Viewport') || '';
26213
+ const deviceType = this.getConfigItemValue('Device', 'Type');
26214
+ const deviceOS = this.getConfigItemValue('Device', 'OS');
26215
+ const autoWaitVal = this.getConfigItemValue('Waits & Retries', 'Auto Wait');
26216
+ this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '');
26217
+ this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
26218
+ this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
26219
+ this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
26220
+ const patch = {};
26221
+ if (enableAiSmartness)
26222
+ patch.enableAiSmartness = enableAiSmartness;
26223
+ if (defaultAiAction)
26224
+ patch.defaultAiAction = defaultAiAction;
26225
+ if (knowledgeBaseDefaultTestCase)
26226
+ patch.knowledgeBaseDefaultTestCase = knowledgeBaseDefaultTestCase;
26227
+ if (useAiMetadata)
26228
+ patch.useAiMetadata = useAiMetadata;
26229
+ if (prerequisiteCases.length)
26230
+ patch.prerequisiteCases = prerequisiteCases;
26231
+ if (defaultBrowser)
26232
+ patch.defaultBrowser = defaultBrowser;
26233
+ if (videoRecording)
26234
+ patch.videoRecording = videoRecording;
26235
+ if (defaultViewport)
26236
+ patch.defaultViewport = defaultViewport;
26237
+ if (deviceType)
26238
+ patch.deviceType = deviceType;
26239
+ if (deviceOS)
26240
+ patch.deviceOS = deviceOS;
26241
+ if (Object.keys(patch).length)
26242
+ this.editForm.patchValue(patch);
26243
+ }
26244
+ }
26245
+ onRemoveLabel(label) {
26246
+ this.editLabels = this.editLabels.filter((l) => l !== label);
26247
+ }
26248
+ onClearAllLabels() {
26249
+ this.editLabels = [];
26250
+ }
26251
+ onAddFrequentLabel(label) {
26252
+ if (!this.editLabels.includes(label)) {
26253
+ this.editLabels = [...this.editLabels, label];
26254
+ }
26255
+ }
26256
+ onAddSearchedLabel() {
26257
+ const trimmed = this.labelSearch.trim();
26258
+ if (trimmed && !this.editLabels.includes(trimmed)) {
26259
+ this.editLabels = [...this.editLabels, trimmed];
26260
+ this.labelSearch = '';
26261
+ }
26262
+ }
26263
+ onSave() {
26264
+ const status = this.editForm.get('status')?.value ?? this.editStatus;
26265
+ const priority = this.editForm.get('priority')?.value ?? this.editPriority;
26266
+ const configSectionsMerged = this.mergeConfigSections();
26267
+ const configSectionsRow2Merged = this.mergeConfigSectionsRow2();
26268
+ this.save.emit({
26269
+ descriptionContent: this.editDescription,
26270
+ status,
26271
+ priority,
26272
+ labels: this.editLabels,
26273
+ configSections: configSectionsMerged,
26274
+ configSectionsRow2: configSectionsRow2Merged,
26275
+ });
26276
+ }
26277
+ mergeConfigSections() {
26278
+ const platform = this.platform;
26279
+ const videoRecordingValue = this.editForm.get('videoRecording')?.value ?? '';
26280
+ const videoRecording = videoRecordingValue === 'true' ? true : videoRecordingValue === 'false' ? false : videoRecordingValue;
26281
+ const useAiMetadataValue = this.editForm.get('useAiMetadata')?.value ?? '';
26282
+ const useAiMetadata = useAiMetadataValue === 'true' ? true : useAiMetadataValue === 'false' ? false : useAiMetadataValue;
26283
+ return this.configSections.map((section) => {
26284
+ if (section.title === 'Execution') {
26285
+ const items = section.items
26286
+ .filter((item) => !(platform === 'web' && item.label === 'Default Browser'))
26287
+ .map((item) => item.label === 'Video Recording' ? { ...item, value: videoRecording } : item);
26288
+ return { ...section, items };
26289
+ }
26290
+ if (section.title === 'AI Configuration') {
26291
+ const items = section.items.map((item) => item.label === 'Enable AI metadata collection' ? { ...item, value: useAiMetadata } : item);
26292
+ return { ...section, items };
26293
+ }
26294
+ return section;
26295
+ });
26296
+ }
26297
+ mergeConfigSectionsRow2() {
26298
+ const platform = this.platform;
26299
+ const defaultBrowser = this.editForm.get('defaultBrowser')?.value ?? '';
26300
+ const defaultViewport = this.editForm.get('defaultViewport')?.value ?? '';
26301
+ const deviceType = this.editForm.get('deviceType')?.value ?? '';
26302
+ const deviceOS = this.editForm.get('deviceOS')?.value ?? '';
26303
+ let result = this.configSectionsRow2.map((section) => {
26304
+ if (section.title === 'Waits & Retries') {
26305
+ const autoWaitValue = this.autoWaitEnabled ? 'Enabled' : '';
26306
+ const items = section.items.map((item) => item.label === 'Auto Wait' ? { ...item, value: autoWaitValue } : item);
26307
+ return { ...section, items };
26308
+ }
26309
+ if (section.title === 'Device') {
26310
+ const items = [
26311
+ ...(platform === 'web'
26312
+ ? [
26313
+ { label: 'Default Browser', value: defaultBrowser },
26314
+ { label: 'Default Viewport', value: defaultViewport },
26315
+ ]
26316
+ : [
26317
+ { label: 'Type', value: deviceType },
26318
+ { label: 'OS', value: deviceOS },
26319
+ ]),
26320
+ ];
26321
+ return { ...section, items };
26322
+ }
26323
+ return section;
26324
+ });
26325
+ const existingDevice = result.find((s) => s.title === 'Device');
26326
+ if (!existingDevice) {
26327
+ const deviceSection = {
26328
+ title: 'Device',
26329
+ icon: 'devices',
26330
+ items: [
26331
+ ...(platform === 'web'
26332
+ ? [
26333
+ { label: 'Default Browser', value: defaultBrowser },
26334
+ { label: 'Default Viewport', value: defaultViewport },
26335
+ ]
26336
+ : [
26337
+ { label: 'Type', value: deviceType },
26338
+ { label: 'OS', value: deviceOS },
26339
+ ]),
26340
+ ],
26341
+ };
26342
+ result = [...result, deviceSection];
26343
+ }
26344
+ const keyFlagsSection = {
26345
+ title: 'Key Flags',
26346
+ icon: 'flag',
26347
+ items: [
26348
+ { label: 'Mobile Testing', value: this.mobileTestingEnabled ? 'Enabled' : '' },
26349
+ { label: 'Extension Use', value: this.extensionUseEnabled ? 'Enabled' : '' },
26350
+ { label: 'Data Driven', value: this.dataDrivenEnabled ? 'Enabled' : '' },
26351
+ ],
26352
+ };
26353
+ const existingKeyFlags = result.find((s) => s.title === 'Key Flags');
26354
+ if (existingKeyFlags) {
26355
+ result = result.map((s) => s.title === 'Key Flags' ? keyFlagsSection : s);
26356
+ }
26357
+ else {
26358
+ result = [...result, keyFlagsSection];
26359
+ }
26360
+ return result;
26361
+ }
26362
+ onCancel() {
26363
+ this.cancel.emit();
26364
+ }
26365
+ trackByLabel(_i, label) {
26366
+ return label;
26367
+ }
26368
+ trackByConfigTitle(_i, section) {
26369
+ return section.title;
26370
+ }
26371
+ getCurrentLabelChipStyle(_label) {
26372
+ const colors = this.LABEL_CHIP_STYLE;
26373
+ return {
26374
+ 'background-color': colors.bg,
26375
+ 'border-color': colors.border,
26376
+ 'border-width': '1px',
26377
+ 'border-style': 'solid',
26378
+ color: colors.text,
26379
+ };
26380
+ }
26381
+ getLabelCloseIconColor(_label) {
26382
+ return this.LABEL_CHIP_STYLE.icon;
26383
+ }
26384
+ }
26385
+ TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26386
+ TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", selectConfigOverrides: "selectConfigOverrides" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\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 <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status & Priority (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <cqa-search-bar\n [value]=\"labelSearch\"\n (valueChange)=\"labelSearch = $event\"\n (search)=\"onAddSearchedLabel()\"\n placeholder=\"Search labels to add ......\"\n [fullWidth]=\"true\">\n </cqa-search-bar>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\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.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\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\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\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\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\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\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\".\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"25\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <!-- Device Settings -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\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\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <ng-container *ngIf=\"platform === 'web'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"platform === 'mobile'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceType', deviceTypeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceType')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceOS', deviceOSSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceOS')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\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\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { 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: SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
26387
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, decorators: [{
26388
+ type: Component,
26389
+ args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\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 <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status & Priority (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <cqa-search-bar\n [value]=\"labelSearch\"\n (valueChange)=\"labelSearch = $event\"\n (search)=\"onAddSearchedLabel()\"\n placeholder=\"Search labels to add ......\"\n [fullWidth]=\"true\">\n </cqa-search-bar>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\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.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\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\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\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\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\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\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\".\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"25\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <!-- Device Settings -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\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\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <ng-container *ngIf=\"platform === 'web'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"platform === 'mobile'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceType', deviceTypeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceType')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceOS', deviceOSSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceOS')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\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\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n" }]
26390
+ }], propDecorators: { descriptionTitle: [{
26391
+ type: Input
26392
+ }], descriptionContent: [{
26393
+ type: Input
26394
+ }], metadataItems: [{
26395
+ type: Input
26396
+ }], labels: [{
26397
+ type: Input
26398
+ }], configTitle: [{
26399
+ type: Input
26400
+ }], configSections: [{
26401
+ type: Input
26402
+ }], configSectionsRow2: [{
26403
+ type: Input
26404
+ }], prerequisiteCaseOptions: [{
26405
+ type: Input
26406
+ }], platform: [{
26407
+ type: Input
26408
+ }], selectConfigOverrides: [{
26409
+ type: Input
26410
+ }], save: [{
26411
+ type: Output
26412
+ }], cancel: [{
26413
+ type: Output
26414
+ }], selectSearch: [{
26415
+ type: Output
26416
+ }], selectLoadMore: [{
26417
+ type: Output
26418
+ }], selectOpened: [{
26419
+ type: Output
26420
+ }], selectionChange: [{
26421
+ type: Output
26422
+ }] } });
26423
+
26424
+ class TestCaseDetailsComponent {
26425
+ constructor(cdr) {
26426
+ this.cdr = cdr;
26427
+ /** Whether the component is in edit mode */
26428
+ this.editing = false;
26429
+ /** When true, start in edit mode (useful for Storybook). */
26430
+ this.startInEditMode = false;
26431
+ /** Description section title */
26432
+ this.descriptionTitle = 'Description';
26433
+ /** Description text content */
26434
+ this.descriptionContent = '';
26435
+ /** Whether to show the Edit button in the Description header */
26436
+ this.showEditButton = false;
26437
+ /** Metadata items (createdOn, status, priority, environment, version, testPlanName, etc.) */
26438
+ this.metadataItems = [];
26439
+ /** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
26440
+ this.labels = [];
26441
+ /** Configuration section title */
26442
+ this.configTitle = 'Configuration';
26443
+ /** Configuration sections (e.g. Execution, AI Configuration) */
26444
+ this.configSections = [];
26445
+ /** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
26446
+ this.configSectionsRow2 = [];
26447
+ /** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings fields. */
26448
+ this.platform = 'web';
26449
+ /** Override config per select for API-driven options, server search, load more. */
26450
+ this.selectConfigOverrides = {};
26451
+ this.editDescription = new EventEmitter();
26452
+ this.saveChanges = new EventEmitter();
26453
+ this.metadataLinkClick = new EventEmitter();
26454
+ this.selectSearch = new EventEmitter();
26455
+ this.selectLoadMore = new EventEmitter();
26456
+ this.selectOpened = new EventEmitter();
26457
+ this.selectionChange = new EventEmitter();
26458
+ }
26459
+ ngOnInit() {
26460
+ if (this.startInEditMode) {
26461
+ this.editing = true;
26462
+ }
26463
+ }
26464
+ onEditClick() {
26465
+ this.editing = true;
26466
+ this.cdr.detectChanges();
26467
+ this.editDescription.emit();
26468
+ }
26469
+ onSaveChanges(data) {
26470
+ this.editing = false;
26471
+ this.cdr.detectChanges();
26472
+ this.saveChanges.emit(data);
26473
+ }
26474
+ onCancelEdit() {
26475
+ this.editing = false;
26476
+ this.cdr.detectChanges();
26477
+ }
26478
+ trackByConfigTitle(_i, section) {
26479
+ return section.title;
26480
+ }
26481
+ trackByMetadataLabel(_i, item) {
26482
+ return item.label;
26483
+ }
26484
+ onMetadataLinkClick(item) {
26485
+ if (item.link) {
26486
+ this.metadataLinkClick.emit(item);
26487
+ }
26488
+ }
26489
+ getStatusDotClass(item) {
26490
+ if (!item.statusColor)
26491
+ return '';
26492
+ switch (item.statusColor) {
26493
+ case 'yellow':
26494
+ return 'cqa-bg-[#EAB308]';
26495
+ case 'red':
26496
+ return 'cqa-bg-[#DC2626]';
26497
+ case 'green':
26498
+ return 'cqa-bg-[#16A34A]';
26499
+ case 'gray':
26500
+ default:
26501
+ return 'cqa-bg-[#94A3B8]';
26502
+ }
26503
+ }
26504
+ /** Text color for metadata value (e.g. red for critical priority) */
26505
+ getValueTextClass(item) {
26506
+ if (item.statusColor === 'red') {
26507
+ return 'cqa-text-[#DC2626]';
26508
+ }
26509
+ return 'cqa-text-[#111827]';
26510
+ }
26511
+ }
26512
+ TestCaseDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
26513
+ TestCaseDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: { startInEditMode: "startInEditMode", descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", showEditButton: "showEditButton", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", platform: "platform", selectConfigOverrides: "selectConfigOverrides" }, outputs: { editDescription: "editDescription", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange" }, ngImport: i0, template: "<!-- Edit mode: show edit form (Figma design) -->\n<cqa-test-case-details-edit\n *ngIf=\"editing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\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</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!editing\" 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-overflow-hidden 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 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=\"metadataItems.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-3 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of metadataItems; 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 class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-2.5 cqa-min-w-0 cqa-w-full\">\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\" [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", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "prerequisiteCaseOptions", "platform", "selectConfigOverrides"], outputs: ["save", "cancel", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange"] }, { 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 });
26514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, decorators: [{
26515
+ type: Component,
26516
+ 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=\"editing\"\n [descriptionTitle]=\"descriptionTitle\"\n [descriptionContent]=\"descriptionContent\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\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</cqa-test-case-details-edit>\n\n<!-- View mode: read-only details -->\n<div *ngIf=\"!editing\" 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-overflow-hidden 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 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=\"metadataItems.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-3 cqa-gap-x-0 cqa-gap-y-4\">\n <ng-container *ngFor=\"let item of metadataItems; 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 class=\"cqa-flex cqa-justify-start cqa-items-center cqa-gap-2.5 cqa-min-w-0 cqa-w-full\">\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\" [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: [] }]
26517
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { startInEditMode: [{
26518
+ type: Input
26519
+ }], descriptionTitle: [{
26520
+ type: Input
26521
+ }], descriptionContent: [{
26522
+ type: Input
26523
+ }], showEditButton: [{
26524
+ type: Input
26525
+ }], metadataItems: [{
26526
+ type: Input
26527
+ }], labels: [{
26528
+ type: Input
26529
+ }], configTitle: [{
26530
+ type: Input
26531
+ }], configSections: [{
26532
+ type: Input
26533
+ }], configSectionsRow2: [{
26534
+ type: Input
26535
+ }], platform: [{
26536
+ type: Input
26537
+ }], selectConfigOverrides: [{
26538
+ type: Input
26539
+ }], editDescription: [{
26540
+ type: Output
26541
+ }], saveChanges: [{
26542
+ type: Output
26543
+ }], metadataLinkClick: [{
26544
+ type: Output
26545
+ }], selectSearch: [{
26546
+ type: Output
26547
+ }], selectLoadMore: [{
26548
+ type: Output
26549
+ }], selectOpened: [{
26550
+ type: Output
26551
+ }], selectionChange: [{
26552
+ type: Output
26553
+ }] } });
26554
+
26555
+ class DetailSidePanelComponent {
26556
+ constructor() {
26557
+ /** Tabs - each tab has a side panel icon button; tabs and buttons are 1:1 */
26558
+ this.tabs = [
26559
+ { label: 'Test Case', value: 'test-case', icon: 'description' },
26560
+ { label: 'Data Library', value: 'data-library', icon: 'folder' },
26561
+ { label: 'Variables', value: 'variables', icon: 'code' },
26562
+ ];
26563
+ /** Currently active tab value */
26564
+ this.activeTab = 'test-case';
26565
+ /** Description section title */
26566
+ this.descriptionTitle = 'Description';
26567
+ /** Description text content */
26568
+ this.descriptionContent = '';
26569
+ /** Whether to show the Edit button in the Description header */
26570
+ this.showEditButton = true;
26571
+ /** Metadata items (Created on, Status, Priority, etc.) */
26572
+ this.metadataItems = [];
26573
+ /** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
26574
+ this.labels = [];
26575
+ /** Configuration sections - full width (e.g. Execution, AI Configuration) */
26576
+ this.configSections = [];
26577
+ /** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
26578
+ this.configSectionsRow2 = [];
26579
+ /** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings. */
26580
+ this.platform = 'web';
26581
+ /** Configuration section title */
26582
+ this.configTitle = 'Configuration';
26583
+ /** Whether to show the close button in the side menu */
26584
+ this.showCloseButton = false;
26585
+ /** When true, test case details start in edit mode (useful for Storybook). */
26586
+ this.startInEditMode = false;
26587
+ /** Override config per select for API-driven options, server search, load more. */
26588
+ this.selectConfigOverrides = {};
26589
+ /** Whether the panel is expanded (affects expand button icon and panel width) */
26590
+ this.expanded = true;
26591
+ /** Panel width when expanded (e.g. '480px', '25%') */
26592
+ this.expandedWidth = '380px';
26593
+ /** Panel width when collapsed (e.g. '56px' - fits icon bar + back button) */
26594
+ this.collapsedWidth = '56px';
26595
+ this.hostOverflow = 'hidden';
26596
+ /** Tooltip for expand button when panel is collapsed */
26597
+ this.expandTooltip = 'Expand';
26598
+ /** Tooltip for expand button when panel is expanded (collapse) */
26599
+ this.collapseTooltip = 'Collapse';
26600
+ /** Tooltip for close button */
26601
+ this.closeTooltip = 'Close';
26602
+ this.back = new EventEmitter();
26603
+ this.tabChange = new EventEmitter();
26604
+ this.editDescription = new EventEmitter();
26605
+ this.saveChanges = new EventEmitter();
26606
+ this.metadataLinkClick = new EventEmitter();
26607
+ this.selectSearch = new EventEmitter();
26608
+ this.selectLoadMore = new EventEmitter();
26609
+ this.selectOpened = new EventEmitter();
26610
+ this.selectionChange = new EventEmitter();
26611
+ this.expandToggle = new EventEmitter();
26612
+ this.close = new EventEmitter();
26613
+ }
26614
+ get hostWidth() {
26615
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26616
+ }
26617
+ get hostMinWidth() {
26618
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26619
+ }
26620
+ get hostMaxWidth() {
26621
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26622
+ }
26623
+ trackByTabValue(_i, tab) {
26624
+ return tab.value;
26625
+ }
26626
+ trackByMetadataLabel(_i, item) {
26627
+ return item.label;
26628
+ }
26629
+ trackByConfigTitle(_i, section) {
26630
+ return section.title;
26631
+ }
26632
+ onBack() {
26633
+ this.back.emit();
26634
+ }
26635
+ onTabClick(tab) {
26636
+ if (!this.expanded) {
26637
+ this.expandToggle.emit();
26638
+ }
26639
+ if (tab.value !== this.activeTab) {
26640
+ this.tabChange.emit(tab.value);
26641
+ }
26642
+ }
26643
+ onEditDescription() {
26644
+ this.editDescription.emit();
26645
+ }
26646
+ onSaveChanges(data) {
26647
+ this.saveChanges.emit(data);
26648
+ }
26649
+ onExpandToggle() {
26650
+ this.expandToggle.emit();
26651
+ }
26652
+ onClose() {
26653
+ this.close.emit();
26654
+ }
26655
+ onMetadataLinkClick(item) {
26656
+ if (item.link) {
26657
+ this.metadataLinkClick.emit(item);
26658
+ }
26659
+ }
26660
+ getStatusDotClass(item) {
26661
+ if (!item.statusColor)
26662
+ return '';
26663
+ switch (item.statusColor) {
26664
+ case 'yellow':
26665
+ return 'cqa-bg-[#EAB308]';
26666
+ case 'red':
26667
+ return 'cqa-bg-[#DC2626]';
26668
+ case 'green':
26669
+ return 'cqa-bg-[#16A34A]';
26670
+ case 'gray':
26671
+ default:
26672
+ return 'cqa-bg-[#94A3B8]';
26673
+ }
26674
+ }
26675
+ }
26676
+ DetailSidePanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26677
+ DetailSidePanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DetailSidePanelComponent, selector: "cqa-detail-side-panel", inputs: { 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" }, outputs: { back: "back", tabChange: "tabChange", editDescription: "editDescription", saveChanges: "saveChanges", metadataLinkClick: "metadataLinkClick", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", 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 class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 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\"\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-min-w-0 cqa-overflow-hidden cqa-w-full\">\n <div class=\"cqa-h-full cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\">\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 [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n (editDescription)=\"onEditDescription()\"\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 </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", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: TestCaseDetailsComponent, selector: "cqa-test-case-details", inputs: ["startInEditMode", "descriptionTitle", "descriptionContent", "showEditButton", "metadataItems", "labels", "configTitle", "configSections", "configSectionsRow2", "platform", "selectConfigOverrides"], outputs: ["editDescription", "saveChanges", "metadataLinkClick", "selectSearch", "selectLoadMore", "selectOpened", "selectionChange"] }], directives: [{ type: i6.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 });
26678
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, decorators: [{
26679
+ type: Component,
26680
+ args: [{ selector: 'cqa-detail-side-panel', changeDetection: ChangeDetectionStrategy.OnPush, host: {
26681
+ 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)]',
26682
+ style: 'transition: width 0.3s ease-in-out',
26683
+ }, 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 class=\"cqa-flex cqa-flex-col cqa-items-center cqa-gap-2 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\"\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-min-w-0 cqa-overflow-hidden cqa-w-full\">\n <div class=\"cqa-h-full cqa-min-w-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-p-4 cqa-space-y-4\">\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 [showEditButton]=\"showEditButton\"\n [startInEditMode]=\"startInEditMode\"\n [selectConfigOverrides]=\"selectConfigOverrides\"\n [metadataItems]=\"metadataItems\"\n [labels]=\"labels\"\n [configTitle]=\"configTitle\"\n [configSections]=\"configSections\"\n [configSectionsRow2]=\"configSectionsRow2\"\n [platform]=\"platform\"\n (editDescription)=\"onEditDescription()\"\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 </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" }]
26684
+ }], propDecorators: { tabs: [{
26685
+ type: Input
26686
+ }], activeTab: [{
26687
+ type: Input
26688
+ }], descriptionTitle: [{
26689
+ type: Input
26690
+ }], descriptionContent: [{
26691
+ type: Input
26692
+ }], showEditButton: [{
26693
+ type: Input
26694
+ }], metadataItems: [{
26695
+ type: Input
26696
+ }], labels: [{
26697
+ type: Input
26698
+ }], configSections: [{
26699
+ type: Input
26700
+ }], configSectionsRow2: [{
26701
+ type: Input
26702
+ }], platform: [{
26703
+ type: Input
26704
+ }], configTitle: [{
26705
+ type: Input
26706
+ }], showCloseButton: [{
26707
+ type: Input
26708
+ }], startInEditMode: [{
26709
+ type: Input
26710
+ }], selectConfigOverrides: [{
26711
+ type: Input
26712
+ }], expanded: [{
26713
+ type: Input
26714
+ }], expandedWidth: [{
26715
+ type: Input
26716
+ }], collapsedWidth: [{
26717
+ type: Input
26718
+ }], hostWidth: [{
26719
+ type: HostBinding,
26720
+ args: ['style.width']
26721
+ }], hostMinWidth: [{
26722
+ type: HostBinding,
26723
+ args: ['style.min-width']
26724
+ }], hostMaxWidth: [{
26725
+ type: HostBinding,
26726
+ args: ['style.max-width']
26727
+ }], hostOverflow: [{
26728
+ type: HostBinding,
26729
+ args: ['style.overflow']
26730
+ }], expandTooltip: [{
26731
+ type: Input
26732
+ }], collapseTooltip: [{
26733
+ type: Input
26734
+ }], closeTooltip: [{
26735
+ type: Input
26736
+ }], back: [{
26737
+ type: Output
26738
+ }], tabChange: [{
26739
+ type: Output
26740
+ }], editDescription: [{
26741
+ type: Output
26742
+ }], saveChanges: [{
26743
+ type: Output
26744
+ }], metadataLinkClick: [{
26745
+ type: Output
26746
+ }], selectSearch: [{
26747
+ type: Output
26748
+ }], selectLoadMore: [{
26749
+ type: Output
26750
+ }], selectOpened: [{
26751
+ type: Output
26752
+ }], selectionChange: [{
26753
+ type: Output
26754
+ }], expandToggle: [{
26755
+ type: Output
26756
+ }], close: [{
26757
+ type: Output
26758
+ }] } });
26759
+
26760
+ class DetailDrawerTabContentDirective {
26761
+ constructor(templateRef) {
26762
+ this.templateRef = templateRef;
26763
+ }
26764
+ }
26765
+ DetailDrawerTabContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
26766
+ DetailDrawerTabContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerTabContentDirective, selector: "[cqaTabContent]", ngImport: i0 });
26767
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, decorators: [{
26768
+ type: Directive,
26769
+ args: [{
26770
+ selector: '[cqaTabContent]',
26771
+ }]
26772
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
26773
+
26774
+ class DetailDrawerTabComponent {
26775
+ constructor() {
26776
+ /** Tab label (shown in tooltip on icon button) */
26777
+ this.label = '';
26778
+ /** Tab value (unique identifier) */
26779
+ this.value = '';
26780
+ /** Material icon name for the tab button */
26781
+ this.icon = 'folder';
26782
+ }
26783
+ get contentTemplate() {
26784
+ return this.contentDirective?.templateRef ?? null;
26785
+ }
26786
+ }
26787
+ DetailDrawerTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26788
+ 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 });
26789
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, decorators: [{
26790
+ type: Component,
26791
+ args: [{
26792
+ selector: 'cqa-detail-drawer-tab',
26793
+ template: '',
26794
+ host: {
26795
+ style: 'display: contents',
26796
+ },
26797
+ }]
26798
+ }], propDecorators: { label: [{
26799
+ type: Input
26800
+ }], value: [{
26801
+ type: Input
26802
+ }], icon: [{
26803
+ type: Input
26804
+ }], contentDirective: [{
26805
+ type: ContentChild,
26806
+ args: [DetailDrawerTabContentDirective]
26807
+ }] } });
26808
+
26809
+ class DetailDrawerComponent {
26810
+ constructor() {
26811
+ /** Currently active tab value */
26812
+ this.activeTab = '';
26813
+ /** Whether to show the close button */
26814
+ this.showCloseButton = true;
26815
+ /** Whether the drawer is expanded */
26816
+ this.expanded = true;
26817
+ /** Panel width when expanded */
26818
+ this.expandedWidth = '280px';
26819
+ /** Maximum width when expanded (e.g. '600px', '30vw'). Default: 30% of viewport */
26820
+ this.maxExpandedWidth = '30vw';
26821
+ /** Panel width when collapsed */
26822
+ this.collapsedWidth = '56px';
26823
+ this.expandTooltip = 'Expand';
26824
+ this.collapseTooltip = 'Collapse';
26825
+ this.closeTooltip = 'Close';
26826
+ this.activeTabChange = new EventEmitter();
26827
+ this.expandToggle = new EventEmitter();
26828
+ this.close = new EventEmitter();
26829
+ }
26830
+ get hostWidth() {
26831
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26832
+ }
26833
+ get hostMinWidth() {
26834
+ return this.expanded && this.minExpandedWidth ? this.minExpandedWidth : null;
26835
+ }
26836
+ get hostMaxWidth() {
26837
+ return this.expanded ? this.maxExpandedWidth : null;
26838
+ }
26839
+ ngAfterContentInit() {
26840
+ this.ensureActiveTab();
26841
+ }
26842
+ ngAfterContentChecked() {
26843
+ this.ensureActiveTab();
26844
+ }
26845
+ ensureActiveTab() {
26846
+ const tabs = this.tabComponents?.toArray() ?? [];
26847
+ if (tabs.length > 0 && !this.activeTab) {
26848
+ this.activeTab = tabs[0].value;
26849
+ this.activeTabChange.emit(this.activeTab);
26850
+ }
26851
+ }
26852
+ onTabClick(tab) {
26853
+ // If drawer is collapsed, open it (but never close on tab click)
26854
+ if (!this.expanded) {
26855
+ this.expandToggle.emit();
26856
+ }
26857
+ // Select the tab
26858
+ if (tab.value !== this.activeTab) {
26859
+ this.activeTab = tab.value;
26860
+ this.activeTabChange.emit(this.activeTab);
26861
+ }
26862
+ }
26863
+ onExpandToggle() {
26864
+ this.expandToggle.emit();
26865
+ }
26866
+ onClose() {
26867
+ this.close.emit();
26868
+ }
26869
+ trackByValue(_i, tab) {
26870
+ return tab.value;
26871
+ }
26872
+ isTabActive(tab) {
26873
+ return tab.value === this.activeTab;
26874
+ }
26875
+ }
26876
+ DetailDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26877
+ 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 cqa-min-w-[280px]\">\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: i6.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 });
26878
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, decorators: [{
26879
+ type: Component,
26880
+ args: [{ selector: 'cqa-detail-drawer', changeDetection: ChangeDetectionStrategy.OnPush, host: {
26881
+ 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)]',
26882
+ style: 'transition: width 0.3s ease-in-out',
26883
+ }, 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 cqa-min-w-[280px]\">\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: [] }]
26884
+ }], propDecorators: { tabComponents: [{
26885
+ type: ContentChildren,
26886
+ args: [DetailDrawerTabComponent]
26887
+ }], activeTab: [{
26888
+ type: Input
26889
+ }], showCloseButton: [{
26890
+ type: Input
26891
+ }], expanded: [{
26892
+ type: Input
26893
+ }], expandedWidth: [{
26894
+ type: Input
26895
+ }], minExpandedWidth: [{
26896
+ type: Input
26897
+ }], maxExpandedWidth: [{
26898
+ type: Input
26899
+ }], collapsedWidth: [{
26900
+ type: Input
26901
+ }], hostWidth: [{
26902
+ type: HostBinding,
26903
+ args: ['style.width']
26904
+ }], hostMinWidth: [{
26905
+ type: HostBinding,
26906
+ args: ['style.min-width']
26907
+ }], hostMaxWidth: [{
26908
+ type: HostBinding,
26909
+ args: ['style.max-width']
26910
+ }], expandTooltip: [{
26911
+ type: Input
26912
+ }], collapseTooltip: [{
26913
+ type: Input
26914
+ }], closeTooltip: [{
26915
+ type: Input
26916
+ }], activeTabChange: [{
26917
+ type: Output
26918
+ }], expandToggle: [{
26919
+ type: Output
26920
+ }], close: [{
26921
+ type: Output
26922
+ }] } });
26923
+
25802
26924
  class StepBuilderGroupComponent {
25803
26925
  constructor(fb) {
25804
26926
  this.fb = fb;
@@ -26347,6 +27469,12 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
26347
27469
  StepBuilderDocumentGenerationTemplateStepComponent,
26348
27470
  ElementListComponent,
26349
27471
  StepBuilderDocumentComponent,
27472
+ DetailSidePanelComponent,
27473
+ DetailDrawerComponent,
27474
+ DetailDrawerTabComponent,
27475
+ DetailDrawerTabContentDirective,
27476
+ TestCaseDetailsComponent,
27477
+ TestCaseDetailsEditComponent,
26350
27478
  StepBuilderGroupComponent,
26351
27479
  StepDetailsDrawerComponent,
26352
27480
  TemplateVariablesFormComponent], imports: [CommonModule,
@@ -26478,6 +27606,12 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
26478
27606
  StepBuilderDocumentGenerationTemplateStepComponent,
26479
27607
  ElementListComponent,
26480
27608
  StepBuilderDocumentComponent,
27609
+ DetailSidePanelComponent,
27610
+ DetailDrawerComponent,
27611
+ DetailDrawerTabComponent,
27612
+ DetailDrawerTabContentDirective,
27613
+ TestCaseDetailsComponent,
27614
+ TestCaseDetailsEditComponent,
26481
27615
  StepBuilderGroupComponent,
26482
27616
  StepDetailsDrawerComponent,
26483
27617
  TemplateVariablesFormComponent] });
@@ -26658,6 +27792,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
26658
27792
  StepBuilderDocumentGenerationTemplateStepComponent,
26659
27793
  ElementListComponent,
26660
27794
  StepBuilderDocumentComponent,
27795
+ DetailSidePanelComponent,
27796
+ DetailDrawerComponent,
27797
+ DetailDrawerTabComponent,
27798
+ DetailDrawerTabContentDirective,
27799
+ TestCaseDetailsComponent,
27800
+ TestCaseDetailsEditComponent,
26661
27801
  StepBuilderGroupComponent,
26662
27802
  StepDetailsDrawerComponent,
26663
27803
  TemplateVariablesFormComponent,
@@ -26795,6 +27935,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
26795
27935
  StepBuilderDocumentGenerationTemplateStepComponent,
26796
27936
  ElementListComponent,
26797
27937
  StepBuilderDocumentComponent,
27938
+ DetailSidePanelComponent,
27939
+ DetailDrawerComponent,
27940
+ DetailDrawerTabComponent,
27941
+ DetailDrawerTabContentDirective,
27942
+ TestCaseDetailsComponent,
27943
+ TestCaseDetailsEditComponent,
26798
27944
  StepBuilderGroupComponent,
26799
27945
  StepDetailsDrawerComponent,
26800
27946
  TemplateVariablesFormComponent,
@@ -27281,9 +28427,176 @@ function getDynamicFieldsFromLegacyConfig(step) {
27281
28427
  return result;
27282
28428
  }
27283
28429
 
28430
+ /** Default status value -> dot color. Override via BuildTestCaseDetailsOptions. */
28431
+ const DEFAULT_STATUS_COLOR_CONFIG = {
28432
+ active: 'green',
28433
+ inactive: 'gray',
28434
+ pending: 'yellow',
28435
+ completed: 'green',
28436
+ 'in review': 'yellow',
28437
+ draft: 'gray',
28438
+ approved: 'green',
28439
+ rejected: 'red',
28440
+ blocked: 'red',
28441
+ 'in progress': 'yellow',
28442
+ done: 'green',
28443
+ };
28444
+ /** Default priority value -> dot color. Override via BuildTestCaseDetailsOptions. */
28445
+ const DEFAULT_PRIORITY_COLOR_CONFIG = {
28446
+ critical: 'red',
28447
+ major: 'red',
28448
+ high: 'red',
28449
+ medium: 'yellow',
28450
+ low: 'green',
28451
+ minor: 'green',
28452
+ 'not set': 'gray',
28453
+ p0: 'red',
28454
+ p1: 'yellow',
28455
+ p2: 'green',
28456
+ p3: 'gray',
28457
+ };
28458
+ /**
28459
+ * API field names for mapping test case data to cqa-test-case-details.
28460
+ * Use these when building metadataItems and configSections from your API response.
28461
+ */
28462
+ const TEST_CASE_DETAILS_FIELD_MAP = {
28463
+ /** Metadata (description section) */
28464
+ metadata: {
28465
+ createdOn: 'createdOn',
28466
+ status: 'status',
28467
+ priority: 'priority',
28468
+ environment: 'environment',
28469
+ version: 'version',
28470
+ platform: 'platform',
28471
+ labels: 'labels',
28472
+ },
28473
+ /** Execution config */
28474
+ execution: {
28475
+ prerequisiteCase: 'prerequisiteCase',
28476
+ defaultBrowser: 'defaultBrowser',
28477
+ videoRecording: 'videoRecording',
28478
+ testCaseTimeout: 'testCaseTimeout',
28479
+ waitTimeoutForLocators: 'waitTimeoutForLocators',
28480
+ webBrowser: 'webBrowser',
28481
+ viewport: 'viewport',
28482
+ },
28483
+ /** AI Configuration */
28484
+ aiConfig: {
28485
+ enableAiSmartness: 'enableAiSmartness',
28486
+ defaultAiAction: 'defaultAiAction',
28487
+ knowledgeBaseDefaultTestCase: 'knowledgeBaseDefaultTestCase',
28488
+ useAiMetadata: 'useAiMetadata',
28489
+ },
28490
+ /** Waits & Retries */
28491
+ waitsRetries: {
28492
+ autoWait: 'autoWait',
28493
+ retryFailedSteps: 'retryFailedSteps',
28494
+ },
28495
+ /** Device */
28496
+ device: {
28497
+ platform: 'platform',
28498
+ deviceType: 'deviceType',
28499
+ deviceOS: 'deviceOS',
28500
+ defaultBrowser: 'defaultBrowser',
28501
+ defaultViewport: 'defaultViewport',
28502
+ viewport: 'viewport',
28503
+ },
28504
+ };
28505
+ /**
28506
+ * Build metadataItems and configSections from API data for cqa-test-case-details.
28507
+ * Use in ts-portal when mapping test case API response to component inputs.
28508
+ */
28509
+ function buildTestCaseDetailsFromApi(data, options) {
28510
+ const formatDate = (v) => v ? (typeof v === 'string' ? v : v.toISOString?.() ?? String(v)) : '';
28511
+ const statusConfig = { ...DEFAULT_STATUS_COLOR_CONFIG, ...options?.statusColorConfig };
28512
+ const priorityConfig = { ...DEFAULT_PRIORITY_COLOR_CONFIG, ...options?.priorityColorConfig };
28513
+ const resolveColor = (value, config) => config[value.toLowerCase().trim()] ?? 'gray';
28514
+ const metadataItems = [];
28515
+ if (data.createdOn != null)
28516
+ metadataItems.push({ label: 'Created on', value: formatDate(data.createdOn), icon: 'calendar_today' });
28517
+ if (data.status != null)
28518
+ metadataItems.push({ label: 'Status', value: data.status, statusColor: resolveColor(data.status, statusConfig) });
28519
+ if (data.priority != null)
28520
+ metadataItems.push({ label: 'Priority', value: data.priority, statusColor: resolveColor(data.priority, priorityConfig) });
28521
+ if (data.environment != null)
28522
+ metadataItems.push({ label: 'Environment', value: data.environment, icon: 'storage' });
28523
+ if (data.version != null)
28524
+ metadataItems.push({ label: 'Version', value: data.version, icon: 'label' });
28525
+ if (data.platform != null)
28526
+ metadataItems.push({
28527
+ label: 'Platform',
28528
+ value: data.platform === 'web' ? 'web' : 'iOS',
28529
+ icon: 'devices',
28530
+ });
28531
+ const configSections = [
28532
+ {
28533
+ title: 'Execution',
28534
+ icon: 'play_circle',
28535
+ items: [
28536
+ { label: 'Prerequisite Case', value: data.prerequisiteCase ?? null },
28537
+ { label: 'Video Recording', value: data.videoRecording ?? '' },
28538
+ ],
28539
+ },
28540
+ {
28541
+ title: 'AI Configuration',
28542
+ icon: 'smart_toy',
28543
+ items: [
28544
+ { label: 'Enable AI Smartness', value: data.enableAiSmartness ?? '' },
28545
+ { label: 'Default AI Action', value: data.defaultAiAction ?? '' },
28546
+ { label: 'Knowledge Base Default Test Case', value: data.knowledgeBaseDefaultTestCase ?? null },
28547
+ { label: 'Enable AI metadata collection', value: data.useAiMetadata ?? '' },
28548
+ ],
28549
+ },
28550
+ ];
28551
+ const configSectionsRow2 = [
28552
+ {
28553
+ title: 'Wait and retries',
28554
+ icon: 'timer',
28555
+ items: [
28556
+ { label: 'Enable Avoid Auto wait for steps', value: data.autoWaitEnabled ?? false },
28557
+ { label: 'Retry Failed Steps', value: data.retryFailedSteps ?? '' },
28558
+ { label: 'Test Case Timeout (minutes)', value: data.testCaseTimeout ?? '' },
28559
+ { label: 'Wait Timeout for Locators (secs)', value: data.waitTimeoutForLocators ?? '' },
28560
+ ],
28561
+ },
28562
+ {
28563
+ title: 'Device Setting',
28564
+ icon: 'devices',
28565
+ items: (() => {
28566
+ const platform = data.platform ?? 'web';
28567
+ if (platform === 'web') {
28568
+ return [
28569
+ { label: 'Default Browser', value: data.defaultBrowser ?? data.webBrowser ?? '' },
28570
+ { label: 'Default Viewport', value: data.defaultViewport ?? data.viewport ?? '' },
28571
+ ];
28572
+ }
28573
+ return [
28574
+ { label: 'Default OS', value: data.deviceOS ?? '' },
28575
+ { label: 'Default Phone', value: data.deviceType ?? '' },
28576
+ ];
28577
+ })(),
28578
+ },
28579
+ {
28580
+ title: 'Key Flags',
28581
+ icon: 'flag',
28582
+ items: [
28583
+ { label: 'Mobile Testing', value: data.mobileTesting ?? '' },
28584
+ { label: 'Extension Use', value: data.extensionUse ?? '' },
28585
+ { label: 'Data Driven', value: data.dataDriven ?? '' },
28586
+ ],
28587
+ },
28588
+ ];
28589
+ return {
28590
+ metadataItems,
28591
+ labels: data.labels ?? [],
28592
+ configSections,
28593
+ configSectionsRow2,
28594
+ };
28595
+ }
28596
+
27284
28597
  /**
27285
28598
  * Generated bundle index. Do not edit.
27286
28599
  */
27287
28600
 
27288
- export { ADVANCED_SUBFIELDS_BY_TYPE, ADVANCED_TOGGLE_KEYS, AIActionStepComponent, AIAgentStepComponent, API_EDIT_STEP_LABELS, ActionMenuButtonComponent, AddPrerequisiteCasesSectionComponent, AiDebugAlertComponent, AiReasoningComponent, ApiEditStepComponent, ApiStepComponent, AutocompleteComponent, BadgeComponent, BasicStepComponent, ButtonComponent, CUSTOM_EDIT_STEP_DATA, CUSTOM_EDIT_STEP_EDIT_IN_DEPTH, CUSTOM_EDIT_STEP_REF, CUSTOM_ELEMENT_POPUP_REF, ChartCardComponent, ColumnVisibilityComponent, CompareRunsComponent, ConditionStepComponent, ConfigurationCardComponent, ConsoleAlertComponent, CoverageModuleCardComponent, CreateStepGroupComponent, CustomEditStepComponent, CustomEditStepRef, CustomEditStepService, CustomInputComponent, CustomTextareaComponent, CustomToggleComponent, DEFAULT_METADATA_COLOR, DIALOG_DATA, DIALOG_REF, DashboardHeaderComponent, DaterangepickerComponent, DaterangepickerDirective, DbQueryExecutionItemComponent, DbVerificationStepComponent, DeleteStepsComponent, DialogComponent, DialogRef, DialogService, DocumentVerificationStepComponent, DropdownButtonComponent, DynamicCellContainerDirective, DynamicCellTemplateDirective, DynamicFilterComponent, DynamicHeaderTemplateDirective, DynamicSelectFieldComponent, DynamicTableComponent, ELEMENT_POPUP_DATA, ELEMENT_POPUP_EDIT_IN_DEPTH, EMPTY_STATE_IMAGES, EMPTY_STATE_PRESETS, ElementListComponent, ElementPopupComponent, ElementPopupRef, ElementPopupService, EmptyStateComponent, ErrorModalComponent, ExecutionResultModalComponent, FailedStepCardComponent, FailedStepComponent, FailedTestCasesCardComponent, FileDownloadStepComponent, FileUploadComponent, FullTableLoaderComponent, HeatErrorMapCellComponent, InsightCardComponent, ItemListComponent, IterationsLoopComponent, LiveConversationComponent, LiveExecutionStepComponent, LoopStepComponent, MainStepCollapseComponent, MetricsCardComponent, NetworkRequestComponent, OtherButtonComponent, PRIORITY_COLORS, PaginationComponent, ProgressIndicatorComponent, ProgressTextCardComponent, RESULT_COLORS, RunHistoryCardComponent, STATUS_COLORS, STEP_DETAILS_DRAWER_DATA, STEP_DETAILS_DRAWER_REF, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, SearchBarComponent, SegmentControlComponent, SelectedFiltersComponent, SelfHealAnalysisComponent, SimulatorComponent, StepBuilderActionComponent, StepBuilderAiAgentComponent, StepBuilderConditionComponent, StepBuilderCustomCodeComponent, StepBuilderDatabaseComponent, StepBuilderDocumentComponent, StepBuilderDocumentGenerationTemplateStepComponent, StepBuilderGroupComponent, StepBuilderLoopComponent, StepBuilderRecordStepComponent, StepDetailsDrawerComponent, StepDetailsDrawerRef, StepDetailsDrawerService, StepGroupComponent, StepProgressCardComponent, StepRendererComponent, StepStatusCardComponent, StepTypes, TEST_DATA_MODAL_DATA, TEST_DATA_MODAL_EDIT_IN_DEPTH, TEST_DATA_MODAL_REF, TableActionToolbarComponent, TableDataLoaderComponent, TableTemplateComponent, TailwindOverlayContainer, TemplateVariablesFormComponent, TestCaseAiAgentStepComponent, TestCaseAiVerifyStepComponent, TestCaseApiStepComponent, TestCaseConditionStepComponent, TestCaseCustomCodeStepComponent, TestCaseDatabaseStepComponent, TestCaseDetailsRendererComponent, TestCaseLoopStepComponent, TestCaseNormalStepComponent, TestCaseRestoreSessionStepComponent, TestCaseScreenshotStepComponent, TestCaseScrollStepComponent, TestCaseStepGroupComponent, TestCaseUploadStepComponent, TestCaseVerifyUrlStepComponent, TestDataModalComponent, TestDataModalRef, TestDataModalService, TestDistributionCardComponent, UiKitModule, UpdatedFailedStepComponent, ViewMoreFailedStepButtonComponent, VisualComparisonComponent, VisualDifferenceModalComponent, getDynamicFieldsFromLegacyConfig, getEmptyStatePreset, getMetadataColor, getMetadataValueStyle, getStepDetailsStepType, humanizeVariableKey, isAiAgentStepConfig, isAiVerifyStepConfig, isApiStepConfig, isConditionStepConfig, isCustomCodeStepConfig, isDatabaseStepConfig, isLoopStepConfig, isNormalStepConfig, isRestoreSessionStepConfig, isScreenshotStepConfig, isScrollStepConfig, isStepGroupConfig, isUploadStepConfig, isVerifyUrlStepConfig, mapApiVariablesToDynamicFields };
28601
+ export { ADVANCED_SUBFIELDS_BY_TYPE, ADVANCED_TOGGLE_KEYS, AIActionStepComponent, AIAgentStepComponent, API_EDIT_STEP_LABELS, ActionMenuButtonComponent, AddPrerequisiteCasesSectionComponent, AiDebugAlertComponent, AiReasoningComponent, ApiEditStepComponent, ApiStepComponent, AutocompleteComponent, BadgeComponent, BasicStepComponent, ButtonComponent, CUSTOM_EDIT_STEP_DATA, CUSTOM_EDIT_STEP_EDIT_IN_DEPTH, CUSTOM_EDIT_STEP_REF, CUSTOM_ELEMENT_POPUP_REF, ChartCardComponent, ColumnVisibilityComponent, CompareRunsComponent, ConditionStepComponent, ConfigurationCardComponent, ConsoleAlertComponent, CoverageModuleCardComponent, CreateStepGroupComponent, CustomEditStepComponent, CustomEditStepRef, CustomEditStepService, CustomInputComponent, CustomTextareaComponent, CustomToggleComponent, DEFAULT_METADATA_COLOR, DEFAULT_PRIORITY_COLOR_CONFIG, DEFAULT_STATUS_COLOR_CONFIG, DIALOG_DATA, DIALOG_REF, DashboardHeaderComponent, DaterangepickerComponent, DaterangepickerDirective, DbQueryExecutionItemComponent, DbVerificationStepComponent, DeleteStepsComponent, DetailDrawerComponent, DetailDrawerTabComponent, DetailDrawerTabContentDirective, DetailSidePanelComponent, DialogComponent, DialogRef, DialogService, DocumentVerificationStepComponent, DropdownButtonComponent, DynamicCellContainerDirective, DynamicCellTemplateDirective, DynamicFilterComponent, DynamicHeaderTemplateDirective, DynamicSelectFieldComponent, DynamicTableComponent, ELEMENT_POPUP_DATA, ELEMENT_POPUP_EDIT_IN_DEPTH, EMPTY_STATE_IMAGES, EMPTY_STATE_PRESETS, ElementListComponent, ElementPopupComponent, ElementPopupRef, ElementPopupService, EmptyStateComponent, ErrorModalComponent, ExecutionResultModalComponent, FailedStepCardComponent, FailedStepComponent, FailedTestCasesCardComponent, FileDownloadStepComponent, FileUploadComponent, FullTableLoaderComponent, HeatErrorMapCellComponent, InsightCardComponent, ItemListComponent, IterationsLoopComponent, LiveConversationComponent, LiveExecutionStepComponent, LoopStepComponent, MainStepCollapseComponent, MetricsCardComponent, NetworkRequestComponent, OtherButtonComponent, PRIORITY_COLORS, PaginationComponent, ProgressIndicatorComponent, ProgressTextCardComponent, RESULT_COLORS, RunHistoryCardComponent, STATUS_COLORS, STEP_DETAILS_DRAWER_DATA, STEP_DETAILS_DRAWER_REF, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, SearchBarComponent, SegmentControlComponent, SelectedFiltersComponent, SelfHealAnalysisComponent, SimulatorComponent, StepBuilderActionComponent, StepBuilderAiAgentComponent, StepBuilderConditionComponent, StepBuilderCustomCodeComponent, StepBuilderDatabaseComponent, StepBuilderDocumentComponent, StepBuilderDocumentGenerationTemplateStepComponent, StepBuilderGroupComponent, StepBuilderLoopComponent, StepBuilderRecordStepComponent, StepDetailsDrawerComponent, StepDetailsDrawerRef, StepDetailsDrawerService, StepGroupComponent, StepProgressCardComponent, StepRendererComponent, StepStatusCardComponent, StepTypes, TEST_CASE_DETAILS_FIELD_MAP, TEST_CASE_DETAILS_SELECT_KEYS, TEST_DATA_MODAL_DATA, TEST_DATA_MODAL_EDIT_IN_DEPTH, TEST_DATA_MODAL_REF, TableActionToolbarComponent, TableDataLoaderComponent, TableTemplateComponent, TailwindOverlayContainer, TemplateVariablesFormComponent, TestCaseAiAgentStepComponent, TestCaseAiVerifyStepComponent, TestCaseApiStepComponent, TestCaseConditionStepComponent, TestCaseCustomCodeStepComponent, TestCaseDatabaseStepComponent, TestCaseDetailsComponent, TestCaseDetailsEditComponent, TestCaseDetailsRendererComponent, TestCaseLoopStepComponent, TestCaseNormalStepComponent, TestCaseRestoreSessionStepComponent, TestCaseScreenshotStepComponent, TestCaseScrollStepComponent, TestCaseStepGroupComponent, TestCaseUploadStepComponent, TestCaseVerifyUrlStepComponent, TestDataModalComponent, TestDataModalRef, TestDataModalService, TestDistributionCardComponent, UiKitModule, UpdatedFailedStepComponent, ViewMoreFailedStepButtonComponent, VisualComparisonComponent, VisualDifferenceModalComponent, buildTestCaseDetailsFromApi, getDynamicFieldsFromLegacyConfig, getEmptyStatePreset, getMetadataColor, getMetadataValueStyle, getStepDetailsStepType, humanizeVariableKey, isAiAgentStepConfig, isAiVerifyStepConfig, isApiStepConfig, isConditionStepConfig, isCustomCodeStepConfig, isDatabaseStepConfig, isLoopStepConfig, isNormalStepConfig, isRestoreSessionStepConfig, isScreenshotStepConfig, isScrollStepConfig, isStepGroupConfig, isUploadStepConfig, isVerifyUrlStepConfig, mapApiVariablesToDynamicFields };
27289
28602
  //# sourceMappingURL=cqa-lib-cqa-ui.mjs.map