@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,296 @@
1
+ import { Component, Input, EventEmitter, Output } from '@angular/core';
2
+ import { PartModalComponent } from '../part-modal/part-modal.component';
3
+ import { ConfirmationModalComponent } from '../../confirmation-modal/confirmation-modal.component';
4
+ import { DocumentPlaceholderModalComponent } from '../document-placeholder-modal/document-placeholder-modal.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "ngx-bootstrap/modal";
8
+ import * as i3 from "ngx-toastr";
9
+ import * as i4 from "../document.service";
10
+ import * as i5 from "@angular/common";
11
+ import * as i6 from "ngx-bootstrap/tooltip";
12
+ import * as i7 from "ngx-summernote";
13
+ export class DocumentPartEditorComponent {
14
+ fb;
15
+ modalService;
16
+ toastr;
17
+ documentService;
18
+ part;
19
+ editing = false;
20
+ partChange = new EventEmitter();
21
+ onMoveUp = new EventEmitter();
22
+ onInsertAbove = new EventEmitter();
23
+ onMoveDown = new EventEmitter();
24
+ onInsertBelow = new EventEmitter();
25
+ onDelete = new EventEmitter();
26
+ form;
27
+ config = {};
28
+ errorMessage = '';
29
+ busy = false;
30
+ constructor(fb, modalService, toastr, documentService) {
31
+ this.fb = fb;
32
+ this.modalService = modalService;
33
+ this.toastr = toastr;
34
+ this.documentService = documentService;
35
+ this.config = this.getConfig();
36
+ }
37
+ ngOnInit() {
38
+ this.initializePart();
39
+ this.createForm();
40
+ }
41
+ createForm() {
42
+ this.form = this.fb.group({
43
+ html: this.part.text?.text || ''
44
+ });
45
+ }
46
+ initializePart() {
47
+ if (!this.part) {
48
+ this.part = {
49
+ text: {
50
+ text: ''
51
+ }
52
+ };
53
+ }
54
+ if (!this.part.text) {
55
+ this.part.text = {
56
+ text: ''
57
+ };
58
+ }
59
+ }
60
+ savePart() {
61
+ this.busy = true;
62
+ if (this.part.text?.text) {
63
+ this.part.text.text = this.form.get('html')?.value;
64
+ }
65
+ if (this.part.documentID && this.part.id && this.part.text) {
66
+ this.documentService.updateDocumentText(this.part.documentID, this.part.id, this.part.text).subscribe({
67
+ next: () => {
68
+ this.documentService.fireDocumentPartUpdate(this.part);
69
+ this.editing = false;
70
+ this.busy = false;
71
+ }, error: err => {
72
+ this.toastr.error('Failed updating text: ' + err, 'ERROR');
73
+ this.busy = false;
74
+ }
75
+ });
76
+ }
77
+ }
78
+ editPart(part) {
79
+ const initialState = {
80
+ label: 'Edit Paragraph Attributes',
81
+ part: part
82
+ };
83
+ let modal = this.modalService.show(PartModalComponent, { initialState, ignoreBackdropClick: true });
84
+ modal.content.onPartSave.subscribe(updatedPart => {
85
+ this.busy = true;
86
+ this.documentService.updateDocumentPart(updatedPart).subscribe(() => {
87
+ this.busy = false;
88
+ }, err => {
89
+ this.toastr.error('Failed updating paragraph: ' + err, 'ERROR');
90
+ this.busy = false;
91
+ });
92
+ });
93
+ }
94
+ updateDisplay(display) {
95
+ this.part.display = display;
96
+ this.busy = true;
97
+ this.documentService.updateDocumentPart(this.part).subscribe(() => {
98
+ this.busy = false;
99
+ }, err => {
100
+ this.toastr.error('Failed updating paragraph: ' + err, 'ERROR');
101
+ this.busy = false;
102
+ });
103
+ }
104
+ moveUp() {
105
+ this.onMoveUp.emit(this.part);
106
+ }
107
+ insertAbove() {
108
+ this.onInsertAbove.emit(this.part);
109
+ }
110
+ moveDown() {
111
+ this.onMoveDown.emit(this.part);
112
+ }
113
+ insertBelow() {
114
+ this.onInsertBelow.emit(this.part);
115
+ }
116
+ delete() {
117
+ this.onDelete.emit(this.part);
118
+ }
119
+ doCustomAction() {
120
+ this.documentService.fireCustomPartAction(this.part);
121
+ }
122
+ getConfig() {
123
+ let config = {
124
+ placeholder: '',
125
+ tabsize: this.documentService.getTabSize(),
126
+ height: this.documentService.getHeight(),
127
+ toolbar: this.documentService.getToolbar(),
128
+ buttons: {
129
+ placeholder: (context) => {
130
+ let object = this;
131
+ let clickAction = this.invokePlaceHolderModal;
132
+ const ui = $.summernote.ui;
133
+ const button = ui.button({
134
+ contents: '<i class="bi bi-bookmark-fill"></i>',
135
+ tooltip: 'Replaceable text',
136
+ container: '.note-editor',
137
+ className: 'note-btn',
138
+ click: () => {
139
+ clickAction.call(object, context);
140
+ }
141
+ });
142
+ return button.render();
143
+ }
144
+ },
145
+ fontNames: this.documentService.getFontNames()
146
+ };
147
+ if (this.documentService.getMonitoringLabel() && this.documentService.getMonitoringLabel().length > 0 && !config.buttons['monitoring']) {
148
+ config.buttons['monitoring'] =
149
+ (context) => {
150
+ let object = this;
151
+ let clickAction = this.invokeMonitoringPlaceHolderModal;
152
+ const ui = $.summernote.ui;
153
+ const button = ui.button({
154
+ contents: '<i class="bi bi-speedometer2"></i>',
155
+ tooltip: this.documentService.getMonitoringLabel(),
156
+ container: '.note-editor',
157
+ className: 'note-btn',
158
+ click: () => {
159
+ clickAction.call(object, context);
160
+ }
161
+ });
162
+ return button.render();
163
+ };
164
+ if (Array.isArray(config.toolbar)) {
165
+ config.toolbar.forEach((toolbarItem) => {
166
+ if (toolbarItem[0] === 'insert') {
167
+ if (Array.isArray(toolbarItem[1])) {
168
+ let monitoringBtnEntry = toolbarItem[1].find(btnEntry => {
169
+ return btnEntry === 'monitoring';
170
+ });
171
+ if (!monitoringBtnEntry) {
172
+ toolbarItem[1].push('monitoring');
173
+ }
174
+ }
175
+ }
176
+ });
177
+ }
178
+ }
179
+ if (this.documentService.getScheduleLabel() && this.documentService.getScheduleLabel().length > 0 && !config.buttons['schedule']) {
180
+ config.buttons['schedule'] =
181
+ (context) => {
182
+ let object = this;
183
+ let clickAction = this.invokeSchedulePlaceHolderModal;
184
+ const ui = $.summernote.ui;
185
+ const button = ui.button({
186
+ contents: '<i class="bi bi-calendar3"></i>',
187
+ tooltip: this.documentService.getScheduleLabel(),
188
+ container: '.note-editor',
189
+ className: 'note-btn',
190
+ click: () => {
191
+ clickAction.call(object, context);
192
+ }
193
+ });
194
+ return button.render();
195
+ };
196
+ if (Array.isArray(config.toolbar)) {
197
+ config.toolbar.forEach((toolbarItem) => {
198
+ if (toolbarItem[0] === 'insert') {
199
+ if (Array.isArray(toolbarItem[1])) {
200
+ let scheduleBtnEntry = toolbarItem[1].find(btnEntry => {
201
+ return btnEntry === 'schedule';
202
+ });
203
+ if (!scheduleBtnEntry) {
204
+ toolbarItem[1].push('schedule');
205
+ }
206
+ }
207
+ }
208
+ });
209
+ }
210
+ }
211
+ return config;
212
+ }
213
+ invokePlaceHolderModal(context) {
214
+ const initialState = {
215
+ placeholders: this.documentService.getPlaceholders()
216
+ };
217
+ let modal = this.modalService.show(DocumentPlaceholderModalComponent, { initialState, ignoreBackdropClick: true });
218
+ modal.content.placeholderSelected.subscribe(placeholder => {
219
+ const html = '[<span class="permit-doc-placeholder" data-item-name="' + placeholder.itemName + (placeholder.format ? '" data-format="' + placeholder.format : '') + '">' + placeholder.displayName + '</span>]';
220
+ context.invoke('editor.pasteHTML', html);
221
+ modal.hide();
222
+ });
223
+ }
224
+ invokeMonitoringPlaceHolderModal(context) {
225
+ const initialState = {
226
+ placeholders: this.documentService.getMonitoringPlaceholders()
227
+ };
228
+ let modal = this.modalService.show(DocumentPlaceholderModalComponent, { initialState, ignoreBackdropClick: true });
229
+ modal.content.placeholderSelected.subscribe(placeholder => {
230
+ const html = '[<span class="permit-doc-placeholder" data-item-name="' + placeholder.itemName + '" data-item-id="' + placeholder.id + '">' + placeholder.displayName + '</span>]';
231
+ context.invoke('editor.pasteHTML', html);
232
+ modal.hide();
233
+ });
234
+ }
235
+ invokeSchedulePlaceHolderModal(context) {
236
+ const initialState = {
237
+ placeholders: this.documentService.getSchedulePlaceholders()
238
+ };
239
+ let modal = this.modalService.show(DocumentPlaceholderModalComponent, { initialState, ignoreBackdropClick: true });
240
+ modal.content.placeholderSelected.subscribe(placeholder => {
241
+ const html = '[<span class="permit-doc-placeholder" data-item-name="' + placeholder.itemName + '" data-item-id="' + placeholder.id + '">' + placeholder.displayName + '</span>]';
242
+ context.invoke('editor.pasteHTML', html);
243
+ modal.hide();
244
+ });
245
+ }
246
+ invokeErasePlaceHolder(context) {
247
+ let placeholderWasSelected = false;
248
+ const selectedHTML = context.invoke('editor.createRange').toString();
249
+ if (selectedHTML.startsWith('[') && selectedHTML.endsWith(']')) {
250
+ let stripped = selectedHTML.match(/\[([^\]]+)]/);
251
+ if (stripped.length > 1) {
252
+ placeholderWasSelected = true;
253
+ const updatedContent = stripped[1];
254
+ const initialState = {
255
+ bodyText: 'Replace variable text with the permanent value: "' + updatedContent + '"?',
256
+ confirmBtnLabel: 'Yes',
257
+ cancelBtnLabel: 'No'
258
+ };
259
+ let modal = this.modalService.show(ConfirmationModalComponent, { initialState, ignoreBackdropClick: true });
260
+ modal.content.confirmClicked.subscribe(() => {
261
+ context.invoke('editor.pasteHTML', updatedContent);
262
+ });
263
+ }
264
+ }
265
+ if (!placeholderWasSelected) {
266
+ const initialState = {
267
+ bodyText: 'The text selection was not replaceable text.',
268
+ cancelBtnLabel: undefined
269
+ };
270
+ this.modalService.show(ConfirmationModalComponent, { initialState, ignoreBackdropClick: true });
271
+ }
272
+ }
273
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentPartEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalService }, { token: i3.ToastrService }, { token: i4.DocumentService }], target: i0.ɵɵFactoryTarget.Component });
274
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DocumentPartEditorComponent, selector: "oepa-document-part-editor", inputs: { part: "part", editing: "editing" }, outputs: { partChange: "partChange", onMoveUp: "onMoveUp", onInsertAbove: "onInsertAbove", onMoveDown: "onMoveDown", onInsertBelow: "onInsertBelow", onDelete: "onDelete" }, ngImport: i0, template: "<div class=\"card\">\n <div *ngIf=\"!part.isCollapsed\" class=\"row\">\n <div class=\"col-sm-10\">\n <div *ngIf=\"form\" [formGroup]=\"form\" class=\"card\">\n <div class=\"row\">\n <div class=\"col-sm-12\">\n <div *ngIf=\"editing\" formControlName=\"html\" [ngxSummernote]=\"config\"\n [ngxSummernoteDisabled]=\"!editing\">\n </div>\n <div *ngIf=\"!editing\" [ngClass]=\"{'permit-doc-disabled' : !part.display}\"\n [innerHTML]=\"part.text?.text\">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-sm-2\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\">\n <span *ngIf=\"!editing\">\n <button [id]=\"'editPart'+part.sequence\" class=\"btn\" (click)=\"this.editing = true;\" tooltip=\"Edit Paragraph\">\n <i class=\"bi bi-pencil-square\"></i>\n </button>\n </span>\n <span *ngIf=\"editing\">\n <button [id]=\"'savePart'+part.sequence\" class=\"btn\" (click)=\"this.savePart()\" tooltip=\"Save Paragraph\">\n <i class=\"bi bi-floppy\"></i>\n </button>\n </span>\n <span *ngIf=\"editing\">\n <button [id]=\"'cancelEditPart'+part.sequence\" class=\"btn\" (click)=\"this.editing = false\" tooltip=\"Cancel Edit\">\n <i class=\"bi bi-arrow-counterclockwise\"></i>\n </button>\n </span>\n <span *ngIf=\"!part.display\">\n <button [id]=\"'displayPart'+part.sequence\" class=\"btn\" (click)=\"updateDisplay(true)\" tooltip=\"Display Text\">\n <i class=\"bi bi-app\"></i>\n </button>\n </span>\n <span *ngIf=\"part.display\">\n <button [id]=\"'hidePart'+part.sequence\" class=\"btn\" (click)=\"updateDisplay(false)\" tooltip=\"Hide Text\">\n <i class=\"bi bi-check2-square\"></i>\n </button>\n </span>\n <button [id]=\"'deletePart'+part.sequence\" class=\"btn\" (click)=\"this.delete()\" tooltip=\"Delete Paragraph\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n <div class=\"col-sm-12 text-center\">\n <button [id]=\"'insertabove'+part.sequence\" class=\"btn\" (click)=\"insertAbove()\" tooltip=\"Insert Paragraph Above\">\n <i class=\"bi bi-arrow-up-circle\"></i>\n </button>\n <button [id]=\"'insertBelowSection'+part.sequence\" class=\"btn\" (click)=\"insertBelow()\" tooltip=\"Insert Paragraph Below\">\n <i class=\"bi bi-arrow-down-circle\"></i>\n </button>\n </div>\n <div *ngIf=\"documentService.getCustomPartAction()\" class=\"col-sm-12 text-center\">\n <button [id]=\"'customAction'+part.sequence\" class=\"btn\" (click)=\"doCustomAction()\" [tooltip]=\"documentService.getCustomPartAction()?.title\">\n <i [class]=\"documentService.getCustomPartAction()?.className\"></i>\n </button>\n </div>\n <!-- <div class=\"col-sm-12 text-center\">\n <button [id]=\"'moveup'+part.sequence\" class=\"btn\" (click)=\"moveUp()\">\n <i class=\"bi bi-chevron-double-up\"></i>\n </button>\n <button [id]=\"'movedown'+part.sequence\" class=\"btn\" (click)=\"moveDown()\">\n <i class=\"bi bi-chevron-double-down\"></i>\n </button>\n </div> -->\n \n </div>\n </div>\n </div>\n</div>", styles: [".permit-doc-disabled{background-color:#e6e6e6;text-decoration:line-through!important}.permit-doc-placeholder{background-color:#ff0;font-style:italic}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i7.NgxSummernoteDirective, selector: "[ngxSummernote]", inputs: ["ngxSummernote", "summernoteModel", "ngxSummernoteDisabled"], outputs: ["summernoteModelChange", "imageUpload", "mediaDelete", "blur"] }] });
275
+ }
276
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentPartEditorComponent, decorators: [{
277
+ type: Component,
278
+ args: [{ selector: 'oepa-document-part-editor', template: "<div class=\"card\">\n <div *ngIf=\"!part.isCollapsed\" class=\"row\">\n <div class=\"col-sm-10\">\n <div *ngIf=\"form\" [formGroup]=\"form\" class=\"card\">\n <div class=\"row\">\n <div class=\"col-sm-12\">\n <div *ngIf=\"editing\" formControlName=\"html\" [ngxSummernote]=\"config\"\n [ngxSummernoteDisabled]=\"!editing\">\n </div>\n <div *ngIf=\"!editing\" [ngClass]=\"{'permit-doc-disabled' : !part.display}\"\n [innerHTML]=\"part.text?.text\">\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-sm-2\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\">\n <span *ngIf=\"!editing\">\n <button [id]=\"'editPart'+part.sequence\" class=\"btn\" (click)=\"this.editing = true;\" tooltip=\"Edit Paragraph\">\n <i class=\"bi bi-pencil-square\"></i>\n </button>\n </span>\n <span *ngIf=\"editing\">\n <button [id]=\"'savePart'+part.sequence\" class=\"btn\" (click)=\"this.savePart()\" tooltip=\"Save Paragraph\">\n <i class=\"bi bi-floppy\"></i>\n </button>\n </span>\n <span *ngIf=\"editing\">\n <button [id]=\"'cancelEditPart'+part.sequence\" class=\"btn\" (click)=\"this.editing = false\" tooltip=\"Cancel Edit\">\n <i class=\"bi bi-arrow-counterclockwise\"></i>\n </button>\n </span>\n <span *ngIf=\"!part.display\">\n <button [id]=\"'displayPart'+part.sequence\" class=\"btn\" (click)=\"updateDisplay(true)\" tooltip=\"Display Text\">\n <i class=\"bi bi-app\"></i>\n </button>\n </span>\n <span *ngIf=\"part.display\">\n <button [id]=\"'hidePart'+part.sequence\" class=\"btn\" (click)=\"updateDisplay(false)\" tooltip=\"Hide Text\">\n <i class=\"bi bi-check2-square\"></i>\n </button>\n </span>\n <button [id]=\"'deletePart'+part.sequence\" class=\"btn\" (click)=\"this.delete()\" tooltip=\"Delete Paragraph\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n <div class=\"col-sm-12 text-center\">\n <button [id]=\"'insertabove'+part.sequence\" class=\"btn\" (click)=\"insertAbove()\" tooltip=\"Insert Paragraph Above\">\n <i class=\"bi bi-arrow-up-circle\"></i>\n </button>\n <button [id]=\"'insertBelowSection'+part.sequence\" class=\"btn\" (click)=\"insertBelow()\" tooltip=\"Insert Paragraph Below\">\n <i class=\"bi bi-arrow-down-circle\"></i>\n </button>\n </div>\n <div *ngIf=\"documentService.getCustomPartAction()\" class=\"col-sm-12 text-center\">\n <button [id]=\"'customAction'+part.sequence\" class=\"btn\" (click)=\"doCustomAction()\" [tooltip]=\"documentService.getCustomPartAction()?.title\">\n <i [class]=\"documentService.getCustomPartAction()?.className\"></i>\n </button>\n </div>\n <!-- <div class=\"col-sm-12 text-center\">\n <button [id]=\"'moveup'+part.sequence\" class=\"btn\" (click)=\"moveUp()\">\n <i class=\"bi bi-chevron-double-up\"></i>\n </button>\n <button [id]=\"'movedown'+part.sequence\" class=\"btn\" (click)=\"moveDown()\">\n <i class=\"bi bi-chevron-double-down\"></i>\n </button>\n </div> -->\n \n </div>\n </div>\n </div>\n</div>", styles: [".permit-doc-disabled{background-color:#e6e6e6;text-decoration:line-through!important}.permit-doc-placeholder{background-color:#ff0;font-style:italic}\n"] }]
279
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalService }, { type: i3.ToastrService }, { type: i4.DocumentService }], propDecorators: { part: [{
280
+ type: Input
281
+ }], editing: [{
282
+ type: Input
283
+ }], partChange: [{
284
+ type: Output
285
+ }], onMoveUp: [{
286
+ type: Output
287
+ }], onInsertAbove: [{
288
+ type: Output
289
+ }], onMoveDown: [{
290
+ type: Output
291
+ }], onInsertBelow: [{
292
+ type: Output
293
+ }], onDelete: [{
294
+ type: Output
295
+ }] } });
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcGFydC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9kb2N1bWVudC9kb2N1bWVudC1wYXJ0LWVkaXRvci9kb2N1bWVudC1wYXJ0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2RvY3VtZW50L2RvY3VtZW50LXBhcnQtZWRpdG9yL2RvY3VtZW50LXBhcnQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDbkcsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sb0VBQW9FLENBQUM7Ozs7Ozs7OztBQVV2SCxNQUFNLE9BQU8sMkJBQTJCO0lBZ0JsQjtJQUNWO0lBQ0E7SUFDRDtJQWxCQSxJQUFJLENBQXNCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFFZixVQUFVLEdBQXFDLElBQUksWUFBWSxFQUFzQixDQUFDO0lBQ3RGLFFBQVEsR0FBcUMsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDcEYsYUFBYSxHQUFxQyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUN6RixVQUFVLEdBQXFDLElBQUksWUFBWSxFQUFzQixDQUFDO0lBQ3RGLGFBQWEsR0FBcUMsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDekYsUUFBUSxHQUFxQyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUV2RixJQUFJLENBQWE7SUFDakIsTUFBTSxHQUFzQixFQUFF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QUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3J0YWxEb2N1bWVudFBhcnQgfSBmcm9tICcuLi9wb3J0YWwtZG9jdW1lbnQtcGFydCc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9jdW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vZG9jdW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgUGFydE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFydC1tb2RhbC9wYXJ0LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbmZpcm1hdGlvbi1tb2RhbC9jb25maXJtYXRpb24tbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IERvY3VtZW50UGxhY2Vob2xkZXJNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50LXBsYWNlaG9sZGVyLW1vZGFsL2RvY3VtZW50LXBsYWNlaG9sZGVyLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdW1tZXJub3RlT3B0aW9ucyB9IGZyb20gJ25neC1zdW1tZXJub3RlL2xpYi9zdW1tZXJub3RlLW9wdGlvbnMnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29lcGEtZG9jdW1lbnQtcGFydC1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9jdW1lbnQtcGFydC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb2N1bWVudC1wYXJ0LWVkaXRvci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRQYXJ0RWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcGFydCE6IFBvcnRhbERvY3VtZW50UGFydDtcbiAgQElucHV0KCkgZWRpdGluZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBwYXJ0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8UG9ydGFsRG9jdW1lbnRQYXJ0PiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9ydGFsRG9jdW1lbnRQYXJ0PigpO1xuICBAT3V0cHV0KCkgb25Nb3ZlVXA6IEV2ZW50RW1pdHRlcjxQb3J0YWxEb2N1bWVudFBhcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxQb3J0YWxEb2N1bWVudFBhcnQ+KCk7XG4gIEBPdXRwdXQoKSBvbkluc2VydEFib3ZlOiBFdmVudEVtaXR0ZXI8UG9ydGFsRG9jdW1lbnRQYXJ0PiA9IG5ldyBFdmVudEVtaXR0ZXI8UG9ydGFsRG9jdW1lbnRQYXJ0PigpO1xuICBAT3V0cHV0KCkgb25Nb3ZlRG93bjogRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50UGFydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50UGFydD4oKTtcbiAgQE91dHB1dCgpIG9uSW5zZXJ0QmVsb3c6IEV2ZW50RW1pdHRlcjxQb3J0YWxEb2N1bWVudFBhcnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxQb3J0YWxEb2N1bWVudFBhcnQ+KCk7XG4gIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50UGFydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50UGFydD4oKTtcblxuICBwdWJsaWMgZm9ybSE6IEZvcm1Hcm91cDtcbiAgcHVibGljIGNvbmZpZzogU3VtbWVybm90ZU9wdGlvbnMgPSB7fTtcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBidXN5ID0gZmFsc2U7XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHB1YmxpYyBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSkge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcnQoKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGh0bWw6IHRoaXMucGFydC50ZXh0Py50ZXh0IHx8ICcnXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVQYXJ0KCkge1xuICAgIGlmICghdGhpcy5wYXJ0KSB7XG4gICAgICB0aGlzLnBhcnQgPSB7XG4gICAgICAgIHRleHQ6IHtcbiAgICAgICAgICB0ZXh0OiAnJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGFydC50ZXh0KSB7XG4gICAgICB0aGlzLnBhcnQudGV4dCA9IHtcbiAgICAgICAgdGV4dDogJydcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNhdmVQYXJ0KCkge1xuICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgaWYgKHRoaXMucGFydC50ZXh0Py50ZXh0KSB7XG4gICAgICB0aGlzLnBhcnQudGV4dC50ZXh0ID0gdGhpcy5mb3JtLmdldCgnaHRtbCcpPy52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydC5kb2N1bWVudElEICYmIHRoaXMucGFydC5pZCAmJiB0aGlzLnBhcnQudGV4dCkge1xuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UudXBkYXRlRG9jdW1lbnRUZXh0KHRoaXMucGFydC5kb2N1bWVudElELCB0aGlzLnBhcnQuaWQsIHRoaXMucGFydC50ZXh0KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmZpcmVEb2N1bWVudFBhcnRVcGRhdGUodGhpcy5wYXJ0KTtcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgICAgfSwgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdGYWlsZWQgdXBkYXRpbmcgdGV4dDogJyArIGVyciwgJ0VSUk9SJyk7XG4gICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgICAgfX0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlZGl0UGFydChwYXJ0OiBQb3J0YWxEb2N1bWVudFBhcnQpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICBsYWJlbDogJ0VkaXQgUGFyYWdyYXBoIEF0dHJpYnV0ZXMnLFxuICAgICAgcGFydDogcGFydFxuICAgIH1cbiAgICBsZXQgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KFBhcnRNb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZSwgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZX0pO1xuICAgICg8UGFydE1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLm9uUGFydFNhdmUuc3Vic2NyaWJlKHVwZGF0ZWRQYXJ0ID0+IHtcbiAgICAgIHRoaXMuYnVzeSA9IHRydWU7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS51cGRhdGVEb2N1bWVudFBhcnQodXBkYXRlZFBhcnQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ0ZhaWxlZCB1cGRhdGluZyBwYXJhZ3JhcGg6ICcgKyBlcnIsICdFUlJPUicpO1xuICAgICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZURpc3BsYXkoZGlzcGxheTogYm9vbGVhbikge1xuICAgIHRoaXMucGFydC5kaXNwbGF5ID0gZGlzcGxheTtcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xuICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLnVwZGF0ZURvY3VtZW50UGFydCh0aGlzLnBhcnQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ0ZhaWxlZCB1cGRhdGluZyBwYXJhZ3JhcGg6ICcgKyBlcnIsICdFUlJPUicpO1xuICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZVVwKCkge1xuICAgIHRoaXMub25Nb3ZlVXAuZW1pdCh0aGlzLnBhcnQpO1xuICB9XG5cbiAgcHVibGljIGluc2VydEFib3ZlKCkge1xuICAgIHRoaXMub25JbnNlcnRBYm92ZS5lbWl0KHRoaXMucGFydCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZURvd24oKSB7XG4gICAgdGhpcy5vbk1vdmVEb3duLmVtaXQodGhpcy5wYXJ0KTtcbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnRCZWxvdygpIHtcbiAgICB0aGlzLm9uSW5zZXJ0QmVsb3cuZW1pdCh0aGlzLnBhcnQpO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICB0aGlzLm9uRGVsZXRlLmVtaXQodGhpcy5wYXJ0KTtcbiAgfVxuXG4gIHB1YmxpYyBkb0N1c3RvbUFjdGlvbigpIHtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZS5maXJlQ3VzdG9tUGFydEFjdGlvbih0aGlzLnBhcnQpO1xuICB9XG5cbiAgXG4gIHB1YmxpYyBnZXRDb25maWcoKTogU3VtbWVybm90ZU9wdGlvbnMge1xuICAgIGxldCBjb25maWc6IGFueSA9ICB7XG4gICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICB0YWJzaXplOiB0aGlzLmRvY3VtZW50U2VydmljZS5nZXRUYWJTaXplKCksXG4gICAgICBoZWlnaHQ6IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldEhlaWdodCgpLFxuICAgICAgdG9vbGJhcjogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0VG9vbGJhcigpLFxuICAgICAgYnV0dG9uczoge1xuICAgICAgICBwbGFjZWhvbGRlcjpcbiAgICAgICAgICAoY29udGV4dDogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgICAgIGxldCBjbGlja0FjdGlvbiA9IHRoaXMuaW52b2tlUGxhY2VIb2xkZXJNb2RhbDtcbiAgICAgICAgICAgIGNvbnN0IHVpID0gJC5zdW1tZXJub3RlLnVpO1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gdWkuYnV0dG9uKHtcbiAgICAgICAgICAgICAgY29udGVudHM6ICc8aSBjbGFzcz1cImJpIGJpLWJvb2ttYXJrLWZpbGxcIj48L2k+JyxcbiAgICAgICAgICAgICAgdG9vbHRpcDogJ1JlcGxhY2VhYmxlIHRleHQnLFxuICAgICAgICAgICAgICBjb250YWluZXI6ICcubm90ZS1lZGl0b3InLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICdub3RlLWJ0bicsXG4gICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpY2tBY3Rpb24uY2FsbChvYmplY3QsIGNvbnRleHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBidXR0b24ucmVuZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZvbnROYW1lczogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0Rm9udE5hbWVzKClcbiAgICB9XG4gICAgaWYgKHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldE1vbml0b3JpbmdMYWJlbCgpICYmIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldE1vbml0b3JpbmdMYWJlbCgpLmxlbmd0aCA+IDAgJiYgIWNvbmZpZy5idXR0b25zWydtb25pdG9yaW5nJ10pIHtcbiAgICAgIGNvbmZpZy5idXR0b25zWydtb25pdG9yaW5nJ10gPSBcbiAgICAgICAgKGNvbnRleHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGxldCBvYmplY3QgPSB0aGlzO1xuICAgICAgICAgIGxldCBjbGlja0FjdGlvbiA9IHRoaXMuaW52b2tlTW9uaXRvcmluZ1BsYWNlSG9sZGVyTW9kYWw7XG4gICAgICAgICAgY29uc3QgdWkgPSAkLnN1bW1lcm5vdGUudWk7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gdWkuYnV0dG9uKHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiAnPGkgY2xhc3M9XCJiaSBiaS1zcGVlZG9tZXRlcjJcIj48L2k+JyxcbiAgICAgICAgICAgIHRvb2x0aXA6IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldE1vbml0b3JpbmdMYWJlbCgpLFxuICAgICAgICAgICAgY29udGFpbmVyOiAnLm5vdGUtZWRpdG9yJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ25vdGUtYnRuJyxcbiAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNsaWNrQWN0aW9uLmNhbGwob2JqZWN0LCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gYnV0dG9uLnJlbmRlcigpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcudG9vbGJhcikpIHtcbiAgICAgICAgICBjb25maWcudG9vbGJhci5mb3JFYWNoKCh0b29sYmFySXRlbTogYW55W10pID0+IHtcbiAgICAgICAgICAgIGlmICh0b29sYmFySXRlbVswXSA9PT0gJ2luc2VydCcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9vbGJhckl0ZW1bMV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vbml0b3JpbmdCdG5FbnRyeSA9IHRvb2xiYXJJdGVtWzFdLmZpbmQoYnRuRW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ0bkVudHJ5ID09PSAnbW9uaXRvcmluZyc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtb25pdG9yaW5nQnRuRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xiYXJJdGVtWzFdLnB1c2goJ21vbml0b3JpbmcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmRvY3VtZW50U2VydmljZS5nZXRTY2hlZHVsZUxhYmVsKCkgJiYgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0U2NoZWR1bGVMYWJlbCgpLmxlbmd0aCA+IDAgJiYgIWNvbmZpZy5idXR0b25zWydzY2hlZHVsZSddKSB7XG4gICAgICBjb25maWcuYnV0dG9uc1snc2NoZWR1bGUnXSA9IFxuICAgICAgICAoY29udGV4dDogYW55KSA9PiB7XG4gICAgICAgICAgbGV0IG9iamVjdCA9IHRoaXM7XG4gICAgICAgICAgbGV0IGNsaWNrQWN0aW9uID0gdGhpcy5pbnZva2VTY2hlZHVsZVBsYWNlSG9sZGVyTW9kYWw7XG4gICAgICAgICAgY29uc3QgdWkgPSAkLnN1bW1lcm5vdGUudWk7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gdWkuYnV0dG9uKHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiAnPGkgY2xhc3M9XCJiaSBiaS1jYWxlbmRhcjNcIj48L2k+JyxcbiAgICAgICAgICAgIHRvb2x0aXA6IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldFNjaGVkdWxlTGFiZWwoKSxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogJy5ub3RlLWVkaXRvcicsXG4gICAgICAgICAgICBjbGFzc05hbWU6ICdub3RlLWJ0bicsXG4gICAgICAgICAgICBjbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICBjbGlja0FjdGlvbi5jYWxsKG9iamVjdCwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGJ1dHRvbi5yZW5kZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnRvb2xiYXIpKSB7XG4gICAgICAgICAgY29uZmlnLnRvb2xiYXIuZm9yRWFjaCgodG9vbGJhckl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRvb2xiYXJJdGVtWzBdID09PSAnaW5zZXJ0Jykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b29sYmFySXRlbVsxXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NoZWR1bGVCdG5FbnRyeSA9IHRvb2xiYXJJdGVtWzFdLmZpbmQoYnRuRW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ0bkVudHJ5ID09PSAnc2NoZWR1bGUnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghc2NoZWR1bGVCdG5FbnRyeSkge1xuICAgICAgICAgICAgICAgICAgdG9vbGJhckl0ZW1bMV0ucHVzaCgnc2NoZWR1bGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGludm9rZVBsYWNlSG9sZGVyTW9kYWwoY29udGV4dDogYW55KSB7XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgcGxhY2Vob2xkZXJzOiB0aGlzLmRvY3VtZW50U2VydmljZS5nZXRQbGFjZWhvbGRlcnMoKVxuICAgIH1cbiAgICBsZXQgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KERvY3VtZW50UGxhY2Vob2xkZXJNb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZSwgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZX0pO1xuICAgICg8RG9jdW1lbnRQbGFjZWhvbGRlck1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLnBsYWNlaG9sZGVyU2VsZWN0ZWQuc3Vic2NyaWJlKHBsYWNlaG9sZGVyID0+IHtcbiAgICAgIGNvbnN0IGh0bWwgPSAnWzxzcGFuIGNsYXNzPVwicGVybWl0LWRvYy1wbGFjZWhvbGRlclwiIGRhdGEtaXRlbS1uYW1lPVwiJyArIHBsYWNlaG9sZGVyLml0ZW1OYW1lICsgKHBsYWNlaG9sZGVyLmZvcm1hdCA/ICdcIiBkYXRhLWZvcm1hdD1cIicgKyBwbGFjZWhvbGRlci5mb3JtYXQgOiAnJykgKyAnXCI+JyArIHBsYWNlaG9sZGVyLmRpc3BsYXlOYW1lICsgJzwvc3Bhbj5dJztcbiAgICAgIGNvbnRleHQuaW52b2tlKCdlZGl0b3IucGFzdGVIVE1MJywgaHRtbCk7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludm9rZU1vbml0b3JpbmdQbGFjZUhvbGRlck1vZGFsKGNvbnRleHQ6IGFueSkge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIHBsYWNlaG9sZGVyczogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0TW9uaXRvcmluZ1BsYWNlaG9sZGVycygpXG4gICAgfVxuICAgIGxldCBtb2RhbCA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coRG9jdW1lbnRQbGFjZWhvbGRlck1vZGFsQ29tcG9uZW50LCB7aW5pdGlhbFN0YXRlLCBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlfSk7XG4gICAgKDxEb2N1bWVudFBsYWNlaG9sZGVyTW9kYWxDb21wb25lbnQ+bW9kYWwuY29udGVudCkucGxhY2Vob2xkZXJTZWxlY3RlZC5zdWJzY3JpYmUocGxhY2Vob2xkZXIgPT4ge1xuICAgICAgY29uc3QgaHRtbCA9ICdbPHNwYW4gY2xhc3M9XCJwZXJtaXQtZG9jLXBsYWNlaG9sZGVyXCIgZGF0YS1pdGVtLW5hbWU9XCInICsgcGxhY2Vob2xkZXIuaXRlbU5hbWUgKyAnXCIgZGF0YS1pdGVtLWlkPVwiJyArIHBsYWNlaG9sZGVyLmlkICArICdcIj4nICsgcGxhY2Vob2xkZXIuZGlzcGxheU5hbWUgKyAnPC9zcGFuPl0nO1xuICAgICAgY29udGV4dC5pbnZva2UoJ2VkaXRvci5wYXN0ZUhUTUwnLCBodG1sKTtcbiAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52b2tlU2NoZWR1bGVQbGFjZUhvbGRlck1vZGFsKGNvbnRleHQ6IGFueSkge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIHBsYWNlaG9sZGVyczogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0U2NoZWR1bGVQbGFjZWhvbGRlcnMoKVxuICAgIH1cbiAgICBsZXQgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KERvY3VtZW50UGxhY2Vob2xkZXJNb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZSwgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZX0pO1xuICAgICg8RG9jdW1lbnRQbGFjZWhvbGRlck1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLnBsYWNlaG9sZGVyU2VsZWN0ZWQuc3Vic2NyaWJlKHBsYWNlaG9sZGVyID0+IHtcbiAgICAgIGNvbnN0IGh0bWwgPSAnWzxzcGFuIGNsYXNzPVwicGVybWl0LWRvYy1wbGFjZWhvbGRlclwiIGRhdGEtaXRlbS1uYW1lPVwiJyArIHBsYWNlaG9sZGVyLml0ZW1OYW1lICsgJ1wiIGRhdGEtaXRlbS1pZD1cIicgKyBwbGFjZWhvbGRlci5pZCAgKyAnXCI+JyArIHBsYWNlaG9sZGVyLmRpc3BsYXlOYW1lICsgJzwvc3Bhbj5dJztcbiAgICAgIGNvbnRleHQuaW52b2tlKCdlZGl0b3IucGFzdGVIVE1MJywgaHRtbCk7XG4gICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludm9rZUVyYXNlUGxhY2VIb2xkZXIoY29udGV4dDogYW55KSB7XG4gICAgbGV0IHBsYWNlaG9sZGVyV2FzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzZWxlY3RlZEhUTUwgPSBjb250ZXh0Lmludm9rZSgnZWRpdG9yLmNyZWF0ZVJhbmdlJykudG9TdHJpbmcoKTtcbiAgICBcbiAgICBpZiAoc2VsZWN0ZWRIVE1MLnN0YXJ0c1dpdGgoJ1snKSAmJiBzZWxlY3RlZEhUTUwuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgbGV0IHN0cmlwcGVkID0gc2VsZWN0ZWRIVE1MLm1hdGNoKC9cXFsoW15cXF1dKyldLyk7XG4gICAgICBpZiAoc3RyaXBwZWQubGVuZ3RoID4gMSkge1xuICAgICAgICBwbGFjZWhvbGRlcldhc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBzdHJpcHBlZFsxXTtcbiAgICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgICAgIGJvZHlUZXh0OiAnUmVwbGFjZSB2YXJpYWJsZSB0ZXh0IHdpdGggdGhlIHBlcm1hbmVudCB2YWx1ZTogXCInICsgdXBkYXRlZENvbnRlbnQgKyAnXCI/JyxcbiAgICAgICAgICBjb25maXJtQnRuTGFiZWw6ICdZZXMnLFxuICAgICAgICAgIGNhbmNlbEJ0bkxhYmVsOiAnTm8nXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1vZGFsID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZSwgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZX0pO1xuICAgICAgICAoPENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50Pm1vZGFsLmNvbnRlbnQpLmNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgoKT0+IHtcbiAgICAgICAgICBjb250ZXh0Lmludm9rZSgnZWRpdG9yLnBhc3RlSFRNTCcsIHVwZGF0ZWRDb250ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgICAgaWYgKCFwbGFjZWhvbGRlcldhc1NlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgICAgICBib2R5VGV4dDogJ1RoZSB0ZXh0IHNlbGVjdGlvbiB3YXMgbm90IHJlcGxhY2VhYmxlIHRleHQuJyxcbiAgICAgICAgICBjYW5jZWxCdG5MYWJlbDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZSwgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZX0pO1xuICAgICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXBhcnQuaXNDb2xsYXBzZWRcIiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1wiIGZvcm1Db250cm9sTmFtZT1cImh0bWxcIiBbbmd4U3VtbWVybm90ZV09XCJjb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmd4U3VtbWVybm90ZURpc2FibGVkXT1cIiFlZGl0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFlZGl0aW5nXCIgW25nQ2xhc3NdPVwieydwZXJtaXQtZG9jLWRpc2FibGVkJyA6ICFwYXJ0LmRpc3BsYXl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJwYXJ0LnRleHQ/LnRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFlZGl0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ2VkaXRQYXJ0JytwYXJ0LnNlcXVlbmNlXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwidGhpcy5lZGl0aW5nID0gdHJ1ZTtcIiB0b29sdGlwPVwiRWRpdCBQYXJhZ3JhcGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWwtc3F1YXJlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ3NhdmVQYXJ0JytwYXJ0LnNlcXVlbmNlXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwidGhpcy5zYXZlUGFydCgpXCIgdG9vbHRpcD1cIlNhdmUgUGFyYWdyYXBoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZmxvcHB5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ2NhbmNlbEVkaXRQYXJ0JytwYXJ0LnNlcXVlbmNlXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwidGhpcy5lZGl0aW5nID0gZmFsc2VcIiB0b29sdGlwPVwiQ2FuY2VsIEVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1hcnJvdy1jb3VudGVyY2xvY2t3aXNlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcGFydC5kaXNwbGF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ2Rpc3BsYXlQYXJ0JytwYXJ0LnNlcXVlbmNlXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwidXBkYXRlRGlzcGxheSh0cnVlKVwiIHRvb2x0aXA9XCJEaXNwbGF5IFRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1hcHBcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBhcnQuZGlzcGxheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2lkXT1cIidoaWRlUGFydCcrcGFydC5zZXF1ZW5jZVwiIGNsYXNzPVwiYnRuXCIgKGNsaWNrKT1cInVwZGF0ZURpc3BsYXkoZmFsc2UpXCIgdG9vbHRpcD1cIkhpZGUgVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWNoZWNrMi1zcXVhcmVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtpZF09XCInZGVsZXRlUGFydCcrcGFydC5zZXF1ZW5jZVwiIGNsYXNzPVwiYnRuXCIgKGNsaWNrKT1cInRoaXMuZGVsZXRlKClcIiB0b29sdGlwPVwiRGVsZXRlIFBhcmFncmFwaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdHJhc2hcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2lkXT1cIidpbnNlcnRhYm92ZScrcGFydC5zZXF1ZW5jZVwiIGNsYXNzPVwiYnRuXCIgKGNsaWNrKT1cImluc2VydEFib3ZlKClcIiB0b29sdGlwPVwiSW5zZXJ0IFBhcmFncmFwaCBBYm92ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYXJyb3ctdXAtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtpZF09XCInaW5zZXJ0QmVsb3dTZWN0aW9uJytwYXJ0LnNlcXVlbmNlXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwiaW5zZXJ0QmVsb3coKVwiIHRvb2x0aXA9XCJJbnNlcnQgUGFyYWdyYXBoIEJlbG93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1hcnJvdy1kb3duLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRvY3VtZW50U2VydmljZS5nZXRDdXN0b21QYXJ0QWN0aW9uKClcIiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ2N1c3RvbUFjdGlvbicrcGFydC5zZXF1ZW5jZVwiIGNsYXNzPVwiYnRuXCIgKGNsaWNrKT1cImRvQ3VzdG9tQWN0aW9uKClcIiBbdG9vbHRpcF09XCJkb2N1bWVudFNlcnZpY2UuZ2V0Q3VzdG9tUGFydEFjdGlvbigpPy50aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJkb2N1bWVudFNlcnZpY2UuZ2V0Q3VzdG9tUGFydEFjdGlvbigpPy5jbGFzc05hbWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ21vdmV1cCcrcGFydC5zZXF1ZW5jZVwiIGNsYXNzPVwiYnRuXCIgKGNsaWNrKT1cIm1vdmVVcCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLWRvdWJsZS11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwiJ21vdmVkb3duJytwYXJ0LnNlcXVlbmNlXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwibW92ZURvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktY2hldnJvbi1kb3VibGUtZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,49 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ import * as i2 from "ngx-bootstrap/modal";
6
+ import * as i3 from "@angular/common";
7
+ export class DocumentPlaceholderModalComponent {
8
+ fb;
9
+ bsModalRef;
10
+ placeholders = [];
11
+ placeholderSelected = new EventEmitter();
12
+ modalForm;
13
+ hasPlaceholderChildren = false;
14
+ constructor(fb, bsModalRef) {
15
+ this.fb = fb;
16
+ this.bsModalRef = bsModalRef;
17
+ }
18
+ ngOnInit() {
19
+ if (this.placeholders) {
20
+ this.hasPlaceholderChildren = false;
21
+ this.placeholders.forEach(placeholder => {
22
+ if (placeholder.children) {
23
+ this.hasPlaceholderChildren = true;
24
+ }
25
+ });
26
+ }
27
+ this.modalForm = this.fb.group({
28
+ placeholder: [null, [Validators.required]]
29
+ });
30
+ }
31
+ submit() {
32
+ let placeHolder = this.modalForm.get('placeholder')?.value;
33
+ this.placeholderSelected.emit(placeHolder);
34
+ }
35
+ cancel() {
36
+ this.bsModalRef.hide();
37
+ }
38
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentPlaceholderModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalRef }], target: i0.ɵɵFactoryTarget.Component });
39
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DocumentPlaceholderModalComponent, selector: "oepa-document-placeholder-modal", inputs: { placeholders: "placeholders" }, outputs: { placeholderSelected: "placeholderSelected" }, ngImport: i0, template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">Placeholders</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\" [formGroup]=\"modalForm\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"form-group\">\n <label>Placeholders</label> \n <select formControlName=\"placeholder\" class=\"form-select\">\n <ng-template ngFor let-item [ngForOf]=\"placeholders\">\n <optgroup *ngIf=\"item.children\" label=\"{{item.info}}\">\n <option *ngFor=\"let child of item.children\" [ngValue]=\"child\">\n {{child.info}}\n </option>\n </optgroup>\n <option *ngIf=\"!item.children\" [ngValue]=\"item\">{{item.info}}</option>\n </ng-template>\n <!-- <option *ngFor=\"let p of placeholders\" [ngValue]=\"p\">{{p.info}}</option> -->\n </select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"submit\" class=\"btn btn-primary mr-1\" (click)=\"submit()\">Insert Placeholder</button>\n <button type=\"button\" class=\"btn btn-primary mr-1\" (click)=\"cancel()\">Cancel</button>\n </div>\n", styles: [""], dependencies: [{ 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: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DocumentPlaceholderModalComponent, decorators: [{
42
+ type: Component,
43
+ args: [{ selector: 'oepa-document-placeholder-modal', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">Placeholders</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\" [formGroup]=\"modalForm\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"form-group\">\n <label>Placeholders</label> \n <select formControlName=\"placeholder\" class=\"form-select\">\n <ng-template ngFor let-item [ngForOf]=\"placeholders\">\n <optgroup *ngIf=\"item.children\" label=\"{{item.info}}\">\n <option *ngFor=\"let child of item.children\" [ngValue]=\"child\">\n {{child.info}}\n </option>\n </optgroup>\n <option *ngIf=\"!item.children\" [ngValue]=\"item\">{{item.info}}</option>\n </ng-template>\n <!-- <option *ngFor=\"let p of placeholders\" [ngValue]=\"p\">{{p.info}}</option> -->\n </select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"submit\" class=\"btn btn-primary mr-1\" (click)=\"submit()\">Insert Placeholder</button>\n <button type=\"button\" class=\"btn btn-primary mr-1\" (click)=\"cancel()\">Cancel</button>\n </div>\n" }]
44
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalRef }], propDecorators: { placeholders: [{
45
+ type: Input
46
+ }], placeholderSelected: [{
47
+ type: Output
48
+ }] } });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcGxhY2Vob2xkZXItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9kb2N1bWVudC9kb2N1bWVudC1wbGFjZWhvbGRlci1tb2RhbC9kb2N1bWVudC1wbGFjZWhvbGRlci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2RvY3VtZW50L2RvY3VtZW50LXBsYWNlaG9sZGVyLW1vZGFsL2RvY3VtZW50LXBsYWNlaG9sZGVyLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0UsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFPcEUsTUFBTSxPQUFPLGlDQUFpQztJQVF4QjtJQUF5QjtJQVBwQyxZQUFZLEdBQWdDLEVBQUUsQ0FBQztJQUU5QyxtQkFBbUIsR0FBNEMsSUFBSSxZQUFZLEVBQTZCLENBQUM7SUFFaEgsU0FBUyxDQUFhO0lBQ3RCLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUV0QyxZQUFvQixFQUFlLEVBQVUsVUFBc0I7UUFBL0MsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7SUFFbkUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztnQkFDckMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDN0IsV0FBVyxFQUFFLENBQUUsSUFBSSxFQUFFLENBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBRSxDQUFDO1NBQzlDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBakNVLGlDQUFpQzs0RkFBakMsaUNBQWlDLDBLQ1Y5Qyx1OUNBOEJBOzs0RkRwQmEsaUNBQWlDO2tCQUw3QyxTQUFTOytCQUNFLGlDQUFpQzt5R0FLbEMsWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBQb3J0YWxEb2N1bWVudFBsYWNlaG9sZGVyIH0gZnJvbSAnLi4vcG9ydGFsLWRvY3VtZW50LXBsYWNlaG9sZGVyJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29lcGEtZG9jdW1lbnQtcGxhY2Vob2xkZXItbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9jdW1lbnQtcGxhY2Vob2xkZXItbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb2N1bWVudC1wbGFjZWhvbGRlci1tb2RhbC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRQbGFjZWhvbGRlck1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXJzOiBQb3J0YWxEb2N1bWVudFBsYWNlaG9sZGVyW10gPSBbXTtcblxuICBAT3V0cHV0KCkgcGxhY2Vob2xkZXJTZWxlY3RlZDogRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50UGxhY2Vob2xkZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxQb3J0YWxEb2N1bWVudFBsYWNlaG9sZGVyPigpO1xuICBcbiAgcHVibGljIG1vZGFsRm9ybSE6IEZvcm1Hcm91cDtcbiAgcHVibGljIGhhc1BsYWNlaG9sZGVyQ2hpbGRyZW4gPSBmYWxzZTtcbiAgXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYpIHsgXG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVycykge1xuICAgICAgdGhpcy5oYXNQbGFjZWhvbGRlckNoaWxkcmVuID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVycy5mb3JFYWNoKHBsYWNlaG9sZGVyID0+IHtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5oYXNQbGFjZWhvbGRlckNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubW9kYWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBwbGFjZWhvbGRlcjogWyBudWxsLCBbIFZhbGlkYXRvcnMucmVxdWlyZWQgXV1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXQoKSB7XG4gICAgbGV0IHBsYWNlSG9sZGVyID0gdGhpcy5tb2RhbEZvcm0uZ2V0KCdwbGFjZWhvbGRlcicpPy52YWx1ZTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyU2VsZWN0ZWQuZW1pdChwbGFjZUhvbGRlcik7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPlBsYWNlaG9sZGVyczwvaDQ+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgW2Zvcm1Hcm91cF09XCJtb2RhbEZvcm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsPlBsYWNlaG9sZGVyczwvbGFiZWw+IFxuICAgICAgICAgICAgICAgIDxzZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGxhY2Vob2xkZXJcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJwbGFjZWhvbGRlcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCAqbmdJZj1cIml0ZW0uY2hpbGRyZW5cIiBsYWJlbD1cInt7aXRlbS5pbmZvfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgaXRlbS5jaGlsZHJlblwiIFtuZ1ZhbHVlXT1cImNoaWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjaGlsZC5pbmZvfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cIiFpdGVtLmNoaWxkcmVuXCIgW25nVmFsdWVdPVwiaXRlbVwiPnt7aXRlbS5pbmZvfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgPCEtLSA8b3B0aW9uICpuZ0Zvcj1cImxldCBwIG9mIHBsYWNlaG9sZGVyc1wiIFtuZ1ZhbHVlXT1cInBcIj57e3AuaW5mb319PC9vcHRpb24+IC0tPlxuICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgIDwvZGl2PlxuICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXItMVwiIChjbGljayk9XCJzdWJtaXQoKVwiPkluc2VydCBQbGFjZWhvbGRlcjwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgPC9kaXY+XG4iXX0=