@cqa-lib/cqa-ui 1.1.537-gamma.5 → 1.1.538
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/README.md +1 -8
- package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
- package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
- package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
- package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +10 -30
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +5 -16
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.models.mjs +1 -1
- package/esm2020/lib/segment-control/segment-control.component.mjs +4 -12
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +3 -17
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +3 -17
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +3 -12
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +27 -315
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +3 -3
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +3 -3
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +2 -1
- package/esm2020/lib/templates/table-template.component.mjs +3 -5
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +4 -43
- package/esm2020/lib/test-case-details/test-case-details.models.mjs +1 -3
- package/esm2020/lib/ui-kit.module.mjs +1 -6
- package/esm2020/public-api.mjs +1 -2
- package/fesm2015/cqa-lib-cqa-ui.mjs +121 -664
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +58 -591
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/new-global-variable-dialog/new-global-variable-dialog.component.d.ts +2 -5
- package/lib/new-global-variable-dialog/new-global-variable-dialog.models.d.ts +0 -8
- package/lib/segment-control/segment-control.component.d.ts +1 -3
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +1 -15
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +1 -15
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +1 -11
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +4 -71
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +2 -0
- package/lib/templates/table-template.component.d.ts +1 -8
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +0 -7
- package/lib/test-case-details/test-case-details.models.d.ts +0 -2
- package/lib/ui-kit.module.d.ts +96 -97
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/styles.css +1 -1
- package/esm2020/lib/new-global-variable-dialog/global-variable-tags-input.component.mjs +0 -129
- 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
|
-
}
|