@ohioepa/oepa-ui-lib 1.1.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 (299) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/account-search-input/account-search-input.component.mjs +147 -0
  3. package/esm2022/lib/account-search-modal/account-search-modal.component.mjs +151 -0
  4. package/esm2022/lib/action-btn/action-btn.component.mjs +70 -0
  5. package/esm2022/lib/action-btn/oepa-action-event.mjs +2 -0
  6. package/esm2022/lib/action-btn/oepa-action.mjs +2 -0
  7. package/esm2022/lib/action-btn-modal/action-btn-modal.component.mjs +21 -0
  8. package/esm2022/lib/address/address.component.mjs +174 -0
  9. package/esm2022/lib/address/oepa-address.service.mjs +64 -0
  10. package/esm2022/lib/address/oepa-form-address.mjs +2 -0
  11. package/esm2022/lib/blank/blank.component.mjs +14 -0
  12. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -0
  13. package/esm2022/lib/checkbox-input/checkbox-input.component.mjs +41 -0
  14. package/esm2022/lib/comment-modal/comment-modal.component.mjs +56 -0
  15. package/esm2022/lib/common-forms.module.mjs +291 -0
  16. package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +120 -0
  17. package/esm2022/lib/contact/contact.component.mjs +102 -0
  18. package/esm2022/lib/contact/oepa-form-contact.mjs +2 -0
  19. package/esm2022/lib/date-input/date-input.component.mjs +52 -0
  20. package/esm2022/lib/date-input-modal/date-input-modal.component.mjs +68 -0
  21. package/esm2022/lib/datepicker/datepicker.component.mjs +131 -0
  22. package/esm2022/lib/daterangepicker/daterangepicker.component.mjs +70 -0
  23. package/esm2022/lib/document/document-editor/document-editor.component.mjs +225 -0
  24. package/esm2022/lib/document/document-event-entity-type.mjs +7 -0
  25. package/esm2022/lib/document/document-event-type.mjs +7 -0
  26. package/esm2022/lib/document/document-event.mjs +2 -0
  27. package/esm2022/lib/document/document-group/document-group.component.mjs +210 -0
  28. package/esm2022/lib/document/document-part/document-part.component.mjs +19 -0
  29. package/esm2022/lib/document/document-part-editor/document-part-editor.component.mjs +296 -0
  30. package/esm2022/lib/document/document-placeholder-modal/document-placeholder-modal.component.mjs +49 -0
  31. package/esm2022/lib/document/document-section/document-section.component.mjs +226 -0
  32. package/esm2022/lib/document/document.service.mjs +325 -0
  33. package/esm2022/lib/document/group-modal/group-modal.component.mjs +46 -0
  34. package/esm2022/lib/document/part-modal/part-modal.component.mjs +48 -0
  35. package/esm2022/lib/document/portal-document-class.mjs +2 -0
  36. package/esm2022/lib/document/portal-document-group.mjs +2 -0
  37. package/esm2022/lib/document/portal-document-part.mjs +2 -0
  38. package/esm2022/lib/document/portal-document-placeholder.mjs +2 -0
  39. package/esm2022/lib/document/portal-document-section.mjs +2 -0
  40. package/esm2022/lib/document/portal-document-text.mjs +2 -0
  41. package/esm2022/lib/document/portal-document-type.mjs +2 -0
  42. package/esm2022/lib/document/portal-document.mjs +2 -0
  43. package/esm2022/lib/document/portal-email-attachment-type.mjs +2 -0
  44. package/esm2022/lib/document/portal-email-attachment.mjs +2 -0
  45. package/esm2022/lib/document/portal-email-filter.mjs +2 -0
  46. package/esm2022/lib/document/portal-email.mjs +2 -0
  47. package/esm2022/lib/document/section-modal/section-modal.component.mjs +46 -0
  48. package/esm2022/lib/dual-list-box/array.pipes.mjs +71 -0
  49. package/esm2022/lib/dual-list-box/dual-list-box.component.mjs +339 -0
  50. package/esm2022/lib/dual-list-box/items-moved-event.mjs +2 -0
  51. package/esm2022/lib/dual-list-box/list-box-item.mjs +2 -0
  52. package/esm2022/lib/ebiz-address/ebiz-address.component.mjs +62 -0
  53. package/esm2022/lib/edoc-attachment/edoc-attachment.component.mjs +216 -0
  54. package/esm2022/lib/edoc-attachment/edoc-attachment.service.mjs +38 -0
  55. package/esm2022/lib/edoc-attachment/edocument-attachment-metadata.mjs +2 -0
  56. package/esm2022/lib/edoc-attachment/edocument-attachment.mjs +2 -0
  57. package/esm2022/lib/edoc-attachment/edocument-reference.mjs +2 -0
  58. package/esm2022/lib/entity/entity.service.mjs +104 -0
  59. package/esm2022/lib/entity/organization-create-modal/organization-create-modal.component.mjs +307 -0
  60. package/esm2022/lib/entity/organization-search-input/organization-search-input.component.mjs +127 -0
  61. package/esm2022/lib/entity/organization-search-modal/organization-search-modal.component.mjs +304 -0
  62. package/esm2022/lib/entity/person-create-modal/person-create-modal.component.mjs +316 -0
  63. package/esm2022/lib/entity/person-search-input/person-search-input.component.mjs +129 -0
  64. package/esm2022/lib/entity/person-search-modal/person-search-modal.component.mjs +311 -0
  65. package/esm2022/lib/entity/place-create-modal/place-create-modal.component.mjs +14 -0
  66. package/esm2022/lib/entity/place-search-input/place-search-input.component.mjs +126 -0
  67. package/esm2022/lib/entity/place-search-modal/place-search-modal.component.mjs +216 -0
  68. package/esm2022/lib/esri-map/esri-map.component.mjs +416 -0
  69. package/esm2022/lib/file-upload/file-upload.component.mjs +148 -0
  70. package/esm2022/lib/lynx-image-upload/lynx-image-upload.component.mjs +143 -0
  71. package/esm2022/lib/lynx-image-upload/lynx.service.mjs +47 -0
  72. package/esm2022/lib/masks/oepa-create-integer-mask.mjs +39 -0
  73. package/esm2022/lib/masks/oepa-integer-mask-args.mjs +2 -0
  74. package/esm2022/lib/message/message.component.mjs +19 -0
  75. package/esm2022/lib/message/oepa-message-type.mjs +7 -0
  76. package/esm2022/lib/message/oepa-message.mjs +31 -0
  77. package/esm2022/lib/message-list/message-list.component.mjs +24 -0
  78. package/esm2022/lib/multi-file-upload/multi-file-upload.component.mjs +137 -0
  79. package/esm2022/lib/notes-modal/notes-modal.component.mjs +177 -0
  80. package/esm2022/lib/notes-modal/oepa-note-result.mjs +2 -0
  81. package/esm2022/lib/notes-modal/oepa-note.mjs +2 -0
  82. package/esm2022/lib/numeric-input/numeric-input.component.mjs +50 -0
  83. package/esm2022/lib/numeric-input.directive.mjs +76 -0
  84. package/esm2022/lib/oepa-error-message/oepa-error-message.component.mjs +39 -0
  85. package/esm2022/lib/oepa-forms.service.mjs +199 -0
  86. package/esm2022/lib/oepa-images.mjs +59 -0
  87. package/esm2022/lib/oepa-wait-message/oepa-wait-message.component.mjs +29 -0
  88. package/esm2022/lib/ohio-lat-long/ohio-lat-long.component.mjs +176 -0
  89. package/esm2022/lib/parameter/parameter.mjs +2 -0
  90. package/esm2022/lib/parameter/parameter.service.mjs +47 -0
  91. package/esm2022/lib/params-help-button/params-help-button.component.mjs +42 -0
  92. package/esm2022/lib/phone-number/phone-number.component.mjs +44 -0
  93. package/esm2022/lib/pin-modal/oepa-attestation.mjs +2 -0
  94. package/esm2022/lib/pin-modal/oepa-pin.mjs +2 -0
  95. package/esm2022/lib/pin-modal/oepa-pin.service.mjs +54 -0
  96. package/esm2022/lib/pin-modal/oepa-security-question.mjs +2 -0
  97. package/esm2022/lib/pin-modal/pin-modal.component.mjs +186 -0
  98. package/esm2022/lib/progress-indicator/progress-info.mjs +2 -0
  99. package/esm2022/lib/select-input/select-input.component.mjs +96 -0
  100. package/esm2022/lib/server-timeout-modal/server-timeout-modal.component.mjs +63 -0
  101. package/esm2022/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.mjs +54 -0
  102. package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view-parameters.mjs +2 -0
  103. package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.mjs +190 -0
  104. package/esm2022/lib/shopping-cart/shopping-cart.service.mjs +89 -0
  105. package/esm2022/lib/start-end-timepicker/start-end-timepicker.component.mjs +126 -0
  106. package/esm2022/lib/table/oepa-p-column.mjs +2 -0
  107. package/esm2022/lib/table/oepa-table-cell-classname.pipe.mjs +22 -0
  108. package/esm2022/lib/table/oepa-table-cell-click-event.mjs +2 -0
  109. package/esm2022/lib/table/oepa-table-cell-colspan.pipe.mjs +22 -0
  110. package/esm2022/lib/table/oepa-table-cell-hidden.pipe.mjs +22 -0
  111. package/esm2022/lib/table/oepa-table-cell-icon-classname.pipe.mjs +22 -0
  112. package/esm2022/lib/table/oepa-table-cell-img-src.pipe.mjs +22 -0
  113. package/esm2022/lib/table/oepa-table-cell-inner-html.pipe.mjs +22 -0
  114. package/esm2022/lib/table/oepa-table-cell-input-component.pipe.mjs +22 -0
  115. package/esm2022/lib/table/oepa-table-cell-not-selectable.pipe.mjs +22 -0
  116. package/esm2022/lib/table/oepa-table-cell-value.pipe.mjs +22 -0
  117. package/esm2022/lib/table/oepa-table-cell.mjs +2 -0
  118. package/esm2022/lib/table/oepa-table-column.mjs +2 -0
  119. package/esm2022/lib/table/oepa-table-config.mjs +2 -0
  120. package/esm2022/lib/table/oepa-table-filter.mjs +2 -0
  121. package/esm2022/lib/table/oepa-table-filtering.directive.mjs +57 -0
  122. package/esm2022/lib/table/oepa-table-header.mjs +2 -0
  123. package/esm2022/lib/table/oepa-table-page-info.mjs +2 -0
  124. package/esm2022/lib/table/oepa-table-popover.mjs +2 -0
  125. package/esm2022/lib/table/oepa-table-row.mjs +2 -0
  126. package/esm2022/lib/table/oepa-table-sort-criterion.mjs +2 -0
  127. package/esm2022/lib/table/oepa-table-sorting.directive.mjs +57 -0
  128. package/esm2022/lib/table/oepa-table.mjs +2 -0
  129. package/esm2022/lib/table/p-table/p-table.component.mjs +826 -0
  130. package/esm2022/lib/table/table-data-cell/table-data-cell-click-event.mjs +2 -0
  131. package/esm2022/lib/table/table-data-cell/table-data-cell.component.mjs +60 -0
  132. package/esm2022/lib/table/table-export.service.mjs +57 -0
  133. package/esm2022/lib/table/table-header-cell/table-header-cell.component.mjs +61 -0
  134. package/esm2022/lib/table/table.component.mjs +793 -0
  135. package/esm2022/lib/table/table.service.mjs +112 -0
  136. package/esm2022/lib/template-confirmation-modal/template-confirmation-modal.component.mjs +46 -0
  137. package/esm2022/lib/text-area-input/text-area-input.component.mjs +48 -0
  138. package/esm2022/lib/text-input/text-input.component.mjs +48 -0
  139. package/esm2022/lib/timeout-modal/timeout-modal.component.mjs +31 -0
  140. package/esm2022/lib/timepicker/timepicker.component.mjs +48 -0
  141. package/esm2022/lib/validation/form-validator.mjs +2 -0
  142. package/esm2022/lib/validation/validation.service.mjs +134 -0
  143. package/esm2022/lib/yes-no/yes-no.component.mjs +44 -0
  144. package/esm2022/lib/yes-no-boolean/yes-no.component.mjs +44 -0
  145. package/esm2022/lib/yes-no-other-input/yes-no-other-input.component.mjs +41 -0
  146. package/esm2022/lib/zip-code/zip-code.component.mjs +42 -0
  147. package/esm2022/ohioepa-oepa-ui-lib.mjs +5 -0
  148. package/esm2022/public-api.mjs +142 -0
  149. package/fesm2022/ohioepa-oepa-ui-lib.mjs +10720 -0
  150. package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -0
  151. package/index.d.ts +5 -0
  152. package/lib/account-search-input/account-search-input.component.d.ts +36 -0
  153. package/lib/account-search-modal/account-search-modal.component.d.ts +40 -0
  154. package/lib/action-btn/action-btn.component.d.ts +34 -0
  155. package/lib/action-btn/oepa-action-event.d.ts +19 -0
  156. package/lib/action-btn/oepa-action.d.ts +13 -0
  157. package/lib/action-btn-modal/action-btn-modal.component.d.ts +12 -0
  158. package/lib/address/address.component.d.ts +43 -0
  159. package/lib/address/oepa-address.service.d.ts +28 -0
  160. package/lib/address/oepa-form-address.d.ts +19 -0
  161. package/lib/blank/blank.component.d.ts +8 -0
  162. package/lib/checkbox/checkbox.component.d.ts +15 -0
  163. package/lib/checkbox-input/checkbox-input.component.d.ts +17 -0
  164. package/lib/comment-modal/comment-modal.component.d.ts +22 -0
  165. package/lib/common-forms.module.d.ts +104 -0
  166. package/lib/confirmation-modal/confirmation-modal.component.d.ts +49 -0
  167. package/lib/contact/contact.component.d.ts +33 -0
  168. package/lib/contact/oepa-form-contact.d.ts +58 -0
  169. package/lib/date-input/date-input.component.d.ts +18 -0
  170. package/lib/date-input-modal/date-input-modal.component.d.ts +25 -0
  171. package/lib/datepicker/datepicker.component.d.ts +28 -0
  172. package/lib/daterangepicker/daterangepicker.component.d.ts +22 -0
  173. package/lib/document/document-editor/document-editor.component.d.ts +34 -0
  174. package/lib/document/document-event-entity-type.d.ts +5 -0
  175. package/lib/document/document-event-type.d.ts +5 -0
  176. package/lib/document/document-event.d.ts +9 -0
  177. package/lib/document/document-group/document-group.component.d.ts +38 -0
  178. package/lib/document/document-part/document-part.component.d.ts +10 -0
  179. package/lib/document/document-part-editor/document-part-editor.component.d.ts +46 -0
  180. package/lib/document/document-placeholder-modal/document-placeholder-modal.component.d.ts +19 -0
  181. package/lib/document/document-section/document-section.component.d.ts +37 -0
  182. package/lib/document/document.service.d.ts +90 -0
  183. package/lib/document/group-modal/group-modal.component.d.ts +20 -0
  184. package/lib/document/part-modal/part-modal.component.d.ts +20 -0
  185. package/lib/document/portal-document-class.d.ts +10 -0
  186. package/lib/document/portal-document-group.d.ts +15 -0
  187. package/lib/document/portal-document-part.d.ts +22 -0
  188. package/lib/document/portal-document-placeholder.d.ts +12 -0
  189. package/lib/document/portal-document-section.d.ts +13 -0
  190. package/lib/document/portal-document-text.d.ts +7 -0
  191. package/lib/document/portal-document-type.d.ts +15 -0
  192. package/lib/document/portal-document.d.ts +27 -0
  193. package/lib/document/portal-email-attachment-type.d.ts +6 -0
  194. package/lib/document/portal-email-attachment.d.ts +12 -0
  195. package/lib/document/portal-email-filter.d.ts +12 -0
  196. package/lib/document/portal-email.d.ts +18 -0
  197. package/lib/document/section-modal/section-modal.component.d.ts +20 -0
  198. package/lib/dual-list-box/array.pipes.d.ts +36 -0
  199. package/lib/dual-list-box/dual-list-box.component.d.ts +91 -0
  200. package/lib/dual-list-box/items-moved-event.d.ts +11 -0
  201. package/lib/dual-list-box/list-box-item.d.ts +7 -0
  202. package/lib/ebiz-address/ebiz-address.component.d.ts +23 -0
  203. package/lib/edoc-attachment/edoc-attachment.component.d.ts +44 -0
  204. package/lib/edoc-attachment/edoc-attachment.service.d.ts +16 -0
  205. package/lib/edoc-attachment/edocument-attachment-metadata.d.ts +16 -0
  206. package/lib/edoc-attachment/edocument-attachment.d.ts +12 -0
  207. package/lib/edoc-attachment/edocument-reference.d.ts +5 -0
  208. package/lib/entity/entity.service.d.ts +31 -0
  209. package/lib/entity/organization-create-modal/organization-create-modal.component.d.ts +53 -0
  210. package/lib/entity/organization-search-input/organization-search-input.component.d.ts +34 -0
  211. package/lib/entity/organization-search-modal/organization-search-modal.component.d.ts +56 -0
  212. package/lib/entity/person-create-modal/person-create-modal.component.d.ts +53 -0
  213. package/lib/entity/person-search-input/person-search-input.component.d.ts +34 -0
  214. package/lib/entity/person-search-modal/person-search-modal.component.d.ts +56 -0
  215. package/lib/entity/place-create-modal/place-create-modal.component.d.ts +8 -0
  216. package/lib/entity/place-search-input/place-search-input.component.d.ts +34 -0
  217. package/lib/entity/place-search-modal/place-search-modal.component.d.ts +41 -0
  218. package/lib/esri-map/esri-map.component.d.ts +41 -0
  219. package/lib/file-upload/file-upload.component.d.ts +37 -0
  220. package/lib/lynx-image-upload/lynx-image-upload.component.d.ts +36 -0
  221. package/lib/lynx-image-upload/lynx.service.d.ts +16 -0
  222. package/lib/masks/oepa-create-integer-mask.d.ts +8 -0
  223. package/lib/masks/oepa-integer-mask-args.d.ts +5 -0
  224. package/lib/message/message.component.d.ts +10 -0
  225. package/lib/message/oepa-message-type.d.ts +5 -0
  226. package/lib/message/oepa-message.d.ts +7 -0
  227. package/lib/message-list/message-list.component.d.ts +11 -0
  228. package/lib/multi-file-upload/multi-file-upload.component.d.ts +36 -0
  229. package/lib/notes-modal/notes-modal.component.d.ts +50 -0
  230. package/lib/notes-modal/oepa-note-result.d.ts +10 -0
  231. package/lib/notes-modal/oepa-note.d.ts +13 -0
  232. package/lib/numeric-input/numeric-input.component.d.ts +20 -0
  233. package/lib/numeric-input.directive.d.ts +19 -0
  234. package/lib/oepa-error-message/oepa-error-message.component.d.ts +9 -0
  235. package/lib/oepa-forms.service.d.ts +28 -0
  236. package/lib/oepa-images.d.ts +53 -0
  237. package/lib/oepa-wait-message/oepa-wait-message.component.d.ts +9 -0
  238. package/lib/ohio-lat-long/ohio-lat-long.component.d.ts +63 -0
  239. package/lib/parameter/parameter.d.ts +7 -0
  240. package/lib/parameter/parameter.service.d.ts +18 -0
  241. package/lib/params-help-button/params-help-button.component.d.ts +15 -0
  242. package/lib/phone-number/phone-number.component.d.ts +19 -0
  243. package/lib/pin-modal/oepa-attestation.d.ts +10 -0
  244. package/lib/pin-modal/oepa-pin.d.ts +26 -0
  245. package/lib/pin-modal/oepa-pin.service.d.ts +38 -0
  246. package/lib/pin-modal/oepa-security-question.d.ts +8 -0
  247. package/lib/pin-modal/pin-modal.component.d.ts +46 -0
  248. package/lib/progress-indicator/progress-info.d.ts +4 -0
  249. package/lib/select-input/select-input.component.d.ts +27 -0
  250. package/lib/server-timeout-modal/server-timeout-modal.component.d.ts +23 -0
  251. package/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.d.ts +18 -0
  252. package/lib/shopping-cart/shopping-cart-view/shopping-cart-view-parameters.d.ts +10 -0
  253. package/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.d.ts +51 -0
  254. package/lib/shopping-cart/shopping-cart.service.d.ts +44 -0
  255. package/lib/start-end-timepicker/start-end-timepicker.component.d.ts +29 -0
  256. package/lib/table/oepa-p-column.d.ts +4 -0
  257. package/lib/table/oepa-table-cell-classname.pipe.d.ts +9 -0
  258. package/lib/table/oepa-table-cell-click-event.d.ts +15 -0
  259. package/lib/table/oepa-table-cell-colspan.pipe.d.ts +9 -0
  260. package/lib/table/oepa-table-cell-hidden.pipe.d.ts +9 -0
  261. package/lib/table/oepa-table-cell-icon-classname.pipe.d.ts +9 -0
  262. package/lib/table/oepa-table-cell-img-src.pipe.d.ts +9 -0
  263. package/lib/table/oepa-table-cell-inner-html.pipe.d.ts +9 -0
  264. package/lib/table/oepa-table-cell-input-component.pipe.d.ts +9 -0
  265. package/lib/table/oepa-table-cell-not-selectable.pipe.d.ts +9 -0
  266. package/lib/table/oepa-table-cell-value.pipe.d.ts +9 -0
  267. package/lib/table/oepa-table-cell.d.ts +66 -0
  268. package/lib/table/oepa-table-column.d.ts +71 -0
  269. package/lib/table/oepa-table-config.d.ts +72 -0
  270. package/lib/table/oepa-table-filter.d.ts +10 -0
  271. package/lib/table/oepa-table-filtering.directive.d.ts +17 -0
  272. package/lib/table/oepa-table-header.d.ts +9 -0
  273. package/lib/table/oepa-table-page-info.d.ts +22 -0
  274. package/lib/table/oepa-table-popover.d.ts +28 -0
  275. package/lib/table/oepa-table-row.d.ts +84 -0
  276. package/lib/table/oepa-table-sort-criterion.d.ts +4 -0
  277. package/lib/table/oepa-table-sorting.directive.d.ts +16 -0
  278. package/lib/table/oepa-table.d.ts +42 -0
  279. package/lib/table/p-table/p-table.component.d.ts +155 -0
  280. package/lib/table/table-data-cell/table-data-cell-click-event.d.ts +5 -0
  281. package/lib/table/table-data-cell/table-data-cell.component.d.ts +23 -0
  282. package/lib/table/table-export.service.d.ts +33 -0
  283. package/lib/table/table-header-cell/table-header-cell.component.d.ts +24 -0
  284. package/lib/table/table.component.d.ts +144 -0
  285. package/lib/table/table.service.d.ts +28 -0
  286. package/lib/template-confirmation-modal/template-confirmation-modal.component.d.ts +19 -0
  287. package/lib/text-area-input/text-area-input.component.d.ts +19 -0
  288. package/lib/text-input/text-input.component.d.ts +19 -0
  289. package/lib/timeout-modal/timeout-modal.component.d.ts +13 -0
  290. package/lib/timepicker/timepicker.component.d.ts +17 -0
  291. package/lib/validation/form-validator.d.ts +10 -0
  292. package/lib/validation/validation.service.d.ts +16 -0
  293. package/lib/yes-no/yes-no.component.d.ts +19 -0
  294. package/lib/yes-no-boolean/yes-no.component.d.ts +19 -0
  295. package/lib/yes-no-other-input/yes-no-other-input.component.d.ts +18 -0
  296. package/lib/zip-code/zip-code.component.d.ts +19 -0
  297. package/ohioepa-oepa-ui-lib-1.1.0.tgz +0 -0
  298. package/package.json +25 -0
  299. package/public-api.d.ts +138 -0
@@ -0,0 +1,137 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { ConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@ohioepa/oepa-common-lib";
5
+ import * as i2 from "ngx-bootstrap/modal";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/forms";
8
+ export class MultiFileUploadComponent {
9
+ idService;
10
+ fileUtilService;
11
+ modalService;
12
+ group;
13
+ field = '';
14
+ label = '';
15
+ errorLabel = '';
16
+ blankForm;
17
+ blankFormUrl = '';
18
+ showValidation = false;
19
+ domain = 'application';
20
+ attachments = [];
21
+ removeAllowed = true;
22
+ fileUploaded = new EventEmitter();
23
+ fileRemoved = new EventEmitter();
24
+ download = new EventEmitter();
25
+ myFileInput;
26
+ componentId = 'OepaMultiFileUploadComponent';
27
+ uploadError = '';
28
+ parserReport;
29
+ constructor(idService, fileUtilService, modalService) {
30
+ this.idService = idService;
31
+ this.fileUtilService = fileUtilService;
32
+ this.modalService = modalService;
33
+ }
34
+ ngOnInit() {
35
+ if (this.group) {
36
+ this.componentId = this.idService.getComponentId(this.group);
37
+ this.componentId += (this.componentId.length > 0 ? '_' : '') + this.field;
38
+ }
39
+ else {
40
+ console.log('OOPS No group yet');
41
+ }
42
+ }
43
+ ngOnChanges(changes) {
44
+ if (changes['attachments'] && changes['attachments'].currentValue) {
45
+ if (changes['attachments'].currentValue.length > 0) {
46
+ // console.log('file changed to: ' + changes['attachments'] .currentValue[0].userFilename);
47
+ this.group.controls[this.field].setValue(changes['attachments'].currentValue[0].userFilename);
48
+ }
49
+ else {
50
+ this.group.controls[this.field].setValue('');
51
+ // console.log('file changed and is now empty');
52
+ }
53
+ }
54
+ }
55
+ fileChange(event) {
56
+ const fileList = event.target.files;
57
+ if (fileList.length > 0) {
58
+ const file = fileList[0];
59
+ this.fileUtilService.uploadFile(file).subscribe((attachment) => {
60
+ this.fileUploaded.emit(attachment);
61
+ this.myFileInput.nativeElement.value = '';
62
+ }, err => {
63
+ this.uploadError = 'Error uploading file ' + err;
64
+ });
65
+ }
66
+ }
67
+ removeFile(attachment) {
68
+ const modal = this.modalService.show(ConfirmationModalComponent, { ignoreBackdropClick: true });
69
+ modal.content.headerText = 'Remove Attachment';
70
+ modal.content.bodyText = 'Do you want to remove the attachment: ' + attachment.userFilename + '?';
71
+ modal.content.confirmBtnLabel = 'Yes';
72
+ modal.content.cancelBtnLabel = 'No';
73
+ modal.content.confirmClicked.subscribe(() => {
74
+ this.fileRemoved.emit(attachment);
75
+ });
76
+ }
77
+ downloadFile(attachment) {
78
+ if (!attachment.systemFilename || attachment.systemFilename.length === 0) {
79
+ this.download.emit(attachment);
80
+ }
81
+ else {
82
+ this.fileUtilService.downloadAttachment(attachment).subscribe(data => {
83
+ // console.log('File download success');
84
+ const mimeType = this.fileUtilService.mimeTypeForFile(attachment.systemFilename || '');
85
+ if (mimeType) {
86
+ this.fileUtilService.downloadFile(data, mimeType);
87
+ }
88
+ else {
89
+ this.uploadError = 'Unable to download file: ' + attachment.userFilename + '. Cannot determine mime type';
90
+ }
91
+ }, err => {
92
+ this.uploadError = 'Error downloading file: ' + attachment.userFilename + '. ' + err;
93
+ });
94
+ }
95
+ }
96
+ downloadBlankForm() {
97
+ if (this.blankForm) {
98
+ this.downloadFile(this.blankForm);
99
+ }
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiFileUploadComponent, deps: [{ token: i1.OepaComponentIdService }, { token: i1.OepaFileUtilService }, { token: i2.BsModalService }], target: i0.ɵɵFactoryTarget.Component });
102
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiFileUploadComponent, selector: "oepa-multi-file-upload", inputs: { group: "group", field: "field", label: "label", errorLabel: "errorLabel", blankForm: "blankForm", blankFormUrl: "blankFormUrl", showValidation: "showValidation", domain: "domain", attachments: "attachments", removeAllowed: "removeAllowed" }, outputs: { fileUploaded: "fileUploaded", fileRemoved: "fileRemoved", download: "download" }, viewQueries: [{ propertyName: "myFileInput", first: true, predicate: ["myFileInput"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\">&nbsp;<a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\">&nbsp;<a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse&hellip; \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiFileUploadComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'oepa-multi-file-upload', template: "<form [formGroup]=\"group\">\n <div class=\"form-group\">\n <div>\n <label *ngIf=\"label\">{{label}}</label>\n <span *ngIf=\"blankFormUrl\">&nbsp;<a href=\"{{blankFormUrl}}\" target=\"_blank\">Blank Form</a></span>\n <span *ngIf=\"blankForm\">&nbsp;<a href=\"\" (click)=\"downloadBlankForm()\">Blank Form</a></span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <span class=\"input-group-btn\">\n <label class=\"btn btn-primary btn-file\">\n Browse&hellip; \n <input #myFileInput type=\"file\" style=\"display: none;\" (change)=\"fileChange($event)\" \n [id]=\"componentId+'_BrowseBtn'\" [name]=\"componentId+'_BrowseBtn'\" class=\"form-control\"\n [disabled]=\"group.controls[field].status === 'DISABLED'\">\n </label>\n </span>\n <input [ngClass]=\"{'is-invalid':showValidation && group.controls[field].status === 'INVALID'}\"\n type=\"text\" class=\"form-control\" \n [placeholder]=\"(!attachments || attachments.length === 0) ? 'No files uploaded' : (attachments.length + ' file(s) uploaded')\"\n [id]=\"componentId+'_Input'\" [name]=\"componentId+'_Input'\" readonly>\n <small class=\"invalid-feedback\" *ngIf=\"showValidation && group.controls[field].status === 'INVALID'\">{{errorLabel || label}} is required</small>\n </div>\n <!-- dummy input field for validation purposes -->\n <input type=\"text\" [hidden]=\"true\" [formControlName]=\"field\"/>\n </div>\n </div>\n <div *ngIf=\"uploadError\" class=\"alert alert-danger\" role=\"alert\">{{uploadError}}</div>\n <div *ngIf=\"parserReport\">\n <div *ngIf=\"!attachments[0] && parserReport.successful\" class=\"alert alert-info\" role=\"alert\">Spreadsheet was successfully parsed.</div>\n <div [hidden]=\"parserReport.successful\" class=\"alert alert-danger\" role=\"alert\">\n There are errors in the uploaded spreadsheet:\n <ul>\n <li *ngFor=\"let error of parserReport.errors\">{{error.message}}</li>\n </ul>\n </div>\n </div>\n </div>\n <div *ngIf=\"attachments && attachments[0]\">\n <div *ngFor=\"let attachment of attachments; let i=index;\">\n <div class=\"form-group\">\n <div class=\"input-group\">\n <a (click)=\"downloadFile(attachment)\" [id]=\"componentId+'_DownloadFileLink_'+i\" [name]=\"componentId+'_DownloadFileLink_'+i\"\n class=\"form-control\">{{attachment.userFilename}}</a>\n <span *ngIf=\"removeAllowed\" class=\"input-group-btn\">\n <button type=\"button\" class=\"btn btn-primary\" [id]=\"componentId+'_RemoveFileBtn_'+i\" [name]=\"componentId+'_RemoveFileBtn_'+i\"\n (click)=\"removeFile(attachment)\" [disabled]=\"group.controls[field].status === 'DISABLED'\">Remove Attachment</button>\n </span>\n </div>\n </div>\n </div>\n </div>\n</form>", styles: ["a:hover{cursor:pointer}a{color:#3399f3!important}\n"] }]
107
+ }], ctorParameters: () => [{ type: i1.OepaComponentIdService }, { type: i1.OepaFileUtilService }, { type: i2.BsModalService }], propDecorators: { group: [{
108
+ type: Input
109
+ }], field: [{
110
+ type: Input
111
+ }], label: [{
112
+ type: Input
113
+ }], errorLabel: [{
114
+ type: Input
115
+ }], blankForm: [{
116
+ type: Input
117
+ }], blankFormUrl: [{
118
+ type: Input
119
+ }], showValidation: [{
120
+ type: Input
121
+ }], domain: [{
122
+ type: Input
123
+ }], attachments: [{
124
+ type: Input
125
+ }], removeAllowed: [{
126
+ type: Input
127
+ }], fileUploaded: [{
128
+ type: Output
129
+ }], fileRemoved: [{
130
+ type: Output
131
+ }], download: [{
132
+ type: Output
133
+ }], myFileInput: [{
134
+ type: ViewChild,
135
+ args: ['myFileInput', { static: true }]
136
+ }] } });
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9tdWx0aS1maWxlLXVwbG9hZC9tdWx0aS1maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL211bHRpLWZpbGUtdXBsb2FkL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9DLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU9wSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7O0FBU2hHLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmY7SUFBMkM7SUFDckQ7SUF0QkQsS0FBSyxDQUFhO0lBQ2xCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixVQUFVLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLFNBQVMsQ0FBNkI7SUFDdEMsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDdkIsV0FBVyxHQUEwQixFQUFFLENBQUM7SUFDeEMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUVwQixZQUFZLEdBQWlDLElBQUksWUFBWSxFQUFFLENBQUM7SUFDaEUsV0FBVyxHQUFpQyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9ELFFBQVEsR0FBaUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUzQixXQUFXLENBQU07SUFFNUQsV0FBVyxHQUFHLDhCQUE4QixDQUFDO0lBQzdDLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsWUFBWSxDQUFvQjtJQUVoQyxZQUFvQixTQUFpQyxFQUFVLGVBQW9DLEVBQ3pGLFlBQTRCO1FBRGxCLGNBQVMsR0FBVCxTQUFTLENBQXdCO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQXFCO1FBQ3pGLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtJQUFJLENBQUM7SUFFM0MsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzVFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBRSxZQUFZLEVBQUUsQ0FBQztZQUNuRSxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBRSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwRCwyRkFBMkY7Z0JBQzNGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0MsZ0RBQWdEO1lBQ2xELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFVO1FBQzFCLE1BQU0sUUFBUSxHQUFhLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzlDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksR0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBMEIsRUFBRSxFQUFFO2dCQUM3RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM1QyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLFdBQVcsR0FBRyx1QkFBdUIsR0FBRyxHQUFHLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxVQUEwQjtRQUMxQyxNQUFNLEtBQUssR0FBZSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0UsS0FBSyxDQUFDLE9BQVEsQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUM7UUFDaEQsS0FBSyxDQUFDLE9BQVEsQ0FBQyxRQUFRLEdBQUcsd0NBQXdDLEdBQUcsVUFBVSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDbkcsS0FBSyxDQUFDLE9BQVEsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxPQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUNyQyxLQUFLLENBQUMsT0FBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFlBQVksQ0FBQyxVQUEwQjtRQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUMzRCxJQUFJLENBQUMsRUFBRTtnQkFDTCx3Q0FBd0M7Z0JBQ3hDLE1BQU0sUUFBUSxHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9GLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsR0FBRyxVQUFVLENBQUMsWUFBWSxHQUFHLDhCQUE4QixDQUFDO2dCQUM1RyxDQUFDO1lBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsMEJBQTBCLEdBQUcsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ3ZGLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7d0dBOUZVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLHNpQkNoQnJDLHU1RkFtRE87OzRGRG5DTSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0Usd0JBQXdCOzBKQUt6QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRW9DLFdBQVc7c0JBQXJELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5cbmltcG9ydCB7IE9lcGFBdHRhY2htZW50LCBPZXBhUGFyc2VyUmVwb3J0LCBPZXBhRmlsZVV0aWxTZXJ2aWNlLCBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLW1vZGFsL2NvbmZpcm1hdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1tdWx0aS1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL211bHRpLWZpbGUtdXBsb2FkLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUZpbGVVcGxvYWRDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBncm91cCE6IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZmllbGQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVycm9yTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBibGFua0Zvcm06IE9lcGFBdHRhY2htZW50IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBibGFua0Zvcm1Vcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93VmFsaWRhdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkb21haW4gPSAnYXBwbGljYXRpb24nO1xuICBASW5wdXQoKSBhdHRhY2htZW50czogQXJyYXk8T2VwYUF0dGFjaG1lbnQ+ID0gW107XG4gIEBJbnB1dCgpIHJlbW92ZUFsbG93ZWQgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBmaWxlVXBsb2FkZWQ6IEV2ZW50RW1pdHRlcjxPZXBhQXR0YWNobWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaWxlUmVtb3ZlZDogRXZlbnRFbWl0dGVyPE9lcGFBdHRhY2htZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRvd25sb2FkOiBFdmVudEVtaXR0ZXI8T2VwYUF0dGFjaG1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ215RmlsZUlucHV0JywgeyBzdGF0aWM6IHRydWV9KSBteUZpbGVJbnB1dDogYW55O1xuXG4gIGNvbXBvbmVudElkID0gJ09lcGFNdWx0aUZpbGVVcGxvYWRDb21wb25lbnQnO1xuICB1cGxvYWRFcnJvcjogc3RyaW5nID0gJyc7XG4gIHBhcnNlclJlcG9ydCE6IE9lcGFQYXJzZXJSZXBvcnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpZFNlcnZpY2U6IE9lcGFDb21wb25lbnRJZFNlcnZpY2UsIHByaXZhdGUgZmlsZVV0aWxTZXJ2aWNlOiBPZXBhRmlsZVV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgIHRoaXMuY29tcG9uZW50SWQgPSB0aGlzLmlkU2VydmljZS5nZXRDb21wb25lbnRJZCh0aGlzLmdyb3VwKTtcbiAgICAgIHRoaXMuY29tcG9uZW50SWQgKz0gKHRoaXMuY29tcG9uZW50SWQubGVuZ3RoID4gMCA/ICdfJyA6ICcnKSArIHRoaXMuZmllbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdPT1BTIE5vIGdyb3VwIHlldCcpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snYXR0YWNobWVudHMnXSAmJiBjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjaGFuZ2VzWydhdHRhY2htZW50cyddIC5jdXJyZW50VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZmlsZSBjaGFuZ2VkIHRvOiAnICsgY2hhbmdlc1snYXR0YWNobWVudHMnXSAuY3VycmVudFZhbHVlWzBdLnVzZXJGaWxlbmFtZSk7XG4gICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZF0uc2V0VmFsdWUoY2hhbmdlc1snYXR0YWNobWVudHMnXSAuY3VycmVudFZhbHVlWzBdLnVzZXJGaWxlbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGRdLnNldFZhbHVlKCcnKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZpbGUgY2hhbmdlZCBhbmQgaXMgbm93IGVtcHR5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZTogRmlsZSA9IGZpbGVMaXN0WzBdO1xuICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UudXBsb2FkRmlsZShmaWxlKS5zdWJzY3JpYmUoKGF0dGFjaG1lbnQ6IE9lcGFBdHRhY2htZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVkLmVtaXQoYXR0YWNobWVudCk7XG4gICAgICAgIHRoaXMubXlGaWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgdGhpcy51cGxvYWRFcnJvciA9ICdFcnJvciB1cGxvYWRpbmcgZmlsZSAnICsgZXJyO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbGUoYXR0YWNobWVudDogT2VwYUF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBtb2RhbDogQnNNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQsIHsgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSB9KTtcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmhlYWRlclRleHQgPSAnUmVtb3ZlIEF0dGFjaG1lbnQnO1xuICAgICg8Q29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkuYm9keVRleHQgPSAnRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBhdHRhY2htZW50OiAnICsgYXR0YWNobWVudC51c2VyRmlsZW5hbWUgKyAnPyc7XG4gICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5jb25maXJtQnRuTGFiZWwgPSAnWWVzJztcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNhbmNlbEJ0bkxhYmVsID0gJ05vJztcbiAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVSZW1vdmVkLmVtaXQoYXR0YWNobWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQ6IE9lcGFBdHRhY2htZW50KSB7XG4gICAgaWYgKCFhdHRhY2htZW50LnN5c3RlbUZpbGVuYW1lIHx8IGF0dGFjaG1lbnQuc3lzdGVtRmlsZW5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRvd25sb2FkLmVtaXQoYXR0YWNobWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkQXR0YWNobWVudChhdHRhY2htZW50KS5zdWJzY3JpYmUoXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdGaWxlIGRvd25sb2FkIHN1Y2Nlc3MnKTtcbiAgICAgICAgICBjb25zdCBtaW1lVHlwZTogc3RyaW5nID0gdGhpcy5maWxlVXRpbFNlcnZpY2UubWltZVR5cGVGb3JGaWxlKGF0dGFjaG1lbnQuc3lzdGVtRmlsZW5hbWUgfHwgJycpO1xuICAgICAgICAgIGlmIChtaW1lVHlwZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UuZG93bmxvYWRGaWxlKGRhdGEsIG1pbWVUeXBlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRFcnJvciA9ICdVbmFibGUgdG8gZG93bmxvYWQgZmlsZTogJyArIGF0dGFjaG1lbnQudXNlckZpbGVuYW1lICsgJy4gQ2Fubm90IGRldGVybWluZSBtaW1lIHR5cGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICB0aGlzLnVwbG9hZEVycm9yID0gJ0Vycm9yIGRvd25sb2FkaW5nIGZpbGU6ICcgKyBhdHRhY2htZW50LnVzZXJGaWxlbmFtZSArICcuICcgKyBlcnI7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25sb2FkQmxhbmtGb3JtKCkge1xuICAgIGlmICh0aGlzLmJsYW5rRm9ybSkge1xuICAgICAgdGhpcy5kb3dubG9hZEZpbGUodGhpcy5ibGFua0Zvcm0pO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCI+e3tsYWJlbH19PC9sYWJlbD5cbiAgICAgIDxzcGFuICpuZ0lmPVwiYmxhbmtGb3JtVXJsXCI+Jm5ic3A7PGEgaHJlZj1cInt7YmxhbmtGb3JtVXJsfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5CbGFuayBGb3JtPC9hPjwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiYmxhbmtGb3JtXCI+Jm5ic3A7PGEgaHJlZj1cIlwiIChjbGljayk9XCJkb3dubG9hZEJsYW5rRm9ybSgpXCI+QmxhbmsgRm9ybTwvYT48L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1maWxlXCI+XG4gICAgICAgICAgICBCcm93c2UmaGVsbGlwOyBcbiAgICAgICAgICAgIDxpbnB1dCAjbXlGaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudClcIiBcbiAgICAgICAgICAgICAgW2lkXT1cImNvbXBvbmVudElkKydfQnJvd3NlQnRuJ1wiIFtuYW1lXT1cImNvbXBvbmVudElkKydfQnJvd3NlQnRuJ1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwLmNvbnRyb2xzW2ZpZWxkXS5zdGF0dXMgPT09ICdESVNBQkxFRCdcIj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzpzaG93VmFsaWRhdGlvbiAmJiBncm91cC5jb250cm9sc1tmaWVsZF0uc3RhdHVzID09PSAnSU5WQUxJRCd9XCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIighYXR0YWNobWVudHMgfHwgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSA/ICdObyBmaWxlcyB1cGxvYWRlZCcgOiAoYXR0YWNobWVudHMubGVuZ3RoICsgJyBmaWxlKHMpIHVwbG9hZGVkJylcIlxuICAgICAgICAgIFtpZF09XCJjb21wb25lbnRJZCsnX0lucHV0J1wiIFtuYW1lXT1cImNvbXBvbmVudElkKydfSW5wdXQnXCIgcmVhZG9ubHk+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwic2hvd1ZhbGlkYXRpb24gJiYgZ3JvdXAuY29udHJvbHNbZmllbGRdLnN0YXR1cyA9PT0gJ0lOVkFMSUQnXCI+e3tlcnJvckxhYmVsIHx8IGxhYmVsfX0gaXMgcmVxdWlyZWQ8L3NtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGR1bW15IGlucHV0IGZpZWxkIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzIC0tPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW2hpZGRlbl09XCJ0cnVlXCIgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZFwiLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57e3VwbG9hZEVycm9yfX08L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwicGFyc2VyUmVwb3J0XCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWF0dGFjaG1lbnRzWzBdICYmIHBhcnNlclJlcG9ydC5zdWNjZXNzZnVsXCIgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCIgcm9sZT1cImFsZXJ0XCI+U3ByZWFkc2hlZXQgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuPC9kaXY+XG4gICAgICA8ZGl2IFtoaWRkZW5dPVwicGFyc2VyUmVwb3J0LnN1Y2Nlc3NmdWxcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICBUaGVyZSBhcmUgZXJyb3JzIGluIHRoZSB1cGxvYWRlZCBzcHJlYWRzaGVldDpcbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgcGFyc2VyUmVwb3J0LmVycm9yc1wiPnt7ZXJyb3IubWVzc2FnZX19PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImF0dGFjaG1lbnRzICYmIGF0dGFjaG1lbnRzWzBdXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXR0YWNobWVudCBvZiBhdHRhY2htZW50czsgbGV0IGk9aW5kZXg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGF0dGFjaG1lbnQpXCIgW2lkXT1cImNvbXBvbmVudElkKydfRG93bmxvYWRGaWxlTGlua18nK2lcIiBbbmFtZV09XCJjb21wb25lbnRJZCsnX0Rvd25sb2FkRmlsZUxpbmtfJytpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+e3thdHRhY2htZW50LnVzZXJGaWxlbmFtZX19PC9hPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwicmVtb3ZlQWxsb3dlZFwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIFtpZF09XCJjb21wb25lbnRJZCsnX1JlbW92ZUZpbGVCdG5fJytpXCIgW25hbWVdPVwiY29tcG9uZW50SWQrJ19SZW1vdmVGaWxlQnRuXycraVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWxlKGF0dGFjaG1lbnQpXCIgW2Rpc2FibGVkXT1cImdyb3VwLmNvbnRyb2xzW2ZpZWxkXS5zdGF0dXMgPT09ICdESVNBQkxFRCdcIj5SZW1vdmUgQXR0YWNobWVudDwvYnV0dG9uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+Il19
@@ -0,0 +1,177 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { ConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "ngx-bootstrap/modal";
7
+ import * as i3 from "@ohioepa/oepa-common-lib";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "../table/table.component";
10
+ export class NotesModalComponent {
11
+ fb;
12
+ bsModalRef;
13
+ modalService;
14
+ mappingService;
15
+ newNoteForm;
16
+ newNoteType;
17
+ newNoteText = '';
18
+ isCreating = false;
19
+ _defaultNoteType;
20
+ _notes = [];
21
+ loginName = '';
22
+ deleteAnyNoteAllowed = false;
23
+ deleteOwnNoteAllowed = false;
24
+ createNoteAllowed = false;
25
+ external = false;
26
+ errorMessage = '';
27
+ set notes(notes) {
28
+ this.isCreating = false;
29
+ this._notes = notes;
30
+ this.loadData(notes);
31
+ }
32
+ get notes() {
33
+ return this._notes;
34
+ }
35
+ set defaultNoteType(type) {
36
+ this._defaultNoteType = type;
37
+ this.newNoteType = type;
38
+ }
39
+ get defaultNoteType() {
40
+ return this._defaultNoteType;
41
+ }
42
+ onAddNote = new EventEmitter();
43
+ onDeleteNote = new EventEmitter();
44
+ // Table elements
45
+ data = [];
46
+ tblConfig = {};
47
+ header = {
48
+ columns: this.getColumns()
49
+ };
50
+ constructor(fb, bsModalRef, modalService, mappingService) {
51
+ this.fb = fb;
52
+ this.bsModalRef = bsModalRef;
53
+ this.modalService = modalService;
54
+ this.mappingService = mappingService;
55
+ }
56
+ ngOnInit() {
57
+ this.initializeTable();
58
+ this.createForm();
59
+ }
60
+ initializeTable() {
61
+ this.header = {
62
+ columns: this.getColumns()
63
+ };
64
+ this.loadData(this.notes);
65
+ }
66
+ getColumns() {
67
+ const columns = [
68
+ { title: 'Note', id: 'note' },
69
+ ];
70
+ if (!this.external) {
71
+ columns.push({ title: 'Type', id: 'type' });
72
+ columns.push({ title: 'Account', id: 'account' });
73
+ }
74
+ columns.push({ title: 'Date', id: 'date' });
75
+ if (this.deleteAnyNoteAllowed || this.deleteOwnNoteAllowed) {
76
+ columns.push({ title: 'Actions', id: 'actions', actionColumn: true, className: 'action-btn-col' });
77
+ }
78
+ return columns;
79
+ }
80
+ loadData(notes) {
81
+ this.data = [];
82
+ if (notes && notes.length) {
83
+ notes.forEach((note) => {
84
+ this.data.push(this.convertNoteToTableRow(note));
85
+ });
86
+ this.data = this.data.splice(0);
87
+ }
88
+ }
89
+ convertNoteToTableRow(note) {
90
+ const row = {
91
+ cells: [
92
+ { id: 'note', value: note.comment },
93
+ { id: 'type', value: note.type ? note.type.name : '' },
94
+ { id: 'account', value: note.user },
95
+ { id: 'date', value: note.noteDate ? this.mappingService.mapDateToDateTimeString(new Date(note.noteDate)) : null,
96
+ sortValue: note.noteDate }
97
+ ],
98
+ dataSource: note
99
+ };
100
+ // only display delete action if note can be deleted
101
+ if ((this.deleteAnyNoteAllowed || (this.deleteOwnNoteAllowed && this.loginName === note.user)) && note.type?.code !== 'System') {
102
+ row.actions = [
103
+ { title: 'Delete', className: 'fa fa-remove' }
104
+ ];
105
+ }
106
+ else {
107
+ row.actions = [
108
+ { title: 'NA', className: undefined }
109
+ ];
110
+ }
111
+ return row;
112
+ }
113
+ createForm() {
114
+ if (this.newNoteForm === undefined) {
115
+ this.newNoteForm = this.fb.group({
116
+ newNoteText: ['', [Validators.required]]
117
+ });
118
+ this.newNoteForm.controls['newNoteText'].valueChanges.subscribe(newNoteText => this.newNoteText = newNoteText);
119
+ }
120
+ else {
121
+ this.newNoteForm.reset();
122
+ }
123
+ }
124
+ createNote() {
125
+ this.isCreating = true;
126
+ this.errorMessage = '';
127
+ const note = {
128
+ type: this.newNoteType,
129
+ noteDate: new Date(),
130
+ comment: this.newNoteText,
131
+ user: this.loginName
132
+ };
133
+ this.onAddNote.emit(note);
134
+ }
135
+ noteActionClicked(event) {
136
+ if (event.action.title === 'Delete') {
137
+ const modal = this.modalService.show(ConfirmationModalComponent, { ignoreBackdropClick: true });
138
+ modal.content.headerText = 'Confirm delete';
139
+ modal.content.bodyText = 'Once a note is deleted it cannot be undone! Do you really want to do this?';
140
+ modal.content.confirmBtnLabel = 'Yes';
141
+ modal.content.cancelBtnLabel = 'No';
142
+ modal.content.confirmClicked.subscribe(() => {
143
+ this.onDeleteNote.emit(event.data);
144
+ });
145
+ }
146
+ }
147
+ done() {
148
+ this.bsModalRef.hide();
149
+ }
150
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalRef }, { token: i2.BsModalService }, { token: i3.OepaMappingService }], target: i0.ɵɵFactoryTarget.Component });
151
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NotesModalComponent, selector: "oepa-notes-modal", inputs: { loginName: "loginName", deleteAnyNoteAllowed: "deleteAnyNoteAllowed", deleteOwnNoteAllowed: "deleteOwnNoteAllowed", createNoteAllowed: "createNoteAllowed", external: "external", errorMessage: "errorMessage", notes: "notes", defaultNoteType: "defaultNoteType" }, outputs: { onAddNote: "onAddNote", onDeleteNote: "onDeleteNote" }, ngImport: i0, template: "<div class=\"modal-header\">\n\t<h3 class=\"modal-title\">Notes</h3>\n</div>\n\n<div class=\"modal-body\">\n\t\n <div *ngIf=\"errorMessage\">\n\t\t<div class=\"alert alert-danger\" role=\"alert\">{{ errorMessage }}</div>\n </div>\n\n <div *ngIf=\"data.length === 0\" class=\"alert alert-info text-center\"><em>There are no notes defined.</em></div>\n\n <oepa-table [config]=\"tblConfig\" [data]=\"data\" [header]=\"header\" (actionClicked)=\"noteActionClicked($event)\"></oepa-table>\n\n \t\n\t<form *ngIf=\"createNoteAllowed\" class=\"form-horizontal\">\n \n <hr>\n\t\n <div [formGroup]=\"newNoteForm\" class=\"form-group\">\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Type:</label>\n <div class=\"col-sm-10\">\n <span class=\"form-control\" id=\"NoteTypeText\">{{newNoteType.name}}</span>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Note:</label>\n <div class=\"col-sm-10\">\n <input class=\"form-control\" type=\"input\" formControlName=\"newNoteText\" id=\"NoteInput\" maxlength=\"2000\"/>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\"></label>\n <div class=\"col-sm-10\">\n <span *ngIf=\"isCreating\"><span class=\"spinner-border text-primary\" role=\"status\"></span></span>\n <button *ngIf=\"!isCreating\" class=\"btn btn-primary mr-1\" id=\"AddNoteBtn\" (click)=\"createNote()\" [disabled]=\"newNoteForm.invalid\">\n <span>Add Note</span>\n </button>\n </div>\n </div>\n\n\n </div> \n </form> <!-- form -->\n \n</div>\n\t\n<div class=\"modal-footer\">\n\t<button class=\"btn btn-primary mr-1\" id=\"DoneBtn\" (click)=\"done()\">Done</button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.TableComponent, selector: "oepa-table", inputs: ["tableId", "config", "complexHeader", "header", "customBtnLabel", "customBtnVisible", "customBtnEnabled", "data", "totalRow"], outputs: ["cellClicked", "actionClicked", "rowSelected", "customBtnClicked"] }] });
152
+ }
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotesModalComponent, decorators: [{
154
+ type: Component,
155
+ args: [{ selector: 'oepa-notes-modal', template: "<div class=\"modal-header\">\n\t<h3 class=\"modal-title\">Notes</h3>\n</div>\n\n<div class=\"modal-body\">\n\t\n <div *ngIf=\"errorMessage\">\n\t\t<div class=\"alert alert-danger\" role=\"alert\">{{ errorMessage }}</div>\n </div>\n\n <div *ngIf=\"data.length === 0\" class=\"alert alert-info text-center\"><em>There are no notes defined.</em></div>\n\n <oepa-table [config]=\"tblConfig\" [data]=\"data\" [header]=\"header\" (actionClicked)=\"noteActionClicked($event)\"></oepa-table>\n\n \t\n\t<form *ngIf=\"createNoteAllowed\" class=\"form-horizontal\">\n \n <hr>\n\t\n <div [formGroup]=\"newNoteForm\" class=\"form-group\">\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Type:</label>\n <div class=\"col-sm-10\">\n <span class=\"form-control\" id=\"NoteTypeText\">{{newNoteType.name}}</span>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\">Note:</label>\n <div class=\"col-sm-10\">\n <input class=\"form-control\" type=\"input\" formControlName=\"newNoteText\" id=\"NoteInput\" maxlength=\"2000\"/>\n </div>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-12 control-label\"></label> \n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-2 control-label\"></label>\n <div class=\"col-sm-10\">\n <span *ngIf=\"isCreating\"><span class=\"spinner-border text-primary\" role=\"status\"></span></span>\n <button *ngIf=\"!isCreating\" class=\"btn btn-primary mr-1\" id=\"AddNoteBtn\" (click)=\"createNote()\" [disabled]=\"newNoteForm.invalid\">\n <span>Add Note</span>\n </button>\n </div>\n </div>\n\n\n </div> \n </form> <!-- form -->\n \n</div>\n\t\n<div class=\"modal-footer\">\n\t<button class=\"btn btn-primary mr-1\" id=\"DoneBtn\" (click)=\"done()\">Done</button>\n</div>\n" }]
156
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalRef }, { type: i2.BsModalService }, { type: i3.OepaMappingService }], propDecorators: { loginName: [{
157
+ type: Input
158
+ }], deleteAnyNoteAllowed: [{
159
+ type: Input
160
+ }], deleteOwnNoteAllowed: [{
161
+ type: Input
162
+ }], createNoteAllowed: [{
163
+ type: Input
164
+ }], external: [{
165
+ type: Input
166
+ }], errorMessage: [{
167
+ type: Input
168
+ }], notes: [{
169
+ type: Input
170
+ }], defaultNoteType: [{
171
+ type: Input
172
+ }], onAddNote: [{
173
+ type: Output
174
+ }], onDeleteNote: [{
175
+ type: Output
176
+ }] } });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZXMtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9ub3Rlcy1tb2RhbC9ub3Rlcy1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL25vdGVzLW1vZGFsL25vdGVzLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVdwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQVNoRyxNQUFNLE9BQU8sbUJBQW1CO0lBb0RWO0lBQXdCO0lBQWdDO0lBQ3hEO0lBcERiLFdBQVcsQ0FBYTtJQUN4QixXQUFXLENBQWlCO0lBQzVCLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUVsQixnQkFBZ0IsQ0FBaUI7SUFDakMsTUFBTSxHQUFXLEVBQUUsQ0FBQztJQUVuQixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDN0IsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUduQyxJQUNXLEtBQUssQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxD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LEVBQUUsQ0FBQyxDQUFDO1lBQy9FLEtBQUssQ0FBQyxPQUFRLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDO1lBQzdDLEtBQUssQ0FBQyxPQUFRLENBQUMsUUFBUSxHQUFHLDRFQUE0RSxDQUFDO1lBQ3ZHLEtBQUssQ0FBQyxPQUFRLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUN2QyxLQUFLLENBQUMsT0FBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDckMsS0FBSyxDQUFDLE9BQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQWhLVSxtQkFBbUI7NEZBQW5CLG1CQUFtQiwyWUNyQmhDLHlqRUE4REE7OzRGRHpDYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0Usa0JBQWtCO3VLQWFuQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFJSyxLQUFLO3NCQURmLEtBQUs7Z0JBYUssZUFBZTtzQkFEekIsS0FBSztnQkFVSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuXG5pbXBvcnQgeyBPZXBhTWFwcGluZ1NlcnZpY2UsIE9FUEFSZWZlcmVuY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgT2VwYVRhYmxlUm93IH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1yb3cnO1xuaW1wb3J0IHsgT2VwYVRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1jb25maWcnO1xuaW1wb3J0IHsgT2VwYVRhYmxlSGVhZGVyIH0gZnJvbSAnLi4vdGFibGUvb2VwYS10YWJsZS1oZWFkZXInO1xuaW1wb3J0IHsgT2VwYUFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vYWN0aW9uLWJ0bi9vZXBhLWFjdGlvbi1ldmVudCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5vdGUgfSBmcm9tICcuL29lcGEtbm90ZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1ub3Rlcy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3Rlcy1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vdGVzLW1vZGFsLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb3Rlc01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIG5ld05vdGVGb3JtITogRm9ybUdyb3VwO1xuICBwdWJsaWMgbmV3Tm90ZVR5cGUhOiBPRVBBUmVmZXJlbmNlO1xuICBwdWJsaWMgbmV3Tm90ZVRleHQ6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMgaXNDcmVhdGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2RlZmF1bHROb3RlVHlwZSE6IE9FUEFSZWZlcmVuY2U7XG4gIHByaXZhdGUgX25vdGVzOiBOb3RlW10gPSBbXTtcblxuICBASW5wdXQoKSBsb2dpbk5hbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZWxldGVBbnlOb3RlQWxsb3dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWxldGVPd25Ob3RlQWxsb3dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjcmVhdGVOb3RlQWxsb3dlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBleHRlcm5hbCA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuXG4gIFxuICBASW5wdXQoKSBcbiAgcHVibGljIHNldCBub3Rlcyhub3RlczogTm90ZVtdKSB7XG4gICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fbm90ZXMgPSBub3RlcztcbiAgICB0aGlzLmxvYWREYXRhKG5vdGVzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm90ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdGVzO1xuICB9XG5cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRlZmF1bHROb3RlVHlwZSh0eXBlOiBPRVBBUmVmZXJlbmNlKSB7XG4gICAgdGhpcy5fZGVmYXVsdE5vdGVUeXBlID0gdHlwZTtcbiAgICB0aGlzLm5ld05vdGVUeXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdE5vdGVUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0Tm90ZVR5cGU7XG4gIH1cblxuICBAT3V0cHV0KCkgb25BZGROb3RlOiBFdmVudEVtaXR0ZXI8Tm90ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPE5vdGU+KCk7XG4gIEBPdXRwdXQoKSBvbkRlbGV0ZU5vdGU6IEV2ZW50RW1pdHRlcjxOb3RlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Tm90ZT4oKTtcblxuICAgIC8vIFRhYmxlIGVsZW1lbnRzXG4gICAgcHVibGljIGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcblxuICAgIHB1YmxpYyB0YmxDb25maWc6IE9lcGFUYWJsZUNvbmZpZyA9IHtcbiAgICB9O1xuICBcbiAgICBwdWJsaWMgaGVhZGVyOiBPZXBhVGFibGVIZWFkZXIgPSB7XG4gICAgICBjb2x1bW5zOiB0aGlzLmdldENvbHVtbnMoKVxuICAgIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHB1YmxpYyBic01vZGFsUmVmOiBCc01vZGFsUmVmLCBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgbWFwcGluZ1NlcnZpY2U6IE9lcGFNYXBwaW5nU2VydmljZSkgeyBcbiAgfVxuXG4gIG5nT25Jbml0KCkgeyAgICBcbiAgICB0aGlzLmluaXRpYWxpemVUYWJsZSgpO1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGUoKSB7XG4gICAgdGhpcy5oZWFkZXIgPSB7XG4gICAgICBjb2x1bW5zOiB0aGlzLmdldENvbHVtbnMoKVxuICAgIH07XG4gICAgdGhpcy5sb2FkRGF0YSh0aGlzLm5vdGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1ucygpOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBjb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW1xuICAgICAgeyB0aXRsZTogJ05vdGUnLCBpZDogJ25vdGUnIH0sXG4gICAgXTtcblxuICAgIGlmICghdGhpcy5leHRlcm5hbCkge1xuICAgICAgY29sdW1ucy5wdXNoKHsgdGl0bGU6ICdUeXBlJywgaWQ6ICd0eXBlJyB9KTtcbiAgICAgIGNvbHVtbnMucHVzaCh7IHRpdGxlOiAnQWNjb3VudCcsIGlkOiAnYWNjb3VudCcgfSk7XG4gICAgfVxuXG4gICAgY29sdW1ucy5wdXNoKHsgdGl0bGU6ICdEYXRlJywgaWQ6ICdkYXRlJyB9KTtcblxuICAgIGlmICh0aGlzLmRlbGV0ZUFueU5vdGVBbGxvd2VkIHx8IHRoaXMuZGVsZXRlT3duTm90ZUFsbG93ZWQpIHtcbiAgICAgIGNvbHVtbnMucHVzaCh7IHRpdGxlOiAnQWN0aW9ucycsIGlkOiAnYWN0aW9ucycsIGFjdGlvbkNvbHVtbjogdHJ1ZSwgY2xhc3NOYW1lOiAnYWN0aW9uLWJ0bi1jb2wnIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShub3RlczogQXJyYXk8Tm90ZT4pIHtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICBpZiAobm90ZXMgJiYgbm90ZXMubGVuZ3RoKSB7XG4gICAgICBub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKHRoaXMuY29udmVydE5vdGVUb1RhYmxlUm93KG5vdGUpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNwbGljZSgwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnROb3RlVG9UYWJsZVJvdyhub3RlOiBOb3RlKTogT2VwYVRhYmxlUm93IHtcbiAgICBjb25zdCByb3c6IE9lcGFUYWJsZVJvdyA9IHtcbiAgICAgIGNlbGxzOiBbXG4gICAgICAgIHsgaWQ6ICdub3RlJywgdmFsdWU6IG5vdGUuY29tbWVudCB9LFxuICAgICAgICB7IGlkOiAndHlwZScsIHZhbHVlOiBub3RlLnR5cGUgPyBub3RlLnR5cGUubmFtZSA6ICcnIH0sXG4gICAgICAgIHsgaWQ6ICdhY2NvdW50JywgdmFsdWU6IG5vdGUudXNlciB9LFxuICAgICAgICB7IGlkOiAnZGF0ZScsIHZhbHVlOiBub3RlLm5vdGVEYXRlID8gdGhpcy5tYXBwaW5nU2VydmljZS5tYXBEYXRlVG9EYXRlVGltZVN0cmluZyhuZXcgRGF0ZShub3RlLm5vdGVEYXRlKSk6IG51bGwsIFxuICAgICAgICAgICAgICAgIHNvcnRWYWx1ZTogbm90ZS5ub3RlRGF0ZSB9XG4gICAgICBdLFxuICAgICAgZGF0YVNvdXJjZTogbm90ZVxuICAgIH07XG4gICAgLy8gb25seSBkaXNwbGF5IGRlbGV0ZSBhY3Rpb24gaWYgbm90ZSBjYW4gYmUgZGVsZXRlZFxuICAgIGlmICgodGhpcy5kZWxldGVBbnlOb3RlQWxsb3dlZCB8fCAodGhpcy5kZWxldGVPd25Ob3RlQWxsb3dlZCAmJiB0aGlzLmxvZ2luTmFtZSA9PT0gbm90ZS51c2VyKSkgJiYgbm90ZS50eXBlPy5jb2RlICE9PSAnU3lzdGVtJykge1xuICAgICAgcm93LmFjdGlvbnMgPSBbXG4gICAgICAgIHsgdGl0bGU6ICdEZWxldGUnLCBjbGFzc05hbWU6ICdmYSBmYS1yZW1vdmUnIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvdy5hY3Rpb25zID0gW1xuICAgICAgICB7IHRpdGxlOiAnTkEnLCBjbGFzc05hbWU6IHVuZGVmaW5lZCB9XG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIGlmICh0aGlzLm5ld05vdGVGb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmV3Tm90ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmV3Tm90ZVRleHQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubmV3Tm90ZUZvcm0uY29udHJvbHNbJ25ld05vdGVUZXh0J10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShuZXdOb3RlVGV4dCA9PiB0aGlzLm5ld05vdGVUZXh0ID0gbmV3Tm90ZVRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5ld05vdGVGb3JtLnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTm90ZSgpIHtcbiAgICB0aGlzLmlzQ3JlYXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3Qgbm90ZTogTm90ZSA9IHtcbiAgICAgIHR5cGU6IHRoaXMubmV3Tm90ZVR5cGUsXG4gICAgICBub3RlRGF0ZTogbmV3IERhdGUoKSxcbiAgICAgIGNvbW1lbnQ6IHRoaXMubmV3Tm90ZVRleHQsXG4gICAgICB1c2VyOiB0aGlzLmxvZ2luTmFtZVxuICAgIH07XG4gICAgdGhpcy5vbkFkZE5vdGUuZW1pdChub3RlKTtcbiAgfVxuXG4gIG5vdGVBY3Rpb25DbGlja2VkKGV2ZW50OiBPZXBhQWN0aW9uRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYWN0aW9uLnRpdGxlID09PSAnRGVsZXRlJykge1xuICAgICAgY29uc3QgbW9kYWw6IEJzTW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50LCB7IGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUgfSk7XG4gICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmhlYWRlclRleHQgPSAnQ29uZmlybSBkZWxldGUnO1xuICAgICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5ib2R5VGV4dCA9ICdPbmNlIGEgbm90ZSBpcyBkZWxldGVkIGl0IGNhbm5vdCBiZSB1bmRvbmUhIERvIHlvdSByZWFsbHkgd2FudCB0byBkbyB0aGlzPyc7XG4gICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1CdG5MYWJlbCA9ICdZZXMnO1xuICAgICAgKDxDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudD5tb2RhbC5jb250ZW50KS5jYW5jZWxCdG5MYWJlbCA9ICdObyc7XG4gICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub25EZWxldGVOb3RlLmVtaXQoZXZlbnQuZGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkb25lKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuXHQ8aDMgY2xhc3M9XCJtb2RhbC10aXRsZVwiPk5vdGVzPC9oMz5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuXHRcbiAgPGRpdiAqbmdJZj1cImVycm9yTWVzc2FnZVwiPlxuXHRcdDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvck1lc3NhZ2UgfX08L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImRhdGEubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHRleHQtY2VudGVyXCI+PGVtPlRoZXJlIGFyZSBubyBub3RlcyBkZWZpbmVkLjwvZW0+PC9kaXY+XG5cbiAgPG9lcGEtdGFibGUgW2NvbmZpZ109XCJ0YmxDb25maWdcIiBbZGF0YV09XCJkYXRhXCIgW2hlYWRlcl09XCJoZWFkZXJcIiAoYWN0aW9uQ2xpY2tlZCk9XCJub3RlQWN0aW9uQ2xpY2tlZCgkZXZlbnQpXCI+PC9vZXBhLXRhYmxlPlxuXG4gICBcdFxuXHQ8Zm9ybSAqbmdJZj1cImNyZWF0ZU5vdGVBbGxvd2VkXCIgY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICBcbiAgICA8aHI+XG5cdFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJuZXdOb3RlRm9ybVwiIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPlR5cGU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiTm90ZVR5cGVUZXh0XCI+e3tuZXdOb3RlVHlwZS5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTEyIGNvbnRyb2wtbGFiZWxcIj48L2xhYmVsPiAgICBcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPk5vdGU6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwiaW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJuZXdOb3RlVGV4dFwiIGlkPVwiTm90ZUlucHV0XCIgbWF4bGVuZ3RoPVwiMjAwMFwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMTIgY29udHJvbC1sYWJlbFwiPjwvbGFiZWw+ICAgIFxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDcmVhdGluZ1wiPjxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNDcmVhdGluZ1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiBpZD1cIkFkZE5vdGVCdG5cIiAoY2xpY2spPVwiY3JlYXRlTm90ZSgpXCIgW2Rpc2FibGVkXT1cIm5ld05vdGVGb3JtLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5BZGQgTm90ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj4gIFxuICA8L2Zvcm0+IDwhLS0gZm9ybSAtLT5cbiAgICBcbjwvZGl2PlxuXHRcbjxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cblx0PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtci0xXCIgaWQ9XCJEb25lQnRuXCIgKGNsaWNrKT1cImRvbmUoKVwiPkRvbmU8L2J1dHRvbj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2VwYS1ub3RlLXJlc3VsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29lcGEtdWktbGliL3NyYy9saWIvbm90ZXMtbW9kYWwvb2VwYS1ub3RlLXJlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm90ZSB9IGZyb20gXCIuL29lcGEtbm90ZVwiO1xuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gdXMub2guc3RhdGUuZXBhLnBvcnRhbC5hc2Jlc3Rvcy5vcHNjZXJ0Lk5vdGVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RlUmVzdWx0IHtcbiAgICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgICBsb2c/OiBzdHJpbmdbXTtcbiAgICBub3RlPzogTm90ZTtcbiAgICBub3RlTGlzdD86IE5vdGVbXTtcbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2VwYS1ub3RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9ub3Rlcy1tb2RhbC9vZXBhLW5vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9FUEFSZWZlcmVuY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuaW1wb3J0IHsgRG9tYWluT2JqZWN0IH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1lYml6LWxpYic7XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byB1cy5vaC5zdGF0ZS5lcGEucG9ydGFsLmFzYmVzdG9zLm9wc2NlcnQuTm90ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGUgZXh0ZW5kcyBEb21haW5PYmplY3Qge1xuICAgIHRhcmdldElEPzogICAgICBzdHJpbmc7XG4gICAgdGFyZ2V0VHlwZT86ICAgIE9FUEFSZWZlcmVuY2U7XG4gICAgdHlwZT86ICAgICAgICAgIE9FUEFSZWZlcmVuY2U7XG4gICAgbm90ZURhdGU/OiAgICAgIERhdGU7XG4gICAgY29tbWVudD86ICAgICAgIHN0cmluZztcbiAgICB1c2VyPzogICAgICAgICAgc3RyaW5nO1xufSJdfQ==
@@ -0,0 +1,50 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@ohioepa/oepa-common-lib";
4
+ import * as i2 from "@angular/common";
5
+ import * as i3 from "@angular/forms";
6
+ export class NumericInputComponent {
7
+ idService;
8
+ smallService;
9
+ elRef;
10
+ componentId = 'NumericInputComponent';
11
+ group;
12
+ field = '';
13
+ tableIdx;
14
+ title = 'Input';
15
+ small = false;
16
+ onValueChange = new EventEmitter();
17
+ constructor(idService, smallService, elRef) {
18
+ this.idService = idService;
19
+ this.smallService = smallService;
20
+ this.elRef = elRef;
21
+ }
22
+ ngOnInit() {
23
+ this.small = this.smallService.isSmall(this.elRef.nativeElement);
24
+ if (this.group) {
25
+ this.componentId = this.idService.getComponentId(this.group) + (this.field || '') + (this.tableIdx || '');
26
+ this.group.get(this.field)?.valueChanges.subscribe(value => {
27
+ this.onValueChange.emit(value);
28
+ });
29
+ }
30
+ }
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputComponent, deps: [{ token: i1.OepaComponentIdService }, { token: i1.OepaSmallService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
32
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NumericInputComponent, selector: "oepa-numeric-input", inputs: { group: "group", field: "field", tableIdx: "tableIdx", title: "title", small: "small" }, outputs: { onValueChange: "onValueChange" }, ngImport: i0, template: "<div [formGroup]=\"group\">\n <input class=\"form-control\" [ngClass]=\"{'is-invalid':group.controls[field].invalid, 'form-control-sm': small}\" type=\"number\"\n [formControlName]=\"field\" [id]=\"componentId\">\n <small class=\"invalid-feedback\" *ngIf=\"group.controls[field].invalid\">{{title}} is required</small>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputComponent, decorators: [{
35
+ type: Component,
36
+ args: [{ selector: 'oepa-numeric-input', template: "<div [formGroup]=\"group\">\n <input class=\"form-control\" [ngClass]=\"{'is-invalid':group.controls[field].invalid, 'form-control-sm': small}\" type=\"number\"\n [formControlName]=\"field\" [id]=\"componentId\">\n <small class=\"invalid-feedback\" *ngIf=\"group.controls[field].invalid\">{{title}} is required</small>\n</div>" }]
37
+ }], ctorParameters: () => [{ type: i1.OepaComponentIdService }, { type: i1.OepaSmallService }, { type: i0.ElementRef }], propDecorators: { group: [{
38
+ type: Input
39
+ }], field: [{
40
+ type: Input
41
+ }], tableIdx: [{
42
+ type: Input
43
+ }], title: [{
44
+ type: Input
45
+ }], small: [{
46
+ type: Input
47
+ }], onValueChange: [{
48
+ type: Output
49
+ }] } });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL251bWVyaWMtaW5wdXQvbnVtZXJpYy1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL251bWVyaWMtaW5wdXQvbnVtZXJpYy1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDOzs7OztBQVMzRixNQUFNLE9BQU8scUJBQXFCO0lBVVo7SUFDVjtJQUNBO0lBWEgsV0FBVyxHQUFHLHVCQUF1QixDQUFDO0lBQ3BDLEtBQUssQ0FBYTtJQUNsQixLQUFLLEdBQVcsRUFBRSxDQUFDO0lBQ25CLFFBQVEsQ0FBcUI7SUFDN0IsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDO0lBRWIsYUFBYSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO0lBRTNFLFlBQW9CLFNBQWlDLEVBQzNDLFlBQThCLEVBQzlCLEtBQWlCO1FBRlAsY0FBUyxHQUFULFNBQVMsQ0FBd0I7UUFDM0MsaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQVk7SUFDM0IsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO3dHQXZCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQix5TUNUbEMscVZBSU07OzRGREtPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxvQkFBb0I7bUpBTXJCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlLCBPZXBhU21hbGxTZXJ2aWNlIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1udW1lcmljLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL251bWVyaWMtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9udW1lcmljLWlucHV0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1lcmljSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgY29tcG9uZW50SWQgPSAnTnVtZXJpY0lucHV0Q29tcG9uZW50JztcbiAgQElucHV0KCkgZ3JvdXAhOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZpZWxkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdGFibGVJZHg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdGl0bGUgPSAnSW5wdXQnO1xuICBASW5wdXQoKSBzbWFsbCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvblZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaWRTZXJ2aWNlOiBPZXBhQ29tcG9uZW50SWRTZXJ2aWNlLCBcbiAgICBwcml2YXRlIHNtYWxsU2VydmljZTogT2VwYVNtYWxsU2VydmljZSxcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7IFxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zbWFsbCA9IHRoaXMuc21hbGxTZXJ2aWNlLmlzU21hbGwodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICBpZiAodGhpcy5ncm91cCkge1xuICAgICAgdGhpcy5jb21wb25lbnRJZCA9IHRoaXMuaWRTZXJ2aWNlLmdldENvbXBvbmVudElkKHRoaXMuZ3JvdXApICsgKHRoaXMuZmllbGQgfHwgJycpICsgKHRoaXMudGFibGVJZHggfHwgJycpO1xuICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5maWVsZCk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJzpncm91cC5jb250cm9sc1tmaWVsZF0uaW52YWxpZCwgJ2Zvcm0tY29udHJvbC1zbSc6IHNtYWxsfVwiIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkXCIgW2lkXT1cImNvbXBvbmVudElkXCI+XG4gICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiZ3JvdXAuY29udHJvbHNbZmllbGRdLmludmFsaWRcIj57e3RpdGxlfX0gaXMgcmVxdWlyZWQ8L3NtYWxsPlxuPC9kaXY+Il19
@@ -0,0 +1,76 @@
1
+ import { Directive, HostListener, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ export class NumericInputDirective {
5
+ _el;
6
+ ngControl;
7
+ allowNegative = false;
8
+ digits = 6;
9
+ decimalDigits = 0;
10
+ isPercentage = false;
11
+ lastValue = '';
12
+ constructor(_el, ngControl) {
13
+ this._el = _el;
14
+ this.ngControl = ngControl;
15
+ }
16
+ ngModelChange = new EventEmitter();
17
+ ngAfterViewInit() {
18
+ this.lastValue = this._el.nativeElement.value || '';
19
+ }
20
+ onInputChange(event) {
21
+ const initalValue = this._el.nativeElement.value;
22
+ if (initalValue != "") {
23
+ const regexp = this.buildRegexp();
24
+ const match = initalValue.match(regexp);
25
+ if (match === null || (this.isPercentage && parseFloat(initalValue) > 100)) {
26
+ this._el.nativeElement.value = this.lastValue;
27
+ }
28
+ else {
29
+ this._el.nativeElement.value = match[0];
30
+ this.lastValue = this._el.nativeElement.value;
31
+ }
32
+ }
33
+ else {
34
+ this._el.nativeElement.value = "";
35
+ this.lastValue = "";
36
+ }
37
+ this.ngControl.control?.patchValue(this._el.nativeElement.value);
38
+ this.ngModelChange.emit(this._el.nativeElement.value);
39
+ }
40
+ buildRegexp() {
41
+ let pattern = "^";
42
+ if (this.allowNegative) {
43
+ pattern += "(-)?";
44
+ }
45
+ if (this.digits > 0) {
46
+ pattern += "([0-9]{0," + this.digits + "})";
47
+ }
48
+ if (this.decimalDigits > 0) {
49
+ pattern += "(\\.[0-9]{0," + this.decimalDigits + "})?";
50
+ }
51
+ pattern += "$";
52
+ return new RegExp(pattern);
53
+ }
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl }], target: i0.ɵɵFactoryTarget.Directive });
55
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NumericInputDirective, selector: "[oepaNumericInput]", inputs: { allowNegative: "allowNegative", digits: "digits", decimalDigits: "decimalDigits", isPercentage: "isPercentage" }, outputs: { ngModelChange: "ngModelChange" }, host: { listeners: { "input": "onInputChange($event)" } }, ngImport: i0 });
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumericInputDirective, decorators: [{
58
+ type: Directive,
59
+ args: [{
60
+ selector: '[oepaNumericInput]'
61
+ }]
62
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl }], propDecorators: { allowNegative: [{
63
+ type: Input
64
+ }], digits: [{
65
+ type: Input
66
+ }], decimalDigits: [{
67
+ type: Input
68
+ }], isPercentage: [{
69
+ type: Input
70
+ }], ngModelChange: [{
71
+ type: Output
72
+ }], onInputChange: [{
73
+ type: HostListener,
74
+ args: ['input', ['$event']]
75
+ }] } });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL251bWVyaWMtaW5wdXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBaUIsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTWhILE1BQU0sT0FBTyxxQkFBcUI7SUFRWjtJQUF5QjtJQU5wQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE1BQU0sR0FBVyxDQUFDLENBQUM7SUFDbkIsYUFBYSxHQUFXLENBQUMsQ0FBQztJQUMxQixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFFdkIsWUFBb0IsR0FBZSxFQUFVLFNBQW9CO1FBQTdDLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO0lBQ2pFLENBQUM7SUFFUyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUU3QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFa0MsYUFBYSxDQUFDLEtBQVU7UUFDekQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2pELElBQUksV0FBVyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxNQUFNLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLEdBQUcsQ0FBQztRQUNmLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsQ0FBQzt3R0FqRFUscUJBQXFCOzRGQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBSGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7dUdBR1UsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1JLGFBQWE7c0JBQXRCLE1BQU07Z0JBTTRCLGFBQWE7c0JBQS9DLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBBZnRlclZpZXdJbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbb2VwYU51bWVyaWNJbnB1dF0nXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNJbnB1dERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIGFsbG93TmVnYXRpdmUgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlnaXRzOiBudW1iZXIgPSA2O1xuICBASW5wdXQoKSBkZWNpbWFsRGlnaXRzOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBpc1BlcmNlbnRhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0VmFsdWUgPSAnJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBuZ0NvbnRyb2w6IE5nQ29udHJvbCkgeyBcbiAgfVxuXG4gIEBPdXRwdXQoKSBuZ01vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUgfHwgJyc7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGluaXRhbFZhbHVlID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICBpZiAoaW5pdGFsVmFsdWUgIT0gXCJcIikge1xuICAgICAgY29uc3QgcmVnZXhwID0gdGhpcy5idWlsZFJlZ2V4cCgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbml0YWxWYWx1ZS5tYXRjaChyZWdleHApO1xuICAgICAgaWYgKG1hdGNoID09PSBudWxsIHx8ICh0aGlzLmlzUGVyY2VudGFnZSAmJiBwYXJzZUZsb2F0KGluaXRhbFZhbHVlKSA+IDEwMCkpIHtcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMubGFzdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgICAgdGhpcy5sYXN0VmFsdWUgPSBcIlwiO1xuICAgIH1cbiAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlZ2V4cCgpIDogUmVnRXhwIHtcbiAgICBsZXQgcGF0dGVybiA9IFwiXlwiO1xuICAgIGlmICh0aGlzLmFsbG93TmVnYXRpdmUpIHtcbiAgICAgIHBhdHRlcm4gKz0gXCIoLSk/XCI7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpZ2l0cyA+IDApIHtcbiAgICAgIHBhdHRlcm4gKz0gXCIoWzAtOV17MCxcIiArIHRoaXMuZGlnaXRzICsgXCJ9KVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWNpbWFsRGlnaXRzID4gMCkge1xuICAgICAgcGF0dGVybiArPSBcIihcXFxcLlswLTldezAsXCIgKyB0aGlzLmRlY2ltYWxEaWdpdHMgKyBcIn0pP1wiO1xuICAgIH1cbiAgICBwYXR0ZXJuICs9IFwiJFwiO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pXG4gIH1cblxufVxuIl19
@@ -0,0 +1,39 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class OEPAErrorMessageComponent {
4
+ errorMessage;
5
+ constructor() { }
6
+ ngOnInit() {
7
+ }
8
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OEPAErrorMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: OEPAErrorMessageComponent, selector: "oepa-error-message", inputs: { errorMessage: "errorMessage" }, ngImport: i0, template: `
10
+ <div class="card error-message">
11
+ <div class="card-header">
12
+ <div><i class="fa fa-exclamation-circle "></i>&nbsp; <strong>ERROR</strong></div>
13
+ </div>
14
+ <div class="card-body">
15
+ <div class="card-text">
16
+ {{ errorMessage }}
17
+ </div>
18
+ </div>
19
+ </div>
20
+ `, isInline: true, styles: [".error-message{background-color:#f2dede;color:#a94442}.error-icon{font-size:36px}\n"] });
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OEPAErrorMessageComponent, decorators: [{
23
+ type: Component,
24
+ args: [{ selector: 'oepa-error-message', template: `
25
+ <div class="card error-message">
26
+ <div class="card-header">
27
+ <div><i class="fa fa-exclamation-circle "></i>&nbsp; <strong>ERROR</strong></div>
28
+ </div>
29
+ <div class="card-body">
30
+ <div class="card-text">
31
+ {{ errorMessage }}
32
+ </div>
33
+ </div>
34
+ </div>
35
+ `, styles: [".error-message{background-color:#f2dede;color:#a94442}.error-icon{font-size:36px}\n"] }]
36
+ }], ctorParameters: () => [], propDecorators: { errorMessage: [{
37
+ type: Input
38
+ }] } });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2VwYS1lcnJvci1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29lcGEtdWktbGliL3NyYy9saWIvb2VwYS1lcnJvci1tZXNzYWdlL29lcGEtZXJyb3ItbWVzc2FnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBa0J6RCxNQUFNLE9BQU8seUJBQXlCO0lBR3BDLFlBQVksQ0FBVTtJQUV0QixnQkFBZ0IsQ0FBQztJQUVqQixRQUFRO0lBQ1IsQ0FBQzt3R0FSVSx5QkFBeUI7NEZBQXpCLHlCQUF5QixvR0FkMUI7Ozs7Ozs7Ozs7O0tBV1A7OzRGQUdRLHlCQUF5QjtrQkFoQnJDLFNBQVM7K0JBQ0Usb0JBQW9CLFlBQ3BCOzs7Ozs7Ozs7OztLQVdQO3dEQU1ILFlBQVk7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLWVycm9yLW1lc3NhZ2UnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGVycm9yLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICA8ZGl2PjxpIGNsYXNzPVwiZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIFwiPjwvaT4mbmJzcDsgPHN0cm9uZz5FUlJPUjwvc3Ryb25nPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRleHRcIj5cbiAgICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBgLFxuICBzdHlsZVVybHM6IFsnLi9vZXBhLWVycm9yLW1lc3NhZ2UuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE9FUEFFcnJvck1lc3NhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpXG4gIGVycm9yTWVzc2FnZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICB9XG5cbn0iXX0=