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,82 @@
1
+ <div
2
+ class="w-full {{ control.styleClasses }}"
3
+ *ngIf="control && !control.hidden"
4
+ >
5
+ <mat-form-field
6
+ class="w-full"
7
+ [id]="control.elementId"
8
+ [appearance]="control.label ? 'outline' : 'standard'"
9
+ >
10
+ <mat-label *ngIf="control.label">
11
+ {{ control.label }}
12
+ </mat-label>
13
+ <input
14
+ type="text"
15
+ autocomplete="off"
16
+ [required]="control.required && !control.value?.length"
17
+ [readonly]="control.readOnly"
18
+ [placeholder]="control.placeholder"
19
+ matInput
20
+ [formControl]="internalControl"
21
+ [matAutocomplete]="auto"
22
+ />
23
+ <mat-autocomplete
24
+ class="autocomplete-options"
25
+ #auto="matAutocomplete"
26
+ [displayWith]="configValue"
27
+ (optionSelected)="optionSelected($event)"
28
+ >
29
+ <mat-option
30
+ *ngFor="let option of settings?.source | async"
31
+ [value]="option"
32
+ >
33
+ <div class="flex items-center">
34
+ <img
35
+ *ngIf="settings.fieldImage"
36
+ class="w-8 pr-2 object-contain"
37
+ alt=""
38
+ [src]="option | textByFunction: settings.fieldImage"
39
+ />
40
+ <span>
41
+ {{ option | textByFunction: settings.fieldName }}
42
+ </span>
43
+ </div>
44
+ </mat-option>
45
+ </mat-autocomplete>
46
+ <mat-icon *ngIf="control.icon" matPrefix>{{ control.icon }}</mat-icon>
47
+ <button
48
+ *ngIf="settings.icon"
49
+ mat-icon-button
50
+ matSuffix
51
+ (click)="iconClick($event)"
52
+ >
53
+ <mat-icon>
54
+ {{ settings.icon }}
55
+ </mat-icon>
56
+ </button>
57
+ <mat-hint>{{ control.tooltip }}</mat-hint>
58
+ <mat-error>
59
+ {{ control.errors | errorMessage: control.errorMessages }}
60
+ </mat-error>
61
+ </mat-form-field>
62
+
63
+ <mat-chip-list>
64
+ <mat-chip
65
+ class="chip-style"
66
+ *ngFor="let chip of control.value"
67
+ [removable]="true"
68
+ (removed)="remove(chip)"
69
+ >
70
+ <div class="flex items-center">
71
+ <img
72
+ *ngIf="settings.fieldImage"
73
+ class="w-8 pr-2 object-contain"
74
+ alt=""
75
+ [src]="chip | textByFunction: settings.fieldImage"
76
+ />
77
+ {{ chip | textByFunction: settings.fieldName }}
78
+ <mat-icon matChipRemove>cancel</mat-icon>
79
+ </div>
80
+ </mat-chip>
81
+ </mat-chip-list>
82
+ </div>
@@ -0,0 +1,23 @@
1
+ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { SpecialAutocompleteComponent } from '../special-autocomplete/special-autocomplete.component';
3
+
4
+ describe('SpecialAutocompleteComponent', () => {
5
+ let component: SpecialAutocompleteComponent;
6
+ let fixture: ComponentFixture<SpecialAutocompleteComponent>;
7
+
8
+ beforeEach(async(() => {
9
+ TestBed.configureTestingModule({
10
+ declarations: [SpecialAutocompleteComponent],
11
+ }).compileComponents();
12
+ }));
13
+
14
+ beforeEach(() => {
15
+ fixture = TestBed.createComponent(SpecialAutocompleteComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
@@ -0,0 +1,86 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import { debounceTime } from 'rxjs/operators';
3
+ import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
4
+ import { Subscription } from 'rxjs';
5
+ import { SpecialFormControl } from '../../core/forms/special-forms';
6
+ import { IMultipleAutocompleteSettings } from './special-multiple-autocomplete.interface';
7
+ import { FormControl } from '@angular/forms';
8
+
9
+ @Component({
10
+ selector: 'sp-multiple-autocomplete',
11
+ templateUrl: './special-multiple-autocomplete.component.html',
12
+ styleUrls: ['./special-multiple-autocomplete.component.scss'],
13
+ changeDetection: ChangeDetectionStrategy.OnPush,
14
+ })
15
+ export class SpecialMultipleAutocompleteComponent {
16
+ @Input() control: SpecialFormControl<IMultipleAutocompleteSettings>;
17
+
18
+ subs = new Subscription();
19
+ internalControl = new FormControl();
20
+
21
+ constructor() {}
22
+
23
+ ngOnInit() {
24
+ this.init();
25
+ }
26
+
27
+ get settings(): IMultipleAutocompleteSettings {
28
+ return this.control.settings;
29
+ }
30
+
31
+ init() {
32
+ this.subs.add(
33
+ this.internalControl.valueChanges
34
+ .pipe(debounceTime(500))
35
+ .subscribe((value) => {
36
+ if (typeof value === 'string') {
37
+ this.control.settings.getData(value, this.control);
38
+ }
39
+ })
40
+ );
41
+ }
42
+
43
+ optionSelected(data: MatAutocompleteSelectedEvent) {
44
+ const newItem = data.option.value;
45
+ this.internalControl.reset();
46
+ this.control.setValue([
47
+ ...(this.control.value || []).filter(
48
+ (item) =>
49
+ item[this.control.settings.fieldId] !==
50
+ newItem[this.control.settings.fieldId]
51
+ ),
52
+ newItem,
53
+ ]);
54
+
55
+ if (this.settings.onSelect) this.settings.onSelect(newItem);
56
+ }
57
+
58
+ iconClick(event) {
59
+ if (this.settings.iconAction) {
60
+ this.settings.iconAction(this.control.value);
61
+ event.stopPropagation();
62
+ }
63
+ }
64
+
65
+ remove(value: any[]): void {
66
+ let currentValues = Array.from(this.control.value);
67
+ const index = currentValues.indexOf(value);
68
+
69
+ if (index > -1) {
70
+ currentValues.splice(index, 1);
71
+ const value = currentValues;
72
+ this.control.markAsDirty();
73
+ this.control.setValue(value);
74
+ }
75
+ }
76
+
77
+ configValue = (item: any) => {
78
+ if (!item) return '';
79
+ const fieldName = this.control.settings.fieldName;
80
+ return fieldName instanceof Function ? fieldName(item) : item[fieldName];
81
+ };
82
+
83
+ ngOnDestroy() {
84
+ this.subs.unsubscribe();
85
+ }
86
+ }
@@ -0,0 +1,20 @@
1
+ import { AbstractControl } from '@angular/forms';
2
+ import { Observable } from 'rxjs';
3
+ import { EControlTypes } from '../../core/aux-data/control-types.enum';
4
+ import { IFieldData } from '../../core/interfaces/field-basics.interfaces';
5
+
6
+ export type IMultipleAutocompleteSettings = {
7
+ getData: (query: string, control?: AbstractControl) => void;
8
+ source: Observable<any[]>;
9
+ fieldId: string;
10
+ icon?: string;
11
+ iconAction?: (data: any) => void;
12
+ onSelect?: (data: any) => void;
13
+ fieldName: string | ((a?: any) => string);
14
+ fieldImage?: string | ((a?: any) => string);
15
+ };
16
+
17
+ export interface IMultipleAutocompleteField extends IFieldData {
18
+ settings: IMultipleAutocompleteSettings;
19
+ type: EControlTypes.multiple;
20
+ }
@@ -0,0 +1,28 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatIconModule } from '@angular/material/icon';
6
+ import { ReactiveFormsModule } from '@angular/forms';
7
+ import { ErrorMessagePipeModule, TextByFunctionPipeModule } from '../../pipes';
8
+ import { MatInputModule } from '@angular/material/input';
9
+ import { MatChipsModule } from '@angular/material/chips';
10
+ import { SpecialMultipleAutocompleteComponent } from './special-multiple-autocomplete.component';
11
+
12
+ @NgModule({
13
+ declarations: [SpecialMultipleAutocompleteComponent],
14
+ imports: [
15
+ MatInputModule,
16
+ CommonModule,
17
+ MatAutocompleteModule,
18
+ MatIconModule,
19
+ ReactiveFormsModule,
20
+ MatButtonModule,
21
+ ErrorMessagePipeModule,
22
+ TextByFunctionPipeModule,
23
+ MatChipsModule,
24
+
25
+ ],
26
+ exports: [SpecialMultipleAutocompleteComponent],
27
+ })
28
+ export class SpecialMultipleAutocompleteModule {}
@@ -0,0 +1,81 @@
1
+ import { Meta, moduleMetadata, Story } from '@storybook/angular';
2
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
3
+ import { FormControlViewerModule } from '../../aux-storybook-components/form-control-viewer/form-control-viewer.module';
4
+ import { FormControlViewerComponent } from '../../aux-storybook-components/form-control-viewer/form-control-viewer.component';
5
+ import { ICONS_CONTROL } from '../../core/controls/icons.control';
6
+ import { action } from '@storybook/addon-actions';
7
+ import { countries } from '../../core/aux-data/countries';
8
+ import { FieldBasicData } from '../../core/aux-data/field-basic-data';
9
+ import { THEMES_CONTROL } from '../../core/controls/theme.control';
10
+ import { EControlTypes } from '../../core/aux-data/control-types.enum';
11
+
12
+ export default {
13
+ title: 'Special multiple autocomplete control',
14
+ component: FormControlViewerComponent,
15
+ decorators: [
16
+ moduleMetadata({
17
+ imports: [FormControlViewerModule, BrowserAnimationsModule],
18
+ }),
19
+ ],
20
+ argTypes: {
21
+ icon: ICONS_CONTROL,
22
+ theme: THEMES_CONTROL,
23
+ },
24
+ } as Meta;
25
+
26
+ const Template: Story<FormControlViewerComponent> = (
27
+ args: FormControlViewerComponent
28
+ ) => ({
29
+ title: 'Special multiple autocomplete control',
30
+ template: `
31
+ <spf-form-control-viewer
32
+ (getData)="getData($event)"
33
+ [theme]="theme"
34
+ [autocomplete]="{
35
+ placeholder: placeholder,
36
+ label: label,
37
+ tooltip: tooltip,
38
+ icon: icon,
39
+ elementId: elementId,
40
+ styleClasses: styleClasses,
41
+ length: 0,
42
+ required: required,
43
+ hidden: false,
44
+ readOnly: readOnly,
45
+ defaultValue:defaultValue,
46
+ type: type,
47
+ errorMessages: errorMessages,
48
+ settings:{
49
+ fieldId: fieldId,
50
+ fieldName:fieldName,
51
+ source:source
52
+ }
53
+ }"
54
+ >
55
+ </spf-form-control-viewer>`,
56
+ props: {
57
+ ...args,
58
+ getData: action('Get data'),
59
+ type: EControlTypes.multiple,
60
+ },
61
+ });
62
+
63
+ export const light = Template.bind({});
64
+ light.args = {
65
+ ...FieldBasicData,
66
+ theme: 'light-theme',
67
+ defaultValue: [{ name: 'Colombia', code: 'CO' }],
68
+ fieldName: 'name',
69
+ fieldId: 'code',
70
+ source: countries(),
71
+ };
72
+
73
+ export const dark = Template.bind({});
74
+ dark.args = {
75
+ ...FieldBasicData,
76
+ theme: 'dark-theme',
77
+ defaultValue: [{ name: 'Colombia', code: 'CO' }],
78
+ fieldName: 'name',
79
+ fieldId: 'code',
80
+ source: countries(),
81
+ };
@@ -0,0 +1,29 @@
1
+ <mat-form-field
2
+ *ngIf="control"
3
+ [id]="control.elementId"
4
+ class="w-full {{ control.styleClasses }}"
5
+ [appearance]="control.label ? 'outline' : 'standard'"
6
+ >
7
+ <mat-label *ngIf="control.label">{{ control.label }}</mat-label>
8
+ <textarea
9
+ cdkTextareaAutosize
10
+ #autosize="cdkTextareaAutosize"
11
+ cdkAutosizeMinRows="1"
12
+ cdkAutosizeMaxRows="5"
13
+ matInput
14
+ (blur)="onBlur.emit(control.value)"
15
+ (keydown.enter)="onEnter.emit(control.value)"
16
+ [type]="control.settings?.type || 'text'"
17
+ [readonly]="control.readOnly"
18
+ [required]="control.required"
19
+ [placeholder]="control.placeholder"
20
+ [formControl]="control"
21
+ ></textarea>
22
+ <mat-icon *ngIf="control.icon" matPrefix>{{ control.icon }} </mat-icon>
23
+ <mat-hint>
24
+ {{ control.tooltip }}
25
+ </mat-hint>
26
+ <mat-error>
27
+ {{ control.errors | errorMessage: control.errorMessages }}
28
+ </mat-error>
29
+ </mat-form-field>
@@ -0,0 +1,23 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { SpecialTextAreaComponent } from './special-text-area.component';
4
+
5
+ describe('SpecialTextAreaComponent', () => {
6
+ let component: SpecialTextAreaComponent;
7
+ let fixture: ComponentFixture<SpecialTextAreaComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ SpecialTextAreaComponent ]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(SpecialTextAreaComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
@@ -0,0 +1,20 @@
1
+ import { ChangeDetectionStrategy } from '@angular/core';
2
+ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
3
+ import { SpecialFormControl } from '../../core/forms/special-forms';
4
+ import { ITextAreaField } from './special-text-area.interface';
5
+ @Component({
6
+ selector: 'sp-text-area',
7
+ templateUrl: './special-text-area.component.html',
8
+ styleUrls: ['./special-text-area.component.scss'],
9
+ changeDetection: ChangeDetectionStrategy.OnPush,
10
+ })
11
+ export class SpecialTextAreaComponent implements OnInit {
12
+ @Input() control: SpecialFormControl<ITextAreaField>;
13
+
14
+ @Output() onBlur: EventEmitter<any> = new EventEmitter();
15
+ @Output() onEnter: EventEmitter<any> = new EventEmitter();
16
+
17
+ constructor() {}
18
+
19
+ ngOnInit(): void {}
20
+ }
@@ -0,0 +1,9 @@
1
+ import { EControlTypes } from '../../core/aux-data/control-types.enum';
2
+ import { IFieldData } from '../../core/interfaces/field-basics.interfaces';
3
+
4
+ export type ITextAreaSettings = {};
5
+
6
+ export interface ITextAreaField extends IFieldData {
7
+ settings: ITextAreaSettings;
8
+ type: EControlTypes.textArea;
9
+ }
@@ -0,0 +1,24 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SpecialTextAreaComponent } from './special-text-area.component';
4
+ import { MatInputModule } from '@angular/material/input';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { InputMaskModule } from '@ngneat/input-mask';
7
+ import { MatIconModule } from '@angular/material/icon';
8
+ import { ReactiveFormsModule } from '@angular/forms';
9
+ import { ErrorMessagePipeModule } from '../../pipes';
10
+
11
+ @NgModule({
12
+ declarations: [SpecialTextAreaComponent],
13
+ imports: [
14
+ InputMaskModule,
15
+ CommonModule,
16
+ MatInputModule,
17
+ MatIconModule,
18
+ ReactiveFormsModule,
19
+ MatButtonModule,
20
+ ErrorMessagePipeModule,
21
+ ],
22
+ exports: [SpecialTextAreaComponent],
23
+ })
24
+ export class SpecialTextAreaModule {}
@@ -0,0 +1,69 @@
1
+ import { Story, Meta } from '@storybook/angular';
2
+ import { moduleMetadata } from '@storybook/angular';
3
+ import { FormControlViewerModule } from '../../aux-storybook-components/form-control-viewer/form-control-viewer.module';
4
+ import { FormControlViewerComponent } from '../../aux-storybook-components/form-control-viewer/form-control-viewer.component';
5
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
6
+ import { EControlTypes } from '../../core/aux-data/control-types.enum';
7
+ import { ICONS_CONTROL } from '../../core/controls';
8
+ import { FieldBasicData } from '../../core/aux-data/field-basic-data';
9
+ import { THEMES_CONTROL } from '../../core/controls/theme.control';
10
+
11
+ export default {
12
+ title: 'Special text area control',
13
+ component: FormControlViewerComponent,
14
+ decorators: [
15
+ moduleMetadata({
16
+ imports: [FormControlViewerModule, BrowserAnimationsModule],
17
+ }),
18
+ ],
19
+ argTypes: {
20
+ icon: ICONS_CONTROL,
21
+ theme: THEMES_CONTROL,
22
+ length: { control: { type: 'range', min: 1, max: 100, step: 5 } },
23
+ },
24
+ } as Meta;
25
+
26
+ const Template: Story<FormControlViewerComponent> = (
27
+ args: FormControlViewerComponent
28
+ ) => ({
29
+ title: 'Special text area control',
30
+ template: `
31
+ <spf-form-control-viewer
32
+ [theme]="theme"
33
+ [field]="{
34
+ placeholder: placeholder,
35
+ label: label,
36
+ tooltip: tooltip,
37
+ icon: icon,
38
+ elementId: elementId,
39
+ styleClasses: styleClasses,
40
+ length: length,
41
+ defaultValue:defaultValue,
42
+ required: required,
43
+ hidden: false,
44
+ readOnly: readOnly,
45
+ disabled: disabled,
46
+ type: type,
47
+ errorMessages: errorMessages
48
+ }"
49
+ >
50
+ </spf-form-control-viewer>`,
51
+ props: {
52
+ ...args,
53
+ type: EControlTypes.textArea,
54
+ },
55
+ });
56
+
57
+ export const light = Template.bind({});
58
+ light.args = {
59
+ ...FieldBasicData,
60
+ theme: 'light-theme',
61
+ defaultValue: 'Default',
62
+ };
63
+
64
+ export const dark = Template.bind({});
65
+ dark.args = {
66
+ ...FieldBasicData,
67
+ theme: 'dark-theme',
68
+ defaultValue: 'Default',
69
+ };
@@ -0,0 +1,50 @@
1
+ <div class="special_upload mb-2">
2
+ <ngx-dropzone
3
+ class="special_upload__dropzone"
4
+ [ngClass]="{
5
+ 'special_upload--error-dashed':
6
+ !!control.errors && (control.dirty || control.touched)
7
+ }"
8
+ [multiple]="control.settings?.multiple"
9
+ [accept]="
10
+ control.settings?.accept
11
+ ? control.settings?.accept
12
+ : 'image/png, .jpeg, .jpg, image/gif'
13
+ "
14
+ (change)="
15
+ control.settings?.multiple
16
+ ? onSelectMultiple($event)
17
+ : onSelectOne($event)
18
+ "
19
+ >
20
+ <ngx-dropzone-label
21
+ [ngClass]="{
22
+ 'special_upload--error':
23
+ !!control.errors && (control.dirty || control.touched)
24
+ }"
25
+ >
26
+ <mat-icon class="special_upload__icon"*ngIf="control.icon">{{ control.icon }} </mat-icon>
27
+ <h2 class="text-base font-bold">
28
+ {{ control.label }}
29
+ </h2>
30
+ <h3 class="text-base">
31
+ {{ control.placeholder }}
32
+ </h3>
33
+ </ngx-dropzone-label>
34
+ <ngx-dropzone-preview
35
+ *ngFor="let file of previewImages"
36
+ [removable]="true"
37
+ (removed)="onRemove(file)"
38
+ >
39
+ <ngx-dropzone-label class="special_upload__card">
40
+ <img class="special_upload__card--image" [src]="file?.url" alt="" />
41
+ </ngx-dropzone-label>
42
+ </ngx-dropzone-preview>
43
+ </ngx-dropzone>
44
+ <div
45
+ class="special_upload--error mt-2"
46
+ *ngIf="!!control.errors && (control.dirty || control.touched)"
47
+ >
48
+ {{ control.errors | errorMessage: control.errorMessages }}
49
+ </div>
50
+ </div>
@@ -0,0 +1,29 @@
1
+ :host {
2
+ display: contents;
3
+ .special-upload {
4
+ margin-bottom: 2rem;
5
+
6
+ &__icon{
7
+ height: 64px;
8
+ width: 64px;
9
+ font-size: 64px;
10
+ }
11
+
12
+ &__card {
13
+ width: 100%;
14
+ height: 100%;
15
+ margin: 0;
16
+ box-sizing: border-box;
17
+ display: flex;
18
+ align-items: center;
19
+ flex-direction: column;
20
+
21
+ &--image {
22
+ width: 100%;
23
+ height: 100%;
24
+ object-fit: cover;
25
+ }
26
+ }
27
+ }
28
+ }
29
+
@@ -0,0 +1,23 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { SpecialUploadComponent } from './special-upload.component';
4
+
5
+ describe('SpecialUploadComponent', () => {
6
+ let component: SpecialUploadComponent;
7
+ let fixture: ComponentFixture<SpecialUploadComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ SpecialUploadComponent ]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(SpecialUploadComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });