@ecodev/natural 41.3.0 → 42.2.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 (350) hide show
  1. package/ecodev-natural.d.ts +1 -9
  2. package/esm2020/ecodev-natural.mjs +5 -0
  3. package/esm2020/lib/classes/abstract-controller.mjs +30 -0
  4. package/esm2020/lib/classes/abstract-detail.mjs +152 -0
  5. package/esm2020/lib/classes/abstract-editable-list.mjs +96 -0
  6. package/esm2020/lib/classes/abstract-list.mjs +406 -0
  7. package/esm2020/lib/classes/abstract-navigable-list.mjs +126 -0
  8. package/{esm2015/lib/classes/apollo-utils.js → esm2020/lib/classes/apollo-utils.mjs} +0 -0
  9. package/esm2020/lib/classes/data-source.mjs +76 -0
  10. package/{esm2015/lib/classes/query-variable-manager-utils.js → esm2020/lib/classes/query-variable-manager-utils.mjs} +0 -0
  11. package/esm2020/lib/classes/query-variable-manager.mjs +172 -0
  12. package/{esm2015/lib/classes/rxjs.js → esm2020/lib/classes/rxjs.mjs} +0 -0
  13. package/{esm2015/lib/classes/tld.js → esm2020/lib/classes/tld.mjs} +0 -0
  14. package/{esm2015/lib/classes/utility.js → esm2020/lib/classes/utility.mjs} +0 -0
  15. package/esm2020/lib/classes/validators.mjs +179 -0
  16. package/esm2020/lib/directives/http-prefix.directive.mjs +50 -0
  17. package/esm2020/lib/modules/alert/alert.module.mjs +20 -0
  18. package/esm2020/lib/modules/alert/alert.service.mjs +55 -0
  19. package/esm2020/lib/modules/alert/confirm.component.mjs +20 -0
  20. package/{esm2015/lib/modules/alert/public-api.js → esm2020/lib/modules/alert/public-api.mjs} +0 -0
  21. package/esm2020/lib/modules/avatar/avatar.module.mjs +19 -0
  22. package/esm2020/lib/modules/avatar/component/avatar.component.mjs +190 -0
  23. package/{esm2015/lib/modules/avatar/public-api.js → esm2020/lib/modules/avatar/public-api.mjs} +0 -0
  24. package/esm2020/lib/modules/avatar/service/avatar.service.mjs +66 -0
  25. package/esm2020/lib/modules/avatar/sources/gravatar.mjs +29 -0
  26. package/{esm2015/lib/modules/avatar/sources/image.js → esm2020/lib/modules/avatar/sources/image.mjs} +0 -0
  27. package/{esm2015/lib/modules/avatar/sources/initials.js → esm2020/lib/modules/avatar/sources/initials.mjs} +0 -0
  28. package/{esm2015/lib/modules/avatar/sources/source.js → esm2020/lib/modules/avatar/sources/source.mjs} +1 -1
  29. package/esm2020/lib/modules/columns-picker/columns-picker-column.directive.mjs +43 -0
  30. package/esm2020/lib/modules/columns-picker/columns-picker.component.mjs +84 -0
  31. package/esm2020/lib/modules/columns-picker/columns-picker.module.mjs +47 -0
  32. package/{esm2015/lib/modules/columns-picker/public-api.js → esm2020/lib/modules/columns-picker/public-api.mjs} +0 -0
  33. package/esm2020/lib/modules/common/common-module.mjs +50 -0
  34. package/esm2020/lib/modules/common/directives/linkable-tab.directive.mjs +79 -0
  35. package/esm2020/lib/modules/common/directives/src-density.directive.mjs +62 -0
  36. package/esm2020/lib/modules/common/pipes/capitalize.pipe.mjs +18 -0
  37. package/esm2020/lib/modules/common/pipes/ellipsis.pipe.mjs +14 -0
  38. package/esm2020/lib/modules/common/pipes/enum.pipe.mjs +25 -0
  39. package/esm2020/lib/modules/common/pipes/swiss-date.pipe.mjs +20 -0
  40. package/esm2020/lib/modules/common/public-api.mjs +13 -0
  41. package/esm2020/lib/modules/common/services/memory-storage.mjs +112 -0
  42. package/esm2020/lib/modules/common/services/seo.service.mjs +114 -0
  43. package/esm2020/lib/modules/detail-header/detail-header.component.mjs +76 -0
  44. package/esm2020/lib/modules/detail-header/detail-header.module.mjs +21 -0
  45. package/{esm2015/lib/modules/detail-header/public-api.js → esm2020/lib/modules/detail-header/public-api.mjs} +0 -0
  46. package/esm2020/lib/modules/dialog-trigger/dialog-trigger.component.mjs +69 -0
  47. package/esm2020/lib/modules/dialog-trigger/dialog-trigger.module.mjs +19 -0
  48. package/{esm2015/lib/modules/dialog-trigger/public-api.js → esm2020/lib/modules/dialog-trigger/public-api.mjs} +0 -0
  49. package/esm2020/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +98 -0
  50. package/esm2020/lib/modules/dropdown-components/natural-dropdown-components.module.mjs +92 -0
  51. package/{esm2015/lib/modules/dropdown-components/public-api.js → esm2020/lib/modules/dropdown-components/public-api.mjs} +0 -0
  52. package/esm2020/lib/modules/dropdown-components/type-date/type-date.component.mjs +133 -0
  53. package/esm2020/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +137 -0
  54. package/esm2020/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +69 -0
  55. package/esm2020/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +38 -0
  56. package/esm2020/lib/modules/dropdown-components/type-number/type-number.component.mjs +104 -0
  57. package/esm2020/lib/modules/dropdown-components/type-select/type-select.component.mjs +169 -0
  58. package/esm2020/lib/modules/dropdown-components/type-text/type-text.component.mjs +57 -0
  59. package/{esm2015/lib/modules/dropdown-components/types.js → esm2020/lib/modules/dropdown-components/types.mjs} +0 -0
  60. package/{esm2015/lib/modules/dropdown-components/utils.js → esm2020/lib/modules/dropdown-components/utils.mjs} +0 -0
  61. package/esm2020/lib/modules/file/abstract-file.mjs +231 -0
  62. package/esm2020/lib/modules/file/component/file.component.mjs +143 -0
  63. package/esm2020/lib/modules/file/file-drop.directive.mjs +110 -0
  64. package/esm2020/lib/modules/file/file-select.directive.mjs +28 -0
  65. package/esm2020/lib/modules/file/file.module.mjs +24 -0
  66. package/esm2020/lib/modules/file/file.service.mjs +48 -0
  67. package/{esm2015/lib/modules/file/public-api.js → esm2020/lib/modules/file/public-api.mjs} +0 -0
  68. package/{esm2015/lib/modules/file/types.js → esm2020/lib/modules/file/types.mjs} +0 -0
  69. package/{esm2015/lib/modules/file/utils.js → esm2020/lib/modules/file/utils.mjs} +3 -4
  70. package/esm2020/lib/modules/fixed-button/fixed-button.component.mjs +27 -0
  71. package/esm2020/lib/modules/fixed-button/fixed-button.module.mjs +21 -0
  72. package/{esm2015/lib/modules/fixed-button/public-api.js → esm2020/lib/modules/fixed-button/public-api.mjs} +0 -0
  73. package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +36 -0
  74. package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.module.mjs +20 -0
  75. package/{esm2015/lib/modules/fixed-button-detail/public-api.js → esm2020/lib/modules/fixed-button-detail/public-api.mjs} +0 -0
  76. package/{esm2015/lib/modules/hierarchic-selector/classes/flat-node.js → esm2020/lib/modules/hierarchic-selector/classes/flat-node.mjs} +1 -1
  77. package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs} +0 -0
  78. package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs} +0 -0
  79. package/{esm2015/lib/modules/hierarchic-selector/classes/model-node.js → esm2020/lib/modules/hierarchic-selector/classes/model-node.mjs} +1 -1
  80. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +364 -0
  81. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +258 -0
  82. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +31 -0
  83. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +23 -0
  84. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector.module.mjs +81 -0
  85. package/{esm2015/lib/modules/hierarchic-selector/public-api.js → esm2020/lib/modules/hierarchic-selector/public-api.mjs} +0 -0
  86. package/esm2020/lib/modules/icon/icon.component.mjs +92 -0
  87. package/esm2020/lib/modules/icon/icon.module.mjs +30 -0
  88. package/{esm2015/lib/modules/icon/public-api.js → esm2020/lib/modules/icon/public-api.mjs} +0 -0
  89. package/esm2020/lib/modules/matomo/matomo-module.module.mjs +12 -0
  90. package/esm2020/lib/modules/matomo/matomo.service.mjs +105 -0
  91. package/{esm2015/lib/modules/matomo/public-api.js → esm2020/lib/modules/matomo/public-api.mjs} +0 -0
  92. package/esm2020/lib/modules/panels/abstract-panel.mjs +56 -0
  93. package/{esm2015/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.js → esm2020/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs} +0 -0
  94. package/esm2020/lib/modules/panels/panels.component.mjs +26 -0
  95. package/esm2020/lib/modules/panels/panels.module.mjs +33 -0
  96. package/esm2020/lib/modules/panels/panels.service.mjs +325 -0
  97. package/{esm2015/lib/modules/panels/panels.urlmatcher.js → esm2020/lib/modules/panels/panels.urlmatcher.mjs} +0 -0
  98. package/{esm2015/lib/modules/panels/public-api.js → esm2020/lib/modules/panels/public-api.mjs} +0 -0
  99. package/{esm2015/lib/modules/panels/types.js → esm2020/lib/modules/panels/types.mjs} +0 -0
  100. package/{esm2015/lib/modules/relations/public-api.js → esm2020/lib/modules/relations/public-api.mjs} +0 -0
  101. package/esm2020/lib/modules/relations/relations.component.mjs +198 -0
  102. package/esm2020/lib/modules/relations/relations.module.mjs +58 -0
  103. package/{esm2015/lib/modules/search/classes/graphql-doctrine.js → esm2020/lib/modules/search/classes/graphql-doctrine.mjs} +0 -0
  104. package/{esm2015/lib/modules/search/classes/graphql-doctrine.types.js → esm2020/lib/modules/search/classes/graphql-doctrine.types.mjs} +0 -0
  105. package/{esm2015/lib/modules/search/classes/transformers.js → esm2020/lib/modules/search/classes/transformers.mjs} +0 -0
  106. package/{esm2015/lib/modules/search/classes/url.js → esm2020/lib/modules/search/classes/url.mjs} +0 -0
  107. package/{esm2015/lib/modules/search/classes/utils.js → esm2020/lib/modules/search/classes/utils.mjs} +0 -0
  108. package/{esm2015/lib/modules/search/dropdown-container/dropdown-container-animations.js → esm2020/lib/modules/search/dropdown-container/dropdown-container-animations.mjs} +0 -0
  109. package/esm2020/lib/modules/search/dropdown-container/dropdown-container.component.mjs +88 -0
  110. package/{esm2015/lib/modules/search/dropdown-container/dropdown-ref.js → esm2020/lib/modules/search/dropdown-container/dropdown-ref.mjs} +1 -1
  111. package/esm2020/lib/modules/search/dropdown-container/dropdown.service.mjs +93 -0
  112. package/esm2020/lib/modules/search/facet-selector/facet-selector.component.mjs +50 -0
  113. package/esm2020/lib/modules/search/group/group.component.mjs +45 -0
  114. package/esm2020/lib/modules/search/input/input.component.mjs +328 -0
  115. package/{esm2015/lib/modules/search/public-api.js → esm2020/lib/modules/search/public-api.mjs} +0 -0
  116. package/esm2020/lib/modules/search/search/search.component.mjs +78 -0
  117. package/esm2020/lib/modules/search/search.module.mjs +84 -0
  118. package/{esm2015/lib/modules/search/types/dropdown-component.js → esm2020/lib/modules/search/types/dropdown-component.mjs} +0 -0
  119. package/{esm2015/lib/modules/search/types/facet.js → esm2020/lib/modules/search/types/facet.mjs} +0 -0
  120. package/{esm2015/lib/modules/search/types/values.js → esm2020/lib/modules/search/types/values.mjs} +0 -0
  121. package/esm2020/lib/modules/select/abstract-select.component.mjs +186 -0
  122. package/{esm2015/lib/modules/select/public-api.js → esm2020/lib/modules/select/public-api.mjs} +0 -0
  123. package/esm2020/lib/modules/select/select/select.component.mjs +207 -0
  124. package/esm2020/lib/modules/select/select-enum/select-enum.component.mjs +47 -0
  125. package/esm2020/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +127 -0
  126. package/esm2020/lib/modules/select/select.module.mjs +68 -0
  127. package/{esm2015/lib/modules/sidenav/public-api.js → esm2020/lib/modules/sidenav/public-api.mjs} +0 -0
  128. package/esm2020/lib/modules/sidenav/sidenav/sidenav.component.mjs +15 -0
  129. package/esm2020/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +87 -0
  130. package/esm2020/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +12 -0
  131. package/esm2020/lib/modules/sidenav/sidenav-stack.service.mjs +52 -0
  132. package/esm2020/lib/modules/sidenav/sidenav.module.mjs +25 -0
  133. package/esm2020/lib/modules/sidenav/sidenav.service.mjs +195 -0
  134. package/{esm2015/lib/modules/stamp/public-api.js → esm2020/lib/modules/stamp/public-api.mjs} +0 -0
  135. package/esm2020/lib/modules/stamp/stamp-module.module.mjs +18 -0
  136. package/esm2020/lib/modules/stamp/stamp.component.mjs +14 -0
  137. package/{esm2015/lib/modules/table-button/public-api.js → esm2020/lib/modules/table-button/public-api.mjs} +0 -0
  138. package/esm2020/lib/modules/table-button/table-button.component.mjs +48 -0
  139. package/esm2020/lib/modules/table-button/table-button.module.mjs +21 -0
  140. package/esm2020/lib/services/abstract-model.service.mjs +509 -0
  141. package/esm2020/lib/services/enum.service.mjs +67 -0
  142. package/esm2020/lib/services/link-mutation.service.mjs +153 -0
  143. package/esm2020/lib/services/persistence.service.mjs +113 -0
  144. package/esm2020/lib/services/swiss-parsing-date-adapter.service.mjs +55 -0
  145. package/{esm2015/lib/types/types.js → esm2020/lib/types/types.mjs} +0 -0
  146. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  147. package/fesm2015/{ecodev-natural.js → ecodev-natural.mjs} +2808 -2392
  148. package/fesm2015/ecodev-natural.mjs.map +1 -0
  149. package/fesm2020/ecodev-natural.mjs +10495 -0
  150. package/fesm2020/ecodev-natural.mjs.map +1 -0
  151. package/lib/classes/abstract-controller.d.ts +3 -0
  152. package/lib/classes/abstract-detail.d.ts +3 -0
  153. package/lib/classes/abstract-editable-list.d.ts +3 -0
  154. package/lib/classes/abstract-list.d.ts +3 -0
  155. package/lib/classes/abstract-navigable-list.d.ts +3 -0
  156. package/lib/classes/query-variable-manager.d.ts +19 -8
  157. package/lib/directives/http-prefix.directive.d.ts +3 -0
  158. package/lib/modules/alert/alert.module.d.ts +9 -0
  159. package/lib/modules/alert/alert.service.d.ts +3 -0
  160. package/lib/modules/alert/confirm.component.d.ts +3 -0
  161. package/lib/modules/avatar/avatar.module.d.ts +6 -0
  162. package/lib/modules/avatar/component/avatar.component.d.ts +4 -0
  163. package/lib/modules/avatar/service/avatar.service.d.ts +3 -0
  164. package/lib/modules/columns-picker/columns-picker-column.directive.d.ts +3 -0
  165. package/lib/modules/columns-picker/columns-picker.component.d.ts +3 -0
  166. package/lib/modules/columns-picker/columns-picker.module.d.ts +13 -0
  167. package/lib/modules/common/common-module.d.ts +15 -0
  168. package/lib/modules/common/directives/linkable-tab.directive.d.ts +3 -0
  169. package/lib/modules/common/directives/src-density.directive.d.ts +3 -0
  170. package/lib/modules/common/pipes/capitalize.pipe.d.ts +3 -0
  171. package/lib/modules/common/pipes/ellipsis.pipe.d.ts +3 -0
  172. package/lib/modules/common/pipes/enum.pipe.d.ts +3 -0
  173. package/lib/modules/common/pipes/swiss-date.pipe.d.ts +3 -0
  174. package/lib/modules/common/public-api.d.ts +0 -1
  175. package/lib/modules/common/services/memory-storage.d.ts +3 -0
  176. package/lib/modules/common/services/seo.service.d.ts +3 -0
  177. package/lib/modules/detail-header/detail-header.component.d.ts +3 -0
  178. package/lib/modules/detail-header/detail-header.module.d.ts +9 -0
  179. package/lib/modules/dialog-trigger/dialog-trigger.component.d.ts +3 -0
  180. package/lib/modules/dialog-trigger/dialog-trigger.module.d.ts +7 -0
  181. package/lib/modules/dropdown-components/abstract-association-select-component.directive.d.ts +3 -0
  182. package/lib/modules/dropdown-components/natural-dropdown-components.module.d.ts +22 -0
  183. package/lib/modules/dropdown-components/type-date/type-date.component.d.ts +3 -0
  184. package/lib/modules/dropdown-components/type-date-range/type-date-range.component.d.ts +3 -0
  185. package/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.d.ts +3 -0
  186. package/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.d.ts +3 -0
  187. package/lib/modules/dropdown-components/type-number/type-number.component.d.ts +3 -0
  188. package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +3 -0
  189. package/lib/modules/dropdown-components/type-text/type-text.component.d.ts +3 -0
  190. package/lib/modules/file/abstract-file.d.ts +3 -0
  191. package/lib/modules/file/component/file.component.d.ts +3 -0
  192. package/lib/modules/file/file-drop.directive.d.ts +3 -0
  193. package/lib/modules/file/file-select.directive.d.ts +3 -0
  194. package/lib/modules/file/file.module.d.ts +11 -0
  195. package/lib/modules/file/file.service.d.ts +3 -0
  196. package/lib/modules/fixed-button/fixed-button.component.d.ts +3 -0
  197. package/lib/modules/fixed-button/fixed-button.module.d.ts +9 -0
  198. package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +3 -0
  199. package/lib/modules/fixed-button-detail/fixed-button-detail.module.d.ts +8 -0
  200. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -0
  201. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.d.ts +3 -0
  202. package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.d.ts +3 -0
  203. package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.d.ts +3 -0
  204. package/lib/modules/hierarchic-selector/hierarchic-selector.module.d.ts +21 -0
  205. package/lib/modules/icon/icon.component.d.ts +3 -0
  206. package/lib/modules/icon/icon.module.d.ts +7 -0
  207. package/lib/modules/matomo/matomo-module.module.d.ts +4 -0
  208. package/lib/modules/matomo/matomo.service.d.ts +3 -0
  209. package/lib/modules/panels/abstract-panel.d.ts +3 -0
  210. package/lib/modules/panels/panels.component.d.ts +3 -0
  211. package/lib/modules/panels/panels.module.d.ts +8 -0
  212. package/lib/modules/panels/panels.service.d.ts +3 -0
  213. package/lib/modules/relations/relations.component.d.ts +3 -0
  214. package/lib/modules/relations/relations.module.d.ts +15 -0
  215. package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +3 -0
  216. package/lib/modules/search/dropdown-container/dropdown-ref.d.ts +1 -1
  217. package/lib/modules/search/dropdown-container/dropdown.service.d.ts +3 -0
  218. package/lib/modules/search/facet-selector/facet-selector.component.d.ts +3 -0
  219. package/lib/modules/search/group/group.component.d.ts +3 -0
  220. package/lib/modules/search/input/input.component.d.ts +3 -0
  221. package/lib/modules/search/search/search.component.d.ts +3 -0
  222. package/lib/modules/search/search.module.d.ts +19 -0
  223. package/lib/modules/select/abstract-select.component.d.ts +4 -1
  224. package/lib/modules/select/select/select.component.d.ts +3 -0
  225. package/lib/modules/select/select-enum/select-enum.component.d.ts +9 -2
  226. package/lib/modules/select/select-hierarchic/select-hierarchic.component.d.ts +3 -0
  227. package/lib/modules/select/select.module.d.ts +19 -0
  228. package/lib/modules/sidenav/sidenav/sidenav.component.d.ts +3 -0
  229. package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +3 -0
  230. package/lib/modules/sidenav/sidenav-content/sidenav-content.component.d.ts +3 -0
  231. package/lib/modules/sidenav/sidenav-stack.service.d.ts +4 -1
  232. package/lib/modules/sidenav/sidenav.module.d.ts +11 -0
  233. package/lib/modules/sidenav/sidenav.service.d.ts +3 -0
  234. package/lib/modules/stamp/stamp-module.module.d.ts +6 -0
  235. package/lib/modules/stamp/stamp.component.d.ts +3 -0
  236. package/lib/modules/table-button/table-button.component.d.ts +3 -0
  237. package/lib/modules/table-button/table-button.module.d.ts +9 -0
  238. package/lib/services/enum.service.d.ts +3 -0
  239. package/lib/services/link-mutation.service.d.ts +3 -0
  240. package/lib/services/persistence.service.d.ts +3 -0
  241. package/lib/services/swiss-parsing-date-adapter.service.d.ts +4 -1
  242. package/package.json +25 -12
  243. package/src/lib/modules/alert/_alert.theme.scss +1 -1
  244. package/src/lib/modules/file/component/_file.theme.scss +1 -1
  245. package/src/lib/modules/icon/_icon.theme.scss +1 -1
  246. package/src/lib/modules/search/dropdown-container/_dropdown-container.theme.scss +1 -1
  247. package/src/lib/modules/table-button/_table-button.theme.scss +1 -1
  248. package/src/lib/styles/_table.scss +1 -1
  249. package/theming/_natural.theme.scss +1 -1
  250. package/bundles/ecodev-natural.umd.js +0 -11318
  251. package/bundles/ecodev-natural.umd.js.map +0 -1
  252. package/ecodev-natural.metadata.json +0 -1
  253. package/esm2015/ecodev-natural.js +0 -14
  254. package/esm2015/lib/classes/abstract-controller.js +0 -29
  255. package/esm2015/lib/classes/abstract-detail.js +0 -157
  256. package/esm2015/lib/classes/abstract-editable-list.js +0 -97
  257. package/esm2015/lib/classes/abstract-list.js +0 -409
  258. package/esm2015/lib/classes/abstract-navigable-list.js +0 -126
  259. package/esm2015/lib/classes/data-source.js +0 -76
  260. package/esm2015/lib/classes/query-variable-manager.js +0 -161
  261. package/esm2015/lib/classes/validators.js +0 -176
  262. package/esm2015/lib/directives/http-prefix.directive.js +0 -46
  263. package/esm2015/lib/modules/alert/alert.module.js +0 -15
  264. package/esm2015/lib/modules/alert/alert.service.js +0 -59
  265. package/esm2015/lib/modules/alert/confirm.component.js +0 -17
  266. package/esm2015/lib/modules/avatar/avatar.module.js +0 -14
  267. package/esm2015/lib/modules/avatar/component/avatar.component.js +0 -158
  268. package/esm2015/lib/modules/avatar/service/avatar.service.js +0 -65
  269. package/esm2015/lib/modules/avatar/sources/gravatar.js +0 -29
  270. package/esm2015/lib/modules/columns-picker/columns-picker-column.directive.js +0 -41
  271. package/esm2015/lib/modules/columns-picker/columns-picker.component.js +0 -82
  272. package/esm2015/lib/modules/columns-picker/columns-picker.module.js +0 -28
  273. package/esm2015/lib/modules/common/common-module.js +0 -35
  274. package/esm2015/lib/modules/common/directives/linkable-tab.directive.js +0 -82
  275. package/esm2015/lib/modules/common/directives/reactive-asterisk.directive.js +0 -31
  276. package/esm2015/lib/modules/common/directives/src-density.directive.js +0 -63
  277. package/esm2015/lib/modules/common/pipes/capitalize.pipe.js +0 -14
  278. package/esm2015/lib/modules/common/pipes/ellipsis.pipe.js +0 -10
  279. package/esm2015/lib/modules/common/pipes/enum.pipe.js +0 -24
  280. package/esm2015/lib/modules/common/pipes/swiss-date.pipe.js +0 -16
  281. package/esm2015/lib/modules/common/public-api.js +0 -14
  282. package/esm2015/lib/modules/common/services/memory-storage.js +0 -110
  283. package/esm2015/lib/modules/common/services/seo.service.js +0 -120
  284. package/esm2015/lib/modules/detail-header/detail-header.component.js +0 -63
  285. package/esm2015/lib/modules/detail-header/detail-header.module.js +0 -16
  286. package/esm2015/lib/modules/dialog-trigger/dialog-trigger.component.js +0 -68
  287. package/esm2015/lib/modules/dialog-trigger/dialog-trigger.module.js +0 -14
  288. package/esm2015/lib/modules/dropdown-components/abstract-association-select-component.directive.js +0 -96
  289. package/esm2015/lib/modules/dropdown-components/natural-dropdown-components.module.js +0 -51
  290. package/esm2015/lib/modules/dropdown-components/type-date/type-date.component.js +0 -123
  291. package/esm2015/lib/modules/dropdown-components/type-date-range/type-date-range.component.js +0 -128
  292. package/esm2015/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.js +0 -63
  293. package/esm2015/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.js +0 -31
  294. package/esm2015/lib/modules/dropdown-components/type-number/type-number.component.js +0 -99
  295. package/esm2015/lib/modules/dropdown-components/type-select/type-select.component.js +0 -161
  296. package/esm2015/lib/modules/dropdown-components/type-text/type-text.component.js +0 -53
  297. package/esm2015/lib/modules/file/abstract-file.js +0 -223
  298. package/esm2015/lib/modules/file/component/file.component.js +0 -133
  299. package/esm2015/lib/modules/file/file-drop.directive.js +0 -99
  300. package/esm2015/lib/modules/file/file-select.directive.js +0 -25
  301. package/esm2015/lib/modules/file/file.module.js +0 -19
  302. package/esm2015/lib/modules/file/file.service.js +0 -47
  303. package/esm2015/lib/modules/fixed-button/fixed-button.component.js +0 -23
  304. package/esm2015/lib/modules/fixed-button/fixed-button.module.js +0 -16
  305. package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.component.js +0 -31
  306. package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.module.js +0 -15
  307. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.js +0 -351
  308. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.js +0 -258
  309. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.js +0 -28
  310. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.js +0 -23
  311. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector.module.js +0 -46
  312. package/esm2015/lib/modules/icon/icon.component.js +0 -78
  313. package/esm2015/lib/modules/icon/icon.module.js +0 -25
  314. package/esm2015/lib/modules/matomo/matomo-module.module.js +0 -7
  315. package/esm2015/lib/modules/matomo/matomo.service.js +0 -106
  316. package/esm2015/lib/modules/panels/abstract-panel.js +0 -50
  317. package/esm2015/lib/modules/panels/panels.component.js +0 -26
  318. package/esm2015/lib/modules/panels/panels.module.js +0 -28
  319. package/esm2015/lib/modules/panels/panels.service.js +0 -331
  320. package/esm2015/lib/modules/relations/relations.component.js +0 -181
  321. package/esm2015/lib/modules/relations/relations.module.js +0 -33
  322. package/esm2015/lib/modules/search/dropdown-container/dropdown-container.component.js +0 -87
  323. package/esm2015/lib/modules/search/dropdown-container/dropdown.service.js +0 -95
  324. package/esm2015/lib/modules/search/facet-selector/facet-selector.component.js +0 -47
  325. package/esm2015/lib/modules/search/group/group.component.js +0 -39
  326. package/esm2015/lib/modules/search/input/input.component.js +0 -316
  327. package/esm2015/lib/modules/search/search/search.component.js +0 -71
  328. package/esm2015/lib/modules/search/search.module.js +0 -52
  329. package/esm2015/lib/modules/select/abstract-select.component.js +0 -176
  330. package/esm2015/lib/modules/select/select/select.component.js +0 -190
  331. package/esm2015/lib/modules/select/select-enum/select-enum.component.js +0 -34
  332. package/esm2015/lib/modules/select/select-hierarchic/select-hierarchic.component.js +0 -120
  333. package/esm2015/lib/modules/select/select.module.js +0 -39
  334. package/esm2015/lib/modules/sidenav/sidenav/sidenav.component.js +0 -12
  335. package/esm2015/lib/modules/sidenav/sidenav-container/sidenav-container.component.js +0 -79
  336. package/esm2015/lib/modules/sidenav/sidenav-content/sidenav-content.component.js +0 -13
  337. package/esm2015/lib/modules/sidenav/sidenav-stack.service.js +0 -50
  338. package/esm2015/lib/modules/sidenav/sidenav.module.js +0 -20
  339. package/esm2015/lib/modules/sidenav/sidenav.service.js +0 -199
  340. package/esm2015/lib/modules/stamp/stamp-module.module.js +0 -13
  341. package/esm2015/lib/modules/stamp/stamp.component.js +0 -13
  342. package/esm2015/lib/modules/table-button/table-button.component.js +0 -38
  343. package/esm2015/lib/modules/table-button/table-button.module.js +0 -16
  344. package/esm2015/lib/services/abstract-model.service.js +0 -509
  345. package/esm2015/lib/services/enum.service.js +0 -68
  346. package/esm2015/lib/services/link-mutation.service.js +0 -155
  347. package/esm2015/lib/services/persistence.service.js +0 -114
  348. package/esm2015/lib/services/swiss-parsing-date-adapter.service.js +0 -55
  349. package/fesm2015/ecodev-natural.js.map +0 -1
  350. package/lib/modules/common/directives/reactive-asterisk.directive.d.ts +0 -10
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Data source to provide what data should be rendered in the table. The observable provided
3
+ * in connect should emit exactly the data that should be rendered by the table. If the data is
4
+ * altered, the observable should emit that new set of data on the stream. In our case here,
5
+ * we return a stream that contains only one set of data that doesn't change.
6
+ */
7
+ import { DataSource } from '@angular/cdk/collections';
8
+ import { BehaviorSubject, Observable, Subject } from 'rxjs';
9
+ import { map, takeUntil } from 'rxjs/operators';
10
+ /**
11
+ * A NaturalDataSource will connect immediately, in order to know as soon as possible if
12
+ * we need to show a template at all (as seen in my-ichtus)
13
+ *
14
+ * It also allow some extra data manipulation
15
+ */
16
+ export class NaturalDataSource extends DataSource {
17
+ constructor(value) {
18
+ super();
19
+ this.ngUnsubscribe = new Subject();
20
+ if (value instanceof Observable) {
21
+ this.internalData = new BehaviorSubject(null);
22
+ value.pipe(takeUntil(this.ngUnsubscribe)).subscribe(res => (this.data = res));
23
+ }
24
+ else {
25
+ this.internalData = new BehaviorSubject(value);
26
+ }
27
+ }
28
+ get internalDataObservable() {
29
+ return this.internalData;
30
+ }
31
+ /**
32
+ * Array of data that should be rendered by the table, where each object represents one row.
33
+ */
34
+ get data() {
35
+ return this.internalData.value;
36
+ }
37
+ set data(data) {
38
+ this.internalData.next(data);
39
+ }
40
+ connect() {
41
+ return this.internalData.pipe(takeUntil(this.ngUnsubscribe), map(data => (data ? data.items : [])));
42
+ }
43
+ disconnect() {
44
+ this.ngUnsubscribe.next(); // unsubscribe everybody
45
+ this.ngUnsubscribe.complete(); // complete the stream, because we will never emit again
46
+ }
47
+ push(item) {
48
+ if (!this.data) {
49
+ return;
50
+ }
51
+ const fullList = this.data.items;
52
+ fullList.push(item);
53
+ this.data = Object.assign(this.data, { items: fullList, length: fullList.length });
54
+ }
55
+ pop() {
56
+ if (!this.data) {
57
+ return;
58
+ }
59
+ const fullList = this.data.items;
60
+ const removedElement = fullList.pop();
61
+ this.data = Object.assign(this.data, { items: fullList, length: fullList.length });
62
+ return removedElement;
63
+ }
64
+ remove(item) {
65
+ if (!this.data) {
66
+ return;
67
+ }
68
+ const index = this.data.items.indexOf(item);
69
+ if (index > -1) {
70
+ this.data.items.splice(index, 1);
71
+ this.data.length--;
72
+ this.data = this.data;
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvY2xhc3Nlcy9kYXRhLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQVc5Qzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxpQkFBNkUsU0FBUSxVQUVqRztJQUtHLFlBQW1CLEtBQXdCO1FBQ3ZDLEtBQUssRUFBRSxDQUFDO1FBTEssa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBT2pELElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFXLElBQUksQ0FBQyxDQUFDO1lBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pGO2FBQU07WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFXLEtBQUssQ0FBQyxDQUFDO1NBQzVEO0lBQ0wsQ0FBQztJQUVELElBQVcsc0JBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLElBQUksQ0FBQyxJQUFjO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3hDLENBQUM7SUFDTixDQUFDO0lBRU0sVUFBVTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyx3QkFBd0I7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLHdEQUF3RDtJQUMzRixDQUFDO0lBRU0sSUFBSSxDQUFDLElBQW1CO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1osT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTSxHQUFHO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUVqRixPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRU0sTUFBTSxDQUFDLElBQW1CO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1osT0FBTztTQUNWO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN6QjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YSBzb3VyY2UgdG8gcHJvdmlkZSB3aGF0IGRhdGEgc2hvdWxkIGJlIHJlbmRlcmVkIGluIHRoZSB0YWJsZS4gVGhlIG9ic2VydmFibGUgcHJvdmlkZWRcbiAqIGluIGNvbm5lY3Qgc2hvdWxkIGVtaXQgZXhhY3RseSB0aGUgZGF0YSB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCBieSB0aGUgdGFibGUuIElmIHRoZSBkYXRhIGlzXG4gKiBhbHRlcmVkLCB0aGUgb2JzZXJ2YWJsZSBzaG91bGQgZW1pdCB0aGF0IG5ldyBzZXQgb2YgZGF0YSBvbiB0aGUgc3RyZWFtLiBJbiBvdXIgY2FzZSBoZXJlLFxuICogd2UgcmV0dXJuIGEgc3RyZWFtIHRoYXQgY29udGFpbnMgb25seSBvbmUgc2V0IG9mIGRhdGEgdGhhdCBkb2Vzbid0IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQge0RhdGFTb3VyY2V9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWREYXRhPFQ+IHtcbiAgICBpdGVtczogVFtdO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuICAgIHBhZ2VJbmRleDogbnVtYmVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgTmF0dXJhbERhdGFTb3VyY2Ugd2lsbCBjb25uZWN0IGltbWVkaWF0ZWx5LCBpbiBvcmRlciB0byBrbm93IGFzIHNvb24gYXMgcG9zc2libGUgaWZcbiAqIHdlIG5lZWQgdG8gc2hvdyBhIHRlbXBsYXRlIGF0IGFsbCAoYXMgc2VlbiBpbiBteS1pY2h0dXMpXG4gKlxuICogSXQgYWxzbyBhbGxvdyBzb21lIGV4dHJhIGRhdGEgbWFuaXB1bGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXR1cmFsRGF0YVNvdXJjZTxUIGV4dGVuZHMgUGFnaW5hdGVkRGF0YTxMaXRlcmFsPiA9IFBhZ2luYXRlZERhdGE8TGl0ZXJhbD4+IGV4dGVuZHMgRGF0YVNvdXJjZTxcbiAgICBUWydpdGVtcyddWzBdXG4+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnRlcm5hbERhdGE6IEJlaGF2aW9yU3ViamVjdDxUIHwgbnVsbD47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodmFsdWU6IE9ic2VydmFibGU8VD4gfCBUKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbERhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFQgfCBudWxsPihudWxsKTtcbiAgICAgICAgICAgIHZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZShyZXMgPT4gKHRoaXMuZGF0YSA9IHJlcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbERhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFQgfCBudWxsPih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGludGVybmFsRGF0YU9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCBieSB0aGUgdGFibGUsIHdoZXJlIGVhY2ggb2JqZWN0IHJlcHJlc2VudHMgb25lIHJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogVCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbERhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkYXRhKGRhdGE6IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEYXRhLm5leHQoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbm5lY3QoKTogT2JzZXJ2YWJsZTxUWydpdGVtcyddPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsRGF0YS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiAoZGF0YSA/IGRhdGEuaXRlbXMgOiBbXSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpOyAvLyB1bnN1YnNjcmliZSBldmVyeWJvZHlcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7IC8vIGNvbXBsZXRlIHRoZSBzdHJlYW0sIGJlY2F1c2Ugd2Ugd2lsbCBuZXZlciBlbWl0IGFnYWluXG4gICAgfVxuXG4gICAgcHVibGljIHB1c2goaXRlbTogVFsnaXRlbXMnXVswXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbExpc3QgPSB0aGlzLmRhdGEuaXRlbXM7XG4gICAgICAgIGZ1bGxMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgIHRoaXMuZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCB7aXRlbXM6IGZ1bGxMaXN0LCBsZW5ndGg6IGZ1bGxMaXN0Lmxlbmd0aH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb3AoKTogVFsnaXRlbXMnXVswXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMuZGF0YS5pdGVtcztcbiAgICAgICAgY29uc3QgcmVtb3ZlZEVsZW1lbnQgPSBmdWxsTGlzdC5wb3AoKTtcbiAgICAgICAgdGhpcy5kYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIHtpdGVtczogZnVsbExpc3QsIGxlbmd0aDogZnVsbExpc3QubGVuZ3RofSk7XG5cbiAgICAgICAgcmV0dXJuIHJlbW92ZWRFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoaXRlbTogVFsnaXRlbXMnXVswXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGEuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLmxlbmd0aC0tO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
@@ -0,0 +1,172 @@
1
+ import { cloneDeep, defaultsDeep, isArray, mergeWith, omit } from 'lodash-es';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { mergeOverrideArray } from './utility';
4
+ import { hasMixedGroupLogic } from './query-variable-manager-utils';
5
+ export var SortingOrder;
6
+ (function (SortingOrder) {
7
+ SortingOrder["ASC"] = "ASC";
8
+ SortingOrder["DESC"] = "DESC";
9
+ })(SortingOrder || (SortingOrder = {}));
10
+ /**
11
+ * During lodash merge, concat arrays
12
+ */
13
+ function mergeConcatArray(destValue, source) {
14
+ if (isArray(source)) {
15
+ if (destValue) {
16
+ return destValue.concat(source);
17
+ }
18
+ else {
19
+ return source;
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Filter manager stores a set of channels that contain a variable object and exposes an observable "variables" that updates with the result
25
+ * of all channels merged together.
26
+ *
27
+ * A channel is supposed to be used by a given aspect of the GUI (pagination, sorting, search, others ?).
28
+ *
29
+ * ```ts
30
+ * const fm = new QueryVariablesManager();
31
+ * fm.merge('componentA-variables', {a : [1, 2, 3]});
32
+ * ```
33
+ *
34
+ * Variables attributes is a BehaviorSubject. That mean it's not mandatory to subscribe, we can just call getValue or value attributes on
35
+ * it :
36
+ *
37
+ * ```ts
38
+ * console.log(fm.variables.value); // {a : [1, 2, 3]}
39
+ * ```
40
+ *
41
+ * Set new variables for 'componentA-variables':
42
+ *
43
+ * ```ts
44
+ * fm.merge('componentA-variables', {a : [1, 2]});
45
+ * console.log(fm.variables.value); // {a : [1, 2, 3]}
46
+ * ```
47
+ *
48
+ * Set new variables for new channel:
49
+ *
50
+ * ```ts
51
+ * fm.merge('componentB-variables', {a : [3, 4]});
52
+ * console.log(fm.variables.value); // {a : [1, 2, 3, 4]}
53
+ * ```
54
+ */
55
+ export class NaturalQueryVariablesManager {
56
+ constructor(queryVariablesManager) {
57
+ this.variables = new BehaviorSubject(undefined);
58
+ this.channels = new Map();
59
+ if (queryVariablesManager) {
60
+ this.channels = queryVariablesManager.getChannelsCopy();
61
+ this.updateVariables();
62
+ }
63
+ }
64
+ /**
65
+ * Set or override all the variables that may exist in the given channel
66
+ */
67
+ set(channelName, variables) {
68
+ // cloneDeep to change reference and prevent some interactions when merge
69
+ if (variables) {
70
+ this.channels.set(channelName, cloneDeep(variables));
71
+ }
72
+ else {
73
+ this.channels.delete(channelName);
74
+ }
75
+ this.updateVariables();
76
+ }
77
+ /**
78
+ * Return a deep clone of the variables for the given channel name.
79
+ *
80
+ * Avoid returning the same reference to prevent an attribute change, then another channel update that would
81
+ * used this changed attribute without having explicitly asked QueryVariablesManager to update it.
82
+ */
83
+ get(channelName) {
84
+ return cloneDeep(this.channels.get(channelName));
85
+ }
86
+ /**
87
+ * Merge variable into a channel, overriding arrays in same channel / key
88
+ */
89
+ merge(channelName, newVariables) {
90
+ const variables = this.channels.get(channelName);
91
+ if (variables) {
92
+ mergeWith(variables, cloneDeep(newVariables), mergeOverrideArray); // merge preserves references, cloneDeep prevent that
93
+ this.updateVariables();
94
+ }
95
+ else {
96
+ this.set(channelName, newVariables);
97
+ }
98
+ }
99
+ /**
100
+ * Apply default values to a channel
101
+ * Note : lodash defaults only defines values on destinations keys that are undefined
102
+ */
103
+ defaults(channelName, newVariables) {
104
+ const variables = this.channels.get(channelName);
105
+ if (variables) {
106
+ defaultsDeep(variables, newVariables);
107
+ this.updateVariables();
108
+ }
109
+ else {
110
+ this.set(channelName, newVariables);
111
+ }
112
+ }
113
+ getChannelsCopy() {
114
+ return new Map(this.channels);
115
+ }
116
+ /**
117
+ * Merge channels in a single object
118
+ * Arrays are concatenated
119
+ * Filter groups are combined smartly (see mergeGroupList)
120
+ */
121
+ updateVariables() {
122
+ const merged = {};
123
+ this.channels.forEach((channelVariables) => {
124
+ if (channelVariables.filter) {
125
+ // Merge filter's groups first
126
+ const groups = this.mergeGroupList(merged.filter && merged.filter.groups ? merged.filter.groups : [], channelVariables.filter.groups || []);
127
+ // Merge filter key (that contain groups)
128
+ if (groups && groups.length) {
129
+ if (merged.filter) {
130
+ merged.filter.groups = groups;
131
+ }
132
+ else {
133
+ merged.filter = { groups: groups };
134
+ }
135
+ }
136
+ else {
137
+ mergeWith(merged, { filter: channelVariables.filter }, mergeConcatArray);
138
+ }
139
+ }
140
+ // Merge other attributes than filter
141
+ mergeWith(merged, omit(channelVariables, 'filter'), mergeConcatArray);
142
+ });
143
+ this.variables.next(merged);
144
+ }
145
+ /**
146
+ * Cross merge two filters
147
+ * Only accepts groups with same groupLogic (ignores the first one, because there is no groupLogic in this one)
148
+ * @throws In case two non-empty lists of groups are given and at one of them mix groupLogic value, throws an error
149
+ */
150
+ mergeGroupList(groupsA, groupsB) {
151
+ if (groupsA.length === 0 && groupsB.length === 0) {
152
+ return []; // empty listings, return empty lists
153
+ }
154
+ if (groupsA.length === 0 && groupsB.length > 0) {
155
+ return groupsB; // One list is empty, return the one that is not
156
+ }
157
+ if (groupsB.length === 0 && groupsA.length > 0) {
158
+ return groupsA; // One list is empty, return the one that is not
159
+ }
160
+ const groups = [];
161
+ if (hasMixedGroupLogic(groupsA) || hasMixedGroupLogic(groupsB)) {
162
+ throw Error('QueryVariables groups contain mixed group logics');
163
+ }
164
+ groupsA.forEach(groupA => {
165
+ groupsB.forEach(groupB => {
166
+ groups.push(mergeWith(cloneDeep(groupA), groupB, mergeConcatArray));
167
+ });
168
+ });
169
+ return groups;
170
+ }
171
+ }
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktdmFyaWFibGUtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9jbGFzc2VzL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDNUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFvQmxFLE1BQU0sQ0FBTixJQUFZLFlBR1g7QUFIRCxXQUFZLFlBQVk7SUFDcEIsMkJBQVcsQ0FBQTtJQUNYLDZCQUFhLENBQUE7QUFDakIsQ0FBQyxFQUhXLFlBQVksS0FBWixZQUFZLFFBR3ZCO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQWMsRUFBRSxNQUFXO0lBQ2pELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2pCLElBQUksU0FBUyxFQUFFO1lBQ1gsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ25DO2FBQU07WUFDSCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtLQUNKO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBTSxPQUFPLDRCQUE0QjtJQUlyQyxZQUFtQixxQkFBdUQ7UUFIMUQsY0FBUyxHQUFtQyxJQUFJLGVBQWUsQ0FBZ0IsU0FBUyxDQUFDLENBQUM7UUFDekYsYUFBUSxHQUE0QixJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUcvRSxJQUFJLHFCQUFxQixFQUFFO1lBQ3ZCLElBQUks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LENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjbG9uZURlZXAsIGRlZmF1bHRzRGVlcCwgaXNBcnJheSwgbWVyZ2VXaXRoLCBvbWl0fSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtMaXRlcmFsfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge21lcmdlT3ZlcnJpZGVBcnJheX0gZnJvbSAnLi91dGlsaXR5JztcbmltcG9ydCB7aGFzTWl4ZWRHcm91cExvZ2ljfSBmcm9tICcuL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXItdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5VmFyaWFibGVzIHtcbiAgICBmaWx0ZXI/OiBhbnkgfCBudWxsO1xuICAgIHBhZ2luYXRpb24/OiBQYWdpbmF0aW9uSW5wdXQgfCBudWxsO1xuICAgIHNvcnRpbmc/OiBBcnJheTxTb3J0aW5nPiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbklucHV0IHtcbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIHBhZ2VJbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgcGFnZVNpemU/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmcge1xuICAgIGZpZWxkOiBhbnk7XG4gICAgb3JkZXI/OiBTb3J0aW5nT3JkZXIgfCBudWxsO1xuICAgIG51bGxBc0hpZ2hlc3Q/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gU29ydGluZ09yZGVyIHtcbiAgICBBU0MgPSAnQVNDJyxcbiAgICBERVNDID0gJ0RFU0MnLFxufVxuXG4vKipcbiAqIER1cmluZyBsb2Rhc2ggbWVyZ2UsIGNvbmNhdCBhcnJheXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2VDb25jYXRBcnJheShkZXN0VmFsdWU6IGFueSwgc291cmNlOiBhbnkpOiBhbnkge1xuICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgaWYgKGRlc3RWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlc3RWYWx1ZS5jb25jYXQoc291cmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRmlsdGVyIG1hbmFnZXIgc3RvcmVzIGEgc2V0IG9mIGNoYW5uZWxzIHRoYXQgY29udGFpbiBhIHZhcmlhYmxlIG9iamVjdCBhbmQgZXhwb3NlcyBhbiBvYnNlcnZhYmxlIFwidmFyaWFibGVzXCIgdGhhdCB1cGRhdGVzIHdpdGggdGhlIHJlc3VsdFxuICogb2YgYWxsIGNoYW5uZWxzIG1lcmdlZCB0b2dldGhlci5cbiAqXG4gKiBBIGNoYW5uZWwgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBieSBhIGdpdmVuIGFzcGVjdCBvZiB0aGUgR1VJIChwYWdpbmF0aW9uLCBzb3J0aW5nLCBzZWFyY2gsIG90aGVycyA/KS5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgZm0gPSBuZXcgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyKCk7XG4gKiBmbS5tZXJnZSgnY29tcG9uZW50QS12YXJpYWJsZXMnLCB7YSA6IFsxLCAyLCAzXX0pO1xuICogYGBgXG4gKlxuICogVmFyaWFibGVzIGF0dHJpYnV0ZXMgaXMgYSBCZWhhdmlvclN1YmplY3QuIFRoYXQgbWVhbiBpdCdzIG5vdCBtYW5kYXRvcnkgdG8gc3Vic2NyaWJlLCB3ZSBjYW4ganVzdCBjYWxsIGdldFZhbHVlIG9yIHZhbHVlIGF0dHJpYnV0ZXMgb25cbiAqIGl0IDpcbiAqXG4gKiBgYGB0c1xuICogY29uc29sZS5sb2coZm0udmFyaWFibGVzLnZhbHVlKTsgLy8ge2EgOiBbMSwgMiwgM119XG4gKiBgYGBcbiAqXG4gKiBTZXQgbmV3IHZhcmlhYmxlcyBmb3IgJ2NvbXBvbmVudEEtdmFyaWFibGVzJzpcbiAqXG4gKiBgYGB0c1xuICogZm0ubWVyZ2UoJ2NvbXBvbmVudEEtdmFyaWFibGVzJywge2EgOiBbMSwgMl19KTtcbiAqIGNvbnNvbGUubG9nKGZtLnZhcmlhYmxlcy52YWx1ZSk7IC8vIHthIDogWzEsIDIsIDNdfVxuICogYGBgXG4gKlxuICogU2V0IG5ldyB2YXJpYWJsZXMgZm9yIG5ldyBjaGFubmVsOlxuICpcbiAqIGBgYHRzXG4gKiBmbS5tZXJnZSgnY29tcG9uZW50Qi12YXJpYWJsZXMnLCB7YSA6IFszLCA0XX0pO1xuICogY29uc29sZS5sb2coZm0udmFyaWFibGVzLnZhbHVlKTsgLy8ge2EgOiBbMSwgMiwgMywgNF19XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VCBleHRlbmRzIFF1ZXJ5VmFyaWFibGVzID0gUXVlcnlWYXJpYWJsZXM+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFyaWFibGVzOiBCZWhhdmlvclN1YmplY3Q8VCB8IHVuZGVmaW5lZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFubmVsczogTWFwPHN0cmluZywgUGFydGlhbDxUPj4gPSBuZXcgTWFwPHN0cmluZywgUGFydGlhbDxUPj4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVyeVZhcmlhYmxlc01hbmFnZXI/OiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFQ+KSB7XG4gICAgICAgIGlmIChxdWVyeVZhcmlhYmxlc01hbmFnZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHMgPSBxdWVyeVZhcmlhYmxlc01hbmFnZXIuZ2V0Q2hhbm5lbHNDb3B5KCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhYmxlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG9yIG92ZXJyaWRlIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBnaXZlbiBjaGFubmVsXG4gICAgICovXG4gICAgcHVibGljIHNldChjaGFubmVsTmFtZTogc3RyaW5nLCB2YXJpYWJsZXM6IFBhcnRpYWw8VD4gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIC8vIGNsb25lRGVlcCB0byBjaGFuZ2UgcmVmZXJlbmNlIGFuZCBwcmV2ZW50IHNvbWUgaW50ZXJhY3Rpb25zIHdoZW4gbWVyZ2VcbiAgICAgICAgaWYgKHZhcmlhYmxlcykge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVscy5zZXQoY2hhbm5lbE5hbWUsIGNsb25lRGVlcCh2YXJpYWJsZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHMuZGVsZXRlKGNoYW5uZWxOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhYmxlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGRlZXAgY2xvbmUgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhlIGdpdmVuIGNoYW5uZWwgbmFtZS5cbiAgICAgKlxuICAgICAqIEF2b2lkIHJldHVybmluZyB0aGUgc2FtZSByZWZlcmVuY2UgdG8gcHJldmVudCBhbiBhdHRyaWJ1dGUgY2hhbmdlLCB0aGVuIGFub3RoZXIgY2hhbm5lbCB1cGRhdGUgdGhhdCB3b3VsZFxuICAgICAqIHVzZWQgdGhpcyBjaGFuZ2VkIGF0dHJpYnV0ZSB3aXRob3V0IGhhdmluZyBleHBsaWNpdGx5IGFza2VkIFF1ZXJ5VmFyaWFibGVzTWFuYWdlciB0byB1cGRhdGUgaXQuXG4gICAgICovXG4gICAgcHVibGljIGdldChjaGFubmVsTmFtZTogc3RyaW5nKTogUGFydGlhbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjbG9uZURlZXAodGhpcy5jaGFubmVscy5nZXQoY2hhbm5lbE5hbWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSB2YXJpYWJsZSBpbnRvIGEgY2hhbm5lbCwgb3ZlcnJpZGluZyBhcnJheXMgaW4gc2FtZSBjaGFubmVsIC8ga2V5XG4gICAgICovXG4gICAgcHVibGljIG1lcmdlKGNoYW5uZWxOYW1lOiBzdHJpbmcsIG5ld1ZhcmlhYmxlczogUGFydGlhbDxUPik6IHZvaWQge1xuICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmNoYW5uZWxzLmdldChjaGFubmVsTmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIG1lcmdlV2l0aCh2YXJpYWJsZXMsIGNsb25lRGVlcChuZXdWYXJpYWJsZXMpLCBtZXJnZU92ZXJyaWRlQXJyYXkpOyAvLyBtZXJnZSBwcmVzZXJ2ZXMgcmVmZXJlbmNlcywgY2xvbmVEZWVwIHByZXZlbnQgdGhhdFxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYXJpYWJsZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNoYW5uZWxOYW1lLCBuZXdWYXJpYWJsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgZGVmYXVsdCB2YWx1ZXMgdG8gYSBjaGFubmVsXG4gICAgICogTm90ZSA6IGxvZGFzaCBkZWZhdWx0cyBvbmx5IGRlZmluZXMgdmFsdWVzIG9uIGRlc3RpbmF0aW9ucyBrZXlzIHRoYXQgYXJlIHVuZGVmaW5lZFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWZhdWx0cyhjaGFubmVsTmFtZTogc3RyaW5nLCBuZXdWYXJpYWJsZXM6IFBhcnRpYWw8VD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jaGFubmVscy5nZXQoY2hhbm5lbE5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVzKSB7XG4gICAgICAgICAgICBkZWZhdWx0c0RlZXAodmFyaWFibGVzLCBuZXdWYXJpYWJsZXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYXJpYWJsZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNoYW5uZWxOYW1lLCBuZXdWYXJpYWJsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDaGFubmVsc0NvcHkoKTogTWFwPHN0cmluZywgUGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gbmV3IE1hcDxzdHJpbmcsIFBhcnRpYWw8VD4+KHRoaXMuY2hhbm5lbHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIGNoYW5uZWxzIGluIGEgc2luZ2xlIG9iamVjdFxuICAgICAqIEFycmF5cyBhcmUgY29uY2F0ZW5hdGVkXG4gICAgICogRmlsdGVyIGdyb3VwcyBhcmUgY29tYmluZWQgc21hcnRseSAoc2VlIG1lcmdlR3JvdXBMaXN0KVxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVmFyaWFibGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXJnZWQ6IExpdGVyYWwgPSB7fTtcblxuICAgICAgICB0aGlzLmNoYW5uZWxzLmZvckVhY2goKGNoYW5uZWxWYXJpYWJsZXM6IExpdGVyYWwpID0+IHtcbiAgICAgICAgICAgIGlmIChjaGFubmVsVmFyaWFibGVzLmZpbHRlcikge1xuICAgICAgICAgICAgICAgIC8vIE1lcmdlIGZpbHRlcidzIGdyb3VwcyBmaXJzdFxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMubWVyZ2VHcm91cExpc3QoXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZC5maWx0ZXIgJiYgbWVyZ2VkLmZpbHRlci5ncm91cHMgPyBtZXJnZWQuZmlsdGVyLmdyb3VwcyA6IFtdLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsVmFyaWFibGVzLmZpbHRlci5ncm91cHMgfHwgW10sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE1lcmdlIGZpbHRlciBrZXkgKHRoYXQgY29udGFpbiBncm91cHMpXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwcyAmJiBncm91cHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWQuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWQuZmlsdGVyLmdyb3VwcyA9IGdyb3VwcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZC5maWx0ZXIgPSB7Z3JvdXBzOiBncm91cHN9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VXaXRoKG1lcmdlZCwge2ZpbHRlcjogY2hhbm5lbFZhcmlhYmxlcy5maWx0ZXJ9LCBtZXJnZUNvbmNhdEFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1lcmdlIG90aGVyIGF0dHJpYnV0ZXMgdGhhbiBmaWx0ZXJcbiAgICAgICAgICAgIG1lcmdlV2l0aChtZXJnZWQsIG9taXQoY2hhbm5lbFZhcmlhYmxlcywgJ2ZpbHRlcicpLCBtZXJnZUNvbmNhdEFycmF5KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52YXJpYWJsZXMubmV4dChtZXJnZWQgYXMgVCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3Jvc3MgbWVyZ2UgdHdvIGZpbHRlcnNcbiAgICAgKiBPbmx5IGFjY2VwdHMgZ3JvdXBzIHdpdGggc2FtZSBncm91cExvZ2ljIChpZ25vcmVzIHRoZSBmaXJzdCBvbmUsIGJlY2F1c2UgdGhlcmUgaXMgbm8gZ3JvdXBMb2dpYyBpbiB0aGlzIG9uZSlcbiAgICAgKiBAdGhyb3dzIEluIGNhc2UgdHdvIG5vbi1lbXB0eSBsaXN0cyBvZiBncm91cHMgYXJlIGdpdmVuIGFuZCBhdCBvbmUgb2YgdGhlbSBtaXggZ3JvdXBMb2dpYyB2YWx1ZSwgdGhyb3dzIGFuIGVycm9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBtZXJnZUdyb3VwTGlzdChncm91cHNBOiBMaXRlcmFsW10sIGdyb3Vwc0I6IExpdGVyYWxbXSk6IExpdGVyYWwge1xuICAgICAgICBpZiAoZ3JvdXBzQS5sZW5ndGggPT09IDAgJiYgZ3JvdXBzQi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTsgLy8gZW1wdHkgbGlzdGluZ3MsIHJldHVybiBlbXB0eSBsaXN0c1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdyb3Vwc0EubGVuZ3RoID09PSAwICYmIGdyb3Vwc0IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc0I7IC8vIE9uZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gdGhlIG9uZSB0aGF0IGlzIG5vdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdyb3Vwc0IubGVuZ3RoID09PSAwICYmIGdyb3Vwc0EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc0E7IC8vIE9uZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gdGhlIG9uZSB0aGF0IGlzIG5vdFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzOiBMaXRlcmFsW10gPSBbXTtcblxuICAgICAgICBpZiAoaGFzTWl4ZWRHcm91cExvZ2ljKGdyb3Vwc0EpIHx8IGhhc01peGVkR3JvdXBMb2dpYyhncm91cHNCKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1F1ZXJ5VmFyaWFibGVzIGdyb3VwcyBjb250YWluIG1peGVkIGdyb3VwIGxvZ2ljcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXBzQS5mb3JFYWNoKGdyb3VwQSA9PiB7XG4gICAgICAgICAgICBncm91cHNCLmZvckVhY2goZ3JvdXBCID0+IHtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaChtZXJnZVdpdGgoY2xvbmVEZWVwKGdyb3VwQSksIGdyb3VwQiwgbWVyZ2VDb25jYXRBcnJheSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,179 @@
1
+ import { FormArray, FormGroup, Validators, } from '@angular/forms';
2
+ import { of, timer } from 'rxjs';
3
+ import { filter, first, map, switchMap } from 'rxjs/operators';
4
+ import { NaturalQueryVariablesManager } from './query-variable-manager';
5
+ import { validTlds } from './tld';
6
+ /**
7
+ * Returns an async validator function that checks that the form control value is unique
8
+ */
9
+ export function unique(fieldName, excludedId, modelService) {
10
+ return (control) => {
11
+ if (!control.value || !control.dirty) {
12
+ return of(null);
13
+ }
14
+ const condition = {};
15
+ condition[fieldName] = { equal: { value: control.value } };
16
+ if (excludedId) {
17
+ condition['id'] = { equal: { value: excludedId, not: true } };
18
+ }
19
+ const variables = {
20
+ pagination: { pageIndex: 0, pageSize: 0 },
21
+ filter: { groups: [{ conditions: [condition] }] },
22
+ };
23
+ const qvm = new NaturalQueryVariablesManager();
24
+ qvm.set('variables', variables);
25
+ return timer(500).pipe(switchMap(() => modelService.count(qvm).pipe(map(count => (count > 0 ? { duplicateValue: count } : null)))));
26
+ };
27
+ }
28
+ /**
29
+ * Returns an async validator function that checks that the form control value is available
30
+ *
31
+ * Similar to `unique` validator, but allows to use a custom query for when the client does
32
+ * not have permissions for `modelService.count()`.
33
+ */
34
+ export function available(getAvailableQuery, excludedId = null) {
35
+ return (control) => {
36
+ if (!control.value || !control.dirty) {
37
+ return of(null);
38
+ }
39
+ return timer(500).pipe(switchMap(() => getAvailableQuery(control.value, excludedId).pipe(map(isAvailable => (isAvailable ? null : { available: true })))));
40
+ };
41
+ }
42
+ /**
43
+ * Return all errors recursively for the given Form or control
44
+ */
45
+ export function collectErrors(control) {
46
+ let errors = null;
47
+ if (control instanceof FormGroup || control instanceof FormArray) {
48
+ errors = Object.entries(control.controls).reduce((acc, [key, childControl]) => {
49
+ const childErrors = collectErrors(childControl);
50
+ if (childErrors) {
51
+ acc = { ...acc, [key]: childErrors };
52
+ }
53
+ return acc;
54
+ }, null);
55
+ }
56
+ if (!errors) {
57
+ errors = control.errors;
58
+ }
59
+ return errors;
60
+ }
61
+ /**
62
+ * Force validation of all form controls recursively.
63
+ *
64
+ * Recursively mark descending form tree as dirty and touched in order to show all invalid fields on demand.
65
+ * Typically used when creating a new object and user clicked on create button but several fields were not
66
+ * touched and are invalid.
67
+ */
68
+ export function validateAllFormControls(control) {
69
+ control.markAsDirty({ onlySelf: true });
70
+ control.markAsTouched({ onlySelf: true });
71
+ if (control instanceof FormGroup || control instanceof FormArray) {
72
+ for (const [, child] of Object.entries(control.controls)) {
73
+ validateAllFormControls(child);
74
+ }
75
+ }
76
+ }
77
+ function isValid(status) {
78
+ return status === 'VALID';
79
+ }
80
+ /**
81
+ * Emits exactly 0 or 1 time:
82
+ *
83
+ * - if the form is VALID, emits immediately
84
+ * - if the form is PENDING emits if it changes from PENDING to VALID
85
+ * - any other cases will **never** emit
86
+ */
87
+ export function ifValid(control) {
88
+ const observable = control.pending ? control.statusChanges.pipe(first()) : of(control.status);
89
+ return observable.pipe(filter(isValid));
90
+ }
91
+ // This is is an approximation of RFC_5322 where the hostname:
92
+ //
93
+ // - is too strict because it rejects IP address
94
+ // - is too lax because it accepts pretty much anything else
95
+ //
96
+ // but the TLD will be validated against a whitelist so that should make the whole thing acceptable
97
+ const RFC_5322 = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[^@ ]+\.[^@]+$/u;
98
+ /**
99
+ * Validate an email address according to RFC, and also that it is publicly deliverable (not "root@localhost" or "root@127.0.0.1")
100
+ *
101
+ * This is meant to replace **all** usages of Angular too permissive `Validators.email`
102
+ */
103
+ export function deliverableEmail(control) {
104
+ // don't validate empty values to allow optional controls
105
+ const value = control.value;
106
+ if (!value) {
107
+ return null;
108
+ }
109
+ const error = { email: true };
110
+ if (value.length > 254) {
111
+ return error;
112
+ }
113
+ if (!RFC_5322.test(value)) {
114
+ return error;
115
+ }
116
+ const tld = value.split('.').pop();
117
+ if (!validTlds.includes(tld)) {
118
+ return error;
119
+ }
120
+ return null;
121
+ }
122
+ /**
123
+ * Naive URL validator for "normal" web links, that is a bit too permissive
124
+ *
125
+ * It enforces:
126
+ *
127
+ * - http/https protocol
128
+ * - one domain
129
+ * - one tld
130
+ *
131
+ * It allows:
132
+ *
133
+ * - any number of subdomains
134
+ * - any parameters
135
+ * - any fragments
136
+ * - any characters for any parts (does not conform to rfc1738)
137
+ */
138
+ export const urlValidator = Validators.pattern(/^https?:\/\/(?:[^.\s]+\.)+[^.\s]+$/);
139
+ /**
140
+ * Validates that the value is an integer (non-float)
141
+ */
142
+ export function integer(control) {
143
+ // Don't validate empty values to allow optional controls
144
+ if (control.value === null || control.value === undefined || control.value === '') {
145
+ return null;
146
+ }
147
+ return Number.isInteger(parseFloat(control.value)) ? null : { integer: true };
148
+ }
149
+ /**
150
+ * Validate that the value is a decimal number with up to `scale` digits
151
+ *
152
+ * The error contains the expected scale, so that the error message can explain
153
+ * it to the end-user.
154
+ */
155
+ export function decimal(scale) {
156
+ const regExp = new RegExp(`^-?\\d+(\\.\\d{0,${scale}})?$`);
157
+ return control => {
158
+ // Don't validate empty values to allow optional controls
159
+ if (control.value === null || control.value === undefined || control.value === '') {
160
+ return null;
161
+ }
162
+ const value = '' + control.value;
163
+ if (value.match(regExp)) {
164
+ return null;
165
+ }
166
+ return { decimal: scale };
167
+ };
168
+ }
169
+ /**
170
+ * For internal use to avoid re-creating regexp on each call of `money`
171
+ */
172
+ const twoDecimals = decimal(2);
173
+ /**
174
+ * Validate that the value is an amount of money, meaning a number with at most 2 decimals
175
+ */
176
+ export function money(control) {
177
+ return twoDecimals(control) ? { money: true } : null;
178
+ }
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9jbGFzc2VzL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFFVCxTQUFTLEVBR1QsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBQyw0QkFBNEIsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBR2hDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsU0FBaUIsRUFDakIsVUFBcUMsRUFDckMsWUFBc0I7SUFFdEIsT0FBTyxDQUFDLE9BQXdCLEVBQXVDLEVBQUU7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CO1FBRUQsTUFBTSxTQUFTLEdBQXlCLEVBQUUsQ0FBQztRQUMzQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBQyxFQUFDLENBQUM7UUFFdkQsSUFBSSxVQUFVLEVBQUU7WUFDWixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDO1NBQzdEO1FBRUQsTUFBTSxTQUFTLEdBQW1CO1lBQzlCLFVBQVUsRUFBRSxFQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBQztZQUN2QyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsRUFBQztTQUNoRCxDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1FBQy9DLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWhDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDbEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxjQUFjLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM1RyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDckIsaUJBQW9GLEVBQ3BGLGFBQTRCLElBQUk7SUFFaEMsT0FBTyxDQUFDLE9BQXdCLEVBQXVDLEVBQUU7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CO1FBRUQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUNsQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQ1gsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FDL0QsQ0FDSixDQUNKLENBQUM7SUFDTixDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQXdCO0lBQ2xELElBQUksTUFBTSxHQUE0QixJQUFJLENBQUM7SUFDM0MsSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7UUFDOUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQTRCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTtZQUNuRyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEQsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsR0FBRyxHQUFHLEVBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ1o7SUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ1QsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDM0I7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQXdCO0lBQzVELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFFeEMsSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7UUFDOUQsS0FBSyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN0RCx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztLQUNKO0FBQ0wsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLE1BQXlCO0lBQ3RDLE9BQU8sTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUF3QjtJQUM1QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlGLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsOERBQThEO0FBQzlELEVBQUU7QUFDRixnREFBZ0Q7QUFDaEQsNERBQTREO0FBQzVELEVBQUU7QUFDRixtR0FBbUc7QUFDbkcsTUFBTSxRQUFRLEdBQUcsb0RBQW9ELENBQUM7QUFFdEU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUF3QjtJQUNyRCx5REFBeUQ7SUFDekQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1IsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELE1BQU0sS0FBSyxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzVCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDcEIsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2QixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDMUIsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUVyRjs7R0FFRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsT0FBd0I7SUFDNUMseURBQXlEO0lBQ3pELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7UUFDL0UsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLG9CQUFvQixLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQzNELE9BQU8sT0FBTyxDQUFDLEVBQUU7UUFDYix5REFBeUQ7UUFDekQsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUMvRSxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUvQjs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBd0I7SUFDMUMsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIEFzeW5jVmFsaWRhdG9yRm4sXG4gICAgRm9ybUFycmF5LFxuICAgIEZvcm1Db250cm9sU3RhdHVzLFxuICAgIEZvcm1Hcm91cCxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvckZuLFxuICAgIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2YsIHRpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0TW9kZWxTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4vcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge3ZhbGlkVGxkc30gZnJvbSAnLi90bGQnO1xuaW1wb3J0IHtGaWx0ZXJHcm91cENvbmRpdGlvbn0gZnJvbSAnLi4vbW9kdWxlcy9zZWFyY2gvY2xhc3Nlcy9ncmFwaHFsLWRvY3RyaW5lLnR5cGVzJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyB0aGF0IHRoZSBmb3JtIGNvbnRyb2wgdmFsdWUgaXMgdW5pcXVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55Pj4oXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZXhjbHVkZWRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBtb2RlbFNlcnZpY2U6IFRTZXJ2aWNlLFxuKTogQXN5bmNWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSB8fCAhY29udHJvbC5kaXJ0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uOiBGaWx0ZXJHcm91cENvbmRpdGlvbiA9IHt9O1xuICAgICAgICBjb25kaXRpb25bZmllbGROYW1lXSA9IHtlcXVhbDoge3ZhbHVlOiBjb250cm9sLnZhbHVlfX07XG5cbiAgICAgICAgaWYgKGV4Y2x1ZGVkSWQpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvblsnaWQnXSA9IHtlcXVhbDoge3ZhbHVlOiBleGNsdWRlZElkLCBub3Q6IHRydWV9fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlczogUXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7cGFnZUluZGV4OiAwLCBwYWdlU2l6ZTogMH0sXG4gICAgICAgICAgICBmaWx0ZXI6IHtncm91cHM6IFt7Y29uZGl0aW9uczogW2NvbmRpdGlvbl19XX0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcXZtID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXIoKTtcbiAgICAgICAgcXZtLnNldCgndmFyaWFibGVzJywgdmFyaWFibGVzKTtcblxuICAgICAgICByZXR1cm4gdGltZXIoNTAwKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1vZGVsU2VydmljZS5jb3VudChxdm0pLnBpcGUobWFwKGNvdW50ID0+IChjb3VudCA+IDAgPyB7ZHVwbGljYXRlVmFsdWU6IGNvdW50fSA6IG51bGwpKSkpLFxuICAgICAgICApO1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCB0aGUgZm9ybSBjb250cm9sIHZhbHVlIGlzIGF2YWlsYWJsZVxuICpcbiAqIFNpbWlsYXIgdG8gYHVuaXF1ZWAgdmFsaWRhdG9yLCBidXQgYWxsb3dzIHRvIHVzZSBhIGN1c3RvbSBxdWVyeSBmb3Igd2hlbiB0aGUgY2xpZW50IGRvZXNcbiAqIG5vdCBoYXZlIHBlcm1pc3Npb25zIGZvciBgbW9kZWxTZXJ2aWNlLmNvdW50KClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlKFxuICAgIGdldEF2YWlsYWJsZVF1ZXJ5OiAodmFsdWU6IHN0cmluZywgZXhjbHVkZWRJZDogc3RyaW5nIHwgbnVsbCkgPT4gT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBleGNsdWRlZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbik6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgIWNvbnRyb2wuZGlydHkpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lcig1MDApLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVRdWVyeShjb250cm9sLnZhbHVlLCBleGNsdWRlZElkKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoaXNBdmFpbGFibGUgPT4gKGlzQXZhaWxhYmxlID8gbnVsbCA6IHthdmFpbGFibGU6IHRydWV9KSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWxsIGVycm9ycyByZWN1cnNpdmVseSBmb3IgdGhlIGdpdmVuIEZvcm0gb3IgY29udHJvbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEVycm9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgbGV0IGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgZXJyb3JzID0gT2JqZWN0LmVudHJpZXMoY29udHJvbC5jb250cm9scykucmVkdWNlKChhY2M6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsLCBba2V5LCBjaGlsZENvbnRyb2xdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZEVycm9ycyA9IGNvbGxlY3RFcnJvcnMoY2hpbGRDb250cm9sKTtcbiAgICAgICAgICAgIGlmIChjaGlsZEVycm9ycykge1xuICAgICAgICAgICAgICAgIGFjYyA9IHsuLi5hY2MsIFtrZXldOiBjaGlsZEVycm9yc307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoIWVycm9ycykge1xuICAgICAgICBlcnJvcnMgPSBjb250cm9sLmVycm9ycztcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuXG4vKipcbiAqIEZvcmNlIHZhbGlkYXRpb24gb2YgYWxsIGZvcm0gY29udHJvbHMgcmVjdXJzaXZlbHkuXG4gKlxuICogUmVjdXJzaXZlbHkgbWFyayBkZXNjZW5kaW5nIGZvcm0gdHJlZSBhcyBkaXJ0eSBhbmQgdG91Y2hlZCBpbiBvcmRlciB0byBzaG93IGFsbCBpbnZhbGlkIGZpZWxkcyBvbiBkZW1hbmQuXG4gKiBUeXBpY2FsbHkgdXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgdXNlciBjbGlja2VkIG9uIGNyZWF0ZSBidXR0b24gYnV0IHNldmVyYWwgZmllbGRzIHdlcmUgbm90XG4gKiB0b3VjaGVkIGFuZCBhcmUgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWxsRm9ybUNvbnRyb2xzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xuICAgIGNvbnRyb2wubWFya0FzRGlydHkoe29ubHlTZWxmOiB0cnVlfSk7XG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICBmb3IgKGNvbnN0IFssIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhjb250cm9sLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVBbGxGb3JtQ29udHJvbHMoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkKHN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMpOiBzdGF0dXMgaXMgJ1ZBTElEJyB7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gJ1ZBTElEJztcbn1cblxuLyoqXG4gKiBFbWl0cyBleGFjdGx5IDAgb3IgMSB0aW1lOlxuICpcbiAqIC0gaWYgdGhlIGZvcm0gaXMgVkFMSUQsIGVtaXRzIGltbWVkaWF0ZWx5XG4gKiAtIGlmIHRoZSBmb3JtIGlzIFBFTkRJTkcgZW1pdHMgaWYgaXQgY2hhbmdlcyBmcm9tIFBFTkRJTkcgdG8gVkFMSURcbiAqIC0gYW55IG90aGVyIGNhc2VzIHdpbGwgKipuZXZlcioqIGVtaXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlmVmFsaWQoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogT2JzZXJ2YWJsZTwnVkFMSUQnPiB7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IGNvbnRyb2wucGVuZGluZyA/IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKGZpcnN0KCkpIDogb2YoY29udHJvbC5zdGF0dXMpO1xuXG4gICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShmaWx0ZXIoaXNWYWxpZCkpO1xufVxuXG4vLyBUaGlzIGlzIGlzIGFuIGFwcHJveGltYXRpb24gb2YgUkZDXzUzMjIgd2hlcmUgdGhlIGhvc3RuYW1lOlxuLy9cbi8vIC0gaXMgdG9vIHN0cmljdCBiZWNhdXNlIGl0IHJlamVjdHMgSVAgYWRkcmVzc1xuLy8gLSBpcyB0b28gbGF4IGJlY2F1c2UgaXQgYWNjZXB0cyBwcmV0dHkgbXVjaCBhbnl0aGluZyBlbHNlXG4vL1xuLy8gYnV0IHRoZSBUTEQgd2lsbCBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBhIHdoaXRlbGlzdCBzbyB0aGF0IHNob3VsZCBtYWtlIHRoZSB3aG9sZSB0aGluZyBhY2NlcHRhYmxlXG5jb25zdCBSRkNfNTMyMiA9IC9eW2EtekEtWjAtOS4hIyQlJicqK1xcLz0/Xl9ge3x9fi1dK0BbXkAgXStcXC5bXkBdKyQvdTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhbiBlbWFpbCBhZGRyZXNzIGFjY29yZGluZyB0byBSRkMsIGFuZCBhbHNvIHRoYXQgaXQgaXMgcHVibGljbHkgZGVsaXZlcmFibGUgKG5vdCBcInJvb3RAbG9jYWxob3N0XCIgb3IgXCJyb290QDEyNy4wLjAuMVwiKVxuICpcbiAqIFRoaXMgaXMgbWVhbnQgdG8gcmVwbGFjZSAqKmFsbCoqIHVzYWdlcyBvZiBBbmd1bGFyIHRvbyBwZXJtaXNzaXZlIGBWYWxpZGF0b3JzLmVtYWlsYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsaXZlcmFibGVFbWFpbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgLy8gZG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IG9wdGlvbmFsIGNvbnRyb2xzXG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSB7ZW1haWw6IHRydWV9O1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiAyNTQpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cblxuICAgIGlmICghUkZDXzUzMjIudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IHRsZCA9IHZhbHVlLnNwbGl0KCcuJykucG9wKCk7XG4gICAgaWYgKCF2YWxpZFRsZHMuaW5jbHVkZXModGxkKSkge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogTmFpdmUgVVJMIHZhbGlkYXRvciBmb3IgXCJub3JtYWxcIiB3ZWIgbGlua3MsIHRoYXQgaXMgYSBiaXQgdG9vIHBlcm1pc3NpdmVcbiAqXG4gKiBJdCBlbmZvcmNlczpcbiAqXG4gKiAgICAgLSBodHRwL2h0dHBzIHByb3RvY29sXG4gKiAgICAgLSBvbmUgZG9tYWluXG4gKiAgICAgLSBvbmUgdGxkXG4gKlxuICogSXQgYWxsb3dzOlxuICpcbiAqICAgICAtIGFueSBudW1iZXIgb2Ygc3ViZG9tYWluc1xuICogICAgIC0gYW55IHBhcmFtZXRlcnNcbiAqICAgICAtIGFueSBmcmFnbWVudHNcbiAqICAgICAtIGFueSBjaGFyYWN0ZXJzIGZvciBhbnkgcGFydHMgKGRvZXMgbm90IGNvbmZvcm0gdG8gcmZjMTczOClcbiAqL1xuZXhwb3J0IGNvbnN0IHVybFZhbGlkYXRvciA9IFZhbGlkYXRvcnMucGF0dGVybigvXmh0dHBzPzpcXC9cXC8oPzpbXi5cXHNdK1xcLikrW14uXFxzXSskLyk7XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIgKG5vbi1mbG9hdClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIC8vIERvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xuICAgIGlmIChjb250cm9sLnZhbHVlID09PSBudWxsIHx8IGNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjb250cm9sLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYXJzZUZsb2F0KGNvbnRyb2wudmFsdWUpKSA/IG51bGwgOiB7aW50ZWdlcjogdHJ1ZX07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCB0aGUgdmFsdWUgaXMgYSBkZWNpbWFsIG51bWJlciB3aXRoIHVwIHRvIGBzY2FsZWAgZGlnaXRzXG4gKlxuICogVGhlIGVycm9yIGNvbnRhaW5zIHRoZSBleHBlY3RlZCBzY2FsZSwgc28gdGhhdCB0aGUgZXJyb3IgbWVzc2FnZSBjYW4gZXhwbGFpblxuICogaXQgdG8gdGhlIGVuZC11c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjaW1hbChzY2FsZTogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyBSZWdFeHAoYF4tP1xcXFxkKyhcXFxcLlxcXFxkezAsJHtzY2FsZX19KT8kYCk7XG4gICAgcmV0dXJuIGNvbnRyb2wgPT4ge1xuICAgICAgICAvLyBEb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHNcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgPT09IG51bGwgfHwgY29udHJvbC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGNvbnRyb2wudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gJycgKyBjb250cm9sLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUubWF0Y2gocmVnRXhwKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2RlY2ltYWw6IHNjYWxlfTtcbiAgICB9O1xufVxuXG4vKipcbiAqIEZvciBpbnRlcm5hbCB1c2UgdG8gYXZvaWQgcmUtY3JlYXRpbmcgcmVnZXhwIG9uIGVhY2ggY2FsbCBvZiBgbW9uZXlgXG4gKi9cbmNvbnN0IHR3b0RlY2ltYWxzID0gZGVjaW1hbCgyKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSB2YWx1ZSBpcyBhbiBhbW91bnQgb2YgbW9uZXksIG1lYW5pbmcgYSBudW1iZXIgd2l0aCBhdCBtb3N0IDIgZGVjaW1hbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbmV5KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdHdvRGVjaW1hbHMoY29udHJvbCkgPyB7bW9uZXk6IHRydWV9IDogbnVsbDtcbn1cbiJdfQ==
@@ -0,0 +1,50 @@
1
+ import { Directive, HostListener, Input } from '@angular/core';
2
+ import { NaturalAbstractController } from '../classes/abstract-controller';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Need to add http:// prefix if we don't have prefix already AND we don't have part of it
6
+ */
7
+ export function ensureHttpPrefix(value) {
8
+ if (!value) {
9
+ return value;
10
+ }
11
+ const completePrefix = /^(https?):\/\//i.test(value);
12
+ const startingPrefix = 'https://'.indexOf(value) === 0 || 'http://'.indexOf(value) === 0;
13
+ if (!completePrefix && !startingPrefix) {
14
+ return 'http://' + value;
15
+ }
16
+ else {
17
+ return value;
18
+ }
19
+ }
20
+ /**
21
+ * This directive only supports ReactiveForms due to ngModel/ngControl encapsulation and changes emissions.
22
+ */
23
+ export class NaturalHttpPrefixDirective extends NaturalAbstractController {
24
+ constructor() {
25
+ super();
26
+ this.naturalHttpPrefix = null;
27
+ }
28
+ httpize($event) {
29
+ if (this.naturalHttpPrefix) {
30
+ const newValue = ensureHttpPrefix($event) || $event;
31
+ if ($event !== newValue) {
32
+ this.naturalHttpPrefix.setValue(newValue);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ NaturalHttpPrefixDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalHttpPrefixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
38
+ NaturalHttpPrefixDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: NaturalHttpPrefixDirective, selector: "[naturalHttpPrefix]", inputs: { naturalHttpPrefix: "naturalHttpPrefix" }, host: { listeners: { "ngModelChange": "httpize($event)" } }, usesInheritance: true, ngImport: i0 });
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalHttpPrefixDirective, decorators: [{
40
+ type: Directive,
41
+ args: [{
42
+ selector: '[naturalHttpPrefix]',
43
+ }]
44
+ }], ctorParameters: function () { return []; }, propDecorators: { naturalHttpPrefix: [{
45
+ type: Input
46
+ }], httpize: [{
47
+ type: HostListener,
48
+ args: ['ngModelChange', ['$event']]
49
+ }] } });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1wcmVmaXguZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL2RpcmVjdGl2ZXMvaHR0cC1wcmVmaXguZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFekU7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBb0I7SUFDakQsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNSLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBRUQsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpGLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDcEMsT0FBTyxTQUFTLEdBQUcsS0FBSyxDQUFDO0tBQzVCO1NBQU07UUFDSCxPQUFPLEtBQUssQ0FBQztLQUNoQjtBQUNMLENBQUM7QUFFRDs7R0FFRztBQUlILE1BQU0sT0FBTywwQkFBMkIsU0FBUSx5QkFBeUI7SUFHckU7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQUhJLHNCQUFpQixHQUEyQixJQUFJLENBQUM7SUFJakUsQ0FBQztJQUdNLE9BQU8sQ0FBQyxNQUFjO1FBQ3pCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQztZQUNwRCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0M7U0FDSjtJQUNMLENBQUM7O3VIQWZRLDBCQUEwQjsyR0FBMUIsMEJBQTBCOzJGQUExQiwwQkFBMEI7a0JBSHRDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHFCQUFxQjtpQkFDbEM7MEVBRW1CLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFPQyxPQUFPO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0Q29udHJvbGxlcn0gZnJvbSAnLi4vY2xhc3Nlcy9hYnN0cmFjdC1jb250cm9sbGVyJztcblxuLyoqXG4gKiBOZWVkIHRvIGFkZCAgaHR0cDovLyBwcmVmaXggaWYgd2UgZG9uJ3QgaGF2ZSBwcmVmaXggYWxyZWFkeSBBTkQgd2UgZG9uJ3QgaGF2ZSBwYXJ0IG9mIGl0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVIdHRwUHJlZml4KHZhbHVlOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVQcmVmaXggPSAvXihodHRwcz8pOlxcL1xcLy9pLnRlc3QodmFsdWUpO1xuICAgIGNvbnN0IHN0YXJ0aW5nUHJlZml4ID0gJ2h0dHBzOi8vJy5pbmRleE9mKHZhbHVlKSA9PT0gMCB8fCAnaHR0cDovLycuaW5kZXhPZih2YWx1ZSkgPT09IDA7XG5cbiAgICBpZiAoIWNvbXBsZXRlUHJlZml4ICYmICFzdGFydGluZ1ByZWZpeCkge1xuICAgICAgICByZXR1cm4gJ2h0dHA6Ly8nICsgdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBvbmx5IHN1cHBvcnRzIFJlYWN0aXZlRm9ybXMgZHVlIHRvIG5nTW9kZWwvbmdDb250cm9sIGVuY2Fwc3VsYXRpb24gYW5kIGNoYW5nZXMgZW1pc3Npb25zLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tuYXR1cmFsSHR0cFByZWZpeF0nLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsSHR0cFByZWZpeERpcmVjdGl2ZSBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdENvbnRyb2xsZXIge1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYXR1cmFsSHR0cFByZWZpeDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGh0dHBpemUoJGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0dXJhbEh0dHBQcmVmaXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZW5zdXJlSHR0cFByZWZpeCgkZXZlbnQpIHx8ICRldmVudDtcbiAgICAgICAgICAgIGlmICgkZXZlbnQgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXR1cmFsSHR0cFByZWZpeC5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,20 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { MatButtonModule } from '@angular/material/button';
4
+ import { MatDialogModule } from '@angular/material/dialog';
5
+ import { MatSnackBarModule } from '@angular/material/snack-bar';
6
+ import { NaturalConfirmComponent } from './confirm.component';
7
+ import * as i0 from "@angular/core";
8
+ export class NaturalAlertModule {
9
+ }
10
+ NaturalAlertModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalAlertModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
+ NaturalAlertModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalAlertModule, declarations: [NaturalConfirmComponent], imports: [CommonModule, MatDialogModule, MatSnackBarModule, MatButtonModule] });
12
+ NaturalAlertModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalAlertModule, imports: [[CommonModule, MatDialogModule, MatSnackBarModule, MatButtonModule]] });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalAlertModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ declarations: [NaturalConfirmComponent],
17
+ imports: [CommonModule, MatDialogModule, MatSnackBarModule, MatButtonModule],
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvYWxlcnQvYWxlcnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0scUJBQXFCLENBQUM7O0FBTTVELE1BQU0sT0FBTyxrQkFBa0I7OytHQUFsQixrQkFBa0I7Z0hBQWxCLGtCQUFrQixpQkFIWix1QkFBdUIsYUFDNUIsWUFBWSxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxlQUFlO2dIQUVsRSxrQkFBa0IsWUFGbEIsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQzsyRkFFbkUsa0JBQWtCO2tCQUo5QixRQUFRO21CQUFDO29CQUNOLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQztpQkFDL0UiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge01hdERpYWxvZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7TWF0U25hY2tCYXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQge05hdHVyYWxDb25maXJtQ29tcG9uZW50fSBmcm9tICcuL2NvbmZpcm0uY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtOYXR1cmFsQ29uZmlybUNvbXBvbmVudF0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBNYXRTbmFja0Jhck1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbEFsZXJ0TW9kdWxlIHt9XG4iXX0=