@anglr/common 11.3.1 → 12.0.0-beta.20220413111906

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/changelog.md +25 -0
  2. package/es2015/forms/src/directives/hasError/hasError.directive.js +3 -4
  3. package/es2015/forms/src/directives/hasError/hasError.directive.js.map +1 -1
  4. package/es2015/forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.js +1 -1
  5. package/es2015/forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.js.map +1 -1
  6. package/es2015/forms/src/misc/formModel/decorators/formGroupValidator.decorator.js +1 -1
  7. package/es2015/forms/src/misc/formModel/decorators/formGroupValidator.decorator.js.map +1 -1
  8. package/es2015/forms/src/misc/formModel/interfaces/modelDecoratorMetadata.js.map +1 -1
  9. package/es2015/forms/src/misc/formModel/misc/utils.js +11 -8
  10. package/es2015/forms/src/misc/formModel/misc/utils.js.map +1 -1
  11. package/es2015/forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.js +9 -5
  12. package/es2015/forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.js.map +1 -1
  13. package/es2015/forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.js.map +1 -1
  14. package/es2015/forms/src/services/validationErrorRenderer/validationErrorRenderer.service.js +3 -13
  15. package/es2015/forms/src/services/validationErrorRenderer/validationErrorRenderer.service.js.map +1 -1
  16. package/es2020/forms/src/directives/hasError/hasError.directive.js +3 -4
  17. package/es2020/forms/src/directives/hasError/hasError.directive.js.map +1 -1
  18. package/es2020/forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.js +1 -1
  19. package/es2020/forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.js.map +1 -1
  20. package/es2020/forms/src/misc/formModel/decorators/formGroupValidator.decorator.js +1 -1
  21. package/es2020/forms/src/misc/formModel/decorators/formGroupValidator.decorator.js.map +1 -1
  22. package/es2020/forms/src/misc/formModel/interfaces/modelDecoratorMetadata.js.map +1 -1
  23. package/es2020/forms/src/misc/formModel/misc/utils.js +8 -5
  24. package/es2020/forms/src/misc/formModel/misc/utils.js.map +1 -1
  25. package/es2020/forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.js +9 -5
  26. package/es2020/forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.js.map +1 -1
  27. package/es2020/forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.js.map +1 -1
  28. package/es2020/forms/src/services/validationErrorRenderer/validationErrorRenderer.service.js +3 -13
  29. package/es2020/forms/src/services/validationErrorRenderer/validationErrorRenderer.service.js.map +1 -1
  30. package/forms/src/directives/hasError/hasError.directive.d.ts +0 -1
  31. package/forms/src/directives/hasError/hasError.directive.d.ts.map +1 -1
  32. package/forms/src/misc/formModel/interfaces/modelDecoratorMetadata.d.ts +6 -1
  33. package/forms/src/misc/formModel/interfaces/modelDecoratorMetadata.d.ts.map +1 -1
  34. package/forms/src/misc/formModel/misc/utils.d.ts.map +1 -1
  35. package/forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.d.ts +2 -6
  36. package/forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.d.ts.map +1 -1
  37. package/forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.d.ts +1 -2
  38. package/forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.d.ts.map +1 -1
  39. package/forms/src/services/validationErrorRenderer/validationErrorRenderer.service.d.ts +1 -1
  40. package/forms/src/services/validationErrorRenderer/validationErrorRenderer.service.d.ts.map +1 -1
  41. package/package.json +1 -1
  42. package/version.bak +1 -1
package/changelog.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## Version 12.0.0 (2022-04-13)
4
+
5
+ ### Bug Fixes
6
+
7
+ - *subpackage* `@anglr/common/forms`
8
+ - fixed double error displaying for validations, when submit clicked
9
+ - fixed `FormGroupValidator` and `FormGroupAsyncValidator`, now works correctly
10
+ - fixed `buildFormGroup` function, now correctly applies form group validators
11
+
12
+ ### Features
13
+
14
+ - *subpackage* `@anglr/common/forms`
15
+ - **Form Model Builder**
16
+ - updated `ModelDecoratorMetadata`
17
+ - property `ɵArgs` object storing additional arguments for customization
18
+
19
+ ### BREAKING CHANGES
20
+
21
+ - `ValidationErrorRenderer` interface
22
+ - `update` method, has now only one parameter
23
+ - `ValidationErrorRendererFactory` service
24
+ - now implements updated `ValidationErrorRenderer`
25
+ - `ErrorMessagesExtractor` service
26
+ - changed constructor parameters
27
+
3
28
  ## Version 11.3.1 (2022-04-13)
4
29
 
5
30
  ### Bug Fixes
@@ -65,7 +65,7 @@ export class HasErrorDirective {
65
65
  this._subscriptions.add(this.control.statusChanges.subscribe(() => this._updateStatus()));
66
66
  this._updateStatus();
67
67
  if (this._submittedSvc) {
68
- this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus(true))));
68
+ this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus())));
69
69
  }
70
70
  }
71
71
  //######################### public methods - implementation of OnDestroy #########################
@@ -82,11 +82,10 @@ export class HasErrorDirective {
82
82
  //######################### private methods #########################
83
83
  /**
84
84
  * Updates status of control and css classes
85
- * @param onlyShow - Indication that update performs only displaying of existing errors
86
85
  */
87
- _updateStatus(onlyShow) {
86
+ _updateStatus() {
88
87
  this._previousDirty = this.control.dirty;
89
- this._hasErrors = this.renderer.update(this.errorMessages, onlyShow);
88
+ this._hasErrors = this.renderer.update(this.errorMessages);
90
89
  this._toggleGroupHasError();
91
90
  }
92
91
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hasError.directive.js","sourceRoot":"","sources":["../../../../../forms/src/directives/hasError/hasError.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {Directive, ElementRef, Optional, SkipSelf, OnInit, OnDestroy, Inject, Input, Injector} from '@angular/core';\nimport {FormControlDirective, FormControlName, FormControl, NgModel} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {generateId, BindThis, StringDictionary} from '@jscrpt/common';\nimport {Subscription} from 'rxjs';\n\nimport {ValidationErrorRendererFactory} from '../../services/validationErrorRenderer/validationErrorRenderer.service';\nimport {ValidationErrorRenderer} from '../../services/validationErrorRenderer/validationErrorRenderer.interface';\nimport {SubmittedService} from '../../services/submitted/submitted.service';\nimport {GroupHasErrorDirective} from '../groupHasError/groupHasError.directive';\n\n//TODO - add support for setting renderer factory options using input\n\n/**\n * Directive that is attached to control element and handles css classes that are added to this element\n */\n@Directive(\n{\n selector: '[hasError]'\n})\nexport class HasErrorDirective implements OnInit, OnDestroy\n{\n //######################### private fields #########################\n\n /**\n * Subscriptions that are destroyed with destruction of this directive\n */\n private _subscriptions: Subscription = new Subscription();\n\n /**\n * Unique generated id of control\n */\n private _id: string = generateId(10);\n\n /**\n * Last value of control pristine attribute\n */\n private _previousDirty: boolean = false;\n\n /**\n * Indication whether currently are any errors rendered\n */\n private _hasErrors: boolean = false;\n\n /**\n * Mutation observer used for observing changes on class of element\n */\n private _observer: MutationObserver;\n\n //######################### private properties #########################\n\n /**\n * Gets control which was assigned to this element\n */\n private get control(): FormControl\n {\n return this._formControl?.control || this._formControlName?.control || this._ngModel?.control;\n }\n\n //######################### public properties #########################\n\n /**\n * Instance of validation error renderer\n */\n public renderer: ValidationErrorRenderer;\n\n //######################### public propeties - inputs #########################\n\n /**\n * Customized error messages\n */\n @Input()\n public errorMessages: StringDictionary;\n\n //######################### constructor #########################\n constructor(private _element: ElementRef<HTMLElement>,\n private _rendererFactory: ValidationErrorRendererFactory,\n @Optional() @SkipSelf() private _groupHasError: GroupHasErrorDirective,\n @Optional() private _formControl: FormControlDirective,\n @Optional() private _formControlName: FormControlName,\n @Optional() private _ngModel: NgModel,\n @Optional() private _submittedSvc: SubmittedService,\n @Inject(STRING_LOCALIZATION) protected _stringLocalization: StringLocalization,\n protected _injector: Injector)\n {\n }\n\n //######################### public methods - implementation of OnInit #########################\n \n /**\n * Initialize component\n */\n public ngOnInit(): void\n {\n this._registerMutationObserver();\n\n this.renderer = this._rendererFactory.create(this.control,\n this._element.nativeElement,\n this._injector,\n this._isSubmittedOrDirty,\n {\n });\n\n this._subscriptions.add(this._stringLocalization.textsChange.subscribe(() => this._updateStatus()));\n this._subscriptions.add(this.control.statusChanges.subscribe(() => this._updateStatus()));\n\n this._updateStatus();\n\n if(this._submittedSvc)\n {\n this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus(true))));\n }\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n \n /**\n * Called when component is destroyed\n */\n public ngOnDestroy(): void\n {\n this._subscriptions.unsubscribe();\n\n this._groupHasError?.unregisterControl(this._id);\n this._observer?.disconnect();\n this.renderer?.destroy();\n }\n\n //######################### private methods #########################\n\n /**\n * Updates status of control and css classes\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n private _updateStatus(onlyShow?: boolean): void\n {\n this._previousDirty = this.control.dirty;\n this._hasErrors = this.renderer.update(this.errorMessages, onlyShow);\n this._toggleGroupHasError();\n }\n\n /**\n * Toggles registration of control in parent group\n */\n private _toggleGroupHasError(): void\n {\n if(this._groupHasError)\n {\n this._isSubmittedOrDirty(() => this._groupHasError.registerControl(this._id),\n () => this._groupHasError.unregisterControl(this._id),\n this._hasErrors);\n }\n }\n\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n @BindThis\n private _isSubmittedOrDirty(action: () => void, falseAction: () => void = () => {}, additionalCondition: boolean = true): void\n {\n //submitted form or dirty control\n if((this._submittedSvc?.submitted ||\n this.control?.dirty) &&\n additionalCondition)\n {\n action();\n }\n else\n {\n falseAction();\n }\n }\n\n /**\n * Registers mutation observer which watch for changes of class list\n */\n private _registerMutationObserver(): void\n {\n this._observer = new MutationObserver(() =>\n {\n if(this.control.dirty != this._previousDirty)\n {\n this._updateStatus();\n }\n });\n\n this._observer.observe(this._element.nativeElement, \n {\n attributeFilter: ['class'],\n attributes: true\n });\n }\n}"]}
1
+ {"version":3,"file":"hasError.directive.js","sourceRoot":"","sources":["../../../../../forms/src/directives/hasError/hasError.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {Directive, ElementRef, Optional, SkipSelf, OnInit, OnDestroy, Inject, Input, Injector} from '@angular/core';\nimport {FormControlDirective, FormControlName, FormControl, NgModel} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {generateId, BindThis, StringDictionary} from '@jscrpt/common';\nimport {Subscription} from 'rxjs';\n\nimport {ValidationErrorRendererFactory} from '../../services/validationErrorRenderer/validationErrorRenderer.service';\nimport {ValidationErrorRenderer} from '../../services/validationErrorRenderer/validationErrorRenderer.interface';\nimport {SubmittedService} from '../../services/submitted/submitted.service';\nimport {GroupHasErrorDirective} from '../groupHasError/groupHasError.directive';\n\n//TODO - add support for setting renderer factory options using input\n\n/**\n * Directive that is attached to control element and handles css classes that are added to this element\n */\n@Directive(\n{\n selector: '[hasError]'\n})\nexport class HasErrorDirective implements OnInit, OnDestroy\n{\n //######################### private fields #########################\n\n /**\n * Subscriptions that are destroyed with destruction of this directive\n */\n private _subscriptions: Subscription = new Subscription();\n\n /**\n * Unique generated id of control\n */\n private _id: string = generateId(10);\n\n /**\n * Last value of control pristine attribute\n */\n private _previousDirty: boolean = false;\n\n /**\n * Indication whether currently are any errors rendered\n */\n private _hasErrors: boolean = false;\n\n /**\n * Mutation observer used for observing changes on class of element\n */\n private _observer: MutationObserver;\n\n //######################### private properties #########################\n\n /**\n * Gets control which was assigned to this element\n */\n private get control(): FormControl\n {\n return this._formControl?.control || this._formControlName?.control || this._ngModel?.control;\n }\n\n //######################### public properties #########################\n\n /**\n * Instance of validation error renderer\n */\n public renderer: ValidationErrorRenderer;\n\n //######################### public propeties - inputs #########################\n\n /**\n * Customized error messages\n */\n @Input()\n public errorMessages: StringDictionary;\n\n //######################### constructor #########################\n constructor(private _element: ElementRef<HTMLElement>,\n private _rendererFactory: ValidationErrorRendererFactory,\n @Optional() @SkipSelf() private _groupHasError: GroupHasErrorDirective,\n @Optional() private _formControl: FormControlDirective,\n @Optional() private _formControlName: FormControlName,\n @Optional() private _ngModel: NgModel,\n @Optional() private _submittedSvc: SubmittedService,\n @Inject(STRING_LOCALIZATION) protected _stringLocalization: StringLocalization,\n protected _injector: Injector)\n {\n }\n\n //######################### public methods - implementation of OnInit #########################\n \n /**\n * Initialize component\n */\n public ngOnInit(): void\n {\n this._registerMutationObserver();\n\n this.renderer = this._rendererFactory.create(this.control,\n this._element.nativeElement,\n this._injector,\n this._isSubmittedOrDirty,\n {\n });\n\n this._subscriptions.add(this._stringLocalization.textsChange.subscribe(() => this._updateStatus()));\n this._subscriptions.add(this.control.statusChanges.subscribe(() => this._updateStatus()));\n\n this._updateStatus();\n\n if(this._submittedSvc)\n {\n this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus())));\n }\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n \n /**\n * Called when component is destroyed\n */\n public ngOnDestroy(): void\n {\n this._subscriptions.unsubscribe();\n\n this._groupHasError?.unregisterControl(this._id);\n this._observer?.disconnect();\n this.renderer?.destroy();\n }\n\n //######################### private methods #########################\n\n /**\n * Updates status of control and css classes\n */\n private _updateStatus(): void\n {\n this._previousDirty = this.control.dirty;\n this._hasErrors = this.renderer.update(this.errorMessages);\n this._toggleGroupHasError();\n }\n\n /**\n * Toggles registration of control in parent group\n */\n private _toggleGroupHasError(): void\n {\n if(this._groupHasError)\n {\n this._isSubmittedOrDirty(() => this._groupHasError.registerControl(this._id),\n () => this._groupHasError.unregisterControl(this._id),\n this._hasErrors);\n }\n }\n\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n @BindThis\n private _isSubmittedOrDirty(action: () => void, falseAction: () => void = () => {}, additionalCondition: boolean = true): void\n {\n //submitted form or dirty control\n if((this._submittedSvc?.submitted ||\n this.control?.dirty) &&\n additionalCondition)\n {\n action();\n }\n else\n {\n falseAction();\n }\n }\n\n /**\n * Registers mutation observer which watch for changes of class list\n */\n private _registerMutationObserver(): void\n {\n this._observer = new MutationObserver(() =>\n {\n if(this.control.dirty != this._previousDirty)\n {\n this._updateStatus();\n }\n });\n\n this._observer.observe(this._element.nativeElement, \n {\n attributeFilter: ['class'],\n attributes: true\n });\n }\n}"]}
@@ -8,7 +8,7 @@ export function FormGroupAsyncValidator(validator) {
8
8
  return function (target) {
9
9
  const metadata = target.prototype;
10
10
  if (!metadata.ɵAsyncValidators) {
11
- Object.defineProperty(target, nameof('ɵAsyncValidators'), {
11
+ Object.defineProperty(metadata, nameof('ɵAsyncValidators'), {
12
12
  value: [],
13
13
  writable: false,
14
14
  enumerable: false,
@@ -1 +1 @@
1
- {"version":3,"file":"formGroupAsyncValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAmD;IAEvF,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,gBAAgB,EAC7B;YACI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAyB,kBAAkB,CAAC,EAChF;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {AsyncValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {AsyncValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers async validator for whole FormGroup\n * @param validator - Instance of async validator or async validator factory\n */\nexport function FormGroupAsyncValidator(validator: AsyncValidatorFn|AsyncValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵAsyncValidators)\n {\n Object.defineProperty(target, nameof<ModelDecoratorMetadata>('ɵAsyncValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵAsyncValidators.push(validator);\n\n return target;\n };\n}"]}
1
+ {"version":3,"file":"formGroupAsyncValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAmD;IAEvF,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,gBAAgB,EAC7B;YACI,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAyB,kBAAkB,CAAC,EAClF;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {AsyncValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {AsyncValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers async validator for whole FormGroup\n * @param validator - Instance of async validator or async validator factory\n */\nexport function FormGroupAsyncValidator(validator: AsyncValidatorFn|AsyncValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵAsyncValidators)\n {\n Object.defineProperty(metadata, nameof<ModelDecoratorMetadata>('ɵAsyncValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵAsyncValidators.push(validator);\n\n return target;\n };\n}"]}
@@ -8,7 +8,7 @@ export function FormGroupValidator(validator) {
8
8
  return function (target) {
9
9
  const metadata = target.prototype;
10
10
  if (!metadata.ɵValidators) {
11
- Object.defineProperty(target, nameof('ɵValidators'), {
11
+ Object.defineProperty(metadata, nameof('ɵValidators'), {
12
12
  value: [],
13
13
  writable: false,
14
14
  enumerable: false,
@@ -1 +1 @@
1
- {"version":3,"file":"formGroupValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAyC;IAExE,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,WAAW,EACxB;YACI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAyB,aAAa,CAAC,EAC3E;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {ValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers validator for whole FormGroup\n * @param validator - Instance of validator or validator factory\n */\nexport function FormGroupValidator(validator: ValidatorFn|ValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵValidators)\n {\n Object.defineProperty(target, nameof<ModelDecoratorMetadata>('ɵValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵValidators.push(validator);\n\n return target;\n };\n}"]}
1
+ {"version":3,"file":"formGroupValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAyC;IAExE,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,WAAW,EACxB;YACI,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAyB,aAAa,CAAC,EAC7E;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {ValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers validator for whole FormGroup\n * @param validator - Instance of validator or validator factory\n */\nexport function FormGroupValidator(validator: ValidatorFn|ValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵValidators)\n {\n Object.defineProperty(metadata, nameof<ModelDecoratorMetadata>('ɵValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵValidators.push(validator);\n\n return target;\n };\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"modelDecoratorMetadata.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/interfaces/modelDecoratorMetadata.ts"],"names":[],"mappings":"","sourcesContent":["import {AsyncValidatorFn, ValidatorFn} from '@angular/forms';\n\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from '../misc/validatorFactories';\nimport {ModelPropertyDecoratorMetadata} from './modelPropertyDecoratorMetadata';\n\n/**\n * Metadata describing whole model\n */\nexport interface ModelDecoratorMetadata<TModel = any>\n{\n /**\n * Array of controls metadata\n */\n ɵControlsMetadata: Partial<Record<keyof TModel, ModelPropertyDecoratorMetadata>>;\n\n /**\n * Array of validator functions\n */\n ɵValidators?: Array<ValidatorFn|ValidatorFnFactory>;\n\n /**\n * Array of async validator functions\n */\n ɵAsyncValidators?: Array<AsyncValidatorFn|AsyncValidatorFnFactory>;\n}\n"]}
1
+ {"version":3,"file":"modelDecoratorMetadata.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/interfaces/modelDecoratorMetadata.ts"],"names":[],"mappings":"","sourcesContent":["import {AsyncValidatorFn, ValidatorFn} from '@angular/forms';\nimport {Dictionary} from '@jscrpt/common';\n\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from '../misc/validatorFactories';\nimport {ModelPropertyDecoratorMetadata} from './modelPropertyDecoratorMetadata';\n\n/**\n * Metadata describing whole model\n */\nexport interface ModelDecoratorMetadata<TModel = any, TArgs extends Dictionary<any> = any>\n{\n /**\n * Array of controls metadata\n */\n ɵControlsMetadata: Partial<Record<keyof TModel, ModelPropertyDecoratorMetadata>>;\n\n /**\n * Array of validator functions\n */\n ɵValidators?: Array<ValidatorFn|ValidatorFnFactory>;\n\n /**\n * Array of async validator functions\n */\n ɵAsyncValidators?: Array<AsyncValidatorFn|AsyncValidatorFnFactory>;\n\n /**\n * Object storing additional arguments for customization\n */\n ɵArgs?: TArgs;\n}\n"]}
@@ -8,18 +8,21 @@ import { AsyncValidatorFnFactory, ValidatorFnFactory } from './validatorFactorie
8
8
  * @returns
9
9
  */
10
10
  function buildFormGroup(model, args) {
11
- var _a, _b, _c, _d;
11
+ var _a, _b, _c, _d, _e;
12
12
  if (!model) {
13
- return new FormGroup({}, {
14
- validators: (_a = model.ɵValidators) === null || _a === void 0 ? void 0 : _a.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm),
15
- asyncValidators: (_b = model.ɵAsyncValidators) === null || _b === void 0 ? void 0 : _b.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm)
16
- });
13
+ return new FormGroup({});
17
14
  }
18
- const modelMetadata = (_c = model.ɵControlsMetadata) !== null && _c !== void 0 ? _c : {};
15
+ const modelMetadata = (_a = model.ɵControlsMetadata) !== null && _a !== void 0 ? _a : {};
16
+ const groupValidators = (_b = model.ɵValidators) !== null && _b !== void 0 ? _b : [];
17
+ const groupAsyncValidators = (_c = model.ɵAsyncValidators) !== null && _c !== void 0 ? _c : [];
18
+ const groupArgs = (_d = model.ɵArgs) !== null && _d !== void 0 ? _d : {};
19
19
  const properties = Object.keys(model);
20
- const formGroup = new FormGroup({});
20
+ const formGroup = new FormGroup({}, {
21
+ validators: groupValidators === null || groupValidators === void 0 ? void 0 : groupValidators.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()(Object.assign(Object.assign({}, groupArgs), args)) : validator).filter(itm => !!itm),
22
+ asyncValidators: groupAsyncValidators === null || groupAsyncValidators === void 0 ? void 0 : groupAsyncValidators.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()(Object.assign(Object.assign({}, groupArgs), args)) : validator).filter(itm => !!itm)
23
+ });
21
24
  for (const propertyName of properties) {
22
- const metadata = (_d = modelMetadata[propertyName]) !== null && _d !== void 0 ? _d : ɵDefaultPropertyMetadata;
25
+ const metadata = (_e = modelMetadata[propertyName]) !== null && _e !== void 0 ? _e : ɵDefaultPropertyMetadata;
23
26
  const defaultValue = model[propertyName];
24
27
  //Skip control creation if value is undefined
25
28
  if (defaultValue === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/misc/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms';\nimport {Dictionary} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ModelPropertyDecoratorMetadata} from '../interfaces/modelPropertyDecoratorMetadata';\nimport {ɵDefaultPropertyMetadata} from './defaults';\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from './validatorFactories';\n\n/**\n * Builds form group from decorated model\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nfunction buildFormGroup<TModel, TArgs = Record<string, never>>(model: ModelDecoratorMetadata<TModel> & Dictionary<any>, args?: TArgs): FormGroup\n{\n if(!model)\n {\n return new FormGroup({},\n {\n validators: model.ɵValidators?.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm),\n asyncValidators: model.ɵAsyncValidators?.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm)\n });\n }\n\n const modelMetadata: Dictionary<any> = model.ɵControlsMetadata ?? {};\n const properties = Object.keys(model);\n const formGroup: FormGroup = new FormGroup({});\n\n for(const propertyName of properties)\n {\n const metadata: ModelPropertyDecoratorMetadata = modelMetadata[propertyName] ?? ɵDefaultPropertyMetadata;\n const defaultValue = model[propertyName];\n\n //Skip control creation if value is undefined\n if(defaultValue === undefined)\n {\n continue;\n }\n\n const validators = metadata.validators.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n const asyncValidators = metadata.asyncValidators.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n\n let control: AbstractControl;\n\n switch(metadata.type)\n {\n case FormGroup:\n {\n control = buildFormGroup(defaultValue, args);\n\n //TODO: think of setting metadata from property to model\n\n break;\n }\n case FormArray:\n {\n //TODO - enhance FormArray child definition and finish it\n control = new FormArray([],\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n if(defaultValue && Array.isArray(defaultValue))\n {\n const formArray = control as FormArray;\n\n for(const val of defaultValue)\n {\n switch(metadata.childType)\n {\n case FormGroup:\n {\n formArray.push(buildFormGroup(val, args));\n\n break;\n }\n case FormArray:\n {\n break;\n }\n default:\n //case FormControl:\n {\n formArray.push(new FormControl(val,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n }));\n\n break;\n }\n }\n }\n }\n\n break;\n }\n default:\n //case FormControl:\n {\n control = new FormControl(defaultValue,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n break;\n }\n }\n\n if(metadata.disabled)\n {\n control.disable();\n }\n\n formGroup.addControl(propertyName, control);\n }\n\n return formGroup;\n}\n\n/**\n * Builds form from decorated model, only for properties with non `undefined` value\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nexport function buildFormModel<TModel, TArgs = Record<string, never>>(model: TModel, args?: TArgs): FormGroup\n{\n return buildFormGroup(model as any, args);\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/misc/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms';\nimport {Dictionary} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ModelPropertyDecoratorMetadata} from '../interfaces/modelPropertyDecoratorMetadata';\nimport {ɵDefaultPropertyMetadata} from './defaults';\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from './validatorFactories';\n\n/**\n * Builds form group from decorated model\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nfunction buildFormGroup<TModel, TArgs = Record<string, never>>(model: ModelDecoratorMetadata<TModel> & Dictionary<any>, args?: TArgs): FormGroup\n{\n if(!model)\n {\n return new FormGroup({});\n }\n\n const modelMetadata: Dictionary<any> = model.ɵControlsMetadata ?? {};\n const groupValidators = model.ɵValidators ?? [];\n const groupAsyncValidators = model.ɵAsyncValidators ?? [];\n const groupArgs: Dictionary<any> = model.ɵArgs ?? {};\n const properties = Object.keys(model);\n const formGroup: FormGroup = new FormGroup({},\n {\n validators: groupValidators?.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({...groupArgs, ...args}) : validator).filter(itm => !!itm),\n asyncValidators: groupAsyncValidators?.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({...groupArgs, ...args}) : validator).filter(itm => !!itm)\n });\n\n for(const propertyName of properties)\n {\n const metadata: ModelPropertyDecoratorMetadata = modelMetadata[propertyName] ?? ɵDefaultPropertyMetadata;\n const defaultValue = model[propertyName];\n\n //Skip control creation if value is undefined\n if(defaultValue === undefined)\n {\n continue;\n }\n\n const validators = metadata.validators.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n const asyncValidators = metadata.asyncValidators.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n\n let control: AbstractControl;\n\n switch(metadata.type)\n {\n case FormGroup:\n {\n control = buildFormGroup(defaultValue, args);\n\n //TODO: think of setting metadata from property to model\n\n break;\n }\n case FormArray:\n {\n //TODO - enhance FormArray child definition and finish it\n control = new FormArray([],\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n if(defaultValue && Array.isArray(defaultValue))\n {\n const formArray = control as FormArray;\n\n for(const val of defaultValue)\n {\n switch(metadata.childType)\n {\n case FormGroup:\n {\n formArray.push(buildFormGroup(val, args));\n\n break;\n }\n case FormArray:\n {\n break;\n }\n default:\n //case FormControl:\n {\n formArray.push(new FormControl(val,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n }));\n\n break;\n }\n }\n }\n }\n\n break;\n }\n default:\n //case FormControl:\n {\n control = new FormControl(defaultValue,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n break;\n }\n }\n\n if(metadata.disabled)\n {\n control.disable();\n }\n\n formGroup.addControl(propertyName, control);\n }\n\n return formGroup;\n}\n\n/**\n * Builds form from decorated model, only for properties with non `undefined` value\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nexport function buildFormModel<TModel, TArgs = Record<string, never>>(model: TModel, args?: TArgs): FormGroup\n{\n return buildFormGroup(model as any, args);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Injectable, Inject, Optional, Injector } from '@angular/core';
1
+ import { Injectable, Inject, Optional } from '@angular/core';
2
2
  import { STRING_LOCALIZATION } from '@anglr/common';
3
3
  import { extend, isString } from '@jscrpt/common';
4
4
  import { VALIDATION_ERROR_MESSAGES } from '../../misc/types';
@@ -15,14 +15,15 @@ const defaultErrorMessages = {
15
15
  minlength: 'Value is short.',
16
16
  maxlength: 'Value is too long.'
17
17
  };
18
+ //TODO: support exceptions for error names, allow to have string value to be used as error from error
18
19
  /**
19
20
  * Service used for extracting error messages from form control
20
21
  */
21
22
  export class ErrorMessagesExtractor {
22
23
  //######################### constructor #########################
23
- constructor(injector, globalErrorMessages) {
24
+ constructor(_stringLocalization, globalErrorMessages) {
25
+ this._stringLocalization = _stringLocalization;
24
26
  this._errorMessages = extend(true, {}, defaultErrorMessages, globalErrorMessages);
25
- this._stringLocalization = injector.get(STRING_LOCALIZATION);
26
27
  }
27
28
  //######################### public methods #########################
28
29
  /**
@@ -58,12 +59,15 @@ export class ErrorMessagesExtractor {
58
59
  return result;
59
60
  }
60
61
  }
61
- ErrorMessagesExtractor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, deps: [{ token: i0.Injector }, { token: VALIDATION_ERROR_MESSAGES, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
62
+ ErrorMessagesExtractor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, deps: [{ token: STRING_LOCALIZATION }, { token: VALIDATION_ERROR_MESSAGES, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
62
63
  ErrorMessagesExtractor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, providedIn: 'root' });
63
64
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, decorators: [{
64
65
  type: Injectable,
65
66
  args: [{ providedIn: 'root' }]
66
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined, decorators: [{
67
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
68
+ type: Inject,
69
+ args: [STRING_LOCALIZATION]
70
+ }] }, { type: undefined, decorators: [{
67
71
  type: Inject,
68
72
  args: [VALIDATION_ERROR_MESSAGES]
69
73
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"errorMessagesExtractor.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAErE,OAAO,EAAqB,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACtE,OAAO,EAAmB,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAC,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;;AAG3D;;GAEG;AACH,MAAM,oBAAoB,GAC1B;IACI,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,iBAAiB;IAC5B,SAAS,EAAE,oBAAoB;CAClC,CAAC;AAEF;;GAEG;AAEH,MAAM,OAAO,sBAAsB;IAc/B,iEAAiE;IACjE,YAAY,QAAkB,EAC6B,mBAAsC;QAE7F,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QAClF,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjE,CAAC;IAED,oEAAoE;IAEpE;;;;OAIG;IACI,SAAS,CAAC,OAAoB,EAAE,QAA2B;QAE9D,MAAM,aAAa,GAAqB,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAExF,yBAAyB;QACzB,IAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAC9B;YACI,OAAO,IAAI,CAAC;SACf;QAED,MAAM,MAAM,GACZ;YACI,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,aAAa,EAAE,EAAE;SACpB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,oCAAoC;YACpC,IAAG,aAAa,CAAC,KAAK,CAAC,EACvB;gBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACjG;YACD,0EAA0E;iBACrE,IAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAChC;gBACI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBAEzB,IAAG,QAAQ,CAAC,QAAQ,CAAC,EACrB;wBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;qBACrF;gBACL,CAAC,CAAC,CAAC;aACN;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;;mHApEQ,sBAAsB,0CAgBX,yBAAyB;uHAhBpC,sBAAsB,cADV,MAAM;2FAClB,sBAAsB;kBADlC,UAAU;mBAAC,EAAC,UAAU,EAAE,MAAM,EAAC;;0BAiBf,MAAM;2BAAC,yBAAyB;;0BAAG,QAAQ","sourcesContent":["import {Injectable, Inject, Optional, Injector} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {StringDictionary, extend, isString} from '@jscrpt/common';\n\nimport {VALIDATION_ERROR_MESSAGES} from '../../misc/types';\nimport {ValidationErrorsResult} from './errorMessagesExtractor.interface';\n\n/**\n * Default error messages displayed\n */\nconst defaultErrorMessages: StringDictionary =\n{\n required: 'Field is required.',\n number: 'Value must be number.',\n pattern: 'Value is not valid.',\n minValue: 'Value is too small.',\n maxValue: 'Value is too big.',\n minlength: 'Value is short.',\n maxlength: 'Value is too long.'\n};\n\n/**\n * Service used for extracting error messages from form control\n */\n@Injectable({providedIn: 'root'})\nexport class ErrorMessagesExtractor\n{\n //######################### protected fields #########################\n\n /**\n * Dictionary with error names that have defined message\n */\n protected _errorMessages: StringDictionary;\n\n /**\n * String localization service\n */\n protected _stringLocalization: StringLocalization;\n\n //######################### constructor #########################\n constructor(injector: Injector,\n @Inject(VALIDATION_ERROR_MESSAGES) @Optional() globalErrorMessages?: StringDictionary)\n {\n this._errorMessages = extend(true, {}, defaultErrorMessages, globalErrorMessages);\n this._stringLocalization = injector.get(STRING_LOCALIZATION);\n }\n\n //######################### public methods #########################\n\n /**\n * Gets validation errors result for provided control, or null of no errors are present\n * @param control - Form control instance that should be inspected for errors\n * @param messages - Object containing error messages that should patch existing error messages\n */\n public getErrors(control: FormControl, messages?: StringDictionary): ValidationErrorsResult\n {\n const errorMessages: StringDictionary = extend(true, {}, this._errorMessages, messages);\n\n //no control or no errors\n if(!control || !control.errors)\n {\n return null;\n }\n\n const result: ValidationErrorsResult =\n {\n errors: Object.keys(control.errors),\n errorMessages: []\n };\n\n result.errors.forEach(error =>\n {\n const errorData = control.errors[error];\n \n //error message is present for error\n if(errorMessages[error])\n {\n result.errorMessages.push(this._stringLocalization.get(errorMessages[error], control.errors));\n }\n //error data are array of strings, each string is considered error message\n else if(Array.isArray(errorData))\n {\n errorData.forEach(errorItm =>\n {\n if(isString(errorItm))\n {\n result.errorMessages.push(this._stringLocalization.get(errorItm, control.errors));\n }\n });\n }\n });\n\n return result;\n }\n}"]}
1
+ {"version":3,"file":"errorMessagesExtractor.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAqB,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACtE,OAAO,EAAmB,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAC,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;;AAG3D;;GAEG;AACH,MAAM,oBAAoB,GAC1B;IACI,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,iBAAiB;IAC5B,SAAS,EAAE,oBAAoB;CAClC,CAAC;AAEF,qGAAqG;AAErG;;GAEG;AAEH,MAAM,OAAO,sBAAsB;IAS/B,iEAAiE;IACjE,YAAmD,mBAAuC,EAC/B,mBAAsC;QAD9C,wBAAmB,GAAnB,mBAAmB,CAAoB;QAGtF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACtF,CAAC;IAED,oEAAoE;IAEpE;;;;OAIG;IACI,SAAS,CAAC,OAAoB,EAAE,QAA2B;QAE9D,MAAM,aAAa,GAAqB,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAExF,yBAAyB;QACzB,IAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAC9B;YACI,OAAO,IAAI,CAAC;SACf;QAED,MAAM,MAAM,GACZ;YACI,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,aAAa,EAAE,EAAE;SACpB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,oCAAoC;YACpC,IAAG,aAAa,CAAC,KAAK,CAAC,EACvB;gBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACjG;YACD,0EAA0E;iBACrE,IAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAChC;gBACI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBAEzB,IAAG,QAAQ,CAAC,QAAQ,CAAC,EACrB;wBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;qBACrF;gBACL,CAAC,CAAC,CAAC;aACN;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;;mHA9DQ,sBAAsB,kBAUX,mBAAmB,aACnB,yBAAyB;uHAXpC,sBAAsB,cADV,MAAM;2FAClB,sBAAsB;kBADlC,UAAU;mBAAC,EAAC,UAAU,EAAE,MAAM,EAAC;;0BAWf,MAAM;2BAAC,mBAAmB;;0BAC1B,MAAM;2BAAC,yBAAyB;;0BAAG,QAAQ","sourcesContent":["import {Injectable, Inject, Optional} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {StringDictionary, extend, isString} from '@jscrpt/common';\n\nimport {VALIDATION_ERROR_MESSAGES} from '../../misc/types';\nimport {ValidationErrorsResult} from './errorMessagesExtractor.interface';\n\n/**\n * Default error messages displayed\n */\nconst defaultErrorMessages: StringDictionary =\n{\n required: 'Field is required.',\n number: 'Value must be number.',\n pattern: 'Value is not valid.',\n minValue: 'Value is too small.',\n maxValue: 'Value is too big.',\n minlength: 'Value is short.',\n maxlength: 'Value is too long.'\n};\n\n//TODO: support exceptions for error names, allow to have string value to be used as error from error\n\n/**\n * Service used for extracting error messages from form control\n */\n@Injectable({providedIn: 'root'})\nexport class ErrorMessagesExtractor\n{\n //######################### protected fields #########################\n\n /**\n * Dictionary with error names that have defined message\n */\n protected _errorMessages: StringDictionary;\n\n //######################### constructor #########################\n constructor(@Inject(STRING_LOCALIZATION) protected _stringLocalization: StringLocalization,\n @Inject(VALIDATION_ERROR_MESSAGES) @Optional() globalErrorMessages?: StringDictionary)\n {\n this._errorMessages = extend(true, {}, defaultErrorMessages, globalErrorMessages);\n }\n\n //######################### public methods #########################\n\n /**\n * Gets validation errors result for provided control, or null of no errors are present\n * @param control - Form control instance that should be inspected for errors\n * @param messages - Object containing error messages that should patch existing error messages\n */\n public getErrors(control: FormControl, messages?: StringDictionary): ValidationErrorsResult\n {\n const errorMessages: StringDictionary = extend(true, {}, this._errorMessages, messages);\n\n //no control or no errors\n if(!control || !control.errors)\n {\n return null;\n }\n\n const result: ValidationErrorsResult =\n {\n errors: Object.keys(control.errors),\n errorMessages: []\n };\n\n result.errors.forEach(error =>\n {\n const errorData = control.errors[error];\n \n //error message is present for error\n if(errorMessages[error])\n {\n result.errorMessages.push(this._stringLocalization.get(errorMessages[error], control.errors));\n }\n //error data are array of strings, each string is considered error message\n else if(Array.isArray(errorData))\n {\n errorData.forEach(errorItm =>\n {\n if(isString(errorItm))\n {\n result.errorMessages.push(this._stringLocalization.get(errorItm, control.errors));\n }\n });\n }\n });\n\n return result;\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validationErrorRenderer.interface.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {Type, TemplateRef, Injector} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Describes function that is used for performing actions when form is submitted or dirty\n */\nexport interface IsSubmittedOrDirtyFunc\n{\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n (action: () => void, falseAction?: () => void, additionalCondition?: boolean): void;\n}\n\n/**\n * Component that is used for rendering validation errors\n */\nexport interface ValidationErrorsComponent\n{\n /**\n * Shows validation errors in component\n * @param errors - Errors to be shown, or null if to be hidden\n */\n show(errors: ValidationErrorsResult): void;\n}\n\n/**\n * Context passed to template that is used for rendering validation errors\n */\nexport interface ValidationErrorsTemplateContext\n{\n /**\n * Errors to be shown\n */\n $implicit: ValidationErrorsResult;\n}\n\n/**\n * Options for ValidationErrorRenderer\n */\nexport interface ValidationErrorsRendererOptions\n{\n /**\n * Prefix of css classes applied to element\n */\n prefix?: string;\n\n /**\n * Suffix of css classes applied to element\n */\n suffix?: string;\n\n /**\n * Css class attached to wrapper div\n */\n wrapperDivClass?: string;\n\n /**\n * Component used for rendering validation errors\n */\n component?: Type<ValidationErrorsComponent>;\n\n /**\n * Template used for rendering validation errors\n */\n template?: TemplateRef<ValidationErrorsTemplateContext>;\n}\n\n/**\n * Options for ValidationErrorRendererFactory\n */\nexport interface ValidationErrorRendererFactoryOptions extends ValidationErrorsRendererOptions\n{\n /**\n * Type of ValidationErrorRenderer implementation\n */\n rendererType?: ValidationErrorRendererCtor;\n}\n\n/**\n * Describes type that represents ValidationErrorRenderer\n */\nexport interface ValidationErrorRendererCtor\n{\n /**\n * Creates instance of ValidationErrorRenderer\n * @param errorMessagesExtractor - Instance of service used for extracting errors from control\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param document - Html document instance, used for manipulation with html\n * @param injector - Injector used for obtaining dependencies\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer\n */\n new(errorMessagesExtractor: ErrorMessagesExtractor,\n control: FormControl,\n controlElement: HTMLElement,\n document: Document,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorsRendererOptions): ValidationErrorRenderer;\n}\n\n/**\n * Describes service that is used for rendering validation errors\n */\nexport interface ValidationErrorRenderer\n{\n /**\n * Html element that is wrapping errors\n */\n wrapperElement: HTMLElement;\n\n /**\n * Destroys renderer and everything that was rendered\n */\n destroy(): void;\n \n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n update(errorMessages?: StringDictionary, onlyShow?: boolean): boolean;\n}"]}
1
+ {"version":3,"file":"validationErrorRenderer.interface.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {Type, TemplateRef, Injector} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Describes function that is used for performing actions when form is submitted or dirty\n */\nexport interface IsSubmittedOrDirtyFunc\n{\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n (action: () => void, falseAction?: () => void, additionalCondition?: boolean): void;\n}\n\n/**\n * Component that is used for rendering validation errors\n */\nexport interface ValidationErrorsComponent\n{\n /**\n * Shows validation errors in component\n * @param errors - Errors to be shown, or null if to be hidden\n */\n show(errors: ValidationErrorsResult): void;\n}\n\n/**\n * Context passed to template that is used for rendering validation errors\n */\nexport interface ValidationErrorsTemplateContext\n{\n /**\n * Errors to be shown\n */\n $implicit: ValidationErrorsResult;\n}\n\n/**\n * Options for ValidationErrorRenderer\n */\nexport interface ValidationErrorsRendererOptions\n{\n /**\n * Prefix of css classes applied to element\n */\n prefix?: string;\n\n /**\n * Suffix of css classes applied to element\n */\n suffix?: string;\n\n /**\n * Css class attached to wrapper div\n */\n wrapperDivClass?: string;\n\n /**\n * Component used for rendering validation errors\n */\n component?: Type<ValidationErrorsComponent>;\n\n /**\n * Template used for rendering validation errors\n */\n template?: TemplateRef<ValidationErrorsTemplateContext>;\n}\n\n/**\n * Options for ValidationErrorRendererFactory\n */\nexport interface ValidationErrorRendererFactoryOptions extends ValidationErrorsRendererOptions\n{\n /**\n * Type of ValidationErrorRenderer implementation\n */\n rendererType?: ValidationErrorRendererCtor;\n}\n\n/**\n * Describes type that represents ValidationErrorRenderer\n */\nexport interface ValidationErrorRendererCtor\n{\n /**\n * Creates instance of ValidationErrorRenderer\n * @param errorMessagesExtractor - Instance of service used for extracting errors from control\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param document - Html document instance, used for manipulation with html\n * @param injector - Injector used for obtaining dependencies\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer\n */\n new(errorMessagesExtractor: ErrorMessagesExtractor,\n control: FormControl,\n controlElement: HTMLElement,\n document: Document,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorsRendererOptions): ValidationErrorRenderer;\n}\n\n/**\n * Describes service that is used for rendering validation errors\n */\nexport interface ValidationErrorRenderer\n{\n /**\n * Html element that is wrapping errors\n */\n wrapperElement: HTMLElement;\n\n /**\n * Destroys renderer and everything that was rendered\n */\n destroy(): void;\n \n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n */\n update(errorMessages?: StringDictionary): boolean;\n}"]}
@@ -8,6 +8,7 @@ import * as i1 from "../errorMessagesExtractor/errorMessagesExtractor.service";
8
8
  * Injection token used for injecting global options for ValidationErrorRendererFactory
9
9
  */
10
10
  export const VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS = new InjectionToken('VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS');
11
+ //TODO: div renderer as custom component, wrapper div renderer
11
12
  /**
12
13
  * Service used for creating validation errors renderer
13
14
  */
@@ -79,27 +80,16 @@ export class DefaultValidationErrorRenderer {
79
80
  * @param errorMessages - Object storing error messages to be used as override
80
81
  * @param onlyShow - Indication that update performs only displaying of existing errors
81
82
  */
82
- update(errorMessages, onlyShow = false) {
83
+ update(errorMessages) {
83
84
  let result = false;
84
- if (onlyShow) {
85
- this._isSubmittedOrDirty(() => {
86
- this._show();
87
- this._toggleErrors();
88
- result = true;
89
- }, () => {
90
- this._hide();
91
- result = false;
92
- }, !!this._lastErrors);
93
- return result;
94
- }
95
85
  //hides old errors
96
86
  this._toggleErrors(false);
97
87
  this._lastErrors = this._errorMessagesExtractor.getErrors(this._control, errorMessages);
98
88
  if (this._lastErrors) {
99
89
  this._isSubmittedOrDirty(() => {
100
90
  this._show();
101
- result = true;
102
91
  this._toggleErrors();
92
+ result = true;
103
93
  }, () => {
104
94
  this._hide();
105
95
  result = false;
@@ -1 +1 @@
1
- {"version":3,"file":"validationErrorRenderer.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {Injectable, Inject, InjectionToken, Optional, Injector, ComponentFactoryResolver, ApplicationRef, EmbeddedViewRef, ComponentRef} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {DOCUMENT} from '@angular/common';\nimport {extend, StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorRenderer, IsSubmittedOrDirtyFunc, ValidationErrorsRendererOptions, ValidationErrorRendererFactoryOptions, ValidationErrorsComponent} from './validationErrorRenderer.interface';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Injection token used for injecting global options for ValidationErrorRendererFactory\n */\nexport const VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS: InjectionToken<ValidationErrorRendererFactoryOptions> = new InjectionToken<ValidationErrorRendererFactoryOptions>('VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS');\n\n/**\n * Service used for creating validation errors renderer\n */\n@Injectable({providedIn: 'root'})\nexport class ValidationErrorRendererFactory\n{\n //######################### protected fields #########################\n\n /**\n * Options for validation error renderer factory\n */\n protected _options: ValidationErrorRendererFactoryOptions;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n @Inject(DOCUMENT) protected _document: Document,\n @Optional() @Inject(VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS) options: ValidationErrorRendererFactoryOptions)\n {\n this._options = extend(true, {}, DEFAULT_OPTIONS, options);\n }\n\n //######################### public methods #########################\n\n /**\n * Creates new instance of ValidationErrorRenderer\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer factory\n */\n public create(control: FormControl,\n controlElement: HTMLElement,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorRendererFactoryOptions): ValidationErrorRenderer\n {\n const opts: ValidationErrorRendererFactoryOptions = extend(true, {}, this._options, options);\n\n return new opts.rendererType(this._errorMessagesExtractor,\n control,\n controlElement,\n this._document,\n injector,\n isSubmittedOrDirty,\n opts);\n }\n}\n\n/**\n * Default implementation of validation error renderer\n */\nexport class DefaultValidationErrorRenderer implements ValidationErrorRenderer\n{\n //######################### protected fields #########################\n\n /**\n * Html element attribute storing error messages\n */\n protected _errorMessageAttr: Attr;\n\n /**\n * Object storing last obtained errors\n */\n protected _lastErrors: ValidationErrorsResult;\n\n /**\n * Component used for displaying errors\n */\n protected _component: ComponentRef<ValidationErrorsComponent>;\n\n //######################### public properties - implementation of ValidationErrorRenderer #########################\n\n /**\n * Html element that is wrapping errors\n */\n public wrapperElement: HTMLElement;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n protected _control: FormControl,\n protected _controlElement: HTMLElement,\n protected _document: Document,\n protected _injector: Injector,\n protected _isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n protected _options: ValidationErrorsRendererOptions)\n {\n this._initialize();\n }\n\n //######################### public methods - implementation of ValiDationErrorRenderer #########################\n\n /**\n * Destroys renderer and everything that was rendered\n */\n public destroy(): void\n {\n if(this._component)\n {\n this._injector.get(ApplicationRef).detachView(this._component.hostView);\n this._component.destroy();\n this._component = null;\n }\n\n this.wrapperElement?.remove();\n this.wrapperElement = null;\n }\n\n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n public update(errorMessages?: StringDictionary, onlyShow: boolean = false): boolean\n {\n let result = false;\n\n if(onlyShow)\n {\n this._isSubmittedOrDirty(() =>\n {\n this._show();\n this._toggleErrors();\n result = true;\n },\n () =>\n {\n this._hide();\n result = false;\n },\n !!this._lastErrors);\n\n return result;\n }\n\n //hides old errors\n this._toggleErrors(false);\n this._lastErrors = this._errorMessagesExtractor.getErrors(this._control, errorMessages);\n\n if(this._lastErrors)\n {\n this._isSubmittedOrDirty(() =>\n {\n this._show();\n result = true;\n this._toggleErrors();\n },\n () =>\n {\n this._hide();\n result = false;\n });\n }\n else\n {\n this._hide();\n result = false;\n }\n\n return result;\n }\n\n //######################### protected methods #########################\n\n /**\n * Toggles css classes for errors that are currently set\n * @param add - Indication whether add or remove errors\n */\n protected _toggleErrors(add: boolean = true): void\n {\n if(!this._lastErrors)\n {\n return;\n }\n\n const errorsClasses = this._lastErrors.errors.map(error => `${this._options.prefix}${error.toLowerCase()}${this._options.suffix}`);\n\n (add ? this._controlElement.classList.add : this._controlElement.classList.remove).apply(this._controlElement.classList, errorsClasses);\n (add ? this.wrapperElement.classList.add : this.wrapperElement.classList.remove).apply(this.wrapperElement.classList, errorsClasses);\n\n this._errorMessageAttr.value = (add ? this._lastErrors.errorMessages : [])\n .join(' ');\n\n this._render(add);\n }\n\n /**\n * Initialize renderer\n */\n protected _initialize(): void\n {\n this.wrapperElement = this._document.createElement('div');\n this._hide();\n this.wrapperElement.classList.add(this._options.wrapperDivClass);\n\n this._errorMessageAttr = this._document.createAttribute('data-error-message');\n\n this.wrapperElement.attributes.setNamedItem(this._errorMessageAttr);\n this._controlElement.after(this.wrapperElement);\n }\n\n /**\n * Renders error messages\n * @param add - Indication whether add or remove errors\n */\n protected _render(add: boolean): void\n {\n if(this._options.component)\n {\n this._renderComponent(add);\n }\n else if(this._options.template)\n {\n this._renderTemplate(add);\n }\n else\n {\n this._renderDivs(add);\n }\n }\n\n /**\n * Renders divs with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderDivs(add: boolean = true): void\n {\n if(!add)\n {\n const children = this.wrapperElement.children;\n \n //first clean old messages\n for(let x = children.length - 1; x >= 0; x--)\n {\n children.item(x).remove();\n }\n\n return;\n }\n\n if(this._lastErrors?.errorMessages?.length)\n {\n this._lastErrors.errorMessages.forEach(message =>\n {\n const errorDiv = this._document.createElement('div');\n\n errorDiv.innerText = message;\n\n this.wrapperElement.append(errorDiv);\n });\n }\n }\n\n /**\n * Renders component with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderComponent(add: boolean = true): void\n {\n if(add)\n {\n //render component\n if(!this._component)\n {\n // 1. Create a component reference from the component \n this._component = this._injector.get(ComponentFactoryResolver)\n .resolveComponentFactory(this._options.component)\n .create(this._injector);\n\n // 2. Attach component to the appRef so that it's inside the ng component tree\n this._injector.get(ApplicationRef).attachView(this._component.hostView);\n\n // 3. Get DOM element from component\n const domElem = (this._component.hostView as EmbeddedViewRef<any>)\n .rootNodes[0] as HTMLElement;\n\n // 4. Append DOM element to the body\n this.wrapperElement.append(domElem);\n }\n\n this._component.instance.show(this._lastErrors);\n }\n else if(this._component)\n {\n this._component.instance.show(null);\n }\n }\n\n /**\n * Renders template with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderTemplate(_add: boolean = true): void\n {\n\n }\n\n /**\n * Shows wrapper element\n */\n protected _show(): void\n {\n this.wrapperElement.style.display = 'block';\n }\n\n /**\n * Hides wrapper element\n */\n protected _hide(): void\n {\n this.wrapperElement.style.display = 'none';\n }\n}\n\nconst DEFAULT_OPTIONS: ValidationErrorRendererFactoryOptions =\n{\n prefix: 'ng-',\n suffix: '-error',\n wrapperDivClass: 'validation-error-div',\n rendererType: DefaultValidationErrorRenderer\n};"]}
1
+ {"version":3,"file":"validationErrorRenderer.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {Injectable, Inject, InjectionToken, Optional, Injector, ComponentFactoryResolver, ApplicationRef, EmbeddedViewRef, ComponentRef} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {DOCUMENT} from '@angular/common';\nimport {extend, StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorRenderer, IsSubmittedOrDirtyFunc, ValidationErrorsRendererOptions, ValidationErrorRendererFactoryOptions, ValidationErrorsComponent} from './validationErrorRenderer.interface';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Injection token used for injecting global options for ValidationErrorRendererFactory\n */\nexport const VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS: InjectionToken<ValidationErrorRendererFactoryOptions> = new InjectionToken<ValidationErrorRendererFactoryOptions>('VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS');\n\n//TODO: div renderer as custom component, wrapper div renderer\n\n/**\n * Service used for creating validation errors renderer\n */\n@Injectable({providedIn: 'root'})\nexport class ValidationErrorRendererFactory\n{\n //######################### protected fields #########################\n\n /**\n * Options for validation error renderer factory\n */\n protected _options: ValidationErrorRendererFactoryOptions;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n @Inject(DOCUMENT) protected _document: Document,\n @Optional() @Inject(VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS) options: ValidationErrorRendererFactoryOptions)\n {\n this._options = extend(true, {}, DEFAULT_OPTIONS, options);\n }\n\n //######################### public methods #########################\n\n /**\n * Creates new instance of ValidationErrorRenderer\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer factory\n */\n public create(control: FormControl,\n controlElement: HTMLElement,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorRendererFactoryOptions): ValidationErrorRenderer\n {\n const opts: ValidationErrorRendererFactoryOptions = extend(true, {}, this._options, options);\n\n return new opts.rendererType(this._errorMessagesExtractor,\n control,\n controlElement,\n this._document,\n injector,\n isSubmittedOrDirty,\n opts);\n }\n}\n\n/**\n * Default implementation of validation error renderer\n */\nexport class DefaultValidationErrorRenderer implements ValidationErrorRenderer\n{\n //######################### protected fields #########################\n\n /**\n * Html element attribute storing error messages\n */\n protected _errorMessageAttr: Attr;\n\n /**\n * Object storing last obtained errors\n */\n protected _lastErrors: ValidationErrorsResult;\n\n /**\n * Component used for displaying errors\n */\n protected _component: ComponentRef<ValidationErrorsComponent>;\n\n //######################### public properties - implementation of ValidationErrorRenderer #########################\n\n /**\n * Html element that is wrapping errors\n */\n public wrapperElement: HTMLElement;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n protected _control: FormControl,\n protected _controlElement: HTMLElement,\n protected _document: Document,\n protected _injector: Injector,\n protected _isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n protected _options: ValidationErrorsRendererOptions)\n {\n this._initialize();\n }\n\n //######################### public methods - implementation of ValiDationErrorRenderer #########################\n\n /**\n * Destroys renderer and everything that was rendered\n */\n public destroy(): void\n {\n if(this._component)\n {\n this._injector.get(ApplicationRef).detachView(this._component.hostView);\n this._component.destroy();\n this._component = null;\n }\n\n this.wrapperElement?.remove();\n this.wrapperElement = null;\n }\n\n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n public update(errorMessages?: StringDictionary): boolean\n {\n let result = false;\n\n //hides old errors\n this._toggleErrors(false);\n this._lastErrors = this._errorMessagesExtractor.getErrors(this._control, errorMessages);\n\n if(this._lastErrors)\n {\n this._isSubmittedOrDirty(() =>\n {\n this._show();\n this._toggleErrors();\n result = true;\n },\n () =>\n {\n this._hide();\n result = false;\n });\n }\n else\n {\n this._hide();\n result = false;\n }\n\n return result;\n }\n\n //######################### protected methods #########################\n\n /**\n * Toggles css classes for errors that are currently set\n * @param add - Indication whether add or remove errors\n */\n protected _toggleErrors(add: boolean = true): void\n {\n if(!this._lastErrors)\n {\n return;\n }\n\n const errorsClasses = this._lastErrors.errors.map(error => `${this._options.prefix}${error.toLowerCase()}${this._options.suffix}`);\n\n (add ? this._controlElement.classList.add : this._controlElement.classList.remove).apply(this._controlElement.classList, errorsClasses);\n (add ? this.wrapperElement.classList.add : this.wrapperElement.classList.remove).apply(this.wrapperElement.classList, errorsClasses);\n\n this._errorMessageAttr.value = (add ? this._lastErrors.errorMessages : [])\n .join(' ');\n\n this._render(add);\n }\n\n /**\n * Initialize renderer\n */\n protected _initialize(): void\n {\n this.wrapperElement = this._document.createElement('div');\n this._hide();\n this.wrapperElement.classList.add(this._options.wrapperDivClass);\n\n this._errorMessageAttr = this._document.createAttribute('data-error-message');\n\n this.wrapperElement.attributes.setNamedItem(this._errorMessageAttr);\n this._controlElement.after(this.wrapperElement);\n }\n\n /**\n * Renders error messages\n * @param add - Indication whether add or remove errors\n */\n protected _render(add: boolean): void\n {\n if(this._options.component)\n {\n this._renderComponent(add);\n }\n else if(this._options.template)\n {\n this._renderTemplate(add);\n }\n else\n {\n this._renderDivs(add);\n }\n }\n\n /**\n * Renders divs with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderDivs(add: boolean = true): void\n {\n if(!add)\n {\n const children = this.wrapperElement.children;\n \n //first clean old messages\n for(let x = children.length - 1; x >= 0; x--)\n {\n children.item(x).remove();\n }\n\n return;\n }\n\n if(this._lastErrors?.errorMessages?.length)\n {\n this._lastErrors.errorMessages.forEach(message =>\n {\n const errorDiv = this._document.createElement('div');\n\n errorDiv.innerText = message;\n\n this.wrapperElement.append(errorDiv);\n });\n }\n }\n\n /**\n * Renders component with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderComponent(add: boolean = true): void\n {\n if(add)\n {\n //render component\n if(!this._component)\n {\n // 1. Create a component reference from the component \n this._component = this._injector.get(ComponentFactoryResolver)\n .resolveComponentFactory(this._options.component)\n .create(this._injector);\n\n // 2. Attach component to the appRef so that it's inside the ng component tree\n this._injector.get(ApplicationRef).attachView(this._component.hostView);\n\n // 3. Get DOM element from component\n const domElem = (this._component.hostView as EmbeddedViewRef<any>)\n .rootNodes[0] as HTMLElement;\n\n // 4. Append DOM element to the body\n this.wrapperElement.append(domElem);\n }\n\n this._component.instance.show(this._lastErrors);\n }\n else if(this._component)\n {\n this._component.instance.show(null);\n }\n }\n\n /**\n * Renders template with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderTemplate(_add: boolean = true): void\n {\n\n }\n\n /**\n * Shows wrapper element\n */\n protected _show(): void\n {\n this.wrapperElement.style.display = 'block';\n }\n\n /**\n * Hides wrapper element\n */\n protected _hide(): void\n {\n this.wrapperElement.style.display = 'none';\n }\n}\n\nconst DEFAULT_OPTIONS: ValidationErrorRendererFactoryOptions =\n{\n prefix: 'ng-',\n suffix: '-error',\n wrapperDivClass: 'validation-error-div',\n rendererType: DefaultValidationErrorRenderer\n};"]}
@@ -64,7 +64,7 @@ export class HasErrorDirective {
64
64
  this._subscriptions.add(this.control.statusChanges.subscribe(() => this._updateStatus()));
65
65
  this._updateStatus();
66
66
  if (this._submittedSvc) {
67
- this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus(true))));
67
+ this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus())));
68
68
  }
69
69
  }
70
70
  //######################### public methods - implementation of OnDestroy #########################
@@ -80,11 +80,10 @@ export class HasErrorDirective {
80
80
  //######################### private methods #########################
81
81
  /**
82
82
  * Updates status of control and css classes
83
- * @param onlyShow - Indication that update performs only displaying of existing errors
84
83
  */
85
- _updateStatus(onlyShow) {
84
+ _updateStatus() {
86
85
  this._previousDirty = this.control.dirty;
87
- this._hasErrors = this.renderer.update(this.errorMessages, onlyShow);
86
+ this._hasErrors = this.renderer.update(this.errorMessages);
88
87
  this._toggleGroupHasError();
89
88
  }
90
89
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hasError.directive.js","sourceRoot":"","sources":["../../../../../forms/src/directives/hasError/hasError.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {Directive, ElementRef, Optional, SkipSelf, OnInit, OnDestroy, Inject, Input, Injector} from '@angular/core';\nimport {FormControlDirective, FormControlName, FormControl, NgModel} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {generateId, BindThis, StringDictionary} from '@jscrpt/common';\nimport {Subscription} from 'rxjs';\n\nimport {ValidationErrorRendererFactory} from '../../services/validationErrorRenderer/validationErrorRenderer.service';\nimport {ValidationErrorRenderer} from '../../services/validationErrorRenderer/validationErrorRenderer.interface';\nimport {SubmittedService} from '../../services/submitted/submitted.service';\nimport {GroupHasErrorDirective} from '../groupHasError/groupHasError.directive';\n\n//TODO - add support for setting renderer factory options using input\n\n/**\n * Directive that is attached to control element and handles css classes that are added to this element\n */\n@Directive(\n{\n selector: '[hasError]'\n})\nexport class HasErrorDirective implements OnInit, OnDestroy\n{\n //######################### private fields #########################\n\n /**\n * Subscriptions that are destroyed with destruction of this directive\n */\n private _subscriptions: Subscription = new Subscription();\n\n /**\n * Unique generated id of control\n */\n private _id: string = generateId(10);\n\n /**\n * Last value of control pristine attribute\n */\n private _previousDirty: boolean = false;\n\n /**\n * Indication whether currently are any errors rendered\n */\n private _hasErrors: boolean = false;\n\n /**\n * Mutation observer used for observing changes on class of element\n */\n private _observer: MutationObserver;\n\n //######################### private properties #########################\n\n /**\n * Gets control which was assigned to this element\n */\n private get control(): FormControl\n {\n return this._formControl?.control || this._formControlName?.control || this._ngModel?.control;\n }\n\n //######################### public properties #########################\n\n /**\n * Instance of validation error renderer\n */\n public renderer: ValidationErrorRenderer;\n\n //######################### public propeties - inputs #########################\n\n /**\n * Customized error messages\n */\n @Input()\n public errorMessages: StringDictionary;\n\n //######################### constructor #########################\n constructor(private _element: ElementRef<HTMLElement>,\n private _rendererFactory: ValidationErrorRendererFactory,\n @Optional() @SkipSelf() private _groupHasError: GroupHasErrorDirective,\n @Optional() private _formControl: FormControlDirective,\n @Optional() private _formControlName: FormControlName,\n @Optional() private _ngModel: NgModel,\n @Optional() private _submittedSvc: SubmittedService,\n @Inject(STRING_LOCALIZATION) protected _stringLocalization: StringLocalization,\n protected _injector: Injector)\n {\n }\n\n //######################### public methods - implementation of OnInit #########################\n \n /**\n * Initialize component\n */\n public ngOnInit(): void\n {\n this._registerMutationObserver();\n\n this.renderer = this._rendererFactory.create(this.control,\n this._element.nativeElement,\n this._injector,\n this._isSubmittedOrDirty,\n {\n });\n\n this._subscriptions.add(this._stringLocalization.textsChange.subscribe(() => this._updateStatus()));\n this._subscriptions.add(this.control.statusChanges.subscribe(() => this._updateStatus()));\n\n this._updateStatus();\n\n if(this._submittedSvc)\n {\n this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus(true))));\n }\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n \n /**\n * Called when component is destroyed\n */\n public ngOnDestroy(): void\n {\n this._subscriptions.unsubscribe();\n\n this._groupHasError?.unregisterControl(this._id);\n this._observer?.disconnect();\n this.renderer?.destroy();\n }\n\n //######################### private methods #########################\n\n /**\n * Updates status of control and css classes\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n private _updateStatus(onlyShow?: boolean): void\n {\n this._previousDirty = this.control.dirty;\n this._hasErrors = this.renderer.update(this.errorMessages, onlyShow);\n this._toggleGroupHasError();\n }\n\n /**\n * Toggles registration of control in parent group\n */\n private _toggleGroupHasError(): void\n {\n if(this._groupHasError)\n {\n this._isSubmittedOrDirty(() => this._groupHasError.registerControl(this._id),\n () => this._groupHasError.unregisterControl(this._id),\n this._hasErrors);\n }\n }\n\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n @BindThis\n private _isSubmittedOrDirty(action: () => void, falseAction: () => void = () => {}, additionalCondition: boolean = true): void\n {\n //submitted form or dirty control\n if((this._submittedSvc?.submitted ||\n this.control?.dirty) &&\n additionalCondition)\n {\n action();\n }\n else\n {\n falseAction();\n }\n }\n\n /**\n * Registers mutation observer which watch for changes of class list\n */\n private _registerMutationObserver(): void\n {\n this._observer = new MutationObserver(() =>\n {\n if(this.control.dirty != this._previousDirty)\n {\n this._updateStatus();\n }\n });\n\n this._observer.observe(this._element.nativeElement, \n {\n attributeFilter: ['class'],\n attributes: true\n });\n }\n}"]}
1
+ {"version":3,"file":"hasError.directive.js","sourceRoot":"","sources":["../../../../../forms/src/directives/hasError/hasError.directive.ts"],"names":[],"mappings":"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","sourcesContent":["import {Directive, ElementRef, Optional, SkipSelf, OnInit, OnDestroy, Inject, Input, Injector} from '@angular/core';\nimport {FormControlDirective, FormControlName, FormControl, NgModel} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {generateId, BindThis, StringDictionary} from '@jscrpt/common';\nimport {Subscription} from 'rxjs';\n\nimport {ValidationErrorRendererFactory} from '../../services/validationErrorRenderer/validationErrorRenderer.service';\nimport {ValidationErrorRenderer} from '../../services/validationErrorRenderer/validationErrorRenderer.interface';\nimport {SubmittedService} from '../../services/submitted/submitted.service';\nimport {GroupHasErrorDirective} from '../groupHasError/groupHasError.directive';\n\n//TODO - add support for setting renderer factory options using input\n\n/**\n * Directive that is attached to control element and handles css classes that are added to this element\n */\n@Directive(\n{\n selector: '[hasError]'\n})\nexport class HasErrorDirective implements OnInit, OnDestroy\n{\n //######################### private fields #########################\n\n /**\n * Subscriptions that are destroyed with destruction of this directive\n */\n private _subscriptions: Subscription = new Subscription();\n\n /**\n * Unique generated id of control\n */\n private _id: string = generateId(10);\n\n /**\n * Last value of control pristine attribute\n */\n private _previousDirty: boolean = false;\n\n /**\n * Indication whether currently are any errors rendered\n */\n private _hasErrors: boolean = false;\n\n /**\n * Mutation observer used for observing changes on class of element\n */\n private _observer: MutationObserver;\n\n //######################### private properties #########################\n\n /**\n * Gets control which was assigned to this element\n */\n private get control(): FormControl\n {\n return this._formControl?.control || this._formControlName?.control || this._ngModel?.control;\n }\n\n //######################### public properties #########################\n\n /**\n * Instance of validation error renderer\n */\n public renderer: ValidationErrorRenderer;\n\n //######################### public propeties - inputs #########################\n\n /**\n * Customized error messages\n */\n @Input()\n public errorMessages: StringDictionary;\n\n //######################### constructor #########################\n constructor(private _element: ElementRef<HTMLElement>,\n private _rendererFactory: ValidationErrorRendererFactory,\n @Optional() @SkipSelf() private _groupHasError: GroupHasErrorDirective,\n @Optional() private _formControl: FormControlDirective,\n @Optional() private _formControlName: FormControlName,\n @Optional() private _ngModel: NgModel,\n @Optional() private _submittedSvc: SubmittedService,\n @Inject(STRING_LOCALIZATION) protected _stringLocalization: StringLocalization,\n protected _injector: Injector)\n {\n }\n\n //######################### public methods - implementation of OnInit #########################\n \n /**\n * Initialize component\n */\n public ngOnInit(): void\n {\n this._registerMutationObserver();\n\n this.renderer = this._rendererFactory.create(this.control,\n this._element.nativeElement,\n this._injector,\n this._isSubmittedOrDirty,\n {\n });\n\n this._subscriptions.add(this._stringLocalization.textsChange.subscribe(() => this._updateStatus()));\n this._subscriptions.add(this.control.statusChanges.subscribe(() => this._updateStatus()));\n\n this._updateStatus();\n\n if(this._submittedSvc)\n {\n this._subscriptions.add(this._submittedSvc.submittedChange.subscribe(() => this._isSubmittedOrDirty(() => this._updateStatus())));\n }\n }\n\n //######################### public methods - implementation of OnDestroy #########################\n \n /**\n * Called when component is destroyed\n */\n public ngOnDestroy(): void\n {\n this._subscriptions.unsubscribe();\n\n this._groupHasError?.unregisterControl(this._id);\n this._observer?.disconnect();\n this.renderer?.destroy();\n }\n\n //######################### private methods #########################\n\n /**\n * Updates status of control and css classes\n */\n private _updateStatus(): void\n {\n this._previousDirty = this.control.dirty;\n this._hasErrors = this.renderer.update(this.errorMessages);\n this._toggleGroupHasError();\n }\n\n /**\n * Toggles registration of control in parent group\n */\n private _toggleGroupHasError(): void\n {\n if(this._groupHasError)\n {\n this._isSubmittedOrDirty(() => this._groupHasError.registerControl(this._id),\n () => this._groupHasError.unregisterControl(this._id),\n this._hasErrors);\n }\n }\n\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n @BindThis\n private _isSubmittedOrDirty(action: () => void, falseAction: () => void = () => {}, additionalCondition: boolean = true): void\n {\n //submitted form or dirty control\n if((this._submittedSvc?.submitted ||\n this.control?.dirty) &&\n additionalCondition)\n {\n action();\n }\n else\n {\n falseAction();\n }\n }\n\n /**\n * Registers mutation observer which watch for changes of class list\n */\n private _registerMutationObserver(): void\n {\n this._observer = new MutationObserver(() =>\n {\n if(this.control.dirty != this._previousDirty)\n {\n this._updateStatus();\n }\n });\n\n this._observer.observe(this._element.nativeElement, \n {\n attributeFilter: ['class'],\n attributes: true\n });\n }\n}"]}
@@ -8,7 +8,7 @@ export function FormGroupAsyncValidator(validator) {
8
8
  return function (target) {
9
9
  const metadata = target.prototype;
10
10
  if (!metadata.ɵAsyncValidators) {
11
- Object.defineProperty(target, nameof('ɵAsyncValidators'), {
11
+ Object.defineProperty(metadata, nameof('ɵAsyncValidators'), {
12
12
  value: [],
13
13
  writable: false,
14
14
  enumerable: false,
@@ -1 +1 @@
1
- {"version":3,"file":"formGroupAsyncValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAmD;IAEvF,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,gBAAgB,EAC7B;YACI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAyB,kBAAkB,CAAC,EAChF;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {AsyncValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {AsyncValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers async validator for whole FormGroup\n * @param validator - Instance of async validator or async validator factory\n */\nexport function FormGroupAsyncValidator(validator: AsyncValidatorFn|AsyncValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵAsyncValidators)\n {\n Object.defineProperty(target, nameof<ModelDecoratorMetadata>('ɵAsyncValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵAsyncValidators.push(validator);\n\n return target;\n };\n}"]}
1
+ {"version":3,"file":"formGroupAsyncValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupAsyncValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAmD;IAEvF,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,gBAAgB,EAC7B;YACI,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAyB,kBAAkB,CAAC,EAClF;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {AsyncValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {AsyncValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers async validator for whole FormGroup\n * @param validator - Instance of async validator or async validator factory\n */\nexport function FormGroupAsyncValidator(validator: AsyncValidatorFn|AsyncValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵAsyncValidators)\n {\n Object.defineProperty(metadata, nameof<ModelDecoratorMetadata>('ɵAsyncValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵAsyncValidators.push(validator);\n\n return target;\n };\n}"]}
@@ -8,7 +8,7 @@ export function FormGroupValidator(validator) {
8
8
  return function (target) {
9
9
  const metadata = target.prototype;
10
10
  if (!metadata.ɵValidators) {
11
- Object.defineProperty(target, nameof('ɵValidators'), {
11
+ Object.defineProperty(metadata, nameof('ɵValidators'), {
12
12
  value: [],
13
13
  writable: false,
14
14
  enumerable: false,
@@ -1 +1 @@
1
- {"version":3,"file":"formGroupValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAyC;IAExE,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,WAAW,EACxB;YACI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAyB,aAAa,CAAC,EAC3E;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {ValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers validator for whole FormGroup\n * @param validator - Instance of validator or validator factory\n */\nexport function FormGroupValidator(validator: ValidatorFn|ValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵValidators)\n {\n Object.defineProperty(target, nameof<ModelDecoratorMetadata>('ɵValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵValidators.push(validator);\n\n return target;\n };\n}"]}
1
+ {"version":3,"file":"formGroupValidator.decorator.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/decorators/formGroupValidator.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAKtC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAyC;IAExE,wDAAwD;IACxD,OAAO,UAAsC,MAAiB;QAE1D,MAAM,QAAQ,GAA2B,MAAM,CAAC,SAAS,CAAC;QAE1D,IAAG,CAAC,QAAQ,CAAC,WAAW,EACxB;YACI,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAyB,aAAa,CAAC,EAC7E;gBACI,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;aACtB,CAAC,CAAC;SACN;QAED,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {ValidatorFn} from '@angular/forms';\nimport {nameof} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ValidatorFnFactory} from '../misc/validatorFactories';\n\n/**\n * Registers validator for whole FormGroup\n * @param validator - Instance of validator or validator factory\n */\nexport function FormGroupValidator(validator: ValidatorFn|ValidatorFnFactory): ClassDecorator\n{\n // eslint-disable-next-line @typescript-eslint/ban-types\n return function<TFunction extends Function> (target: TFunction): TFunction\n {\n const metadata: ModelDecoratorMetadata = target.prototype;\n \n if(!metadata.ɵValidators)\n {\n Object.defineProperty(metadata, nameof<ModelDecoratorMetadata>('ɵValidators'),\n {\n value: [],\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n metadata.ɵValidators.push(validator);\n\n return target;\n };\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"modelDecoratorMetadata.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/interfaces/modelDecoratorMetadata.ts"],"names":[],"mappings":"","sourcesContent":["import {AsyncValidatorFn, ValidatorFn} from '@angular/forms';\n\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from '../misc/validatorFactories';\nimport {ModelPropertyDecoratorMetadata} from './modelPropertyDecoratorMetadata';\n\n/**\n * Metadata describing whole model\n */\nexport interface ModelDecoratorMetadata<TModel = any>\n{\n /**\n * Array of controls metadata\n */\n ɵControlsMetadata: Partial<Record<keyof TModel, ModelPropertyDecoratorMetadata>>;\n\n /**\n * Array of validator functions\n */\n ɵValidators?: Array<ValidatorFn|ValidatorFnFactory>;\n\n /**\n * Array of async validator functions\n */\n ɵAsyncValidators?: Array<AsyncValidatorFn|AsyncValidatorFnFactory>;\n}\n"]}
1
+ {"version":3,"file":"modelDecoratorMetadata.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/interfaces/modelDecoratorMetadata.ts"],"names":[],"mappings":"","sourcesContent":["import {AsyncValidatorFn, ValidatorFn} from '@angular/forms';\nimport {Dictionary} from '@jscrpt/common';\n\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from '../misc/validatorFactories';\nimport {ModelPropertyDecoratorMetadata} from './modelPropertyDecoratorMetadata';\n\n/**\n * Metadata describing whole model\n */\nexport interface ModelDecoratorMetadata<TModel = any, TArgs extends Dictionary<any> = any>\n{\n /**\n * Array of controls metadata\n */\n ɵControlsMetadata: Partial<Record<keyof TModel, ModelPropertyDecoratorMetadata>>;\n\n /**\n * Array of validator functions\n */\n ɵValidators?: Array<ValidatorFn|ValidatorFnFactory>;\n\n /**\n * Array of async validator functions\n */\n ɵAsyncValidators?: Array<AsyncValidatorFn|AsyncValidatorFnFactory>;\n\n /**\n * Object storing additional arguments for customization\n */\n ɵArgs?: TArgs;\n}\n"]}
@@ -9,14 +9,17 @@ import { AsyncValidatorFnFactory, ValidatorFnFactory } from './validatorFactorie
9
9
  */
10
10
  function buildFormGroup(model, args) {
11
11
  if (!model) {
12
- return new FormGroup({}, {
13
- validators: model.ɵValidators?.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm),
14
- asyncValidators: model.ɵAsyncValidators?.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm)
15
- });
12
+ return new FormGroup({});
16
13
  }
17
14
  const modelMetadata = model.ɵControlsMetadata ?? {};
15
+ const groupValidators = model.ɵValidators ?? [];
16
+ const groupAsyncValidators = model.ɵAsyncValidators ?? [];
17
+ const groupArgs = model.ɵArgs ?? {};
18
18
  const properties = Object.keys(model);
19
- const formGroup = new FormGroup({});
19
+ const formGroup = new FormGroup({}, {
20
+ validators: groupValidators?.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({ ...groupArgs, ...args }) : validator).filter(itm => !!itm),
21
+ asyncValidators: groupAsyncValidators?.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({ ...groupArgs, ...args }) : validator).filter(itm => !!itm)
22
+ });
20
23
  for (const propertyName of properties) {
21
24
  const metadata = modelMetadata[propertyName] ?? ɵDefaultPropertyMetadata;
22
25
  const defaultValue = model[propertyName];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/misc/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms';\nimport {Dictionary} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ModelPropertyDecoratorMetadata} from '../interfaces/modelPropertyDecoratorMetadata';\nimport {ɵDefaultPropertyMetadata} from './defaults';\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from './validatorFactories';\n\n/**\n * Builds form group from decorated model\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nfunction buildFormGroup<TModel, TArgs = Record<string, never>>(model: ModelDecoratorMetadata<TModel> & Dictionary<any>, args?: TArgs): FormGroup\n{\n if(!model)\n {\n return new FormGroup({},\n {\n validators: model.ɵValidators?.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm),\n asyncValidators: model.ɵAsyncValidators?.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()(args) : validator).filter(itm => !!itm)\n });\n }\n\n const modelMetadata: Dictionary<any> = model.ɵControlsMetadata ?? {};\n const properties = Object.keys(model);\n const formGroup: FormGroup = new FormGroup({});\n\n for(const propertyName of properties)\n {\n const metadata: ModelPropertyDecoratorMetadata = modelMetadata[propertyName] ?? ɵDefaultPropertyMetadata;\n const defaultValue = model[propertyName];\n\n //Skip control creation if value is undefined\n if(defaultValue === undefined)\n {\n continue;\n }\n\n const validators = metadata.validators.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n const asyncValidators = metadata.asyncValidators.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n\n let control: AbstractControl;\n\n switch(metadata.type)\n {\n case FormGroup:\n {\n control = buildFormGroup(defaultValue, args);\n\n //TODO: think of setting metadata from property to model\n\n break;\n }\n case FormArray:\n {\n //TODO - enhance FormArray child definition and finish it\n control = new FormArray([],\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n if(defaultValue && Array.isArray(defaultValue))\n {\n const formArray = control as FormArray;\n\n for(const val of defaultValue)\n {\n switch(metadata.childType)\n {\n case FormGroup:\n {\n formArray.push(buildFormGroup(val, args));\n\n break;\n }\n case FormArray:\n {\n break;\n }\n default:\n //case FormControl:\n {\n formArray.push(new FormControl(val,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n }));\n\n break;\n }\n }\n }\n }\n\n break;\n }\n default:\n //case FormControl:\n {\n control = new FormControl(defaultValue,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n break;\n }\n }\n\n if(metadata.disabled)\n {\n control.disable();\n }\n\n formGroup.addControl(propertyName, control);\n }\n\n return formGroup;\n}\n\n/**\n * Builds form from decorated model, only for properties with non `undefined` value\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nexport function buildFormModel<TModel, TArgs = Record<string, never>>(model: TModel, args?: TArgs): FormGroup\n{\n return buildFormGroup(model as any, args);\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../forms/src/misc/formModel/misc/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms';\nimport {Dictionary} from '@jscrpt/common';\n\nimport {ModelDecoratorMetadata} from '../interfaces/modelDecoratorMetadata';\nimport {ModelPropertyDecoratorMetadata} from '../interfaces/modelPropertyDecoratorMetadata';\nimport {ɵDefaultPropertyMetadata} from './defaults';\nimport {AsyncValidatorFnFactory, ValidatorFnFactory} from './validatorFactories';\n\n/**\n * Builds form group from decorated model\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nfunction buildFormGroup<TModel, TArgs = Record<string, never>>(model: ModelDecoratorMetadata<TModel> & Dictionary<any>, args?: TArgs): FormGroup\n{\n if(!model)\n {\n return new FormGroup({});\n }\n\n const modelMetadata: Dictionary<any> = model.ɵControlsMetadata ?? {};\n const groupValidators = model.ɵValidators ?? [];\n const groupAsyncValidators = model.ɵAsyncValidators ?? [];\n const groupArgs: Dictionary<any> = model.ɵArgs ?? {};\n const properties = Object.keys(model);\n const formGroup: FormGroup = new FormGroup({},\n {\n validators: groupValidators?.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({...groupArgs, ...args}) : validator).filter(itm => !!itm),\n asyncValidators: groupAsyncValidators?.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({...groupArgs, ...args}) : validator).filter(itm => !!itm)\n });\n\n for(const propertyName of properties)\n {\n const metadata: ModelPropertyDecoratorMetadata = modelMetadata[propertyName] ?? ɵDefaultPropertyMetadata;\n const defaultValue = model[propertyName];\n\n //Skip control creation if value is undefined\n if(defaultValue === undefined)\n {\n continue;\n }\n\n const validators = metadata.validators.map(validator => validator instanceof ValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n const asyncValidators = metadata.asyncValidators.map(validator => validator instanceof AsyncValidatorFnFactory ? validator.valueOf()({...metadata.args, ...args}) : validator).filter(itm => !!itm);\n\n let control: AbstractControl;\n\n switch(metadata.type)\n {\n case FormGroup:\n {\n control = buildFormGroup(defaultValue, args);\n\n //TODO: think of setting metadata from property to model\n\n break;\n }\n case FormArray:\n {\n //TODO - enhance FormArray child definition and finish it\n control = new FormArray([],\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n if(defaultValue && Array.isArray(defaultValue))\n {\n const formArray = control as FormArray;\n\n for(const val of defaultValue)\n {\n switch(metadata.childType)\n {\n case FormGroup:\n {\n formArray.push(buildFormGroup(val, args));\n\n break;\n }\n case FormArray:\n {\n break;\n }\n default:\n //case FormControl:\n {\n formArray.push(new FormControl(val,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n }));\n\n break;\n }\n }\n }\n }\n\n break;\n }\n default:\n //case FormControl:\n {\n control = new FormControl(defaultValue,\n {\n validators: validators,\n asyncValidators: asyncValidators,\n ...metadata.controlOptions\n });\n\n break;\n }\n }\n\n if(metadata.disabled)\n {\n control.disable();\n }\n\n formGroup.addControl(propertyName, control);\n }\n\n return formGroup;\n}\n\n/**\n * Builds form from decorated model, only for properties with non `undefined` value\n * @param model - Model that can be decorated for enhancing created form group with validation and so on\n * @param args - Object storing arguments from owning component for customization\n * @returns\n */\nexport function buildFormModel<TModel, TArgs = Record<string, never>>(model: TModel, args?: TArgs): FormGroup\n{\n return buildFormGroup(model as any, args);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Injectable, Inject, Optional, Injector } from '@angular/core';
1
+ import { Injectable, Inject, Optional } from '@angular/core';
2
2
  import { STRING_LOCALIZATION } from '@anglr/common';
3
3
  import { extend, isString } from '@jscrpt/common';
4
4
  import { VALIDATION_ERROR_MESSAGES } from '../../misc/types';
@@ -15,14 +15,15 @@ const defaultErrorMessages = {
15
15
  minlength: 'Value is short.',
16
16
  maxlength: 'Value is too long.'
17
17
  };
18
+ //TODO: support exceptions for error names, allow to have string value to be used as error from error
18
19
  /**
19
20
  * Service used for extracting error messages from form control
20
21
  */
21
22
  export class ErrorMessagesExtractor {
22
23
  //######################### constructor #########################
23
- constructor(injector, globalErrorMessages) {
24
+ constructor(_stringLocalization, globalErrorMessages) {
25
+ this._stringLocalization = _stringLocalization;
24
26
  this._errorMessages = extend(true, {}, defaultErrorMessages, globalErrorMessages);
25
- this._stringLocalization = injector.get(STRING_LOCALIZATION);
26
27
  }
27
28
  //######################### public methods #########################
28
29
  /**
@@ -58,12 +59,15 @@ export class ErrorMessagesExtractor {
58
59
  return result;
59
60
  }
60
61
  }
61
- ErrorMessagesExtractor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, deps: [{ token: i0.Injector }, { token: VALIDATION_ERROR_MESSAGES, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
62
+ ErrorMessagesExtractor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, deps: [{ token: STRING_LOCALIZATION }, { token: VALIDATION_ERROR_MESSAGES, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
62
63
  ErrorMessagesExtractor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, providedIn: 'root' });
63
64
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ErrorMessagesExtractor, decorators: [{
64
65
  type: Injectable,
65
66
  args: [{ providedIn: 'root' }]
66
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: undefined, decorators: [{
67
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
68
+ type: Inject,
69
+ args: [STRING_LOCALIZATION]
70
+ }] }, { type: undefined, decorators: [{
67
71
  type: Inject,
68
72
  args: [VALIDATION_ERROR_MESSAGES]
69
73
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"errorMessagesExtractor.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAErE,OAAO,EAAqB,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACtE,OAAO,EAAmB,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAC,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;;AAG3D;;GAEG;AACH,MAAM,oBAAoB,GAC1B;IACI,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,iBAAiB;IAC5B,SAAS,EAAE,oBAAoB;CAClC,CAAC;AAEF;;GAEG;AAEH,MAAM,OAAO,sBAAsB;IAc/B,iEAAiE;IACjE,YAAY,QAAkB,EAC6B,mBAAsC;QAE7F,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QAClF,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjE,CAAC;IAED,oEAAoE;IAEpE;;;;OAIG;IACI,SAAS,CAAC,OAAoB,EAAE,QAA2B;QAE9D,MAAM,aAAa,GAAqB,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAExF,yBAAyB;QACzB,IAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAC9B;YACI,OAAO,IAAI,CAAC;SACf;QAED,MAAM,MAAM,GACZ;YACI,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,aAAa,EAAE,EAAE;SACpB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,oCAAoC;YACpC,IAAG,aAAa,CAAC,KAAK,CAAC,EACvB;gBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACjG;YACD,0EAA0E;iBACrE,IAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAChC;gBACI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBAEzB,IAAG,QAAQ,CAAC,QAAQ,CAAC,EACrB;wBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;qBACrF;gBACL,CAAC,CAAC,CAAC;aACN;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;;mHApEQ,sBAAsB,0CAgBX,yBAAyB;uHAhBpC,sBAAsB,cADV,MAAM;2FAClB,sBAAsB;kBADlC,UAAU;mBAAC,EAAC,UAAU,EAAE,MAAM,EAAC;;0BAiBf,MAAM;2BAAC,yBAAyB;;0BAAG,QAAQ","sourcesContent":["import {Injectable, Inject, Optional, Injector} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {StringDictionary, extend, isString} from '@jscrpt/common';\n\nimport {VALIDATION_ERROR_MESSAGES} from '../../misc/types';\nimport {ValidationErrorsResult} from './errorMessagesExtractor.interface';\n\n/**\n * Default error messages displayed\n */\nconst defaultErrorMessages: StringDictionary =\n{\n required: 'Field is required.',\n number: 'Value must be number.',\n pattern: 'Value is not valid.',\n minValue: 'Value is too small.',\n maxValue: 'Value is too big.',\n minlength: 'Value is short.',\n maxlength: 'Value is too long.'\n};\n\n/**\n * Service used for extracting error messages from form control\n */\n@Injectable({providedIn: 'root'})\nexport class ErrorMessagesExtractor\n{\n //######################### protected fields #########################\n\n /**\n * Dictionary with error names that have defined message\n */\n protected _errorMessages: StringDictionary;\n\n /**\n * String localization service\n */\n protected _stringLocalization: StringLocalization;\n\n //######################### constructor #########################\n constructor(injector: Injector,\n @Inject(VALIDATION_ERROR_MESSAGES) @Optional() globalErrorMessages?: StringDictionary)\n {\n this._errorMessages = extend(true, {}, defaultErrorMessages, globalErrorMessages);\n this._stringLocalization = injector.get(STRING_LOCALIZATION);\n }\n\n //######################### public methods #########################\n\n /**\n * Gets validation errors result for provided control, or null of no errors are present\n * @param control - Form control instance that should be inspected for errors\n * @param messages - Object containing error messages that should patch existing error messages\n */\n public getErrors(control: FormControl, messages?: StringDictionary): ValidationErrorsResult\n {\n const errorMessages: StringDictionary = extend(true, {}, this._errorMessages, messages);\n\n //no control or no errors\n if(!control || !control.errors)\n {\n return null;\n }\n\n const result: ValidationErrorsResult =\n {\n errors: Object.keys(control.errors),\n errorMessages: []\n };\n\n result.errors.forEach(error =>\n {\n const errorData = control.errors[error];\n \n //error message is present for error\n if(errorMessages[error])\n {\n result.errorMessages.push(this._stringLocalization.get(errorMessages[error], control.errors));\n }\n //error data are array of strings, each string is considered error message\n else if(Array.isArray(errorData))\n {\n errorData.forEach(errorItm =>\n {\n if(isString(errorItm))\n {\n result.errorMessages.push(this._stringLocalization.get(errorItm, control.errors));\n }\n });\n }\n });\n\n return result;\n }\n}"]}
1
+ {"version":3,"file":"errorMessagesExtractor.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/errorMessagesExtractor/errorMessagesExtractor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAqB,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACtE,OAAO,EAAmB,MAAM,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAC,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;;AAG3D;;GAEG;AACH,MAAM,oBAAoB,GAC1B;IACI,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,qBAAqB;IAC9B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,iBAAiB;IAC5B,SAAS,EAAE,oBAAoB;CAClC,CAAC;AAEF,qGAAqG;AAErG;;GAEG;AAEH,MAAM,OAAO,sBAAsB;IAS/B,iEAAiE;IACjE,YAAmD,mBAAuC,EAC/B,mBAAsC;QAD9C,wBAAmB,GAAnB,mBAAmB,CAAoB;QAGtF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACtF,CAAC;IAED,oEAAoE;IAEpE;;;;OAIG;IACI,SAAS,CAAC,OAAoB,EAAE,QAA2B;QAE9D,MAAM,aAAa,GAAqB,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAExF,yBAAyB;QACzB,IAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAC9B;YACI,OAAO,IAAI,CAAC;SACf;QAED,MAAM,MAAM,GACZ;YACI,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,aAAa,EAAE,EAAE;SACpB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAExC,oCAAoC;YACpC,IAAG,aAAa,CAAC,KAAK,CAAC,EACvB;gBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACjG;YACD,0EAA0E;iBACrE,IAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAChC;gBACI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBAEzB,IAAG,QAAQ,CAAC,QAAQ,CAAC,EACrB;wBACI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;qBACrF;gBACL,CAAC,CAAC,CAAC;aACN;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;;mHA9DQ,sBAAsB,kBAUX,mBAAmB,aACnB,yBAAyB;uHAXpC,sBAAsB,cADV,MAAM;2FAClB,sBAAsB;kBADlC,UAAU;mBAAC,EAAC,UAAU,EAAE,MAAM,EAAC;;0BAWf,MAAM;2BAAC,mBAAmB;;0BAC1B,MAAM;2BAAC,yBAAyB;;0BAAG,QAAQ","sourcesContent":["import {Injectable, Inject, Optional} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringLocalization, STRING_LOCALIZATION} from '@anglr/common';\nimport {StringDictionary, extend, isString} from '@jscrpt/common';\n\nimport {VALIDATION_ERROR_MESSAGES} from '../../misc/types';\nimport {ValidationErrorsResult} from './errorMessagesExtractor.interface';\n\n/**\n * Default error messages displayed\n */\nconst defaultErrorMessages: StringDictionary =\n{\n required: 'Field is required.',\n number: 'Value must be number.',\n pattern: 'Value is not valid.',\n minValue: 'Value is too small.',\n maxValue: 'Value is too big.',\n minlength: 'Value is short.',\n maxlength: 'Value is too long.'\n};\n\n//TODO: support exceptions for error names, allow to have string value to be used as error from error\n\n/**\n * Service used for extracting error messages from form control\n */\n@Injectable({providedIn: 'root'})\nexport class ErrorMessagesExtractor\n{\n //######################### protected fields #########################\n\n /**\n * Dictionary with error names that have defined message\n */\n protected _errorMessages: StringDictionary;\n\n //######################### constructor #########################\n constructor(@Inject(STRING_LOCALIZATION) protected _stringLocalization: StringLocalization,\n @Inject(VALIDATION_ERROR_MESSAGES) @Optional() globalErrorMessages?: StringDictionary)\n {\n this._errorMessages = extend(true, {}, defaultErrorMessages, globalErrorMessages);\n }\n\n //######################### public methods #########################\n\n /**\n * Gets validation errors result for provided control, or null of no errors are present\n * @param control - Form control instance that should be inspected for errors\n * @param messages - Object containing error messages that should patch existing error messages\n */\n public getErrors(control: FormControl, messages?: StringDictionary): ValidationErrorsResult\n {\n const errorMessages: StringDictionary = extend(true, {}, this._errorMessages, messages);\n\n //no control or no errors\n if(!control || !control.errors)\n {\n return null;\n }\n\n const result: ValidationErrorsResult =\n {\n errors: Object.keys(control.errors),\n errorMessages: []\n };\n\n result.errors.forEach(error =>\n {\n const errorData = control.errors[error];\n \n //error message is present for error\n if(errorMessages[error])\n {\n result.errorMessages.push(this._stringLocalization.get(errorMessages[error], control.errors));\n }\n //error data are array of strings, each string is considered error message\n else if(Array.isArray(errorData))\n {\n errorData.forEach(errorItm =>\n {\n if(isString(errorItm))\n {\n result.errorMessages.push(this._stringLocalization.get(errorItm, control.errors));\n }\n });\n }\n });\n\n return result;\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validationErrorRenderer.interface.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {Type, TemplateRef, Injector} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Describes function that is used for performing actions when form is submitted or dirty\n */\nexport interface IsSubmittedOrDirtyFunc\n{\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n (action: () => void, falseAction?: () => void, additionalCondition?: boolean): void;\n}\n\n/**\n * Component that is used for rendering validation errors\n */\nexport interface ValidationErrorsComponent\n{\n /**\n * Shows validation errors in component\n * @param errors - Errors to be shown, or null if to be hidden\n */\n show(errors: ValidationErrorsResult): void;\n}\n\n/**\n * Context passed to template that is used for rendering validation errors\n */\nexport interface ValidationErrorsTemplateContext\n{\n /**\n * Errors to be shown\n */\n $implicit: ValidationErrorsResult;\n}\n\n/**\n * Options for ValidationErrorRenderer\n */\nexport interface ValidationErrorsRendererOptions\n{\n /**\n * Prefix of css classes applied to element\n */\n prefix?: string;\n\n /**\n * Suffix of css classes applied to element\n */\n suffix?: string;\n\n /**\n * Css class attached to wrapper div\n */\n wrapperDivClass?: string;\n\n /**\n * Component used for rendering validation errors\n */\n component?: Type<ValidationErrorsComponent>;\n\n /**\n * Template used for rendering validation errors\n */\n template?: TemplateRef<ValidationErrorsTemplateContext>;\n}\n\n/**\n * Options for ValidationErrorRendererFactory\n */\nexport interface ValidationErrorRendererFactoryOptions extends ValidationErrorsRendererOptions\n{\n /**\n * Type of ValidationErrorRenderer implementation\n */\n rendererType?: ValidationErrorRendererCtor;\n}\n\n/**\n * Describes type that represents ValidationErrorRenderer\n */\nexport interface ValidationErrorRendererCtor\n{\n /**\n * Creates instance of ValidationErrorRenderer\n * @param errorMessagesExtractor - Instance of service used for extracting errors from control\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param document - Html document instance, used for manipulation with html\n * @param injector - Injector used for obtaining dependencies\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer\n */\n new(errorMessagesExtractor: ErrorMessagesExtractor,\n control: FormControl,\n controlElement: HTMLElement,\n document: Document,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorsRendererOptions): ValidationErrorRenderer;\n}\n\n/**\n * Describes service that is used for rendering validation errors\n */\nexport interface ValidationErrorRenderer\n{\n /**\n * Html element that is wrapping errors\n */\n wrapperElement: HTMLElement;\n\n /**\n * Destroys renderer and everything that was rendered\n */\n destroy(): void;\n \n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n update(errorMessages?: StringDictionary, onlyShow?: boolean): boolean;\n}"]}
1
+ {"version":3,"file":"validationErrorRenderer.interface.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {Type, TemplateRef, Injector} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Describes function that is used for performing actions when form is submitted or dirty\n */\nexport interface IsSubmittedOrDirtyFunc\n{\n /**\n * Calls action when form is submitted or control is dirty\n * @param action - Action to be called when form is submitted or control dirty\n * @param falseAction - Action to be called when form is not submitted and control is not dirty\n * @param additionalCondition - Additional condition to be evaluated\n */\n (action: () => void, falseAction?: () => void, additionalCondition?: boolean): void;\n}\n\n/**\n * Component that is used for rendering validation errors\n */\nexport interface ValidationErrorsComponent\n{\n /**\n * Shows validation errors in component\n * @param errors - Errors to be shown, or null if to be hidden\n */\n show(errors: ValidationErrorsResult): void;\n}\n\n/**\n * Context passed to template that is used for rendering validation errors\n */\nexport interface ValidationErrorsTemplateContext\n{\n /**\n * Errors to be shown\n */\n $implicit: ValidationErrorsResult;\n}\n\n/**\n * Options for ValidationErrorRenderer\n */\nexport interface ValidationErrorsRendererOptions\n{\n /**\n * Prefix of css classes applied to element\n */\n prefix?: string;\n\n /**\n * Suffix of css classes applied to element\n */\n suffix?: string;\n\n /**\n * Css class attached to wrapper div\n */\n wrapperDivClass?: string;\n\n /**\n * Component used for rendering validation errors\n */\n component?: Type<ValidationErrorsComponent>;\n\n /**\n * Template used for rendering validation errors\n */\n template?: TemplateRef<ValidationErrorsTemplateContext>;\n}\n\n/**\n * Options for ValidationErrorRendererFactory\n */\nexport interface ValidationErrorRendererFactoryOptions extends ValidationErrorsRendererOptions\n{\n /**\n * Type of ValidationErrorRenderer implementation\n */\n rendererType?: ValidationErrorRendererCtor;\n}\n\n/**\n * Describes type that represents ValidationErrorRenderer\n */\nexport interface ValidationErrorRendererCtor\n{\n /**\n * Creates instance of ValidationErrorRenderer\n * @param errorMessagesExtractor - Instance of service used for extracting errors from control\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param document - Html document instance, used for manipulation with html\n * @param injector - Injector used for obtaining dependencies\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer\n */\n new(errorMessagesExtractor: ErrorMessagesExtractor,\n control: FormControl,\n controlElement: HTMLElement,\n document: Document,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorsRendererOptions): ValidationErrorRenderer;\n}\n\n/**\n * Describes service that is used for rendering validation errors\n */\nexport interface ValidationErrorRenderer\n{\n /**\n * Html element that is wrapping errors\n */\n wrapperElement: HTMLElement;\n\n /**\n * Destroys renderer and everything that was rendered\n */\n destroy(): void;\n \n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n */\n update(errorMessages?: StringDictionary): boolean;\n}"]}
@@ -8,6 +8,7 @@ import * as i1 from "../errorMessagesExtractor/errorMessagesExtractor.service";
8
8
  * Injection token used for injecting global options for ValidationErrorRendererFactory
9
9
  */
10
10
  export const VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS = new InjectionToken('VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS');
11
+ //TODO: div renderer as custom component, wrapper div renderer
11
12
  /**
12
13
  * Service used for creating validation errors renderer
13
14
  */
@@ -78,27 +79,16 @@ export class DefaultValidationErrorRenderer {
78
79
  * @param errorMessages - Object storing error messages to be used as override
79
80
  * @param onlyShow - Indication that update performs only displaying of existing errors
80
81
  */
81
- update(errorMessages, onlyShow = false) {
82
+ update(errorMessages) {
82
83
  let result = false;
83
- if (onlyShow) {
84
- this._isSubmittedOrDirty(() => {
85
- this._show();
86
- this._toggleErrors();
87
- result = true;
88
- }, () => {
89
- this._hide();
90
- result = false;
91
- }, !!this._lastErrors);
92
- return result;
93
- }
94
84
  //hides old errors
95
85
  this._toggleErrors(false);
96
86
  this._lastErrors = this._errorMessagesExtractor.getErrors(this._control, errorMessages);
97
87
  if (this._lastErrors) {
98
88
  this._isSubmittedOrDirty(() => {
99
89
  this._show();
100
- result = true;
101
90
  this._toggleErrors();
91
+ result = true;
102
92
  }, () => {
103
93
  this._hide();
104
94
  result = false;
@@ -1 +1 @@
1
- {"version":3,"file":"validationErrorRenderer.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {Injectable, Inject, InjectionToken, Optional, Injector, ComponentFactoryResolver, ApplicationRef, EmbeddedViewRef, ComponentRef} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {DOCUMENT} from '@angular/common';\nimport {extend, StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorRenderer, IsSubmittedOrDirtyFunc, ValidationErrorsRendererOptions, ValidationErrorRendererFactoryOptions, ValidationErrorsComponent} from './validationErrorRenderer.interface';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Injection token used for injecting global options for ValidationErrorRendererFactory\n */\nexport const VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS: InjectionToken<ValidationErrorRendererFactoryOptions> = new InjectionToken<ValidationErrorRendererFactoryOptions>('VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS');\n\n/**\n * Service used for creating validation errors renderer\n */\n@Injectable({providedIn: 'root'})\nexport class ValidationErrorRendererFactory\n{\n //######################### protected fields #########################\n\n /**\n * Options for validation error renderer factory\n */\n protected _options: ValidationErrorRendererFactoryOptions;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n @Inject(DOCUMENT) protected _document: Document,\n @Optional() @Inject(VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS) options: ValidationErrorRendererFactoryOptions)\n {\n this._options = extend(true, {}, DEFAULT_OPTIONS, options);\n }\n\n //######################### public methods #########################\n\n /**\n * Creates new instance of ValidationErrorRenderer\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer factory\n */\n public create(control: FormControl,\n controlElement: HTMLElement,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorRendererFactoryOptions): ValidationErrorRenderer\n {\n const opts: ValidationErrorRendererFactoryOptions = extend(true, {}, this._options, options);\n\n return new opts.rendererType(this._errorMessagesExtractor,\n control,\n controlElement,\n this._document,\n injector,\n isSubmittedOrDirty,\n opts);\n }\n}\n\n/**\n * Default implementation of validation error renderer\n */\nexport class DefaultValidationErrorRenderer implements ValidationErrorRenderer\n{\n //######################### protected fields #########################\n\n /**\n * Html element attribute storing error messages\n */\n protected _errorMessageAttr: Attr;\n\n /**\n * Object storing last obtained errors\n */\n protected _lastErrors: ValidationErrorsResult;\n\n /**\n * Component used for displaying errors\n */\n protected _component: ComponentRef<ValidationErrorsComponent>;\n\n //######################### public properties - implementation of ValidationErrorRenderer #########################\n\n /**\n * Html element that is wrapping errors\n */\n public wrapperElement: HTMLElement;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n protected _control: FormControl,\n protected _controlElement: HTMLElement,\n protected _document: Document,\n protected _injector: Injector,\n protected _isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n protected _options: ValidationErrorsRendererOptions)\n {\n this._initialize();\n }\n\n //######################### public methods - implementation of ValiDationErrorRenderer #########################\n\n /**\n * Destroys renderer and everything that was rendered\n */\n public destroy(): void\n {\n if(this._component)\n {\n this._injector.get(ApplicationRef).detachView(this._component.hostView);\n this._component.destroy();\n this._component = null;\n }\n\n this.wrapperElement?.remove();\n this.wrapperElement = null;\n }\n\n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n public update(errorMessages?: StringDictionary, onlyShow: boolean = false): boolean\n {\n let result = false;\n\n if(onlyShow)\n {\n this._isSubmittedOrDirty(() =>\n {\n this._show();\n this._toggleErrors();\n result = true;\n },\n () =>\n {\n this._hide();\n result = false;\n },\n !!this._lastErrors);\n\n return result;\n }\n\n //hides old errors\n this._toggleErrors(false);\n this._lastErrors = this._errorMessagesExtractor.getErrors(this._control, errorMessages);\n\n if(this._lastErrors)\n {\n this._isSubmittedOrDirty(() =>\n {\n this._show();\n result = true;\n this._toggleErrors();\n },\n () =>\n {\n this._hide();\n result = false;\n });\n }\n else\n {\n this._hide();\n result = false;\n }\n\n return result;\n }\n\n //######################### protected methods #########################\n\n /**\n * Toggles css classes for errors that are currently set\n * @param add - Indication whether add or remove errors\n */\n protected _toggleErrors(add: boolean = true): void\n {\n if(!this._lastErrors)\n {\n return;\n }\n\n const errorsClasses = this._lastErrors.errors.map(error => `${this._options.prefix}${error.toLowerCase()}${this._options.suffix}`);\n\n (add ? this._controlElement.classList.add : this._controlElement.classList.remove).apply(this._controlElement.classList, errorsClasses);\n (add ? this.wrapperElement.classList.add : this.wrapperElement.classList.remove).apply(this.wrapperElement.classList, errorsClasses);\n\n this._errorMessageAttr.value = (add ? this._lastErrors.errorMessages : [])\n .join(' ');\n\n this._render(add);\n }\n\n /**\n * Initialize renderer\n */\n protected _initialize(): void\n {\n this.wrapperElement = this._document.createElement('div');\n this._hide();\n this.wrapperElement.classList.add(this._options.wrapperDivClass);\n\n this._errorMessageAttr = this._document.createAttribute('data-error-message');\n\n this.wrapperElement.attributes.setNamedItem(this._errorMessageAttr);\n this._controlElement.after(this.wrapperElement);\n }\n\n /**\n * Renders error messages\n * @param add - Indication whether add or remove errors\n */\n protected _render(add: boolean): void\n {\n if(this._options.component)\n {\n this._renderComponent(add);\n }\n else if(this._options.template)\n {\n this._renderTemplate(add);\n }\n else\n {\n this._renderDivs(add);\n }\n }\n\n /**\n * Renders divs with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderDivs(add: boolean = true): void\n {\n if(!add)\n {\n const children = this.wrapperElement.children;\n \n //first clean old messages\n for(let x = children.length - 1; x >= 0; x--)\n {\n children.item(x).remove();\n }\n\n return;\n }\n\n if(this._lastErrors?.errorMessages?.length)\n {\n this._lastErrors.errorMessages.forEach(message =>\n {\n const errorDiv = this._document.createElement('div');\n\n errorDiv.innerText = message;\n\n this.wrapperElement.append(errorDiv);\n });\n }\n }\n\n /**\n * Renders component with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderComponent(add: boolean = true): void\n {\n if(add)\n {\n //render component\n if(!this._component)\n {\n // 1. Create a component reference from the component \n this._component = this._injector.get(ComponentFactoryResolver)\n .resolveComponentFactory(this._options.component)\n .create(this._injector);\n\n // 2. Attach component to the appRef so that it's inside the ng component tree\n this._injector.get(ApplicationRef).attachView(this._component.hostView);\n\n // 3. Get DOM element from component\n const domElem = (this._component.hostView as EmbeddedViewRef<any>)\n .rootNodes[0] as HTMLElement;\n\n // 4. Append DOM element to the body\n this.wrapperElement.append(domElem);\n }\n\n this._component.instance.show(this._lastErrors);\n }\n else if(this._component)\n {\n this._component.instance.show(null);\n }\n }\n\n /**\n * Renders template with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderTemplate(_add: boolean = true): void\n {\n\n }\n\n /**\n * Shows wrapper element\n */\n protected _show(): void\n {\n this.wrapperElement.style.display = 'block';\n }\n\n /**\n * Hides wrapper element\n */\n protected _hide(): void\n {\n this.wrapperElement.style.display = 'none';\n }\n}\n\nconst DEFAULT_OPTIONS: ValidationErrorRendererFactoryOptions =\n{\n prefix: 'ng-',\n suffix: '-error',\n wrapperDivClass: 'validation-error-div',\n rendererType: DefaultValidationErrorRenderer\n};"]}
1
+ {"version":3,"file":"validationErrorRenderer.service.js","sourceRoot":"","sources":["../../../../../forms/src/services/validationErrorRenderer/validationErrorRenderer.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {Injectable, Inject, InjectionToken, Optional, Injector, ComponentFactoryResolver, ApplicationRef, EmbeddedViewRef, ComponentRef} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {DOCUMENT} from '@angular/common';\nimport {extend, StringDictionary} from '@jscrpt/common';\n\nimport {ErrorMessagesExtractor} from '../errorMessagesExtractor/errorMessagesExtractor.service';\nimport {ValidationErrorRenderer, IsSubmittedOrDirtyFunc, ValidationErrorsRendererOptions, ValidationErrorRendererFactoryOptions, ValidationErrorsComponent} from './validationErrorRenderer.interface';\nimport {ValidationErrorsResult} from '../errorMessagesExtractor/errorMessagesExtractor.interface';\n\n/**\n * Injection token used for injecting global options for ValidationErrorRendererFactory\n */\nexport const VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS: InjectionToken<ValidationErrorRendererFactoryOptions> = new InjectionToken<ValidationErrorRendererFactoryOptions>('VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS');\n\n//TODO: div renderer as custom component, wrapper div renderer\n\n/**\n * Service used for creating validation errors renderer\n */\n@Injectable({providedIn: 'root'})\nexport class ValidationErrorRendererFactory\n{\n //######################### protected fields #########################\n\n /**\n * Options for validation error renderer factory\n */\n protected _options: ValidationErrorRendererFactoryOptions;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n @Inject(DOCUMENT) protected _document: Document,\n @Optional() @Inject(VALIDATION_ERROR_RENDERER_FACTORY_OPTIONS) options: ValidationErrorRendererFactoryOptions)\n {\n this._options = extend(true, {}, DEFAULT_OPTIONS, options);\n }\n\n //######################### public methods #########################\n\n /**\n * Creates new instance of ValidationErrorRenderer\n * @param control - Control that is being processed for errors\n * @param controlElement - Html element that represents control that is being processed\n * @param isSubmittedOrDirty - Function used for testing if control is submitted or dirty\n * @param options - Options for validation errors renderer factory\n */\n public create(control: FormControl,\n controlElement: HTMLElement,\n injector: Injector,\n isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n options: ValidationErrorRendererFactoryOptions): ValidationErrorRenderer\n {\n const opts: ValidationErrorRendererFactoryOptions = extend(true, {}, this._options, options);\n\n return new opts.rendererType(this._errorMessagesExtractor,\n control,\n controlElement,\n this._document,\n injector,\n isSubmittedOrDirty,\n opts);\n }\n}\n\n/**\n * Default implementation of validation error renderer\n */\nexport class DefaultValidationErrorRenderer implements ValidationErrorRenderer\n{\n //######################### protected fields #########################\n\n /**\n * Html element attribute storing error messages\n */\n protected _errorMessageAttr: Attr;\n\n /**\n * Object storing last obtained errors\n */\n protected _lastErrors: ValidationErrorsResult;\n\n /**\n * Component used for displaying errors\n */\n protected _component: ComponentRef<ValidationErrorsComponent>;\n\n //######################### public properties - implementation of ValidationErrorRenderer #########################\n\n /**\n * Html element that is wrapping errors\n */\n public wrapperElement: HTMLElement;\n\n //######################### constructor #########################\n constructor(protected _errorMessagesExtractor: ErrorMessagesExtractor,\n protected _control: FormControl,\n protected _controlElement: HTMLElement,\n protected _document: Document,\n protected _injector: Injector,\n protected _isSubmittedOrDirty: IsSubmittedOrDirtyFunc,\n protected _options: ValidationErrorsRendererOptions)\n {\n this._initialize();\n }\n\n //######################### public methods - implementation of ValiDationErrorRenderer #########################\n\n /**\n * Destroys renderer and everything that was rendered\n */\n public destroy(): void\n {\n if(this._component)\n {\n this._injector.get(ApplicationRef).detachView(this._component.hostView);\n this._component.destroy();\n this._component = null;\n }\n\n this.wrapperElement?.remove();\n this.wrapperElement = null;\n }\n\n /**\n * Updates rendered errors for current state and returns true if errors were rendered, otherwise false\n * @param errorMessages - Object storing error messages to be used as override\n * @param onlyShow - Indication that update performs only displaying of existing errors\n */\n public update(errorMessages?: StringDictionary): boolean\n {\n let result = false;\n\n //hides old errors\n this._toggleErrors(false);\n this._lastErrors = this._errorMessagesExtractor.getErrors(this._control, errorMessages);\n\n if(this._lastErrors)\n {\n this._isSubmittedOrDirty(() =>\n {\n this._show();\n this._toggleErrors();\n result = true;\n },\n () =>\n {\n this._hide();\n result = false;\n });\n }\n else\n {\n this._hide();\n result = false;\n }\n\n return result;\n }\n\n //######################### protected methods #########################\n\n /**\n * Toggles css classes for errors that are currently set\n * @param add - Indication whether add or remove errors\n */\n protected _toggleErrors(add: boolean = true): void\n {\n if(!this._lastErrors)\n {\n return;\n }\n\n const errorsClasses = this._lastErrors.errors.map(error => `${this._options.prefix}${error.toLowerCase()}${this._options.suffix}`);\n\n (add ? this._controlElement.classList.add : this._controlElement.classList.remove).apply(this._controlElement.classList, errorsClasses);\n (add ? this.wrapperElement.classList.add : this.wrapperElement.classList.remove).apply(this.wrapperElement.classList, errorsClasses);\n\n this._errorMessageAttr.value = (add ? this._lastErrors.errorMessages : [])\n .join(' ');\n\n this._render(add);\n }\n\n /**\n * Initialize renderer\n */\n protected _initialize(): void\n {\n this.wrapperElement = this._document.createElement('div');\n this._hide();\n this.wrapperElement.classList.add(this._options.wrapperDivClass);\n\n this._errorMessageAttr = this._document.createAttribute('data-error-message');\n\n this.wrapperElement.attributes.setNamedItem(this._errorMessageAttr);\n this._controlElement.after(this.wrapperElement);\n }\n\n /**\n * Renders error messages\n * @param add - Indication whether add or remove errors\n */\n protected _render(add: boolean): void\n {\n if(this._options.component)\n {\n this._renderComponent(add);\n }\n else if(this._options.template)\n {\n this._renderTemplate(add);\n }\n else\n {\n this._renderDivs(add);\n }\n }\n\n /**\n * Renders divs with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderDivs(add: boolean = true): void\n {\n if(!add)\n {\n const children = this.wrapperElement.children;\n \n //first clean old messages\n for(let x = children.length - 1; x >= 0; x--)\n {\n children.item(x).remove();\n }\n\n return;\n }\n\n if(this._lastErrors?.errorMessages?.length)\n {\n this._lastErrors.errorMessages.forEach(message =>\n {\n const errorDiv = this._document.createElement('div');\n\n errorDiv.innerText = message;\n\n this.wrapperElement.append(errorDiv);\n });\n }\n }\n\n /**\n * Renders component with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderComponent(add: boolean = true): void\n {\n if(add)\n {\n //render component\n if(!this._component)\n {\n // 1. Create a component reference from the component \n this._component = this._injector.get(ComponentFactoryResolver)\n .resolveComponentFactory(this._options.component)\n .create(this._injector);\n\n // 2. Attach component to the appRef so that it's inside the ng component tree\n this._injector.get(ApplicationRef).attachView(this._component.hostView);\n\n // 3. Get DOM element from component\n const domElem = (this._component.hostView as EmbeddedViewRef<any>)\n .rootNodes[0] as HTMLElement;\n\n // 4. Append DOM element to the body\n this.wrapperElement.append(domElem);\n }\n\n this._component.instance.show(this._lastErrors);\n }\n else if(this._component)\n {\n this._component.instance.show(null);\n }\n }\n\n /**\n * Renders template with errors\n * @param add - Indication whether add or remove errors\n */\n protected _renderTemplate(_add: boolean = true): void\n {\n\n }\n\n /**\n * Shows wrapper element\n */\n protected _show(): void\n {\n this.wrapperElement.style.display = 'block';\n }\n\n /**\n * Hides wrapper element\n */\n protected _hide(): void\n {\n this.wrapperElement.style.display = 'none';\n }\n}\n\nconst DEFAULT_OPTIONS: ValidationErrorRendererFactoryOptions =\n{\n prefix: 'ng-',\n suffix: '-error',\n wrapperDivClass: 'validation-error-div',\n rendererType: DefaultValidationErrorRenderer\n};"]}
@@ -63,7 +63,6 @@ export declare class HasErrorDirective implements OnInit, OnDestroy {
63
63
  ngOnDestroy(): void;
64
64
  /**
65
65
  * Updates status of control and css classes
66
- * @param onlyShow - Indication that update performs only displaying of existing errors
67
66
  */
68
67
  private _updateStatus;
69
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hasError.directive.d.ts","sourceRoot":"","sources":["hasError.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAsB,MAAM,EAAE,SAAS,EAAiB,QAAQ,EAAC,MAAM,eAAe,CAAC;AACpH,OAAO,EAAC,oBAAoB,EAAE,eAAe,EAAe,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAC,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAuB,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAGtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,wEAAwE,CAAC;AACtH,OAAO,EAAC,uBAAuB,EAAC,MAAM,0EAA0E,CAAC;AACjH,OAAO,EAAC,gBAAgB,EAAC,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAC,sBAAsB,EAAC,MAAM,0CAA0C,CAAC;;AAIhF;;GAEG;AACH,qBAIa,iBAAkB,YAAW,MAAM,EAAE,SAAS;IAuD3C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACA,OAAO,CAAC,cAAc;IAClC,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACJ,SAAS,CAAC,mBAAmB,EAAE,kBAAkB;IAC9E,SAAS,CAAC,SAAS,EAAE,QAAQ;IA3DzC;;OAEG;IACH,OAAO,CAAC,cAAc,CAAoC;IAE1D;;OAEG;IACH,OAAO,CAAC,GAAG,CAA0B;IAErC;;OAEG;IACH,OAAO,CAAC,cAAc,CAAkB;IAExC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAkB;IAEpC;;OAEG;IACH,OAAO,CAAC,SAAS,CAAmB;IAIpC;;OAEG;IACH,OAAO,KAAK,OAAO,GAGlB;IAID;;OAEG;IACI,QAAQ,EAAE,uBAAuB,CAAC;IAIzC;;OAEG;IAEI,aAAa,EAAE,gBAAgB,CAAC;gBAGnB,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,EACjC,gBAAgB,EAAE,8BAA8B,EACxB,cAAc,EAAE,sBAAsB,EAClD,YAAY,EAAE,oBAAoB,EAClC,gBAAgB,EAAE,eAAe,EACjC,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,gBAAgB,EACZ,mBAAmB,EAAE,kBAAkB,EACpE,SAAS,EAAE,QAAQ;IAMzC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAwBvB;;OAEG;IACI,WAAW,IAAI,IAAI;IAW1B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;;OAKG;IAEH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,yBAAyB;yCA/JxB,iBAAiB;2CAAjB,iBAAiB;CA+K7B"}
1
+ {"version":3,"file":"hasError.directive.d.ts","sourceRoot":"","sources":["hasError.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAsB,MAAM,EAAE,SAAS,EAAiB,QAAQ,EAAC,MAAM,eAAe,CAAC;AACpH,OAAO,EAAC,oBAAoB,EAAE,eAAe,EAAe,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAC,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAuB,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAGtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,wEAAwE,CAAC;AACtH,OAAO,EAAC,uBAAuB,EAAC,MAAM,0EAA0E,CAAC;AACjH,OAAO,EAAC,gBAAgB,EAAC,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAC,sBAAsB,EAAC,MAAM,0CAA0C,CAAC;;AAIhF;;GAEG;AACH,qBAIa,iBAAkB,YAAW,MAAM,EAAE,SAAS;IAuD3C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACA,OAAO,CAAC,cAAc;IAClC,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACJ,SAAS,CAAC,mBAAmB,EAAE,kBAAkB;IAC9E,SAAS,CAAC,SAAS,EAAE,QAAQ;IA3DzC;;OAEG;IACH,OAAO,CAAC,cAAc,CAAoC;IAE1D;;OAEG;IACH,OAAO,CAAC,GAAG,CAA0B;IAErC;;OAEG;IACH,OAAO,CAAC,cAAc,CAAkB;IAExC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAkB;IAEpC;;OAEG;IACH,OAAO,CAAC,SAAS,CAAmB;IAIpC;;OAEG;IACH,OAAO,KAAK,OAAO,GAGlB;IAID;;OAEG;IACI,QAAQ,EAAE,uBAAuB,CAAC;IAIzC;;OAEG;IAEI,aAAa,EAAE,gBAAgB,CAAC;gBAGnB,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,EACjC,gBAAgB,EAAE,8BAA8B,EACxB,cAAc,EAAE,sBAAsB,EAClD,YAAY,EAAE,oBAAoB,EAClC,gBAAgB,EAAE,eAAe,EACjC,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,gBAAgB,EACZ,mBAAmB,EAAE,kBAAkB,EACpE,SAAS,EAAE,QAAQ;IAMzC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAwBvB;;OAEG;IACI,WAAW,IAAI,IAAI;IAW1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;;OAKG;IAEH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,yBAAyB;yCA9JxB,iBAAiB;2CAAjB,iBAAiB;CA8K7B"}
@@ -1,10 +1,11 @@
1
1
  import { AsyncValidatorFn, ValidatorFn } from '@angular/forms';
2
+ import { Dictionary } from '@jscrpt/common';
2
3
  import { AsyncValidatorFnFactory, ValidatorFnFactory } from '../misc/validatorFactories';
3
4
  import { ModelPropertyDecoratorMetadata } from './modelPropertyDecoratorMetadata';
4
5
  /**
5
6
  * Metadata describing whole model
6
7
  */
7
- export interface ModelDecoratorMetadata<TModel = any> {
8
+ export interface ModelDecoratorMetadata<TModel = any, TArgs extends Dictionary<any> = any> {
8
9
  /**
9
10
  * Array of controls metadata
10
11
  */
@@ -17,5 +18,9 @@ export interface ModelDecoratorMetadata<TModel = any> {
17
18
  * Array of async validator functions
18
19
  */
19
20
  ɵAsyncValidators?: Array<AsyncValidatorFn | AsyncValidatorFnFactory>;
21
+ /**
22
+ * Object storing additional arguments for customization
23
+ */
24
+ ɵArgs?: TArgs;
20
25
  }
21
26
  //# sourceMappingURL=modelDecoratorMetadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modelDecoratorMetadata.d.ts","sourceRoot":"","sources":["modelDecoratorMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAC,uBAAuB,EAAE,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AACvF,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,MAAM,GAAG,GAAG;IAEhD;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,MAAM,EAAE,8BAA8B,CAAC,CAAC,CAAC;IAEjF;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,WAAW,GAAC,kBAAkB,CAAC,CAAC;IAEpD;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,gBAAgB,GAAC,uBAAuB,CAAC,CAAC;CACtE"}
1
+ {"version":3,"file":"modelDecoratorMetadata.d.ts","sourceRoot":"","sources":["modelDecoratorMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAC,uBAAuB,EAAE,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AACvF,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,SAAS,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG;IAErF;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,MAAM,EAAE,8BAA8B,CAAC,CAAC,CAAC;IAEjF;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,WAAW,GAAC,kBAAkB,CAAC,CAAC;IAEpD;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,gBAAgB,GAAC,uBAAuB,CAAC,CAAC;IAEnE;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,SAAS,EAAC,MAAM,gBAAgB,CAAC;AA8HlF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAG5G"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAiIlF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAG5G"}
@@ -1,4 +1,3 @@
1
- import { Injector } from '@angular/core';
2
1
  import { FormControl } from '@angular/forms';
3
2
  import { StringLocalization } from '@anglr/common';
4
3
  import { StringDictionary } from '@jscrpt/common';
@@ -8,15 +7,12 @@ import * as i0 from "@angular/core";
8
7
  * Service used for extracting error messages from form control
9
8
  */
10
9
  export declare class ErrorMessagesExtractor {
10
+ protected _stringLocalization: StringLocalization;
11
11
  /**
12
12
  * Dictionary with error names that have defined message
13
13
  */
14
14
  protected _errorMessages: StringDictionary;
15
- /**
16
- * String localization service
17
- */
18
- protected _stringLocalization: StringLocalization;
19
- constructor(injector: Injector, globalErrorMessages?: StringDictionary);
15
+ constructor(_stringLocalization: StringLocalization, globalErrorMessages?: StringDictionary);
20
16
  /**
21
17
  * Gets validation errors result for provided control, or null of no errors are present
22
18
  * @param control - Form control instance that should be inspected for errors
@@ -1 +1 @@
1
- {"version":3,"file":"errorMessagesExtractor.service.d.ts","sourceRoot":"","sources":["errorMessagesExtractor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,QAAQ,EAAC,MAAM,eAAe,CAAC;AACrE,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAC,gBAAgB,EAAmB,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAC,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;;AAgB1E;;GAEG;AACH,qBACa,sBAAsB;IAI/B;;OAEG;IACH,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;gBAGtC,QAAQ,EAAE,QAAQ,EAC6B,mBAAmB,CAAC,EAAE,gBAAgB;IAQjG;;;;OAIG;IACI,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,sBAAsB;yCA7BlF,sBAAsB;6CAAtB,sBAAsB;CAqElC"}
1
+ {"version":3,"file":"errorMessagesExtractor.service.d.ts","sourceRoot":"","sources":["errorMessagesExtractor.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAC,gBAAgB,EAAmB,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAC,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;;AAkB1E;;GAEG;AACH,qBACa,sBAAsB;IAUU,SAAS,CAAC,mBAAmB,EAAE,kBAAkB;IAN1F;;OAEG;IACH,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC;gBAGQ,mBAAmB,EAAE,kBAAkB,EAC/B,mBAAmB,CAAC,EAAE,gBAAgB;IAOjG;;;;OAIG;IACI,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,sBAAsB;yCAvBlF,sBAAsB;6CAAtB,sBAAsB;CA+DlC"}
@@ -99,8 +99,7 @@ export interface ValidationErrorRenderer {
99
99
  /**
100
100
  * Updates rendered errors for current state and returns true if errors were rendered, otherwise false
101
101
  * @param errorMessages - Object storing error messages to be used as override
102
- * @param onlyShow - Indication that update performs only displaying of existing errors
103
102
  */
104
- update(errorMessages?: StringDictionary, onlyShow?: boolean): boolean;
103
+ update(errorMessages?: StringDictionary): boolean;
105
104
  }
106
105
  //# sourceMappingURL=validationErrorRenderer.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validationErrorRenderer.interface.d.ts","sourceRoot":"","sources":["validationErrorRenderer.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0DAA0D,CAAC;AAChG,OAAO,EAAC,sBAAsB,EAAC,MAAM,4DAA4D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAEnC;;;;;OAKG;IACH,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,IAAI,EAAE,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACvF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IAEtC;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAE5C;;OAEG;IACH,SAAS,EAAE,sBAAsB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAE5C;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC,+BAA+B,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,qCAAsC,SAAQ,+BAA+B;IAE1F;;OAEG;IACH,YAAY,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAExC;;;;;;;;;OASG;IACH,KAAI,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,EAAE,sBAAsB,EAC1C,OAAO,EAAE,+BAA+B,GAAG,uBAAuB,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IAEpC;;OAEG;IACH,cAAc,EAAE,WAAW,CAAC;IAE5B;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CACzE"}
1
+ {"version":3,"file":"validationErrorRenderer.interface.d.ts","sourceRoot":"","sources":["validationErrorRenderer.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0DAA0D,CAAC;AAChG,OAAO,EAAC,sBAAsB,EAAC,MAAM,4DAA4D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAEnC;;;;;OAKG;IACH,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,IAAI,EAAE,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACvF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IAEtC;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAE5C;;OAEG;IACH,SAAS,EAAE,sBAAsB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAE5C;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC,+BAA+B,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,qCAAsC,SAAQ,+BAA+B;IAE1F;;OAEG;IACH,YAAY,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAExC;;;;;;;;;OASG;IACH,KAAI,sBAAsB,EAAE,sBAAsB,EAC9C,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,EAAE,sBAAsB,EAC1C,OAAO,EAAE,+BAA+B,GAAG,uBAAuB,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IAEpC;;OAEG;IACH,cAAc,EAAE,WAAW,CAAC;IAE5B;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;CACrD"}
@@ -68,7 +68,7 @@ export declare class DefaultValidationErrorRenderer implements ValidationErrorRe
68
68
  * @param errorMessages - Object storing error messages to be used as override
69
69
  * @param onlyShow - Indication that update performs only displaying of existing errors
70
70
  */
71
- update(errorMessages?: StringDictionary, onlyShow?: boolean): boolean;
71
+ update(errorMessages?: StringDictionary): boolean;
72
72
  /**
73
73
  * Toggles css classes for errors that are currently set
74
74
  * @param add - Indication whether add or remove errors
@@ -1 +1 @@
1
- {"version":3,"file":"validationErrorRenderer.service.d.ts","sourceRoot":"","sources":["validationErrorRenderer.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,cAAc,EAAY,QAAQ,EAA6D,YAAY,EAAC,MAAM,eAAe,CAAC;AAC9J,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAS,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0DAA0D,CAAC;AAChG,OAAO,EAAC,uBAAuB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,qCAAqC,EAAE,yBAAyB,EAAC,MAAM,qCAAqC,CAAC;AACvM,OAAO,EAAC,sBAAsB,EAAC,MAAM,4DAA4D,CAAC;;AAElG;;GAEG;AACH,eAAO,MAAM,yCAAyC,EAAE,cAAc,CAAC,qCAAqC,CAA0G,CAAC;AAEvN;;GAEG;AACH,qBACa,8BAA8B;IAU3B,SAAS,CAAC,uBAAuB,EAAE,sBAAsB;IACvC,SAAS,CAAC,SAAS,EAAE,QAAQ;IAP3D;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,qCAAqC,CAAC;gBAGpC,uBAAuB,EAAE,sBAAsB,EAC7B,SAAS,EAAE,QAAQ,EACgB,OAAO,EAAE,qCAAqC;IAOzH;;;;;;OAMG;IACI,MAAM,CAAC,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,EAAE,sBAAsB,EAC1C,OAAO,EAAE,qCAAqC,GAAG,uBAAuB;yCA9B7E,8BAA8B;6CAA9B,8BAA8B;CA0C1C;AAED;;GAEG;AACH,qBAAa,8BAA+B,YAAW,uBAAuB;IA2B9D,SAAS,CAAC,uBAAuB,EAAE,sBAAsB;IACzD,SAAS,CAAC,QAAQ,EAAE,WAAW;IAC/B,SAAS,CAAC,eAAe,EAAE,WAAW;IACtC,SAAS,CAAC,SAAS,EAAE,QAAQ;IAC7B,SAAS,CAAC,SAAS,EAAE,QAAQ;IAC7B,SAAS,CAAC,mBAAmB,EAAE,sBAAsB;IACrD,SAAS,CAAC,QAAQ,EAAE,+BAA+B;IA7B/D;;OAEG;IACH,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAElC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAE9C;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAI9D;;OAEG;IACI,cAAc,EAAE,WAAW,CAAC;gBAGb,uBAAuB,EAAE,sBAAsB,EAC/C,QAAQ,EAAE,WAAW,EACrB,eAAe,EAAE,WAAW,EAC5B,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,QAAQ,EACnB,mBAAmB,EAAE,sBAAsB,EAC3C,QAAQ,EAAE,+BAA+B;IAO/D;;OAEG;IACI,OAAO,IAAI,IAAI;IAatB;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO;IAmDnF;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,GAAG,GAAE,OAAc,GAAG,IAAI;IAkBlD;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAY7B;;;OAGG;IACH,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAgBrC;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,GAAG,GAAE,OAAc,GAAG,IAAI;IA4BhD;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,GAAG,GAAE,OAAc,GAAG,IAAI;IA+BrD;;;OAGG;IACH,SAAS,CAAC,eAAe,CAAC,IAAI,GAAE,OAAc,GAAG,IAAI;IAKrD;;OAEG;IACH,SAAS,CAAC,KAAK,IAAI,IAAI;IAKvB;;OAEG;IACH,SAAS,CAAC,KAAK,IAAI,IAAI;CAI1B"}
1
+ {"version":3,"file":"validationErrorRenderer.service.d.ts","sourceRoot":"","sources":["validationErrorRenderer.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,cAAc,EAAY,QAAQ,EAA6D,YAAY,EAAC,MAAM,eAAe,CAAC;AAC9J,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAS,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAC,sBAAsB,EAAC,MAAM,0DAA0D,CAAC;AAChG,OAAO,EAAC,uBAAuB,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,qCAAqC,EAAE,yBAAyB,EAAC,MAAM,qCAAqC,CAAC;AACvM,OAAO,EAAC,sBAAsB,EAAC,MAAM,4DAA4D,CAAC;;AAElG;;GAEG;AACH,eAAO,MAAM,yCAAyC,EAAE,cAAc,CAAC,qCAAqC,CAA0G,CAAC;AAIvN;;GAEG;AACH,qBACa,8BAA8B;IAU3B,SAAS,CAAC,uBAAuB,EAAE,sBAAsB;IACvC,SAAS,CAAC,SAAS,EAAE,QAAQ;IAP3D;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,qCAAqC,CAAC;gBAGpC,uBAAuB,EAAE,sBAAsB,EAC7B,SAAS,EAAE,QAAQ,EACgB,OAAO,EAAE,qCAAqC;IAOzH;;;;;;OAMG;IACI,MAAM,CAAC,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,EAAE,sBAAsB,EAC1C,OAAO,EAAE,qCAAqC,GAAG,uBAAuB;yCA9B7E,8BAA8B;6CAA9B,8BAA8B;CA0C1C;AAED;;GAEG;AACH,qBAAa,8BAA+B,YAAW,uBAAuB;IA2B9D,SAAS,CAAC,uBAAuB,EAAE,sBAAsB;IACzD,SAAS,CAAC,QAAQ,EAAE,WAAW;IAC/B,SAAS,CAAC,eAAe,EAAE,WAAW;IACtC,SAAS,CAAC,SAAS,EAAE,QAAQ;IAC7B,SAAS,CAAC,SAAS,EAAE,QAAQ;IAC7B,SAAS,CAAC,mBAAmB,EAAE,sBAAsB;IACrD,SAAS,CAAC,QAAQ,EAAE,+BAA+B;IA7B/D;;OAEG;IACH,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAElC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAE9C;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAI9D;;OAEG;IACI,cAAc,EAAE,WAAW,CAAC;gBAGb,uBAAuB,EAAE,sBAAsB,EAC/C,QAAQ,EAAE,WAAW,EACrB,eAAe,EAAE,WAAW,EAC5B,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,QAAQ,EACnB,mBAAmB,EAAE,sBAAsB,EAC3C,QAAQ,EAAE,+BAA+B;IAO/D;;OAEG;IACI,OAAO,IAAI,IAAI;IAatB;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,EAAE,gBAAgB,GAAG,OAAO;IAiCxD;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,GAAG,GAAE,OAAc,GAAG,IAAI;IAkBlD;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAY7B;;;OAGG;IACH,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAgBrC;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,GAAG,GAAE,OAAc,GAAG,IAAI;IA4BhD;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,GAAG,GAAE,OAAc,GAAG,IAAI;IA+BrD;;;OAGG;IACH,SAAS,CAAC,eAAe,CAAC,IAAI,GAAE,OAAc,GAAG,IAAI;IAKrD;;OAEG;IACH,SAAS,CAAC,KAAK,IAAI,IAAI;IAKvB;;OAEG;IACH,SAAS,CAAC,KAAK,IAAI,IAAI;CAI1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anglr/common",
3
- "version": "11.3.1",
3
+ "version": "12.0.0-beta.20220413111906",
4
4
  "description": "Angular module for common angular stuff",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/version.bak CHANGED
@@ -1 +1 @@
1
- 11.3.1
1
+ 12.0.0-beta.20220413111906