@starley/ion-directives 1.3.21 → 1.3.23-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -35,25 +35,25 @@ import { DirectivesModule } from '@starley/ion-directives';
35
35
  export class MyComponent {}
36
36
  ```
37
37
 
38
- ### Para usar a formUtilService
38
+ ### Para usar a FormChangeDetector
39
39
 
40
- * Importe a service FormUtilService no componente que desejar utilizar.
40
+ * Importe a service FormChangeDetector no componente que desejar utilizar.
41
41
 
42
42
  * Injete a service no construtor do componente:
43
43
 
44
44
  ```typescript
45
- constructor(private formUtilService: FormUtilService) {}
45
+ constructor(private formChangeDetector: FormChangeDetector) {}
46
46
  ```
47
47
 
48
48
  Crie o formulario usando o FormGroup, e chame o método `prepareFormChangeDetection` passando o formulário como parâmetro.
49
49
 
50
- Ex: this.myForm = this.formUtilService.prepareFormChangeDetection(this.myForm);
50
+ Ex: this.myForm = this.formChangeDetector.prepareFormChangeDetection(this.myForm);
51
51
 
52
52
  É necessário retornar o formulário para a própria variável, pois quando o formulário é atualizado, as mudanças precisam ser refletidas na variável para que o sistema de detecção de mudanças do Angular funcione corretamente.
53
53
 
54
54
  Agora temos a variavel booleana `isDirty` que indica se o formulário foi modificado e pode ser usada para habilitar/desabilitar botões de salvar com base nas alterações.
55
55
 
56
- Ex: if(this.formUtilService.isDirty) { ... }
56
+ Ex: if(this.formChangeDetector.isDirty) { ... }
57
57
 
58
58
  Agora você pode usar o formulário com detecção de mudanças automaticamente.
59
59
 
@@ -1,11 +1,13 @@
1
1
  import { FormGroup } from '@angular/forms';
2
2
  import * as i0 from "@angular/core";
3
- export declare class FormUtilService {
3
+ export declare class FormChangeDetector {
4
4
  isDirty: boolean;
5
5
  private originalFormValues;
6
6
  private clearFormChangeDetection;
7
7
  prepareFormChangeDetection(documentForm: FormGroup): FormGroup<any>;
8
8
  private formChangeDetection;
9
- static ɵfac: i0.ɵɵFactoryDeclaration<FormUtilService, never>;
10
- static ɵprov: i0.ɵɵInjectableDeclaration<FormUtilService>;
9
+ extractFormChanges(documentForm: FormGroup): any;
10
+ private buildChangedValues;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormChangeDetector, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<FormChangeDetector>;
11
13
  }
@@ -0,0 +1,97 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
+ if (ar || !(i in from)) {
15
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
+ ar[i] = from[i];
17
+ }
18
+ }
19
+ return to.concat(ar || Array.prototype.slice.call(from));
20
+ };
21
+ import { Injectable } from '@angular/core';
22
+ import * as i0 from "@angular/core";
23
+ var FormChangeDetector = /** @class */ (function () {
24
+ function FormChangeDetector() {
25
+ this.isDirty = false;
26
+ }
27
+ FormChangeDetector.prototype.clearFormChangeDetection = function () {
28
+ this.originalFormValues = null;
29
+ this.isDirty = false;
30
+ };
31
+ FormChangeDetector.prototype.prepareFormChangeDetection = function (documentForm) {
32
+ this.clearFormChangeDetection();
33
+ this.originalFormValues = __assign({}, documentForm.getRawValue());
34
+ // Garante estado pristine inicial
35
+ documentForm.markAsPristine();
36
+ documentForm.markAsUntouched();
37
+ this.isDirty = false;
38
+ this.formChangeDetection(documentForm);
39
+ return documentForm;
40
+ };
41
+ FormChangeDetector.prototype.formChangeDetection = function (documentForm) {
42
+ var _this = this;
43
+ documentForm.valueChanges.subscribe(function () {
44
+ if (!_this.originalFormValues) {
45
+ _this.isDirty = false;
46
+ return;
47
+ }
48
+ var currentValues = documentForm.getRawValue();
49
+ var normalizedCurrent = __assign({}, currentValues);
50
+ var normalizedOriginal = __assign({}, _this.originalFormValues);
51
+ _this.isDirty = JSON.stringify(normalizedCurrent) !== JSON.stringify(normalizedOriginal);
52
+ });
53
+ };
54
+ FormChangeDetector.prototype.extractFormChanges = function (documentForm) {
55
+ if (!this.originalFormValues)
56
+ return {};
57
+ var currentValues = documentForm.getRawValue();
58
+ return this.buildChangedValues(this.originalFormValues, currentValues);
59
+ };
60
+ FormChangeDetector.prototype.buildChangedValues = function (original, current) {
61
+ if (original === null || original === undefined ||
62
+ current === null || current === undefined ||
63
+ typeof original !== typeof current) {
64
+ return original !== current ? current : undefined;
65
+ }
66
+ if (typeof original !== 'object' || original === null) {
67
+ // Valor primitivo
68
+ return original !== current ? current : undefined;
69
+ }
70
+ // Objeto ou array
71
+ var result = Array.isArray(original) ? [] : {};
72
+ var keys = new Set(__spreadArray(__spreadArray([], Object.keys(original), true), Object.keys(current), true));
73
+ var hasChanges = false;
74
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
75
+ var key = keys_1[_i];
76
+ var childOriginal = original[key];
77
+ var childCurrent = current[key];
78
+ var childResult = this.buildChangedValues(childOriginal, childCurrent);
79
+ if (childResult !== undefined) {
80
+ result[key] = childResult;
81
+ hasChanges = true;
82
+ }
83
+ }
84
+ return hasChanges ? result : undefined;
85
+ };
86
+ FormChangeDetector.ɵfac = function FormChangeDetector_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormChangeDetector)(); };
87
+ FormChangeDetector.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: FormChangeDetector, factory: FormChangeDetector.ɵfac, providedIn: 'root' });
88
+ return FormChangeDetector;
89
+ }());
90
+ export { FormChangeDetector };
91
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormChangeDetector, [{
92
+ type: Injectable,
93
+ args: [{
94
+ providedIn: 'root',
95
+ }]
96
+ }], null, null); })();
97
+ //# sourceMappingURL=form-change-detector.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-change-detector.service.js","sourceRoot":"","sources":["../../src/forms/form-change-detector.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;AAG3C;IAAA;QAKI,YAAO,GAAY,KAAK,CAAC;KA0E5B;IAtEW,qDAAwB,GAAhC;QACI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,uDAA0B,GAA1B,UAA2B,YAAuB;QAC9C,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,kBAAkB,gBAAQ,YAAY,CAAC,WAAW,EAAE,CAAE,CAAC;QAC5D,kCAAkC;QAClC,YAAY,CAAC,cAAc,EAAE,CAAC;QAC9B,YAAY,CAAC,eAAe,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAEvC,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,gDAAmB,GAA3B,UAA4B,YAAuB;QAAnD,iBAYC;QAXG,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;YAChC,IAAI,CAAC,KAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC3B,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,OAAO;YACX,CAAC;YAED,IAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,iBAAiB,gBAAQ,aAAa,CAAE,CAAC;YAC7C,IAAI,kBAAkB,gBAAQ,KAAI,CAAC,kBAAkB,CAAE,CAAC;YACxD,KAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACP,CAAC;IAED,+CAAkB,GAAlB,UAAmB,YAAuB;QACtC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,EAAE,CAAC;QAExC,IAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAC3E,CAAC;IAEO,+CAAkB,GAA1B,UAA2B,QAAa,EAAE,OAAY;QAClD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;YAC3C,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YACzC,OAAO,QAAQ,KAAK,OAAO,OAAO,EAAE,CAAC;YACrC,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,CAAC;QAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpD,kBAAkB;YAClB,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,CAAC;QAED,kBAAkB;QAClB,IAAM,MAAM,GAAQ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtD,IAAM,IAAI,GAAQ,IAAI,GAAG,iCAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAE,CAAC;QAE/E,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,KAAkB,UAAI,EAAJ,aAAI,EAAJ,kBAAI,EAAJ,IAAI,EAAE,CAAC;YAApB,IAAM,GAAG,aAAA;YACV,IAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpC,IAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,IAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YAEzE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;gBAC1B,UAAU,GAAG,IAAI,CAAC;YACtB,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;wHA1EQ,kBAAkB;4EAAlB,kBAAkB,WAAlB,kBAAkB,mBAFf,MAAM;6BAJtB;CAkFC,AA/ED,IA+EC;SA5EY,kBAAkB;uFAAlB,kBAAkB;cAH9B,UAAU;eAAC;gBACR,UAAU,EAAE,MAAM;aACrB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FormChangeDetector {\n\n isDirty: boolean = false;\n\n private originalFormValues: any;\n\n private clearFormChangeDetection() {\n this.originalFormValues = null;\n this.isDirty = false;\n }\n\n prepareFormChangeDetection(documentForm: FormGroup) {\n this.clearFormChangeDetection();\n this.originalFormValues = { ...documentForm.getRawValue() };\n // Garante estado pristine inicial\n documentForm.markAsPristine();\n documentForm.markAsUntouched();\n this.isDirty = false;\n this.formChangeDetection(documentForm);\n\n return documentForm;\n }\n\n private formChangeDetection(documentForm: FormGroup): any {\n documentForm.valueChanges.subscribe(() => {\n if (!this.originalFormValues) {\n this.isDirty = false;\n return;\n }\n\n const currentValues = documentForm.getRawValue();\n let normalizedCurrent = { ...currentValues };\n let normalizedOriginal = { ...this.originalFormValues };\n this.isDirty = JSON.stringify(normalizedCurrent) !== JSON.stringify(normalizedOriginal);\n });\n }\n\n extractFormChanges(documentForm: FormGroup): any {\n if (!this.originalFormValues) return {};\n\n const currentValues = documentForm.getRawValue();\n return this.buildChangedValues(this.originalFormValues, currentValues);\n }\n\n private buildChangedValues(original: any, current: any): any {\n if (original === null || original === undefined ||\n current === null || current === undefined ||\n typeof original !== typeof current) {\n return original !== current ? current : undefined;\n }\n\n if (typeof original !== 'object' || original === null) {\n // Valor primitivo\n return original !== current ? current : undefined;\n }\n\n // Objeto ou array\n const result: any = Array.isArray(original) ? [] : {};\n\n const keys: any = new Set([...Object.keys(original), ...Object.keys(current)]);\n\n let hasChanges = false;\n for (const key of keys) {\n const childOriginal = original[key];\n const childCurrent = current[key];\n const childResult = this.buildChangedValues(childOriginal, childCurrent);\n\n if (childResult !== undefined) {\n result[key] = childResult;\n hasChanges = true;\n }\n }\n\n return hasChanges ? result : undefined;\n }\n\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from './block-input/block-copy-past.directive';
2
2
  export * from './directive.module';
3
- export { FormUtilService } from './utils/form-util.service';
4
3
  export * from './input-mask/input-mask.directive';
5
4
  export * from './input-remove/input-remove.directive';
6
5
  export * from './press-hold/press-hold.directive';
@@ -9,3 +8,4 @@ export { DateUtilProvider } from './provider/date-util-provider';
9
8
  export { IonUtilsProvider } from './provider/ion-utils-provider';
10
9
  export { IonValidateFilds } from './provider/ion-validate-filds';
11
10
  export * from './tap/tap.directive';
11
+ export { FormChangeDetector } from './forms/form-change-detector.service';
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from './block-input/block-copy-past.directive';
2
2
  export * from './directive.module';
3
- export { FormUtilService } from './utils/form-util.service';
4
3
  export * from './input-mask/input-mask.directive';
5
4
  export * from './input-remove/input-remove.directive';
6
5
  export * from './press-hold/press-hold.directive';
@@ -9,4 +8,5 @@ export { DateUtilProvider } from './provider/date-util-provider';
9
8
  export { IonUtilsProvider } from './provider/ion-utils-provider';
10
9
  export { IonValidateFilds } from './provider/ion-validate-filds';
11
10
  export * from './tap/tap.directive';
11
+ export { FormChangeDetector } from './forms/form-change-detector.service';
12
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './block-input/block-copy-past.directive';\nexport * from './directive.module';\nexport { FormUtilService } from './utils/form-util.service';\nexport * from './input-mask/input-mask.directive';\nexport * from './input-remove/input-remove.directive';\nexport * from './press-hold/press-hold.directive';\nexport { ConnectorSqlitePwaProvider } from './provider/connector-sqlite-pwa.provider';\nexport { DateUtilProvider } from './provider/date-util-provider';\nexport { IonUtilsProvider } from './provider/ion-utils-provider';\nexport { IonValidateFilds } from './provider/ion-validate-filds';\nexport * from './tap/tap.directive';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC","sourcesContent":["export * from './block-input/block-copy-past.directive';\nexport * from './directive.module';\nexport * from './input-mask/input-mask.directive';\nexport * from './input-remove/input-remove.directive';\nexport * from './press-hold/press-hold.directive';\nexport { ConnectorSqlitePwaProvider } from './provider/connector-sqlite-pwa.provider';\nexport { DateUtilProvider } from './provider/date-util-provider';\nexport { IonUtilsProvider } from './provider/ion-utils-provider';\nexport { IonValidateFilds } from './provider/ion-validate-filds';\nexport * from './tap/tap.directive';\nexport { FormChangeDetector } from './forms/form-change-detector.service';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starley/ion-directives",
3
- "version": "1.3.21",
3
+ "version": "1.3.23-beta",
4
4
  "description": "Directivas internas para ionic",
5
5
  "main": "./dist/index.js",
6
6
  "typings": "./dist/index.d.ts",
@@ -1,56 +0,0 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- import { Injectable } from '@angular/core';
13
- import * as i0 from "@angular/core";
14
- var FormUtilService = /** @class */ (function () {
15
- function FormUtilService() {
16
- this.isDirty = false;
17
- }
18
- FormUtilService.prototype.clearFormChangeDetection = function () {
19
- this.originalFormValues = null;
20
- this.isDirty = false;
21
- };
22
- FormUtilService.prototype.prepareFormChangeDetection = function (documentForm) {
23
- this.clearFormChangeDetection();
24
- this.originalFormValues = __assign({}, documentForm.getRawValue());
25
- // Garante estado pristine inicial
26
- documentForm.markAsPristine();
27
- documentForm.markAsUntouched();
28
- this.isDirty = false;
29
- this.formChangeDetection(documentForm);
30
- return documentForm;
31
- };
32
- FormUtilService.prototype.formChangeDetection = function (documentForm) {
33
- var _this = this;
34
- documentForm.valueChanges.subscribe(function () {
35
- if (!_this.originalFormValues) {
36
- _this.isDirty = false;
37
- return;
38
- }
39
- var currentValues = documentForm.getRawValue();
40
- var normalizedCurrent = __assign({}, currentValues);
41
- var normalizedOriginal = __assign({}, _this.originalFormValues);
42
- _this.isDirty = JSON.stringify(normalizedCurrent) !== JSON.stringify(normalizedOriginal);
43
- });
44
- };
45
- FormUtilService.ɵfac = function FormUtilService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormUtilService)(); };
46
- FormUtilService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: FormUtilService, factory: FormUtilService.ɵfac, providedIn: 'root' });
47
- return FormUtilService;
48
- }());
49
- export { FormUtilService };
50
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormUtilService, [{
51
- type: Injectable,
52
- args: [{
53
- providedIn: 'root',
54
- }]
55
- }], null, null); })();
56
- //# sourceMappingURL=form-util.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-util.service.js","sourceRoot":"","sources":["../../src/utils/form-util.service.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;AAG3C;IAAA;QAKI,YAAO,GAAY,KAAK,CAAC;KAmC5B;IA/BW,kDAAwB,GAAhC;QACI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,oDAA0B,GAA1B,UAA2B,YAAuB;QAC9C,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,kBAAkB,gBAAQ,YAAY,CAAC,WAAW,EAAE,CAAE,CAAC;QAC5D,kCAAkC;QAClC,YAAY,CAAC,cAAc,EAAE,CAAC;QAC9B,YAAY,CAAC,eAAe,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAEvC,OAAO,YAAY,CAAC;IACxB,CAAC;IAEO,6CAAmB,GAA3B,UAA4B,YAAuB;QAAnD,iBAYC;QAXG,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;YAChC,IAAI,CAAC,KAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC3B,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,OAAO;YACX,CAAC;YAED,IAAM,aAAa,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,iBAAiB,gBAAQ,aAAa,CAAE,CAAC;YAC7C,IAAI,kBAAkB,gBAAQ,KAAI,CAAC,kBAAkB,CAAE,CAAC;YACxD,KAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACP,CAAC;kHAnCQ,eAAe;yEAAf,eAAe,WAAf,eAAe,mBAFZ,MAAM;0BAJtB;CA2CC,AAxCD,IAwCC;SArCY,eAAe;uFAAf,eAAe;cAH3B,UAAU;eAAC;gBACR,UAAU,EAAE,MAAM;aACrB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FormUtilService {\n\n isDirty: boolean = false;\n\n private originalFormValues: any;\n\n private clearFormChangeDetection() {\n this.originalFormValues = null;\n this.isDirty = false;\n }\n\n prepareFormChangeDetection(documentForm: FormGroup) {\n this.clearFormChangeDetection();\n this.originalFormValues = { ...documentForm.getRawValue() };\n // Garante estado pristine inicial\n documentForm.markAsPristine();\n documentForm.markAsUntouched();\n this.isDirty = false;\n this.formChangeDetection(documentForm);\n\n return documentForm;\n }\n\n private formChangeDetection(documentForm: FormGroup): any {\n documentForm.valueChanges.subscribe(() => {\n if (!this.originalFormValues) {\n this.isDirty = false;\n return;\n }\n\n const currentValues = documentForm.getRawValue();\n let normalizedCurrent = { ...currentValues };\n let normalizedOriginal = { ...this.originalFormValues };\n this.isDirty = JSON.stringify(normalizedCurrent) !== JSON.stringify(normalizedOriginal);\n });\n }\n\n}\n"]}