special-forms 1.0.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.
Files changed (182) hide show
  1. package/.editorconfig +16 -0
  2. package/.storybook/db-theme.js +8 -0
  3. package/.storybook/main.js +15 -0
  4. package/.storybook/manager.js +7 -0
  5. package/.storybook/preview-head.html +16 -0
  6. package/.storybook/preview.js +20 -0
  7. package/.storybook/tsconfig.json +21 -0
  8. package/.storybook/typings.d.ts +4 -0
  9. package/.vscode/extensions.json +4 -0
  10. package/.vscode/launch.json +20 -0
  11. package/.vscode/tasks.json +42 -0
  12. package/README.md +27 -0
  13. package/angular.json +38 -0
  14. package/documentation.json +10829 -0
  15. package/package.json +65 -0
  16. package/projects/special-forms/README.md +24 -0
  17. package/projects/special-forms/karma.conf.js +44 -0
  18. package/projects/special-forms/ng-package.json +7 -0
  19. package/projects/special-forms/package.json +11 -0
  20. package/projects/special-forms/src/lib/assets/styles.scss +213 -0
  21. package/projects/special-forms/src/lib/assets/themes/dark.scss +80 -0
  22. package/projects/special-forms/src/lib/assets/themes/light.scss +78 -0
  23. package/projects/special-forms/src/lib/aux-storybook-components/form-control-selector/form-control-selector.component.html +5 -0
  24. package/projects/special-forms/src/lib/aux-storybook-components/form-control-selector/form-control-selector.component.scss +6 -0
  25. package/projects/special-forms/src/lib/aux-storybook-components/form-control-selector/form-control-selector.component.spec.ts +21 -0
  26. package/projects/special-forms/src/lib/aux-storybook-components/form-control-selector/form-control-selector.component.ts +21 -0
  27. package/projects/special-forms/src/lib/aux-storybook-components/form-control-selector/form-control-selector.module.ts +36 -0
  28. package/projects/special-forms/src/lib/aux-storybook-components/form-control-viewer/form-control-viewer.component.html +5 -0
  29. package/projects/special-forms/src/lib/aux-storybook-components/form-control-viewer/form-control-viewer.component.scss +18 -0
  30. package/projects/special-forms/src/lib/aux-storybook-components/form-control-viewer/form-control-viewer.component.spec.ts +23 -0
  31. package/projects/special-forms/src/lib/aux-storybook-components/form-control-viewer/form-control-viewer.component.ts +66 -0
  32. package/projects/special-forms/src/lib/aux-storybook-components/form-control-viewer/form-control-viewer.module.ts +16 -0
  33. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/control-dialog.component.html +31 -0
  34. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/control-dialog.component.scss +0 -0
  35. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/control-dialog.component.spec.ts +22 -0
  36. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/control-dialog.component.ts +102 -0
  37. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/autocomplete.form.ts +87 -0
  38. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/checkbox.form.ts +51 -0
  39. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/common.form.interface.ts +24 -0
  40. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/common.form.ts +31 -0
  41. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/datepicker.form.ts +56 -0
  42. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/dropdown.form.ts +80 -0
  43. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/field.form.ts +189 -0
  44. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/input.form.ts +71 -0
  45. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/label.form.ts +33 -0
  46. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/text-area.form.ts +17 -0
  47. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/components/settings-strategy/upload.form.ts +35 -0
  48. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/form-group-viewer.component.html +37 -0
  49. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/form-group-viewer.component.scss +41 -0
  50. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/form-group-viewer.component.spec.ts +22 -0
  51. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/form-group-viewer.component.ts +95 -0
  52. package/projects/special-forms/src/lib/aux-storybook-components/form-group-viewer/form-group-viewer.module.ts +32 -0
  53. package/projects/special-forms/src/lib/components/index.ts +61 -0
  54. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.component.html +62 -0
  55. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.component.scss +3 -0
  56. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.component.spec.ts +24 -0
  57. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.component.ts +58 -0
  58. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.interface.ts +20 -0
  59. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.module.ts +25 -0
  60. package/projects/special-forms/src/lib/components/special-autocomplete/special-autocomplete.stories.ts +81 -0
  61. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.component.html +17 -0
  62. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.component.scss +3 -0
  63. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.component.spec.ts +23 -0
  64. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.component.ts +19 -0
  65. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.interface.ts +12 -0
  66. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.module.ts +25 -0
  67. package/projects/special-forms/src/lib/components/special-checkbox/special-checkbox.stories.ts +76 -0
  68. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.component.html +26 -0
  69. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.component.scss +3 -0
  70. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.component.spec.ts +23 -0
  71. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.component.ts +21 -0
  72. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.interface.ts +13 -0
  73. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.module.ts +26 -0
  74. package/projects/special-forms/src/lib/components/special-datepicker/special-datepicker.stories.ts +69 -0
  75. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.component.html +41 -0
  76. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.component.scss +15 -0
  77. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.component.spec.ts +24 -0
  78. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.component.ts +34 -0
  79. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.interface.ts +18 -0
  80. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.module.ts +22 -0
  81. package/projects/special-forms/src/lib/components/special-dropdown/special-dropdown.stories.ts +83 -0
  82. package/projects/special-forms/src/lib/components/special-form/special-form-array.component.html +208 -0
  83. package/projects/special-forms/src/lib/components/special-form/special-form-array.component.scss +70 -0
  84. package/projects/special-forms/src/lib/components/special-form/special-form-array.component.spec.ts +23 -0
  85. package/projects/special-forms/src/lib/components/special-form/special-form-array.module.ts +18 -0
  86. package/projects/special-forms/src/lib/components/special-form/special-form.component.html +20 -0
  87. package/projects/special-forms/src/lib/components/special-form/special-form.component.scss +3 -0
  88. package/projects/special-forms/src/lib/components/special-form/special-form.component.spec.ts +22 -0
  89. package/projects/special-forms/src/lib/components/special-form/special-form.component.ts +85 -0
  90. package/projects/special-forms/src/lib/components/special-form/special-form.module.ts +40 -0
  91. package/projects/special-forms/src/lib/components/special-form/special-form.stories.ts +45 -0
  92. package/projects/special-forms/src/lib/components/special-input/special-input.component.html +37 -0
  93. package/projects/special-forms/src/lib/components/special-input/special-input.component.scss +3 -0
  94. package/projects/special-forms/src/lib/components/special-input/special-input.component.spec.ts +23 -0
  95. package/projects/special-forms/src/lib/components/special-input/special-input.component.ts +39 -0
  96. package/projects/special-forms/src/lib/components/special-input/special-input.interface.ts +17 -0
  97. package/projects/special-forms/src/lib/components/special-input/special-input.module.ts +24 -0
  98. package/projects/special-forms/src/lib/components/special-input/special-input.stories.ts +91 -0
  99. package/projects/special-forms/src/lib/components/special-label/special-label.component.html +6 -0
  100. package/projects/special-forms/src/lib/components/special-label/special-label.component.scss +3 -0
  101. package/projects/special-forms/src/lib/components/special-label/special-label.component.spec.ts +23 -0
  102. package/projects/special-forms/src/lib/components/special-label/special-label.component.ts +27 -0
  103. package/projects/special-forms/src/lib/components/special-label/special-label.interface.ts +14 -0
  104. package/projects/special-forms/src/lib/components/special-label/special-label.module.ts +25 -0
  105. package/projects/special-forms/src/lib/components/special-label/special-label.stories.ts +99 -0
  106. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.component.html +82 -0
  107. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.component.scss +3 -0
  108. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.component.spec.ts +23 -0
  109. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.component.ts +86 -0
  110. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.interface.ts +20 -0
  111. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.module.ts +28 -0
  112. package/projects/special-forms/src/lib/components/special-multiple-autocomplete/special-multiple-autocomplete.stories.ts +81 -0
  113. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.component.html +29 -0
  114. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.component.scss +3 -0
  115. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.component.spec.ts +23 -0
  116. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.component.ts +20 -0
  117. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.interface.ts +9 -0
  118. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.module.ts +24 -0
  119. package/projects/special-forms/src/lib/components/special-text-area/special-text-area.stories.ts +69 -0
  120. package/projects/special-forms/src/lib/components/special-upload/special-upload.component.html +50 -0
  121. package/projects/special-forms/src/lib/components/special-upload/special-upload.component.scss +29 -0
  122. package/projects/special-forms/src/lib/components/special-upload/special-upload.component.spec.ts +23 -0
  123. package/projects/special-forms/src/lib/components/special-upload/special-upload.component.ts +79 -0
  124. package/projects/special-forms/src/lib/components/special-upload/special-upload.interface.ts +12 -0
  125. package/projects/special-forms/src/lib/components/special-upload/special-upload.module.ts +23 -0
  126. package/projects/special-forms/src/lib/components/special-upload/special-upload.stories.ts +81 -0
  127. package/projects/special-forms/src/lib/core/aux-data/all-icons.ts +99 -0
  128. package/projects/special-forms/src/lib/core/aux-data/control-types.enum.ts +16 -0
  129. package/projects/special-forms/src/lib/core/aux-data/countries.ts +247 -0
  130. package/projects/special-forms/src/lib/core/aux-data/field-basic-data.ts +14 -0
  131. package/projects/special-forms/src/lib/core/aux-data/input-types.ts +23 -0
  132. package/projects/special-forms/src/lib/core/controls/icons.control.ts +8 -0
  133. package/projects/special-forms/src/lib/core/controls/index.ts +2 -0
  134. package/projects/special-forms/src/lib/core/controls/theme.control.ts +1 -0
  135. package/projects/special-forms/src/lib/core/controls/types.control.ts +9 -0
  136. package/projects/special-forms/src/lib/core/directives/control-render.directive.ts +19 -0
  137. package/projects/special-forms/src/lib/core/directives/control-render.module.ts +10 -0
  138. package/projects/special-forms/src/lib/core/forms/special-forms.ts +395 -0
  139. package/projects/special-forms/src/lib/core/interfaces/field-basics.interfaces.ts +22 -0
  140. package/projects/special-forms/src/lib/core/interfaces/form.interfaces.ts +83 -0
  141. package/projects/special-forms/src/lib/core/interfaces/special-control.interface.ts +9 -0
  142. package/projects/special-forms/src/lib/core/masks/currency.mask.ts +11 -0
  143. package/projects/special-forms/src/lib/core/masks/maks.enum.ts +12 -0
  144. package/projects/special-forms/src/lib/core/masks/number.mask.ts +4 -0
  145. package/projects/special-forms/src/lib/core/services/index.ts +3 -0
  146. package/projects/special-forms/src/lib/core/services/special-form-builder/special-form-builder.service.spec.ts +16 -0
  147. package/projects/special-forms/src/lib/core/services/special-form-builder/special-form-builder.service.ts +220 -0
  148. package/projects/special-forms/src/lib/core/utils/enum-to-array.util.ts +6 -0
  149. package/projects/special-forms/src/lib/pipes/controls-list-pipe/controls-list.pipe.module.ts +10 -0
  150. package/projects/special-forms/src/lib/pipes/controls-list-pipe/controls-list.pipe.ts +17 -0
  151. package/projects/special-forms/src/lib/pipes/error-message-pipe/error.pipe.module.ts +13 -0
  152. package/projects/special-forms/src/lib/pipes/error-message-pipe/error.pipe.ts +21 -0
  153. package/projects/special-forms/src/lib/pipes/index.ts +3 -0
  154. package/projects/special-forms/src/lib/pipes/text-by-function/text-by-function.pipe.module.ts +13 -0
  155. package/projects/special-forms/src/lib/pipes/text-by-function/text-by-function.pipe.ts +14 -0
  156. package/projects/special-forms/src/public-api.ts +8 -0
  157. package/projects/special-forms/src/test.ts +27 -0
  158. package/projects/special-forms/tsconfig.lib.json +15 -0
  159. package/projects/special-forms/tsconfig.lib.prod.json +10 -0
  160. package/projects/special-forms/tsconfig.spec.json +17 -0
  161. package/scss-bundle.config.json +6 -0
  162. package/stories/Button.stories.ts +42 -0
  163. package/stories/Header.stories.ts +35 -0
  164. package/stories/Introduction.stories.mdx +211 -0
  165. package/stories/Page.stories.ts +36 -0
  166. package/stories/User.ts +2 -0
  167. package/stories/assets/code-brackets.svg +1 -0
  168. package/stories/assets/colors.svg +1 -0
  169. package/stories/assets/comments.svg +1 -0
  170. package/stories/assets/direction.svg +1 -0
  171. package/stories/assets/flow.svg +1 -0
  172. package/stories/assets/plugin.svg +1 -0
  173. package/stories/assets/repo.svg +1 -0
  174. package/stories/assets/stackalt.svg +1 -0
  175. package/stories/button.component.ts +53 -0
  176. package/stories/button.css +30 -0
  177. package/stories/header.component.ts +75 -0
  178. package/stories/header.css +32 -0
  179. package/stories/page.component.ts +77 -0
  180. package/stories/page.css +69 -0
  181. package/tailwind.config.js +30 -0
  182. package/tsconfig.json +39 -0
@@ -0,0 +1 @@
1
+ export const THEMES_CONTROL = { control: 'radio', options: ['light-theme', 'dark-theme'] };
@@ -0,0 +1,9 @@
1
+ import { EControlTypes } from '../aux-data/control-types.enum';
2
+ import { EnumToArray } from '../utils/enum-to-array.util';
3
+
4
+ export const TYPES_CONTROL = {
5
+ options: EnumToArray(EControlTypes),
6
+ control: {
7
+ type: 'select',
8
+ },
9
+ };
@@ -0,0 +1,19 @@
1
+ import { Directive, Input, ViewContainerRef } from '@angular/core';
2
+ import { SpecialFormControl } from '../forms/special-forms';
3
+
4
+ @Directive({
5
+ selector: `[controlRender]`,
6
+ })
7
+ export class FormControlsRenderDirective {
8
+ @Input('components') componentsBuffer: { [key: string]: any } = {};
9
+ @Input('control') set controlSetter(control: SpecialFormControl<any>) {
10
+ this.viewContainer.clear();
11
+ const component = this.componentsBuffer[control.type];
12
+ if (component) {
13
+ const componentRef = this.viewContainer.createComponent(component);
14
+ (componentRef.instance as any).control = control;
15
+ }
16
+ }
17
+
18
+ constructor(private viewContainer: ViewContainerRef) {}
19
+ }
@@ -0,0 +1,10 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { FormControlsRenderDirective } from './control-render.directive';
4
+
5
+ @NgModule({
6
+ declarations: [FormControlsRenderDirective],
7
+ imports: [CommonModule],
8
+ exports: [FormControlsRenderDirective],
9
+ })
10
+ export class ControlsRenderDirectiveModule {}
@@ -0,0 +1,395 @@
1
+ import {
2
+ AbstractControl,
3
+ FormArray,
4
+ FormControl,
5
+ FormGroup,
6
+ } from '@angular/forms';
7
+ import { EControlTypes } from '../aux-data/control-types.enum';
8
+ import { IFieldBasicData } from '../interfaces/field-basics.interfaces';
9
+ import {
10
+ IArraySettings,
11
+ IFormSettings,
12
+ TSpecialFields,
13
+ TSpecialForm,
14
+ TSpecialArray,
15
+ } from '../interfaces/form.interfaces';
16
+ export class SpecialFormControl<T>
17
+ extends FormControl
18
+ implements IFieldBasicData
19
+ {
20
+ public name: string;
21
+ public placeholder: string;
22
+ public label: string;
23
+ public tooltip: string;
24
+ public icon: string;
25
+ public elementId: string;
26
+ public styleClasses: string;
27
+ public length: number;
28
+ public required: boolean;
29
+ public hidden: boolean;
30
+ public readOnly: boolean;
31
+ public settings: T;
32
+ public type: EControlTypes;
33
+ public errorMessages: { [key: string]: string };
34
+
35
+ constructor({
36
+ name,
37
+ settings,
38
+ type,
39
+ validators,
40
+ asyncValidators,
41
+ elementId,
42
+ styleClasses,
43
+ defaultValue,
44
+ hidden,
45
+ icon,
46
+ label,
47
+ length,
48
+ placeholder,
49
+ readOnly,
50
+ required,
51
+ tooltip,
52
+ errorMessages,
53
+ disabled,
54
+ }: TSpecialFields) {
55
+ super(defaultValue, validators, asyncValidators);
56
+
57
+ this.name = name;
58
+ this.placeholder = placeholder;
59
+ this.label = label;
60
+ this.tooltip = tooltip;
61
+ this.icon = icon;
62
+ this.elementId = elementId;
63
+ this.settings = settings as T;
64
+ this.type = type;
65
+ this.styleClasses = styleClasses;
66
+ this.hidden = hidden;
67
+ this.length = length;
68
+ this.readOnly = readOnly;
69
+ this.required = required;
70
+ this.errorMessages = errorMessages;
71
+ disabled ? this.disable() : this.enable();
72
+ }
73
+
74
+ setReadOnly(status: boolean = true) {
75
+ this.readOnly = status;
76
+ }
77
+
78
+ setDisabled(status: boolean = true) {
79
+ status ? this.disable() : this.enable();
80
+ }
81
+
82
+ setHidden(status = true) {
83
+ this.hidden = status;
84
+ }
85
+ }
86
+ export class SpecialFormGroup extends FormGroup implements IFieldBasicData {
87
+ public name: string;
88
+ public placeholder: string;
89
+ public label: string;
90
+ public tooltip: string;
91
+ public icon: string;
92
+ public elementId: string;
93
+ public styleClasses: string;
94
+ public length: number;
95
+ public required: boolean;
96
+ public hidden: boolean;
97
+ public readOnly: boolean;
98
+ public settings: IFormSettings;
99
+ public type: EControlTypes.form;
100
+ public defaultValue: any;
101
+ public errorMessages: { [key: string]: string };
102
+
103
+ constructor(
104
+ {
105
+ name,
106
+ settings,
107
+ type,
108
+ validators,
109
+ asyncValidators,
110
+ elementId,
111
+ styleClasses,
112
+ defaultValue,
113
+ hidden,
114
+ icon,
115
+ label,
116
+ length,
117
+ placeholder,
118
+ readOnly,
119
+ required,
120
+ tooltip,
121
+ disabled,
122
+ }: TSpecialForm,
123
+ controls: {
124
+ [key: string]: SpecialFormControl<any>;
125
+ },
126
+ ) {
127
+ super(controls, validators, asyncValidators);
128
+
129
+ this.name = name;
130
+ this.placeholder = placeholder;
131
+ this.label = label;
132
+ this.tooltip = tooltip;
133
+ this.icon = icon;
134
+ this.elementId = elementId;
135
+ this.settings = settings;
136
+ this.type = type;
137
+ this.styleClasses = styleClasses;
138
+ this.hidden = hidden;
139
+ this.length = length;
140
+ this.readOnly = readOnly;
141
+ this.required = required;
142
+ this.defaultValue = defaultValue;
143
+ disabled ? this.disable() : this.enable();
144
+ }
145
+
146
+ unpristineRequired() {
147
+ Object.values(this.controls).forEach((control) => {
148
+ if (control instanceof SpecialFormControl) {
149
+ control.markAsDirty();
150
+ } else if (control instanceof SpecialFormGroup) {
151
+ control.unpristineRequired();
152
+ } else if (control instanceof SpecialFormArray) {
153
+ control.unpristineRequired();
154
+ }
155
+ });
156
+ }
157
+
158
+ specialReset(value = {}) {
159
+ const aux: any = {};
160
+ Object.entries(this.controls).map(([key, control]) => {
161
+ if (control instanceof SpecialFormControl) {
162
+ aux[key] = control.defaultValue;
163
+ } else if (control instanceof SpecialFormArray) {
164
+ control.clear();
165
+ }
166
+ });
167
+
168
+ this.reset({ ...aux, ...value });
169
+ }
170
+ setReadOnly(status: boolean = true) {
171
+ Object.values(this.controls).map((value) => {
172
+ if (
173
+ value instanceof SpecialFormControl ||
174
+ value instanceof SpecialFormArray ||
175
+ value instanceof SpecialFormGroup
176
+ ) {
177
+ value.setReadOnly(status);
178
+ }
179
+ });
180
+ }
181
+ setReadOnlyByFields(fieldsObject: { [key: string]: boolean }) {
182
+ Object.entries(fieldsObject).map(([key, value]) => {
183
+ const control = this.controls[key];
184
+ if (control instanceof SpecialFormControl) {
185
+ control.readOnly = value;
186
+ }
187
+ });
188
+ }
189
+
190
+ setHiddenByFields(fields: { [key: string]: boolean }) {
191
+ Object.entries(fields).map(([key, value]) => {
192
+ const control = this.controls[key];
193
+ if (control instanceof SpecialFormControl) {
194
+ control.hidden = value;
195
+ }
196
+ });
197
+ }
198
+ setDisabled(status: boolean) {
199
+ Object.values(this.controls).map((value) => {
200
+ if (
201
+ value instanceof SpecialFormControl ||
202
+ value instanceof SpecialFormArray ||
203
+ value instanceof SpecialFormGroup
204
+ ) {
205
+ value.setDisabled(status);
206
+ }
207
+ });
208
+ }
209
+
210
+ setDisabledByFields(fieldsObject: any) {
211
+ Object.entries(fieldsObject).map((entries) => {
212
+ if (this.controls[entries[0]] instanceof SpecialFormControl) {
213
+ entries[1]
214
+ ? this.controls[entries[0]].enable()
215
+ : this.controls[entries[0]].disable();
216
+ }
217
+ });
218
+ }
219
+
220
+ /**
221
+ * donde value es el objeto semilla y detailForm es un arreglo de form key para dar un marco al formarray
222
+ */
223
+
224
+ setFormValue(value: any) {
225
+ this.specialReset(value);
226
+ Object.entries(this.controls)
227
+ .filter(([_key, control]) => control instanceof SpecialFormArray)
228
+ .map(([key, control]) => {
229
+ (control as SpecialFormArray).fillFormArray(value[key]);
230
+ });
231
+ }
232
+
233
+ /**
234
+ * Método que retorna
235
+ */
236
+
237
+ getIdPkey(): SpecialFormControl<any> | undefined {
238
+ return Object.values(this.controls).find(
239
+ (control) =>
240
+ control instanceof SpecialFormControl && control.type === 'PRIMARY-KEY'
241
+ ) as SpecialFormControl<any> | undefined;
242
+ }
243
+ }
244
+
245
+ export class SpecialFormArray extends FormArray implements IFieldBasicData {
246
+ public name: string;
247
+ public placeholder: string;
248
+ public label: string;
249
+ public tooltip: string;
250
+ public icon: string;
251
+ public elementId: string;
252
+ public styleClasses: string;
253
+ public required: boolean;
254
+ public hidden: boolean;
255
+ public readOnly: boolean;
256
+ public settings: IArraySettings;
257
+ public type: EControlTypes;
258
+ public defaultValue: any;
259
+ public form: SpecialFormGroup;
260
+ private formCreation: (value?: any) => SpecialFormGroup;
261
+ public errorMessages: { [key: string]: string };
262
+
263
+ constructor(
264
+ {
265
+ name,
266
+ settings,
267
+ type,
268
+ validators,
269
+ asyncValidators,
270
+ elementId,
271
+ styleClasses,
272
+ defaultValue,
273
+ hidden,
274
+ icon,
275
+ label,
276
+ placeholder,
277
+ readOnly,
278
+ required,
279
+ tooltip,
280
+ errorMessages,
281
+ disabled,
282
+ }: TSpecialArray,
283
+ formCreation: () => SpecialFormGroup,
284
+ controls: AbstractControl[]
285
+ ) {
286
+ super(controls, validators, asyncValidators);
287
+ this.formCreation = formCreation;
288
+ this.form = this.formCreation();
289
+ this.name = name;
290
+ this.placeholder = placeholder;
291
+ this.label = label;
292
+ this.tooltip = tooltip;
293
+ this.icon = icon;
294
+ this.elementId = elementId;
295
+ this.settings = settings;
296
+ this.type = type;
297
+ this.styleClasses = styleClasses;
298
+ this.hidden = hidden;
299
+ this.readOnly = readOnly;
300
+ this.required = required;
301
+ this.defaultValue = defaultValue;
302
+ this.errorMessages = errorMessages;
303
+ disabled ? this.disable() : this.enable();
304
+ }
305
+
306
+ fillFormArray(data: any[]) {
307
+ this.form.reset();
308
+ this.clear();
309
+ data.forEach((item) => {
310
+ const form = this.formCreation(item);
311
+ this.push(form);
312
+ });
313
+ }
314
+
315
+ addItem() {
316
+ const form = this.formCreation(this.form.value);
317
+
318
+ this.form.specialReset();
319
+ this.push(form);
320
+ this.markAsDirty();
321
+ }
322
+
323
+ specialPush(index?: number) {
324
+ const form = this.formCreation(this.form.value);
325
+ if (!index) this.push(form);
326
+ else this.controls[index].reset(this.form.value);
327
+ }
328
+
329
+ specialInsert(index = 0) {
330
+ const form = this.formCreation(this.form.value);
331
+ this.insert(index, form);
332
+ }
333
+
334
+ specialEdit(index: number, newValue: Object) {
335
+ this.controls[index].reset({ ...this.controls[index].value, ...newValue });
336
+ this.markAsDirty();
337
+ }
338
+
339
+ /**
340
+ * Vuelve todos los controles del formArray de lectura o de sololectura
341
+ * @param status
342
+ */
343
+
344
+ setReadOnly(status: boolean) {
345
+ this.readOnly = status;
346
+ this.controls.forEach((control) => {
347
+ if (control instanceof SpecialFormGroup) {
348
+ control.setReadOnly(status);
349
+ }
350
+ });
351
+ }
352
+
353
+ /**
354
+ * Vuelve todos los controles del formArray habilitados o deshabilitados
355
+ * @param status
356
+ */
357
+
358
+ setDisabled(status: boolean) {
359
+ status ? this.disable() : this.enable();
360
+ this.controls.forEach((control) => {
361
+ if (control instanceof SpecialFormGroup) {
362
+ control.setDisabled(status);
363
+ }
364
+ });
365
+ }
366
+
367
+ /**
368
+ * Permite editar un control especifico.
369
+ * @param index
370
+ */
371
+
372
+ editControl(index: number) {
373
+ this.form.reset(this.controls[index].value);
374
+ }
375
+
376
+ unpristineRequired() {
377
+ this.markAsDirty();
378
+ this.controls.forEach((item) => {
379
+ (<SpecialFormGroup>item).unpristineRequired();
380
+ });
381
+ }
382
+
383
+ recursiveFillForm(form: FormGroup, data: any): FormGroup {
384
+ Object.entries(form.controls).map(([key, control]) => {
385
+ if (control instanceof FormControl) {
386
+ control.setValue(data[key]);
387
+ } else if (control instanceof FormArray) {
388
+ data[key].forEach(() => {});
389
+ } else if (control instanceof FormGroup) {
390
+ control.reset(data[key]);
391
+ }
392
+ });
393
+ return form;
394
+ }
395
+ }
@@ -0,0 +1,22 @@
1
+ import { AsyncValidatorFn, ValidatorFn } from '@angular/forms';
2
+
3
+ export interface IFieldBasicData {
4
+ placeholder: string;
5
+ label: string;
6
+ tooltip: string;
7
+ icon: string;
8
+ elementId: string;
9
+ styleClasses: string;
10
+ length: number;
11
+ required: boolean;
12
+ hidden: boolean;
13
+ readOnly: boolean;
14
+ disabled:boolean;
15
+ errorMessages: { [key: string]: string };
16
+ }
17
+
18
+ export interface IFieldData extends IFieldBasicData {
19
+ validators: ValidatorFn | ValidatorFn[] | null;
20
+ asyncValidators: AsyncValidatorFn | AsyncValidatorFn[] | null;
21
+ defaultValue: any;
22
+ }
@@ -0,0 +1,83 @@
1
+ import { IAutocompleteField } from '../../components/special-autocomplete/special-autocomplete.interface';
2
+ import { IDatePickerField } from '../../components/special-datepicker/special-datepicker.interface';
3
+ import { IDropdownField } from '../../components/special-dropdown/special-dropdown.interface';
4
+ import { IInputField } from '../../components/special-input/special-input.interface';
5
+ import { ICheckboxField } from '../../components/special-checkbox/special-checkbox.interface';
6
+ import { IMultipleAutocompleteField } from '../../components/special-multiple-autocomplete/special-multiple-autocomplete.interface';
7
+ import { EControlTypes } from '../aux-data/control-types.enum';
8
+ import { IFieldData } from './field-basics.interfaces';
9
+ import { ITextAreaField } from '../../components/special-text-area/special-text-area.interface';
10
+ import { IUploadField } from '../../components/special-upload/special-upload.interface';
11
+ import { ILabelField } from '../../components/special-label/special-label.interface';
12
+
13
+ interface IcontrolName {
14
+ name: string;
15
+ }
16
+
17
+ export type IFormSettings = {
18
+ formFields: IFormStructure;
19
+ };
20
+
21
+ export interface IFormField extends IFieldData {
22
+ settings: IFormSettings;
23
+ type: EControlTypes.form;
24
+ }
25
+
26
+ export type IArraySettings = {
27
+ formFields: IFormStructure;
28
+ withFormHeader?: boolean;
29
+ withActionButtons?: boolean;
30
+ };
31
+
32
+ export interface IArrayField extends IFieldData {
33
+ settings: IArraySettings;
34
+ type: EControlTypes.array;
35
+ }
36
+
37
+ export interface IDefaultField extends IFieldData {
38
+ settings: any;
39
+ type: EControlTypes.default;
40
+ }
41
+
42
+ export type TRawFields =
43
+ | IDefaultField
44
+ | IInputField
45
+ | IDropdownField
46
+ | IArrayField
47
+ | IFormField
48
+ | IAutocompleteField
49
+ | IMultipleAutocompleteField
50
+ | IDatePickerField
51
+ | ITextAreaField
52
+ | IUploadField
53
+ | ILabelField
54
+ | ICheckboxField;
55
+
56
+ export type TSpecialInput = IInputField & IcontrolName;
57
+ export type TSpecialDefault = IDefaultField & IcontrolName;
58
+ export type TSpecialDropdown = IDropdownField & IcontrolName;
59
+ export type TSpecialArray = IArrayField & IcontrolName;
60
+ export type TSpecialForm = IFormField & IcontrolName;
61
+ export type TSpecialAutocomplete = IAutocompleteField & IcontrolName;
62
+ export type TSpecialDatepicker = IDatePickerField & IcontrolName;
63
+ export type ISpecialCheckbox = ICheckboxField & IcontrolName;
64
+ export type ISpecialTextArea = ITextAreaField & IcontrolName;
65
+ export type ISpecialLabel = ILabelField & IcontrolName;
66
+ export type ISpecialUpload = IUploadField & IcontrolName;
67
+
68
+ export type TSpecialFields =
69
+ | TSpecialDefault
70
+ | TSpecialInput
71
+ | TSpecialDropdown
72
+ | TSpecialArray
73
+ | TSpecialForm
74
+ | TSpecialAutocomplete
75
+ | ISpecialCheckbox
76
+ | ISpecialTextArea
77
+ | ISpecialUpload
78
+ | ISpecialLabel
79
+ | TSpecialDatepicker;
80
+
81
+ export interface IFormStructure {
82
+ [name: string]: Partial<TRawFields>;
83
+ }
@@ -0,0 +1,9 @@
1
+ import {
2
+ SpecialFormControl,
3
+ SpecialFormArray,
4
+ SpecialFormGroup,
5
+ } from '../forms/special-forms';
6
+
7
+ export abstract class ISpecialControl {
8
+ control: SpecialFormControl<any> | SpecialFormArray | SpecialFormGroup;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { createMask } from '@ngneat/input-mask';
2
+
3
+ export const currencyInputMask = createMask({
4
+ alias: 'numeric',
5
+ groupSeparator: ',',
6
+ autoUnmask: true,
7
+ digits: 2,
8
+ digitsOptional: false,
9
+ prefix: '$ ',
10
+ placeholder: '0',
11
+ });
@@ -0,0 +1,12 @@
1
+ import { currencyInputMask } from './currency.mask';
2
+ import { numberMask } from './number.mask';
3
+
4
+ export enum MasksEnum {
5
+ currency = 'CURRENCY',
6
+ numeric = 'NUMERIC',
7
+ }
8
+
9
+ export const Masks = {
10
+ [MasksEnum.currency]: currencyInputMask,
11
+ [MasksEnum.numeric]: numberMask(1000),
12
+ };
@@ -0,0 +1,4 @@
1
+ import { createMask } from '@ngneat/input-mask';
2
+
3
+ export const numberMask = (max = 1000) =>
4
+ createMask({ alias: 'numeric', min: 0, max });
@@ -0,0 +1,3 @@
1
+ import { SpecialFormBuilderService } from './special-form-builder/special-form-builder.service';
2
+
3
+ export { SpecialFormBuilderService };
@@ -0,0 +1,16 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+
3
+ import { SpecialFormBuilderService } from './special-form-builder.service';
4
+
5
+ describe('SpecialFormBuilderService', () => {
6
+ let service: SpecialFormBuilderService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({});
10
+ service = TestBed.inject(SpecialFormBuilderService);
11
+ });
12
+
13
+ it('should be created', () => {
14
+ expect(service).toBeTruthy();
15
+ });
16
+ });