@ngil/form-cva 0.1.0

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.
@@ -0,0 +1,341 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, EventEmitter, Input, Output, Optional, NgModule, forwardRef } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { FormGroup, FormArray, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
5
+ import { Subject, takeUntil, BehaviorSubject, combineLatest } from 'rxjs';
6
+ import { takeUntil as takeUntil$1 } from 'rxjs/operators';
7
+ import { CommonModule } from '@angular/common';
8
+
9
+ /**
10
+ *
11
+ */
12
+ class AbstractFormArrayComponent {
13
+ constructor() {
14
+ this.destroy$ = new Subject();
15
+ this.formGroup = new FormGroup({
16
+ formArray: this.createFormArray()
17
+ });
18
+ }
19
+ get formArray() {
20
+ return this.formGroup.controls.formArray;
21
+ }
22
+ ngAfterViewInit() {
23
+ this.listenValueChanges();
24
+ }
25
+ listenValueChanges() {
26
+ this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {
27
+ if (this.onChange) {
28
+ this.onChange(this.formArray.getRawValue());
29
+ }
30
+ });
31
+ }
32
+ registerOnChange(fn) {
33
+ this.onChange = fn;
34
+ }
35
+ registerOnTouched(fn) {
36
+ this.onTouched = fn;
37
+ }
38
+ writeValue(items) {
39
+ this.prepareControls(items);
40
+ if (items) {
41
+ this.formArray.patchValue(items, { emitEvent: false });
42
+ }
43
+ else {
44
+ this.formArray.reset(undefined, { emitEvent: false });
45
+ }
46
+ }
47
+ setDisabledState(isDisabled) {
48
+ isDisabled ? this.formGroup.disable({ emitEvent: false }) : this.formGroup.enable({ emitEvent: false });
49
+ }
50
+ validate() {
51
+ if (this.formArray.invalid) {
52
+ return { invalidFormArray: true };
53
+ }
54
+ return null;
55
+ }
56
+ prepareControls(items) {
57
+ items = items || [];
58
+ if (this.formArray.value.length < items.length) {
59
+ this.addExtraControls(items);
60
+ }
61
+ if (this.formArray.value.length > items.length) {
62
+ this.removeExtraControls(items);
63
+ }
64
+ }
65
+ addExtraControls(items) {
66
+ items.forEach((item, index) => {
67
+ const control = this.formArray.at(index);
68
+ if (!control) {
69
+ this.formArray.push(this.createFormArrayItem(item));
70
+ }
71
+ });
72
+ }
73
+ removeExtraControls(items) {
74
+ let formArrayIndex = 0;
75
+ this.formArray.value.forEach((item, index) => {
76
+ if (!items[index]) {
77
+ this.formArray.removeAt(formArrayIndex);
78
+ }
79
+ else {
80
+ formArrayIndex++;
81
+ }
82
+ });
83
+ }
84
+ ngOnDestroy() {
85
+ this.destroy$.next();
86
+ this.destroy$.complete();
87
+ }
88
+ }
89
+ AbstractFormArrayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractFormArrayComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
90
+ AbstractFormArrayComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: AbstractFormArrayComponent, ngImport: i0 });
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractFormArrayComponent, decorators: [{
92
+ type: Directive
93
+ }] });
94
+
95
+ class AbstractFormComponent {
96
+ constructor() {
97
+ this.submitted = new EventEmitter();
98
+ this.destroy$ = new Subject();
99
+ }
100
+ get isSubmitDisabled() {
101
+ return !this.form.valid || this.form.pristine;
102
+ }
103
+ get isCancelDisabled() {
104
+ return !this.form.dirty;
105
+ }
106
+ getFormDefaultValue(model) {
107
+ return model;
108
+ }
109
+ ngOnInit() {
110
+ this.form.patchValue(this.getFormDefaultValue(this.formViewModel) || {}, { emitEvent: false });
111
+ }
112
+ submit() {
113
+ if (!this.isSubmitDisabled) {
114
+ this.submitted.emit({
115
+ ...this.formViewModel,
116
+ ...this.form.value
117
+ });
118
+ }
119
+ else {
120
+ Object.values(this.form.controls).forEach(control => control.updateValueAndValidity());
121
+ }
122
+ }
123
+ cancel() {
124
+ if (!this.isCancelDisabled) {
125
+ this.form.reset(this.getFormDefaultValue(this.formViewModel), { emitEvent: false });
126
+ this.form.markAsPristine();
127
+ this.form.markAsUntouched();
128
+ }
129
+ }
130
+ ngOnDestroy() {
131
+ this.destroy$.next();
132
+ this.destroy$.complete();
133
+ }
134
+ }
135
+ AbstractFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
136
+ AbstractFormComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: AbstractFormComponent, inputs: { formViewModel: "formViewModel" }, outputs: { submitted: "submitted" }, ngImport: i0 });
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractFormComponent, decorators: [{
138
+ type: Directive
139
+ }], propDecorators: { formViewModel: [{
140
+ type: Input
141
+ }], submitted: [{
142
+ type: Output
143
+ }] } });
144
+
145
+ /**
146
+ * This class implements ControlValueAccessor logic for a FormGroup.
147
+ * NG_VALUE_ACCESSOR and NG_VALIDATORS must be provided in the component.
148
+ *
149
+ * The FormGroup changes will be automatically change the parent FormControl value.
150
+ *
151
+ * Example:
152
+
153
+ */
154
+ class AbstractFormGroupComponent {
155
+ constructor() {
156
+ this.destroy$ = new Subject();
157
+ }
158
+ ngAfterViewInit() {
159
+ this.listenValueChanges();
160
+ }
161
+ listenValueChanges() {
162
+ this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {
163
+ if (this.onChange) {
164
+ this.onChange(this.formGroup.getRawValue());
165
+ }
166
+ });
167
+ }
168
+ registerOnChange(fn) {
169
+ this.onChange = fn;
170
+ }
171
+ registerOnTouched(fn) {
172
+ this.onTouched = fn;
173
+ }
174
+ writeValue(formValue) {
175
+ if (formValue) {
176
+ this.formGroup.patchValue(formValue, { emitEvent: false });
177
+ }
178
+ else {
179
+ this.formGroup.reset(undefined, { emitEvent: false });
180
+ }
181
+ }
182
+ setDisabledState(isDisabled) {
183
+ isDisabled ? this.formGroup.disable({ emitEvent: false }) : this.formGroup.enable({ emitEvent: false });
184
+ }
185
+ validate() {
186
+ if (this.formGroup.invalid) {
187
+ return { invalidFormGroup: true };
188
+ }
189
+ return null;
190
+ }
191
+ ngOnDestroy() {
192
+ this.destroy$.next();
193
+ this.destroy$.complete();
194
+ }
195
+ }
196
+ AbstractFormGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractFormGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
197
+ AbstractFormGroupComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: AbstractFormGroupComponent, ngImport: i0 });
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractFormGroupComponent, decorators: [{
199
+ type: Directive
200
+ }] });
201
+
202
+ const errorMessages = {
203
+ required: '{{fieldName}} is required.',
204
+ max: 'Maximum {{fieldName}} is {{max}}.',
205
+ min: 'Minimum {{fieldName}} is {{min}}.',
206
+ maxlength: '{{fieldName}} can be max {{requiredLength}} characters long.',
207
+ minlength: '{{fieldName}} must be at least {{requiredLength}} characters long.',
208
+ email: '{{fieldName}} must be an email.'
209
+ };
210
+ function getErrorMessage(errorKey, replacements) {
211
+ if (!errorMessages[errorKey]) {
212
+ return `Missing error message to the error with key ${errorKey}`;
213
+ }
214
+ return errorMessages[errorKey].replace(/{{(\w+)}}/g, (placeholderWithDelimiters, placeholderWithoutDelimiters) => replacements[placeholderWithoutDelimiters] ? replacements[placeholderWithoutDelimiters] : placeholderWithDelimiters);
215
+ }
216
+
217
+ class AbstractInputComponent {
218
+ set errorMessage(errorMessage) {
219
+ this.errorMessage$.next(errorMessage);
220
+ }
221
+ constructor(controlContainer) {
222
+ this.controlContainer = controlContainer;
223
+ this.formControlName = '';
224
+ this.label = '';
225
+ this.readonly = false;
226
+ this.required = false;
227
+ this.disabled = false;
228
+ this.destroy$ = new Subject();
229
+ this.errorMessage$ = new BehaviorSubject('');
230
+ this.model$ = combineLatest({
231
+ errorMessage: this.errorMessage$
232
+ });
233
+ }
234
+ ngOnInit() {
235
+ if (this.controlContainer?.control instanceof FormArray) {
236
+ this.parentControl = this.controlContainer?.control.at(+this.formControlName);
237
+ }
238
+ else {
239
+ this.parentControl = this.controlContainer?.control?.get(this.formControlName);
240
+ }
241
+ this.setRequiredState();
242
+ this.listenStatusChanges();
243
+ }
244
+ setRequiredState() {
245
+ if (!this.parentControl || !this.parentControl?.validator) {
246
+ return;
247
+ }
248
+ const validators = this.parentControl?.validator({ value: '' });
249
+ if (validators && Object.keys(validators).includes('required')) {
250
+ this.required = true;
251
+ }
252
+ }
253
+ onBlur() {
254
+ if (this.onTouched) {
255
+ this.onTouched();
256
+ }
257
+ this.setErrors();
258
+ }
259
+ registerOnChange(fn) {
260
+ this.onChange = fn;
261
+ }
262
+ registerOnTouched(fn) {
263
+ this.onTouched = fn;
264
+ }
265
+ setDisabledState(isDisabled) {
266
+ this.disabled = isDisabled;
267
+ }
268
+ listenStatusChanges() {
269
+ this.parentControl?.statusChanges.pipe(takeUntil$1(this.destroy$)).subscribe(() => this.setErrors());
270
+ }
271
+ setErrors() {
272
+ if (this.parentControl?.errors) {
273
+ const errorKey = Object.keys(this.parentControl?.errors)[0];
274
+ const errorObj = this.parentControl?.errors[`${errorKey}`];
275
+ this.errorMessage$.next(getErrorMessage(errorKey, {
276
+ fieldName: this.label,
277
+ ...errorObj
278
+ }));
279
+ }
280
+ else {
281
+ this.errorMessage$.next('');
282
+ }
283
+ }
284
+ ngOnDestroy() {
285
+ this.destroy$.next();
286
+ this.destroy$.complete();
287
+ }
288
+ }
289
+ AbstractInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractInputComponent, deps: [{ token: i1.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
290
+ AbstractInputComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: AbstractInputComponent, inputs: { formControlName: "formControlName", errorMessage: "errorMessage", label: "label", readonly: "readonly", required: "required", disabled: "disabled" }, ngImport: i0 });
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AbstractInputComponent, decorators: [{
292
+ type: Directive
293
+ }], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
294
+ type: Optional
295
+ }] }]; }, propDecorators: { formControlName: [{
296
+ type: Input
297
+ }], errorMessage: [{
298
+ type: Input
299
+ }], label: [{
300
+ type: Input
301
+ }], readonly: [{
302
+ type: Input
303
+ }], required: [{
304
+ type: Input
305
+ }], disabled: [{
306
+ type: Input
307
+ }] } });
308
+
309
+ class NgilUiCommonFormCvaModule {
310
+ }
311
+ NgilUiCommonFormCvaModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NgilUiCommonFormCvaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
312
+ NgilUiCommonFormCvaModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: NgilUiCommonFormCvaModule, imports: [CommonModule] });
313
+ NgilUiCommonFormCvaModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NgilUiCommonFormCvaModule, imports: [CommonModule] });
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NgilUiCommonFormCvaModule, decorators: [{
315
+ type: NgModule,
316
+ args: [{
317
+ imports: [CommonModule]
318
+ }]
319
+ }] });
320
+
321
+ function createControlValueAccessorProviders(component) {
322
+ return [
323
+ {
324
+ provide: NG_VALUE_ACCESSOR,
325
+ useExisting: forwardRef(() => component),
326
+ multi: true
327
+ },
328
+ {
329
+ provide: NG_VALIDATORS,
330
+ useExisting: forwardRef(() => component),
331
+ multi: true
332
+ }
333
+ ];
334
+ }
335
+
336
+ /**
337
+ * Generated bundle index. Do not edit.
338
+ */
339
+
340
+ export { AbstractFormArrayComponent, AbstractFormComponent, AbstractFormGroupComponent, AbstractInputComponent, NgilUiCommonFormCvaModule, createControlValueAccessorProviders };
341
+ //# sourceMappingURL=ngil-form-cva.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngil-form-cva.mjs","sources":["../../../../../../../libs/ngil/ui/common/form-cva/src/lib/models/abstract-form-array-component.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/lib/models/abstract-form-component.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/lib/models/abstract-form-group.component.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/lib/error-messages.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/lib/models/abstract-input-component.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/lib/ngil-ui-common-form-cva.module.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/lib/utils/control-value-accessor.util.ts","../../../../../../../libs/ngil/ui/common/form-cva/src/ngil-form-cva.ts"],"sourcesContent":["import { AfterViewInit, Directive, OnDestroy } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n FormArray,\r\n FormGroup,\r\n ValidationErrors,\r\n Validator\r\n} from '@angular/forms';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormValueOf } from './form.model';\r\n\r\n/**\r\n *\r\n */\r\n@Directive()\r\nexport abstract class AbstractFormArrayComponent<F extends AbstractControl<any>>\r\n implements AfterViewInit, OnDestroy, ControlValueAccessor, Validator\r\n{\r\n protected abstract createFormArray(): FormArray<F>;\r\n protected abstract createFormArrayItem(item?: FormValueOf<F>): F;\r\n\r\n protected readonly destroy$ = new Subject<void>();\r\n protected onChange?: (value: FormValueOf<F>[]) => void;\r\n protected onTouched?: () => void;\r\n\r\n formGroup = new FormGroup({\r\n formArray: this.createFormArray()\r\n });\r\n get formArray() {\r\n return this.formGroup.controls.formArray;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.listenValueChanges();\r\n }\r\n\r\n protected listenValueChanges(): void {\r\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n if (this.onChange) {\r\n this.onChange(this.formArray.getRawValue());\r\n }\r\n });\r\n }\r\n\r\n registerOnChange(fn: (value: FormValueOf<F>[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n writeValue(items: FormValueOf<F>[] | undefined | null): void {\r\n this.prepareControls(items);\r\n\r\n if (items) {\r\n this.formArray.patchValue(items, { emitEvent: false });\r\n } else {\r\n this.formArray.reset(undefined, { emitEvent: false });\r\n }\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n isDisabled ? this.formGroup.disable({ emitEvent: false }) : this.formGroup.enable({ emitEvent: false });\r\n }\r\n\r\n validate(): ValidationErrors | null {\r\n if (this.formArray.invalid) {\r\n return { invalidFormArray: true };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n protected prepareControls(items: FormValueOf<F>[] | undefined | null): void {\r\n items = items || [];\r\n\r\n if (this.formArray.value.length < items.length) {\r\n this.addExtraControls(items);\r\n }\r\n\r\n if (this.formArray.value.length > items.length) {\r\n this.removeExtraControls(items);\r\n }\r\n }\r\n\r\n private addExtraControls(items: FormValueOf<F>[]): void {\r\n items.forEach((item, index) => {\r\n const control = this.formArray.at(index);\r\n if (!control) {\r\n this.formArray.push(this.createFormArrayItem(item));\r\n }\r\n });\r\n }\r\n\r\n private removeExtraControls(items: FormValueOf<F>[]): void {\r\n let formArrayIndex = 0;\r\n this.formArray.value.forEach((item, index) => {\r\n if (!items[index]) {\r\n this.formArray.removeAt(formArrayIndex);\r\n } else {\r\n formArrayIndex++;\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Directive()\r\nexport abstract class AbstractFormComponent<T> implements OnDestroy, OnInit {\r\n @Input() formViewModel?: T;\r\n\r\n @Output() submitted: EventEmitter<T> = new EventEmitter();\r\n\r\n abstract form: FormGroup;\r\n\r\n protected readonly destroy$ = new Subject<void>();\r\n\r\n get isSubmitDisabled(): boolean {\r\n return !this.form.valid || this.form.pristine;\r\n }\r\n\r\n get isCancelDisabled(): boolean {\r\n return !this.form.dirty;\r\n }\r\n\r\n protected getFormDefaultValue(model?: T): T | undefined {\r\n return model;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.form.patchValue(this.getFormDefaultValue(this.formViewModel) || {}, { emitEvent: false });\r\n }\r\n\r\n submit(): void {\r\n if (!this.isSubmitDisabled) {\r\n this.submitted.emit({\r\n ...this.formViewModel,\r\n ...this.form.value\r\n });\r\n } else {\r\n Object.values(this.form.controls).forEach(control => control.updateValueAndValidity());\r\n }\r\n }\r\n\r\n cancel(): void {\r\n if (!this.isCancelDisabled) {\r\n this.form.reset(this.getFormDefaultValue(this.formViewModel), { emitEvent: false });\r\n this.form.markAsPristine();\r\n this.form.markAsUntouched();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","/**\r\n * This class implements ControlValueAccessor logic for a FormGroup.\r\n * NG_VALUE_ACCESSOR and NG_VALIDATORS must be provided in the component.\r\n *\r\n * The FormGroup changes will be automatically change the parent FormControl value.\r\n *\r\n * Example:\r\n\r\n */\r\n\r\nimport { AfterViewInit, Directive, OnDestroy } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormGroup, ValidationErrors, Validator } from '@angular/forms';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FlatFormControlsOf, FormValueOf } from './form.model';\r\n\r\n@Directive()\r\nexport abstract class AbstractFormGroupComponent<\r\n T extends { [K in keyof T]: any },\r\n F extends { [K in keyof T]: AbstractControl<any, any> } = FlatFormControlsOf<T>\r\n> implements ControlValueAccessor, Validator, OnDestroy, AfterViewInit\r\n{\r\n abstract formGroup: FormGroup<F>;\r\n\r\n protected readonly destroy$ = new Subject<void>();\r\n protected onChange?: (value: FormValueOf<FormGroup<F>>) => void;\r\n protected onTouched?: () => void;\r\n\r\n ngAfterViewInit(): void {\r\n this.listenValueChanges();\r\n }\r\n\r\n protected listenValueChanges(): void {\r\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n if (this.onChange) {\r\n this.onChange(this.formGroup.getRawValue());\r\n }\r\n });\r\n }\r\n\r\n registerOnChange(fn: (value: FormValueOf<FormGroup<F>>) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n writeValue(formValue: T | undefined | null): void {\r\n if (formValue) {\r\n this.formGroup.patchValue(formValue, { emitEvent: false });\r\n } else {\r\n this.formGroup.reset(undefined, { emitEvent: false });\r\n }\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n isDisabled ? this.formGroup.disable({ emitEvent: false }) : this.formGroup.enable({ emitEvent: false });\r\n }\r\n\r\n validate(): ValidationErrors | null {\r\n if (this.formGroup.invalid) {\r\n return { invalidFormGroup: true };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","const errorMessages: Record<string, string> = {\r\n required: '{{fieldName}} is required.',\r\n max: 'Maximum {{fieldName}} is {{max}}.',\r\n min: 'Minimum {{fieldName}} is {{min}}.',\r\n maxlength: '{{fieldName}} can be max {{requiredLength}} characters long.',\r\n minlength: '{{fieldName}} must be at least {{requiredLength}} characters long.',\r\n email: '{{fieldName}} must be an email.'\r\n};\r\n\r\nexport function getErrorMessage(errorKey: string, replacements: Record<string, string>): string {\r\n if (!errorMessages[errorKey]) {\r\n return `Missing error message to the error with key ${errorKey}`;\r\n }\r\n\r\n return errorMessages[errorKey].replace(/{{(\\w+)}}/g, (placeholderWithDelimiters, placeholderWithoutDelimiters) =>\r\n replacements[placeholderWithoutDelimiters] ? replacements[placeholderWithoutDelimiters] : placeholderWithDelimiters\r\n );\r\n}\r\n","import { Directive, Input, OnDestroy, OnInit, Optional } from '@angular/core';\r\nimport { AbstractControl, ControlContainer, ControlValueAccessor, FormArray } from '@angular/forms';\r\nimport { BehaviorSubject, Subject, combineLatest } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { getErrorMessage } from '../error-messages';\r\n\r\n@Directive()\r\nexport abstract class AbstractInputComponent<T = string> implements OnInit, ControlValueAccessor, OnDestroy {\r\n @Input() formControlName = '';\r\n @Input() set errorMessage(errorMessage: string) {\r\n this.errorMessage$.next(errorMessage);\r\n }\r\n @Input() label = '';\r\n @Input() readonly = false;\r\n @Input() required = false;\r\n @Input() disabled = false;\r\n\r\n protected parentControl?: AbstractControl | null;\r\n protected onChange?: (value: T | null) => void;\r\n protected onTouched?: () => void;\r\n protected readonly destroy$ = new Subject<void>();\r\n protected readonly errorMessage$ = new BehaviorSubject<string>('');\r\n\r\n model$ = combineLatest({\r\n errorMessage: this.errorMessage$\r\n });\r\n\r\n constructor(@Optional() private readonly controlContainer?: ControlContainer) {}\r\n\r\n ngOnInit(): void {\r\n if (this.controlContainer?.control instanceof FormArray) {\r\n this.parentControl = this.controlContainer?.control.at(+this.formControlName);\r\n } else {\r\n this.parentControl = this.controlContainer?.control?.get(this.formControlName);\r\n }\r\n this.setRequiredState();\r\n this.listenStatusChanges();\r\n }\r\n\r\n private setRequiredState(): void {\r\n if (!this.parentControl || !this.parentControl?.validator) {\r\n return;\r\n }\r\n\r\n const validators = this.parentControl?.validator({ value: '' } as AbstractControl);\r\n if (validators && Object.keys(validators).includes('required')) {\r\n this.required = true;\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n if (this.onTouched) {\r\n this.onTouched();\r\n }\r\n this.setErrors();\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n abstract writeValue(value: T): void;\r\n\r\n protected listenStatusChanges(): void {\r\n this.parentControl?.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(() => this.setErrors());\r\n }\r\n\r\n protected setErrors(): void {\r\n if (this.parentControl?.errors) {\r\n const errorKey = Object.keys(this.parentControl?.errors)[0];\r\n const errorObj = this.parentControl?.errors[`${errorKey}`];\r\n this.errorMessage$.next(\r\n getErrorMessage(errorKey, {\r\n fieldName: this.label,\r\n ...errorObj\r\n })\r\n );\r\n } else {\r\n this.errorMessage$.next('');\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule]\r\n})\r\nexport class NgilUiCommonFormCvaModule {}\r\n","import { forwardRef, Type } from '@angular/core';\r\nimport { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nexport function createControlValueAccessorProviders(component: Type<unknown>) {\r\n return [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => component),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => component),\r\n multi: true\r\n }\r\n ];\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["takeUntil"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './lib/models/abstract-form-array-component';
2
+ export * from './lib/models/abstract-form-component';
3
+ export * from './lib/models/abstract-form-group.component';
4
+ export * from './lib/models/abstract-input-component';
5
+ export * from './lib/models/form.model';
6
+ export * from './lib/ngil-ui-common-form-cva.module';
7
+ export * from './lib/utils/control-value-accessor.util';
@@ -0,0 +1 @@
1
+ export declare function getErrorMessage(errorKey: string, replacements: Record<string, string>): string;
@@ -0,0 +1,32 @@
1
+ import { AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { AbstractControl, ControlValueAccessor, FormArray, FormGroup, ValidationErrors, Validator } from '@angular/forms';
3
+ import { Subject } from 'rxjs';
4
+ import { FormValueOf } from './form.model';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ *
8
+ */
9
+ export declare abstract class AbstractFormArrayComponent<F extends AbstractControl<any>> implements AfterViewInit, OnDestroy, ControlValueAccessor, Validator {
10
+ protected abstract createFormArray(): FormArray<F>;
11
+ protected abstract createFormArrayItem(item?: FormValueOf<F>): F;
12
+ protected readonly destroy$: Subject<void>;
13
+ protected onChange?: (value: FormValueOf<F>[]) => void;
14
+ protected onTouched?: () => void;
15
+ formGroup: FormGroup<{
16
+ formArray: FormArray<F>;
17
+ }>;
18
+ get formArray(): FormArray<F>;
19
+ ngAfterViewInit(): void;
20
+ protected listenValueChanges(): void;
21
+ registerOnChange(fn: (value: FormValueOf<F>[]) => void): void;
22
+ registerOnTouched(fn: () => void): void;
23
+ writeValue(items: FormValueOf<F>[] | undefined | null): void;
24
+ setDisabledState(isDisabled: boolean): void;
25
+ validate(): ValidationErrors | null;
26
+ protected prepareControls(items: FormValueOf<F>[] | undefined | null): void;
27
+ private addExtraControls;
28
+ private removeExtraControls;
29
+ ngOnDestroy(): void;
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbstractFormArrayComponent<any>, never>;
31
+ static ɵdir: i0.ɵɵDirectiveDeclaration<AbstractFormArrayComponent<any>, never, never, {}, {}, never, never, false, never>;
32
+ }
@@ -0,0 +1,19 @@
1
+ import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import { Subject } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export declare abstract class AbstractFormComponent<T> implements OnDestroy, OnInit {
6
+ formViewModel?: T;
7
+ submitted: EventEmitter<T>;
8
+ abstract form: FormGroup;
9
+ protected readonly destroy$: Subject<void>;
10
+ get isSubmitDisabled(): boolean;
11
+ get isCancelDisabled(): boolean;
12
+ protected getFormDefaultValue(model?: T): T | undefined;
13
+ ngOnInit(): void;
14
+ submit(): void;
15
+ cancel(): void;
16
+ ngOnDestroy(): void;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbstractFormComponent<any>, never>;
18
+ static ɵdir: i0.ɵɵDirectiveDeclaration<AbstractFormComponent<any>, never, never, { "formViewModel": "formViewModel"; }, { "submitted": "submitted"; }, never, never, false, never>;
19
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * This class implements ControlValueAccessor logic for a FormGroup.
3
+ * NG_VALUE_ACCESSOR and NG_VALIDATORS must be provided in the component.
4
+ *
5
+ * The FormGroup changes will be automatically change the parent FormControl value.
6
+ *
7
+ * Example:
8
+
9
+ */
10
+ import { AfterViewInit, OnDestroy } from '@angular/core';
11
+ import { AbstractControl, ControlValueAccessor, FormGroup, ValidationErrors, Validator } from '@angular/forms';
12
+ import { Subject } from 'rxjs';
13
+ import { FlatFormControlsOf, FormValueOf } from './form.model';
14
+ import * as i0 from "@angular/core";
15
+ export declare abstract class AbstractFormGroupComponent<T extends {
16
+ [K in keyof T]: any;
17
+ }, F extends {
18
+ [K in keyof T]: AbstractControl<any, any>;
19
+ } = FlatFormControlsOf<T>> implements ControlValueAccessor, Validator, OnDestroy, AfterViewInit {
20
+ abstract formGroup: FormGroup<F>;
21
+ protected readonly destroy$: Subject<void>;
22
+ protected onChange?: (value: FormValueOf<FormGroup<F>>) => void;
23
+ protected onTouched?: () => void;
24
+ ngAfterViewInit(): void;
25
+ protected listenValueChanges(): void;
26
+ registerOnChange(fn: (value: FormValueOf<FormGroup<F>>) => void): void;
27
+ registerOnTouched(fn: () => void): void;
28
+ writeValue(formValue: T | undefined | null): void;
29
+ setDisabledState(isDisabled: boolean): void;
30
+ validate(): ValidationErrors | null;
31
+ ngOnDestroy(): void;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbstractFormGroupComponent<any, any>, never>;
33
+ static ɵdir: i0.ɵɵDirectiveDeclaration<AbstractFormGroupComponent<any, any>, never, never, {}, {}, never, never, false, never>;
34
+ }
@@ -0,0 +1,34 @@
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
+ import { AbstractControl, ControlContainer, ControlValueAccessor } from '@angular/forms';
3
+ import { BehaviorSubject, Subject } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export declare abstract class AbstractInputComponent<T = string> implements OnInit, ControlValueAccessor, OnDestroy {
6
+ private readonly controlContainer?;
7
+ formControlName: string;
8
+ set errorMessage(errorMessage: string);
9
+ label: string;
10
+ readonly: boolean;
11
+ required: boolean;
12
+ disabled: boolean;
13
+ protected parentControl?: AbstractControl | null;
14
+ protected onChange?: (value: T | null) => void;
15
+ protected onTouched?: () => void;
16
+ protected readonly destroy$: Subject<void>;
17
+ protected readonly errorMessage$: BehaviorSubject<string>;
18
+ model$: import("rxjs").Observable<{
19
+ errorMessage: string;
20
+ }>;
21
+ constructor(controlContainer?: ControlContainer | undefined);
22
+ ngOnInit(): void;
23
+ private setRequiredState;
24
+ onBlur(): void;
25
+ registerOnChange(fn: (value: T | null) => void): void;
26
+ registerOnTouched(fn: () => void): void;
27
+ setDisabledState(isDisabled: boolean): void;
28
+ abstract writeValue(value: T): void;
29
+ protected listenStatusChanges(): void;
30
+ protected setErrors(): void;
31
+ ngOnDestroy(): void;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<AbstractInputComponent<any>, [{ optional: true; }]>;
33
+ static ɵdir: i0.ɵɵDirectiveDeclaration<AbstractInputComponent<any>, never, never, { "formControlName": "formControlName"; "errorMessage": "errorMessage"; "label": "label"; "readonly": "readonly"; "required": "required"; "disabled": "disabled"; }, {}, never, never, false, never>;
34
+ }
@@ -0,0 +1,17 @@
1
+ import { AbstractControl, FormControl, FormGroup } from '@angular/forms';
2
+ /**
3
+ * Create FormControl or FormGroup types to used in a FormGroup using a interface
4
+ */
5
+ export type FormControlsOf<T extends Record<string, any>> = {
6
+ [K in keyof Required<T>]: Required<T>[K] extends Record<string, any> ? Required<T>[K] extends any[] ? FormControl<T[K] | null> : FormGroup<FormControlsOf<Required<T>[K]>> : FormControl<T[K] | null>;
7
+ };
8
+ /**
9
+ * Wrap every property in the Record T in a FormControl type
10
+ */
11
+ export type FlatFormControlsOf<T extends Record<string, any>> = {
12
+ [K in keyof T]: FormControl<T[K] | null>;
13
+ };
14
+ /**
15
+ * Gives the form value type
16
+ */
17
+ export type FormValueOf<T extends AbstractControl<any>> = T['value'];
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "@angular/common";
3
+ export declare class NgilUiCommonFormCvaModule {
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgilUiCommonFormCvaModule, never>;
5
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgilUiCommonFormCvaModule, never, [typeof i1.CommonModule], never>;
6
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgilUiCommonFormCvaModule>;
7
+ }
@@ -0,0 +1,6 @@
1
+ import { Type } from '@angular/core';
2
+ export declare function createControlValueAccessorProviders(component: Type<unknown>): {
3
+ provide: import("@angular/core").InjectionToken<readonly import("@angular/forms").ControlValueAccessor[]>;
4
+ useExisting: Type<any>;
5
+ multi: boolean;
6
+ }[];
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@ngil/form-cva",
3
+ "version": "0.1.0",
4
+ "dependencies": {
5
+ "tslib": "^2.3.0"
6
+ },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git@github.com:allanartuso/ngdux.git",
10
+ "directory": "/libs/ngil/ui/common/cva"
11
+ },
12
+ "homepage": "https://github.com/allanartuso/ngdux/tree/master/libs/ngil/ui/common/cva#readme",
13
+ "module": "fesm2015/ngil-form-cva.mjs",
14
+ "es2020": "fesm2020/ngil-form-cva.mjs",
15
+ "esm2020": "esm2020/ngil-form-cva.mjs",
16
+ "fesm2020": "fesm2020/ngil-form-cva.mjs",
17
+ "fesm2015": "fesm2015/ngil-form-cva.mjs",
18
+ "typings": "index.d.ts",
19
+ "exports": {
20
+ "./package.json": {
21
+ "default": "./package.json"
22
+ },
23
+ ".": {
24
+ "types": "./index.d.ts",
25
+ "esm2020": "./esm2020/ngil-form-cva.mjs",
26
+ "es2020": "./fesm2020/ngil-form-cva.mjs",
27
+ "es2015": "./fesm2015/ngil-form-cva.mjs",
28
+ "node": "./fesm2015/ngil-form-cva.mjs",
29
+ "default": "./fesm2020/ngil-form-cva.mjs"
30
+ }
31
+ },
32
+ "sideEffects": false,
33
+ "peerDependencies": {
34
+ "@angular/core": "15.2.9",
35
+ "@angular/forms": "15.2.9",
36
+ "rxjs": "7.8.1",
37
+ "@angular/common": "15.2.9"
38
+ }
39
+ }