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