@stemy/ngx-dynamic-form 10.1.0 → 10.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/bundles/stemy-ngx-dynamic-form.umd.js +2247 -2247
- package/bundles/stemy-ngx-dynamic-form.umd.js.map +1 -1
- package/bundles/stemy-ngx-dynamic-form.umd.min.js +2 -2
- package/bundles/stemy-ngx-dynamic-form.umd.min.js.map +1 -1
- package/esm2015/ngx-dynamic-form/common-types.js +591 -591
- package/esm2015/ngx-dynamic-form/components/base/dynamic-form-base.component.js +87 -87
- package/esm2015/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.js +91 -91
- package/esm2015/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.js +112 -112
- package/esm2015/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.js +19 -19
- package/esm2015/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.js +73 -73
- package/esm2015/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.js +23 -23
- package/esm2015/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.js +73 -73
- package/esm2015/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.js +20 -20
- package/esm2015/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.js +134 -134
- package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +89 -89
- package/esm2015/ngx-dynamic-form/directives/dynamic-form-control.directive.js +32 -32
- package/esm2015/ngx-dynamic-form/directives/dynamic-form-group.directive.js +40 -40
- package/esm2015/ngx-dynamic-form/directives/dynamic-form-template.directive.js +38 -38
- package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +85 -85
- package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +48 -48
- package/esm2015/ngx-dynamic-form/services/form-utilities.js +108 -108
- package/esm2015/ngx-dynamic-form/services/open-api.service.js +130 -130
- package/esm2015/public_api.js +18 -18
- package/esm2015/stemy-ngx-dynamic-form.js +8 -8
- package/fesm2015/stemy-ngx-dynamic-form.js +1690 -1690
- package/fesm2015/stemy-ngx-dynamic-form.js.map +1 -1
- package/ngx-dynamic-form/common-types.d.ts +307 -307
- package/ngx-dynamic-form/components/base/dynamic-form-base.component.d.ts +44 -44
- package/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.d.ts +21 -21
- package/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.d.ts +16 -16
- package/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.d.ts +6 -6
- package/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.d.ts +13 -13
- package/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.d.ts +6 -6
- package/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.d.ts +9 -9
- package/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.d.ts +5 -5
- package/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.d.ts +26 -26
- package/ngx-dynamic-form/directives/async-submit.directive.d.ts +23 -23
- package/ngx-dynamic-form/directives/dynamic-form-control.directive.d.ts +12 -12
- package/ngx-dynamic-form/directives/dynamic-form-group.directive.d.ts +14 -14
- package/ngx-dynamic-form/directives/dynamic-form-template.directive.d.ts +16 -16
- package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +20 -20
- package/ngx-dynamic-form/services/dynamic-form.service.d.ts +12 -12
- package/ngx-dynamic-form/services/form-utilities.d.ts +19 -19
- package/ngx-dynamic-form/services/open-api.service.d.ts +37 -37
- package/package.json +15 -15
- package/public_api.d.ts +17 -17
- package/stemy-ngx-dynamic-form.d.ts +7 -7
- package/stemy-ngx-dynamic-form.metadata.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../src/ngx-dynamic-form/common-types.ts","../../src/ngx-dynamic-form/services/dynamic-form.service.ts","../../src/ngx-dynamic-form/services/form-utilities.ts","../../src/ngx-dynamic-form/services/open-api.service.ts","../../src/ngx-dynamic-form/directives/async-submit.directive.ts","../../src/ngx-dynamic-form/directives/dynamic-form-control.directive.ts","../../src/ngx-dynamic-form/directives/dynamic-form-template.directive.ts","../../src/ngx-dynamic-form/components/base/dynamic-form-base.component.ts","../../src/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.ts","../../src/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.ts","../../src/ngx-dynamic-form/directives/dynamic-form-group.directive.ts","../../src/ngx-dynamic-form/ngx-dynamic-form.module.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","__","this","constructor","create","__read","o","n","m","Symbol","iterator","r","e","i","ar","next","done","push","value","error","__spread","arguments","length","concat","FORM_GROUP_TYPE","InjectionToken","FORM_CONTROL_PROVIDER","FormControlComponent","defineProperty","control","form","data","meta","createValidator","validators","validator","filter","ObjectUtils","isDefined","map","v","ReflectUtils","resolve","injector","ctrl","Promise","shouldValidate","then","should","validate","metaValidator","isFunction","all","results","isObject","isString","result","forEach","assign","Directive","HostBinding","args","DynamicFormControlHelper","formId","UniqueUtils","uuid","hidden","dummyData","readonlyTester","createTester","hideTester","serializeTester","visible","validateTester","id","type","ctrlProvider","load","loader","check","_this","hide","readonly","shouldSerialize","findProvider","test","defaultFunc","tester","DynamicFormGroup","_super","updateOn","mName","mModel","mControls","mSerializers","mFieldSets","helper","initialized","loading","changeTimer","TimerUtils","createTimeout","statusChanges","subscribe","root","onStatusChange","emit","setAsyncValidators","label","prefix","provider","name","status","createFormControls","group","controls","model","keys","getFormControl","subGroup","getData","setup","addControl","DynamicFormControl","createFormSerializers","serializers","props","reduce","serializer","getFormSerializer","defaultSerializer","func","getControl","get","promises","c","disable","emitEvent","enable","serialize","s","res","onFocus","markAsUntouched","onlySelf","onBlur","markAsTouched","showErrors","reloadControls","callback","onInit","statusTimer","createInterval","set","clear","setTimeout","promise","info","removeControl","fieldSets","fs","getFormFieldSets","getPrototypeOf","updateModel","reloadControlsFrom","Set","onChange","reload","isArray","nextControl","has","add","FormGroup","valueChanges","disabled","FormControl","emptyArray","emptyTester","parent","provideFormGroup","component","provide","useValue","provideFormControl","acceptor","priority","multi","defineFormControl","target","propertyKey","defineMetadata","getMetadata","createFormControl","isNullOrUndefined","labelAlign","fieldSet","classes","createFormInput","placeholder","step","mask","createFormSelect","options","classType","createFormStatic","style","createFormModel","createFormFile","accept","baseUrl","uploadUrl","createUploadData","file","FormData","append","DynamicFormService","components","groupType","resolver","providers","Error","JSON","stringify","sort","a","compare","createComponent","vcr","factory","resolveComponentFactory","instance","createGroup","Injectable","Inject","Type","decorators","ComponentFactoryResolver","Injector","FormUtilities","checkField","expression","evaluate","checkReadonly","validateJSON","parse","validateRequired","isNumber","validateMinLength","error.min-length","validateMaxLength","error.max-length","validateRequiredTranslation","findIndex","t","lang","translation","validateEmail","validatePhone","serializeLogo","serializeFile","isBlob","startsWith","FileUtils","dataToBlob","serializeNumber","parseFloat","serializeJSON","serializeDate","date","format","defaultValue","isDate","transform","key","desc","getOwnPropertyDescriptor","Reflect","decorate","__decorate","FactoryDependencies","DatePipe","OpenApiService","api","url","replace","schemas","schemasPromise","client","definitions","getFormInputsForSchema","cache","schema","getFormInputsForSchemaDef","inputs","properties","property","getFormControlForProperty","enum","getFormSelectData","getFormInputData","getFormFileData","getBaseFormData","getValidators","StringUtils","endpoint","list","makeListParams","items","_id","required","indexOf","minLength","params","maxLength","ApiService","AsyncSubmitDirective","toaster","cdr","elem","renderer","onSuccess","EventEmitter","onError","nativeElement","tagName","setAttribute","ngOnInit","detectChanges","onSubmit","callMethod","ngOnDestroy","unsubscribe","click","method","success","message","context","reason","selector","exportAs","TOASTER_SERVICE","ChangeDetectorRef","ElementRef","Renderer2","Input","Output","HostListener","DynamicFormControlDirective","forms","comp","ngOnChanges","changes","ViewContainerRef","template","TemplateRef","DynamicFormBaseComponent","formService","controlTemplates","labelTemplates","inputTemplates","prefixTemplates","suffixTemplates","ngAfterContentInit","wrapperTemplate","cWrapperTemplate","fieldSetTemplate","cFieldSetTemplate","controlTemplate","cControlTemplate","filterTemplates","setPrefixTemplates","setSuffixTemplates","templates","directive","ContentChild","ContentChildren","DynamicFormTemplateDirective","DynamicFormComponent","defaultFieldSet","title","state","formControls","formGroup","onFormSubmit","reject","pipe","first","updateValueAndValidity","Component","moduleId","module","useExisting","statusPriority","DynamicFormsComponent","formPrefixTemplates","formSuffixTemplates","innerFormPrefixTemplates","innerFormSuffixTemplates","this_1","checkForms","f","containerTemplate","cContainerTemplate","configs","createFormGroups","ix","config","path","split","mapToPath","getFromValue","find","controlData","ViewChildren","DynamicFormGroupComponent","errors","touched","join","DynamicFormFileComponent","fileImageCache","onSelect","input","processFiles","files","fileList","types","toLowerCase","item","ext","getExtension","ArrayUtils","upload","single","Math","min","asDataUrl","readFileAsDataURL","asFile","console","log","uploadOptions","asset","assets","setValue","current","delete","index","from","splice","getUrl","image","getImgUrl","URL","createObjectURL","imageUrl","subUrl","substr","DynamicFormInputComponent","language","onDateChange","Date","dateValue","valueOf","isNaN","onMaskChange","unmask","onTextChange","useLanguage","translations","editLanguage","onNumberBlur","max","LANGUAGE_SERVICE","DynamicFormSelectComponent","getOptions","emptyOption","unshift","fillOptions","selected","onSelectChange","option","checkValue","findOption","DynamicFormStaticComponent","DynamicFormModelComponent","ViewChild","DynamicFormGroupDirective","directives","pipes","NgxDynamicFormModule","forRoot","controlProviders","groupProvider","ngModule","NgModule","declarations","imports","CommonModule","FormsModule","ReactiveFormsModule","TextMaskModule","NgxUtilsModule","exports","entryComponents","sets","getOwnMetadata","inputType"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { ChangeDetectorRef, EventEmitter, HostBinding, InjectionToken, Injector, TemplateRef, Type, ValueProvider, Directive } from \"@angular/core\";\nimport {AbstractControl, FormControl, FormGroup, ValidationErrors} from \"@angular/forms\";\nimport {\n IResolveFactory,\n ITimer,\n IAsyncMessage,\n ObjectUtils,\n ReflectUtils,\n TimerUtils,\n UniqueUtils,\n IRequestOptions\n} from \"@stemy/ngx-utils\";\n\nexport const FORM_GROUP_TYPE: InjectionToken<Type<IFormControlComponent>> = new InjectionToken<Type<IFormControlComponent>>(\"form-group-provider\");\nexport const FORM_CONTROL_PROVIDER: InjectionToken<IFormControlProvider> = new InjectionToken<IFormControlProvider>(\"form-control-provider\");\n\n// --- Basic form control interfaces ---\nexport interface IFormControlComponent {\n control: IDynamicFormControl;\n}\n\nexport interface IFormGroupComponent {\n form: IDynamicForm;\n control: IDynamicFormControl;\n}\n\n@Directive()\nexport abstract class FormControlComponent<T extends IFormControlData> implements IFormControlComponent {\n\n control: IDynamicFormControl;\n\n get form(): IDynamicFormBase {\n return !this.control ? null: this.control.form;\n }\n\n get data(): T {\n return <T>(!this.control ? {} : this.control.data);\n }\n\n get value(): any {\n return !this.control ? null : this.control.value;\n }\n\n get meta(): any {\n return !this.control ? null : this.control.meta;\n }\n\n @HostBinding(\"class.form-input\")\n get inputClass(): boolean {\n return true;\n }\n}\n\nexport type IFormControlProviderAcceptor = (control: IDynamicFormControl) => boolean;\nexport type IFormControlProviderLoader = (control: IDynamicFormControl) => Promise<any>;\nexport type IFormControlOptions = (control: IDynamicFormControl) => Promise<IFormControlOption[]>;\nexport type IFormControlSerializer = (id: string, parent: IDynamicFormControl) => Promise<any>;\nexport type IFormInputMask = string | RegExp;\nexport type IFormInputMaskFunction = (raw: string) => IFormInputMask[];\nexport type IFormInputUnMaskFunction = (value: string) => any;\n\nexport interface IFormControlProvider {\n component: Type<IFormControlComponent>;\n priority: number;\n acceptor: IFormControlProviderAcceptor;\n loader: IFormControlProviderLoader;\n}\n\nexport interface IFormSerializer {\n id: string;\n func: IFormControlSerializer;\n}\n\nexport interface IFormSerializers {\n [id: string]: IFormControlSerializer | IResolveFactory | null\n}\n\nexport type DynamicFormState = \"VALID\" | \"INVALID\" | \"PENDING\" | \"DISABLED\" | \"LOADING\";\nexport type DynamicFormUpdateOn = \"change\" | \"blur\" | \"submit\";\n\nexport interface IDynamicFormControl {\n id: string;\n type: string;\n data: IFormControlData;\n visible: boolean;\n meta: any;\n form: IDynamicFormBase;\n injector: Injector;\n label: string;\n provider: IFormControlProvider;\n model: any;\n formId: string;\n\n errors: ValidationErrors;\n value: any;\n touched: boolean;\n disabled: boolean;\n updateOn: DynamicFormUpdateOn;\n\n setValue(value: any): void;\n\n getData<T extends IFormControlData>(): T;\n getControl(id: string): IDynamicFormControl;\n load(): Promise<any>;\n check(): Promise<any>;\n shouldSerialize(): Promise<boolean>;\n shouldValidate(): Promise<boolean>;\n serialize(): Promise<any>;\n onFocus(): void;\n onBlur(): void;\n showErrors(): void;\n}\n\nfunction createValidator(control: IDynamicFormControl): (control: AbstractControl) => Promise<ValidationErrors> {\n const data = control.data || {};\n const validators = [data.validator].concat(data.validators || []).filter(ObjectUtils.isDefined).map(v => {\n return ReflectUtils.resolve<FormControlValidator>(v, control.injector);\n });\n return (ctrl: any) => new Promise<ValidationErrors>((resolve) => {\n const control = <IDynamicFormControl>ctrl;\n control.shouldValidate().then(should => {\n if (!should) {\n resolve(null);\n return;\n }\n const validate = validators.map(v => v(control));\n const metaValidator = control.meta.validator;\n if (ObjectUtils.isFunction(metaValidator)) {\n validate.push(metaValidator(control));\n }\n Promise.all(validate).then(results => {\n results = results.filter(error => ObjectUtils.isObject(error) || ObjectUtils.isString(error));\n let result: ValidationErrors = null;\n if (results.length > 0) {\n result = {};\n results.forEach(error => {\n if (ObjectUtils.isString(error)) {\n result[error] = {};\n return;\n }\n result = Object.assign(result, error);\n });\n }\n resolve(result);\n });\n });\n });\n}\n\nclass DynamicFormControlHelper {\n\n get id(): string {\n return !this.control ? null : this.control.id;\n }\n\n get type(): string {\n return !this.control ? \"\" : this.control.type;\n }\n\n get data(): IFormControlData {\n return !this.control ? this.dummyData : this.control.data || this.dummyData;\n }\n\n get visible(): boolean {\n return !this.hidden;\n }\n\n get provider(): IFormControlProvider {\n return this.ctrlProvider;\n }\n\n public readonly formId: string;\n public readonly meta: any;\n\n private hidden: boolean;\n private ctrlProvider: IFormControlProvider;\n private readonly dummyData: IFormControlData;\n private readonly readonlyTester: (control: IDynamicFormControl) => Promise<boolean>;\n private readonly hideTester: (control: IDynamicFormControl) => Promise<boolean>;\n private readonly serializeTester: (control: IDynamicFormControl) => Promise<boolean>;\n private readonly validateTester: (control: IDynamicFormControl) => Promise<boolean>;\n\n constructor(private form: IDynamicFormBase, private control: IFormControl = null) {\n this.formId = UniqueUtils.uuid();\n this.meta = {};\n this.hidden = false;\n this.dummyData = {};\n this.readonlyTester = this.createTester(\"readonly\");\n this.hideTester = this.createTester(\"hidden\");\n this.serializeTester = this.createTester(\"shouldSerialize\", (control: IDynamicFormControl) => {\n return Promise.resolve(control.visible);\n });\n this.validateTester = this.createTester(\"shouldValidate\", (control: IDynamicFormControl) => {\n return Promise.resolve(control.visible);\n });\n }\n\n load(control: IDynamicFormControl): Promise<any> {\n return !this.ctrlProvider ? Promise.resolve() : this.ctrlProvider.loader(control);\n }\n\n check(control: IDynamicFormControl): Promise<boolean> {\n return new Promise<any>(resolve => {\n this.hideTester(control).then(hide => {\n this.hidden = hide;\n this.readonlyTester(control).then(readonly => {\n resolve(control.form.readonly || readonly);\n });\n });\n });\n }\n\n shouldSerialize(control: IDynamicFormControl): Promise<boolean> {\n return this.serializeTester(control);\n }\n\n shouldValidate(control: IDynamicFormControl): Promise<boolean> {\n return this.validateTester(control);\n }\n\n findProvider(control: IDynamicFormControl): void {\n this.ctrlProvider = !this.control || !this.control.type ? null : this.form.findProvider(control);\n }\n\n private createTester(test: string, defaultFunc: FormControlTester = null): (control: IDynamicFormControl) => Promise<boolean> {\n const tester: FormControlTester = this.data[test]\n ? ReflectUtils.resolve<FormControlTester>(this.data[test], this.form.injector)\n : (defaultFunc || (() => Promise.resolve(false)));\n return (control: IDynamicFormControl): Promise<boolean> => tester(control);\n }\n}\n\nexport class DynamicFormGroup extends FormGroup implements IDynamicFormControl {\n\n get id(): string {\n return this.helper.id;\n }\n\n get type(): string {\n return this.helper.type;\n }\n\n get data(): IFormControlData {\n return this.helper.data;\n }\n\n get visible(): boolean {\n return this.helper.visible;\n }\n\n get meta(): any {\n return this.helper.meta;\n }\n\n get injector(): Injector {\n return this.form.injector;\n }\n\n get label(): string {\n return this.data.label !== \"\" ? `${this.prefix}${this.data.label}` : \"\";\n }\n\n get provider(): IFormControlProvider {\n return this.helper.provider;\n }\n\n get model(): any {\n return this.mModel;\n }\n\n get formId(): string {\n return this.helper.formId;\n }\n\n get formControls(): IDynamicFormControl[] {\n return this.mControls || [];\n }\n\n get formFields(): IDynamicFormFieldSets {\n return this.mFieldSets || {};\n }\n\n get prefix(): string {\n return !this.name ? \"\" : `${this.name}.`;\n }\n\n get name(): string {\n return this.mName;\n }\n\n get state(): DynamicFormState {\n return <DynamicFormState>(this.loading ? \"LOADING\" : this.status);\n }\n\n private helper: DynamicFormControlHelper;\n private mName: string;\n private mModel: any;\n private mControls: IDynamicFormControl[];\n private mSerializers: IFormSerializer[];\n private mFieldSets: IDynamicFormFieldSets;\n private initialized: boolean;\n private loading: boolean;\n private changeTimer: ITimer;\n\n private static createFormControls(group: DynamicFormGroup, controls: IFormControl[]): IDynamicFormControl[] {\n if (!controls && ObjectUtils.isObject(group.model)) {\n const props = Object.keys(group.model);\n controls = props.map(id => {\n return getFormControl(group.model, id);\n }).filter(ObjectUtils.isDefined);\n }\n if (!controls) return [];\n return controls.map(ctrl => {\n if (ctrl.type == \"model\") {\n const subGroup = new DynamicFormGroup(group.form, ctrl);\n const model = group.model[ctrl.id] || {};\n const data = subGroup.getData<IFormModelData>();\n data.name = data.name || group.name;\n subGroup.setup(model, data);\n group.model[ctrl.id] = model;\n group.addControl(subGroup.id, subGroup);\n return subGroup;\n }\n return new DynamicFormControl(ctrl, group);\n });\n }\n\n private static createFormSerializers(group: DynamicFormGroup, serializers: IFormSerializers): IFormSerializer[] {\n if (!serializers && ObjectUtils.isObject(group.model)) {\n const props = Object.keys(group.model);\n serializers = props.reduce((result, id) => {\n const serializer = getFormSerializer(group.model, id);\n if (!serializer) return result;\n result[id] = serializer;\n return result;\n }, {});\n }\n if (!serializers) return [];\n return Object.keys(serializers).map(id => {\n const serializer = serializers[id] || defaultSerializer;\n return !serializer ? null : {\n id: id,\n func: ReflectUtils.resolve<IFormControlSerializer>(serializer, group.injector)\n };\n });\n }\n\n constructor(public readonly form: IDynamicFormBase, control: IFormControl = null) {\n super({}, {updateOn: ((!control || !control.data) ? null : control.data.updateOn) || form.updateOn || \"blur\"});\n this.mName = \"\";\n this.mModel = {};\n this.mControls = [];\n this.mSerializers = [];\n this.mFieldSets = {};\n this.helper = new DynamicFormControlHelper(form, control);\n this.helper.findProvider(this);\n this.initialized = false;\n this.loading = false;\n this.changeTimer = TimerUtils.createTimeout();\n this.statusChanges.subscribe(() => {\n const root = this.form.root;\n root.onStatusChange.emit(root);\n });\n this.setAsyncValidators(createValidator(this));\n }\n\n getData<T extends IFormControlData>(): T {\n return <T>this.data;\n }\n\n getControl(id: string): IDynamicFormControl {\n return <any>this.get(id);\n }\n\n load(): Promise<any> {\n const promises = this.mControls.map(c => c.load());\n promises.push(this.helper.load(this));\n return Promise.all(promises);\n }\n\n check(): Promise<any> {\n return new Promise<any>(resolve => {\n this.helper.check(this).then(readonly => {\n if (readonly) this.disable({emitEvent: false}); else this.enable({emitEvent: false});\n const promises = this.mControls.map(c => c.check());\n Promise.all(promises).then(resolve);\n })\n });\n }\n\n shouldSerialize(): Promise<boolean> {\n return this.helper.shouldSerialize(this);\n }\n\n shouldValidate(): Promise<boolean> {\n return this.helper.shouldValidate(this);\n }\n\n serialize(): Promise<any> {\n return new Promise<any>((resolve) => {\n const result = {};\n const serializers = this.mSerializers.map(s => {\n return new Promise<any>(resolve => {\n s.func(s.id, this).then(res => {\n const ctrl = this.getControl(s.id);\n const promise = !ctrl ? Promise.resolve(true) : ctrl.shouldSerialize();\n promise.then(should => {\n if (should) result[s.id] = res;\n resolve();\n });\n });\n });\n });\n Promise.all(serializers).then(() => resolve(result));\n });\n }\n\n onFocus(): void {\n this.markAsUntouched({onlySelf: true});\n }\n\n onBlur(): void {\n this.markAsTouched({onlySelf: true});\n }\n\n showErrors(): void {\n this.markAsTouched({onlySelf: true});\n this.mControls.forEach(ctrl => ctrl.showErrors());\n }\n\n reloadControls(): Promise<any> {\n let callback = () => {};\n if (this.initialized === false) {\n this.initialized = true;\n this.loading = true;\n callback = () => {\n this.loading = false;\n // this.cdr.detectChanges();\n const root = this.form.root;\n root.onInit.emit(root);\n root.onStatusChange.emit(root);\n // https://github.com/angular/angular/issues/14542\n const statusTimer = TimerUtils.createInterval();\n statusTimer.set(() => {\n if (this.status == \"PENDING\") return;\n statusTimer.clear();\n root.onStatusChange.emit(root);\n }, 50);\n setTimeout(statusTimer.clear, 5000);\n };\n }\n const promise = new Promise<any>(resolve => {\n this.load().then(() => this.check().then(resolve));\n });\n promise.then(callback, callback);\n return promise;\n }\n\n setup(model: any, info: IDynamicFormInfo): void {\n this.mName = info.name || \"\";\n this.mModel = model;\n this.mControls.forEach(ctrl => this.removeControl(ctrl.id));\n this.mControls = DynamicFormGroup.createFormControls(this, info.controls);\n this.mControls.forEach((ctrl: any) => this.addControl(ctrl.id, ctrl));\n this.mSerializers = DynamicFormGroup.createFormSerializers(this, info.serializers);\n this.mFieldSets = info.fieldSets ? info.fieldSets.reduce((result, fs) => {\n result[fs.id] = fs;\n return result;\n }, {}) : getFormFieldSets(Object.getPrototypeOf(model).constructor);\n }\n\n updateModel(control: IDynamicFormControl): void {\n this.model[control.id] = control.value;\n this.changeTimer.clear();\n this.changeTimer.set(() => {\n this.check().then(() => this.reloadControlsFrom(control, new Set<IDynamicFormControl>()).then(() => {\n this.form.root.onChange.emit(control);\n }));\n }, 250);\n }\n\n private reloadControlsFrom(control: IDynamicFormControl, controls?: Set<IDynamicFormControl>): Promise<any> {\n const data = control.data;\n if (!data || !data.reload) return Promise.resolve();\n const reload = ObjectUtils.isArray(data.reload) ? data.reload : [data.reload];\n return Promise.all(reload.map(id => {\n const nextControl = this.getControl(id);\n if (!nextControl || controls.has(nextControl)) return Promise.resolve();\n controls.add(nextControl);\n return new Promise<any>(resolve => {\n nextControl.load().then(() => {\n this.reloadControlsFrom(nextControl, controls).then(resolve);\n });\n })\n }))\n }\n}\n\nexport class DynamicFormControl extends FormControl implements IDynamicFormControl {\n\n get id(): string {\n return this.helper.id;\n }\n\n get type(): string {\n return this.helper.type;\n }\n\n get data(): IFormControlData {\n return this.helper.data;\n }\n\n get visible(): boolean {\n return this.helper.visible;\n }\n\n get meta(): any {\n return this.helper.meta;\n }\n\n get form(): IDynamicFormBase {\n return this.group.form;\n }\n\n get injector(): Injector {\n return this.form.injector;\n }\n\n get label(): string {\n return this.data.label !== \"\" ? `${this.group.prefix}${this.data.label}` : \"\";\n }\n\n get provider(): IFormControlProvider {\n return this.helper.provider;\n }\n\n get model(): any {\n return this.group.model;\n }\n\n get formId(): string {\n return this.helper.formId;\n }\n\n private helper: DynamicFormControlHelper;\n\n constructor(private control: IFormControl, public readonly group: DynamicFormGroup) {\n super(group.model[control.id], {updateOn: control.data.updateOn || group.updateOn});\n this.group.addControl(control.id, this);\n this.helper = new DynamicFormControlHelper(this.form, control);\n this.helper.findProvider(this);\n this.valueChanges.subscribe(() => this.group.updateModel(this));\n this.setAsyncValidators(createValidator(this));\n }\n\n getData<T extends IFormControlData>(): T {\n return <T>this.data;\n }\n\n getControl(id: string): IDynamicFormControl {\n return null;\n }\n\n load(): Promise<any> {\n return this.helper.load(this);\n }\n\n check(): Promise<any> {\n const check = this.helper.check(this);\n check.then(readonly => {\n if (readonly || this.group.disabled) this.disable({emitEvent: false}); else this.enable({emitEvent: false});\n });\n return check;\n }\n\n shouldSerialize(): Promise<boolean> {\n return this.helper.shouldSerialize(this);\n }\n\n shouldValidate(): Promise<boolean> {\n return this.helper.shouldValidate(this);\n }\n\n serialize(): Promise<any> {\n return Promise.resolve(this.value);\n }\n\n onFocus(): void {\n this.markAsUntouched({onlySelf: true});\n }\n\n onBlur(): void {\n this.markAsTouched({onlySelf: true});\n }\n\n showErrors(): void {\n this.markAsTouched({onlySelf: true});\n }\n}\n\nexport interface IFormControl {\n id: string;\n type: string;\n visible?: boolean;\n data?: IFormControlData;\n}\n\nexport interface IFormControlData {\n label?: string;\n labelAlign?: string;\n fieldSet?: string;\n classes?: string;\n readonly?: FormControlTesterFactory;\n hidden?: FormControlTesterFactory;\n shouldSerialize?: FormControlTesterFactory;\n shouldValidate?: FormControlTesterFactory;\n validator?: FormControlValidatorFactory;\n validators?: FormControlValidatorFactory[];\n updateOn?: DynamicFormUpdateOn;\n reload?: string | string[];\n}\n\nexport interface IFormInputData extends IFormControlData {\n type?: string;\n autocomplete?: string;\n placeholder?: string;\n useLanguage?: boolean;\n mask?: IFormInputMaskFunction | IFormInputMask[];\n unmask?: IFormInputUnMaskFunction;\n step?: number;\n min?: number;\n max?: number;\n}\n\nexport interface IFormSelectData extends IFormControlData {\n options?: IFormControlOptions | IResolveFactory;\n emptyOption?: boolean;\n type?: string;\n multi?: boolean;\n}\n\nexport interface IFormStaticData extends IFormControlData {\n properties?: string[];\n style?: string;\n}\n\nexport interface IFormFileData extends IFormControlData {\n accept?: string;\n multi?: boolean;\n baseUrl?: string;\n asFile?: boolean;\n asDataUrl?: boolean;\n uploadUrl?: string;\n uploadOptions?: IRequestOptions;\n createUploadData?: (file: File) => any;\n}\n\nexport interface IFormModelData extends IFormControlData, IDynamicFormInfo {\n\n}\n\nexport interface IFormFieldSet {\n id: string;\n classes?: string;\n title?: string;\n titleClasses?: string;\n setClasses?: string;\n controlClasses?: string;\n}\n\nexport interface IFormControlOption {\n id: any;\n label: string;\n selectable?: boolean;\n}\n\n// --- Basic form interfaces ---\n\nexport interface IDynamicFormTemplates {\n [id: string]: TemplateRef<any>;\n}\n\nexport interface IDynamicFormConfig {\n path?: string | number | Array<string | number>;\n name?: string;\n classes?: string;\n formClasses?: string;\n innerFormClasses?: string;\n id: string;\n}\n\nexport interface IDynamicSingleFormConfig extends IDynamicFormConfig, IDynamicFormInfo {\n data: any;\n controlData?: IFormControlData;\n multi?: false;\n}\n\nexport interface IDynamicMultiFormConfig extends IDynamicFormConfig {\n data: IDynamicFormsConfigs;\n multi: true;\n}\n\nexport type IDynamicFormsConfigs = Array<IDynamicSingleFormConfig | IDynamicMultiFormConfig>;\n\nexport interface IDynamicFormBase {\n\n name?: string;\n readonly?: boolean;\n updateOn?: \"change\" | \"blur\" | \"submit\";\n classes: string;\n parent: IDynamicFormBase;\n\n wrapperTemplate: TemplateRef<any>;\n fieldSetTemplate: TemplateRef<any>;\n controlTemplate: TemplateRef<any>;\n\n controlTemplates: IDynamicFormTemplates;\n labelTemplates: IDynamicFormTemplates;\n inputTemplates: IDynamicFormTemplates;\n prefixTemplates: IDynamicFormTemplates;\n suffixTemplates: IDynamicFormTemplates;\n setPrefixTemplates: IDynamicFormTemplates;\n setSuffixTemplates: IDynamicFormTemplates;\n\n onChange: EventEmitter<IDynamicFormControl>;\n onStatusChange: EventEmitter<IDynamicFormBase>;\n onInit: EventEmitter<IDynamicFormBase>;\n onSubmit: EventEmitter<IDynamicFormBase>;\n\n root?: IDynamicFormBase;\n status: DynamicFormState;\n injector?: Injector;\n cdr?: ChangeDetectorRef;\n\n validate(showErrors?: boolean): Promise<any>;\n\n serialize(validate?: boolean): Promise<any>;\n\n check(): Promise<any>;\n\n getControl(id: string): IDynamicFormControl;\n\n findProvider(control: IDynamicFormControl): IFormControlProvider;\n}\n\nexport declare type AsyncSubmitMethod = (form: IDynamicFormBase) => Promise<IAsyncMessage>;\n\nexport interface IDynamicFormInfo {\n group?: DynamicFormGroup;\n name?: string;\n controls?: IFormControl[];\n serializers?: IFormSerializers;\n fieldSets?: IFormFieldSet[];\n}\n\nexport interface IDynamicForm extends IDynamicFormBase, IDynamicFormInfo {\n data: any;\n}\n\nexport interface IDynamicFormFieldSets {\n [id: string]: IFormFieldSet\n}\n\n// --- Basic form types ---\nexport type FormControlTester = (control: IDynamicFormControl) => Promise<boolean>;\nexport type FormControlTesterFactory = FormControlTester | IResolveFactory;\nexport type FormControlValidator = (control: IDynamicFormControl) => Promise<string | ValidationErrors>;\nexport type FormControlValidatorFactory = FormControlValidator | IResolveFactory;\n\n// --- Decorator functions ---\nconst emptyArray: any = [];\nconst emptyTester: FormControlTester = () => {\n return Promise.resolve(false);\n};\n\nexport function defaultSerializer(id: string, parent: IDynamicFormControl): Promise<any> {\n const control = parent.getControl(id);\n return !control ? Promise.resolve(parent.model[id]) : control.serialize();\n}\n\nexport function FormSerializable(serializer?: IFormControlSerializer | IResolveFactory): PropertyDecorator {\n return (target: any, propertyKey: string): void => {\n ReflectUtils.defineMetadata(\"dynamicFormSerializer\", serializer || defaultSerializer, target, propertyKey);\n };\n}\n\nexport function FormInput(data?: IFormInputData): PropertyDecorator {\n return (target: any, propertyKey: string): void => {\n const meta = ReflectUtils.getOwnMetadata(\"design:type\", target, propertyKey);\n const type = meta ? meta.name : \"\";\n let inputType = propertyKey.indexOf(\"password\") < 0 ? \"text\" : \"password\";\n switch (type) {\n case \"Number\":\n inputType = \"number\";\n break;\n case \"Boolean\":\n inputType = \"checkbox\";\n break;\n }\n defineFormControl(target, propertyKey, createFormInput(propertyKey, data, inputType));\n };\n}\n\nexport function FormSelect(data?: IFormSelectData): PropertyDecorator {\n return (target: any, propertyKey: string): void => {\n defineFormControl(target, propertyKey, createFormSelect(propertyKey, data));\n };\n}\n\nexport function FormStatic(data?: IFormStaticData): PropertyDecorator {\n return (target: any, propertyKey: string): void => {\n defineFormControl(target, propertyKey, createFormStatic(propertyKey, data));\n };\n}\n\nexport function FormModel(data?: IFormModelData): PropertyDecorator {\n return (target: any, propertyKey: string): void => {\n defineFormControl(target, propertyKey, createFormModel(propertyKey, data));\n };\n}\n\nexport function FormFile(data?: IFormFileData): PropertyDecorator {\n return (target: any, propertyKey: string): void => {\n defineFormControl(target, propertyKey, createFormFile(propertyKey, data));\n };\n}\n\nexport function FormFieldSet(data: IFormFieldSet): ClassDecorator {\n return (target: any): void => {\n const sets = getFormFieldSets(target);\n data.classes = data.classes || \"\";\n sets[data.id] = data;\n ReflectUtils.defineMetadata(\"dynamicFormFieldSets\", sets, target);\n };\n}\n\nexport interface FormGroupProvider extends ValueProvider {\n provide: InjectionToken<Type<IFormGroupComponent>>;\n multi?: boolean;\n useValue: Type<IFormGroupComponent>;\n}\n\nexport function provideFormGroup(component: Type<IFormGroupComponent>): FormGroupProvider {\n return {\n provide: FORM_GROUP_TYPE,\n useValue: component\n };\n}\n\nexport interface FormControlProvider {\n provide: InjectionToken<IFormControlProvider>;\n multi?: boolean;\n useValue: IFormControlProvider;\n}\n\nexport function provideFormControl(component: Type<IFormControlComponent>, acceptor: IFormControlProviderAcceptor, loader: IFormControlProviderLoader, priority: number = 0): FormControlProvider {\n return {\n provide: FORM_CONTROL_PROVIDER,\n multi: true,\n useValue: {\n component: component,\n priority: priority,\n acceptor: acceptor,\n loader: loader\n }\n };\n}\n\nexport function defineFormControl(target: any, propertyKey: string, control: IFormControl): void {\n ReflectUtils.defineMetadata(\"dynamicFormControl\", control, target, propertyKey);\n}\n\nexport function getFormFieldSets(target: any): IDynamicFormFieldSets {\n return ReflectUtils.getMetadata(\"dynamicFormFieldSets\", target) || {};\n}\n\nexport function getFormControl(target: any, propertyKey: string): IFormControl {\n return ReflectUtils.getMetadata(\"dynamicFormControl\", target, propertyKey);\n}\n\nexport function getFormSerializer(target: any, propertyKey: string): IFormControlSerializer | IResolveFactory {\n return ReflectUtils.getMetadata(\"dynamicFormSerializer\", target, propertyKey);\n}\n\nexport function createFormControl(id: string, type: string, data?: IFormControlData): IFormControl {\n data = data || {};\n data.label = ObjectUtils.isNullOrUndefined(data.label) ? id : data.label;\n data.labelAlign = data.labelAlign || \"left\";\n data.fieldSet = data.fieldSet || UniqueUtils.uuid();\n data.classes = data.classes || \"\";\n data.readonly = data.readonly || emptyTester;\n data.hidden = data.hidden || emptyTester;\n data.validators = data.validators || emptyArray;\n return {\n id: id,\n type: type,\n data: data\n };\n}\n\nexport function createFormInput(id: string, data: IFormInputData, type: string = \"text\"): IFormControl {\n const control = createFormControl(id, \"input\", data);\n data = control.data;\n data.type = data.type || type;\n data.classes = !data.classes ? `form-group-${data.type}` : `${data.classes} form-group-${data.type}`;\n data.placeholder = data.placeholder || (data.type == \"mask\" ? \"_\" : \"\");\n data.step = data.step || 1;\n data.mask = data.mask || [/\\w*/gi];\n return control;\n}\n\nexport function createFormSelect(id: string, data: IFormSelectData): IFormControl {\n const control = createFormControl(id, \"select\", data);\n data = control.data;\n data.options = data.options || (() => Promise.resolve([]));\n data.type = data.type || \"select\";\n const classType = data.type == \"select\" ? \"select\" : `select-${data.type}`;\n data.classes = !data.classes ? `form-group-${classType}` : `${data.classes} form-group-${classType}`;\n return control;\n}\n\nexport function createFormStatic(id: string, data: IFormStaticData): IFormControl {\n const control = createFormControl(id, \"static\", data);\n data = control.data;\n data.style = data.style || \"table\";\n return control;\n}\n\nexport function createFormModel(id: string, data: IFormModelData): IFormControl {\n const control = createFormControl(id, \"model\", data);\n data = control.data;\n data.name = data.name || \"\";\n return control;\n}\n\nexport function createFormFile(id: string, data: IFormFileData): IFormControl {\n const control = createFormControl(id, \"file\", data);\n data = control.data;\n data.accept = data.accept || \".jpg,.jpeg,.png\";\n data.multi = data.multi || false;\n data.baseUrl = ObjectUtils.isString(data.baseUrl) ? data.baseUrl : \"assets/\";\n data.uploadUrl = ObjectUtils.isString(data.uploadUrl) ? data.uploadUrl : \"assets\";\n data.createUploadData = data.createUploadData || ((file: File) => {\n const form = new FormData();\n form.append(\"file\", file);\n return form;\n });\n return control;\n}\n","import {ComponentFactoryResolver, Inject, Injectable, Injector, Type, ViewContainerRef} from \"@angular/core\";\nimport {\n FORM_CONTROL_PROVIDER, FORM_GROUP_TYPE,\n IDynamicFormControl,\n IFormControlComponent,\n IFormControlProvider,\n IFormGroupComponent\n} from \"../common-types\";\nimport {ObjectUtils} from \"@stemy/ngx-utils\";\n\n@Injectable()\nexport class DynamicFormService {\n\n constructor(@Inject(FORM_CONTROL_PROVIDER) private components: IFormControlProvider[],\n @Inject(FORM_GROUP_TYPE) private groupType: Type<IFormGroupComponent>,\n private resolver: ComponentFactoryResolver,\n public readonly injector: Injector) {\n }\n\n findProvider(control: IDynamicFormControl): IFormControlProvider {\n if (!control) return null;\n const providers = this.components.filter(p => p.acceptor(control));\n if (providers.length == 0) {\n throw new Error(`No component provider for control: ${JSON.stringify({\n id: control.id,\n type: control.type,\n data: control.data\n })}`);\n }\n // Sort providers\n providers.sort((a, b) => ObjectUtils.compare(a.priority, b.priority))\n return providers[0];\n }\n\n createComponent(vcr: ViewContainerRef, provider: IFormControlProvider): IFormControlComponent {\n vcr.clear();\n if (!provider) return null;\n const factory = this.resolver.resolveComponentFactory(provider.component);\n return vcr.createComponent(factory).instance;\n }\n\n createGroup(vcr: ViewContainerRef): IFormGroupComponent {\n vcr.clear();\n const factory = this.resolver.resolveComponentFactory(this.groupType);\n return vcr.createComponent(factory).instance;\n }\n}\n","import {DatePipe} from \"@angular/common\";\nimport {FactoryDependencies, FileUtils, ObjectUtils} from \"@stemy/ngx-utils\";\nimport {FormControlTester, FormControlValidator, IDynamicFormControl, IFormControlSerializer} from \"../common-types\";\n\nexport class FormUtilities {\n\n static checkField(expression: string = `true`): FormControlTester {\n // @dynamic\n const lambda = (control: IDynamicFormControl): Promise<boolean> => {\n return Promise.resolve(ObjectUtils.evaluate(expression, {control: control}));\n };\n return lambda;\n }\n\n static checkReadonly(control: IDynamicFormControl): Promise<boolean> {\n return Promise.resolve(control.visible && !control.disabled);\n }\n\n static readonly(): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n static validateJSON(control: IDynamicFormControl): Promise<string> {\n const value = control.value;\n if (!value) return Promise.resolve(null);\n try {\n JSON.parse(value);\n return Promise.resolve(null);\n } catch (e) {\n return Promise.resolve(\"error.not-valid-json\")\n }\n }\n\n static validateRequired(control: IDynamicFormControl): Promise<string> {\n const value = control.value;\n return Promise.resolve(!ObjectUtils.isNumber(value) && !value ? \"error.required\" : null);\n }\n\n static validateMinLength(length: number): FormControlValidator {\n // @dynamic\n const lambda = (control: IDynamicFormControl) => {\n const value = control.value;\n if (!ObjectUtils.isString(value) || value.length < length) {\n return Promise.resolve({\"error.min-length\": {length: length}});\n }\n return Promise.resolve(null);\n };\n return lambda;\n }\n\n static validateMaxLength(length: number): FormControlValidator {\n // @dynamic\n const lambda = (control: IDynamicFormControl) => {\n const value = control.value;\n if (!ObjectUtils.isString(value) || value.length > length) {\n return Promise.resolve({\"error.max-length\": {length: length}});\n }\n return Promise.resolve(null);\n };\n return lambda;\n }\n\n static validateRequiredTranslation(control: IDynamicFormControl): Promise<string> {\n const value: any[] = control.value;\n if (!value || value.length == 0) return Promise.resolve(\"error.required\");\n return Promise.resolve(value.findIndex(t => (t.lang == \"de\" || t.lang == \"en\") && !t.translation) < 0 ? null : \"error.required\");\n }\n\n static validateEmail(control: IDynamicFormControl): Promise<string> {\n const value = control.value;\n if (!value) return Promise.resolve(null);\n const emailRegexp = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return Promise.resolve(emailRegexp.test(value) ? null : \"error.invalid-email\");\n }\n\n static validatePhone(control: IDynamicFormControl): Promise<string> {\n const value = control.value;\n if (!value) return Promise.resolve(null);\n const phoneRegexp = /^(?:\\d){10,12}$/;\n return Promise.resolve(phoneRegexp.test(value) ? null : \"error.invalid-phone\");\n }\n\n static serializeLogo(id: string, parent: IDynamicFormControl): Promise<any> {\n const value: string = parent.model[id];\n return Promise.resolve(!value || value.length == 0 ? null : value);\n }\n\n static serializeFile(id: string, parent: IDynamicFormControl): Promise<any> {\n const value: any = parent.model[id];\n if (ObjectUtils.isBlob(value)) return Promise.resolve(value);\n return Promise.resolve(!ObjectUtils.isString(value) || !value.startsWith(\"data:\") ? null : FileUtils.dataToBlob(value));\n }\n\n static serializeNumber(id: string, parent: IDynamicFormControl): Promise<any> {\n const value: string = parent.model[id];\n return Promise.resolve(!value || value.length == 0 ? 0 : parseFloat(value));\n }\n\n static serializeJSON(id: string, parent: IDynamicFormControl): Promise<any> {\n const value: string = parent.model[id];\n return Promise.resolve(!value ? {} : JSON.parse(value));\n }\n\n @FactoryDependencies(DatePipe)\n static serializeDate(date: DatePipe, format: string = \"yyyy-MM-dd\", defaultValue: string = \"\"): IFormControlSerializer {\n // @dynamic\n const lambda = (id: string, parent: IDynamicFormControl): Promise<any> => {\n const value: any = parent.model[id];\n if (!ObjectUtils.isDate(value)) return Promise.resolve(value || defaultValue);\n return Promise.resolve(!format ? value : date.transform(value, format));\n };\n return lambda;\n }\n}\n","import {Injectable} from \"@angular/core\";\nimport {ApiService, StringUtils} from \"@stemy/ngx-utils\";\n\nimport {FormUtilities} from \"./form-utilities\";\n\nimport {\n createFormFile,\n createFormInput,\n createFormSelect,\n FormControlValidatorFactory,\n IDynamicFormControl,\n IFormControl,\n IFormControlData,\n IFormFileData,\n IFormInputData,\n IFormSelectData,\n IFormSerializers\n} from \"../common-types\";\n\nexport interface IOpenApiSchemaProperty {\n id: string;\n type: string;\n format: string;\n column: boolean;\n additionalProperties: any;\n $ref: string;\n enum: string[];\n [key: string]: any;\n}\n\nexport interface IOpenApiSchema {\n properties: { [name: string]: IOpenApiSchemaProperty };\n required: string[];\n}\n\nexport interface IDynamicFormInputs {\n controls?: IFormControl[];\n serializers?: IFormSerializers;\n schema?: IOpenApiSchema;\n}\n\n@Injectable()\nexport class OpenApiService {\n\n private schemasPromise: Promise<any>;\n private schemas: any;\n\n constructor(private api: ApiService) {\n const baseUrl = this.api.url(\"\").replace(\"api/\", \"api-docs\");\n this.schemas = {};\n this.schemasPromise = new Promise<any>((resolve => {\n this.api.client.get(baseUrl).subscribe((res: any) => {\n this.schemas = res.definitions || {};\n resolve(this.schemas);\n }, () => {\n resolve({});\n });\n }));\n }\n\n getFormInputsForSchema(name: string): Promise<IDynamicFormInputs> {\n this.api.cache = {};\n return this.schemasPromise.then(schemas => {\n const schema: IOpenApiSchema = schemas[name];\n const inputs = this.getFormInputsForSchemaDef(schema);\n return inputs;\n });\n }\n\n private getFormInputsForSchemaDef(schema: IOpenApiSchema): IDynamicFormInputs {\n const inputs: IDynamicFormInputs = {};\n if (!schema) return inputs;\n inputs.schema = schema;\n inputs.serializers = {};\n inputs.controls = Object.keys(schema.properties || {}).map(p => {\n const property = schema.properties[p];\n property.id = p;\n inputs.serializers[p] = (id: string, parent: IDynamicFormControl) => {\n return Promise.resolve(parent.model[id]);\n };\n return this.getFormControlForProperty(property, schema);\n }).filter(t => null !== t);\n return inputs;\n }\n\n private getFormControlForProperty(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormControl {\n if (Array.isArray(property.enum)) {\n return createFormSelect(property.id, this.getFormSelectData(property, schema));\n }\n switch (property.type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"textarea\":\n return createFormInput(property.id, this.getFormInputData(property, schema));\n case \"list\":\n return createFormSelect(property.id, this.getFormSelectData(property, schema));\n case \"file\":\n return createFormFile(property.id, this.getFormFileData(property, schema));\n }\n return null;\n }\n\n private getBaseFormData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormControlData {\n return {\n readonly: property.readonly ? FormUtilities.readonly : null,\n shouldSerialize: FormUtilities.checkReadonly,\n validators: this.getValidators(property, schema)\n }\n }\n\n private getFormInputData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormInputData {\n let type = StringUtils.has(property.id, \"password\", \"Password\") ? \"password\" : property.type;\n switch (property.type) {\n case \"boolean\":\n type = \"checkbox\";\n break;\n case \"textarea\":\n type = \"textarea\";\n break;\n }\n return {\n ...this.getBaseFormData(property, schema),\n type\n };\n }\n\n private getFormSelectData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormSelectData {\n const options = Array.isArray(property.enum)\n ? () => {\n return Promise.resolve(property.enum.map(id => ({ id, label: `${property.id}.${id}` })));\n }\n : () => {\n this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {\n return result.items.map(i => {\n return { id: i._id, label: i.name };\n });\n });\n return this.api.cache[property.endpoint];\n };\n return {\n ...this.getBaseFormData(property, schema),\n options,\n };\n }\n\n private getFormFileData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormFileData {\n return {\n ...this.getBaseFormData(property, schema),\n multi: property.multi\n };\n }\n\n private getValidators(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): FormControlValidatorFactory[] {\n const validators: FormControlValidatorFactory[] = [];\n if (schema.required.indexOf(property.id) >= 0) {\n validators.push(FormUtilities.validateRequired);\n }\n if (property.minLength) {\n validators.push({\n type: FormUtilities,\n func: FormUtilities.validateMinLength,\n params: [property.minLength]\n });\n }\n if (property.maxLength) {\n validators.push({\n type: FormUtilities,\n func: FormUtilities.validateMaxLength,\n params: [property.maxLength]\n });\n }\n switch (property.format) {\n case \"email\":\n validators.push(FormUtilities.validateEmail);\n break;\n }\n return validators;\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Renderer2\n} from \"@angular/core\";\nimport {Subscription} from \"rxjs\";\nimport {IAsyncMessage, IToasterService, TOASTER_SERVICE} from \"@stemy/ngx-utils\";\nimport {AsyncSubmitMethod, IDynamicFormBase} from \"../common-types\";\n\n@Directive({\n selector: \"[async-submit]\",\n exportAs: \"async-submit\"\n})\nexport class AsyncSubmitDirective implements OnInit, OnDestroy {\n\n @Input(\"async-submit\") method: AsyncSubmitMethod;\n @Input() form: IDynamicFormBase;\n\n @Output() onSuccess: EventEmitter<IAsyncMessage>;\n @Output() onError: EventEmitter<IAsyncMessage>;\n\n private loading: boolean;\n private disabled: boolean;\n private callback: Function;\n private onStatusChange: Subscription;\n private onSubmit: Subscription;\n\n @HostBinding(\"class.disabled\")\n get isDisabled(): boolean {\n return this.disabled;\n }\n\n @HostBinding(\"class.loading\")\n get isLoading(): boolean {\n return this.loading;\n }\n\n constructor(@Inject(TOASTER_SERVICE) private toaster: IToasterService, private cdr: ChangeDetectorRef, elem: ElementRef, renderer: Renderer2) {\n this.onSuccess = new EventEmitter<IAsyncMessage>();\n this.onError = new EventEmitter<IAsyncMessage>();\n if (elem.nativeElement.tagName !== \"BUTTON\") return;\n renderer.setAttribute(elem.nativeElement, \"type\", \"button\");\n }\n\n ngOnInit(): void {\n if (!this.form) return;\n this.disabled = this.form.status !== \"VALID\";\n this.cdr.detectChanges();\n this.onStatusChange = this.form.onStatusChange.subscribe(form => {\n this.disabled = form.status !== \"VALID\";\n this.cdr.detectChanges();\n if (!this.callback || form.status == \"PENDING\") return;\n if (!this.disabled) {\n this.callback();\n }\n this.callback = null;\n });\n this.onSubmit = this.form.onSubmit.subscribe(() => this.callMethod());\n }\n\n ngOnDestroy(): void {\n if (this.onStatusChange) this.onStatusChange.unsubscribe();\n if (this.onSubmit) this.onSubmit.unsubscribe();\n }\n\n @HostListener(\"click\")\n click(): void {\n this.callback = () => this.callMethod();\n if (this.form.status !== \"VALID\" && this.form.status !== \"INVALID\") return;\n this.callback();\n this.callback = null;\n }\n\n callMethod(): void {\n if (this.loading) return;\n this.loading = true;\n this.method(this.form).then(result => {\n this.loading = false;\n if (result) {\n this.onSuccess.emit(result);\n this.toaster.success(result.message, result.context);\n }\n }, reason => {\n if (!reason || !reason.message)\n throw new Error(\"Reason must implement IAsyncMessage interface\");\n this.loading = false;\n this.onError.emit(reason);\n this.toaster.error(reason.message, reason.context);\n });\n }\n}\n","import {Directive, Input, OnChanges, SimpleChanges, ViewContainerRef} from \"@angular/core\";\nimport {IDynamicFormControl, IFormControlComponent} from \"../common-types\";\nimport {DynamicFormService} from \"../services/dynamic-form.service\";\n\n@Directive({\n selector: \"[form-control]\",\n})\nexport class DynamicFormControlDirective implements OnChanges {\n\n @Input(\"form-control\") control: IDynamicFormControl;\n\n get component(): IFormControlComponent {\n return this.comp;\n }\n\n private comp: IFormControlComponent;\n\n constructor(private vcr: ViewContainerRef, private forms: DynamicFormService) {\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.control) {\n this.comp = this.forms.createComponent(this.vcr, this.control.provider);\n }\n if (!this.comp) return;\n this.comp.control = this.control;\n }\n}\n","import {Directive, Input, TemplateRef} from \"@angular/core\";\n\n@Directive({\n selector: `ng-template[control],\n ng-template[label],\n ng-template[input],\n ng-template[prefix],\n ng-template[suffix],\n ng-template[setPrefix],\n ng-template[setSuffix],\n ng-template[formPrefix],\n ng-template[formSuffix],\n ng-template[innerFormPrefix],\n ng-template[innerFormSuffix]`\n})\nexport class DynamicFormTemplateDirective {\n\n @Input() control: string;\n @Input() label: string;\n @Input() input: string;\n @Input() prefix: string;\n @Input() suffix: string;\n @Input() setPrefix: string;\n @Input() setSuffix: string;\n @Input() formPrefix: string;\n @Input() formSuffix: string;\n @Input() innerFormPrefix: string;\n @Input() innerFormSuffix: string;\n\n constructor(public template: TemplateRef<any>) {\n }\n}\n","import { AfterContentInit, ChangeDetectorRef, ContentChild, ContentChildren, EventEmitter, Injector, Input, Output, QueryList, TemplateRef, Directive } from \"@angular/core\";\nimport {ObjectUtils} from \"@stemy/ngx-utils\";\nimport {\n DynamicFormControl, DynamicFormState, IDynamicFormBase, IDynamicFormControl, IDynamicFormTemplates,\n IFormControlProvider\n} from \"../../common-types\";\nimport {DynamicFormTemplateDirective} from \"../../directives/dynamic-form-template.directive\";\nimport {DynamicFormService} from \"../../services/dynamic-form.service\";\n\n@Directive()\nexport abstract class DynamicFormBaseComponent implements IDynamicFormBase, AfterContentInit {\n\n @Input() name: string;\n @Input() readonly: boolean;\n @Input() updateOn: \"change\" | \"blur\" | \"submit\";\n @Input() classes: any;\n @Input() parent: IDynamicFormBase;\n\n @Input() wrapperTemplate: TemplateRef<any>;\n @Input() fieldSetTemplate: TemplateRef<any>;\n @Input() controlTemplate: TemplateRef<any>;\n\n @Input() controlTemplates: IDynamicFormTemplates;\n @Input() labelTemplates: IDynamicFormTemplates;\n @Input() inputTemplates: IDynamicFormTemplates;\n @Input() prefixTemplates: IDynamicFormTemplates;\n @Input() suffixTemplates: IDynamicFormTemplates;\n @Input() setPrefixTemplates: IDynamicFormTemplates;\n @Input() setSuffixTemplates: IDynamicFormTemplates;\n\n @Output() onChange: EventEmitter<IDynamicFormControl>;\n @Output() onStatusChange: EventEmitter<IDynamicFormBase>;\n @Output() onInit: EventEmitter<IDynamicFormBase>;\n @Output() onSubmit: EventEmitter<IDynamicFormBase>;\n\n @ContentChild(\"prefixTemplate\")\n prefixTemplate: TemplateRef<any>;\n\n @ContentChild(\"suffixTemplate\")\n suffixTemplate: TemplateRef<any>;\n\n get root(): IDynamicFormBase {\n let form: IDynamicFormBase = this;\n while (ObjectUtils.isDefined(form.parent)) {\n form = form.parent;\n }\n return form;\n }\n\n abstract status: DynamicFormState;\n readonly injector: Injector;\n readonly cdr: ChangeDetectorRef;\n\n @ContentChildren(DynamicFormTemplateDirective)\n protected templates: QueryList<DynamicFormTemplateDirective>;\n\n @ContentChild(\"wrapperTemplate\")\n protected cWrapperTemplate: TemplateRef<any>;\n\n @ContentChild(\"fieldSetTemplate\")\n protected cFieldSetTemplate: TemplateRef<any>;\n\n @ContentChild(\"controlTemplate\")\n protected cControlTemplate: TemplateRef<any>;\n\n protected constructor(cdr: ChangeDetectorRef, private formService: DynamicFormService) {\n this.name = \"\";\n\n this.controlTemplates = {};\n this.labelTemplates = {};\n this.inputTemplates = {};\n this.prefixTemplates = {};\n this.suffixTemplates = {};\n\n this.onChange = new EventEmitter<DynamicFormControl>();\n this.onStatusChange = new EventEmitter<IDynamicFormBase>();\n this.onInit = new EventEmitter<IDynamicFormBase>();\n this.onSubmit = new EventEmitter<IDynamicFormBase>();\n this.injector = formService.injector;\n this.cdr = cdr;\n }\n\n // --- IDynamicFormBase\n\n abstract validate(showErrors?: boolean): Promise<any>;\n abstract serialize(validate?: boolean): Promise<any>;\n abstract check(): Promise<any>;\n abstract getControl(id: string): IDynamicFormControl;\n\n findProvider(control: IDynamicFormControl): IFormControlProvider {\n return this.formService.findProvider(control);\n }\n\n // --- Lifecycle hooks\n\n ngAfterContentInit(): void {\n this.wrapperTemplate = this.wrapperTemplate || this.cWrapperTemplate;\n this.fieldSetTemplate = this.fieldSetTemplate || this.cFieldSetTemplate;\n this.controlTemplate = this.controlTemplate || this.cControlTemplate;\n this.controlTemplates = this.filterTemplates(this.controlTemplates, \"control\");\n this.labelTemplates = this.filterTemplates(this.labelTemplates, \"label\");\n this.inputTemplates = this.filterTemplates(this.inputTemplates , \"input\");\n this.prefixTemplates = this.filterTemplates(this.prefixTemplates, \"prefix\");\n this.suffixTemplates = this.filterTemplates(this.suffixTemplates, \"suffix\");\n this.setPrefixTemplates = this.filterTemplates(this.setPrefixTemplates, \"setPrefix\");\n this.setSuffixTemplates = this.filterTemplates(this.setSuffixTemplates, \"setSuffix\");\n }\n\n protected filterTemplates(templates: IDynamicFormTemplates, type: string): IDynamicFormTemplates {\n if (ObjectUtils.isObject(templates) && Object.keys(templates).length > 0) return templates;\n return this.templates.filter(t => !!t[type]).reduce((result, directive) => {\n result[directive[type]] = directive.template;\n return result;\n }, {});\n }\n}\n","import {AfterContentInit, ChangeDetectorRef, Component, Input, OnChanges, SimpleChanges} from \"@angular/core\";\nimport {first} from \"rxjs/operators\";\nimport {\n DynamicFormGroup,\n DynamicFormState,\n IDynamicForm,\n IDynamicFormControl,\n IFormControl,\n IFormFieldSet,\n IFormSerializers\n} from \"../../common-types\";\nimport {DynamicFormService} from \"../../services/dynamic-form.service\";\nimport {DynamicFormBaseComponent} from \"../base/dynamic-form-base.component\";\n\n@Component({\n moduleId: module.id,\n selector: \"dynamic-form, [dynamic-form]\",\n templateUrl: \"./dynamic-form.component.html\",\n providers: [{provide: DynamicFormBaseComponent, useExisting: DynamicFormComponent}]\n})\nexport class DynamicFormComponent extends DynamicFormBaseComponent implements IDynamicForm, AfterContentInit, OnChanges {\n\n @Input() group: DynamicFormGroup;\n @Input() controls: IFormControl[];\n @Input() serializers: IFormSerializers;\n @Input() fieldSets: IFormFieldSet[];\n @Input() data: any;\n\n defaultFieldSet: IFormFieldSet;\n\n get status(): DynamicFormState {\n return this.group.state;\n }\n\n get formControls(): IDynamicFormControl[] {\n return this.group.formControls;\n }\n\n constructor(cdr: ChangeDetectorRef, forms: DynamicFormService) {\n super(cdr, forms);\n this.group = new DynamicFormGroup(this);\n this.defaultFieldSet = {\n id: \"\",\n title: \"\",\n classes: \"\"\n };\n }\n\n // --- Lifecycle hooks\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.data) return;\n if (changes.data || changes.controls || changes.serializers || changes.formGroup) {\n if (this.group.id) return;\n this.group.setup(this.data, this);\n this.group.reloadControls();\n }\n }\n\n // --- Custom ---\n\n onFormSubmit(): void {\n const root = this.root;\n root.validate().then(() => root.onSubmit.emit(this), () => {});\n }\n\n // --- IDynamicForm ---\n\n validate(showErrors: boolean = true): Promise<any> {\n return new Promise<any>((resolve, reject) => {\n this.group.statusChanges.pipe(first(status => status == \"VALID\" || status == \"INVALID\")).subscribe(status => {\n if (showErrors) this.group.showErrors();\n if (status == \"VALID\") {\n resolve(null);\n return;\n }\n reject(null);\n });\n this.group.updateValueAndValidity();\n });\n }\n\n serialize(validate?: boolean): Promise<any> {\n return new Promise<any>((resolve, reject) => {\n const serialize = () => {\n this.group.serialize().then(resolve);\n };\n if (validate) {\n this.validate().then(serialize, reject);\n return;\n }\n serialize();\n });\n }\n\n check(): Promise<any> {\n return this.group.check();\n }\n\n getControl(id: string): IDynamicFormControl {\n return this.group.getControl(id);\n }\n}\n","import {\n AfterContentInit, ChangeDetectorRef, Component, ContentChild, Input, OnChanges, QueryList, SimpleChanges,\n TemplateRef, ViewChildren\n} from \"@angular/core\";\nimport {ObjectUtils, UniqueUtils} from \"@stemy/ngx-utils\";\nimport {\n DynamicFormGroup, DynamicFormState, IDynamicFormBase, IDynamicFormControl, IDynamicFormsConfigs,\n IDynamicFormTemplates, IDynamicSingleFormConfig\n} from \"../../common-types\";\nimport {DynamicFormBaseComponent} from \"../base/dynamic-form-base.component\";\nimport {DynamicFormService} from \"../../services/dynamic-form.service\";\n\nconst statusPriority: DynamicFormState[] = [\"LOADING\", \"PENDING\", \"DISABLED\", \"INVALID\"];\n\n@Component({\n moduleId: module.id,\n selector: \"dynamic-forms, [dynamic-forms]\",\n templateUrl: \"./dynamic-forms.component.html\",\n providers: [{provide: DynamicFormBaseComponent, useExisting: DynamicFormsComponent}]\n})\nexport class DynamicFormsComponent extends DynamicFormBaseComponent implements IDynamicFormBase, AfterContentInit, OnChanges {\n\n @Input() data: IDynamicFormsConfigs;\n\n @Input() containerTemplate: TemplateRef<any>;\n\n @Input() formPrefixTemplates: IDynamicFormTemplates;\n @Input() formSuffixTemplates: IDynamicFormTemplates;\n @Input() innerFormPrefixTemplates: IDynamicFormTemplates;\n @Input() innerFormSuffixTemplates: IDynamicFormTemplates;\n\n get status(): DynamicFormState {\n for (let i = 0; i < statusPriority.length; i++) {\n const status = statusPriority[i];\n if (this.checkForms(f => f.status == status)) return status;\n }\n return \"VALID\";\n }\n\n public configs: IDynamicFormsConfigs;\n\n @ContentChild(\"containerTemplate\")\n protected cContainerTemplate: TemplateRef<any>;\n\n @ViewChildren(DynamicFormBaseComponent)\n private forms: QueryList<IDynamicFormBase>;\n\n constructor(cdr: ChangeDetectorRef, formService: DynamicFormService) {\n super(cdr, formService);\n this.formPrefixTemplates = {};\n this.formSuffixTemplates = {};\n this.innerFormPrefixTemplates = {};\n this.innerFormSuffixTemplates = {};\n }\n\n // --- Lifecycle hooks\n\n ngAfterContentInit(): void {\n super.ngAfterContentInit();\n this.containerTemplate = this.containerTemplate || this.cContainerTemplate;\n this.formPrefixTemplates = this.filterTemplates(this.formPrefixTemplates, \"formPrefix\");\n this.formSuffixTemplates = this.filterTemplates(this.formSuffixTemplates, \"formSuffix\");\n this.innerFormPrefixTemplates = this.filterTemplates(this.innerFormPrefixTemplates, \"innerFormPrefix\");\n this.innerFormSuffixTemplates = this.filterTemplates(this.innerFormSuffixTemplates, \"innerFormSuffix\");\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n this.configs = this.createFormGroups(this.data);\n }\n\n // --- IDynamicFormBase ---\n\n validate(showErrors: boolean = true): Promise<any> {\n if (!this.forms) return Promise.reject(null);\n return Promise.all(this.forms.map(f => f.validate(showErrors)));\n }\n\n serialize(validate?: boolean): Promise<any> {\n if (!this.forms) return validate ? Promise.reject(null) : Promise.resolve({});\n return new Promise<any>((resolve, reject) => {\n const promises = this.forms.map(f => f.serialize(validate));\n Promise.all(promises).then(results => {\n let result = {};\n results.forEach((data, ix) => {\n const config = this.data[ix];\n let path: Array<string | number> = null;\n if (ObjectUtils.isArray(config.path) && config.path.length > 0) {\n path = config.path;\n } else if (ObjectUtils.isString(config.path) && config.path.length > 0) {\n path = config.path.split(\".\");\n } else if (ObjectUtils.isNumber(config.path)) {\n path = [config.path];\n }\n if (!path) {\n result = ObjectUtils.assign(result, data);\n return;\n }\n result = ObjectUtils.mapToPath(result, data, path.map(p => `${p}`));\n });\n resolve(result);\n }, reject);\n });\n }\n\n check(): Promise<any> {\n if (!this.forms) return Promise.resolve(null);\n return Promise.all(this.forms.map(t => t.check()));\n }\n\n getControl(id: string): IDynamicFormControl {\n return this.getFromValue(f => f.getControl(id));\n }\n\n private checkForms(check: (form: IDynamicFormBase) => boolean): boolean {\n this.cdr.detectChanges();\n if (!this.forms) return false;\n return ObjectUtils.isDefined(this.forms.find(check));\n }\n\n private getFromValue<T>(check: (form: IDynamicFormBase) => T): T {\n if (!this.forms) return null;\n let value: T = null;\n this.forms.find(f => {\n value = check(f);\n return ObjectUtils.isDefined(value);\n });\n return value;\n }\n\n private createFormGroups(configs: IDynamicFormsConfigs): IDynamicFormsConfigs {\n return (configs || []).map((c: any) => {\n if (c.multi) return c;\n const config = <IDynamicSingleFormConfig>c;\n const group = new DynamicFormGroup(this, {\n id: config.id || UniqueUtils.uuid(),\n type: \"model\",\n data: config.controlData\n });\n config.group = group;\n config.name = config.name || this.name;\n group.setup(config.data, config);\n group.reloadControls();\n return config;\n });\n }\n}\n","import {Component, HostBinding} from \"@angular/core\";\nimport {IDynamicForm, IDynamicFormControl, IFormGroupComponent} from \"../../common-types\";\n\n@Component({\n moduleId: module.id,\n selector: \"div[dynamic-form-group]\",\n templateUrl: \"./dynamic-form-group.component.html\"\n})\nexport class DynamicFormGroupComponent implements IFormGroupComponent {\n form: IDynamicForm;\n control: IDynamicFormControl;\n\n @HostBinding(\"class\")\n get classes(): string {\n if (!this.control) return \"form-group\";\n return [\"form-group\", \"form-group-\" + this.control.id, this.control.data.classes, this.control.errors && this.control.touched ? \"form-group-invalid\" : \"\"].join(\" \");\n }\n}\n","import {Component, Inject} from \"@angular/core\";\nimport {FormControlComponent, IDynamicFormControl, IFormFileData} from \"../../common-types\";\nimport {ApiService, ArrayUtils, FileUtils, IToasterService, ObjectUtils, TOASTER_SERVICE} from \"@stemy/ngx-utils\";\n\n@Component({\n selector: \"dynamic-form-file\",\n styleUrls: [\"./dynamic-form-file.component.scss\"],\n templateUrl: \"./dynamic-form-file.component.html\"\n})\nexport class DynamicFormFileComponent extends FormControlComponent<IFormFileData> {\n\n private fileImageCache: any[];\n\n // Acceptor for provider\n static acceptor(control: IDynamicFormControl): boolean {\n return control.type == \"file\";\n }\n\n // Loader for provider\n static loader(): Promise<any> {\n return Promise.resolve();\n }\n\n constructor(readonly api: ApiService, @Inject(TOASTER_SERVICE) readonly toaster: IToasterService) {\n super();\n this.fileImageCache = [];\n }\n\n onSelect(input: HTMLInputElement): void {\n this.processFiles(input.files);\n input.value = \"\";\n }\n\n protected processFiles(fileList: FileList): void {\n const files: File[] = [];\n const accept = this.data.accept;\n const types: string[] = ObjectUtils.isString(accept) && accept.length > 0 ? accept.toLowerCase().split(\",\") : null;\n if (fileList.length == 0) return;\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList.item(i);\n const type = file.type.toLowerCase();\n const ext = FileUtils.getExtension(file);\n if (types && !ArrayUtils.has(types, type, ext)) continue;\n files.push(file);\n }\n if (files.length == 0) {\n this.toaster.error(\"message.error.wrong-files\");\n return;\n }\n this.upload(files);\n }\n\n protected upload(files: File[]): void {\n const single = !this.data.multi;\n if (single) files.length = Math.min(files.length , 1);\n const promises = [];\n files.forEach((file, ix) => {\n if (this.data.asDataUrl) {\n promises.push(FileUtils.readFileAsDataURL(file));\n return;\n }\n if (this.data.asFile) {\n promises.push(Promise.resolve(file));\n return;\n }\n promises.push(\n this.api.upload(\n this.data.uploadUrl,\n this.data.createUploadData(file),\n console.log,\n this.data.uploadOptions\n ).then(asset => asset._id || asset, () => null)\n );\n });\n Promise.all(promises).then(assets => {\n if (single) {\n this.control.setValue(assets[0]);\n return;\n }\n const current = this.value || [];\n this.control.setValue(current.concat(assets.filter(t => !!t)));\n });\n }\n\n delete(index?: number): void {\n if (this.data.multi) {\n const current = Array.from(this.value || []);\n current.splice(index, 1);\n this.control.setValue(current);\n return;\n }\n this.control.setValue(null);\n }\n\n getUrl(image: any): string {\n return `url('${this.getImgUrl(image)}')`;\n }\n\n private getImgUrl(image: any): string {\n if (ObjectUtils.isBlob(image)) {\n let cache = this.fileImageCache.find(t => t.file == image);\n if (!cache) {\n cache = {file: image, url: URL.createObjectURL(image)};\n this.fileImageCache.push(cache);\n }\n return cache.url;\n }\n const url = !image ? null : image.imageUrl || image;\n if (!ObjectUtils.isString(url)) return null;\n if (url.startsWith(\"data:\")) return url;\n if (!this.data.baseUrl) {\n const subUrl = url.startsWith(\"/\") ? url.substr(1) : url;\n return this.api.url(subUrl);\n }\n return this.api.url(`${this.data.baseUrl}${url}`);\n }\n}\n","import {Component, HostBinding, Inject} from \"@angular/core\";\nimport {ILanguageService, ITranslation, LANGUAGE_SERVICE, ObjectUtils} from \"@stemy/ngx-utils\";\nimport {DynamicFormControl, FormControlComponent, IFormInputData} from \"../../common-types\";\n\n@Component({\n moduleId: module.id,\n selector: \"dynamic-form-input\",\n templateUrl: \"./dynamic-form-input.component.html\"\n})\nexport class DynamicFormInputComponent extends FormControlComponent<IFormInputData> {\n\n // Acceptor for provider\n static acceptor(control: DynamicFormControl): boolean {\n return control.type == \"input\";\n }\n\n // Loader for provider\n static loader(): Promise<any> {\n return Promise.resolve();\n }\n\n @HostBinding(\"class.checked\")\n get isChecked(): boolean {\n return this.data.type == \"checkbox\" && this.value;\n }\n\n constructor(@Inject(LANGUAGE_SERVICE) private language: ILanguageService) {\n super();\n }\n\n onDateChange(value: string): void {\n const date = new Date(value);\n const dateValue = <number>date.valueOf();\n if (isNaN(dateValue) || dateValue < -30610224000000) return;\n this.control.setValue(date)\n }\n\n onMaskChange(value: string): void {\n value = ObjectUtils.isFunction(this.data.unmask) ? this.data.unmask(value) : value;\n this.control.setValue(value)\n }\n\n onTextChange(value: string): void {\n if (!this.data.useLanguage) {\n this.control.setValue(value);\n return;\n }\n const translations: ITranslation[] = ObjectUtils.isArray(this.value) ? Array.from(this.value) : [];\n const translation = translations.find(t => t.lang == this.language.editLanguage);\n if (translation) {\n translation.translation = value;\n } else {\n translations.push({\n lang: this.language.editLanguage,\n translation: value\n });\n }\n this.control.setValue(translations);\n }\n\n onNumberBlur(): void {\n const value = this.value;\n if (ObjectUtils.isNumber(this.data.max) && this.data.max < value) {\n this.control.setValue(this.data.max);\n } else if (ObjectUtils.isNumber(this.data.min) && this.data.min > value) {\n this.control.setValue(this.data.min);\n }\n this.control.onBlur();\n }\n}\n","import {Component} from \"@angular/core\";\nimport {ObjectUtils, ReflectUtils} from \"@stemy/ngx-utils\";\nimport {\n DynamicFormControl,\n FormControlComponent,\n IDynamicForm, IDynamicFormControl,\n IFormControl, IFormControlOption,\n IFormControlOptions,\n IFormSelectData\n} from \"../../common-types\";\n\n@Component({\n moduleId: module.id,\n selector: \"dynamic-form-select\",\n templateUrl: \"./dynamic-form-select.component.html\"\n})\nexport class DynamicFormSelectComponent extends FormControlComponent<IFormSelectData> {\n\n // Acceptor for provider\n static acceptor(control: DynamicFormControl): boolean {\n return control.type == \"select\";\n }\n\n // Loader for provider\n static loader(control: IDynamicFormControl): Promise<any> {\n const data = control.getData<IFormSelectData>();\n if (data.type == \"radio\" && data.multi) {\n return Promise.reject(\"Radio group doesn't support multi select!\");\n }\n return new Promise<any>(resolve => {\n const getOptions = ReflectUtils.resolve<IFormControlOptions>(data.options, control.form.injector);\n getOptions(control).then(options => {\n if (data.emptyOption) options.unshift({id: null, label: \"\"});\n control.meta.options = options;\n DynamicFormSelectComponent.fillOptions(control, options);\n resolve(options);\n });\n });\n }\n\n static fillOptions(control: IDynamicFormControl, options: IFormControlOption[]): void {\n const data = control.getData<IFormSelectData>();\n const selected = control.value;\n if (data.multi || options.length == 0 || options.findIndex(t => t.id == selected) >= 0) return;\n control.setValue(options[0].id);\n }\n\n onSelectChange(value: any): void {\n const isArray = ObjectUtils.isArray(value);\n const current = this.value;\n if (this.data.multi) {\n if (isArray) {\n this.control.setValue(value);\n return;\n }\n if (ObjectUtils.isArray(current)) {\n this.control.setValue(\n current.indexOf(value) < 0\n ? current.concat([value])\n : current.filter(c => c !== value)\n );\n return;\n }\n this.control.setValue([value]);\n return;\n }\n if (isArray) value = value[0];\n if (current == value) {\n const option = this.meta.options.find(o => o.id !== value);\n value = option ? option.id : null;\n }\n this.control.setValue(value);\n }\n\n checkValue(option: IFormControlOption): boolean {\n const value = this.value;\n return ObjectUtils.isArray(value) ? value.indexOf(option.id) >= 0 : option.id == value;\n }\n\n findOption(option: IFormControlOption, index: number, id: string): boolean {\n return option.id == id;\n }\n}\n","import {Component} from \"@angular/core\";\nimport {\n DynamicFormControl,\n FormControlComponent,\n IDynamicForm,\n IFormControl,\n IFormStaticData\n} from \"../../common-types\";\n\n@Component({\n moduleId: module.id,\n selector: \"dynamic-form-static\",\n templateUrl: \"./dynamic-form-static.component.html\"\n})\nexport class DynamicFormStaticComponent extends FormControlComponent<IFormStaticData> {\n\n // Acceptor for provider\n static acceptor(control: DynamicFormControl): boolean {\n return control.type == \"static\";\n }\n\n // Loader for provider\n static loader(): Promise<any> {\n return Promise.resolve();\n }\n}\n","import {Component, ViewChild} from \"@angular/core\";\nimport {DynamicFormControl, FormControlComponent, IDynamicForm, IFormModelData} from \"../../common-types\";\n\n@Component({\n moduleId: module.id,\n selector: \"dynamic-form-model\",\n templateUrl: \"./dynamic-form-model.component.html\"\n})\nexport class DynamicFormModelComponent extends FormControlComponent<IFormModelData> {\n\n @ViewChild(\"subForm\")\n private subForm: IDynamicForm;\n\n // Acceptor for provider\n static acceptor(control: DynamicFormControl): boolean {\n return control.type == \"model\";\n }\n\n // Loader for provider\n static loader(): Promise<any> {\n return Promise.resolve();\n }\n}\n","import {Directive, Input, OnChanges, SimpleChanges, ViewContainerRef} from \"@angular/core\";\nimport {IDynamicForm, IDynamicFormControl, IFormControlComponent, IFormGroupComponent} from \"../common-types\";\nimport {DynamicFormService} from \"../services/dynamic-form.service\";\n\n@Directive({\n selector: \"[form-group]\",\n})\nexport class DynamicFormGroupDirective implements OnChanges {\n\n @Input(\"form-group\") control: IDynamicFormControl;\n @Input() form: IDynamicForm;\n @Input() visible: boolean;\n\n get component(): IFormControlComponent {\n return this.comp;\n }\n\n private comp: IFormGroupComponent;\n\n constructor(private vcr: ViewContainerRef, private forms: DynamicFormService) {\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.control || changes.form || changes.visible) {\n if (!this.visible) {\n this.vcr.clear();\n this.comp = null;\n return;\n }\n this.comp = this.forms.createGroup(this.vcr);\n }\n if (!this.comp) return;\n this.comp.form = this.form;\n this.comp.control = this.control;\n }\n}\n","import {ModuleWithProviders, NgModule} from \"@angular/core\";\nimport {CommonModule} from \"@angular/common\";\nimport {FormsModule, ReactiveFormsModule} from \"@angular/forms\";\nimport {TextMaskModule} from \"angular2-text-mask\";\nimport {NgxUtilsModule} from \"@stemy/ngx-utils\";\nimport {FormControlProvider, FormGroupProvider, provideFormControl, provideFormGroup} from \"./common-types\";\n\nimport {DynamicFormService} from \"./services/dynamic-form.service\";\nimport {OpenApiService} from \"./services/open-api.service\";\n\nimport {AsyncSubmitDirective} from \"./directives/async-submit.directive\";\nimport {DynamicFormControlDirective} from \"./directives/dynamic-form-control.directive\";\nimport {DynamicFormGroupDirective} from \"./directives/dynamic-form-group.directive\";\nimport {DynamicFormTemplateDirective} from \"./directives/dynamic-form-template.directive\";\nimport {DynamicFormsComponent} from \"./components/dynamic-forms/dynamic-forms.component\";\nimport {DynamicFormComponent} from \"./components/dynamic-form/dynamic-form.component\";\n\nimport {DynamicFormGroupComponent} from \"./components/dynamic-form-group/dynamic-form-group.component\";\nimport {DynamicFormFileComponent} from \"./components/dynamic-form-file/dynamic-form-file.component\";\nimport {DynamicFormInputComponent} from \"./components/dynamic-form-input/dynamic-form-input.component\";\nimport {DynamicFormSelectComponent} from \"./components/dynamic-form-select/dynamic-form-select.component\";\nimport {DynamicFormStaticComponent} from \"./components/dynamic-form-static/dynamic-form-static.component\";\nimport {DynamicFormModelComponent} from \"./components/dynamic-form-model/dynamic-form-model.component\";\n\n// --- Components ---\nexport const components = [\n DynamicFormsComponent,\n DynamicFormComponent,\n DynamicFormGroupComponent,\n DynamicFormFileComponent,\n DynamicFormInputComponent,\n DynamicFormSelectComponent,\n DynamicFormStaticComponent,\n DynamicFormModelComponent\n];\n\n// --- Directives ---\nexport const directives = [\n AsyncSubmitDirective,\n DynamicFormControlDirective,\n DynamicFormGroupDirective,\n DynamicFormTemplateDirective\n];\n\n// --- Pipes ---\nexport const pipes = [];\n\n@NgModule({\n declarations: [\n ...components,\n ...directives,\n ...pipes\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n TextMaskModule,\n NgxUtilsModule\n ],\n exports: [\n ...components,\n ...directives,\n ...pipes,\n FormsModule,\n ReactiveFormsModule,\n NgxUtilsModule\n ],\n entryComponents: components,\n providers: pipes\n})\nexport class NgxDynamicFormModule {\n\n static forRoot(controlProviders?: Array<FormControlProvider>, groupProvider?: FormGroupProvider): ModuleWithProviders<NgxDynamicFormModule> {\n return {\n ngModule: NgxDynamicFormModule,\n providers: [\n DynamicFormService,\n OpenApiService,\n provideFormControl(DynamicFormFileComponent, DynamicFormFileComponent.acceptor, DynamicFormFileComponent.loader),\n provideFormControl(DynamicFormInputComponent, DynamicFormInputComponent.acceptor, DynamicFormInputComponent.loader),\n provideFormControl(DynamicFormSelectComponent, DynamicFormSelectComponent.acceptor, DynamicFormSelectComponent.loader),\n provideFormControl(DynamicFormStaticComponent, DynamicFormStaticComponent.acceptor, DynamicFormStaticComponent.loader),\n provideFormControl(DynamicFormModelComponent, DynamicFormModelComponent.acceptor, DynamicFormModelComponent.loader),\n ...(controlProviders || []),\n groupProvider || provideFormGroup(DynamicFormGroupComponent)\n ]\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../src/ngx-dynamic-form/common-types.ts","../../src/ngx-dynamic-form/services/dynamic-form.service.ts","../../src/ngx-dynamic-form/services/form-utilities.ts","../../src/ngx-dynamic-form/services/open-api.service.ts","../../src/ngx-dynamic-form/directives/async-submit.directive.ts","../../src/ngx-dynamic-form/directives/dynamic-form-control.directive.ts","../../src/ngx-dynamic-form/directives/dynamic-form-template.directive.ts","../../src/ngx-dynamic-form/components/base/dynamic-form-base.component.ts","../../src/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.ts","../../src/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.ts","../../src/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.ts","../../src/ngx-dynamic-form/directives/dynamic-form-group.directive.ts","../../src/ngx-dynamic-form/ngx-dynamic-form.module.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","__","this","constructor","create","__read","o","n","m","Symbol","iterator","r","e","i","ar","next","done","push","value","error","__spread","arguments","length","concat","FORM_GROUP_TYPE","InjectionToken","FORM_CONTROL_PROVIDER","FormControlComponent","defineProperty","control","form","data","meta","createValidator","validators","validator","filter","ObjectUtils","isDefined","map","v","ReflectUtils","resolve","injector","ctrl","Promise","shouldValidate","then","should","validate","metaValidator","isFunction","all","results","isObject","isString","result","forEach","assign","Directive","HostBinding","args","DynamicFormControlHelper","formId","UniqueUtils","uuid","hidden","dummyData","readonlyTester","createTester","hideTester","serializeTester","visible","validateTester","id","type","ctrlProvider","load","loader","check","_this","hide","readonly","shouldSerialize","findProvider","test","defaultFunc","tester","DynamicFormGroup","_super","updateOn","mName","mModel","mControls","mSerializers","mFieldSets","helper","initialized","loading","changeTimer","TimerUtils","createTimeout","statusChanges","subscribe","root","onStatusChange","emit","setAsyncValidators","label","prefix","provider","name","status","createFormControls","group","controls","model","keys","getFormControl","subGroup","getData","setup","addControl","DynamicFormControl","createFormSerializers","serializers","props","reduce","serializer","getFormSerializer","defaultSerializer","func","getControl","get","promises","c","disable","emitEvent","enable","serialize","s","res","onFocus","markAsUntouched","onlySelf","onBlur","markAsTouched","showErrors","reloadControls","callback","onInit","statusTimer","createInterval","set","clear","setTimeout","promise","info","removeControl","fieldSets","fs","getFormFieldSets","getPrototypeOf","updateModel","reloadControlsFrom","Set","onChange","reload","isArray","nextControl","has","add","FormGroup","valueChanges","disabled","FormControl","emptyArray","emptyTester","parent","provideFormGroup","component","provide","useValue","provideFormControl","acceptor","priority","multi","defineFormControl","target","propertyKey","defineMetadata","getMetadata","createFormControl","isNullOrUndefined","labelAlign","fieldSet","classes","createFormInput","placeholder","step","mask","createFormSelect","options","classType","createFormStatic","style","createFormModel","createFormFile","accept","baseUrl","uploadUrl","createUploadData","file","FormData","append","DynamicFormService","components","groupType","resolver","providers","Error","JSON","stringify","sort","a","compare","createComponent","vcr","factory","resolveComponentFactory","instance","createGroup","Injectable","Inject","Type","decorators","ComponentFactoryResolver","Injector","FormUtilities","checkField","expression","evaluate","checkReadonly","validateJSON","parse","validateRequired","isNumber","validateMinLength","error.min-length","validateMaxLength","error.max-length","validateRequiredTranslation","findIndex","t","lang","translation","validateEmail","validatePhone","serializeLogo","serializeFile","isBlob","startsWith","FileUtils","dataToBlob","serializeNumber","parseFloat","serializeJSON","serializeDate","date","format","defaultValue","isDate","transform","key","desc","getOwnPropertyDescriptor","Reflect","decorate","__decorate","FactoryDependencies","DatePipe","OpenApiService","api","url","replace","schemas","schemasPromise","client","definitions","getFormInputsForSchema","cache","schema","getFormInputsForSchemaDef","inputs","properties","property","getFormControlForProperty","enum","getFormSelectData","getFormInputData","getFormFileData","getBaseFormData","getValidators","StringUtils","endpoint","list","makeListParams","items","_id","required","indexOf","minLength","params","maxLength","ApiService","AsyncSubmitDirective","toaster","cdr","elem","renderer","onSuccess","EventEmitter","onError","nativeElement","tagName","setAttribute","ngOnInit","detectChanges","onSubmit","callMethod","ngOnDestroy","unsubscribe","click","method","success","message","context","reason","selector","exportAs","TOASTER_SERVICE","ChangeDetectorRef","ElementRef","Renderer2","Input","Output","HostListener","DynamicFormControlDirective","forms","comp","ngOnChanges","changes","ViewContainerRef","template","TemplateRef","DynamicFormBaseComponent","formService","controlTemplates","labelTemplates","inputTemplates","prefixTemplates","suffixTemplates","ngAfterContentInit","wrapperTemplate","cWrapperTemplate","fieldSetTemplate","cFieldSetTemplate","controlTemplate","cControlTemplate","filterTemplates","setPrefixTemplates","setSuffixTemplates","templates","directive","ContentChild","ContentChildren","DynamicFormTemplateDirective","DynamicFormComponent","defaultFieldSet","title","state","formControls","formGroup","onFormSubmit","reject","pipe","first","updateValueAndValidity","Component","moduleId","module","useExisting","statusPriority","DynamicFormsComponent","formPrefixTemplates","formSuffixTemplates","innerFormPrefixTemplates","innerFormSuffixTemplates","this_1","checkForms","f","containerTemplate","cContainerTemplate","configs","createFormGroups","ix","config","path","split","mapToPath","getFromValue","find","controlData","ViewChildren","DynamicFormGroupComponent","errors","touched","join","DynamicFormFileComponent","fileImageCache","onSelect","input","processFiles","files","fileList","types","toLowerCase","item","ext","getExtension","ArrayUtils","upload","single","Math","min","asDataUrl","readFileAsDataURL","asFile","console","log","uploadOptions","asset","assets","setValue","current","delete","index","from","splice","getUrl","image","getImgUrl","URL","createObjectURL","imageUrl","subUrl","substr","DynamicFormInputComponent","language","onDateChange","Date","dateValue","valueOf","isNaN","onMaskChange","unmask","onTextChange","useLanguage","translations","editLanguage","onNumberBlur","max","LANGUAGE_SERVICE","DynamicFormSelectComponent","getOptions","emptyOption","unshift","fillOptions","selected","onSelectChange","option","checkValue","findOption","DynamicFormStaticComponent","DynamicFormModelComponent","ViewChild","DynamicFormGroupDirective","directives","pipes","NgxDynamicFormModule","forRoot","controlProviders","groupProvider","ngModule","NgModule","declarations","imports","CommonModule","FormsModule","ReactiveFormsModule","TextMaskModule","NgxUtilsModule","exports","entryComponents","sets","getOwnMetadata","inputType"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { ChangeDetectorRef, EventEmitter, HostBinding, InjectionToken, Injector, TemplateRef, Type, ValueProvider, Directive } from \"@angular/core\";\r\nimport {AbstractControl, FormControl, FormGroup, ValidationErrors} from \"@angular/forms\";\r\nimport {\r\n IResolveFactory,\r\n ITimer,\r\n IAsyncMessage,\r\n ObjectUtils,\r\n ReflectUtils,\r\n TimerUtils,\r\n UniqueUtils,\r\n IRequestOptions\r\n} from \"@stemy/ngx-utils\";\r\n\r\nexport const FORM_GROUP_TYPE: InjectionToken<Type<IFormControlComponent>> = new InjectionToken<Type<IFormControlComponent>>(\"form-group-provider\");\r\nexport const FORM_CONTROL_PROVIDER: InjectionToken<IFormControlProvider> = new InjectionToken<IFormControlProvider>(\"form-control-provider\");\r\n\r\n// --- Basic form control interfaces ---\r\nexport interface IFormControlComponent {\r\n control: IDynamicFormControl;\r\n}\r\n\r\nexport interface IFormGroupComponent {\r\n form: IDynamicForm;\r\n control: IDynamicFormControl;\r\n}\r\n\r\n@Directive()\r\nexport abstract class FormControlComponent<T extends IFormControlData> implements IFormControlComponent {\r\n\r\n control: IDynamicFormControl;\r\n\r\n get form(): IDynamicFormBase {\r\n return !this.control ? null: this.control.form;\r\n }\r\n\r\n get data(): T {\r\n return <T>(!this.control ? {} : this.control.data);\r\n }\r\n\r\n get value(): any {\r\n return !this.control ? null : this.control.value;\r\n }\r\n\r\n get meta(): any {\r\n return !this.control ? null : this.control.meta;\r\n }\r\n\r\n @HostBinding(\"class.form-input\")\r\n get inputClass(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport type IFormControlProviderAcceptor = (control: IDynamicFormControl) => boolean;\r\nexport type IFormControlProviderLoader = (control: IDynamicFormControl) => Promise<any>;\r\nexport type IFormControlOptions = (control: IDynamicFormControl) => Promise<IFormControlOption[]>;\r\nexport type IFormControlSerializer = (id: string, parent: IDynamicFormControl) => Promise<any>;\r\nexport type IFormInputMask = string | RegExp;\r\nexport type IFormInputMaskFunction = (raw: string) => IFormInputMask[];\r\nexport type IFormInputUnMaskFunction = (value: string) => any;\r\n\r\nexport interface IFormControlProvider {\r\n component: Type<IFormControlComponent>;\r\n priority: number;\r\n acceptor: IFormControlProviderAcceptor;\r\n loader: IFormControlProviderLoader;\r\n}\r\n\r\nexport interface IFormSerializer {\r\n id: string;\r\n func: IFormControlSerializer;\r\n}\r\n\r\nexport interface IFormSerializers {\r\n [id: string]: IFormControlSerializer | IResolveFactory | null\r\n}\r\n\r\nexport type DynamicFormState = \"VALID\" | \"INVALID\" | \"PENDING\" | \"DISABLED\" | \"LOADING\";\r\nexport type DynamicFormUpdateOn = \"change\" | \"blur\" | \"submit\";\r\n\r\nexport interface IDynamicFormControl {\r\n id: string;\r\n type: string;\r\n data: IFormControlData;\r\n visible: boolean;\r\n meta: any;\r\n form: IDynamicFormBase;\r\n injector: Injector;\r\n label: string;\r\n provider: IFormControlProvider;\r\n model: any;\r\n formId: string;\r\n\r\n errors: ValidationErrors;\r\n value: any;\r\n touched: boolean;\r\n disabled: boolean;\r\n updateOn: DynamicFormUpdateOn;\r\n\r\n setValue(value: any): void;\r\n\r\n getData<T extends IFormControlData>(): T;\r\n getControl(id: string): IDynamicFormControl;\r\n load(): Promise<any>;\r\n check(): Promise<any>;\r\n shouldSerialize(): Promise<boolean>;\r\n shouldValidate(): Promise<boolean>;\r\n serialize(): Promise<any>;\r\n onFocus(): void;\r\n onBlur(): void;\r\n showErrors(): void;\r\n}\r\n\r\nfunction createValidator(control: IDynamicFormControl): (control: AbstractControl) => Promise<ValidationErrors> {\r\n const data = control.data || {};\r\n const validators = [data.validator].concat(data.validators || []).filter(ObjectUtils.isDefined).map(v => {\r\n return ReflectUtils.resolve<FormControlValidator>(v, control.injector);\r\n });\r\n return (ctrl: any) => new Promise<ValidationErrors>((resolve) => {\r\n const control = <IDynamicFormControl>ctrl;\r\n control.shouldValidate().then(should => {\r\n if (!should) {\r\n resolve(null);\r\n return;\r\n }\r\n const validate = validators.map(v => v(control));\r\n const metaValidator = control.meta.validator;\r\n if (ObjectUtils.isFunction(metaValidator)) {\r\n validate.push(metaValidator(control));\r\n }\r\n Promise.all(validate).then(results => {\r\n results = results.filter(error => ObjectUtils.isObject(error) || ObjectUtils.isString(error));\r\n let result: ValidationErrors = null;\r\n if (results.length > 0) {\r\n result = {};\r\n results.forEach(error => {\r\n if (ObjectUtils.isString(error)) {\r\n result[error] = {};\r\n return;\r\n }\r\n result = Object.assign(result, error);\r\n });\r\n }\r\n resolve(result);\r\n });\r\n });\r\n });\r\n}\r\n\r\nclass DynamicFormControlHelper {\r\n\r\n get id(): string {\r\n return !this.control ? null : this.control.id;\r\n }\r\n\r\n get type(): string {\r\n return !this.control ? \"\" : this.control.type;\r\n }\r\n\r\n get data(): IFormControlData {\r\n return !this.control ? this.dummyData : this.control.data || this.dummyData;\r\n }\r\n\r\n get visible(): boolean {\r\n return !this.hidden;\r\n }\r\n\r\n get provider(): IFormControlProvider {\r\n return this.ctrlProvider;\r\n }\r\n\r\n public readonly formId: string;\r\n public readonly meta: any;\r\n\r\n private hidden: boolean;\r\n private ctrlProvider: IFormControlProvider;\r\n private readonly dummyData: IFormControlData;\r\n private readonly readonlyTester: (control: IDynamicFormControl) => Promise<boolean>;\r\n private readonly hideTester: (control: IDynamicFormControl) => Promise<boolean>;\r\n private readonly serializeTester: (control: IDynamicFormControl) => Promise<boolean>;\r\n private readonly validateTester: (control: IDynamicFormControl) => Promise<boolean>;\r\n\r\n constructor(private form: IDynamicFormBase, private control: IFormControl = null) {\r\n this.formId = UniqueUtils.uuid();\r\n this.meta = {};\r\n this.hidden = false;\r\n this.dummyData = {};\r\n this.readonlyTester = this.createTester(\"readonly\");\r\n this.hideTester = this.createTester(\"hidden\");\r\n this.serializeTester = this.createTester(\"shouldSerialize\", (control: IDynamicFormControl) => {\r\n return Promise.resolve(control.visible);\r\n });\r\n this.validateTester = this.createTester(\"shouldValidate\", (control: IDynamicFormControl) => {\r\n return Promise.resolve(control.visible);\r\n });\r\n }\r\n\r\n load(control: IDynamicFormControl): Promise<any> {\r\n return !this.ctrlProvider ? Promise.resolve() : this.ctrlProvider.loader(control);\r\n }\r\n\r\n check(control: IDynamicFormControl): Promise<boolean> {\r\n return new Promise<any>(resolve => {\r\n this.hideTester(control).then(hide => {\r\n this.hidden = hide;\r\n this.readonlyTester(control).then(readonly => {\r\n resolve(control.form.readonly || readonly);\r\n });\r\n });\r\n });\r\n }\r\n\r\n shouldSerialize(control: IDynamicFormControl): Promise<boolean> {\r\n return this.serializeTester(control);\r\n }\r\n\r\n shouldValidate(control: IDynamicFormControl): Promise<boolean> {\r\n return this.validateTester(control);\r\n }\r\n\r\n findProvider(control: IDynamicFormControl): void {\r\n this.ctrlProvider = !this.control || !this.control.type ? null : this.form.findProvider(control);\r\n }\r\n\r\n private createTester(test: string, defaultFunc: FormControlTester = null): (control: IDynamicFormControl) => Promise<boolean> {\r\n const tester: FormControlTester = this.data[test]\r\n ? ReflectUtils.resolve<FormControlTester>(this.data[test], this.form.injector)\r\n : (defaultFunc || (() => Promise.resolve(false)));\r\n return (control: IDynamicFormControl): Promise<boolean> => tester(control);\r\n }\r\n}\r\n\r\nexport class DynamicFormGroup extends FormGroup implements IDynamicFormControl {\r\n\r\n get id(): string {\r\n return this.helper.id;\r\n }\r\n\r\n get type(): string {\r\n return this.helper.type;\r\n }\r\n\r\n get data(): IFormControlData {\r\n return this.helper.data;\r\n }\r\n\r\n get visible(): boolean {\r\n return this.helper.visible;\r\n }\r\n\r\n get meta(): any {\r\n return this.helper.meta;\r\n }\r\n\r\n get injector(): Injector {\r\n return this.form.injector;\r\n }\r\n\r\n get label(): string {\r\n return this.data.label !== \"\" ? `${this.prefix}${this.data.label}` : \"\";\r\n }\r\n\r\n get provider(): IFormControlProvider {\r\n return this.helper.provider;\r\n }\r\n\r\n get model(): any {\r\n return this.mModel;\r\n }\r\n\r\n get formId(): string {\r\n return this.helper.formId;\r\n }\r\n\r\n get formControls(): IDynamicFormControl[] {\r\n return this.mControls || [];\r\n }\r\n\r\n get formFields(): IDynamicFormFieldSets {\r\n return this.mFieldSets || {};\r\n }\r\n\r\n get prefix(): string {\r\n return !this.name ? \"\" : `${this.name}.`;\r\n }\r\n\r\n get name(): string {\r\n return this.mName;\r\n }\r\n\r\n get state(): DynamicFormState {\r\n return <DynamicFormState>(this.loading ? \"LOADING\" : this.status);\r\n }\r\n\r\n private helper: DynamicFormControlHelper;\r\n private mName: string;\r\n private mModel: any;\r\n private mControls: IDynamicFormControl[];\r\n private mSerializers: IFormSerializer[];\r\n private mFieldSets: IDynamicFormFieldSets;\r\n private initialized: boolean;\r\n private loading: boolean;\r\n private changeTimer: ITimer;\r\n\r\n private static createFormControls(group: DynamicFormGroup, controls: IFormControl[]): IDynamicFormControl[] {\r\n if (!controls && ObjectUtils.isObject(group.model)) {\r\n const props = Object.keys(group.model);\r\n controls = props.map(id => {\r\n return getFormControl(group.model, id);\r\n }).filter(ObjectUtils.isDefined);\r\n }\r\n if (!controls) return [];\r\n return controls.map(ctrl => {\r\n if (ctrl.type == \"model\") {\r\n const subGroup = new DynamicFormGroup(group.form, ctrl);\r\n const model = group.model[ctrl.id] || {};\r\n const data = subGroup.getData<IFormModelData>();\r\n data.name = data.name || group.name;\r\n subGroup.setup(model, data);\r\n group.model[ctrl.id] = model;\r\n group.addControl(subGroup.id, subGroup);\r\n return subGroup;\r\n }\r\n return new DynamicFormControl(ctrl, group);\r\n });\r\n }\r\n\r\n private static createFormSerializers(group: DynamicFormGroup, serializers: IFormSerializers): IFormSerializer[] {\r\n if (!serializers && ObjectUtils.isObject(group.model)) {\r\n const props = Object.keys(group.model);\r\n serializers = props.reduce((result, id) => {\r\n const serializer = getFormSerializer(group.model, id);\r\n if (!serializer) return result;\r\n result[id] = serializer;\r\n return result;\r\n }, {});\r\n }\r\n if (!serializers) return [];\r\n return Object.keys(serializers).map(id => {\r\n const serializer = serializers[id] || defaultSerializer;\r\n return !serializer ? null : {\r\n id: id,\r\n func: ReflectUtils.resolve<IFormControlSerializer>(serializer, group.injector)\r\n };\r\n });\r\n }\r\n\r\n constructor(public readonly form: IDynamicFormBase, control: IFormControl = null) {\r\n super({}, {updateOn: ((!control || !control.data) ? null : control.data.updateOn) || form.updateOn || \"blur\"});\r\n this.mName = \"\";\r\n this.mModel = {};\r\n this.mControls = [];\r\n this.mSerializers = [];\r\n this.mFieldSets = {};\r\n this.helper = new DynamicFormControlHelper(form, control);\r\n this.helper.findProvider(this);\r\n this.initialized = false;\r\n this.loading = false;\r\n this.changeTimer = TimerUtils.createTimeout();\r\n this.statusChanges.subscribe(() => {\r\n const root = this.form.root;\r\n root.onStatusChange.emit(root);\r\n });\r\n this.setAsyncValidators(createValidator(this));\r\n }\r\n\r\n getData<T extends IFormControlData>(): T {\r\n return <T>this.data;\r\n }\r\n\r\n getControl(id: string): IDynamicFormControl {\r\n return <any>this.get(id);\r\n }\r\n\r\n load(): Promise<any> {\r\n const promises = this.mControls.map(c => c.load());\r\n promises.push(this.helper.load(this));\r\n return Promise.all(promises);\r\n }\r\n\r\n check(): Promise<any> {\r\n return new Promise<any>(resolve => {\r\n this.helper.check(this).then(readonly => {\r\n if (readonly) this.disable({emitEvent: false}); else this.enable({emitEvent: false});\r\n const promises = this.mControls.map(c => c.check());\r\n Promise.all(promises).then(resolve);\r\n })\r\n });\r\n }\r\n\r\n shouldSerialize(): Promise<boolean> {\r\n return this.helper.shouldSerialize(this);\r\n }\r\n\r\n shouldValidate(): Promise<boolean> {\r\n return this.helper.shouldValidate(this);\r\n }\r\n\r\n serialize(): Promise<any> {\r\n return new Promise<any>((resolve) => {\r\n const result = {};\r\n const serializers = this.mSerializers.map(s => {\r\n return new Promise<any>(resolve => {\r\n s.func(s.id, this).then(res => {\r\n const ctrl = this.getControl(s.id);\r\n const promise = !ctrl ? Promise.resolve(true) : ctrl.shouldSerialize();\r\n promise.then(should => {\r\n if (should) result[s.id] = res;\r\n resolve();\r\n });\r\n });\r\n });\r\n });\r\n Promise.all(serializers).then(() => resolve(result));\r\n });\r\n }\r\n\r\n onFocus(): void {\r\n this.markAsUntouched({onlySelf: true});\r\n }\r\n\r\n onBlur(): void {\r\n this.markAsTouched({onlySelf: true});\r\n }\r\n\r\n showErrors(): void {\r\n this.markAsTouched({onlySelf: true});\r\n this.mControls.forEach(ctrl => ctrl.showErrors());\r\n }\r\n\r\n reloadControls(): Promise<any> {\r\n let callback = () => {};\r\n if (this.initialized === false) {\r\n this.initialized = true;\r\n this.loading = true;\r\n callback = () => {\r\n this.loading = false;\r\n // this.cdr.detectChanges();\r\n const root = this.form.root;\r\n root.onInit.emit(root);\r\n root.onStatusChange.emit(root);\r\n // https://github.com/angular/angular/issues/14542\r\n const statusTimer = TimerUtils.createInterval();\r\n statusTimer.set(() => {\r\n if (this.status == \"PENDING\") return;\r\n statusTimer.clear();\r\n root.onStatusChange.emit(root);\r\n }, 50);\r\n setTimeout(statusTimer.clear, 5000);\r\n };\r\n }\r\n const promise = new Promise<any>(resolve => {\r\n this.load().then(() => this.check().then(resolve));\r\n });\r\n promise.then(callback, callback);\r\n return promise;\r\n }\r\n\r\n setup(model: any, info: IDynamicFormInfo): void {\r\n this.mName = info.name || \"\";\r\n this.mModel = model;\r\n this.mControls.forEach(ctrl => this.removeControl(ctrl.id));\r\n this.mControls = DynamicFormGroup.createFormControls(this, info.controls);\r\n this.mControls.forEach((ctrl: any) => this.addControl(ctrl.id, ctrl));\r\n this.mSerializers = DynamicFormGroup.createFormSerializers(this, info.serializers);\r\n this.mFieldSets = info.fieldSets ? info.fieldSets.reduce((result, fs) => {\r\n result[fs.id] = fs;\r\n return result;\r\n }, {}) : getFormFieldSets(Object.getPrototypeOf(model).constructor);\r\n }\r\n\r\n updateModel(control: IDynamicFormControl): void {\r\n this.model[control.id] = control.value;\r\n this.changeTimer.clear();\r\n this.changeTimer.set(() => {\r\n this.check().then(() => this.reloadControlsFrom(control, new Set<IDynamicFormControl>()).then(() => {\r\n this.form.root.onChange.emit(control);\r\n }));\r\n }, 250);\r\n }\r\n\r\n private reloadControlsFrom(control: IDynamicFormControl, controls?: Set<IDynamicFormControl>): Promise<any> {\r\n const data = control.data;\r\n if (!data || !data.reload) return Promise.resolve();\r\n const reload = ObjectUtils.isArray(data.reload) ? data.reload : [data.reload];\r\n return Promise.all(reload.map(id => {\r\n const nextControl = this.getControl(id);\r\n if (!nextControl || controls.has(nextControl)) return Promise.resolve();\r\n controls.add(nextControl);\r\n return new Promise<any>(resolve => {\r\n nextControl.load().then(() => {\r\n this.reloadControlsFrom(nextControl, controls).then(resolve);\r\n });\r\n })\r\n }))\r\n }\r\n}\r\n\r\nexport class DynamicFormControl extends FormControl implements IDynamicFormControl {\r\n\r\n get id(): string {\r\n return this.helper.id;\r\n }\r\n\r\n get type(): string {\r\n return this.helper.type;\r\n }\r\n\r\n get data(): IFormControlData {\r\n return this.helper.data;\r\n }\r\n\r\n get visible(): boolean {\r\n return this.helper.visible;\r\n }\r\n\r\n get meta(): any {\r\n return this.helper.meta;\r\n }\r\n\r\n get form(): IDynamicFormBase {\r\n return this.group.form;\r\n }\r\n\r\n get injector(): Injector {\r\n return this.form.injector;\r\n }\r\n\r\n get label(): string {\r\n return this.data.label !== \"\" ? `${this.group.prefix}${this.data.label}` : \"\";\r\n }\r\n\r\n get provider(): IFormControlProvider {\r\n return this.helper.provider;\r\n }\r\n\r\n get model(): any {\r\n return this.group.model;\r\n }\r\n\r\n get formId(): string {\r\n return this.helper.formId;\r\n }\r\n\r\n private helper: DynamicFormControlHelper;\r\n\r\n constructor(private control: IFormControl, public readonly group: DynamicFormGroup) {\r\n super(group.model[control.id], {updateOn: control.data.updateOn || group.updateOn});\r\n this.group.addControl(control.id, this);\r\n this.helper = new DynamicFormControlHelper(this.form, control);\r\n this.helper.findProvider(this);\r\n this.valueChanges.subscribe(() => this.group.updateModel(this));\r\n this.setAsyncValidators(createValidator(this));\r\n }\r\n\r\n getData<T extends IFormControlData>(): T {\r\n return <T>this.data;\r\n }\r\n\r\n getControl(id: string): IDynamicFormControl {\r\n return null;\r\n }\r\n\r\n load(): Promise<any> {\r\n return this.helper.load(this);\r\n }\r\n\r\n check(): Promise<any> {\r\n const check = this.helper.check(this);\r\n check.then(readonly => {\r\n if (readonly || this.group.disabled) this.disable({emitEvent: false}); else this.enable({emitEvent: false});\r\n });\r\n return check;\r\n }\r\n\r\n shouldSerialize(): Promise<boolean> {\r\n return this.helper.shouldSerialize(this);\r\n }\r\n\r\n shouldValidate(): Promise<boolean> {\r\n return this.helper.shouldValidate(this);\r\n }\r\n\r\n serialize(): Promise<any> {\r\n return Promise.resolve(this.value);\r\n }\r\n\r\n onFocus(): void {\r\n this.markAsUntouched({onlySelf: true});\r\n }\r\n\r\n onBlur(): void {\r\n this.markAsTouched({onlySelf: true});\r\n }\r\n\r\n showErrors(): void {\r\n this.markAsTouched({onlySelf: true});\r\n }\r\n}\r\n\r\nexport interface IFormControl {\r\n id: string;\r\n type: string;\r\n visible?: boolean;\r\n data?: IFormControlData;\r\n}\r\n\r\nexport interface IFormControlData {\r\n label?: string;\r\n labelAlign?: string;\r\n fieldSet?: string;\r\n classes?: string;\r\n readonly?: FormControlTesterFactory;\r\n hidden?: FormControlTesterFactory;\r\n shouldSerialize?: FormControlTesterFactory;\r\n shouldValidate?: FormControlTesterFactory;\r\n validator?: FormControlValidatorFactory;\r\n validators?: FormControlValidatorFactory[];\r\n updateOn?: DynamicFormUpdateOn;\r\n reload?: string | string[];\r\n}\r\n\r\nexport interface IFormInputData extends IFormControlData {\r\n type?: string;\r\n autocomplete?: string;\r\n placeholder?: string;\r\n useLanguage?: boolean;\r\n mask?: IFormInputMaskFunction | IFormInputMask[];\r\n unmask?: IFormInputUnMaskFunction;\r\n step?: number;\r\n min?: number;\r\n max?: number;\r\n}\r\n\r\nexport interface IFormSelectData extends IFormControlData {\r\n options?: IFormControlOptions | IResolveFactory;\r\n emptyOption?: boolean;\r\n type?: string;\r\n multi?: boolean;\r\n}\r\n\r\nexport interface IFormStaticData extends IFormControlData {\r\n properties?: string[];\r\n style?: string;\r\n}\r\n\r\nexport interface IFormFileData extends IFormControlData {\r\n accept?: string;\r\n multi?: boolean;\r\n baseUrl?: string;\r\n asFile?: boolean;\r\n asDataUrl?: boolean;\r\n uploadUrl?: string;\r\n uploadOptions?: IRequestOptions;\r\n createUploadData?: (file: File) => any;\r\n}\r\n\r\nexport interface IFormModelData extends IFormControlData, IDynamicFormInfo {\r\n\r\n}\r\n\r\nexport interface IFormFieldSet {\r\n id: string;\r\n classes?: string;\r\n title?: string;\r\n titleClasses?: string;\r\n setClasses?: string;\r\n controlClasses?: string;\r\n}\r\n\r\nexport interface IFormControlOption {\r\n id: any;\r\n label: string;\r\n selectable?: boolean;\r\n}\r\n\r\n// --- Basic form interfaces ---\r\n\r\nexport interface IDynamicFormTemplates {\r\n [id: string]: TemplateRef<any>;\r\n}\r\n\r\nexport interface IDynamicFormConfig {\r\n path?: string | number | Array<string | number>;\r\n name?: string;\r\n classes?: string;\r\n formClasses?: string;\r\n innerFormClasses?: string;\r\n id: string;\r\n}\r\n\r\nexport interface IDynamicSingleFormConfig extends IDynamicFormConfig, IDynamicFormInfo {\r\n data: any;\r\n controlData?: IFormControlData;\r\n multi?: false;\r\n}\r\n\r\nexport interface IDynamicMultiFormConfig extends IDynamicFormConfig {\r\n data: IDynamicFormsConfigs;\r\n multi: true;\r\n}\r\n\r\nexport type IDynamicFormsConfigs = Array<IDynamicSingleFormConfig | IDynamicMultiFormConfig>;\r\n\r\nexport interface IDynamicFormBase {\r\n\r\n name?: string;\r\n readonly?: boolean;\r\n updateOn?: \"change\" | \"blur\" | \"submit\";\r\n classes: string;\r\n parent: IDynamicFormBase;\r\n\r\n wrapperTemplate: TemplateRef<any>;\r\n fieldSetTemplate: TemplateRef<any>;\r\n controlTemplate: TemplateRef<any>;\r\n\r\n controlTemplates: IDynamicFormTemplates;\r\n labelTemplates: IDynamicFormTemplates;\r\n inputTemplates: IDynamicFormTemplates;\r\n prefixTemplates: IDynamicFormTemplates;\r\n suffixTemplates: IDynamicFormTemplates;\r\n setPrefixTemplates: IDynamicFormTemplates;\r\n setSuffixTemplates: IDynamicFormTemplates;\r\n\r\n onChange: EventEmitter<IDynamicFormControl>;\r\n onStatusChange: EventEmitter<IDynamicFormBase>;\r\n onInit: EventEmitter<IDynamicFormBase>;\r\n onSubmit: EventEmitter<IDynamicFormBase>;\r\n\r\n root?: IDynamicFormBase;\r\n status: DynamicFormState;\r\n injector?: Injector;\r\n cdr?: ChangeDetectorRef;\r\n\r\n validate(showErrors?: boolean): Promise<any>;\r\n\r\n serialize(validate?: boolean): Promise<any>;\r\n\r\n check(): Promise<any>;\r\n\r\n getControl(id: string): IDynamicFormControl;\r\n\r\n findProvider(control: IDynamicFormControl): IFormControlProvider;\r\n}\r\n\r\nexport declare type AsyncSubmitMethod = (form: IDynamicFormBase) => Promise<IAsyncMessage>;\r\n\r\nexport interface IDynamicFormInfo {\r\n group?: DynamicFormGroup;\r\n name?: string;\r\n controls?: IFormControl[];\r\n serializers?: IFormSerializers;\r\n fieldSets?: IFormFieldSet[];\r\n}\r\n\r\nexport interface IDynamicForm extends IDynamicFormBase, IDynamicFormInfo {\r\n data: any;\r\n}\r\n\r\nexport interface IDynamicFormFieldSets {\r\n [id: string]: IFormFieldSet\r\n}\r\n\r\n// --- Basic form types ---\r\nexport type FormControlTester = (control: IDynamicFormControl) => Promise<boolean>;\r\nexport type FormControlTesterFactory = FormControlTester | IResolveFactory;\r\nexport type FormControlValidator = (control: IDynamicFormControl) => Promise<string | ValidationErrors>;\r\nexport type FormControlValidatorFactory = FormControlValidator | IResolveFactory;\r\n\r\n// --- Decorator functions ---\r\nconst emptyArray: any = [];\r\nconst emptyTester: FormControlTester = () => {\r\n return Promise.resolve(false);\r\n};\r\n\r\nexport function defaultSerializer(id: string, parent: IDynamicFormControl): Promise<any> {\r\n const control = parent.getControl(id);\r\n return !control ? Promise.resolve(parent.model[id]) : control.serialize();\r\n}\r\n\r\nexport function FormSerializable(serializer?: IFormControlSerializer | IResolveFactory): PropertyDecorator {\r\n return (target: any, propertyKey: string): void => {\r\n ReflectUtils.defineMetadata(\"dynamicFormSerializer\", serializer || defaultSerializer, target, propertyKey);\r\n };\r\n}\r\n\r\nexport function FormInput(data?: IFormInputData): PropertyDecorator {\r\n return (target: any, propertyKey: string): void => {\r\n const meta = ReflectUtils.getOwnMetadata(\"design:type\", target, propertyKey);\r\n const type = meta ? meta.name : \"\";\r\n let inputType = propertyKey.indexOf(\"password\") < 0 ? \"text\" : \"password\";\r\n switch (type) {\r\n case \"Number\":\r\n inputType = \"number\";\r\n break;\r\n case \"Boolean\":\r\n inputType = \"checkbox\";\r\n break;\r\n }\r\n defineFormControl(target, propertyKey, createFormInput(propertyKey, data, inputType));\r\n };\r\n}\r\n\r\nexport function FormSelect(data?: IFormSelectData): PropertyDecorator {\r\n return (target: any, propertyKey: string): void => {\r\n defineFormControl(target, propertyKey, createFormSelect(propertyKey, data));\r\n };\r\n}\r\n\r\nexport function FormStatic(data?: IFormStaticData): PropertyDecorator {\r\n return (target: any, propertyKey: string): void => {\r\n defineFormControl(target, propertyKey, createFormStatic(propertyKey, data));\r\n };\r\n}\r\n\r\nexport function FormModel(data?: IFormModelData): PropertyDecorator {\r\n return (target: any, propertyKey: string): void => {\r\n defineFormControl(target, propertyKey, createFormModel(propertyKey, data));\r\n };\r\n}\r\n\r\nexport function FormFile(data?: IFormFileData): PropertyDecorator {\r\n return (target: any, propertyKey: string): void => {\r\n defineFormControl(target, propertyKey, createFormFile(propertyKey, data));\r\n };\r\n}\r\n\r\nexport function FormFieldSet(data: IFormFieldSet): ClassDecorator {\r\n return (target: any): void => {\r\n const sets = getFormFieldSets(target);\r\n data.classes = data.classes || \"\";\r\n sets[data.id] = data;\r\n ReflectUtils.defineMetadata(\"dynamicFormFieldSets\", sets, target);\r\n };\r\n}\r\n\r\nexport interface FormGroupProvider extends ValueProvider {\r\n provide: InjectionToken<Type<IFormGroupComponent>>;\r\n multi?: boolean;\r\n useValue: Type<IFormGroupComponent>;\r\n}\r\n\r\nexport function provideFormGroup(component: Type<IFormGroupComponent>): FormGroupProvider {\r\n return {\r\n provide: FORM_GROUP_TYPE,\r\n useValue: component\r\n };\r\n}\r\n\r\nexport interface FormControlProvider {\r\n provide: InjectionToken<IFormControlProvider>;\r\n multi?: boolean;\r\n useValue: IFormControlProvider;\r\n}\r\n\r\nexport function provideFormControl(component: Type<IFormControlComponent>, acceptor: IFormControlProviderAcceptor, loader: IFormControlProviderLoader, priority: number = 0): FormControlProvider {\r\n return {\r\n provide: FORM_CONTROL_PROVIDER,\r\n multi: true,\r\n useValue: {\r\n component: component,\r\n priority: priority,\r\n acceptor: acceptor,\r\n loader: loader\r\n }\r\n };\r\n}\r\n\r\nexport function defineFormControl(target: any, propertyKey: string, control: IFormControl): void {\r\n ReflectUtils.defineMetadata(\"dynamicFormControl\", control, target, propertyKey);\r\n}\r\n\r\nexport function getFormFieldSets(target: any): IDynamicFormFieldSets {\r\n return ReflectUtils.getMetadata(\"dynamicFormFieldSets\", target) || {};\r\n}\r\n\r\nexport function getFormControl(target: any, propertyKey: string): IFormControl {\r\n return ReflectUtils.getMetadata(\"dynamicFormControl\", target, propertyKey);\r\n}\r\n\r\nexport function getFormSerializer(target: any, propertyKey: string): IFormControlSerializer | IResolveFactory {\r\n return ReflectUtils.getMetadata(\"dynamicFormSerializer\", target, propertyKey);\r\n}\r\n\r\nexport function createFormControl(id: string, type: string, data?: IFormControlData): IFormControl {\r\n data = data || {};\r\n data.label = ObjectUtils.isNullOrUndefined(data.label) ? id : data.label;\r\n data.labelAlign = data.labelAlign || \"left\";\r\n data.fieldSet = data.fieldSet || UniqueUtils.uuid();\r\n data.classes = data.classes || \"\";\r\n data.readonly = data.readonly || emptyTester;\r\n data.hidden = data.hidden || emptyTester;\r\n data.validators = data.validators || emptyArray;\r\n return {\r\n id: id,\r\n type: type,\r\n data: data\r\n };\r\n}\r\n\r\nexport function createFormInput(id: string, data: IFormInputData, type: string = \"text\"): IFormControl {\r\n const control = createFormControl(id, \"input\", data);\r\n data = control.data;\r\n data.type = data.type || type;\r\n data.classes = !data.classes ? `form-group-${data.type}` : `${data.classes} form-group-${data.type}`;\r\n data.placeholder = data.placeholder || (data.type == \"mask\" ? \"_\" : \"\");\r\n data.step = data.step || 1;\r\n data.mask = data.mask || [/\\w*/gi];\r\n return control;\r\n}\r\n\r\nexport function createFormSelect(id: string, data: IFormSelectData): IFormControl {\r\n const control = createFormControl(id, \"select\", data);\r\n data = control.data;\r\n data.options = data.options || (() => Promise.resolve([]));\r\n data.type = data.type || \"select\";\r\n const classType = data.type == \"select\" ? \"select\" : `select-${data.type}`;\r\n data.classes = !data.classes ? `form-group-${classType}` : `${data.classes} form-group-${classType}`;\r\n return control;\r\n}\r\n\r\nexport function createFormStatic(id: string, data: IFormStaticData): IFormControl {\r\n const control = createFormControl(id, \"static\", data);\r\n data = control.data;\r\n data.style = data.style || \"table\";\r\n return control;\r\n}\r\n\r\nexport function createFormModel(id: string, data: IFormModelData): IFormControl {\r\n const control = createFormControl(id, \"model\", data);\r\n data = control.data;\r\n data.name = data.name || \"\";\r\n return control;\r\n}\r\n\r\nexport function createFormFile(id: string, data: IFormFileData): IFormControl {\r\n const control = createFormControl(id, \"file\", data);\r\n data = control.data;\r\n data.accept = data.accept || \".jpg,.jpeg,.png\";\r\n data.multi = data.multi || false;\r\n data.baseUrl = ObjectUtils.isString(data.baseUrl) ? data.baseUrl : \"assets/\";\r\n data.uploadUrl = ObjectUtils.isString(data.uploadUrl) ? data.uploadUrl : \"assets\";\r\n data.createUploadData = data.createUploadData || ((file: File) => {\r\n const form = new FormData();\r\n form.append(\"file\", file);\r\n return form;\r\n });\r\n return control;\r\n}\r\n","import {ComponentFactoryResolver, Inject, Injectable, Injector, Type, ViewContainerRef} from \"@angular/core\";\r\nimport {\r\n FORM_CONTROL_PROVIDER, FORM_GROUP_TYPE,\r\n IDynamicFormControl,\r\n IFormControlComponent,\r\n IFormControlProvider,\r\n IFormGroupComponent\r\n} from \"../common-types\";\r\nimport {ObjectUtils} from \"@stemy/ngx-utils\";\r\n\r\n@Injectable()\r\nexport class DynamicFormService {\r\n\r\n constructor(@Inject(FORM_CONTROL_PROVIDER) private components: IFormControlProvider[],\r\n @Inject(FORM_GROUP_TYPE) private groupType: Type<IFormGroupComponent>,\r\n private resolver: ComponentFactoryResolver,\r\n public readonly injector: Injector) {\r\n }\r\n\r\n findProvider(control: IDynamicFormControl): IFormControlProvider {\r\n if (!control) return null;\r\n const providers = this.components.filter(p => p.acceptor(control));\r\n if (providers.length == 0) {\r\n throw new Error(`No component provider for control: ${JSON.stringify({\r\n id: control.id,\r\n type: control.type,\r\n data: control.data\r\n })}`);\r\n }\r\n // Sort providers\r\n providers.sort((a, b) => ObjectUtils.compare(a.priority, b.priority))\r\n return providers[0];\r\n }\r\n\r\n createComponent(vcr: ViewContainerRef, provider: IFormControlProvider): IFormControlComponent {\r\n vcr.clear();\r\n if (!provider) return null;\r\n const factory = this.resolver.resolveComponentFactory(provider.component);\r\n return vcr.createComponent(factory).instance;\r\n }\r\n\r\n createGroup(vcr: ViewContainerRef): IFormGroupComponent {\r\n vcr.clear();\r\n const factory = this.resolver.resolveComponentFactory(this.groupType);\r\n return vcr.createComponent(factory).instance;\r\n }\r\n}\r\n","import {DatePipe} from \"@angular/common\";\r\nimport {FactoryDependencies, FileUtils, ObjectUtils} from \"@stemy/ngx-utils\";\r\nimport {FormControlTester, FormControlValidator, IDynamicFormControl, IFormControlSerializer} from \"../common-types\";\r\n\r\nexport class FormUtilities {\r\n\r\n static checkField(expression: string = `true`): FormControlTester {\r\n // @dynamic\r\n const lambda = (control: IDynamicFormControl): Promise<boolean> => {\r\n return Promise.resolve(ObjectUtils.evaluate(expression, {control: control}));\r\n };\r\n return lambda;\r\n }\r\n\r\n static checkReadonly(control: IDynamicFormControl): Promise<boolean> {\r\n return Promise.resolve(control.visible && !control.disabled);\r\n }\r\n\r\n static readonly(): Promise<boolean> {\r\n return Promise.resolve(true);\r\n }\r\n\r\n static validateJSON(control: IDynamicFormControl): Promise<string> {\r\n const value = control.value;\r\n if (!value) return Promise.resolve(null);\r\n try {\r\n JSON.parse(value);\r\n return Promise.resolve(null);\r\n } catch (e) {\r\n return Promise.resolve(\"error.not-valid-json\")\r\n }\r\n }\r\n\r\n static validateRequired(control: IDynamicFormControl): Promise<string> {\r\n const value = control.value;\r\n return Promise.resolve(!ObjectUtils.isNumber(value) && !value ? \"error.required\" : null);\r\n }\r\n\r\n static validateMinLength(length: number): FormControlValidator {\r\n // @dynamic\r\n const lambda = (control: IDynamicFormControl) => {\r\n const value = control.value;\r\n if (!ObjectUtils.isString(value) || value.length < length) {\r\n return Promise.resolve({\"error.min-length\": {length: length}});\r\n }\r\n return Promise.resolve(null);\r\n };\r\n return lambda;\r\n }\r\n\r\n static validateMaxLength(length: number): FormControlValidator {\r\n // @dynamic\r\n const lambda = (control: IDynamicFormControl) => {\r\n const value = control.value;\r\n if (!ObjectUtils.isString(value) || value.length > length) {\r\n return Promise.resolve({\"error.max-length\": {length: length}});\r\n }\r\n return Promise.resolve(null);\r\n };\r\n return lambda;\r\n }\r\n\r\n static validateRequiredTranslation(control: IDynamicFormControl): Promise<string> {\r\n const value: any[] = control.value;\r\n if (!value || value.length == 0) return Promise.resolve(\"error.required\");\r\n return Promise.resolve(value.findIndex(t => (t.lang == \"de\" || t.lang == \"en\") && !t.translation) < 0 ? null : \"error.required\");\r\n }\r\n\r\n static validateEmail(control: IDynamicFormControl): Promise<string> {\r\n const value = control.value;\r\n if (!value) return Promise.resolve(null);\r\n const emailRegexp = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return Promise.resolve(emailRegexp.test(value) ? null : \"error.invalid-email\");\r\n }\r\n\r\n static validatePhone(control: IDynamicFormControl): Promise<string> {\r\n const value = control.value;\r\n if (!value) return Promise.resolve(null);\r\n const phoneRegexp = /^(?:\\d){10,12}$/;\r\n return Promise.resolve(phoneRegexp.test(value) ? null : \"error.invalid-phone\");\r\n }\r\n\r\n static serializeLogo(id: string, parent: IDynamicFormControl): Promise<any> {\r\n const value: string = parent.model[id];\r\n return Promise.resolve(!value || value.length == 0 ? null : value);\r\n }\r\n\r\n static serializeFile(id: string, parent: IDynamicFormControl): Promise<any> {\r\n const value: any = parent.model[id];\r\n if (ObjectUtils.isBlob(value)) return Promise.resolve(value);\r\n return Promise.resolve(!ObjectUtils.isString(value) || !value.startsWith(\"data:\") ? null : FileUtils.dataToBlob(value));\r\n }\r\n\r\n static serializeNumber(id: string, parent: IDynamicFormControl): Promise<any> {\r\n const value: string = parent.model[id];\r\n return Promise.resolve(!value || value.length == 0 ? 0 : parseFloat(value));\r\n }\r\n\r\n static serializeJSON(id: string, parent: IDynamicFormControl): Promise<any> {\r\n const value: string = parent.model[id];\r\n return Promise.resolve(!value ? {} : JSON.parse(value));\r\n }\r\n\r\n @FactoryDependencies(DatePipe)\r\n static serializeDate(date: DatePipe, format: string = \"yyyy-MM-dd\", defaultValue: string = \"\"): IFormControlSerializer {\r\n // @dynamic\r\n const lambda = (id: string, parent: IDynamicFormControl): Promise<any> => {\r\n const value: any = parent.model[id];\r\n if (!ObjectUtils.isDate(value)) return Promise.resolve(value || defaultValue);\r\n return Promise.resolve(!format ? value : date.transform(value, format));\r\n };\r\n return lambda;\r\n }\r\n}\r\n","import {Injectable} from \"@angular/core\";\r\nimport {ApiService, StringUtils} from \"@stemy/ngx-utils\";\r\n\r\nimport {FormUtilities} from \"./form-utilities\";\r\n\r\nimport {\r\n createFormFile,\r\n createFormInput,\r\n createFormSelect,\r\n FormControlValidatorFactory,\r\n IDynamicFormControl,\r\n IFormControl,\r\n IFormControlData,\r\n IFormFileData,\r\n IFormInputData,\r\n IFormSelectData,\r\n IFormSerializers\r\n} from \"../common-types\";\r\n\r\nexport interface IOpenApiSchemaProperty {\r\n id: string;\r\n type: string;\r\n format: string;\r\n column: boolean;\r\n additionalProperties: any;\r\n $ref: string;\r\n enum: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport interface IOpenApiSchema {\r\n properties: { [name: string]: IOpenApiSchemaProperty };\r\n required: string[];\r\n}\r\n\r\nexport interface IDynamicFormInputs {\r\n controls?: IFormControl[];\r\n serializers?: IFormSerializers;\r\n schema?: IOpenApiSchema;\r\n}\r\n\r\n@Injectable()\r\nexport class OpenApiService {\r\n\r\n private schemasPromise: Promise<any>;\r\n private schemas: any;\r\n\r\n constructor(private api: ApiService) {\r\n const baseUrl = this.api.url(\"\").replace(\"api/\", \"api-docs\");\r\n this.schemas = {};\r\n this.schemasPromise = new Promise<any>((resolve => {\r\n this.api.client.get(baseUrl).subscribe((res: any) => {\r\n this.schemas = res.definitions || {};\r\n resolve(this.schemas);\r\n }, () => {\r\n resolve({});\r\n });\r\n }));\r\n }\r\n\r\n getFormInputsForSchema(name: string): Promise<IDynamicFormInputs> {\r\n this.api.cache = {};\r\n return this.schemasPromise.then(schemas => {\r\n const schema: IOpenApiSchema = schemas[name];\r\n const inputs = this.getFormInputsForSchemaDef(schema);\r\n return inputs;\r\n });\r\n }\r\n\r\n private getFormInputsForSchemaDef(schema: IOpenApiSchema): IDynamicFormInputs {\r\n const inputs: IDynamicFormInputs = {};\r\n if (!schema) return inputs;\r\n inputs.schema = schema;\r\n inputs.serializers = {};\r\n inputs.controls = Object.keys(schema.properties || {}).map(p => {\r\n const property = schema.properties[p];\r\n property.id = p;\r\n inputs.serializers[p] = (id: string, parent: IDynamicFormControl) => {\r\n return Promise.resolve(parent.model[id]);\r\n };\r\n return this.getFormControlForProperty(property, schema);\r\n }).filter(t => null !== t);\r\n return inputs;\r\n }\r\n\r\n private getFormControlForProperty(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormControl {\r\n if (Array.isArray(property.enum)) {\r\n return createFormSelect(property.id, this.getFormSelectData(property, schema));\r\n }\r\n switch (property.type) {\r\n case \"string\":\r\n case \"number\":\r\n case \"boolean\":\r\n case \"textarea\":\r\n return createFormInput(property.id, this.getFormInputData(property, schema));\r\n case \"list\":\r\n return createFormSelect(property.id, this.getFormSelectData(property, schema));\r\n case \"file\":\r\n return createFormFile(property.id, this.getFormFileData(property, schema));\r\n }\r\n return null;\r\n }\r\n\r\n private getBaseFormData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormControlData {\r\n return {\r\n readonly: property.readonly ? FormUtilities.readonly : null,\r\n shouldSerialize: FormUtilities.checkReadonly,\r\n validators: this.getValidators(property, schema)\r\n }\r\n }\r\n\r\n private getFormInputData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormInputData {\r\n let type = StringUtils.has(property.id, \"password\", \"Password\") ? \"password\" : property.type;\r\n switch (property.type) {\r\n case \"boolean\":\r\n type = \"checkbox\";\r\n break;\r\n case \"textarea\":\r\n type = \"textarea\";\r\n break;\r\n }\r\n return {\r\n ...this.getBaseFormData(property, schema),\r\n type\r\n };\r\n }\r\n\r\n private getFormSelectData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormSelectData {\r\n const options = Array.isArray(property.enum)\r\n ? () => {\r\n return Promise.resolve(property.enum.map(id => ({ id, label: `${property.id}.${id}` })));\r\n }\r\n : () => {\r\n this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {\r\n return result.items.map(i => {\r\n return { id: i._id, label: i.name };\r\n });\r\n });\r\n return this.api.cache[property.endpoint];\r\n };\r\n return {\r\n ...this.getBaseFormData(property, schema),\r\n options,\r\n };\r\n }\r\n\r\n private getFormFileData(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): IFormFileData {\r\n return {\r\n ...this.getBaseFormData(property, schema),\r\n multi: property.multi\r\n };\r\n }\r\n\r\n private getValidators(property: IOpenApiSchemaProperty, schema: IOpenApiSchema): FormControlValidatorFactory[] {\r\n const validators: FormControlValidatorFactory[] = [];\r\n if (schema.required.indexOf(property.id) >= 0) {\r\n validators.push(FormUtilities.validateRequired);\r\n }\r\n if (property.minLength) {\r\n validators.push({\r\n type: FormUtilities,\r\n func: FormUtilities.validateMinLength,\r\n params: [property.minLength]\r\n });\r\n }\r\n if (property.maxLength) {\r\n validators.push({\r\n type: FormUtilities,\r\n func: FormUtilities.validateMaxLength,\r\n params: [property.maxLength]\r\n });\r\n }\r\n switch (property.format) {\r\n case \"email\":\r\n validators.push(FormUtilities.validateEmail);\r\n break;\r\n }\r\n return validators;\r\n }\r\n}\r\n","import {\r\n ChangeDetectorRef,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2\r\n} from \"@angular/core\";\r\nimport {Subscription} from \"rxjs\";\r\nimport {IAsyncMessage, IToasterService, TOASTER_SERVICE} from \"@stemy/ngx-utils\";\r\nimport {AsyncSubmitMethod, IDynamicFormBase} from \"../common-types\";\r\n\r\n@Directive({\r\n selector: \"[async-submit]\",\r\n exportAs: \"async-submit\"\r\n})\r\nexport class AsyncSubmitDirective implements OnInit, OnDestroy {\r\n\r\n @Input(\"async-submit\") method: AsyncSubmitMethod;\r\n @Input() form: IDynamicFormBase;\r\n\r\n @Output() onSuccess: EventEmitter<IAsyncMessage>;\r\n @Output() onError: EventEmitter<IAsyncMessage>;\r\n\r\n private loading: boolean;\r\n private disabled: boolean;\r\n private callback: Function;\r\n private onStatusChange: Subscription;\r\n private onSubmit: Subscription;\r\n\r\n @HostBinding(\"class.disabled\")\r\n get isDisabled(): boolean {\r\n return this.disabled;\r\n }\r\n\r\n @HostBinding(\"class.loading\")\r\n get isLoading(): boolean {\r\n return this.loading;\r\n }\r\n\r\n constructor(@Inject(TOASTER_SERVICE) private toaster: IToasterService, private cdr: ChangeDetectorRef, elem: ElementRef, renderer: Renderer2) {\r\n this.onSuccess = new EventEmitter<IAsyncMessage>();\r\n this.onError = new EventEmitter<IAsyncMessage>();\r\n if (elem.nativeElement.tagName !== \"BUTTON\") return;\r\n renderer.setAttribute(elem.nativeElement, \"type\", \"button\");\r\n }\r\n\r\n ngOnInit(): void {\r\n if (!this.form) return;\r\n this.disabled = this.form.status !== \"VALID\";\r\n this.cdr.detectChanges();\r\n this.onStatusChange = this.form.onStatusChange.subscribe(form => {\r\n this.disabled = form.status !== \"VALID\";\r\n this.cdr.detectChanges();\r\n if (!this.callback || form.status == \"PENDING\") return;\r\n if (!this.disabled) {\r\n this.callback();\r\n }\r\n this.callback = null;\r\n });\r\n this.onSubmit = this.form.onSubmit.subscribe(() => this.callMethod());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.onStatusChange) this.onStatusChange.unsubscribe();\r\n if (this.onSubmit) this.onSubmit.unsubscribe();\r\n }\r\n\r\n @HostListener(\"click\")\r\n click(): void {\r\n this.callback = () => this.callMethod();\r\n if (this.form.status !== \"VALID\" && this.form.status !== \"INVALID\") return;\r\n this.callback();\r\n this.callback = null;\r\n }\r\n\r\n callMethod(): void {\r\n if (this.loading) return;\r\n this.loading = true;\r\n this.method(this.form).then(result => {\r\n this.loading = false;\r\n if (result) {\r\n this.onSuccess.emit(result);\r\n this.toaster.success(result.message, result.context);\r\n }\r\n }, reason => {\r\n if (!reason || !reason.message)\r\n throw new Error(\"Reason must implement IAsyncMessage interface\");\r\n this.loading = false;\r\n this.onError.emit(reason);\r\n this.toaster.error(reason.message, reason.context);\r\n });\r\n }\r\n}\r\n","import {Directive, Input, OnChanges, SimpleChanges, ViewContainerRef} from \"@angular/core\";\r\nimport {IDynamicFormControl, IFormControlComponent} from \"../common-types\";\r\nimport {DynamicFormService} from \"../services/dynamic-form.service\";\r\n\r\n@Directive({\r\n selector: \"[form-control]\",\r\n})\r\nexport class DynamicFormControlDirective implements OnChanges {\r\n\r\n @Input(\"form-control\") control: IDynamicFormControl;\r\n\r\n get component(): IFormControlComponent {\r\n return this.comp;\r\n }\r\n\r\n private comp: IFormControlComponent;\r\n\r\n constructor(private vcr: ViewContainerRef, private forms: DynamicFormService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.control) {\r\n this.comp = this.forms.createComponent(this.vcr, this.control.provider);\r\n }\r\n if (!this.comp) return;\r\n this.comp.control = this.control;\r\n }\r\n}\r\n","import {Directive, Input, TemplateRef} from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: `ng-template[control],\r\n ng-template[label],\r\n ng-template[input],\r\n ng-template[prefix],\r\n ng-template[suffix],\r\n ng-template[setPrefix],\r\n ng-template[setSuffix],\r\n ng-template[formPrefix],\r\n ng-template[formSuffix],\r\n ng-template[innerFormPrefix],\r\n ng-template[innerFormSuffix]`\r\n})\r\nexport class DynamicFormTemplateDirective {\r\n\r\n @Input() control: string;\r\n @Input() label: string;\r\n @Input() input: string;\r\n @Input() prefix: string;\r\n @Input() suffix: string;\r\n @Input() setPrefix: string;\r\n @Input() setSuffix: string;\r\n @Input() formPrefix: string;\r\n @Input() formSuffix: string;\r\n @Input() innerFormPrefix: string;\r\n @Input() innerFormSuffix: string;\r\n\r\n constructor(public template: TemplateRef<any>) {\r\n }\r\n}\r\n","import { AfterContentInit, ChangeDetectorRef, ContentChild, ContentChildren, EventEmitter, Injector, Input, Output, QueryList, TemplateRef, Directive } from \"@angular/core\";\r\nimport {ObjectUtils} from \"@stemy/ngx-utils\";\r\nimport {\r\n DynamicFormControl, DynamicFormState, IDynamicFormBase, IDynamicFormControl, IDynamicFormTemplates,\r\n IFormControlProvider\r\n} from \"../../common-types\";\r\nimport {DynamicFormTemplateDirective} from \"../../directives/dynamic-form-template.directive\";\r\nimport {DynamicFormService} from \"../../services/dynamic-form.service\";\r\n\r\n@Directive()\r\nexport abstract class DynamicFormBaseComponent implements IDynamicFormBase, AfterContentInit {\r\n\r\n @Input() name: string;\r\n @Input() readonly: boolean;\r\n @Input() updateOn: \"change\" | \"blur\" | \"submit\";\r\n @Input() classes: any;\r\n @Input() parent: IDynamicFormBase;\r\n\r\n @Input() wrapperTemplate: TemplateRef<any>;\r\n @Input() fieldSetTemplate: TemplateRef<any>;\r\n @Input() controlTemplate: TemplateRef<any>;\r\n\r\n @Input() controlTemplates: IDynamicFormTemplates;\r\n @Input() labelTemplates: IDynamicFormTemplates;\r\n @Input() inputTemplates: IDynamicFormTemplates;\r\n @Input() prefixTemplates: IDynamicFormTemplates;\r\n @Input() suffixTemplates: IDynamicFormTemplates;\r\n @Input() setPrefixTemplates: IDynamicFormTemplates;\r\n @Input() setSuffixTemplates: IDynamicFormTemplates;\r\n\r\n @Output() onChange: EventEmitter<IDynamicFormControl>;\r\n @Output() onStatusChange: EventEmitter<IDynamicFormBase>;\r\n @Output() onInit: EventEmitter<IDynamicFormBase>;\r\n @Output() onSubmit: EventEmitter<IDynamicFormBase>;\r\n\r\n @ContentChild(\"prefixTemplate\")\r\n prefixTemplate: TemplateRef<any>;\r\n\r\n @ContentChild(\"suffixTemplate\")\r\n suffixTemplate: TemplateRef<any>;\r\n\r\n get root(): IDynamicFormBase {\r\n let form: IDynamicFormBase = this;\r\n while (ObjectUtils.isDefined(form.parent)) {\r\n form = form.parent;\r\n }\r\n return form;\r\n }\r\n\r\n abstract status: DynamicFormState;\r\n readonly injector: Injector;\r\n readonly cdr: ChangeDetectorRef;\r\n\r\n @ContentChildren(DynamicFormTemplateDirective)\r\n protected templates: QueryList<DynamicFormTemplateDirective>;\r\n\r\n @ContentChild(\"wrapperTemplate\")\r\n protected cWrapperTemplate: TemplateRef<any>;\r\n\r\n @ContentChild(\"fieldSetTemplate\")\r\n protected cFieldSetTemplate: TemplateRef<any>;\r\n\r\n @ContentChild(\"controlTemplate\")\r\n protected cControlTemplate: TemplateRef<any>;\r\n\r\n protected constructor(cdr: ChangeDetectorRef, private formService: DynamicFormService) {\r\n this.name = \"\";\r\n\r\n this.controlTemplates = {};\r\n this.labelTemplates = {};\r\n this.inputTemplates = {};\r\n this.prefixTemplates = {};\r\n this.suffixTemplates = {};\r\n\r\n this.onChange = new EventEmitter<DynamicFormControl>();\r\n this.onStatusChange = new EventEmitter<IDynamicFormBase>();\r\n this.onInit = new EventEmitter<IDynamicFormBase>();\r\n this.onSubmit = new EventEmitter<IDynamicFormBase>();\r\n this.injector = formService.injector;\r\n this.cdr = cdr;\r\n }\r\n\r\n // --- IDynamicFormBase\r\n\r\n abstract validate(showErrors?: boolean): Promise<any>;\r\n abstract serialize(validate?: boolean): Promise<any>;\r\n abstract check(): Promise<any>;\r\n abstract getControl(id: string): IDynamicFormControl;\r\n\r\n findProvider(control: IDynamicFormControl): IFormControlProvider {\r\n return this.formService.findProvider(control);\r\n }\r\n\r\n // --- Lifecycle hooks\r\n\r\n ngAfterContentInit(): void {\r\n this.wrapperTemplate = this.wrapperTemplate || this.cWrapperTemplate;\r\n this.fieldSetTemplate = this.fieldSetTemplate || this.cFieldSetTemplate;\r\n this.controlTemplate = this.controlTemplate || this.cControlTemplate;\r\n this.controlTemplates = this.filterTemplates(this.controlTemplates, \"control\");\r\n this.labelTemplates = this.filterTemplates(this.labelTemplates, \"label\");\r\n this.inputTemplates = this.filterTemplates(this.inputTemplates , \"input\");\r\n this.prefixTemplates = this.filterTemplates(this.prefixTemplates, \"prefix\");\r\n this.suffixTemplates = this.filterTemplates(this.suffixTemplates, \"suffix\");\r\n this.setPrefixTemplates = this.filterTemplates(this.setPrefixTemplates, \"setPrefix\");\r\n this.setSuffixTemplates = this.filterTemplates(this.setSuffixTemplates, \"setSuffix\");\r\n }\r\n\r\n protected filterTemplates(templates: IDynamicFormTemplates, type: string): IDynamicFormTemplates {\r\n if (ObjectUtils.isObject(templates) && Object.keys(templates).length > 0) return templates;\r\n return this.templates.filter(t => !!t[type]).reduce((result, directive) => {\r\n result[directive[type]] = directive.template;\r\n return result;\r\n }, {});\r\n }\r\n}\r\n","import {AfterContentInit, ChangeDetectorRef, Component, Input, OnChanges, SimpleChanges} from \"@angular/core\";\r\nimport {first} from \"rxjs/operators\";\r\nimport {\r\n DynamicFormGroup,\r\n DynamicFormState,\r\n IDynamicForm,\r\n IDynamicFormControl,\r\n IFormControl,\r\n IFormFieldSet,\r\n IFormSerializers\r\n} from \"../../common-types\";\r\nimport {DynamicFormService} from \"../../services/dynamic-form.service\";\r\nimport {DynamicFormBaseComponent} from \"../base/dynamic-form-base.component\";\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"dynamic-form, [dynamic-form]\",\r\n templateUrl: \"./dynamic-form.component.html\",\r\n providers: [{provide: DynamicFormBaseComponent, useExisting: DynamicFormComponent}]\r\n})\r\nexport class DynamicFormComponent extends DynamicFormBaseComponent implements IDynamicForm, AfterContentInit, OnChanges {\r\n\r\n @Input() group: DynamicFormGroup;\r\n @Input() controls: IFormControl[];\r\n @Input() serializers: IFormSerializers;\r\n @Input() fieldSets: IFormFieldSet[];\r\n @Input() data: any;\r\n\r\n defaultFieldSet: IFormFieldSet;\r\n\r\n get status(): DynamicFormState {\r\n return this.group.state;\r\n }\r\n\r\n get formControls(): IDynamicFormControl[] {\r\n return this.group.formControls;\r\n }\r\n\r\n constructor(cdr: ChangeDetectorRef, forms: DynamicFormService) {\r\n super(cdr, forms);\r\n this.group = new DynamicFormGroup(this);\r\n this.defaultFieldSet = {\r\n id: \"\",\r\n title: \"\",\r\n classes: \"\"\r\n };\r\n }\r\n\r\n // --- Lifecycle hooks\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!this.data) return;\r\n if (changes.data || changes.controls || changes.serializers || changes.formGroup) {\r\n if (this.group.id) return;\r\n this.group.setup(this.data, this);\r\n this.group.reloadControls();\r\n }\r\n }\r\n\r\n // --- Custom ---\r\n\r\n onFormSubmit(): void {\r\n const root = this.root;\r\n root.validate().then(() => root.onSubmit.emit(this), () => {});\r\n }\r\n\r\n // --- IDynamicForm ---\r\n\r\n validate(showErrors: boolean = true): Promise<any> {\r\n return new Promise<any>((resolve, reject) => {\r\n this.group.statusChanges.pipe(first(status => status == \"VALID\" || status == \"INVALID\")).subscribe(status => {\r\n if (showErrors) this.group.showErrors();\r\n if (status == \"VALID\") {\r\n resolve(null);\r\n return;\r\n }\r\n reject(null);\r\n });\r\n this.group.updateValueAndValidity();\r\n });\r\n }\r\n\r\n serialize(validate?: boolean): Promise<any> {\r\n return new Promise<any>((resolve, reject) => {\r\n const serialize = () => {\r\n this.group.serialize().then(resolve);\r\n };\r\n if (validate) {\r\n this.validate().then(serialize, reject);\r\n return;\r\n }\r\n serialize();\r\n });\r\n }\r\n\r\n check(): Promise<any> {\r\n return this.group.check();\r\n }\r\n\r\n getControl(id: string): IDynamicFormControl {\r\n return this.group.getControl(id);\r\n }\r\n}\r\n","import {\r\n AfterContentInit, ChangeDetectorRef, Component, ContentChild, Input, OnChanges, QueryList, SimpleChanges,\r\n TemplateRef, ViewChildren\r\n} from \"@angular/core\";\r\nimport {ObjectUtils, UniqueUtils} from \"@stemy/ngx-utils\";\r\nimport {\r\n DynamicFormGroup, DynamicFormState, IDynamicFormBase, IDynamicFormControl, IDynamicFormsConfigs,\r\n IDynamicFormTemplates, IDynamicSingleFormConfig\r\n} from \"../../common-types\";\r\nimport {DynamicFormBaseComponent} from \"../base/dynamic-form-base.component\";\r\nimport {DynamicFormService} from \"../../services/dynamic-form.service\";\r\n\r\nconst statusPriority: DynamicFormState[] = [\"LOADING\", \"PENDING\", \"DISABLED\", \"INVALID\"];\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"dynamic-forms, [dynamic-forms]\",\r\n templateUrl: \"./dynamic-forms.component.html\",\r\n providers: [{provide: DynamicFormBaseComponent, useExisting: DynamicFormsComponent}]\r\n})\r\nexport class DynamicFormsComponent extends DynamicFormBaseComponent implements IDynamicFormBase, AfterContentInit, OnChanges {\r\n\r\n @Input() data: IDynamicFormsConfigs;\r\n\r\n @Input() containerTemplate: TemplateRef<any>;\r\n\r\n @Input() formPrefixTemplates: IDynamicFormTemplates;\r\n @Input() formSuffixTemplates: IDynamicFormTemplates;\r\n @Input() innerFormPrefixTemplates: IDynamicFormTemplates;\r\n @Input() innerFormSuffixTemplates: IDynamicFormTemplates;\r\n\r\n get status(): DynamicFormState {\r\n for (let i = 0; i < statusPriority.length; i++) {\r\n const status = statusPriority[i];\r\n if (this.checkForms(f => f.status == status)) return status;\r\n }\r\n return \"VALID\";\r\n }\r\n\r\n public configs: IDynamicFormsConfigs;\r\n\r\n @ContentChild(\"containerTemplate\")\r\n protected cContainerTemplate: TemplateRef<any>;\r\n\r\n @ViewChildren(DynamicFormBaseComponent)\r\n private forms: QueryList<IDynamicFormBase>;\r\n\r\n constructor(cdr: ChangeDetectorRef, formService: DynamicFormService) {\r\n super(cdr, formService);\r\n this.formPrefixTemplates = {};\r\n this.formSuffixTemplates = {};\r\n this.innerFormPrefixTemplates = {};\r\n this.innerFormSuffixTemplates = {};\r\n }\r\n\r\n // --- Lifecycle hooks\r\n\r\n ngAfterContentInit(): void {\r\n super.ngAfterContentInit();\r\n this.containerTemplate = this.containerTemplate || this.cContainerTemplate;\r\n this.formPrefixTemplates = this.filterTemplates(this.formPrefixTemplates, \"formPrefix\");\r\n this.formSuffixTemplates = this.filterTemplates(this.formSuffixTemplates, \"formSuffix\");\r\n this.innerFormPrefixTemplates = this.filterTemplates(this.innerFormPrefixTemplates, \"innerFormPrefix\");\r\n this.innerFormSuffixTemplates = this.filterTemplates(this.innerFormSuffixTemplates, \"innerFormSuffix\");\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n this.configs = this.createFormGroups(this.data);\r\n }\r\n\r\n // --- IDynamicFormBase ---\r\n\r\n validate(showErrors: boolean = true): Promise<any> {\r\n if (!this.forms) return Promise.reject(null);\r\n return Promise.all(this.forms.map(f => f.validate(showErrors)));\r\n }\r\n\r\n serialize(validate?: boolean): Promise<any> {\r\n if (!this.forms) return validate ? Promise.reject(null) : Promise.resolve({});\r\n return new Promise<any>((resolve, reject) => {\r\n const promises = this.forms.map(f => f.serialize(validate));\r\n Promise.all(promises).then(results => {\r\n let result = {};\r\n results.forEach((data, ix) => {\r\n const config = this.data[ix];\r\n let path: Array<string | number> = null;\r\n if (ObjectUtils.isArray(config.path) && config.path.length > 0) {\r\n path = config.path;\r\n } else if (ObjectUtils.isString(config.path) && config.path.length > 0) {\r\n path = config.path.split(\".\");\r\n } else if (ObjectUtils.isNumber(config.path)) {\r\n path = [config.path];\r\n }\r\n if (!path) {\r\n result = ObjectUtils.assign(result, data);\r\n return;\r\n }\r\n result = ObjectUtils.mapToPath(result, data, path.map(p => `${p}`));\r\n });\r\n resolve(result);\r\n }, reject);\r\n });\r\n }\r\n\r\n check(): Promise<any> {\r\n if (!this.forms) return Promise.resolve(null);\r\n return Promise.all(this.forms.map(t => t.check()));\r\n }\r\n\r\n getControl(id: string): IDynamicFormControl {\r\n return this.getFromValue(f => f.getControl(id));\r\n }\r\n\r\n private checkForms(check: (form: IDynamicFormBase) => boolean): boolean {\r\n this.cdr.detectChanges();\r\n if (!this.forms) return false;\r\n return ObjectUtils.isDefined(this.forms.find(check));\r\n }\r\n\r\n private getFromValue<T>(check: (form: IDynamicFormBase) => T): T {\r\n if (!this.forms) return null;\r\n let value: T = null;\r\n this.forms.find(f => {\r\n value = check(f);\r\n return ObjectUtils.isDefined(value);\r\n });\r\n return value;\r\n }\r\n\r\n private createFormGroups(configs: IDynamicFormsConfigs): IDynamicFormsConfigs {\r\n return (configs || []).map((c: any) => {\r\n if (c.multi) return c;\r\n const config = <IDynamicSingleFormConfig>c;\r\n const group = new DynamicFormGroup(this, {\r\n id: config.id || UniqueUtils.uuid(),\r\n type: \"model\",\r\n data: config.controlData\r\n });\r\n config.group = group;\r\n config.name = config.name || this.name;\r\n group.setup(config.data, config);\r\n group.reloadControls();\r\n return config;\r\n });\r\n }\r\n}\r\n","import {Component, HostBinding} from \"@angular/core\";\r\nimport {IDynamicForm, IDynamicFormControl, IFormGroupComponent} from \"../../common-types\";\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"div[dynamic-form-group]\",\r\n templateUrl: \"./dynamic-form-group.component.html\"\r\n})\r\nexport class DynamicFormGroupComponent implements IFormGroupComponent {\r\n form: IDynamicForm;\r\n control: IDynamicFormControl;\r\n\r\n @HostBinding(\"class\")\r\n get classes(): string {\r\n if (!this.control) return \"form-group\";\r\n return [\"form-group\", \"form-group-\" + this.control.id, this.control.data.classes, this.control.errors && this.control.touched ? \"form-group-invalid\" : \"\"].join(\" \");\r\n }\r\n}\r\n","import {Component, Inject} from \"@angular/core\";\r\nimport {FormControlComponent, IDynamicFormControl, IFormFileData} from \"../../common-types\";\r\nimport {ApiService, ArrayUtils, FileUtils, IToasterService, ObjectUtils, TOASTER_SERVICE} from \"@stemy/ngx-utils\";\r\n\r\n@Component({\r\n selector: \"dynamic-form-file\",\r\n styleUrls: [\"./dynamic-form-file.component.scss\"],\r\n templateUrl: \"./dynamic-form-file.component.html\"\r\n})\r\nexport class DynamicFormFileComponent extends FormControlComponent<IFormFileData> {\r\n\r\n private fileImageCache: any[];\r\n\r\n // Acceptor for provider\r\n static acceptor(control: IDynamicFormControl): boolean {\r\n return control.type == \"file\";\r\n }\r\n\r\n // Loader for provider\r\n static loader(): Promise<any> {\r\n return Promise.resolve();\r\n }\r\n\r\n constructor(readonly api: ApiService, @Inject(TOASTER_SERVICE) readonly toaster: IToasterService) {\r\n super();\r\n this.fileImageCache = [];\r\n }\r\n\r\n onSelect(input: HTMLInputElement): void {\r\n this.processFiles(input.files);\r\n input.value = \"\";\r\n }\r\n\r\n protected processFiles(fileList: FileList): void {\r\n const files: File[] = [];\r\n const accept = this.data.accept;\r\n const types: string[] = ObjectUtils.isString(accept) && accept.length > 0 ? accept.toLowerCase().split(\",\") : null;\r\n if (fileList.length == 0) return;\r\n for (let i = 0; i < fileList.length; i++) {\r\n const file = fileList.item(i);\r\n const type = file.type.toLowerCase();\r\n const ext = FileUtils.getExtension(file);\r\n if (types && !ArrayUtils.has(types, type, ext)) continue;\r\n files.push(file);\r\n }\r\n if (files.length == 0) {\r\n this.toaster.error(\"message.error.wrong-files\");\r\n return;\r\n }\r\n this.upload(files);\r\n }\r\n\r\n protected upload(files: File[]): void {\r\n const single = !this.data.multi;\r\n if (single) files.length = Math.min(files.length , 1);\r\n const promises = [];\r\n files.forEach((file, ix) => {\r\n if (this.data.asDataUrl) {\r\n promises.push(FileUtils.readFileAsDataURL(file));\r\n return;\r\n }\r\n if (this.data.asFile) {\r\n promises.push(Promise.resolve(file));\r\n return;\r\n }\r\n promises.push(\r\n this.api.upload(\r\n this.data.uploadUrl,\r\n this.data.createUploadData(file),\r\n console.log,\r\n this.data.uploadOptions\r\n ).then(asset => asset._id || asset, () => null)\r\n );\r\n });\r\n Promise.all(promises).then(assets => {\r\n if (single) {\r\n this.control.setValue(assets[0]);\r\n return;\r\n }\r\n const current = this.value || [];\r\n this.control.setValue(current.concat(assets.filter(t => !!t)));\r\n });\r\n }\r\n\r\n delete(index?: number): void {\r\n if (this.data.multi) {\r\n const current = Array.from(this.value || []);\r\n current.splice(index, 1);\r\n this.control.setValue(current);\r\n return;\r\n }\r\n this.control.setValue(null);\r\n }\r\n\r\n getUrl(image: any): string {\r\n return `url('${this.getImgUrl(image)}')`;\r\n }\r\n\r\n private getImgUrl(image: any): string {\r\n if (ObjectUtils.isBlob(image)) {\r\n let cache = this.fileImageCache.find(t => t.file == image);\r\n if (!cache) {\r\n cache = {file: image, url: URL.createObjectURL(image)};\r\n this.fileImageCache.push(cache);\r\n }\r\n return cache.url;\r\n }\r\n const url = !image ? null : image.imageUrl || image;\r\n if (!ObjectUtils.isString(url)) return null;\r\n if (url.startsWith(\"data:\")) return url;\r\n if (!this.data.baseUrl) {\r\n const subUrl = url.startsWith(\"/\") ? url.substr(1) : url;\r\n return this.api.url(subUrl);\r\n }\r\n return this.api.url(`${this.data.baseUrl}${url}`);\r\n }\r\n}\r\n","import {Component, HostBinding, Inject} from \"@angular/core\";\r\nimport {ILanguageService, ITranslation, LANGUAGE_SERVICE, ObjectUtils} from \"@stemy/ngx-utils\";\r\nimport {DynamicFormControl, FormControlComponent, IFormInputData} from \"../../common-types\";\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"dynamic-form-input\",\r\n templateUrl: \"./dynamic-form-input.component.html\"\r\n})\r\nexport class DynamicFormInputComponent extends FormControlComponent<IFormInputData> {\r\n\r\n // Acceptor for provider\r\n static acceptor(control: DynamicFormControl): boolean {\r\n return control.type == \"input\";\r\n }\r\n\r\n // Loader for provider\r\n static loader(): Promise<any> {\r\n return Promise.resolve();\r\n }\r\n\r\n @HostBinding(\"class.checked\")\r\n get isChecked(): boolean {\r\n return this.data.type == \"checkbox\" && this.value;\r\n }\r\n\r\n constructor(@Inject(LANGUAGE_SERVICE) private language: ILanguageService) {\r\n super();\r\n }\r\n\r\n onDateChange(value: string): void {\r\n const date = new Date(value);\r\n const dateValue = <number>date.valueOf();\r\n if (isNaN(dateValue) || dateValue < -30610224000000) return;\r\n this.control.setValue(date)\r\n }\r\n\r\n onMaskChange(value: string): void {\r\n value = ObjectUtils.isFunction(this.data.unmask) ? this.data.unmask(value) : value;\r\n this.control.setValue(value)\r\n }\r\n\r\n onTextChange(value: string): void {\r\n if (!this.data.useLanguage) {\r\n this.control.setValue(value);\r\n return;\r\n }\r\n const translations: ITranslation[] = ObjectUtils.isArray(this.value) ? Array.from(this.value) : [];\r\n const translation = translations.find(t => t.lang == this.language.editLanguage);\r\n if (translation) {\r\n translation.translation = value;\r\n } else {\r\n translations.push({\r\n lang: this.language.editLanguage,\r\n translation: value\r\n });\r\n }\r\n this.control.setValue(translations);\r\n }\r\n\r\n onNumberBlur(): void {\r\n const value = this.value;\r\n if (ObjectUtils.isNumber(this.data.max) && this.data.max < value) {\r\n this.control.setValue(this.data.max);\r\n } else if (ObjectUtils.isNumber(this.data.min) && this.data.min > value) {\r\n this.control.setValue(this.data.min);\r\n }\r\n this.control.onBlur();\r\n }\r\n}\r\n","import {Component} from \"@angular/core\";\r\nimport {ObjectUtils, ReflectUtils} from \"@stemy/ngx-utils\";\r\nimport {\r\n DynamicFormControl,\r\n FormControlComponent,\r\n IDynamicForm, IDynamicFormControl,\r\n IFormControl, IFormControlOption,\r\n IFormControlOptions,\r\n IFormSelectData\r\n} from \"../../common-types\";\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"dynamic-form-select\",\r\n templateUrl: \"./dynamic-form-select.component.html\"\r\n})\r\nexport class DynamicFormSelectComponent extends FormControlComponent<IFormSelectData> {\r\n\r\n // Acceptor for provider\r\n static acceptor(control: DynamicFormControl): boolean {\r\n return control.type == \"select\";\r\n }\r\n\r\n // Loader for provider\r\n static loader(control: IDynamicFormControl): Promise<any> {\r\n const data = control.getData<IFormSelectData>();\r\n if (data.type == \"radio\" && data.multi) {\r\n return Promise.reject(\"Radio group doesn't support multi select!\");\r\n }\r\n return new Promise<any>(resolve => {\r\n const getOptions = ReflectUtils.resolve<IFormControlOptions>(data.options, control.form.injector);\r\n getOptions(control).then(options => {\r\n if (data.emptyOption) options.unshift({id: null, label: \"\"});\r\n control.meta.options = options;\r\n DynamicFormSelectComponent.fillOptions(control, options);\r\n resolve(options);\r\n });\r\n });\r\n }\r\n\r\n static fillOptions(control: IDynamicFormControl, options: IFormControlOption[]): void {\r\n const data = control.getData<IFormSelectData>();\r\n const selected = control.value;\r\n if (data.multi || options.length == 0 || options.findIndex(t => t.id == selected) >= 0) return;\r\n control.setValue(options[0].id);\r\n }\r\n\r\n onSelectChange(value: any): void {\r\n const isArray = ObjectUtils.isArray(value);\r\n const current = this.value;\r\n if (this.data.multi) {\r\n if (isArray) {\r\n this.control.setValue(value);\r\n return;\r\n }\r\n if (ObjectUtils.isArray(current)) {\r\n this.control.setValue(\r\n current.indexOf(value) < 0\r\n ? current.concat([value])\r\n : current.filter(c => c !== value)\r\n );\r\n return;\r\n }\r\n this.control.setValue([value]);\r\n return;\r\n }\r\n if (isArray) value = value[0];\r\n if (current == value) {\r\n const option = this.meta.options.find(o => o.id !== value);\r\n value = option ? option.id : null;\r\n }\r\n this.control.setValue(value);\r\n }\r\n\r\n checkValue(option: IFormControlOption): boolean {\r\n const value = this.value;\r\n return ObjectUtils.isArray(value) ? value.indexOf(option.id) >= 0 : option.id == value;\r\n }\r\n\r\n findOption(option: IFormControlOption, index: number, id: string): boolean {\r\n return option.id == id;\r\n }\r\n}\r\n","import {Component} from \"@angular/core\";\r\nimport {\r\n DynamicFormControl,\r\n FormControlComponent,\r\n IDynamicForm,\r\n IFormControl,\r\n IFormStaticData\r\n} from \"../../common-types\";\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"dynamic-form-static\",\r\n templateUrl: \"./dynamic-form-static.component.html\"\r\n})\r\nexport class DynamicFormStaticComponent extends FormControlComponent<IFormStaticData> {\r\n\r\n // Acceptor for provider\r\n static acceptor(control: DynamicFormControl): boolean {\r\n return control.type == \"static\";\r\n }\r\n\r\n // Loader for provider\r\n static loader(): Promise<any> {\r\n return Promise.resolve();\r\n }\r\n}\r\n","import {Component, ViewChild} from \"@angular/core\";\r\nimport {DynamicFormControl, FormControlComponent, IDynamicForm, IFormModelData} from \"../../common-types\";\r\n\r\n@Component({\r\n moduleId: module.id,\r\n selector: \"dynamic-form-model\",\r\n templateUrl: \"./dynamic-form-model.component.html\"\r\n})\r\nexport class DynamicFormModelComponent extends FormControlComponent<IFormModelData> {\r\n\r\n @ViewChild(\"subForm\")\r\n private subForm: IDynamicForm;\r\n\r\n // Acceptor for provider\r\n static acceptor(control: DynamicFormControl): boolean {\r\n return control.type == \"model\";\r\n }\r\n\r\n // Loader for provider\r\n static loader(): Promise<any> {\r\n return Promise.resolve();\r\n }\r\n}\r\n","import {Directive, Input, OnChanges, SimpleChanges, ViewContainerRef} from \"@angular/core\";\r\nimport {IDynamicForm, IDynamicFormControl, IFormControlComponent, IFormGroupComponent} from \"../common-types\";\r\nimport {DynamicFormService} from \"../services/dynamic-form.service\";\r\n\r\n@Directive({\r\n selector: \"[form-group]\",\r\n})\r\nexport class DynamicFormGroupDirective implements OnChanges {\r\n\r\n @Input(\"form-group\") control: IDynamicFormControl;\r\n @Input() form: IDynamicForm;\r\n @Input() visible: boolean;\r\n\r\n get component(): IFormControlComponent {\r\n return this.comp;\r\n }\r\n\r\n private comp: IFormGroupComponent;\r\n\r\n constructor(private vcr: ViewContainerRef, private forms: DynamicFormService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.control || changes.form || changes.visible) {\r\n if (!this.visible) {\r\n this.vcr.clear();\r\n this.comp = null;\r\n return;\r\n }\r\n this.comp = this.forms.createGroup(this.vcr);\r\n }\r\n if (!this.comp) return;\r\n this.comp.form = this.form;\r\n this.comp.control = this.control;\r\n }\r\n}\r\n","import {ModuleWithProviders, NgModule} from \"@angular/core\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {FormsModule, ReactiveFormsModule} from \"@angular/forms\";\r\nimport {TextMaskModule} from \"angular2-text-mask\";\r\nimport {NgxUtilsModule} from \"@stemy/ngx-utils\";\r\nimport {FormControlProvider, FormGroupProvider, provideFormControl, provideFormGroup} from \"./common-types\";\r\n\r\nimport {DynamicFormService} from \"./services/dynamic-form.service\";\r\nimport {OpenApiService} from \"./services/open-api.service\";\r\n\r\nimport {AsyncSubmitDirective} from \"./directives/async-submit.directive\";\r\nimport {DynamicFormControlDirective} from \"./directives/dynamic-form-control.directive\";\r\nimport {DynamicFormGroupDirective} from \"./directives/dynamic-form-group.directive\";\r\nimport {DynamicFormTemplateDirective} from \"./directives/dynamic-form-template.directive\";\r\nimport {DynamicFormsComponent} from \"./components/dynamic-forms/dynamic-forms.component\";\r\nimport {DynamicFormComponent} from \"./components/dynamic-form/dynamic-form.component\";\r\n\r\nimport {DynamicFormGroupComponent} from \"./components/dynamic-form-group/dynamic-form-group.component\";\r\nimport {DynamicFormFileComponent} from \"./components/dynamic-form-file/dynamic-form-file.component\";\r\nimport {DynamicFormInputComponent} from \"./components/dynamic-form-input/dynamic-form-input.component\";\r\nimport {DynamicFormSelectComponent} from \"./components/dynamic-form-select/dynamic-form-select.component\";\r\nimport {DynamicFormStaticComponent} from \"./components/dynamic-form-static/dynamic-form-static.component\";\r\nimport {DynamicFormModelComponent} from \"./components/dynamic-form-model/dynamic-form-model.component\";\r\n\r\n// --- Components ---\r\nexport const components = [\r\n DynamicFormsComponent,\r\n DynamicFormComponent,\r\n DynamicFormGroupComponent,\r\n DynamicFormFileComponent,\r\n DynamicFormInputComponent,\r\n DynamicFormSelectComponent,\r\n DynamicFormStaticComponent,\r\n DynamicFormModelComponent\r\n];\r\n\r\n// --- Directives ---\r\nexport const directives = [\r\n AsyncSubmitDirective,\r\n DynamicFormControlDirective,\r\n DynamicFormGroupDirective,\r\n DynamicFormTemplateDirective\r\n];\r\n\r\n// --- Pipes ---\r\nexport const pipes = [];\r\n\r\n@NgModule({\r\n declarations: [\r\n ...components,\r\n ...directives,\r\n ...pipes\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TextMaskModule,\r\n NgxUtilsModule\r\n ],\r\n exports: [\r\n ...components,\r\n ...directives,\r\n ...pipes,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgxUtilsModule\r\n ],\r\n entryComponents: components,\r\n providers: pipes\r\n})\r\nexport class NgxDynamicFormModule {\r\n\r\n static forRoot(controlProviders?: Array<FormControlProvider>, groupProvider?: FormGroupProvider): ModuleWithProviders<NgxDynamicFormModule> {\r\n return {\r\n ngModule: NgxDynamicFormModule,\r\n providers: [\r\n DynamicFormService,\r\n OpenApiService,\r\n provideFormControl(DynamicFormFileComponent, DynamicFormFileComponent.acceptor, DynamicFormFileComponent.loader),\r\n provideFormControl(DynamicFormInputComponent, DynamicFormInputComponent.acceptor, DynamicFormInputComponent.loader),\r\n provideFormControl(DynamicFormSelectComponent, DynamicFormSelectComponent.acceptor, DynamicFormSelectComponent.loader),\r\n provideFormControl(DynamicFormStaticComponent, DynamicFormStaticComponent.acceptor, DynamicFormStaticComponent.loader),\r\n provideFormControl(DynamicFormModelComponent, DynamicFormModelComponent.acceptor, DynamicFormModelComponent.loader),\r\n ...(controlProviders || []),\r\n groupProvider || provideFormGroup(DynamicFormGroupComponent)\r\n ]\r\n }\r\n }\r\n}\r\n"]}
|