@cqa-lib/cqa-ui 1.1.522 → 1.1.524
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/assign-environments-dialog/assign-environments-dialog.component.mjs +155 -0
- package/esm2020/lib/assign-environments-dialog/assign-environments-dialog.models.mjs +2 -0
- package/esm2020/lib/new-environment-dialog/new-environment-dialog.component.mjs +123 -0
- package/esm2020/lib/new-environment-dialog/new-environment-dialog.models.mjs +9 -0
- package/esm2020/lib/new-environment-variable-dialog/new-environment-variable-dialog.component.mjs +190 -0
- package/esm2020/lib/new-environment-variable-dialog/new-environment-variable-dialog.models.mjs +2 -0
- package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.mjs +188 -0
- package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.mjs +2 -0
- package/esm2020/lib/ui-kit.module.mjs +21 -1
- package/esm2020/public-api.mjs +9 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +669 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +657 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/assign-environments-dialog/assign-environments-dialog.component.d.ts +36 -0
- package/lib/assign-environments-dialog/assign-environments-dialog.models.d.ts +19 -0
- package/lib/new-environment-dialog/new-environment-dialog.component.d.ts +37 -0
- package/lib/new-environment-dialog/new-environment-dialog.models.d.ts +14 -0
- package/lib/new-environment-variable-dialog/new-environment-variable-dialog.component.d.ts +54 -0
- package/lib/new-environment-variable-dialog/new-environment-variable-dialog.models.d.ts +14 -0
- package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.d.ts +43 -0
- package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.d.ts +20 -0
- package/lib/ui-kit.module.d.ts +92 -88
- package/package.json +1 -1
- package/public-api.d.ts +8 -0
- package/styles.css +1 -1
|
@@ -46879,6 +46879,646 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
46879
46879
|
type: Input
|
|
46880
46880
|
}] } });
|
|
46881
46881
|
|
|
46882
|
+
const ENVIRONMENT_ACCENT_COLORS = [
|
|
46883
|
+
'#3F43EE',
|
|
46884
|
+
'#A855F7',
|
|
46885
|
+
'#00A63E',
|
|
46886
|
+
'#F59E0B',
|
|
46887
|
+
'#0EA5E9',
|
|
46888
|
+
'#EC4899',
|
|
46889
|
+
];
|
|
46890
|
+
|
|
46891
|
+
class NewEnvironmentDialogComponent {
|
|
46892
|
+
constructor(cdr) {
|
|
46893
|
+
this.cdr = cdr;
|
|
46894
|
+
this.mode = 'create';
|
|
46895
|
+
this.existingNames = [];
|
|
46896
|
+
this.allowDefaultToggle = true;
|
|
46897
|
+
this.defaultAlreadySet = false;
|
|
46898
|
+
this.colors = ENVIRONMENT_ACCENT_COLORS;
|
|
46899
|
+
this.name = '';
|
|
46900
|
+
this.description = '';
|
|
46901
|
+
this.color = ENVIRONMENT_ACCENT_COLORS[0];
|
|
46902
|
+
this.isDefault = false;
|
|
46903
|
+
this.nameError = null;
|
|
46904
|
+
}
|
|
46905
|
+
ngOnInit() {
|
|
46906
|
+
if (this.initialValue) {
|
|
46907
|
+
this.name = this.initialValue.name ?? '';
|
|
46908
|
+
this.description = this.initialValue.description ?? '';
|
|
46909
|
+
this.color = this.initialValue.color || ENVIRONMENT_ACCENT_COLORS[0];
|
|
46910
|
+
this.isDefault = this.initialValue.isDefault ?? false;
|
|
46911
|
+
}
|
|
46912
|
+
}
|
|
46913
|
+
get title() {
|
|
46914
|
+
return this.mode === 'edit' ? 'Edit environment' : 'New environment';
|
|
46915
|
+
}
|
|
46916
|
+
get subtitle() {
|
|
46917
|
+
return 'Create an environment to scope variables, DB configs, and data profiles.';
|
|
46918
|
+
}
|
|
46919
|
+
get primaryButtonLabel() {
|
|
46920
|
+
return this.mode === 'edit' ? 'Save changes' : 'Create environment';
|
|
46921
|
+
}
|
|
46922
|
+
get nameErrorsArray() {
|
|
46923
|
+
return this.nameError ? [this.nameError] : [];
|
|
46924
|
+
}
|
|
46925
|
+
get defaultHelperText() {
|
|
46926
|
+
if (!this.allowDefaultToggle) {
|
|
46927
|
+
return 'Default promotion is handled from the environment detail page.';
|
|
46928
|
+
}
|
|
46929
|
+
if (this.defaultAlreadySet && !this.isDefault) {
|
|
46930
|
+
return 'Another environment is currently the default. Toggling this on will demote it.';
|
|
46931
|
+
}
|
|
46932
|
+
return 'Test cases without an explicit env selected will resolve against this one.';
|
|
46933
|
+
}
|
|
46934
|
+
onNameChange(next) {
|
|
46935
|
+
this.name = next;
|
|
46936
|
+
this.nameError = null;
|
|
46937
|
+
this.cdr.markForCheck();
|
|
46938
|
+
}
|
|
46939
|
+
onDescriptionChange(next) {
|
|
46940
|
+
this.description = next;
|
|
46941
|
+
this.cdr.markForCheck();
|
|
46942
|
+
}
|
|
46943
|
+
onColorSelect(next) {
|
|
46944
|
+
this.color = next;
|
|
46945
|
+
this.cdr.markForCheck();
|
|
46946
|
+
}
|
|
46947
|
+
onDefaultChange(next) {
|
|
46948
|
+
this.isDefault = next;
|
|
46949
|
+
this.cdr.markForCheck();
|
|
46950
|
+
}
|
|
46951
|
+
/**
|
|
46952
|
+
* Called by the host (via DialogRef.getComponentInstance()) when the primary
|
|
46953
|
+
* button is clicked. Returns the captured value when valid, or null when the
|
|
46954
|
+
* form has errors — host should leave the dialog open.
|
|
46955
|
+
*/
|
|
46956
|
+
getValue() {
|
|
46957
|
+
const trimmedName = this.name.trim();
|
|
46958
|
+
if (!trimmedName) {
|
|
46959
|
+
this.nameError = 'Name is required.';
|
|
46960
|
+
}
|
|
46961
|
+
else if (trimmedName.length < 2) {
|
|
46962
|
+
this.nameError = 'Name must be at least 2 characters.';
|
|
46963
|
+
}
|
|
46964
|
+
else if (this.isDuplicateName(trimmedName)) {
|
|
46965
|
+
this.nameError = 'An environment with this name already exists — names must be unique.';
|
|
46966
|
+
}
|
|
46967
|
+
else {
|
|
46968
|
+
this.nameError = null;
|
|
46969
|
+
}
|
|
46970
|
+
if (this.nameError) {
|
|
46971
|
+
this.cdr.markForCheck();
|
|
46972
|
+
return null;
|
|
46973
|
+
}
|
|
46974
|
+
return {
|
|
46975
|
+
name: trimmedName,
|
|
46976
|
+
description: this.description ? this.description.trim() : null,
|
|
46977
|
+
color: this.color,
|
|
46978
|
+
isDefault: this.allowDefaultToggle ? this.isDefault : false,
|
|
46979
|
+
};
|
|
46980
|
+
}
|
|
46981
|
+
isDuplicateName(candidate) {
|
|
46982
|
+
const existing = (this.existingNames ?? []).map(n => (n ?? '').trim().toLowerCase());
|
|
46983
|
+
const lowered = candidate.toLowerCase();
|
|
46984
|
+
if (this.mode === 'edit') {
|
|
46985
|
+
const original = (this.initialValue?.name ?? '').trim().toLowerCase();
|
|
46986
|
+
return lowered !== original && existing.includes(lowered);
|
|
46987
|
+
}
|
|
46988
|
+
return existing.includes(lowered);
|
|
46989
|
+
}
|
|
46990
|
+
}
|
|
46991
|
+
NewEnvironmentDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
46992
|
+
NewEnvironmentDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewEnvironmentDialogComponent, selector: "cqa-new-environment-dialog", inputs: { mode: "mode", initialValue: "initialValue", existingNames: "existingNames", allowDefaultToggle: "allowDefaultToggle", defaultAlreadySet: "defaultAlreadySet" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Environment name\"\n placeholder=\"e.g. QA, SIT, UAT, Prod, Demo\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n <span *ngIf=\"!nameError\"\n class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Names are user-defined. Be concise \u2014 you'll see this on every test run.\n </span>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What is this environment for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Accent color -->\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-2 cqa-font-medium cqa-text-gray-700\">Accent color</label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngFor=\"let swatch of colors\"\n type=\"button\"\n class=\"cqa-w-7 cqa-h-7 cqa-rounded-lg cqa-cursor-pointer cqa-transition-all\"\n [attr.aria-label]=\"'Select ' + swatch\"\n [attr.aria-pressed]=\"color === swatch\"\n [style.background]=\"swatch\"\n [style.border]=\"color === swatch ? '2px solid #0F172A' : '2px solid transparent'\"\n [style.boxShadow]=\"color === swatch ? '0 0 0 2px rgba(15,23,42,0.12)' : '0 0 0 1px rgba(0,0,0,0.05)'\"\n (click)=\"onColorSelect(swatch)\">\n </button>\n </div>\n </div>\n\n <!-- Make default -->\n <div\n *ngIf=\"allowDefaultToggle\"\n class=\"cqa-flex cqa-items-start cqa-gap-3 cqa-p-3 cqa-rounded-lg cqa-border cqa-border-indigo-100 cqa-bg-indigo-50\">\n <cqa-custom-toggle\n [checked]=\"isDefault\"\n ariaLabel=\"Make default environment\"\n (checkedChange)=\"onDefaultChange($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\">\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">\n Make this the default environment\n </span>\n <span class=\"cqa-text-xs cqa-text-gray-600 cqa-mt-0.5\">\n {{ defaultHelperText }}\n </span>\n </div>\n </div>\n\n</div>\n", components: [{ type: CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
46993
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentDialogComponent, decorators: [{
|
|
46994
|
+
type: Component,
|
|
46995
|
+
args: [{ selector: 'cqa-new-environment-dialog', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Environment name\"\n placeholder=\"e.g. QA, SIT, UAT, Prod, Demo\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n <span *ngIf=\"!nameError\"\n class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Names are user-defined. Be concise \u2014 you'll see this on every test run.\n </span>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What is this environment for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Accent color -->\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-2 cqa-font-medium cqa-text-gray-700\">Accent color</label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngFor=\"let swatch of colors\"\n type=\"button\"\n class=\"cqa-w-7 cqa-h-7 cqa-rounded-lg cqa-cursor-pointer cqa-transition-all\"\n [attr.aria-label]=\"'Select ' + swatch\"\n [attr.aria-pressed]=\"color === swatch\"\n [style.background]=\"swatch\"\n [style.border]=\"color === swatch ? '2px solid #0F172A' : '2px solid transparent'\"\n [style.boxShadow]=\"color === swatch ? '0 0 0 2px rgba(15,23,42,0.12)' : '0 0 0 1px rgba(0,0,0,0.05)'\"\n (click)=\"onColorSelect(swatch)\">\n </button>\n </div>\n </div>\n\n <!-- Make default -->\n <div\n *ngIf=\"allowDefaultToggle\"\n class=\"cqa-flex cqa-items-start cqa-gap-3 cqa-p-3 cqa-rounded-lg cqa-border cqa-border-indigo-100 cqa-bg-indigo-50\">\n <cqa-custom-toggle\n [checked]=\"isDefault\"\n ariaLabel=\"Make default environment\"\n (checkedChange)=\"onDefaultChange($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\">\n <span class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">\n Make this the default environment\n </span>\n <span class=\"cqa-text-xs cqa-text-gray-600 cqa-mt-0.5\">\n {{ defaultHelperText }}\n </span>\n </div>\n </div>\n\n</div>\n" }]
|
|
46996
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
|
|
46997
|
+
type: Input
|
|
46998
|
+
}], initialValue: [{
|
|
46999
|
+
type: Input
|
|
47000
|
+
}], existingNames: [{
|
|
47001
|
+
type: Input
|
|
47002
|
+
}], allowDefaultToggle: [{
|
|
47003
|
+
type: Input
|
|
47004
|
+
}], defaultAlreadySet: [{
|
|
47005
|
+
type: Input
|
|
47006
|
+
}] } });
|
|
47007
|
+
|
|
47008
|
+
class NewEnvironmentVariableDialogComponent {
|
|
47009
|
+
constructor(cdr) {
|
|
47010
|
+
this.cdr = cdr;
|
|
47011
|
+
this.mode = 'create';
|
|
47012
|
+
this.existingNames = [];
|
|
47013
|
+
this.envName = '';
|
|
47014
|
+
this.typeDropdownOptions = [
|
|
47015
|
+
{ label: 'String', value: 'String' },
|
|
47016
|
+
{ label: 'Number', value: 'Number' },
|
|
47017
|
+
{ label: 'Boolean', value: 'Boolean' },
|
|
47018
|
+
{ label: 'Password', value: 'Password' },
|
|
47019
|
+
];
|
|
47020
|
+
this.name = '';
|
|
47021
|
+
this.type = 'String';
|
|
47022
|
+
this.value = '';
|
|
47023
|
+
this.readWriteMode = 'RW';
|
|
47024
|
+
this.passwordTouched = false;
|
|
47025
|
+
this.nameError = null;
|
|
47026
|
+
this.valueError = null;
|
|
47027
|
+
}
|
|
47028
|
+
ngOnInit() {
|
|
47029
|
+
if (this.initialValue) {
|
|
47030
|
+
this.name = this.initialValue.name ?? '';
|
|
47031
|
+
this.type = this.initialValue.type ?? 'String';
|
|
47032
|
+
this.value = this.initialValue.value ?? '';
|
|
47033
|
+
this.readWriteMode = this.initialValue.readWriteMode ?? 'RW';
|
|
47034
|
+
}
|
|
47035
|
+
if (this.type === 'Boolean' && this.value !== 'true' && this.value !== 'false') {
|
|
47036
|
+
this.value = 'false';
|
|
47037
|
+
}
|
|
47038
|
+
if (this.mode === 'edit' && this.type === 'Password') {
|
|
47039
|
+
this.value = '';
|
|
47040
|
+
}
|
|
47041
|
+
}
|
|
47042
|
+
get title() {
|
|
47043
|
+
return this.mode === 'edit' ? 'Edit variable' : 'New variable';
|
|
47044
|
+
}
|
|
47045
|
+
get subtitle() {
|
|
47046
|
+
return this.envName ? `Scoped to the ${this.envName} environment.` : 'Scoped to this environment.';
|
|
47047
|
+
}
|
|
47048
|
+
get primaryButtonLabel() {
|
|
47049
|
+
return this.mode === 'edit' ? 'Save changes' : 'Add variable';
|
|
47050
|
+
}
|
|
47051
|
+
get isBoolean() { return this.type === 'Boolean'; }
|
|
47052
|
+
get isPassword() { return this.type === 'Password'; }
|
|
47053
|
+
get isNumber() { return this.type === 'Number'; }
|
|
47054
|
+
get valuePlaceholder() {
|
|
47055
|
+
if (this.isPassword && this.mode === 'edit') {
|
|
47056
|
+
return '•••••• (leave blank to keep existing)';
|
|
47057
|
+
}
|
|
47058
|
+
if (this.readWriteMode === 'RW') {
|
|
47059
|
+
return 'Leave blank to populate during test execution';
|
|
47060
|
+
}
|
|
47061
|
+
return 'Enter a value';
|
|
47062
|
+
}
|
|
47063
|
+
get nameHelperText() {
|
|
47064
|
+
if (this.nameError) {
|
|
47065
|
+
return this.nameError;
|
|
47066
|
+
}
|
|
47067
|
+
return 'Variable names must be unique within the environment.';
|
|
47068
|
+
}
|
|
47069
|
+
get permissionHelperText() {
|
|
47070
|
+
return this.readWriteMode === 'RO'
|
|
47071
|
+
? 'Read only — test steps can read but not overwrite.'
|
|
47072
|
+
: 'Read/write — test cases can capture values here.';
|
|
47073
|
+
}
|
|
47074
|
+
get nameErrorsArray() { return this.nameError ? [this.nameError] : []; }
|
|
47075
|
+
get valueErrorsArray() { return this.valueError ? [this.valueError] : []; }
|
|
47076
|
+
get booleanDropdownOptions() {
|
|
47077
|
+
return [
|
|
47078
|
+
{ label: 'true', value: 'true' },
|
|
47079
|
+
{ label: 'false', value: 'false' },
|
|
47080
|
+
];
|
|
47081
|
+
}
|
|
47082
|
+
onNameChange(next) {
|
|
47083
|
+
this.name = next;
|
|
47084
|
+
this.nameError = null;
|
|
47085
|
+
this.cdr.markForCheck();
|
|
47086
|
+
}
|
|
47087
|
+
onTypeChange(next) {
|
|
47088
|
+
if (!next) {
|
|
47089
|
+
return;
|
|
47090
|
+
}
|
|
47091
|
+
this.type = next;
|
|
47092
|
+
if (this.type === 'Boolean' && this.value !== 'true' && this.value !== 'false') {
|
|
47093
|
+
this.value = 'false';
|
|
47094
|
+
}
|
|
47095
|
+
if (this.type === 'Password') {
|
|
47096
|
+
this.passwordTouched = false;
|
|
47097
|
+
if (this.mode === 'edit') {
|
|
47098
|
+
this.value = '';
|
|
47099
|
+
}
|
|
47100
|
+
}
|
|
47101
|
+
this.valueError = null;
|
|
47102
|
+
this.cdr.markForCheck();
|
|
47103
|
+
}
|
|
47104
|
+
onPermissionChange(next) {
|
|
47105
|
+
this.readWriteMode = next === 'RO' ? 'RO' : 'RW';
|
|
47106
|
+
this.cdr.markForCheck();
|
|
47107
|
+
}
|
|
47108
|
+
onValueChange(next) {
|
|
47109
|
+
this.value = next;
|
|
47110
|
+
if (this.isPassword) {
|
|
47111
|
+
this.passwordTouched = true;
|
|
47112
|
+
}
|
|
47113
|
+
this.valueError = null;
|
|
47114
|
+
this.cdr.markForCheck();
|
|
47115
|
+
}
|
|
47116
|
+
onBooleanValueChange(next) {
|
|
47117
|
+
this.value = next;
|
|
47118
|
+
this.cdr.markForCheck();
|
|
47119
|
+
}
|
|
47120
|
+
/**
|
|
47121
|
+
* Host reads via DialogRef.getComponentInstance(). Returns null on validation
|
|
47122
|
+
* failure — host keeps the dialog open and surfaces the inline error already
|
|
47123
|
+
* written onto nameError / valueError.
|
|
47124
|
+
*/
|
|
47125
|
+
getValue() {
|
|
47126
|
+
const trimmedName = this.name.trim();
|
|
47127
|
+
if (!trimmedName) {
|
|
47128
|
+
this.nameError = 'Name is required.';
|
|
47129
|
+
}
|
|
47130
|
+
else if (this.isDuplicateName(trimmedName)) {
|
|
47131
|
+
this.nameError = 'A variable with this name already exists in this environment.';
|
|
47132
|
+
}
|
|
47133
|
+
else {
|
|
47134
|
+
this.nameError = null;
|
|
47135
|
+
}
|
|
47136
|
+
if (this.isNumber && this.value && !this.isValidNumber(this.value)) {
|
|
47137
|
+
this.valueError = 'Value must be a number.';
|
|
47138
|
+
}
|
|
47139
|
+
else {
|
|
47140
|
+
this.valueError = null;
|
|
47141
|
+
}
|
|
47142
|
+
if (this.nameError || this.valueError) {
|
|
47143
|
+
this.cdr.markForCheck();
|
|
47144
|
+
return null;
|
|
47145
|
+
}
|
|
47146
|
+
const omitPasswordValue = this.isPassword && this.mode === 'edit' && !this.passwordTouched;
|
|
47147
|
+
return {
|
|
47148
|
+
name: trimmedName,
|
|
47149
|
+
type: this.type,
|
|
47150
|
+
value: omitPasswordValue ? null : this.serializeValue(),
|
|
47151
|
+
readWriteMode: this.readWriteMode,
|
|
47152
|
+
};
|
|
47153
|
+
}
|
|
47154
|
+
serializeValue() {
|
|
47155
|
+
if (this.isBoolean) {
|
|
47156
|
+
return this.value === 'true' ? 'true' : 'false';
|
|
47157
|
+
}
|
|
47158
|
+
return this.value ?? '';
|
|
47159
|
+
}
|
|
47160
|
+
isDuplicateName(candidate) {
|
|
47161
|
+
const existing = (this.existingNames ?? []).map(n => (n ?? '').trim().toLowerCase());
|
|
47162
|
+
const lowered = candidate.toLowerCase();
|
|
47163
|
+
if (this.mode === 'edit') {
|
|
47164
|
+
const original = (this.initialValue?.name ?? '').trim().toLowerCase();
|
|
47165
|
+
return lowered !== original && existing.includes(lowered);
|
|
47166
|
+
}
|
|
47167
|
+
return existing.includes(lowered);
|
|
47168
|
+
}
|
|
47169
|
+
isValidNumber(raw) {
|
|
47170
|
+
const trimmed = raw.trim();
|
|
47171
|
+
if (!trimmed) {
|
|
47172
|
+
return true;
|
|
47173
|
+
}
|
|
47174
|
+
return !Number.isNaN(Number(trimmed));
|
|
47175
|
+
}
|
|
47176
|
+
}
|
|
47177
|
+
NewEnvironmentVariableDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentVariableDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
47178
|
+
NewEnvironmentVariableDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewEnvironmentVariableDialogComponent, selector: "cqa-new-environment-variable-dialog", inputs: { mode: "mode", initialValue: "initialValue", existingNames: "existingNames", envName: "envName" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Name\"\n placeholder=\"e.g. order_id\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n <span *ngIf=\"!nameError\"\n class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n {{ nameHelperText }}\n </span>\n </div>\n\n <!-- Type + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Type</label>\n <cqa-dropdown-button\n [options]=\"typeDropdownOptions\"\n [selectedValue]=\"type\"\n (selectionChange)=\"onTypeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <div class=\"cqa-pt-0.5\">\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n <span class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">{{ permissionHelperText }}</span>\n </div>\n </div>\n\n <!-- Value -->\n <div class=\"cqa-flex cqa-flex-col\">\n <ng-container *ngIf=\"isBoolean; else nonBooleanValue\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Value</label>\n <cqa-dropdown-button\n [options]=\"booleanDropdownOptions\"\n [selectedValue]=\"value\"\n (selectionChange)=\"onBooleanValueChange($event)\">\n </cqa-dropdown-button>\n </ng-container>\n <ng-template #nonBooleanValue>\n <cqa-custom-input\n label=\"Value\"\n [type]=\"isPassword ? 'password' : 'text'\"\n [value]=\"value\"\n [placeholder]=\"valuePlaceholder\"\n [fullWidth]=\"true\"\n [errors]=\"valueErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onValueChange($event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n\n</div>\n", components: [{ type: CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: ["label", "options", "selectedValue", "disabled", "placeholder"], outputs: ["selectionChange", "opened", "closed"] }, { type: PermissionToggleComponent, selector: "cqa-permission-toggle", inputs: ["value", "disabled", "roTooltip", "rwTooltip"], outputs: ["valueChange"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
47179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentVariableDialogComponent, decorators: [{
|
|
47180
|
+
type: Component,
|
|
47181
|
+
args: [{ selector: 'cqa-new-environment-variable-dialog', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Name\"\n placeholder=\"e.g. order_id\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n <span *ngIf=\"!nameError\"\n class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n {{ nameHelperText }}\n </span>\n </div>\n\n <!-- Type + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Type</label>\n <cqa-dropdown-button\n [options]=\"typeDropdownOptions\"\n [selectedValue]=\"type\"\n (selectionChange)=\"onTypeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <div class=\"cqa-pt-0.5\">\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n <span class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">{{ permissionHelperText }}</span>\n </div>\n </div>\n\n <!-- Value -->\n <div class=\"cqa-flex cqa-flex-col\">\n <ng-container *ngIf=\"isBoolean; else nonBooleanValue\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Value</label>\n <cqa-dropdown-button\n [options]=\"booleanDropdownOptions\"\n [selectedValue]=\"value\"\n (selectionChange)=\"onBooleanValueChange($event)\">\n </cqa-dropdown-button>\n </ng-container>\n <ng-template #nonBooleanValue>\n <cqa-custom-input\n label=\"Value\"\n [type]=\"isPassword ? 'password' : 'text'\"\n [value]=\"value\"\n [placeholder]=\"valuePlaceholder\"\n [fullWidth]=\"true\"\n [errors]=\"valueErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onValueChange($event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n\n</div>\n" }]
|
|
47182
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
|
|
47183
|
+
type: Input
|
|
47184
|
+
}], initialValue: [{
|
|
47185
|
+
type: Input
|
|
47186
|
+
}], existingNames: [{
|
|
47187
|
+
type: Input
|
|
47188
|
+
}], envName: [{
|
|
47189
|
+
type: Input
|
|
47190
|
+
}] } });
|
|
47191
|
+
|
|
47192
|
+
class NewTestDataProfileDialogComponent {
|
|
47193
|
+
constructor(cdr) {
|
|
47194
|
+
this.cdr = cdr;
|
|
47195
|
+
this.mode = 'create';
|
|
47196
|
+
this.existingNames = [];
|
|
47197
|
+
this.environments = [];
|
|
47198
|
+
this.lockedColumns = [];
|
|
47199
|
+
this.name = '';
|
|
47200
|
+
this.description = '';
|
|
47201
|
+
this.readWriteMode = 'RW';
|
|
47202
|
+
this.columns = ['col_1'];
|
|
47203
|
+
this.envForm = new FormGroup({
|
|
47204
|
+
environmentIds: new FormControl([]),
|
|
47205
|
+
});
|
|
47206
|
+
this.envConfig = this.buildEnvConfig([]);
|
|
47207
|
+
this.nameError = null;
|
|
47208
|
+
this.columnsError = null;
|
|
47209
|
+
this.envsError = null;
|
|
47210
|
+
this.trackByIndex = (_, __) => _;
|
|
47211
|
+
}
|
|
47212
|
+
ngOnInit() {
|
|
47213
|
+
if (this.initialValue) {
|
|
47214
|
+
this.name = this.initialValue.name ?? '';
|
|
47215
|
+
this.description = this.initialValue.description ?? '';
|
|
47216
|
+
this.readWriteMode = this.initialValue.readWriteMode ?? 'RW';
|
|
47217
|
+
this.columns = (this.initialValue.columns && this.initialValue.columns.length)
|
|
47218
|
+
? [...this.initialValue.columns]
|
|
47219
|
+
: ['col_1'];
|
|
47220
|
+
const ids = this.initialValue.environmentIds ?? [];
|
|
47221
|
+
this.envForm.get('environmentIds').setValue(ids);
|
|
47222
|
+
}
|
|
47223
|
+
this.envConfig = this.buildEnvConfig(this.environments ?? []);
|
|
47224
|
+
// Clear envs error as soon as the user picks something.
|
|
47225
|
+
this.envForm.get('environmentIds').valueChanges.subscribe(() => {
|
|
47226
|
+
if (this.envsError) {
|
|
47227
|
+
this.envsError = null;
|
|
47228
|
+
this.cdr.markForCheck();
|
|
47229
|
+
}
|
|
47230
|
+
});
|
|
47231
|
+
}
|
|
47232
|
+
get title() {
|
|
47233
|
+
return this.mode === 'edit' ? 'Edit test data profile' : 'New test data profile';
|
|
47234
|
+
}
|
|
47235
|
+
get subtitle() {
|
|
47236
|
+
return 'Define columns; data values can be added per environment after creation.';
|
|
47237
|
+
}
|
|
47238
|
+
get primaryButtonLabel() {
|
|
47239
|
+
return this.mode === 'edit' ? 'Save changes' : 'Create profile';
|
|
47240
|
+
}
|
|
47241
|
+
get nameErrorsArray() { return this.nameError ? [this.nameError] : []; }
|
|
47242
|
+
get canAddColumn() { return true; }
|
|
47243
|
+
get selectedEnvIds() {
|
|
47244
|
+
const val = this.envForm.get('environmentIds').value ?? [];
|
|
47245
|
+
return Array.isArray(val) ? val : [];
|
|
47246
|
+
}
|
|
47247
|
+
onNameChange(next) {
|
|
47248
|
+
this.name = next;
|
|
47249
|
+
this.nameError = null;
|
|
47250
|
+
this.cdr.markForCheck();
|
|
47251
|
+
}
|
|
47252
|
+
onDescriptionChange(next) {
|
|
47253
|
+
this.description = next;
|
|
47254
|
+
this.cdr.markForCheck();
|
|
47255
|
+
}
|
|
47256
|
+
onPermissionChange(next) {
|
|
47257
|
+
this.readWriteMode = next === 'RO' ? 'RO' : 'RW';
|
|
47258
|
+
this.cdr.markForCheck();
|
|
47259
|
+
}
|
|
47260
|
+
onColumnChange(index, value) {
|
|
47261
|
+
const next = [...this.columns];
|
|
47262
|
+
next[index] = value;
|
|
47263
|
+
this.columns = next;
|
|
47264
|
+
this.columnsError = null;
|
|
47265
|
+
this.cdr.markForCheck();
|
|
47266
|
+
}
|
|
47267
|
+
onAddColumn() {
|
|
47268
|
+
this.columns = [...this.columns, `col_${this.columns.length + 1}`];
|
|
47269
|
+
this.cdr.markForCheck();
|
|
47270
|
+
}
|
|
47271
|
+
onRemoveColumn(index) {
|
|
47272
|
+
if (this.columns.length <= 1) {
|
|
47273
|
+
return;
|
|
47274
|
+
}
|
|
47275
|
+
const target = this.columns[index];
|
|
47276
|
+
if (this.lockedColumns && this.lockedColumns.indexOf(target) !== -1) {
|
|
47277
|
+
return;
|
|
47278
|
+
}
|
|
47279
|
+
this.columns = this.columns.filter((_, i) => i !== index);
|
|
47280
|
+
this.cdr.markForCheck();
|
|
47281
|
+
}
|
|
47282
|
+
isColumnLocked(col) {
|
|
47283
|
+
return !!(this.lockedColumns && this.lockedColumns.indexOf(col) !== -1);
|
|
47284
|
+
}
|
|
47285
|
+
getValue() {
|
|
47286
|
+
const trimmedName = this.name.trim();
|
|
47287
|
+
if (!trimmedName) {
|
|
47288
|
+
this.nameError = 'Name is required.';
|
|
47289
|
+
}
|
|
47290
|
+
else if (this.isDuplicateName(trimmedName)) {
|
|
47291
|
+
this.nameError = 'A profile with this name already exists.';
|
|
47292
|
+
}
|
|
47293
|
+
else {
|
|
47294
|
+
this.nameError = null;
|
|
47295
|
+
}
|
|
47296
|
+
const trimmedCols = this.columns.map(c => (c ?? '').trim()).filter(c => c.length > 0);
|
|
47297
|
+
const unique = new Set(trimmedCols);
|
|
47298
|
+
if (trimmedCols.length === 0) {
|
|
47299
|
+
this.columnsError = 'At least one column is required.';
|
|
47300
|
+
}
|
|
47301
|
+
else if (unique.size !== trimmedCols.length) {
|
|
47302
|
+
this.columnsError = 'Column names must be unique.';
|
|
47303
|
+
}
|
|
47304
|
+
else {
|
|
47305
|
+
this.columnsError = null;
|
|
47306
|
+
}
|
|
47307
|
+
const envIds = this.selectedEnvIds;
|
|
47308
|
+
if (!envIds || envIds.length === 0) {
|
|
47309
|
+
this.envsError = 'Select at least one environment to assign this profile to.';
|
|
47310
|
+
}
|
|
47311
|
+
else {
|
|
47312
|
+
this.envsError = null;
|
|
47313
|
+
}
|
|
47314
|
+
if (this.nameError || this.columnsError || this.envsError) {
|
|
47315
|
+
this.cdr.markForCheck();
|
|
47316
|
+
return null;
|
|
47317
|
+
}
|
|
47318
|
+
return {
|
|
47319
|
+
name: trimmedName,
|
|
47320
|
+
description: this.description.trim() || null,
|
|
47321
|
+
readWriteMode: this.readWriteMode,
|
|
47322
|
+
columns: trimmedCols,
|
|
47323
|
+
environmentIds: this.selectedEnvIds,
|
|
47324
|
+
};
|
|
47325
|
+
}
|
|
47326
|
+
buildEnvConfig(envs) {
|
|
47327
|
+
const options = (envs || []).map(e => ({
|
|
47328
|
+
id: e.id,
|
|
47329
|
+
value: e.id,
|
|
47330
|
+
name: e.name,
|
|
47331
|
+
label: e.name,
|
|
47332
|
+
statusColor: e.color,
|
|
47333
|
+
}));
|
|
47334
|
+
return {
|
|
47335
|
+
key: 'environmentIds',
|
|
47336
|
+
label: '',
|
|
47337
|
+
placeholder: 'Select environments…',
|
|
47338
|
+
multiple: true,
|
|
47339
|
+
searchable: true,
|
|
47340
|
+
optionStyle: 'checkbox',
|
|
47341
|
+
showSelectAll: false,
|
|
47342
|
+
options,
|
|
47343
|
+
};
|
|
47344
|
+
}
|
|
47345
|
+
isDuplicateName(candidate) {
|
|
47346
|
+
const existing = (this.existingNames ?? []).map(n => (n ?? '').trim().toLowerCase());
|
|
47347
|
+
const lowered = candidate.toLowerCase();
|
|
47348
|
+
if (this.mode === 'edit') {
|
|
47349
|
+
const original = (this.initialValue?.name ?? '').trim().toLowerCase();
|
|
47350
|
+
return lowered !== original && existing.includes(lowered);
|
|
47351
|
+
}
|
|
47352
|
+
return existing.includes(lowered);
|
|
47353
|
+
}
|
|
47354
|
+
}
|
|
47355
|
+
NewTestDataProfileDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewTestDataProfileDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
47356
|
+
NewTestDataProfileDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewTestDataProfileDialogComponent, selector: "cqa-new-test-data-profile-dialog", inputs: { mode: "mode", initialValue: "initialValue", existingNames: "existingNames", environments: "environments", lockedColumns: "lockedColumns" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-[1fr_auto] cqa-gap-4 cqa-items-start\">\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Profile name\"\n placeholder=\"e.g. Guest Personas\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What data is this profile for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Columns -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">Columns</label>\n <div *ngFor=\"let col of columns; let i = index; trackBy: trackByIndex\"\n class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-input\n [value]=\"col\"\n [placeholder]=\"'column_' + (i + 1)\"\n [fullWidth]=\"true\"\n [disabled]=\"isColumnLocked(col)\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onColumnChange(i, $event)\">\n </cqa-custom-input>\n <cqa-button\n variant=\"text\"\n btnSize=\"sm\"\n icon=\"delete\"\n tooltip=\"Remove column\"\n [disabled]=\"columns.length <= 1 || isColumnLocked(col)\"\n (clicked)=\"onRemoveColumn(i)\">\n </cqa-button>\n </div>\n <div>\n <cqa-button\n variant=\"text\"\n btnSize=\"sm\"\n icon=\"add\"\n text=\"Add column\"\n (clicked)=\"onAddColumn()\">\n </cqa-button>\n </div>\n <span *ngIf=\"columnsError\" class=\"cqa-text-xs cqa-text-red-600\">{{ columnsError }}</span>\n </div>\n\n <!-- Assign to environments -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n Assign to environments <span class=\"cqa-text-red-600\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"envForm\"\n [config]=\"envConfig\">\n </cqa-dynamic-select>\n <span *ngIf=\"envsError\" class=\"cqa-text-xs cqa-text-red-600\">{{ envsError }}</span>\n <span *ngIf=\"!envsError\" class=\"cqa-text-xs cqa-text-gray-500\">\n Each environment gets an independent copy of the data (same columns, separate rows).\n </span>\n </div>\n\n</div>\n", components: [{ type: CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: PermissionToggleComponent, selector: "cqa-permission-toggle", inputs: ["value", "disabled", "roTooltip", "rwTooltip"], outputs: ["valueChange"] }, { type: ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
47357
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewTestDataProfileDialogComponent, decorators: [{
|
|
47358
|
+
type: Component,
|
|
47359
|
+
args: [{ selector: 'cqa-new-test-data-profile-dialog', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name + Permission -->\n <div class=\"cqa-grid cqa-grid-cols-[1fr_auto] cqa-gap-4 cqa-items-start\">\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Profile name\"\n placeholder=\"e.g. Guest Personas\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Description\"\n placeholder=\"What data is this profile for?\"\n type=\"text\"\n [value]=\"description\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Columns -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">Columns</label>\n <div *ngFor=\"let col of columns; let i = index; trackBy: trackByIndex\"\n class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-input\n [value]=\"col\"\n [placeholder]=\"'column_' + (i + 1)\"\n [fullWidth]=\"true\"\n [disabled]=\"isColumnLocked(col)\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onColumnChange(i, $event)\">\n </cqa-custom-input>\n <cqa-button\n variant=\"text\"\n btnSize=\"sm\"\n icon=\"delete\"\n tooltip=\"Remove column\"\n [disabled]=\"columns.length <= 1 || isColumnLocked(col)\"\n (clicked)=\"onRemoveColumn(i)\">\n </cqa-button>\n </div>\n <div>\n <cqa-button\n variant=\"text\"\n btnSize=\"sm\"\n icon=\"add\"\n text=\"Add column\"\n (clicked)=\"onAddColumn()\">\n </cqa-button>\n </div>\n <span *ngIf=\"columnsError\" class=\"cqa-text-xs cqa-text-red-600\">{{ columnsError }}</span>\n </div>\n\n <!-- Assign to environments -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n Assign to environments <span class=\"cqa-text-red-600\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"envForm\"\n [config]=\"envConfig\">\n </cqa-dynamic-select>\n <span *ngIf=\"envsError\" class=\"cqa-text-xs cqa-text-red-600\">{{ envsError }}</span>\n <span *ngIf=\"!envsError\" class=\"cqa-text-xs cqa-text-gray-500\">\n Each environment gets an independent copy of the data (same columns, separate rows).\n </span>\n </div>\n\n</div>\n" }]
|
|
47360
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
|
|
47361
|
+
type: Input
|
|
47362
|
+
}], initialValue: [{
|
|
47363
|
+
type: Input
|
|
47364
|
+
}], existingNames: [{
|
|
47365
|
+
type: Input
|
|
47366
|
+
}], environments: [{
|
|
47367
|
+
type: Input
|
|
47368
|
+
}], lockedColumns: [{
|
|
47369
|
+
type: Input
|
|
47370
|
+
}] } });
|
|
47371
|
+
|
|
47372
|
+
class AssignEnvironmentsDialogComponent {
|
|
47373
|
+
constructor(cdr) {
|
|
47374
|
+
this.cdr = cdr;
|
|
47375
|
+
this.mode = 'assign';
|
|
47376
|
+
this.profileName = '';
|
|
47377
|
+
this.environments = [];
|
|
47378
|
+
this.assignedEnvironments = [];
|
|
47379
|
+
this.selected = new Set();
|
|
47380
|
+
this.sourceForm = new FormGroup({
|
|
47381
|
+
sourceEnvId: new FormControl(null),
|
|
47382
|
+
});
|
|
47383
|
+
this.sourceConfig = this.buildSourceConfig([]);
|
|
47384
|
+
this.sourceError = null;
|
|
47385
|
+
}
|
|
47386
|
+
ngOnInit() {
|
|
47387
|
+
// Source picker appears in both modes when there are already-attached envs
|
|
47388
|
+
// to copy from. In clone mode it's required; in assign mode it's optional
|
|
47389
|
+
// (falling back to the base profile rows when no source is picked).
|
|
47390
|
+
if (this.showSourcePicker) {
|
|
47391
|
+
const initial = this.defaultSourceEnvId != null
|
|
47392
|
+
? this.defaultSourceEnvId
|
|
47393
|
+
: (this.mode === 'clone' && this.assignedEnvironments && this.assignedEnvironments.length
|
|
47394
|
+
? this.assignedEnvironments[0].id
|
|
47395
|
+
: null);
|
|
47396
|
+
this.sourceForm.get('sourceEnvId').setValue(initial);
|
|
47397
|
+
this.sourceConfig = this.buildSourceConfig(this.assignedEnvironments ?? []);
|
|
47398
|
+
}
|
|
47399
|
+
}
|
|
47400
|
+
get showSourcePicker() {
|
|
47401
|
+
return (this.assignedEnvironments && this.assignedEnvironments.length > 0);
|
|
47402
|
+
}
|
|
47403
|
+
get sourceLabel() {
|
|
47404
|
+
return this.mode === 'clone' ? 'Copy from which environment' : 'Copy rows from (optional)';
|
|
47405
|
+
}
|
|
47406
|
+
get sourceHelper() {
|
|
47407
|
+
if (this.sourceError) {
|
|
47408
|
+
return this.sourceError;
|
|
47409
|
+
}
|
|
47410
|
+
return this.mode === 'clone'
|
|
47411
|
+
? "The selected environment's rows will be copied into each target environment below."
|
|
47412
|
+
: 'Pick an environment to copy its rows into the new ones. Leave blank to seed with the base profile rows.';
|
|
47413
|
+
}
|
|
47414
|
+
get title() {
|
|
47415
|
+
return this.mode === 'clone' ? 'Clone to other environments' : 'Assign to environments';
|
|
47416
|
+
}
|
|
47417
|
+
get subtitle() {
|
|
47418
|
+
const name = this.profileName ? `"${this.profileName}"` : 'this profile';
|
|
47419
|
+
return this.mode === 'clone'
|
|
47420
|
+
? `Duplicate ${name} into other environments. Column structure is shared; row values are independent per environment.`
|
|
47421
|
+
: `Make ${name} available in the selected environments. Columns are shared — each environment gets an independent row set.`;
|
|
47422
|
+
}
|
|
47423
|
+
get primaryButtonLabel() {
|
|
47424
|
+
const count = this.selected.size;
|
|
47425
|
+
const verb = this.mode === 'clone' ? 'Clone to' : 'Assign to';
|
|
47426
|
+
return `${verb} ${count} environment${count === 1 ? '' : 's'}`;
|
|
47427
|
+
}
|
|
47428
|
+
get primaryDisabled() {
|
|
47429
|
+
if (this.selected.size === 0) {
|
|
47430
|
+
return true;
|
|
47431
|
+
}
|
|
47432
|
+
if (this.mode === 'clone' && this.sourceForm.get('sourceEnvId').value == null) {
|
|
47433
|
+
return true;
|
|
47434
|
+
}
|
|
47435
|
+
return false;
|
|
47436
|
+
}
|
|
47437
|
+
get selectableEnvironments() {
|
|
47438
|
+
return this.environments ?? [];
|
|
47439
|
+
}
|
|
47440
|
+
get hasAnySelectable() {
|
|
47441
|
+
return (this.environments ?? []).some(e => !e.alreadyAssigned);
|
|
47442
|
+
}
|
|
47443
|
+
get sourceValue() {
|
|
47444
|
+
return this.sourceForm.get('sourceEnvId').value ?? null;
|
|
47445
|
+
}
|
|
47446
|
+
isSelected(id) {
|
|
47447
|
+
return this.selected.has(id);
|
|
47448
|
+
}
|
|
47449
|
+
toggle(env) {
|
|
47450
|
+
if (env.alreadyAssigned) {
|
|
47451
|
+
return;
|
|
47452
|
+
}
|
|
47453
|
+
if (this.selected.has(env.id)) {
|
|
47454
|
+
this.selected.delete(env.id);
|
|
47455
|
+
}
|
|
47456
|
+
else {
|
|
47457
|
+
this.selected.add(env.id);
|
|
47458
|
+
}
|
|
47459
|
+
this.cdr.markForCheck();
|
|
47460
|
+
}
|
|
47461
|
+
helperFor(env) {
|
|
47462
|
+
if (env.alreadyAssigned) {
|
|
47463
|
+
return 'Already assigned to this environment';
|
|
47464
|
+
}
|
|
47465
|
+
return env.description || '';
|
|
47466
|
+
}
|
|
47467
|
+
getValue() {
|
|
47468
|
+
if (this.selected.size === 0) {
|
|
47469
|
+
return null;
|
|
47470
|
+
}
|
|
47471
|
+
const src = this.sourceValue;
|
|
47472
|
+
if (this.mode === 'clone') {
|
|
47473
|
+
if (src == null) {
|
|
47474
|
+
this.sourceError = 'Pick the environment whose rows should be copied.';
|
|
47475
|
+
this.cdr.markForCheck();
|
|
47476
|
+
return null;
|
|
47477
|
+
}
|
|
47478
|
+
this.sourceError = null;
|
|
47479
|
+
return { selectedIds: Array.from(this.selected), sourceEnvId: Number(src) };
|
|
47480
|
+
}
|
|
47481
|
+
// Assign mode: source is optional — include it when the user picked one.
|
|
47482
|
+
this.sourceError = null;
|
|
47483
|
+
return src != null
|
|
47484
|
+
? { selectedIds: Array.from(this.selected), sourceEnvId: Number(src) }
|
|
47485
|
+
: { selectedIds: Array.from(this.selected) };
|
|
47486
|
+
}
|
|
47487
|
+
buildSourceConfig(envs) {
|
|
47488
|
+
const options = (envs || []).map(e => ({
|
|
47489
|
+
id: e.id,
|
|
47490
|
+
value: e.id,
|
|
47491
|
+
name: e.name,
|
|
47492
|
+
label: e.name,
|
|
47493
|
+
statusColor: e.color,
|
|
47494
|
+
}));
|
|
47495
|
+
return {
|
|
47496
|
+
key: 'sourceEnvId',
|
|
47497
|
+
label: '',
|
|
47498
|
+
placeholder: 'Select source environment…',
|
|
47499
|
+
multiple: false,
|
|
47500
|
+
searchable: true,
|
|
47501
|
+
options,
|
|
47502
|
+
};
|
|
47503
|
+
}
|
|
47504
|
+
}
|
|
47505
|
+
AssignEnvironmentsDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AssignEnvironmentsDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
47506
|
+
AssignEnvironmentsDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AssignEnvironmentsDialogComponent, selector: "cqa-assign-environments-dialog", inputs: { mode: "mode", profileName: "profileName", environments: "environments", assignedEnvironments: "assignedEnvironments", defaultSourceEnvId: "defaultSourceEnvId" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Source env picker: required in clone mode, optional in assign mode -->\n <div *ngIf=\"showSourcePicker\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">{{ sourceLabel }}</label>\n <cqa-dynamic-select\n [form]=\"sourceForm\"\n [config]=\"sourceConfig\">\n </cqa-dynamic-select>\n <span [class.cqa-text-red-600]=\"sourceError\" [class.cqa-text-gray-500]=\"!sourceError\" class=\"cqa-text-xs\">\n {{ sourceHelper }}\n </span>\n </div>\n\n <!-- Selectable envs -->\n <div\n *ngIf=\"hasAnySelectable || (environments?.length || 0) > 0\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[340px] cqa-overflow-y-auto\">\n <label\n *ngFor=\"let env of selectableEnvironments\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-border cqa-rounded-[10px] cqa-bg-white cqa-transition-colors\"\n [class.cqa-border-gray-200]=\"!isSelected(env.id) && !env.alreadyAssigned\"\n [class.hover:cqa-border-indigo-200]=\"!env.alreadyAssigned && !isSelected(env.id)\"\n [class.cqa-border-indigo-400]=\"isSelected(env.id)\"\n [class.cqa-bg-indigo-50]=\"isSelected(env.id)\"\n [class.cqa-opacity-50]=\"env.alreadyAssigned\"\n [class.cqa-cursor-pointer]=\"!env.alreadyAssigned\"\n [class.cqa-cursor-not-allowed]=\"env.alreadyAssigned\"\n (click)=\"toggle(env)\">\n <input\n type=\"checkbox\"\n class=\"cqa-w-4 cqa-h-4 cqa-cursor-pointer\"\n [checked]=\"isSelected(env.id)\"\n [disabled]=\"!!env.alreadyAssigned\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggle(env)\" />\n\n <span\n class=\"cqa-inline-block cqa-w-2 cqa-h-2 cqa-rounded-full cqa-flex-none\"\n [style.background]=\"env.color || '#3F43EE'\"></span>\n\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0 cqa-flex-1\">\n <div class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">{{ env.name }}</div>\n <div *ngIf=\"helperFor(env)\" class=\"cqa-text-xs cqa-text-gray-500 cqa-leading-[1.4]\">{{ helperFor(env) }}</div>\n </div>\n </label>\n </div>\n\n <div\n *ngIf=\"(environments?.length || 0) === 0\"\n class=\"cqa-py-8 cqa-px-4 cqa-text-center cqa-text-sm cqa-text-gray-500\">\n All environments are already assigned to this profile.\n </div>\n</div>\n", components: [{ type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
47507
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AssignEnvironmentsDialogComponent, decorators: [{
|
|
47508
|
+
type: Component,
|
|
47509
|
+
args: [{ selector: 'cqa-assign-environments-dialog', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Source env picker: required in clone mode, optional in assign mode -->\n <div *ngIf=\"showSourcePicker\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">{{ sourceLabel }}</label>\n <cqa-dynamic-select\n [form]=\"sourceForm\"\n [config]=\"sourceConfig\">\n </cqa-dynamic-select>\n <span [class.cqa-text-red-600]=\"sourceError\" [class.cqa-text-gray-500]=\"!sourceError\" class=\"cqa-text-xs\">\n {{ sourceHelper }}\n </span>\n </div>\n\n <!-- Selectable envs -->\n <div\n *ngIf=\"hasAnySelectable || (environments?.length || 0) > 0\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[340px] cqa-overflow-y-auto\">\n <label\n *ngFor=\"let env of selectableEnvironments\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-border cqa-rounded-[10px] cqa-bg-white cqa-transition-colors\"\n [class.cqa-border-gray-200]=\"!isSelected(env.id) && !env.alreadyAssigned\"\n [class.hover:cqa-border-indigo-200]=\"!env.alreadyAssigned && !isSelected(env.id)\"\n [class.cqa-border-indigo-400]=\"isSelected(env.id)\"\n [class.cqa-bg-indigo-50]=\"isSelected(env.id)\"\n [class.cqa-opacity-50]=\"env.alreadyAssigned\"\n [class.cqa-cursor-pointer]=\"!env.alreadyAssigned\"\n [class.cqa-cursor-not-allowed]=\"env.alreadyAssigned\"\n (click)=\"toggle(env)\">\n <input\n type=\"checkbox\"\n class=\"cqa-w-4 cqa-h-4 cqa-cursor-pointer\"\n [checked]=\"isSelected(env.id)\"\n [disabled]=\"!!env.alreadyAssigned\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggle(env)\" />\n\n <span\n class=\"cqa-inline-block cqa-w-2 cqa-h-2 cqa-rounded-full cqa-flex-none\"\n [style.background]=\"env.color || '#3F43EE'\"></span>\n\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0 cqa-flex-1\">\n <div class=\"cqa-text-sm cqa-font-medium cqa-text-gray-900\">{{ env.name }}</div>\n <div *ngIf=\"helperFor(env)\" class=\"cqa-text-xs cqa-text-gray-500 cqa-leading-[1.4]\">{{ helperFor(env) }}</div>\n </div>\n </label>\n </div>\n\n <div\n *ngIf=\"(environments?.length || 0) === 0\"\n class=\"cqa-py-8 cqa-px-4 cqa-text-center cqa-text-sm cqa-text-gray-500\">\n All environments are already assigned to this profile.\n </div>\n</div>\n" }]
|
|
47510
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
|
|
47511
|
+
type: Input
|
|
47512
|
+
}], profileName: [{
|
|
47513
|
+
type: Input
|
|
47514
|
+
}], environments: [{
|
|
47515
|
+
type: Input
|
|
47516
|
+
}], assignedEnvironments: [{
|
|
47517
|
+
type: Input
|
|
47518
|
+
}], defaultSourceEnvId: [{
|
|
47519
|
+
type: Input
|
|
47520
|
+
}] } });
|
|
47521
|
+
|
|
46882
47522
|
class UiKitModule {
|
|
46883
47523
|
constructor(iconRegistry) {
|
|
46884
47524
|
iconRegistry.registerFontClassAlias('material-symbols-outlined', 'material-symbols-outlined');
|
|
@@ -46975,6 +47615,10 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
|
|
|
46975
47615
|
CaptureVideoDialogComponent,
|
|
46976
47616
|
SubStepsConfirmationDialogComponent,
|
|
46977
47617
|
NewGlobalVariableDialogComponent,
|
|
47618
|
+
NewEnvironmentDialogComponent,
|
|
47619
|
+
NewEnvironmentVariableDialogComponent,
|
|
47620
|
+
NewTestDataProfileDialogComponent,
|
|
47621
|
+
AssignEnvironmentsDialogComponent,
|
|
46978
47622
|
PermissionToggleComponent,
|
|
46979
47623
|
ExportCodeModalComponent,
|
|
46980
47624
|
ProgressIndicatorComponent,
|
|
@@ -47153,6 +47797,10 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
|
|
|
47153
47797
|
CaptureVideoDialogComponent,
|
|
47154
47798
|
SubStepsConfirmationDialogComponent,
|
|
47155
47799
|
NewGlobalVariableDialogComponent,
|
|
47800
|
+
NewEnvironmentDialogComponent,
|
|
47801
|
+
NewEnvironmentVariableDialogComponent,
|
|
47802
|
+
NewTestDataProfileDialogComponent,
|
|
47803
|
+
AssignEnvironmentsDialogComponent,
|
|
47156
47804
|
PermissionToggleComponent,
|
|
47157
47805
|
ExportCodeModalComponent,
|
|
47158
47806
|
ProgressIndicatorComponent,
|
|
@@ -47376,6 +48024,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
47376
48024
|
CaptureVideoDialogComponent,
|
|
47377
48025
|
SubStepsConfirmationDialogComponent,
|
|
47378
48026
|
NewGlobalVariableDialogComponent,
|
|
48027
|
+
NewEnvironmentDialogComponent,
|
|
48028
|
+
NewEnvironmentVariableDialogComponent,
|
|
48029
|
+
NewTestDataProfileDialogComponent,
|
|
48030
|
+
AssignEnvironmentsDialogComponent,
|
|
47379
48031
|
PermissionToggleComponent,
|
|
47380
48032
|
ExportCodeModalComponent,
|
|
47381
48033
|
ProgressIndicatorComponent,
|
|
@@ -47560,6 +48212,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
47560
48212
|
CaptureVideoDialogComponent,
|
|
47561
48213
|
SubStepsConfirmationDialogComponent,
|
|
47562
48214
|
NewGlobalVariableDialogComponent,
|
|
48215
|
+
NewEnvironmentDialogComponent,
|
|
48216
|
+
NewEnvironmentVariableDialogComponent,
|
|
48217
|
+
NewTestDataProfileDialogComponent,
|
|
48218
|
+
AssignEnvironmentsDialogComponent,
|
|
47563
48219
|
PermissionToggleComponent,
|
|
47564
48220
|
ExportCodeModalComponent,
|
|
47565
48221
|
ProgressIndicatorComponent,
|
|
@@ -48391,5 +49047,5 @@ function buildTestCaseDetailsFromApi(data, options) {
|
|
|
48391
49047
|
* Generated bundle index. Do not edit.
|
|
48392
49048
|
*/
|
|
48393
49049
|
|
|
48394
|
-
export { ADVANCED_SUBFIELDS_BY_TYPE, ADVANCED_TOGGLE_KEYS, AIActionStepComponent, AIAgentStepComponent, API_EDIT_STEP_LABELS, ActionMenuButtonComponent, AddPrerequisiteCasesSectionComponent, AdvancedVariablesFormComponent, AiDebugAlertComponent, AiLogsWithReasoningComponent, AiPromptCardComponent, AiReasoningComponent, ApiEditStepComponent, ApiMockingCardComponent, ApiStepComponent, AutocompleteComponent, BadgeComponent, BasicStepComponent, BreakpointsModalComponent, ButtonComponent, CUSTOM_EDIT_STEP_DATA, CUSTOM_EDIT_STEP_EDIT_IN_DEPTH, CUSTOM_EDIT_STEP_REF, CUSTOM_ELEMENT_POPUP_REF, CaptureVideoDialogComponent, ChangeHistoryComponent, ChartCardComponent, CodeEditorComponent, ColumnVisibilityComponent, CompareRunsComponent, ConditionBranchEditorComponent, ConditionDebugStepComponent, 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, ElementFormComponent, ElementListComponent, ElementPopupComponent, ElementPopupRef, ElementPopupService, EmptyStateComponent, ErrorModalComponent, ExecutionResultModalComponent, ExportCodeModalComponent, FailedStepCardComponent, FailedStepComponent, FailedTestCasesCardComponent, FileDownloadStepComponent, FileUploadComponent, FullTableLoaderComponent, HeatErrorMapCellComponent, InsightCardComponent, ItemListComponent, IterationsLoopComponent, JumpToStepModalComponent, LiveConversationComponent, LiveExecutionStepComponent, LoopStepComponent, MONACO_LANGUAGE_MAP, MainStepCollapseComponent, MetricsCardComponent, MixedVariableInputComponent, NetworkRequestComponent, NewGlobalVariableDialogComponent, NewVersionHistoryDetailComponent, OtherButtonComponent, PRIORITY_COLORS, PaginationComponent, PermissionToggleComponent, ProgressIndicatorComponent, ProgressTextCardComponent, QuestionnaireListComponent, RESULT_COLORS, RadioCardGroupComponent, RecordingBannerComponent, ReviewRecordedStepsModalComponent, RunExecutionAlertComponent, RunHistoryCardComponent, STATUS_COLORS, STEP_DETAILS_DRAWER_DATA, STEP_DETAILS_DRAWER_REF, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, STEP_DETAILS_MODAL_DATA, STEP_DETAILS_MODAL_REF, SearchBarComponent, SegmentControlComponent, SelectedFiltersComponent, SelfHealAnalysisComponent, SessionChangesModalComponent, SessionRestorationDialogComponent, SimulatorComponent, StepBuilderActionComponent, StepBuilderAiAgentComponent, StepBuilderConditionComponent, StepBuilderCustomCodeComponent, StepBuilderDatabaseComponent, StepBuilderDocumentComponent, StepBuilderDocumentGenerationTemplateStepComponent, StepBuilderGroupComponent, StepBuilderLoopComponent, StepBuilderRecordStepComponent, StepDetailsDrawerComponent, StepDetailsDrawerRef, StepDetailsDrawerService, StepDetailsModalComponent, StepDetailsModalRef, StepDetailsModalService, StepGroupComponent, StepProgressCardComponent, StepRendererComponent, StepStatusCardComponent, StepTypes, StepperComponent, SubStepsConfirmationDialogComponent, 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, TestCaseLinkCellComponent, TestCaseLoopStepComponent, TestCaseNormalStepComponent, TestCaseRestoreSessionStepComponent, TestCaseScreenshotStepComponent, TestCaseScrollStepComponent, TestCaseStepGroupComponent, TestCaseUploadStepComponent, TestCaseVerifyUrlStepComponent, TestDataModalComponent, TestDataModalRef, TestDataModalService, TestDistributionCardComponent, UiKitModule, UpdatedFailedStepComponent, VersionHistoryCompareComponent, VersionHistoryDetailComponent, VersionHistoryListComponent, VersionHistoryRestoreConfirmComponent, ViewCompareButtonComponent, ViewMoreFailedStepButtonComponent, VisualComparisonComponent, VisualDifferenceModalComponent, WorkspaceSelectorComponent, buildTestCaseDetailsFromApi, getDynamicFieldsFromLegacyConfig, getEmptyStatePreset, getMetadataColor, getMetadataValueStyle, getStepDetailsStepType, humanizeVariableKey, isAiAgentStepConfig, isAiVerifyStepConfig, isApiStepConfig, isConditionStepConfig, isCustomCodeStepConfig, isDatabaseStepConfig, isLoopStepConfig, isNormalStepConfig, isRestoreSessionStepConfig, isScreenshotStepConfig, isScrollStepConfig, isStepGroupConfig, isUploadStepConfig, isVerifyUrlStepConfig, mapApiVariablesToDynamicFields };
|
|
49050
|
+
export { ADVANCED_SUBFIELDS_BY_TYPE, ADVANCED_TOGGLE_KEYS, AIActionStepComponent, AIAgentStepComponent, API_EDIT_STEP_LABELS, ActionMenuButtonComponent, AddPrerequisiteCasesSectionComponent, AdvancedVariablesFormComponent, AiDebugAlertComponent, AiLogsWithReasoningComponent, AiPromptCardComponent, AiReasoningComponent, ApiEditStepComponent, ApiMockingCardComponent, ApiStepComponent, AssignEnvironmentsDialogComponent, AutocompleteComponent, BadgeComponent, BasicStepComponent, BreakpointsModalComponent, ButtonComponent, CUSTOM_EDIT_STEP_DATA, CUSTOM_EDIT_STEP_EDIT_IN_DEPTH, CUSTOM_EDIT_STEP_REF, CUSTOM_ELEMENT_POPUP_REF, CaptureVideoDialogComponent, ChangeHistoryComponent, ChartCardComponent, CodeEditorComponent, ColumnVisibilityComponent, CompareRunsComponent, ConditionBranchEditorComponent, ConditionDebugStepComponent, 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, ENVIRONMENT_ACCENT_COLORS, ElementFormComponent, ElementListComponent, ElementPopupComponent, ElementPopupRef, ElementPopupService, EmptyStateComponent, ErrorModalComponent, ExecutionResultModalComponent, ExportCodeModalComponent, FailedStepCardComponent, FailedStepComponent, FailedTestCasesCardComponent, FileDownloadStepComponent, FileUploadComponent, FullTableLoaderComponent, HeatErrorMapCellComponent, InsightCardComponent, ItemListComponent, IterationsLoopComponent, JumpToStepModalComponent, LiveConversationComponent, LiveExecutionStepComponent, LoopStepComponent, MONACO_LANGUAGE_MAP, MainStepCollapseComponent, MetricsCardComponent, MixedVariableInputComponent, NetworkRequestComponent, NewEnvironmentDialogComponent, NewEnvironmentVariableDialogComponent, NewGlobalVariableDialogComponent, NewTestDataProfileDialogComponent, NewVersionHistoryDetailComponent, OtherButtonComponent, PRIORITY_COLORS, PaginationComponent, PermissionToggleComponent, ProgressIndicatorComponent, ProgressTextCardComponent, QuestionnaireListComponent, RESULT_COLORS, RadioCardGroupComponent, RecordingBannerComponent, ReviewRecordedStepsModalComponent, RunExecutionAlertComponent, RunHistoryCardComponent, STATUS_COLORS, STEP_DETAILS_DRAWER_DATA, STEP_DETAILS_DRAWER_REF, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, STEP_DETAILS_MODAL_DATA, STEP_DETAILS_MODAL_REF, SearchBarComponent, SegmentControlComponent, SelectedFiltersComponent, SelfHealAnalysisComponent, SessionChangesModalComponent, SessionRestorationDialogComponent, SimulatorComponent, StepBuilderActionComponent, StepBuilderAiAgentComponent, StepBuilderConditionComponent, StepBuilderCustomCodeComponent, StepBuilderDatabaseComponent, StepBuilderDocumentComponent, StepBuilderDocumentGenerationTemplateStepComponent, StepBuilderGroupComponent, StepBuilderLoopComponent, StepBuilderRecordStepComponent, StepDetailsDrawerComponent, StepDetailsDrawerRef, StepDetailsDrawerService, StepDetailsModalComponent, StepDetailsModalRef, StepDetailsModalService, StepGroupComponent, StepProgressCardComponent, StepRendererComponent, StepStatusCardComponent, StepTypes, StepperComponent, SubStepsConfirmationDialogComponent, 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, TestCaseLinkCellComponent, TestCaseLoopStepComponent, TestCaseNormalStepComponent, TestCaseRestoreSessionStepComponent, TestCaseScreenshotStepComponent, TestCaseScrollStepComponent, TestCaseStepGroupComponent, TestCaseUploadStepComponent, TestCaseVerifyUrlStepComponent, TestDataModalComponent, TestDataModalRef, TestDataModalService, TestDistributionCardComponent, UiKitModule, UpdatedFailedStepComponent, VersionHistoryCompareComponent, VersionHistoryDetailComponent, VersionHistoryListComponent, VersionHistoryRestoreConfirmComponent, ViewCompareButtonComponent, ViewMoreFailedStepButtonComponent, VisualComparisonComponent, VisualDifferenceModalComponent, WorkspaceSelectorComponent, buildTestCaseDetailsFromApi, getDynamicFieldsFromLegacyConfig, getEmptyStatePreset, getMetadataColor, getMetadataValueStyle, getStepDetailsStepType, humanizeVariableKey, isAiAgentStepConfig, isAiVerifyStepConfig, isApiStepConfig, isConditionStepConfig, isCustomCodeStepConfig, isDatabaseStepConfig, isLoopStepConfig, isNormalStepConfig, isRestoreSessionStepConfig, isScreenshotStepConfig, isScrollStepConfig, isStepGroupConfig, isUploadStepConfig, isVerifyUrlStepConfig, mapApiVariablesToDynamicFields };
|
|
48395
49051
|
//# sourceMappingURL=cqa-lib-cqa-ui.mjs.map
|