@cqa-lib/cqa-ui 1.1.537-gamma.4 → 1.1.537

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 (39) hide show
  1. package/.github/workflows/README.md +1 -8
  2. package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
  3. package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +1 -1
  4. package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
  5. package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
  6. package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
  7. package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +10 -30
  8. package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +5 -16
  9. package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.models.mjs +1 -1
  10. package/esm2020/lib/segment-control/segment-control.component.mjs +4 -12
  11. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +3 -17
  12. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +3 -17
  13. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +3 -12
  14. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +27 -258
  15. package/esm2020/lib/templates/table-template.component.mjs +3 -5
  16. package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +4 -43
  17. package/esm2020/lib/test-case-details/test-case-details.models.mjs +1 -3
  18. package/esm2020/lib/ui-kit.module.mjs +1 -6
  19. package/esm2020/public-api.mjs +1 -2
  20. package/fesm2015/cqa-lib-cqa-ui.mjs +103 -590
  21. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  22. package/fesm2020/cqa-lib-cqa-ui.mjs +53 -530
  23. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  24. package/lib/new-global-variable-dialog/new-global-variable-dialog.component.d.ts +2 -5
  25. package/lib/new-global-variable-dialog/new-global-variable-dialog.models.d.ts +0 -8
  26. package/lib/segment-control/segment-control.component.d.ts +1 -3
  27. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +1 -15
  28. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +1 -15
  29. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +1 -11
  30. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +4 -70
  31. package/lib/templates/table-template.component.d.ts +1 -8
  32. package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +0 -7
  33. package/lib/test-case-details/test-case-details.models.d.ts +0 -2
  34. package/lib/ui-kit.module.d.ts +96 -97
  35. package/package.json +1 -1
  36. package/public-api.d.ts +0 -1
  37. package/styles.css +1 -1
  38. package/esm2020/lib/new-global-variable-dialog/global-variable-tags-input.component.mjs +0 -129
  39. package/lib/new-global-variable-dialog/global-variable-tags-input.component.d.ts +0 -39
@@ -1,129 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/icon";
4
- import * as i2 from "@angular/common";
5
- /**
6
- * Tag chip-list + autocomplete used by the New / Edit Global Variable dialog.
7
- * Mirrors the React `TagsEditor` block in
8
- * `Environment and Data Management_CD Deisgns/src/Global.jsx:179-237`:
9
- *
10
- * [chip × …] [+ Add tag] ← inactive state
11
- * [chip × …] [_input_ ↳ suggestions] ← active state
12
- *
13
- * Behavior:
14
- * - Backspace on an empty input removes the last tag.
15
- * - Enter commits the trimmed lowercase value (creates if not in available).
16
- * - Escape exits the input without committing.
17
- * - Suggestions are computed from `availableTags`, capped at 4.
18
- */
19
- export class GlobalVariableTagsInputComponent {
20
- constructor(cdr) {
21
- this.cdr = cdr;
22
- this.tags = [];
23
- this.availableTags = [];
24
- this.tagsChange = new EventEmitter();
25
- this.adding = false;
26
- this.draft = '';
27
- }
28
- get suggestions() {
29
- const typed = this.draft.trim().toLowerCase();
30
- const taken = new Set((this.tags ?? []).map(t => t.toLowerCase()));
31
- const pool = (this.availableTags ?? []).filter(t => !taken.has((t.name ?? '').toLowerCase()));
32
- if (typed.length === 0) {
33
- return pool.slice(0, 4);
34
- }
35
- return pool
36
- .filter(t => (t.name ?? '').toLowerCase().startsWith(typed))
37
- .slice(0, 4);
38
- }
39
- beginAdd() {
40
- this.adding = true;
41
- this.draft = '';
42
- this.cdr.markForCheck();
43
- setTimeout(() => this.tagInputRef?.nativeElement.focus(), 0);
44
- }
45
- onDraftChange(next) {
46
- this.draft = next ?? '';
47
- this.cdr.markForCheck();
48
- }
49
- onKeyDown(event) {
50
- if (event.key === 'Enter') {
51
- event.preventDefault();
52
- this.commitDraft();
53
- }
54
- else if (event.key === 'Escape') {
55
- event.preventDefault();
56
- this.cancelAdd();
57
- }
58
- else if (event.key === 'Backspace' && !this.draft && this.tags.length > 0) {
59
- event.preventDefault();
60
- this.removeAt(this.tags.length - 1);
61
- }
62
- }
63
- onSuggestionMouseDown(event, suggestion) {
64
- // mouseDown beats blur so the click registers before the input loses focus
65
- event.preventDefault();
66
- this.commit(suggestion.name);
67
- }
68
- onBlur() {
69
- // Defer so suggestion click has a chance to fire first
70
- setTimeout(() => {
71
- if (!this.adding) {
72
- return;
73
- }
74
- this.commitDraft();
75
- }, 150);
76
- }
77
- removeAt(index) {
78
- const next = (this.tags ?? []).filter((_, i) => i !== index);
79
- this.tags = next;
80
- this.tagsChange.emit(next);
81
- this.cdr.markForCheck();
82
- }
83
- commitDraft() {
84
- const raw = (this.draft ?? '').trim().toLowerCase();
85
- if (!raw) {
86
- this.cancelAdd();
87
- return;
88
- }
89
- this.commit(raw);
90
- }
91
- commit(name) {
92
- const normalized = (name ?? '').trim().toLowerCase();
93
- if (!normalized) {
94
- return;
95
- }
96
- const taken = new Set((this.tags ?? []).map(t => t.toLowerCase()));
97
- if (taken.has(normalized)) {
98
- this.cancelAdd();
99
- return;
100
- }
101
- const next = [...(this.tags ?? []), normalized];
102
- this.tags = next;
103
- this.tagsChange.emit(next);
104
- this.draft = '';
105
- this.adding = false;
106
- this.cdr.markForCheck();
107
- }
108
- cancelAdd() {
109
- this.adding = false;
110
- this.draft = '';
111
- this.cdr.markForCheck();
112
- }
113
- }
114
- GlobalVariableTagsInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GlobalVariableTagsInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
115
- GlobalVariableTagsInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: GlobalVariableTagsInputComponent, selector: "lib-global-variable-tags-input", inputs: { tags: "tags", availableTags: "availableTags" }, outputs: { tagsChange: "tagsChange" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "tagInputRef", first: true, predicate: ["tagInput"], descendants: true }], ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-1.5\">\n <!-- Selected tag chips -->\n <span *ngFor=\"let tag of tags; let i = index\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-xs cqa-font-medium\"\n style=\"background:#FAE8FF;color:#6B21A8;\">\n <mat-icon class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px] cqa-leading-[12px]\">sell</mat-icon>\n <span>{{ tag }}</span>\n <button type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-full cqa-cursor-pointer hover:cqa-bg-[#E9D5FF]\"\n style=\"border:none;background:transparent;padding:0;\"\n (click)=\"removeAt(i)\"\n [attr.aria-label]=\"'Remove tag ' + tag\">\n <mat-icon class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px] cqa-leading-[12px]\">close</mat-icon>\n </button>\n </span>\n\n <!-- Inactive: \"+ Add tag\" pill -->\n <button *ngIf=\"!adding\" type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-xs cqa-cursor-pointer\"\n style=\"border:1px dashed #D4D4D8;background:transparent;color:#52525B;\"\n (click)=\"beginAdd()\">\n <mat-icon class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px] cqa-leading-[12px]\">add</mat-icon>\n <span>Add tag</span>\n </button>\n\n <!-- Active: input + suggestions. Input matches the dialog's other inputs:\n full-width row, 1px solid border, rounded; input border itself is the\n inner pill the user types into. Suggestion dropdown renders below. -->\n <div *ngIf=\"adding\" class=\"cqa-relative\" style=\"min-width:200px;\">\n <input #tagInput\n type=\"text\"\n class=\"cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-text-sm cqa-outline-none cqa-w-full\"\n style=\"border:1px solid #6366F1;box-shadow:0 0 0 3px rgba(99,102,241,0.12);\"\n placeholder=\"Tag\u2026\"\n [value]=\"draft\"\n (input)=\"onDraftChange($any($event.target).value)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\" />\n\n <div *ngIf=\"suggestions.length > 0\"\n class=\"cqa-absolute cqa-z-10 cqa-mt-1 cqa-bg-white cqa-rounded-md cqa-shadow-lg cqa-w-full\"\n style=\"border:1px solid #E5E7EB;max-height:220px;overflow-y:auto;left:0;\">\n <div *ngFor=\"let s of suggestions\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-3 cqa-py-2 cqa-cursor-pointer hover:cqa-bg-[#F3F4F6]\"\n (mousedown)=\"onSuggestionMouseDown($event, s)\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-text-sm cqa-text-gray-800\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px] cqa-leading-[14px]\" style=\"color:#6B21A8;\">sell</mat-icon>\n <span>{{ s.name }}</span>\n </span>\n <span *ngIf=\"s.count != null\" class=\"cqa-text-[11px] cqa-text-gray-400\">{{ s.count }}</span>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GlobalVariableTagsInputComponent, decorators: [{
117
- type: Component,
118
- args: [{ selector: 'lib-global-variable-tags-input', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-1.5\">\n <!-- Selected tag chips -->\n <span *ngFor=\"let tag of tags; let i = index\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-xs cqa-font-medium\"\n style=\"background:#FAE8FF;color:#6B21A8;\">\n <mat-icon class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px] cqa-leading-[12px]\">sell</mat-icon>\n <span>{{ tag }}</span>\n <button type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-full cqa-cursor-pointer hover:cqa-bg-[#E9D5FF]\"\n style=\"border:none;background:transparent;padding:0;\"\n (click)=\"removeAt(i)\"\n [attr.aria-label]=\"'Remove tag ' + tag\">\n <mat-icon class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px] cqa-leading-[12px]\">close</mat-icon>\n </button>\n </span>\n\n <!-- Inactive: \"+ Add tag\" pill -->\n <button *ngIf=\"!adding\" type=\"button\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-xs cqa-cursor-pointer\"\n style=\"border:1px dashed #D4D4D8;background:transparent;color:#52525B;\"\n (click)=\"beginAdd()\">\n <mat-icon class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px] cqa-leading-[12px]\">add</mat-icon>\n <span>Add tag</span>\n </button>\n\n <!-- Active: input + suggestions. Input matches the dialog's other inputs:\n full-width row, 1px solid border, rounded; input border itself is the\n inner pill the user types into. Suggestion dropdown renders below. -->\n <div *ngIf=\"adding\" class=\"cqa-relative\" style=\"min-width:200px;\">\n <input #tagInput\n type=\"text\"\n class=\"cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-text-sm cqa-outline-none cqa-w-full\"\n style=\"border:1px solid #6366F1;box-shadow:0 0 0 3px rgba(99,102,241,0.12);\"\n placeholder=\"Tag\u2026\"\n [value]=\"draft\"\n (input)=\"onDraftChange($any($event.target).value)\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\" />\n\n <div *ngIf=\"suggestions.length > 0\"\n class=\"cqa-absolute cqa-z-10 cqa-mt-1 cqa-bg-white cqa-rounded-md cqa-shadow-lg cqa-w-full\"\n style=\"border:1px solid #E5E7EB;max-height:220px;overflow-y:auto;left:0;\">\n <div *ngFor=\"let s of suggestions\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-3 cqa-py-2 cqa-cursor-pointer hover:cqa-bg-[#F3F4F6]\"\n (mousedown)=\"onSuggestionMouseDown($event, s)\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-text-sm cqa-text-gray-800\">\n <mat-icon class=\"!cqa-w-[14px] !cqa-h-[14px] !cqa-text-[14px] cqa-leading-[14px]\" style=\"color:#6B21A8;\">sell</mat-icon>\n <span>{{ s.name }}</span>\n </span>\n <span *ngIf=\"s.count != null\" class=\"cqa-text-[11px] cqa-text-gray-400\">{{ s.count }}</span>\n </div>\n </div>\n </div>\n</div>\n" }]
119
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { tags: [{
120
- type: Input
121
- }], availableTags: [{
122
- type: Input
123
- }], tagsChange: [{
124
- type: Output
125
- }], tagInputRef: [{
126
- type: ViewChild,
127
- args: ['tagInput']
128
- }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLXZhcmlhYmxlLXRhZ3MtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZy9nbG9iYWwtdmFyaWFibGUtdGFncy1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy1nbG9iYWwtdmFyaWFibGUtZGlhbG9nL2dsb2JhbC12YXJpYWJsZS10YWdzLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7OztBQUd2Qjs7Ozs7Ozs7Ozs7OztHQWFHO0FBT0gsTUFBTSxPQUFPLGdDQUFnQztJQVUzQyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQVQxQyxTQUFJLEdBQWEsRUFBRSxDQUFDO1FBQ3BCLGtCQUFhLEdBQThCLEVBQUUsQ0FBQztRQUM3QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUlwRCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsVUFBSyxHQUFHLEVBQUUsQ0FBQztJQUUyQyxDQUFDO0lBRXZELElBQUksV0FBVztRQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMs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QUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs2SEFuR1UsZ0NBQWdDO2lIQUFoQyxnQ0FBZ0Msc1dDaEM3QywyNkZBc0RBOzJGRHRCYSxnQ0FBZ0M7a0JBTjVDLFNBQVM7K0JBQ0UsZ0NBQWdDLG1CQUV6Qix1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUU7d0dBR3pELElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRWdCLFdBQVc7c0JBQWpDLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHbG9iYWxWYXJpYWJsZVRhZ09wdGlvbiB9IGZyb20gJy4vbmV3LWdsb2JhbC12YXJpYWJsZS1kaWFsb2cubW9kZWxzJztcblxuLyoqXG4gKiBUYWcgY2hpcC1saXN0ICsgYXV0b2NvbXBsZXRlIHVzZWQgYnkgdGhlIE5ldyAvIEVkaXQgR2xvYmFsIFZhcmlhYmxlIGRpYWxvZy5cbiAqIE1pcnJvcnMgdGhlIFJlYWN0IGBUYWdzRWRpdG9yYCBibG9jayBpblxuICogYEVudmlyb25tZW50IGFuZCBEYXRhIE1hbmFnZW1lbnRfQ0QgRGVpc2ducy9zcmMvR2xvYmFsLmpzeDoxNzktMjM3YDpcbiAqXG4gKiAgIFtjaGlwIMOXIOKApl0gIFsrIEFkZCB0YWddICAg4oaQICBpbmFjdGl2ZSBzdGF0ZVxuICogICBbY2hpcCDDlyDigKZdICBbX2lucHV0XyAg4oazIHN1Z2dlc3Rpb25zXSAgIOKGkCAgYWN0aXZlIHN0YXRlXG4gKlxuICogQmVoYXZpb3I6XG4gKiAgIC0gQmFja3NwYWNlIG9uIGFuIGVtcHR5IGlucHV0IHJlbW92ZXMgdGhlIGxhc3QgdGFnLlxuICogICAtIEVudGVyIGNvbW1pdHMgdGhlIHRyaW1tZWQgbG93ZXJjYXNlIHZhbHVlIChjcmVhdGVzIGlmIG5vdCBpbiBhdmFpbGFibGUpLlxuICogICAtIEVzY2FwZSBleGl0cyB0aGUgaW5wdXQgd2l0aG91dCBjb21taXR0aW5nLlxuICogICAtIFN1Z2dlc3Rpb25zIGFyZSBjb21wdXRlZCBmcm9tIGBhdmFpbGFibGVUYWdzYCwgY2FwcGVkIGF0IDQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1nbG9iYWwtdmFyaWFibGUtdGFncy1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9nbG9iYWwtdmFyaWFibGUtdGFncy1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnLCBzdHlsZTogJ2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTsnIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdsb2JhbFZhcmlhYmxlVGFnc0lucHV0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgdGFnczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgYXZhaWxhYmxlVGFnczogR2xvYmFsVmFyaWFibGVUYWdPcHRpb25bXSA9IFtdO1xuICBAT3V0cHV0KCkgdGFnc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgQFZpZXdDaGlsZCgndGFnSW5wdXQnKSB0YWdJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgYWRkaW5nID0gZmFsc2U7XG4gIGRyYWZ0ID0gJyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGdldCBzdWdnZXN0aW9ucygpOiBHbG9iYWxWYXJpYWJsZVRhZ09wdGlvbltdIHtcbiAgICBjb25zdCB0eXBlZCA9IHRoaXMuZHJhZnQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdGFrZW4gPSBuZXcgU2V0KCh0aGlzLnRhZ3MgPz8gW10pLm1hcCh0ID0+IHQudG9Mb3dlckNhc2UoKSkpO1xuICAgIGNvbnN0IHBvb2wgPSAodGhpcy5hdmFpbGFibGVUYWdzID8/IFtdKS5maWx0ZXIodCA9PiAhdGFrZW4uaGFzKCh0Lm5hbWUgPz8gJycpLnRvTG93ZXJDYXNlKCkpKTtcbiAgICBpZiAodHlwZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcG9vbC5zbGljZSgwLCA0KTtcbiAgICB9XG4gICAgcmV0dXJuIHBvb2xcbiAgICAgIC5maWx0ZXIodCA9PiAodC5uYW1lID8/ICcnKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgodHlwZWQpKVxuICAgICAgLnNsaWNlKDAsIDQpO1xuICB9XG5cbiAgYmVnaW5BZGQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZHJhZnQgPSAnJztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFnSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgMCk7XG4gIH1cblxuICBvbkRyYWZ0Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZHJhZnQgPSBuZXh0ID8/ICcnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY29tbWl0RHJhZnQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNhbmNlbEFkZCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhdGhpcy5kcmFmdCAmJiB0aGlzLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMucmVtb3ZlQXQodGhpcy50YWdzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3VnZ2VzdGlvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc3VnZ2VzdGlvbjogR2xvYmFsVmFyaWFibGVUYWdPcHRpb24pOiB2b2lkIHtcbiAgICAvLyBtb3VzZURvd24gYmVhdHMgYmx1ciBzbyB0aGUgY2xpY2sgcmVnaXN0ZXJzIGJlZm9yZSB0aGUgaW5wdXQgbG9zZXMgZm9jdXNcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY29tbWl0KHN1Z2dlc3Rpb24ubmFtZSk7XG4gIH1cblxuICBvbkJsdXIoKTogdm9pZCB7XG4gICAgLy8gRGVmZXIgc28gc3VnZ2VzdGlvbiBjbGljayBoYXMgYSBjaGFuY2UgdG8gZmlyZSBmaXJzdFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFkZGluZykgeyByZXR1cm47IH1cbiAgICAgIHRoaXMuY29tbWl0RHJhZnQoKTtcbiAgICB9LCAxNTApO1xuICB9XG5cbiAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSAodGhpcy50YWdzID8/IFtdKS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICB0aGlzLnRhZ3MgPSBuZXh0O1xuICAgIHRoaXMudGFnc0NoYW5nZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21taXREcmFmdCgpOiB2b2lkIHtcbiAgICBjb25zdCByYXcgPSAodGhpcy5kcmFmdCA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHRoaXMuY2FuY2VsQWRkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29tbWl0KHJhdyk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gKG5hbWUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghbm9ybWFsaXplZCkgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWtlbiA9IG5ldyBTZXQoKHRoaXMudGFncyA/PyBbXSkubWFwKHQgPT4gdC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgaWYgKHRha2VuLmhhcyhub3JtYWxpemVkKSkge1xuICAgICAgdGhpcy5jYW5jZWxBZGQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IFsuLi4odGhpcy50YWdzID8/IFtdKSwgbm9ybWFsaXplZF07XG4gICAgdGhpcy50YWdzID0gbmV4dDtcbiAgICB0aGlzLnRhZ3NDaGFuZ2UuZW1pdChuZXh0KTtcbiAgICB0aGlzLmRyYWZ0ID0gJyc7XG4gICAgdGhpcy5hZGRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsQWRkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmFmdCA9ICcnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gIDwhLS0gU2VsZWN0ZWQgdGFnIGNoaXBzIC0tPlxuICA8c3BhbiAqbmdGb3I9XCJsZXQgdGFnIG9mIHRhZ3M7IGxldCBpID0gaW5kZXhcIlxuICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIlxuICAgIHN0eWxlPVwiYmFja2dyb3VuZDojRkFFOEZGO2NvbG9yOiM2QjIxQTg7XCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LVsxMnB4XSAhY3FhLWgtWzEycHhdICFjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzEycHhdXCI+c2VsbDwvbWF0LWljb24+XG4gICAgPHNwYW4+e3sgdGFnIH19PC9zcGFuPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctWyNFOUQ1RkZdXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyOm5vbmU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtwYWRkaW5nOjA7XCJcbiAgICAgIChjbGljayk9XCJyZW1vdmVBdChpKVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgdGFnICcgKyB0YWdcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy1bMTJweF0gIWNxYS1oLVsxMnB4XSAhY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxMnB4XVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9zcGFuPlxuXG4gIDwhLS0gSW5hY3RpdmU6IFwiKyBBZGQgdGFnXCIgcGlsbCAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cIiFhZGRpbmdcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLXRleHQteHMgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICBzdHlsZT1cImJvcmRlcjoxcHggZGFzaGVkICNENEQ0RDg7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojNTI1MjVCO1wiXG4gICAgKGNsaWNrKT1cImJlZ2luQWRkKClcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctWzEycHhdICFjcWEtaC1bMTJweF0gIWNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTJweF1cIj5hZGQ8L21hdC1pY29uPlxuICAgIDxzcGFuPkFkZCB0YWc8L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gQWN0aXZlOiBpbnB1dCArIHN1Z2dlc3Rpb25zLiBJbnB1dCBtYXRjaGVzIHRoZSBkaWFsb2cncyBvdGhlciBpbnB1dHM6XG4gICAgICAgZnVsbC13aWR0aCByb3csIDFweCBzb2xpZCBib3JkZXIsIHJvdW5kZWQ7IGlucHV0IGJvcmRlciBpdHNlbGYgaXMgdGhlXG4gICAgICAgaW5uZXIgcGlsbCB0aGUgdXNlciB0eXBlcyBpbnRvLiBTdWdnZXN0aW9uIGRyb3Bkb3duIHJlbmRlcnMgYmVsb3cuIC0tPlxuICA8ZGl2ICpuZ0lmPVwiYWRkaW5nXCIgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIm1pbi13aWR0aDoyMDBweDtcIj5cbiAgICA8aW5wdXQgI3RhZ0lucHV0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtc20gY3FhLW91dGxpbmUtbm9uZSBjcWEtdy1mdWxsXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjNjM2NkYxO2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoOTksMTAyLDI0MSwwLjEyKTtcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJUYWfigKZcIlxuICAgICAgW3ZhbHVlXT1cImRyYWZ0XCJcbiAgICAgIChpbnB1dCk9XCJvbkRyYWZ0Q2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCIgLz5cblxuICAgIDxkaXYgKm5nSWY9XCJzdWdnZXN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS16LTEwIGNxYS1tdC0xIGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1tZCBjcWEtc2hhZG93LWxnIGNxYS13LWZ1bGxcIlxuICAgICAgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNFNUU3RUI7bWF4LWhlaWdodDoyMjBweDtvdmVyZmxvdy15OmF1dG87bGVmdDowO1wiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcyBvZiBzdWdnZXN0aW9uc1wiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMiBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwib25TdWdnZXN0aW9uTW91c2VEb3duKCRldmVudCwgcylcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS04MDBcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctWzE0cHhdICFjcWEtaC1bMTRweF0gIWNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTRweF1cIiBzdHlsZT1cImNvbG9yOiM2QjIxQTg7XCI+c2VsbDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgcy5uYW1lIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwicy5jb3VudCAhPSBudWxsXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTFweF0gY3FhLXRleHQtZ3JheS00MDBcIj57eyBzLmNvdW50IH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,39 +0,0 @@
1
- import { ChangeDetectorRef, ElementRef, EventEmitter } from '@angular/core';
2
- import { GlobalVariableTagOption } from './new-global-variable-dialog.models';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * Tag chip-list + autocomplete used by the New / Edit Global Variable dialog.
6
- * Mirrors the React `TagsEditor` block in
7
- * `Environment and Data Management_CD Deisgns/src/Global.jsx:179-237`:
8
- *
9
- * [chip × …] [+ Add tag] ← inactive state
10
- * [chip × …] [_input_ ↳ suggestions] ← active state
11
- *
12
- * Behavior:
13
- * - Backspace on an empty input removes the last tag.
14
- * - Enter commits the trimmed lowercase value (creates if not in available).
15
- * - Escape exits the input without committing.
16
- * - Suggestions are computed from `availableTags`, capped at 4.
17
- */
18
- export declare class GlobalVariableTagsInputComponent {
19
- private readonly cdr;
20
- tags: string[];
21
- availableTags: GlobalVariableTagOption[];
22
- tagsChange: EventEmitter<string[]>;
23
- tagInputRef?: ElementRef<HTMLInputElement>;
24
- adding: boolean;
25
- draft: string;
26
- constructor(cdr: ChangeDetectorRef);
27
- get suggestions(): GlobalVariableTagOption[];
28
- beginAdd(): void;
29
- onDraftChange(next: string): void;
30
- onKeyDown(event: KeyboardEvent): void;
31
- onSuggestionMouseDown(event: MouseEvent, suggestion: GlobalVariableTagOption): void;
32
- onBlur(): void;
33
- removeAt(index: number): void;
34
- private commitDraft;
35
- private commit;
36
- private cancelAdd;
37
- static ɵfac: i0.ɵɵFactoryDeclaration<GlobalVariableTagsInputComponent, never>;
38
- static ɵcmp: i0.ɵɵComponentDeclaration<GlobalVariableTagsInputComponent, "lib-global-variable-tags-input", never, { "tags": "tags"; "availableTags": "availableTags"; }, { "tagsChange": "tagsChange"; }, never, never>;
39
- }