@messaia/cdk 18.2.1 → 18.2.2

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.
@@ -1,20 +1,25 @@
1
1
  import { Directive, ElementRef, HostListener, Input } from '@angular/core';
2
+ import { NgControl } from '@angular/forms';
2
3
  import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
3
5
  /**
4
- * This directive can be added to input elements to parse decimal values.
6
+ * This directive parses pasted currency strings into decimal values and updates the reactive form control.
5
7
  */
6
8
  export class ParseDecimalDirective {
7
9
  el;
10
+ control;
8
11
  /**
9
- * Whether the directive is enabled
12
+ * Whether the directive is enabled.
10
13
  */
11
14
  parseDecimalEnabled = true;
12
15
  /**
13
- * Constructor to inject ElementRef for accessing the DOM element.
16
+ * Constructor to inject dependencies.
14
17
  * @param el - The ElementRef instance representing the DOM element.
18
+ * @param control - The NgControl instance for accessing the form control.
15
19
  */
16
- constructor(el) {
20
+ constructor(el, control) {
17
21
  this.el = el;
22
+ this.control = control;
18
23
  }
19
24
  /**
20
25
  * Handles the paste event to parse and normalize pasted currency strings into decimals.
@@ -29,9 +34,10 @@ export class ParseDecimalDirective {
29
34
  const pastedValue = event.clipboardData?.getData('text');
30
35
  /* Parse the pasted text into a valid decimal. */
31
36
  const parsedValue = this.parseCurrency(pastedValue ?? '');
32
- /* If the parsed value is a valid number, update the input value. */
37
+ /* If the parsed value is a valid number, update the input value and form control. */
33
38
  if (!isNaN(parsedValue)) {
34
39
  this.el.nativeElement.value = parsedValue;
40
+ this.updateFormControl(parsedValue);
35
41
  }
36
42
  /* Prevent the default paste behavior to avoid invalid input. */
37
43
  event.preventDefault();
@@ -53,16 +59,29 @@ export class ParseDecimalDirective {
53
59
  /* Convert the cleaned string into a floating-point number. */
54
60
  return parseFloat(normalizedValue);
55
61
  }
56
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ParseDecimalDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
62
+ /**
63
+ * Updates the reactive form control's value.
64
+ * @param value - The normalized decimal value.
65
+ */
66
+ updateFormControl(value) {
67
+ if (this.control && this.control.control) {
68
+ this.control.control.setValue(value);
69
+ /* Mark the control as dirty to indicate user interaction. */
70
+ this.control.control.markAsDirty();
71
+ }
72
+ }
73
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ParseDecimalDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl }], target: i0.ɵɵFactoryTarget.Directive });
57
74
  /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: ParseDecimalDirective, selector: "[parseDecimal]", inputs: { parseDecimalEnabled: "parseDecimalEnabled" }, host: { listeners: { "paste": "onPaste($event)" } }, ngImport: i0 });
58
75
  }
59
76
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ParseDecimalDirective, decorators: [{
60
77
  type: Directive,
61
- args: [{ selector: '[parseDecimal]' }]
62
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { parseDecimalEnabled: [{
78
+ args: [{
79
+ selector: '[parseDecimal]',
80
+ }]
81
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl }], propDecorators: { parseDecimalEnabled: [{
63
82
  type: Input
64
83
  }], onPaste: [{
65
84
  type: HostListener,
66
85
  args: ['paste', ['$event']]
67
86
  }] } });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtZGVjaW1hbC1kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9mb3Jtcy9kaXJlY3RpdmVzL3BhcnNlLWRlY2ltYWwtZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNFOztHQUVHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQVdWO0lBVnBCOztPQUVHO0lBRUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBRWxDOzs7T0FHRztJQUNILFlBQW9CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO0lBQUksQ0FBQztJQUV2Qzs7O09BR0c7SUFFSSxPQUFPLENBQUMsS0FBcUI7UUFDaEMsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM1QixPQUFPO1FBQ1gsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxpREFBaUQ7UUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUM7UUFFMUQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQzlDLENBQUM7UUFFRCxnRUFBZ0U7UUFDaEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYSxDQUFDLEtBQWE7UUFDL0IsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVyRCwwRkFBMEY7UUFDMUYsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdkUsOERBQThEO1FBQzlELE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7MEhBMURRLHFCQUFxQjs4R0FBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFOytFQU05QixtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBY0MsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSBhZGRlZCB0byBpbnB1dCBlbGVtZW50cyB0byBwYXJzZSBkZWNpbWFsIHZhbHVlcy5cclxuICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1twYXJzZURlY2ltYWxdJyB9KVxyXG5leHBvcnQgY2xhc3MgUGFyc2VEZWNpbWFsRGlyZWN0aXZlIHtcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgZGlyZWN0aXZlIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBwYXJzZURlY2ltYWxFbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIHRvIGluamVjdCBFbGVtZW50UmVmIGZvciBhY2Nlc3NpbmcgdGhlIERPTSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIGVsIC0gVGhlIEVsZW1lbnRSZWYgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBET00gZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBwYXN0ZSBldmVudCB0byBwYXJzZSBhbmQgbm9ybWFsaXplIHBhc3RlZCBjdXJyZW5jeSBzdHJpbmdzIGludG8gZGVjaW1hbHMuXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgQ2xpcGJvYXJkRXZlbnQgdHJpZ2dlcmVkIG9uIHBhc3RpbmcuXHJcbiAgICAgKi9cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8qIFNraXAgdGhlIGRpcmVjdGl2ZSdzIGZ1bmN0aW9uYWxpdHkgaWYgZGlzYWJsZWQgKi9cclxuICAgICAgICBpZiAoIXRoaXMucGFyc2VEZWNpbWFsRW5hYmxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgcGFzdGVkIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkLiAqL1xyXG4gICAgICAgIGNvbnN0IHBhc3RlZFZhbHVlID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpO1xyXG5cclxuICAgICAgICAvKiBQYXJzZSB0aGUgcGFzdGVkIHRleHQgaW50byBhIHZhbGlkIGRlY2ltYWwuICovXHJcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0aGlzLnBhcnNlQ3VycmVuY3kocGFzdGVkVmFsdWUgPz8gJycpO1xyXG5cclxuICAgICAgICAvKiBJZiB0aGUgcGFyc2VkIHZhbHVlIGlzIGEgdmFsaWQgbnVtYmVyLCB1cGRhdGUgdGhlIGlucHV0IHZhbHVlLiAqL1xyXG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkVmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHBhcnNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUHJldmVudCB0aGUgZGVmYXVsdCBwYXN0ZSBiZWhhdmlvciB0byBhdm9pZCBpbnZhbGlkIGlucHV0LiAqL1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBjdXJyZW5jeSBzdHJpbmcgaW50byBhIGRlY2ltYWwuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgZm9ybWF0dGVkIGN1cnJlbmN5IHN0cmluZy5cclxuICAgICAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGVjaW1hbCBvciBOYU4gaWYgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwYXJzZUN1cnJlbmN5KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIC8qIFJldHVybiBOYU4gaWYgdGhlIGlucHV0IHZhbHVlIGlzIGVtcHR5LiAqL1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE5hTjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJlbW92ZSBhbGwgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBleGNlcHQgZm9yIGAsYCBhbmQgYC5gIHRvIG5vcm1hbGl6ZSB0aGUgdmFsdWUuICovXHJcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkLiwtXS9nLCAnJyk7XHJcblxyXG4gICAgICAgIC8qIFJlcGxhY2UgdGhvdXNhbmRzIHNlcGFyYXRvcnMgKC4pIHdpdGggbm90aGluZyBhbmQgZGVjaW1hbCBzZXBhcmF0b3JzICgsKSB3aXRoIGEgZG90LiAqL1xyXG4gICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZS5yZXBsYWNlKC9cXC4vZywgJycpLnJlcGxhY2UoJywnLCAnLicpO1xyXG5cclxuICAgICAgICAvKiBDb252ZXJ0IHRoZSBjbGVhbmVkIHN0cmluZyBpbnRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAqL1xyXG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG5vcm1hbGl6ZWRWYWx1ZSk7XHJcbiAgICB9XHJcbn0iXX0=
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtZGVjaW1hbC1kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9mb3Jtcy9kaXJlY3RpdmVzL3BhcnNlLWRlY2ltYWwtZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFM0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8scUJBQXFCO0lBWVY7SUFBd0I7SUFYNUM7O09BRUc7SUFFSSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFFbEM7Ozs7T0FJRztJQUNILFlBQW9CLEVBQWMsRUFBVSxPQUFrQjtRQUExQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBVztJQUFJLENBQUM7SUFFbkU7OztPQUdHO0lBRUksT0FBTyxDQUFDLEtBQXFCO1FBQ2hDLG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDNUIsT0FBTztRQUNYLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekQsaURBQWlEO1FBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFELHFGQUFxRjtRQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztZQUMxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxhQUFhLENBQUMsS0FBYTtRQUMvQiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDO1FBRUQsc0ZBQXNGO1FBQ3RGLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJELDBGQUEwRjtRQUMxRixlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV2RSw4REFBOEQ7UUFDOUQsT0FBTyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLEtBQWE7UUFDbkMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXJDLDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0lBQ0wsQ0FBQzswSEF6RVEscUJBQXFCOzhHQUFyQixxQkFBcUI7OzJGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtpQkFDN0I7dUdBTVUsbUJBQW1CO3NCQUR6QixLQUFLO2dCQWVDLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZGlyZWN0aXZlIHBhcnNlcyBwYXN0ZWQgY3VycmVuY3kgc3RyaW5ncyBpbnRvIGRlY2ltYWwgdmFsdWVzIGFuZCB1cGRhdGVzIHRoZSByZWFjdGl2ZSBmb3JtIGNvbnRyb2wuXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW3BhcnNlRGVjaW1hbF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFyc2VEZWNpbWFsRGlyZWN0aXZlIHtcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgZGlyZWN0aXZlIGlzIGVuYWJsZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcGFyc2VEZWNpbWFsRW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciB0byBpbmplY3QgZGVwZW5kZW5jaWVzLlxyXG4gICAgICogQHBhcmFtIGVsIC0gVGhlIEVsZW1lbnRSZWYgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBET00gZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSBjb250cm9sIC0gVGhlIE5nQ29udHJvbCBpbnN0YW5jZSBmb3IgYWNjZXNzaW5nIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgY29udHJvbDogTmdDb250cm9sKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdGhlIHBhc3RlIGV2ZW50IHRvIHBhcnNlIGFuZCBub3JtYWxpemUgcGFzdGVkIGN1cnJlbmN5IHN0cmluZ3MgaW50byBkZWNpbWFscy5cclxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBDbGlwYm9hcmRFdmVudCB0cmlnZ2VyZWQgb24gcGFzdGluZy5cclxuICAgICAqL1xyXG4gICAgQEhvc3RMaXN0ZW5lcigncGFzdGUnLCBbJyRldmVudCddKVxyXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLyogU2tpcCB0aGUgZGlyZWN0aXZlJ3MgZnVuY3Rpb25hbGl0eSBpZiBkaXNhYmxlZCAqL1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJzZURlY2ltYWxFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJldHJpZXZlIHRoZSBwYXN0ZWQgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuICovXHJcbiAgICAgICAgY29uc3QgcGFzdGVkVmFsdWUgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0Jyk7XHJcblxyXG4gICAgICAgIC8qIFBhcnNlIHRoZSBwYXN0ZWQgdGV4dCBpbnRvIGEgdmFsaWQgZGVjaW1hbC4gKi9cclxuICAgICAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHRoaXMucGFyc2VDdXJyZW5jeShwYXN0ZWRWYWx1ZSA/PyAnJyk7XHJcblxyXG4gICAgICAgIC8qIElmIHRoZSBwYXJzZWQgdmFsdWUgaXMgYSB2YWxpZCBudW1iZXIsIHVwZGF0ZSB0aGUgaW5wdXQgdmFsdWUgYW5kIGZvcm0gY29udHJvbC4gKi9cclxuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZFZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBwYXJzZWRWYWx1ZTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtQ29udHJvbChwYXJzZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiBQcmV2ZW50IHRoZSBkZWZhdWx0IHBhc3RlIGJlaGF2aW9yIHRvIGF2b2lkIGludmFsaWQgaW5wdXQuICovXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIGN1cnJlbmN5IHN0cmluZyBpbnRvIGEgZGVjaW1hbC5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBmb3JtYXR0ZWQgY3VycmVuY3kgc3RyaW5nLlxyXG4gICAgICogQHJldHVybnMgVGhlIHBhcnNlZCBkZWNpbWFsIG9yIE5hTiBpZiBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlQ3VycmVuY3kodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgLyogUmV0dXJuIE5hTiBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgZW1wdHkuICovXHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTmFOO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogUmVtb3ZlIGFsbCBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgYCxgIGFuZCBgLmAgdG8gbm9ybWFsaXplIHRoZSB2YWx1ZS4gKi9cclxuICAgICAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGQuLC1dL2csICcnKTtcclxuXHJcbiAgICAgICAgLyogUmVwbGFjZSB0aG91c2FuZHMgc2VwYXJhdG9ycyAoLikgd2l0aCBub3RoaW5nIGFuZCBkZWNpbWFsIHNlcGFyYXRvcnMgKCwpIHdpdGggYSBkb3QuICovXHJcbiAgICAgICAgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplZFZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnJykucmVwbGFjZSgnLCcsICcuJyk7XHJcblxyXG4gICAgICAgIC8qIENvbnZlcnQgdGhlIGNsZWFuZWQgc3RyaW5nIGludG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIuICovXHJcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobm9ybWFsaXplZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHJlYWN0aXZlIGZvcm0gY29udHJvbCdzIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG5vcm1hbGl6ZWQgZGVjaW1hbCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVGb3JtQ29udHJvbCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wuY29udHJvbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAvKiBNYXJrIHRoZSBjb250cm9sIGFzIGRpcnR5IHRvIGluZGljYXRlIHVzZXIgaW50ZXJhY3Rpb24uICovXHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5jb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
@@ -25281,20 +25281,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
25281
25281
  }] }] });
25282
25282
 
25283
25283
  /**
25284
- * This directive can be added to input elements to parse decimal values.
25284
+ * This directive parses pasted currency strings into decimal values and updates the reactive form control.
25285
25285
  */
25286
25286
  class ParseDecimalDirective {
25287
25287
  el;
25288
+ control;
25288
25289
  /**
25289
- * Whether the directive is enabled
25290
+ * Whether the directive is enabled.
25290
25291
  */
25291
25292
  parseDecimalEnabled = true;
25292
25293
  /**
25293
- * Constructor to inject ElementRef for accessing the DOM element.
25294
+ * Constructor to inject dependencies.
25294
25295
  * @param el - The ElementRef instance representing the DOM element.
25296
+ * @param control - The NgControl instance for accessing the form control.
25295
25297
  */
25296
- constructor(el) {
25298
+ constructor(el, control) {
25297
25299
  this.el = el;
25300
+ this.control = control;
25298
25301
  }
25299
25302
  /**
25300
25303
  * Handles the paste event to parse and normalize pasted currency strings into decimals.
@@ -25309,9 +25312,10 @@ class ParseDecimalDirective {
25309
25312
  const pastedValue = event.clipboardData?.getData('text');
25310
25313
  /* Parse the pasted text into a valid decimal. */
25311
25314
  const parsedValue = this.parseCurrency(pastedValue ?? '');
25312
- /* If the parsed value is a valid number, update the input value. */
25315
+ /* If the parsed value is a valid number, update the input value and form control. */
25313
25316
  if (!isNaN(parsedValue)) {
25314
25317
  this.el.nativeElement.value = parsedValue;
25318
+ this.updateFormControl(parsedValue);
25315
25319
  }
25316
25320
  /* Prevent the default paste behavior to avoid invalid input. */
25317
25321
  event.preventDefault();
@@ -25333,13 +25337,26 @@ class ParseDecimalDirective {
25333
25337
  /* Convert the cleaned string into a floating-point number. */
25334
25338
  return parseFloat(normalizedValue);
25335
25339
  }
25336
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ParseDecimalDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
25340
+ /**
25341
+ * Updates the reactive form control's value.
25342
+ * @param value - The normalized decimal value.
25343
+ */
25344
+ updateFormControl(value) {
25345
+ if (this.control && this.control.control) {
25346
+ this.control.control.setValue(value);
25347
+ /* Mark the control as dirty to indicate user interaction. */
25348
+ this.control.control.markAsDirty();
25349
+ }
25350
+ }
25351
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ParseDecimalDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl }], target: i0.ɵɵFactoryTarget.Directive });
25337
25352
  /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: ParseDecimalDirective, selector: "[parseDecimal]", inputs: { parseDecimalEnabled: "parseDecimalEnabled" }, host: { listeners: { "paste": "onPaste($event)" } }, ngImport: i0 });
25338
25353
  }
25339
25354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ParseDecimalDirective, decorators: [{
25340
25355
  type: Directive,
25341
- args: [{ selector: '[parseDecimal]' }]
25342
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { parseDecimalEnabled: [{
25356
+ args: [{
25357
+ selector: '[parseDecimal]',
25358
+ }]
25359
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl }], propDecorators: { parseDecimalEnabled: [{
25343
25360
  type: Input
25344
25361
  }], onPaste: [{
25345
25362
  type: HostListener,