ngx-vector-components 4.130.0 → 4.131.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 (320) hide show
  1. package/CHANGELOG.md +1472 -1467
  2. package/README.md +35 -35
  3. package/assets/icons/chevron_down_icon.svg +3 -3
  4. package/assets/icons/home_menu_icon.svg +3 -3
  5. package/assets/icons/logout_icon.svg +9 -9
  6. package/assets/icons/menu_footer_icon.svg +3 -3
  7. package/assets/icons/menu_hamburguer_icon.svg +3 -3
  8. package/assets/icons/terms_of_use_icon.svg +9 -9
  9. package/assets/icons/vector_admin_icon.svg +4 -4
  10. package/assets/icons/vector_fintech_icon.svg +3 -3
  11. package/assets/icons/vector_logtech_icon.svg +6 -6
  12. package/assets/icons/vector_marketplace_icon.svg +3 -3
  13. package/assets/images/bunge_logo.svg +23 -23
  14. package/assets/images/cofco_logo.svg +117 -117
  15. package/assets/images/emote_bad.svg +6 -6
  16. package/assets/images/emote_cool.svg +5 -5
  17. package/assets/images/emote_nice.svg +5 -5
  18. package/assets/images/success_sign.svg +4 -4
  19. package/assets/images/vector-logo-horizontal-inverse-color.svg +13 -13
  20. package/assets/images/vector_logo_horizontal.svg +13 -13
  21. package/assets/images/warn_sign.svg +4 -4
  22. package/assets/styles/_fonts.scss +114 -114
  23. package/assets/styles/_mixins.scss +7 -7
  24. package/assets/styles/_primeng-custom-theme.scss +1105 -1101
  25. package/assets/styles/_spinner.scss +35 -35
  26. package/assets/styles/_styles.scss +115 -115
  27. package/assets/styles/_variables.scss +27 -27
  28. package/esm2020/lib/components/badge/badge.component.mjs +39 -39
  29. package/esm2020/lib/components/badge/badge.module.mjs +19 -19
  30. package/esm2020/lib/components/badge/index.mjs +3 -3
  31. package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +66 -66
  32. package/esm2020/lib/components/breadcrumb/breadcrumb.module.mjs +18 -18
  33. package/esm2020/lib/components/breadcrumb/index.mjs +3 -3
  34. package/esm2020/lib/components/crud-base/crud-base.component.mjs +47 -47
  35. package/esm2020/lib/components/crud-base/index.mjs +2 -2
  36. package/esm2020/lib/components/crud-footer/crud-footer.component.mjs +40 -40
  37. package/esm2020/lib/components/crud-footer/crud-footer.module.mjs +20 -20
  38. package/esm2020/lib/components/crud-footer/index.mjs +3 -3
  39. package/esm2020/lib/components/crud-header/crud-header.component.mjs +30 -30
  40. package/esm2020/lib/components/crud-header/crud-header.module.mjs +19 -19
  41. package/esm2020/lib/components/crud-header/index.mjs +3 -3
  42. package/esm2020/lib/components/crud-history/crud-history.component.mjs +82 -82
  43. package/esm2020/lib/components/crud-history/crud-history.module.mjs +20 -20
  44. package/esm2020/lib/components/crud-history/index.mjs +3 -3
  45. package/esm2020/lib/components/fields/button/button.component.mjs +41 -41
  46. package/esm2020/lib/components/fields/button/index.mjs +2 -2
  47. package/esm2020/lib/components/fields/calendar-field/calendar-field.component.mjs +74 -74
  48. package/esm2020/lib/components/fields/calendar-field/index.mjs +2 -2
  49. package/esm2020/lib/components/fields/checkbox-field/checkbox-field.component.mjs +46 -46
  50. package/esm2020/lib/components/fields/checkbox-field/index.mjs +2 -2
  51. package/esm2020/lib/components/fields/currency-field/currency-field.component.mjs +98 -98
  52. package/esm2020/lib/components/fields/currency-field/index.mjs +2 -2
  53. package/esm2020/lib/components/fields/data-table/data-table.component.mjs +388 -388
  54. package/esm2020/lib/components/fields/data-table/index.mjs +2 -2
  55. package/esm2020/lib/components/fields/dropdown-field/dropdown-field.component.mjs +204 -204
  56. package/esm2020/lib/components/fields/dropdown-field/index.mjs +2 -2
  57. package/esm2020/lib/components/fields/field-error-message/field-error-message.component.mjs +30 -30
  58. package/esm2020/lib/components/fields/field-error-message/index.mjs +2 -2
  59. package/esm2020/lib/components/fields/fields.module.mjs +222 -222
  60. package/esm2020/lib/components/fields/filters/filters.component.mjs +209 -209
  61. package/esm2020/lib/components/fields/filters/index.mjs +2 -2
  62. package/esm2020/lib/components/fields/index.mjs +20 -20
  63. package/esm2020/lib/components/fields/input-number-field/index.mjs +2 -2
  64. package/esm2020/lib/components/fields/input-number-field/input-number-field.component.mjs +86 -86
  65. package/esm2020/lib/components/fields/input-switch-field/index.mjs +2 -2
  66. package/esm2020/lib/components/fields/input-switch-field/input-switch-field.component.mjs +16 -16
  67. package/esm2020/lib/components/fields/multiselect-field/index.mjs +2 -2
  68. package/esm2020/lib/components/fields/multiselect-field/multiselect-field.component.mjs +154 -154
  69. package/esm2020/lib/components/fields/percentage-field/index.mjs +2 -2
  70. package/esm2020/lib/components/fields/percentage-field/percentage-field.component.mjs +54 -54
  71. package/esm2020/lib/components/fields/radio-button-field/index.mjs +2 -2
  72. package/esm2020/lib/components/fields/radio-button-field/radio-button-field.component.mjs +48 -48
  73. package/esm2020/lib/components/fields/range-value/index.mjs +2 -2
  74. package/esm2020/lib/components/fields/range-value/range-value.component.mjs +72 -72
  75. package/esm2020/lib/components/fields/search-field/index.mjs +2 -2
  76. package/esm2020/lib/components/fields/search-field/search-field.component.mjs +33 -33
  77. package/esm2020/lib/components/fields/select-button-field/index.mjs +2 -2
  78. package/esm2020/lib/components/fields/select-button-field/select-button-field.component.mjs +20 -20
  79. package/esm2020/lib/components/fields/text-field/index.mjs +2 -2
  80. package/esm2020/lib/components/fields/text-field/text-field.component.mjs +238 -238
  81. package/esm2020/lib/components/fields/textarea-field/index.mjs +2 -2
  82. package/esm2020/lib/components/fields/textarea-field/textarea-field.component.mjs +81 -81
  83. package/esm2020/lib/components/generic-error-modal/generic-error-modal.component.mjs +36 -36
  84. package/esm2020/lib/components/generic-error-modal/generic-error-modal.module.mjs +20 -20
  85. package/esm2020/lib/components/generic-error-modal/index.mjs +3 -3
  86. package/esm2020/lib/components/generic-modal/generic-modal.component.mjs +66 -66
  87. package/esm2020/lib/components/generic-modal/generic-modal.module.mjs +20 -20
  88. package/esm2020/lib/components/generic-modal/index.mjs +3 -3
  89. package/esm2020/lib/components/index.mjs +15 -15
  90. package/esm2020/lib/components/menu/index.mjs +4 -4
  91. package/esm2020/lib/components/menu/menu.component.mjs +305 -305
  92. package/esm2020/lib/components/menu/menu.module.mjs +20 -20
  93. package/esm2020/lib/components/menu/sub-menus-list/sub-menus-list.component.mjs +42 -42
  94. package/esm2020/lib/components/panel/index.mjs +3 -3
  95. package/esm2020/lib/components/panel/panel.component.mjs +15 -15
  96. package/esm2020/lib/components/panel/panel.module.mjs +19 -19
  97. package/esm2020/lib/components/score/index.mjs +3 -3
  98. package/esm2020/lib/components/score/score.component.mjs +17 -17
  99. package/esm2020/lib/components/score/score.module.mjs +16 -16
  100. package/esm2020/lib/components/stepper/index.mjs +3 -3
  101. package/esm2020/lib/components/stepper/stepper.component.mjs +47 -47
  102. package/esm2020/lib/components/stepper/stepper.module.mjs +19 -19
  103. package/esm2020/lib/components/top-bar/index.mjs +3 -3
  104. package/esm2020/lib/components/top-bar/top-bar.component.mjs +147 -147
  105. package/esm2020/lib/components/top-bar/top-bar.module.mjs +20 -20
  106. package/esm2020/lib/guards/crud-list-has-items.guard.mjs +22 -22
  107. package/esm2020/lib/guards/get-token-by-guid.guard.mjs +54 -54
  108. package/esm2020/lib/guards/has-permission.guard.mjs +27 -27
  109. package/esm2020/lib/guards/index.mjs +6 -6
  110. package/esm2020/lib/guards/role.guard.mjs +24 -24
  111. package/esm2020/lib/guards/token-is-present.guard.mjs +26 -26
  112. package/esm2020/lib/interceptors/http-interceptor.mjs +185 -185
  113. package/esm2020/lib/interceptors/index.mjs +2 -2
  114. package/esm2020/lib/models/app-name.enum.mjs +10 -10
  115. package/esm2020/lib/models/boolean-type.enum.mjs +6 -6
  116. package/esm2020/lib/models/crud-history.model.mjs +3 -3
  117. package/esm2020/lib/models/crud-mode.enum.mjs +7 -7
  118. package/esm2020/lib/models/currency.enum.mjs +7 -7
  119. package/esm2020/lib/models/data-table.model.mjs +23 -23
  120. package/esm2020/lib/models/document-type.enum.mjs +6 -6
  121. package/esm2020/lib/models/filters.model.mjs +2 -2
  122. package/esm2020/lib/models/generic-modal.model.mjs +2 -2
  123. package/esm2020/lib/models/http-response.model.mjs +2 -2
  124. package/esm2020/lib/models/index.mjs +18 -18
  125. package/esm2020/lib/models/ip-info.enum.mjs +2 -2
  126. package/esm2020/lib/models/list-item.model.mjs +2 -2
  127. package/esm2020/lib/models/locale.enum.mjs +7 -7
  128. package/esm2020/lib/models/menu-item.model.mjs +2 -2
  129. package/esm2020/lib/models/message-status.enum.mjs +8 -8
  130. package/esm2020/lib/models/profile.model.mjs +338 -338
  131. package/esm2020/lib/models/role.enum.mjs +5 -5
  132. package/esm2020/lib/models/status.enum.mjs +8 -8
  133. package/esm2020/lib/models/topbar.model.mjs +2 -2
  134. package/esm2020/lib/models/vector-app.model.mjs +2 -2
  135. package/esm2020/lib/models/vector-notification.model.mjs +2 -2
  136. package/esm2020/lib/models/view.enum.mjs +8 -8
  137. package/esm2020/lib/pipes/currency-brl.pipe.mjs +18 -18
  138. package/esm2020/lib/pipes/format-document.pipe.mjs +17 -17
  139. package/esm2020/lib/pipes/index.mjs +9 -9
  140. package/esm2020/lib/pipes/mask.pipe.mjs +21 -21
  141. package/esm2020/lib/pipes/not-hidden.pipe.mjs +16 -16
  142. package/esm2020/lib/pipes/only-active.pipe.mjs +16 -16
  143. package/esm2020/lib/pipes/pipes.module.mjs +50 -50
  144. package/esm2020/lib/pipes/remove-last-child.pipe.mjs +18 -18
  145. package/esm2020/lib/pipes/unread-notifications.pipe.mjs +15 -15
  146. package/esm2020/lib/resolvers/get-selected-crud-item.resolver.mjs +28 -28
  147. package/esm2020/lib/resolvers/index.mjs +2 -2
  148. package/esm2020/lib/services/auth.service.mjs +77 -77
  149. package/esm2020/lib/services/base-dropdown.mjs +2 -2
  150. package/esm2020/lib/services/crud-base.service.mjs +14 -14
  151. package/esm2020/lib/services/enum.service.mjs +43 -43
  152. package/esm2020/lib/services/error-message.service.mjs +16 -16
  153. package/esm2020/lib/services/geolocation.service.mjs +23 -23
  154. package/esm2020/lib/services/index.mjs +13 -13
  155. package/esm2020/lib/services/loading.service.mjs +15 -15
  156. package/esm2020/lib/services/menu.service.mjs +152 -152
  157. package/esm2020/lib/services/modal.service.mjs +15 -15
  158. package/esm2020/lib/services/notifications.service.mjs +64 -64
  159. package/esm2020/lib/services/profile.service.mjs +112 -112
  160. package/esm2020/lib/services/storage.service.mjs +108 -108
  161. package/esm2020/lib/shared/shared.module.mjs +19 -19
  162. package/esm2020/lib/utils/cpf-cnpj-validator.util.mjs +116 -116
  163. package/esm2020/lib/utils/file.util.mjs +15 -15
  164. package/esm2020/lib/utils/index.mjs +8 -8
  165. package/esm2020/lib/utils/mask.util.mjs +76 -76
  166. package/esm2020/lib/utils/object.util.mjs +27 -27
  167. package/esm2020/lib/utils/string.util.mjs +30 -30
  168. package/esm2020/lib/utils/validation.util.mjs +234 -234
  169. package/esm2020/lib/utils/window.util.mjs +9 -9
  170. package/esm2020/ngx-vector-components.mjs +4 -4
  171. package/esm2020/public-api.mjs +9 -9
  172. package/fesm2015/ngx-vector-components.mjs +4866 -4866
  173. package/fesm2015/ngx-vector-components.mjs.map +1 -1
  174. package/fesm2020/ngx-vector-components.mjs +4842 -4842
  175. package/fesm2020/ngx-vector-components.mjs.map +1 -1
  176. package/lib/components/badge/badge.component.d.ts +15 -15
  177. package/lib/components/badge/badge.module.d.ts +9 -9
  178. package/lib/components/badge/index.d.ts +2 -2
  179. package/lib/components/breadcrumb/breadcrumb.component.d.ts +19 -19
  180. package/lib/components/breadcrumb/breadcrumb.module.d.ts +8 -8
  181. package/lib/components/breadcrumb/index.d.ts +2 -2
  182. package/lib/components/crud-base/crud-base.component.d.ts +20 -20
  183. package/lib/components/crud-base/index.d.ts +1 -1
  184. package/lib/components/crud-footer/crud-footer.component.d.ts +19 -19
  185. package/lib/components/crud-footer/crud-footer.module.d.ts +10 -10
  186. package/lib/components/crud-footer/index.d.ts +2 -2
  187. package/lib/components/crud-header/crud-header.component.d.ts +11 -11
  188. package/lib/components/crud-header/crud-header.module.d.ts +9 -9
  189. package/lib/components/crud-header/index.d.ts +2 -2
  190. package/lib/components/crud-history/crud-history.component.d.ts +12 -12
  191. package/lib/components/crud-history/crud-history.module.d.ts +10 -10
  192. package/lib/components/crud-history/index.d.ts +2 -2
  193. package/lib/components/fields/button/button.component.d.ts +17 -17
  194. package/lib/components/fields/button/index.d.ts +1 -1
  195. package/lib/components/fields/calendar-field/calendar-field.component.d.ts +23 -23
  196. package/lib/components/fields/calendar-field/index.d.ts +1 -1
  197. package/lib/components/fields/checkbox-field/checkbox-field.component.d.ts +19 -19
  198. package/lib/components/fields/checkbox-field/index.d.ts +1 -1
  199. package/lib/components/fields/currency-field/currency-field.component.d.ts +32 -32
  200. package/lib/components/fields/currency-field/index.d.ts +1 -1
  201. package/lib/components/fields/data-table/data-table.component.d.ts +87 -87
  202. package/lib/components/fields/data-table/index.d.ts +1 -1
  203. package/lib/components/fields/dropdown-field/dropdown-field.component.d.ts +52 -52
  204. package/lib/components/fields/dropdown-field/index.d.ts +1 -1
  205. package/lib/components/fields/field-error-message/field-error-message.component.d.ts +10 -10
  206. package/lib/components/fields/field-error-message/index.d.ts +1 -1
  207. package/lib/components/fields/fields.module.d.ts +50 -50
  208. package/lib/components/fields/filters/filters.component.d.ts +65 -65
  209. package/lib/components/fields/filters/index.d.ts +1 -1
  210. package/lib/components/fields/index.d.ts +19 -19
  211. package/lib/components/fields/input-number-field/index.d.ts +1 -1
  212. package/lib/components/fields/input-number-field/input-number-field.component.d.ts +28 -28
  213. package/lib/components/fields/input-switch-field/index.d.ts +1 -1
  214. package/lib/components/fields/input-switch-field/input-switch-field.component.d.ts +8 -8
  215. package/lib/components/fields/multiselect-field/index.d.ts +1 -1
  216. package/lib/components/fields/multiselect-field/multiselect-field.component.d.ts +40 -40
  217. package/lib/components/fields/percentage-field/index.d.ts +1 -1
  218. package/lib/components/fields/percentage-field/percentage-field.component.d.ts +20 -20
  219. package/lib/components/fields/radio-button-field/index.d.ts +1 -1
  220. package/lib/components/fields/radio-button-field/radio-button-field.component.d.ts +25 -25
  221. package/lib/components/fields/range-value/index.d.ts +1 -1
  222. package/lib/components/fields/range-value/range-value.component.d.ts +18 -18
  223. package/lib/components/fields/search-field/index.d.ts +1 -1
  224. package/lib/components/fields/search-field/search-field.component.d.ts +14 -14
  225. package/lib/components/fields/select-button-field/index.d.ts +1 -1
  226. package/lib/components/fields/select-button-field/select-button-field.component.d.ts +9 -9
  227. package/lib/components/fields/text-field/index.d.ts +1 -1
  228. package/lib/components/fields/text-field/text-field.component.d.ts +56 -56
  229. package/lib/components/fields/textarea-field/index.d.ts +1 -1
  230. package/lib/components/fields/textarea-field/textarea-field.component.d.ts +22 -22
  231. package/lib/components/generic-error-modal/generic-error-modal.component.d.ts +15 -15
  232. package/lib/components/generic-error-modal/generic-error-modal.module.d.ts +10 -10
  233. package/lib/components/generic-error-modal/index.d.ts +2 -2
  234. package/lib/components/generic-modal/generic-modal.component.d.ts +24 -24
  235. package/lib/components/generic-modal/generic-modal.module.d.ts +10 -10
  236. package/lib/components/generic-modal/index.d.ts +2 -2
  237. package/lib/components/index.d.ts +14 -14
  238. package/lib/components/menu/index.d.ts +3 -3
  239. package/lib/components/menu/menu.component.d.ts +53 -53
  240. package/lib/components/menu/menu.module.d.ts +10 -10
  241. package/lib/components/menu/sub-menus-list/sub-menus-list.component.d.ts +14 -14
  242. package/lib/components/panel/index.d.ts +2 -2
  243. package/lib/components/panel/panel.component.d.ts +8 -8
  244. package/lib/components/panel/panel.module.d.ts +9 -9
  245. package/lib/components/score/index.d.ts +2 -2
  246. package/lib/components/score/score.component.d.ts +9 -9
  247. package/lib/components/score/score.module.d.ts +7 -7
  248. package/lib/components/stepper/index.d.ts +2 -2
  249. package/lib/components/stepper/stepper.component.d.ts +15 -15
  250. package/lib/components/stepper/stepper.module.d.ts +9 -9
  251. package/lib/components/top-bar/index.d.ts +2 -2
  252. package/lib/components/top-bar/top-bar.component.d.ts +49 -49
  253. package/lib/components/top-bar/top-bar.module.d.ts +10 -10
  254. package/lib/guards/crud-list-has-items.guard.d.ts +10 -10
  255. package/lib/guards/get-token-by-guid.guard.d.ts +15 -15
  256. package/lib/guards/has-permission.guard.d.ts +13 -13
  257. package/lib/guards/index.d.ts +5 -5
  258. package/lib/guards/role.guard.d.ts +11 -11
  259. package/lib/guards/token-is-present.guard.d.ts +11 -11
  260. package/lib/interceptors/http-interceptor.d.ts +31 -31
  261. package/lib/interceptors/index.d.ts +1 -1
  262. package/lib/models/app-name.enum.d.ts +8 -8
  263. package/lib/models/boolean-type.enum.d.ts +4 -4
  264. package/lib/models/crud-history.model.d.ts +13 -13
  265. package/lib/models/crud-mode.enum.d.ts +5 -5
  266. package/lib/models/currency.enum.d.ts +5 -5
  267. package/lib/models/data-table.model.d.ts +65 -65
  268. package/lib/models/document-type.enum.d.ts +4 -4
  269. package/lib/models/filters.model.d.ts +4 -4
  270. package/lib/models/generic-modal.model.d.ts +12 -12
  271. package/lib/models/http-response.model.d.ts +57 -57
  272. package/lib/models/index.d.ts +17 -17
  273. package/lib/models/ip-info.enum.d.ts +6 -6
  274. package/lib/models/list-item.model.d.ts +7 -7
  275. package/lib/models/locale.enum.d.ts +5 -5
  276. package/lib/models/menu-item.model.d.ts +16 -16
  277. package/lib/models/message-status.enum.d.ts +6 -6
  278. package/lib/models/profile.model.d.ts +358 -358
  279. package/lib/models/role.enum.d.ts +3 -3
  280. package/lib/models/status.enum.d.ts +6 -6
  281. package/lib/models/topbar.model.d.ts +5 -5
  282. package/lib/models/vector-app.model.d.ts +9 -9
  283. package/lib/models/vector-notification.model.d.ts +8 -8
  284. package/lib/models/view.enum.d.ts +6 -6
  285. package/lib/pipes/currency-brl.pipe.d.ts +7 -7
  286. package/lib/pipes/format-document.pipe.d.ts +7 -7
  287. package/lib/pipes/index.d.ts +8 -8
  288. package/lib/pipes/mask.pipe.d.ts +7 -7
  289. package/lib/pipes/not-hidden.pipe.d.ts +7 -7
  290. package/lib/pipes/only-active.pipe.d.ts +7 -7
  291. package/lib/pipes/pipes.module.d.ts +13 -13
  292. package/lib/pipes/remove-last-child.pipe.d.ts +7 -7
  293. package/lib/pipes/unread-notifications.pipe.d.ts +9 -9
  294. package/lib/resolvers/get-selected-crud-item.resolver.d.ts +10 -10
  295. package/lib/resolvers/index.d.ts +1 -1
  296. package/lib/services/auth.service.d.ts +24 -24
  297. package/lib/services/base-dropdown.d.ts +7 -7
  298. package/lib/services/crud-base.service.d.ts +7 -7
  299. package/lib/services/enum.service.d.ts +13 -13
  300. package/lib/services/error-message.service.d.ts +8 -8
  301. package/lib/services/geolocation.service.d.ts +13 -13
  302. package/lib/services/index.d.ts +12 -12
  303. package/lib/services/loading.service.d.ts +7 -7
  304. package/lib/services/menu.service.d.ts +35 -35
  305. package/lib/services/modal.service.d.ts +7 -7
  306. package/lib/services/notifications.service.d.ts +13 -13
  307. package/lib/services/profile.service.d.ts +27 -27
  308. package/lib/services/storage.service.d.ts +43 -43
  309. package/lib/shared/shared.module.d.ts +10 -10
  310. package/lib/utils/cpf-cnpj-validator.util.d.ts +5 -5
  311. package/lib/utils/file.util.d.ts +4 -4
  312. package/lib/utils/index.d.ts +7 -7
  313. package/lib/utils/mask.util.d.ts +21 -21
  314. package/lib/utils/object.util.d.ts +5 -5
  315. package/lib/utils/string.util.d.ts +6 -6
  316. package/lib/utils/validation.util.d.ts +17 -17
  317. package/lib/utils/window.util.d.ts +4 -4
  318. package/ngx-vector-components.d.ts +5 -5
  319. package/package.json +1 -1
  320. package/public-api.d.ts +8 -8
@@ -1,209 +1,209 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { FormControl, FormGroup, Validators } from '@angular/forms';
3
- import { Subscription } from 'rxjs';
4
- import { ObjectUtil, ValidationUtil } from '../../../utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/router";
7
- import * as i2 from "../text-field/text-field.component";
8
- import * as i3 from "../dropdown-field/dropdown-field.component";
9
- import * as i4 from "../currency-field/currency-field.component";
10
- import * as i5 from "../calendar-field/calendar-field.component";
11
- import * as i6 from "../select-button-field/select-button-field.component";
12
- import * as i7 from "../multiselect-field/multiselect-field.component";
13
- import * as i8 from "../button/button.component";
14
- import * as i9 from "@angular/common";
15
- import * as i10 from "@angular/forms";
16
- import * as i11 from "primeng/tooltip";
17
- import * as i12 from "../../../pipes/not-hidden.pipe";
18
- import * as i13 from "@ngx-translate/core";
19
- export var FieldType;
20
- (function (FieldType) {
21
- FieldType[FieldType["DROPDOWN"] = 0] = "DROPDOWN";
22
- FieldType[FieldType["TEXT"] = 1] = "TEXT";
23
- FieldType[FieldType["DATE"] = 2] = "DATE";
24
- FieldType[FieldType["NUMBER"] = 3] = "NUMBER";
25
- FieldType[FieldType["CURRENCY"] = 4] = "CURRENCY";
26
- FieldType[FieldType["DYNAMIC_DROPDOWN"] = 5] = "DYNAMIC_DROPDOWN";
27
- FieldType[FieldType["SELECT_BUTTON"] = 6] = "SELECT_BUTTON";
28
- FieldType[FieldType["DATE_RANGE"] = 7] = "DATE_RANGE";
29
- FieldType[FieldType["MULTISELECT"] = 8] = "MULTISELECT";
30
- })(FieldType || (FieldType = {}));
31
- export class FiltersComponent {
32
- constructor(activatedRoute) {
33
- this.activatedRoute = activatedRoute;
34
- this.onSearch = new EventEmitter();
35
- this.formBuilded = new EventEmitter();
36
- this.fieldTypes = FieldType;
37
- this.formGroup = new FormGroup({});
38
- this._fields = [];
39
- this.fieldsSubscription = new Subscription();
40
- }
41
- set fields(_fields) {
42
- const isFirstSet = !this._fields.length && _fields?.length;
43
- this._fields = _fields;
44
- this.formGroup = new FormGroup({});
45
- this.fieldsSubscription.unsubscribe();
46
- this.fieldsSubscription = new Subscription();
47
- this.fields?.forEach((field) => {
48
- if (field?.defaultValue && typeof field?.defaultValue === 'object') {
49
- field.initiateValue = !!field.defaultValue?.code;
50
- }
51
- else {
52
- field.initiateValue = !!field.defaultValue;
53
- }
54
- if (field.type === FieldType.DATE_RANGE) {
55
- this.formGroup.addControl(field.name, new FormGroup({
56
- startDate: new FormControl({ value: field.defaultValue?.startDate, disabled: field.readonly }, [
57
- ...this.buildValidators(field),
58
- ValidationUtil.lowerThanOrEqualTo('endDate'),
59
- ]),
60
- endDate: new FormControl({ value: field.defaultValue?.endDate, disabled: field.readonly }, [
61
- ...this.buildValidators(field),
62
- ValidationUtil.greaterThanOrEqualTo('startDate'),
63
- ]),
64
- }));
65
- }
66
- else {
67
- if (field.controler) {
68
- this.formGroup.addControl(field.name, field.controler);
69
- }
70
- else {
71
- this.formGroup.addControl(field.name, new FormControl({ value: field.defaultValue, disabled: field.readonly }, this.buildValidators(field)));
72
- }
73
- }
74
- });
75
- this.fields
76
- ?.filter((field) => field.dependencies)
77
- .forEach((field) => {
78
- field.dependencies?.forEach((dependency) => {
79
- this.fieldsSubscription.add(this.formGroup.get(dependency)?.valueChanges.subscribe((value) => {
80
- this.formGroup.get(field.name)?.reset();
81
- }));
82
- });
83
- });
84
- this.patchFormFromQueryParams({ ...this.activatedRoute.snapshot.queryParams });
85
- if (this._fields?.length && this.formGroup.valid && isFirstSet) {
86
- this.search();
87
- }
88
- this.formBuilded.emit();
89
- this.fieldsSubscription.add(this.activatedRoute.queryParams.subscribe((queryParams) => {
90
- this.patchFormFromQueryParams({ ...queryParams });
91
- }));
92
- }
93
- get fields() {
94
- return this._fields;
95
- }
96
- get hideFilters() {
97
- return !this.fields?.filter((item) => !item.hidden).length;
98
- }
99
- ngOnInit() { }
100
- ngOnDestroy() {
101
- this.fieldsSubscription.unsubscribe();
102
- }
103
- search() {
104
- this.formGroup.markAllAsTouched();
105
- if (this.formGroup.valid) {
106
- const filterValue = this.formGroup.getRawValue();
107
- Object.keys(filterValue).forEach((key) => {
108
- if (filterValue[key]?.hasOwnProperty('code')) {
109
- filterValue[key] = filterValue[key].code;
110
- }
111
- if (!ObjectUtil.isValid(filterValue[key])) {
112
- const fieldType = this.fields.find((field) => field.name === key)?.type ?? FieldType.TEXT;
113
- filterValue[key] = [FieldType.DROPDOWN, FieldType.NUMBER].includes(fieldType) ? -1 : '';
114
- }
115
- });
116
- this.onSearch.emit(filterValue);
117
- }
118
- }
119
- isTextFieldType(field) {
120
- return [FieldType.TEXT, FieldType.NUMBER].includes(field.type);
121
- }
122
- getFieldDependencies(field) {
123
- if (!field.dependencies) {
124
- return undefined;
125
- }
126
- return field.dependencies.reduce((prev, curr) => {
127
- let depValue = this.formGroup.get(curr)?.value?.code;
128
- if (!ObjectUtil.isValid(depValue)) {
129
- depValue = -1;
130
- }
131
- return {
132
- ...prev,
133
- [curr]: depValue,
134
- };
135
- }, {});
136
- }
137
- getGridClass(field) {
138
- switch (field.size) {
139
- case 'small':
140
- return 'md:col-1';
141
- case 'medium':
142
- return 'md:col-3';
143
- case 'large':
144
- return 'md:col-4';
145
- case 'largest':
146
- return 'md:col-8';
147
- case 'full':
148
- return 'md:col-12';
149
- default:
150
- return 'md:col-4';
151
- }
152
- }
153
- patchFormFromQueryParams(queryParams) {
154
- if (Object.keys(queryParams).length) {
155
- this.fields.forEach((field) => {
156
- if (queryParams.hasOwnProperty(field.name)) {
157
- try {
158
- queryParams[field.name] = queryParams[field.name]
159
- ? JSON.parse(queryParams[field.name])
160
- : queryParams[field.name];
161
- }
162
- catch (_) { }
163
- if (field.type === FieldType.DATE_RANGE) {
164
- queryParams[field.name] = {
165
- startDate: queryParams[field.name].startDate ? new Date(queryParams[field.name].startDate) : undefined,
166
- endDate: queryParams[field.name].endDate ? new Date(queryParams[field.name].endDate) : undefined,
167
- };
168
- }
169
- if (field.type === FieldType.DATE) {
170
- queryParams[field.name] = queryParams[field.name] ? new Date(queryParams[field.name]) : undefined;
171
- }
172
- }
173
- });
174
- this.formGroup.patchValue(queryParams);
175
- }
176
- }
177
- buildValidators(field) {
178
- const validators = [];
179
- if (field.required) {
180
- validators.push(Validators.required);
181
- }
182
- if (field.minLength) {
183
- validators.push(Validators.minLength(field.minLength));
184
- }
185
- if (field.maxLength) {
186
- validators.push(Validators.maxLength(field.maxLength));
187
- }
188
- if (field.min) {
189
- validators.push(Validators.min(field.min));
190
- }
191
- if (field.max) {
192
- validators.push(Validators.max(field.max));
193
- }
194
- return validators;
195
- }
196
- }
197
- FiltersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FiltersComponent, deps: [{ token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
198
- FiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: FiltersComponent, selector: "vector-filters", inputs: { fields: "fields" }, outputs: { onSearch: "onSearch", formBuilded: "formBuilded" }, ngImport: i0, template: "<div class=\"grid filter-container\" [ngClass]=\"{ 'display-none': hideFilters }\" [formGroup]=\"formGroup\">\r\n <div *ngFor=\"let field of fields | notHidden\" class=\"field col-12 sm:col-8 {{ getGridClass(field) }}\">\r\n <label>{{ field.label }} <i *ngIf=\"field.tooltip\" class=\"fas fa-info-circle mt-1 pl-2 ch\" pTooltip=\"{{ field.tooltip }}\" tooltipPosition=\"bottom\"></i></label>\r\n <vector-text-field\r\n *ngIf=\"isTextFieldType(field)\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [mask]=\"field.mask\"\r\n [label]=\"field.placeholder\"\r\n [isRequired]=\"field.required\"\r\n [numeric]=\"field.type === fieldTypes.NUMBER\"\r\n ></vector-text-field>\r\n <vector-dropdown-field\r\n *ngIf=\"[fieldTypes.DYNAMIC_DROPDOWN, fieldTypes.DROPDOWN].includes(field.type)\"\r\n [dynamicFilters]=\"field.filterTypes\"\r\n [disabled]=\"field.disabled\"\r\n [options]=\"field.options || []\"\r\n [service]=\"field.service\"\r\n [isRequired]=\"field.required\"\r\n [minLengthToService]=\"field.minLengthToService || 0\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [paged]=\"false\"\r\n [dependencies]=\"getFieldDependencies(field)\"\r\n [initialLoad]=\"field.initiateValue\"\r\n ></vector-dropdown-field>\r\n <vector-currency-field\r\n *ngIf=\"field.type === fieldTypes.CURRENCY\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [outlined]=\"true\"\r\n ></vector-currency-field>\r\n <vector-calendar-field\r\n *ngIf=\"field.type === fieldTypes.DATE\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [isRequired]=\"field.required\"\r\n [label]=\"field.placeholder || ''\"\r\n ></vector-calendar-field>\r\n <vector-select-button-field\r\n *ngIf=\"field.type === fieldTypes.SELECT_BUTTON\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [options]=\"field.options\"\r\n (click)=\"search()\"\r\n >\r\n </vector-select-button-field>\r\n <div *ngIf=\"field.type === fieldTypes.DATE_RANGE\" class=\"range-date-container\">\r\n <vector-calendar-field\r\n [control]=\"formGroup.get(field.name + '.startDate')\"\r\n [isRequired]=\"field.required\"\r\n [label]=\"field.placeholder || ''\"\r\n ></vector-calendar-field>\r\n At\u00E9\r\n <vector-calendar-field\r\n [control]=\"formGroup.get(field.name + '.endDate')\"\r\n [isRequired]=\"field.required\"\r\n [label]=\"field.placeholder || ''\"\r\n ></vector-calendar-field>\r\n </div>\r\n <vector-multiselect-field\r\n *ngIf=\"field.type === fieldTypes.MULTISELECT\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [options]=\"field.options || []\"\r\n >\r\n </vector-multiselect-field>\r\n </div>\r\n <div class=\"search-button sm:col-4\">\r\n <vector-button\r\n [label]=\"'app.label.search' | translate\"\r\n (click)=\"search()\"\r\n [disabled]=\"!formGroup.valid\"\r\n ></vector-button>\r\n </div>\r\n</div>\r\n", styles: [".filter-container{align-items:center}.filter-container .field{display:flex;flex-direction:column}.filter-container .search-button{flex:1;padding-right:7px;display:flex;justify-content:flex-end}@media (min-width: 768px){.filter-container .search-button{padding-top:36px}}.filter-container .range-date-container{display:flex;align-items:center;gap:10px}.display-none{display:none!important}\n"], components: [{ type: i2.TextFieldComponent, selector: "vector-text-field", inputs: ["isRequired", "label", "maxlength", "isPassword", "numeric", "numericPositive", "decimal", "onlyText", "alphaNumeric", "alphaNumericAndWhitespace", "mask", "autoClear", "readonly", "rightIcon", "centered", "enableDocumentTypeChoice", "hiddenErrorMessage", "leftLabel", "control", "inputId", "slotChar"], outputs: ["blurEvent", "enterKeyPress", "backSpaceKeyPress", "focusEvent", "onDocumentTypeChange"] }, { type: i3.DropdownFieldComponent, selector: "vector-dropdown-field", inputs: ["options", "isNgContent", "isRequired", "control", "label", "service", "paged", "buttonAction", "dependencies", "hiddenErrorMessage", "dynamicFilters", "minLengthToService", "initialLoad", "disabled"], outputs: ["onFocus", "onChange"] }, { type: i4.CurrencyFieldComponent, selector: "vector-currency-field", inputs: ["minValue", "maxValue", "placeholder", "numberOfDecimals", "control", "outlined", "rounded", "label", "isBankingField", "inputClassName", "localePrefix", "currencyPrefix", "disabled", "centered"] }, { type: i5.CalendarComponent, selector: "vector-calendar-field", inputs: ["isRequired", "control", "label", "showCalendarOnFocus", "min", "max", "disabledDates", "disabled", "defaultDate", "hiddenErrorMessage"] }, { type: i6.SelectButtonFieldComponent, selector: "vector-select-button-field", inputs: ["options", "control"] }, { type: i7.MultiselectFieldComponent, selector: "vector-multiselect-field", inputs: ["pagedSugestion", "isRequired", "control", "label", "options", "filter", "showSelectAllOption", "display", "paged", "minLengthToService", "initialLoad", "service", "filterVirtualScrool"], outputs: ["onChange", "onClosePanel"] }, { type: i8.ButtonComponent, selector: "vector-button", inputs: ["disabled", "label", "type", "leftIcon", "rightIcon", "noShadow", "style"], outputs: ["onClick"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }], pipes: { "notHidden": i12.NotHiddenPipe, "translate": i13.TranslatePipe } });
199
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FiltersComponent, decorators: [{
200
- type: Component,
201
- args: [{ selector: 'vector-filters', template: "<div class=\"grid filter-container\" [ngClass]=\"{ 'display-none': hideFilters }\" [formGroup]=\"formGroup\">\r\n <div *ngFor=\"let field of fields | notHidden\" class=\"field col-12 sm:col-8 {{ getGridClass(field) }}\">\r\n <label>{{ field.label }} <i *ngIf=\"field.tooltip\" class=\"fas fa-info-circle mt-1 pl-2 ch\" pTooltip=\"{{ field.tooltip }}\" tooltipPosition=\"bottom\"></i></label>\r\n <vector-text-field\r\n *ngIf=\"isTextFieldType(field)\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [mask]=\"field.mask\"\r\n [label]=\"field.placeholder\"\r\n [isRequired]=\"field.required\"\r\n [numeric]=\"field.type === fieldTypes.NUMBER\"\r\n ></vector-text-field>\r\n <vector-dropdown-field\r\n *ngIf=\"[fieldTypes.DYNAMIC_DROPDOWN, fieldTypes.DROPDOWN].includes(field.type)\"\r\n [dynamicFilters]=\"field.filterTypes\"\r\n [disabled]=\"field.disabled\"\r\n [options]=\"field.options || []\"\r\n [service]=\"field.service\"\r\n [isRequired]=\"field.required\"\r\n [minLengthToService]=\"field.minLengthToService || 0\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [paged]=\"false\"\r\n [dependencies]=\"getFieldDependencies(field)\"\r\n [initialLoad]=\"field.initiateValue\"\r\n ></vector-dropdown-field>\r\n <vector-currency-field\r\n *ngIf=\"field.type === fieldTypes.CURRENCY\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [outlined]=\"true\"\r\n ></vector-currency-field>\r\n <vector-calendar-field\r\n *ngIf=\"field.type === fieldTypes.DATE\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [isRequired]=\"field.required\"\r\n [label]=\"field.placeholder || ''\"\r\n ></vector-calendar-field>\r\n <vector-select-button-field\r\n *ngIf=\"field.type === fieldTypes.SELECT_BUTTON\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [options]=\"field.options\"\r\n (click)=\"search()\"\r\n >\r\n </vector-select-button-field>\r\n <div *ngIf=\"field.type === fieldTypes.DATE_RANGE\" class=\"range-date-container\">\r\n <vector-calendar-field\r\n [control]=\"formGroup.get(field.name + '.startDate')\"\r\n [isRequired]=\"field.required\"\r\n [label]=\"field.placeholder || ''\"\r\n ></vector-calendar-field>\r\n At\u00E9\r\n <vector-calendar-field\r\n [control]=\"formGroup.get(field.name + '.endDate')\"\r\n [isRequired]=\"field.required\"\r\n [label]=\"field.placeholder || ''\"\r\n ></vector-calendar-field>\r\n </div>\r\n <vector-multiselect-field\r\n *ngIf=\"field.type === fieldTypes.MULTISELECT\"\r\n [control]=\"formGroup.get(field.name)\"\r\n [options]=\"field.options || []\"\r\n >\r\n </vector-multiselect-field>\r\n </div>\r\n <div class=\"search-button sm:col-4\">\r\n <vector-button\r\n [label]=\"'app.label.search' | translate\"\r\n (click)=\"search()\"\r\n [disabled]=\"!formGroup.valid\"\r\n ></vector-button>\r\n </div>\r\n</div>\r\n", styles: [".filter-container{align-items:center}.filter-container .field{display:flex;flex-direction:column}.filter-container .search-button{flex:1;padding-right:7px;display:flex;justify-content:flex-end}@media (min-width: 768px){.filter-container .search-button{padding-top:36px}}.filter-container .range-date-container{display:flex;align-items:center;gap:10px}.display-none{display:none!important}\n"] }]
202
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }]; }, propDecorators: { fields: [{
203
- type: Input
204
- }], onSearch: [{
205
- type: Output
206
- }], formBuilded: [{
207
- type: Output
208
- }] } });
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9maWx0ZXJzL2ZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvZmlsdGVycy9maWx0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRTVELE1BQU0sQ0FBTixJQUFZLFNBVVg7QUFWRCxXQUFZLFNBQVM7SUFDbkIsaURBQVEsQ0FBQTtJQUNSLHlDQUFJLENBQUE7SUFDSix5Q0FBSSxDQUFBO0lBQ0osNkNBQU0sQ0FBQTtJQUNOLGlEQUFRLENBQUE7SUFDUixpRUFBZ0IsQ0FBQTtJQUNoQiwyREFBYSxDQUFBO0lBQ2IscURBQVUsQ0FBQTtJQUNWLHVEQUFXLENBQUE7QUFDYixDQUFDLEVBVlcsU0FBUyxLQUFULFNBQVMsUUFVcEI7QUFpQ0QsTUFBTSxPQUFPLGdCQUFnQjtJQXFGM0IsWUFBb0IsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBakIzQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVuQyxnQkFBVyxH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Z0I7cUdBTWYsTUFBTTtzQkFEaEIsS0FBSztnQkFtRUMsUUFBUTtzQkFEZCxNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgQmFzZURyb3Bkb3duIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgeyBPYmplY3RVdGlsLCBWYWxpZGF0aW9uVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcclxuXHJcbmV4cG9ydCBlbnVtIEZpZWxkVHlwZSB7XHJcbiAgRFJPUERPV04sXHJcbiAgVEVYVCxcclxuICBEQVRFLFxyXG4gIE5VTUJFUixcclxuICBDVVJSRU5DWSxcclxuICBEWU5BTUlDX0RST1BET1dOLFxyXG4gIFNFTEVDVF9CVVRUT04sXHJcbiAgREFURV9SQU5HRSxcclxuICBNVUxUSVNFTEVDVCxcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRmlsdGVyRmllbGQgPSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHR5cGU6IEZpZWxkVHlwZTtcclxuICBtaW5MZW5ndGg/OiBudW1iZXI7XHJcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG4gIG1pbj86IG51bWJlcjtcclxuICBtYXg/OiBudW1iZXI7XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgbWFzaz86IHN0cmluZztcclxuICBvcHRpb25zPzogTGlzdEl0ZW1bXTtcclxuICBmaWx0ZXJUeXBlcz86IExpc3RJdGVtW107XHJcbiAgc2VydmljZT86IEJhc2VEcm9wZG93bjtcclxuICBkZWZhdWx0VmFsdWU/OiBhbnk7XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcclxuICBzaXplPzogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICdsYXJnZXN0JyB8ICdmdWxsJztcclxuICBtaW5MZW5ndGhUb1NlcnZpY2U/OiBudW1iZXI7XHJcbiAgaW5pdGlhdGVWYWx1ZT86IGJvb2xlYW47XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxuICBjb250cm9sZXI/OiBGb3JtQ29udHJvbDtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndmVjdG9yLWZpbHRlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBmaWVsZHMoX2ZpZWxkczogRmlsdGVyRmllbGRbXSkge1xyXG4gICAgY29uc3QgaXNGaXJzdFNldCA9ICF0aGlzLl9maWVsZHMubGVuZ3RoICYmIF9maWVsZHM/Lmxlbmd0aDtcclxuICAgIHRoaXMuX2ZpZWxkcyA9IF9maWVsZHM7XHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIHRoaXMuZmllbGRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmZpZWxkc1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgICB0aGlzLmZpZWxkcz8uZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKGZpZWxkPy5kZWZhdWx0VmFsdWUgJiYgdHlwZW9mIGZpZWxkPy5kZWZhdWx0VmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgZmllbGQuaW5pdGlhdGVWYWx1ZSA9ICEhZmllbGQuZGVmYXVsdFZhbHVlPy5jb2RlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpZWxkLmluaXRpYXRlVmFsdWUgPSAhIWZpZWxkLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLkRBVEVfUkFOR0UpIHtcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5hZGRDb250cm9sKFxyXG4gICAgICAgICAgZmllbGQubmFtZSxcclxuICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICBzdGFydERhdGU6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBmaWVsZC5kZWZhdWx0VmFsdWU/LnN0YXJ0RGF0ZSwgZGlzYWJsZWQ6IGZpZWxkLnJlYWRvbmx5IH0sIFtcclxuICAgICAgICAgICAgICAuLi50aGlzLmJ1aWxkVmFsaWRhdG9ycyhmaWVsZCksXHJcbiAgICAgICAgICAgICAgVmFsaWRhdGlvblV0aWwubG93ZXJUaGFuT3JFcXVhbFRvKCdlbmREYXRlJyksXHJcbiAgICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgICBlbmREYXRlOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogZmllbGQuZGVmYXVsdFZhbHVlPy5lbmREYXRlLCBkaXNhYmxlZDogZmllbGQucmVhZG9ubHkgfSwgW1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuYnVpbGRWYWxpZGF0b3JzKGZpZWxkKSxcclxuICAgICAgICAgICAgICBWYWxpZGF0aW9uVXRpbC5ncmVhdGVyVGhhbk9yRXF1YWxUbygnc3RhcnREYXRlJyksXHJcbiAgICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sZXIpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2woZmllbGQubmFtZSwgZmllbGQuY29udHJvbGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbChcclxuICAgICAgICAgICAgZmllbGQubmFtZSxcclxuICAgICAgICAgICAgbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGZpZWxkLmRlZmF1bHRWYWx1ZSwgZGlzYWJsZWQ6IGZpZWxkLnJlYWRvbmx5IH0sIHRoaXMuYnVpbGRWYWxpZGF0b3JzKGZpZWxkKSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpZWxkc1xyXG4gICAgICA/LmZpbHRlcigoZmllbGQpID0+IGZpZWxkLmRlcGVuZGVuY2llcylcclxuICAgICAgLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgZmllbGQuZGVwZW5kZW5jaWVzPy5mb3JFYWNoKChkZXBlbmRlbmN5KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpZWxkc1N1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChkZXBlbmRlbmN5KT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LnJlc2V0KCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBhdGNoRm9ybUZyb21RdWVyeVBhcmFtcyh7IC4uLnRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkcz8ubGVuZ3RoICYmIHRoaXMuZm9ybUdyb3VwLnZhbGlkICYmIGlzRmlyc3RTZXQpIHtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybUJ1aWxkZWQuZW1pdCgpO1xyXG5cclxuICAgIHRoaXMuZmllbGRzU3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHF1ZXJ5UGFyYW1zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wYXRjaEZvcm1Gcm9tUXVlcnlQYXJhbXMoeyAuLi5xdWVyeVBhcmFtcyB9KTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBvblNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBmb3JtQnVpbGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGdldCBmaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpZWxkVHlwZXMgPSBGaWVsZFR5cGU7XHJcbiAgcHVibGljIGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHByaXZhdGUgX2ZpZWxkczogRmlsdGVyRmllbGRbXSA9IFtdO1xyXG4gIHByaXZhdGUgZmllbGRzU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICBnZXQgaGlkZUZpbHRlcnMoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuZmllbGRzPy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmhpZGRlbikubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmZpZWxkc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlYXJjaCgpIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgIE9iamVjdC5rZXlzKGZpbHRlclZhbHVlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBpZiAoZmlsdGVyVmFsdWVba2V5XT8uaGFzT3duUHJvcGVydHkoJ2NvZGUnKSkge1xyXG4gICAgICAgICAgZmlsdGVyVmFsdWVba2V5XSA9IGZpbHRlclZhbHVlW2tleV0uY29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFPYmplY3RVdGlsLmlzVmFsaWQoZmlsdGVyVmFsdWVba2V5XSkpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMuZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBrZXkpPy50eXBlID8/IEZpZWxkVHlwZS5URVhUO1xyXG4gICAgICAgICAgZmlsdGVyVmFsdWVba2V5XSA9IFtGaWVsZFR5cGUuRFJPUERPV04sIEZpZWxkVHlwZS5OVU1CRVJdLmluY2x1ZGVzKGZpZWxkVHlwZSkgPyAtMSA6ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMub25TZWFyY2guZW1pdChmaWx0ZXJWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNUZXh0RmllbGRUeXBlKGZpZWxkOiBGaWx0ZXJGaWVsZCkge1xyXG4gICAgcmV0dXJuIFtGaWVsZFR5cGUuVEVYVCwgRmllbGRUeXBlLk5VTUJFUl0uaW5jbHVkZXMoZmllbGQudHlwZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RmllbGREZXBlbmRlbmNpZXMoZmllbGQ6IEZpbHRlckZpZWxkKSB7XHJcbiAgICBpZiAoIWZpZWxkLmRlcGVuZGVuY2llcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkLmRlcGVuZGVuY2llcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcclxuICAgICAgbGV0IGRlcFZhbHVlOiBhbnkgPSB0aGlzLmZvcm1Hcm91cC5nZXQoY3Vycik/LnZhbHVlPy5jb2RlO1xyXG4gICAgICBpZiAoIU9iamVjdFV0aWwuaXNWYWxpZChkZXBWYWx1ZSkpIHtcclxuICAgICAgICBkZXBWYWx1ZSA9IC0xO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ucHJldixcclxuICAgICAgICBbY3Vycl06IGRlcFZhbHVlLFxyXG4gICAgICB9O1xyXG4gICAgfSwge30pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEdyaWRDbGFzcyhmaWVsZDogRmlsdGVyRmllbGQpIHtcclxuICAgIHN3aXRjaCAoZmllbGQuc2l6ZSkge1xyXG4gICAgICBjYXNlICdzbWFsbCc6XHJcbiAgICAgICAgcmV0dXJuICdtZDpjb2wtMSc7XHJcbiAgICAgIGNhc2UgJ21lZGl1bSc6XHJcbiAgICAgICAgcmV0dXJuICdtZDpjb2wtMyc7XHJcbiAgICAgIGNhc2UgJ2xhcmdlJzpcclxuICAgICAgICByZXR1cm4gJ21kOmNvbC00JztcclxuICAgICAgY2FzZSAnbGFyZ2VzdCc6XHJcbiAgICAgICAgcmV0dXJuICdtZDpjb2wtOCc7XHJcbiAgICAgIGNhc2UgJ2Z1bGwnOlxyXG4gICAgICAgIHJldHVybiAnbWQ6Y29sLTEyJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ21kOmNvbC00JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGF0Y2hGb3JtRnJvbVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zOiBhbnkpIHtcclxuICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmhhc093blByb3BlcnR5KGZpZWxkLm5hbWUpKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXSA9IHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdXHJcbiAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdKVxyXG4gICAgICAgICAgICAgIDogcXVlcnlQYXJhbXNbZmllbGQubmFtZV07XHJcbiAgICAgICAgICB9IGNhdGNoIChfKSB7fVxyXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IEZpZWxkVHlwZS5EQVRFX1JBTkdFKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdID0ge1xyXG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZTogcXVlcnlQYXJhbXNbZmllbGQubmFtZV0uc3RhcnREYXRlID8gbmV3IERhdGUocXVlcnlQYXJhbXNbZmllbGQubmFtZV0uc3RhcnREYXRlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICBlbmREYXRlOiBxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXS5lbmREYXRlID8gbmV3IERhdGUocXVlcnlQYXJhbXNbZmllbGQubmFtZV0uZW5kRGF0ZSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLkRBVEUpIHtcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXNbZmllbGQubmFtZV0gPSBxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXSA/IG5ldyBEYXRlKHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHF1ZXJ5UGFyYW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRWYWxpZGF0b3JzKGZpZWxkOiBGaWx0ZXJGaWVsZCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgaWYgKGZpZWxkLnJlcXVpcmVkKSB7XHJcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuICAgIGlmIChmaWVsZC5taW5MZW5ndGgpIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGZpZWxkLm1pbkxlbmd0aCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpZWxkLm1heExlbmd0aCkge1xyXG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoZmllbGQubWF4TGVuZ3RoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZmllbGQubWluKSB7XHJcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihmaWVsZC5taW4pKTtcclxuICAgIH1cclxuICAgIGlmIChmaWVsZC5tYXgpIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGZpZWxkLm1heCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJncmlkIGZpbHRlci1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ICdkaXNwbGF5LW5vbmUnOiBoaWRlRmlsdGVycyB9XCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHMgfCBub3RIaWRkZW5cIiBjbGFzcz1cImZpZWxkIGNvbC0xMiBzbTpjb2wtOCB7eyBnZXRHcmlkQ2xhc3MoZmllbGQpIH19XCI+XHJcbiAgICA8bGFiZWw+e3sgZmllbGQubGFiZWwgfX0gPGkgKm5nSWY9XCJmaWVsZC50b29sdGlwXCIgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGUgbXQtMSBwbC0yIGNoXCIgcFRvb2x0aXA9XCJ7eyBmaWVsZC50b29sdGlwIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+PC9pPjwvbGFiZWw+XHJcbiAgICA8dmVjdG9yLXRleHQtZmllbGRcclxuICAgICAgKm5nSWY9XCJpc1RleHRGaWVsZFR5cGUoZmllbGQpXCJcclxuICAgICAgW2NvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKVwiXHJcbiAgICAgIFttYXNrXT1cImZpZWxkLm1hc2tcIlxyXG4gICAgICBbbGFiZWxdPVwiZmllbGQucGxhY2Vob2xkZXJcIlxyXG4gICAgICBbaXNSZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXHJcbiAgICAgIFtudW1lcmljXT1cImZpZWxkLnR5cGUgPT09IGZpZWxkVHlwZXMuTlVNQkVSXCJcclxuICAgID48L3ZlY3Rvci10ZXh0LWZpZWxkPlxyXG4gICAgPHZlY3Rvci1kcm9wZG93bi1maWVsZFxyXG4gICAgICAqbmdJZj1cIltmaWVsZFR5cGVzLkRZTkFNSUNfRFJPUERPV04sIGZpZWxkVHlwZXMuRFJPUERPV05dLmluY2x1ZGVzKGZpZWxkLnR5cGUpXCJcclxuICAgICAgW2R5bmFtaWNGaWx0ZXJzXT1cImZpZWxkLmZpbHRlclR5cGVzXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkXCJcclxuICAgICAgW29wdGlvbnNdPVwiZmllbGQub3B0aW9ucyB8fCBbXVwiXHJcbiAgICAgIFtzZXJ2aWNlXT1cImZpZWxkLnNlcnZpY2VcIlxyXG4gICAgICBbaXNSZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXHJcbiAgICAgIFttaW5MZW5ndGhUb1NlcnZpY2VdPVwiZmllbGQubWluTGVuZ3RoVG9TZXJ2aWNlIHx8IDBcIlxyXG4gICAgICBbY29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpXCJcclxuICAgICAgW3BhZ2VkXT1cImZhbHNlXCJcclxuICAgICAgW2RlcGVuZGVuY2llc109XCJnZXRGaWVsZERlcGVuZGVuY2llcyhmaWVsZClcIlxyXG4gICAgICBbaW5pdGlhbExvYWRdPVwiZmllbGQuaW5pdGlhdGVWYWx1ZVwiXHJcbiAgICA+PC92ZWN0b3ItZHJvcGRvd24tZmllbGQ+XHJcbiAgICA8dmVjdG9yLWN1cnJlbmN5LWZpZWxkXHJcbiAgICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5DVVJSRU5DWVwiXHJcbiAgICAgIFtjb250cm9sXT1cImZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSlcIlxyXG4gICAgICBbb3V0bGluZWRdPVwidHJ1ZVwiXHJcbiAgICA+PC92ZWN0b3ItY3VycmVuY3ktZmllbGQ+XHJcbiAgICA8dmVjdG9yLWNhbGVuZGFyLWZpZWxkXHJcbiAgICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5EQVRFXCJcclxuICAgICAgW2NvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKVwiXHJcbiAgICAgIFtpc1JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcclxuICAgICAgW2xhYmVsXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcclxuICAgID48L3ZlY3Rvci1jYWxlbmRhci1maWVsZD5cclxuICAgIDx2ZWN0b3Itc2VsZWN0LWJ1dHRvbi1maWVsZFxyXG4gICAgICAqbmdJZj1cImZpZWxkLnR5cGUgPT09IGZpZWxkVHlwZXMuU0VMRUNUX0JVVFRPTlwiXHJcbiAgICAgIFtjb250cm9sXT1cImZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSlcIlxyXG4gICAgICBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCJcclxuICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcclxuICAgID5cclxuICAgIDwvdmVjdG9yLXNlbGVjdC1idXR0b24tZmllbGQ+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5EQVRFX1JBTkdFXCIgY2xhc3M9XCJyYW5nZS1kYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICA8dmVjdG9yLWNhbGVuZGFyLWZpZWxkXHJcbiAgICAgICAgW2NvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lICsgJy5zdGFydERhdGUnKVwiXHJcbiAgICAgICAgW2lzUmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxyXG4gICAgICAgIFtsYWJlbF09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgID48L3ZlY3Rvci1jYWxlbmRhci1maWVsZD5cclxuICAgICAgQXTDqVxyXG4gICAgICA8dmVjdG9yLWNhbGVuZGFyLWZpZWxkXHJcbiAgICAgICAgW2NvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lICsgJy5lbmREYXRlJylcIlxyXG4gICAgICAgIFtpc1JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcclxuICAgICAgICBbbGFiZWxdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxyXG4gICAgICA+PC92ZWN0b3ItY2FsZW5kYXItZmllbGQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx2ZWN0b3ItbXVsdGlzZWxlY3QtZmllbGRcclxuICAgICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSBmaWVsZFR5cGVzLk1VTFRJU0VMRUNUXCJcclxuICAgICAgW2NvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKVwiXHJcbiAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnMgfHwgW11cIlxyXG4gICAgPlxyXG4gICAgPC92ZWN0b3ItbXVsdGlzZWxlY3QtZmllbGQ+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInNlYXJjaC1idXR0b24gc206Y29sLTRcIj5cclxuICAgIDx2ZWN0b3ItYnV0dG9uXHJcbiAgICAgIFtsYWJlbF09XCInYXBwLmxhYmVsLnNlYXJjaCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAoY2xpY2spPVwic2VhcmNoKClcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIWZvcm1Hcm91cC52YWxpZFwiXHJcbiAgICA+PC92ZWN0b3ItYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
3
+ import { Subscription } from 'rxjs';
4
+ import { ObjectUtil, ValidationUtil } from '../../../utils';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/router";
7
+ import * as i2 from "../text-field/text-field.component";
8
+ import * as i3 from "../dropdown-field/dropdown-field.component";
9
+ import * as i4 from "../currency-field/currency-field.component";
10
+ import * as i5 from "../calendar-field/calendar-field.component";
11
+ import * as i6 from "../select-button-field/select-button-field.component";
12
+ import * as i7 from "../multiselect-field/multiselect-field.component";
13
+ import * as i8 from "../button/button.component";
14
+ import * as i9 from "@angular/common";
15
+ import * as i10 from "@angular/forms";
16
+ import * as i11 from "primeng/tooltip";
17
+ import * as i12 from "../../../pipes/not-hidden.pipe";
18
+ import * as i13 from "@ngx-translate/core";
19
+ export var FieldType;
20
+ (function (FieldType) {
21
+ FieldType[FieldType["DROPDOWN"] = 0] = "DROPDOWN";
22
+ FieldType[FieldType["TEXT"] = 1] = "TEXT";
23
+ FieldType[FieldType["DATE"] = 2] = "DATE";
24
+ FieldType[FieldType["NUMBER"] = 3] = "NUMBER";
25
+ FieldType[FieldType["CURRENCY"] = 4] = "CURRENCY";
26
+ FieldType[FieldType["DYNAMIC_DROPDOWN"] = 5] = "DYNAMIC_DROPDOWN";
27
+ FieldType[FieldType["SELECT_BUTTON"] = 6] = "SELECT_BUTTON";
28
+ FieldType[FieldType["DATE_RANGE"] = 7] = "DATE_RANGE";
29
+ FieldType[FieldType["MULTISELECT"] = 8] = "MULTISELECT";
30
+ })(FieldType || (FieldType = {}));
31
+ export class FiltersComponent {
32
+ constructor(activatedRoute) {
33
+ this.activatedRoute = activatedRoute;
34
+ this.onSearch = new EventEmitter();
35
+ this.formBuilded = new EventEmitter();
36
+ this.fieldTypes = FieldType;
37
+ this.formGroup = new FormGroup({});
38
+ this._fields = [];
39
+ this.fieldsSubscription = new Subscription();
40
+ }
41
+ set fields(_fields) {
42
+ const isFirstSet = !this._fields.length && _fields?.length;
43
+ this._fields = _fields;
44
+ this.formGroup = new FormGroup({});
45
+ this.fieldsSubscription.unsubscribe();
46
+ this.fieldsSubscription = new Subscription();
47
+ this.fields?.forEach((field) => {
48
+ if (field?.defaultValue && typeof field?.defaultValue === 'object') {
49
+ field.initiateValue = !!field.defaultValue?.code;
50
+ }
51
+ else {
52
+ field.initiateValue = !!field.defaultValue;
53
+ }
54
+ if (field.type === FieldType.DATE_RANGE) {
55
+ this.formGroup.addControl(field.name, new FormGroup({
56
+ startDate: new FormControl({ value: field.defaultValue?.startDate, disabled: field.readonly }, [
57
+ ...this.buildValidators(field),
58
+ ValidationUtil.lowerThanOrEqualTo('endDate'),
59
+ ]),
60
+ endDate: new FormControl({ value: field.defaultValue?.endDate, disabled: field.readonly }, [
61
+ ...this.buildValidators(field),
62
+ ValidationUtil.greaterThanOrEqualTo('startDate'),
63
+ ]),
64
+ }));
65
+ }
66
+ else {
67
+ if (field.controler) {
68
+ this.formGroup.addControl(field.name, field.controler);
69
+ }
70
+ else {
71
+ this.formGroup.addControl(field.name, new FormControl({ value: field.defaultValue, disabled: field.readonly }, this.buildValidators(field)));
72
+ }
73
+ }
74
+ });
75
+ this.fields
76
+ ?.filter((field) => field.dependencies)
77
+ .forEach((field) => {
78
+ field.dependencies?.forEach((dependency) => {
79
+ this.fieldsSubscription.add(this.formGroup.get(dependency)?.valueChanges.subscribe((value) => {
80
+ this.formGroup.get(field.name)?.reset();
81
+ }));
82
+ });
83
+ });
84
+ this.patchFormFromQueryParams({ ...this.activatedRoute.snapshot.queryParams });
85
+ if (this._fields?.length && this.formGroup.valid && isFirstSet) {
86
+ this.search();
87
+ }
88
+ this.formBuilded.emit();
89
+ this.fieldsSubscription.add(this.activatedRoute.queryParams.subscribe((queryParams) => {
90
+ this.patchFormFromQueryParams({ ...queryParams });
91
+ }));
92
+ }
93
+ get fields() {
94
+ return this._fields;
95
+ }
96
+ get hideFilters() {
97
+ return !this.fields?.filter((item) => !item.hidden).length;
98
+ }
99
+ ngOnInit() { }
100
+ ngOnDestroy() {
101
+ this.fieldsSubscription.unsubscribe();
102
+ }
103
+ search() {
104
+ this.formGroup.markAllAsTouched();
105
+ if (this.formGroup.valid) {
106
+ const filterValue = this.formGroup.getRawValue();
107
+ Object.keys(filterValue).forEach((key) => {
108
+ if (filterValue[key]?.hasOwnProperty('code')) {
109
+ filterValue[key] = filterValue[key].code;
110
+ }
111
+ if (!ObjectUtil.isValid(filterValue[key])) {
112
+ const fieldType = this.fields.find((field) => field.name === key)?.type ?? FieldType.TEXT;
113
+ filterValue[key] = [FieldType.DROPDOWN, FieldType.NUMBER].includes(fieldType) ? -1 : '';
114
+ }
115
+ });
116
+ this.onSearch.emit(filterValue);
117
+ }
118
+ }
119
+ isTextFieldType(field) {
120
+ return [FieldType.TEXT, FieldType.NUMBER].includes(field.type);
121
+ }
122
+ getFieldDependencies(field) {
123
+ if (!field.dependencies) {
124
+ return undefined;
125
+ }
126
+ return field.dependencies.reduce((prev, curr) => {
127
+ let depValue = this.formGroup.get(curr)?.value?.code;
128
+ if (!ObjectUtil.isValid(depValue)) {
129
+ depValue = -1;
130
+ }
131
+ return {
132
+ ...prev,
133
+ [curr]: depValue,
134
+ };
135
+ }, {});
136
+ }
137
+ getGridClass(field) {
138
+ switch (field.size) {
139
+ case 'small':
140
+ return 'md:col-1';
141
+ case 'medium':
142
+ return 'md:col-3';
143
+ case 'large':
144
+ return 'md:col-4';
145
+ case 'largest':
146
+ return 'md:col-8';
147
+ case 'full':
148
+ return 'md:col-12';
149
+ default:
150
+ return 'md:col-4';
151
+ }
152
+ }
153
+ patchFormFromQueryParams(queryParams) {
154
+ if (Object.keys(queryParams).length) {
155
+ this.fields.forEach((field) => {
156
+ if (queryParams.hasOwnProperty(field.name)) {
157
+ try {
158
+ queryParams[field.name] = queryParams[field.name]
159
+ ? JSON.parse(queryParams[field.name])
160
+ : queryParams[field.name];
161
+ }
162
+ catch (_) { }
163
+ if (field.type === FieldType.DATE_RANGE) {
164
+ queryParams[field.name] = {
165
+ startDate: queryParams[field.name].startDate ? new Date(queryParams[field.name].startDate) : undefined,
166
+ endDate: queryParams[field.name].endDate ? new Date(queryParams[field.name].endDate) : undefined,
167
+ };
168
+ }
169
+ if (field.type === FieldType.DATE) {
170
+ queryParams[field.name] = queryParams[field.name] ? new Date(queryParams[field.name]) : undefined;
171
+ }
172
+ }
173
+ });
174
+ this.formGroup.patchValue(queryParams);
175
+ }
176
+ }
177
+ buildValidators(field) {
178
+ const validators = [];
179
+ if (field.required) {
180
+ validators.push(Validators.required);
181
+ }
182
+ if (field.minLength) {
183
+ validators.push(Validators.minLength(field.minLength));
184
+ }
185
+ if (field.maxLength) {
186
+ validators.push(Validators.maxLength(field.maxLength));
187
+ }
188
+ if (field.min) {
189
+ validators.push(Validators.min(field.min));
190
+ }
191
+ if (field.max) {
192
+ validators.push(Validators.max(field.max));
193
+ }
194
+ return validators;
195
+ }
196
+ }
197
+ FiltersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FiltersComponent, deps: [{ token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
198
+ FiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: FiltersComponent, selector: "vector-filters", inputs: { fields: "fields" }, outputs: { onSearch: "onSearch", formBuilded: "formBuilded" }, ngImport: i0, template: "<div class=\"grid filter-container\" [ngClass]=\"{ 'display-none': hideFilters }\" [formGroup]=\"formGroup\">\n <div *ngFor=\"let field of fields | notHidden\" class=\"field col-12 sm:col-8 {{ getGridClass(field) }}\">\n <label>{{ field.label }} <i *ngIf=\"field.tooltip\" class=\"fas fa-info-circle mt-1 pl-2 ch\" pTooltip=\"{{ field.tooltip }}\" tooltipPosition=\"bottom\"></i></label>\n <vector-text-field\n *ngIf=\"isTextFieldType(field)\"\n [control]=\"formGroup.get(field.name)\"\n [mask]=\"field.mask\"\n [label]=\"field.placeholder\"\n [isRequired]=\"field.required\"\n [numeric]=\"field.type === fieldTypes.NUMBER\"\n ></vector-text-field>\n <vector-dropdown-field\n *ngIf=\"[fieldTypes.DYNAMIC_DROPDOWN, fieldTypes.DROPDOWN].includes(field.type)\"\n [dynamicFilters]=\"field.filterTypes\"\n [disabled]=\"field.disabled\"\n [options]=\"field.options || []\"\n [service]=\"field.service\"\n [isRequired]=\"field.required\"\n [minLengthToService]=\"field.minLengthToService || 0\"\n [control]=\"formGroup.get(field.name)\"\n [paged]=\"false\"\n [dependencies]=\"getFieldDependencies(field)\"\n [initialLoad]=\"field.initiateValue\"\n ></vector-dropdown-field>\n <vector-currency-field\n *ngIf=\"field.type === fieldTypes.CURRENCY\"\n [control]=\"formGroup.get(field.name)\"\n [outlined]=\"true\"\n ></vector-currency-field>\n <vector-calendar-field\n *ngIf=\"field.type === fieldTypes.DATE\"\n [control]=\"formGroup.get(field.name)\"\n [isRequired]=\"field.required\"\n [label]=\"field.placeholder || ''\"\n ></vector-calendar-field>\n <vector-select-button-field\n *ngIf=\"field.type === fieldTypes.SELECT_BUTTON\"\n [control]=\"formGroup.get(field.name)\"\n [options]=\"field.options\"\n (click)=\"search()\"\n >\n </vector-select-button-field>\n <div *ngIf=\"field.type === fieldTypes.DATE_RANGE\" class=\"range-date-container\">\n <vector-calendar-field\n [control]=\"formGroup.get(field.name + '.startDate')\"\n [isRequired]=\"field.required\"\n [label]=\"field.placeholder || ''\"\n ></vector-calendar-field>\n At\u00E9\n <vector-calendar-field\n [control]=\"formGroup.get(field.name + '.endDate')\"\n [isRequired]=\"field.required\"\n [label]=\"field.placeholder || ''\"\n ></vector-calendar-field>\n </div>\n <vector-multiselect-field\n *ngIf=\"field.type === fieldTypes.MULTISELECT\"\n [control]=\"formGroup.get(field.name)\"\n [options]=\"field.options || []\"\n >\n </vector-multiselect-field>\n </div>\n <div class=\"search-button sm:col-4\">\n <vector-button\n [label]=\"'app.label.search' | translate\"\n (click)=\"search()\"\n [disabled]=\"!formGroup.valid\"\n ></vector-button>\n </div>\n</div>\n", styles: [".filter-container{align-items:center}.filter-container .field{display:flex;flex-direction:column}.filter-container .search-button{flex:1;padding-right:7px;display:flex;justify-content:flex-end}@media (min-width: 768px){.filter-container .search-button{padding-top:36px}}.filter-container .range-date-container{display:flex;align-items:center;gap:10px}.display-none{display:none!important}\n"], components: [{ type: i2.TextFieldComponent, selector: "vector-text-field", inputs: ["isRequired", "label", "maxlength", "isPassword", "numeric", "numericPositive", "decimal", "onlyText", "alphaNumeric", "alphaNumericAndWhitespace", "mask", "autoClear", "readonly", "rightIcon", "centered", "enableDocumentTypeChoice", "hiddenErrorMessage", "leftLabel", "control", "inputId", "slotChar"], outputs: ["blurEvent", "enterKeyPress", "backSpaceKeyPress", "focusEvent", "onDocumentTypeChange"] }, { type: i3.DropdownFieldComponent, selector: "vector-dropdown-field", inputs: ["options", "isNgContent", "isRequired", "control", "label", "service", "paged", "buttonAction", "dependencies", "hiddenErrorMessage", "dynamicFilters", "minLengthToService", "initialLoad", "disabled"], outputs: ["onFocus", "onChange"] }, { type: i4.CurrencyFieldComponent, selector: "vector-currency-field", inputs: ["minValue", "maxValue", "placeholder", "numberOfDecimals", "control", "outlined", "rounded", "label", "isBankingField", "inputClassName", "localePrefix", "currencyPrefix", "disabled", "centered"] }, { type: i5.CalendarComponent, selector: "vector-calendar-field", inputs: ["isRequired", "control", "label", "showCalendarOnFocus", "min", "max", "disabledDates", "disabled", "defaultDate", "hiddenErrorMessage"] }, { type: i6.SelectButtonFieldComponent, selector: "vector-select-button-field", inputs: ["options", "control"] }, { type: i7.MultiselectFieldComponent, selector: "vector-multiselect-field", inputs: ["pagedSugestion", "isRequired", "control", "label", "options", "filter", "showSelectAllOption", "display", "paged", "minLengthToService", "initialLoad", "service", "filterVirtualScrool"], outputs: ["onChange", "onClosePanel"] }, { type: i8.ButtonComponent, selector: "vector-button", inputs: ["disabled", "label", "type", "leftIcon", "rightIcon", "noShadow", "style"], outputs: ["onClick"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }], pipes: { "notHidden": i12.NotHiddenPipe, "translate": i13.TranslatePipe } });
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FiltersComponent, decorators: [{
200
+ type: Component,
201
+ args: [{ selector: 'vector-filters', template: "<div class=\"grid filter-container\" [ngClass]=\"{ 'display-none': hideFilters }\" [formGroup]=\"formGroup\">\n <div *ngFor=\"let field of fields | notHidden\" class=\"field col-12 sm:col-8 {{ getGridClass(field) }}\">\n <label>{{ field.label }} <i *ngIf=\"field.tooltip\" class=\"fas fa-info-circle mt-1 pl-2 ch\" pTooltip=\"{{ field.tooltip }}\" tooltipPosition=\"bottom\"></i></label>\n <vector-text-field\n *ngIf=\"isTextFieldType(field)\"\n [control]=\"formGroup.get(field.name)\"\n [mask]=\"field.mask\"\n [label]=\"field.placeholder\"\n [isRequired]=\"field.required\"\n [numeric]=\"field.type === fieldTypes.NUMBER\"\n ></vector-text-field>\n <vector-dropdown-field\n *ngIf=\"[fieldTypes.DYNAMIC_DROPDOWN, fieldTypes.DROPDOWN].includes(field.type)\"\n [dynamicFilters]=\"field.filterTypes\"\n [disabled]=\"field.disabled\"\n [options]=\"field.options || []\"\n [service]=\"field.service\"\n [isRequired]=\"field.required\"\n [minLengthToService]=\"field.minLengthToService || 0\"\n [control]=\"formGroup.get(field.name)\"\n [paged]=\"false\"\n [dependencies]=\"getFieldDependencies(field)\"\n [initialLoad]=\"field.initiateValue\"\n ></vector-dropdown-field>\n <vector-currency-field\n *ngIf=\"field.type === fieldTypes.CURRENCY\"\n [control]=\"formGroup.get(field.name)\"\n [outlined]=\"true\"\n ></vector-currency-field>\n <vector-calendar-field\n *ngIf=\"field.type === fieldTypes.DATE\"\n [control]=\"formGroup.get(field.name)\"\n [isRequired]=\"field.required\"\n [label]=\"field.placeholder || ''\"\n ></vector-calendar-field>\n <vector-select-button-field\n *ngIf=\"field.type === fieldTypes.SELECT_BUTTON\"\n [control]=\"formGroup.get(field.name)\"\n [options]=\"field.options\"\n (click)=\"search()\"\n >\n </vector-select-button-field>\n <div *ngIf=\"field.type === fieldTypes.DATE_RANGE\" class=\"range-date-container\">\n <vector-calendar-field\n [control]=\"formGroup.get(field.name + '.startDate')\"\n [isRequired]=\"field.required\"\n [label]=\"field.placeholder || ''\"\n ></vector-calendar-field>\n At\u00E9\n <vector-calendar-field\n [control]=\"formGroup.get(field.name + '.endDate')\"\n [isRequired]=\"field.required\"\n [label]=\"field.placeholder || ''\"\n ></vector-calendar-field>\n </div>\n <vector-multiselect-field\n *ngIf=\"field.type === fieldTypes.MULTISELECT\"\n [control]=\"formGroup.get(field.name)\"\n [options]=\"field.options || []\"\n >\n </vector-multiselect-field>\n </div>\n <div class=\"search-button sm:col-4\">\n <vector-button\n [label]=\"'app.label.search' | translate\"\n (click)=\"search()\"\n [disabled]=\"!formGroup.valid\"\n ></vector-button>\n </div>\n</div>\n", styles: [".filter-container{align-items:center}.filter-container .field{display:flex;flex-direction:column}.filter-container .search-button{flex:1;padding-right:7px;display:flex;justify-content:flex-end}@media (min-width: 768px){.filter-container .search-button{padding-top:36px}}.filter-container .range-date-container{display:flex;align-items:center;gap:10px}.display-none{display:none!important}\n"] }]
202
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }]; }, propDecorators: { fields: [{
203
+ type: Input
204
+ }], onSearch: [{
205
+ type: Output
206
+ }], formBuilded: [{
207
+ type: Output
208
+ }] } });
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9maWx0ZXJzL2ZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZlY3Rvci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHMvZmlsdGVycy9maWx0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRTVELE1BQU0sQ0FBTixJQUFZLFNBVVg7QUFWRCxXQUFZLFNBQVM7SUFDbkIsaURBQVEsQ0FBQTtJQUNSLHlDQUFJLENBQUE7SUFDSix5Q0FBSSxDQUFBO0lBQ0osNkNBQU0sQ0FBQTtJQUNOLGlEQUFRLENBQUE7SUFDUixpRUFBZ0IsQ0FBQTtJQUNoQiwyREFBYSxDQUFBO0lBQ2IscURBQVUsQ0FBQTtJQUNWLHVEQUFXLENBQUE7QUFDYixDQUFDLEVBVlcsU0FBUyxLQUFULFNBQVMsUUFVcEI7QUFpQ0QsTUFBTSxPQUFPLGdCQUFnQjtJQXFGM0IsWUFBb0IsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBakIzQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVuQyxnQkFBVyxH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Z0I7cUdBTWYsTUFBTTtzQkFEaEIsS0FBSztnQkFtRUMsUUFBUTtzQkFEZCxNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBCYXNlRHJvcGRvd24gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBPYmplY3RVdGlsLCBWYWxpZGF0aW9uVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGVudW0gRmllbGRUeXBlIHtcbiAgRFJPUERPV04sXG4gIFRFWFQsXG4gIERBVEUsXG4gIE5VTUJFUixcbiAgQ1VSUkVOQ1ksXG4gIERZTkFNSUNfRFJPUERPV04sXG4gIFNFTEVDVF9CVVRUT04sXG4gIERBVEVfUkFOR0UsXG4gIE1VTFRJU0VMRUNULFxufVxuXG5leHBvcnQgdHlwZSBGaWx0ZXJGaWVsZCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBGaWVsZFR5cGU7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICByZWFkb25seT86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIG1hc2s/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBMaXN0SXRlbVtdO1xuICBmaWx0ZXJUeXBlcz86IExpc3RJdGVtW107XG4gIHNlcnZpY2U/OiBCYXNlRHJvcGRvd247XG4gIGRlZmF1bHRWYWx1ZT86IGFueTtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGhpZGRlbj86IGJvb2xlYW47XG4gIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdO1xuICBzaXplPzogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICdsYXJnZXN0JyB8ICdmdWxsJztcbiAgbWluTGVuZ3RoVG9TZXJ2aWNlPzogbnVtYmVyO1xuICBpbml0aWF0ZVZhbHVlPzogYm9vbGVhbjtcbiAgdG9vbHRpcD86IHN0cmluZztcbiAgY29udHJvbGVyPzogRm9ybUNvbnRyb2w7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2ZWN0b3ItZmlsdGVycycsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsdGVycy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpZWxkcyhfZmllbGRzOiBGaWx0ZXJGaWVsZFtdKSB7XG4gICAgY29uc3QgaXNGaXJzdFNldCA9ICF0aGlzLl9maWVsZHMubGVuZ3RoICYmIF9maWVsZHM/Lmxlbmd0aDtcbiAgICB0aGlzLl9maWVsZHMgPSBfZmllbGRzO1xuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgICB0aGlzLmZpZWxkc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZmllbGRzU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgdGhpcy5maWVsZHM/LmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQ/LmRlZmF1bHRWYWx1ZSAmJiB0eXBlb2YgZmllbGQ/LmRlZmF1bHRWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZmllbGQuaW5pdGlhdGVWYWx1ZSA9ICEhZmllbGQuZGVmYXVsdFZhbHVlPy5jb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGQuaW5pdGlhdGVWYWx1ZSA9ICEhZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IEZpZWxkVHlwZS5EQVRFX1JBTkdFKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGZpZWxkLmRlZmF1bHRWYWx1ZT8uc3RhcnREYXRlLCBkaXNhYmxlZDogZmllbGQucmVhZG9ubHkgfSwgW1xuICAgICAgICAgICAgICAuLi50aGlzLmJ1aWxkVmFsaWRhdG9ycyhmaWVsZCksXG4gICAgICAgICAgICAgIFZhbGlkYXRpb25VdGlsLmxvd2VyVGhhbk9yRXF1YWxUbygnZW5kRGF0ZScpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBlbmREYXRlOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogZmllbGQuZGVmYXVsdFZhbHVlPy5lbmREYXRlLCBkaXNhYmxlZDogZmllbGQucmVhZG9ubHkgfSwgW1xuICAgICAgICAgICAgICAuLi50aGlzLmJ1aWxkVmFsaWRhdG9ycyhmaWVsZCksXG4gICAgICAgICAgICAgIFZhbGlkYXRpb25VdGlsLmdyZWF0ZXJUaGFuT3JFcXVhbFRvKCdzdGFydERhdGUnKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQuY29udHJvbGVyKSB7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbChmaWVsZC5uYW1lLCBmaWVsZC5jb250cm9sZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGZpZWxkLmRlZmF1bHRWYWx1ZSwgZGlzYWJsZWQ6IGZpZWxkLnJlYWRvbmx5IH0sIHRoaXMuYnVpbGRWYWxpZGF0b3JzKGZpZWxkKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZpZWxkc1xuICAgICAgPy5maWx0ZXIoKGZpZWxkKSA9PiBmaWVsZC5kZXBlbmRlbmNpZXMpXG4gICAgICAuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgZmllbGQuZGVwZW5kZW5jaWVzPy5mb3JFYWNoKChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgdGhpcy5maWVsZHNTdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KGRlcGVuZGVuY3kpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LnJlc2V0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnBhdGNoRm9ybUZyb21RdWVyeVBhcmFtcyh7IC4uLnRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfSk7XG5cbiAgICBpZiAodGhpcy5fZmllbGRzPy5sZW5ndGggJiYgdGhpcy5mb3JtR3JvdXAudmFsaWQgJiYgaXNGaXJzdFNldCkge1xuICAgICAgdGhpcy5zZWFyY2goKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtQnVpbGRlZC5lbWl0KCk7XG5cbiAgICB0aGlzLmZpZWxkc1N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgdGhpcy5wYXRjaEZvcm1Gcm9tUXVlcnlQYXJhbXMoeyAuLi5xdWVyeVBhcmFtcyB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgcHVibGljIG9uU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZm9ybUJ1aWxkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBmaWVsZFR5cGVzID0gRmllbGRUeXBlO1xuICBwdWJsaWMgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIHByaXZhdGUgX2ZpZWxkczogRmlsdGVyRmllbGRbXSA9IFtdO1xuICBwcml2YXRlIGZpZWxkc1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBnZXQgaGlkZUZpbHRlcnMoKSB7XG4gICAgcmV0dXJuICF0aGlzLmZpZWxkcz8uZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5oaWRkZW4pLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmZpZWxkc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHNlYXJjaCgpIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgICBPYmplY3Qua2V5cyhmaWx0ZXJWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZVtrZXldPy5oYXNPd25Qcm9wZXJ0eSgnY29kZScpKSB7XG4gICAgICAgICAgZmlsdGVyVmFsdWVba2V5XSA9IGZpbHRlclZhbHVlW2tleV0uY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU9iamVjdFV0aWwuaXNWYWxpZChmaWx0ZXJWYWx1ZVtrZXldKSkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMuZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBrZXkpPy50eXBlID8/IEZpZWxkVHlwZS5URVhUO1xuICAgICAgICAgIGZpbHRlclZhbHVlW2tleV0gPSBbRmllbGRUeXBlLkRST1BET1dOLCBGaWVsZFR5cGUuTlVNQkVSXS5pbmNsdWRlcyhmaWVsZFR5cGUpID8gLTEgOiAnJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uU2VhcmNoLmVtaXQoZmlsdGVyVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1RleHRGaWVsZFR5cGUoZmllbGQ6IEZpbHRlckZpZWxkKSB7XG4gICAgcmV0dXJuIFtGaWVsZFR5cGUuVEVYVCwgRmllbGRUeXBlLk5VTUJFUl0uaW5jbHVkZXMoZmllbGQudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGREZXBlbmRlbmNpZXMoZmllbGQ6IEZpbHRlckZpZWxkKSB7XG4gICAgaWYgKCFmaWVsZC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZC5kZXBlbmRlbmNpZXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBsZXQgZGVwVmFsdWU6IGFueSA9IHRoaXMuZm9ybUdyb3VwLmdldChjdXJyKT8udmFsdWU/LmNvZGU7XG4gICAgICBpZiAoIU9iamVjdFV0aWwuaXNWYWxpZChkZXBWYWx1ZSkpIHtcbiAgICAgICAgZGVwVmFsdWUgPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtjdXJyXTogZGVwVmFsdWUsXG4gICAgICB9O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRHcmlkQ2xhc3MoZmllbGQ6IEZpbHRlckZpZWxkKSB7XG4gICAgc3dpdGNoIChmaWVsZC5zaXplKSB7XG4gICAgICBjYXNlICdzbWFsbCc6XG4gICAgICAgIHJldHVybiAnbWQ6Y29sLTEnO1xuICAgICAgY2FzZSAnbWVkaXVtJzpcbiAgICAgICAgcmV0dXJuICdtZDpjb2wtMyc7XG4gICAgICBjYXNlICdsYXJnZSc6XG4gICAgICAgIHJldHVybiAnbWQ6Y29sLTQnO1xuICAgICAgY2FzZSAnbGFyZ2VzdCc6XG4gICAgICAgIHJldHVybiAnbWQ6Y29sLTgnO1xuICAgICAgY2FzZSAnZnVsbCc6XG4gICAgICAgIHJldHVybiAnbWQ6Y29sLTEyJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbWQ6Y29sLTQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hGb3JtRnJvbVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zOiBhbnkpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmhhc093blByb3BlcnR5KGZpZWxkLm5hbWUpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdID0gcXVlcnlQYXJhbXNbZmllbGQubmFtZV1cbiAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdKVxuICAgICAgICAgICAgICA6IHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IEZpZWxkVHlwZS5EQVRFX1JBTkdFKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgc3RhcnREYXRlOiBxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXS5zdGFydERhdGUgPyBuZXcgRGF0ZShxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXS5zdGFydERhdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBlbmREYXRlOiBxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXS5lbmREYXRlID8gbmV3IERhdGUocXVlcnlQYXJhbXNbZmllbGQubmFtZV0uZW5kRGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLkRBVEUpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2ZpZWxkLm5hbWVdID0gcXVlcnlQYXJhbXNbZmllbGQubmFtZV0gPyBuZXcgRGF0ZShxdWVyeVBhcmFtc1tmaWVsZC5uYW1lXSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUocXVlcnlQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWYWxpZGF0b3JzKGZpZWxkOiBGaWx0ZXJGaWVsZCk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBpZiAoZmllbGQucmVxdWlyZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLm1pbkxlbmd0aCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGZpZWxkLm1pbkxlbmd0aCkpO1xuICAgIH1cbiAgICBpZiAoZmllbGQubWF4TGVuZ3RoKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoZmllbGQubWF4TGVuZ3RoKSk7XG4gICAgfVxuICAgIGlmIChmaWVsZC5taW4pIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihmaWVsZC5taW4pKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLm1heCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGZpZWxkLm1heCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImdyaWQgZmlsdGVyLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsgJ2Rpc3BsYXktbm9uZSc6IGhpZGVGaWx0ZXJzIH1cIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHMgfCBub3RIaWRkZW5cIiBjbGFzcz1cImZpZWxkIGNvbC0xMiBzbTpjb2wtOCB7eyBnZXRHcmlkQ2xhc3MoZmllbGQpIH19XCI+XG4gICAgPGxhYmVsPnt7IGZpZWxkLmxhYmVsIH19IDxpICpuZ0lmPVwiZmllbGQudG9vbHRpcFwiIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlIG10LTEgcGwtMiBjaFwiIHBUb29sdGlwPVwie3sgZmllbGQudG9vbHRpcCB9fVwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPjwvaT48L2xhYmVsPlxuICAgIDx2ZWN0b3ItdGV4dC1maWVsZFxuICAgICAgKm5nSWY9XCJpc1RleHRGaWVsZFR5cGUoZmllbGQpXCJcbiAgICAgIFtjb250cm9sXT1cImZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSlcIlxuICAgICAgW21hc2tdPVwiZmllbGQubWFza1wiXG4gICAgICBbbGFiZWxdPVwiZmllbGQucGxhY2Vob2xkZXJcIlxuICAgICAgW2lzUmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgW251bWVyaWNdPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5OVU1CRVJcIlxuICAgID48L3ZlY3Rvci10ZXh0LWZpZWxkPlxuICAgIDx2ZWN0b3ItZHJvcGRvd24tZmllbGRcbiAgICAgICpuZ0lmPVwiW2ZpZWxkVHlwZXMuRFlOQU1JQ19EUk9QRE9XTiwgZmllbGRUeXBlcy5EUk9QRE9XTl0uaW5jbHVkZXMoZmllbGQudHlwZSlcIlxuICAgICAgW2R5bmFtaWNGaWx0ZXJzXT1cImZpZWxkLmZpbHRlclR5cGVzXCJcbiAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiXG4gICAgICBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zIHx8IFtdXCJcbiAgICAgIFtzZXJ2aWNlXT1cImZpZWxkLnNlcnZpY2VcIlxuICAgICAgW2lzUmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgW21pbkxlbmd0aFRvU2VydmljZV09XCJmaWVsZC5taW5MZW5ndGhUb1NlcnZpY2UgfHwgMFwiXG4gICAgICBbY29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpXCJcbiAgICAgIFtwYWdlZF09XCJmYWxzZVwiXG4gICAgICBbZGVwZW5kZW5jaWVzXT1cImdldEZpZWxkRGVwZW5kZW5jaWVzKGZpZWxkKVwiXG4gICAgICBbaW5pdGlhbExvYWRdPVwiZmllbGQuaW5pdGlhdGVWYWx1ZVwiXG4gICAgPjwvdmVjdG9yLWRyb3Bkb3duLWZpZWxkPlxuICAgIDx2ZWN0b3ItY3VycmVuY3ktZmllbGRcbiAgICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5DVVJSRU5DWVwiXG4gICAgICBbY29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpXCJcbiAgICAgIFtvdXRsaW5lZF09XCJ0cnVlXCJcbiAgICA+PC92ZWN0b3ItY3VycmVuY3ktZmllbGQ+XG4gICAgPHZlY3Rvci1jYWxlbmRhci1maWVsZFxuICAgICAgKm5nSWY9XCJmaWVsZC50eXBlID09PSBmaWVsZFR5cGVzLkRBVEVcIlxuICAgICAgW2NvbnRyb2xdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKVwiXG4gICAgICBbaXNSZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICBbbGFiZWxdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgID48L3ZlY3Rvci1jYWxlbmRhci1maWVsZD5cbiAgICA8dmVjdG9yLXNlbGVjdC1idXR0b24tZmllbGRcbiAgICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5TRUxFQ1RfQlVUVE9OXCJcbiAgICAgIFtjb250cm9sXT1cImZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSlcIlxuICAgICAgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiXG4gICAgICAoY2xpY2spPVwic2VhcmNoKClcIlxuICAgID5cbiAgICA8L3ZlY3Rvci1zZWxlY3QtYnV0dG9uLWZpZWxkPlxuICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSBmaWVsZFR5cGVzLkRBVEVfUkFOR0VcIiBjbGFzcz1cInJhbmdlLWRhdGUtY29udGFpbmVyXCI+XG4gICAgICA8dmVjdG9yLWNhbGVuZGFyLWZpZWxkXG4gICAgICAgIFtjb250cm9sXT1cImZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSArICcuc3RhcnREYXRlJylcIlxuICAgICAgICBbaXNSZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgIFtsYWJlbF09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICA+PC92ZWN0b3ItY2FsZW5kYXItZmllbGQ+XG4gICAgICBBdMOpXG4gICAgICA8dmVjdG9yLWNhbGVuZGFyLWZpZWxkXG4gICAgICAgIFtjb250cm9sXT1cImZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSArICcuZW5kRGF0ZScpXCJcbiAgICAgICAgW2lzUmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICBbbGFiZWxdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgPjwvdmVjdG9yLWNhbGVuZGFyLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDx2ZWN0b3ItbXVsdGlzZWxlY3QtZmllbGRcbiAgICAgICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gZmllbGRUeXBlcy5NVUxUSVNFTEVDVFwiXG4gICAgICBbY29udHJvbF09XCJmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpXCJcbiAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnMgfHwgW11cIlxuICAgID5cbiAgICA8L3ZlY3Rvci1tdWx0aXNlbGVjdC1maWVsZD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzZWFyY2gtYnV0dG9uIHNtOmNvbC00XCI+XG4gICAgPHZlY3Rvci1idXR0b25cbiAgICAgIFtsYWJlbF09XCInYXBwLmxhYmVsLnNlYXJjaCcgfCB0cmFuc2xhdGVcIlxuICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhZm9ybUdyb3VwLnZhbGlkXCJcbiAgICA+PC92ZWN0b3ItYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,2 +1,2 @@
1
- export * from './filters.component';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9maWx0ZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ZpbHRlcnMuY29tcG9uZW50JztcclxuIl19
1
+ export * from './filters.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmVjdG9yLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkcy9maWx0ZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ZpbHRlcnMuY29tcG9uZW50JztcbiJdfQ==