@koalarx/ui 20.2.3 → 20.2.5
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.
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, Injectable, ViewContainerRef, input, booleanAttribute, linkedSignal, signal, viewChild, effect, Component, ApplicationRef, EnvironmentInjector, createComponent, inputBinding, Injector, DestroyRef, computed, isSignal, runInInjectionContext } from '@angular/core';
|
|
3
3
|
import { GENERIC_COMPONENT_CONTAINER_NAME } from '@koalarx/ui/core/config';
|
|
4
|
+
import { delay } from '@koalarx/utils/KlDelay';
|
|
4
5
|
import { randomString } from '@koalarx/utils/KlString';
|
|
5
6
|
import * as i1 from '@angular/forms';
|
|
6
7
|
import { ReactiveFormsModule, FormControl } from '@angular/forms';
|
|
@@ -11,7 +12,6 @@ import { InputFieldBase } from '@koalarx/ui/shared/components/input-field';
|
|
|
11
12
|
import { HookChange } from '@koalarx/ui/shared/directives';
|
|
12
13
|
import { isEmpty } from '@koalarx/ui/shared/utils';
|
|
13
14
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
14
|
-
import { delay } from '@koalarx/utils/KlDelay';
|
|
15
15
|
import { debounceTime } from 'rxjs/internal/operators/debounceTime';
|
|
16
16
|
|
|
17
17
|
const AUTOCOMPLETE_REF_TOKEN = new InjectionToken('AutocompleteRefToken');
|
|
@@ -198,11 +198,11 @@ class AutocompleteOptions {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AutocompleteOptions, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
201
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: AutocompleteOptions, isStandalone: true, selector: "kl-autocomplete-options", inputs: { fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: true, transformFunction: null }, autocompleteValue: { classPropertyName: "autocompleteValue", publicName: "autocompleteValue", isSignal: true, isRequired: true, transformFunction: null }, placeholderSearchField: { classPropertyName: "placeholderSearchField", publicName: "placeholderSearchField", isSignal: true, isRequired: false, transformFunction: null }, disableAutoTypeConversion: { classPropertyName: "disableAutoTypeConversion", publicName: "disableAutoTypeConversion", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "searchInputRef", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n [attr.aria-labelledby]=\"fieldId()\">\n\n <div class=\"border-b border-neutral-200 dark:border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n #searchInput\n type=\"search\"\n [formControl]=\"autocompleteValue().filterControl\"\n placeholder=\"Type to Search...\"\n />\n </label>\n </div>\n\n <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n @for (item of list(); track $index) {\n @let optionLabelId = fieldId() + '-' + item.value;\n\n <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n [attr.for]=\"optionLabelId\"\n [class.active]=\"$index === optionFocused()\"\n (mouseover)=\"optionFocused.set($index)\">\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId()\"\n [attr.value]=\"item.value\"\n [checked]=\"multiple()\n ? control().value?.includes(item.value)\n : item.value === control().value\"\n (change)=\"setValue($event)\"\n />\n {{item.label}}\n </label>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
|
|
201
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: AutocompleteOptions, isStandalone: true, selector: "kl-autocomplete-options", inputs: { fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: true, transformFunction: null }, autocompleteValue: { classPropertyName: "autocompleteValue", publicName: "autocompleteValue", isSignal: true, isRequired: true, transformFunction: null }, placeholderSearchField: { classPropertyName: "placeholderSearchField", publicName: "placeholderSearchField", isSignal: true, isRequired: false, transformFunction: null }, disableAutoTypeConversion: { classPropertyName: "disableAutoTypeConversion", publicName: "disableAutoTypeConversion", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "searchInputRef", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n [attr.aria-labelledby]=\"fieldId()\">\n\n <div class=\"kl-autocomplete-filter border-b border-neutral-200 dark:border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n #searchInput\n type=\"search\"\n [formControl]=\"autocompleteValue().filterControl\"\n placeholder=\"Type to Search...\"\n />\n </label>\n </div>\n\n <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n @for (item of list(); track $index) {\n @let optionLabelId = fieldId() + '-' + item.value;\n\n <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n [attr.for]=\"optionLabelId\"\n [class.active]=\"$index === optionFocused()\"\n (mouseover)=\"optionFocused.set($index)\">\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId()\"\n [attr.value]=\"item.value\"\n [checked]=\"multiple()\n ? control().value?.includes(item.value)\n : item.value === control().value\"\n (change)=\"setValue($event)\"\n />\n {{item.label}}\n </label>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
|
|
202
202
|
}
|
|
203
203
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AutocompleteOptions, decorators: [{
|
|
204
204
|
type: Component,
|
|
205
|
-
args: [{ selector: 'kl-autocomplete-options', imports: [ReactiveFormsModule], template: "<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n [attr.aria-labelledby]=\"fieldId()\">\n\n <div class=\"border-b border-neutral-200 dark:border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n #searchInput\n type=\"search\"\n [formControl]=\"autocompleteValue().filterControl\"\n placeholder=\"Type to Search...\"\n />\n </label>\n </div>\n\n <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n @for (item of list(); track $index) {\n @let optionLabelId = fieldId() + '-' + item.value;\n\n <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n [attr.for]=\"optionLabelId\"\n [class.active]=\"$index === optionFocused()\"\n (mouseover)=\"optionFocused.set($index)\">\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId()\"\n [attr.value]=\"item.value\"\n [checked]=\"multiple()\n ? control().value?.includes(item.value)\n : item.value === control().value\"\n (change)=\"setValue($event)\"\n />\n {{item.label}}\n </label>\n }\n </div>\n</div>\n" }]
|
|
205
|
+
args: [{ selector: 'kl-autocomplete-options', imports: [ReactiveFormsModule], template: "<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n [attr.aria-labelledby]=\"fieldId()\">\n\n <div class=\"kl-autocomplete-filter border-b border-neutral-200 dark:border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n #searchInput\n type=\"search\"\n [formControl]=\"autocompleteValue().filterControl\"\n placeholder=\"Type to Search...\"\n />\n </label>\n </div>\n\n <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n @for (item of list(); track $index) {\n @let optionLabelId = fieldId() + '-' + item.value;\n\n <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n [attr.for]=\"optionLabelId\"\n [class.active]=\"$index === optionFocused()\"\n (mouseover)=\"optionFocused.set($index)\">\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId()\"\n [attr.value]=\"item.value\"\n [checked]=\"multiple()\n ? control().value?.includes(item.value)\n : item.value === control().value\"\n (change)=\"setValue($event)\"\n />\n {{item.label}}\n </label>\n }\n </div>\n</div>\n" }]
|
|
206
206
|
}], ctorParameters: () => [] });
|
|
207
207
|
|
|
208
208
|
const AUTOCOMPLETE_APP_REF = new InjectionToken('AutocompleteAppRef');
|
|
@@ -222,11 +222,14 @@ class Autocomplete {
|
|
|
222
222
|
} while (document.getElementById(elementId));
|
|
223
223
|
return elementId;
|
|
224
224
|
}
|
|
225
|
-
|
|
225
|
+
calculatePosition(container) {
|
|
226
226
|
const autocompleteField = this.viewContainerRef.element
|
|
227
227
|
.nativeElement;
|
|
228
228
|
const currentTop = window.scrollY;
|
|
229
229
|
const position = autocompleteField.getBoundingClientRect();
|
|
230
|
+
const optionsContainer = container.querySelector('.kl-autocomplete-options-container');
|
|
231
|
+
const filterContainer = container?.querySelector('.kl-autocomplete-filter');
|
|
232
|
+
const filterContainerHeight = (filterContainer?.clientHeight || 0) + 2;
|
|
230
233
|
if (position) {
|
|
231
234
|
const screenHeight = document.body.clientHeight;
|
|
232
235
|
const maxHeight = (screenHeight * 40) / 100;
|
|
@@ -237,37 +240,65 @@ class Autocomplete {
|
|
|
237
240
|
}
|
|
238
241
|
const percentFillOnScreen = (height * 100) / screenHeight;
|
|
239
242
|
if (percentFillOnScreen <= 20) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
+
const optionsHeight = optionsContainer?.clientHeight || 0;
|
|
244
|
+
const currentHeight = optionsHeight + filterContainerHeight;
|
|
245
|
+
if (optionsHeight > 0 && currentHeight <= maxHeight) {
|
|
246
|
+
height = currentHeight;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
height = Math.abs(screenHeight - (screenHeight - position.top));
|
|
250
|
+
if (height > maxHeight) {
|
|
251
|
+
height = maxHeight;
|
|
252
|
+
}
|
|
243
253
|
}
|
|
244
254
|
top = position.top - height;
|
|
245
255
|
}
|
|
246
256
|
top += currentTop;
|
|
257
|
+
container.style.top = `${top}px`;
|
|
258
|
+
container.style.maxHeight = `${height}px`;
|
|
259
|
+
return { top, left: position.left, width: position.width, height };
|
|
260
|
+
}
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
async waitForButtonEnabled(buttonElement, timeout) {
|
|
264
|
+
const delayTime = 50;
|
|
265
|
+
let ellapsedTime = 0;
|
|
266
|
+
while (buttonElement.disabled && ellapsedTime <= timeout) {
|
|
267
|
+
await delay(delayTime);
|
|
268
|
+
ellapsedTime += delayTime;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async positionOnScreen(container) {
|
|
272
|
+
const autocompleteField = this.viewContainerRef.element
|
|
273
|
+
.nativeElement;
|
|
274
|
+
const autocompleteFieldButton = autocompleteField.querySelector('button');
|
|
275
|
+
if (autocompleteFieldButton) {
|
|
276
|
+
await this.waitForButtonEnabled(autocompleteFieldButton, 5000);
|
|
277
|
+
}
|
|
278
|
+
const position = this.calculatePosition(container);
|
|
279
|
+
if (position) {
|
|
280
|
+
const { left, width } = position;
|
|
247
281
|
container.style.position = 'absolute';
|
|
248
282
|
container.style.display = 'flex';
|
|
249
|
-
container.style.
|
|
250
|
-
container.style.
|
|
251
|
-
container.style.width = `${position.width}px`;
|
|
283
|
+
container.style.left = `${left}px`;
|
|
284
|
+
container.style.width = `${width}px`;
|
|
252
285
|
container.style.height = `auto`;
|
|
253
|
-
container.style.maxHeight = `${height}px`;
|
|
254
286
|
container.style.zIndex = '99';
|
|
255
287
|
container.style.overflow = 'hidden';
|
|
288
|
+
container.style.transition = 'all 0.1s ease-in-out';
|
|
256
289
|
const selectedOptions = autocompleteField.querySelector('.selected-options');
|
|
257
290
|
if (selectedOptions) {
|
|
258
|
-
selectedOptions.onchange = () =>
|
|
259
|
-
this.positionOnScreen(container);
|
|
260
|
-
}, 50);
|
|
291
|
+
selectedOptions.onchange = () => this.positionOnScreen(container);
|
|
261
292
|
}
|
|
262
293
|
}
|
|
263
294
|
}
|
|
264
|
-
open(data) {
|
|
295
|
+
async open(data) {
|
|
265
296
|
const main = document.querySelector(GENERIC_COMPONENT_CONTAINER_NAME);
|
|
266
297
|
if (main) {
|
|
267
298
|
const elementId = this.generateElementId();
|
|
268
299
|
const container = main.appendChild(document.createElement('div'));
|
|
269
300
|
container.id = elementId;
|
|
270
|
-
this.positionOnScreen(container);
|
|
301
|
+
await this.positionOnScreen(container);
|
|
271
302
|
const componentRef = createComponent(AutocompleteOptions, {
|
|
272
303
|
environmentInjector: this.injector,
|
|
273
304
|
hostElement: container,
|
|
@@ -290,6 +321,7 @@ class Autocomplete {
|
|
|
290
321
|
});
|
|
291
322
|
this.appRef.attachView(componentRef.hostView);
|
|
292
323
|
componentRef.changeDetectorRef.detectChanges();
|
|
324
|
+
this.calculatePosition(container);
|
|
293
325
|
}
|
|
294
326
|
}
|
|
295
327
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: Autocomplete, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -594,11 +626,11 @@ class AutocompleteField extends InputFieldBase {
|
|
|
594
626
|
this.autocompleteValue.makeAutofill();
|
|
595
627
|
}
|
|
596
628
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AutocompleteField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
597
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: AutocompleteField, isStandalone: true, selector: "kl-autocomplete-field", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, placeholderSearchField: { classPropertyName: "placeholderSearchField", publicName: "placeholderSearchField", isSignal: true, isRequired: false, transformFunction: null }, disableAutoTypeConversion: { classPropertyName: "disableAutoTypeConversion", publicName: "disableAutoTypeConversion", isSignal: true, isRequired: false, transformFunction: null } }, providers: [Autocomplete, AutocompleteValue], usesInheritance: true, ngImport: i0, template: "<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n [class.has-value]=\"autocompleteValue.hasValue()\"\n type=\"button\"\n tabindex=\"0\"\n [id]=\"fieldId\"\n [disabled]=\"isDisabled() || isLoading()\"\n (focus)=\"control().markAsTouched()\"\n (click)=\"open()\">\n\n @if (label(); as label) {\n <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n </span>\n }\n\n <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n [hookChange]=\"autocompleteValue.currentValue()\"\n [class.hidden]=\"!autocompleteValue.hasValue()\">\n @if (multiple()) {\n @for (item of autocompleteValue.selectedOptions(); track $index) {\n <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n <span>{{item.label}}</span>\n <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n (click)=\"autocompleteValue.remove($event, item.value)\">\n </i>\n </span>\n }\n } @else {\n {{autocompleteValue.selectedOption()?.label}}\n }\n </div>\n\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else if (autocompleteValue.hasValue()) {\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n (click)=\"autocompleteValue.clear($event)\">\n </i>\n }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n", dependencies: [{ kind: "component", type: Loader, selector: "kl-loader", inputs: ["size"] }, { kind: "component", type: FieldErrors, selector: "kl-field-errors", inputs: ["field"] }, { kind: "directive", type: HookChange, selector: "[hookChange]", inputs: ["hookChange"] }] });
|
|
629
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: AutocompleteField, isStandalone: true, selector: "kl-autocomplete-field", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, placeholderSearchField: { classPropertyName: "placeholderSearchField", publicName: "placeholderSearchField", isSignal: true, isRequired: false, transformFunction: null }, disableAutoTypeConversion: { classPropertyName: "disableAutoTypeConversion", publicName: "disableAutoTypeConversion", isSignal: true, isRequired: false, transformFunction: null } }, providers: [Autocomplete, AutocompleteValue], usesInheritance: true, ngImport: i0, template: "<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n [class.has-value]=\"autocompleteValue.hasValue()\"\n type=\"button\"\n tabindex=\"0\"\n [id]=\"fieldId\"\n [disabled]=\"isDisabled() || isLoading()\"\n (focus)=\"control().markAsTouched()\"\n (click)=\"open()\">\n\n @if (label(); as label) {\n <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n </span>\n }\n\n <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n [hookChange]=\"!isLoading() && (autocompleteValue.filter() || autocompleteValue.currentValue())\"\n [class.hidden]=\"!autocompleteValue.hasValue()\">\n @if (multiple()) {\n @for (item of autocompleteValue.selectedOptions(); track $index) {\n <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n <span>{{item.label}}</span>\n <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n (click)=\"autocompleteValue.remove($event, item.value)\">\n </i>\n </span>\n }\n } @else {\n {{autocompleteValue.selectedOption()?.label}}\n }\n </div>\n\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else if (autocompleteValue.hasValue()) {\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n (click)=\"autocompleteValue.clear($event)\">\n </i>\n }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n", dependencies: [{ kind: "component", type: Loader, selector: "kl-loader", inputs: ["size"] }, { kind: "component", type: FieldErrors, selector: "kl-field-errors", inputs: ["field"] }, { kind: "directive", type: HookChange, selector: "[hookChange]", inputs: ["hookChange"] }] });
|
|
598
630
|
}
|
|
599
631
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: AutocompleteField, decorators: [{
|
|
600
632
|
type: Component,
|
|
601
|
-
args: [{ selector: 'kl-autocomplete-field', providers: [Autocomplete, AutocompleteValue], imports: [Loader, FieldErrors, HookChange], template: "<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n [class.has-value]=\"autocompleteValue.hasValue()\"\n type=\"button\"\n tabindex=\"0\"\n [id]=\"fieldId\"\n [disabled]=\"isDisabled() || isLoading()\"\n (focus)=\"control().markAsTouched()\"\n (click)=\"open()\">\n\n @if (label(); as label) {\n <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n </span>\n }\n\n <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n [hookChange]=\"autocompleteValue.currentValue()\"\n [class.hidden]=\"!autocompleteValue.hasValue()\">\n @if (multiple()) {\n @for (item of autocompleteValue.selectedOptions(); track $index) {\n <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n <span>{{item.label}}</span>\n <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n (click)=\"autocompleteValue.remove($event, item.value)\">\n </i>\n </span>\n }\n } @else {\n {{autocompleteValue.selectedOption()?.label}}\n }\n </div>\n\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else if (autocompleteValue.hasValue()) {\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n (click)=\"autocompleteValue.clear($event)\">\n </i>\n }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n" }]
|
|
633
|
+
args: [{ selector: 'kl-autocomplete-field', providers: [Autocomplete, AutocompleteValue], imports: [Loader, FieldErrors, HookChange], template: "<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n [class.has-value]=\"autocompleteValue.hasValue()\"\n type=\"button\"\n tabindex=\"0\"\n [id]=\"fieldId\"\n [disabled]=\"isDisabled() || isLoading()\"\n (focus)=\"control().markAsTouched()\"\n (click)=\"open()\">\n\n @if (label(); as label) {\n <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n </span>\n }\n\n <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n [hookChange]=\"!isLoading() && (autocompleteValue.filter() || autocompleteValue.currentValue())\"\n [class.hidden]=\"!autocompleteValue.hasValue()\">\n @if (multiple()) {\n @for (item of autocompleteValue.selectedOptions(); track $index) {\n <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n <span>{{item.label}}</span>\n <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n (click)=\"autocompleteValue.remove($event, item.value)\">\n </i>\n </span>\n }\n } @else {\n {{autocompleteValue.selectedOption()?.label}}\n }\n </div>\n\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else if (autocompleteValue.hasValue()) {\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n (click)=\"autocompleteValue.clear($event)\">\n </i>\n }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n" }]
|
|
602
634
|
}], ctorParameters: () => [] });
|
|
603
635
|
|
|
604
636
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"koalarx-ui-shared-components-input-field-autocomplete.mjs","sources":["../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-ref.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-options.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-options.html","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-builder.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-value.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-field.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-field.html","../../projects/koala-ui/shared/components/input-field/autocomplete/koalarx-ui-shared-components-input-field-autocomplete.ts"],"sourcesContent":["import {\n ApplicationRef,\n ComponentRef,\n inject,\n Injectable,\n InjectionToken,\n Type,\n} from '@angular/core';\nimport { AUTOCOMPLETE_APP_REF } from './autocomplete';\n\nexport const AUTOCOMPLETE_REF_TOKEN = new InjectionToken(\n 'AutocompleteRefToken'\n);\n\n@Injectable()\nexport class AutocompleteRef {\n private readonly appRef = inject<ApplicationRef>(AUTOCOMPLETE_APP_REF);\n private readonly componentRef = inject<() => ComponentRef<Type<any>>>(\n AUTOCOMPLETE_REF_TOKEN\n );\n\n close() {\n setTimeout(() => {\n this.componentRef().destroy();\n this.appRef.detachView(this.componentRef().hostView);\n });\n }\n}\n","import {\n booleanAttribute,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n OnInit,\n Signal,\n signal,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { AutocompleteRef } from './autocomplete-ref';\nimport { AutocompleteList, AutocompleteValue } from './autocomplete-value';\nimport { KlArray } from '@koalarx/utils/KlArray';\n\n@Component({\n selector: 'kl-autocomplete-options',\n templateUrl: './autocomplete-options.html',\n imports: [ReactiveFormsModule],\n})\nexport class AutocompleteOptions implements OnInit, OnDestroy {\n private readonly autocompleteRef = inject(AutocompleteRef);\n private readonly viewContainerRef =\n inject<ViewContainerRef>(ViewContainerRef);\n private firstLoad = true;\n\n fieldId = input.required<string>();\n options = input.required<Signal<AutocompleteList>>();\n control = input.required<FormControl>();\n multiple = input.required<boolean>();\n autocompleteValue = input.required<AutocompleteValue>();\n placeholderSearchField = input<string | undefined>();\n disableAutoTypeConversion = input(false, { transform: booleanAttribute });\n list = linkedSignal(() => {\n const options = this.options()();\n return new KlArray(options).split(100)[0];\n });\n\n optionFocused = signal(0);\n\n searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n constructor() {\n effect(() => {\n const hasValue = !!this.autocompleteValue().currentValue();\n\n if (this.firstLoad) {\n this.firstLoad = false;\n return;\n }\n\n if (hasValue && !this.multiple()) {\n this.close();\n }\n });\n\n effect(() => {\n const options = this.options()();\n if (options.length > 0) {\n this.optionFocused.set(0);\n }\n });\n }\n\n private updateScrollPosition(direction: 'down' | 'up' = 'down') {\n setTimeout(() => {\n const containerElement =\n this.viewContainerRef.element.nativeElement.querySelector(\n '.kl-autocomplete-options-container'\n ) as HTMLDivElement;\n const focusedOptionElement = containerElement.querySelector(\n 'label.active'\n ) as HTMLDivElement;\n\n if (focusedOptionElement) {\n containerElement.scrollTo({\n top:\n direction === 'down'\n ? containerElement.scrollTop +\n focusedOptionElement.getBoundingClientRect().height\n : containerElement.scrollTop -\n focusedOptionElement.getBoundingClientRect().height,\n });\n }\n });\n }\n\n private onKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown': {\n event.stopPropagation();\n event.preventDefault();\n\n this.optionFocused.update((value) => {\n if (value < this.options()().length - 1) {\n return value + 1;\n }\n return value;\n });\n this.updateScrollPosition('down');\n break;\n }\n case 'ArrowUp': {\n event.stopPropagation();\n event.preventDefault();\n\n this.optionFocused.update((value) => {\n if (value > 0) {\n return value - 1;\n }\n return value;\n });\n this.updateScrollPosition('up');\n break;\n }\n }\n };\n\n private onKeyup = (event: KeyboardEvent) => {\n const containerElement: HTMLDivElement =\n this.viewContainerRef.element.nativeElement;\n\n switch (event.key) {\n case 'Enter': {\n event.stopPropagation();\n event.preventDefault();\n\n const focusedOption = this.options()()[this.optionFocused()];\n\n if (focusedOption) {\n containerElement\n .querySelectorAll<HTMLInputElement>('input')\n .item(this.optionFocused() + 1)\n .click();\n }\n break;\n }\n case 'Escape': {\n event.stopPropagation();\n event.preventDefault();\n\n this.close();\n break;\n }\n }\n };\n\n private onClick = (event: MouseEvent) => {\n const containerElement: HTMLDivElement =\n this.viewContainerRef.element.nativeElement;\n const insideClick = containerElement.contains(event.target as Node);\n\n if (!insideClick) {\n event.stopPropagation();\n event.preventDefault();\n this.close();\n }\n };\n\n private onScroll = (event: Event) => {\n const container = this.viewContainerRef.element.nativeElement.querySelector(\n '.kl-autocomplete-options-container'\n );\n const target = event.target as HTMLElement;\n\n if (!container || !target.tagName) return;\n\n if (target !== container) {\n this.close();\n }\n };\n\n private close() {\n if (\n this.autocompleteValue().filterControl.value &&\n !this.autocompleteValue().isOnDemand()\n ) {\n this.autocompleteValue().filterControl.reset();\n }\n\n this.autocompleteRef.close();\n }\n\n ngOnDestroy() {\n document.removeEventListener('keyup', this.onKeyup);\n document.removeEventListener('keydown', this.onKeyDown);\n document.removeEventListener('click', this.onClick);\n window.removeEventListener('scroll', this.onScroll, true);\n }\n\n ngOnInit() {\n this.searchInputRef()?.nativeElement.focus();\n\n setTimeout(() => {\n document.addEventListener('keyup', this.onKeyup);\n document.addEventListener('keydown', this.onKeyDown);\n document.addEventListener('click', this.onClick);\n window.addEventListener('scroll', this.onScroll, true);\n }, 150);\n }\n\n setValue(event: Event) {\n const target = event.target as HTMLInputElement;\n\n let value: string | number = target.value;\n\n if (\n !Number.isNaN(parseInt(value as any)) &&\n !/^0+[1-9]\\d*$/.test(value) &&\n !this.disableAutoTypeConversion()\n ) {\n value = Number(value);\n }\n\n if (this.multiple()) {\n const check = target.checked;\n\n let currentValue = this.control().value;\n\n if (!Array.isArray(currentValue)) {\n currentValue = [currentValue];\n }\n\n if (check) {\n this.control().setValue([...currentValue, value]);\n } else {\n this.control().setValue(currentValue.filter((v: any) => v !== value));\n }\n } else {\n this.control().setValue(value);\n }\n }\n}\n","<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n [attr.aria-labelledby]=\"fieldId()\">\n\n <div class=\"border-b border-neutral-200 dark:border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n #searchInput\n type=\"search\"\n [formControl]=\"autocompleteValue().filterControl\"\n placeholder=\"Type to Search...\"\n />\n </label>\n </div>\n\n <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n @for (item of list(); track $index) {\n @let optionLabelId = fieldId() + '-' + item.value;\n\n <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n [attr.for]=\"optionLabelId\"\n [class.active]=\"$index === optionFocused()\"\n (mouseover)=\"optionFocused.set($index)\">\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId()\"\n [attr.value]=\"item.value\"\n [checked]=\"multiple()\n ? control().value?.includes(item.value)\n : item.value === control().value\"\n (change)=\"setValue($event)\"\n />\n {{item.label}}\n </label>\n }\n </div>\n</div>\n","import {\n ApplicationRef,\n createComponent,\n EnvironmentInjector,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n inputBinding,\n Signal,\n ViewContainerRef,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { GENERIC_COMPONENT_CONTAINER_NAME } from '@koalarx/ui/core/config';\nimport { randomString } from '@koalarx/utils/KlString';\nimport { AutocompleteOptions } from './autocomplete-options';\nimport { AUTOCOMPLETE_REF_TOKEN, AutocompleteRef } from './autocomplete-ref';\nimport { AutocompleteList, AutocompleteValue } from './autocomplete-value';\n\nexport type AutocompleteAfterCloseTrigger = string | Record<string, any>;\nexport type AutocompleteAfterCloseTriggerFn = (\n trigger: AutocompleteAfterCloseTrigger\n) => void;\nexport const AUTOCOMPLETE_APP_REF = new InjectionToken('AutocompleteAppRef');\n\nexport interface AutocompleteOpenData {\n fieldId: string;\n options: Signal<AutocompleteList>;\n control: FormControl<any>;\n multiple: boolean;\n autocompleteValue: AutocompleteValue;\n placeholderSearchField?: string;\n disableAutoTypeConversion?: boolean;\n}\n\n@Injectable()\nexport class Autocomplete {\n private readonly appRef = inject(ApplicationRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(EnvironmentInjector);\n\n private generateElementId() {\n let elementId: string;\n\n do {\n elementId = randomString(50, {\n numbers: false,\n lowercase: true,\n uppercase: true,\n specialCharacters: false,\n });\n } while (document.getElementById(elementId));\n\n return elementId;\n }\n\n private positionOnScreen(container: HTMLDivElement) {\n const autocompleteField = this.viewContainerRef.element\n .nativeElement as HTMLElement;\n const currentTop = window.scrollY;\n const position = autocompleteField.getBoundingClientRect();\n\n if (position) {\n const screenHeight = document.body.clientHeight;\n const maxHeight = (screenHeight * 40) / 100;\n let top = position.bottom;\n let height = Math.abs(screenHeight - top);\n\n if (height > maxHeight) {\n height = maxHeight;\n }\n\n const percentFillOnScreen = (height * 100) / screenHeight;\n\n if (percentFillOnScreen <= 20) {\n height = Math.abs(screenHeight - (screenHeight - position.top));\n\n if (height > maxHeight) {\n height = maxHeight;\n }\n\n top = position.top - height;\n }\n\n top += currentTop;\n\n container.style.position = 'absolute';\n container.style.display = 'flex';\n container.style.top = `${top}px`;\n container.style.left = `${position.left}px`;\n container.style.width = `${position.width}px`;\n container.style.height = `auto`;\n container.style.maxHeight = `${height}px`;\n container.style.zIndex = '99';\n container.style.overflow = 'hidden';\n\n const selectedOptions =\n autocompleteField.querySelector<HTMLDivElement>('.selected-options');\n\n if (selectedOptions) {\n selectedOptions.onchange = () =>\n setTimeout(() => {\n this.positionOnScreen(container);\n }, 50);\n }\n }\n }\n\n open(data: AutocompleteOpenData) {\n const main = document.querySelector<HTMLElement>(\n GENERIC_COMPONENT_CONTAINER_NAME\n );\n\n if (main) {\n const elementId = this.generateElementId();\n const container = main.appendChild(document.createElement('div'));\n\n container.id = elementId;\n\n this.positionOnScreen(container);\n\n const componentRef = createComponent(AutocompleteOptions, {\n environmentInjector: this.injector,\n hostElement: container,\n elementInjector: Injector.create({\n providers: [\n { provide: AUTOCOMPLETE_APP_REF, useValue: this.appRef },\n {\n provide: AUTOCOMPLETE_REF_TOKEN,\n useValue: () => componentRef,\n },\n {\n provide: AutocompleteRef,\n deps: [AUTOCOMPLETE_APP_REF, AUTOCOMPLETE_REF_TOKEN],\n },\n ],\n }),\n bindings: [\n ...Object.keys(data).map((key) =>\n inputBinding(key, () => (data as any)[key])\n ),\n ],\n });\n\n this.appRef.attachView(componentRef.hostView);\n\n componentRef.changeDetectorRef.detectChanges();\n }\n }\n}\n","import { Injectable, ResourceRef, Signal } from '@angular/core';\nimport {\n AutocompleteDataOptionsFn,\n AutocompleteList,\n} from './autocomplete-value';\n\n@Injectable({ providedIn: 'root' })\nexport class AutocompleteBuilder {\n onDemand(config: AutocompleteDataOptionsFn) {\n return config;\n }\n\n onServer(config: ResourceRef<AutocompleteList>) {\n return config;\n }\n\n inMemory(config: AutocompleteList) {\n return config;\n }\n\n inMemoryWithLoading(config: Signal<AutocompleteList>) {\n return config;\n }\n}\n","import {\n computed,\n DestroyRef,\n inject,\n Injectable,\n ResourceRef,\n signal,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl } from '@angular/forms';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\n\nexport type AutocompleteOptionValue = string | number | null;\n\nexport interface AutocompleteOption<TData = any> {\n label: string;\n value: AutocompleteOptionValue;\n data?: TData;\n}\n\nexport type AutocompleteList = AutocompleteOption[];\nexport interface AutocompleteDataOptionsFnParams {\n filter?: string | null;\n autofill?: any | null;\n internalFilter?: string | null;\n}\n\nexport type AutocompleteDataOptionsFn = (\n data: Signal<AutocompleteDataOptionsFnParams>\n) => ResourceRef<AutocompleteList>;\n\nexport type AutocompleteDataOptions =\n | AutocompleteDataOptionsFn\n | ResourceRef<AutocompleteList>\n | Signal<AutocompleteList>\n | AutocompleteList;\n\n@Injectable()\nexport class AutocompleteValue {\n private readonly destroyRef = inject(DestroyRef);\n private readonly _filter = signal<string | null>('');\n private _control?: FormControl<any>;\n private readonly _currentValue = signal<\n AutocompleteOption | AutocompleteOption[] | null\n >(null);\n private _multiple = false;\n private _options?: Signal<AutocompleteList>;\n private _autofill = signal<any | null>(null);\n private _isLoading?: Signal<boolean>;\n private _internalFilter = signal<string | null>(null);\n private _isOnDemand?: WritableSignal<boolean>;\n private readonly _requestOptionsParams =\n signal<AutocompleteDataOptionsFnParams>({\n filter: null,\n autofill: null,\n });\n\n private readonly _selectedOption = computed(() => {\n const currentValue = this._currentValue();\n\n if (Array.isArray(currentValue)) {\n return null;\n }\n\n return currentValue;\n });\n\n private readonly _selectedOptions = computed(() => {\n const currentValue = this._currentValue();\n\n if (Array.isArray(currentValue)) {\n return currentValue;\n }\n\n return [];\n });\n\n private readonly _hasValue = computed(() => {\n const currentValue = this._currentValue();\n const value = Array.isArray(currentValue)\n ? currentValue\n : currentValue?.value;\n\n if (Array.isArray(value)) {\n return value.length > 0;\n } else if (typeof value === 'number') {\n return value >= 0;\n }\n\n return !!value;\n });\n\n filterControl = new FormControl<string | null>('');\n\n get filter() {\n return this._filter.asReadonly();\n }\n\n get hasValue() {\n return this._hasValue;\n }\n\n get currentValue() {\n return this._currentValue.asReadonly();\n }\n\n get selectedOption() {\n return this._selectedOption;\n }\n\n get selectedOptions() {\n return this._selectedOptions;\n }\n\n get autofill() {\n return this._autofill.asReadonly();\n }\n\n get requestOptionsParams() {\n return this._requestOptionsParams.asReadonly();\n }\n\n set internalFilter(value: string | null) {\n this._internalFilter.set(value);\n this._requestOptionsParams.update(() => ({\n filter: this.filterControl.enabled ? null : this.filterControl.value,\n internalFilter: this._internalFilter(),\n autofill: null,\n }));\n }\n\n get isOnDemand() {\n if (!this._isOnDemand) {\n return signal(false);\n }\n return this._isOnDemand.asReadonly();\n }\n\n private selectedOptionIsDiff(\n options: AutocompleteOption | AutocompleteOption[]\n ) {\n if (this._multiple) {\n return (\n !Array.isArray(options) ||\n options.length !== this._selectedOptions().length ||\n options.some(\n (opt, index) => opt.value !== this._selectedOptions()[index].value\n )\n );\n }\n\n return (\n !options ||\n (options as AutocompleteOption).value !== this._selectedOption()?.value\n );\n }\n\n private async selectOption(value: any) {\n while (this._isLoading!()) {\n await delay(100);\n }\n\n if (!this._options) {\n return;\n }\n\n const options = this._multiple\n ? this._options()?.filter((opt) => `${value}`?.includes(`${opt.value}`))\n : this._options()?.find((opt) => `${opt.value}` === `${value}`);\n\n if (!isEmpty(value) && !options && this._isOnDemand!()) {\n this._requestOptionsParams.update(() => ({\n internalFilter: this._internalFilter(),\n autofill: value,\n }));\n\n await delay(100);\n\n this.selectOption(value);\n\n return;\n }\n\n if (options && this.selectedOptionIsDiff(options)) {\n this._currentValue.update(() => {\n if (this._multiple) {\n if (Array.isArray(options)) {\n return options;\n }\n\n return [options];\n }\n\n return options;\n });\n }\n }\n\n async makeAutofill() {\n if (!isEmpty(this._control?.value)) {\n while (this._isLoading!()) {\n await delay(100);\n }\n\n this.selectOption(this._control?.value);\n\n const currentValue = this._currentValue();\n\n if (\n (this._multiple &&\n ((Array.isArray(currentValue) && currentValue.length === 0) ||\n !Array.isArray(currentValue))) ||\n (!this._multiple && isEmpty(currentValue))\n ) {\n this._autofill.set(this._control?.value);\n this._requestOptionsParams.update((params) => ({\n ...params,\n internalFilter: this._internalFilter(),\n autofill: this._autofill(),\n }));\n }\n }\n }\n\n init(\n control: FormControl<any>,\n options: Signal<AutocompleteList>,\n isLoading: Signal<boolean>,\n isOnDemand: WritableSignal<boolean>,\n multiple = false\n ) {\n this._control = control;\n this._options = options;\n this._multiple = multiple;\n this._isLoading = isLoading;\n this._isOnDemand = isOnDemand;\n\n this.filterControl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(500))\n .subscribe((value) => {\n this._autofill.set(null);\n this._filter.set(value);\n this._requestOptionsParams.update(() => ({\n filter: value,\n internalFilter: this._internalFilter(),\n autofill: null,\n }));\n });\n\n this._control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => this.selectOption(value));\n }\n\n clear(event: MouseEvent) {\n event.preventDefault();\n this._control?.setValue(null);\n this._currentValue.set(null);\n this._requestOptionsParams.update(() => ({\n filter: null,\n internalFilter: this._internalFilter(),\n autofill: null,\n }));\n }\n\n remove(event: MouseEvent, value: AutocompleteOptionValue) {\n event.preventDefault();\n if (!this._multiple) {\n return;\n }\n\n if (!this._control) {\n return;\n }\n\n const currentValue = this._control.value;\n\n this._control?.setValue(\n currentValue.filter((v: AutocompleteOptionValue) => v !== value)\n );\n }\n}\n","import {\n booleanAttribute,\n Component,\n effect,\n inject,\n Injector,\n input,\n isSignal,\n linkedSignal,\n OnInit,\n ResourceRef,\n runInInjectionContext,\n Signal,\n signal,\n} from '@angular/core';\nimport { Loader } from '@koalarx/ui/core/components/loader';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { HookChange } from '@koalarx/ui/shared/directives';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { Autocomplete } from './autocomplete';\nimport {\n AutocompleteDataOptions,\n AutocompleteDataOptionsFn,\n AutocompleteList,\n AutocompleteValue,\n} from './autocomplete-value';\n\ninterface OptionsResource {\n onDemand?: ResourceRef<AutocompleteList>;\n onServer?: ResourceRef<AutocompleteList>;\n inMemory?: AutocompleteList;\n inMemoryWithLoading?: Signal<AutocompleteList>;\n}\n\n@Component({\n selector: 'kl-autocomplete-field',\n templateUrl: './autocomplete-field.html',\n providers: [Autocomplete, AutocompleteValue],\n imports: [Loader, FieldErrors, HookChange],\n})\nexport class AutocompleteField extends InputFieldBase implements OnInit {\n private readonly injector = inject(Injector);\n\n readonly autocompleteValue = inject(AutocompleteValue);\n readonly autocomplete = inject(Autocomplete);\n\n readonly options = input.required<AutocompleteDataOptions>();\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly placeholderSearchField = input<string>();\n readonly disableAutoTypeConversion = input(false, {\n transform: booleanAttribute,\n });\n\n readonly isLoading = signal<boolean>(false);\n readonly optionList = signal<AutocompleteList>([]);\n\n readonly optionsResource = signal<OptionsResource | null>(null);\n readonly isOnDemand = linkedSignal(\n () => this.optionsResource()?.onDemand !== undefined\n );\n\n constructor() {\n super();\n\n effect(() => {\n const optionList = this.optionList();\n const autofill = this.autocompleteValue.autofill();\n\n if (optionList.length > 0 && !isEmpty(autofill)) {\n this.autocompleteValue.makeAutofill();\n }\n });\n\n effect(() => {\n const options = this.optionsResource();\n\n if (!options) {\n return;\n }\n\n const { onDemand, onServer, inMemory, inMemoryWithLoading } = options;\n\n if (onDemand) {\n this.optionList.set(onDemand.value());\n this.isLoading.set(onDemand.isLoading());\n } else if (onServer) {\n this.optionList.set(this.applyFilter(onServer.value()));\n this.isLoading.set(onServer.isLoading());\n } else if (inMemory) {\n this.optionList.set(this.applyFilter(inMemory));\n this.isLoading.set(false);\n } else if (inMemoryWithLoading) {\n const optionsWithLoading = inMemoryWithLoading();\n this.optionList.set(this.applyFilter(optionsWithLoading ?? []));\n this.isLoading.set(!optionsWithLoading);\n }\n });\n }\n\n private applyFilter(options: AutocompleteList) {\n const filter = this.autocompleteValue.filter() ?? '';\n return options.filter((option) =>\n option.label.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n private generateOptionsResource(): OptionsResource {\n const options = this.options();\n\n if (Object.hasOwn(options, 'value')) {\n return { onServer: options as ResourceRef<AutocompleteList> };\n } else if (isSignal(options)) {\n return {\n inMemoryWithLoading: options as Signal<AutocompleteList>,\n };\n } else if (typeof options === 'function') {\n const resourceFnOptions = options as AutocompleteDataOptionsFn;\n return {\n onDemand: runInInjectionContext(this.injector, () =>\n resourceFnOptions(this.autocompleteValue.requestOptionsParams)\n ),\n };\n }\n\n return { inMemory: options as AutocompleteList };\n }\n\n open() {\n this.autocomplete.open({\n fieldId: this.fieldId,\n options: this.optionList,\n control: this.control(),\n multiple: this.multiple(),\n autocompleteValue: this.autocompleteValue,\n placeholderSearchField: this.placeholderSearchField(),\n disableAutoTypeConversion: this.disableAutoTypeConversion(),\n });\n }\n\n ngOnInit(): void {\n this.autocompleteValue.init(\n this.control(),\n this.optionList,\n this.isLoading,\n this.isOnDemand,\n this.multiple()\n );\n this.optionsResource.set(this.generateOptionsResource());\n this.autocompleteValue.makeAutofill();\n }\n}\n","<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n [class.has-value]=\"autocompleteValue.hasValue()\"\n type=\"button\"\n tabindex=\"0\"\n [id]=\"fieldId\"\n [disabled]=\"isDisabled() || isLoading()\"\n (focus)=\"control().markAsTouched()\"\n (click)=\"open()\">\n\n @if (label(); as label) {\n <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n </span>\n }\n\n <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n [hookChange]=\"autocompleteValue.currentValue()\"\n [class.hidden]=\"!autocompleteValue.hasValue()\">\n @if (multiple()) {\n @for (item of autocompleteValue.selectedOptions(); track $index) {\n <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n <span>{{item.label}}</span>\n <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n (click)=\"autocompleteValue.remove($event, item.value)\">\n </i>\n </span>\n }\n } @else {\n {{autocompleteValue.selectedOption()?.label}}\n }\n </div>\n\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else if (autocompleteValue.hasValue()) {\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n (click)=\"autocompleteValue.clear($event)\">\n </i>\n }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"koalarx-ui-shared-components-input-field-autocomplete.mjs","sources":["../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-ref.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-options.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-options.html","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-builder.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-value.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-field.ts","../../projects/koala-ui/shared/components/input-field/autocomplete/autocomplete-field.html","../../projects/koala-ui/shared/components/input-field/autocomplete/koalarx-ui-shared-components-input-field-autocomplete.ts"],"sourcesContent":["import {\n ApplicationRef,\n ComponentRef,\n inject,\n Injectable,\n InjectionToken,\n Type,\n} from '@angular/core';\nimport { AUTOCOMPLETE_APP_REF } from './autocomplete';\n\nexport const AUTOCOMPLETE_REF_TOKEN = new InjectionToken(\n 'AutocompleteRefToken'\n);\n\n@Injectable()\nexport class AutocompleteRef {\n private readonly appRef = inject<ApplicationRef>(AUTOCOMPLETE_APP_REF);\n private readonly componentRef = inject<() => ComponentRef<Type<any>>>(\n AUTOCOMPLETE_REF_TOKEN\n );\n\n close() {\n setTimeout(() => {\n this.componentRef().destroy();\n this.appRef.detachView(this.componentRef().hostView);\n });\n }\n}\n","import {\n booleanAttribute,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n OnInit,\n Signal,\n signal,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { AutocompleteRef } from './autocomplete-ref';\nimport { AutocompleteList, AutocompleteValue } from './autocomplete-value';\nimport { KlArray } from '@koalarx/utils/KlArray';\n\n@Component({\n selector: 'kl-autocomplete-options',\n templateUrl: './autocomplete-options.html',\n imports: [ReactiveFormsModule],\n})\nexport class AutocompleteOptions implements OnInit, OnDestroy {\n private readonly autocompleteRef = inject(AutocompleteRef);\n private readonly viewContainerRef =\n inject<ViewContainerRef>(ViewContainerRef);\n private firstLoad = true;\n\n fieldId = input.required<string>();\n options = input.required<Signal<AutocompleteList>>();\n control = input.required<FormControl>();\n multiple = input.required<boolean>();\n autocompleteValue = input.required<AutocompleteValue>();\n placeholderSearchField = input<string | undefined>();\n disableAutoTypeConversion = input(false, { transform: booleanAttribute });\n list = linkedSignal(() => {\n const options = this.options()();\n return new KlArray(options).split(100)[0];\n });\n\n optionFocused = signal(0);\n\n searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n constructor() {\n effect(() => {\n const hasValue = !!this.autocompleteValue().currentValue();\n\n if (this.firstLoad) {\n this.firstLoad = false;\n return;\n }\n\n if (hasValue && !this.multiple()) {\n this.close();\n }\n });\n\n effect(() => {\n const options = this.options()();\n if (options.length > 0) {\n this.optionFocused.set(0);\n }\n });\n }\n\n private updateScrollPosition(direction: 'down' | 'up' = 'down') {\n setTimeout(() => {\n const containerElement =\n this.viewContainerRef.element.nativeElement.querySelector(\n '.kl-autocomplete-options-container'\n ) as HTMLDivElement;\n const focusedOptionElement = containerElement.querySelector(\n 'label.active'\n ) as HTMLDivElement;\n\n if (focusedOptionElement) {\n containerElement.scrollTo({\n top:\n direction === 'down'\n ? containerElement.scrollTop +\n focusedOptionElement.getBoundingClientRect().height\n : containerElement.scrollTop -\n focusedOptionElement.getBoundingClientRect().height,\n });\n }\n });\n }\n\n private onKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown': {\n event.stopPropagation();\n event.preventDefault();\n\n this.optionFocused.update((value) => {\n if (value < this.options()().length - 1) {\n return value + 1;\n }\n return value;\n });\n this.updateScrollPosition('down');\n break;\n }\n case 'ArrowUp': {\n event.stopPropagation();\n event.preventDefault();\n\n this.optionFocused.update((value) => {\n if (value > 0) {\n return value - 1;\n }\n return value;\n });\n this.updateScrollPosition('up');\n break;\n }\n }\n };\n\n private onKeyup = (event: KeyboardEvent) => {\n const containerElement: HTMLDivElement =\n this.viewContainerRef.element.nativeElement;\n\n switch (event.key) {\n case 'Enter': {\n event.stopPropagation();\n event.preventDefault();\n\n const focusedOption = this.options()()[this.optionFocused()];\n\n if (focusedOption) {\n containerElement\n .querySelectorAll<HTMLInputElement>('input')\n .item(this.optionFocused() + 1)\n .click();\n }\n break;\n }\n case 'Escape': {\n event.stopPropagation();\n event.preventDefault();\n\n this.close();\n break;\n }\n }\n };\n\n private onClick = (event: MouseEvent) => {\n const containerElement: HTMLDivElement =\n this.viewContainerRef.element.nativeElement;\n const insideClick = containerElement.contains(event.target as Node);\n\n if (!insideClick) {\n event.stopPropagation();\n event.preventDefault();\n this.close();\n }\n };\n\n private onScroll = (event: Event) => {\n const container = this.viewContainerRef.element.nativeElement.querySelector(\n '.kl-autocomplete-options-container'\n );\n const target = event.target as HTMLElement;\n\n if (!container || !target.tagName) return;\n\n if (target !== container) {\n this.close();\n }\n };\n\n private close() {\n if (\n this.autocompleteValue().filterControl.value &&\n !this.autocompleteValue().isOnDemand()\n ) {\n this.autocompleteValue().filterControl.reset();\n }\n\n this.autocompleteRef.close();\n }\n\n ngOnDestroy() {\n document.removeEventListener('keyup', this.onKeyup);\n document.removeEventListener('keydown', this.onKeyDown);\n document.removeEventListener('click', this.onClick);\n window.removeEventListener('scroll', this.onScroll, true);\n }\n\n ngOnInit() {\n this.searchInputRef()?.nativeElement.focus();\n\n setTimeout(() => {\n document.addEventListener('keyup', this.onKeyup);\n document.addEventListener('keydown', this.onKeyDown);\n document.addEventListener('click', this.onClick);\n window.addEventListener('scroll', this.onScroll, true);\n }, 150);\n }\n\n setValue(event: Event) {\n const target = event.target as HTMLInputElement;\n\n let value: string | number = target.value;\n\n if (\n !Number.isNaN(parseInt(value as any)) &&\n !/^0+[1-9]\\d*$/.test(value) &&\n !this.disableAutoTypeConversion()\n ) {\n value = Number(value);\n }\n\n if (this.multiple()) {\n const check = target.checked;\n\n let currentValue = this.control().value;\n\n if (!Array.isArray(currentValue)) {\n currentValue = [currentValue];\n }\n\n if (check) {\n this.control().setValue([...currentValue, value]);\n } else {\n this.control().setValue(currentValue.filter((v: any) => v !== value));\n }\n } else {\n this.control().setValue(value);\n }\n }\n}\n","<div class=\"bg-base-300 overflow-hidden shadow border border-neutral-200 dark:border-neutral-700 rounded-lg flex flex-col w-full\"\n [attr.aria-labelledby]=\"fieldId()\">\n\n <div class=\"kl-autocomplete-filter border-b border-neutral-200 dark:border-neutral-700\">\n <label class=\"flex items-center text-sm\">\n <i class=\"fa-solid fa-magnifying-glass opacity-60 absolute top-3 left-4\"></i>\n <input class=\"w-full p-2 pr-3 pl-10 outline-none placeholder:opacity-60\"\n #searchInput\n type=\"search\"\n [formControl]=\"autocompleteValue().filterControl\"\n placeholder=\"Type to Search...\"\n />\n </label>\n </div>\n\n <div class=\"kl-autocomplete-options-container flex flex-col overflow-auto p-1\">\n @for (item of list(); track $index) {\n @let optionLabelId = fieldId() + '-' + item.value;\n\n <label class=\"relative py-1 px-2 pr-8 rounded-md\"\n [attr.for]=\"optionLabelId\"\n [class.active]=\"$index === optionFocused()\"\n (mouseover)=\"optionFocused.set($index)\">\n\n <input\n [type]=\"multiple() ? 'checkbox' : 'radio'\"\n [id]=\"optionLabelId\"\n [name]=\"fieldId()\"\n [attr.value]=\"item.value\"\n [checked]=\"multiple()\n ? control().value?.includes(item.value)\n : item.value === control().value\"\n (change)=\"setValue($event)\"\n />\n {{item.label}}\n </label>\n }\n </div>\n</div>\n","import {\n ApplicationRef,\n createComponent,\n EnvironmentInjector,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n inputBinding,\n Signal,\n ViewContainerRef,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { GENERIC_COMPONENT_CONTAINER_NAME } from '@koalarx/ui/core/config';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { randomString } from '@koalarx/utils/KlString';\nimport { AutocompleteOptions } from './autocomplete-options';\nimport { AUTOCOMPLETE_REF_TOKEN, AutocompleteRef } from './autocomplete-ref';\nimport { AutocompleteList, AutocompleteValue } from './autocomplete-value';\n\nexport type AutocompleteAfterCloseTrigger = string | Record<string, any>;\nexport type AutocompleteAfterCloseTriggerFn = (\n trigger: AutocompleteAfterCloseTrigger\n) => void;\nexport const AUTOCOMPLETE_APP_REF = new InjectionToken('AutocompleteAppRef');\n\nexport interface AutocompleteOpenData {\n fieldId: string;\n options: Signal<AutocompleteList>;\n control: FormControl<any>;\n multiple: boolean;\n autocompleteValue: AutocompleteValue;\n placeholderSearchField?: string;\n disableAutoTypeConversion?: boolean;\n}\n\n@Injectable()\nexport class Autocomplete {\n private readonly appRef = inject(ApplicationRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(EnvironmentInjector);\n\n private generateElementId() {\n let elementId: string;\n\n do {\n elementId = randomString(50, {\n numbers: false,\n lowercase: true,\n uppercase: true,\n specialCharacters: false,\n });\n } while (document.getElementById(elementId));\n\n return elementId;\n }\n\n private calculatePosition(container: HTMLDivElement) {\n const autocompleteField = this.viewContainerRef.element\n .nativeElement as HTMLElement;\n const currentTop = window.scrollY;\n const position = autocompleteField.getBoundingClientRect();\n const optionsContainer = container.querySelector<HTMLDivElement>(\n '.kl-autocomplete-options-container'\n );\n const filterContainer = container?.querySelector<HTMLDivElement>(\n '.kl-autocomplete-filter'\n );\n const filterContainerHeight = (filterContainer?.clientHeight || 0) + 2;\n\n if (position) {\n const screenHeight = document.body.clientHeight;\n const maxHeight = (screenHeight * 40) / 100;\n let top = position.bottom;\n let height = Math.abs(screenHeight - top);\n\n if (height > maxHeight) {\n height = maxHeight;\n }\n\n const percentFillOnScreen = (height * 100) / screenHeight;\n\n if (percentFillOnScreen <= 20) {\n const optionsHeight = optionsContainer?.clientHeight || 0;\n const currentHeight = optionsHeight + filterContainerHeight;\n\n if (optionsHeight > 0 && currentHeight <= maxHeight) {\n height = currentHeight;\n } else {\n height = Math.abs(screenHeight - (screenHeight - position.top));\n\n if (height > maxHeight) {\n height = maxHeight;\n }\n }\n\n top = position.top - height;\n }\n\n top += currentTop;\n\n container.style.top = `${top}px`;\n container.style.maxHeight = `${height}px`;\n\n return { top, left: position.left, width: position.width, height };\n }\n\n return null;\n }\n\n private async waitForButtonEnabled(\n buttonElement: HTMLButtonElement,\n timeout: number\n ) {\n const delayTime = 50;\n\n let ellapsedTime = 0;\n\n while (buttonElement.disabled && ellapsedTime <= timeout) {\n await delay(delayTime);\n ellapsedTime += delayTime;\n }\n }\n\n private async positionOnScreen(container: HTMLDivElement) {\n const autocompleteField = this.viewContainerRef.element\n .nativeElement as HTMLElement;\n const autocompleteFieldButton =\n autocompleteField.querySelector<HTMLButtonElement>('button');\n\n if (autocompleteFieldButton) {\n await this.waitForButtonEnabled(autocompleteFieldButton, 5000);\n }\n\n const position = this.calculatePosition(container);\n\n if (position) {\n const { left, width } = position;\n\n container.style.position = 'absolute';\n container.style.display = 'flex';\n container.style.left = `${left}px`;\n container.style.width = `${width}px`;\n container.style.height = `auto`;\n container.style.zIndex = '99';\n container.style.overflow = 'hidden';\n container.style.transition = 'all 0.1s ease-in-out';\n\n const selectedOptions =\n autocompleteField.querySelector<HTMLDivElement>('.selected-options');\n\n if (selectedOptions) {\n selectedOptions.onchange = () => this.positionOnScreen(container);\n }\n }\n }\n\n async open(data: AutocompleteOpenData) {\n const main = document.querySelector<HTMLElement>(\n GENERIC_COMPONENT_CONTAINER_NAME\n );\n\n if (main) {\n const elementId = this.generateElementId();\n const container = main.appendChild(document.createElement('div'));\n\n container.id = elementId;\n\n await this.positionOnScreen(container);\n\n const componentRef = createComponent(AutocompleteOptions, {\n environmentInjector: this.injector,\n hostElement: container,\n elementInjector: Injector.create({\n providers: [\n { provide: AUTOCOMPLETE_APP_REF, useValue: this.appRef },\n {\n provide: AUTOCOMPLETE_REF_TOKEN,\n useValue: () => componentRef,\n },\n {\n provide: AutocompleteRef,\n deps: [AUTOCOMPLETE_APP_REF, AUTOCOMPLETE_REF_TOKEN],\n },\n ],\n }),\n bindings: [\n ...Object.keys(data).map((key) =>\n inputBinding(key, () => (data as any)[key])\n ),\n ],\n });\n\n this.appRef.attachView(componentRef.hostView);\n\n componentRef.changeDetectorRef.detectChanges();\n\n this.calculatePosition(container);\n }\n }\n}\n","import { Injectable, ResourceRef, Signal } from '@angular/core';\nimport {\n AutocompleteDataOptionsFn,\n AutocompleteList,\n} from './autocomplete-value';\n\n@Injectable({ providedIn: 'root' })\nexport class AutocompleteBuilder {\n onDemand(config: AutocompleteDataOptionsFn) {\n return config;\n }\n\n onServer(config: ResourceRef<AutocompleteList>) {\n return config;\n }\n\n inMemory(config: AutocompleteList) {\n return config;\n }\n\n inMemoryWithLoading(config: Signal<AutocompleteList>) {\n return config;\n }\n}\n","import {\n computed,\n DestroyRef,\n inject,\n Injectable,\n ResourceRef,\n signal,\n Signal,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl } from '@angular/forms';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { delay } from '@koalarx/utils/KlDelay';\nimport { debounceTime } from 'rxjs/internal/operators/debounceTime';\n\nexport type AutocompleteOptionValue = string | number | null;\n\nexport interface AutocompleteOption<TData = any> {\n label: string;\n value: AutocompleteOptionValue;\n data?: TData;\n}\n\nexport type AutocompleteList = AutocompleteOption[];\nexport interface AutocompleteDataOptionsFnParams {\n filter?: string | null;\n autofill?: any | null;\n internalFilter?: string | null;\n}\n\nexport type AutocompleteDataOptionsFn = (\n data: Signal<AutocompleteDataOptionsFnParams>\n) => ResourceRef<AutocompleteList>;\n\nexport type AutocompleteDataOptions =\n | AutocompleteDataOptionsFn\n | ResourceRef<AutocompleteList>\n | Signal<AutocompleteList>\n | AutocompleteList;\n\n@Injectable()\nexport class AutocompleteValue {\n private readonly destroyRef = inject(DestroyRef);\n private readonly _filter = signal<string | null>('');\n private _control?: FormControl<any>;\n private readonly _currentValue = signal<\n AutocompleteOption | AutocompleteOption[] | null\n >(null);\n private _multiple = false;\n private _options?: Signal<AutocompleteList>;\n private _autofill = signal<any | null>(null);\n private _isLoading?: Signal<boolean>;\n private _internalFilter = signal<string | null>(null);\n private _isOnDemand?: WritableSignal<boolean>;\n private readonly _requestOptionsParams =\n signal<AutocompleteDataOptionsFnParams>({\n filter: null,\n autofill: null,\n });\n\n private readonly _selectedOption = computed(() => {\n const currentValue = this._currentValue();\n\n if (Array.isArray(currentValue)) {\n return null;\n }\n\n return currentValue;\n });\n\n private readonly _selectedOptions = computed(() => {\n const currentValue = this._currentValue();\n\n if (Array.isArray(currentValue)) {\n return currentValue;\n }\n\n return [];\n });\n\n private readonly _hasValue = computed(() => {\n const currentValue = this._currentValue();\n const value = Array.isArray(currentValue)\n ? currentValue\n : currentValue?.value;\n\n if (Array.isArray(value)) {\n return value.length > 0;\n } else if (typeof value === 'number') {\n return value >= 0;\n }\n\n return !!value;\n });\n\n filterControl = new FormControl<string | null>('');\n\n get filter() {\n return this._filter.asReadonly();\n }\n\n get hasValue() {\n return this._hasValue;\n }\n\n get currentValue() {\n return this._currentValue.asReadonly();\n }\n\n get selectedOption() {\n return this._selectedOption;\n }\n\n get selectedOptions() {\n return this._selectedOptions;\n }\n\n get autofill() {\n return this._autofill.asReadonly();\n }\n\n get requestOptionsParams() {\n return this._requestOptionsParams.asReadonly();\n }\n\n set internalFilter(value: string | null) {\n this._internalFilter.set(value);\n this._requestOptionsParams.update(() => ({\n filter: this.filterControl.enabled ? null : this.filterControl.value,\n internalFilter: this._internalFilter(),\n autofill: null,\n }));\n }\n\n get isOnDemand() {\n if (!this._isOnDemand) {\n return signal(false);\n }\n return this._isOnDemand.asReadonly();\n }\n\n private selectedOptionIsDiff(\n options: AutocompleteOption | AutocompleteOption[]\n ) {\n if (this._multiple) {\n return (\n !Array.isArray(options) ||\n options.length !== this._selectedOptions().length ||\n options.some(\n (opt, index) => opt.value !== this._selectedOptions()[index].value\n )\n );\n }\n\n return (\n !options ||\n (options as AutocompleteOption).value !== this._selectedOption()?.value\n );\n }\n\n private async selectOption(value: any) {\n while (this._isLoading!()) {\n await delay(100);\n }\n\n if (!this._options) {\n return;\n }\n\n const options = this._multiple\n ? this._options()?.filter((opt) => `${value}`?.includes(`${opt.value}`))\n : this._options()?.find((opt) => `${opt.value}` === `${value}`);\n\n if (!isEmpty(value) && !options && this._isOnDemand!()) {\n this._requestOptionsParams.update(() => ({\n internalFilter: this._internalFilter(),\n autofill: value,\n }));\n\n await delay(100);\n\n this.selectOption(value);\n\n return;\n }\n\n if (options && this.selectedOptionIsDiff(options)) {\n this._currentValue.update(() => {\n if (this._multiple) {\n if (Array.isArray(options)) {\n return options;\n }\n\n return [options];\n }\n\n return options;\n });\n }\n }\n\n async makeAutofill() {\n if (!isEmpty(this._control?.value)) {\n while (this._isLoading!()) {\n await delay(100);\n }\n\n this.selectOption(this._control?.value);\n\n const currentValue = this._currentValue();\n\n if (\n (this._multiple &&\n ((Array.isArray(currentValue) && currentValue.length === 0) ||\n !Array.isArray(currentValue))) ||\n (!this._multiple && isEmpty(currentValue))\n ) {\n this._autofill.set(this._control?.value);\n this._requestOptionsParams.update((params) => ({\n ...params,\n internalFilter: this._internalFilter(),\n autofill: this._autofill(),\n }));\n }\n }\n }\n\n init(\n control: FormControl<any>,\n options: Signal<AutocompleteList>,\n isLoading: Signal<boolean>,\n isOnDemand: WritableSignal<boolean>,\n multiple = false\n ) {\n this._control = control;\n this._options = options;\n this._multiple = multiple;\n this._isLoading = isLoading;\n this._isOnDemand = isOnDemand;\n\n this.filterControl.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(500))\n .subscribe((value) => {\n this._autofill.set(null);\n this._filter.set(value);\n this._requestOptionsParams.update(() => ({\n filter: value,\n internalFilter: this._internalFilter(),\n autofill: null,\n }));\n });\n\n this._control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => this.selectOption(value));\n }\n\n clear(event: MouseEvent) {\n event.preventDefault();\n this._control?.setValue(null);\n this._currentValue.set(null);\n this._requestOptionsParams.update(() => ({\n filter: null,\n internalFilter: this._internalFilter(),\n autofill: null,\n }));\n }\n\n remove(event: MouseEvent, value: AutocompleteOptionValue) {\n event.preventDefault();\n if (!this._multiple) {\n return;\n }\n\n if (!this._control) {\n return;\n }\n\n const currentValue = this._control.value;\n\n this._control?.setValue(\n currentValue.filter((v: AutocompleteOptionValue) => v !== value)\n );\n }\n}\n","import {\n booleanAttribute,\n Component,\n effect,\n inject,\n Injector,\n input,\n isSignal,\n linkedSignal,\n OnInit,\n ResourceRef,\n runInInjectionContext,\n Signal,\n signal,\n} from '@angular/core';\nimport { Loader } from '@koalarx/ui/core/components/loader';\nimport { FieldErrors } from '@koalarx/ui/shared/components/field-errors';\nimport { InputFieldBase } from '@koalarx/ui/shared/components/input-field';\nimport { HookChange } from '@koalarx/ui/shared/directives';\nimport { isEmpty } from '@koalarx/ui/shared/utils';\nimport { Autocomplete } from './autocomplete';\nimport {\n AutocompleteDataOptions,\n AutocompleteDataOptionsFn,\n AutocompleteList,\n AutocompleteValue,\n} from './autocomplete-value';\n\ninterface OptionsResource {\n onDemand?: ResourceRef<AutocompleteList>;\n onServer?: ResourceRef<AutocompleteList>;\n inMemory?: AutocompleteList;\n inMemoryWithLoading?: Signal<AutocompleteList>;\n}\n\n@Component({\n selector: 'kl-autocomplete-field',\n templateUrl: './autocomplete-field.html',\n providers: [Autocomplete, AutocompleteValue],\n imports: [Loader, FieldErrors, HookChange],\n})\nexport class AutocompleteField extends InputFieldBase implements OnInit {\n private readonly injector = inject(Injector);\n\n readonly autocompleteValue = inject(AutocompleteValue);\n readonly autocomplete = inject(Autocomplete);\n\n readonly options = input.required<AutocompleteDataOptions>();\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly placeholderSearchField = input<string>();\n readonly disableAutoTypeConversion = input(false, {\n transform: booleanAttribute,\n });\n\n readonly isLoading = signal<boolean>(false);\n readonly optionList = signal<AutocompleteList>([]);\n\n readonly optionsResource = signal<OptionsResource | null>(null);\n readonly isOnDemand = linkedSignal(\n () => this.optionsResource()?.onDemand !== undefined\n );\n\n constructor() {\n super();\n\n effect(() => {\n const optionList = this.optionList();\n const autofill = this.autocompleteValue.autofill();\n\n if (optionList.length > 0 && !isEmpty(autofill)) {\n this.autocompleteValue.makeAutofill();\n }\n });\n\n effect(() => {\n const options = this.optionsResource();\n\n if (!options) {\n return;\n }\n\n const { onDemand, onServer, inMemory, inMemoryWithLoading } = options;\n\n if (onDemand) {\n this.optionList.set(onDemand.value());\n this.isLoading.set(onDemand.isLoading());\n } else if (onServer) {\n this.optionList.set(this.applyFilter(onServer.value()));\n this.isLoading.set(onServer.isLoading());\n } else if (inMemory) {\n this.optionList.set(this.applyFilter(inMemory));\n this.isLoading.set(false);\n } else if (inMemoryWithLoading) {\n const optionsWithLoading = inMemoryWithLoading();\n this.optionList.set(this.applyFilter(optionsWithLoading ?? []));\n this.isLoading.set(!optionsWithLoading);\n }\n });\n }\n\n private applyFilter(options: AutocompleteList) {\n const filter = this.autocompleteValue.filter() ?? '';\n return options.filter((option) =>\n option.label.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n private generateOptionsResource(): OptionsResource {\n const options = this.options();\n\n if (Object.hasOwn(options, 'value')) {\n return { onServer: options as ResourceRef<AutocompleteList> };\n } else if (isSignal(options)) {\n return {\n inMemoryWithLoading: options as Signal<AutocompleteList>,\n };\n } else if (typeof options === 'function') {\n const resourceFnOptions = options as AutocompleteDataOptionsFn;\n return {\n onDemand: runInInjectionContext(this.injector, () =>\n resourceFnOptions(this.autocompleteValue.requestOptionsParams)\n ),\n };\n }\n\n return { inMemory: options as AutocompleteList };\n }\n\n open() {\n this.autocomplete.open({\n fieldId: this.fieldId,\n options: this.optionList,\n control: this.control(),\n multiple: this.multiple(),\n autocompleteValue: this.autocompleteValue,\n placeholderSearchField: this.placeholderSearchField(),\n disableAutoTypeConversion: this.disableAutoTypeConversion(),\n });\n }\n\n ngOnInit(): void {\n this.autocompleteValue.init(\n this.control(),\n this.optionList,\n this.isLoading,\n this.isOnDemand,\n this.multiple()\n );\n this.optionsResource.set(this.generateOptionsResource());\n this.autocompleteValue.makeAutofill();\n }\n}\n","<button class=\"relative select hover:cursor-default bg-base-100 w-full min-h-10 h-full flex items-center justify-between flex-nowrap\"\n [class.has-value]=\"autocompleteValue.hasValue()\"\n type=\"button\"\n tabindex=\"0\"\n [id]=\"fieldId\"\n [disabled]=\"isDisabled() || isLoading()\"\n (focus)=\"control().markAsTouched()\"\n (click)=\"open()\">\n\n @if (label(); as label) {\n <span class=\"autocomplete-label flex items-center gap-2 whitespace-nowrap text-neutral-900 dark:text-neutral-300\">\n <span>{{label}} {{ isRequired() ? '*' : '' }}</span>\n </span>\n }\n\n <div class=\"flex flex-wrap gap-1 pt-3 pb-2 items-center w-full h-full selected-options\"\n [hookChange]=\"!isLoading() && (autocompleteValue.filter() || autocompleteValue.currentValue())\"\n [class.hidden]=\"!autocompleteValue.hasValue()\">\n @if (multiple()) {\n @for (item of autocompleteValue.selectedOptions(); track $index) {\n <span class=\"flex items-center badge badge-primary badge-sm rounded-sm\">\n <span>{{item.label}}</span>\n <i class=\"fa-solid fa-xmark text-neutral-400 hover:cursor-pointer\"\n (click)=\"autocompleteValue.remove($event, item.value)\">\n </i>\n </span>\n }\n } @else {\n {{autocompleteValue.selectedOption()?.label}}\n }\n </div>\n\n @if (isLoading()) {\n <kl-loader size=\"small\" />\n } @else if (autocompleteValue.hasValue()) {\n <i class=\"fa-solid fa-xmark text-neutral-500 hover:cursor-pointer pt-1 pr-2\"\n (click)=\"autocompleteValue.clear($event)\">\n </i>\n }\n</button>\n\n<kl-field-errors [field]=\"control()\">\n <ng-container errors>\n <ng-content select=\"[errors]\" />\n </ng-container>\n</kl-field-errors>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -71,8 +71,10 @@ declare class Autocomplete {
|
|
|
71
71
|
private readonly viewContainerRef;
|
|
72
72
|
private readonly injector;
|
|
73
73
|
private generateElementId;
|
|
74
|
+
private calculatePosition;
|
|
75
|
+
private waitForButtonEnabled;
|
|
74
76
|
private positionOnScreen;
|
|
75
|
-
open(data: AutocompleteOpenData): void
|
|
77
|
+
open(data: AutocompleteOpenData): Promise<void>;
|
|
76
78
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Autocomplete, never>;
|
|
77
79
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<Autocomplete>;
|
|
78
80
|
}
|