mss-engine-forms
Version:
A simple typehead library developed by MSS development team to be used for dynamic forms
1 lines • 66 kB
Source Map (JSON)
{"version":3,"file":"mss-engine-forms.mjs","sources":["../../../projects/mss-forms/src/lib/mss-forms.service.ts","../../../projects/mss-forms/src/lib/_helpers/comma-replace.directive.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-input/dynamic-input.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-input/dynamic-input.component.html","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-select/dynamic-select.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-select/dynamic-select.component.html","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-radio/dynamic-radio.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-radio/dynamic-radio.component.html","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-checkboxs/dynamic-checkboxs.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-checkboxs/dynamic-checkboxs.component.html","../../../projects/mss-forms/src/lib/_helpers/dynamic-form-type.enum.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-textarea/dynamic-textarea.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-textarea/dynamic-textarea.component.html","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-slider/dynamic-slider.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-slider/dynamic-slider.component.html","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-date/dynamic-date.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-date/dynamic-date.component.html","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-field.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-field/dynamic-field.component.html","../../../projects/mss-forms/src/lib/components/dynamic-error/dynamic-error.component.ts","../../../projects/mss-forms/src/lib/components/dynamic-error/dynamic-error.component.html","../../../projects/mss-forms/src/lib/_helpers/breakpoints.pipe.ts","../../../projects/mss-forms/src/lib/mss-forms.component.ts","../../../projects/mss-forms/src/lib/mss-forms.component.html","../../../projects/mss-forms/src/lib/mss-forms.module.ts","../../../projects/mss-forms/src/lib/_helpers/breakpoint.model.ts","../../../projects/mss-forms/src/lib/_helpers/dynamic-form.model.ts","../../../projects/mss-forms/src/public-api.ts","../../../projects/mss-forms/src/mss-engine-forms.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MssFormsService {\n\n constructor() { }\n}\n","import { Directive, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\nimport { NgControl } from '@angular/forms';\n\n@Directive({\n selector: '[replaceCommaByDot]',\n})\nexport class ReplaceCommaByDotDirective {\n\n @Input() replaceCommaByDot: boolean = false;\n private regex: RegExp = new RegExp(/^\\d+[.,]?\\d{0,3}$/g);\n constructor(private el: ElementRef, private control: NgControl) { }\n\n @HostListener('keydown', ['$event']) onKeyDown(event: any) {\n let e = <KeyboardEvent>event;\n if (this.replaceCommaByDot) {\n if (this.control?.value?.indexOf('.') != -1 && (e.keyCode == 188 || e.keyCode == 110)) {\n e.preventDefault();\n // return\n }\n if ([46, 8, 9, 27, 13, 110, 190].indexOf(e.keyCode) !== -1 ||\n // Allow: Ctrl+A\n (e.keyCode == 65 && e.ctrlKey === true) ||\n // Allow: Ctrl+C\n (e.keyCode == 67 && e.ctrlKey === true) ||\n // Allow: Ctrl+X\n (e.keyCode == 88 && e.ctrlKey === true) ||\n // Allow: home, end, left, right\n (e.keyCode >= 35 && e.keyCode <= 39) ||\n\n (e.keyCode >= 188)\n ) {\n // let it happen, don't do anything\n return;\n }\n\n const current: string = this.el.nativeElement.value;\n const position = this.el.nativeElement.selectionStart;\n const next: string = [current.slice(0, position), event.key == 'Decimal' ? '.' : event.key, current.slice(position)].join('');\n if (next && !String(next).match(this.regex)) {\n event.preventDefault();\n }\n\n // Ensure that it is a number and stop the keypress\n if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {\n e.preventDefault();\n }\n\n }\n }\n\n @HostListener('input', ['$event'])\n keyup() {\n if (this.replaceCommaByDot && this.control.value) this.control?.control?.setValue(this.control.value.replace(/,/g, '.') as number);\n }\n\n}","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges, forwardRef } from \"@angular/core\";\nimport { ControlValueAccessor, FormGroup, FormGroupDirective, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-input\",\n templateUrl: \"./dynamic-input.component.html\",\n styleUrls: [\"./dynamic-input.component.css\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicInputComponent implements OnChanges {\n\n\n @Input() field: any;\n formName: FormGroup;\n tempType: string = \"\"\n\n\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n\n ngOnChanges() {\n this.tempType = this.field?.isAmount ? 'text' : this.field.type\n }\n\n getFieldClassname() {\n return {\n [this.field.customClass]: this.field?.customClass\n }\n }\n}\n","<form [formGroup]=\"formName\">\n <div class=\"form-group\" [ngClass]=\"getFieldClassname()\">\n <label>{{field.label}} <span *ngIf=\"field?.rules?.required\" class=\"red-asterisk\">*</span>\n <button *ngIf=\"field.is_info\" class=\"mss-label-info\" placement=\"top\" [ngbTooltip]=\"field.info_txt\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#clip0_617_5380)\">\n <path\n d=\"M8 0C6.41775 0 4.87104 0.469192 3.55544 1.34824C2.23985 2.22729 1.21447 3.47672 0.608967 4.93853C0.00346629 6.40034 -0.15496 8.00887 0.153721 9.56072C0.462403 11.1126 1.22433 12.538 2.34315 13.6569C3.46197 14.7757 4.88743 15.5376 6.43928 15.8463C7.99113 16.155 9.59966 15.9965 11.0615 15.391C12.5233 14.7855 13.7727 13.7602 14.6518 12.4446C15.5308 11.129 16 9.58225 16 8C15.9977 5.87897 15.1541 3.84547 13.6543 2.34568C12.1545 0.845886 10.121 0.00229405 8 0V0ZM8 14.6667C6.68146 14.6667 5.39253 14.2757 4.2962 13.5431C3.19987 12.8106 2.34539 11.7694 1.84081 10.5512C1.33622 9.33305 1.2042 7.99261 1.46144 6.6994C1.71867 5.40619 2.35361 4.21831 3.28596 3.28596C4.21831 2.35361 5.4062 1.71867 6.6994 1.46143C7.99261 1.2042 9.33305 1.33622 10.5512 1.8408C11.7694 2.34539 12.8106 3.19987 13.5431 4.2962C14.2757 5.39253 14.6667 6.68146 14.6667 8C14.6647 9.76752 13.9617 11.4621 12.7119 12.7119C11.4621 13.9617 9.76752 14.6647 8 14.6667Z\"\n fill=\"#0B487F\" />\n <path\n d=\"M7.99983 6.66699H7.33317C7.15636 6.66699 6.98679 6.73723 6.86177 6.86225C6.73674 6.98728 6.6665 7.15685 6.6665 7.33366C6.6665 7.51047 6.73674 7.68004 6.86177 7.80506C6.98679 7.93009 7.15636 8.00033 7.33317 8.00033H7.99983V12.0003C7.99983 12.1771 8.07007 12.3467 8.1951 12.4717C8.32012 12.5968 8.48969 12.667 8.6665 12.667C8.84331 12.667 9.01288 12.5968 9.1379 12.4717C9.26293 12.3467 9.33317 12.1771 9.33317 12.0003V8.00033C9.33317 7.6467 9.19269 7.30757 8.94264 7.05752C8.69259 6.80747 8.35346 6.66699 7.99983 6.66699Z\"\n fill=\"#0B487F\" />\n <path\n d=\"M8 5.33301C8.55228 5.33301 9 4.88529 9 4.33301C9 3.78072 8.55228 3.33301 8 3.33301C7.44772 3.33301 7 3.78072 7 4.33301C7 4.88529 7.44772 5.33301 8 5.33301Z\"\n fill=\"#0B487F\" />\n </g>\n <defs>\n <clipPath id=\"clip0_617_5380\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </button> </label>\n <input [type]=\"tempType\" [formControlName]=\"field.fieldName\" [value]=\"field.value\"\n [ngClass]=\"{'is-invalid':formName.controls[field.fieldName]?.invalid && (formName.controls[field.fieldName]?.dirty || formName.controls[field.fieldName]?.touched)}\"\n [placeholder]=\"field.placeholder ? field.placeholder : ''\" [mask]=\"field.mask ? field.mask : ''\"\n [replaceCommaByDot]=\"field?.isAmount\" />\n <ng-container *ngIf=\"field.type == 'password'\">\n <a class=\"password-eye\" (click)=\"tempType == 'password' ? tempType = 'text' : tempType = 'password'\">\n <svg *ngIf=\"tempType == 'password'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M9.99978 13.75C8.02452 13.75 6.42556 12.2211 6.27843 10.2836L3.54666 8.17244C3.18754 8.62297 2.85707 9.09927 2.59041 9.6201C2.53083 9.73794 2.4998 9.86814 2.4998 10.0002C2.4998 10.1322 2.53083 10.2624 2.59041 10.3803C4.00265 13.1357 6.79848 15 9.99978 15C10.7006 15 11.3766 14.8959 12.0282 14.7277L10.6769 13.6821C10.4537 13.7252 10.2271 13.7479 9.99978 13.75ZM18.1722 15.2631L15.2933 13.0381C16.1678 12.3011 16.887 11.3975 17.4092 10.38C17.4687 10.2622 17.4998 10.132 17.4998 9.99992C17.4998 9.86787 17.4687 9.73768 17.4092 9.61984C15.9969 6.86437 13.2011 5.00005 9.99978 5.00005C8.65903 5.00167 7.34005 5.33921 6.16332 5.98182L2.8503 3.42114C2.8071 3.38752 2.7577 3.36275 2.70491 3.34823C2.65213 3.33371 2.59701 3.32974 2.54269 3.33654C2.48837 3.34333 2.43593 3.36076 2.38835 3.38784C2.34077 3.41491 2.29899 3.45109 2.26541 3.49432L1.75421 4.15239C1.6864 4.23963 1.65601 4.35023 1.66973 4.45986C1.68345 4.5695 1.74016 4.6692 1.82739 4.73703L17.1493 16.579C17.1925 16.6126 17.2419 16.6373 17.2946 16.6519C17.3474 16.6664 17.4026 16.6704 17.4569 16.6636C17.5112 16.6568 17.5636 16.6393 17.6112 16.6123C17.6588 16.5852 17.7006 16.549 17.7342 16.5058L18.2456 15.8477C18.3134 15.7604 18.3437 15.6498 18.33 15.5402C18.3162 15.4305 18.2594 15.3309 18.1722 15.2631ZM13.3878 11.5652L12.3644 10.774C12.4506 10.5249 12.4963 10.2636 12.4998 10C12.5049 9.61418 12.4194 9.2325 12.2502 8.88566C12.081 8.53882 11.8328 8.2365 11.5256 8.00297C11.2184 7.76944 10.8607 7.61122 10.4812 7.54102C10.1017 7.47082 9.7111 7.49059 9.34067 7.59875C9.4977 7.81153 9.58265 8.06892 9.58311 8.33338C9.57923 8.42138 9.56578 8.5087 9.54301 8.5938L7.62608 7.11229C8.29196 6.55583 9.132 6.25069 9.99978 6.25005C10.4923 6.24977 10.9801 6.34658 11.4352 6.53494C11.8903 6.7233 12.3038 6.99951 12.652 7.34779C13.0003 7.69606 13.2765 8.10957 13.4649 8.56466C13.6532 9.01976 13.7501 9.50751 13.7498 10C13.7498 10.5633 13.612 11.0883 13.3878 11.5654V11.5652Z\"\n fill=\"#9FA2B4\" />\n </svg>\n <svg *ngIf=\"tempType == 'text'\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:svgjs=\"http://svgjs.com/svgjs\" width=\"512\"\n height=\"512\" x=\"0\" y=\"0\" viewBox=\"0 0 487.55 487.55\" style=\"enable-background:new 0 0 512 512\"\n width=\"20\" height=\"20\" xml:space=\"preserve\" class=\"\">\n <g>\n <path\n d=\"M244.625 171.415c-40 0-72.4 32.4-72.4 72.4s32.4 72.4 72.4 72.4 72.4-32.4 72.4-72.4c-.1-40-32.5-72.4-72.4-72.4zm0 48.8c-13 0-23.6 10.6-23.6 23.6 0 6-4.8 10.8-10.8 10.8s-10.8-4.8-10.8-10.8c0-24.9 20.3-45.2 45.2-45.2 6 0 10.8 4.8 10.8 10.8 0 6-4.9 10.8-10.8 10.8z\"\n fill=\"#333\" data-original=\"#000000\" class=\"\" opacity=\"1\"></path>\n <path\n d=\"M481.325 227.515c-224.8-258.6-428-53.9-476.4 2.8-6.5 7.6-6.6 18.8-.1 26.4 221.9 259 423.4 64.6 476.5 3.7 8.3-9.4 8.3-23.4 0-32.9zm-236.7 119.1c-56.8 0-102.8-46-102.8-102.8s46-102.8 102.8-102.8 102.8 46 102.8 102.8-46.1 102.8-102.8 102.8z\"\n fill=\"#333\" data-original=\"#000000\" class=\"\" opacity=\"1\"></path>\n </g>\n </svg>\n </a>\n </ng-container>\n </div>\n</form>","import { Component, Input, OnInit } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-select\",\n templateUrl: \"./dynamic-select.component.html\",\n styleUrls: [\"./dynamic-select.component.css\"],\n})\nexport class DynamicSelectComponent {\n @Input() field: any;\n formName: FormGroup;\n\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n}\n","<form [formGroup]=\"formName\">\n <div class=\"form-group\">\n <label>{{field.label}} <span *ngIf=\"field?.rules?.required\" class=\"red-asterisk\">*</span></label>\n <!-- <select [formControlName]=\"field.fieldName\">\n <option *ngFor=\"let option of field.options\" [value]=\"option.value\">\n {{option.label}}\n </option>\n </select> -->\n <ng-select [items]=\"field.options\" bindLabel=\"label\" bindValue=\"value\" [formControlName]=\"field.fieldName\"\n [placeholder]=\"field.placeholder\">\n </ng-select>\n </div>\n</form>","import { Component, Input, OnInit } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-radio\",\n templateUrl: \"./dynamic-radio.component.html\",\n styleUrls: [\"./dynamic-radio.component.css\"],\n})\nexport class DynamicRadioComponent {\n @Input() field: any;\n formName: FormGroup;\n\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n}\n","<form [formGroup]=\"formName\">\n <h3>{{field.label}} <span *ngIf=\"field?.rules?.required\" class=\"red-asterisk\">*</span></h3>\n <label *ngFor=\"let option of field.options\">\n <label ngFor=\"let option of field.options\">\n <input type=\"radio\"\n [name]=\"field.fieldName\"\n [formControlName]=\"field.fieldName\"\n [value]=\"option.value\"\n >\n {{option.label}}\n </label>\n </label>\n</form>","import { Component, Input, OnInit } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-checkboxs\",\n templateUrl: \"./dynamic-checkboxs.component.html\",\n styleUrls: [\"./dynamic-checkboxs.component.css\"],\n})\nexport class DynamicCheckboxsComponent {\n @Input() field: any;\n formName: FormGroup;\n\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n}\n","<form [formGroup]=\"formName\">\n <div class=\"form-group\">\n <label>\n {{ field.label }}\n <input type=\"checkbox\" [name]=\"field.fieldName\" [formControlName]=\"field.fieldName\" [value]=\"field.value\" />\n </label>\n </div>\n</form>","export enum DynamicFormTypes {\n TEXT = \"text\",\n NUMBER = \"number\",\n PHONE = \"tel\",\n EMAIL = \"email\",\n PASSWORD = \"password\",\n SELECT = \"select\",\n DATE = \"date\",\n RADIO = \"radio\",\n CHECKBOX = \"checkbox\",\n TEXTAREA = \"textarea\",\n SLIDER = \"slider\",\n}","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-textarea\",\n templateUrl: \"./dynamic-textarea.component.html\",\n styleUrls: [\"./dynamic-textarea.component.css\"],\n changeDetection:ChangeDetectionStrategy.OnPush\n})\nexport class DynamicTextareaComponent implements OnChanges {\n @Input() field: any;\n formName: FormGroup;\n tempType: string = \"\"\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n\n ngOnChanges() {\n console.log({DynamicInputComponentField:this.field})\n this.tempType = this.field.type\n }\n\n getFieldClassname() {\n return {\n [this.field.customClass]: this.field?.customClass\n }\n }\n}\n","<form [formGroup]=\"formName\">\n <div class=\"form-group\" [ngClass]=\"getFieldClassname()\">\n <label>{{field.label}} <span *ngIf=\"field?.rules?.required\" class=\"red-asterisk\">*</span>\n <button *ngIf=\"field.is_info\" class=\"mss-label-info\" placement=\"top\" [ngbTooltip]=\"field.info_txt\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clip-path=\"url(#clip0_617_5380)\">\n <path\n d=\"M8 0C6.41775 0 4.87104 0.469192 3.55544 1.34824C2.23985 2.22729 1.21447 3.47672 0.608967 4.93853C0.00346629 6.40034 -0.15496 8.00887 0.153721 9.56072C0.462403 11.1126 1.22433 12.538 2.34315 13.6569C3.46197 14.7757 4.88743 15.5376 6.43928 15.8463C7.99113 16.155 9.59966 15.9965 11.0615 15.391C12.5233 14.7855 13.7727 13.7602 14.6518 12.4446C15.5308 11.129 16 9.58225 16 8C15.9977 5.87897 15.1541 3.84547 13.6543 2.34568C12.1545 0.845886 10.121 0.00229405 8 0V0ZM8 14.6667C6.68146 14.6667 5.39253 14.2757 4.2962 13.5431C3.19987 12.8106 2.34539 11.7694 1.84081 10.5512C1.33622 9.33305 1.2042 7.99261 1.46144 6.6994C1.71867 5.40619 2.35361 4.21831 3.28596 3.28596C4.21831 2.35361 5.4062 1.71867 6.6994 1.46143C7.99261 1.2042 9.33305 1.33622 10.5512 1.8408C11.7694 2.34539 12.8106 3.19987 13.5431 4.2962C14.2757 5.39253 14.6667 6.68146 14.6667 8C14.6647 9.76752 13.9617 11.4621 12.7119 12.7119C11.4621 13.9617 9.76752 14.6647 8 14.6667Z\"\n fill=\"#0B487F\" />\n <path\n d=\"M7.99983 6.66699H7.33317C7.15636 6.66699 6.98679 6.73723 6.86177 6.86225C6.73674 6.98728 6.6665 7.15685 6.6665 7.33366C6.6665 7.51047 6.73674 7.68004 6.86177 7.80506C6.98679 7.93009 7.15636 8.00033 7.33317 8.00033H7.99983V12.0003C7.99983 12.1771 8.07007 12.3467 8.1951 12.4717C8.32012 12.5968 8.48969 12.667 8.6665 12.667C8.84331 12.667 9.01288 12.5968 9.1379 12.4717C9.26293 12.3467 9.33317 12.1771 9.33317 12.0003V8.00033C9.33317 7.6467 9.19269 7.30757 8.94264 7.05752C8.69259 6.80747 8.35346 6.66699 7.99983 6.66699Z\"\n fill=\"#0B487F\" />\n <path\n d=\"M8 5.33301C8.55228 5.33301 9 4.88529 9 4.33301C9 3.78072 8.55228 3.33301 8 3.33301C7.44772 3.33301 7 3.78072 7 4.33301C7 4.88529 7.44772 5.33301 8 5.33301Z\"\n fill=\"#0B487F\" />\n </g>\n <defs>\n <clipPath id=\"clip0_617_5380\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </button> </label>\n <textarea name=\"field.fieldName\" [formControlName]=\"field.fieldName\"\n [ngClass]=\"{'is-invalid':formName.controls[field.fieldName]?.invalid && (formName.controls[field.fieldName]?.dirty || formName.controls[field.fieldName]?.touched)}\"\n [placeholder]=\"field.placeholder ? field.placeholder : ''\"></textarea>\n </div>\n</form>","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-slider\",\n templateUrl: \"./dynamic-slider.component.html\",\n styleUrls: [\"./dynamic-slider.component.css\"],\n changeDetection:ChangeDetectionStrategy.OnPush\n})\nexport class DynamicSliderComponent implements OnChanges {\n @Input() field: any;\n formName: FormGroup;\n tempType: string = \"\"\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n\n ngOnChanges() {\n console.log({DynamicInputComponentField:this.field})\n this.tempType = this.field.type\n }\n\n getFieldClassname() {\n return {\n [this.field.customClass]: this.field?.customClass\n }\n }\n}\n","<form [formGroup]=\"formName\">\n <div class=\"form-group\" [ngClass]=\"getFieldClassname()\">\n <label>{{field.label}} <span *ngIf=\"field?.rules?.required\" class=\"red-asterisk\">*</span></label>\n <ngx-slider [(value)]=\"field.sliderValue\" [(highValue)]=\"field.sliderHignValue\"\n [formControlName]=\"field.fieldName\" [options]=\"field.sliderOptions\"></ngx-slider>\n <p class=\"text-center mb-2\">\n De {{field.sliderValue}} Dinars - à {{field.sliderHignValue}} Dinars\n </p>\n </div>\n</form>","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-date\",\n templateUrl: \"./dynamic-date.component.html\",\n styleUrls: [\"./dynamic-date.component.css\"],\n changeDetection:ChangeDetectionStrategy.OnPush\n})\nexport class DynamicDateComponent implements OnChanges {\n @Input() field: any;\n formName: FormGroup;\n constructor(private formgroupDirective: FormGroupDirective) {\n this.formName = formgroupDirective.control;\n }\n\n ngOnChanges() {\n \n }\n\n getFieldClassname() {\n return {\n [this.field.customClass]: this.field?.customClass\n }\n }\n}\n","<form [formGroup]=\"formName\">\n <div class=\"form-group\" [ngClass]=\"getFieldClassname()\">\n <label>{{field.label}} <span *ngIf=\"field?.rules?.required\" class=\"red-asterisk\">*</span>\n </label>\n <ng2-flatpickr [formControlName]=\"field.fieldName\" [config]=\"field.pickrOptions\"\n [placeholder]=\"field.placeholder\"></ng2-flatpickr>\n </div>\n</form>","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ViewContainerRef\n} from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\nimport { DynamicInputComponent } from \"./dynamic-input/dynamic-input.component\";\nimport { DynamicSelectComponent } from \"./dynamic-select/dynamic-select.component\";\nimport { DynamicRadioComponent } from \"./dynamic-radio/dynamic-radio.component\";\nimport { DynamicCheckboxsComponent } from \"./dynamic-checkboxs/dynamic-checkboxs.component\";\nimport { DynamicFormTypes } from \"../../_helpers/dynamic-form-type.enum\";\nimport { DynamicTextareaComponent } from \"./dynamic-textarea/dynamic-textarea.component\";\nimport { DynamicSliderComponent } from \"./dynamic-slider/dynamic-slider.component\";\nimport { DynamicDateComponent } from \"./dynamic-date/dynamic-date.component\";\n\n@Component({\n selector: 'app-field-input',\n templateUrl: './dynamic-field.component.html',\n styleUrls: ['./dynamic-field.component.scss']\n})\nexport class DynamicFieldComponent implements AfterViewInit, OnChanges {\n\n supportedDynamicComponents = [\n {\n name: DynamicFormTypes.TEXT,\n component: DynamicInputComponent\n },\n {\n name: DynamicFormTypes.TEXTAREA,\n component: DynamicTextareaComponent\n },\n {\n name: DynamicFormTypes.NUMBER,\n component: DynamicInputComponent\n },\n {\n name: DynamicFormTypes.PHONE,\n component: DynamicInputComponent\n },\n {\n name: DynamicFormTypes.SELECT,\n component: DynamicSelectComponent\n },\n {\n name: DynamicFormTypes.RADIO,\n component: DynamicRadioComponent\n },\n {\n name: DynamicFormTypes.DATE,\n component: DynamicDateComponent\n },\n {\n name: DynamicFormTypes.CHECKBOX,\n component: DynamicCheckboxsComponent\n },\n {\n name: DynamicFormTypes.SLIDER,\n component: DynamicSliderComponent\n }\n ]\n @ViewChild('dynamicInputContainer', { read: ViewContainerRef }) dynamicInputContainer!: ViewContainerRef;\n @Input() field: any;\n formName: any;\n\n constructor(private formgroupDirective: FormGroupDirective, private cd: ChangeDetectorRef) {\n\n }\n ngOnChanges(): void {\n console.log({ DynamicFieldComponent: this.field })\n if (this.dynamicInputContainer && this.field) this.registerDynamicField();\n }\n\n ngAfterViewInit(): void {\n this.registerDynamicField();\n }\n\n private registerDynamicField() {\n this.dynamicInputContainer.clear();\n const componentInstance = this.getComponentByType(this.field.type)\n const dynamicComponent = this.dynamicInputContainer.createComponent(componentInstance)\n dynamicComponent.setInput('field', this.field);\n this.cd.detectChanges();\n }\n\n getComponentByType(type: string): any {\n let componentDynamic = this.supportedDynamicComponents.find(c => c.name === type);\n return componentDynamic?.component || DynamicInputComponent;\n }\n\n}\n","<ng-container #dynamicInputContainer>\n</ng-container>","import { Component, Input, OnInit } from \"@angular/core\";\nimport { FormGroup, FormGroupDirective } from \"@angular/forms\";\n\n@Component({\n selector: \"app-dynamic-error\",\n templateUrl: \"./dynamic-error.component.html\",\n styleUrls: [\"./dynamic-error.component.css\"],\n})\nexport class DynamicErrorComponent implements OnInit {\n formName: any;\n @Input() field: any;\n\n constructor(private formgroupDirective: FormGroupDirective) { }\n\n ngOnInit() {\n this.formName = this.formgroupDirective.control;\n }\n\n get f() {\n return this.formName.controls\n }\n}\n","<div *ngIf=\"formName.controls[field.fieldName]?.invalid && (formName.controls[field.fieldName]?.dirty || formName.controls[field.fieldName]?.touched)\"\n class=\"invalid-feedback d-block text-danger\">\n <div *ngIf=\"formName.controls[field.fieldName]?.errors.required\">\n * {{field.label}} est requis\n </div>\n <div *ngIf=\"formName.controls[field.fieldName]?.errors.email\">\n * {{field.label}} doit étre un email valide!\n </div>\n <div *ngIf=\"formName.controls[field.fieldName]?.errors.minlength\">\n * {{field.label}} doit contenir {{formName.controls[field.fieldName].errors.minlength.requiredLength}}\n caractères!\n </div>\n <div *ngIf=\"formName.controls[field.fieldName]?.errors.pattern\">\n * Format incorrect\n </div>\n <div *ngIf=\"formName.controls[field.fieldName]?.errors.mask\">\n * Format incorrect\n </div>\n <div *ngIf=\"formName.controls[field.fieldName]?.errors.min || formName.controls[field.fieldName]?.errors.max\">\n * Montant invalide\n </div>\n</div>","import { Pipe, PipeTransform} from \"@angular/core\";\nimport { DomSanitizer } from \"@angular/platform-browser\";\n\n@Pipe({ name: 'breakpoint' })\nexport class BreakpointPipe implements PipeTransform {\n\n\n transform(field:any) {\n return {\n ['col-lg-' + field?.breakpoint?.lg]: field?.breakpoint?.lg,\n ['col-md-' + field?.breakpoint?.md]: field?.breakpoint?.md,\n ['col-sm-' + field?.breakpoint?.sm]: field?.breakpoint?.sm,\n ['col-xs-' + field?.breakpoint?.xs]: field?.breakpoint?.xs\n }\n }\n}","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from \"@angular/core\";\nimport { FormBuilder, FormControl, FormGroup, Validators } from \"@angular/forms\";\n\n@Component({\n selector: 'lib-mss-forms',\n templateUrl: './mss-forms.component.html',\n styles: [\n ]\n})\nexport class MssFormsComponent implements OnInit, OnChanges {\n\n @Input() model: any;\n @Input() isLoading: boolean = false;\n // @Input() submitBtnTxt: string = \"\";\n @Input() submitBtnOptions: any\n @Input() cancelBtnOptions: any = null\n @Input() error: any;\n @Output() onSubmit = new EventEmitter();\n public dynamicFormGroup: any;\n public fields: any = [];\n\n constructor(private _fb: FormBuilder) { }\n\n ngOnInit() {\n // this.buildForm();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['model']) {\n this.fields = []\n this.buildForm()\n }\n }\n\n\n\n private buildForm() {\n const formGroupFields = this.getFormControlsFields();\n // if (!this.dynamicFormGroup) {\n this.dynamicFormGroup = new FormGroup(formGroupFields)\n for (const field of Object.keys(this.model)) {\n const fieldProps = this.model[field];\n if (fieldProps?.disabled) this.dynamicFormGroup.get(field).disable()\n this.dynamicFormGroup.get(field)?.updateValueAndValidity()\n }\n // } else {\n // this.getNewFormControlsFields()\n // }\n }\n\n private getFormControlsFields() {\n const formGroupFields: any = {};\n for (const field of Object.keys(this.model)) {\n\n const fieldProps = this.model[field];\n const validators: any = this.addValidator(fieldProps.rules);\n\n formGroupFields[field] = new FormControl(fieldProps.value, validators);\n\n let index = this.fields.findIndex((f: any) => {\n if (f.fieldName == field) return true\n return false\n })\n if (index === -1) this.fields.push({ ...fieldProps, fieldName: field });\n }\n return formGroupFields;\n }\n\n private getNewFormControlsFields() {\n Object.keys(this.model).map((model) => {\n const fieldProps = this.model[model];\n const validators: any = this.addValidator(fieldProps.rules);\n if (!this.dynamicFormGroup['controls'][model]) {\n this.dynamicFormGroup.addControl(model, this._fb.control({ value: fieldProps.value, disabled: fieldProps?.disabled ? true : false }, validators))\n // this.dynamicFormGroup.get()\n }\n })\n }\n\n private addValidator(rules: any) {\n if (!rules) {\n return [];\n }\n\n const validators = Object.keys(rules).map((rule, index) => {\n switch (rule) {\n case \"required\":\n return Validators.required;\n case \"email\":\n return Validators.email;\n case \"minLength\":\n return Validators.minLength(Object.values(rules)[index] as number);\n case \"maxLength\":\n return Validators.maxLength(Object.values(rules)[index] as number);\n case \"pattern\":\n return Validators.pattern(Object.values(rules)[index] as string);\n case \"min\":\n return Validators.min(Object.values(rules)[index] as number)\n case \"max\":\n return Validators.max(Object.values(rules)[index] as number)\n default:\n return\n //add more case for future.\n }\n });\n return validators;\n }\n\n\n submit() {\n this.onSubmit.emit(this.dynamicFormGroup)\n }\n\n resetForm() {\n this.dynamicFormGroup.reset()\n }\n\n setRule(formControlName: string, validators: any) {\n if (this.dynamicFormGroup['controls'][formControlName]) this.dynamicFormGroup['controls'][formControlName].setValidators(validators)\n }\n}\n","<form [formGroup]=\"dynamicFormGroup\" (ngSubmit)=\"submit()\" (keyup.enter)=\"submit()\">\n <div class=\"row\">\n <div *ngFor=\"let field of fields\" class=\"col-12 custom-engine-field-container\" [ngClass]=\"field | breakpoint\">\n <app-field-input [field]=\"field\"></app-field-input>\n <app-dynamic-error [field]=\"field\"></app-dynamic-error>\n </div>\n <div *ngIf=\"cancelBtnOptions\" class=\"col-12\" [ngClass]=\"cancelBtnOptions | breakpoint\">\n <button type=\"button\" (click)=\"cancelBtnOptions?.submit()\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-default\">\n {{cancelBtnOptions?.content}}\n </button>\n </div>\n <div class=\"col-12\" [ngClass]=\"submitBtnOptions | breakpoint\">\n <button type=\"submit\" [disabled]=\"isLoading || dynamicFormGroup.invalid\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-primary\">\n <div *ngIf=\"isLoading\" class=\"spinner-border text-primary\"></div>\n <ng-container *ngIf=\"!isLoading\">{{submitBtnOptions?.content}}</ng-container>\n </button>\n </div>\n </div>\n\n</form>","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { NgxMaskModule } from 'ngx-mask';\nimport { DynamicErrorComponent } from './components/dynamic-error/dynamic-error.component';\nimport { DynamicCheckboxsComponent } from './components/dynamic-field/dynamic-checkboxs/dynamic-checkboxs.component';\nimport { DynamicFieldComponent } from './components/dynamic-field/dynamic-field.component';\nimport { DynamicInputComponent } from './components/dynamic-field/dynamic-input/dynamic-input.component';\nimport { DynamicRadioComponent } from './components/dynamic-field/dynamic-radio/dynamic-radio.component';\nimport { DynamicSelectComponent } from './components/dynamic-field/dynamic-select/dynamic-select.component';\nimport { MssFormsComponent } from './mss-forms.component';\nimport { BreakpointPipe } from './_helpers/breakpoints.pipe';\nimport { DynamicTextareaComponent } from './components/dynamic-field/dynamic-textarea/dynamic-textarea.component';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { DynamicSliderComponent } from './components/dynamic-field/dynamic-slider/dynamic-slider.component';\nimport { NgxSliderModule } from '@angular-slider/ngx-slider';\nimport { DynamicDateComponent } from './components/dynamic-field/dynamic-date/dynamic-date.component';\nimport { Ng2FlatpickrModule } from 'ng2-flatpickr';\nimport { ReplaceCommaByDotDirective } from './_helpers/comma-replace.directive';\n\n\n\n@NgModule({\n declarations: [\n MssFormsComponent,\n DynamicFieldComponent,\n DynamicInputComponent,\n DynamicTextareaComponent,\n DynamicSelectComponent,\n DynamicRadioComponent,\n DynamicCheckboxsComponent,\n DynamicSliderComponent,\n DynamicDateComponent,\n DynamicErrorComponent,\n BreakpointPipe,\n ReplaceCommaByDotDirective\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgbModule,\n NgxMaskModule.forRoot(),\n NgSelectModule,\n NgxSliderModule,\n Ng2FlatpickrModule,\n ],\n exports: [\n MssFormsComponent\n ]\n})\nexport class MssFormsModule { }\n","\nexport class Breakpoint {\n lg?:number;\n md?:number;\n sm?:number;\n xs?:number\n}","import { FlatpickrOptions } from \"ng2-flatpickr\";\nimport { Breakpoint } from \"./breakpoint.model\";\nimport { DynamicFormTypes } from \"./dynamic-form-type.enum\";\nimport { Options } from '@angular-slider/ngx-slider';\n\nexport class FormModel {\n [key: string]: {\n label?: string;\n placeholder?: string;\n type?: DynamicFormTypes;\n value?: string;\n options?: any;\n rules?: any;\n breakpoint?: Breakpoint,\n mask?: string,\n restriction_special_cr?: boolean,\n is_info?: boolean,\n info_txt?: string,\n customClass?: string,\n sliderOptions?: Options,\n sliderHignValue?: number,\n sliderValue?: number,\n pickrOptions?: FlatpickrOptions,\n isAmount?: boolean,\n disabled?:boolean\n };\n}","/*\n * Public API Surface of mss-forms\n */\n\nexport * from './lib/mss-forms.service';\nexport * from './lib/mss-forms.component';\nexport * from './lib/mss-forms.module';\nexport * from './lib/_helpers/dynamic-form-type.enum';\nexport * from './lib/_helpers/breakpoint.model';\nexport * from './lib/_helpers/dynamic-form.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i5.ReplaceCommaByDotDirective","i3","i3.DynamicFieldComponent","i4.DynamicErrorComponent","i5.BreakpointPipe"],"mappings":"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