@porscheinformatik/material-addons 18.0.5 → 19.0.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.
Files changed (128) hide show
  1. package/fesm2022/porscheinformatik-material-addons.mjs +237 -236
  2. package/fesm2022/porscheinformatik-material-addons.mjs.map +1 -1
  3. package/lib/alert/alert.component.d.ts.map +1 -1
  4. package/lib/button/danger-button/danger-button.component.d.ts.map +1 -1
  5. package/lib/button/flat-button/link-button.component.d.ts.map +1 -1
  6. package/lib/button/icon-button/icon-button.component.d.ts.map +1 -1
  7. package/lib/button/mad-basic-button.d.ts.map +1 -1
  8. package/lib/button/outline-button/outline-button.component.d.ts.map +1 -1
  9. package/lib/button/primary-button/primary-button.component.d.ts.map +1 -1
  10. package/lib/card/card.component.d.ts.map +1 -1
  11. package/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.d.ts.map +1 -1
  12. package/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter-dialog/data-table-filter-dialog.component.d.ts.map +1 -1
  13. package/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter.component.d.ts.map +1 -1
  14. package/lib/data-table/data-table.component.d.ts.map +1 -1
  15. package/lib/file-upload/file-upload.component.d.ts.map +1 -1
  16. package/lib/layout/flowbar/flowbar.component.d.ts.map +1 -1
  17. package/lib/layout/sidebar/sidebar.component.d.ts.map +1 -1
  18. package/lib/layout/sidebar-layout/sidebar-layout.component.d.ts.map +1 -1
  19. package/lib/layout/toolbar/toolbar.component.d.ts.map +1 -1
  20. package/lib/material-action-button/material-action-button.component.d.ts.map +1 -1
  21. package/lib/quick-list/base-quick-list.component.d.ts.map +1 -1
  22. package/lib/quick-list/quick-list-compact/quick-list-compact.component.d.ts.map +1 -1
  23. package/lib/quick-list/quick-list.component.d.ts.map +1 -1
  24. package/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.d.ts.map +1 -1
  25. package/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.d.ts.map +1 -1
  26. package/lib/readonly/readonly-form-field/readonly-form-field.component.d.ts.map +1 -1
  27. package/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.d.ts.map +1 -1
  28. package/lib/stepper/step-header/step-header.component.d.ts.map +1 -1
  29. package/lib/stepper/stepper.component.d.ts.map +1 -1
  30. package/lib/table/table.component.d.ts.map +1 -1
  31. package/package.json +3 -5
  32. package/version.d.ts +1 -1
  33. package/esm2022/lib/alert/alert-configuration.mjs +0 -12
  34. package/esm2022/lib/alert/alert.component.mjs +0 -65
  35. package/esm2022/lib/alert/alert.mjs +0 -3
  36. package/esm2022/lib/button/button.mjs +0 -9
  37. package/esm2022/lib/button/button.module.mjs +0 -74
  38. package/esm2022/lib/button/danger-button/danger-button.component.mjs +0 -27
  39. package/esm2022/lib/button/flat-button/link-button.component.mjs +0 -27
  40. package/esm2022/lib/button/icon-button/icon-button.component.mjs +0 -27
  41. package/esm2022/lib/button/mad-basic-button.mjs +0 -39
  42. package/esm2022/lib/button/mad-button/mad-button.directive.mjs +0 -61
  43. package/esm2022/lib/button/mad-button-group/mad-button-group.component.mjs +0 -21
  44. package/esm2022/lib/button/outline-button/outline-button.component.mjs +0 -30
  45. package/esm2022/lib/button/primary-button/primary-button.component.mjs +0 -27
  46. package/esm2022/lib/card/card.component.mjs +0 -139
  47. package/esm2022/lib/card/card.mjs +0 -2
  48. package/esm2022/lib/card/card.module.mjs +0 -22
  49. package/esm2022/lib/data-table/configuration/data-table-action-type.mjs +0 -6
  50. package/esm2022/lib/data-table/configuration/data-table-action.mjs +0 -2
  51. package/esm2022/lib/data-table/configuration/data-table-column-definition.mjs +0 -2
  52. package/esm2022/lib/data-table/configuration/data-table-column.mjs +0 -2
  53. package/esm2022/lib/data-table/configuration/data-table-filter-mode.mjs +0 -2
  54. package/esm2022/lib/data-table/configuration/data-table-global-configuration.mjs +0 -16
  55. package/esm2022/lib/data-table/configuration/data-table-header-type.mjs +0 -2
  56. package/esm2022/lib/data-table/configuration/data-table-persistence-configuration.mjs +0 -2
  57. package/esm2022/lib/data-table/configuration/data-table-row.mjs +0 -2
  58. package/esm2022/lib/data-table/configuration/data-table-selection-emit-mode.mjs +0 -2
  59. package/esm2022/lib/data-table/configuration/data-table-selection-emit-type.mjs +0 -2
  60. package/esm2022/lib/data-table/configuration/data-table-selection-mode.mjs +0 -2
  61. package/esm2022/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.mjs +0 -107
  62. package/esm2022/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter-dialog/data-table-filter-dialog.component.mjs +0 -43
  63. package/esm2022/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter.component.mjs +0 -41
  64. package/esm2022/lib/data-table/data-table-filter/data-table-filter-header.directive.mjs +0 -128
  65. package/esm2022/lib/data-table/data-table-filter/data-table-filter-object.mjs +0 -2
  66. package/esm2022/lib/data-table/data-table-filter/data-table-filter-options.mjs +0 -2
  67. package/esm2022/lib/data-table/data-table-filter/data-table-filter.directive.mjs +0 -46
  68. package/esm2022/lib/data-table/data-table-persistence.service.mjs +0 -61
  69. package/esm2022/lib/data-table/data-table-template/data-table-template-cell-definition.directive.mjs +0 -28
  70. package/esm2022/lib/data-table/data-table-template/data-table-template-column-definition.directive.mjs +0 -22
  71. package/esm2022/lib/data-table/data-table-template/data-table-template-expandable-cell-definition.directive.mjs +0 -28
  72. package/esm2022/lib/data-table/data-table-template/data-table-template-expandable-column-definition.directive.mjs +0 -22
  73. package/esm2022/lib/data-table/data-table.component.mjs +0 -765
  74. package/esm2022/lib/data-table/data-table.mjs +0 -11
  75. package/esm2022/lib/data-table/util/data-table-action-util.mjs +0 -40
  76. package/esm2022/lib/data-table/util/data-table-data-util.mjs +0 -49
  77. package/esm2022/lib/data-table/util/data-table-filter-util.mjs +0 -24
  78. package/esm2022/lib/data-table/util/data-table-sort-util.mjs +0 -80
  79. package/esm2022/lib/file-upload/drag-and-drop-directive.directive.mjs +0 -61
  80. package/esm2022/lib/file-upload/file-upload.component.mjs +0 -103
  81. package/esm2022/lib/layout/content-panel/content-header/content-header.component.mjs +0 -11
  82. package/esm2022/lib/layout/content-panel/content-panel-container/content-panel-container.component.mjs +0 -11
  83. package/esm2022/lib/layout/content-panel/content-panel-container-content/content-panel-container-content.component.mjs +0 -11
  84. package/esm2022/lib/layout/content-panel/content-panel-container-footer/content-panel-container-footer.component.mjs +0 -11
  85. package/esm2022/lib/layout/content-panel/content-panel-container-sidebar/content-panel-container-sidebar.component.mjs +0 -11
  86. package/esm2022/lib/layout/content-panel/content-panel.module.mjs +0 -48
  87. package/esm2022/lib/layout/content-panel/main-container/main-container.component.mjs +0 -11
  88. package/esm2022/lib/layout/flowbar/flowbar.component.mjs +0 -191
  89. package/esm2022/lib/layout/flowbar/flowbar.module.mjs +0 -18
  90. package/esm2022/lib/layout/sidebar/sidebar-item/sidebar-item.component.mjs +0 -11
  91. package/esm2022/lib/layout/sidebar/sidebar.component.mjs +0 -23
  92. package/esm2022/lib/layout/sidebar/sidebar.module.mjs +0 -20
  93. package/esm2022/lib/layout/sidebar-layout/sidebar-layout.component.mjs +0 -67
  94. package/esm2022/lib/layout/toolbar/toolbar-action.interface.mjs +0 -2
  95. package/esm2022/lib/layout/toolbar/toolbar.component.mjs +0 -98
  96. package/esm2022/lib/layout/toolbar/toolbar.module.mjs +0 -58
  97. package/esm2022/lib/layout/toolbar/toolbar.service.mjs +0 -124
  98. package/esm2022/lib/material-action-button/material-action-button.component.mjs +0 -37
  99. package/esm2022/lib/material-action-button/material-action-button.module.mjs +0 -21
  100. package/esm2022/lib/material-addons.module.mjs +0 -49
  101. package/esm2022/lib/numeric-field/number-format.service.mjs +0 -146
  102. package/esm2022/lib/numeric-field/numeric-field.directive.mjs +0 -299
  103. package/esm2022/lib/numeric-field/numeric-field.mjs +0 -2
  104. package/esm2022/lib/numeric-field/numeric-field.module.mjs +0 -21
  105. package/esm2022/lib/quick-list/base-quick-list.component.mjs +0 -124
  106. package/esm2022/lib/quick-list/quick-list-compact/quick-list-compact.component.mjs +0 -23
  107. package/esm2022/lib/quick-list/quick-list.component.mjs +0 -24
  108. package/esm2022/lib/quick-list/quick-list.mjs +0 -6
  109. package/esm2022/lib/quick-list/quick-list.module.mjs +0 -63
  110. package/esm2022/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.mjs +0 -23
  111. package/esm2022/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.mjs +0 -23
  112. package/esm2022/lib/readonly/readonly-form-field/readonly-form-field.component.mjs +0 -243
  113. package/esm2022/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.mjs +0 -183
  114. package/esm2022/lib/readonly/readonly-form-field.module.mjs +0 -51
  115. package/esm2022/lib/stepper/mad-stepper-animation.mjs +0 -13
  116. package/esm2022/lib/stepper/step-header/step-header.component.mjs +0 -78
  117. package/esm2022/lib/stepper/stepper.component.mjs +0 -158
  118. package/esm2022/lib/stepper/stepper.module.mjs +0 -45
  119. package/esm2022/lib/table/column-header.mjs +0 -2
  120. package/esm2022/lib/table/table-action.mjs +0 -2
  121. package/esm2022/lib/table/table.component.mjs +0 -146
  122. package/esm2022/lib/table/table.mjs +0 -2
  123. package/esm2022/lib/table/table.module.mjs +0 -58
  124. package/esm2022/lib/throttle-click/throttle-click.directive.mjs +0 -39
  125. package/esm2022/lib/throttle-click/throttle-click.module.mjs +0 -17
  126. package/esm2022/porscheinformatik-material-addons.mjs +0 -5
  127. package/esm2022/public_api.mjs +0 -48
  128. package/esm2022/version.mjs +0 -2
@@ -1,146 +0,0 @@
1
- import { Inject, Injectable, LOCALE_ID } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class NumberFormatService {
4
- static { this.NEGATIVE = '-'; }
5
- static { this.NUMBERS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; }
6
- static { this.DEFAULT_FINAL_FORMATTING = true; }
7
- static { this.DEFAULT_DECIMAL_PLACES = 2; }
8
- static { this.DEFAULT_AUTOFILL_DECIMALS = false; }
9
- static { this.DEFAULT_REMOVE_LEADING_ZEROS = false; }
10
- constructor(locale) {
11
- this.allowedKeys = [];
12
- this.prepareSeparators(locale);
13
- }
14
- /**
15
- * Call this if the locale is changed to update the separators.
16
- * @param locale the new locale
17
- */
18
- prepareSeparators(locale) {
19
- // try to get the current formatting
20
- const localeDecimalSeparator = (1.1).toLocaleString(locale).charAt(1);
21
- this.decimalSeparator = localeDecimalSeparator === ',' ? ',' : '.';
22
- this.groupingSeparator = localeDecimalSeparator === ',' ? '.' : ',';
23
- this.allowedKeys = [...NumberFormatService.NUMBERS, NumberFormatService.NEGATIVE, this.decimalSeparator];
24
- }
25
- static valueIsSet(value) {
26
- return typeof value !== 'undefined' && value !== null && (typeof value !== 'string' || value.length !== 0);
27
- }
28
- format(value, options) {
29
- return NumberFormatService.valueIsSet(value)
30
- ? this.formatNumber(value.toString().replace(new RegExp('[.]', 'g'), this.decimalSeparator), options)
31
- : '';
32
- }
33
- formatNumber(value, options) {
34
- const autofillDecimals = this.valueOrDefault(options?.autofillDecimals, NumberFormatService.DEFAULT_AUTOFILL_DECIMALS);
35
- const decimalPlaces = this.valueOrDefault(options?.decimalPlaces, NumberFormatService.DEFAULT_DECIMAL_PLACES);
36
- const finalFormatting = this.valueOrDefault(options?.finalFormatting, NumberFormatService.DEFAULT_FINAL_FORMATTING);
37
- let result = this.strip(value, { decimalPlaces, removeLeadingZeros: finalFormatting });
38
- /* add grouping separator */
39
- const decimalIndex = result.indexOf(this.decimalSeparator);
40
- const isNegative = result.startsWith(NumberFormatService.NEGATIVE);
41
- let i = decimalIndex > -1 ? decimalIndex : result.length;
42
- while (i > (isNegative ? 4 : 3)) {
43
- i -= 3;
44
- result = result.substring(0, i) + this.groupingSeparator + result.substring(i, result.length);
45
- }
46
- if (finalFormatting) {
47
- if (decimalPlaces > 0 && !!result) {
48
- /* autofill decimal places */
49
- let actualDecimalIndex = result.indexOf(this.decimalSeparator);
50
- if (autofillDecimals) {
51
- if (actualDecimalIndex === -1) {
52
- actualDecimalIndex = result.length;
53
- result += this.decimalSeparator;
54
- }
55
- result = this.addMissingLeadingZero(result, actualDecimalIndex);
56
- actualDecimalIndex = result.indexOf(this.decimalSeparator);
57
- const actualDecimalPlaces = result.length - actualDecimalIndex - 1;
58
- for (let j = 0; j < decimalPlaces - actualDecimalPlaces; j++) {
59
- result += '0';
60
- }
61
- }
62
- else {
63
- result = this.addMissingLeadingZero(result, actualDecimalIndex);
64
- }
65
- }
66
- }
67
- return result;
68
- }
69
- strip(value, options) {
70
- const decimalPlaces = this.valueOrDefault(options?.decimalPlaces, NumberFormatService.DEFAULT_DECIMAL_PLACES);
71
- const removeLeadingZeros = this.valueOrDefault(options?.removeLeadingZeros, NumberFormatService.DEFAULT_REMOVE_LEADING_ZEROS);
72
- let result = '';
73
- let indexDecimalSep = -1;
74
- let j = -1;
75
- let ignoredChars = 0;
76
- for (const char of value) {
77
- j++;
78
- if (this.allowedKeys.includes(char)) {
79
- if (char === this.decimalSeparator) {
80
- if (decimalPlaces === 0) {
81
- /* dismiss content after a decimal separator, when no places allowed */
82
- break;
83
- }
84
- else if (indexDecimalSep > -1) {
85
- /* ignore subsequent decimal separators */
86
- continue;
87
- }
88
- indexDecimalSep = j;
89
- }
90
- if (char === '0' && removeLeadingZeros) {
91
- /* remove leading zero only if it's not the only zero in the 'value' string */
92
- if ((result.length === 0 && j + 1 !== value.length) || result === NumberFormatService.NEGATIVE) {
93
- ignoredChars++;
94
- continue;
95
- }
96
- }
97
- if (char === NumberFormatService.NEGATIVE && j > 0) {
98
- /* dismiss content after a negative sign not on first position */
99
- break;
100
- }
101
- if (indexDecimalSep > -1 && result.length + ignoredChars > indexDecimalSep + decimalPlaces) {
102
- /* dismiss content after maximum decimal places reached */
103
- break;
104
- }
105
- result += char;
106
- }
107
- else if (char === this.groupingSeparator) {
108
- if (indexDecimalSep === -1) {
109
- ignoredChars++;
110
- }
111
- }
112
- else {
113
- /* dismiss content after a invalid character */
114
- break;
115
- }
116
- }
117
- return result;
118
- }
119
- addMissingLeadingZero(result, actualDecimalIndex) {
120
- const isNegative = result.startsWith(NumberFormatService.NEGATIVE);
121
- /* autoadd a zero before decimal separator, when it's missing */
122
- if (actualDecimalIndex === 0) {
123
- result = '0' + result;
124
- }
125
- /* autoadd a zero before decimal separator, when it's missing, for negative values */
126
- if (actualDecimalIndex === 1 && isNegative) {
127
- result = result[0] + '0' + result.substring(1, result.length);
128
- }
129
- return result;
130
- }
131
- valueOrDefault(value, defaultValue) {
132
- return NumberFormatService.valueIsSet(value) ? value : defaultValue;
133
- }
134
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumberFormatService, deps: [{ token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
135
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumberFormatService, providedIn: 'root' }); }
136
- }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumberFormatService, decorators: [{
138
- type: Injectable,
139
- args: [{
140
- providedIn: 'root',
141
- }]
142
- }], ctorParameters: () => [{ type: undefined, decorators: [{
143
- type: Inject,
144
- args: [LOCALE_ID]
145
- }] }] });
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLWZvcm1hdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvbnVtZXJpYy1maWVsZC9udW1iZXItZm9ybWF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQW1COUQsTUFBTSxPQUFPLG1CQUFtQjthQUNkLGFBQVEsR0FBRyxHQUFHLEFBQU4sQ0FBTzthQUNmLFlBQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxBQUFyRCxDQUFzRDthQUM3RCw2QkFBd0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTthQUNoQywyQkFBc0IsR0FBRyxDQUFDLEFBQUosQ0FBSzthQUMzQiw4QkFBeUIsR0FBRyxLQUFLLEFBQVIsQ0FBUzthQUNsQyxpQ0FBNEIsR0FBRyxLQUFLLEFBQVIsQ0FBUztJQU9yRCxZQUErQixNQUFjO1FBRjdDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBR3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksaUJBQWlCLENBQUMsTUFBYztRQUNyQyxvQ0FBb0M7UUFDcEMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbkUs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TE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBGb3JtYXRPcHRpb25zIHtcbiAgZGVjaW1hbFBsYWNlcz86IG51bWJlcjtcblxuICBmaW5hbEZvcm1hdHRpbmc/OiBib29sZWFuO1xuXG4gIGF1dG9maWxsRGVjaW1hbHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU3RyaXBPcHRpb25zIHtcbiAgZGVjaW1hbFBsYWNlcz86IG51bWJlcjtcblxuICByZW1vdmVMZWFkaW5nWmVyb3M/OiBib29sZWFuO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyRm9ybWF0U2VydmljZSB7XG4gIHN0YXRpYyByZWFkb25seSBORUdBVElWRSA9ICctJztcbiAgc3RhdGljIHJlYWRvbmx5IE5VTUJFUlMgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknXTtcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRklOQUxfRk9STUFUVElORyA9IHRydWU7XG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RFQ0lNQUxfUExBQ0VTID0gMjtcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQVVUT0ZJTExfREVDSU1BTFMgPSBmYWxzZTtcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUkVNT1ZFX0xFQURJTkdfWkVST1MgPSBmYWxzZTtcblxuICBkZWNpbWFsU2VwYXJhdG9yOiAnLCcgfCAnLic7XG4gIGdyb3VwaW5nU2VwYXJhdG9yOiAnLCcgfCAnLic7XG5cbiAgYWxsb3dlZEtleXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcmVwYXJlU2VwYXJhdG9ycyhsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBpZiB0aGUgbG9jYWxlIGlzIGNoYW5nZWQgdG8gdXBkYXRlIHRoZSBzZXBhcmF0b3JzLlxuICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBuZXcgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZVNlcGFyYXRvcnMobG9jYWxlOiBzdHJpbmcpIHtcbiAgICAvLyB0cnkgdG8gZ2V0IHRoZSBjdXJyZW50IGZvcm1hdHRpbmdcbiAgICBjb25zdCBsb2NhbGVEZWNpbWFsU2VwYXJhdG9yID0gKDEuMSkudG9Mb2NhbGVTdHJpbmcobG9jYWxlKS5jaGFyQXQoMSk7XG4gICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yID0gbG9jYWxlRGVjaW1hbFNlcGFyYXRvciA9PT0gJywnID8gJywnIDogJy4nO1xuICAgIHRoaXMuZ3JvdXBpbmdTZXBhcmF0b3IgPSBsb2NhbGVEZWNpbWFsU2VwYXJhdG9yID09PSAnLCcgPyAnLicgOiAnLCc7XG5cbiAgICB0aGlzLmFsbG93ZWRLZXlzID0gWy4uLk51bWJlckZvcm1hdFNlcnZpY2UuTlVNQkVSUywgTnVtYmVyRm9ybWF0U2VydmljZS5ORUdBVElWRSwgdGhpcy5kZWNpbWFsU2VwYXJhdG9yXTtcbiAgfVxuXG4gIHN0YXRpYyB2YWx1ZUlzU2V0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS5sZW5ndGggIT09IDApO1xuICB9XG5cbiAgZm9ybWF0KHZhbHVlOiBudW1iZXIsIG9wdGlvbnM/OiBQYXJ0aWFsPEZvcm1hdE9wdGlvbnM+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gTnVtYmVyRm9ybWF0U2VydmljZS52YWx1ZUlzU2V0KHZhbHVlKVxuICAgICAgPyB0aGlzLmZvcm1hdE51bWJlcih2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UobmV3IFJlZ0V4cCgnWy5dJywgJ2cnKSwgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSwgb3B0aW9ucylcbiAgICAgIDogJyc7XG4gIH1cblxuICBmb3JtYXROdW1iZXIodmFsdWU6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Rm9ybWF0T3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGF1dG9maWxsRGVjaW1hbHMgPSB0aGlzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnM/LmF1dG9maWxsRGVjaW1hbHMsIE51bWJlckZvcm1hdFNlcnZpY2UuREVGQVVMVF9BVVRPRklMTF9ERUNJTUFMUyk7XG4gICAgY29uc3QgZGVjaW1hbFBsYWNlcyA9IHRoaXMudmFsdWVPckRlZmF1bHQob3B0aW9ucz8uZGVjaW1hbFBsYWNlcywgTnVtYmVyRm9ybWF0U2VydmljZS5ERUZBVUxUX0RFQ0lNQUxfUExBQ0VTKTtcbiAgICBjb25zdCBmaW5hbEZvcm1hdHRpbmcgPSB0aGlzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnM/LmZpbmFsRm9ybWF0dGluZywgTnVtYmVyRm9ybWF0U2VydmljZS5ERUZBVUxUX0ZJTkFMX0ZPUk1BVFRJTkcpO1xuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RyaXAodmFsdWUsIHsgZGVjaW1hbFBsYWNlcywgcmVtb3ZlTGVhZGluZ1plcm9zOiBmaW5hbEZvcm1hdHRpbmcgfSk7XG5cbiAgICAvKiBhZGQgZ3JvdXBpbmcgc2VwYXJhdG9yICovXG4gICAgY29uc3QgZGVjaW1hbEluZGV4ID0gcmVzdWx0LmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gcmVzdWx0LnN0YXJ0c1dpdGgoTnVtYmVyRm9ybWF0U2VydmljZS5ORUdBVElWRSk7XG4gICAgbGV0IGkgPSBkZWNpbWFsSW5kZXggPiAtMSA/IGRlY2ltYWxJbmRleCA6IHJlc3VsdC5sZW5ndGg7XG4gICAgd2hpbGUgKGkgPiAoaXNOZWdhdGl2ZSA/IDQgOiAzKSkge1xuICAgICAgaSAtPSAzO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCBpKSArIHRoaXMuZ3JvdXBpbmdTZXBhcmF0b3IgKyByZXN1bHQuc3Vic3RyaW5nKGksIHJlc3VsdC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmIChmaW5hbEZvcm1hdHRpbmcpIHtcbiAgICAgIGlmIChkZWNpbWFsUGxhY2VzID4gMCAmJiAhIXJlc3VsdCkge1xuICAgICAgICAvKiBhdXRvZmlsbCBkZWNpbWFsIHBsYWNlcyAqL1xuICAgICAgICBsZXQgYWN0dWFsRGVjaW1hbEluZGV4ID0gcmVzdWx0LmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGF1dG9maWxsRGVjaW1hbHMpIHtcbiAgICAgICAgICBpZiAoYWN0dWFsRGVjaW1hbEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgYWN0dWFsRGVjaW1hbEluZGV4ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmRlY2ltYWxTZXBhcmF0b3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5hZGRNaXNzaW5nTGVhZGluZ1plcm8ocmVzdWx0LCBhY3R1YWxEZWNpbWFsSW5kZXgpO1xuICAgICAgICAgIGFjdHVhbERlY2ltYWxJbmRleCA9IHJlc3VsdC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgICAgICAgICBjb25zdCBhY3R1YWxEZWNpbWFsUGxhY2VzID0gcmVzdWx0Lmxlbmd0aCAtIGFjdHVhbERlY2ltYWxJbmRleCAtIDE7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkZWNpbWFsUGxhY2VzIC0gYWN0dWFsRGVjaW1hbFBsYWNlczsgaisrKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkZE1pc3NpbmdMZWFkaW5nWmVybyhyZXN1bHQsIGFjdHVhbERlY2ltYWxJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0cmlwKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBTdHJpcE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSB0aGlzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnM/LmRlY2ltYWxQbGFjZXMsIE51bWJlckZvcm1hdFNlcnZpY2UuREVGQVVMVF9ERUNJTUFMX1BMQUNFUyk7XG4gICAgY29uc3QgcmVtb3ZlTGVhZGluZ1plcm9zID0gdGhpcy52YWx1ZU9yRGVmYXVsdChvcHRpb25zPy5yZW1vdmVMZWFkaW5nWmVyb3MsIE51bWJlckZvcm1hdFNlcnZpY2UuREVGQVVMVF9SRU1PVkVfTEVBRElOR19aRVJPUyk7XG5cbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgbGV0IGluZGV4RGVjaW1hbFNlcCA9IC0xO1xuICAgIGxldCBqID0gLTE7XG4gICAgbGV0IGlnbm9yZWRDaGFycyA9IDA7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIHZhbHVlKSB7XG4gICAgICBqKys7XG4gICAgICBpZiAodGhpcy5hbGxvd2VkS2V5cy5pbmNsdWRlcyhjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSB7XG4gICAgICAgICAgaWYgKGRlY2ltYWxQbGFjZXMgPT09IDApIHtcbiAgICAgICAgICAgIC8qIGRpc21pc3MgY29udGVudCBhZnRlciBhIGRlY2ltYWwgc2VwYXJhdG9yLCB3aGVuIG5vIHBsYWNlcyBhbGxvd2VkICovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4RGVjaW1hbFNlcCA+IC0xKSB7XG4gICAgICAgICAgICAvKiBpZ25vcmUgc3Vic2VxdWVudCBkZWNpbWFsIHNlcGFyYXRvcnMgKi9cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleERlY2ltYWxTZXAgPSBqO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSAnMCcgJiYgcmVtb3ZlTGVhZGluZ1plcm9zKSB7XG4gICAgICAgICAgLyogcmVtb3ZlIGxlYWRpbmcgemVybyBvbmx5IGlmIGl0J3Mgbm90IHRoZSBvbmx5IHplcm8gaW4gdGhlICd2YWx1ZScgc3RyaW5nICovXG4gICAgICAgICAgaWYgKChyZXN1bHQubGVuZ3RoID09PSAwICYmIGogKyAxICE9PSB2YWx1ZS5sZW5ndGgpIHx8IHJlc3VsdCA9PT0gTnVtYmVyRm9ybWF0U2VydmljZS5ORUdBVElWRSkge1xuICAgICAgICAgICAgaWdub3JlZENoYXJzKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IE51bWJlckZvcm1hdFNlcnZpY2UuTkVHQVRJVkUgJiYgaiA+IDApIHtcbiAgICAgICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgYSBuZWdhdGl2ZSBzaWduIG5vdCBvbiBmaXJzdCBwb3NpdGlvbiAqL1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleERlY2ltYWxTZXAgPiAtMSAmJiByZXN1bHQubGVuZ3RoICsgaWdub3JlZENoYXJzID4gaW5kZXhEZWNpbWFsU2VwICsgZGVjaW1hbFBsYWNlcykge1xuICAgICAgICAgIC8qIGRpc21pc3MgY29udGVudCBhZnRlciBtYXhpbXVtIGRlY2ltYWwgcGxhY2VzIHJlYWNoZWQgKi9cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gdGhpcy5ncm91cGluZ1NlcGFyYXRvcikge1xuICAgICAgICBpZiAoaW5kZXhEZWNpbWFsU2VwID09PSAtMSkge1xuICAgICAgICAgIGlnbm9yZWRDaGFycysrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgYSBpbnZhbGlkIGNoYXJhY3RlciAqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWlzc2luZ0xlYWRpbmdaZXJvKHJlc3VsdDogc3RyaW5nLCBhY3R1YWxEZWNpbWFsSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHJlc3VsdC5zdGFydHNXaXRoKE51bWJlckZvcm1hdFNlcnZpY2UuTkVHQVRJVkUpO1xuICAgIC8qIGF1dG9hZGQgYSB6ZXJvIGJlZm9yZSBkZWNpbWFsIHNlcGFyYXRvciwgd2hlbiBpdCdzIG1pc3NpbmcgKi9cbiAgICBpZiAoYWN0dWFsRGVjaW1hbEluZGV4ID09PSAwKSB7XG4gICAgICByZXN1bHQgPSAnMCcgKyByZXN1bHQ7XG4gICAgfVxuICAgIC8qIGF1dG9hZGQgYSB6ZXJvIGJlZm9yZSBkZWNpbWFsIHNlcGFyYXRvciwgd2hlbiBpdCdzIG1pc3NpbmcsIGZvciBuZWdhdGl2ZSB2YWx1ZXMgKi9cbiAgICBpZiAoYWN0dWFsRGVjaW1hbEluZGV4ID09PSAxICYmIGlzTmVnYXRpdmUpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdFswXSArICcwJyArIHJlc3VsdC5zdWJzdHJpbmcoMSwgcmVzdWx0Lmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlT3JEZWZhdWx0KHZhbHVlOiBhbnksIGRlZmF1bHRWYWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gTnVtYmVyRm9ybWF0U2VydmljZS52YWx1ZUlzU2V0KHZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xuICB9XG59XG4iXX0=
@@ -1,299 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2020 Porsche Informatik. All Rights Reserved.
3
- * This software is released under MIT license.
4
- * The full license information can be found in LICENSE in the root directory of this project.
5
- */
6
- import { Directive, EventEmitter, forwardRef, Input, Output, } from '@angular/core';
7
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
8
- import { NumberFormatService } from './number-format.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./number-format.service";
11
- const BACK_KEYCODE = 8;
12
- const SPACE_KEYCODE = 32;
13
- const DEL_KEYCODE = 46;
14
- const CONTROL_KEYCODES_UPPER_BORDER = 46;
15
- const OTHER_CONTROL_KEYS = new Set([224, 91, 93]);
16
- export class NumericFieldDirective {
17
- set numericValue(value) {
18
- if (this._numericValue !== value && !(isNaN(this._numericValue) && (isNaN(value) || value === null))) {
19
- this.originalValue = value;
20
- // Don't roundOrTruncate if value was set to empty otherwise input value will be set to 0 instead of empty
21
- // which happens when an input is being reset
22
- this._numericValue = value === null || value === undefined ? value : this.roundOrTruncate(value); // eslint-disable-line
23
- this.handleInputChanged();
24
- }
25
- }
26
- constructor(renderer, inputEl, numberFormatService) {
27
- this.renderer = renderer;
28
- this.inputEl = inputEl;
29
- this.numberFormatService = numberFormatService;
30
- this.textAlign = 'right';
31
- this.decimalPlaces = 2;
32
- this.roundValue = false;
33
- this.autofillDecimals = false;
34
- this.unit = null;
35
- this.unitPosition = 'right';
36
- this.numericValueChanged = new EventEmitter();
37
- this.displayValue = '';
38
- this.originalValue = NaN;
39
- /* Control Values Accessor Stuff below */
40
- // eslint-disable-next-line
41
- this.onChange = () => { };
42
- // eslint-disable-next-line
43
- this.onTouched = () => { };
44
- }
45
- registerOnChange(fn) {
46
- this.onChange = fn;
47
- }
48
- registerOnTouched(fn) {
49
- this.onTouched = fn;
50
- }
51
- setDisabledState() {
52
- // Dont need to implement since its just a directive
53
- }
54
- writeValue(value) {
55
- this.numericValue = value;
56
- }
57
- ngOnInit() {
58
- /* needs to be parsed as number explicitly as it comes as string from user input */
59
- this.decimalPlaces = parseInt(this.decimalPlaces.toString(), 10);
60
- this.inputChangeListener = this.renderer.listen(this.inputEl.nativeElement, 'blur', (event) => {
61
- this.formatInput(event.target, true);
62
- });
63
- this.keyupListener = this.renderer.listen(this.inputEl.nativeElement, 'keyup', (event) => {
64
- if (event.keyCode === BACK_KEYCODE || (event.keyCode >= CONTROL_KEYCODES_UPPER_BORDER && !OTHER_CONTROL_KEYS.has(event.keyCode))) {
65
- this.formatInput(event.target, false);
66
- }
67
- });
68
- this.keydownListener = this.renderer.listen(this.inputEl.nativeElement, 'keydown', (event) => {
69
- const value = event.target.value;
70
- if (this.numberFormatService.allowedKeys.includes(event.key) ||
71
- (event.keyCode <= CONTROL_KEYCODES_UPPER_BORDER && event.keyCode > 0 && event.keyCode !== SPACE_KEYCODE) ||
72
- event.metaKey ||
73
- event.ctrlKey ||
74
- event.altKey) {
75
- /* allow negative sign only as first character and none exists outside of text selection */
76
- const indexNegativeSign = value.indexOf(NumberFormatService.NEGATIVE);
77
- if (event.key === NumberFormatService.NEGATIVE &&
78
- (event.target.selectionStart > 0 || indexNegativeSign > -1) &&
79
- (event.target.selectionStart === event.target.selectionEnd ||
80
- !(indexNegativeSign >= event.target.selectionStart && indexNegativeSign <= event.target.selectionEnd))) {
81
- return false;
82
- }
83
- /* no duplicate decimal separators */
84
- const indexDecimalSep = value.indexOf(this.numberFormatService.decimalSeparator);
85
- if (event.key === this.numberFormatService.decimalSeparator &&
86
- (indexDecimalSep > -1 || this.decimalPlaces === 0) &&
87
- (event.target.selectionStart === event.target.selectionEnd ||
88
- !(indexDecimalSep >= event.target.selectionStart && indexDecimalSep <= event.target.selectionEnd))) {
89
- return false;
90
- }
91
- /* prevent too many decimal places */
92
- if (NumberFormatService.NUMBERS.includes(event.key) &&
93
- indexDecimalSep > -1 &&
94
- indexDecimalSep < event.target.selectionStart &&
95
- event.target.selectionStart === event.target.selectionEnd &&
96
- value.length > indexDecimalSep + this.decimalPlaces) {
97
- return false;
98
- }
99
- /* when deleting thousand separator, remove the digit before or after it */
100
- const cursorStart = event.target.selectionStart;
101
- if (cursorStart === event.target.selectionEnd) {
102
- if (event.keyCode === BACK_KEYCODE && value.substr(cursorStart - 1, 1) === this.numberFormatService.groupingSeparator) {
103
- event.target.value = value.substring(0, cursorStart - 2) + value.substring(cursorStart - 1, value.length);
104
- event.target.selectionStart = event.target.selectionEnd = cursorStart - 1;
105
- return false;
106
- }
107
- else if (event.keyCode === DEL_KEYCODE && value.substr(cursorStart, 1) === this.numberFormatService.groupingSeparator) {
108
- event.target.value = value.substring(0, cursorStart + 1) + value.substring(cursorStart + 2, value.length);
109
- event.target.selectionStart = event.target.selectionEnd = cursorStart + 1;
110
- return false;
111
- }
112
- }
113
- this.originalValue = NaN;
114
- }
115
- else {
116
- return false;
117
- }
118
- return true;
119
- });
120
- }
121
- ngOnDestroy() {
122
- this.detachListener();
123
- }
124
- ngAfterViewChecked() {
125
- this.injectUnitSymbol();
126
- }
127
- handleInputChanged() {
128
- // Call in set timeout to avoid Expression has changed after it has been checked error.
129
- // Sometimes the value changes because we cut off decimal places
130
- setTimeout(() => {
131
- this.updateInput(this.numberFormatService.format(this._numericValue, {
132
- decimalPlaces: this.decimalPlaces,
133
- finalFormatting: true,
134
- autofillDecimals: this.autofillDecimals,
135
- }));
136
- }, 1);
137
- }
138
- formatInput(element, finalFormatting) {
139
- const cursorPos = element.selectionStart;
140
- const length = element.value.length;
141
- const setCursor = this.displayValue !== element.value;
142
- const textFormatted = this.numberFormatService.formatNumber(element.value, {
143
- decimalPlaces: this.decimalPlaces,
144
- finalFormatting,
145
- autofillDecimals: this.autofillDecimals,
146
- });
147
- // special handling to move unit symbol along with display value
148
- if (this.textAlign === 'left' && this.unitPosition === 'right') {
149
- const inputStyles = window.getComputedStyle(this.inputEl.nativeElement.parentElement, null);
150
- this.unitSpan.style.position = 'absolute';
151
- this.unitSpan.style.marginTop = inputStyles.getPropertyValue('border-top-width');
152
- this.unitSpan.style.paddingTop = inputStyles.getPropertyValue('padding-top');
153
- this.unitSpan.style.paddingBottom = inputStyles.getPropertyValue('padding-bottom');
154
- if (!this.textSpan) {
155
- this.textSpan = document.createElement('span');
156
- document.body.appendChild(this.textSpan);
157
- this.textSpan.style.font = inputStyles.getPropertyValue('font');
158
- this.textSpan.style.fontSize = inputStyles.getPropertyValue('font-size');
159
- this.textSpan.style.height = 'auto';
160
- this.textSpan.style.width = 'auto';
161
- this.textSpan.style.position = 'absolute';
162
- this.textSpan.style.top = '0';
163
- this.textSpan.style.whiteSpace = 'no-wrap';
164
- this.textSpan.style.visibility = 'hidden';
165
- }
166
- this.textSpan.innerHTML = textFormatted;
167
- const width = Math.min(this.inputEl.nativeElement.clientWidth - this.unitSpan.clientWidth, Math.ceil(this.textSpan.clientWidth));
168
- this.unitSpan.style.left = width + 'px';
169
- }
170
- this.updateInput(textFormatted);
171
- if (setCursor) {
172
- element.selectionStart = element.selectionEnd = Math.max(cursorPos + element.value.length - length, 0);
173
- }
174
- }
175
- updateInput(value) {
176
- this.displayValue = value;
177
- this.inputEl.nativeElement.value = value;
178
- this._numericValue = parseFloat(this.numberFormatService.strip(value, { decimalPlaces: this.decimalPlaces }).replace(this.numberFormatService.decimalSeparator, '.'));
179
- if (this._numericValue !== this.roundOrTruncate(this.originalValue)) {
180
- this.originalValue = this._numericValue;
181
- this.numericValueChanged.emit(this._numericValue);
182
- }
183
- }
184
- getValueForFormControl() {
185
- this.formatInput(this.inputEl.nativeElement, false);
186
- if (isNaN(this._numericValue)) {
187
- // Return undefined instead of NaN to support the default required validator.
188
- return undefined; // eslint-disable-line
189
- }
190
- return this._numericValue;
191
- }
192
- injectUnitSymbol() {
193
- // Need to inject the unit symbol when the input element width is set to its actual value,
194
- // otherwise the icon wont show in the correct position
195
- if (!!this.unit && !this.unitSpan && this.inputEl.nativeElement.offsetWidth !== 0) {
196
- // Get the input wrapper and apply necessary styles
197
- const inputWrapper = this.inputEl.nativeElement.parentNode.parentNode;
198
- // Create the span with unit symbol and apply necessary styles
199
- this.unitSpan = this.renderer.createElement('span');
200
- if (this.unitPosition === 'left') {
201
- this.renderer.setAttribute(this.unitSpan, 'matPrefix', '');
202
- this.renderer.setStyle(this.unitSpan, 'padding-right', '5px');
203
- this.renderer.insertBefore(inputWrapper, this.unitSpan, inputWrapper.children[0]);
204
- }
205
- else {
206
- this.renderer.setAttribute(this.unitSpan, 'matSuffix', '');
207
- this.renderer.setStyle(this.unitSpan, 'padding-left', '5px');
208
- this.renderer.appendChild(inputWrapper, this.unitSpan);
209
- }
210
- }
211
- // do not display unit symbol if the unit should move along display value
212
- if (!!this.unitSpan && this.textAlign === 'left' && this.unitPosition === 'right') {
213
- if (NumberFormatService.valueIsSet(this.displayValue)) {
214
- this.unitSpan.style.display = 'unset';
215
- }
216
- else {
217
- this.unitSpan.style.display = 'none';
218
- }
219
- }
220
- // always reset unit symbol
221
- if (!!this.unitSpan) {
222
- this.unitSpan.textContent = this.unit;
223
- }
224
- }
225
- detachListener() {
226
- if (this.inputChangeListener) {
227
- this.inputChangeListener();
228
- delete this.inputChangeListener;
229
- }
230
- if (this.keydownListener) {
231
- this.keydownListener();
232
- delete this.keydownListener;
233
- }
234
- if (this.keyupListener) {
235
- this.keyupListener();
236
- delete this.keyupListener;
237
- }
238
- }
239
- roundOrTruncate(value) {
240
- if (this.roundValue) {
241
- return Math.round(value * Math.pow(10, this.decimalPlaces)) / Math.pow(10, this.decimalPlaces);
242
- }
243
- const method = value < 0 ? 'ceil' : 'floor';
244
- return Math[method](+(value * Math.pow(10, this.decimalPlaces)).toFixed(this.decimalPlaces)) / Math.pow(10, this.decimalPlaces);
245
- }
246
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumericFieldDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.NumberFormatService }], target: i0.ɵɵFactoryTarget.Directive }); }
247
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.2", type: NumericFieldDirective, isStandalone: true, selector: "[madNumericField]", inputs: { textAlign: "textAlign", decimalPlaces: "decimalPlaces", roundValue: ["roundDisplayValue", "roundValue"], autofillDecimals: "autofillDecimals", unit: "unit", unitPosition: "unitPosition", numericValue: "numericValue" }, outputs: { numericValueChanged: "numericValueChange" }, host: { listeners: { "change": "onChange(getValueForFormControl())", "input": "onChange(getValueForFormControl())", "blur": "onTouched()" }, properties: { "class.text-right": "textAlign === \"right\"" } }, providers: [
248
- {
249
- provide: NG_VALUE_ACCESSOR,
250
- useExisting: forwardRef(() => NumericFieldDirective),
251
- multi: true,
252
- },
253
- ], ngImport: i0 }); }
254
- }
255
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumericFieldDirective, decorators: [{
256
- type: Directive,
257
- args: [{
258
- selector: '[madNumericField]',
259
- host: {
260
- '[class.text-right]': 'textAlign === "right"',
261
- '(change)': 'onChange(getValueForFormControl())',
262
- '(input)': 'onChange(getValueForFormControl())',
263
- '(blur)': 'onTouched()',
264
- },
265
- providers: [
266
- {
267
- provide: NG_VALUE_ACCESSOR,
268
- useExisting: forwardRef(() => NumericFieldDirective),
269
- multi: true,
270
- },
271
- ],
272
- standalone: true,
273
- }]
274
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.NumberFormatService }], propDecorators: { textAlign: [{
275
- type: Input,
276
- args: ['textAlign']
277
- }], decimalPlaces: [{
278
- type: Input,
279
- args: ['decimalPlaces']
280
- }], roundValue: [{
281
- type: Input,
282
- args: ['roundDisplayValue']
283
- }], autofillDecimals: [{
284
- type: Input,
285
- args: ['autofillDecimals']
286
- }], unit: [{
287
- type: Input,
288
- args: ['unit']
289
- }], unitPosition: [{
290
- type: Input,
291
- args: ['unitPosition']
292
- }], numericValueChanged: [{
293
- type: Output,
294
- args: ['numericValueChange']
295
- }], numericValue: [{
296
- type: Input,
297
- args: ['numericValue']
298
- }] } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9udW1lcmljLWZpZWxkL251bWVyaWMtZmllbGQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQUU5RCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUN2QixNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBbUJsRCxNQUFNLE9BQU8scUJBQXFCO0lBZ0JoQyxJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQiwwR0FBMEc7WUFDMUcsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFL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O3dCQUNKLG9CQUFvQixFQUFFLHVCQUF1Qjt3QkFDN0MsVUFBVSxFQUFFLG9DQUFvQzt3QkFDaEQsU0FBUyxFQUFFLG9DQUFvQzt3QkFDL0MsUUFBUSxFQUFFLGFBQWE7cUJBQ3hCO29CQUNELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzs0QkFDcEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3lJQUVxQixTQUFTO3NCQUE1QixLQUFLO3VCQUFDLFdBQVc7Z0JBQ00sYUFBYTtzQkFBcEMsS0FBSzt1QkFBQyxlQUFlO2dCQUNNLFVBQVU7c0JBQXJDLEtBQUs7dUJBQUMsbUJBQW1CO2dCQUNDLGdCQUFnQjtzQkFBMUMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBQ1YsSUFBSTtzQkFBbEIsS0FBSzt1QkFBQyxNQUFNO2dCQUNVLFlBQVk7c0JBQWxDLEtBQUs7dUJBQUMsY0FBYztnQkFDUyxtQkFBbUI7c0JBQWhELE1BQU07dUJBQUMsb0JBQW9CO2dCQVV4QixZQUFZO3NCQURmLEtBQUs7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBQb3JzY2hlIEluZm9ybWF0aWsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE51bWJlckZvcm1hdFNlcnZpY2UgfSBmcm9tICcuL251bWJlci1mb3JtYXQuc2VydmljZSc7XG5cbmNvbnN0IEJBQ0tfS0VZQ09ERSA9IDg7XG5jb25zdCBTUEFDRV9LRVlDT0RFID0gMzI7XG5jb25zdCBERUxfS0VZQ09ERSA9IDQ2O1xuY29uc3QgQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgPSA0NjtcbmNvbnN0IE9USEVSX0NPTlRST0xfS0VZUyA9IG5ldyBTZXQoWzIyNCwgOTEsIDkzXSk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttYWROdW1lcmljRmllbGRdJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MudGV4dC1yaWdodF0nOiAndGV4dEFsaWduID09PSBcInJpZ2h0XCInLFxuICAgICcoY2hhbmdlKSc6ICdvbkNoYW5nZShnZXRWYWx1ZUZvckZvcm1Db250cm9sKCkpJyxcbiAgICAnKGlucHV0KSc6ICdvbkNoYW5nZShnZXRWYWx1ZUZvckZvcm1Db250cm9sKCkpJyxcbiAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljRmllbGREaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTnVtZXJpY0ZpZWxkRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCd0ZXh0QWxpZ24nKSB0ZXh0QWxpZ246ICdyaWdodCcgfCAnbGVmdCcgPSAncmlnaHQnO1xuICBASW5wdXQoJ2RlY2ltYWxQbGFjZXMnKSBkZWNpbWFsUGxhY2VzID0gMjtcbiAgQElucHV0KCdyb3VuZERpc3BsYXlWYWx1ZScpIHJvdW5kVmFsdWUgPSBmYWxzZTtcbiAgQElucHV0KCdhdXRvZmlsbERlY2ltYWxzJykgYXV0b2ZpbGxEZWNpbWFscyA9IGZhbHNlO1xuICBASW5wdXQoJ3VuaXQnKSB1bml0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCd1bml0UG9zaXRpb24nKSB1bml0UG9zaXRpb246ICdyaWdodCcgfCAnbGVmdCcgPSAncmlnaHQnO1xuICBAT3V0cHV0KCdudW1lcmljVmFsdWVDaGFuZ2UnKSBudW1lcmljVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBkaXNwbGF5VmFsdWUgPSAnJztcbiAgcHJpdmF0ZSBvcmlnaW5hbFZhbHVlID0gTmFOO1xuICBwcml2YXRlIF9udW1lcmljVmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBpbnB1dENoYW5nZUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGtleXVwTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUga2V5ZG93bkxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgnbnVtZXJpY1ZhbHVlJylcbiAgc2V0IG51bWVyaWNWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX251bWVyaWNWYWx1ZSAhPT0gdmFsdWUgJiYgIShpc05hTih0aGlzLl9udW1lcmljVmFsdWUpICYmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IG51bGwpKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBEb24ndCByb3VuZE9yVHJ1bmNhdGUgaWYgdmFsdWUgd2FzIHNldCB0byBlbXB0eSBvdGhlcndpc2UgaW5wdXQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMCBpbnN0ZWFkIG9mIGVtcHR5XG4gICAgICAvLyB3aGljaCBoYXBwZW5zIHdoZW4gYW4gaW5wdXQgaXMgYmVpbmcgcmVzZXRcbiAgICAgIHRoaXMuX251bWVyaWNWYWx1ZSA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMucm91bmRPclRydW5jYXRlKHZhbHVlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgdGhpcy5oYW5kbGVJbnB1dENoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuaXRTcGFuOiBIVE1MU3BhbkVsZW1lbnQ7XG4gIHByaXZhdGUgdGV4dFNwYW46IEhUTUxTcGFuRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBpbnB1dEVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgbnVtYmVyRm9ybWF0U2VydmljZTogTnVtYmVyRm9ybWF0U2VydmljZSxcbiAgKSB7fVxuXG4gIC8qIENvbnRyb2wgVmFsdWVzIEFjY2Vzc29yIFN0dWZmIGJlbG93ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBEb250IG5lZWQgdG8gaW1wbGVtZW50IHNpbmNlIGl0cyBqdXN0IGEgZGlyZWN0aXZlXG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm51bWVyaWNWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLyogbmVlZHMgdG8gYmUgcGFyc2VkIGFzIG51bWJlciBleHBsaWNpdGx5IGFzIGl0IGNvbWVzIGFzIHN0cmluZyBmcm9tIHVzZXIgaW5wdXQgKi9cbiAgICB0aGlzLmRlY2ltYWxQbGFjZXMgPSBwYXJzZUludCh0aGlzLmRlY2ltYWxQbGFjZXMudG9TdHJpbmcoKSwgMTApO1xuXG4gICAgdGhpcy5pbnB1dENoYW5nZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdibHVyJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmZvcm1hdElucHV0KGV2ZW50LnRhcmdldCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmtleXVwTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gQkFDS19LRVlDT0RFIHx8IChldmVudC5rZXlDb2RlID49IENPTlRST0xfS0VZQ09ERVNfVVBQRVJfQk9SREVSICYmICFPVEhFUl9DT05UUk9MX0tFWVMuaGFzKGV2ZW50LmtleUNvZGUpKSkge1xuICAgICAgICB0aGlzLmZvcm1hdElucHV0KGV2ZW50LnRhcmdldCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5rZXlkb3duTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5hbGxvd2VkS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpIHx8XG4gICAgICAgIChldmVudC5rZXlDb2RlIDw9IENPTlRST0xfS0VZQ09ERVNfVVBQRVJfQk9SREVSICYmIGV2ZW50LmtleUNvZGUgPiAwICYmIGV2ZW50LmtleUNvZGUgIT09IFNQQUNFX0tFWUNPREUpIHx8XG4gICAgICAgIGV2ZW50Lm1ldGFLZXkgfHxcbiAgICAgICAgZXZlbnQuY3RybEtleSB8fFxuICAgICAgICBldmVudC5hbHRLZXlcbiAgICAgICkge1xuICAgICAgICAvKiBhbGxvdyBuZWdhdGl2ZSBzaWduIG9ubHkgYXMgZmlyc3QgY2hhcmFjdGVyIGFuZCBub25lIGV4aXN0cyBvdXRzaWRlIG9mIHRleHQgc2VsZWN0aW9uICovXG4gICAgICAgIGNvbnN0IGluZGV4TmVnYXRpdmVTaWduID0gdmFsdWUuaW5kZXhPZihOdW1iZXJGb3JtYXRTZXJ2aWNlLk5FR0FUSVZFKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gTnVtYmVyRm9ybWF0U2VydmljZS5ORUdBVElWRSAmJlxuICAgICAgICAgIChldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPiAwIHx8IGluZGV4TmVnYXRpdmVTaWduID4gLTEpICYmXG4gICAgICAgICAgKGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA9PT0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCB8fFxuICAgICAgICAgICAgIShpbmRleE5lZ2F0aXZlU2lnbiA+PSBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgJiYgaW5kZXhOZWdhdGl2ZVNpZ24gPD0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIG5vIGR1cGxpY2F0ZSBkZWNpbWFsIHNlcGFyYXRvcnMgKi9cbiAgICAgICAgY29uc3QgaW5kZXhEZWNpbWFsU2VwID0gdmFsdWUuaW5kZXhPZih0aGlzLm51bWJlckZvcm1hdFNlcnZpY2UuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudC5rZXkgPT09IHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5kZWNpbWFsU2VwYXJhdG9yICYmXG4gICAgICAgICAgKGluZGV4RGVjaW1hbFNlcCA+IC0xIHx8IHRoaXMuZGVjaW1hbFBsYWNlcyA9PT0gMCkgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kIHx8XG4gICAgICAgICAgICAhKGluZGV4RGVjaW1hbFNlcCA+PSBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgJiYgaW5kZXhEZWNpbWFsU2VwIDw9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBwcmV2ZW50IHRvbyBtYW55IGRlY2ltYWwgcGxhY2VzICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICBOdW1iZXJGb3JtYXRTZXJ2aWNlLk5VTUJFUlMuaW5jbHVkZXMoZXZlbnQua2V5KSAmJlxuICAgICAgICAgIGluZGV4RGVjaW1hbFNlcCA+IC0xICYmXG4gICAgICAgICAgaW5kZXhEZWNpbWFsU2VwIDwgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ICYmXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kICYmXG4gICAgICAgICAgdmFsdWUubGVuZ3RoID4gaW5kZXhEZWNpbWFsU2VwICsgdGhpcy5kZWNpbWFsUGxhY2VzXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIHdoZW4gZGVsZXRpbmcgdGhvdXNhbmQgc2VwYXJhdG9yLCByZW1vdmUgdGhlIGRpZ2l0IGJlZm9yZSBvciBhZnRlciBpdCAqL1xuICAgICAgICBjb25zdCBjdXJzb3JTdGFydCA9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydDtcblxuICAgICAgICBpZiAoY3Vyc29yU3RhcnQgPT09IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gQkFDS19LRVlDT0RFICYmIHZhbHVlLnN1YnN0cihjdXJzb3JTdGFydCAtIDEsIDEpID09PSB0aGlzLm51bWJlckZvcm1hdFNlcnZpY2UuZ3JvdXBpbmdTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBjdXJzb3JTdGFydCAtIDIpICsgdmFsdWUuc3Vic3RyaW5nKGN1cnNvclN0YXJ0IC0gMSwgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgPSBjdXJzb3JTdGFydCAtIDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBERUxfS0VZQ09ERSAmJiB2YWx1ZS5zdWJzdHIoY3Vyc29yU3RhcnQsIDEpID09PSB0aGlzLm51bWJlckZvcm1hdFNlcnZpY2UuZ3JvdXBpbmdTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBjdXJzb3JTdGFydCArIDEpICsgdmFsdWUuc3Vic3RyaW5nKGN1cnNvclN0YXJ0ICsgMiwgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgPSBjdXJzb3JTdGFydCArIDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZSA9IE5hTjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hMaXN0ZW5lcigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuaW5qZWN0VW5pdFN5bWJvbCgpO1xuICB9XG5cbiAgaGFuZGxlSW5wdXRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIENhbGwgaW4gc2V0IHRpbWVvdXQgdG8gYXZvaWQgRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCBoYXMgYmVlbiBjaGVja2VkIGVycm9yLlxuICAgIC8vIFNvbWV0aW1lcyB0aGUgdmFsdWUgY2hhbmdlcyBiZWNhdXNlIHdlIGN1dCBvZmYgZGVjaW1hbCBwbGFjZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlSW5wdXQoXG4gICAgICAgIHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5mb3JtYXQodGhpcy5fbnVtZXJpY1ZhbHVlLCB7XG4gICAgICAgICAgZGVjaW1hbFBsYWNlczogdGhpcy5kZWNpbWFsUGxhY2VzLFxuICAgICAgICAgIGZpbmFsRm9ybWF0dGluZzogdHJ1ZSxcbiAgICAgICAgICBhdXRvZmlsbERlY2ltYWxzOiB0aGlzLmF1dG9maWxsRGVjaW1hbHMsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9LCAxKTtcbiAgfVxuXG4gIGZvcm1hdElucHV0KGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQsIGZpbmFsRm9ybWF0dGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnNvclBvcyA9IGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgY29uc3QgbGVuZ3RoID0gZWxlbWVudC52YWx1ZS5sZW5ndGg7XG4gICAgY29uc3Qgc2V0Q3Vyc29yID0gdGhpcy5kaXNwbGF5VmFsdWUgIT09IGVsZW1lbnQudmFsdWU7XG4gICAgY29uc3QgdGV4dEZvcm1hdHRlZCA9IHRoaXMubnVtYmVyRm9ybWF0U2VydmljZS5mb3JtYXROdW1iZXIoZWxlbWVudC52YWx1ZSwge1xuICAgICAgZGVjaW1hbFBsYWNlczogdGhpcy5kZWNpbWFsUGxhY2VzLFxuICAgICAgZmluYWxGb3JtYXR0aW5nLFxuICAgICAgYXV0b2ZpbGxEZWNpbWFsczogdGhpcy5hdXRvZmlsbERlY2ltYWxzLFxuICAgIH0pO1xuXG4gICAgLy8gc3BlY2lhbCBoYW5kbGluZyB0byBtb3ZlIHVuaXQgc3ltYm9sIGFsb25nIHdpdGggZGlzcGxheSB2YWx1ZVxuICAgIGlmICh0aGlzLnRleHRBbGlnbiA9PT0gJ2xlZnQnICYmIHRoaXMudW5pdFBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICBjb25zdCBpbnB1dFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQsIG51bGwpO1xuICAgICAgdGhpcy51bml0U3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICB0aGlzLnVuaXRTcGFuLnN0eWxlLm1hcmdpblRvcCA9IGlucHV0U3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICAgIHRoaXMudW5pdFNwYW4uc3R5bGUucGFkZGluZ1RvcCA9IGlucHV0U3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJyk7XG4gICAgICB0aGlzLnVuaXRTcGFuLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBpbnB1dFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpO1xuXG4gICAgICBpZiAoIXRoaXMudGV4dFNwYW4pIHtcbiAgICAgICAgdGhpcy50ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnRleHRTcGFuKTtcbiAgICAgICAgdGhpcy50ZXh0U3Bhbi5zdHlsZS5mb250ID0gaW5wdXRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udCcpO1xuICAgICAgICB0aGlzLnRleHRTcGFuLnN0eWxlLmZvbnRTaXplID0gaW5wdXRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJyk7XG4gICAgICAgIHRoaXMudGV4dFNwYW4uc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLnRleHRTcGFuLnN0eWxlLndpZHRoID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLnRleHRTcGFuLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy50ZXh0U3Bhbi5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgIHRoaXMudGV4dFNwYW4uc3R5bGUud2hpdGVTcGFjZSA9ICduby13cmFwJztcbiAgICAgICAgdGhpcy50ZXh0U3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICB9XG4gICAgICB0aGlzLnRleHRTcGFuLmlubmVySFRNTCA9IHRleHRGb3JtYXR0ZWQ7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIC0gdGhpcy51bml0U3Bhbi5jbGllbnRXaWR0aCwgTWF0aC5jZWlsKHRoaXMudGV4dFNwYW4uY2xpZW50V2lkdGgpKTtcbiAgICAgIHRoaXMudW5pdFNwYW4uc3R5bGUubGVmdCA9IHdpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUlucHV0KHRleHRGb3JtYXR0ZWQpO1xuICAgIGlmIChzZXRDdXJzb3IpIHtcbiAgICAgIGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSBlbGVtZW50LnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KGN1cnNvclBvcyArIGVsZW1lbnQudmFsdWUubGVuZ3RoIC0gbGVuZ3RoLCAwKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVJbnB1dCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX251bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICB0aGlzLm51bWJlckZvcm1hdFNlcnZpY2Uuc3RyaXAodmFsdWUsIHsgZGVjaW1hbFBsYWNlczogdGhpcy5kZWNpbWFsUGxhY2VzIH0pLnJlcGxhY2UodGhpcy5udW1iZXJGb3JtYXRTZXJ2aWNlLmRlY2ltYWxTZXBhcmF0b3IsICcuJyksXG4gICAgKTtcbiAgICBpZiAodGhpcy5fbnVtZXJpY1ZhbHVlICE9PSB0aGlzLnJvdW5kT3JUcnVuY2F0ZSh0aGlzLm9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWUgPSB0aGlzLl9udW1lcmljVmFsdWU7XG4gICAgICB0aGlzLm51bWVyaWNWYWx1ZUNoYW5nZWQuZW1pdCh0aGlzLl9udW1lcmljVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlRm9yRm9ybUNvbnRyb2woKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLmZvcm1hdElucHV0KHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCBmYWxzZSk7XG4gICAgaWYgKGlzTmFOKHRoaXMuX251bWVyaWNWYWx1ZSkpIHtcbiAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgaW5zdGVhZCBvZiBOYU4gdG8gc3VwcG9ydCB0aGUgZGVmYXVsdCByZXF1aXJlZCB2YWxpZGF0b3IuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9udW1lcmljVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFVuaXRTeW1ib2woKTogdm9pZCB7XG4gICAgLy8gTmVlZCB0byBpbmplY3QgdGhlIHVuaXQgc3ltYm9sIHdoZW4gdGhlIGlucHV0IGVsZW1lbnQgd2lkdGggaXMgc2V0IHRvIGl0cyBhY3R1YWwgdmFsdWUsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBpY29uIHdvbnQgc2hvdyBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgIGlmICghIXRoaXMudW5pdCAmJiAhdGhpcy51bml0U3BhbiAmJiB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAhPT0gMCkge1xuICAgICAgLy8gR2V0IHRoZSBpbnB1dCB3cmFwcGVyIGFuZCBhcHBseSBuZWNlc3Nhcnkgc3R5bGVzXG4gICAgICBjb25zdCBpbnB1dFdyYXBwZXIgPSB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3BhbiB3aXRoIHVuaXQgc3ltYm9sIGFuZCBhcHBseSBuZWNlc3Nhcnkgc3R5bGVzXG4gICAgICB0aGlzLnVuaXRTcGFuID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICAgIGlmICh0aGlzLnVuaXRQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMudW5pdFNwYW4sICdtYXRQcmVmaXgnLCAnJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy51bml0U3BhbiwgJ3BhZGRpbmctcmlnaHQnLCAnNXB4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKGlucHV0V3JhcHBlciwgdGhpcy51bml0U3BhbiwgaW5wdXRXcmFwcGVyLmNoaWxkcmVuWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMudW5pdFNwYW4sICdtYXRTdWZmaXgnLCAnJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy51bml0U3BhbiwgJ3BhZGRpbmctbGVmdCcsICc1cHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbnB1dFdyYXBwZXIsIHRoaXMudW5pdFNwYW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBkaXNwbGF5IHVuaXQgc3ltYm9sIGlmIHRoZSB1bml0IHNob3VsZCBtb3ZlIGFsb25nIGRpc3BsYXkgdmFsdWVcbiAgICBpZiAoISF0aGlzLnVuaXRTcGFuICYmIHRoaXMudGV4dEFsaWduID09PSAnbGVmdCcgJiYgdGhpcy51bml0UG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGlmIChOdW1iZXJGb3JtYXRTZXJ2aWNlLnZhbHVlSXNTZXQodGhpcy5kaXNwbGF5VmFsdWUpKSB7XG4gICAgICAgIHRoaXMudW5pdFNwYW4uc3R5bGUuZGlzcGxheSA9ICd1bnNldCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuaXRTcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGFsd2F5cyByZXNldCB1bml0IHN5bWJvbFxuICAgIGlmICghIXRoaXMudW5pdFNwYW4pIHtcbiAgICAgIHRoaXMudW5pdFNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnVuaXQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dENoYW5nZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWRvd25MaXN0ZW5lcikge1xuICAgICAgdGhpcy5rZXlkb3duTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmtleWRvd25MaXN0ZW5lcjtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5dXBMaXN0ZW5lcikge1xuICAgICAgdGhpcy5rZXl1cExpc3RlbmVyKCk7XG4gICAgICBkZWxldGUgdGhpcy5rZXl1cExpc3RlbmVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcm91bmRPclRydW5jYXRlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnJvdW5kVmFsdWUpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogTWF0aC5wb3coMTAsIHRoaXMuZGVjaW1hbFBsYWNlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZGVjaW1hbFBsYWNlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gdmFsdWUgPCAwID8gJ2NlaWwnIDogJ2Zsb29yJztcbiAgICByZXR1cm4gTWF0aFttZXRob2RdKCsodmFsdWUgKiBNYXRoLnBvdygxMCwgdGhpcy5kZWNpbWFsUGxhY2VzKSkudG9GaXhlZCh0aGlzLmRlY2ltYWxQbGFjZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmRlY2ltYWxQbGFjZXMpO1xuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export { NumericFieldDirective } from './numeric-field.directive';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLWFkZG9ucy9zcmMvbGliL251bWVyaWMtZmllbGQvbnVtZXJpYy1maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE51bWVyaWNGaWVsZERpcmVjdGl2ZSB9IGZyb20gJy4vbnVtZXJpYy1maWVsZC5kaXJlY3RpdmUnO1xuIl19
@@ -1,21 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { NumericFieldDirective } from './numeric-field.directive';
3
- import * as i0 from "@angular/core";
4
- export class NumericFieldModule {
5
- static forRoot() {
6
- return {
7
- ngModule: NumericFieldModule,
8
- };
9
- }
10
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumericFieldModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
11
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.2", ngImport: i0, type: NumericFieldModule, imports: [NumericFieldDirective], exports: [NumericFieldDirective] }); }
12
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumericFieldModule }); }
13
- }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NumericFieldModule, decorators: [{
15
- type: NgModule,
16
- args: [{
17
- imports: [NumericFieldDirective],
18
- exports: [NumericFieldDirective],
19
- }]
20
- }] });
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9udW1lcmljLWZpZWxkL251bWVyaWMtZmllbGQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQU1sRSxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTztZQUNMLFFBQVEsRUFBRSxrQkFBa0I7U0FDN0IsQ0FBQztJQUNKLENBQUM7OEdBTFUsa0JBQWtCOytHQUFsQixrQkFBa0IsWUFIbkIscUJBQXFCLGFBQ3JCLHFCQUFxQjsrR0FFcEIsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUo5QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNoQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnVtZXJpY0ZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi9udW1lcmljLWZpZWxkLmRpcmVjdGl2ZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtOdW1lcmljRmllbGREaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbTnVtZXJpY0ZpZWxkRGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgTnVtZXJpY0ZpZWxkTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOdW1lcmljRmllbGRNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE51bWVyaWNGaWVsZE1vZHVsZSxcbiAgICB9O1xuICB9XG59XG4iXX0=