@masterteam/components 0.0.170 → 0.0.171

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 (27) hide show
  1. package/assets/common.css +1 -1
  2. package/assets/i18n/ar.json +273 -278
  3. package/assets/i18n/en.json +273 -257
  4. package/fesm2022/masterteam-components-entities.mjs +97 -3
  5. package/fesm2022/masterteam-components-entities.mjs.map +1 -1
  6. package/fesm2022/masterteam-components-location-field.mjs +315 -0
  7. package/fesm2022/masterteam-components-location-field.mjs.map +1 -0
  8. package/fesm2022/masterteam-components-multi-select-field.mjs +2 -2
  9. package/fesm2022/masterteam-components-multi-select-field.mjs.map +1 -1
  10. package/fesm2022/masterteam-components-radio-cards-field.mjs +7 -4
  11. package/fesm2022/masterteam-components-radio-cards-field.mjs.map +1 -1
  12. package/fesm2022/masterteam-components-select-field.mjs +2 -2
  13. package/fesm2022/masterteam-components-select-field.mjs.map +1 -1
  14. package/fesm2022/masterteam-components-sidebar.mjs +2 -2
  15. package/fesm2022/masterteam-components-sidebar.mjs.map +1 -1
  16. package/fesm2022/masterteam-components-table.mjs +28 -6
  17. package/fesm2022/masterteam-components-table.mjs.map +1 -1
  18. package/fesm2022/masterteam-components-tabs.mjs +31 -3
  19. package/fesm2022/masterteam-components-tabs.mjs.map +1 -1
  20. package/fesm2022/masterteam-components.mjs +12 -1
  21. package/fesm2022/masterteam-components.mjs.map +1 -1
  22. package/package.json +5 -1
  23. package/types/masterteam-components-entities.d.ts +24 -5
  24. package/types/masterteam-components-location-field.d.ts +95 -0
  25. package/types/masterteam-components-radio-cards-field.d.ts +2 -1
  26. package/types/masterteam-components-tabs.d.ts +3 -0
  27. package/types/masterteam-components.d.ts +13 -3
@@ -0,0 +1,315 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, effect, ChangeDetectionStrategy, Component, signal, viewChild, computed } from '@angular/core';
3
+ import { HttpClient, HttpBackend, HttpParams } from '@angular/common/http';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormGroup, FormControl, Validators, ReactiveFormsModule, NgControl, FormsModule } from '@angular/forms';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { TranslocoPipe, TranslocoService } from '@jsverse/transloco';
8
+ import * as i2 from 'primeng/autocomplete';
9
+ import { AutoCompleteModule } from 'primeng/autocomplete';
10
+ import * as i4 from 'primeng/inputgroup';
11
+ import { InputGroupModule } from 'primeng/inputgroup';
12
+ import * as i5 from 'primeng/inputgroupaddon';
13
+ import { InputGroupAddonModule } from 'primeng/inputgroupaddon';
14
+ import { Subject, debounceTime, tap, switchMap, take, of, finalize, catchError } from 'rxjs';
15
+ import { FieldValidation } from '@masterteam/components/field-validation';
16
+ import { isInvalid } from '@masterteam/components';
17
+ import { Tooltip } from '@masterteam/components/tooltip';
18
+ import { ModalService } from '@masterteam/components/modal';
19
+ import { Icon } from '@masterteam/icons';
20
+ import { Button } from '@masterteam/components/button';
21
+ import { ModalRef } from '@masterteam/components/dialog';
22
+ import { NumberField } from '@masterteam/components/number-field';
23
+ import { TextField } from '@masterteam/components/text-field';
24
+ import * as i3 from 'primeng/api';
25
+
26
+ function normalizeLocationValue(value) {
27
+ if (value === null || value === undefined || value === '') {
28
+ return null;
29
+ }
30
+ if (typeof value === 'string') {
31
+ const trimmed = value.trim();
32
+ if (!trimmed)
33
+ return null;
34
+ try {
35
+ return normalizeLocationValue(JSON.parse(trimmed));
36
+ }
37
+ catch {
38
+ return {
39
+ display_name: trimmed,
40
+ address: trimmed,
41
+ };
42
+ }
43
+ }
44
+ if (typeof value !== 'object') {
45
+ return {
46
+ display_name: String(value),
47
+ address: String(value),
48
+ };
49
+ }
50
+ const source = value;
51
+ const lat = source['lat'];
52
+ const lon = source['lon'] ?? source['lng'];
53
+ const displayName = readString(source['display_name']) ??
54
+ readString(source['displayName']) ??
55
+ readString(source['address']) ??
56
+ readString(source['name']);
57
+ return {
58
+ ...source,
59
+ ...(displayName ? { display_name: displayName, address: displayName } : {}),
60
+ ...(lat !== undefined ? { lat: lat } : {}),
61
+ ...(lon !== undefined
62
+ ? { lon: lon, lng: lon }
63
+ : {}),
64
+ };
65
+ }
66
+ function getLocationDisplayName(value) {
67
+ return value?.display_name?.trim() || value?.address?.trim() || '';
68
+ }
69
+ function getLocationLongitude(value) {
70
+ return value?.lon ?? value?.lng;
71
+ }
72
+ function readString(value) {
73
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
74
+ }
75
+
76
+ class LocationManualDialog {
77
+ initialValue = input(null, ...(ngDevMode ? [{ debugName: "initialValue" }] : /* istanbul ignore next */ []));
78
+ modal = inject(ModalService);
79
+ ref = inject(ModalRef);
80
+ form = new FormGroup({
81
+ display_name: new FormControl('', {
82
+ nonNullable: true,
83
+ validators: [Validators.required],
84
+ }),
85
+ longitude: new FormControl(null, {
86
+ validators: [
87
+ Validators.required,
88
+ Validators.min(-180),
89
+ Validators.max(180),
90
+ ],
91
+ }),
92
+ latitude: new FormControl(null, {
93
+ validators: [
94
+ Validators.required,
95
+ Validators.min(-90),
96
+ Validators.max(90),
97
+ ],
98
+ }),
99
+ });
100
+ constructor() {
101
+ effect(() => {
102
+ const value = normalizeLocationValue(this.initialValue());
103
+ this.form.patchValue({
104
+ display_name: getLocationDisplayName(value),
105
+ longitude: coerceNumber(getLocationLongitude(value)),
106
+ latitude: coerceNumber(value?.lat),
107
+ }, { emitEvent: false });
108
+ });
109
+ }
110
+ cancel() {
111
+ this.ref.close(null);
112
+ }
113
+ save() {
114
+ if (this.form.invalid) {
115
+ this.form.markAllAsTouched();
116
+ return;
117
+ }
118
+ const raw = this.form.getRawValue();
119
+ this.ref.close(normalizeLocationValue({
120
+ display_name: raw.display_name,
121
+ address: raw.display_name,
122
+ lon: raw.longitude,
123
+ lng: raw.longitude,
124
+ lat: raw.latitude,
125
+ }));
126
+ }
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LocationManualDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: LocationManualDialog, isStandalone: true, selector: "mt-location-manual-dialog", inputs: { initialValue: { classPropertyName: "initialValue", publicName: "initialValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<form\n [formGroup]=\"form\"\n [class]=\"modal.contentClass + ' flex flex-col gap-4 p-4'\"\n>\n <mt-text-field\n [label]=\"'components.locationField.displayName' | transloco\"\n [placeholder]=\"'components.locationField.displayName' | transloco\"\n formControlName=\"display_name\"\n [required]=\"true\"\n />\n <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <mt-number-field\n [label]=\"'components.locationField.longitude' | transloco\"\n [placeholder]=\"'components.locationField.longitude' | transloco\"\n [min]=\"-180\"\n [max]=\"180\"\n formControlName=\"longitude\"\n [required]=\"true\"\n />\n <mt-number-field\n [label]=\"'components.locationField.latitude' | transloco\"\n [placeholder]=\"'components.locationField.latitude' | transloco\"\n [min]=\"-90\"\n [max]=\"90\"\n formControlName=\"latitude\"\n [required]=\"true\"\n />\n </div>\n</form>\n\n<div [class]=\"modal.footerClass\">\n <mt-button\n [label]=\"'components.locationField.cancel' | transloco\"\n variant=\"outlined\"\n (onClick)=\"cancel()\"\n />\n <mt-button\n [label]=\"'components.locationField.save' | transloco\"\n severity=\"primary\"\n [disabled]=\"form.invalid\"\n (onClick)=\"save()\"\n />\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: NumberField, selector: "mt-number-field", inputs: ["field", "hint", "label", "placeholder", "class", "readonly", "pInputs", "format", "useGrouping", "maxFractionDigits", "min", "max", "required"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LocationManualDialog, decorators: [{
131
+ type: Component,
132
+ args: [{ selector: 'mt-location-manual-dialog', imports: [ReactiveFormsModule, TranslocoPipe, Button, TextField, NumberField], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n [formGroup]=\"form\"\n [class]=\"modal.contentClass + ' flex flex-col gap-4 p-4'\"\n>\n <mt-text-field\n [label]=\"'components.locationField.displayName' | transloco\"\n [placeholder]=\"'components.locationField.displayName' | transloco\"\n formControlName=\"display_name\"\n [required]=\"true\"\n />\n <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <mt-number-field\n [label]=\"'components.locationField.longitude' | transloco\"\n [placeholder]=\"'components.locationField.longitude' | transloco\"\n [min]=\"-180\"\n [max]=\"180\"\n formControlName=\"longitude\"\n [required]=\"true\"\n />\n <mt-number-field\n [label]=\"'components.locationField.latitude' | transloco\"\n [placeholder]=\"'components.locationField.latitude' | transloco\"\n [min]=\"-90\"\n [max]=\"90\"\n formControlName=\"latitude\"\n [required]=\"true\"\n />\n </div>\n</form>\n\n<div [class]=\"modal.footerClass\">\n <mt-button\n [label]=\"'components.locationField.cancel' | transloco\"\n variant=\"outlined\"\n (onClick)=\"cancel()\"\n />\n <mt-button\n [label]=\"'components.locationField.save' | transloco\"\n severity=\"primary\"\n [disabled]=\"form.invalid\"\n (onClick)=\"save()\"\n />\n</div>\n" }]
133
+ }], ctorParameters: () => [], propDecorators: { initialValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialValue", required: false }] }] } });
134
+ function coerceNumber(value) {
135
+ if (value === null || value === undefined || value === '') {
136
+ return null;
137
+ }
138
+ const parsed = Number(value);
139
+ return Number.isFinite(parsed) ? parsed : null;
140
+ }
141
+
142
+ class LocationField {
143
+ hint = input(...(ngDevMode ? [undefined, { debugName: "hint" }] : /* istanbul ignore next */ []));
144
+ label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
145
+ placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
146
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
147
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
148
+ minLength = input(2, ...(ngDevMode ? [{ debugName: "minLength" }] : /* istanbul ignore next */ []));
149
+ configuration = input(null, ...(ngDevMode ? [{ debugName: "configuration" }] : /* istanbul ignore next */ []));
150
+ searchUrl = input('https://nominatim.openstreetmap.org/search', ...(ngDevMode ? [{ debugName: "searchUrl" }] : /* istanbul ignore next */ []));
151
+ value = signal(null, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
152
+ suggestions = signal([], ...(ngDevMode ? [{ debugName: "suggestions" }] : /* istanbul ignore next */ []));
153
+ disabled = signal(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
154
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
155
+ requiredValidator = Validators.required;
156
+ autocomplete = viewChild('autocomplete', ...(ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []));
157
+ displayValue = computed(() => getLocationDisplayName(this.value()), ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
158
+ resolvedSearchUrl = computed(() => {
159
+ const configuredUrl = this.configuration()?.nominatimBaseUrl;
160
+ return typeof configuredUrl === 'string' && configuredUrl.trim()
161
+ ? configuredUrl
162
+ : (this.searchUrl() ?? 'https://nominatim.openstreetmap.org/search');
163
+ }, ...(ngDevMode ? [{ debugName: "resolvedSearchUrl" }] : /* istanbul ignore next */ []));
164
+ countryName = computed(() => {
165
+ const country = this.configuration()?.country;
166
+ if (typeof country === 'string')
167
+ return country.trim();
168
+ return country?.name?.trim() ?? '';
169
+ }, ...(ngDevMode ? [{ debugName: "countryName" }] : /* istanbul ignore next */ []));
170
+ countryCode = computed(() => {
171
+ const country = this.configuration()?.country;
172
+ if (typeof country === 'object')
173
+ return country?.code?.trim() ?? '';
174
+ return '';
175
+ }, ...(ngDevMode ? [{ debugName: "countryCode" }] : /* istanbul ignore next */ []));
176
+ viewBox = computed(() => {
177
+ const config = this.configuration();
178
+ const country = config?.country;
179
+ if (typeof config?.viewBox === 'string' && config.viewBox.trim()) {
180
+ return config.viewBox;
181
+ }
182
+ if (typeof country === 'object' && country?.viewBox?.trim()) {
183
+ return country.viewBox;
184
+ }
185
+ return '';
186
+ }, ...(ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []));
187
+ ngControl = null;
188
+ isInvalid = isInvalid;
189
+ modal = inject(ModalService);
190
+ transloco = inject(TranslocoService);
191
+ http = new HttpClient(inject(HttpBackend));
192
+ searchTerms = new Subject();
193
+ onTouched = () => { };
194
+ onModelChange = () => { };
195
+ constructor() {
196
+ this.ngControl = inject(NgControl, { self: true, optional: true });
197
+ if (this.ngControl) {
198
+ this.ngControl.valueAccessor = this;
199
+ }
200
+ effect(() => {
201
+ if (this.ngControl?.control && this.required()) {
202
+ this.ngControl.control.addValidators(Validators.required);
203
+ this.ngControl.control.updateValueAndValidity({ emitEvent: false });
204
+ }
205
+ });
206
+ this.searchTerms
207
+ .pipe(takeUntilDestroyed(), debounceTime(250), tap(() => this.loading.set(true)), switchMap((term) => this.searchLocations(term)))
208
+ .subscribe((items) => this.suggestions.set(items));
209
+ }
210
+ search(event) {
211
+ this.searchTerms.next(event.query);
212
+ }
213
+ onFocus() {
214
+ if (this.suggestions().length > 0) {
215
+ this.autocomplete()?.show();
216
+ }
217
+ }
218
+ onSelect(event) {
219
+ this.setValue(normalizeLocationValue(event.value));
220
+ }
221
+ onClear() {
222
+ this.setValue(null);
223
+ this.suggestions.set([]);
224
+ }
225
+ openManualDialog() {
226
+ if (this.disabled() || this.readonly())
227
+ return;
228
+ const ref = this.modal.openModal(LocationManualDialog, 'dialog', {
229
+ header: this.transloco.translate('components.locationField.manualHeader'),
230
+ styleClass: '!w-[40rem] max-w-[96vw]',
231
+ dismissableMask: true,
232
+ inputValues: {
233
+ initialValue: this.value(),
234
+ },
235
+ });
236
+ ref.onClose.pipe(take(1)).subscribe((result) => {
237
+ const next = normalizeLocationValue(result);
238
+ if (!next)
239
+ return;
240
+ this.setValue(next);
241
+ });
242
+ }
243
+ writeValue(value) {
244
+ this.value.set(normalizeLocationValue(value));
245
+ }
246
+ registerOnChange(fn) {
247
+ this.onModelChange = fn;
248
+ }
249
+ registerOnTouched(fn) {
250
+ this.onTouched = fn;
251
+ }
252
+ setDisabledState(disabled) {
253
+ this.disabled.set(disabled);
254
+ }
255
+ setValue(value) {
256
+ this.value.set(value);
257
+ this.onModelChange(value);
258
+ this.onTouched();
259
+ }
260
+ searchLocations(term) {
261
+ const trimmed = term?.trim();
262
+ if (!trimmed || trimmed.length < this.minLength()) {
263
+ this.loading.set(false);
264
+ return of([]);
265
+ }
266
+ const countryName = this.countryName();
267
+ const query = countryName && !trimmed.toLowerCase().includes(countryName.toLowerCase())
268
+ ? `${trimmed}, ${countryName}`
269
+ : trimmed;
270
+ let params = new HttpParams()
271
+ .set('q', query)
272
+ .set('format', 'json')
273
+ .set('addressdetails', '1')
274
+ .set('limit', '10')
275
+ .set('accept-language', this.transloco.getActiveLang() || 'en');
276
+ const viewBox = this.viewBox();
277
+ if (viewBox) {
278
+ params = params.set('bounded', '1').set('viewbox', viewBox);
279
+ }
280
+ const countryCode = this.countryCode();
281
+ if (countryCode) {
282
+ params = params.set('countrycodes', countryCode.toLowerCase());
283
+ }
284
+ return this.http.get(this.resolvedSearchUrl(), { params }).pipe(finalize(() => this.loading.set(false)), catchError((error) => {
285
+ console.error('Location search failed:', error);
286
+ return of([]);
287
+ }), switchMap((items) => of(items
288
+ .map((item) => normalizeLocationValue(item))
289
+ .filter((item) => item !== null))));
290
+ }
291
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LocationField, deps: [], target: i0.ɵɵFactoryTarget.Component });
292
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: LocationField, isStandalone: true, selector: "mt-location-field", inputs: { hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: false, transformFunction: null }, searchUrl: { classPropertyName: "searchUrl", publicName: "searchUrl", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "grid gap-1" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: ["autocomplete"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (label() || hint()) {\n <div class=\"mb-1 flex items-center gap-1\">\n @if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n }\n @if (hint()) {\n <span\n class=\"inline-flex text-surface-400\"\n [mtTooltip]=\"hint()\"\n tooltipPosition=\"top\"\n >\n <mt-icon icon=\"general.help-circle\" />\n </span>\n }\n </div>\n}\n\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"suggestions()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"'components.locationField.search' | transloco\"\n [optionLabel]=\"'display_name'\"\n [minLength]=\"minLength()\"\n [forceSelection]=\"true\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n >\n <ng-template let-location pTemplate=\"item\">\n <div class=\"flex min-w-0 items-start gap-2\">\n <mt-icon icon=\"map.marker-pin-01\" class=\"mt-0.5 shrink-0 text-xl\" />\n <span class=\"min-w-0 text-wrap text-sm leading-5\">\n {{ location.display_name }}\n </span>\n </div>\n </ng-template>\n\n <ng-template let-location pTemplate=\"selecteditem\">\n <span class=\"min-w-0 truncate\">{{ location?.display_name }}</span>\n </ng-template>\n </p-autoComplete>\n\n <p-inputgroup-addon>\n <button\n type=\"button\"\n class=\"inline-flex h-full items-center justify-center text-surface-500 transition-colors hover:text-primary-500 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"disabled() || readonly()\"\n [mtTooltip]=\"'components.locationField.enterManually' | transloco\"\n tooltipPosition=\"top\"\n (click)=\"openManualDialog()\"\n >\n <mt-icon icon=\"general.edit-03\" />\n </button>\n </p-inputgroup-addon>\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"absolute end-12 top-1/2 -translate-y-1/2 animate-spin bg-white\"\n />\n }\n</div>\n\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i2.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo", "motionOptions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i4.InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "ngmodule", type: InputGroupAddonModule }, { kind: "component", type: i5.InputGroupAddon, selector: "p-inputgroup-addon, p-inputGroupAddon", inputs: ["style", "styleClass"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }, { kind: "directive", type: Tooltip, selector: "[mtTooltip]" }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
293
+ }
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LocationField, decorators: [{
295
+ type: Component,
296
+ args: [{ selector: 'mt-location-field', imports: [
297
+ FormsModule,
298
+ AutoCompleteModule,
299
+ InputGroupModule,
300
+ InputGroupAddonModule,
301
+ FieldValidation,
302
+ Tooltip,
303
+ Icon,
304
+ TranslocoPipe,
305
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
306
+ class: 'grid gap-1',
307
+ }, template: "@if (label() || hint()) {\n <div class=\"mb-1 flex items-center gap-1\">\n @if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n }\n @if (hint()) {\n <span\n class=\"inline-flex text-surface-400\"\n [mtTooltip]=\"hint()\"\n tooltipPosition=\"top\"\n >\n <mt-icon icon=\"general.help-circle\" />\n </span>\n }\n </div>\n}\n\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"suggestions()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"'components.locationField.search' | transloco\"\n [optionLabel]=\"'display_name'\"\n [minLength]=\"minLength()\"\n [forceSelection]=\"true\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n >\n <ng-template let-location pTemplate=\"item\">\n <div class=\"flex min-w-0 items-start gap-2\">\n <mt-icon icon=\"map.marker-pin-01\" class=\"mt-0.5 shrink-0 text-xl\" />\n <span class=\"min-w-0 text-wrap text-sm leading-5\">\n {{ location.display_name }}\n </span>\n </div>\n </ng-template>\n\n <ng-template let-location pTemplate=\"selecteditem\">\n <span class=\"min-w-0 truncate\">{{ location?.display_name }}</span>\n </ng-template>\n </p-autoComplete>\n\n <p-inputgroup-addon>\n <button\n type=\"button\"\n class=\"inline-flex h-full items-center justify-center text-surface-500 transition-colors hover:text-primary-500 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"disabled() || readonly()\"\n [mtTooltip]=\"'components.locationField.enterManually' | transloco\"\n tooltipPosition=\"top\"\n (click)=\"openManualDialog()\"\n >\n <mt-icon icon=\"general.edit-03\" />\n </button>\n </p-inputgroup-addon>\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"absolute end-12 top-1/2 -translate-y-1/2 animate-spin bg-white\"\n />\n }\n</div>\n\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\n" }]
308
+ }], ctorParameters: () => [], propDecorators: { hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], configuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "configuration", required: false }] }], searchUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchUrl", required: false }] }], autocomplete: [{ type: i0.ViewChild, args: ['autocomplete', { isSignal: true }] }] } });
309
+
310
+ /**
311
+ * Generated bundle index. Do not edit.
312
+ */
313
+
314
+ export { LocationField, LocationManualDialog, getLocationDisplayName, getLocationLongitude, normalizeLocationValue };
315
+ //# sourceMappingURL=masterteam-components-location-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masterteam-components-location-field.mjs","sources":["../../../../packages/masterteam/components/location-field/location-value.ts","../../../../packages/masterteam/components/location-field/location-manual-dialog.ts","../../../../packages/masterteam/components/location-field/location-manual-dialog.html","../../../../packages/masterteam/components/location-field/location-field.ts","../../../../packages/masterteam/components/location-field/location-field.html","../../../../packages/masterteam/components/location-field/masterteam-components-location-field.ts"],"sourcesContent":["export interface LocationValue {\n display_name?: string;\n address?: string;\n lat?: string | number;\n lon?: string | number;\n lng?: string | number;\n [key: string]: unknown;\n}\n\nexport function normalizeLocationValue(value: unknown): LocationValue | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n return normalizeLocationValue(JSON.parse(trimmed));\n } catch {\n return {\n display_name: trimmed,\n address: trimmed,\n };\n }\n }\n\n if (typeof value !== 'object') {\n return {\n display_name: String(value),\n address: String(value),\n };\n }\n\n const source = value as Record<string, unknown>;\n const lat = source['lat'];\n const lon = source['lon'] ?? source['lng'];\n const displayName =\n readString(source['display_name']) ??\n readString(source['displayName']) ??\n readString(source['address']) ??\n readString(source['name']);\n\n return {\n ...source,\n ...(displayName ? { display_name: displayName, address: displayName } : {}),\n ...(lat !== undefined ? { lat: lat as string | number } : {}),\n ...(lon !== undefined\n ? { lon: lon as string | number, lng: lon as string | number }\n : {}),\n };\n}\n\nexport function getLocationDisplayName(value: LocationValue | null): string {\n return value?.display_name?.trim() || value?.address?.trim() || '';\n}\n\nexport function getLocationLongitude(\n value: LocationValue | null,\n): string | number | undefined {\n return value?.lon ?? value?.lng;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { NumberField } from '@masterteam/components/number-field';\nimport { TextField } from '@masterteam/components/text-field';\nimport {\n getLocationDisplayName,\n getLocationLongitude,\n LocationValue,\n normalizeLocationValue,\n} from './location-value';\n\n@Component({\n selector: 'mt-location-manual-dialog',\n imports: [ReactiveFormsModule, TranslocoPipe, Button, TextField, NumberField],\n templateUrl: './location-manual-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LocationManualDialog {\n readonly initialValue = input<LocationValue | null>(null);\n\n protected readonly modal = inject(ModalService);\n private readonly ref = inject(ModalRef);\n\n protected readonly form = new FormGroup({\n display_name: new FormControl('', {\n nonNullable: true,\n validators: [Validators.required],\n }),\n longitude: new FormControl<number | null>(null, {\n validators: [\n Validators.required,\n Validators.min(-180),\n Validators.max(180),\n ],\n }),\n latitude: new FormControl<number | null>(null, {\n validators: [\n Validators.required,\n Validators.min(-90),\n Validators.max(90),\n ],\n }),\n });\n\n constructor() {\n effect(() => {\n const value = normalizeLocationValue(this.initialValue());\n this.form.patchValue(\n {\n display_name: getLocationDisplayName(value),\n longitude: coerceNumber(getLocationLongitude(value)),\n latitude: coerceNumber(value?.lat),\n },\n { emitEvent: false },\n );\n });\n }\n\n protected cancel(): void {\n this.ref.close(null);\n }\n\n protected save(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n\n const raw = this.form.getRawValue();\n this.ref.close(\n normalizeLocationValue({\n display_name: raw.display_name,\n address: raw.display_name,\n lon: raw.longitude,\n lng: raw.longitude,\n lat: raw.latitude,\n }),\n );\n }\n}\n\nfunction coerceNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n","<form\n [formGroup]=\"form\"\n [class]=\"modal.contentClass + ' flex flex-col gap-4 p-4'\"\n>\n <mt-text-field\n [label]=\"'components.locationField.displayName' | transloco\"\n [placeholder]=\"'components.locationField.displayName' | transloco\"\n formControlName=\"display_name\"\n [required]=\"true\"\n />\n <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <mt-number-field\n [label]=\"'components.locationField.longitude' | transloco\"\n [placeholder]=\"'components.locationField.longitude' | transloco\"\n [min]=\"-180\"\n [max]=\"180\"\n formControlName=\"longitude\"\n [required]=\"true\"\n />\n <mt-number-field\n [label]=\"'components.locationField.latitude' | transloco\"\n [placeholder]=\"'components.locationField.latitude' | transloco\"\n [min]=\"-90\"\n [max]=\"90\"\n formControlName=\"latitude\"\n [required]=\"true\"\n />\n </div>\n</form>\n\n<div [class]=\"modal.footerClass\">\n <mt-button\n [label]=\"'components.locationField.cancel' | transloco\"\n variant=\"outlined\"\n (onClick)=\"cancel()\"\n />\n <mt-button\n [label]=\"'components.locationField.save' | transloco\"\n severity=\"primary\"\n [disabled]=\"form.invalid\"\n (onClick)=\"save()\"\n />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpBackend, HttpClient, HttpParams } from '@angular/common/http';\nimport {\n ControlValueAccessor,\n FormsModule,\n NgControl,\n Validators,\n} from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { AutoComplete, AutoCompleteModule } from 'primeng/autocomplete';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport {\n catchError,\n debounceTime,\n finalize,\n of,\n Subject,\n switchMap,\n take,\n tap,\n} from 'rxjs';\nimport { FieldValidation } from '@masterteam/components/field-validation';\nimport { isInvalid } from '@masterteam/components';\nimport { Tooltip } from '@masterteam/components/tooltip';\nimport { ModalService } from '@masterteam/components/modal';\nimport { Icon } from '@masterteam/icons';\nimport { LocationManualDialog } from './location-manual-dialog';\nimport {\n getLocationDisplayName,\n LocationValue,\n normalizeLocationValue,\n} from './location-value';\n\nexport interface LocationFieldConfiguration {\n country?: string | { name?: string; code?: string; viewBox?: string };\n viewBox?: string;\n nominatimBaseUrl?: string;\n [key: string]: unknown;\n}\n\n@Component({\n selector: 'mt-location-field',\n imports: [\n FormsModule,\n AutoCompleteModule,\n InputGroupModule,\n InputGroupAddonModule,\n FieldValidation,\n Tooltip,\n Icon,\n TranslocoPipe,\n ],\n templateUrl: './location-field.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'grid gap-1',\n },\n})\nexport class LocationField implements ControlValueAccessor {\n readonly hint = input<string>();\n readonly label = input<string>();\n readonly placeholder = input<string>();\n readonly readonly = input<boolean>(false);\n readonly required = input<boolean>(false);\n readonly minLength = input<number>(2);\n readonly configuration = input<LocationFieldConfiguration | null>(null);\n readonly searchUrl = input<string | undefined>(\n 'https://nominatim.openstreetmap.org/search',\n );\n\n protected readonly value = signal<LocationValue | null>(null);\n protected readonly suggestions = signal<LocationValue[]>([]);\n protected readonly disabled = signal(false);\n protected readonly loading = signal(false);\n protected readonly requiredValidator = Validators.required;\n protected readonly autocomplete = viewChild<AutoComplete>('autocomplete');\n\n protected readonly displayValue = computed(() =>\n getLocationDisplayName(this.value()),\n );\n\n protected readonly resolvedSearchUrl = computed(() => {\n const configuredUrl = this.configuration()?.nominatimBaseUrl;\n return typeof configuredUrl === 'string' && configuredUrl.trim()\n ? configuredUrl\n : (this.searchUrl() ?? 'https://nominatim.openstreetmap.org/search');\n });\n\n protected readonly countryName = computed(() => {\n const country = this.configuration()?.country;\n if (typeof country === 'string') return country.trim();\n return country?.name?.trim() ?? '';\n });\n\n protected readonly countryCode = computed(() => {\n const country = this.configuration()?.country;\n if (typeof country === 'object') return country?.code?.trim() ?? '';\n return '';\n });\n\n protected readonly viewBox = computed(() => {\n const config = this.configuration();\n const country = config?.country;\n if (typeof config?.viewBox === 'string' && config.viewBox.trim()) {\n return config.viewBox;\n }\n if (typeof country === 'object' && country?.viewBox?.trim()) {\n return country.viewBox;\n }\n return '';\n });\n\n public ngControl: NgControl | null = null;\n protected readonly isInvalid = isInvalid;\n\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n private readonly http = new HttpClient(inject(HttpBackend));\n private readonly searchTerms = new Subject<string>();\n\n protected onTouched: () => void = () => {};\n private onModelChange: (value: LocationValue | null) => void = () => {};\n\n constructor() {\n this.ngControl = inject(NgControl, { self: true, optional: true });\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n if (this.ngControl?.control && this.required()) {\n this.ngControl.control.addValidators(Validators.required);\n this.ngControl.control.updateValueAndValidity({ emitEvent: false });\n }\n });\n\n this.searchTerms\n .pipe(\n takeUntilDestroyed(),\n debounceTime(250),\n tap(() => this.loading.set(true)),\n switchMap((term) => this.searchLocations(term)),\n )\n .subscribe((items) => this.suggestions.set(items));\n }\n\n protected search(event: { query: string }): void {\n this.searchTerms.next(event.query);\n }\n\n protected onFocus(): void {\n if (this.suggestions().length > 0) {\n this.autocomplete()?.show();\n }\n }\n\n protected onSelect(event: {\n originalEvent: Event;\n value: LocationValue;\n }): void {\n this.setValue(normalizeLocationValue(event.value));\n }\n\n protected onClear(): void {\n this.setValue(null);\n this.suggestions.set([]);\n }\n\n protected openManualDialog(): void {\n if (this.disabled() || this.readonly()) return;\n\n const ref = this.modal.openModal(LocationManualDialog, 'dialog', {\n header: this.transloco.translate('components.locationField.manualHeader'),\n styleClass: '!w-[40rem] max-w-[96vw]',\n dismissableMask: true,\n inputValues: {\n initialValue: this.value(),\n },\n });\n\n ref.onClose.pipe(take(1)).subscribe((result: unknown) => {\n const next = normalizeLocationValue(result);\n if (!next) return;\n this.setValue(next);\n });\n }\n\n writeValue(value: unknown): void {\n this.value.set(normalizeLocationValue(value));\n }\n\n registerOnChange(fn: (value: LocationValue | null) => void): void {\n this.onModelChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled.set(disabled);\n }\n\n private setValue(value: LocationValue | null): void {\n this.value.set(value);\n this.onModelChange(value);\n this.onTouched();\n }\n\n private searchLocations(term: string) {\n const trimmed = term?.trim();\n if (!trimmed || trimmed.length < this.minLength()) {\n this.loading.set(false);\n return of<LocationValue[]>([]);\n }\n\n const countryName = this.countryName();\n const query =\n countryName && !trimmed.toLowerCase().includes(countryName.toLowerCase())\n ? `${trimmed}, ${countryName}`\n : trimmed;\n\n let params = new HttpParams()\n .set('q', query)\n .set('format', 'json')\n .set('addressdetails', '1')\n .set('limit', '10')\n .set('accept-language', this.transloco.getActiveLang() || 'en');\n\n const viewBox = this.viewBox();\n if (viewBox) {\n params = params.set('bounded', '1').set('viewbox', viewBox);\n }\n\n const countryCode = this.countryCode();\n if (countryCode) {\n params = params.set('countrycodes', countryCode.toLowerCase());\n }\n\n return this.http.get<unknown[]>(this.resolvedSearchUrl(), { params }).pipe(\n finalize(() => this.loading.set(false)),\n catchError((error) => {\n console.error('Location search failed:', error);\n return of<unknown[]>([]);\n }),\n switchMap((items) =>\n of(\n items\n .map((item) => normalizeLocationValue(item))\n .filter((item): item is LocationValue => item !== null),\n ),\n ),\n );\n }\n}\n","@if (label() || hint()) {\n <div class=\"mb-1 flex items-center gap-1\">\n @if (label()) {\n <label\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\n [for]=\"ngControl?.name || label()\"\n >\n {{ label() }}\n </label>\n }\n @if (hint()) {\n <span\n class=\"inline-flex text-surface-400\"\n [mtTooltip]=\"hint()\"\n tooltipPosition=\"top\"\n >\n <mt-icon icon=\"general.help-circle\" />\n </span>\n }\n </div>\n}\n\n<div class=\"relative\">\n <p-inputgroup>\n <p-autoComplete\n #autocomplete=\"\"\n [suggestions]=\"suggestions()\"\n (completeMethod)=\"search($event)\"\n (onSelect)=\"onSelect($event)\"\n (onClear)=\"onClear()\"\n (onFocus)=\"onFocus()\"\n (onBlur)=\"onTouched()\"\n [ngModel]=\"value()\"\n [disabled]=\"disabled() || readonly()\"\n [id]=\"ngControl?.name || label()\"\n [invalid]=\"isInvalid(ngControl?.control)\"\n [placeholder]=\"'components.locationField.search' | transloco\"\n [optionLabel]=\"'display_name'\"\n [minLength]=\"minLength()\"\n [forceSelection]=\"true\"\n class=\"w-full\"\n appendTo=\"body\"\n styleClass=\"w-full\"\n >\n <ng-template let-location pTemplate=\"item\">\n <div class=\"flex min-w-0 items-start gap-2\">\n <mt-icon icon=\"map.marker-pin-01\" class=\"mt-0.5 shrink-0 text-xl\" />\n <span class=\"min-w-0 text-wrap text-sm leading-5\">\n {{ location.display_name }}\n </span>\n </div>\n </ng-template>\n\n <ng-template let-location pTemplate=\"selecteditem\">\n <span class=\"min-w-0 truncate\">{{ location?.display_name }}</span>\n </ng-template>\n </p-autoComplete>\n\n <p-inputgroup-addon>\n <button\n type=\"button\"\n class=\"inline-flex h-full items-center justify-center text-surface-500 transition-colors hover:text-primary-500 disabled:cursor-not-allowed disabled:opacity-50\"\n [disabled]=\"disabled() || readonly()\"\n [mtTooltip]=\"'components.locationField.enterManually' | transloco\"\n tooltipPosition=\"top\"\n (click)=\"openManualDialog()\"\n >\n <mt-icon icon=\"general.edit-03\" />\n </button>\n </p-inputgroup-addon>\n </p-inputgroup>\n\n @if (loading()) {\n <mt-icon\n icon=\"general.loading-01\"\n class=\"absolute end-12 top-1/2 -translate-y-1/2 animate-spin bg-white\"\n />\n }\n</div>\n\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -238,13 +238,13 @@ class MultiSelectField {
238
238
  optionOrValue);
239
239
  }
240
240
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MultiSelectField, deps: [], target: i0.ɵɵFactoryTarget.Component });
241
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MultiSelectField, isStandalone: true, selector: "mt-multi-select-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, pInputs: { classPropertyName: "pInputs", publicName: "pInputs", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedLabels: { classPropertyName: "maxSelectedLabels", publicName: "maxSelectedLabels", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, optionGroupLabel: { classPropertyName: "optionGroupLabel", publicName: "optionGroupLabel", isSignal: true, isRequired: false, transformFunction: null }, optionGroupChildren: { classPropertyName: "optionGroupChildren", publicName: "optionGroupChildren", isSignal: true, isRequired: false, transformFunction: null }, optionIcon: { classPropertyName: "optionIcon", publicName: "optionIcon", isSignal: true, isRequired: false, transformFunction: null }, optionIconColor: { classPropertyName: "optionIconColor", publicName: "optionIconColor", isSignal: true, isRequired: false, transformFunction: null }, optionIconShape: { classPropertyName: "optionIconShape", publicName: "optionIconShape", isSignal: true, isRequired: false, transformFunction: null }, optionAvatarShape: { classPropertyName: "optionAvatarShape", publicName: "optionAvatarShape", isSignal: true, isRequired: false, transformFunction: null }, optionGroupIcon: { classPropertyName: "optionGroupIcon", publicName: "optionGroupIcon", isSignal: true, isRequired: false, transformFunction: null }, optionGroupIconColor: { classPropertyName: "optionGroupIconColor", publicName: "optionGroupIconColor", isSignal: true, isRequired: false, transformFunction: null }, optionGroupIconShape: { classPropertyName: "optionGroupIconShape", publicName: "optionGroupIconShape", isSignal: true, isRequired: false, transformFunction: null }, optionGroupAvatarShape: { classPropertyName: "optionGroupAvatarShape", publicName: "optionGroupAvatarShape", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onChange: "onChange" }, host: { properties: { "class": "this.styleClass" }, classAttribute: "grid gap-1" }, viewQueries: [{ propertyName: "multiSelect", first: true, predicate: ["multiSelect"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@if (label()) {\r\n <label\r\n (click)=\"multiSelect?.show()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-multiSelect\r\n #multiSelect\r\n [ngModel]=\"value()\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n [options]=\"options()\"\r\n [display]=\"display()\"\r\n [optionLabel]=\"optionLabel()\"\r\n [optionValue]=\"optionValue()\"\r\n [group]=\"isGrouped()\"\r\n [optionGroupLabel]=\"optionGroupLabel()\"\r\n [optionGroupChildren]=\"optionGroupChildren()\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [inputId]=\"ngControl?.name?.toString() || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"{{ placeholder() ?? label() ?? '' }}\"\r\n [filter]=\"filter()\"\r\n [filterBy]=\"filterBy()\"\r\n [dataKey]=\"dataKey()\"\r\n styleClass=\"w-full\"\r\n appendTo=\"body\"\r\n [showClear]=\"showClear()\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n>\r\n <ng-template let-selectedOptions #selecteditems>\r\n @if (!selectedOptions?.length) {\r\n <span class=\"text-color-secondary\">{{\r\n placeholder() ?? label() ?? \"\"\r\n }}</span>\r\n } @else if (display() === \"chip\") {\r\n <div class=\"flex flex-wrap gap-2 py-1\">\r\n @for (selected of selectedOptions; track $index) {\r\n <span\r\n class=\"inline-flex items-center gap-2 rounded-full border border-surface-200 bg-surface-50 px-2.5 py-1 text-sm\"\r\n >\r\n @if (shouldRenderOptionColorSwatch(selected)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(selected)\"\r\n ></span>\r\n } @else if (getOptionIcon(selected)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"\r\n getOptionAvatarBackground(selected)\r\n \"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(selected)\"\r\n [icon]=\"getOptionIcon(selected)\"\r\n [shape]=\"getOptionAvatarShape(selected)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(selected) }}</span>\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <span>{{ formatSelectedItems(selectedOptions) }}</span>\r\n }\r\n </ng-template>\r\n\r\n <ng-template let-group #group>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderGroupColorSwatch(group)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getGroupSwatchColor(group)\"\r\n ></span>\r\n } @else if (getGroupIcon(group)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getGroupAvatarBackground(group)\"\r\n [style.--p-avatar-color]=\"getGroupAvatarColor(group)\"\r\n [icon]=\"getGroupIcon(group)\"\r\n [shape]=\"getGroupAvatarShape(group)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span class=\"font-medium\">{{ getGroupLabelValue(group) }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-option #item>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderOptionColorSwatch(option)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(option)\"\r\n ></span>\r\n } @else if (getOptionIcon(option)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getOptionAvatarBackground(option)\"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(option)\"\r\n [icon]=\"getOptionIcon(option)\"\r\n [shape]=\"getOptionAvatarShape(option)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(option) }}</span>\r\n </div>\r\n </ng-template>\r\n</p-multiSelect>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i2.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "styleClass", "panelStyle", "panelStyleClass", "inputId", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "dataKey", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "placeholder", "options", "filterValue", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus", "highlightOnSelect", "size", "variant", "fluid", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
241
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: MultiSelectField, isStandalone: true, selector: "mt-multi-select-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, pInputs: { classPropertyName: "pInputs", publicName: "pInputs", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, display: { classPropertyName: "display", publicName: "display", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, maxSelectedLabels: { classPropertyName: "maxSelectedLabels", publicName: "maxSelectedLabels", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, optionGroupLabel: { classPropertyName: "optionGroupLabel", publicName: "optionGroupLabel", isSignal: true, isRequired: false, transformFunction: null }, optionGroupChildren: { classPropertyName: "optionGroupChildren", publicName: "optionGroupChildren", isSignal: true, isRequired: false, transformFunction: null }, optionIcon: { classPropertyName: "optionIcon", publicName: "optionIcon", isSignal: true, isRequired: false, transformFunction: null }, optionIconColor: { classPropertyName: "optionIconColor", publicName: "optionIconColor", isSignal: true, isRequired: false, transformFunction: null }, optionIconShape: { classPropertyName: "optionIconShape", publicName: "optionIconShape", isSignal: true, isRequired: false, transformFunction: null }, optionAvatarShape: { classPropertyName: "optionAvatarShape", publicName: "optionAvatarShape", isSignal: true, isRequired: false, transformFunction: null }, optionGroupIcon: { classPropertyName: "optionGroupIcon", publicName: "optionGroupIcon", isSignal: true, isRequired: false, transformFunction: null }, optionGroupIconColor: { classPropertyName: "optionGroupIconColor", publicName: "optionGroupIconColor", isSignal: true, isRequired: false, transformFunction: null }, optionGroupIconShape: { classPropertyName: "optionGroupIconShape", publicName: "optionGroupIconShape", isSignal: true, isRequired: false, transformFunction: null }, optionGroupAvatarShape: { classPropertyName: "optionGroupAvatarShape", publicName: "optionGroupAvatarShape", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onChange: "onChange" }, host: { properties: { "class": "this.styleClass" }, classAttribute: "grid gap-1" }, viewQueries: [{ propertyName: "multiSelect", first: true, predicate: ["multiSelect"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@if (label()) {\r\n <label\r\n (click)=\"multiSelect?.show()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-multiSelect\r\n #multiSelect\r\n [ngModel]=\"value()\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n [options]=\"options()\"\r\n [display]=\"display()\"\r\n [optionLabel]=\"optionLabel()\"\r\n [optionValue]=\"optionValue()\"\r\n [group]=\"isGrouped()\"\r\n [optionGroupLabel]=\"optionGroupLabel()\"\r\n [optionGroupChildren]=\"optionGroupChildren()\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [inputId]=\"ngControl?.name?.toString() || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"{{ placeholder() ?? label() ?? '' }}\"\r\n [filter]=\"filter()\"\r\n [filterBy]=\"filterBy()\"\r\n [dataKey]=\"dataKey()\"\r\n styleClass=\"w-full\"\r\n appendTo=\"body\"\r\n [showClear]=\"showClear()\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n>\r\n <ng-template let-selectedOptions #selecteditems>\r\n @if (selectedOptions?.length) {\r\n @if (display() === \"chip\") {\r\n <div class=\"flex flex-wrap gap-2 py-1\">\r\n @for (selected of selectedOptions; track $index) {\r\n <span\r\n class=\"inline-flex items-center gap-2 rounded-full border border-surface-200 bg-surface-50 px-2.5 py-1 text-sm\"\r\n >\r\n @if (shouldRenderOptionColorSwatch(selected)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(selected)\"\r\n ></span>\r\n } @else if (getOptionIcon(selected)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"\r\n getOptionAvatarBackground(selected)\r\n \"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(selected)\"\r\n [icon]=\"getOptionIcon(selected)\"\r\n [shape]=\"getOptionAvatarShape(selected)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(selected) }}</span>\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <span>{{ formatSelectedItems(selectedOptions) }}</span>\r\n }\r\n }\r\n </ng-template>\r\n\r\n <ng-template let-group #group>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderGroupColorSwatch(group)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getGroupSwatchColor(group)\"\r\n ></span>\r\n } @else if (getGroupIcon(group)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getGroupAvatarBackground(group)\"\r\n [style.--p-avatar-color]=\"getGroupAvatarColor(group)\"\r\n [icon]=\"getGroupIcon(group)\"\r\n [shape]=\"getGroupAvatarShape(group)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span class=\"font-medium\">{{ getGroupLabelValue(group) }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-option #item>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderOptionColorSwatch(option)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(option)\"\r\n ></span>\r\n } @else if (getOptionIcon(option)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getOptionAvatarBackground(option)\"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(option)\"\r\n [icon]=\"getOptionIcon(option)\"\r\n [shape]=\"getOptionAvatarShape(option)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(option) }}</span>\r\n </div>\r\n </ng-template>\r\n</p-multiSelect>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i2.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "styleClass", "panelStyle", "panelStyleClass", "inputId", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "dataKey", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "placeholder", "options", "filterValue", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus", "highlightOnSelect", "size", "variant", "fluid", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: FieldValidation, selector: "mt-field-validation", inputs: ["control", "touched"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
242
242
  }
243
243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: MultiSelectField, decorators: [{
244
244
  type: Component,
245
245
  args: [{ selector: 'mt-multi-select-field', standalone: true, imports: [FormsModule, MultiSelectModule, FieldValidation, Avatar], changeDetection: ChangeDetectionStrategy.OnPush, host: {
246
246
  class: 'grid gap-1',
247
- }, template: "@if (label()) {\r\n <label\r\n (click)=\"multiSelect?.show()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-multiSelect\r\n #multiSelect\r\n [ngModel]=\"value()\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n [options]=\"options()\"\r\n [display]=\"display()\"\r\n [optionLabel]=\"optionLabel()\"\r\n [optionValue]=\"optionValue()\"\r\n [group]=\"isGrouped()\"\r\n [optionGroupLabel]=\"optionGroupLabel()\"\r\n [optionGroupChildren]=\"optionGroupChildren()\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [inputId]=\"ngControl?.name?.toString() || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"{{ placeholder() ?? label() ?? '' }}\"\r\n [filter]=\"filter()\"\r\n [filterBy]=\"filterBy()\"\r\n [dataKey]=\"dataKey()\"\r\n styleClass=\"w-full\"\r\n appendTo=\"body\"\r\n [showClear]=\"showClear()\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n>\r\n <ng-template let-selectedOptions #selecteditems>\r\n @if (!selectedOptions?.length) {\r\n <span class=\"text-color-secondary\">{{\r\n placeholder() ?? label() ?? \"\"\r\n }}</span>\r\n } @else if (display() === \"chip\") {\r\n <div class=\"flex flex-wrap gap-2 py-1\">\r\n @for (selected of selectedOptions; track $index) {\r\n <span\r\n class=\"inline-flex items-center gap-2 rounded-full border border-surface-200 bg-surface-50 px-2.5 py-1 text-sm\"\r\n >\r\n @if (shouldRenderOptionColorSwatch(selected)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(selected)\"\r\n ></span>\r\n } @else if (getOptionIcon(selected)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"\r\n getOptionAvatarBackground(selected)\r\n \"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(selected)\"\r\n [icon]=\"getOptionIcon(selected)\"\r\n [shape]=\"getOptionAvatarShape(selected)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(selected) }}</span>\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <span>{{ formatSelectedItems(selectedOptions) }}</span>\r\n }\r\n </ng-template>\r\n\r\n <ng-template let-group #group>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderGroupColorSwatch(group)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getGroupSwatchColor(group)\"\r\n ></span>\r\n } @else if (getGroupIcon(group)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getGroupAvatarBackground(group)\"\r\n [style.--p-avatar-color]=\"getGroupAvatarColor(group)\"\r\n [icon]=\"getGroupIcon(group)\"\r\n [shape]=\"getGroupAvatarShape(group)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span class=\"font-medium\">{{ getGroupLabelValue(group) }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-option #item>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderOptionColorSwatch(option)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(option)\"\r\n ></span>\r\n } @else if (getOptionIcon(option)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getOptionAvatarBackground(option)\"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(option)\"\r\n [icon]=\"getOptionIcon(option)\"\r\n [shape]=\"getOptionAvatarShape(option)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(option) }}</span>\r\n </div>\r\n </ng-template>\r\n</p-multiSelect>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n" }]
247
+ }, template: "@if (label()) {\r\n <label\r\n (click)=\"multiSelect?.show()\"\r\n [class.required]=\"ngControl?.control?.hasValidator(requiredValidator)\"\r\n [for]=\"ngControl?.name || label()\"\r\n >{{ label() }}</label\r\n >\r\n}\r\n<p-multiSelect\r\n #multiSelect\r\n [ngModel]=\"value()\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n [options]=\"options()\"\r\n [display]=\"display()\"\r\n [optionLabel]=\"optionLabel()\"\r\n [optionValue]=\"optionValue()\"\r\n [group]=\"isGrouped()\"\r\n [optionGroupLabel]=\"optionGroupLabel()\"\r\n [optionGroupChildren]=\"optionGroupChildren()\"\r\n (onBlur)=\"onTouched()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n [inputId]=\"ngControl?.name?.toString() || label()\"\r\n [invalid]=\"isInvalid(ngControl?.control)\"\r\n placeholder=\"{{ placeholder() ?? label() ?? '' }}\"\r\n [filter]=\"filter()\"\r\n [filterBy]=\"filterBy()\"\r\n [dataKey]=\"dataKey()\"\r\n styleClass=\"w-full\"\r\n appendTo=\"body\"\r\n [showClear]=\"showClear()\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n>\r\n <ng-template let-selectedOptions #selecteditems>\r\n @if (selectedOptions?.length) {\r\n @if (display() === \"chip\") {\r\n <div class=\"flex flex-wrap gap-2 py-1\">\r\n @for (selected of selectedOptions; track $index) {\r\n <span\r\n class=\"inline-flex items-center gap-2 rounded-full border border-surface-200 bg-surface-50 px-2.5 py-1 text-sm\"\r\n >\r\n @if (shouldRenderOptionColorSwatch(selected)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(selected)\"\r\n ></span>\r\n } @else if (getOptionIcon(selected)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"\r\n getOptionAvatarBackground(selected)\r\n \"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(selected)\"\r\n [icon]=\"getOptionIcon(selected)\"\r\n [shape]=\"getOptionAvatarShape(selected)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(selected) }}</span>\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <span>{{ formatSelectedItems(selectedOptions) }}</span>\r\n }\r\n }\r\n </ng-template>\r\n\r\n <ng-template let-group #group>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderGroupColorSwatch(group)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getGroupSwatchColor(group)\"\r\n ></span>\r\n } @else if (getGroupIcon(group)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getGroupAvatarBackground(group)\"\r\n [style.--p-avatar-color]=\"getGroupAvatarColor(group)\"\r\n [icon]=\"getGroupIcon(group)\"\r\n [shape]=\"getGroupAvatarShape(group)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span class=\"font-medium\">{{ getGroupLabelValue(group) }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-option #item>\r\n <div class=\"flex items-center gap-2\">\r\n @if (shouldRenderOptionColorSwatch(option)) {\r\n <span\r\n class=\"h-3 w-3 shrink-0 rounded-[4px] border border-surface-300\"\r\n [style.backgroundColor]=\"getOptionSwatchColor(option)\"\r\n ></span>\r\n } @else if (getOptionIcon(option)) {\r\n <mt-avatar\r\n [style.--p-avatar-background]=\"getOptionAvatarBackground(option)\"\r\n [style.--p-avatar-color]=\"getOptionAvatarColor(option)\"\r\n [icon]=\"getOptionIcon(option)\"\r\n [shape]=\"getOptionAvatarShape(option)\"\r\n size=\"normal\"\r\n />\r\n }\r\n <span>{{ getOptionLabelValue(option) }}</span>\r\n </div>\r\n </ng-template>\r\n</p-multiSelect>\r\n\r\n<mt-field-validation [control]=\"ngControl?.control\"></mt-field-validation>\r\n" }]
248
248
  }], ctorParameters: () => [], propDecorators: { multiSelect: [{
249
249
  type: ViewChild,
250
250
  args: ['multiSelect', { static: true }]