@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
@@ -47045,6 +47045,658 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
47045
47045
  type: Input
47046
47046
  }] } });
47047
47047
 
47048
+ const ENVIRONMENT_ACCENT_COLORS = [
47049
+ '#3F43EE',
47050
+ '#A855F7',
47051
+ '#00A63E',
47052
+ '#F59E0B',
47053
+ '#0EA5E9',
47054
+ '#EC4899',
47055
+ ];
47056
+
47057
+ class NewEnvironmentDialogComponent {
47058
+ constructor(cdr) {
47059
+ this.cdr = cdr;
47060
+ this.mode = 'create';
47061
+ this.existingNames = [];
47062
+ this.allowDefaultToggle = true;
47063
+ this.defaultAlreadySet = false;
47064
+ this.colors = ENVIRONMENT_ACCENT_COLORS;
47065
+ this.name = '';
47066
+ this.description = '';
47067
+ this.color = ENVIRONMENT_ACCENT_COLORS[0];
47068
+ this.isDefault = false;
47069
+ this.nameError = null;
47070
+ }
47071
+ ngOnInit() {
47072
+ var _a, _b, _c;
47073
+ if (this.initialValue) {
47074
+ this.name = (_a = this.initialValue.name) !== null && _a !== void 0 ? _a : '';
47075
+ this.description = (_b = this.initialValue.description) !== null && _b !== void 0 ? _b : '';
47076
+ this.color = this.initialValue.color || ENVIRONMENT_ACCENT_COLORS[0];
47077
+ this.isDefault = (_c = this.initialValue.isDefault) !== null && _c !== void 0 ? _c : false;
47078
+ }
47079
+ }
47080
+ get title() {
47081
+ return this.mode === 'edit' ? 'Edit environment' : 'New environment';
47082
+ }
47083
+ get subtitle() {
47084
+ return 'Create an environment to scope variables, DB configs, and data profiles.';
47085
+ }
47086
+ get primaryButtonLabel() {
47087
+ return this.mode === 'edit' ? 'Save changes' : 'Create environment';
47088
+ }
47089
+ get nameErrorsArray() {
47090
+ return this.nameError ? [this.nameError] : [];
47091
+ }
47092
+ get defaultHelperText() {
47093
+ if (!this.allowDefaultToggle) {
47094
+ return 'Default promotion is handled from the environment detail page.';
47095
+ }
47096
+ if (this.defaultAlreadySet && !this.isDefault) {
47097
+ return 'Another environment is currently the default. Toggling this on will demote it.';
47098
+ }
47099
+ return 'Test cases without an explicit env selected will resolve against this one.';
47100
+ }
47101
+ onNameChange(next) {
47102
+ this.name = next;
47103
+ this.nameError = null;
47104
+ this.cdr.markForCheck();
47105
+ }
47106
+ onDescriptionChange(next) {
47107
+ this.description = next;
47108
+ this.cdr.markForCheck();
47109
+ }
47110
+ onColorSelect(next) {
47111
+ this.color = next;
47112
+ this.cdr.markForCheck();
47113
+ }
47114
+ onDefaultChange(next) {
47115
+ this.isDefault = next;
47116
+ this.cdr.markForCheck();
47117
+ }
47118
+ /**
47119
+ * Called by the host (via DialogRef.getComponentInstance()) when the primary
47120
+ * button is clicked. Returns the captured value when valid, or null when the
47121
+ * form has errors — host should leave the dialog open.
47122
+ */
47123
+ getValue() {
47124
+ const trimmedName = this.name.trim();
47125
+ if (!trimmedName) {
47126
+ this.nameError = 'Name is required.';
47127
+ }
47128
+ else if (trimmedName.length < 2) {
47129
+ this.nameError = 'Name must be at least 2 characters.';
47130
+ }
47131
+ else if (this.isDuplicateName(trimmedName)) {
47132
+ this.nameError = 'An environment with this name already exists — names must be unique.';
47133
+ }
47134
+ else {
47135
+ this.nameError = null;
47136
+ }
47137
+ if (this.nameError) {
47138
+ this.cdr.markForCheck();
47139
+ return null;
47140
+ }
47141
+ return {
47142
+ name: trimmedName,
47143
+ description: this.description ? this.description.trim() : null,
47144
+ color: this.color,
47145
+ isDefault: this.allowDefaultToggle ? this.isDefault : false,
47146
+ };
47147
+ }
47148
+ isDuplicateName(candidate) {
47149
+ var _a, _b, _c;
47150
+ const existing = ((_a = this.existingNames) !== null && _a !== void 0 ? _a : []).map(n => (n !== null && n !== void 0 ? n : '').trim().toLowerCase());
47151
+ const lowered = candidate.toLowerCase();
47152
+ if (this.mode === 'edit') {
47153
+ const original = ((_c = (_b = this.initialValue) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '').trim().toLowerCase();
47154
+ return lowered !== original && existing.includes(lowered);
47155
+ }
47156
+ return existing.includes(lowered);
47157
+ }
47158
+ }
47159
+ NewEnvironmentDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
47160
+ 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 });
47161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentDialogComponent, decorators: [{
47162
+ type: Component,
47163
+ 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" }]
47164
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
47165
+ type: Input
47166
+ }], initialValue: [{
47167
+ type: Input
47168
+ }], existingNames: [{
47169
+ type: Input
47170
+ }], allowDefaultToggle: [{
47171
+ type: Input
47172
+ }], defaultAlreadySet: [{
47173
+ type: Input
47174
+ }] } });
47175
+
47176
+ class NewEnvironmentVariableDialogComponent {
47177
+ constructor(cdr) {
47178
+ this.cdr = cdr;
47179
+ this.mode = 'create';
47180
+ this.existingNames = [];
47181
+ this.envName = '';
47182
+ this.typeDropdownOptions = [
47183
+ { label: 'String', value: 'String' },
47184
+ { label: 'Number', value: 'Number' },
47185
+ { label: 'Boolean', value: 'Boolean' },
47186
+ { label: 'Password', value: 'Password' },
47187
+ ];
47188
+ this.name = '';
47189
+ this.type = 'String';
47190
+ this.value = '';
47191
+ this.readWriteMode = 'RW';
47192
+ this.passwordTouched = false;
47193
+ this.nameError = null;
47194
+ this.valueError = null;
47195
+ }
47196
+ ngOnInit() {
47197
+ var _a, _b, _c, _d;
47198
+ if (this.initialValue) {
47199
+ this.name = (_a = this.initialValue.name) !== null && _a !== void 0 ? _a : '';
47200
+ this.type = (_b = this.initialValue.type) !== null && _b !== void 0 ? _b : 'String';
47201
+ this.value = (_c = this.initialValue.value) !== null && _c !== void 0 ? _c : '';
47202
+ this.readWriteMode = (_d = this.initialValue.readWriteMode) !== null && _d !== void 0 ? _d : 'RW';
47203
+ }
47204
+ if (this.type === 'Boolean' && this.value !== 'true' && this.value !== 'false') {
47205
+ this.value = 'false';
47206
+ }
47207
+ if (this.mode === 'edit' && this.type === 'Password') {
47208
+ this.value = '';
47209
+ }
47210
+ }
47211
+ get title() {
47212
+ return this.mode === 'edit' ? 'Edit variable' : 'New variable';
47213
+ }
47214
+ get subtitle() {
47215
+ return this.envName ? `Scoped to the ${this.envName} environment.` : 'Scoped to this environment.';
47216
+ }
47217
+ get primaryButtonLabel() {
47218
+ return this.mode === 'edit' ? 'Save changes' : 'Add variable';
47219
+ }
47220
+ get isBoolean() { return this.type === 'Boolean'; }
47221
+ get isPassword() { return this.type === 'Password'; }
47222
+ get isNumber() { return this.type === 'Number'; }
47223
+ get valuePlaceholder() {
47224
+ if (this.isPassword && this.mode === 'edit') {
47225
+ return '•••••• (leave blank to keep existing)';
47226
+ }
47227
+ if (this.readWriteMode === 'RW') {
47228
+ return 'Leave blank to populate during test execution';
47229
+ }
47230
+ return 'Enter a value';
47231
+ }
47232
+ get nameHelperText() {
47233
+ if (this.nameError) {
47234
+ return this.nameError;
47235
+ }
47236
+ return 'Variable names must be unique within the environment.';
47237
+ }
47238
+ get permissionHelperText() {
47239
+ return this.readWriteMode === 'RO'
47240
+ ? 'Read only — test steps can read but not overwrite.'
47241
+ : 'Read/write — test cases can capture values here.';
47242
+ }
47243
+ get nameErrorsArray() { return this.nameError ? [this.nameError] : []; }
47244
+ get valueErrorsArray() { return this.valueError ? [this.valueError] : []; }
47245
+ get booleanDropdownOptions() {
47246
+ return [
47247
+ { label: 'true', value: 'true' },
47248
+ { label: 'false', value: 'false' },
47249
+ ];
47250
+ }
47251
+ onNameChange(next) {
47252
+ this.name = next;
47253
+ this.nameError = null;
47254
+ this.cdr.markForCheck();
47255
+ }
47256
+ onTypeChange(next) {
47257
+ if (!next) {
47258
+ return;
47259
+ }
47260
+ this.type = next;
47261
+ if (this.type === 'Boolean' && this.value !== 'true' && this.value !== 'false') {
47262
+ this.value = 'false';
47263
+ }
47264
+ if (this.type === 'Password') {
47265
+ this.passwordTouched = false;
47266
+ if (this.mode === 'edit') {
47267
+ this.value = '';
47268
+ }
47269
+ }
47270
+ this.valueError = null;
47271
+ this.cdr.markForCheck();
47272
+ }
47273
+ onPermissionChange(next) {
47274
+ this.readWriteMode = next === 'RO' ? 'RO' : 'RW';
47275
+ this.cdr.markForCheck();
47276
+ }
47277
+ onValueChange(next) {
47278
+ this.value = next;
47279
+ if (this.isPassword) {
47280
+ this.passwordTouched = true;
47281
+ }
47282
+ this.valueError = null;
47283
+ this.cdr.markForCheck();
47284
+ }
47285
+ onBooleanValueChange(next) {
47286
+ this.value = next;
47287
+ this.cdr.markForCheck();
47288
+ }
47289
+ /**
47290
+ * Host reads via DialogRef.getComponentInstance(). Returns null on validation
47291
+ * failure — host keeps the dialog open and surfaces the inline error already
47292
+ * written onto nameError / valueError.
47293
+ */
47294
+ getValue() {
47295
+ const trimmedName = this.name.trim();
47296
+ if (!trimmedName) {
47297
+ this.nameError = 'Name is required.';
47298
+ }
47299
+ else if (this.isDuplicateName(trimmedName)) {
47300
+ this.nameError = 'A variable with this name already exists in this environment.';
47301
+ }
47302
+ else {
47303
+ this.nameError = null;
47304
+ }
47305
+ if (this.isNumber && this.value && !this.isValidNumber(this.value)) {
47306
+ this.valueError = 'Value must be a number.';
47307
+ }
47308
+ else {
47309
+ this.valueError = null;
47310
+ }
47311
+ if (this.nameError || this.valueError) {
47312
+ this.cdr.markForCheck();
47313
+ return null;
47314
+ }
47315
+ const omitPasswordValue = this.isPassword && this.mode === 'edit' && !this.passwordTouched;
47316
+ return {
47317
+ name: trimmedName,
47318
+ type: this.type,
47319
+ value: omitPasswordValue ? null : this.serializeValue(),
47320
+ readWriteMode: this.readWriteMode,
47321
+ };
47322
+ }
47323
+ serializeValue() {
47324
+ var _a;
47325
+ if (this.isBoolean) {
47326
+ return this.value === 'true' ? 'true' : 'false';
47327
+ }
47328
+ return (_a = this.value) !== null && _a !== void 0 ? _a : '';
47329
+ }
47330
+ isDuplicateName(candidate) {
47331
+ var _a, _b, _c;
47332
+ const existing = ((_a = this.existingNames) !== null && _a !== void 0 ? _a : []).map(n => (n !== null && n !== void 0 ? n : '').trim().toLowerCase());
47333
+ const lowered = candidate.toLowerCase();
47334
+ if (this.mode === 'edit') {
47335
+ const original = ((_c = (_b = this.initialValue) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '').trim().toLowerCase();
47336
+ return lowered !== original && existing.includes(lowered);
47337
+ }
47338
+ return existing.includes(lowered);
47339
+ }
47340
+ isValidNumber(raw) {
47341
+ const trimmed = raw.trim();
47342
+ if (!trimmed) {
47343
+ return true;
47344
+ }
47345
+ return !Number.isNaN(Number(trimmed));
47346
+ }
47347
+ }
47348
+ NewEnvironmentVariableDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentVariableDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
47349
+ 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 });
47350
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewEnvironmentVariableDialogComponent, decorators: [{
47351
+ type: Component,
47352
+ 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" }]
47353
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
47354
+ type: Input
47355
+ }], initialValue: [{
47356
+ type: Input
47357
+ }], existingNames: [{
47358
+ type: Input
47359
+ }], envName: [{
47360
+ type: Input
47361
+ }] } });
47362
+
47363
+ class NewTestDataProfileDialogComponent {
47364
+ constructor(cdr) {
47365
+ this.cdr = cdr;
47366
+ this.mode = 'create';
47367
+ this.existingNames = [];
47368
+ this.environments = [];
47369
+ this.lockedColumns = [];
47370
+ this.name = '';
47371
+ this.description = '';
47372
+ this.readWriteMode = 'RW';
47373
+ this.columns = ['col_1'];
47374
+ this.envForm = new FormGroup({
47375
+ environmentIds: new FormControl([]),
47376
+ });
47377
+ this.envConfig = this.buildEnvConfig([]);
47378
+ this.nameError = null;
47379
+ this.columnsError = null;
47380
+ this.envsError = null;
47381
+ this.trackByIndex = (_, __) => _;
47382
+ }
47383
+ ngOnInit() {
47384
+ var _a, _b, _c, _d, _e;
47385
+ if (this.initialValue) {
47386
+ this.name = (_a = this.initialValue.name) !== null && _a !== void 0 ? _a : '';
47387
+ this.description = (_b = this.initialValue.description) !== null && _b !== void 0 ? _b : '';
47388
+ this.readWriteMode = (_c = this.initialValue.readWriteMode) !== null && _c !== void 0 ? _c : 'RW';
47389
+ this.columns = (this.initialValue.columns && this.initialValue.columns.length)
47390
+ ? [...this.initialValue.columns]
47391
+ : ['col_1'];
47392
+ const ids = (_d = this.initialValue.environmentIds) !== null && _d !== void 0 ? _d : [];
47393
+ this.envForm.get('environmentIds').setValue(ids);
47394
+ }
47395
+ this.envConfig = this.buildEnvConfig((_e = this.environments) !== null && _e !== void 0 ? _e : []);
47396
+ // Clear envs error as soon as the user picks something.
47397
+ this.envForm.get('environmentIds').valueChanges.subscribe(() => {
47398
+ if (this.envsError) {
47399
+ this.envsError = null;
47400
+ this.cdr.markForCheck();
47401
+ }
47402
+ });
47403
+ }
47404
+ get title() {
47405
+ return this.mode === 'edit' ? 'Edit test data profile' : 'New test data profile';
47406
+ }
47407
+ get subtitle() {
47408
+ return 'Define columns; data values can be added per environment after creation.';
47409
+ }
47410
+ get primaryButtonLabel() {
47411
+ return this.mode === 'edit' ? 'Save changes' : 'Create profile';
47412
+ }
47413
+ get nameErrorsArray() { return this.nameError ? [this.nameError] : []; }
47414
+ get canAddColumn() { return true; }
47415
+ get selectedEnvIds() {
47416
+ var _a;
47417
+ const val = (_a = this.envForm.get('environmentIds').value) !== null && _a !== void 0 ? _a : [];
47418
+ return Array.isArray(val) ? val : [];
47419
+ }
47420
+ onNameChange(next) {
47421
+ this.name = next;
47422
+ this.nameError = null;
47423
+ this.cdr.markForCheck();
47424
+ }
47425
+ onDescriptionChange(next) {
47426
+ this.description = next;
47427
+ this.cdr.markForCheck();
47428
+ }
47429
+ onPermissionChange(next) {
47430
+ this.readWriteMode = next === 'RO' ? 'RO' : 'RW';
47431
+ this.cdr.markForCheck();
47432
+ }
47433
+ onColumnChange(index, value) {
47434
+ const next = [...this.columns];
47435
+ next[index] = value;
47436
+ this.columns = next;
47437
+ this.columnsError = null;
47438
+ this.cdr.markForCheck();
47439
+ }
47440
+ onAddColumn() {
47441
+ this.columns = [...this.columns, `col_${this.columns.length + 1}`];
47442
+ this.cdr.markForCheck();
47443
+ }
47444
+ onRemoveColumn(index) {
47445
+ if (this.columns.length <= 1) {
47446
+ return;
47447
+ }
47448
+ const target = this.columns[index];
47449
+ if (this.lockedColumns && this.lockedColumns.indexOf(target) !== -1) {
47450
+ return;
47451
+ }
47452
+ this.columns = this.columns.filter((_, i) => i !== index);
47453
+ this.cdr.markForCheck();
47454
+ }
47455
+ isColumnLocked(col) {
47456
+ return !!(this.lockedColumns && this.lockedColumns.indexOf(col) !== -1);
47457
+ }
47458
+ getValue() {
47459
+ const trimmedName = this.name.trim();
47460
+ if (!trimmedName) {
47461
+ this.nameError = 'Name is required.';
47462
+ }
47463
+ else if (this.isDuplicateName(trimmedName)) {
47464
+ this.nameError = 'A profile with this name already exists.';
47465
+ }
47466
+ else {
47467
+ this.nameError = null;
47468
+ }
47469
+ const trimmedCols = this.columns.map(c => (c !== null && c !== void 0 ? c : '').trim()).filter(c => c.length > 0);
47470
+ const unique = new Set(trimmedCols);
47471
+ if (trimmedCols.length === 0) {
47472
+ this.columnsError = 'At least one column is required.';
47473
+ }
47474
+ else if (unique.size !== trimmedCols.length) {
47475
+ this.columnsError = 'Column names must be unique.';
47476
+ }
47477
+ else {
47478
+ this.columnsError = null;
47479
+ }
47480
+ const envIds = this.selectedEnvIds;
47481
+ if (!envIds || envIds.length === 0) {
47482
+ this.envsError = 'Select at least one environment to assign this profile to.';
47483
+ }
47484
+ else {
47485
+ this.envsError = null;
47486
+ }
47487
+ if (this.nameError || this.columnsError || this.envsError) {
47488
+ this.cdr.markForCheck();
47489
+ return null;
47490
+ }
47491
+ return {
47492
+ name: trimmedName,
47493
+ description: this.description.trim() || null,
47494
+ readWriteMode: this.readWriteMode,
47495
+ columns: trimmedCols,
47496
+ environmentIds: this.selectedEnvIds,
47497
+ };
47498
+ }
47499
+ buildEnvConfig(envs) {
47500
+ const options = (envs || []).map(e => ({
47501
+ id: e.id,
47502
+ value: e.id,
47503
+ name: e.name,
47504
+ label: e.name,
47505
+ statusColor: e.color,
47506
+ }));
47507
+ return {
47508
+ key: 'environmentIds',
47509
+ label: '',
47510
+ placeholder: 'Select environments…',
47511
+ multiple: true,
47512
+ searchable: true,
47513
+ optionStyle: 'checkbox',
47514
+ showSelectAll: false,
47515
+ options,
47516
+ };
47517
+ }
47518
+ isDuplicateName(candidate) {
47519
+ var _a, _b, _c;
47520
+ const existing = ((_a = this.existingNames) !== null && _a !== void 0 ? _a : []).map(n => (n !== null && n !== void 0 ? n : '').trim().toLowerCase());
47521
+ const lowered = candidate.toLowerCase();
47522
+ if (this.mode === 'edit') {
47523
+ const original = ((_c = (_b = this.initialValue) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '').trim().toLowerCase();
47524
+ return lowered !== original && existing.includes(lowered);
47525
+ }
47526
+ return existing.includes(lowered);
47527
+ }
47528
+ }
47529
+ NewTestDataProfileDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewTestDataProfileDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
47530
+ 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 });
47531
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewTestDataProfileDialogComponent, decorators: [{
47532
+ type: Component,
47533
+ 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" }]
47534
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
47535
+ type: Input
47536
+ }], initialValue: [{
47537
+ type: Input
47538
+ }], existingNames: [{
47539
+ type: Input
47540
+ }], environments: [{
47541
+ type: Input
47542
+ }], lockedColumns: [{
47543
+ type: Input
47544
+ }] } });
47545
+
47546
+ class AssignEnvironmentsDialogComponent {
47547
+ constructor(cdr) {
47548
+ this.cdr = cdr;
47549
+ this.mode = 'assign';
47550
+ this.profileName = '';
47551
+ this.environments = [];
47552
+ this.assignedEnvironments = [];
47553
+ this.selected = new Set();
47554
+ this.sourceForm = new FormGroup({
47555
+ sourceEnvId: new FormControl(null),
47556
+ });
47557
+ this.sourceConfig = this.buildSourceConfig([]);
47558
+ this.sourceError = null;
47559
+ }
47560
+ ngOnInit() {
47561
+ var _a;
47562
+ // Source picker appears in both modes when there are already-attached envs
47563
+ // to copy from. In clone mode it's required; in assign mode it's optional
47564
+ // (falling back to the base profile rows when no source is picked).
47565
+ if (this.showSourcePicker) {
47566
+ const initial = this.defaultSourceEnvId != null
47567
+ ? this.defaultSourceEnvId
47568
+ : (this.mode === 'clone' && this.assignedEnvironments && this.assignedEnvironments.length
47569
+ ? this.assignedEnvironments[0].id
47570
+ : null);
47571
+ this.sourceForm.get('sourceEnvId').setValue(initial);
47572
+ this.sourceConfig = this.buildSourceConfig((_a = this.assignedEnvironments) !== null && _a !== void 0 ? _a : []);
47573
+ }
47574
+ }
47575
+ get showSourcePicker() {
47576
+ return (this.assignedEnvironments && this.assignedEnvironments.length > 0);
47577
+ }
47578
+ get sourceLabel() {
47579
+ return this.mode === 'clone' ? 'Copy from which environment' : 'Copy rows from (optional)';
47580
+ }
47581
+ get sourceHelper() {
47582
+ if (this.sourceError) {
47583
+ return this.sourceError;
47584
+ }
47585
+ return this.mode === 'clone'
47586
+ ? "The selected environment's rows will be copied into each target environment below."
47587
+ : 'Pick an environment to copy its rows into the new ones. Leave blank to seed with the base profile rows.';
47588
+ }
47589
+ get title() {
47590
+ return this.mode === 'clone' ? 'Clone to other environments' : 'Assign to environments';
47591
+ }
47592
+ get subtitle() {
47593
+ const name = this.profileName ? `"${this.profileName}"` : 'this profile';
47594
+ return this.mode === 'clone'
47595
+ ? `Duplicate ${name} into other environments. Column structure is shared; row values are independent per environment.`
47596
+ : `Make ${name} available in the selected environments. Columns are shared — each environment gets an independent row set.`;
47597
+ }
47598
+ get primaryButtonLabel() {
47599
+ const count = this.selected.size;
47600
+ const verb = this.mode === 'clone' ? 'Clone to' : 'Assign to';
47601
+ return `${verb} ${count} environment${count === 1 ? '' : 's'}`;
47602
+ }
47603
+ get primaryDisabled() {
47604
+ if (this.selected.size === 0) {
47605
+ return true;
47606
+ }
47607
+ if (this.mode === 'clone' && this.sourceForm.get('sourceEnvId').value == null) {
47608
+ return true;
47609
+ }
47610
+ return false;
47611
+ }
47612
+ get selectableEnvironments() {
47613
+ var _a;
47614
+ return (_a = this.environments) !== null && _a !== void 0 ? _a : [];
47615
+ }
47616
+ get hasAnySelectable() {
47617
+ var _a;
47618
+ return ((_a = this.environments) !== null && _a !== void 0 ? _a : []).some(e => !e.alreadyAssigned);
47619
+ }
47620
+ get sourceValue() {
47621
+ var _a;
47622
+ return (_a = this.sourceForm.get('sourceEnvId').value) !== null && _a !== void 0 ? _a : null;
47623
+ }
47624
+ isSelected(id) {
47625
+ return this.selected.has(id);
47626
+ }
47627
+ toggle(env) {
47628
+ if (env.alreadyAssigned) {
47629
+ return;
47630
+ }
47631
+ if (this.selected.has(env.id)) {
47632
+ this.selected.delete(env.id);
47633
+ }
47634
+ else {
47635
+ this.selected.add(env.id);
47636
+ }
47637
+ this.cdr.markForCheck();
47638
+ }
47639
+ helperFor(env) {
47640
+ if (env.alreadyAssigned) {
47641
+ return 'Already assigned to this environment';
47642
+ }
47643
+ return env.description || '';
47644
+ }
47645
+ getValue() {
47646
+ if (this.selected.size === 0) {
47647
+ return null;
47648
+ }
47649
+ const src = this.sourceValue;
47650
+ if (this.mode === 'clone') {
47651
+ if (src == null) {
47652
+ this.sourceError = 'Pick the environment whose rows should be copied.';
47653
+ this.cdr.markForCheck();
47654
+ return null;
47655
+ }
47656
+ this.sourceError = null;
47657
+ return { selectedIds: Array.from(this.selected), sourceEnvId: Number(src) };
47658
+ }
47659
+ // Assign mode: source is optional — include it when the user picked one.
47660
+ this.sourceError = null;
47661
+ return src != null
47662
+ ? { selectedIds: Array.from(this.selected), sourceEnvId: Number(src) }
47663
+ : { selectedIds: Array.from(this.selected) };
47664
+ }
47665
+ buildSourceConfig(envs) {
47666
+ const options = (envs || []).map(e => ({
47667
+ id: e.id,
47668
+ value: e.id,
47669
+ name: e.name,
47670
+ label: e.name,
47671
+ statusColor: e.color,
47672
+ }));
47673
+ return {
47674
+ key: 'sourceEnvId',
47675
+ label: '',
47676
+ placeholder: 'Select source environment…',
47677
+ multiple: false,
47678
+ searchable: true,
47679
+ options,
47680
+ };
47681
+ }
47682
+ }
47683
+ AssignEnvironmentsDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AssignEnvironmentsDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
47684
+ 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 });
47685
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AssignEnvironmentsDialogComponent, decorators: [{
47686
+ type: Component,
47687
+ 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" }]
47688
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
47689
+ type: Input
47690
+ }], profileName: [{
47691
+ type: Input
47692
+ }], environments: [{
47693
+ type: Input
47694
+ }], assignedEnvironments: [{
47695
+ type: Input
47696
+ }], defaultSourceEnvId: [{
47697
+ type: Input
47698
+ }] } });
47699
+
47048
47700
  class UiKitModule {
47049
47701
  constructor(iconRegistry) {
47050
47702
  iconRegistry.registerFontClassAlias('material-symbols-outlined', 'material-symbols-outlined');
@@ -47141,6 +47793,10 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
47141
47793
  CaptureVideoDialogComponent,
47142
47794
  SubStepsConfirmationDialogComponent,
47143
47795
  NewGlobalVariableDialogComponent,
47796
+ NewEnvironmentDialogComponent,
47797
+ NewEnvironmentVariableDialogComponent,
47798
+ NewTestDataProfileDialogComponent,
47799
+ AssignEnvironmentsDialogComponent,
47144
47800
  PermissionToggleComponent,
47145
47801
  ExportCodeModalComponent,
47146
47802
  ProgressIndicatorComponent,
@@ -47319,6 +47975,10 @@ UiKitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
47319
47975
  CaptureVideoDialogComponent,
47320
47976
  SubStepsConfirmationDialogComponent,
47321
47977
  NewGlobalVariableDialogComponent,
47978
+ NewEnvironmentDialogComponent,
47979
+ NewEnvironmentVariableDialogComponent,
47980
+ NewTestDataProfileDialogComponent,
47981
+ AssignEnvironmentsDialogComponent,
47322
47982
  PermissionToggleComponent,
47323
47983
  ExportCodeModalComponent,
47324
47984
  ProgressIndicatorComponent,
@@ -47542,6 +48202,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
47542
48202
  CaptureVideoDialogComponent,
47543
48203
  SubStepsConfirmationDialogComponent,
47544
48204
  NewGlobalVariableDialogComponent,
48205
+ NewEnvironmentDialogComponent,
48206
+ NewEnvironmentVariableDialogComponent,
48207
+ NewTestDataProfileDialogComponent,
48208
+ AssignEnvironmentsDialogComponent,
47545
48209
  PermissionToggleComponent,
47546
48210
  ExportCodeModalComponent,
47547
48211
  ProgressIndicatorComponent,
@@ -47726,6 +48390,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
47726
48390
  CaptureVideoDialogComponent,
47727
48391
  SubStepsConfirmationDialogComponent,
47728
48392
  NewGlobalVariableDialogComponent,
48393
+ NewEnvironmentDialogComponent,
48394
+ NewEnvironmentVariableDialogComponent,
48395
+ NewTestDataProfileDialogComponent,
48396
+ AssignEnvironmentsDialogComponent,
47729
48397
  PermissionToggleComponent,
47730
48398
  ExportCodeModalComponent,
47731
48399
  ProgressIndicatorComponent,
@@ -48562,5 +49230,5 @@ function buildTestCaseDetailsFromApi(data, options) {
48562
49230
  * Generated bundle index. Do not edit.
48563
49231
  */
48564
49232
 
48565
- 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 };
49233
+ 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 };
48566
49234
  //# sourceMappingURL=cqa-lib-cqa-ui.mjs.map