@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';
@@ -25997,6 +25997,1133 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
25997
25997
  type: Output
25998
25998
  }] } });
25999
25999
 
26000
+ /** Keys for each dynamic select in test-case-details-edit. Use these with selectConfigOverrides. */
26001
+ const TEST_CASE_DETAILS_SELECT_KEYS = {
26002
+ status: 'status',
26003
+ priority: 'priority',
26004
+ prerequisiteCases: 'prerequisiteCases',
26005
+ videoRecording: 'videoRecording',
26006
+ enableAiSmartness: 'enableAiSmartness',
26007
+ defaultAiAction: 'defaultAiAction',
26008
+ knowledgeBaseDefaultTestCase: 'knowledgeBaseDefaultTestCase',
26009
+ useAiMetadata: 'useAiMetadata',
26010
+ defaultBrowser: 'defaultBrowser',
26011
+ defaultViewport: 'defaultViewport',
26012
+ deviceType: 'deviceType',
26013
+ deviceOS: 'deviceOS',
26014
+ };
26015
+ const FREQUENTLY_USED_LABELS = [
26016
+ 'Case',
26017
+ 'Critical',
26018
+ 'PO',
26019
+ 'Upload',
26020
+ 'Validation',
26021
+ 'Review',
26022
+ 'Edge-cases',
26023
+ 'Security',
26024
+ 'Integration',
26025
+ 'Smoke',
26026
+ ];
26027
+ class TestCaseDetailsEditComponent {
26028
+ constructor() {
26029
+ this.descriptionTitle = 'Description';
26030
+ this.descriptionContent = '';
26031
+ this.metadataItems = [];
26032
+ this.labels = [];
26033
+ this.configTitle = 'Configuration';
26034
+ this.configSections = [];
26035
+ this.configSectionsRow2 = [];
26036
+ /** Optional list of prerequisite test case options for the multi-select. If not provided, uses default sample options. */
26037
+ this.prerequisiteCaseOptions = [];
26038
+ /** Platform: 'web' shows Default Browser + Viewport; 'mobile' shows Device Type + OS. Defaults to 'web'. */
26039
+ this.platform = 'web';
26040
+ /**
26041
+ * Override config per select key. Use for:
26042
+ * - API-driven options: pass options array (update when API returns)
26043
+ * - Server-side search: serverSearch: true, onSearch in override or listen to selectSearch
26044
+ * - Infinite scroll: hasMore: true, onLoadMore in override or listen to selectLoadMore
26045
+ * - Initial fetch on open: initialFetchOnOpen: true
26046
+ */
26047
+ this.selectConfigOverrides = {};
26048
+ this.save = new EventEmitter();
26049
+ this.cancel = new EventEmitter();
26050
+ /** Emitted when user searches in a select (serverSearch mode). Call API and update options via selectConfigOverrides. */
26051
+ this.selectSearch = new EventEmitter();
26052
+ /** Emitted when user scrolls to load more. Call API, append to options via selectConfigOverrides. */
26053
+ this.selectLoadMore = new EventEmitter();
26054
+ /** Emitted when a select panel is opened. Use to call API for initial load (e.g. when initialFetchOnOpen). */
26055
+ this.selectOpened = new EventEmitter();
26056
+ /** Emitted when selection changes in any select. */
26057
+ this.selectionChange = new EventEmitter();
26058
+ /** Form state */
26059
+ this.editDescription = '';
26060
+ this.editStatus = '';
26061
+ this.editPriority = '';
26062
+ this.editLabels = [];
26063
+ this.labelSearch = '';
26064
+ this.testCaseTimeout = '';
26065
+ this.waitTimeoutLocators = '';
26066
+ this.autoWaitEnabled = false;
26067
+ this.retryFailedSteps = '';
26068
+ this.configExpanded = true;
26069
+ this.executionExpanded = true;
26070
+ this.aiConfigExpanded = true;
26071
+ this.waitsRetriesExpanded = true;
26072
+ this.deviceExpanded = true;
26073
+ this.keyFlagsExpanded = true;
26074
+ this.mobileTestingEnabled = false;
26075
+ this.extensionUseEnabled = false;
26076
+ this.dataDrivenEnabled = false;
26077
+ this.frequentlyUsedLabels = FREQUENTLY_USED_LABELS;
26078
+ /** FormGroup for cqa-dynamic-select bindings */
26079
+ this.editForm = new FormGroup({
26080
+ status: new FormControl(''),
26081
+ priority: new FormControl(''),
26082
+ prerequisiteCases: new FormControl([]),
26083
+ defaultBrowser: new FormControl(''),
26084
+ videoRecording: new FormControl(''),
26085
+ defaultViewport: new FormControl(''),
26086
+ deviceType: new FormControl(''),
26087
+ deviceOS: new FormControl(''),
26088
+ enableAiSmartness: new FormControl(''),
26089
+ defaultAiAction: new FormControl(''),
26090
+ knowledgeBaseDefaultTestCase: new FormControl(''),
26091
+ useAiMetadata: new FormControl(''),
26092
+ });
26093
+ /** Cached configs to avoid new object refs each change detection (prevents infinite loops) */
26094
+ this.statusSelectConfig = {
26095
+ key: 'status',
26096
+ label: '',
26097
+ placeholder: 'Status',
26098
+ searchable: false,
26099
+ options: [
26100
+ { value: 'Draft', name: 'Draft' },
26101
+ { value: 'In Review', name: 'In Review' },
26102
+ { value: 'Approved', name: 'Approved' },
26103
+ { value: 'Active', name: 'Active' },
26104
+ { value: 'Inactive', name: 'Inactive' },
26105
+ { value: 'Blocked', name: 'Blocked' },
26106
+ ],
26107
+ };
26108
+ this.defaultPrerequisiteCaseOptions = [
26109
+ { value: 'TC-001', name: 'TC-001: Login flow' },
26110
+ { value: 'TC-002', name: 'TC-002: User registration' },
26111
+ { value: 'TC-003', name: 'TC-003: Password reset' },
26112
+ { value: 'TC-004', name: 'TC-004: Dashboard load' },
26113
+ { value: 'TC-005', name: 'TC-005: API health check' },
26114
+ ];
26115
+ this.videoRecordingSelectConfig = {
26116
+ key: 'videoRecording',
26117
+ label: 'Record test execution video',
26118
+ placeholder: 'Select',
26119
+ searchable: false,
26120
+ options: [
26121
+ { value: 'true', name: 'True' },
26122
+ { value: 'false', name: 'False' },
26123
+ { value: 'Org level', name: 'Org level' },
26124
+ ],
26125
+ };
26126
+ this.aiMetadataCollectionSelectConfig = {
26127
+ key: 'useAiMetadata',
26128
+ label: 'Enable AI metadata collection',
26129
+ placeholder: 'Select',
26130
+ searchable: false,
26131
+ options: [
26132
+ { value: 'true', name: 'True' },
26133
+ { value: 'false', name: 'False' },
26134
+ { value: 'Org level', name: 'Org level' },
26135
+ ],
26136
+ };
26137
+ this.prerequisiteCaseSelectConfig = {
26138
+ key: 'prerequisiteCases',
26139
+ label: 'Prerequisite Case',
26140
+ placeholder: 'Select',
26141
+ searchable: true,
26142
+ multiple: true,
26143
+ optionStyle: 'checkbox',
26144
+ showSelectAll: true,
26145
+ selectAllLabel: 'All',
26146
+ options: [
26147
+ { value: 'TC-001', name: 'TC-001: Login flow' },
26148
+ { value: 'TC-002', name: 'TC-002: User registration' },
26149
+ { value: 'TC-003', name: 'TC-003: Password reset' },
26150
+ { value: 'TC-004', name: 'TC-004: Dashboard load' },
26151
+ { value: 'TC-005', name: 'TC-005: API health check' },
26152
+ ],
26153
+ };
26154
+ this.defaultViewportSelectConfig = {
26155
+ key: 'defaultViewport',
26156
+ label: 'Default Viewport',
26157
+ placeholder: 'Select',
26158
+ searchable: false,
26159
+ options: [
26160
+ { value: '1920x1080', name: '1920x1080' },
26161
+ { value: '1366x768', name: '1366x768' },
26162
+ { value: '1536x864', name: '1536x864' },
26163
+ { value: '1280x720', name: '1280x720' },
26164
+ { value: '1440x900', name: '1440x900' },
26165
+ { value: '2560x1440', name: '2560x1440' },
26166
+ ],
26167
+ };
26168
+ this.deviceTypeSelectConfig = {
26169
+ key: 'deviceType',
26170
+ label: 'Device Type',
26171
+ placeholder: 'Select',
26172
+ searchable: false,
26173
+ options: [
26174
+ { value: 'iPhone 14', name: 'iPhone 14' },
26175
+ { value: 'iPhone 15', name: 'iPhone 15' },
26176
+ { value: 'iPhone 17', name: 'iPhone 17' },
26177
+ { value: 'Iphone 17', name: 'Iphone 17' },
26178
+ { value: 'Samsung Galaxy', name: 'Samsung Galaxy' },
26179
+ { value: 'Pixel', name: 'Pixel' },
26180
+ ],
26181
+ };
26182
+ this.deviceOSSelectConfig = {
26183
+ key: 'deviceOS',
26184
+ label: 'OS',
26185
+ placeholder: 'Select',
26186
+ searchable: false,
26187
+ options: [
26188
+ { value: 'ipa', name: 'iOS (ipa)' },
26189
+ { value: 'apk', name: 'Android (apk)' },
26190
+ { value: 'iOS 16', name: 'iOS 16' },
26191
+ { value: 'iOS 17', name: 'iOS 17' },
26192
+ { value: 'Android 13', name: 'Android 13' },
26193
+ { value: 'Android 14', name: 'Android 14' },
26194
+ ],
26195
+ };
26196
+ this.defaultBrowserSelectConfig = {
26197
+ key: 'defaultBrowser',
26198
+ label: 'Default Browser',
26199
+ placeholder: 'Chrome',
26200
+ searchable: false,
26201
+ options: [
26202
+ { value: 'Chrome', name: 'Chrome' },
26203
+ { value: 'Firefox', name: 'Firefox' },
26204
+ { value: 'Safari', name: 'Safari' },
26205
+ { value: 'Edge', name: 'Edge' },
26206
+ ],
26207
+ };
26208
+ this.prioritySelectConfig = {
26209
+ key: 'priority',
26210
+ label: '',
26211
+ placeholder: 'Priority',
26212
+ searchable: false,
26213
+ options: [
26214
+ { value: 'Critical', name: 'Critical' },
26215
+ { value: 'Major', name: 'Major' },
26216
+ { value: 'High', name: 'High' },
26217
+ { value: 'Medium', name: 'Medium' },
26218
+ { value: 'Low', name: 'Low' },
26219
+ { value: 'Minor', name: 'Minor' },
26220
+ { value: 'Not set', name: 'Not set' },
26221
+ ],
26222
+ };
26223
+ this.enableAiSmartnessSelectConfig = {
26224
+ key: 'enableAiSmartness',
26225
+ label: 'Enable AI Smartness',
26226
+ placeholder: 'Advanced',
26227
+ searchable: false,
26228
+ options: [
26229
+ { value: 'Basic', name: 'Basic' },
26230
+ { value: 'Advanced', name: 'Advanced' },
26231
+ { value: 'Off', name: 'Off' },
26232
+ ],
26233
+ };
26234
+ this.defaultAiActionSelectConfig = {
26235
+ key: 'defaultAiAction',
26236
+ label: 'Default AI Action',
26237
+ placeholder: 'Smart wait',
26238
+ searchable: false,
26239
+ options: [
26240
+ { value: 'Smart wait', name: 'Smart wait' },
26241
+ { value: 'Smart Wait', name: 'Smart Wait' },
26242
+ { value: 'Wait for element', name: 'Wait for element' },
26243
+ { value: 'Retry', name: 'Retry' },
26244
+ { value: 'Skip', name: 'Skip' },
26245
+ ],
26246
+ };
26247
+ this.knowledgeBaseDefaultTestCaseSelectConfig = {
26248
+ key: 'knowledgeBaseDefaultTestCase',
26249
+ label: 'Knowledge Base Default Test Case',
26250
+ placeholder: 'Select',
26251
+ searchable: false,
26252
+ options: [
26253
+ { value: 'Enabled', name: 'Enabled' },
26254
+ { value: 'Disabled', name: 'Disabled' },
26255
+ ],
26256
+ };
26257
+ /** Current labels use consistent indigo style */
26258
+ this.LABEL_CHIP_STYLE = {
26259
+ bg: '#6366F1',
26260
+ border: '#6366F1',
26261
+ text: '#FFFFFF',
26262
+ icon: '#FFFFFF',
26263
+ };
26264
+ }
26265
+ get statusItem() {
26266
+ return this.metadataItems.find((m) => m.label === 'Status');
26267
+ }
26268
+ get priorityItem() {
26269
+ return this.metadataItems.find((m) => m.label === 'Priority');
26270
+ }
26271
+ get statusOptions() {
26272
+ return ['Draft', 'In Review', 'Approved', 'Active', 'Inactive', 'Blocked'];
26273
+ }
26274
+ get priorityOptions() {
26275
+ return ['Critical', 'Major', 'High', 'Medium', 'Low', 'Minor', 'Not set'];
26276
+ }
26277
+ /**
26278
+ * Returns merged config for a select: base config + override.
26279
+ * Wires onSearch, onLoadMore to both override callbacks and output events.
26280
+ */
26281
+ getConfigForSelect(key, baseConfig) {
26282
+ var _a, _b;
26283
+ const override = (_a = this.selectConfigOverrides) === null || _a === void 0 ? void 0 : _a[key];
26284
+ if (!override)
26285
+ return baseConfig;
26286
+ const merged = Object.assign(Object.assign(Object.assign({}, baseConfig), override), { options: (_b = override.options) !== null && _b !== void 0 ? _b : baseConfig.options, key: baseConfig.key });
26287
+ if (override.serverSearch || override.onSearch) {
26288
+ merged.onSearch = (query) => {
26289
+ var _a;
26290
+ (_a = override.onSearch) === null || _a === void 0 ? void 0 : _a.call(override, query);
26291
+ this.selectSearch.emit({ key, query });
26292
+ };
26293
+ }
26294
+ if (override.hasMore || override.onLoadMore) {
26295
+ merged.onLoadMore = (query) => {
26296
+ var _a;
26297
+ const q = query !== null && query !== void 0 ? query : '';
26298
+ (_a = override.onLoadMore) === null || _a === void 0 ? void 0 : _a.call(override, q);
26299
+ this.selectLoadMore.emit({ key, query: q });
26300
+ };
26301
+ }
26302
+ return merged;
26303
+ }
26304
+ onSelectOpened(key) {
26305
+ this.selectOpened.emit({ key });
26306
+ }
26307
+ onSelectSearch(event) {
26308
+ var _a, _b;
26309
+ this.selectSearch.emit(event);
26310
+ const override = (_a = this.selectConfigOverrides) === null || _a === void 0 ? void 0 : _a[event.key];
26311
+ (_b = override === null || override === void 0 ? void 0 : override.onSearch) === null || _b === void 0 ? void 0 : _b.call(override, event.query);
26312
+ }
26313
+ onSelectLoadMore(event) {
26314
+ var _a, _b;
26315
+ this.selectLoadMore.emit(event);
26316
+ const override = (_a = this.selectConfigOverrides) === null || _a === void 0 ? void 0 : _a[event.key];
26317
+ (_b = override === null || override === void 0 ? void 0 : override.onLoadMore) === null || _b === void 0 ? void 0 : _b.call(override, event.query);
26318
+ }
26319
+ onSelectionChange(event) {
26320
+ this.selectionChange.emit({ key: event.key, value: event.value });
26321
+ }
26322
+ getConfigItemValue(sectionTitle, itemLabel) {
26323
+ var _a, _b;
26324
+ const section = [...this.configSections, ...this.configSectionsRow2].find((s) => s.title === sectionTitle);
26325
+ const item = (_a = section === null || section === void 0 ? void 0 : section.items) === null || _a === void 0 ? void 0 : _a.find((i) => i.label === itemLabel);
26326
+ return (_b = item === null || item === void 0 ? void 0 : item.value) !== null && _b !== void 0 ? _b : '';
26327
+ }
26328
+ getPrerequisiteCasesFromConfig() {
26329
+ const val = this.getConfigItemValue('Execution', 'Prerequisite Case');
26330
+ if (!val)
26331
+ return [];
26332
+ return val.includes(',') ? val.split(',').map((s) => s.trim()).filter(Boolean) : [val];
26333
+ }
26334
+ ngOnInit() {
26335
+ var _a, _b, _c, _d;
26336
+ this.editDescription = this.descriptionContent;
26337
+ this.editStatus = (_b = (_a = this.statusItem) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
26338
+ this.editPriority = (_d = (_c = this.priorityItem) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '';
26339
+ this.editLabels = [...this.labels];
26340
+ const autoWaitVal = this.getConfigItemValue('Waits & Retries', 'Auto Wait');
26341
+ this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '');
26342
+ this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
26343
+ this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
26344
+ this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
26345
+ const enableAiSmartness = this.getConfigItemValue('AI Configuration', 'Enable AI Smartness');
26346
+ const defaultAiAction = this.getConfigItemValue('AI Configuration', 'Default AI Action');
26347
+ const knowledgeBaseDefaultTestCase = this.getConfigItemValue('AI Configuration', 'Knowledge Base Default Test Case');
26348
+ const useAiMetadataRaw = this.getConfigItemValue('AI Configuration', 'Enable AI metadata collection');
26349
+ const useAiMetadata = this.normalizeBooleanSelectValue(useAiMetadataRaw);
26350
+ const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
26351
+ const defaultBrowser = this.platform === 'web'
26352
+ ? this.getConfigItemValue('Device', 'Default Browser') || this.getConfigItemValue('Execution', 'Default Browser')
26353
+ : this.getConfigItemValue('Execution', 'Default Browser');
26354
+ const videoRecordingRaw = this.getConfigItemValue('Execution', 'Video Recording');
26355
+ const videoRecording = this.normalizeBooleanSelectValue(videoRecordingRaw);
26356
+ const defaultViewport = this.getConfigItemValue('Device', 'Default Viewport') || this.getConfigItemValue('Device', 'Viewport') || '';
26357
+ const deviceType = this.getConfigItemValue('Device', 'Type');
26358
+ const deviceOS = this.getConfigItemValue('Device', 'OS');
26359
+ this.editForm.patchValue({
26360
+ status: this.editStatus,
26361
+ priority: this.editPriority,
26362
+ prerequisiteCases,
26363
+ defaultBrowser: defaultBrowser || 'Chrome',
26364
+ videoRecording: videoRecording || '',
26365
+ defaultViewport: defaultViewport || '',
26366
+ deviceType: deviceType || '',
26367
+ deviceOS: deviceOS || '',
26368
+ enableAiSmartness: enableAiSmartness || 'Advanced',
26369
+ defaultAiAction: defaultAiAction || 'Smart wait',
26370
+ knowledgeBaseDefaultTestCase: knowledgeBaseDefaultTestCase || 'Enabled',
26371
+ useAiMetadata: useAiMetadata || '',
26372
+ });
26373
+ }
26374
+ normalizeBooleanSelectValue(val) {
26375
+ if (val === true || val === 'true')
26376
+ return 'true';
26377
+ if (val === false || val === 'false')
26378
+ return 'false';
26379
+ if (val === 'Org level' || val === 'Org Level')
26380
+ return 'Org level';
26381
+ if (val === 'On Wait' || val === 'on wait')
26382
+ return 'true';
26383
+ return val && String(val).trim() ? String(val) : '';
26384
+ }
26385
+ ngOnChanges(changes) {
26386
+ var _a, _b, _c, _d;
26387
+ if (changes['descriptionContent'] || changes['labels'] || changes['metadataItems']) {
26388
+ this.editDescription = this.descriptionContent;
26389
+ this.editLabels = [...this.labels];
26390
+ this.editStatus = (_b = (_a = this.statusItem) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
26391
+ this.editPriority = (_d = (_c = this.priorityItem) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '';
26392
+ this.editForm.patchValue({
26393
+ status: this.editStatus,
26394
+ priority: this.editPriority,
26395
+ });
26396
+ }
26397
+ if (changes['prerequisiteCaseOptions'] && this.prerequisiteCaseOptions.length) {
26398
+ this.prerequisiteCaseSelectConfig = Object.assign(Object.assign({}, this.prerequisiteCaseSelectConfig), { options: this.prerequisiteCaseOptions });
26399
+ }
26400
+ if (changes['configSections'] || changes['configSectionsRow2']) {
26401
+ const enableAiSmartness = this.getConfigItemValue('AI Configuration', 'Enable AI Smartness');
26402
+ const defaultAiAction = this.getConfigItemValue('AI Configuration', 'Default AI Action');
26403
+ const knowledgeBaseDefaultTestCase = this.getConfigItemValue('AI Configuration', 'Knowledge Base Default Test Case');
26404
+ const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
26405
+ const defaultBrowser = this.getConfigItemValue('Execution', 'Default Browser');
26406
+ const videoRecordingRaw = this.getConfigItemValue('Execution', 'Video Recording');
26407
+ const videoRecording = this.normalizeBooleanSelectValue(videoRecordingRaw);
26408
+ const useAiMetadataRaw = this.getConfigItemValue('AI Configuration', 'Enable AI metadata collection');
26409
+ const useAiMetadata = this.normalizeBooleanSelectValue(useAiMetadataRaw);
26410
+ const defaultViewport = this.getConfigItemValue('Device', 'Default Viewport') || this.getConfigItemValue('Device', 'Viewport') || '';
26411
+ const deviceType = this.getConfigItemValue('Device', 'Type');
26412
+ const deviceOS = this.getConfigItemValue('Device', 'OS');
26413
+ const autoWaitVal = this.getConfigItemValue('Waits & Retries', 'Auto Wait');
26414
+ this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '');
26415
+ this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
26416
+ this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
26417
+ this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
26418
+ const patch = {};
26419
+ if (enableAiSmartness)
26420
+ patch.enableAiSmartness = enableAiSmartness;
26421
+ if (defaultAiAction)
26422
+ patch.defaultAiAction = defaultAiAction;
26423
+ if (knowledgeBaseDefaultTestCase)
26424
+ patch.knowledgeBaseDefaultTestCase = knowledgeBaseDefaultTestCase;
26425
+ if (useAiMetadata)
26426
+ patch.useAiMetadata = useAiMetadata;
26427
+ if (prerequisiteCases.length)
26428
+ patch.prerequisiteCases = prerequisiteCases;
26429
+ if (defaultBrowser)
26430
+ patch.defaultBrowser = defaultBrowser;
26431
+ if (videoRecording)
26432
+ patch.videoRecording = videoRecording;
26433
+ if (defaultViewport)
26434
+ patch.defaultViewport = defaultViewport;
26435
+ if (deviceType)
26436
+ patch.deviceType = deviceType;
26437
+ if (deviceOS)
26438
+ patch.deviceOS = deviceOS;
26439
+ if (Object.keys(patch).length)
26440
+ this.editForm.patchValue(patch);
26441
+ }
26442
+ }
26443
+ onRemoveLabel(label) {
26444
+ this.editLabels = this.editLabels.filter((l) => l !== label);
26445
+ }
26446
+ onClearAllLabels() {
26447
+ this.editLabels = [];
26448
+ }
26449
+ onAddFrequentLabel(label) {
26450
+ if (!this.editLabels.includes(label)) {
26451
+ this.editLabels = [...this.editLabels, label];
26452
+ }
26453
+ }
26454
+ onAddSearchedLabel() {
26455
+ const trimmed = this.labelSearch.trim();
26456
+ if (trimmed && !this.editLabels.includes(trimmed)) {
26457
+ this.editLabels = [...this.editLabels, trimmed];
26458
+ this.labelSearch = '';
26459
+ }
26460
+ }
26461
+ onSave() {
26462
+ var _a, _b, _c, _d;
26463
+ const status = (_b = (_a = this.editForm.get('status')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : this.editStatus;
26464
+ const priority = (_d = (_c = this.editForm.get('priority')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : this.editPriority;
26465
+ const configSectionsMerged = this.mergeConfigSections();
26466
+ const configSectionsRow2Merged = this.mergeConfigSectionsRow2();
26467
+ this.save.emit({
26468
+ descriptionContent: this.editDescription,
26469
+ status,
26470
+ priority,
26471
+ labels: this.editLabels,
26472
+ configSections: configSectionsMerged,
26473
+ configSectionsRow2: configSectionsRow2Merged,
26474
+ });
26475
+ }
26476
+ mergeConfigSections() {
26477
+ var _a, _b, _c, _d;
26478
+ const platform = this.platform;
26479
+ const videoRecordingValue = (_b = (_a = this.editForm.get('videoRecording')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
26480
+ const videoRecording = videoRecordingValue === 'true' ? true : videoRecordingValue === 'false' ? false : videoRecordingValue;
26481
+ const useAiMetadataValue = (_d = (_c = this.editForm.get('useAiMetadata')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '';
26482
+ const useAiMetadata = useAiMetadataValue === 'true' ? true : useAiMetadataValue === 'false' ? false : useAiMetadataValue;
26483
+ return this.configSections.map((section) => {
26484
+ if (section.title === 'Execution') {
26485
+ const items = section.items
26486
+ .filter((item) => !(platform === 'web' && item.label === 'Default Browser'))
26487
+ .map((item) => item.label === 'Video Recording' ? Object.assign(Object.assign({}, item), { value: videoRecording }) : item);
26488
+ return Object.assign(Object.assign({}, section), { items });
26489
+ }
26490
+ if (section.title === 'AI Configuration') {
26491
+ const items = section.items.map((item) => item.label === 'Enable AI metadata collection' ? Object.assign(Object.assign({}, item), { value: useAiMetadata }) : item);
26492
+ return Object.assign(Object.assign({}, section), { items });
26493
+ }
26494
+ return section;
26495
+ });
26496
+ }
26497
+ mergeConfigSectionsRow2() {
26498
+ var _a, _b, _c, _d, _e, _f, _g, _h;
26499
+ const platform = this.platform;
26500
+ const defaultBrowser = (_b = (_a = this.editForm.get('defaultBrowser')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '';
26501
+ const defaultViewport = (_d = (_c = this.editForm.get('defaultViewport')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '';
26502
+ const deviceType = (_f = (_e = this.editForm.get('deviceType')) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : '';
26503
+ const deviceOS = (_h = (_g = this.editForm.get('deviceOS')) === null || _g === void 0 ? void 0 : _g.value) !== null && _h !== void 0 ? _h : '';
26504
+ let result = this.configSectionsRow2.map((section) => {
26505
+ if (section.title === 'Waits & Retries') {
26506
+ const autoWaitValue = this.autoWaitEnabled ? 'Enabled' : '';
26507
+ const items = section.items.map((item) => item.label === 'Auto Wait' ? Object.assign(Object.assign({}, item), { value: autoWaitValue }) : item);
26508
+ return Object.assign(Object.assign({}, section), { items });
26509
+ }
26510
+ if (section.title === 'Device') {
26511
+ const items = [
26512
+ ...(platform === 'web'
26513
+ ? [
26514
+ { label: 'Default Browser', value: defaultBrowser },
26515
+ { label: 'Default Viewport', value: defaultViewport },
26516
+ ]
26517
+ : [
26518
+ { label: 'Type', value: deviceType },
26519
+ { label: 'OS', value: deviceOS },
26520
+ ]),
26521
+ ];
26522
+ return Object.assign(Object.assign({}, section), { items });
26523
+ }
26524
+ return section;
26525
+ });
26526
+ const existingDevice = result.find((s) => s.title === 'Device');
26527
+ if (!existingDevice) {
26528
+ const deviceSection = {
26529
+ title: 'Device',
26530
+ icon: 'devices',
26531
+ items: [
26532
+ ...(platform === 'web'
26533
+ ? [
26534
+ { label: 'Default Browser', value: defaultBrowser },
26535
+ { label: 'Default Viewport', value: defaultViewport },
26536
+ ]
26537
+ : [
26538
+ { label: 'Type', value: deviceType },
26539
+ { label: 'OS', value: deviceOS },
26540
+ ]),
26541
+ ],
26542
+ };
26543
+ result = [...result, deviceSection];
26544
+ }
26545
+ const keyFlagsSection = {
26546
+ title: 'Key Flags',
26547
+ icon: 'flag',
26548
+ items: [
26549
+ { label: 'Mobile Testing', value: this.mobileTestingEnabled ? 'Enabled' : '' },
26550
+ { label: 'Extension Use', value: this.extensionUseEnabled ? 'Enabled' : '' },
26551
+ { label: 'Data Driven', value: this.dataDrivenEnabled ? 'Enabled' : '' },
26552
+ ],
26553
+ };
26554
+ const existingKeyFlags = result.find((s) => s.title === 'Key Flags');
26555
+ if (existingKeyFlags) {
26556
+ result = result.map((s) => s.title === 'Key Flags' ? keyFlagsSection : s);
26557
+ }
26558
+ else {
26559
+ result = [...result, keyFlagsSection];
26560
+ }
26561
+ return result;
26562
+ }
26563
+ onCancel() {
26564
+ this.cancel.emit();
26565
+ }
26566
+ trackByLabel(_i, label) {
26567
+ return label;
26568
+ }
26569
+ trackByConfigTitle(_i, section) {
26570
+ return section.title;
26571
+ }
26572
+ getCurrentLabelChipStyle(_label) {
26573
+ const colors = this.LABEL_CHIP_STYLE;
26574
+ return {
26575
+ 'background-color': colors.bg,
26576
+ 'border-color': colors.border,
26577
+ 'border-width': '1px',
26578
+ 'border-style': 'solid',
26579
+ color: colors.text,
26580
+ };
26581
+ }
26582
+ getLabelCloseIconColor(_label) {
26583
+ return this.LABEL_CHIP_STYLE.icon;
26584
+ }
26585
+ }
26586
+ TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26587
+ 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 });
26588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, decorators: [{
26589
+ type: Component,
26590
+ 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" }]
26591
+ }], propDecorators: { descriptionTitle: [{
26592
+ type: Input
26593
+ }], descriptionContent: [{
26594
+ type: Input
26595
+ }], metadataItems: [{
26596
+ type: Input
26597
+ }], labels: [{
26598
+ type: Input
26599
+ }], configTitle: [{
26600
+ type: Input
26601
+ }], configSections: [{
26602
+ type: Input
26603
+ }], configSectionsRow2: [{
26604
+ type: Input
26605
+ }], prerequisiteCaseOptions: [{
26606
+ type: Input
26607
+ }], platform: [{
26608
+ type: Input
26609
+ }], selectConfigOverrides: [{
26610
+ type: Input
26611
+ }], save: [{
26612
+ type: Output
26613
+ }], cancel: [{
26614
+ type: Output
26615
+ }], selectSearch: [{
26616
+ type: Output
26617
+ }], selectLoadMore: [{
26618
+ type: Output
26619
+ }], selectOpened: [{
26620
+ type: Output
26621
+ }], selectionChange: [{
26622
+ type: Output
26623
+ }] } });
26624
+
26625
+ class TestCaseDetailsComponent {
26626
+ constructor(cdr) {
26627
+ this.cdr = cdr;
26628
+ /** Whether the component is in edit mode */
26629
+ this.editing = false;
26630
+ /** When true, start in edit mode (useful for Storybook). */
26631
+ this.startInEditMode = false;
26632
+ /** Description section title */
26633
+ this.descriptionTitle = 'Description';
26634
+ /** Description text content */
26635
+ this.descriptionContent = '';
26636
+ /** Whether to show the Edit button in the Description header */
26637
+ this.showEditButton = false;
26638
+ /** Metadata items (createdOn, status, priority, environment, version, testPlanName, etc.) */
26639
+ this.metadataItems = [];
26640
+ /** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
26641
+ this.labels = [];
26642
+ /** Configuration section title */
26643
+ this.configTitle = 'Configuration';
26644
+ /** Configuration sections (e.g. Execution, AI Configuration) */
26645
+ this.configSections = [];
26646
+ /** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
26647
+ this.configSectionsRow2 = [];
26648
+ /** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings fields. */
26649
+ this.platform = 'web';
26650
+ /** Override config per select for API-driven options, server search, load more. */
26651
+ this.selectConfigOverrides = {};
26652
+ this.editDescription = new EventEmitter();
26653
+ this.saveChanges = new EventEmitter();
26654
+ this.metadataLinkClick = new EventEmitter();
26655
+ this.selectSearch = new EventEmitter();
26656
+ this.selectLoadMore = new EventEmitter();
26657
+ this.selectOpened = new EventEmitter();
26658
+ this.selectionChange = new EventEmitter();
26659
+ }
26660
+ ngOnInit() {
26661
+ if (this.startInEditMode) {
26662
+ this.editing = true;
26663
+ }
26664
+ }
26665
+ onEditClick() {
26666
+ this.editing = true;
26667
+ this.cdr.detectChanges();
26668
+ this.editDescription.emit();
26669
+ }
26670
+ onSaveChanges(data) {
26671
+ this.editing = false;
26672
+ this.cdr.detectChanges();
26673
+ this.saveChanges.emit(data);
26674
+ }
26675
+ onCancelEdit() {
26676
+ this.editing = false;
26677
+ this.cdr.detectChanges();
26678
+ }
26679
+ trackByConfigTitle(_i, section) {
26680
+ return section.title;
26681
+ }
26682
+ trackByMetadataLabel(_i, item) {
26683
+ return item.label;
26684
+ }
26685
+ onMetadataLinkClick(item) {
26686
+ if (item.link) {
26687
+ this.metadataLinkClick.emit(item);
26688
+ }
26689
+ }
26690
+ getStatusDotClass(item) {
26691
+ if (!item.statusColor)
26692
+ return '';
26693
+ switch (item.statusColor) {
26694
+ case 'yellow':
26695
+ return 'cqa-bg-[#EAB308]';
26696
+ case 'red':
26697
+ return 'cqa-bg-[#DC2626]';
26698
+ case 'green':
26699
+ return 'cqa-bg-[#16A34A]';
26700
+ case 'gray':
26701
+ default:
26702
+ return 'cqa-bg-[#94A3B8]';
26703
+ }
26704
+ }
26705
+ /** Text color for metadata value (e.g. red for critical priority) */
26706
+ getValueTextClass(item) {
26707
+ if (item.statusColor === 'red') {
26708
+ return 'cqa-text-[#DC2626]';
26709
+ }
26710
+ return 'cqa-text-[#111827]';
26711
+ }
26712
+ }
26713
+ TestCaseDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
26714
+ 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 });
26715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsComponent, decorators: [{
26716
+ type: Component,
26717
+ 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: [] }]
26718
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { startInEditMode: [{
26719
+ type: Input
26720
+ }], descriptionTitle: [{
26721
+ type: Input
26722
+ }], descriptionContent: [{
26723
+ type: Input
26724
+ }], showEditButton: [{
26725
+ type: Input
26726
+ }], metadataItems: [{
26727
+ type: Input
26728
+ }], labels: [{
26729
+ type: Input
26730
+ }], configTitle: [{
26731
+ type: Input
26732
+ }], configSections: [{
26733
+ type: Input
26734
+ }], configSectionsRow2: [{
26735
+ type: Input
26736
+ }], platform: [{
26737
+ type: Input
26738
+ }], selectConfigOverrides: [{
26739
+ type: Input
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
+ }] } });
26755
+
26756
+ class DetailSidePanelComponent {
26757
+ constructor() {
26758
+ /** Tabs - each tab has a side panel icon button; tabs and buttons are 1:1 */
26759
+ this.tabs = [
26760
+ { label: 'Test Case', value: 'test-case', icon: 'description' },
26761
+ { label: 'Data Library', value: 'data-library', icon: 'folder' },
26762
+ { label: 'Variables', value: 'variables', icon: 'code' },
26763
+ ];
26764
+ /** Currently active tab value */
26765
+ this.activeTab = 'test-case';
26766
+ /** Description section title */
26767
+ this.descriptionTitle = 'Description';
26768
+ /** Description text content */
26769
+ this.descriptionContent = '';
26770
+ /** Whether to show the Edit button in the Description header */
26771
+ this.showEditButton = true;
26772
+ /** Metadata items (Created on, Status, Priority, etc.) */
26773
+ this.metadataItems = [];
26774
+ /** Labels/tags (e.g. Automation, API, SDK, UI/UX) */
26775
+ this.labels = [];
26776
+ /** Configuration sections - full width (e.g. Execution, AI Configuration) */
26777
+ this.configSections = [];
26778
+ /** Optional config sections displayed in a 2-column row (e.g. Waits & Retries, Device) */
26779
+ this.configSectionsRow2 = [];
26780
+ /** Platform: 'web' or 'mobile'. Defaults to 'web'. Used for Device Settings. */
26781
+ this.platform = 'web';
26782
+ /** Configuration section title */
26783
+ this.configTitle = 'Configuration';
26784
+ /** Whether to show the close button in the side menu */
26785
+ this.showCloseButton = false;
26786
+ /** When true, test case details start in edit mode (useful for Storybook). */
26787
+ this.startInEditMode = false;
26788
+ /** Override config per select for API-driven options, server search, load more. */
26789
+ this.selectConfigOverrides = {};
26790
+ /** Whether the panel is expanded (affects expand button icon and panel width) */
26791
+ this.expanded = true;
26792
+ /** Panel width when expanded (e.g. '480px', '25%') */
26793
+ this.expandedWidth = '380px';
26794
+ /** Panel width when collapsed (e.g. '56px' - fits icon bar + back button) */
26795
+ this.collapsedWidth = '56px';
26796
+ this.hostOverflow = 'hidden';
26797
+ /** Tooltip for expand button when panel is collapsed */
26798
+ this.expandTooltip = 'Expand';
26799
+ /** Tooltip for expand button when panel is expanded (collapse) */
26800
+ this.collapseTooltip = 'Collapse';
26801
+ /** Tooltip for close button */
26802
+ this.closeTooltip = 'Close';
26803
+ this.back = new EventEmitter();
26804
+ this.tabChange = new EventEmitter();
26805
+ this.editDescription = new EventEmitter();
26806
+ this.saveChanges = new EventEmitter();
26807
+ this.metadataLinkClick = new EventEmitter();
26808
+ this.selectSearch = new EventEmitter();
26809
+ this.selectLoadMore = new EventEmitter();
26810
+ this.selectOpened = new EventEmitter();
26811
+ this.selectionChange = new EventEmitter();
26812
+ this.expandToggle = new EventEmitter();
26813
+ this.close = new EventEmitter();
26814
+ }
26815
+ get hostWidth() {
26816
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26817
+ }
26818
+ get hostMinWidth() {
26819
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26820
+ }
26821
+ get hostMaxWidth() {
26822
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
26823
+ }
26824
+ trackByTabValue(_i, tab) {
26825
+ return tab.value;
26826
+ }
26827
+ trackByMetadataLabel(_i, item) {
26828
+ return item.label;
26829
+ }
26830
+ trackByConfigTitle(_i, section) {
26831
+ return section.title;
26832
+ }
26833
+ onBack() {
26834
+ this.back.emit();
26835
+ }
26836
+ onTabClick(tab) {
26837
+ if (!this.expanded) {
26838
+ this.expandToggle.emit();
26839
+ }
26840
+ if (tab.value !== this.activeTab) {
26841
+ this.tabChange.emit(tab.value);
26842
+ }
26843
+ }
26844
+ onEditDescription() {
26845
+ this.editDescription.emit();
26846
+ }
26847
+ onSaveChanges(data) {
26848
+ this.saveChanges.emit(data);
26849
+ }
26850
+ onExpandToggle() {
26851
+ this.expandToggle.emit();
26852
+ }
26853
+ onClose() {
26854
+ this.close.emit();
26855
+ }
26856
+ onMetadataLinkClick(item) {
26857
+ if (item.link) {
26858
+ this.metadataLinkClick.emit(item);
26859
+ }
26860
+ }
26861
+ getStatusDotClass(item) {
26862
+ if (!item.statusColor)
26863
+ return '';
26864
+ switch (item.statusColor) {
26865
+ case 'yellow':
26866
+ return 'cqa-bg-[#EAB308]';
26867
+ case 'red':
26868
+ return 'cqa-bg-[#DC2626]';
26869
+ case 'green':
26870
+ return 'cqa-bg-[#16A34A]';
26871
+ case 'gray':
26872
+ default:
26873
+ return 'cqa-bg-[#94A3B8]';
26874
+ }
26875
+ }
26876
+ }
26877
+ DetailSidePanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26878
+ 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 });
26879
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailSidePanelComponent, decorators: [{
26880
+ type: Component,
26881
+ args: [{ selector: 'cqa-detail-side-panel', changeDetection: ChangeDetectionStrategy.OnPush, host: {
26882
+ 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)]',
26883
+ style: 'transition: width 0.3s ease-in-out',
26884
+ }, 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" }]
26885
+ }], propDecorators: { tabs: [{
26886
+ type: Input
26887
+ }], activeTab: [{
26888
+ type: Input
26889
+ }], descriptionTitle: [{
26890
+ type: Input
26891
+ }], descriptionContent: [{
26892
+ type: Input
26893
+ }], showEditButton: [{
26894
+ type: Input
26895
+ }], metadataItems: [{
26896
+ type: Input
26897
+ }], labels: [{
26898
+ type: Input
26899
+ }], configSections: [{
26900
+ type: Input
26901
+ }], configSectionsRow2: [{
26902
+ type: Input
26903
+ }], platform: [{
26904
+ type: Input
26905
+ }], configTitle: [{
26906
+ type: Input
26907
+ }], showCloseButton: [{
26908
+ type: Input
26909
+ }], startInEditMode: [{
26910
+ type: Input
26911
+ }], selectConfigOverrides: [{
26912
+ type: Input
26913
+ }], expanded: [{
26914
+ type: Input
26915
+ }], expandedWidth: [{
26916
+ type: Input
26917
+ }], collapsedWidth: [{
26918
+ type: Input
26919
+ }], hostWidth: [{
26920
+ type: HostBinding,
26921
+ args: ['style.width']
26922
+ }], hostMinWidth: [{
26923
+ type: HostBinding,
26924
+ args: ['style.min-width']
26925
+ }], hostMaxWidth: [{
26926
+ type: HostBinding,
26927
+ args: ['style.max-width']
26928
+ }], hostOverflow: [{
26929
+ type: HostBinding,
26930
+ args: ['style.overflow']
26931
+ }], expandTooltip: [{
26932
+ type: Input
26933
+ }], collapseTooltip: [{
26934
+ type: Input
26935
+ }], closeTooltip: [{
26936
+ type: Input
26937
+ }], back: [{
26938
+ type: Output
26939
+ }], tabChange: [{
26940
+ type: Output
26941
+ }], editDescription: [{
26942
+ type: Output
26943
+ }], saveChanges: [{
26944
+ type: Output
26945
+ }], metadataLinkClick: [{
26946
+ type: Output
26947
+ }], selectSearch: [{
26948
+ type: Output
26949
+ }], selectLoadMore: [{
26950
+ type: Output
26951
+ }], selectOpened: [{
26952
+ type: Output
26953
+ }], selectionChange: [{
26954
+ type: Output
26955
+ }], expandToggle: [{
26956
+ type: Output
26957
+ }], close: [{
26958
+ type: Output
26959
+ }] } });
26960
+
26961
+ class DetailDrawerTabContentDirective {
26962
+ constructor(templateRef) {
26963
+ this.templateRef = templateRef;
26964
+ }
26965
+ }
26966
+ DetailDrawerTabContentDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
26967
+ DetailDrawerTabContentDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: DetailDrawerTabContentDirective, selector: "[cqaTabContent]", ngImport: i0 });
26968
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabContentDirective, decorators: [{
26969
+ type: Directive,
26970
+ args: [{
26971
+ selector: '[cqaTabContent]',
26972
+ }]
26973
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
26974
+
26975
+ class DetailDrawerTabComponent {
26976
+ constructor() {
26977
+ /** Tab label (shown in tooltip on icon button) */
26978
+ this.label = '';
26979
+ /** Tab value (unique identifier) */
26980
+ this.value = '';
26981
+ /** Material icon name for the tab button */
26982
+ this.icon = 'folder';
26983
+ }
26984
+ get contentTemplate() {
26985
+ var _a, _b;
26986
+ return (_b = (_a = this.contentDirective) === null || _a === void 0 ? void 0 : _a.templateRef) !== null && _b !== void 0 ? _b : null;
26987
+ }
26988
+ }
26989
+ DetailDrawerTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26990
+ 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 });
26991
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerTabComponent, decorators: [{
26992
+ type: Component,
26993
+ args: [{
26994
+ selector: 'cqa-detail-drawer-tab',
26995
+ template: '',
26996
+ host: {
26997
+ style: 'display: contents',
26998
+ },
26999
+ }]
27000
+ }], propDecorators: { label: [{
27001
+ type: Input
27002
+ }], value: [{
27003
+ type: Input
27004
+ }], icon: [{
27005
+ type: Input
27006
+ }], contentDirective: [{
27007
+ type: ContentChild,
27008
+ args: [DetailDrawerTabContentDirective]
27009
+ }] } });
27010
+
27011
+ class DetailDrawerComponent {
27012
+ constructor() {
27013
+ /** Currently active tab value */
27014
+ this.activeTab = '';
27015
+ /** Whether to show the close button */
27016
+ this.showCloseButton = true;
27017
+ /** Whether the drawer is expanded */
27018
+ this.expanded = true;
27019
+ /** Panel width when expanded */
27020
+ this.expandedWidth = '280px';
27021
+ /** Maximum width when expanded (e.g. '600px', '30vw'). Default: 30% of viewport */
27022
+ this.maxExpandedWidth = '30vw';
27023
+ /** Panel width when collapsed */
27024
+ this.collapsedWidth = '56px';
27025
+ this.expandTooltip = 'Expand';
27026
+ this.collapseTooltip = 'Collapse';
27027
+ this.closeTooltip = 'Close';
27028
+ this.activeTabChange = new EventEmitter();
27029
+ this.expandToggle = new EventEmitter();
27030
+ this.close = new EventEmitter();
27031
+ }
27032
+ get hostWidth() {
27033
+ return this.expanded ? this.expandedWidth : this.collapsedWidth;
27034
+ }
27035
+ get hostMinWidth() {
27036
+ return this.expanded && this.minExpandedWidth ? this.minExpandedWidth : null;
27037
+ }
27038
+ get hostMaxWidth() {
27039
+ return this.expanded ? this.maxExpandedWidth : null;
27040
+ }
27041
+ ngAfterContentInit() {
27042
+ this.ensureActiveTab();
27043
+ }
27044
+ ngAfterContentChecked() {
27045
+ this.ensureActiveTab();
27046
+ }
27047
+ ensureActiveTab() {
27048
+ var _a, _b;
27049
+ const tabs = (_b = (_a = this.tabComponents) === null || _a === void 0 ? void 0 : _a.toArray()) !== null && _b !== void 0 ? _b : [];
27050
+ if (tabs.length > 0 && !this.activeTab) {
27051
+ this.activeTab = tabs[0].value;
27052
+ this.activeTabChange.emit(this.activeTab);
27053
+ }
27054
+ }
27055
+ onTabClick(tab) {
27056
+ // If drawer is collapsed, open it (but never close on tab click)
27057
+ if (!this.expanded) {
27058
+ this.expandToggle.emit();
27059
+ }
27060
+ // Select the tab
27061
+ if (tab.value !== this.activeTab) {
27062
+ this.activeTab = tab.value;
27063
+ this.activeTabChange.emit(this.activeTab);
27064
+ }
27065
+ }
27066
+ onExpandToggle() {
27067
+ this.expandToggle.emit();
27068
+ }
27069
+ onClose() {
27070
+ this.close.emit();
27071
+ }
27072
+ trackByValue(_i, tab) {
27073
+ return tab.value;
27074
+ }
27075
+ isTabActive(tab) {
27076
+ return tab.value === this.activeTab;
27077
+ }
27078
+ }
27079
+ DetailDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
27080
+ 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 });
27081
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DetailDrawerComponent, decorators: [{
27082
+ type: Component,
27083
+ args: [{ selector: 'cqa-detail-drawer', changeDetection: ChangeDetectionStrategy.OnPush, host: {
27084
+ 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)]',
27085
+ style: 'transition: width 0.3s ease-in-out',
27086
+ }, 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: [] }]
27087
+ }], propDecorators: { tabComponents: [{
27088
+ type: ContentChildren,
27089
+ args: [DetailDrawerTabComponent]
27090
+ }], activeTab: [{
27091
+ type: Input
27092
+ }], showCloseButton: [{
27093
+ type: Input
27094
+ }], expanded: [{
27095
+ type: Input
27096
+ }], expandedWidth: [{
27097
+ type: Input
27098
+ }], minExpandedWidth: [{
27099
+ type: Input
27100
+ }], maxExpandedWidth: [{
27101
+ type: Input
27102
+ }], collapsedWidth: [{
27103
+ type: Input
27104
+ }], hostWidth: [{
27105
+ type: HostBinding,
27106
+ args: ['style.width']
27107
+ }], hostMinWidth: [{
27108
+ type: HostBinding,
27109
+ args: ['style.min-width']
27110
+ }], hostMaxWidth: [{
27111
+ type: HostBinding,
27112
+ args: ['style.max-width']
27113
+ }], expandTooltip: [{
27114
+ type: Input
27115
+ }], collapseTooltip: [{
27116
+ type: Input
27117
+ }], closeTooltip: [{
27118
+ type: Input
27119
+ }], activeTabChange: [{
27120
+ type: Output
27121
+ }], expandToggle: [{
27122
+ type: Output
27123
+ }], close: [{
27124
+ type: Output
27125
+ }] } });
27126
+
26000
27127
  class StepBuilderGroupComponent {
26001
27128
  constructor(fb) {
26002
27129
  this.fb = fb;
@@ -26551,6 +27678,12 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
26551
27678
  StepBuilderDocumentGenerationTemplateStepComponent,
26552
27679
  ElementListComponent,
26553
27680
  StepBuilderDocumentComponent,
27681
+ DetailSidePanelComponent,
27682
+ DetailDrawerComponent,
27683
+ DetailDrawerTabComponent,
27684
+ DetailDrawerTabContentDirective,
27685
+ TestCaseDetailsComponent,
27686
+ TestCaseDetailsEditComponent,
26554
27687
  StepBuilderGroupComponent,
26555
27688
  StepDetailsDrawerComponent,
26556
27689
  TemplateVariablesFormComponent], imports: [CommonModule,
@@ -26682,6 +27815,12 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
26682
27815
  StepBuilderDocumentGenerationTemplateStepComponent,
26683
27816
  ElementListComponent,
26684
27817
  StepBuilderDocumentComponent,
27818
+ DetailSidePanelComponent,
27819
+ DetailDrawerComponent,
27820
+ DetailDrawerTabComponent,
27821
+ DetailDrawerTabContentDirective,
27822
+ TestCaseDetailsComponent,
27823
+ TestCaseDetailsEditComponent,
26685
27824
  StepBuilderGroupComponent,
26686
27825
  StepDetailsDrawerComponent,
26687
27826
  TemplateVariablesFormComponent] });
@@ -26862,6 +28001,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
26862
28001
  StepBuilderDocumentGenerationTemplateStepComponent,
26863
28002
  ElementListComponent,
26864
28003
  StepBuilderDocumentComponent,
28004
+ DetailSidePanelComponent,
28005
+ DetailDrawerComponent,
28006
+ DetailDrawerTabComponent,
28007
+ DetailDrawerTabContentDirective,
28008
+ TestCaseDetailsComponent,
28009
+ TestCaseDetailsEditComponent,
26865
28010
  StepBuilderGroupComponent,
26866
28011
  StepDetailsDrawerComponent,
26867
28012
  TemplateVariablesFormComponent,
@@ -26999,6 +28144,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
26999
28144
  StepBuilderDocumentGenerationTemplateStepComponent,
27000
28145
  ElementListComponent,
27001
28146
  StepBuilderDocumentComponent,
28147
+ DetailSidePanelComponent,
28148
+ DetailDrawerComponent,
28149
+ DetailDrawerTabComponent,
28150
+ DetailDrawerTabContentDirective,
28151
+ TestCaseDetailsComponent,
28152
+ TestCaseDetailsEditComponent,
27002
28153
  StepBuilderGroupComponent,
27003
28154
  StepDetailsDrawerComponent,
27004
28155
  TemplateVariablesFormComponent,
@@ -27488,9 +28639,178 @@ function getDynamicFieldsFromLegacyConfig(step) {
27488
28639
  return result;
27489
28640
  }
27490
28641
 
28642
+ /** Default status value -> dot color. Override via BuildTestCaseDetailsOptions. */
28643
+ const DEFAULT_STATUS_COLOR_CONFIG = {
28644
+ active: 'green',
28645
+ inactive: 'gray',
28646
+ pending: 'yellow',
28647
+ completed: 'green',
28648
+ 'in review': 'yellow',
28649
+ draft: 'gray',
28650
+ approved: 'green',
28651
+ rejected: 'red',
28652
+ blocked: 'red',
28653
+ 'in progress': 'yellow',
28654
+ done: 'green',
28655
+ };
28656
+ /** Default priority value -> dot color. Override via BuildTestCaseDetailsOptions. */
28657
+ const DEFAULT_PRIORITY_COLOR_CONFIG = {
28658
+ critical: 'red',
28659
+ major: 'red',
28660
+ high: 'red',
28661
+ medium: 'yellow',
28662
+ low: 'green',
28663
+ minor: 'green',
28664
+ 'not set': 'gray',
28665
+ p0: 'red',
28666
+ p1: 'yellow',
28667
+ p2: 'green',
28668
+ p3: 'gray',
28669
+ };
28670
+ /**
28671
+ * API field names for mapping test case data to cqa-test-case-details.
28672
+ * Use these when building metadataItems and configSections from your API response.
28673
+ */
28674
+ const TEST_CASE_DETAILS_FIELD_MAP = {
28675
+ /** Metadata (description section) */
28676
+ metadata: {
28677
+ createdOn: 'createdOn',
28678
+ status: 'status',
28679
+ priority: 'priority',
28680
+ environment: 'environment',
28681
+ version: 'version',
28682
+ platform: 'platform',
28683
+ labels: 'labels',
28684
+ },
28685
+ /** Execution config */
28686
+ execution: {
28687
+ prerequisiteCase: 'prerequisiteCase',
28688
+ defaultBrowser: 'defaultBrowser',
28689
+ videoRecording: 'videoRecording',
28690
+ testCaseTimeout: 'testCaseTimeout',
28691
+ waitTimeoutForLocators: 'waitTimeoutForLocators',
28692
+ webBrowser: 'webBrowser',
28693
+ viewport: 'viewport',
28694
+ },
28695
+ /** AI Configuration */
28696
+ aiConfig: {
28697
+ enableAiSmartness: 'enableAiSmartness',
28698
+ defaultAiAction: 'defaultAiAction',
28699
+ knowledgeBaseDefaultTestCase: 'knowledgeBaseDefaultTestCase',
28700
+ useAiMetadata: 'useAiMetadata',
28701
+ },
28702
+ /** Waits & Retries */
28703
+ waitsRetries: {
28704
+ autoWait: 'autoWait',
28705
+ retryFailedSteps: 'retryFailedSteps',
28706
+ },
28707
+ /** Device */
28708
+ device: {
28709
+ platform: 'platform',
28710
+ deviceType: 'deviceType',
28711
+ deviceOS: 'deviceOS',
28712
+ defaultBrowser: 'defaultBrowser',
28713
+ defaultViewport: 'defaultViewport',
28714
+ viewport: 'viewport',
28715
+ },
28716
+ };
28717
+ /**
28718
+ * Build metadataItems and configSections from API data for cqa-test-case-details.
28719
+ * Use in ts-portal when mapping test case API response to component inputs.
28720
+ */
28721
+ function buildTestCaseDetailsFromApi(data, options) {
28722
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
28723
+ const formatDate = (v) => { var _a, _b; return v ? (typeof v === 'string' ? v : (_b = (_a = v.toISOString) === null || _a === void 0 ? void 0 : _a.call(v)) !== null && _b !== void 0 ? _b : String(v)) : ''; };
28724
+ const statusConfig = Object.assign(Object.assign({}, DEFAULT_STATUS_COLOR_CONFIG), options === null || options === void 0 ? void 0 : options.statusColorConfig);
28725
+ const priorityConfig = Object.assign(Object.assign({}, DEFAULT_PRIORITY_COLOR_CONFIG), options === null || options === void 0 ? void 0 : options.priorityColorConfig);
28726
+ const resolveColor = (value, config) => { var _a; return (_a = config[value.toLowerCase().trim()]) !== null && _a !== void 0 ? _a : 'gray'; };
28727
+ const metadataItems = [];
28728
+ if (data.createdOn != null)
28729
+ metadataItems.push({ label: 'Created on', value: formatDate(data.createdOn), icon: 'calendar_today' });
28730
+ if (data.status != null)
28731
+ metadataItems.push({ label: 'Status', value: data.status, statusColor: resolveColor(data.status, statusConfig) });
28732
+ if (data.priority != null)
28733
+ metadataItems.push({ label: 'Priority', value: data.priority, statusColor: resolveColor(data.priority, priorityConfig) });
28734
+ if (data.environment != null)
28735
+ metadataItems.push({ label: 'Environment', value: data.environment, icon: 'storage' });
28736
+ if (data.version != null)
28737
+ metadataItems.push({ label: 'Version', value: data.version, icon: 'label' });
28738
+ if (data.platform != null)
28739
+ metadataItems.push({
28740
+ label: 'Platform',
28741
+ value: data.platform === 'web' ? 'web' : 'iOS',
28742
+ icon: 'devices',
28743
+ });
28744
+ const configSections = [
28745
+ {
28746
+ title: 'Execution',
28747
+ icon: 'play_circle',
28748
+ items: [
28749
+ { label: 'Prerequisite Case', value: (_a = data.prerequisiteCase) !== null && _a !== void 0 ? _a : null },
28750
+ { label: 'Video Recording', value: (_b = data.videoRecording) !== null && _b !== void 0 ? _b : '' },
28751
+ ],
28752
+ },
28753
+ {
28754
+ title: 'AI Configuration',
28755
+ icon: 'smart_toy',
28756
+ items: [
28757
+ { label: 'Enable AI Smartness', value: (_c = data.enableAiSmartness) !== null && _c !== void 0 ? _c : '' },
28758
+ { label: 'Default AI Action', value: (_d = data.defaultAiAction) !== null && _d !== void 0 ? _d : '' },
28759
+ { label: 'Knowledge Base Default Test Case', value: (_e = data.knowledgeBaseDefaultTestCase) !== null && _e !== void 0 ? _e : null },
28760
+ { label: 'Enable AI metadata collection', value: (_f = data.useAiMetadata) !== null && _f !== void 0 ? _f : '' },
28761
+ ],
28762
+ },
28763
+ ];
28764
+ const configSectionsRow2 = [
28765
+ {
28766
+ title: 'Wait and retries',
28767
+ icon: 'timer',
28768
+ items: [
28769
+ { label: 'Enable Avoid Auto wait for steps', value: (_g = data.autoWaitEnabled) !== null && _g !== void 0 ? _g : false },
28770
+ { label: 'Retry Failed Steps', value: (_h = data.retryFailedSteps) !== null && _h !== void 0 ? _h : '' },
28771
+ { label: 'Test Case Timeout (minutes)', value: (_j = data.testCaseTimeout) !== null && _j !== void 0 ? _j : '' },
28772
+ { label: 'Wait Timeout for Locators (secs)', value: (_k = data.waitTimeoutForLocators) !== null && _k !== void 0 ? _k : '' },
28773
+ ],
28774
+ },
28775
+ {
28776
+ title: 'Device Setting',
28777
+ icon: 'devices',
28778
+ items: (() => {
28779
+ var _a, _b, _c, _d, _e, _f, _g;
28780
+ const platform = (_a = data.platform) !== null && _a !== void 0 ? _a : 'web';
28781
+ if (platform === 'web') {
28782
+ return [
28783
+ { label: 'Default Browser', value: (_c = (_b = data.defaultBrowser) !== null && _b !== void 0 ? _b : data.webBrowser) !== null && _c !== void 0 ? _c : '' },
28784
+ { label: 'Default Viewport', value: (_e = (_d = data.defaultViewport) !== null && _d !== void 0 ? _d : data.viewport) !== null && _e !== void 0 ? _e : '' },
28785
+ ];
28786
+ }
28787
+ return [
28788
+ { label: 'Default OS', value: (_f = data.deviceOS) !== null && _f !== void 0 ? _f : '' },
28789
+ { label: 'Default Phone', value: (_g = data.deviceType) !== null && _g !== void 0 ? _g : '' },
28790
+ ];
28791
+ })(),
28792
+ },
28793
+ {
28794
+ title: 'Key Flags',
28795
+ icon: 'flag',
28796
+ items: [
28797
+ { label: 'Mobile Testing', value: (_l = data.mobileTesting) !== null && _l !== void 0 ? _l : '' },
28798
+ { label: 'Extension Use', value: (_m = data.extensionUse) !== null && _m !== void 0 ? _m : '' },
28799
+ { label: 'Data Driven', value: (_o = data.dataDriven) !== null && _o !== void 0 ? _o : '' },
28800
+ ],
28801
+ },
28802
+ ];
28803
+ return {
28804
+ metadataItems,
28805
+ labels: (_p = data.labels) !== null && _p !== void 0 ? _p : [],
28806
+ configSections,
28807
+ configSectionsRow2,
28808
+ };
28809
+ }
28810
+
27491
28811
  /**
27492
28812
  * Generated bundle index. Do not edit.
27493
28813
  */
27494
28814
 
27495
- 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 };
28815
+ 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 };
27496
28816
  //# sourceMappingURL=cqa-lib-cqa-ui.mjs.map