@libs-ui/components-inputs-add 0.1.1-1
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/add.component.d.ts +107 -0
- package/defines/add.define.d.ts +3 -0
- package/esm2022/add.component.mjs +224 -0
- package/esm2022/defines/add.define.mjs +31 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/interfaces/function-control-event.interface.mjs +2 -0
- package/esm2022/interfaces/index.mjs +3 -0
- package/esm2022/interfaces/input-add.interface.mjs +2 -0
- package/esm2022/libs-ui-components-inputs-add.mjs +5 -0
- package/fesm2022/libs-ui-components-inputs-add.mjs +261 -0
- package/fesm2022/libs-ui-components-inputs-add.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/interfaces/function-control-event.interface.d.ts +4 -0
- package/interfaces/index.d.ts +2 -0
- package/interfaces/input-add.interface.d.ts +41 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { OnInit, TemplateRef } from '@angular/core';
|
|
2
|
+
import { IButton } from '@libs-ui/components-buttons-button';
|
|
3
|
+
import { IInputValidFunctionControlEvent, IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, TYPE_FUNCTION_INPUT_VALID } from '@libs-ui/components-inputs-valid';
|
|
4
|
+
import { ILabel } from '@libs-ui/components-label';
|
|
5
|
+
import { ISwitchEvent } from '@libs-ui/components-switch';
|
|
6
|
+
import { IMessageTranslate } from '@libs-ui/interfaces-types';
|
|
7
|
+
import { IEmitValueChange, IInputAdd, ITemplateRightLeftItem } from './interfaces';
|
|
8
|
+
import { IInputAddFunctionControlEvent } from './interfaces/function-control-event.interface';
|
|
9
|
+
import { TYPE_DATA_TYPE_INPUT, TYPE_INPUT, TYPE_TAG_INPUT } from '@libs-ui/components-inputs-input';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export declare class LibsUiComponentsInputsAddComponent implements OnInit {
|
|
12
|
+
private timeOutKeyUp;
|
|
13
|
+
readonly fieldNameBind: import("@angular/core").InputSignal<string>;
|
|
14
|
+
readonly items: import("@angular/core").ModelSignal<IInputAdd[]>;
|
|
15
|
+
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
16
|
+
readonly disable: import("@angular/core").InputSignal<boolean>;
|
|
17
|
+
readonly addItemButtonConfig: import("@angular/core").InputSignal<IButton | undefined>;
|
|
18
|
+
readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
|
|
19
|
+
readonly labelConfig: import("@angular/core").InputSignal<ILabel | undefined>;
|
|
20
|
+
readonly formInputSpacing: import("@angular/core").InputSignal<number>;
|
|
21
|
+
readonly configItemAddToItems: import("@angular/core").InputSignal<IInputAdd | undefined>;
|
|
22
|
+
readonly rightTemplateItems: import("@angular/core").InputSignal<ITemplateRightLeftItem>;
|
|
23
|
+
readonly leftTemplateItems: import("@angular/core").InputSignal<ITemplateRightLeftItem>;
|
|
24
|
+
readonly templateLeftOutlet: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
|
|
25
|
+
readonly templateRightOutlet: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
|
|
26
|
+
readonly ignoreWidthInput100: import("@angular/core").InputSignal<boolean | undefined>;
|
|
27
|
+
readonly classIncludeInput: import("@angular/core").InputSignal<string | undefined>;
|
|
28
|
+
readonly classContainerInput: import("@angular/core").InputSignal<string | undefined>;
|
|
29
|
+
readonly showCount: import("@angular/core").InputSignal<boolean | undefined>;
|
|
30
|
+
readonly ignoreValidEmptyField: import("@angular/core").InputSignal<boolean | undefined>;
|
|
31
|
+
readonly emitEmptyInDataTypeNumber: import("@angular/core").InputSignal<boolean | undefined>;
|
|
32
|
+
readonly tagInput: import("@angular/core").InputSignal<TYPE_TAG_INPUT | undefined>;
|
|
33
|
+
readonly dataType: import("@angular/core").InputSignal<TYPE_DATA_TYPE_INPUT | undefined>;
|
|
34
|
+
readonly typeInput: import("@angular/core").InputSignal<TYPE_INPUT | undefined>;
|
|
35
|
+
readonly fixedFloat: import("@angular/core").InputSignal<number | undefined>;
|
|
36
|
+
readonly acceptNegativeValue: import("@angular/core").InputSignal<boolean | undefined>;
|
|
37
|
+
readonly valueUpDownNumber: import("@angular/core").InputSignal<number | undefined>;
|
|
38
|
+
readonly resetAutoCompletePassword: import("@angular/core").InputSignal<boolean | undefined>;
|
|
39
|
+
readonly noBorder: import("@angular/core").InputSignal<boolean | undefined>;
|
|
40
|
+
readonly backgroundNone: import("@angular/core").InputSignal<boolean | undefined>;
|
|
41
|
+
readonly useColorModeExist: import("@angular/core").InputSignal<boolean | undefined>;
|
|
42
|
+
readonly keepPlaceholderOnly: import("@angular/core").InputSignal<boolean | undefined>;
|
|
43
|
+
readonly classContainerBottomInput: import("@angular/core").InputSignal<string | undefined>;
|
|
44
|
+
readonly autoRemoveEmoji: import("@angular/core").InputSignal<boolean | undefined>;
|
|
45
|
+
readonly defaultHeight: import("@angular/core").InputSignal<number | undefined>;
|
|
46
|
+
readonly ignoreShowError: import("@angular/core").InputSignal<boolean | undefined>;
|
|
47
|
+
readonly borderError: import("@angular/core").InputSignal<boolean | undefined>;
|
|
48
|
+
readonly unitsLeft: import("@angular/core").InputSignal<any[] | undefined>;
|
|
49
|
+
readonly configUnitLeft: import("@angular/core").InputSignal<IInputValidUnitConfig>;
|
|
50
|
+
readonly keySelectedUnitLeft: import("@angular/core").InputSignal<any>;
|
|
51
|
+
readonly unitsRight: import("@angular/core").InputSignal<any[] | undefined>;
|
|
52
|
+
readonly configUnitRight: import("@angular/core").InputSignal<IInputValidUnitConfig>;
|
|
53
|
+
readonly keySelectedUnitRight: import("@angular/core").InputSignal<any>;
|
|
54
|
+
readonly maxValueNumber: import("@angular/core").InputSignal<number | undefined>;
|
|
55
|
+
readonly minValueNumber: import("@angular/core").InputSignal<number | undefined>;
|
|
56
|
+
readonly isBaselineStyle: import("@angular/core").InputSignal<boolean | undefined>;
|
|
57
|
+
readonly valuePatternShowError: import("@angular/core").InputSignal<boolean | undefined>;
|
|
58
|
+
readonly validPattern: import("@angular/core").InputSignal<IValidPattern[] | undefined>;
|
|
59
|
+
readonly validRequired: import("@angular/core").InputSignal<IValidRequired | undefined>;
|
|
60
|
+
readonly validMinLength: import("@angular/core").InputSignal<IValidLength | undefined>;
|
|
61
|
+
readonly validMinValue: import("@angular/core").InputSignal<IMessageTranslate | undefined>;
|
|
62
|
+
readonly validMaxValue: import("@angular/core").InputSignal<IMessageTranslate | undefined>;
|
|
63
|
+
readonly validMaxLength: import("@angular/core").InputSignal<IMessageTranslate | undefined>;
|
|
64
|
+
readonly validDuplicate: import("@angular/core").InputSignal<IMessageTranslate | undefined>;
|
|
65
|
+
readonly functionValid: import("@angular/core").InputSignal<TYPE_FUNCTION_INPUT_VALID | undefined>;
|
|
66
|
+
readonly maxLength: import("@angular/core").InputSignal<number | undefined>;
|
|
67
|
+
readonly positionMessageErrorStartInput: import("@angular/core").InputSignal<boolean | undefined>;
|
|
68
|
+
readonly classInclude: import("@angular/core").InputSignal<string | undefined>;
|
|
69
|
+
readonly resize: import("@angular/core").InputSignal<"auto" | "none" | undefined>;
|
|
70
|
+
readonly templateLeftBottomInput: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
|
|
71
|
+
readonly templateRightBottomInput: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
|
|
72
|
+
readonly onlyAcceptNegativeValue: import("@angular/core").InputSignal<boolean | undefined>;
|
|
73
|
+
readonly autoAddZeroLessThan10InTypeInt: import("@angular/core").InputSignal<boolean | undefined>;
|
|
74
|
+
readonly maxLengthNumberCount: import("@angular/core").InputSignal<number | undefined>;
|
|
75
|
+
readonly classMessageErrorInclude: import("@angular/core").InputSignal<string | undefined>;
|
|
76
|
+
readonly ignoreStopPropagationEvent: import("@angular/core").InputSignal<boolean | undefined>;
|
|
77
|
+
readonly ignoreUnitRightClassReadOnly: import("@angular/core").InputSignal<boolean | undefined>;
|
|
78
|
+
readonly paddingRightCustomSpecific: import("@angular/core").InputSignal<number | undefined>;
|
|
79
|
+
readonly focusTimeOut: import("@angular/core").InputSignal<number | undefined>;
|
|
80
|
+
readonly ignoreAddItem: import("@angular/core").InputSignal<boolean>;
|
|
81
|
+
readonly ignoreRemove: import("@angular/core").InputSignal<boolean>;
|
|
82
|
+
readonly maxItems: import("@angular/core").InputSignal<number>;
|
|
83
|
+
readonly minItems: import("@angular/core").InputSignal<number>;
|
|
84
|
+
readonly outFunctionsControl: import("@angular/core").OutputEmitterRef<IInputAddFunctionControlEvent>;
|
|
85
|
+
readonly outRemove: import("@angular/core").OutputEmitterRef<IInputAdd>;
|
|
86
|
+
readonly outAddItem: import("@angular/core").OutputEmitterRef<IInputAdd>;
|
|
87
|
+
readonly outClickButtonLabel: import("@angular/core").OutputEmitterRef<IButton>;
|
|
88
|
+
readonly outSwitchEventLabel: import("@angular/core").OutputEmitterRef<ISwitchEvent>;
|
|
89
|
+
readonly outLabelRightClick: import("@angular/core").OutputEmitterRef<boolean>;
|
|
90
|
+
readonly outLabelLeftClick: import("@angular/core").OutputEmitterRef<MouseEvent>;
|
|
91
|
+
readonly outValueChange: import("@angular/core").OutputEmitterRef<IEmitValueChange>;
|
|
92
|
+
ngOnInit(): void;
|
|
93
|
+
get FunctionsControl(): IInputAddFunctionControlEvent;
|
|
94
|
+
private setMessageError;
|
|
95
|
+
private checkIsValid;
|
|
96
|
+
private checkValidRequired;
|
|
97
|
+
protected handlerAddItem(event: Event): void;
|
|
98
|
+
protected handlerRemove(event: Event, item: IInputAdd, index: number): void;
|
|
99
|
+
protected handlerClickButtonLabel(button: IButton): void;
|
|
100
|
+
protected handlerSwitchLabel(event: ISwitchEvent): void;
|
|
101
|
+
protected handlerEventLabelLeftLabel(event: MouseEvent): void;
|
|
102
|
+
protected handlerEventLabelRightLabel(): void;
|
|
103
|
+
protected handlerFunctionsControl(event: IInputValidFunctionControlEvent, item: IInputAdd): void;
|
|
104
|
+
protected handlerValueChange(value: string | number, item: IInputAdd): void;
|
|
105
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsInputsAddComponent, never>;
|
|
106
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsInputsAddComponent, "libs_ui-components-inputs-add", never, { "fieldNameBind": { "alias": "fieldNameBind"; "required": true; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "addItemButtonConfig": { "alias": "addItemButtonConfig"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "labelConfig": { "alias": "labelConfig"; "required": false; "isSignal": true; }; "formInputSpacing": { "alias": "formInputSpacing"; "required": false; "isSignal": true; }; "configItemAddToItems": { "alias": "configItemAddToItems"; "required": false; "isSignal": true; }; "rightTemplateItems": { "alias": "rightTemplateItems"; "required": false; "isSignal": true; }; "leftTemplateItems": { "alias": "leftTemplateItems"; "required": false; "isSignal": true; }; "templateLeftOutlet": { "alias": "templateLeftOutlet"; "required": false; "isSignal": true; }; "templateRightOutlet": { "alias": "templateRightOutlet"; "required": false; "isSignal": true; }; "ignoreWidthInput100": { "alias": "ignoreWidthInput100"; "required": false; "isSignal": true; }; "classIncludeInput": { "alias": "classIncludeInput"; "required": false; "isSignal": true; }; "classContainerInput": { "alias": "classContainerInput"; "required": false; "isSignal": true; }; "showCount": { "alias": "showCount"; "required": false; "isSignal": true; }; "ignoreValidEmptyField": { "alias": "ignoreValidEmptyField"; "required": false; "isSignal": true; }; "emitEmptyInDataTypeNumber": { "alias": "emitEmptyInDataTypeNumber"; "required": false; "isSignal": true; }; "tagInput": { "alias": "tagInput"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "typeInput": { "alias": "typeInput"; "required": false; "isSignal": true; }; "fixedFloat": { "alias": "fixedFloat"; "required": false; "isSignal": true; }; "acceptNegativeValue": { "alias": "acceptNegativeValue"; "required": false; "isSignal": true; }; "valueUpDownNumber": { "alias": "valueUpDownNumber"; "required": false; "isSignal": true; }; "resetAutoCompletePassword": { "alias": "resetAutoCompletePassword"; "required": false; "isSignal": true; }; "noBorder": { "alias": "noBorder"; "required": false; "isSignal": true; }; "backgroundNone": { "alias": "backgroundNone"; "required": false; "isSignal": true; }; "useColorModeExist": { "alias": "useColorModeExist"; "required": false; "isSignal": true; }; "keepPlaceholderOnly": { "alias": "keepPlaceholderOnly"; "required": false; "isSignal": true; }; "classContainerBottomInput": { "alias": "classContainerBottomInput"; "required": false; "isSignal": true; }; "autoRemoveEmoji": { "alias": "autoRemoveEmoji"; "required": false; "isSignal": true; }; "defaultHeight": { "alias": "defaultHeight"; "required": false; "isSignal": true; }; "ignoreShowError": { "alias": "ignoreShowError"; "required": false; "isSignal": true; }; "borderError": { "alias": "borderError"; "required": false; "isSignal": true; }; "unitsLeft": { "alias": "unitsLeft"; "required": false; "isSignal": true; }; "configUnitLeft": { "alias": "configUnitLeft"; "required": false; "isSignal": true; }; "keySelectedUnitLeft": { "alias": "keySelectedUnitLeft"; "required": false; "isSignal": true; }; "unitsRight": { "alias": "unitsRight"; "required": false; "isSignal": true; }; "configUnitRight": { "alias": "configUnitRight"; "required": false; "isSignal": true; }; "keySelectedUnitRight": { "alias": "keySelectedUnitRight"; "required": false; "isSignal": true; }; "maxValueNumber": { "alias": "maxValueNumber"; "required": false; "isSignal": true; }; "minValueNumber": { "alias": "minValueNumber"; "required": false; "isSignal": true; }; "isBaselineStyle": { "alias": "isBaselineStyle"; "required": false; "isSignal": true; }; "valuePatternShowError": { "alias": "valuePatternShowError"; "required": false; "isSignal": true; }; "validPattern": { "alias": "validPattern"; "required": false; "isSignal": true; }; "validRequired": { "alias": "validRequired"; "required": false; "isSignal": true; }; "validMinLength": { "alias": "validMinLength"; "required": false; "isSignal": true; }; "validMinValue": { "alias": "validMinValue"; "required": false; "isSignal": true; }; "validMaxValue": { "alias": "validMaxValue"; "required": false; "isSignal": true; }; "validMaxLength": { "alias": "validMaxLength"; "required": false; "isSignal": true; }; "validDuplicate": { "alias": "validDuplicate"; "required": false; "isSignal": true; }; "functionValid": { "alias": "functionValid"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "positionMessageErrorStartInput": { "alias": "positionMessageErrorStartInput"; "required": false; "isSignal": true; }; "classInclude": { "alias": "classInclude"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "templateLeftBottomInput": { "alias": "templateLeftBottomInput"; "required": false; "isSignal": true; }; "templateRightBottomInput": { "alias": "templateRightBottomInput"; "required": false; "isSignal": true; }; "onlyAcceptNegativeValue": { "alias": "onlyAcceptNegativeValue"; "required": false; "isSignal": true; }; "autoAddZeroLessThan10InTypeInt": { "alias": "autoAddZeroLessThan10InTypeInt"; "required": false; "isSignal": true; }; "maxLengthNumberCount": { "alias": "maxLengthNumberCount"; "required": false; "isSignal": true; }; "classMessageErrorInclude": { "alias": "classMessageErrorInclude"; "required": false; "isSignal": true; }; "ignoreStopPropagationEvent": { "alias": "ignoreStopPropagationEvent"; "required": false; "isSignal": true; }; "ignoreUnitRightClassReadOnly": { "alias": "ignoreUnitRightClassReadOnly"; "required": false; "isSignal": true; }; "paddingRightCustomSpecific": { "alias": "paddingRightCustomSpecific"; "required": false; "isSignal": true; }; "focusTimeOut": { "alias": "focusTimeOut"; "required": false; "isSignal": true; }; "ignoreAddItem": { "alias": "ignoreAddItem"; "required": false; "isSignal": true; }; "ignoreRemove": { "alias": "ignoreRemove"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "minItems": { "alias": "minItems"; "required": false; "isSignal": true; }; }, { "items": "itemsChange"; "outFunctionsControl": "outFunctionsControl"; "outRemove": "outRemove"; "outAddItem": "outAddItem"; "outClickButtonLabel": "outClickButtonLabel"; "outSwitchEventLabel": "outSwitchEventLabel"; "outLabelRightClick": "outLabelRightClick"; "outLabelLeftClick": "outLabelLeftClick"; "outValueChange": "outValueChange"; }, never, never, true, never>;
|
|
107
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, input, model, output, signal } from '@angular/core';
|
|
4
|
+
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
|
+
import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
|
|
6
|
+
import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
|
|
7
|
+
import { cloneDeep, uuid } from '@libs-ui/utils';
|
|
8
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
9
|
+
import { leftTemplateItems, rightTemplateItems } from './defines/add.define';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class LibsUiComponentsInputsAddComponent {
|
|
12
|
+
// #region PROPERTY
|
|
13
|
+
timeOutKeyUp = signal(0);
|
|
14
|
+
// #region INPUT
|
|
15
|
+
fieldNameBind = input.required();
|
|
16
|
+
items = model.required();
|
|
17
|
+
readonly = input(false);
|
|
18
|
+
disable = input(false);
|
|
19
|
+
addItemButtonConfig = input();
|
|
20
|
+
placeholder = input();
|
|
21
|
+
labelConfig = input();
|
|
22
|
+
formInputSpacing = input(8); // khoảng cách giữa hai ô input
|
|
23
|
+
configItemAddToItems = input();
|
|
24
|
+
rightTemplateItems = input(rightTemplateItems());
|
|
25
|
+
leftTemplateItems = input(leftTemplateItems());
|
|
26
|
+
templateLeftOutlet = input();
|
|
27
|
+
templateRightOutlet = input();
|
|
28
|
+
ignoreWidthInput100 = input();
|
|
29
|
+
classIncludeInput = input();
|
|
30
|
+
classContainerInput = input();
|
|
31
|
+
showCount = input();
|
|
32
|
+
ignoreValidEmptyField = input(); // chỉ cần có ít nhất 1 field có giá trị là valid
|
|
33
|
+
emitEmptyInDataTypeNumber = input();
|
|
34
|
+
tagInput = input();
|
|
35
|
+
dataType = input();
|
|
36
|
+
typeInput = input();
|
|
37
|
+
fixedFloat = input();
|
|
38
|
+
acceptNegativeValue = input();
|
|
39
|
+
valueUpDownNumber = input();
|
|
40
|
+
resetAutoCompletePassword = input();
|
|
41
|
+
noBorder = input();
|
|
42
|
+
backgroundNone = input();
|
|
43
|
+
useColorModeExist = input();
|
|
44
|
+
keepPlaceholderOnly = input();
|
|
45
|
+
classContainerBottomInput = input();
|
|
46
|
+
autoRemoveEmoji = input();
|
|
47
|
+
defaultHeight = input();
|
|
48
|
+
ignoreShowError = input();
|
|
49
|
+
borderError = input();
|
|
50
|
+
unitsLeft = input();
|
|
51
|
+
configUnitLeft = input({
|
|
52
|
+
fieldKey: 'id',
|
|
53
|
+
fieldLabel: 'label',
|
|
54
|
+
});
|
|
55
|
+
keySelectedUnitLeft = input();
|
|
56
|
+
unitsRight = input();
|
|
57
|
+
configUnitRight = input({
|
|
58
|
+
fieldKey: 'id',
|
|
59
|
+
fieldLabel: 'label',
|
|
60
|
+
});
|
|
61
|
+
keySelectedUnitRight = input();
|
|
62
|
+
maxValueNumber = input();
|
|
63
|
+
minValueNumber = input();
|
|
64
|
+
isBaselineStyle = input(); // align-items-baseline dùng khi căn input thẳng hàng với tất cả các phần khác dù có validate hay bất cứ 1 cái gì
|
|
65
|
+
valuePatternShowError = input(); // mặc định khi test pattern trả tề giá trị bằng false sẽ báo lỗi
|
|
66
|
+
validPattern = input();
|
|
67
|
+
validRequired = input();
|
|
68
|
+
validMinLength = input();
|
|
69
|
+
validMinValue = input();
|
|
70
|
+
validMaxValue = input();
|
|
71
|
+
validMaxLength = input();
|
|
72
|
+
validDuplicate = input();
|
|
73
|
+
functionValid = input();
|
|
74
|
+
maxLength = input();
|
|
75
|
+
positionMessageErrorStartInput = input(); // khi có template left và right mà muốn mesage error xuất hiện bắt đầu từ ô input thay vì bắt đầu từ template trái
|
|
76
|
+
classInclude = input();
|
|
77
|
+
resize = input();
|
|
78
|
+
templateLeftBottomInput = input();
|
|
79
|
+
templateRightBottomInput = input();
|
|
80
|
+
onlyAcceptNegativeValue = input();
|
|
81
|
+
autoAddZeroLessThan10InTypeInt = input();
|
|
82
|
+
maxLengthNumberCount = input();
|
|
83
|
+
classMessageErrorInclude = input();
|
|
84
|
+
ignoreStopPropagationEvent = input();
|
|
85
|
+
ignoreUnitRightClassReadOnly = input();
|
|
86
|
+
paddingRightCustomSpecific = input(); // fix paddingRight count ko auto tính #52185
|
|
87
|
+
focusTimeOut = input();
|
|
88
|
+
ignoreAddItem = input(false);
|
|
89
|
+
ignoreRemove = input(false);
|
|
90
|
+
maxItems = input(5); // số lượng input tối đa
|
|
91
|
+
minItems = input(1); // không được phép xóa nếu số lượng items <= minItems.length
|
|
92
|
+
// #region OUTPUT
|
|
93
|
+
outFunctionsControl = output();
|
|
94
|
+
outRemove = output();
|
|
95
|
+
outAddItem = output();
|
|
96
|
+
outClickButtonLabel = output();
|
|
97
|
+
outSwitchEventLabel = output();
|
|
98
|
+
outLabelRightClick = output();
|
|
99
|
+
outLabelLeftClick = output();
|
|
100
|
+
outValueChange = output();
|
|
101
|
+
ngOnInit() {
|
|
102
|
+
if (!this.items().length) {
|
|
103
|
+
this.items.set([{ [this.fieldNameBind()]: '' }]);
|
|
104
|
+
}
|
|
105
|
+
this.items.update((items) => items.map((item) => {
|
|
106
|
+
return { ...item, uniqKey: uuid() };
|
|
107
|
+
}));
|
|
108
|
+
this.outFunctionsControl.emit(this.FunctionsControl);
|
|
109
|
+
}
|
|
110
|
+
/* FUNCTIONS */
|
|
111
|
+
get FunctionsControl() {
|
|
112
|
+
return {
|
|
113
|
+
checkIsValid: this.checkIsValid.bind(this),
|
|
114
|
+
setMessageError: this.setMessageError.bind(this),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async setMessageError(message) {
|
|
118
|
+
for (const item of this.items()) {
|
|
119
|
+
await item.functionControl?.setMessageError(message);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async checkIsValid(checkValidRequired = true, currentItem) {
|
|
123
|
+
let valid = true;
|
|
124
|
+
if (this.disable() || this.readonly()) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
for (const input of this.items()) {
|
|
128
|
+
if (input.readonly || input.disable) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (checkValidRequired && !(await this.checkValidRequired(input))) {
|
|
132
|
+
valid = false;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (currentItem?.uniqKey === input.uniqKey) {
|
|
136
|
+
valid = (await input.functionControl?.checkIsValid()) ?? false;
|
|
137
|
+
}
|
|
138
|
+
if (!this.validDuplicate()) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (!input[this.fieldNameBind()]) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (typeof input[this.fieldNameBind()] === 'string' && !input[this.fieldNameBind()].trim()) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const fieldsDuplicate = this.items().filter((element) => element[this.fieldNameBind()] === input[this.fieldNameBind()]);
|
|
148
|
+
if (!fieldsDuplicate || !fieldsDuplicate.length) {
|
|
149
|
+
input.functionControl?.setMessageError('');
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (fieldsDuplicate.length < 2) {
|
|
153
|
+
input.functionControl?.setMessageError('');
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
valid = false;
|
|
157
|
+
input.functionControl?.setMessageError(this.validDuplicate()?.message || 'i18n_valid_duplicate_msg');
|
|
158
|
+
}
|
|
159
|
+
return valid;
|
|
160
|
+
}
|
|
161
|
+
async checkValidRequired(input) {
|
|
162
|
+
let valid = true;
|
|
163
|
+
const validIfAtLeastOneValue = this.ignoreValidEmptyField() && this.items().find((item) => !!item[this.fieldNameBind()]?.trim());
|
|
164
|
+
if (validIfAtLeastOneValue) {
|
|
165
|
+
input.functionControl?.setMessageError('');
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
if (!(await input.functionControl?.checkIsValid())) {
|
|
169
|
+
valid = false;
|
|
170
|
+
}
|
|
171
|
+
return valid;
|
|
172
|
+
}
|
|
173
|
+
handlerAddItem(event) {
|
|
174
|
+
event.stopPropagation();
|
|
175
|
+
if (!this.configItemAddToItems()) {
|
|
176
|
+
const newItem = { uniqKey: uuid(), [this.fieldNameBind()]: '' };
|
|
177
|
+
this.items.update((items) => [...items, newItem]);
|
|
178
|
+
this.outAddItem.emit(newItem);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const newItem = { ...cloneDeep(this.configItemAddToItems), uniqKey: uuid(), [this.fieldNameBind()]: '' };
|
|
182
|
+
this.items.update((items) => [...items, newItem]);
|
|
183
|
+
this.outAddItem.emit(newItem);
|
|
184
|
+
}
|
|
185
|
+
handlerRemove(event, item, index) {
|
|
186
|
+
event.stopPropagation();
|
|
187
|
+
this.items.update((currentItems) => currentItems.filter((_, i) => i !== index));
|
|
188
|
+
this.outRemove.emit(item);
|
|
189
|
+
this.timeOutKeyUp.set(setTimeout(() => {
|
|
190
|
+
clearTimeout(this.timeOutKeyUp());
|
|
191
|
+
this.checkIsValid(false);
|
|
192
|
+
}, 250));
|
|
193
|
+
}
|
|
194
|
+
handlerClickButtonLabel(button) {
|
|
195
|
+
this.outClickButtonLabel.emit(button);
|
|
196
|
+
}
|
|
197
|
+
handlerSwitchLabel(event) {
|
|
198
|
+
this.outSwitchEventLabel.emit(event);
|
|
199
|
+
}
|
|
200
|
+
handlerEventLabelLeftLabel(event) {
|
|
201
|
+
this.outLabelLeftClick.emit(event);
|
|
202
|
+
}
|
|
203
|
+
handlerEventLabelRightLabel() {
|
|
204
|
+
this.outLabelRightClick.emit(true);
|
|
205
|
+
}
|
|
206
|
+
handlerFunctionsControl(event, item) {
|
|
207
|
+
item.functionControl = event;
|
|
208
|
+
}
|
|
209
|
+
handlerValueChange(value, item) {
|
|
210
|
+
item[this.fieldNameBind()] = value;
|
|
211
|
+
this.outValueChange.emit({ value, item });
|
|
212
|
+
this.timeOutKeyUp.set(setTimeout(() => {
|
|
213
|
+
clearTimeout(this.timeOutKeyUp());
|
|
214
|
+
this.checkIsValid(false, item);
|
|
215
|
+
}, 250));
|
|
216
|
+
}
|
|
217
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsAddComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
218
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsAddComponent, isStandalone: true, selector: "libs_ui-components-inputs-add", inputs: { fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, addItemButtonConfig: { classPropertyName: "addItemButtonConfig", publicName: "addItemButtonConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, formInputSpacing: { classPropertyName: "formInputSpacing", publicName: "formInputSpacing", isSignal: true, isRequired: false, transformFunction: null }, configItemAddToItems: { classPropertyName: "configItemAddToItems", publicName: "configItemAddToItems", isSignal: true, isRequired: false, transformFunction: null }, rightTemplateItems: { classPropertyName: "rightTemplateItems", publicName: "rightTemplateItems", isSignal: true, isRequired: false, transformFunction: null }, leftTemplateItems: { classPropertyName: "leftTemplateItems", publicName: "leftTemplateItems", isSignal: true, isRequired: false, transformFunction: null }, templateLeftOutlet: { classPropertyName: "templateLeftOutlet", publicName: "templateLeftOutlet", isSignal: true, isRequired: false, transformFunction: null }, templateRightOutlet: { classPropertyName: "templateRightOutlet", publicName: "templateRightOutlet", isSignal: true, isRequired: false, transformFunction: null }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, classContainerInput: { classPropertyName: "classContainerInput", publicName: "classContainerInput", isSignal: true, isRequired: false, transformFunction: null }, showCount: { classPropertyName: "showCount", publicName: "showCount", isSignal: true, isRequired: false, transformFunction: null }, ignoreValidEmptyField: { classPropertyName: "ignoreValidEmptyField", publicName: "ignoreValidEmptyField", isSignal: true, isRequired: false, transformFunction: null }, emitEmptyInDataTypeNumber: { classPropertyName: "emitEmptyInDataTypeNumber", publicName: "emitEmptyInDataTypeNumber", isSignal: true, isRequired: false, transformFunction: null }, tagInput: { classPropertyName: "tagInput", publicName: "tagInput", isSignal: true, isRequired: false, transformFunction: null }, dataType: { classPropertyName: "dataType", publicName: "dataType", isSignal: true, isRequired: false, transformFunction: null }, typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, fixedFloat: { classPropertyName: "fixedFloat", publicName: "fixedFloat", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null }, noBorder: { classPropertyName: "noBorder", publicName: "noBorder", isSignal: true, isRequired: false, transformFunction: null }, backgroundNone: { classPropertyName: "backgroundNone", publicName: "backgroundNone", isSignal: true, isRequired: false, transformFunction: null }, useColorModeExist: { classPropertyName: "useColorModeExist", publicName: "useColorModeExist", isSignal: true, isRequired: false, transformFunction: null }, keepPlaceholderOnly: { classPropertyName: "keepPlaceholderOnly", publicName: "keepPlaceholderOnly", isSignal: true, isRequired: false, transformFunction: null }, classContainerBottomInput: { classPropertyName: "classContainerBottomInput", publicName: "classContainerBottomInput", isSignal: true, isRequired: false, transformFunction: null }, autoRemoveEmoji: { classPropertyName: "autoRemoveEmoji", publicName: "autoRemoveEmoji", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowError: { classPropertyName: "ignoreShowError", publicName: "ignoreShowError", isSignal: true, isRequired: false, transformFunction: null }, borderError: { classPropertyName: "borderError", publicName: "borderError", isSignal: true, isRequired: false, transformFunction: null }, unitsLeft: { classPropertyName: "unitsLeft", publicName: "unitsLeft", isSignal: true, isRequired: false, transformFunction: null }, configUnitLeft: { classPropertyName: "configUnitLeft", publicName: "configUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitLeft: { classPropertyName: "keySelectedUnitLeft", publicName: "keySelectedUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, minValueNumber: { classPropertyName: "minValueNumber", publicName: "minValueNumber", isSignal: true, isRequired: false, transformFunction: null }, isBaselineStyle: { classPropertyName: "isBaselineStyle", publicName: "isBaselineStyle", isSignal: true, isRequired: false, transformFunction: null }, valuePatternShowError: { classPropertyName: "valuePatternShowError", publicName: "valuePatternShowError", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMinValue: { classPropertyName: "validMinValue", publicName: "validMinValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxValue: { classPropertyName: "validMaxValue", publicName: "validMaxValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validDuplicate: { classPropertyName: "validDuplicate", publicName: "validDuplicate", isSignal: true, isRequired: false, transformFunction: null }, functionValid: { classPropertyName: "functionValid", publicName: "functionValid", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, positionMessageErrorStartInput: { classPropertyName: "positionMessageErrorStartInput", publicName: "positionMessageErrorStartInput", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, templateLeftBottomInput: { classPropertyName: "templateLeftBottomInput", publicName: "templateLeftBottomInput", isSignal: true, isRequired: false, transformFunction: null }, templateRightBottomInput: { classPropertyName: "templateRightBottomInput", publicName: "templateRightBottomInput", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, autoAddZeroLessThan10InTypeInt: { classPropertyName: "autoAddZeroLessThan10InTypeInt", publicName: "autoAddZeroLessThan10InTypeInt", isSignal: true, isRequired: false, transformFunction: null }, maxLengthNumberCount: { classPropertyName: "maxLengthNumberCount", publicName: "maxLengthNumberCount", isSignal: true, isRequired: false, transformFunction: null }, classMessageErrorInclude: { classPropertyName: "classMessageErrorInclude", publicName: "classMessageErrorInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreUnitRightClassReadOnly: { classPropertyName: "ignoreUnitRightClassReadOnly", publicName: "ignoreUnitRightClassReadOnly", isSignal: true, isRequired: false, transformFunction: null }, paddingRightCustomSpecific: { classPropertyName: "paddingRightCustomSpecific", publicName: "paddingRightCustomSpecific", isSignal: true, isRequired: false, transformFunction: null }, focusTimeOut: { classPropertyName: "focusTimeOut", publicName: "focusTimeOut", isSignal: true, isRequired: false, transformFunction: null }, ignoreAddItem: { classPropertyName: "ignoreAddItem", publicName: "ignoreAddItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null }, minItems: { classPropertyName: "minItems", publicName: "minItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", outFunctionsControl: "outFunctionsControl", outRemove: "outRemove", outAddItem: "outAddItem", outClickButtonLabel: "outClickButtonLabel", outSwitchEventLabel: "outSwitchEventLabel", outLabelRightClick: "outLabelRightClick", outLabelLeftClick: "outLabelLeftClick", outValueChange: "outValueChange" }, ngImport: i0, template: "@if (fieldNameBind() && items(); as items) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [labelLeft]=\"labelConfig.labelLeft\"\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [labelLeftBehindToggleButton]=\"labelConfig.labelLeftBehindToggleButton\"\n [popover]=\"labelConfig.popover\"\n [required]=\"labelConfig.required\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [labelRightRequired]=\"labelConfig.labelRightRequired\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleSize]=\"labelConfig.toggleSize || 'default'\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [zIndexPopover]=\"labelConfig.zIndexPopover || 10\"\n [timerDestroyPopover]=\"labelConfig.timerDestroyPopover || 0\"\n [count]=\"labelConfig.count\"\n [limitLength]=\"labelConfig.limitLength\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelLeftClick)=\"handlerEventLabelLeftLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n @for (item of items; track item.uniqKey; let first = $first; let index = $index) {\n <div\n class=\"flex\"\n [style.marginTop.px]=\"!first ? formInputSpacing() : 0\">\n @if (leftTemplateItems(); as leftTemplateItems) {\n <div class=\"flex {{ leftTemplateItems.classInclude }}\">\n @for (rightItem of leftTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('template') {\n @if (item.templateLeftOutlet || templateLeftOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateLeftOutlet || templateLeftOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n <libs_ui-components-inputs-valid\n [item]=\"item\"\n [fieldNameBind]=\"fieldNameBind()\"\n [placeholder]=\"item.placeholder ?? placeholder()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType()\"\n [fixedFloat]=\"fixedFloat()\"\n [readonly]=\"readonly() || item.readonly\"\n [disable]=\"disable() || item.disable\"\n [classContainerInput]=\"classContainerInput()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [showCount]=\"showCount()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [ignoreShowError]=\"ignoreShowError()\"\n [borderError]=\"borderError()\"\n [unitsLeft]=\"item.unitsLeft || unitsLeft()\"\n [configUnitLeft]=\"item.configUnitLeft || configUnitLeft()\"\n [keySelectedUnitLeft]=\"item.keySelectedUnitLeft || keySelectedUnitLeft()\"\n [unitsRight]=\"item.unitsRight || unitsRight()\"\n [configUnitRight]=\"item.configUnitRight || configUnitRight()\"\n [keySelectedUnitRight]=\"item.keySelectedUnitRight || keySelectedUnitRight()\"\n [maxValueNumber]=\"item.maxValueNumber || maxValueNumber()\"\n [minValueNumber]=\"item.minValueNumber || minValueNumber()\"\n [isBaselineStyle]=\"isBaselineStyle()\"\n [valuePatternShowError]=\"valuePatternShowError()\"\n [validPattern]=\"validPattern()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validMinValue]=\"validMinValue()\"\n [validMaxValue]=\"validMaxValue()\"\n [validMaxLength]=\"validMaxLength()\"\n [functionValid]=\"functionValid()\"\n [maxLength]=\"item.maxLength || maxLength()\"\n [positionMessageErrorStartInput]=\"positionMessageErrorStartInput()\"\n [classInclude]=\"classInclude()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [classMessageErrorInclude]=\"classMessageErrorInclude()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [ignoreUnitRightClassReadOnly]=\"ignoreUnitRightClassReadOnly()\"\n [paddingRightCustomSpecific]=\"paddingRightCustomSpecific()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (outValueChange)=\"handlerValueChange($event, item)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event, item)\" />\n\n @if (rightTemplateItems(); as rightTemplateItems) {\n <div\n class=\"flex items-center {{ rightTemplateItems.classInclude }}\"\n [style.height.px]=\"defaultHeight() || 32\">\n @for (rightItem of rightTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('remove') {\n @if (!ignoreRemove() && !item.ignoreRemove && items.length > minItems()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-remove mr-[0px]'\"\n classInclude=\"libs-ui-icon-hover-danger !p-[2px] ml-[16px] {{ rightItem.classInclude }}\"\n (outClick)=\"handlerRemove($event, item, index)\" />\n }\n }\n\n @case ('template') {\n @if (item.templateRightOutlet || templateRightOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateRightOutlet || templateRightOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n </div>\n }\n}\n\n@if (!ignoreAddItem() && (!maxItems() || items().length < maxItems())) {\n <libs_ui-components-buttons-button\n [type]=\"addItemButtonConfig()?.type || 'button-link-primary'\"\n [label]=\"addItemButtonConfig()?.label || 'i18n_add_new'\"\n [classLabel]=\"addItemButtonConfig()?.classLabel || 'libs-uifont-head-5m'\"\n [classIconLeft]=\"addItemButtonConfig()?.classIconLeft || 'libs-ui-icon-add text-[10px] mr-[8px]'\"\n [classInclude]=\"addItemButtonConfig()?.classInclude || '!pb-0 !pl-0 !py-[2px] mt-[8px]'\"\n [disable]=\"disable() || false\"\n (outClick)=\"handlerAddItem($event)\" />\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
219
|
+
}
|
|
220
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsAddComponent, decorators: [{
|
|
221
|
+
type: Component,
|
|
222
|
+
args: [{ selector: 'libs_ui-components-inputs-add', standalone: true, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsInputsValidComponent, LibsUiComponentsLabelComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (fieldNameBind() && items(); as items) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [labelLeft]=\"labelConfig.labelLeft\"\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [labelLeftBehindToggleButton]=\"labelConfig.labelLeftBehindToggleButton\"\n [popover]=\"labelConfig.popover\"\n [required]=\"labelConfig.required\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [labelRightRequired]=\"labelConfig.labelRightRequired\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleSize]=\"labelConfig.toggleSize || 'default'\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [zIndexPopover]=\"labelConfig.zIndexPopover || 10\"\n [timerDestroyPopover]=\"labelConfig.timerDestroyPopover || 0\"\n [count]=\"labelConfig.count\"\n [limitLength]=\"labelConfig.limitLength\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelLeftClick)=\"handlerEventLabelLeftLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n @for (item of items; track item.uniqKey; let first = $first; let index = $index) {\n <div\n class=\"flex\"\n [style.marginTop.px]=\"!first ? formInputSpacing() : 0\">\n @if (leftTemplateItems(); as leftTemplateItems) {\n <div class=\"flex {{ leftTemplateItems.classInclude }}\">\n @for (rightItem of leftTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('template') {\n @if (item.templateLeftOutlet || templateLeftOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateLeftOutlet || templateLeftOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n <libs_ui-components-inputs-valid\n [item]=\"item\"\n [fieldNameBind]=\"fieldNameBind()\"\n [placeholder]=\"item.placeholder ?? placeholder()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType()\"\n [fixedFloat]=\"fixedFloat()\"\n [readonly]=\"readonly() || item.readonly\"\n [disable]=\"disable() || item.disable\"\n [classContainerInput]=\"classContainerInput()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [showCount]=\"showCount()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [ignoreShowError]=\"ignoreShowError()\"\n [borderError]=\"borderError()\"\n [unitsLeft]=\"item.unitsLeft || unitsLeft()\"\n [configUnitLeft]=\"item.configUnitLeft || configUnitLeft()\"\n [keySelectedUnitLeft]=\"item.keySelectedUnitLeft || keySelectedUnitLeft()\"\n [unitsRight]=\"item.unitsRight || unitsRight()\"\n [configUnitRight]=\"item.configUnitRight || configUnitRight()\"\n [keySelectedUnitRight]=\"item.keySelectedUnitRight || keySelectedUnitRight()\"\n [maxValueNumber]=\"item.maxValueNumber || maxValueNumber()\"\n [minValueNumber]=\"item.minValueNumber || minValueNumber()\"\n [isBaselineStyle]=\"isBaselineStyle()\"\n [valuePatternShowError]=\"valuePatternShowError()\"\n [validPattern]=\"validPattern()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validMinValue]=\"validMinValue()\"\n [validMaxValue]=\"validMaxValue()\"\n [validMaxLength]=\"validMaxLength()\"\n [functionValid]=\"functionValid()\"\n [maxLength]=\"item.maxLength || maxLength()\"\n [positionMessageErrorStartInput]=\"positionMessageErrorStartInput()\"\n [classInclude]=\"classInclude()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [classMessageErrorInclude]=\"classMessageErrorInclude()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [ignoreUnitRightClassReadOnly]=\"ignoreUnitRightClassReadOnly()\"\n [paddingRightCustomSpecific]=\"paddingRightCustomSpecific()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (outValueChange)=\"handlerValueChange($event, item)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event, item)\" />\n\n @if (rightTemplateItems(); as rightTemplateItems) {\n <div\n class=\"flex items-center {{ rightTemplateItems.classInclude }}\"\n [style.height.px]=\"defaultHeight() || 32\">\n @for (rightItem of rightTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('remove') {\n @if (!ignoreRemove() && !item.ignoreRemove && items.length > minItems()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-remove mr-[0px]'\"\n classInclude=\"libs-ui-icon-hover-danger !p-[2px] ml-[16px] {{ rightItem.classInclude }}\"\n (outClick)=\"handlerRemove($event, item, index)\" />\n }\n }\n\n @case ('template') {\n @if (item.templateRightOutlet || templateRightOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateRightOutlet || templateRightOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n </div>\n }\n}\n\n@if (!ignoreAddItem() && (!maxItems() || items().length < maxItems())) {\n <libs_ui-components-buttons-button\n [type]=\"addItemButtonConfig()?.type || 'button-link-primary'\"\n [label]=\"addItemButtonConfig()?.label || 'i18n_add_new'\"\n [classLabel]=\"addItemButtonConfig()?.classLabel || 'libs-uifont-head-5m'\"\n [classIconLeft]=\"addItemButtonConfig()?.classIconLeft || 'libs-ui-icon-add text-[10px] mr-[8px]'\"\n [classInclude]=\"addItemButtonConfig()?.classInclude || '!pb-0 !pl-0 !py-[2px] mt-[8px]'\"\n [disable]=\"disable() || false\"\n (outClick)=\"handlerAddItem($event)\" />\n}\n" }]
|
|
223
|
+
}] });
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvYWRkL3NyYy9hZGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9hZGQvc3JjL2FkZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFXLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckcsT0FBTyxFQUF1RyxvQ0FBb0MsRUFBNkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4TixPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUduRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFjN0UsTUFBTSxPQUFPLGtDQUFrQztJQUM3QyxtQkFBbUI7SUFDWCxZQUFZLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXpDLGdCQUFnQjtJQUNQLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7SUFDekMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW9CLENBQUM7SUFDM0MsUUFBUSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNqQyxPQUFPLEdB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LENBQUMsR0FBRyxDQUNuQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FDUixDQUFDO0lBQ0osQ0FBQzt3R0E5UFUsa0NBQWtDOzRGQUFsQyxrQ0FBa0MsbStWQ3pCL0MsdWpQQXNKQSx5RERoSVksZUFBZSwrQkFBRSxnQkFBZ0Isb0pBQUUsc0NBQXNDLHNqQkFBRSxvQ0FBb0MsczFEQUFFLDhCQUE4Qjs7NEZBRzlJLGtDQUFrQztrQkFUOUMsU0FBUzsrQkFFRSwrQkFBK0IsY0FHN0IsSUFBSSxXQUNQLENBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFFLDhCQUE4QixDQUFDLG1CQUN6SSx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJSW5wdXRWYWxpZFVuaXRDb25maWcsIElWYWxpZExlbmd0aCwgSVZhbGlkUGF0dGVybiwgSVZhbGlkUmVxdWlyZWQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCwgVFlQRV9GVU5DVElPTl9JTlBVVF9WQUxJRCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXZhbGlkJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBJU3dpdGNoRXZlbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBJTWVzc2FnZVRyYW5zbGF0ZSwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IGNsb25lRGVlcCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgbGVmdFRlbXBsYXRlSXRlbXMsIHJpZ2h0VGVtcGxhdGVJdGVtcyB9IGZyb20gJy4vZGVmaW5lcy9hZGQuZGVmaW5lJztcbmltcG9ydCB7IElFbWl0VmFsdWVDaGFuZ2UsIElJbnB1dEFkZCwgSVRlbXBsYXRlUmlnaHRMZWZ0SXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJSW5wdXRBZGRGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBUWVBFX0RBVEFfVFlQRV9JTlBVVCwgVFlQRV9JTlBVVCwgVFlQRV9UQUdfSU5QVVQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtYWRkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FkZC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c0FkZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSB0aW1lT3V0S2V5VXAgPSBzaWduYWw8bnVtYmVyPigwKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGZpZWxkTmFtZUJpbmQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGl0ZW1zID0gbW9kZWwucmVxdWlyZWQ8QXJyYXk8SUlucHV0QWRkPj4oKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGFkZEl0ZW1CdXR0b25Db25maWcgPSBpbnB1dDxJQnV0dG9uPigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGFiZWxDb25maWcgPSBpbnB1dDxJTGFiZWw+KCk7XG4gIHJlYWRvbmx5IGZvcm1JbnB1dFNwYWNpbmcgPSBpbnB1dDxudW1iZXI+KDgpOyAvLyBraG/huqNuZyBjw6FjaCBnaeG7r2EgaGFpIMO0IGlucHV0XG4gIHJlYWRvbmx5IGNvbmZpZ0l0ZW1BZGRUb0l0ZW1zID0gaW5wdXQ8SUlucHV0QWRkPigpO1xuICByZWFkb25seSByaWdodFRlbXBsYXRlSXRlbXMgPSBpbnB1dDxJVGVtcGxhdGVSaWdodExlZnRJdGVtPihyaWdodFRlbXBsYXRlSXRlbXMoKSk7XG4gIHJlYWRvbmx5IGxlZnRUZW1wbGF0ZUl0ZW1zID0gaW5wdXQ8SVRlbXBsYXRlUmlnaHRMZWZ0SXRlbT4obGVmdFRlbXBsYXRlSXRlbXMoKSk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlTGVmdE91dGxldCA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVSaWdodE91dGxldCA9IGlucHV0PFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlV2lkdGhJbnB1dDEwMCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUlucHV0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0NvbnRhaW5lcklucHV0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBzaG93Q291bnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVWYWxpZEVtcHR5RmllbGQgPSBpbnB1dDxib29sZWFuPigpOyAvLyBjaOG7iSBj4bqnbiBjw7Mgw610IG5o4bqldCAxIGZpZWxkIGPDsyBnacOhIHRy4buLIGzDoCB2YWxpZFxuXG4gIHJlYWRvbmx5IGVtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB0YWdJbnB1dCA9IGlucHV0PFRZUEVfVEFHX0lOUFVUPigpO1xuICByZWFkb25seSBkYXRhVHlwZSA9IGlucHV0PFRZUEVfREFUQV9UWVBFX0lOUFVUPigpO1xuICByZWFkb25seSB0eXBlSW5wdXQgPSBpbnB1dDxUWVBFX0lOUFVUPigpO1xuICByZWFkb25seSBmaXhlZEZsb2F0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHJlc2V0QXV0b0NvbXBsZXRlUGFzc3dvcmQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBub0JvcmRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGJhY2tncm91bmROb25lID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdXNlQ29sb3JNb2RlRXhpc3QgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBrZWVwUGxhY2Vob2xkZXJPbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSBjbGFzc0NvbnRhaW5lckJvdHRvbUlucHV0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBhdXRvUmVtb3ZlRW1vamkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkZWZhdWx0SGVpZ2h0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBpZ25vcmVTaG93RXJyb3IgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBib3JkZXJFcnJvciA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgdW5pdHNMZWZ0ID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVW5pdExlZnQgPSBpbnB1dDxJSW5wdXRWYWxpZFVuaXRDb25maWc+KHtcbiAgICBmaWVsZEtleTogJ2lkJyxcbiAgICBmaWVsZExhYmVsOiAnbGFiZWwnLFxuICB9KTtcbiAgcmVhZG9ubHkga2V5U2VsZWN0ZWRVbml0TGVmdCA9IGlucHV0PGFueT4oKTtcblxuICByZWFkb25seSB1bml0c1JpZ2h0ID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVW5pdFJpZ2h0ID0gaW5wdXQ8SUlucHV0VmFsaWRVbml0Q29uZmlnPih7XG4gICAgZmllbGRLZXk6ICdpZCcsXG4gICAgZmllbGRMYWJlbDogJ2xhYmVsJyxcbiAgfSk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkVW5pdFJpZ2h0ID0gaW5wdXQ8YW55PigpO1xuXG4gIHJlYWRvbmx5IG1heFZhbHVlTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBtaW5WYWx1ZU51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXNCYXNlbGluZVN0eWxlID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gYWxpZ24taXRlbXMtYmFzZWxpbmUgZMO5bmcga2hpIGPEg24gaW5wdXQgdGjhurNuZyBow6BuZyB24bubaSB04bqldCBj4bqjIGPDoWMgcGjhuqduIGtow6FjIGTDuSBjw7MgdmFsaWRhdGUgaGF5IGLhuqV0IGPhu6kgMSBjw6FpIGfDrFxuXG4gIHJlYWRvbmx5IHZhbHVlUGF0dGVyblNob3dFcnJvciA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIG3hurdjIMSR4buLbmgga2hpIHRlc3QgcGF0dGVybiB0cuG6oyB04buBIGdpw6EgdHLhu4sgYuG6sW5nIGZhbHNlIHPhur0gYsOhbyBs4buXaVxuICByZWFkb25seSB2YWxpZFBhdHRlcm4gPSBpbnB1dDxBcnJheTxJVmFsaWRQYXR0ZXJuPj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElWYWxpZFJlcXVpcmVkPigpO1xuICByZWFkb25seSB2YWxpZE1pbkxlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNaW5WYWx1ZSA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSB2YWxpZE1heFZhbHVlID0gaW5wdXQ8SU1lc3NhZ2VUcmFuc2xhdGU+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SU1lc3NhZ2VUcmFuc2xhdGU+KCk7XG4gIHJlYWRvbmx5IHZhbGlkRHVwbGljYXRlID0gaW5wdXQ8SU1lc3NhZ2VUcmFuc2xhdGU+KCk7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uVmFsaWQgPSBpbnB1dDxUWVBFX0ZVTkNUSU9OX0lOUFVUX1ZBTElEPigpO1xuICByZWFkb25seSBtYXhMZW5ndGggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IHBvc2l0aW9uTWVzc2FnZUVycm9yU3RhcnRJbnB1dCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIGtoaSBjw7MgdGVtcGxhdGUgbGVmdCB2w6AgcmlnaHQgbcOgIG114buRbiBtZXNhZ2UgZXJyb3IgeHXhuqV0IGhp4buHbiBi4bqvdCDEkeG6p3UgdOG7qyDDtCBpbnB1dCB0aGF5IHbDrCBi4bqvdCDEkeG6p3UgdOG7qyB0ZW1wbGF0ZSAgdHLDoWlcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSByZXNpemUgPSBpbnB1dDwnYXV0bycgfCAnbm9uZSc+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlTGVmdEJvdHRvbUlucHV0ID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuICByZWFkb25seSB0ZW1wbGF0ZVJpZ2h0Qm90dG9tSW5wdXQgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCk7XG4gIHJlYWRvbmx5IG9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbWF4TGVuZ3RoTnVtYmVyQ291bnQgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGNsYXNzTWVzc2FnZUVycm9ySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVVbml0UmlnaHRDbGFzc1JlYWRPbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcGFkZGluZ1JpZ2h0Q3VzdG9tU3BlY2lmaWMgPSBpbnB1dDxudW1iZXI+KCk7IC8vIGZpeCBwYWRkaW5nUmlnaHQgY291bnQga28gYXV0byB0w61uaCAjNTIxODVcbiAgcmVhZG9ubHkgZm9jdXNUaW1lT3V0ID0gaW5wdXQ8bnVtYmVyPigpO1xuXG4gIHJlYWRvbmx5IGlnbm9yZUFkZEl0ZW0gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGlnbm9yZVJlbW92ZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbWF4SXRlbXMgPSBpbnB1dDxudW1iZXI+KDUpOyAvLyBz4buRIGzGsOG7o25nIGlucHV0IHThu5FpIMSRYVxuICByZWFkb25seSBtaW5JdGVtcyA9IGlucHV0PG51bWJlcj4oMSk7IC8vIGtow7RuZyDEkcaw4bujYyBwaMOpcCB4w7NhIG7hur91IHPhu5EgbMaw4bujbmcgaXRlbXMgPD0gbWluSXRlbXMubGVuZ3RoXG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJSW5wdXRBZGRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0UmVtb3ZlID0gb3V0cHV0PElJbnB1dEFkZD4oKTtcbiAgcmVhZG9ubHkgb3V0QWRkSXRlbSA9IG91dHB1dDxJSW5wdXRBZGQ+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQnV0dG9uTGFiZWwgPSBvdXRwdXQ8SUJ1dHRvbj4oKTtcbiAgcmVhZG9ubHkgb3V0U3dpdGNoRXZlbnRMYWJlbCA9IG91dHB1dDxJU3dpdGNoRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExhYmVsUmlnaHRDbGljayA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRMYWJlbExlZnRDbGljayA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRWYWx1ZUNoYW5nZSA9IG91dHB1dDxJRW1pdFZhbHVlQ2hhbmdlPigpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQoW3sgW3RoaXMuZmllbGROYW1lQmluZCgpXTogJycgfV0pO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT5cbiAgICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCB1bmlxS2V5OiB1dWlkKCkgfTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElJbnB1dEFkZEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLmNoZWNrSXNWYWxpZC5iaW5kKHRoaXMpLFxuICAgICAgc2V0TWVzc2FnZUVycm9yOiB0aGlzLnNldE1lc3NhZ2VFcnJvci5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldE1lc3NhZ2VFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcygpKSB7XG4gICAgICBhd2FpdCBpdGVtLmZ1bmN0aW9uQ29udHJvbD8uc2V0TWVzc2FnZUVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJc1ZhbGlkKGNoZWNrVmFsaWRSZXF1aXJlZCA9IHRydWUsIGN1cnJlbnRJdGVtPzogSUlucHV0QWRkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmRpc2FibGUoKSB8fCB0aGlzLnJlYWRvbmx5KCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdGhpcy5pdGVtcygpKSB7XG4gICAgICBpZiAoaW5wdXQucmVhZG9ubHkgfHwgaW5wdXQuZGlzYWJsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoZWNrVmFsaWRSZXF1aXJlZCAmJiAhKGF3YWl0IHRoaXMuY2hlY2tWYWxpZFJlcXVpcmVkKGlucHV0KSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50SXRlbT8udW5pcUtleSA9PT0gaW5wdXQudW5pcUtleSkge1xuICAgICAgICB2YWxpZCA9IChhd2FpdCBpbnB1dC5mdW5jdGlvbkNvbnRyb2w/LmNoZWNrSXNWYWxpZCgpKSA/PyBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnZhbGlkRHVwbGljYXRlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5wdXRbdGhpcy5maWVsZE5hbWVCaW5kKCldKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGlucHV0W3RoaXMuZmllbGROYW1lQmluZCgpXSA9PT0gJ3N0cmluZycgJiYgIWlucHV0W3RoaXMuZmllbGROYW1lQmluZCgpXS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkc0R1cGxpY2F0ZSA9IHRoaXMuaXRlbXMoKS5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnRbdGhpcy5maWVsZE5hbWVCaW5kKCldID09PSBpbnB1dFt0aGlzLmZpZWxkTmFtZUJpbmQoKV0pO1xuICAgICAgaWYgKCFmaWVsZHNEdXBsaWNhdGUgfHwgIWZpZWxkc0R1cGxpY2F0ZS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXQuZnVuY3Rpb25Db250cm9sPy5zZXRNZXNzYWdlRXJyb3IoJycpO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGRzRHVwbGljYXRlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgaW5wdXQuZnVuY3Rpb25Db250cm9sPy5zZXRNZXNzYWdlRXJyb3IoJycpO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGlucHV0LmZ1bmN0aW9uQ29udHJvbD8uc2V0TWVzc2FnZUVycm9yKHRoaXMudmFsaWREdXBsaWNhdGUoKT8ubWVzc2FnZSB8fCAnaTE4bl92YWxpZF9kdXBsaWNhdGVfbXNnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1ZhbGlkUmVxdWlyZWQoaW5wdXQ6IElJbnB1dEFkZCkge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgY29uc3QgdmFsaWRJZkF0TGVhc3RPbmVWYWx1ZSA9IHRoaXMuaWdub3JlVmFsaWRFbXB0eUZpZWxkKCkgJiYgdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+ICEhaXRlbVt0aGlzLmZpZWxkTmFtZUJpbmQoKV0/LnRyaW0oKSk7XG5cbiAgICBpZiAodmFsaWRJZkF0TGVhc3RPbmVWYWx1ZSkge1xuICAgICAgaW5wdXQuZnVuY3Rpb25Db250cm9sPy5zZXRNZXNzYWdlRXJyb3IoJycpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCEoYXdhaXQgaW5wdXQuZnVuY3Rpb25Db250cm9sPy5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJBZGRJdGVtKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ0l0ZW1BZGRUb0l0ZW1zKCkpIHtcbiAgICAgIGNvbnN0IG5ld0l0ZW06IElJbnB1dEFkZCA9IHsgdW5pcUtleTogdXVpZCgpLCBbdGhpcy5maWVsZE5hbWVCaW5kKCldOiAnJyB9O1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiBbLi4uaXRlbXMsIG5ld0l0ZW1dKTtcbiAgICAgIHRoaXMub3V0QWRkSXRlbS5lbWl0KG5ld0l0ZW0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0l0ZW06IElJbnB1dEFkZCA9IHsgLi4uY2xvbmVEZWVwKHRoaXMuY29uZmlnSXRlbUFkZFRvSXRlbXMpLCB1bmlxS2V5OiB1dWlkKCksIFt0aGlzLmZpZWxkTmFtZUJpbmQoKV06ICcnIH07XG4gICAgdGhpcy5pdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiBbLi4uaXRlbXMsIG5ld0l0ZW1dKTtcbiAgICB0aGlzLm91dEFkZEl0ZW0uZW1pdChuZXdJdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUmVtb3ZlKGV2ZW50OiBFdmVudCwgaXRlbTogSUlucHV0QWRkLCBpbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pdGVtcy51cGRhdGUoKGN1cnJlbnRJdGVtcykgPT4gY3VycmVudEl0ZW1zLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpKTtcbiAgICB0aGlzLm91dFJlbW92ZS5lbWl0KGl0ZW0pO1xuICAgIHRoaXMudGltZU91dEtleVVwLnNldChcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0S2V5VXAoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tJc1ZhbGlkKGZhbHNlKTtcbiAgICAgIH0sIDI1MClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkxhYmVsKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25MYWJlbC5lbWl0KGJ1dHRvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclN3aXRjaExhYmVsKGV2ZW50OiBJU3dpdGNoRXZlbnQpIHtcbiAgICB0aGlzLm91dFN3aXRjaEV2ZW50TGFiZWwuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50TGFiZWxMZWZ0TGFiZWwoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLm91dExhYmVsTGVmdENsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFdmVudExhYmVsUmlnaHRMYWJlbCgpIHtcbiAgICB0aGlzLm91dExhYmVsUmlnaHRDbGljay5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbnNDb250cm9sKGV2ZW50OiBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBpdGVtOiBJSW5wdXRBZGQpIHtcbiAgICBpdGVtLmZ1bmN0aW9uQ29udHJvbCA9IGV2ZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBpdGVtOiBJSW5wdXRBZGQpIHtcbiAgICBpdGVtW3RoaXMuZmllbGROYW1lQmluZCgpXSA9IHZhbHVlO1xuXG4gICAgdGhpcy5vdXRWYWx1ZUNoYW5nZS5lbWl0KHsgdmFsdWUsIGl0ZW0gfSk7XG5cbiAgICB0aGlzLnRpbWVPdXRLZXlVcC5zZXQoXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZU91dEtleVVwKCkpO1xuICAgICAgICB0aGlzLmNoZWNrSXNWYWxpZChmYWxzZSwgaXRlbSk7XG4gICAgICB9LCAyNTApXG4gICAgKTtcbiAgfVxufVxuIiwiQGlmIChmaWVsZE5hbWVCaW5kKCkgJiYgaXRlbXMoKTsgYXMgaXRlbXMpIHtcbiAgQGlmIChsYWJlbENvbmZpZygpOyBhcyBsYWJlbENvbmZpZykge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtsYWJlbExlZnRCZWhpbmRUb2dnbGVCdXR0b25dPVwibGFiZWxDb25maWcubGFiZWxMZWZ0QmVoaW5kVG9nZ2xlQnV0dG9uXCJcbiAgICAgIFtwb3BvdmVyXT1cImxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsQ29uZmlnLnJlcXVpcmVkXCJcbiAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdFwiXG4gICAgICBbYnV0dG9uc1JpZ2h0XT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNSaWdodFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc1JpZ2h0XCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW2xhYmVsUmlnaHRSZXF1aXJlZF09XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0UmVxdWlyZWRcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZVNpemVdPVwibGFiZWxDb25maWcudG9nZ2xlU2l6ZSB8fCAnZGVmYXVsdCdcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZURpc2FibGVdPVwibGFiZWxDb25maWcudG9nZ2xlRGlzYWJsZVwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgW2Rlc2NyaXB0aW9uQ2xhc3NdPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25DbGFzc1wiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFt6SW5kZXhQb3BvdmVyXT1cImxhYmVsQ29uZmlnLnpJbmRleFBvcG92ZXIgfHwgMTBcIlxuICAgICAgW3RpbWVyRGVzdHJveVBvcG92ZXJdPVwibGFiZWxDb25maWcudGltZXJEZXN0cm95UG9wb3ZlciB8fCAwXCJcbiAgICAgIFtjb3VudF09XCJsYWJlbENvbmZpZy5jb3VudFwiXG4gICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWxDb25maWcubGltaXRMZW5ndGhcIlxuICAgICAgKG91dENsaWNrQnV0dG9uKT1cImhhbmRsZXJDbGlja0J1dHRvbkxhYmVsKCRldmVudClcIlxuICAgICAgKG91dFN3aXRjaEV2ZW50KT1cImhhbmRsZXJTd2l0Y2hMYWJlbCgkZXZlbnQpXCJcbiAgICAgIChvdXRMYWJlbExlZnRDbGljayk9XCJoYW5kbGVyRXZlbnRMYWJlbExlZnRMYWJlbCgkZXZlbnQpXCJcbiAgICAgIChvdXRMYWJlbFJpZ2h0Q2xpY2spPVwiaGFuZGxlckV2ZW50TGFiZWxSaWdodExhYmVsKClcIiAvPlxuICB9XG4gIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGl0ZW0udW5pcUtleTsgbGV0IGZpcnN0ID0gJGZpcnN0OyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCIhZmlyc3QgPyBmb3JtSW5wdXRTcGFjaW5nKCkgOiAwXCI+XG4gICAgICBAaWYgKGxlZnRUZW1wbGF0ZUl0ZW1zKCk7IGFzIGxlZnRUZW1wbGF0ZUl0ZW1zKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHt7IGxlZnRUZW1wbGF0ZUl0ZW1zLmNsYXNzSW5jbHVkZSB9fVwiPlxuICAgICAgICAgIEBmb3IgKHJpZ2h0SXRlbSBvZiBsZWZ0VGVtcGxhdGVJdGVtcy5pdGVtczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICBAc3dpdGNoIChyaWdodEl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICBAY2FzZSAoJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICAgIEBpZiAoaXRlbS50ZW1wbGF0ZUxlZnRPdXRsZXQgfHwgdGVtcGxhdGVMZWZ0T3V0bGV0KCkpIHtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtLnRlbXBsYXRlTGVmdE91dGxldCB8fCB0ZW1wbGF0ZUxlZnRPdXRsZXQoKSB8fCBudWxsOyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0sIGluZGV4OiBpbmRleCB9XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWRcbiAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImZpZWxkTmFtZUJpbmQoKVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJpdGVtLnBsYWNlaG9sZGVyID8/IHBsYWNlaG9sZGVyKClcIlxuICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyKClcIlxuICAgICAgICBbdGFnSW5wdXRdPVwidGFnSW5wdXQoKVwiXG4gICAgICAgIFtkYXRhVHlwZV09XCJkYXRhVHlwZSgpXCJcbiAgICAgICAgW2ZpeGVkRmxvYXRdPVwiZml4ZWRGbG9hdCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KCkgfHwgaXRlbS5yZWFkb25seVwiXG4gICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBpdGVtLmRpc2FibGVcIlxuICAgICAgICBbY2xhc3NDb250YWluZXJJbnB1dF09XCJjbGFzc0NvbnRhaW5lcklucHV0KClcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlSW5wdXRdPVwiY2xhc3NJbmNsdWRlSW5wdXQoKVwiXG4gICAgICAgIFthY2NlcHROZWdhdGl2ZVZhbHVlXT1cImFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgIFt2YWx1ZVVwRG93bk51bWJlcl09XCJ2YWx1ZVVwRG93bk51bWJlcigpIHx8IDFcIlxuICAgICAgICBbaWdub3JlV2lkdGhJbnB1dDEwMF09XCJpZ25vcmVXaWR0aElucHV0MTAwKClcIlxuICAgICAgICBbc2hvd0NvdW50XT1cInNob3dDb3VudCgpXCJcbiAgICAgICAgW3Jlc2V0QXV0b0NvbXBsZXRlUGFzc3dvcmRdPVwicmVzZXRBdXRvQ29tcGxldGVQYXNzd29yZCgpXCJcbiAgICAgICAgW25vQm9yZGVyXT1cIm5vQm9yZGVyKClcIlxuICAgICAgICBbYmFja2dyb3VuZE5vbmVdPVwiYmFja2dyb3VuZE5vbmUoKVwiXG4gICAgICAgIFt1c2VDb2xvck1vZGVFeGlzdF09XCJ1c2VDb2xvck1vZGVFeGlzdCgpXCJcbiAgICAgICAgW2tlZXBQbGFjZWhvbGRlck9ubHldPVwia2VlcFBsYWNlaG9sZGVyT25seSgpXCJcbiAgICAgICAgW2NsYXNzQ29udGFpbmVyQm90dG9tSW5wdXRdPVwiY2xhc3NDb250YWluZXJCb3R0b21JbnB1dCgpXCJcbiAgICAgICAgW2F1dG9SZW1vdmVFbW9qaV09XCJhdXRvUmVtb3ZlRW1vamkoKVwiXG4gICAgICAgIFtkZWZhdWx0SGVpZ2h0XT1cImRlZmF1bHRIZWlnaHQoKVwiXG4gICAgICAgIFtpZ25vcmVTaG93RXJyb3JdPVwiaWdub3JlU2hvd0Vycm9yKClcIlxuICAgICAgICBbYm9yZGVyRXJyb3JdPVwiYm9yZGVyRXJyb3IoKVwiXG4gICAgICAgIFt1bml0c0xlZnRdPVwiaXRlbS51bml0c0xlZnQgfHwgdW5pdHNMZWZ0KClcIlxuICAgICAgICBbY29uZmlnVW5pdExlZnRdPVwiaXRlbS5jb25maWdVbml0TGVmdCB8fCBjb25maWdVbml0TGVmdCgpXCJcbiAgICAgICAgW2tleVNlbGVjdGVkVW5pdExlZnRdPVwiaXRlbS5rZXlTZWxlY3RlZFVuaXRMZWZ0IHx8IGtleVNlbGVjdGVkVW5pdExlZnQoKVwiXG4gICAgICAgIFt1bml0c1JpZ2h0XT1cIml0ZW0udW5pdHNSaWdodCB8fCB1bml0c1JpZ2h0KClcIlxuICAgICAgICBbY29uZmlnVW5pdFJpZ2h0XT1cIml0ZW0uY29uZmlnVW5pdFJpZ2h0IHx8IGNvbmZpZ1VuaXRSaWdodCgpXCJcbiAgICAgICAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cIml0ZW0ua2V5U2VsZWN0ZWRVbml0UmlnaHQgfHwga2V5U2VsZWN0ZWRVbml0UmlnaHQoKVwiXG4gICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJpdGVtLm1heFZhbHVlTnVtYmVyIHx8IG1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiaXRlbS5taW5WYWx1ZU51bWJlciB8fCBtaW5WYWx1ZU51bWJlcigpXCJcbiAgICAgICAgW2lzQmFzZWxpbmVTdHlsZV09XCJpc0Jhc2VsaW5lU3R5bGUoKVwiXG4gICAgICAgIFt2YWx1ZVBhdHRlcm5TaG93RXJyb3JdPVwidmFsdWVQYXR0ZXJuU2hvd0Vycm9yKClcIlxuICAgICAgICBbdmFsaWRQYXR0ZXJuXT1cInZhbGlkUGF0dGVybigpXCJcbiAgICAgICAgW3ZhbGlkUmVxdWlyZWRdPVwidmFsaWRSZXF1aXJlZCgpXCJcbiAgICAgICAgW3ZhbGlkTWluTGVuZ3RoXT1cInZhbGlkTWluTGVuZ3RoKClcIlxuICAgICAgICBbdmFsaWRNaW5WYWx1ZV09XCJ2YWxpZE1pblZhbHVlKClcIlxuICAgICAgICBbdmFsaWRNYXhWYWx1ZV09XCJ2YWxpZE1heFZhbHVlKClcIlxuICAgICAgICBbdmFsaWRNYXhMZW5ndGhdPVwidmFsaWRNYXhMZW5ndGgoKVwiXG4gICAgICAgIFtmdW5jdGlvblZhbGlkXT1cImZ1bmN0aW9uVmFsaWQoKVwiXG4gICAgICAgIFttYXhMZW5ndGhdPVwiaXRlbS5tYXhMZW5ndGggfHwgbWF4TGVuZ3RoKClcIlxuICAgICAgICBbcG9zaXRpb25NZXNzYWdlRXJyb3JTdGFydElucHV0XT1cInBvc2l0aW9uTWVzc2FnZUVycm9yU3RhcnRJbnB1dCgpXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGUoKVwiXG4gICAgICAgIFtvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJhdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnQoKVwiXG4gICAgICAgIFttYXhMZW5ndGhOdW1iZXJDb3VudF09XCJtYXhMZW5ndGhOdW1iZXJDb3VudCgpXCJcbiAgICAgICAgW2NsYXNzTWVzc2FnZUVycm9ySW5jbHVkZV09XCJjbGFzc01lc3NhZ2VFcnJvckluY2x1ZGUoKVwiXG4gICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudCgpXCJcbiAgICAgICAgW2lnbm9yZVVuaXRSaWdodENsYXNzUmVhZE9ubHldPVwiaWdub3JlVW5pdFJpZ2h0Q2xhc3NSZWFkT25seSgpXCJcbiAgICAgICAgW3BhZGRpbmdSaWdodEN1c3RvbVNwZWNpZmljXT1cInBhZGRpbmdSaWdodEN1c3RvbVNwZWNpZmljKClcIlxuICAgICAgICBbZm9jdXNUaW1lT3V0XT1cImZvY3VzVGltZU91dCgpXCJcbiAgICAgICAgKG91dFZhbHVlQ2hhbmdlKT1cImhhbmRsZXJWYWx1ZUNoYW5nZSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woJGV2ZW50LCBpdGVtKVwiIC8+XG5cbiAgICAgIEBpZiAocmlnaHRUZW1wbGF0ZUl0ZW1zKCk7IGFzIHJpZ2h0VGVtcGxhdGVJdGVtcykge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB7eyByaWdodFRlbXBsYXRlSXRlbXMuY2xhc3NJbmNsdWRlIH19XCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRlZmF1bHRIZWlnaHQoKSB8fCAzMlwiPlxuICAgICAgICAgIEBmb3IgKHJpZ2h0SXRlbSBvZiByaWdodFRlbXBsYXRlSXRlbXMuaXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgQHN3aXRjaCAocmlnaHRJdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgQGNhc2UgKCdyZW1vdmUnKSB7XG4gICAgICAgICAgICAgICAgQGlmICghaWdub3JlUmVtb3ZlKCkgJiYgIWl0ZW0uaWdub3JlUmVtb3ZlICYmIGl0ZW1zLmxlbmd0aCA+IG1pbkl0ZW1zKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tcmVtb3ZlIG1yLVswcHhdJ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cImxpYnMtdWktaWNvbi1ob3Zlci1kYW5nZXIgIXAtWzJweF0gbWwtWzE2cHhdIHt7IHJpZ2h0SXRlbS5jbGFzc0luY2x1ZGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclJlbW92ZSgkZXZlbnQsIGl0ZW0sIGluZGV4KVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgQGNhc2UgKCd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGVtcGxhdGVSaWdodE91dGxldCB8fCB0ZW1wbGF0ZVJpZ2h0T3V0bGV0KCkpIHtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtLnRlbXBsYXRlUmlnaHRPdXRsZXQgfHwgdGVtcGxhdGVSaWdodE91dGxldCgpIHx8IG51bGw7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSwgaW5kZXg6IGluZGV4IH1cIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbn1cblxuQGlmICghaWdub3JlQWRkSXRlbSgpICYmICghbWF4SXRlbXMoKSB8fCBpdGVtcygpLmxlbmd0aCA8IG1heEl0ZW1zKCkpKSB7XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICBbdHlwZV09XCJhZGRJdGVtQnV0dG9uQ29uZmlnKCk/LnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICBbbGFiZWxdPVwiYWRkSXRlbUJ1dHRvbkNvbmZpZygpPy5sYWJlbCB8fCAnaTE4bl9hZGRfbmV3J1wiXG4gICAgW2NsYXNzTGFiZWxdPVwiYWRkSXRlbUJ1dHRvbkNvbmZpZygpPy5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpZm9udC1oZWFkLTVtJ1wiXG4gICAgW2NsYXNzSWNvbkxlZnRdPVwiYWRkSXRlbUJ1dHRvbkNvbmZpZygpPy5jbGFzc0ljb25MZWZ0IHx8ICdsaWJzLXVpLWljb24tYWRkIHRleHQtWzEwcHhdIG1yLVs4cHhdJ1wiXG4gICAgW2NsYXNzSW5jbHVkZV09XCJhZGRJdGVtQnV0dG9uQ29uZmlnKCk/LmNsYXNzSW5jbHVkZSB8fCAnIXBiLTAgIXBsLTAgIXB5LVsycHhdIG10LVs4cHhdJ1wiXG4gICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGZhbHNlXCJcbiAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZEl0ZW0oJGV2ZW50KVwiIC8+XG59XG4iXX0=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const rightTemplateItems = () => {
|
|
2
|
+
return {
|
|
3
|
+
classInclude: '',
|
|
4
|
+
items: [
|
|
5
|
+
{
|
|
6
|
+
type: 'remove',
|
|
7
|
+
classInclude: '',
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
type: 'template',
|
|
11
|
+
classInclude: '',
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export const leftTemplateItems = () => {
|
|
17
|
+
return {
|
|
18
|
+
classInclude: '',
|
|
19
|
+
items: [
|
|
20
|
+
{
|
|
21
|
+
type: 'remove',
|
|
22
|
+
classInclude: '',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
type: 'template',
|
|
26
|
+
classInclude: '',
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvYWRkL3NyYy9kZWZpbmVzL2FkZC5kZWZpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBMkIsRUFBRTtJQUM3RCxPQUFPO1FBQ0wsWUFBWSxFQUFFLEVBQUU7UUFDaEIsS0FBSyxFQUFFO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsWUFBWSxFQUFFLEVBQUU7YUFDakI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsWUFBWSxFQUFFLEVBQUU7YUFDakI7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUEyQixFQUFFO0lBQzVELE9BQU87UUFDTCxZQUFZLEVBQUUsRUFBRTtRQUNoQixLQUFLLEVBQUU7WUFDTDtnQkFDRSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxZQUFZLEVBQUUsRUFBRTthQUNqQjtZQUNEO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixZQUFZLEVBQUUsRUFBRTthQUNqQjtTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElUZW1wbGF0ZVJpZ2h0TGVmdEl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2lucHV0LWFkZC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgcmlnaHRUZW1wbGF0ZUl0ZW1zID0gKCk6IElUZW1wbGF0ZVJpZ2h0TGVmdEl0ZW0gPT4ge1xuICByZXR1cm4ge1xuICAgIGNsYXNzSW5jbHVkZTogJycsXG4gICAgaXRlbXM6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICAgIGNsYXNzSW5jbHVkZTogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAndGVtcGxhdGUnLFxuICAgICAgICBjbGFzc0luY2x1ZGU6ICcnLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGxlZnRUZW1wbGF0ZUl0ZW1zID0gKCk6IElUZW1wbGF0ZVJpZ2h0TGVmdEl0ZW0gPT4ge1xuICByZXR1cm4ge1xuICAgIGNsYXNzSW5jbHVkZTogJycsXG4gICAgaXRlbXM6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICAgIGNsYXNzSW5jbHVkZTogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAndGVtcGxhdGUnLFxuICAgICAgICBjbGFzc0luY2x1ZGU6ICcnLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './add.component';
|
|
2
|
+
export * from './interfaces';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL2FkZC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYWRkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZXMnO1xuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL2FkZC9zcmMvaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0QWRkRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICBjaGVja0lzVmFsaWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNldE1lc3NhZ2VFcnJvcjogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './input-add.interface';
|
|
2
|
+
export * from './function-control-event.interface';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL2FkZC9zcmMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsb0NBQW9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2lucHV0LWFkZC5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mdW5jdGlvbi1jb250cm9sLWV2ZW50LmludGVyZmFjZSc7XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtYWRkLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvYWRkL3NyYy9pbnRlcmZhY2VzL2lucHV0LWFkZC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJSW5wdXRWYWxpZFVuaXRDb25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBJTGFiZWwgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0QWRkQ29uZmlnIHtcbiAgY291bnQ/OiBudW1iZXI7XG4gIG1heENvdW50PzogbnVtYmVyO1xuICBjbGFzc0NpcmNsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW5wdXRBZGQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgdW5pcUtleT86IHN0cmluZztcbiAgZGlzYWJsZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcbiAgaWdub3JlUmVtb3ZlPzogYm9vbGVhbjtcbiAgbGFiZWxDb25maWc/OiBJTGFiZWw7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBtYXhWYWx1ZU51bWJlcj86IG51bWJlcjtcbiAgbWluVmFsdWVOdW1iZXI/OiBudW1iZXI7XG4gIG1heExlbmd0aD86IG51bWJlcjtcblxuICB1bml0c0xlZnQ/OiBBcnJheTxhbnk+O1xuICBjb25maWdVbml0TGVmdD86IElJbnB1dFZhbGlkVW5pdENvbmZpZztcbiAga2V5U2VsZWN0ZWRVbml0TGVmdD86IGFueTtcblxuICB1bml0c1JpZ2h0PzogQXJyYXk8YW55PjtcbiAgY29uZmlnVW5pdFJpZ2h0PzogSUlucHV0VmFsaWRVbml0Q29uZmlnO1xuICBrZXlTZWxlY3RlZFVuaXRSaWdodD86IGFueTtcblxuICB0ZW1wbGF0ZUxlZnRPdXRsZXQ/OiBUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj47XG4gIHRlbXBsYXRlUmlnaHRPdXRsZXQ/OiBUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj47XG4gIGZ1bmN0aW9uQ29udHJvbD86IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQ7XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUZW1wbGF0ZVJpZ2h0TGVmdEl0ZW0ge1xuICBjbGFzc0luY2x1ZGU/OiBzdHJpbmc7XG4gIGl0ZW1zOiBBcnJheTx7XG4gICAgdHlwZTogJ3JlbW92ZScgfCAndGVtcGxhdGUnO1xuICAgIGNsYXNzSW5jbHVkZT86IHN0cmluZztcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVtaXRWYWx1ZUNoYW5nZSB7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXI7XG4gIGl0ZW06IElJbnB1dEFkZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy11aS1jb21wb25lbnRzLWlucHV0cy1hZGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL2FkZC9zcmMvbGlicy11aS1jb21wb25lbnRzLWlucHV0cy1hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { signal, input, model, output, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
|
+
import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
|
|
6
|
+
import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
|
|
7
|
+
import { uuid, cloneDeep } from '@libs-ui/utils';
|
|
8
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
9
|
+
|
|
10
|
+
const rightTemplateItems = () => {
|
|
11
|
+
return {
|
|
12
|
+
classInclude: '',
|
|
13
|
+
items: [
|
|
14
|
+
{
|
|
15
|
+
type: 'remove',
|
|
16
|
+
classInclude: '',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
type: 'template',
|
|
20
|
+
classInclude: '',
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const leftTemplateItems = () => {
|
|
26
|
+
return {
|
|
27
|
+
classInclude: '',
|
|
28
|
+
items: [
|
|
29
|
+
{
|
|
30
|
+
type: 'remove',
|
|
31
|
+
classInclude: '',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
type: 'template',
|
|
35
|
+
classInclude: '',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
42
|
+
class LibsUiComponentsInputsAddComponent {
|
|
43
|
+
// #region PROPERTY
|
|
44
|
+
timeOutKeyUp = signal(0);
|
|
45
|
+
// #region INPUT
|
|
46
|
+
fieldNameBind = input.required();
|
|
47
|
+
items = model.required();
|
|
48
|
+
readonly = input(false);
|
|
49
|
+
disable = input(false);
|
|
50
|
+
addItemButtonConfig = input();
|
|
51
|
+
placeholder = input();
|
|
52
|
+
labelConfig = input();
|
|
53
|
+
formInputSpacing = input(8); // khoảng cách giữa hai ô input
|
|
54
|
+
configItemAddToItems = input();
|
|
55
|
+
rightTemplateItems = input(rightTemplateItems());
|
|
56
|
+
leftTemplateItems = input(leftTemplateItems());
|
|
57
|
+
templateLeftOutlet = input();
|
|
58
|
+
templateRightOutlet = input();
|
|
59
|
+
ignoreWidthInput100 = input();
|
|
60
|
+
classIncludeInput = input();
|
|
61
|
+
classContainerInput = input();
|
|
62
|
+
showCount = input();
|
|
63
|
+
ignoreValidEmptyField = input(); // chỉ cần có ít nhất 1 field có giá trị là valid
|
|
64
|
+
emitEmptyInDataTypeNumber = input();
|
|
65
|
+
tagInput = input();
|
|
66
|
+
dataType = input();
|
|
67
|
+
typeInput = input();
|
|
68
|
+
fixedFloat = input();
|
|
69
|
+
acceptNegativeValue = input();
|
|
70
|
+
valueUpDownNumber = input();
|
|
71
|
+
resetAutoCompletePassword = input();
|
|
72
|
+
noBorder = input();
|
|
73
|
+
backgroundNone = input();
|
|
74
|
+
useColorModeExist = input();
|
|
75
|
+
keepPlaceholderOnly = input();
|
|
76
|
+
classContainerBottomInput = input();
|
|
77
|
+
autoRemoveEmoji = input();
|
|
78
|
+
defaultHeight = input();
|
|
79
|
+
ignoreShowError = input();
|
|
80
|
+
borderError = input();
|
|
81
|
+
unitsLeft = input();
|
|
82
|
+
configUnitLeft = input({
|
|
83
|
+
fieldKey: 'id',
|
|
84
|
+
fieldLabel: 'label',
|
|
85
|
+
});
|
|
86
|
+
keySelectedUnitLeft = input();
|
|
87
|
+
unitsRight = input();
|
|
88
|
+
configUnitRight = input({
|
|
89
|
+
fieldKey: 'id',
|
|
90
|
+
fieldLabel: 'label',
|
|
91
|
+
});
|
|
92
|
+
keySelectedUnitRight = input();
|
|
93
|
+
maxValueNumber = input();
|
|
94
|
+
minValueNumber = input();
|
|
95
|
+
isBaselineStyle = input(); // align-items-baseline dùng khi căn input thẳng hàng với tất cả các phần khác dù có validate hay bất cứ 1 cái gì
|
|
96
|
+
valuePatternShowError = input(); // mặc định khi test pattern trả tề giá trị bằng false sẽ báo lỗi
|
|
97
|
+
validPattern = input();
|
|
98
|
+
validRequired = input();
|
|
99
|
+
validMinLength = input();
|
|
100
|
+
validMinValue = input();
|
|
101
|
+
validMaxValue = input();
|
|
102
|
+
validMaxLength = input();
|
|
103
|
+
validDuplicate = input();
|
|
104
|
+
functionValid = input();
|
|
105
|
+
maxLength = input();
|
|
106
|
+
positionMessageErrorStartInput = input(); // khi có template left và right mà muốn mesage error xuất hiện bắt đầu từ ô input thay vì bắt đầu từ template trái
|
|
107
|
+
classInclude = input();
|
|
108
|
+
resize = input();
|
|
109
|
+
templateLeftBottomInput = input();
|
|
110
|
+
templateRightBottomInput = input();
|
|
111
|
+
onlyAcceptNegativeValue = input();
|
|
112
|
+
autoAddZeroLessThan10InTypeInt = input();
|
|
113
|
+
maxLengthNumberCount = input();
|
|
114
|
+
classMessageErrorInclude = input();
|
|
115
|
+
ignoreStopPropagationEvent = input();
|
|
116
|
+
ignoreUnitRightClassReadOnly = input();
|
|
117
|
+
paddingRightCustomSpecific = input(); // fix paddingRight count ko auto tính #52185
|
|
118
|
+
focusTimeOut = input();
|
|
119
|
+
ignoreAddItem = input(false);
|
|
120
|
+
ignoreRemove = input(false);
|
|
121
|
+
maxItems = input(5); // số lượng input tối đa
|
|
122
|
+
minItems = input(1); // không được phép xóa nếu số lượng items <= minItems.length
|
|
123
|
+
// #region OUTPUT
|
|
124
|
+
outFunctionsControl = output();
|
|
125
|
+
outRemove = output();
|
|
126
|
+
outAddItem = output();
|
|
127
|
+
outClickButtonLabel = output();
|
|
128
|
+
outSwitchEventLabel = output();
|
|
129
|
+
outLabelRightClick = output();
|
|
130
|
+
outLabelLeftClick = output();
|
|
131
|
+
outValueChange = output();
|
|
132
|
+
ngOnInit() {
|
|
133
|
+
if (!this.items().length) {
|
|
134
|
+
this.items.set([{ [this.fieldNameBind()]: '' }]);
|
|
135
|
+
}
|
|
136
|
+
this.items.update((items) => items.map((item) => {
|
|
137
|
+
return { ...item, uniqKey: uuid() };
|
|
138
|
+
}));
|
|
139
|
+
this.outFunctionsControl.emit(this.FunctionsControl);
|
|
140
|
+
}
|
|
141
|
+
/* FUNCTIONS */
|
|
142
|
+
get FunctionsControl() {
|
|
143
|
+
return {
|
|
144
|
+
checkIsValid: this.checkIsValid.bind(this),
|
|
145
|
+
setMessageError: this.setMessageError.bind(this),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async setMessageError(message) {
|
|
149
|
+
for (const item of this.items()) {
|
|
150
|
+
await item.functionControl?.setMessageError(message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async checkIsValid(checkValidRequired = true, currentItem) {
|
|
154
|
+
let valid = true;
|
|
155
|
+
if (this.disable() || this.readonly()) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
for (const input of this.items()) {
|
|
159
|
+
if (input.readonly || input.disable) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (checkValidRequired && !(await this.checkValidRequired(input))) {
|
|
163
|
+
valid = false;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (currentItem?.uniqKey === input.uniqKey) {
|
|
167
|
+
valid = (await input.functionControl?.checkIsValid()) ?? false;
|
|
168
|
+
}
|
|
169
|
+
if (!this.validDuplicate()) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (!input[this.fieldNameBind()]) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (typeof input[this.fieldNameBind()] === 'string' && !input[this.fieldNameBind()].trim()) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const fieldsDuplicate = this.items().filter((element) => element[this.fieldNameBind()] === input[this.fieldNameBind()]);
|
|
179
|
+
if (!fieldsDuplicate || !fieldsDuplicate.length) {
|
|
180
|
+
input.functionControl?.setMessageError('');
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (fieldsDuplicate.length < 2) {
|
|
184
|
+
input.functionControl?.setMessageError('');
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
valid = false;
|
|
188
|
+
input.functionControl?.setMessageError(this.validDuplicate()?.message || 'i18n_valid_duplicate_msg');
|
|
189
|
+
}
|
|
190
|
+
return valid;
|
|
191
|
+
}
|
|
192
|
+
async checkValidRequired(input) {
|
|
193
|
+
let valid = true;
|
|
194
|
+
const validIfAtLeastOneValue = this.ignoreValidEmptyField() && this.items().find((item) => !!item[this.fieldNameBind()]?.trim());
|
|
195
|
+
if (validIfAtLeastOneValue) {
|
|
196
|
+
input.functionControl?.setMessageError('');
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
if (!(await input.functionControl?.checkIsValid())) {
|
|
200
|
+
valid = false;
|
|
201
|
+
}
|
|
202
|
+
return valid;
|
|
203
|
+
}
|
|
204
|
+
handlerAddItem(event) {
|
|
205
|
+
event.stopPropagation();
|
|
206
|
+
if (!this.configItemAddToItems()) {
|
|
207
|
+
const newItem = { uniqKey: uuid(), [this.fieldNameBind()]: '' };
|
|
208
|
+
this.items.update((items) => [...items, newItem]);
|
|
209
|
+
this.outAddItem.emit(newItem);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const newItem = { ...cloneDeep(this.configItemAddToItems), uniqKey: uuid(), [this.fieldNameBind()]: '' };
|
|
213
|
+
this.items.update((items) => [...items, newItem]);
|
|
214
|
+
this.outAddItem.emit(newItem);
|
|
215
|
+
}
|
|
216
|
+
handlerRemove(event, item, index) {
|
|
217
|
+
event.stopPropagation();
|
|
218
|
+
this.items.update((currentItems) => currentItems.filter((_, i) => i !== index));
|
|
219
|
+
this.outRemove.emit(item);
|
|
220
|
+
this.timeOutKeyUp.set(setTimeout(() => {
|
|
221
|
+
clearTimeout(this.timeOutKeyUp());
|
|
222
|
+
this.checkIsValid(false);
|
|
223
|
+
}, 250));
|
|
224
|
+
}
|
|
225
|
+
handlerClickButtonLabel(button) {
|
|
226
|
+
this.outClickButtonLabel.emit(button);
|
|
227
|
+
}
|
|
228
|
+
handlerSwitchLabel(event) {
|
|
229
|
+
this.outSwitchEventLabel.emit(event);
|
|
230
|
+
}
|
|
231
|
+
handlerEventLabelLeftLabel(event) {
|
|
232
|
+
this.outLabelLeftClick.emit(event);
|
|
233
|
+
}
|
|
234
|
+
handlerEventLabelRightLabel() {
|
|
235
|
+
this.outLabelRightClick.emit(true);
|
|
236
|
+
}
|
|
237
|
+
handlerFunctionsControl(event, item) {
|
|
238
|
+
item.functionControl = event;
|
|
239
|
+
}
|
|
240
|
+
handlerValueChange(value, item) {
|
|
241
|
+
item[this.fieldNameBind()] = value;
|
|
242
|
+
this.outValueChange.emit({ value, item });
|
|
243
|
+
this.timeOutKeyUp.set(setTimeout(() => {
|
|
244
|
+
clearTimeout(this.timeOutKeyUp());
|
|
245
|
+
this.checkIsValid(false, item);
|
|
246
|
+
}, 250));
|
|
247
|
+
}
|
|
248
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsAddComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
249
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsAddComponent, isStandalone: true, selector: "libs_ui-components-inputs-add", inputs: { fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, addItemButtonConfig: { classPropertyName: "addItemButtonConfig", publicName: "addItemButtonConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, formInputSpacing: { classPropertyName: "formInputSpacing", publicName: "formInputSpacing", isSignal: true, isRequired: false, transformFunction: null }, configItemAddToItems: { classPropertyName: "configItemAddToItems", publicName: "configItemAddToItems", isSignal: true, isRequired: false, transformFunction: null }, rightTemplateItems: { classPropertyName: "rightTemplateItems", publicName: "rightTemplateItems", isSignal: true, isRequired: false, transformFunction: null }, leftTemplateItems: { classPropertyName: "leftTemplateItems", publicName: "leftTemplateItems", isSignal: true, isRequired: false, transformFunction: null }, templateLeftOutlet: { classPropertyName: "templateLeftOutlet", publicName: "templateLeftOutlet", isSignal: true, isRequired: false, transformFunction: null }, templateRightOutlet: { classPropertyName: "templateRightOutlet", publicName: "templateRightOutlet", isSignal: true, isRequired: false, transformFunction: null }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, classContainerInput: { classPropertyName: "classContainerInput", publicName: "classContainerInput", isSignal: true, isRequired: false, transformFunction: null }, showCount: { classPropertyName: "showCount", publicName: "showCount", isSignal: true, isRequired: false, transformFunction: null }, ignoreValidEmptyField: { classPropertyName: "ignoreValidEmptyField", publicName: "ignoreValidEmptyField", isSignal: true, isRequired: false, transformFunction: null }, emitEmptyInDataTypeNumber: { classPropertyName: "emitEmptyInDataTypeNumber", publicName: "emitEmptyInDataTypeNumber", isSignal: true, isRequired: false, transformFunction: null }, tagInput: { classPropertyName: "tagInput", publicName: "tagInput", isSignal: true, isRequired: false, transformFunction: null }, dataType: { classPropertyName: "dataType", publicName: "dataType", isSignal: true, isRequired: false, transformFunction: null }, typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, fixedFloat: { classPropertyName: "fixedFloat", publicName: "fixedFloat", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null }, noBorder: { classPropertyName: "noBorder", publicName: "noBorder", isSignal: true, isRequired: false, transformFunction: null }, backgroundNone: { classPropertyName: "backgroundNone", publicName: "backgroundNone", isSignal: true, isRequired: false, transformFunction: null }, useColorModeExist: { classPropertyName: "useColorModeExist", publicName: "useColorModeExist", isSignal: true, isRequired: false, transformFunction: null }, keepPlaceholderOnly: { classPropertyName: "keepPlaceholderOnly", publicName: "keepPlaceholderOnly", isSignal: true, isRequired: false, transformFunction: null }, classContainerBottomInput: { classPropertyName: "classContainerBottomInput", publicName: "classContainerBottomInput", isSignal: true, isRequired: false, transformFunction: null }, autoRemoveEmoji: { classPropertyName: "autoRemoveEmoji", publicName: "autoRemoveEmoji", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowError: { classPropertyName: "ignoreShowError", publicName: "ignoreShowError", isSignal: true, isRequired: false, transformFunction: null }, borderError: { classPropertyName: "borderError", publicName: "borderError", isSignal: true, isRequired: false, transformFunction: null }, unitsLeft: { classPropertyName: "unitsLeft", publicName: "unitsLeft", isSignal: true, isRequired: false, transformFunction: null }, configUnitLeft: { classPropertyName: "configUnitLeft", publicName: "configUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitLeft: { classPropertyName: "keySelectedUnitLeft", publicName: "keySelectedUnitLeft", isSignal: true, isRequired: false, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, minValueNumber: { classPropertyName: "minValueNumber", publicName: "minValueNumber", isSignal: true, isRequired: false, transformFunction: null }, isBaselineStyle: { classPropertyName: "isBaselineStyle", publicName: "isBaselineStyle", isSignal: true, isRequired: false, transformFunction: null }, valuePatternShowError: { classPropertyName: "valuePatternShowError", publicName: "valuePatternShowError", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMinValue: { classPropertyName: "validMinValue", publicName: "validMinValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxValue: { classPropertyName: "validMaxValue", publicName: "validMaxValue", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validDuplicate: { classPropertyName: "validDuplicate", publicName: "validDuplicate", isSignal: true, isRequired: false, transformFunction: null }, functionValid: { classPropertyName: "functionValid", publicName: "functionValid", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, positionMessageErrorStartInput: { classPropertyName: "positionMessageErrorStartInput", publicName: "positionMessageErrorStartInput", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, templateLeftBottomInput: { classPropertyName: "templateLeftBottomInput", publicName: "templateLeftBottomInput", isSignal: true, isRequired: false, transformFunction: null }, templateRightBottomInput: { classPropertyName: "templateRightBottomInput", publicName: "templateRightBottomInput", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, autoAddZeroLessThan10InTypeInt: { classPropertyName: "autoAddZeroLessThan10InTypeInt", publicName: "autoAddZeroLessThan10InTypeInt", isSignal: true, isRequired: false, transformFunction: null }, maxLengthNumberCount: { classPropertyName: "maxLengthNumberCount", publicName: "maxLengthNumberCount", isSignal: true, isRequired: false, transformFunction: null }, classMessageErrorInclude: { classPropertyName: "classMessageErrorInclude", publicName: "classMessageErrorInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, ignoreUnitRightClassReadOnly: { classPropertyName: "ignoreUnitRightClassReadOnly", publicName: "ignoreUnitRightClassReadOnly", isSignal: true, isRequired: false, transformFunction: null }, paddingRightCustomSpecific: { classPropertyName: "paddingRightCustomSpecific", publicName: "paddingRightCustomSpecific", isSignal: true, isRequired: false, transformFunction: null }, focusTimeOut: { classPropertyName: "focusTimeOut", publicName: "focusTimeOut", isSignal: true, isRequired: false, transformFunction: null }, ignoreAddItem: { classPropertyName: "ignoreAddItem", publicName: "ignoreAddItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null }, minItems: { classPropertyName: "minItems", publicName: "minItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", outFunctionsControl: "outFunctionsControl", outRemove: "outRemove", outAddItem: "outAddItem", outClickButtonLabel: "outClickButtonLabel", outSwitchEventLabel: "outSwitchEventLabel", outLabelRightClick: "outLabelRightClick", outLabelLeftClick: "outLabelLeftClick", outValueChange: "outValueChange" }, ngImport: i0, template: "@if (fieldNameBind() && items(); as items) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [labelLeft]=\"labelConfig.labelLeft\"\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [labelLeftBehindToggleButton]=\"labelConfig.labelLeftBehindToggleButton\"\n [popover]=\"labelConfig.popover\"\n [required]=\"labelConfig.required\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [labelRightRequired]=\"labelConfig.labelRightRequired\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleSize]=\"labelConfig.toggleSize || 'default'\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [zIndexPopover]=\"labelConfig.zIndexPopover || 10\"\n [timerDestroyPopover]=\"labelConfig.timerDestroyPopover || 0\"\n [count]=\"labelConfig.count\"\n [limitLength]=\"labelConfig.limitLength\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelLeftClick)=\"handlerEventLabelLeftLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n @for (item of items; track item.uniqKey; let first = $first; let index = $index) {\n <div\n class=\"flex\"\n [style.marginTop.px]=\"!first ? formInputSpacing() : 0\">\n @if (leftTemplateItems(); as leftTemplateItems) {\n <div class=\"flex {{ leftTemplateItems.classInclude }}\">\n @for (rightItem of leftTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('template') {\n @if (item.templateLeftOutlet || templateLeftOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateLeftOutlet || templateLeftOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n <libs_ui-components-inputs-valid\n [item]=\"item\"\n [fieldNameBind]=\"fieldNameBind()\"\n [placeholder]=\"item.placeholder ?? placeholder()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType()\"\n [fixedFloat]=\"fixedFloat()\"\n [readonly]=\"readonly() || item.readonly\"\n [disable]=\"disable() || item.disable\"\n [classContainerInput]=\"classContainerInput()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [showCount]=\"showCount()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [ignoreShowError]=\"ignoreShowError()\"\n [borderError]=\"borderError()\"\n [unitsLeft]=\"item.unitsLeft || unitsLeft()\"\n [configUnitLeft]=\"item.configUnitLeft || configUnitLeft()\"\n [keySelectedUnitLeft]=\"item.keySelectedUnitLeft || keySelectedUnitLeft()\"\n [unitsRight]=\"item.unitsRight || unitsRight()\"\n [configUnitRight]=\"item.configUnitRight || configUnitRight()\"\n [keySelectedUnitRight]=\"item.keySelectedUnitRight || keySelectedUnitRight()\"\n [maxValueNumber]=\"item.maxValueNumber || maxValueNumber()\"\n [minValueNumber]=\"item.minValueNumber || minValueNumber()\"\n [isBaselineStyle]=\"isBaselineStyle()\"\n [valuePatternShowError]=\"valuePatternShowError()\"\n [validPattern]=\"validPattern()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validMinValue]=\"validMinValue()\"\n [validMaxValue]=\"validMaxValue()\"\n [validMaxLength]=\"validMaxLength()\"\n [functionValid]=\"functionValid()\"\n [maxLength]=\"item.maxLength || maxLength()\"\n [positionMessageErrorStartInput]=\"positionMessageErrorStartInput()\"\n [classInclude]=\"classInclude()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [classMessageErrorInclude]=\"classMessageErrorInclude()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [ignoreUnitRightClassReadOnly]=\"ignoreUnitRightClassReadOnly()\"\n [paddingRightCustomSpecific]=\"paddingRightCustomSpecific()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (outValueChange)=\"handlerValueChange($event, item)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event, item)\" />\n\n @if (rightTemplateItems(); as rightTemplateItems) {\n <div\n class=\"flex items-center {{ rightTemplateItems.classInclude }}\"\n [style.height.px]=\"defaultHeight() || 32\">\n @for (rightItem of rightTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('remove') {\n @if (!ignoreRemove() && !item.ignoreRemove && items.length > minItems()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-remove mr-[0px]'\"\n classInclude=\"libs-ui-icon-hover-danger !p-[2px] ml-[16px] {{ rightItem.classInclude }}\"\n (outClick)=\"handlerRemove($event, item, index)\" />\n }\n }\n\n @case ('template') {\n @if (item.templateRightOutlet || templateRightOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateRightOutlet || templateRightOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n </div>\n }\n}\n\n@if (!ignoreAddItem() && (!maxItems() || items().length < maxItems())) {\n <libs_ui-components-buttons-button\n [type]=\"addItemButtonConfig()?.type || 'button-link-primary'\"\n [label]=\"addItemButtonConfig()?.label || 'i18n_add_new'\"\n [classLabel]=\"addItemButtonConfig()?.classLabel || 'libs-uifont-head-5m'\"\n [classIconLeft]=\"addItemButtonConfig()?.classIconLeft || 'libs-ui-icon-add text-[10px] mr-[8px]'\"\n [classInclude]=\"addItemButtonConfig()?.classInclude || '!pb-0 !pl-0 !py-[2px] mt-[8px]'\"\n [disable]=\"disable() || false\"\n (outClick)=\"handlerAddItem($event)\" />\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
250
|
+
}
|
|
251
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsAddComponent, decorators: [{
|
|
252
|
+
type: Component,
|
|
253
|
+
args: [{ selector: 'libs_ui-components-inputs-add', standalone: true, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsInputsValidComponent, LibsUiComponentsLabelComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (fieldNameBind() && items(); as items) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [labelLeft]=\"labelConfig.labelLeft\"\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [labelLeftBehindToggleButton]=\"labelConfig.labelLeftBehindToggleButton\"\n [popover]=\"labelConfig.popover\"\n [required]=\"labelConfig.required\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [labelRightRequired]=\"labelConfig.labelRightRequired\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleSize]=\"labelConfig.toggleSize || 'default'\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [zIndexPopover]=\"labelConfig.zIndexPopover || 10\"\n [timerDestroyPopover]=\"labelConfig.timerDestroyPopover || 0\"\n [count]=\"labelConfig.count\"\n [limitLength]=\"labelConfig.limitLength\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelLeftClick)=\"handlerEventLabelLeftLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n @for (item of items; track item.uniqKey; let first = $first; let index = $index) {\n <div\n class=\"flex\"\n [style.marginTop.px]=\"!first ? formInputSpacing() : 0\">\n @if (leftTemplateItems(); as leftTemplateItems) {\n <div class=\"flex {{ leftTemplateItems.classInclude }}\">\n @for (rightItem of leftTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('template') {\n @if (item.templateLeftOutlet || templateLeftOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateLeftOutlet || templateLeftOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n <libs_ui-components-inputs-valid\n [item]=\"item\"\n [fieldNameBind]=\"fieldNameBind()\"\n [placeholder]=\"item.placeholder ?? placeholder()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType()\"\n [fixedFloat]=\"fixedFloat()\"\n [readonly]=\"readonly() || item.readonly\"\n [disable]=\"disable() || item.disable\"\n [classContainerInput]=\"classContainerInput()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [showCount]=\"showCount()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [ignoreShowError]=\"ignoreShowError()\"\n [borderError]=\"borderError()\"\n [unitsLeft]=\"item.unitsLeft || unitsLeft()\"\n [configUnitLeft]=\"item.configUnitLeft || configUnitLeft()\"\n [keySelectedUnitLeft]=\"item.keySelectedUnitLeft || keySelectedUnitLeft()\"\n [unitsRight]=\"item.unitsRight || unitsRight()\"\n [configUnitRight]=\"item.configUnitRight || configUnitRight()\"\n [keySelectedUnitRight]=\"item.keySelectedUnitRight || keySelectedUnitRight()\"\n [maxValueNumber]=\"item.maxValueNumber || maxValueNumber()\"\n [minValueNumber]=\"item.minValueNumber || minValueNumber()\"\n [isBaselineStyle]=\"isBaselineStyle()\"\n [valuePatternShowError]=\"valuePatternShowError()\"\n [validPattern]=\"validPattern()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validMinValue]=\"validMinValue()\"\n [validMaxValue]=\"validMaxValue()\"\n [validMaxLength]=\"validMaxLength()\"\n [functionValid]=\"functionValid()\"\n [maxLength]=\"item.maxLength || maxLength()\"\n [positionMessageErrorStartInput]=\"positionMessageErrorStartInput()\"\n [classInclude]=\"classInclude()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [classMessageErrorInclude]=\"classMessageErrorInclude()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [ignoreUnitRightClassReadOnly]=\"ignoreUnitRightClassReadOnly()\"\n [paddingRightCustomSpecific]=\"paddingRightCustomSpecific()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (outValueChange)=\"handlerValueChange($event, item)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event, item)\" />\n\n @if (rightTemplateItems(); as rightTemplateItems) {\n <div\n class=\"flex items-center {{ rightTemplateItems.classInclude }}\"\n [style.height.px]=\"defaultHeight() || 32\">\n @for (rightItem of rightTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('remove') {\n @if (!ignoreRemove() && !item.ignoreRemove && items.length > minItems()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-remove mr-[0px]'\"\n classInclude=\"libs-ui-icon-hover-danger !p-[2px] ml-[16px] {{ rightItem.classInclude }}\"\n (outClick)=\"handlerRemove($event, item, index)\" />\n }\n }\n\n @case ('template') {\n @if (item.templateRightOutlet || templateRightOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateRightOutlet || templateRightOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n </div>\n }\n}\n\n@if (!ignoreAddItem() && (!maxItems() || items().length < maxItems())) {\n <libs_ui-components-buttons-button\n [type]=\"addItemButtonConfig()?.type || 'button-link-primary'\"\n [label]=\"addItemButtonConfig()?.label || 'i18n_add_new'\"\n [classLabel]=\"addItemButtonConfig()?.classLabel || 'libs-uifont-head-5m'\"\n [classIconLeft]=\"addItemButtonConfig()?.classIconLeft || 'libs-ui-icon-add text-[10px] mr-[8px]'\"\n [classInclude]=\"addItemButtonConfig()?.classInclude || '!pb-0 !pl-0 !py-[2px] mt-[8px]'\"\n [disable]=\"disable() || false\"\n (outClick)=\"handlerAddItem($event)\" />\n}\n" }]
|
|
254
|
+
}] });
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Generated bundle index. Do not edit.
|
|
258
|
+
*/
|
|
259
|
+
|
|
260
|
+
export { LibsUiComponentsInputsAddComponent };
|
|
261
|
+
//# sourceMappingURL=libs-ui-components-inputs-add.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libs-ui-components-inputs-add.mjs","sources":["../../../../../../libs-ui/components/inputs/add/src/defines/add.define.ts","../../../../../../libs-ui/components/inputs/add/src/add.component.ts","../../../../../../libs-ui/components/inputs/add/src/add.component.html","../../../../../../libs-ui/components/inputs/add/src/libs-ui-components-inputs-add.ts"],"sourcesContent":["import { ITemplateRightLeftItem } from '../interfaces/input-add.interface';\n\nexport const rightTemplateItems = (): ITemplateRightLeftItem => {\n return {\n classInclude: '',\n items: [\n {\n type: 'remove',\n classInclude: '',\n },\n {\n type: 'template',\n classInclude: '',\n },\n ],\n };\n};\n\nexport const leftTemplateItems = (): ITemplateRightLeftItem => {\n return {\n classInclude: '',\n items: [\n {\n type: 'remove',\n classInclude: '',\n },\n {\n type: 'template',\n classInclude: '',\n },\n ],\n };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, model, OnInit, output, signal, TemplateRef } from '@angular/core';\nimport { IButton, LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IInputValidFunctionControlEvent, IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, LibsUiComponentsInputsValidComponent, TYPE_FUNCTION_INPUT_VALID } from '@libs-ui/components-inputs-valid';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { ISwitchEvent } from '@libs-ui/components-switch';\nimport { IMessageTranslate, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { cloneDeep, uuid } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { leftTemplateItems, rightTemplateItems } from './defines/add.define';\nimport { IEmitValueChange, IInputAdd, ITemplateRightLeftItem } from './interfaces';\nimport { IInputAddFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { TYPE_DATA_TYPE_INPUT, TYPE_INPUT, TYPE_TAG_INPUT } from '@libs-ui/components-inputs-input';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-add',\n templateUrl: './add.component.html',\n styleUrls: ['./add.component.scss'],\n standalone: true,\n imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsInputsValidComponent, LibsUiComponentsLabelComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsAddComponent implements OnInit {\n // #region PROPERTY\n private timeOutKeyUp = signal<number>(0);\n\n // #region INPUT\n readonly fieldNameBind = input.required<string>();\n readonly items = model.required<Array<IInputAdd>>();\n readonly readonly = input<boolean>(false);\n readonly disable = input<boolean>(false);\n readonly addItemButtonConfig = input<IButton>();\n readonly placeholder = input<string>();\n readonly labelConfig = input<ILabel>();\n readonly formInputSpacing = input<number>(8); // khoảng cách giữa hai ô input\n readonly configItemAddToItems = input<IInputAdd>();\n readonly rightTemplateItems = input<ITemplateRightLeftItem>(rightTemplateItems());\n readonly leftTemplateItems = input<ITemplateRightLeftItem>(leftTemplateItems());\n readonly templateLeftOutlet = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly templateRightOutlet = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly classIncludeInput = input<string>();\n readonly classContainerInput = input<string>();\n readonly showCount = input<boolean>();\n readonly ignoreValidEmptyField = input<boolean>(); // chỉ cần có ít nhất 1 field có giá trị là valid\n\n readonly emitEmptyInDataTypeNumber = input<boolean>();\n readonly tagInput = input<TYPE_TAG_INPUT>();\n readonly dataType = input<TYPE_DATA_TYPE_INPUT>();\n readonly typeInput = input<TYPE_INPUT>();\n readonly fixedFloat = input<number>();\n readonly acceptNegativeValue = input<boolean>();\n readonly valueUpDownNumber = input<number | undefined>();\n readonly resetAutoCompletePassword = input<boolean>();\n readonly noBorder = input<boolean>();\n readonly backgroundNone = input<boolean>();\n readonly useColorModeExist = input<boolean>();\n readonly keepPlaceholderOnly = input<boolean>();\n\n readonly classContainerBottomInput = input<string>();\n readonly autoRemoveEmoji = input<boolean>();\n readonly defaultHeight = input<number>();\n readonly ignoreShowError = input<boolean>();\n readonly borderError = input<boolean>();\n\n readonly unitsLeft = input<Array<any>>();\n readonly configUnitLeft = input<IInputValidUnitConfig>({\n fieldKey: 'id',\n fieldLabel: 'label',\n });\n readonly keySelectedUnitLeft = input<any>();\n\n readonly unitsRight = input<Array<any>>();\n readonly configUnitRight = input<IInputValidUnitConfig>({\n fieldKey: 'id',\n fieldLabel: 'label',\n });\n readonly keySelectedUnitRight = input<any>();\n\n readonly maxValueNumber = input<number>();\n readonly minValueNumber = input<number>();\n readonly isBaselineStyle = input<boolean>(); // align-items-baseline dùng khi căn input thẳng hàng với tất cả các phần khác dù có validate hay bất cứ 1 cái gì\n\n readonly valuePatternShowError = input<boolean>(); // mặc định khi test pattern trả tề giá trị bằng false sẽ báo lỗi\n readonly validPattern = input<Array<IValidPattern>>();\n readonly validRequired = input<IValidRequired>();\n readonly validMinLength = input<IValidLength>();\n readonly validMinValue = input<IMessageTranslate>();\n readonly validMaxValue = input<IMessageTranslate>();\n readonly validMaxLength = input<IMessageTranslate>();\n readonly validDuplicate = input<IMessageTranslate>();\n readonly functionValid = input<TYPE_FUNCTION_INPUT_VALID>();\n readonly maxLength = input<number>();\n readonly positionMessageErrorStartInput = input<boolean>(); // khi có template left và right mà muốn mesage error xuất hiện bắt đầu từ ô input thay vì bắt đầu từ template trái\n readonly classInclude = input<string>();\n readonly resize = input<'auto' | 'none'>();\n readonly templateLeftBottomInput = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly templateRightBottomInput = input<TemplateRef<TYPE_TEMPLATE_REF>>();\n readonly onlyAcceptNegativeValue = input<boolean>();\n readonly autoAddZeroLessThan10InTypeInt = input<boolean>();\n readonly maxLengthNumberCount = input<number>();\n readonly classMessageErrorInclude = input<string>();\n readonly ignoreStopPropagationEvent = input<boolean>();\n readonly ignoreUnitRightClassReadOnly = input<boolean>();\n readonly paddingRightCustomSpecific = input<number>(); // fix paddingRight count ko auto tính #52185\n readonly focusTimeOut = input<number>();\n\n readonly ignoreAddItem = input<boolean>(false);\n readonly ignoreRemove = input<boolean>(false);\n readonly maxItems = input<number>(5); // số lượng input tối đa\n readonly minItems = input<number>(1); // không được phép xóa nếu số lượng items <= minItems.length\n\n // #region OUTPUT\n readonly outFunctionsControl = output<IInputAddFunctionControlEvent>();\n readonly outRemove = output<IInputAdd>();\n readonly outAddItem = output<IInputAdd>();\n readonly outClickButtonLabel = output<IButton>();\n readonly outSwitchEventLabel = output<ISwitchEvent>();\n readonly outLabelRightClick = output<boolean>();\n readonly outLabelLeftClick = output<MouseEvent>();\n readonly outValueChange = output<IEmitValueChange>();\n\n ngOnInit() {\n if (!this.items().length) {\n this.items.set([{ [this.fieldNameBind()]: '' }]);\n }\n\n this.items.update((items) =>\n items.map((item) => {\n return { ...item, uniqKey: uuid() };\n })\n );\n\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): IInputAddFunctionControlEvent {\n return {\n checkIsValid: this.checkIsValid.bind(this),\n setMessageError: this.setMessageError.bind(this),\n };\n }\n\n private async setMessageError(message: string) {\n for (const item of this.items()) {\n await item.functionControl?.setMessageError(message);\n }\n }\n\n private async checkIsValid(checkValidRequired = true, currentItem?: IInputAdd): Promise<boolean> {\n let valid = true;\n\n if (this.disable() || this.readonly()) {\n return true;\n }\n\n for (const input of this.items()) {\n if (input.readonly || input.disable) {\n continue;\n }\n\n if (checkValidRequired && !(await this.checkValidRequired(input))) {\n valid = false;\n continue;\n }\n\n if (currentItem?.uniqKey === input.uniqKey) {\n valid = (await input.functionControl?.checkIsValid()) ?? false;\n }\n\n if (!this.validDuplicate()) {\n continue;\n }\n\n if (!input[this.fieldNameBind()]) {\n continue;\n }\n\n if (typeof input[this.fieldNameBind()] === 'string' && !input[this.fieldNameBind()].trim()) {\n continue;\n }\n\n const fieldsDuplicate = this.items().filter((element) => element[this.fieldNameBind()] === input[this.fieldNameBind()]);\n if (!fieldsDuplicate || !fieldsDuplicate.length) {\n input.functionControl?.setMessageError('');\n\n continue;\n }\n\n if (fieldsDuplicate.length < 2) {\n input.functionControl?.setMessageError('');\n\n continue;\n }\n valid = false;\n input.functionControl?.setMessageError(this.validDuplicate()?.message || 'i18n_valid_duplicate_msg');\n }\n\n return valid;\n }\n\n private async checkValidRequired(input: IInputAdd) {\n let valid = true;\n const validIfAtLeastOneValue = this.ignoreValidEmptyField() && this.items().find((item) => !!item[this.fieldNameBind()]?.trim());\n\n if (validIfAtLeastOneValue) {\n input.functionControl?.setMessageError('');\n return true;\n }\n\n if (!(await input.functionControl?.checkIsValid())) {\n valid = false;\n }\n\n return valid;\n }\n\n protected handlerAddItem(event: Event) {\n event.stopPropagation();\n\n if (!this.configItemAddToItems()) {\n const newItem: IInputAdd = { uniqKey: uuid(), [this.fieldNameBind()]: '' };\n this.items.update((items) => [...items, newItem]);\n this.outAddItem.emit(newItem);\n\n return;\n }\n const newItem: IInputAdd = { ...cloneDeep(this.configItemAddToItems), uniqKey: uuid(), [this.fieldNameBind()]: '' };\n this.items.update((items) => [...items, newItem]);\n this.outAddItem.emit(newItem);\n }\n\n protected handlerRemove(event: Event, item: IInputAdd, index: number) {\n event.stopPropagation();\n this.items.update((currentItems) => currentItems.filter((_, i) => i !== index));\n this.outRemove.emit(item);\n this.timeOutKeyUp.set(\n setTimeout(() => {\n clearTimeout(this.timeOutKeyUp());\n this.checkIsValid(false);\n }, 250)\n );\n }\n\n protected handlerClickButtonLabel(button: IButton) {\n this.outClickButtonLabel.emit(button);\n }\n\n protected handlerSwitchLabel(event: ISwitchEvent) {\n this.outSwitchEventLabel.emit(event);\n }\n\n protected handlerEventLabelLeftLabel(event: MouseEvent) {\n this.outLabelLeftClick.emit(event);\n }\n\n protected handlerEventLabelRightLabel() {\n this.outLabelRightClick.emit(true);\n }\n\n protected handlerFunctionsControl(event: IInputValidFunctionControlEvent, item: IInputAdd) {\n item.functionControl = event;\n }\n\n protected handlerValueChange(value: string | number, item: IInputAdd) {\n item[this.fieldNameBind()] = value;\n\n this.outValueChange.emit({ value, item });\n\n this.timeOutKeyUp.set(\n setTimeout(() => {\n clearTimeout(this.timeOutKeyUp());\n this.checkIsValid(false, item);\n }, 250)\n );\n }\n}\n","@if (fieldNameBind() && items(); as items) {\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [labelLeft]=\"labelConfig.labelLeft\"\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [labelLeftBehindToggleButton]=\"labelConfig.labelLeftBehindToggleButton\"\n [popover]=\"labelConfig.popover\"\n [required]=\"labelConfig.required\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [labelRightRequired]=\"labelConfig.labelRightRequired\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleSize]=\"labelConfig.toggleSize || 'default'\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable\"\n [description]=\"labelConfig.description\"\n [descriptionClass]=\"labelConfig.descriptionClass\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [zIndexPopover]=\"labelConfig.zIndexPopover || 10\"\n [timerDestroyPopover]=\"labelConfig.timerDestroyPopover || 0\"\n [count]=\"labelConfig.count\"\n [limitLength]=\"labelConfig.limitLength\"\n (outClickButton)=\"handlerClickButtonLabel($event)\"\n (outSwitchEvent)=\"handlerSwitchLabel($event)\"\n (outLabelLeftClick)=\"handlerEventLabelLeftLabel($event)\"\n (outLabelRightClick)=\"handlerEventLabelRightLabel()\" />\n }\n @for (item of items; track item.uniqKey; let first = $first; let index = $index) {\n <div\n class=\"flex\"\n [style.marginTop.px]=\"!first ? formInputSpacing() : 0\">\n @if (leftTemplateItems(); as leftTemplateItems) {\n <div class=\"flex {{ leftTemplateItems.classInclude }}\">\n @for (rightItem of leftTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('template') {\n @if (item.templateLeftOutlet || templateLeftOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateLeftOutlet || templateLeftOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n <libs_ui-components-inputs-valid\n [item]=\"item\"\n [fieldNameBind]=\"fieldNameBind()\"\n [placeholder]=\"item.placeholder ?? placeholder()\"\n [emitEmptyInDataTypeNumber]=\"emitEmptyInDataTypeNumber()\"\n [tagInput]=\"tagInput()\"\n [dataType]=\"dataType()\"\n [fixedFloat]=\"fixedFloat()\"\n [readonly]=\"readonly() || item.readonly\"\n [disable]=\"disable() || item.disable\"\n [classContainerInput]=\"classContainerInput()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [showCount]=\"showCount()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n [noBorder]=\"noBorder()\"\n [backgroundNone]=\"backgroundNone()\"\n [useColorModeExist]=\"useColorModeExist()\"\n [keepPlaceholderOnly]=\"keepPlaceholderOnly()\"\n [classContainerBottomInput]=\"classContainerBottomInput()\"\n [autoRemoveEmoji]=\"autoRemoveEmoji()\"\n [defaultHeight]=\"defaultHeight()\"\n [ignoreShowError]=\"ignoreShowError()\"\n [borderError]=\"borderError()\"\n [unitsLeft]=\"item.unitsLeft || unitsLeft()\"\n [configUnitLeft]=\"item.configUnitLeft || configUnitLeft()\"\n [keySelectedUnitLeft]=\"item.keySelectedUnitLeft || keySelectedUnitLeft()\"\n [unitsRight]=\"item.unitsRight || unitsRight()\"\n [configUnitRight]=\"item.configUnitRight || configUnitRight()\"\n [keySelectedUnitRight]=\"item.keySelectedUnitRight || keySelectedUnitRight()\"\n [maxValueNumber]=\"item.maxValueNumber || maxValueNumber()\"\n [minValueNumber]=\"item.minValueNumber || minValueNumber()\"\n [isBaselineStyle]=\"isBaselineStyle()\"\n [valuePatternShowError]=\"valuePatternShowError()\"\n [validPattern]=\"validPattern()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validMinValue]=\"validMinValue()\"\n [validMaxValue]=\"validMaxValue()\"\n [validMaxLength]=\"validMaxLength()\"\n [functionValid]=\"functionValid()\"\n [maxLength]=\"item.maxLength || maxLength()\"\n [positionMessageErrorStartInput]=\"positionMessageErrorStartInput()\"\n [classInclude]=\"classInclude()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [autoAddZeroLessThan10InTypeInt]=\"autoAddZeroLessThan10InTypeInt()\"\n [maxLengthNumberCount]=\"maxLengthNumberCount()\"\n [classMessageErrorInclude]=\"classMessageErrorInclude()\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [ignoreUnitRightClassReadOnly]=\"ignoreUnitRightClassReadOnly()\"\n [paddingRightCustomSpecific]=\"paddingRightCustomSpecific()\"\n [focusTimeOut]=\"focusTimeOut()\"\n (outValueChange)=\"handlerValueChange($event, item)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event, item)\" />\n\n @if (rightTemplateItems(); as rightTemplateItems) {\n <div\n class=\"flex items-center {{ rightTemplateItems.classInclude }}\"\n [style.height.px]=\"defaultHeight() || 32\">\n @for (rightItem of rightTemplateItems.items; track $index) {\n @switch (rightItem.type) {\n @case ('remove') {\n @if (!ignoreRemove() && !item.ignoreRemove && items.length > minItems()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-remove mr-[0px]'\"\n classInclude=\"libs-ui-icon-hover-danger !p-[2px] ml-[16px] {{ rightItem.classInclude }}\"\n (outClick)=\"handlerRemove($event, item, index)\" />\n }\n }\n\n @case ('template') {\n @if (item.templateRightOutlet || templateRightOutlet()) {\n <ng-container *ngTemplateOutlet=\"item.templateRightOutlet || templateRightOutlet() || null; context: { item: item, index: index }\" />\n }\n }\n }\n }\n </div>\n }\n </div>\n }\n}\n\n@if (!ignoreAddItem() && (!maxItems() || items().length < maxItems())) {\n <libs_ui-components-buttons-button\n [type]=\"addItemButtonConfig()?.type || 'button-link-primary'\"\n [label]=\"addItemButtonConfig()?.label || 'i18n_add_new'\"\n [classLabel]=\"addItemButtonConfig()?.classLabel || 'libs-uifont-head-5m'\"\n [classIconLeft]=\"addItemButtonConfig()?.classIconLeft || 'libs-ui-icon-add text-[10px] mr-[8px]'\"\n [classInclude]=\"addItemButtonConfig()?.classInclude || '!pb-0 !pl-0 !py-[2px] mt-[8px]'\"\n [disable]=\"disable() || false\"\n (outClick)=\"handlerAddItem($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,41 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import { IInputValidFunctionControlEvent, IInputValidUnitConfig } from '@libs-ui/components-inputs-valid';
|
|
3
|
+
import { ILabel } from '@libs-ui/components-label';
|
|
4
|
+
import { TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';
|
|
5
|
+
export interface IInputAddConfig {
|
|
6
|
+
count?: number;
|
|
7
|
+
maxCount?: number;
|
|
8
|
+
classCircle?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface IInputAdd extends Record<string, any> {
|
|
11
|
+
uniqKey?: string;
|
|
12
|
+
disable?: boolean;
|
|
13
|
+
readonly?: boolean;
|
|
14
|
+
ignoreRemove?: boolean;
|
|
15
|
+
labelConfig?: ILabel;
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
maxValueNumber?: number;
|
|
18
|
+
minValueNumber?: number;
|
|
19
|
+
maxLength?: number;
|
|
20
|
+
unitsLeft?: Array<any>;
|
|
21
|
+
configUnitLeft?: IInputValidUnitConfig;
|
|
22
|
+
keySelectedUnitLeft?: any;
|
|
23
|
+
unitsRight?: Array<any>;
|
|
24
|
+
configUnitRight?: IInputValidUnitConfig;
|
|
25
|
+
keySelectedUnitRight?: any;
|
|
26
|
+
templateLeftOutlet?: TemplateRef<TYPE_TEMPLATE_REF>;
|
|
27
|
+
templateRightOutlet?: TemplateRef<TYPE_TEMPLATE_REF>;
|
|
28
|
+
functionControl?: IInputValidFunctionControlEvent;
|
|
29
|
+
[key: string]: any;
|
|
30
|
+
}
|
|
31
|
+
export interface ITemplateRightLeftItem {
|
|
32
|
+
classInclude?: string;
|
|
33
|
+
items: Array<{
|
|
34
|
+
type: 'remove' | 'template';
|
|
35
|
+
classInclude?: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface IEmitValueChange {
|
|
39
|
+
value: string | number;
|
|
40
|
+
item: IInputAdd;
|
|
41
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@libs-ui/components-inputs-add",
|
|
3
|
+
"version": "0.1.1-1",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": ">=18.0.0",
|
|
6
|
+
"@angular/core": ">=18.0.0",
|
|
7
|
+
"@libs-ui/components-buttons-button": "0.1.1-1",
|
|
8
|
+
"@libs-ui/components-inputs-valid": "0.1.1-1",
|
|
9
|
+
"@libs-ui/components-label": "0.1.1-1",
|
|
10
|
+
"@libs-ui/components-switch": "0.1.1-1",
|
|
11
|
+
"@libs-ui/interfaces-types": "0.1.1-1",
|
|
12
|
+
"@libs-ui/utils": "0.1.1-1",
|
|
13
|
+
"@ngx-translate/core": "^15.0.0",
|
|
14
|
+
"@libs-ui/components-inputs-input": "0.1.1-1"
|
|
15
|
+
},
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"module": "fesm2022/libs-ui-components-inputs-add.mjs",
|
|
18
|
+
"typings": "index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
"./package.json": {
|
|
21
|
+
"default": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./index.d.ts",
|
|
25
|
+
"esm2022": "./esm2022/libs-ui-components-inputs-add.mjs",
|
|
26
|
+
"esm": "./esm2022/libs-ui-components-inputs-add.mjs",
|
|
27
|
+
"default": "./fesm2022/libs-ui-components-inputs-add.mjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"tslib": "^2.3.0"
|
|
32
|
+
}
|
|
33
|
+
}
|