@bravura/ui 3.8.1 → 5.0.0

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 (276) hide show
  1. package/CHANGELOG.md +585 -565
  2. package/LICENSE +6 -6
  3. package/README.md +3 -1
  4. package/alert/alert-container.component.d.ts +1 -1
  5. package/alert/alert-message.component.d.ts +1 -1
  6. package/behavior/await.directive.d.ts +1 -1
  7. package/behavior/observe-content-class.directive.d.ts +1 -1
  8. package/behavior/sizing.directive.d.ts +1 -1
  9. package/clip-note/clip-note.directive.d.ts +1 -1
  10. package/currency-input/currency-input.directive.d.ts +1 -1
  11. package/decimal-input/decimal-input.directive.d.ts +1 -1
  12. package/discrete-input/discrete-input.component.d.ts +1 -1
  13. package/esm2022/alert/alert-container.component.mjs +207 -0
  14. package/esm2022/alert/alert-message.component.mjs +101 -0
  15. package/esm2022/alert/alert.module.mjs +22 -0
  16. package/{esm2020 → esm2022}/alert/public-api.mjs +1 -1
  17. package/esm2022/alert/testing/test-api.mjs +44 -0
  18. package/esm2022/behavior/await.directive.mjs +133 -0
  19. package/esm2022/behavior/behavior.module.mjs +37 -0
  20. package/esm2022/behavior/observe-content-class.directive.mjs +63 -0
  21. package/{esm2020 → esm2022}/behavior/public-api.mjs +1 -1
  22. package/esm2022/behavior/sizing-monitor.directive.mjs +31 -0
  23. package/esm2022/behavior/sizing.directive.mjs +256 -0
  24. package/esm2022/clip-note/clip-note.component.mjs +216 -0
  25. package/esm2022/clip-note/clip-note.directive.mjs +141 -0
  26. package/esm2022/clip-note/clip-note.module.mjs +32 -0
  27. package/{esm2020 → esm2022}/clip-note/public-api.mjs +1 -1
  28. package/{esm2020 → esm2022}/common/common-utils.mjs +1 -1
  29. package/esm2022/common/common.module.mjs +53 -0
  30. package/{esm2020 → esm2022}/common/public-api.mjs +1 -1
  31. package/esm2022/currency-input/currency-input.directive.mjs +276 -0
  32. package/esm2022/currency-input/currency-input.module.mjs +19 -0
  33. package/{esm2020 → esm2022}/currency-input/public-api.mjs +1 -1
  34. package/esm2022/decimal-input/decimal-input.directive.mjs +122 -0
  35. package/{esm2020 → esm2022}/decimal-input/decimal-input.module.mjs +5 -5
  36. package/esm2022/discrete-input/discrete-input.component.mjs +337 -0
  37. package/esm2022/discrete-input/discrete-input.module.mjs +21 -0
  38. package/{esm2020 → esm2022}/discrete-input/public-api.mjs +1 -1
  39. package/esm2022/file-upload/file-upload.component.mjs +400 -0
  40. package/esm2022/file-upload/file-upload.module.mjs +44 -0
  41. package/esm2022/file-upload/file-upload.service.mjs +29 -0
  42. package/{esm2020 → esm2022}/file-upload/public-api.mjs +1 -1
  43. package/esm2022/form-field/form-field.component.mjs +82 -0
  44. package/esm2022/form-field/form-field.module.mjs +33 -0
  45. package/{esm2020 → esm2022}/form-field/public-api.mjs +1 -1
  46. package/esm2022/icon-font/icon-font.module.mjs +22 -0
  47. package/esm2022/icon-font/icon.directive.mjs +102 -0
  48. package/{esm2020 → esm2022}/icon-font/public-api.mjs +1 -1
  49. package/esm2022/icon-font/utilities.mjs +51 -0
  50. package/esm2022/panel/panel-section.component.mjs +41 -0
  51. package/esm2022/panel/panel.component.mjs +87 -0
  52. package/esm2022/panel/panel.module.mjs +23 -0
  53. package/{esm2020 → esm2022}/panel/public-api.mjs +1 -1
  54. package/esm2022/panel/tinted.directive.mjs +60 -0
  55. package/esm2022/phone-number/phone-number.directive.mjs +188 -0
  56. package/{esm2020 → esm2022}/phone-number/phone-number.module.mjs +5 -5
  57. package/esm2022/phone-number/phone-number.pipe.mjs +47 -0
  58. package/esm2022/phone-number/phone-number.validator.mjs +64 -0
  59. package/{esm2020 → esm2022}/phone-number/public-api.mjs +1 -1
  60. package/{esm2020 → esm2022}/public-api.mjs +1 -1
  61. package/esm2022/radio-panel/radio-panel-item.component.mjs +93 -0
  62. package/esm2022/radio-panel/radio-panel.component.mjs +81 -0
  63. package/{esm2020 → esm2022}/radio-panel/radio-panel.module.mjs +5 -5
  64. package/esm2022/radio-panel/testing/test-api.mjs +46 -0
  65. package/{esm2020 → esm2022}/selection-panel/public-api.mjs +1 -1
  66. package/esm2022/selection-panel/selection-panel-item.component.mjs +166 -0
  67. package/esm2022/selection-panel/selection-panel.directive.mjs +119 -0
  68. package/esm2022/selection-panel/selection-panel.module.mjs +23 -0
  69. package/{esm2020 → esm2022}/skeletons/public-api.mjs +1 -1
  70. package/esm2022/skeletons/skeleton-loader-presets.directive.mjs +83 -0
  71. package/esm2022/skeletons/skeleton-loader.component.mjs +76 -0
  72. package/esm2022/skeletons/skeletons.module.mjs +35 -0
  73. package/{esm2020 → esm2022}/stepper/public-api.mjs +1 -1
  74. package/{esm2020 → esm2022}/stepper/stepper-animation.mjs +1 -1
  75. package/esm2022/stepper/stepper.component.mjs +176 -0
  76. package/esm2022/stepper/stepper.module.mjs +52 -0
  77. package/{esm2020 → esm2022}/tooltip/public-api.mjs +1 -1
  78. package/esm2022/tooltip/tooltip.component.mjs +63 -0
  79. package/esm2022/tooltip/tooltip.directive.mjs +148 -0
  80. package/esm2022/tooltip/tooltip.module.mjs +25 -0
  81. package/{fesm2020 → fesm2022}/bravura-ui-alert-testing.mjs +2 -2
  82. package/fesm2022/bravura-ui-alert-testing.mjs.map +1 -0
  83. package/fesm2022/bravura-ui-alert.mjs +327 -0
  84. package/fesm2022/bravura-ui-alert.mjs.map +1 -0
  85. package/{fesm2020 → fesm2022}/bravura-ui-behavior.mjs +45 -45
  86. package/fesm2022/bravura-ui-behavior.mjs.map +1 -0
  87. package/{fesm2020 → fesm2022}/bravura-ui-clip-note.mjs +70 -70
  88. package/fesm2022/bravura-ui-clip-note.mjs.map +1 -0
  89. package/{fesm2020 → fesm2022}/bravura-ui-common.mjs +6 -6
  90. package/fesm2022/bravura-ui-common.mjs.map +1 -0
  91. package/{fesm2020 → fesm2022}/bravura-ui-currency-input.mjs +11 -11
  92. package/fesm2022/bravura-ui-currency-input.mjs.map +1 -0
  93. package/{fesm2020 → fesm2022}/bravura-ui-decimal-input.mjs +12 -12
  94. package/fesm2022/bravura-ui-decimal-input.mjs.map +1 -0
  95. package/{fesm2020 → fesm2022}/bravura-ui-discrete-input.mjs +48 -48
  96. package/fesm2022/bravura-ui-discrete-input.mjs.map +1 -0
  97. package/fesm2022/bravura-ui-file-upload.mjs +474 -0
  98. package/fesm2022/bravura-ui-file-upload.mjs.map +1 -0
  99. package/{fesm2020 → fesm2022}/bravura-ui-form-field.mjs +19 -19
  100. package/fesm2022/bravura-ui-form-field.mjs.map +1 -0
  101. package/{fesm2020 → fesm2022}/bravura-ui-icon-font.mjs +8 -8
  102. package/fesm2022/bravura-ui-icon-font.mjs.map +1 -0
  103. package/fesm2022/bravura-ui-panel.mjs +206 -0
  104. package/fesm2022/bravura-ui-panel.mjs.map +1 -0
  105. package/{fesm2020 → fesm2022}/bravura-ui-phone-number.mjs +30 -30
  106. package/fesm2022/bravura-ui-phone-number.mjs.map +1 -0
  107. package/{fesm2020 → fesm2022}/bravura-ui-radio-panel-testing.mjs +5 -6
  108. package/fesm2022/bravura-ui-radio-panel-testing.mjs.map +1 -0
  109. package/{fesm2020 → fesm2022}/bravura-ui-radio-panel.mjs +32 -32
  110. package/fesm2022/bravura-ui-radio-panel.mjs.map +1 -0
  111. package/fesm2022/bravura-ui-selection-panel.mjs +306 -0
  112. package/fesm2022/bravura-ui-selection-panel.mjs.map +1 -0
  113. package/{fesm2020 → fesm2022}/bravura-ui-skeletons.mjs +43 -43
  114. package/fesm2022/bravura-ui-skeletons.mjs.map +1 -0
  115. package/fesm2022/bravura-ui-stepper.mjs +251 -0
  116. package/fesm2022/bravura-ui-stepper.mjs.map +1 -0
  117. package/{fesm2020 → fesm2022}/bravura-ui-tooltip.mjs +32 -24
  118. package/fesm2022/bravura-ui-tooltip.mjs.map +1 -0
  119. package/fesm2022/bravura-ui.mjs.map +1 -0
  120. package/file-upload/file-upload.component.d.ts +1 -1
  121. package/form-field/form-field.component.d.ts +1 -1
  122. package/icon-font/icon.directive.d.ts +1 -1
  123. package/package.json +88 -132
  124. package/panel/panel.component.d.ts +1 -1
  125. package/panel/tinted.directive.d.ts +1 -1
  126. package/phone-number/phone-number.directive.d.ts +1 -1
  127. package/phone-number/phone-number.validator.d.ts +2 -2
  128. package/radio-panel/radio-panel-item.component.d.ts +1 -1
  129. package/radio-panel/radio-panel.component.d.ts +1 -1
  130. package/radio-panel/testing/test-api.d.ts +2 -3
  131. package/selection-panel/selection-panel-item.component.d.ts +1 -1
  132. package/selection-panel/selection-panel.directive.d.ts +1 -1
  133. package/skeletons/skeleton-loader-presets.directive.d.ts +3 -3
  134. package/stepper/stepper.component.d.ts +1 -1
  135. package/theme/_bui-card.scss +56 -56
  136. package/theme/_ui-theme.scss +3 -3
  137. package/theme/global-style-by-bootstrap.scss +3 -3
  138. package/theme/global-style-by-tailwind.scss +3 -3
  139. package/theme/scrollbar.scss +40 -40
  140. package/tooltip/tooltip.component.d.ts +2 -0
  141. package/tooltip/tooltip.directive.d.ts +3 -5
  142. package/esm2020/alert/alert-container.component.mjs +0 -207
  143. package/esm2020/alert/alert-message.component.mjs +0 -102
  144. package/esm2020/alert/alert.module.mjs +0 -22
  145. package/esm2020/alert/testing/test-api.mjs +0 -44
  146. package/esm2020/behavior/await.directive.mjs +0 -133
  147. package/esm2020/behavior/behavior.module.mjs +0 -37
  148. package/esm2020/behavior/observe-content-class.directive.mjs +0 -63
  149. package/esm2020/behavior/sizing-monitor.directive.mjs +0 -31
  150. package/esm2020/behavior/sizing.directive.mjs +0 -256
  151. package/esm2020/clip-note/clip-note.component.mjs +0 -216
  152. package/esm2020/clip-note/clip-note.directive.mjs +0 -141
  153. package/esm2020/clip-note/clip-note.module.mjs +0 -32
  154. package/esm2020/common/common.module.mjs +0 -53
  155. package/esm2020/currency-input/currency-input.directive.mjs +0 -276
  156. package/esm2020/currency-input/currency-input.module.mjs +0 -19
  157. package/esm2020/decimal-input/decimal-input.directive.mjs +0 -122
  158. package/esm2020/discrete-input/discrete-input.component.mjs +0 -337
  159. package/esm2020/discrete-input/discrete-input.module.mjs +0 -21
  160. package/esm2020/file-upload/file-upload.component.mjs +0 -400
  161. package/esm2020/file-upload/file-upload.module.mjs +0 -44
  162. package/esm2020/file-upload/file-upload.service.mjs +0 -29
  163. package/esm2020/form-field/form-field.component.mjs +0 -82
  164. package/esm2020/form-field/form-field.module.mjs +0 -33
  165. package/esm2020/icon-font/icon-font.module.mjs +0 -22
  166. package/esm2020/icon-font/icon.directive.mjs +0 -102
  167. package/esm2020/icon-font/utilities.mjs +0 -51
  168. package/esm2020/panel/panel-section.component.mjs +0 -41
  169. package/esm2020/panel/panel.component.mjs +0 -87
  170. package/esm2020/panel/panel.module.mjs +0 -23
  171. package/esm2020/panel/tinted.directive.mjs +0 -60
  172. package/esm2020/phone-number/phone-number.directive.mjs +0 -188
  173. package/esm2020/phone-number/phone-number.pipe.mjs +0 -47
  174. package/esm2020/phone-number/phone-number.validator.mjs +0 -64
  175. package/esm2020/radio-panel/radio-panel-item.component.mjs +0 -93
  176. package/esm2020/radio-panel/radio-panel.component.mjs +0 -81
  177. package/esm2020/radio-panel/testing/test-api.mjs +0 -47
  178. package/esm2020/selection-panel/selection-panel-item.component.mjs +0 -166
  179. package/esm2020/selection-panel/selection-panel.directive.mjs +0 -119
  180. package/esm2020/selection-panel/selection-panel.module.mjs +0 -23
  181. package/esm2020/skeletons/skeleton-loader-presets.directive.mjs +0 -83
  182. package/esm2020/skeletons/skeleton-loader.component.mjs +0 -76
  183. package/esm2020/skeletons/skeletons.module.mjs +0 -35
  184. package/esm2020/stepper/stepper.component.mjs +0 -176
  185. package/esm2020/stepper/stepper.module.mjs +0 -52
  186. package/esm2020/tooltip/tooltip.component.mjs +0 -54
  187. package/esm2020/tooltip/tooltip.directive.mjs +0 -149
  188. package/esm2020/tooltip/tooltip.module.mjs +0 -25
  189. package/fesm2015/bravura-ui-alert-testing.mjs +0 -64
  190. package/fesm2015/bravura-ui-alert-testing.mjs.map +0 -1
  191. package/fesm2015/bravura-ui-alert.mjs +0 -340
  192. package/fesm2015/bravura-ui-alert.mjs.map +0 -1
  193. package/fesm2015/bravura-ui-behavior.mjs +0 -515
  194. package/fesm2015/bravura-ui-behavior.mjs.map +0 -1
  195. package/fesm2015/bravura-ui-clip-note.mjs +0 -393
  196. package/fesm2015/bravura-ui-clip-note.mjs.map +0 -1
  197. package/fesm2015/bravura-ui-common.mjs +0 -96
  198. package/fesm2015/bravura-ui-common.mjs.map +0 -1
  199. package/fesm2015/bravura-ui-currency-input.mjs +0 -300
  200. package/fesm2015/bravura-ui-currency-input.mjs.map +0 -1
  201. package/fesm2015/bravura-ui-decimal-input.mjs +0 -145
  202. package/fesm2015/bravura-ui-decimal-input.mjs.map +0 -1
  203. package/fesm2015/bravura-ui-discrete-input.mjs +0 -365
  204. package/fesm2015/bravura-ui-discrete-input.mjs.map +0 -1
  205. package/fesm2015/bravura-ui-file-upload.mjs +0 -478
  206. package/fesm2015/bravura-ui-file-upload.mjs.map +0 -1
  207. package/fesm2015/bravura-ui-form-field.mjs +0 -120
  208. package/fesm2015/bravura-ui-form-field.mjs.map +0 -1
  209. package/fesm2015/bravura-ui-icon-font.mjs +0 -178
  210. package/fesm2015/bravura-ui-icon-font.mjs.map +0 -1
  211. package/fesm2015/bravura-ui-panel.mjs +0 -210
  212. package/fesm2015/bravura-ui-panel.mjs.map +0 -1
  213. package/fesm2015/bravura-ui-phone-number.mjs +0 -327
  214. package/fesm2015/bravura-ui-phone-number.mjs.map +0 -1
  215. package/fesm2015/bravura-ui-radio-panel-testing.mjs +0 -63
  216. package/fesm2015/bravura-ui-radio-panel-testing.mjs.map +0 -1
  217. package/fesm2015/bravura-ui-radio-panel.mjs +0 -200
  218. package/fesm2015/bravura-ui-radio-panel.mjs.map +0 -1
  219. package/fesm2015/bravura-ui-selection-panel.mjs +0 -311
  220. package/fesm2015/bravura-ui-selection-panel.mjs.map +0 -1
  221. package/fesm2015/bravura-ui-skeletons.mjs +0 -195
  222. package/fesm2015/bravura-ui-skeletons.mjs.map +0 -1
  223. package/fesm2015/bravura-ui-stepper.mjs +0 -253
  224. package/fesm2015/bravura-ui-stepper.mjs.map +0 -1
  225. package/fesm2015/bravura-ui-tooltip.mjs +0 -229
  226. package/fesm2015/bravura-ui-tooltip.mjs.map +0 -1
  227. package/fesm2015/bravura-ui.mjs.map +0 -1
  228. package/fesm2020/bravura-ui-alert-testing.mjs.map +0 -1
  229. package/fesm2020/bravura-ui-alert.mjs +0 -328
  230. package/fesm2020/bravura-ui-alert.mjs.map +0 -1
  231. package/fesm2020/bravura-ui-behavior.mjs.map +0 -1
  232. package/fesm2020/bravura-ui-clip-note.mjs.map +0 -1
  233. package/fesm2020/bravura-ui-common.mjs.map +0 -1
  234. package/fesm2020/bravura-ui-currency-input.mjs.map +0 -1
  235. package/fesm2020/bravura-ui-decimal-input.mjs.map +0 -1
  236. package/fesm2020/bravura-ui-discrete-input.mjs.map +0 -1
  237. package/fesm2020/bravura-ui-file-upload.mjs +0 -474
  238. package/fesm2020/bravura-ui-file-upload.mjs.map +0 -1
  239. package/fesm2020/bravura-ui-form-field.mjs.map +0 -1
  240. package/fesm2020/bravura-ui-icon-font.mjs.map +0 -1
  241. package/fesm2020/bravura-ui-panel.mjs +0 -206
  242. package/fesm2020/bravura-ui-panel.mjs.map +0 -1
  243. package/fesm2020/bravura-ui-phone-number.mjs.map +0 -1
  244. package/fesm2020/bravura-ui-radio-panel-testing.mjs.map +0 -1
  245. package/fesm2020/bravura-ui-radio-panel.mjs.map +0 -1
  246. package/fesm2020/bravura-ui-selection-panel.mjs +0 -306
  247. package/fesm2020/bravura-ui-selection-panel.mjs.map +0 -1
  248. package/fesm2020/bravura-ui-skeletons.mjs.map +0 -1
  249. package/fesm2020/bravura-ui-stepper.mjs +0 -251
  250. package/fesm2020/bravura-ui-stepper.mjs.map +0 -1
  251. package/fesm2020/bravura-ui-tooltip.mjs.map +0 -1
  252. package/fesm2020/bravura-ui.mjs +0 -8
  253. package/fesm2020/bravura-ui.mjs.map +0 -1
  254. /package/{esm2020 → esm2022}/alert/bravura-ui-alert.mjs +0 -0
  255. /package/{esm2020 → esm2022}/alert/testing/bravura-ui-alert-testing.mjs +0 -0
  256. /package/{esm2020 → esm2022}/behavior/bravura-ui-behavior.mjs +0 -0
  257. /package/{esm2020 → esm2022}/bravura-ui.mjs +0 -0
  258. /package/{esm2020 → esm2022}/clip-note/bravura-ui-clip-note.mjs +0 -0
  259. /package/{esm2020 → esm2022}/common/bravura-ui-common.mjs +0 -0
  260. /package/{esm2020 → esm2022}/currency-input/bravura-ui-currency-input.mjs +0 -0
  261. /package/{esm2020 → esm2022}/decimal-input/bravura-ui-decimal-input.mjs +0 -0
  262. /package/{esm2020 → esm2022}/decimal-input/public-api.mjs +0 -0
  263. /package/{esm2020 → esm2022}/discrete-input/bravura-ui-discrete-input.mjs +0 -0
  264. /package/{esm2020 → esm2022}/file-upload/bravura-ui-file-upload.mjs +0 -0
  265. /package/{esm2020 → esm2022}/form-field/bravura-ui-form-field.mjs +0 -0
  266. /package/{esm2020 → esm2022}/icon-font/bravura-ui-icon-font.mjs +0 -0
  267. /package/{esm2020 → esm2022}/panel/bravura-ui-panel.mjs +0 -0
  268. /package/{esm2020 → esm2022}/phone-number/bravura-ui-phone-number.mjs +0 -0
  269. /package/{esm2020 → esm2022}/radio-panel/bravura-ui-radio-panel.mjs +0 -0
  270. /package/{esm2020 → esm2022}/radio-panel/public-api.mjs +0 -0
  271. /package/{esm2020 → esm2022}/radio-panel/testing/bravura-ui-radio-panel-testing.mjs +0 -0
  272. /package/{esm2020 → esm2022}/selection-panel/bravura-ui-selection-panel.mjs +0 -0
  273. /package/{esm2020 → esm2022}/skeletons/bravura-ui-skeletons.mjs +0 -0
  274. /package/{esm2020 → esm2022}/stepper/bravura-ui-stepper.mjs +0 -0
  275. /package/{esm2020 → esm2022}/tooltip/bravura-ui-tooltip.mjs +0 -0
  276. /package/{fesm2015 → fesm2022}/bravura-ui.mjs +0 -0
@@ -1,276 +0,0 @@
1
- import { DecimalPipe, getCurrencySymbol } from '@angular/common';
2
- import { DEFAULT_CURRENCY_CODE, Directive, forwardRef, HostBinding, HostListener, Inject, Input, LOCALE_ID, Optional, Self, ɵfindLocaleData } from '@angular/core';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { MAT_FORM_FIELD } from '@angular/material/form-field';
5
- import { MatInput } from '@angular/material/input';
6
- import { noop } from 'rxjs';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/material/form-field";
9
- /* tslint:disable:no-empty */
10
- export const noop_consumer = (_) => { };
11
- /**
12
- * This directive will enhance an input element to format the numbers entered to a currency amount.
13
- */
14
- export class CurrencyInputDirective {
15
- constructor(_el, _renderer, _locale, _defaultCurrencyCode, _field) {
16
- this._el = _el;
17
- this._renderer = _renderer;
18
- this._locale = _locale;
19
- this._defaultCurrencyCode = _defaultCurrencyCode;
20
- this._field = _field;
21
- /**
22
- * true to allow negative input, otherwise false
23
- * Default to false.
24
- */
25
- this.allowNegative = false;
26
- /**
27
- * Provide the currency code to format the entered amount.
28
- * Uses angular token DEFAULT_CURRENCY_CODE by default.
29
- */
30
- this.currencyCode = '';
31
- /**
32
- * true if no decimal digits allowed, otherwise false.
33
- * Default to false.
34
- */
35
- this.baseUnitOnly = false;
36
- /**
37
- * The format the of the amount either in wide or narrow.
38
- */
39
- this.format = 'wide';
40
- this.placeholder = '';
41
- this.autocomplete = 'off';
42
- this.type = 'text';
43
- this.inputMode = 'decimal';
44
- this.change = noop_consumer;
45
- this.onTouch = noop;
46
- this._symbol = '$';
47
- this._ds = '.'; // decimal separator
48
- this._trailing = false;
49
- const userAgent = navigator.userAgent;
50
- this._safari = !userAgent.match(/Firefox/i) && !userAgent.match(/Chrome/i) && !!userAgent.match(/safari/i);
51
- this._currencyUpdated();
52
- }
53
- ngOnInit() { }
54
- ngOnChanges() {
55
- this._currencyUpdated();
56
- this.onInput();
57
- }
58
- onInput() {
59
- this._formatCurrency(this._el, false, true);
60
- }
61
- onFocus() {
62
- this._formatCurrency(this._el, false, true);
63
- }
64
- onblur() {
65
- this.onTouch();
66
- this._formatCurrency(this._el, true, false);
67
- }
68
- writeValue(value) {
69
- value = this._decimalPipe.transform(value);
70
- this._renderer.setProperty(this._el.nativeElement, 'value', value);
71
- this._formatCurrency(this._el, true, false);
72
- }
73
- registerOnChange(fn) {
74
- this.change = fn;
75
- }
76
- registerOnTouched(fn) {
77
- this.onTouch = fn;
78
- }
79
- _updatePlaceholder() {
80
- this.placeholder = this.placeholder || this._0Text;
81
- if (this._field?._control instanceof MatInput) {
82
- this._field._control.placeholder = this.placeholder;
83
- }
84
- }
85
- _currencyUpdated() {
86
- this.currencyCode = this.currencyCode || this._defaultCurrencyCode;
87
- this._symbol = getCurrencySymbol(this.currencyCode, this.format, this._locale) || '$';
88
- const localeData = ɵfindLocaleData(this._locale);
89
- this._ds = localeData[13][0];
90
- this._decimalPipe = new DecimalPipe(this._locale);
91
- const curFormat = localeData[14][2];
92
- this._trailing = curFormat.indexOf('¤') > 0;
93
- this._updatePlaceholder();
94
- }
95
- _formatCurrency(input, blur, focus) {
96
- // appends $ to value, validates decimal side
97
- // and puts cursor back in right position.
98
- // get input value
99
- let input_val = input.nativeElement.value;
100
- // don't validate empty input
101
- if (input_val === '') {
102
- this.change(null);
103
- return;
104
- }
105
- const minus = this.allowNegative ? '-' : '';
106
- // remove non digit values except currency symbol, decimal separator and hypen
107
- const reg = new RegExp(`[^0-9${minus}${this._symbol}${this._ds}]`, 'g');
108
- let sanitiseValue = input_val.replace(reg, '');
109
- if (sanitiseValue === '' || sanitiseValue === this._symbol) {
110
- this.change(null);
111
- this._renderer.setProperty(input.nativeElement, 'value', '');
112
- return;
113
- }
114
- else if ((this.allowNegative && sanitiseValue === `-${this._symbol}`) ||
115
- sanitiseValue === '-' ||
116
- sanitiseValue === '--') {
117
- this.change(null);
118
- this._renderer.setProperty(input.nativeElement, 'value', '-');
119
- return;
120
- }
121
- const negative = this.allowNegative && input_val.indexOf('-') >= 0;
122
- // original length
123
- const original_len = input_val.length;
124
- // initial caret position
125
- let caret_pos = input.nativeElement.selectionStart;
126
- input_val = input_val.replace(RegExp(`[^0-9${minus}${this._ds}]`, 'g'), '').replace(/^\.\./, '');
127
- // check for decimal
128
- if (input_val.indexOf(this._ds) >= 0) {
129
- // get position of first decimal
130
- // this prevents multiple decimals from
131
- // being entered
132
- let decimal_pos = input_val.indexOf(this._ds);
133
- // split number by decimal point
134
- let left_side = input_val.substring(0, decimal_pos);
135
- let right_side = input_val.substring(decimal_pos);
136
- // add commas to left side of number
137
- left_side = this._formatNumber(left_side, blur) || '';
138
- // no value append a zero for decimal values
139
- if (!left_side.length) {
140
- left_side = '0';
141
- }
142
- if (!this.baseUnitOnly) {
143
- // validate right side
144
- right_side = right_side.replace(/\D/g, '');
145
- // Limit decimal to only 2 digits
146
- let v = Number(`0.${right_side}`);
147
- if (v) {
148
- const length = right_side.length > 1 ? 2 : 1;
149
- right_side = v.toFixed(length).substring(2, 4);
150
- }
151
- // On blur make sure 2 numbers after decimal
152
- if (blur) {
153
- right_side += '00';
154
- }
155
- right_side = right_side.substring(0, 2);
156
- // join number by .
157
- input_val = left_side + this._ds + right_side;
158
- }
159
- else {
160
- input_val = left_side;
161
- }
162
- }
163
- else {
164
- input_val = this._formatNumber(input_val, blur);
165
- // final formatting
166
- if (blur && !this.baseUnitOnly) {
167
- input_val += `${this._ds}00`;
168
- }
169
- }
170
- const numStr = input_val;
171
- // append the currency symbol
172
- if (!this._safari || !focus) {
173
- if (this._trailing) {
174
- input_val = input_val + ' ' + this._symbol;
175
- }
176
- else {
177
- input_val = this._symbol + input_val;
178
- }
179
- }
180
- if (negative) {
181
- // append the hypen back to the value if a negative value was entered
182
- input_val = `-${input_val}`;
183
- }
184
- const num = this._convert((negative ? '-' : '') + numStr);
185
- // update control value first with the number
186
- this.change(Number(num));
187
- if (blur && num === 0) {
188
- input_val = this._0Text;
189
- }
190
- // update dom with the formatted value
191
- this._renderer.setProperty(input.nativeElement, 'value', input_val);
192
- // put caret back in the right position
193
- let updated_len = input_val.length;
194
- if (caret_pos) {
195
- caret_pos = updated_len - original_len + caret_pos;
196
- if (input_val.substring(caret_pos - this._symbol.length) === this._symbol && this._trailing) {
197
- caret_pos -= this._symbol.length + 1;
198
- }
199
- }
200
- if (!this._safari) {
201
- input.nativeElement.setSelectionRange(caret_pos, caret_pos);
202
- }
203
- }
204
- // format the number into currency format
205
- _formatNumber(n, blur = false) {
206
- // format number 1000000 to 1,234,567
207
- n = n.replace(/\D/g, '');
208
- if (blur) {
209
- n = n.replace(/^0+/, '');
210
- }
211
- return this._decimalPipe.transform(n, '1.0-0');
212
- }
213
- _convert(input) {
214
- const val = input
215
- .replace(this._ds, 'd')
216
- .replace(/[^0-9d-]/g, '')
217
- .replace('d', '.');
218
- return parseFloat(val);
219
- }
220
- get _0Text() {
221
- const decimalStr = this.baseUnitOnly ? '' : `${this._ds}00`;
222
- return this._trailing ? `0${decimalStr} ${this._symbol}` : `${this._symbol}0${decimalStr}`;
223
- }
224
- }
225
- CurrencyInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: CurrencyInputDirective, deps: [{ token: i0.ElementRef, self: true }, { token: i0.Renderer2 }, { token: LOCALE_ID }, { token: DEFAULT_CURRENCY_CODE }, { token: MAT_FORM_FIELD, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
226
- CurrencyInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: CurrencyInputDirective, selector: "input[buiCurrencyInput],input[currencyCode],input[data-type=currency]", inputs: { allowNegative: "allowNegative", currencyCode: "currencyCode", baseUnitOnly: "baseUnitOnly", format: "format" }, host: { listeners: { "input": "onInput()", "focus": "onFocus()", "blur": "onblur()" }, properties: { "placeholder": "this.placeholder", "autocomplete": "this.autocomplete", "type": "this.type", "attr.inputmode": "this.inputMode" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CurrencyInputDirective), multi: true }], usesOnChanges: true, ngImport: i0 });
227
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: CurrencyInputDirective, decorators: [{
228
- type: Directive,
229
- args: [{
230
- selector: 'input[buiCurrencyInput],input[currencyCode],input[data-type=currency]',
231
- providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CurrencyInputDirective), multi: true }]
232
- }]
233
- }], ctorParameters: function () { return [{ type: i0.ElementRef, decorators: [{
234
- type: Self
235
- }] }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
236
- type: Inject,
237
- args: [LOCALE_ID]
238
- }] }, { type: undefined, decorators: [{
239
- type: Inject,
240
- args: [DEFAULT_CURRENCY_CODE]
241
- }] }, { type: i1.MatFormField, decorators: [{
242
- type: Optional
243
- }, {
244
- type: Inject,
245
- args: [MAT_FORM_FIELD]
246
- }] }]; }, propDecorators: { allowNegative: [{
247
- type: Input
248
- }], currencyCode: [{
249
- type: Input
250
- }], baseUnitOnly: [{
251
- type: Input
252
- }], format: [{
253
- type: Input
254
- }], placeholder: [{
255
- type: HostBinding,
256
- args: ['placeholder']
257
- }], autocomplete: [{
258
- type: HostBinding,
259
- args: ['autocomplete']
260
- }], type: [{
261
- type: HostBinding,
262
- args: ['type']
263
- }], inputMode: [{
264
- type: HostBinding,
265
- args: ['attr.inputmode']
266
- }], onInput: [{
267
- type: HostListener,
268
- args: ['input']
269
- }], onFocus: [{
270
- type: HostListener,
271
- args: ['focus']
272
- }], onblur: [{
273
- type: HostListener,
274
- args: ['blur']
275
- }] } });
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvY3VycmVuY3ktaW5wdXQvY3VycmVuY3ktaW5wdXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQ04scUJBQXFCLEVBQ3JCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFHVCxRQUFRLEVBRVIsSUFBSSxFQUNKLGVBQWUsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFnQixjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBRTVCLDZCQUE2QjtBQUM3QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztBQUU1Qzs7R0FFRztBQUtILE1BQU0sT0FBTyxzQkFBc0I7SUFpRGxDLFlBQ2lCLEdBQWlDLEVBQ3pDLFNBQW9CLEVBQ0QsT0FBZSxFQUNILG9CQUE0QixFQUN2QixNQUFxQjtRQUpqRCxRQUFHLEdBQUgsR0FBRyxDQUE4QjtRQUN6QyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ0QsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNILHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBUTtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBckRsRTs7O1dBR0c7UUFFSCxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUv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LFdBQVc7c0JBRGxCLFdBQVc7dUJBQUMsYUFBYTtnQkFJbEIsWUFBWTtzQkFEbkIsV0FBVzt1QkFBQyxjQUFjO2dCQUluQixJQUFJO3NCQURYLFdBQVc7dUJBQUMsTUFBTTtnQkFJWCxTQUFTO3NCQURoQixXQUFXO3VCQUFDLGdCQUFnQjtnQkFnQzdCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPO2dCQU1yQixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTztnQkFNckIsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNpbWFsUGlwZSwgZ2V0Q3VycmVuY3lTeW1ib2wgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0REVGQVVMVF9DVVJSRU5DWV9DT0RFLFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdGZvcndhcmRSZWYsXG5cdEhvc3RCaW5kaW5nLFxuXHRIb3N0TGlzdGVuZXIsXG5cdEluamVjdCxcblx0SW5wdXQsXG5cdExPQ0FMRV9JRCxcblx0T25DaGFuZ2VzLFxuXHRPbkluaXQsXG5cdE9wdGlvbmFsLFxuXHRSZW5kZXJlcjIsXG5cdFNlbGYsXG5cdMm1ZmluZExvY2FsZURhdGFcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1BVF9GT1JNX0ZJRUxEIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICdyeGpzJztcblxuLyogdHNsaW50OmRpc2FibGU6bm8tZW1wdHkgKi9cbmV4cG9ydCBjb25zdCBub29wX2NvbnN1bWVyID0gKF86IGFueSkgPT4ge307XG5cbi8qKlxuICogVGhpcyBkaXJlY3RpdmUgd2lsbCBlbmhhbmNlIGFuIGlucHV0IGVsZW1lbnQgdG8gZm9ybWF0IHRoZSBudW1iZXJzIGVudGVyZWQgdG8gYSBjdXJyZW5jeSBhbW91bnQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ2lucHV0W2J1aUN1cnJlbmN5SW5wdXRdLGlucHV0W2N1cnJlbmN5Q29kZV0saW5wdXRbZGF0YS10eXBlPWN1cnJlbmN5XScsXG5cdHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEN1cnJlbmN5SW5wdXREaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZSB9XVxufSlcbmV4cG9ydCBjbGFzcyBDdXJyZW5jeUlucHV0RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblx0LyoqXG5cdCAqIHRydWUgdG8gYWxsb3cgbmVnYXRpdmUgaW5wdXQsIG90aGVyd2lzZSBmYWxzZVxuXHQgKiBEZWZhdWx0IHRvIGZhbHNlLlxuXHQgKi9cblx0QElucHV0KClcblx0YWxsb3dOZWdhdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBQcm92aWRlIHRoZSBjdXJyZW5jeSBjb2RlIHRvIGZvcm1hdCB0aGUgZW50ZXJlZCBhbW91bnQuXG5cdCAqIFVzZXMgYW5ndWxhciB0b2tlbiBERUZBVUxUX0NVUlJFTkNZX0NPREUgYnkgZGVmYXVsdC5cblx0ICovXG5cdEBJbnB1dCgpXG5cdGN1cnJlbmN5Q29kZTogc3RyaW5nID0gJyc7XG5cblx0LyoqXG5cdCAqIHRydWUgaWYgbm8gZGVjaW1hbCBkaWdpdHMgYWxsb3dlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuXHQgKiBEZWZhdWx0IHRvIGZhbHNlLlxuXHQgKi9cblx0QElucHV0KClcblx0YmFzZVVuaXRPbmx5ID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFRoZSBmb3JtYXQgdGhlIG9mIHRoZSBhbW91bnQgZWl0aGVyIGluIHdpZGUgb3IgbmFycm93LlxuXHQgKi9cblx0QElucHV0KClcblx0Zm9ybWF0OiAnbmFycm93JyB8ICd3aWRlJyA9ICd3aWRlJztcblxuXHRASG9zdEJpbmRpbmcoJ3BsYWNlaG9sZGVyJylcblx0cHJpdmF0ZSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cblx0QEhvc3RCaW5kaW5nKCdhdXRvY29tcGxldGUnKVxuXHRwcml2YXRlIGF1dG9jb21wbGV0ZSA9ICdvZmYnO1xuXG5cdEBIb3N0QmluZGluZygndHlwZScpXG5cdHByaXZhdGUgdHlwZSA9ICd0ZXh0JztcblxuXHRASG9zdEJpbmRpbmcoJ2F0dHIuaW5wdXRtb2RlJylcblx0cHJpdmF0ZSBpbnB1dE1vZGUgPSAnZGVjaW1hbCc7XG5cblx0cHJpdmF0ZSBjaGFuZ2UgPSBub29wX2NvbnN1bWVyO1xuXHRwcml2YXRlIG9uVG91Y2ggPSBub29wO1xuXHRwcml2YXRlIF9zYWZhcmk6IGJvb2xlYW47XG5cdHByaXZhdGUgX3N5bWJvbDogc3RyaW5nID0gJyQnO1xuXHRwcml2YXRlIF9kZWNpbWFsUGlwZSE6IERlY2ltYWxQaXBlO1xuXG5cdHByaXZhdGUgX2RzID0gJy4nOyAvLyBkZWNpbWFsIHNlcGFyYXRvclxuXHRwcml2YXRlIF90cmFpbGluZyA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdEBTZWxmKCkgcHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXG5cdFx0cHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcblx0XHRASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmcsXG5cdFx0QEluamVjdChERUZBVUxUX0NVUlJFTkNZX0NPREUpIHByaXZhdGUgX2RlZmF1bHRDdXJyZW5jeUNvZGU6IHN0cmluZyxcblx0XHRAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEKSBwcml2YXRlIF9maWVsZD86IE1hdEZvcm1GaWVsZFxuXHQpIHtcblx0XHRjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuXHRcdHRoaXMuX3NhZmFyaSA9ICF1c2VyQWdlbnQubWF0Y2goL0ZpcmVmb3gvaSkgJiYgIXVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lL2kpICYmICEhdXNlckFnZW50Lm1hdGNoKC9zYWZhcmkvaSk7XG5cdFx0dGhpcy5fY3VycmVuY3lVcGRhdGVkKCk7XG5cdH1cblxuXHRuZ09uSW5pdCgpIHt9XG5cblx0bmdPbkNoYW5nZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5fY3VycmVuY3lVcGRhdGVkKCk7XG5cdFx0dGhpcy5vbklucHV0KCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdpbnB1dCcpXG5cdG9uSW5wdXQoKSB7XG5cdFx0dGhpcy5fZm9ybWF0Q3VycmVuY3kodGhpcy5fZWwsIGZhbHNlLCB0cnVlKTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcblx0b25Gb2N1cygpIHtcblx0XHR0aGlzLl9mb3JtYXRDdXJyZW5jeSh0aGlzLl9lbCwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignYmx1cicpXG5cdG9uYmx1cigpIHtcblx0XHR0aGlzLm9uVG91Y2goKTtcblx0XHR0aGlzLl9mb3JtYXRDdXJyZW5jeSh0aGlzLl9lbCwgdHJ1ZSwgZmFsc2UpO1xuXHR9XG5cblx0d3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG5cdFx0dmFsdWUgPSB0aGlzLl9kZWNpbWFsUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblx0XHR0aGlzLl9mb3JtYXRDdXJyZW5jeSh0aGlzLl9lbCwgdHJ1ZSwgZmFsc2UpO1xuXHR9XG5cblx0cmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG5cdFx0dGhpcy5jaGFuZ2UgPSBmbjtcblx0fVxuXG5cdHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcblx0XHR0aGlzLm9uVG91Y2ggPSBmbjtcblx0fVxuXG5cdHByaXZhdGUgX3VwZGF0ZVBsYWNlaG9sZGVyKCkge1xuXHRcdHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMuXzBUZXh0O1xuXHRcdGlmICh0aGlzLl9maWVsZD8uX2NvbnRyb2wgaW5zdGFuY2VvZiBNYXRJbnB1dCkge1xuXHRcdFx0dGhpcy5fZmllbGQuX2NvbnRyb2wucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX2N1cnJlbmN5VXBkYXRlZCgpIHtcblx0XHR0aGlzLmN1cnJlbmN5Q29kZSA9IHRoaXMuY3VycmVuY3lDb2RlIHx8IHRoaXMuX2RlZmF1bHRDdXJyZW5jeUNvZGU7XG5cdFx0dGhpcy5fc3ltYm9sID0gZ2V0Q3VycmVuY3lTeW1ib2wodGhpcy5jdXJyZW5jeUNvZGUsIHRoaXMuZm9ybWF0LCB0aGlzLl9sb2NhbGUpIHx8ICckJztcblx0XHRjb25zdCBsb2NhbGVEYXRhID0gybVmaW5kTG9jYWxlRGF0YSh0aGlzLl9sb2NhbGUpO1xuXHRcdHRoaXMuX2RzID0gbG9jYWxlRGF0YVsxM11bMF07XG5cdFx0dGhpcy5fZGVjaW1hbFBpcGUgPSBuZXcgRGVjaW1hbFBpcGUodGhpcy5fbG9jYWxlKTtcblx0XHRjb25zdCBjdXJGb3JtYXQ6IHN0cmluZyA9IGxvY2FsZURhdGFbMTRdWzJdO1xuXHRcdHRoaXMuX3RyYWlsaW5nID0gY3VyRm9ybWF0LmluZGV4T2YoJ8KkJykgPiAwO1xuXHRcdHRoaXMuX3VwZGF0ZVBsYWNlaG9sZGVyKCk7XG5cdH1cblxuXHRwcml2YXRlIF9mb3JtYXRDdXJyZW5jeShpbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiwgYmx1cjogYm9vbGVhbiwgZm9jdXM6IGJvb2xlYW4pIHtcblx0XHQvLyBhcHBlbmRzICQgdG8gdmFsdWUsIHZhbGlkYXRlcyBkZWNpbWFsIHNpZGVcblx0XHQvLyBhbmQgcHV0cyBjdXJzb3IgYmFjayBpbiByaWdodCBwb3NpdGlvbi5cblx0XHQvLyBnZXQgaW5wdXQgdmFsdWVcblx0XHRsZXQgaW5wdXRfdmFsID0gaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZTtcblxuXHRcdC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IGlucHV0XG5cdFx0aWYgKGlucHV0X3ZhbCA9PT0gJycpIHtcblx0XHRcdHRoaXMuY2hhbmdlKG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1pbnVzID0gdGhpcy5hbGxvd05lZ2F0aXZlID8gJy0nIDogJyc7XG5cblx0XHQvLyByZW1vdmUgbm9uIGRpZ2l0IHZhbHVlcyBleGNlcHQgY3VycmVuY3kgc3ltYm9sLCBkZWNpbWFsIHNlcGFyYXRvciBhbmQgaHlwZW5cblx0XHRjb25zdCByZWcgPSBuZXcgUmVnRXhwKGBbXjAtOSR7bWludXN9JHt0aGlzLl9zeW1ib2x9JHt0aGlzLl9kc31dYCwgJ2cnKTtcblxuXHRcdGxldCBzYW5pdGlzZVZhbHVlID0gaW5wdXRfdmFsLnJlcGxhY2UocmVnLCAnJyk7XG5cblx0XHRpZiAoc2FuaXRpc2VWYWx1ZSA9PT0gJycgfHwgc2FuaXRpc2VWYWx1ZSA9PT0gdGhpcy5fc3ltYm9sKSB7XG5cdFx0XHR0aGlzLmNoYW5nZShudWxsKTtcblx0XHRcdHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KGlucHV0Lm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsICcnKTtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0KHRoaXMuYWxsb3dOZWdhdGl2ZSAmJiBzYW5pdGlzZVZhbHVlID09PSBgLSR7dGhpcy5fc3ltYm9sfWApIHx8XG5cdFx0XHRzYW5pdGlzZVZhbHVlID09PSAnLScgfHxcblx0XHRcdHNhbml0aXNlVmFsdWUgPT09ICctLSdcblx0XHQpIHtcblx0XHRcdHRoaXMuY2hhbmdlKG51bGwpO1xuXHRcdFx0dGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgJy0nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBuZWdhdGl2ZSA9IHRoaXMuYWxsb3dOZWdhdGl2ZSAmJiBpbnB1dF92YWwuaW5kZXhPZignLScpID49IDA7XG5cblx0XHQvLyBvcmlnaW5hbCBsZW5ndGhcblx0XHRjb25zdCBvcmlnaW5hbF9sZW4gPSBpbnB1dF92YWwubGVuZ3RoO1xuXG5cdFx0Ly8gaW5pdGlhbCBjYXJldCBwb3NpdGlvblxuXHRcdGxldCBjYXJldF9wb3MgPSBpbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuXG5cdFx0aW5wdXRfdmFsID0gaW5wdXRfdmFsLnJlcGxhY2UoUmVnRXhwKGBbXjAtOSR7bWludXN9JHt0aGlzLl9kc31dYCwgJ2cnKSwgJycpLnJlcGxhY2UoL15cXC5cXC4vLCAnJyk7XG5cdFx0Ly8gY2hlY2sgZm9yIGRlY2ltYWxcblx0XHRpZiAoaW5wdXRfdmFsLmluZGV4T2YodGhpcy5fZHMpID49IDApIHtcblx0XHRcdC8vIGdldCBwb3NpdGlvbiBvZiBmaXJzdCBkZWNpbWFsXG5cdFx0XHQvLyB0aGlzIHByZXZlbnRzIG11bHRpcGxlIGRlY2ltYWxzIGZyb21cblx0XHRcdC8vIGJlaW5nIGVudGVyZWRcblx0XHRcdGxldCBkZWNpbWFsX3BvcyA9IGlucHV0X3ZhbC5pbmRleE9mKHRoaXMuX2RzKTtcblxuXHRcdFx0Ly8gc3BsaXQgbnVtYmVyIGJ5IGRlY2ltYWwgcG9pbnRcblx0XHRcdGxldCBsZWZ0X3NpZGUgPSBpbnB1dF92YWwuc3Vic3RyaW5nKDAsIGRlY2ltYWxfcG9zKTtcblx0XHRcdGxldCByaWdodF9zaWRlID0gaW5wdXRfdmFsLnN1YnN0cmluZyhkZWNpbWFsX3Bvcyk7XG5cblx0XHRcdC8vIGFkZCBjb21tYXMgdG8gbGVmdCBzaWRlIG9mIG51bWJlclxuXHRcdFx0bGVmdF9zaWRlID0gdGhpcy5fZm9ybWF0TnVtYmVyKGxlZnRfc2lkZSwgYmx1cikgfHwgJyc7XG5cblx0XHRcdC8vIG5vIHZhbHVlIGFwcGVuZCBhIHplcm8gZm9yIGRlY2ltYWwgdmFsdWVzXG5cdFx0XHRpZiAoIWxlZnRfc2lkZS5sZW5ndGgpIHtcblx0XHRcdFx0bGVmdF9zaWRlID0gJzAnO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuYmFzZVVuaXRPbmx5KSB7XG5cdFx0XHRcdC8vIHZhbGlkYXRlIHJpZ2h0IHNpZGVcblx0XHRcdFx0cmlnaHRfc2lkZSA9IHJpZ2h0X3NpZGUucmVwbGFjZSgvXFxEL2csICcnKTtcblxuXHRcdFx0XHQvLyBMaW1pdCBkZWNpbWFsIHRvIG9ubHkgMiBkaWdpdHNcblx0XHRcdFx0bGV0IHYgPSBOdW1iZXIoYDAuJHtyaWdodF9zaWRlfWApO1xuXHRcdFx0XHRpZiAodikge1xuXHRcdFx0XHRcdGNvbnN0IGxlbmd0aCA9IHJpZ2h0X3NpZGUubGVuZ3RoID4gMSA/IDIgOiAxO1xuXHRcdFx0XHRcdHJpZ2h0X3NpZGUgPSB2LnRvRml4ZWQobGVuZ3RoKS5zdWJzdHJpbmcoMiwgNCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPbiBibHVyIG1ha2Ugc3VyZSAyIG51bWJlcnMgYWZ0ZXIgZGVjaW1hbFxuXHRcdFx0XHRpZiAoYmx1cikge1xuXHRcdFx0XHRcdHJpZ2h0X3NpZGUgKz0gJzAwJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJpZ2h0X3NpZGUgPSByaWdodF9zaWRlLnN1YnN0cmluZygwLCAyKTtcblxuXHRcdFx0XHQvLyBqb2luIG51bWJlciBieSAuXG5cdFx0XHRcdGlucHV0X3ZhbCA9IGxlZnRfc2lkZSArIHRoaXMuX2RzICsgcmlnaHRfc2lkZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlucHV0X3ZhbCA9IGxlZnRfc2lkZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aW5wdXRfdmFsID0gdGhpcy5fZm9ybWF0TnVtYmVyKGlucHV0X3ZhbCwgYmx1cik7XG5cblx0XHRcdC8vIGZpbmFsIGZvcm1hdHRpbmdcblx0XHRcdGlmIChibHVyICYmICF0aGlzLmJhc2VVbml0T25seSkge1xuXHRcdFx0XHRpbnB1dF92YWwgKz0gYCR7dGhpcy5fZHN9MDBgO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG51bVN0ciA9IGlucHV0X3ZhbDtcblx0XHQvLyBhcHBlbmQgdGhlIGN1cnJlbmN5IHN5bWJvbFxuXHRcdGlmICghdGhpcy5fc2FmYXJpIHx8ICFmb2N1cykge1xuXHRcdFx0aWYgKHRoaXMuX3RyYWlsaW5nKSB7XG5cdFx0XHRcdGlucHV0X3ZhbCA9IGlucHV0X3ZhbCArICcgJyArIHRoaXMuX3N5bWJvbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlucHV0X3ZhbCA9IHRoaXMuX3N5bWJvbCArIGlucHV0X3ZhbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobmVnYXRpdmUpIHtcblx0XHRcdC8vIGFwcGVuZCB0aGUgaHlwZW4gYmFjayB0byB0aGUgdmFsdWUgaWYgYSBuZWdhdGl2ZSB2YWx1ZSB3YXMgZW50ZXJlZFxuXHRcdFx0aW5wdXRfdmFsID0gYC0ke2lucHV0X3ZhbH1gO1xuXHRcdH1cblxuXHRcdGNvbnN0IG51bSA9IHRoaXMuX2NvbnZlcnQoKG5lZ2F0aXZlID8gJy0nIDogJycpICsgbnVtU3RyKTtcblxuXHRcdC8vIHVwZGF0ZSBjb250cm9sIHZhbHVlIGZpcnN0IHdpdGggdGhlIG51bWJlclxuXHRcdHRoaXMuY2hhbmdlKE51bWJlcihudW0pKTtcblxuXHRcdGlmIChibHVyICYmIG51bSA9PT0gMCkge1xuXHRcdFx0aW5wdXRfdmFsID0gdGhpcy5fMFRleHQ7XG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGRvbSB3aXRoIHRoZSBmb3JtYXR0ZWQgdmFsdWVcblx0XHR0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBpbnB1dF92YWwpO1xuXHRcdC8vIHB1dCBjYXJldCBiYWNrIGluIHRoZSByaWdodCBwb3NpdGlvblxuXHRcdGxldCB1cGRhdGVkX2xlbiA9IGlucHV0X3ZhbC5sZW5ndGg7XG5cdFx0aWYgKGNhcmV0X3Bvcykge1xuXHRcdFx0Y2FyZXRfcG9zID0gdXBkYXRlZF9sZW4gLSBvcmlnaW5hbF9sZW4gKyBjYXJldF9wb3M7XG5cdFx0XHRpZiAoaW5wdXRfdmFsLnN1YnN0cmluZyhjYXJldF9wb3MgLSB0aGlzLl9zeW1ib2wubGVuZ3RoKSA9PT0gdGhpcy5fc3ltYm9sICYmIHRoaXMuX3RyYWlsaW5nKSB7XG5cdFx0XHRcdGNhcmV0X3BvcyAtPSB0aGlzLl9zeW1ib2wubGVuZ3RoICsgMTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCF0aGlzLl9zYWZhcmkpIHtcblx0XHRcdGlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXRfcG9zLCBjYXJldF9wb3MpO1xuXHRcdH1cblx0fVxuXG5cdC8vIGZvcm1hdCB0aGUgbnVtYmVyIGludG8gY3VycmVuY3kgZm9ybWF0XG5cdHByaXZhdGUgX2Zvcm1hdE51bWJlcihuOiBzdHJpbmcsIGJsdXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdC8vIGZvcm1hdCBudW1iZXIgMTAwMDAwMCB0byAxLDIzNCw1Njdcblx0XHRuID0gbi5yZXBsYWNlKC9cXEQvZywgJycpO1xuXHRcdGlmIChibHVyKSB7XG5cdFx0XHRuID0gbi5yZXBsYWNlKC9eMCsvLCAnJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9kZWNpbWFsUGlwZS50cmFuc2Zvcm0obiwgJzEuMC0wJykgYXMgc3RyaW5nO1xuXHR9XG5cblx0cHJpdmF0ZSBfY29udmVydChpbnB1dDogc3RyaW5nKTogbnVtYmVyIHtcblx0XHRjb25zdCB2YWwgPSBpbnB1dFxuXHRcdFx0LnJlcGxhY2UodGhpcy5fZHMsICdkJylcblx0XHRcdC5yZXBsYWNlKC9bXjAtOWQtXS9nLCAnJylcblx0XHRcdC5yZXBsYWNlKCdkJywgJy4nKTtcblx0XHRyZXR1cm4gcGFyc2VGbG9hdCh2YWwpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXQgXzBUZXh0KCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZGVjaW1hbFN0ciA9IHRoaXMuYmFzZVVuaXRPbmx5ID8gJycgOiBgJHt0aGlzLl9kc30wMGA7XG5cdFx0cmV0dXJuIHRoaXMuX3RyYWlsaW5nID8gYDAke2RlY2ltYWxTdHJ9ICR7dGhpcy5fc3ltYm9sfWAgOiBgJHt0aGlzLl9zeW1ib2x9MCR7ZGVjaW1hbFN0cn1gO1xuXHR9XG59XG4iXX0=
@@ -1,19 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { NgModule } from '@angular/core';
3
- import { CurrencyInputDirective } from './currency-input.directive';
4
- import * as i0 from "@angular/core";
5
- export class CurrencyInputModule {
6
- }
7
- CurrencyInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: CurrencyInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
- CurrencyInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.6", ngImport: i0, type: CurrencyInputModule, declarations: [CurrencyInputDirective], imports: [CommonModule], exports: [CurrencyInputDirective] });
9
- CurrencyInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: CurrencyInputModule, imports: [CommonModule] });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: CurrencyInputModule, decorators: [{
11
- type: NgModule,
12
- args: [{
13
- declarations: [CurrencyInputDirective],
14
- imports: [CommonModule],
15
- exports: [CurrencyInputDirective]
16
- }]
17
- }] });
18
- export { CurrencyInputDirective };
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktaW5wdXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvY3VycmVuY3ktaW5wdXQvY3VycmVuY3ktaW5wdXQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQU9wRSxNQUFNLE9BQU8sbUJBQW1COztnSEFBbkIsbUJBQW1CO2lIQUFuQixtQkFBbUIsaUJBSmhCLHNCQUFzQixhQUMzQixZQUFZLGFBQ1osc0JBQXNCO2lIQUVwQixtQkFBbUIsWUFIckIsWUFBWTsyRkFHVixtQkFBbUI7a0JBTC9CLFFBQVE7bUJBQUM7b0JBQ1QsWUFBWSxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2pDOztBQUdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXJyZW5jeUlucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi9jdXJyZW5jeS1pbnB1dC5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuXHRkZWNsYXJhdGlvbnM6IFtDdXJyZW5jeUlucHV0RGlyZWN0aXZlXSxcblx0aW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG5cdGV4cG9ydHM6IFtDdXJyZW5jeUlucHV0RGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBDdXJyZW5jeUlucHV0TW9kdWxlIHt9XG5cbmV4cG9ydCB7IEN1cnJlbmN5SW5wdXREaXJlY3RpdmUgfTtcbiJdfQ==
@@ -1,122 +0,0 @@
1
- import { DecimalPipe } from '@angular/common';
2
- import { Directive, forwardRef, HostBinding, HostListener, Input, Self } from '@angular/core';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { noop } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- /* tslint:disable:no-empty */
7
- export const noop_consumer = (_) => { };
8
- /**
9
- * This directive will enhance an input element to format the numbers entered to a decimal amount.
10
- */
11
- export class DecimalInputDirective {
12
- constructor(_el, _renderer) {
13
- this._el = _el;
14
- this._renderer = _renderer;
15
- /**
16
- * number of decimal places allowed
17
- */
18
- this.buiDecimalInput = 2;
19
- this.placeholder = '';
20
- this.autocomplete = 'off';
21
- this.type = 'number';
22
- this.inputMode = 'decimal';
23
- this.change = noop_consumer;
24
- this.onTouch = noop;
25
- }
26
- ngOnChanges() {
27
- this.buiDecimalInput = this.buiDecimalInput || 2;
28
- this.onInput();
29
- }
30
- onInput() {
31
- const value = this._el.nativeElement.value;
32
- const decimalPart = value.split('.')[1];
33
- if (decimalPart && decimalPart.length > this.buiDecimalInput) {
34
- const indexOfPeriod = value.indexOf('.');
35
- const newValue = value.substring(0, indexOfPeriod + this.buiDecimalInput + 1);
36
- this._renderer.setProperty(this._el.nativeElement, 'value', newValue);
37
- }
38
- const resolvedValue = this._el.nativeElement.value;
39
- this.change(resolvedValue === '' || resolvedValue === null || resolvedValue === undefined ? null : Number(resolvedValue));
40
- }
41
- onKeypress(evt) {
42
- const target = evt.target;
43
- const value = target.value;
44
- const isSpace = evt.key === ' ';
45
- if (isSpace ||
46
- (!['.', '-'].includes(evt.key) && isNaN(Number(evt.key))) ||
47
- (evt.key === '.' && value.indexOf('.') > 0)) {
48
- evt.preventDefault();
49
- }
50
- }
51
- onblur() {
52
- this.onTouch();
53
- this._resetDecimalPlaces();
54
- }
55
- writeValue(value) {
56
- this._renderer.setProperty(this._el.nativeElement, 'value', value);
57
- this._resetDecimalPlaces();
58
- }
59
- registerOnChange(fn) {
60
- this.change = fn;
61
- }
62
- registerOnTouched(fn) {
63
- this.onTouch = fn;
64
- }
65
- _resetDecimalPlaces() {
66
- const value = this._el.nativeElement.value;
67
- if (value === '' || value === null || value === undefined) {
68
- return;
69
- }
70
- const splitValues = value.split('.');
71
- let newValue = '';
72
- if (splitValues[1] && splitValues[1].length > this.buiDecimalInput) {
73
- newValue = value.substring(0, splitValues[0].length + 1 + this.buiDecimalInput);
74
- }
75
- else {
76
- this.buiDecimalInput = this.buiDecimalInput < 0 ? 0 : this.buiDecimalInput;
77
- newValue = Number(value).toFixed(this.buiDecimalInput);
78
- }
79
- this._renderer.setProperty(this._el.nativeElement, 'value', newValue);
80
- }
81
- }
82
- DecimalInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DecimalInputDirective, deps: [{ token: i0.ElementRef, self: true }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
83
- DecimalInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: DecimalInputDirective, selector: "input[buiDecimalInput]", inputs: { buiDecimalInput: "buiDecimalInput" }, host: { listeners: { "input": "onInput()", "keypress": "onKeypress($event)", "blur": "onblur()" }, properties: { "placeholder": "this.placeholder", "autocomplete": "this.autocomplete", "type": "this.type", "attr.inputmode": "this.inputMode" } }, providers: [
84
- DecimalPipe,
85
- { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DecimalInputDirective), multi: true }
86
- ], usesOnChanges: true, ngImport: i0 });
87
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: DecimalInputDirective, decorators: [{
88
- type: Directive,
89
- args: [{
90
- selector: 'input[buiDecimalInput]',
91
- providers: [
92
- DecimalPipe,
93
- { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DecimalInputDirective), multi: true }
94
- ]
95
- }]
96
- }], ctorParameters: function () { return [{ type: i0.ElementRef, decorators: [{
97
- type: Self
98
- }] }, { type: i0.Renderer2 }]; }, propDecorators: { buiDecimalInput: [{
99
- type: Input
100
- }], placeholder: [{
101
- type: HostBinding,
102
- args: ['placeholder']
103
- }], autocomplete: [{
104
- type: HostBinding,
105
- args: ['autocomplete']
106
- }], type: [{
107
- type: HostBinding,
108
- args: ['type']
109
- }], inputMode: [{
110
- type: HostBinding,
111
- args: ['attr.inputmode']
112
- }], onInput: [{
113
- type: HostListener,
114
- args: ['input']
115
- }], onKeypress: [{
116
- type: HostListener,
117
- args: ['keypress', ['$event']]
118
- }], onblur: [{
119
- type: HostListener,
120
- args: ['blur']
121
- }] } });
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaW1hbC1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9kZWNpbWFsLWlucHV0L2RlY2ltYWwtaW5wdXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQ04sU0FBUyxFQUVULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxJQUFJLEVBQ0osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRTVCLDZCQUE2QjtBQUM3QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztBQUU1Qzs7R0FFRztBQVFILE1BQU0sT0FBTyxxQkFBcUI7SUFzQmpDLFlBQTRCLEdBQWlDLEVBQVUsU0FBb0I7UUFBL0QsUUFBRyxHQUFILEdBQUcsQ0FBOEI7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBckIzRjs7V0FFRztRQUVILG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBR3BCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBR3pCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBR3JCLFNBQUksR0FBRyxRQUFRLENBQUM7UUFHaEIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUV0QixXQUFNLEdBQUcsYUFBYSxDQUFDO1FBQ3ZCLFlBQU8sR0FBRyxJQUFJLENBQUM7SUFFdUUsQ0FBQztJQUUvRixXQUFXO1FBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJ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QUk7c0JBRFgsV0FBVzt1QkFBQyxNQUFNO2dCQUlYLFNBQVM7c0JBRGhCLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQWM3QixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTztnQkFrQnJCLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZ0JwQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY2ltYWxQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdERpcmVjdGl2ZSxcblx0RWxlbWVudFJlZixcblx0Zm9yd2FyZFJlZixcblx0SG9zdEJpbmRpbmcsXG5cdEhvc3RMaXN0ZW5lcixcblx0SW5wdXQsXG5cdE9uQ2hhbmdlcyxcblx0UmVuZGVyZXIyLFxuXHRTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJ3J4anMnO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby1lbXB0eSAqL1xuZXhwb3J0IGNvbnN0IG5vb3BfY29uc3VtZXIgPSAoXzogYW55KSA9PiB7fTtcblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3aWxsIGVuaGFuY2UgYW4gaW5wdXQgZWxlbWVudCB0byBmb3JtYXQgdGhlIG51bWJlcnMgZW50ZXJlZCB0byBhIGRlY2ltYWwgYW1vdW50LlxuICovXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdpbnB1dFtidWlEZWNpbWFsSW5wdXRdJyxcblx0cHJvdmlkZXJzOiBbXG5cdFx0RGVjaW1hbFBpcGUsXG5cdFx0eyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGVjaW1hbElucHV0RGlyZWN0aXZlKSwgbXVsdGk6IHRydWUgfVxuXHRdXG59KVxuZXhwb3J0IGNsYXNzIERlY2ltYWxJbnB1dERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXHQvKipcblx0ICogbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGFsbG93ZWRcblx0ICovXG5cdEBJbnB1dCgpXG5cdGJ1aURlY2ltYWxJbnB1dDogbnVtYmVyID0gMjtcblxuXHRASG9zdEJpbmRpbmcoJ3BsYWNlaG9sZGVyJylcblx0cHJpdmF0ZSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cblx0QEhvc3RCaW5kaW5nKCdhdXRvY29tcGxldGUnKVxuXHRwcml2YXRlIGF1dG9jb21wbGV0ZSA9ICdvZmYnO1xuXG5cdEBIb3N0QmluZGluZygndHlwZScpXG5cdHByaXZhdGUgdHlwZSA9ICdudW1iZXInO1xuXG5cdEBIb3N0QmluZGluZygnYXR0ci5pbnB1dG1vZGUnKVxuXHRwcml2YXRlIGlucHV0TW9kZSA9ICdkZWNpbWFsJztcblxuXHRwcml2YXRlIGNoYW5nZSA9IG5vb3BfY29uc3VtZXI7XG5cdHByaXZhdGUgb25Ub3VjaCA9IG5vb3A7XG5cblx0Y29uc3RydWN0b3IoQFNlbGYoKSBwcml2YXRlIF9lbDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiwgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuXHRuZ09uQ2hhbmdlcygpOiB2b2lkIHtcblx0XHR0aGlzLmJ1aURlY2ltYWxJbnB1dCA9IHRoaXMuYnVpRGVjaW1hbElucHV0IHx8IDI7XG5cdFx0dGhpcy5vbklucHV0KCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdpbnB1dCcpXG5cdG9uSW5wdXQoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXG5cdFx0Y29uc3QgZGVjaW1hbFBhcnQgPSB2YWx1ZS5zcGxpdCgnLicpWzFdO1xuXG5cdFx0aWYgKGRlY2ltYWxQYXJ0ICYmIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IHRoaXMuYnVpRGVjaW1hbElucHV0KSB7XG5cdFx0XHRjb25zdCBpbmRleE9mUGVyaW9kID0gdmFsdWUuaW5kZXhPZignLicpO1xuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXhPZlBlcmlvZCArIHRoaXMuYnVpRGVjaW1hbElucHV0ICsgMSk7XG5cdFx0XHR0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBuZXdWYWx1ZSk7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXHRcdHRoaXMuY2hhbmdlKFxuXHRcdFx0cmVzb2x2ZWRWYWx1ZSA9PT0gJycgfHwgcmVzb2x2ZWRWYWx1ZSA9PT0gbnVsbCB8fCByZXNvbHZlZFZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKHJlc29sdmVkVmFsdWUpXG5cdFx0KTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoJ2tleXByZXNzJywgWyckZXZlbnQnXSlcblx0b25LZXlwcmVzcyhldnQ6IEtleWJvYXJkRXZlbnQpIHtcblx0XHRjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cdFx0Y29uc3QgdmFsdWUgPSB0YXJnZXQudmFsdWU7XG5cdFx0Y29uc3QgaXNTcGFjZSA9IGV2dC5rZXkgPT09ICcgJztcblxuXHRcdGlmIChcblx0XHRcdGlzU3BhY2UgfHxcblx0XHRcdCghWycuJywgJy0nXS5pbmNsdWRlcyhldnQua2V5KSAmJiBpc05hTihOdW1iZXIoZXZ0LmtleSkpKSB8fFxuXHRcdFx0KGV2dC5rZXkgPT09ICcuJyAmJiB2YWx1ZS5pbmRleE9mKCcuJykgPiAwKVxuXHRcdCkge1xuXHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignYmx1cicpXG5cdG9uYmx1cigpIHtcblx0XHR0aGlzLm9uVG91Y2goKTtcblx0XHR0aGlzLl9yZXNldERlY2ltYWxQbGFjZXMoKTtcblx0fVxuXG5cdHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblx0XHR0aGlzLl9yZXNldERlY2ltYWxQbGFjZXMoKTtcblx0fVxuXG5cdHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuXHRcdHRoaXMuY2hhbmdlID0gZm47XG5cdH1cblxuXHRyZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG5cdFx0dGhpcy5vblRvdWNoID0gZm47XG5cdH1cblxuXHRwcml2YXRlIF9yZXNldERlY2ltYWxQbGFjZXMoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuXHRcdGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBzcGxpdFZhbHVlcyA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cdFx0bGV0IG5ld1ZhbHVlID0gJyc7XG5cdFx0aWYgKHNwbGl0VmFsdWVzWzFdICYmIHNwbGl0VmFsdWVzWzFdLmxlbmd0aCA+IHRoaXMuYnVpRGVjaW1hbElucHV0KSB7XG5cdFx0XHRuZXdWYWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBzcGxpdFZhbHVlc1swXS5sZW5ndGggKyAxICsgdGhpcy5idWlEZWNpbWFsSW5wdXQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmJ1aURlY2ltYWxJbnB1dCA9IHRoaXMuYnVpRGVjaW1hbElucHV0IDwgMCA/IDAgOiB0aGlzLmJ1aURlY2ltYWxJbnB1dDtcblx0XHRcdG5ld1ZhbHVlID0gTnVtYmVyKHZhbHVlKS50b0ZpeGVkKHRoaXMuYnVpRGVjaW1hbElucHV0KTtcblx0XHR9XG5cdFx0dGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWwubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbmV3VmFsdWUpO1xuXHR9XG59XG4iXX0=