@libs-ui/components-inputs-search 0.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.
- package/README.md +3 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/interfaces/config.interface.mjs +2 -0
- package/esm2022/libs-ui-components-inputs-search.mjs +5 -0
- package/esm2022/search.component.mjs +95 -0
- package/fesm2022/libs-ui-components-inputs-search.mjs +102 -0
- package/fesm2022/libs-ui-components-inputs-search.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/interfaces/config.interface.d.ts +14 -0
- package/package.json +25 -0
- package/search.component.d.ts +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './search.component';
|
|
2
|
+
export * from './interfaces/config.interface';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3NlYXJjaC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zZWFyY2guY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJzsiXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvc2VhcmNoL3NyYy9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSUlucHV0U2VhcmNoQ29uZmlnIHtcbiAgY2xhc3NJbmNsdWRlPzogc3RyaW5nO1xuICBjbGFzc0NvbnRhaW5lcklucHV0Pzogc3RyaW5nO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdmFsdWU/OiBzdHJpbmc7XG4gIG5vQm9yZGVyPzogYm9vbGVhbjtcbiAgYmFja2dyb3VuZE5vbmU/OiBib29sZWFuO1xuICBpY29uTGVmdENsYXNzPzogc3RyaW5nO1xuICBpY29uUmlnaHRDbGFzcz86IHN0cmluZztcbiAgZGVmYXVsdEhlaWdodD86IG51bWJlcjtcbiAgY2xhc3NDb3ZlcklucHV0U2VhcmNoPzogc3RyaW5nO1xuICBoYXNDbGVhclNlYXJjaD86IGJvb2xlYW47XG4gIHBvcG92ZXJDb250ZW50SWNvblJpZ2h0Pzogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy11aS1jb21wb25lbnRzLWlucHV0cy1zZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3NlYXJjaC9zcmMvbGlicy11aS1jb21wb25lbnRzLWlucHV0cy1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';
|
|
2
|
+
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
3
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { debounceTime, filter, takeUntil, throttleTime } from 'rxjs/operators';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ngx-translate/core";
|
|
8
|
+
export class MoLibsSharedComponentsInputSearchComponent {
|
|
9
|
+
/* PROPERTY */
|
|
10
|
+
valueSearch = signal('');
|
|
11
|
+
onDestroy = new Subject();
|
|
12
|
+
onSearch = new Subject();
|
|
13
|
+
onEnter = new Subject();
|
|
14
|
+
timeout = signal(0);
|
|
15
|
+
searchingWhileEntering = signal(false);
|
|
16
|
+
/* INPUT */
|
|
17
|
+
disable = input(false);
|
|
18
|
+
readonly = input(false);
|
|
19
|
+
searchConfig = input({}, { transform: (value) => value || {} });
|
|
20
|
+
ignoreAutoComplete = input(); // không emit sự kiện sau 1 khoảng thời gian người dùng ngừng nhập
|
|
21
|
+
debounceTime = input(1000, { transform: (value) => value ?? 1000 });
|
|
22
|
+
ignoreStopPropagationEvent = input(false);
|
|
23
|
+
focusTimeOut = input(600, { transform: (value) => value ?? 600 });
|
|
24
|
+
blurTimeOut = input(600, { transform: (value) => value ?? 600 });
|
|
25
|
+
;
|
|
26
|
+
/* OUTPUT */
|
|
27
|
+
outSearch = output(); // sau 1 khoảng thời gian người dùng ngừng nhập sẽ emit sự kiện
|
|
28
|
+
outValueChange = output(); // sử dụng khi muốn lắng nghe mỗi lần gõ text
|
|
29
|
+
outIconLeft = output();
|
|
30
|
+
outIconRight = output();
|
|
31
|
+
outFocusAndBlur = output();
|
|
32
|
+
outFunctionsControl = output();
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
this.valueSearch.set(this.searchConfig()?.value || '');
|
|
35
|
+
this.onSearch.pipe(debounceTime(this.debounceTime()), filter((keySearch) => !!keySearch), takeUntil(this.onDestroy)).subscribe(keySearch => {
|
|
36
|
+
if (this.searchingWhileEntering() || this.ignoreAutoComplete() || !this.valueSearch()) {
|
|
37
|
+
this.searchingWhileEntering.set(false);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.outSearch.emit(`${keySearch}`.trim());
|
|
41
|
+
});
|
|
42
|
+
this.onEnter.pipe(throttleTime(this.debounceTime()), takeUntil(this.onDestroy)).subscribe(keySearch => {
|
|
43
|
+
this.outSearch.emit(`${keySearch}`.trim());
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/* FUNCTIONS*/
|
|
47
|
+
handlerValueChange(keySearch) {
|
|
48
|
+
this.outValueChange.emit(keySearch.toString());
|
|
49
|
+
this.valueSearch.set(keySearch);
|
|
50
|
+
this.searchingWhileEntering.set(false);
|
|
51
|
+
if (this.valueSearch()) {
|
|
52
|
+
this.onSearch.next(this.valueSearch());
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
clearTimeout(this.timeout());
|
|
56
|
+
this.timeout.set(setTimeout(() => {
|
|
57
|
+
if (!this.valueSearch() && !this.ignoreAutoComplete()) {
|
|
58
|
+
this.outSearch.emit(this.valueSearch());
|
|
59
|
+
}
|
|
60
|
+
}, 500));
|
|
61
|
+
}
|
|
62
|
+
handlerEnterInput(e) {
|
|
63
|
+
this.valueSearch.set(e.target.value);
|
|
64
|
+
this.searchingWhileEntering.set(true);
|
|
65
|
+
this.onEnter.next(this.valueSearch());
|
|
66
|
+
}
|
|
67
|
+
handlerEventIconLeft(eventName) {
|
|
68
|
+
this.outIconLeft.emit(eventName);
|
|
69
|
+
}
|
|
70
|
+
handlerEventIconRight(eventName) {
|
|
71
|
+
if (this.searchConfig()?.hasClearSearch) {
|
|
72
|
+
this.valueSearch.set('');
|
|
73
|
+
this.outSearch.emit(this.valueSearch());
|
|
74
|
+
}
|
|
75
|
+
this.outIconRight.emit(eventName);
|
|
76
|
+
}
|
|
77
|
+
handlerFunctionControl(event) {
|
|
78
|
+
this.outFunctionsControl.emit(event);
|
|
79
|
+
}
|
|
80
|
+
handlerFocusAndBlur(event) {
|
|
81
|
+
this.outFocusAndBlur.emit(event);
|
|
82
|
+
}
|
|
83
|
+
ngOnDestroy() {
|
|
84
|
+
clearTimeout(this.timeout());
|
|
85
|
+
this.onDestroy.next();
|
|
86
|
+
this.onDestroy.complete();
|
|
87
|
+
}
|
|
88
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedComponentsInputSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
89
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MoLibsSharedComponentsInputSearchComponent, isStandalone: true, selector: "libs_ui-components-inputs-search", inputs: { disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, searchConfig: { classPropertyName: "searchConfig", publicName: "searchConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreAutoComplete: { classPropertyName: "ignoreAutoComplete", publicName: "ignoreAutoComplete", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, focusTimeOut: { classPropertyName: "focusTimeOut", publicName: "focusTimeOut", isSignal: true, isRequired: false, transformFunction: null }, blurTimeOut: { classPropertyName: "blurTimeOut", publicName: "blurTimeOut", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSearch: "outSearch", outValueChange: "outValueChange", outIconLeft: "outIconLeft", outIconRight: "outIconRight", outFocusAndBlur: "outFocusAndBlur", outFunctionsControl: "outFunctionsControl" }, ngImport: i0, template: "@if (searchConfig(); as searchConfig) {\n <libs_ui-components-inputs-input [disable]=\"disable()\"\n [readonly]=\"readonly()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [defaultHeight]=\"searchConfig.defaultHeight || 32\"\n [classInclude]=\"'w-full '+(searchConfig.classInclude ? searchConfig.classInclude : '')\"\n [iconLeftClass]=\"searchConfig.iconLeftClass ?? 'libs-ui-icon-search'\"\n [iconRightClass]=\"((searchConfig.hasClearSearch && valueSearch()) ? 'libs-ui-icon-close-circle-solid cursor-pointer ' : '') + (searchConfig.iconRightClass ? ' '+searchConfig.iconRightClass:'')\"\n [setIconRightColorSameColorDisableReadOnly]=\"(searchConfig.hasClearSearch && valueSearch()) ? true: false\"\n [value]=\"searchConfig.value || this.valueSearch()\"\n [placeholder]=\"(searchConfig.placeholder || 'i18n_search') | translate\"\n [noBorder]=\"searchConfig.noBorder || false\"\n [backgroundNone]=\"searchConfig.backgroundNone || false\"\n [classContainerInput]=\"searchConfig.classContainerInput || ''\"\n [popoverContentIconRight]=\"searchConfig.popoverContentIconRight || ''\"\n [focusTimeOut]=\"focusTimeOut()\"\n [blurTimeOut]=\"blurTimeOut()\"\n (outChange)=\"handlerValueChange($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\" />\n}\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "hiddenContent", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
90
|
+
}
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedComponentsInputSearchComponent, decorators: [{
|
|
92
|
+
type: Component,
|
|
93
|
+
args: [{ selector: 'libs_ui-components-inputs-search', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsInputComponent], template: "@if (searchConfig(); as searchConfig) {\n <libs_ui-components-inputs-input [disable]=\"disable()\"\n [readonly]=\"readonly()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [defaultHeight]=\"searchConfig.defaultHeight || 32\"\n [classInclude]=\"'w-full '+(searchConfig.classInclude ? searchConfig.classInclude : '')\"\n [iconLeftClass]=\"searchConfig.iconLeftClass ?? 'libs-ui-icon-search'\"\n [iconRightClass]=\"((searchConfig.hasClearSearch && valueSearch()) ? 'libs-ui-icon-close-circle-solid cursor-pointer ' : '') + (searchConfig.iconRightClass ? ' '+searchConfig.iconRightClass:'')\"\n [setIconRightColorSameColorDisableReadOnly]=\"(searchConfig.hasClearSearch && valueSearch()) ? true: false\"\n [value]=\"searchConfig.value || this.valueSearch()\"\n [placeholder]=\"(searchConfig.placeholder || 'i18n_search') | translate\"\n [noBorder]=\"searchConfig.noBorder || false\"\n [backgroundNone]=\"searchConfig.backgroundNone || false\"\n [classContainerInput]=\"searchConfig.classContainerInput || ''\"\n [popoverContentIconRight]=\"searchConfig.popoverContentIconRight || ''\"\n [focusTimeOut]=\"focusTimeOut()\"\n [blurTimeOut]=\"blurTimeOut()\"\n (outChange)=\"handlerValueChange($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\" />\n}\n" }]
|
|
94
|
+
}] });
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvc2VhcmNoL3NyYy9zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9zZWFyY2gvc3JjL3NlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQWtELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFeEksT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFXL0UsTUFBTSxPQUFPLDBDQUEwQztJQUNyRCxjQUFjO0lBQ0osV0FBVyxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUVuQyxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUNoQyxRQUFRLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUMsT0FBTyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3pDLE9BQU8sR0FBRyxNQUFNLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsc0JBQXNCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXhELFdBQVc7SUFDRixPQUFPLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLFFBQVEsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFD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UUFDMUMsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxLQUFpQztRQUNoRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxLQUF5QjtRQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsV0FBVztRQUNULFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0FoR1UsMENBQTBDOzRGQUExQywwQ0FBMEMsKzdDQ2hCdkQsa2hEQXdCQSwyQ0RWWSxlQUFlLDRGQUFFLG9DQUFvQzs7NEZBRXBELDBDQUEwQztrQkFSdEQsU0FBUzsrQkFFRSxrQ0FBa0MsY0FFaEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUZvY3VzQW5kQmx1ckV2ZW50LCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXQnO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCB0YWtlVW50aWwsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElJbnB1dFNlYXJjaENvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTW9MaWJzU2hhcmVkQ29tcG9uZW50c0lucHV0U2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgdmFsdWVTZWFyY2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIG9uU2VhcmNoOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIG9uRW50ZXI6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgdGltZW91dCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIHNlYXJjaGluZ1doaWxlRW50ZXJpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qIElOUFVUICovXG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzZWFyY2hDb25maWcgPSBpbnB1dDxJSW5wdXRTZWFyY2hDb25maWcsIElJbnB1dFNlYXJjaENvbmZpZz4oe30sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IHt9IH0pO1xuICByZWFkb25seSBpZ25vcmVBdXRvQ29tcGxldGUgPSBpbnB1dDxib29sZWFuPigpOyAvLyBraMO0bmcgZW1pdCBz4buxIGtp4buHbiBzYXUgMSBraG/huqNuZyB0aOG7nWkgZ2lhbiBuZ8aw4budaSBkw7luZyBuZ+G7q25nIG5o4bqtcFxuICByZWFkb25seSBkZWJvdW5jZVRpbWUgPSBpbnB1dDxudW1iZXIsIG51bWJlcj4oMTAwMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGZvY3VzVGltZU91dCA9IGlucHV0PG51bWJlciwgbnVtYmVyPig2MDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDYwMCB9KTtcbiAgcmVhZG9ubHkgYmx1clRpbWVPdXQgPSBpbnB1dDxudW1iZXIsIG51bWJlcj4oNjAwLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyA2MDAgfSk7O1xuXG4gIC8qIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRTZWFyY2ggPSBvdXRwdXQ8c3RyaW5nPigpOyAvLyBzYXUgMSBraG/huqNuZyB0aOG7nWkgZ2lhbiBuZ8aw4budaSBkw7luZyBuZ+G7q25nIG5o4bqtcCBz4bq9IGVtaXQgc+G7sSBraeG7h25cbiAgcmVhZG9ubHkgb3V0VmFsdWVDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpOyAvLyBz4butIGThu6VuZyBraGkgbXXhu5FuIGzhuq9uZyBuZ2hlIG3hu5dpIGzhuqduIGfDtSB0ZXh0XG4gIHJlYWRvbmx5IG91dEljb25MZWZ0ID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0SWNvblJpZ2h0ID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0Rm9jdXNBbmRCbHVyID0gb3V0cHV0PElGb2N1c0FuZEJsdXJFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlU2VhcmNoLnNldCh0aGlzLnNlYXJjaENvbmZpZygpPy52YWx1ZSB8fCAnJylcbiAgICB0aGlzLm9uU2VhcmNoLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUoKSksXG4gICAgICBmaWx0ZXIoKGtleVNlYXJjaCkgPT4gISFrZXlTZWFyY2gpLFxuICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KVxuICAgICkuc3Vic2NyaWJlKGtleVNlYXJjaCA9PiB7XG4gICAgICBpZiAodGhpcy5zZWFyY2hpbmdXaGlsZUVudGVyaW5nKCkgfHwgdGhpcy5pZ25vcmVBdXRvQ29tcGxldGUoKSB8fCAhdGhpcy52YWx1ZVNlYXJjaCgpKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoaW5nV2hpbGVFbnRlcmluZy5zZXQoZmFsc2UpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0U2VhcmNoLmVtaXQoYCR7a2V5U2VhcmNofWAudHJpbSgpKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uRW50ZXIucGlwZSh0aHJvdHRsZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUoKSksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZShrZXlTZWFyY2ggPT4ge1xuICAgICAgdGhpcy5vdXRTZWFyY2guZW1pdChgJHtrZXlTZWFyY2h9YC50cmltKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TKi9cbiAgcHJvdGVjdGVkIGhhbmRsZXJWYWx1ZUNoYW5nZShrZXlTZWFyY2g6IHN0cmluZykge1xuICAgIHRoaXMub3V0VmFsdWVDaGFuZ2UuZW1pdChrZXlTZWFyY2gudG9TdHJpbmcoKSk7XG4gICAgdGhpcy52YWx1ZVNlYXJjaC5zZXQoa2V5U2VhcmNoIGFzIHN0cmluZyk7XG4gICAgdGhpcy5zZWFyY2hpbmdXaGlsZUVudGVyaW5nLnNldChmYWxzZSk7XG4gICAgaWYgKHRoaXMudmFsdWVTZWFyY2goKSkge1xuICAgICAgdGhpcy5vblNlYXJjaC5uZXh0KHRoaXMudmFsdWVTZWFyY2goKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCgpKTtcbiAgICB0aGlzLnRpbWVvdXQuc2V0KHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlU2VhcmNoKCkgJiYgIXRoaXMuaWdub3JlQXV0b0NvbXBsZXRlKCkpIHtcbiAgICAgICAgdGhpcy5vdXRTZWFyY2guZW1pdCh0aGlzLnZhbHVlU2VhcmNoKCkpO1xuICAgICAgfVxuICAgIH0sIDUwMCkpO1xuXG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVudGVySW5wdXQoZTogSUV2ZW50KSB7XG4gICAgdGhpcy52YWx1ZVNlYXJjaC5zZXQoZS50YXJnZXQudmFsdWUpO1xuICAgIHRoaXMuc2VhcmNoaW5nV2hpbGVFbnRlcmluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vbkVudGVyLm5leHQodGhpcy52YWx1ZVNlYXJjaCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRXZlbnRJY29uTGVmdChldmVudE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMub3V0SWNvbkxlZnQuZW1pdChldmVudE5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFdmVudEljb25SaWdodChldmVudE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZygpPy5oYXNDbGVhclNlYXJjaCkge1xuICAgICAgdGhpcy52YWx1ZVNlYXJjaC5zZXQoJycpO1xuICAgICAgdGhpcy5vdXRTZWFyY2guZW1pdCh0aGlzLnZhbHVlU2VhcmNoKCkpO1xuICAgIH1cbiAgICB0aGlzLm91dEljb25SaWdodC5lbWl0KGV2ZW50TmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZ1bmN0aW9uQ29udHJvbChldmVudDogSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1cihldmVudDogSUZvY3VzQW5kQmx1ckV2ZW50KSB7XG4gICAgdGhpcy5vdXRGb2N1c0FuZEJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KCkpO1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCJAaWYgKHNlYXJjaENvbmZpZygpOyBhcyBzZWFyY2hDb25maWcpIHtcbiAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXQgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cImlnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50KClcIlxuICAgIFtkZWZhdWx0SGVpZ2h0XT1cInNlYXJjaENvbmZpZy5kZWZhdWx0SGVpZ2h0IHx8IDMyXCJcbiAgICBbY2xhc3NJbmNsdWRlXT1cIid3LWZ1bGwgJysoc2VhcmNoQ29uZmlnLmNsYXNzSW5jbHVkZSA/IHNlYXJjaENvbmZpZy5jbGFzc0luY2x1ZGUgOiAnJylcIlxuICAgIFtpY29uTGVmdENsYXNzXT1cInNlYXJjaENvbmZpZy5pY29uTGVmdENsYXNzID8/ICdsaWJzLXVpLWljb24tc2VhcmNoJ1wiXG4gICAgW2ljb25SaWdodENsYXNzXT1cIigoc2VhcmNoQ29uZmlnLmhhc0NsZWFyU2VhcmNoICYmIHZhbHVlU2VhcmNoKCkpID8gJ2xpYnMtdWktaWNvbi1jbG9zZS1jaXJjbGUtc29saWQgY3Vyc29yLXBvaW50ZXIgJyA6ICcnKSArIChzZWFyY2hDb25maWcuaWNvblJpZ2h0Q2xhc3MgPyAnICcrc2VhcmNoQ29uZmlnLmljb25SaWdodENsYXNzOicnKVwiXG4gICAgW3NldEljb25SaWdodENvbG9yU2FtZUNvbG9yRGlzYWJsZVJlYWRPbmx5XT1cIihzZWFyY2hDb25maWcuaGFzQ2xlYXJTZWFyY2ggJiYgdmFsdWVTZWFyY2goKSkgPyB0cnVlOiBmYWxzZVwiXG4gICAgW3ZhbHVlXT1cInNlYXJjaENvbmZpZy52YWx1ZSB8fCB0aGlzLnZhbHVlU2VhcmNoKClcIlxuICAgIFtwbGFjZWhvbGRlcl09XCIoc2VhcmNoQ29uZmlnLnBsYWNlaG9sZGVyIHx8ICdpMThuX3NlYXJjaCcpIHwgdHJhbnNsYXRlXCJcbiAgICBbbm9Cb3JkZXJdPVwic2VhcmNoQ29uZmlnLm5vQm9yZGVyIHx8IGZhbHNlXCJcbiAgICBbYmFja2dyb3VuZE5vbmVdPVwic2VhcmNoQ29uZmlnLmJhY2tncm91bmROb25lIHx8IGZhbHNlXCJcbiAgICBbY2xhc3NDb250YWluZXJJbnB1dF09XCJzZWFyY2hDb25maWcuY2xhc3NDb250YWluZXJJbnB1dCB8fCAnJ1wiXG4gICAgW3BvcG92ZXJDb250ZW50SWNvblJpZ2h0XT1cInNlYXJjaENvbmZpZy5wb3BvdmVyQ29udGVudEljb25SaWdodCB8fCAnJ1wiXG4gICAgW2ZvY3VzVGltZU91dF09XCJmb2N1c1RpbWVPdXQoKVwiXG4gICAgW2JsdXJUaW1lT3V0XT1cImJsdXJUaW1lT3V0KClcIlxuICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlclZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgIChvdXRJY29uTGVmdCk9XCJoYW5kbGVyRXZlbnRJY29uTGVmdCgkZXZlbnQpXCJcbiAgICAob3V0SWNvblJpZ2h0KT1cImhhbmRsZXJFdmVudEljb25SaWdodCgkZXZlbnQpXCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudClcIlxuICAgIChvdXRFbnRlckV2ZW50KT1cImhhbmRsZXJFbnRlcklucHV0KCRldmVudClcIlxuICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyKCRldmVudClcIiAvPlxufVxuIl19
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, input, output, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
3
|
+
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
4
|
+
import * as i1 from '@ngx-translate/core';
|
|
5
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
6
|
+
import { Subject } from 'rxjs';
|
|
7
|
+
import { debounceTime, filter, takeUntil, throttleTime } from 'rxjs/operators';
|
|
8
|
+
|
|
9
|
+
class MoLibsSharedComponentsInputSearchComponent {
|
|
10
|
+
/* PROPERTY */
|
|
11
|
+
valueSearch = signal('');
|
|
12
|
+
onDestroy = new Subject();
|
|
13
|
+
onSearch = new Subject();
|
|
14
|
+
onEnter = new Subject();
|
|
15
|
+
timeout = signal(0);
|
|
16
|
+
searchingWhileEntering = signal(false);
|
|
17
|
+
/* INPUT */
|
|
18
|
+
disable = input(false);
|
|
19
|
+
readonly = input(false);
|
|
20
|
+
searchConfig = input({}, { transform: (value) => value || {} });
|
|
21
|
+
ignoreAutoComplete = input(); // không emit sự kiện sau 1 khoảng thời gian người dùng ngừng nhập
|
|
22
|
+
debounceTime = input(1000, { transform: (value) => value ?? 1000 });
|
|
23
|
+
ignoreStopPropagationEvent = input(false);
|
|
24
|
+
focusTimeOut = input(600, { transform: (value) => value ?? 600 });
|
|
25
|
+
blurTimeOut = input(600, { transform: (value) => value ?? 600 });
|
|
26
|
+
;
|
|
27
|
+
/* OUTPUT */
|
|
28
|
+
outSearch = output(); // sau 1 khoảng thời gian người dùng ngừng nhập sẽ emit sự kiện
|
|
29
|
+
outValueChange = output(); // sử dụng khi muốn lắng nghe mỗi lần gõ text
|
|
30
|
+
outIconLeft = output();
|
|
31
|
+
outIconRight = output();
|
|
32
|
+
outFocusAndBlur = output();
|
|
33
|
+
outFunctionsControl = output();
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
this.valueSearch.set(this.searchConfig()?.value || '');
|
|
36
|
+
this.onSearch.pipe(debounceTime(this.debounceTime()), filter((keySearch) => !!keySearch), takeUntil(this.onDestroy)).subscribe(keySearch => {
|
|
37
|
+
if (this.searchingWhileEntering() || this.ignoreAutoComplete() || !this.valueSearch()) {
|
|
38
|
+
this.searchingWhileEntering.set(false);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.outSearch.emit(`${keySearch}`.trim());
|
|
42
|
+
});
|
|
43
|
+
this.onEnter.pipe(throttleTime(this.debounceTime()), takeUntil(this.onDestroy)).subscribe(keySearch => {
|
|
44
|
+
this.outSearch.emit(`${keySearch}`.trim());
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/* FUNCTIONS*/
|
|
48
|
+
handlerValueChange(keySearch) {
|
|
49
|
+
this.outValueChange.emit(keySearch.toString());
|
|
50
|
+
this.valueSearch.set(keySearch);
|
|
51
|
+
this.searchingWhileEntering.set(false);
|
|
52
|
+
if (this.valueSearch()) {
|
|
53
|
+
this.onSearch.next(this.valueSearch());
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
clearTimeout(this.timeout());
|
|
57
|
+
this.timeout.set(setTimeout(() => {
|
|
58
|
+
if (!this.valueSearch() && !this.ignoreAutoComplete()) {
|
|
59
|
+
this.outSearch.emit(this.valueSearch());
|
|
60
|
+
}
|
|
61
|
+
}, 500));
|
|
62
|
+
}
|
|
63
|
+
handlerEnterInput(e) {
|
|
64
|
+
this.valueSearch.set(e.target.value);
|
|
65
|
+
this.searchingWhileEntering.set(true);
|
|
66
|
+
this.onEnter.next(this.valueSearch());
|
|
67
|
+
}
|
|
68
|
+
handlerEventIconLeft(eventName) {
|
|
69
|
+
this.outIconLeft.emit(eventName);
|
|
70
|
+
}
|
|
71
|
+
handlerEventIconRight(eventName) {
|
|
72
|
+
if (this.searchConfig()?.hasClearSearch) {
|
|
73
|
+
this.valueSearch.set('');
|
|
74
|
+
this.outSearch.emit(this.valueSearch());
|
|
75
|
+
}
|
|
76
|
+
this.outIconRight.emit(eventName);
|
|
77
|
+
}
|
|
78
|
+
handlerFunctionControl(event) {
|
|
79
|
+
this.outFunctionsControl.emit(event);
|
|
80
|
+
}
|
|
81
|
+
handlerFocusAndBlur(event) {
|
|
82
|
+
this.outFocusAndBlur.emit(event);
|
|
83
|
+
}
|
|
84
|
+
ngOnDestroy() {
|
|
85
|
+
clearTimeout(this.timeout());
|
|
86
|
+
this.onDestroy.next();
|
|
87
|
+
this.onDestroy.complete();
|
|
88
|
+
}
|
|
89
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedComponentsInputSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
90
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MoLibsSharedComponentsInputSearchComponent, isStandalone: true, selector: "libs_ui-components-inputs-search", inputs: { disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, searchConfig: { classPropertyName: "searchConfig", publicName: "searchConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreAutoComplete: { classPropertyName: "ignoreAutoComplete", publicName: "ignoreAutoComplete", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, focusTimeOut: { classPropertyName: "focusTimeOut", publicName: "focusTimeOut", isSignal: true, isRequired: false, transformFunction: null }, blurTimeOut: { classPropertyName: "blurTimeOut", publicName: "blurTimeOut", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outSearch: "outSearch", outValueChange: "outValueChange", outIconLeft: "outIconLeft", outIconRight: "outIconRight", outFocusAndBlur: "outFocusAndBlur", outFunctionsControl: "outFunctionsControl" }, ngImport: i0, template: "@if (searchConfig(); as searchConfig) {\n <libs_ui-components-inputs-input [disable]=\"disable()\"\n [readonly]=\"readonly()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [defaultHeight]=\"searchConfig.defaultHeight || 32\"\n [classInclude]=\"'w-full '+(searchConfig.classInclude ? searchConfig.classInclude : '')\"\n [iconLeftClass]=\"searchConfig.iconLeftClass ?? 'libs-ui-icon-search'\"\n [iconRightClass]=\"((searchConfig.hasClearSearch && valueSearch()) ? 'libs-ui-icon-close-circle-solid cursor-pointer ' : '') + (searchConfig.iconRightClass ? ' '+searchConfig.iconRightClass:'')\"\n [setIconRightColorSameColorDisableReadOnly]=\"(searchConfig.hasClearSearch && valueSearch()) ? true: false\"\n [value]=\"searchConfig.value || this.valueSearch()\"\n [placeholder]=\"(searchConfig.placeholder || 'i18n_search') | translate\"\n [noBorder]=\"searchConfig.noBorder || false\"\n [backgroundNone]=\"searchConfig.backgroundNone || false\"\n [classContainerInput]=\"searchConfig.classContainerInput || ''\"\n [popoverContentIconRight]=\"searchConfig.popoverContentIconRight || ''\"\n [focusTimeOut]=\"focusTimeOut()\"\n [blurTimeOut]=\"blurTimeOut()\"\n (outChange)=\"handlerValueChange($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\" />\n}\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "hiddenContent", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
91
|
+
}
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MoLibsSharedComponentsInputSearchComponent, decorators: [{
|
|
93
|
+
type: Component,
|
|
94
|
+
args: [{ selector: 'libs_ui-components-inputs-search', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsInputComponent], template: "@if (searchConfig(); as searchConfig) {\n <libs_ui-components-inputs-input [disable]=\"disable()\"\n [readonly]=\"readonly()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [defaultHeight]=\"searchConfig.defaultHeight || 32\"\n [classInclude]=\"'w-full '+(searchConfig.classInclude ? searchConfig.classInclude : '')\"\n [iconLeftClass]=\"searchConfig.iconLeftClass ?? 'libs-ui-icon-search'\"\n [iconRightClass]=\"((searchConfig.hasClearSearch && valueSearch()) ? 'libs-ui-icon-close-circle-solid cursor-pointer ' : '') + (searchConfig.iconRightClass ? ' '+searchConfig.iconRightClass:'')\"\n [setIconRightColorSameColorDisableReadOnly]=\"(searchConfig.hasClearSearch && valueSearch()) ? true: false\"\n [value]=\"searchConfig.value || this.valueSearch()\"\n [placeholder]=\"(searchConfig.placeholder || 'i18n_search') | translate\"\n [noBorder]=\"searchConfig.noBorder || false\"\n [backgroundNone]=\"searchConfig.backgroundNone || false\"\n [classContainerInput]=\"searchConfig.classContainerInput || ''\"\n [popoverContentIconRight]=\"searchConfig.popoverContentIconRight || ''\"\n [focusTimeOut]=\"focusTimeOut()\"\n [blurTimeOut]=\"blurTimeOut()\"\n (outChange)=\"handlerValueChange($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\" />\n}\n" }]
|
|
95
|
+
}] });
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Generated bundle index. Do not edit.
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
export { MoLibsSharedComponentsInputSearchComponent };
|
|
102
|
+
//# sourceMappingURL=libs-ui-components-inputs-search.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libs-ui-components-inputs-search.mjs","sources":["../../../../../../libs-ui/components/inputs/search/src/search.component.ts","../../../../../../libs-ui/components/inputs/search/src/search.component.html","../../../../../../libs-ui/components/inputs/search/src/libs-ui-components-inputs-search.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnDestroy, OnInit, input, output, signal } from '@angular/core';\nimport { IFocusAndBlurEvent, IInputFunctionControlEvent, LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, filter, takeUntil, throttleTime } from 'rxjs/operators';\nimport { IInputSearchConfig } from './interfaces/config.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-search',\n templateUrl: './search.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsInputComponent]\n})\nexport class MoLibsSharedComponentsInputSearchComponent implements OnInit, OnDestroy {\n /* PROPERTY */\n protected valueSearch = signal<string>('');\n\n private onDestroy = new Subject<void>();\n private onSearch: Subject<string> = new Subject();\n private onEnter: Subject<string> = new Subject();\n private timeout = signal<number>(0);\n private searchingWhileEntering = signal<boolean>(false);\n\n /* INPUT */\n readonly disable = input<boolean>(false);\n readonly readonly = input<boolean>(false);\n readonly searchConfig = input<IInputSearchConfig, IInputSearchConfig>({}, { transform: (value) => value || {} });\n readonly ignoreAutoComplete = input<boolean>(); // không emit sự kiện sau 1 khoảng thời gian người dùng ngừng nhập\n readonly debounceTime = input<number, number>(1000, { transform: (value) => value ?? 1000 });\n readonly ignoreStopPropagationEvent = input<boolean>(false);\n readonly focusTimeOut = input<number, number>(600, { transform: (value) => value ?? 600 });\n readonly blurTimeOut = input<number, number>(600, { transform: (value) => value ?? 600 });;\n\n /* OUTPUT */\n readonly outSearch = output<string>(); // sau 1 khoảng thời gian người dùng ngừng nhập sẽ emit sự kiện\n readonly outValueChange = output<string>(); // sử dụng khi muốn lắng nghe mỗi lần gõ text\n readonly outIconLeft = output<string>();\n readonly outIconRight = output<string>();\n readonly outFocusAndBlur = output<IFocusAndBlurEvent>();\n readonly outFunctionsControl = output<IInputFunctionControlEvent>();\n\n ngOnInit(): void {\n this.valueSearch.set(this.searchConfig()?.value || '')\n this.onSearch.pipe(\n debounceTime(this.debounceTime()),\n filter((keySearch) => !!keySearch),\n takeUntil(this.onDestroy)\n ).subscribe(keySearch => {\n if (this.searchingWhileEntering() || this.ignoreAutoComplete() || !this.valueSearch()) {\n this.searchingWhileEntering.set(false);\n\n return;\n }\n this.outSearch.emit(`${keySearch}`.trim());\n });\n this.onEnter.pipe(throttleTime(this.debounceTime()), takeUntil(this.onDestroy)).subscribe(keySearch => {\n this.outSearch.emit(`${keySearch}`.trim());\n });\n }\n\n /* FUNCTIONS*/\n protected handlerValueChange(keySearch: string) {\n this.outValueChange.emit(keySearch.toString());\n this.valueSearch.set(keySearch as string);\n this.searchingWhileEntering.set(false);\n if (this.valueSearch()) {\n this.onSearch.next(this.valueSearch());\n return;\n }\n\n clearTimeout(this.timeout());\n this.timeout.set(setTimeout(() => {\n if (!this.valueSearch() && !this.ignoreAutoComplete()) {\n this.outSearch.emit(this.valueSearch());\n }\n }, 500));\n\n }\n\n protected handlerEnterInput(e: IEvent) {\n this.valueSearch.set(e.target.value);\n this.searchingWhileEntering.set(true);\n this.onEnter.next(this.valueSearch());\n }\n\n protected handlerEventIconLeft(eventName: string) {\n this.outIconLeft.emit(eventName);\n }\n\n protected handlerEventIconRight(eventName: string) {\n if (this.searchConfig()?.hasClearSearch) {\n this.valueSearch.set('');\n this.outSearch.emit(this.valueSearch());\n }\n this.outIconRight.emit(eventName);\n }\n\n protected handlerFunctionControl(event: IInputFunctionControlEvent) {\n this.outFunctionsControl.emit(event);\n }\n\n protected handlerFocusAndBlur(event: IFocusAndBlurEvent) {\n this.outFocusAndBlur.emit(event);\n }\n\n ngOnDestroy(): void {\n clearTimeout(this.timeout());\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","@if (searchConfig(); as searchConfig) {\n <libs_ui-components-inputs-input [disable]=\"disable()\"\n [readonly]=\"readonly()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [defaultHeight]=\"searchConfig.defaultHeight || 32\"\n [classInclude]=\"'w-full '+(searchConfig.classInclude ? searchConfig.classInclude : '')\"\n [iconLeftClass]=\"searchConfig.iconLeftClass ?? 'libs-ui-icon-search'\"\n [iconRightClass]=\"((searchConfig.hasClearSearch && valueSearch()) ? 'libs-ui-icon-close-circle-solid cursor-pointer ' : '') + (searchConfig.iconRightClass ? ' '+searchConfig.iconRightClass:'')\"\n [setIconRightColorSameColorDisableReadOnly]=\"(searchConfig.hasClearSearch && valueSearch()) ? true: false\"\n [value]=\"searchConfig.value || this.valueSearch()\"\n [placeholder]=\"(searchConfig.placeholder || 'i18n_search') | translate\"\n [noBorder]=\"searchConfig.noBorder || false\"\n [backgroundNone]=\"searchConfig.backgroundNone || false\"\n [classContainerInput]=\"searchConfig.classContainerInput || ''\"\n [popoverContentIconRight]=\"searchConfig.popoverContentIconRight || ''\"\n [focusTimeOut]=\"focusTimeOut()\"\n [blurTimeOut]=\"blurTimeOut()\"\n (outChange)=\"handlerValueChange($event)\"\n (outIconLeft)=\"handlerEventIconLeft($event)\"\n (outIconRight)=\"handlerEventIconRight($event)\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\"\n (outEnterEvent)=\"handlerEnterInput($event)\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlur($event)\" />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface IInputSearchConfig {
|
|
2
|
+
classInclude?: string;
|
|
3
|
+
classContainerInput?: string;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
value?: string;
|
|
6
|
+
noBorder?: boolean;
|
|
7
|
+
backgroundNone?: boolean;
|
|
8
|
+
iconLeftClass?: string;
|
|
9
|
+
iconRightClass?: string;
|
|
10
|
+
defaultHeight?: number;
|
|
11
|
+
classCoverInputSearch?: string;
|
|
12
|
+
hasClearSearch?: boolean;
|
|
13
|
+
popoverContentIconRight?: string;
|
|
14
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@libs-ui/components-inputs-search",
|
|
3
|
+
"version": "0.2.5",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^18.2.0",
|
|
6
|
+
"@angular/core": "^18.2.0"
|
|
7
|
+
},
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"module": "fesm2022/libs-ui-components-inputs-search.mjs",
|
|
10
|
+
"typings": "index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
"./package.json": {
|
|
13
|
+
"default": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./index.d.ts",
|
|
17
|
+
"esm2022": "./esm2022/libs-ui-components-inputs-search.mjs",
|
|
18
|
+
"esm": "./esm2022/libs-ui-components-inputs-search.mjs",
|
|
19
|
+
"default": "./fesm2022/libs-ui-components-inputs-search.mjs"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"tslib": "^2.3.0"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { IFocusAndBlurEvent, IInputFunctionControlEvent } from '@libs-ui/components-inputs-input';
|
|
3
|
+
import { IEvent } from '@libs-ui/interfaces-types';
|
|
4
|
+
import { IInputSearchConfig } from './interfaces/config.interface';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class MoLibsSharedComponentsInputSearchComponent implements OnInit, OnDestroy {
|
|
7
|
+
protected valueSearch: import("@angular/core").WritableSignal<string>;
|
|
8
|
+
private onDestroy;
|
|
9
|
+
private onSearch;
|
|
10
|
+
private onEnter;
|
|
11
|
+
private timeout;
|
|
12
|
+
private searchingWhileEntering;
|
|
13
|
+
readonly disable: import("@angular/core").InputSignal<boolean>;
|
|
14
|
+
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
15
|
+
readonly searchConfig: import("@angular/core").InputSignalWithTransform<IInputSearchConfig, IInputSearchConfig>;
|
|
16
|
+
readonly ignoreAutoComplete: import("@angular/core").InputSignal<boolean | undefined>;
|
|
17
|
+
readonly debounceTime: import("@angular/core").InputSignalWithTransform<number, number>;
|
|
18
|
+
readonly ignoreStopPropagationEvent: import("@angular/core").InputSignal<boolean>;
|
|
19
|
+
readonly focusTimeOut: import("@angular/core").InputSignalWithTransform<number, number>;
|
|
20
|
+
readonly blurTimeOut: import("@angular/core").InputSignalWithTransform<number, number>;
|
|
21
|
+
readonly outSearch: import("@angular/core").OutputEmitterRef<string>;
|
|
22
|
+
readonly outValueChange: import("@angular/core").OutputEmitterRef<string>;
|
|
23
|
+
readonly outIconLeft: import("@angular/core").OutputEmitterRef<string>;
|
|
24
|
+
readonly outIconRight: import("@angular/core").OutputEmitterRef<string>;
|
|
25
|
+
readonly outFocusAndBlur: import("@angular/core").OutputEmitterRef<IFocusAndBlurEvent>;
|
|
26
|
+
readonly outFunctionsControl: import("@angular/core").OutputEmitterRef<IInputFunctionControlEvent>;
|
|
27
|
+
ngOnInit(): void;
|
|
28
|
+
protected handlerValueChange(keySearch: string): void;
|
|
29
|
+
protected handlerEnterInput(e: IEvent): void;
|
|
30
|
+
protected handlerEventIconLeft(eventName: string): void;
|
|
31
|
+
protected handlerEventIconRight(eventName: string): void;
|
|
32
|
+
protected handlerFunctionControl(event: IInputFunctionControlEvent): void;
|
|
33
|
+
protected handlerFocusAndBlur(event: IFocusAndBlurEvent): void;
|
|
34
|
+
ngOnDestroy(): void;
|
|
35
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MoLibsSharedComponentsInputSearchComponent, never>;
|
|
36
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MoLibsSharedComponentsInputSearchComponent, "libs_ui-components-inputs-search", never, { "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "searchConfig": { "alias": "searchConfig"; "required": false; "isSignal": true; }; "ignoreAutoComplete": { "alias": "ignoreAutoComplete"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "ignoreStopPropagationEvent": { "alias": "ignoreStopPropagationEvent"; "required": false; "isSignal": true; }; "focusTimeOut": { "alias": "focusTimeOut"; "required": false; "isSignal": true; }; "blurTimeOut": { "alias": "blurTimeOut"; "required": false; "isSignal": true; }; }, { "outSearch": "outSearch"; "outValueChange": "outValueChange"; "outIconLeft": "outIconLeft"; "outIconRight": "outIconRight"; "outFocusAndBlur": "outFocusAndBlur"; "outFunctionsControl": "outFunctionsControl"; }, never, never, true, never>;
|
|
37
|
+
}
|