@koalarx/ui 20.2.0 → 20.2.2
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,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Injectable, ViewContainerRef, input, booleanAttribute, linkedSignal, signal, viewChild, effect, Component, ApplicationRef, EnvironmentInjector, createComponent, inputBinding, Injector, DestroyRef, isSignal, runInInjectionContext } from '@angular/core';
|
|
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
4
|
import { randomString } from '@koalarx/utils/KlString';
|
|
5
5
|
import * as i1 from '@angular/forms';
|
|
@@ -328,25 +328,27 @@ class AutocompleteValue {
|
|
|
328
328
|
_options;
|
|
329
329
|
_autofill = signal(null);
|
|
330
330
|
_isLoading;
|
|
331
|
+
_internalFilter = signal(null);
|
|
332
|
+
_isOnDemand;
|
|
331
333
|
_requestOptionsParams = signal({
|
|
332
334
|
filter: null,
|
|
333
335
|
autofill: null,
|
|
334
336
|
});
|
|
335
|
-
_selectedOption =
|
|
337
|
+
_selectedOption = computed(() => {
|
|
336
338
|
const currentValue = this._currentValue();
|
|
337
339
|
if (Array.isArray(currentValue)) {
|
|
338
340
|
return null;
|
|
339
341
|
}
|
|
340
342
|
return currentValue;
|
|
341
343
|
});
|
|
342
|
-
_selectedOptions =
|
|
344
|
+
_selectedOptions = computed(() => {
|
|
343
345
|
const currentValue = this._currentValue();
|
|
344
346
|
if (Array.isArray(currentValue)) {
|
|
345
347
|
return currentValue;
|
|
346
348
|
}
|
|
347
349
|
return [];
|
|
348
350
|
});
|
|
349
|
-
_hasValue =
|
|
351
|
+
_hasValue = computed(() => {
|
|
350
352
|
const currentValue = this._currentValue();
|
|
351
353
|
const value = Array.isArray(currentValue)
|
|
352
354
|
? currentValue
|
|
@@ -364,16 +366,16 @@ class AutocompleteValue {
|
|
|
364
366
|
return this._filter.asReadonly();
|
|
365
367
|
}
|
|
366
368
|
get hasValue() {
|
|
367
|
-
return this._hasValue
|
|
369
|
+
return this._hasValue;
|
|
368
370
|
}
|
|
369
371
|
get currentValue() {
|
|
370
372
|
return this._currentValue.asReadonly();
|
|
371
373
|
}
|
|
372
374
|
get selectedOption() {
|
|
373
|
-
return this._selectedOption
|
|
375
|
+
return this._selectedOption;
|
|
374
376
|
}
|
|
375
377
|
get selectedOptions() {
|
|
376
|
-
return this._selectedOptions
|
|
378
|
+
return this._selectedOptions;
|
|
377
379
|
}
|
|
378
380
|
get autofill() {
|
|
379
381
|
return this._autofill.asReadonly();
|
|
@@ -381,6 +383,14 @@ class AutocompleteValue {
|
|
|
381
383
|
get requestOptionsParams() {
|
|
382
384
|
return this._requestOptionsParams.asReadonly();
|
|
383
385
|
}
|
|
386
|
+
set internalFilter(value) {
|
|
387
|
+
this._internalFilter.set(value);
|
|
388
|
+
this._requestOptionsParams.update(() => ({
|
|
389
|
+
filter: this.filterControl.enabled ? null : this.filterControl.value,
|
|
390
|
+
internalFilter: this._internalFilter(),
|
|
391
|
+
autofill: null,
|
|
392
|
+
}));
|
|
393
|
+
}
|
|
384
394
|
async selectOption(value) {
|
|
385
395
|
while (this._isLoading()) {
|
|
386
396
|
await delay(100);
|
|
@@ -391,6 +401,13 @@ class AutocompleteValue {
|
|
|
391
401
|
const options = this._multiple
|
|
392
402
|
? this._options()?.filter((opt) => `${value}`?.includes(`${opt.value}`))
|
|
393
403
|
: this._options()?.find((opt) => `${opt.value}` === `${value}`);
|
|
404
|
+
if (!isEmpty(value) && !options && this._isOnDemand()) {
|
|
405
|
+
this._requestOptionsParams.update(() => ({
|
|
406
|
+
internalFilter: this._internalFilter(),
|
|
407
|
+
autofill: value,
|
|
408
|
+
}));
|
|
409
|
+
return this.makeAutofill();
|
|
410
|
+
}
|
|
394
411
|
if (options) {
|
|
395
412
|
this._currentValue.update(() => {
|
|
396
413
|
if (this._multiple) {
|
|
@@ -417,16 +434,18 @@ class AutocompleteValue {
|
|
|
417
434
|
this._autofill.set(this._control?.value);
|
|
418
435
|
this._requestOptionsParams.update((params) => ({
|
|
419
436
|
...params,
|
|
437
|
+
internalFilter: this._internalFilter(),
|
|
420
438
|
autofill: this._autofill(),
|
|
421
439
|
}));
|
|
422
440
|
}
|
|
423
441
|
}
|
|
424
442
|
}
|
|
425
|
-
init(control, options, isLoading, multiple = false) {
|
|
443
|
+
init(control, options, isLoading, isOnDemand, multiple = false) {
|
|
426
444
|
this._control = control;
|
|
427
445
|
this._options = options;
|
|
428
446
|
this._multiple = multiple;
|
|
429
447
|
this._isLoading = isLoading;
|
|
448
|
+
this._isOnDemand = isOnDemand;
|
|
430
449
|
this.filterControl.valueChanges
|
|
431
450
|
.pipe(takeUntilDestroyed(this.destroyRef), debounceTime(500))
|
|
432
451
|
.subscribe((value) => {
|
|
@@ -434,6 +453,7 @@ class AutocompleteValue {
|
|
|
434
453
|
this._filter.set(value);
|
|
435
454
|
this._requestOptionsParams.update(() => ({
|
|
436
455
|
filter: value,
|
|
456
|
+
internalFilter: this._internalFilter(),
|
|
437
457
|
autofill: null,
|
|
438
458
|
}));
|
|
439
459
|
});
|
|
@@ -447,6 +467,7 @@ class AutocompleteValue {
|
|
|
447
467
|
this._currentValue.set(null);
|
|
448
468
|
this._requestOptionsParams.update(() => ({
|
|
449
469
|
filter: null,
|
|
470
|
+
internalFilter: this._internalFilter(),
|
|
450
471
|
autofill: null,
|
|
451
472
|
}));
|
|
452
473
|
}
|
|
@@ -475,10 +496,13 @@ class AutocompleteField extends InputFieldBase {
|
|
|
475
496
|
options = input.required();
|
|
476
497
|
multiple = input(false, { transform: booleanAttribute });
|
|
477
498
|
placeholderSearchField = input();
|
|
478
|
-
disableAutoTypeConversion = input(false, {
|
|
499
|
+
disableAutoTypeConversion = input(false, {
|
|
500
|
+
transform: booleanAttribute,
|
|
501
|
+
});
|
|
479
502
|
isLoading = signal(false);
|
|
480
503
|
optionList = signal([]);
|
|
481
504
|
optionsResource = signal(null);
|
|
505
|
+
isOnDemand = linkedSignal(() => this.optionsResource()?.onDemand !== undefined);
|
|
482
506
|
constructor() {
|
|
483
507
|
super();
|
|
484
508
|
effect(() => {
|
|
@@ -547,7 +571,7 @@ class AutocompleteField extends InputFieldBase {
|
|
|
547
571
|
});
|
|
548
572
|
}
|
|
549
573
|
ngOnInit() {
|
|
550
|
-
this.autocompleteValue.init(this.control(), this.optionList, this.isLoading, this.multiple());
|
|
574
|
+
this.autocompleteValue.init(this.control(), this.optionList, this.isLoading, this.isOnDemand, this.multiple());
|
|
551
575
|
this.optionsResource.set(this.generateOptionsResource());
|
|
552
576
|
this.autocompleteValue.makeAutofill();
|
|
553
577
|
}
|
|
@@ -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 (this.autocompleteValue().filterControl.value) {\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=\"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 DestroyRef,\n inject,\n Injectable,\n linkedSignal,\n ResourceRef,\n signal,\n Signal,\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}\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 readonly _requestOptionsParams =\n signal<AutocompleteDataOptionsFnParams>({\n filter: null,\n autofill: null,\n });\n\n private readonly _selectedOption = linkedSignal(() => {\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 = linkedSignal(() => {\n const currentValue = this._currentValue();\n\n if (Array.isArray(currentValue)) {\n return currentValue;\n }\n\n return [];\n });\n\n private readonly _hasValue = linkedSignal(() => {\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.asReadonly();\n }\n\n get currentValue() {\n return this._currentValue.asReadonly();\n }\n\n get selectedOption() {\n return this._selectedOption.asReadonly();\n }\n\n get selectedOptions() {\n return this._selectedOptions.asReadonly();\n }\n\n get autofill() {\n return this._autofill.asReadonly();\n }\n\n get requestOptionsParams() {\n return this._requestOptionsParams.asReadonly();\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 (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 autofill: this._autofill(),\n }));\n }\n }\n }\n\n init(\n control: FormControl<any>,\n options: Signal<AutocompleteList>,\n isLoading: Signal<boolean>,\n multiple = false\n ) {\n this._control = control;\n this._options = options;\n this._multiple = multiple;\n this._isLoading = isLoading;\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 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 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 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 options = input.required<AutocompleteDataOptions>();\n multiple = input(false, { transform: booleanAttribute });\n placeholderSearchField = input<string>();\n disableAutoTypeConversion = input(false, { transform: booleanAttribute });\n\n isLoading = signal<boolean>(false);\n optionList = signal<AutocompleteList>([]);\n\n optionsResource = signal<OptionsResource | null>(null);\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.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 (this.autocompleteValue().filterControl.value) {\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=\"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} 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?: Signal<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 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 return this.makeAutofill();\n }\n\n if (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: Signal<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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koalarx/ui",
|
|
3
|
-
"version": "20.2.
|
|
3
|
+
"version": "20.2.2",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=20.0.0",
|
|
6
6
|
"@angular/core": ">=20.0.0"
|
|
@@ -202,14 +202,14 @@
|
|
|
202
202
|
"types": "./shared/components/input-field/input-checkbox/index.d.ts",
|
|
203
203
|
"default": "./fesm2022/koalarx-ui-shared-components-input-field-input-checkbox.mjs"
|
|
204
204
|
},
|
|
205
|
-
"./shared/components/input-field/input-cpf": {
|
|
206
|
-
"types": "./shared/components/input-field/input-cpf/index.d.ts",
|
|
207
|
-
"default": "./fesm2022/koalarx-ui-shared-components-input-field-input-cpf.mjs"
|
|
208
|
-
},
|
|
209
205
|
"./shared/components/input-field/input-cnpj": {
|
|
210
206
|
"types": "./shared/components/input-field/input-cnpj/index.d.ts",
|
|
211
207
|
"default": "./fesm2022/koalarx-ui-shared-components-input-field-input-cnpj.mjs"
|
|
212
208
|
},
|
|
209
|
+
"./shared/components/input-field/input-cpf": {
|
|
210
|
+
"types": "./shared/components/input-field/input-cpf/index.d.ts",
|
|
211
|
+
"default": "./fesm2022/koalarx-ui-shared-components-input-field-input-cpf.mjs"
|
|
212
|
+
},
|
|
213
213
|
"./shared/components/input-field/input-currency": {
|
|
214
214
|
"types": "./shared/components/input-field/input-currency/index.d.ts",
|
|
215
215
|
"default": "./fesm2022/koalarx-ui-shared-components-input-field-input-currency.mjs"
|
|
@@ -15,6 +15,7 @@ type AutocompleteList = AutocompleteOption[];
|
|
|
15
15
|
interface AutocompleteDataOptionsFnParams {
|
|
16
16
|
filter?: string | null;
|
|
17
17
|
autofill?: any | null;
|
|
18
|
+
internalFilter?: string | null;
|
|
18
19
|
}
|
|
19
20
|
type AutocompleteDataOptionsFn = (data: Signal<AutocompleteDataOptionsFnParams>) => ResourceRef<AutocompleteList>;
|
|
20
21
|
type AutocompleteDataOptions = AutocompleteDataOptionsFn | ResourceRef<AutocompleteList> | Signal<AutocompleteList> | AutocompleteList;
|
|
@@ -27,6 +28,8 @@ declare class AutocompleteValue {
|
|
|
27
28
|
private _options?;
|
|
28
29
|
private _autofill;
|
|
29
30
|
private _isLoading?;
|
|
31
|
+
private _internalFilter;
|
|
32
|
+
private _isOnDemand?;
|
|
30
33
|
private readonly _requestOptionsParams;
|
|
31
34
|
private readonly _selectedOption;
|
|
32
35
|
private readonly _selectedOptions;
|
|
@@ -39,9 +42,10 @@ declare class AutocompleteValue {
|
|
|
39
42
|
get selectedOptions(): Signal<AutocompleteOption<any>[]>;
|
|
40
43
|
get autofill(): Signal<any>;
|
|
41
44
|
get requestOptionsParams(): Signal<AutocompleteDataOptionsFnParams>;
|
|
45
|
+
set internalFilter(value: string | null);
|
|
42
46
|
private selectOption;
|
|
43
47
|
makeAutofill(): Promise<void>;
|
|
44
|
-
init(control: FormControl<any>, options: Signal<AutocompleteList>, isLoading: Signal<boolean>, multiple?: boolean): void;
|
|
48
|
+
init(control: FormControl<any>, options: Signal<AutocompleteList>, isLoading: Signal<boolean>, isOnDemand: Signal<boolean>, multiple?: boolean): void;
|
|
45
49
|
clear(event: MouseEvent): void;
|
|
46
50
|
remove(event: MouseEvent, value: AutocompleteOptionValue): void;
|
|
47
51
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutocompleteValue, never>;
|
|
@@ -90,13 +94,14 @@ declare class AutocompleteField extends InputFieldBase implements OnInit {
|
|
|
90
94
|
private readonly injector;
|
|
91
95
|
readonly autocompleteValue: AutocompleteValue;
|
|
92
96
|
readonly autocomplete: Autocomplete;
|
|
93
|
-
options: _angular_core.InputSignal<AutocompleteDataOptions>;
|
|
94
|
-
multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
95
|
-
placeholderSearchField: _angular_core.InputSignal<string | undefined>;
|
|
96
|
-
disableAutoTypeConversion: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
97
|
-
isLoading: _angular_core.WritableSignal<boolean>;
|
|
98
|
-
optionList: _angular_core.WritableSignal<AutocompleteList>;
|
|
99
|
-
optionsResource: _angular_core.WritableSignal<OptionsResource | null>;
|
|
97
|
+
readonly options: _angular_core.InputSignal<AutocompleteDataOptions>;
|
|
98
|
+
readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
99
|
+
readonly placeholderSearchField: _angular_core.InputSignal<string | undefined>;
|
|
100
|
+
readonly disableAutoTypeConversion: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
101
|
+
readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
102
|
+
readonly optionList: _angular_core.WritableSignal<AutocompleteList>;
|
|
103
|
+
readonly optionsResource: _angular_core.WritableSignal<OptionsResource | null>;
|
|
104
|
+
readonly isOnDemand: _angular_core.WritableSignal<boolean>;
|
|
100
105
|
constructor();
|
|
101
106
|
private applyFilter;
|
|
102
107
|
private generateOptionsResource;
|