@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.
Files changed (26) hide show
  1. package/esm2020/lib/assign-environments-dialog/assign-environments-dialog.component.mjs +155 -0
  2. package/esm2020/lib/assign-environments-dialog/assign-environments-dialog.models.mjs +2 -0
  3. package/esm2020/lib/new-environment-dialog/new-environment-dialog.component.mjs +123 -0
  4. package/esm2020/lib/new-environment-dialog/new-environment-dialog.models.mjs +9 -0
  5. package/esm2020/lib/new-environment-variable-dialog/new-environment-variable-dialog.component.mjs +190 -0
  6. package/esm2020/lib/new-environment-variable-dialog/new-environment-variable-dialog.models.mjs +2 -0
  7. package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.mjs +188 -0
  8. package/esm2020/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.mjs +2 -0
  9. package/esm2020/lib/ui-kit.module.mjs +21 -1
  10. package/esm2020/public-api.mjs +9 -1
  11. package/fesm2015/cqa-lib-cqa-ui.mjs +669 -1
  12. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  13. package/fesm2020/cqa-lib-cqa-ui.mjs +657 -1
  14. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  15. package/lib/assign-environments-dialog/assign-environments-dialog.component.d.ts +36 -0
  16. package/lib/assign-environments-dialog/assign-environments-dialog.models.d.ts +19 -0
  17. package/lib/new-environment-dialog/new-environment-dialog.component.d.ts +37 -0
  18. package/lib/new-environment-dialog/new-environment-dialog.models.d.ts +14 -0
  19. package/lib/new-environment-variable-dialog/new-environment-variable-dialog.component.d.ts +54 -0
  20. package/lib/new-environment-variable-dialog/new-environment-variable-dialog.models.d.ts +14 -0
  21. package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.component.d.ts +43 -0
  22. package/lib/new-test-data-profile-dialog/new-test-data-profile-dialog.models.d.ts +20 -0
  23. package/lib/ui-kit.module.d.ts +92 -88
  24. package/package.json +1 -1
  25. package/public-api.d.ts +8 -0
  26. 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