@igo2/common 18.0.0 → 18.0.1-next.2

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 (312) hide show
  1. package/entity/src/entity-table/entity-table.theming.scss +1 -1
  2. package/fesm2022/igo2-common-action.mjs +16 -16
  3. package/fesm2022/igo2-common-action.mjs.map +1 -1
  4. package/fesm2022/igo2-common-backdrop.mjs +8 -8
  5. package/fesm2022/igo2-common-backdrop.mjs.map +1 -1
  6. package/fesm2022/igo2-common-badge.mjs +7 -7
  7. package/fesm2022/igo2-common-badge.mjs.map +1 -1
  8. package/fesm2022/igo2-common-clickout.mjs +7 -7
  9. package/fesm2022/igo2-common-clickout.mjs.map +1 -1
  10. package/fesm2022/igo2-common-clone.mjs +7 -7
  11. package/fesm2022/igo2-common-clone.mjs.map +1 -1
  12. package/fesm2022/igo2-common-collapsible.mjs +11 -11
  13. package/fesm2022/igo2-common-collapsible.mjs.map +1 -1
  14. package/fesm2022/igo2-common-color.mjs +9 -9
  15. package/fesm2022/igo2-common-color.mjs.map +1 -1
  16. package/fesm2022/igo2-common-confirm-dialog.mjs +11 -11
  17. package/fesm2022/igo2-common-confirm-dialog.mjs.map +1 -1
  18. package/fesm2022/igo2-common-context-menu.mjs +10 -10
  19. package/fesm2022/igo2-common-context-menu.mjs.map +1 -1
  20. package/fesm2022/igo2-common-custom-html.mjs +11 -11
  21. package/fesm2022/igo2-common-custom-html.mjs.map +1 -1
  22. package/fesm2022/igo2-common-dom.mjs +7 -7
  23. package/fesm2022/igo2-common-dom.mjs.map +1 -1
  24. package/fesm2022/igo2-common-drag-drop.mjs +10 -10
  25. package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
  26. package/fesm2022/igo2-common-dynamic-component.mjs +14 -14
  27. package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -1
  28. package/fesm2022/igo2-common-entity.mjs +33 -33
  29. package/fesm2022/igo2-common-entity.mjs.map +1 -1
  30. package/fesm2022/igo2-common-flexible.mjs +7 -7
  31. package/fesm2022/igo2-common-flexible.mjs.map +1 -1
  32. package/fesm2022/igo2-common-form.mjs +57 -57
  33. package/fesm2022/igo2-common-form.mjs.map +1 -1
  34. package/fesm2022/igo2-common-home-button.mjs +8 -8
  35. package/fesm2022/igo2-common-home-button.mjs.map +1 -1
  36. package/fesm2022/igo2-common-icon.mjs +13 -14
  37. package/fesm2022/igo2-common-icon.mjs.map +1 -1
  38. package/fesm2022/igo2-common-image.mjs +10 -10
  39. package/fesm2022/igo2-common-image.mjs.map +1 -1
  40. package/fesm2022/igo2-common-interactive-tour.mjs +14 -14
  41. package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -1
  42. package/fesm2022/igo2-common-json-dialog.mjs +11 -11
  43. package/fesm2022/igo2-common-json-dialog.mjs.map +1 -1
  44. package/fesm2022/igo2-common-keyvalue.mjs +7 -7
  45. package/fesm2022/igo2-common-keyvalue.mjs.map +1 -1
  46. package/fesm2022/igo2-common-list.mjs +11 -11
  47. package/fesm2022/igo2-common-list.mjs.map +1 -1
  48. package/fesm2022/igo2-common-panel.mjs +8 -8
  49. package/fesm2022/igo2-common-panel.mjs.map +1 -1
  50. package/fesm2022/igo2-common-select-value-dialog.mjs +11 -11
  51. package/fesm2022/igo2-common-select-value-dialog.mjs.map +1 -1
  52. package/fesm2022/igo2-common-sidenav.mjs +7 -7
  53. package/fesm2022/igo2-common-sidenav.mjs.map +1 -1
  54. package/fesm2022/igo2-common-spinner.mjs +11 -11
  55. package/fesm2022/igo2-common-spinner.mjs.map +1 -1
  56. package/fesm2022/igo2-common-stop-propagation.mjs +10 -10
  57. package/fesm2022/igo2-common-stop-propagation.mjs.map +1 -1
  58. package/fesm2022/igo2-common-table.mjs +8 -8
  59. package/fesm2022/igo2-common-table.mjs.map +1 -1
  60. package/fesm2022/igo2-common-tool.mjs +15 -15
  61. package/fesm2022/igo2-common-tool.mjs.map +1 -1
  62. package/fesm2022/igo2-common-widget.mjs +15 -15
  63. package/fesm2022/igo2-common-widget.mjs.map +1 -1
  64. package/fesm2022/igo2-common-workspace.mjs +20 -20
  65. package/fesm2022/igo2-common-workspace.mjs.map +1 -1
  66. package/package.json +8 -76
  67. package/src/style/style.scss +1 -1
  68. package/style/style.css +4 -1
  69. package/esm2022/action/action.module.mjs +0 -19
  70. package/esm2022/action/actionbar/actionbar-item.component.mjs +0 -192
  71. package/esm2022/action/actionbar/actionbar.component.mjs +0 -277
  72. package/esm2022/action/actionbar/actionbar.module.mjs +0 -19
  73. package/esm2022/action/igo2-common-action.mjs +0 -5
  74. package/esm2022/action/public_api.mjs +0 -5
  75. package/esm2022/action/shared/action.enums.mjs +0 -7
  76. package/esm2022/action/shared/action.interfaces.mjs +0 -2
  77. package/esm2022/action/shared/index.mjs +0 -4
  78. package/esm2022/action/shared/store.mjs +0 -8
  79. package/esm2022/backdrop/backdrop.component.mjs +0 -21
  80. package/esm2022/backdrop/backdrop.module.mjs +0 -25
  81. package/esm2022/backdrop/igo2-common-backdrop.mjs +0 -5
  82. package/esm2022/backdrop/public_api.mjs +0 -3
  83. package/esm2022/badge/badge-icon.directive.mjs +0 -149
  84. package/esm2022/badge/badge-icon.module.mjs +0 -25
  85. package/esm2022/badge/igo2-common-badge.mjs +0 -5
  86. package/esm2022/badge/public_api.mjs +0 -3
  87. package/esm2022/clickout/clickout.directive.mjs +0 -32
  88. package/esm2022/clickout/clickout.module.mjs +0 -25
  89. package/esm2022/clickout/igo2-common-clickout.mjs +0 -5
  90. package/esm2022/clickout/public_api.mjs +0 -3
  91. package/esm2022/clone/clone.module.mjs +0 -25
  92. package/esm2022/clone/clone.pipe.mjs +0 -25
  93. package/esm2022/clone/igo2-common-clone.mjs +0 -5
  94. package/esm2022/clone/public_api.mjs +0 -3
  95. package/esm2022/collapsible/collapse.directive.mjs +0 -57
  96. package/esm2022/collapsible/collapsible.component.mjs +0 -38
  97. package/esm2022/collapsible/collapsible.module.mjs +0 -26
  98. package/esm2022/collapsible/igo2-common-collapsible.mjs +0 -5
  99. package/esm2022/collapsible/public_api.mjs +0 -10
  100. package/esm2022/color/color-picker-form-field/color-picker-form-field.component.mjs +0 -104
  101. package/esm2022/color/color-picker-form-field/color-picker-form-field.module.mjs +0 -19
  102. package/esm2022/color/color-picker-form-field/index.mjs +0 -3
  103. package/esm2022/color/igo2-common-color.mjs +0 -5
  104. package/esm2022/color/public_api.mjs +0 -2
  105. package/esm2022/confirm-dialog/confirm-dialog.component.mjs +0 -31
  106. package/esm2022/confirm-dialog/confirm-dialog.interface.mjs +0 -2
  107. package/esm2022/confirm-dialog/confirm-dialog.module.mjs +0 -27
  108. package/esm2022/confirm-dialog/confirm-dialog.service.mjs +0 -35
  109. package/esm2022/confirm-dialog/igo2-common-confirm-dialog.mjs +0 -5
  110. package/esm2022/confirm-dialog/public_api.mjs +0 -5
  111. package/esm2022/context-menu/context-menu.directive.mjs +0 -109
  112. package/esm2022/context-menu/context-menu.module.mjs +0 -26
  113. package/esm2022/context-menu/igo2-common-context-menu.mjs +0 -5
  114. package/esm2022/context-menu/long-press.directive.mjs +0 -65
  115. package/esm2022/context-menu/public_api.mjs +0 -10
  116. package/esm2022/custom-html/custom-html.component.mjs +0 -21
  117. package/esm2022/custom-html/custom-html.module.mjs +0 -25
  118. package/esm2022/custom-html/custom-html.pipe.mjs +0 -23
  119. package/esm2022/custom-html/igo2-common-custom-html.mjs +0 -5
  120. package/esm2022/custom-html/public_api.mjs +0 -10
  121. package/esm2022/dom/dom.interfaces.mjs +0 -2
  122. package/esm2022/dom/dom.module.mjs +0 -27
  123. package/esm2022/dom/dom.service.mjs +0 -35
  124. package/esm2022/dom/igo2-common-dom.mjs +0 -5
  125. package/esm2022/dom/public_api.mjs +0 -4
  126. package/esm2022/drag-drop/drag-drop.directive.mjs +0 -82
  127. package/esm2022/drag-drop/drag-drop.module.mjs +0 -26
  128. package/esm2022/drag-drop/igo2-common-drag-drop.mjs +0 -5
  129. package/esm2022/drag-drop/public_api.mjs +0 -4
  130. package/esm2022/drag-drop/tree-drag-drop/index.mjs +0 -3
  131. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.directive.mjs +0 -391
  132. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.interface.mjs +0 -2
  133. package/esm2022/dynamic-component/dynamic-component.module.mjs +0 -19
  134. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +0 -129
  135. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +0 -19
  136. package/esm2022/dynamic-component/igo2-common-dynamic-component.mjs +0 -5
  137. package/esm2022/dynamic-component/public_api.mjs +0 -5
  138. package/esm2022/dynamic-component/shared/dynamic-component.interfaces.mjs +0 -2
  139. package/esm2022/dynamic-component/shared/dynamic-component.mjs +0 -183
  140. package/esm2022/dynamic-component/shared/dynamic-component.service.mjs +0 -30
  141. package/esm2022/dynamic-component/shared/index.mjs +0 -4
  142. package/esm2022/entity/entity-selector/entity-selector.component.mjs +0 -174
  143. package/esm2022/entity/entity-selector/entity-selector.module.mjs +0 -19
  144. package/esm2022/entity/entity-selector/index.mjs +0 -3
  145. package/esm2022/entity/entity-table/entity-table-row.directive.mjs +0 -138
  146. package/esm2022/entity/entity-table/entity-table.component.mjs +0 -883
  147. package/esm2022/entity/entity-table/entity-table.module.mjs +0 -19
  148. package/esm2022/entity/entity-table/index.mjs +0 -3
  149. package/esm2022/entity/entity-table-paginator/entity-table-paginator.component.mjs +0 -158
  150. package/esm2022/entity/entity-table-paginator/entity-table-paginator.interface.mjs +0 -2
  151. package/esm2022/entity/entity-table-paginator/entity-table-paginator.module.mjs +0 -19
  152. package/esm2022/entity/entity-table-paginator/index.mjs +0 -4
  153. package/esm2022/entity/entity.module.mjs +0 -30
  154. package/esm2022/entity/igo2-common-entity.mjs +0 -5
  155. package/esm2022/entity/public_api.mjs +0 -6
  156. package/esm2022/entity/shared/entity.enums.mjs +0 -28
  157. package/esm2022/entity/shared/entity.interfaces.mjs +0 -2
  158. package/esm2022/entity/shared/entity.utils.mjs +0 -73
  159. package/esm2022/entity/shared/index.mjs +0 -10
  160. package/esm2022/entity/shared/state.mjs +0 -194
  161. package/esm2022/entity/shared/store.mjs +0 -322
  162. package/esm2022/entity/shared/strategies/filter-custom-function.mjs +0 -80
  163. package/esm2022/entity/shared/strategies/filter-selection.mjs +0 -81
  164. package/esm2022/entity/shared/strategies/index.mjs +0 -4
  165. package/esm2022/entity/shared/strategies/strategy.mjs +0 -82
  166. package/esm2022/entity/shared/transaction.mjs +0 -329
  167. package/esm2022/entity/shared/view.mjs +0 -330
  168. package/esm2022/entity/shared/watcher.mjs +0 -135
  169. package/esm2022/environment/environment.interface.mjs +0 -2
  170. package/esm2022/environment/igo2-common-environment.mjs +0 -5
  171. package/esm2022/environment/public_api.mjs +0 -2
  172. package/esm2022/flexible/flexible.component.mjs +0 -137
  173. package/esm2022/flexible/flexible.module.mjs +0 -25
  174. package/esm2022/flexible/flexible.type.mjs +0 -2
  175. package/esm2022/flexible/igo2-common-flexible.mjs +0 -5
  176. package/esm2022/flexible/public_api.mjs +0 -4
  177. package/esm2022/form/form/form.component.mjs +0 -105
  178. package/esm2022/form/form/form.module.mjs +0 -19
  179. package/esm2022/form/form/index.mjs +0 -3
  180. package/esm2022/form/form-dialog/form-dialog.component.mjs +0 -94
  181. package/esm2022/form/form-dialog/form-dialog.interface.mjs +0 -2
  182. package/esm2022/form/form-dialog/form-dialog.module.mjs +0 -31
  183. package/esm2022/form/form-dialog/form-dialog.service.mjs +0 -30
  184. package/esm2022/form/form-dialog/index.mjs +0 -5
  185. package/esm2022/form/form-field/form-field-select.component.mjs +0 -117
  186. package/esm2022/form/form-field/form-field-text.component.mjs +0 -126
  187. package/esm2022/form/form-field/form-field-textarea.component.mjs +0 -95
  188. package/esm2022/form/form-field/form-field.component.mjs +0 -65
  189. package/esm2022/form/form-field/form-field.directive.mjs +0 -11
  190. package/esm2022/form/form-field/form-field.module.mjs +0 -23
  191. package/esm2022/form/form-field/index.mjs +0 -7
  192. package/esm2022/form/form-group/form-group.component.mjs +0 -81
  193. package/esm2022/form/form-group/form-group.module.mjs +0 -19
  194. package/esm2022/form/form-group/index.mjs +0 -3
  195. package/esm2022/form/form.module.mjs +0 -32
  196. package/esm2022/form/igo2-common-form.mjs +0 -5
  197. package/esm2022/form/public_api.mjs +0 -7
  198. package/esm2022/form/shared/form-field-component.mjs +0 -7
  199. package/esm2022/form/shared/form-field.service.mjs +0 -28
  200. package/esm2022/form/shared/form.interfaces.mjs +0 -2
  201. package/esm2022/form/shared/form.service.mjs +0 -82
  202. package/esm2022/form/shared/form.utils.mjs +0 -41
  203. package/esm2022/form/shared/index.mjs +0 -6
  204. package/esm2022/home-button/home-button.component.mjs +0 -25
  205. package/esm2022/home-button/home-button.module.mjs +0 -19
  206. package/esm2022/home-button/igo2-common-home-button.mjs +0 -5
  207. package/esm2022/home-button/public_api.mjs +0 -3
  208. package/esm2022/icon/icon/icon.component.mjs +0 -38
  209. package/esm2022/icon/icon.provider.mjs +0 -14
  210. package/esm2022/icon/igo2-common-icon.mjs +0 -5
  211. package/esm2022/icon/public_api.mjs +0 -4
  212. package/esm2022/icon/shared/icon.interface.mjs +0 -2
  213. package/esm2022/icon/shared/icon.service.mjs +0 -26
  214. package/esm2022/icon/shared/icons.mjs +0 -40
  215. package/esm2022/icon/shared/index.mjs +0 -4
  216. package/esm2022/igo2-common.mjs +0 -5
  217. package/esm2022/image/igo2-common-image.mjs +0 -5
  218. package/esm2022/image/image-error.directive.mjs +0 -35
  219. package/esm2022/image/image.module.mjs +0 -26
  220. package/esm2022/image/public_api.mjs +0 -7
  221. package/esm2022/image/secure-image.pipe.mjs +0 -66
  222. package/esm2022/interactive-tour/igo2-common-interactive-tour.mjs +0 -5
  223. package/esm2022/interactive-tour/interactive-tour.component.mjs +0 -131
  224. package/esm2022/interactive-tour/interactive-tour.interface.mjs +0 -2
  225. package/esm2022/interactive-tour/interactive-tour.loader.mjs +0 -49
  226. package/esm2022/interactive-tour/interactive-tour.module.mjs +0 -19
  227. package/esm2022/interactive-tour/interactive-tour.service.mjs +0 -303
  228. package/esm2022/interactive-tour/public_api.mjs +0 -6
  229. package/esm2022/json-dialog/igo2-common-json-dialog.mjs +0 -5
  230. package/esm2022/json-dialog/json-dialog.component.mjs +0 -38
  231. package/esm2022/json-dialog/json-dialog.module.mjs +0 -26
  232. package/esm2022/json-dialog/json-dialog.service.mjs +0 -26
  233. package/esm2022/json-dialog/public_api.mjs +0 -4
  234. package/esm2022/keyvalue/igo2-common-keyvalue.mjs +0 -5
  235. package/esm2022/keyvalue/keyvalue.module.mjs +0 -25
  236. package/esm2022/keyvalue/keyvalue.pipe.mjs +0 -19
  237. package/esm2022/keyvalue/public_api.mjs +0 -3
  238. package/esm2022/list/igo2-common-list.mjs +0 -5
  239. package/esm2022/list/list-item.directive.mjs +0 -166
  240. package/esm2022/list/list.component.mjs +0 -252
  241. package/esm2022/list/list.module.mjs +0 -26
  242. package/esm2022/list/public_api.mjs +0 -7
  243. package/esm2022/panel/igo2-common-panel.mjs +0 -5
  244. package/esm2022/panel/panel.component.mjs +0 -30
  245. package/esm2022/panel/panel.module.mjs +0 -19
  246. package/esm2022/panel/public_api.mjs +0 -3
  247. package/esm2022/public_api.mjs +0 -20
  248. package/esm2022/select-value-dialog/igo2-common-select-value-dialog.mjs +0 -5
  249. package/esm2022/select-value-dialog/public_api.mjs +0 -6
  250. package/esm2022/select-value-dialog/select-value-check-radio-dialog.component.mjs +0 -103
  251. package/esm2022/select-value-dialog/select-value-dialog.enums.mjs +0 -6
  252. package/esm2022/select-value-dialog/select-value-dialog.interface.mjs +0 -2
  253. package/esm2022/select-value-dialog/select-value-dialog.module.mjs +0 -27
  254. package/esm2022/select-value-dialog/select-value-dialog.service.mjs +0 -29
  255. package/esm2022/sidenav/igo2-common-sidenav.mjs +0 -5
  256. package/esm2022/sidenav/public_api.mjs +0 -3
  257. package/esm2022/sidenav/sidenav-shim.directive.mjs +0 -58
  258. package/esm2022/sidenav/sidenav.module.mjs +0 -25
  259. package/esm2022/spinner/igo2-common-spinner.mjs +0 -5
  260. package/esm2022/spinner/public_api.mjs +0 -4
  261. package/esm2022/spinner/spinner-activity.directive.mjs +0 -56
  262. package/esm2022/spinner/spinner.component.mjs +0 -29
  263. package/esm2022/spinner/spinner.module.mjs +0 -26
  264. package/esm2022/stop-propagation/igo2-common-stop-propagation.mjs +0 -5
  265. package/esm2022/stop-propagation/public_api.mjs +0 -10
  266. package/esm2022/stop-propagation/stop-drop-propagation.directive.mjs +0 -21
  267. package/esm2022/stop-propagation/stop-propagation.directive.mjs +0 -20
  268. package/esm2022/stop-propagation/stop-propagation.module.mjs +0 -26
  269. package/esm2022/table/igo2-common-table.mjs +0 -5
  270. package/esm2022/table/public_api.mjs +0 -7
  271. package/esm2022/table/table-action-color.enum.mjs +0 -7
  272. package/esm2022/table/table-database.mjs +0 -28
  273. package/esm2022/table/table-datasource.mjs +0 -66
  274. package/esm2022/table/table-model.interface.mjs +0 -2
  275. package/esm2022/table/table.component.mjs +0 -143
  276. package/esm2022/table/table.module.mjs +0 -25
  277. package/esm2022/tool/igo2-common-tool.mjs +0 -5
  278. package/esm2022/tool/public_api.mjs +0 -4
  279. package/esm2022/tool/shared/index.mjs +0 -6
  280. package/esm2022/tool/shared/tool-component.mjs +0 -9
  281. package/esm2022/tool/shared/tool.interface.mjs +0 -2
  282. package/esm2022/tool/shared/tool.service.mjs +0 -43
  283. package/esm2022/tool/shared/toolbox.enums.mjs +0 -2
  284. package/esm2022/tool/shared/toolbox.mjs +0 -192
  285. package/esm2022/tool/tool.module.mjs +0 -28
  286. package/esm2022/tool/toolbox/index.mjs +0 -3
  287. package/esm2022/tool/toolbox/toolbox.animation.mjs +0 -10
  288. package/esm2022/tool/toolbox/toolbox.component.mjs +0 -241
  289. package/esm2022/tool/toolbox/toolbox.module.mjs +0 -19
  290. package/esm2022/widget/igo2-common-widget.mjs +0 -5
  291. package/esm2022/widget/public_api.mjs +0 -4
  292. package/esm2022/widget/shared/index.mjs +0 -4
  293. package/esm2022/widget/shared/widget.interfaces.mjs +0 -2
  294. package/esm2022/widget/shared/widget.mjs +0 -4
  295. package/esm2022/widget/shared/widget.service.mjs +0 -22
  296. package/esm2022/widget/widget-outlet/index.mjs +0 -3
  297. package/esm2022/widget/widget-outlet/widget-outlet.component.mjs +0 -112
  298. package/esm2022/widget/widget-outlet/widget-outlet.module.mjs +0 -19
  299. package/esm2022/widget/widget.module.mjs +0 -22
  300. package/esm2022/workspace/igo2-common-workspace.mjs +0 -5
  301. package/esm2022/workspace/public_api.mjs +0 -5
  302. package/esm2022/workspace/shared/index.mjs +0 -4
  303. package/esm2022/workspace/shared/store.mjs +0 -37
  304. package/esm2022/workspace/shared/workspace.interfaces.mjs +0 -2
  305. package/esm2022/workspace/shared/workspace.mjs +0 -143
  306. package/esm2022/workspace/workspace-selector/index.mjs +0 -3
  307. package/esm2022/workspace/workspace-selector/workspace-selector.component.mjs +0 -51
  308. package/esm2022/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
  309. package/esm2022/workspace/workspace-widget-outlet/index.mjs +0 -3
  310. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +0 -73
  311. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +0 -19
  312. package/esm2022/workspace/workspace.module.mjs +0 -27
@@ -1,391 +0,0 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
- import { FlatTreeControl } from '@angular/cdk/tree';
3
- import { ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, QueryList, Renderer2, booleanAttribute } from '@angular/core';
4
- import { MatTreeNode } from '@angular/material/tree';
5
- import * as i0 from "@angular/core";
6
- /**
7
- * This directive should be use with a MatTree flatened
8
- * It should add all logic to drag the MatTreeNode and connect the (onDrop) output
9
- * Class added:
10
- * Tree: --dragging
11
- * Node: --drag-hover | --dragged
12
- */
13
- export class TreeDragDropDirective {
14
- elementRef;
15
- renderer;
16
- draggedNode;
17
- dropNodeTarget;
18
- expandTimeout;
19
- nodesListeners;
20
- dropLineTarget;
21
- highlightedNode = new SelectionModel();
22
- treeControl;
23
- /** The default is 5 */
24
- maxLevel = 5;
25
- set treeDragDropIsDisabled(disabled) {
26
- this.isDisabled = disabled;
27
- disabled ? this.removeAllListener() : this.addAllListener();
28
- }
29
- isDisabled = false;
30
- dragStart = new EventEmitter();
31
- // eslint-disable-next-line @angular-eslint/no-output-on-prefix
32
- onDrop = new EventEmitter(null);
33
- // eslint-disable-next-line @angular-eslint/no-output-on-prefix
34
- onDropError = new EventEmitter();
35
- hostDragOver(event) {
36
- event.preventDefault();
37
- }
38
- hostDrop(event) {
39
- this.drop(event);
40
- }
41
- dragging;
42
- nodes;
43
- constructor(elementRef, renderer) {
44
- this.elementRef = elementRef;
45
- this.renderer = renderer;
46
- this.onDrop.subscribe(() => this.dragEnd());
47
- this.highlightedNode.changed.subscribe((change) => {
48
- if (change.removed.length) {
49
- this.removeNodeClass(change.removed[0].id, '--drag-hover');
50
- }
51
- if (change.added.length) {
52
- this.addNodeClass(change.added[0].id, '--drag-hover');
53
- }
54
- });
55
- }
56
- ngAfterContentInit() {
57
- this.nodes.changes.subscribe(() => {
58
- this.addAllListener();
59
- });
60
- }
61
- ngOnDestroy() {
62
- this.removeAllListener();
63
- }
64
- onDragStart(node) {
65
- this.dragging = true;
66
- this.draggedNode = node;
67
- this.addNodeClass(node.id, '--dragged');
68
- this.dragStart.emit(node);
69
- }
70
- dragEnd() {
71
- this.dragging = false;
72
- if (this.draggedNode) {
73
- this.removeNodeClass(this.draggedNode.id, '--dragged');
74
- this.draggedNode = null;
75
- }
76
- this.dragLeave();
77
- this.removeDropTargetLine();
78
- }
79
- dragOver(node, event) {
80
- event.preventDefault();
81
- event.stopPropagation();
82
- this.dropNodeTarget = node;
83
- const position = this.getPosition(event, node);
84
- this.updateDropTargetLinePosition(position);
85
- this.setHighlightedNode(node);
86
- this.handleGroupExpansion(node, position.type === 'inside');
87
- }
88
- dragLeave() {
89
- clearTimeout(this.expandTimeout);
90
- this.expandTimeout = null;
91
- this.highlightedNode.clear();
92
- }
93
- drop(event) {
94
- if (!this.dropNodeTarget || this.isDisabled) {
95
- return;
96
- }
97
- const dropPosition = this.getPosition(event, this.dropNodeTarget);
98
- const validation = this.canDropNode(this.dropNodeTarget, dropPosition);
99
- if (!validation.canDrop) {
100
- this.onDropError.emit(validation);
101
- return;
102
- }
103
- // Allow to drop a last child outside is group. We refer to it's ancestor for the target
104
- if (dropPosition.type === 'below' &&
105
- dropPosition.level !== this.dropNodeTarget.level) {
106
- this.dropNodeTarget = this.getNodeAncestors(this.dropNodeTarget.id, dropPosition.level);
107
- }
108
- if (this.dropNodeTarget.isGroup) {
109
- if (dropPosition.type === 'inside') {
110
- const isExpanded = this.treeControl.isExpanded(this.dropNodeTarget);
111
- if (isExpanded) {
112
- const children = this.getDirectDescendants(this.dropNodeTarget);
113
- if (children[0]?.id === this.draggedNode.id) {
114
- return;
115
- }
116
- }
117
- this.treeControl.expand(this.dropNodeTarget);
118
- return this.onDrop.emit({
119
- node: this.draggedNode,
120
- ref: this.dropNodeTarget,
121
- position: dropPosition.type
122
- });
123
- }
124
- }
125
- if (dropPosition.type === 'below' &&
126
- dropPosition.level !== this.dropNodeTarget.level) {
127
- const ancestor = this.getNodeAncestors(this.dropNodeTarget.id);
128
- return this.onDrop.emit({
129
- node: this.draggedNode,
130
- ref: ancestor,
131
- position: dropPosition.type
132
- });
133
- }
134
- this.onDrop.emit({
135
- node: this.draggedNode,
136
- ref: this.dropNodeTarget,
137
- position: dropPosition.type
138
- });
139
- }
140
- addNodeClass(id, className) {
141
- const node = this.nodes.find((node) => node.data.id === id);
142
- this.renderer.addClass(node['_elementRef'].nativeElement, className);
143
- }
144
- removeNodeClass(id, className) {
145
- const node = this.nodes.find((node) => node.data.id === id);
146
- this.renderer.removeClass(node['_elementRef'].nativeElement, className);
147
- }
148
- addAllListener() {
149
- if (this.isDisabled) {
150
- return;
151
- }
152
- const nodes = this.nodes?.toArray();
153
- if (this.nodesListeners) {
154
- this.removeAllListener();
155
- }
156
- this.nodesListeners = nodes?.map((node) => this.addListener(node));
157
- }
158
- addListener(node) {
159
- const element = node['_elementRef'].nativeElement;
160
- const listeners = [
161
- ['dragstart', () => this.onDragStart(node.data)],
162
- ['dragend', () => this.dragEnd()],
163
- ['dragover', (event) => this.dragOver(node.data, event)],
164
- ['dragleave', () => this.dragLeave()]
165
- ];
166
- element.setAttribute('draggable', 'true');
167
- listeners.forEach(([type, listener]) => element.addEventListener(type, listener));
168
- return { element, listeners };
169
- }
170
- removeAllListener() {
171
- this.nodesListeners?.forEach(({ element, listeners }) => {
172
- listeners.forEach(([type, listener]) => {
173
- element.setAttribute('draggable', 'false');
174
- element.removeEventListener(type, listener);
175
- });
176
- });
177
- this.nodesListeners = null;
178
- }
179
- setHighlightedNode(node) {
180
- const toHighlight = node.isGroup ? node : this.getNodeAncestors(node.id);
181
- toHighlight
182
- ? this.highlightedNode.select(toHighlight)
183
- : this.highlightedNode.clear();
184
- }
185
- addDropTargetLine() {
186
- const target = this.renderer.createElement('div');
187
- target.classList.add('drop-target-line');
188
- target.setAttribute('style', `position: absolute; top: 0; width: 100%; pointer-events: none; z-index: 4; height: 2px; background-color: black; transition: margin-left 150ms;`);
189
- this.dropLineTarget = target;
190
- this.renderer.appendChild(this.elementRef.nativeElement.parentElement, this.dropLineTarget);
191
- }
192
- removeDropTargetLine() {
193
- if (!this.dropLineTarget) {
194
- return;
195
- }
196
- this.renderer.removeChild(this.elementRef.nativeElement.parentElement, this.dropLineTarget);
197
- this.dropLineTarget = null;
198
- }
199
- updateDropTargetLinePosition(position) {
200
- if (!this.dropLineTarget) {
201
- this.addDropTargetLine();
202
- }
203
- if (position.type === 'inside') {
204
- return this.removeDropTargetLine();
205
- }
206
- this.renderer.setStyle(this.dropLineTarget, 'margin-left', position.level * 24 + 20 + 'px');
207
- this.renderer.setStyle(this.dropLineTarget, 'transform', 'translate3d(0,' + position.y + 'px, 0)');
208
- }
209
- handleGroupExpansion(node, isInside) {
210
- if (!isInside) {
211
- return this.dragLeave();
212
- }
213
- const isOpen = this.treeControl.isExpanded(node);
214
- if (!isOpen && !this.expandTimeout) {
215
- this.expandTimeout = window.setTimeout(() => {
216
- this.treeControl.expand(node);
217
- }, 1200);
218
- }
219
- }
220
- getNodeElement(node) {
221
- const treeNode = this.nodes.find((n) => n.data.id === node.id);
222
- return treeNode?.['_elementRef'].nativeElement;
223
- }
224
- canDropNode(hoveredNode, position) {
225
- if (this.draggedNode.isGroup) {
226
- return this.canDropGroup(hoveredNode, position);
227
- }
228
- const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);
229
- if (hasMaxLevelRestrictions) {
230
- return hasMaxLevelRestrictions;
231
- }
232
- return { canDrop: true };
233
- }
234
- canDropGroup(hoveredNode, position) {
235
- // On ne veut pas permettre le Drop pour un groupe qui s'auto référence
236
- if (hoveredNode.id === this.draggedNode.id) {
237
- return {
238
- canDrop: false,
239
- message: 'igo.common.dragDrop.cannot.dropInsideItself'
240
- };
241
- }
242
- const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);
243
- if (hasMaxLevelRestrictions) {
244
- return hasMaxLevelRestrictions;
245
- }
246
- const isHoverDescendant = this.isHoverDescendant(hoveredNode.id);
247
- return {
248
- canDrop: !isHoverDescendant,
249
- message: isHoverDescendant && 'igo.common.dragDrop.cannot.dropInsideItself'
250
- };
251
- }
252
- validateMaxHierarchyLevel(position) {
253
- if (!this.maxLevel) {
254
- return;
255
- }
256
- let level = position.type === 'inside' ? position.level + 1 : position.level;
257
- if (this.draggedNode.isGroup) {
258
- // We add an extra level +1 to avoid empty group in group
259
- level = level + (this.draggedNode.descendantLevels ?? 0) + 1;
260
- }
261
- if (level > this.maxLevel) {
262
- return {
263
- canDrop: false,
264
- message: 'igo.common.dragDrop.cannot.maxLevel',
265
- params: { value: this.maxLevel }
266
- };
267
- }
268
- }
269
- isHoverDescendant(id) {
270
- return this.treeControl
271
- .getDescendants(this.draggedNode)
272
- .some((child) => child.id === id);
273
- }
274
- getPosition(event, hoveredNode) {
275
- if (this.draggedNode.isGroup) {
276
- if (this.isHoverDescendant(hoveredNode.id)) {
277
- hoveredNode = this.draggedNode;
278
- }
279
- }
280
- let positionType = this.getPositionType(event, hoveredNode);
281
- const bellowOpenedGroup = hoveredNode.isGroup &&
282
- positionType === 'below' &&
283
- this.treeControl.isExpanded(hoveredNode);
284
- if (bellowOpenedGroup) {
285
- positionType = 'inside';
286
- }
287
- return {
288
- x: event.x,
289
- y: this.getPositionY(hoveredNode, positionType),
290
- level: this.getPositionLevel(hoveredNode, positionType, event.x),
291
- type: positionType
292
- };
293
- }
294
- getPositionY(node, type) {
295
- const element = this.getNodeElement(node);
296
- const rect = element.getBoundingClientRect();
297
- return type === 'below'
298
- ? element.offsetTop + rect.height - 1
299
- : element.offsetTop + 1;
300
- }
301
- getPositionType(event, hoveredNode) {
302
- const target = this.getNodeElement(hoveredNode);
303
- const rect = target.getBoundingClientRect();
304
- const middle = rect.top + rect.height / 2;
305
- const y = event.y;
306
- const selfReferencing = this.draggedNode.id === hoveredNode.id;
307
- if (hoveredNode.isGroup && !selfReferencing) {
308
- const tolerence = 5;
309
- if (y <= middle + tolerence && y >= middle - tolerence) {
310
- return 'inside';
311
- }
312
- }
313
- const isBelow = y > middle;
314
- return isBelow ? 'below' : 'above';
315
- }
316
- getPositionLevel(hoveredNode, type, x) {
317
- if (hoveredNode.level === 0) {
318
- return 0;
319
- }
320
- const ancestor = this.getNodeAncestors(hoveredNode.id);
321
- const children = this.getDirectDescendants(ancestor);
322
- const lastChild = [...children].pop();
323
- if (type === 'below' && lastChild.id === hoveredNode.id) {
324
- const target = this.getNodeElement(hoveredNode);
325
- const rect = target.getBoundingClientRect();
326
- const indentation = 24;
327
- const xMin = rect.x + indentation;
328
- const xMax = xMin + indentation * hoveredNode.level;
329
- const isInsideSameGroup = x > xMax;
330
- if (!isInsideSameGroup) {
331
- const levelSubstracted = Math.round((xMax - x) / indentation);
332
- return Math.max(0, hoveredNode.level - levelSubstracted);
333
- }
334
- }
335
- return hoveredNode.level;
336
- }
337
- /**
338
- * @param level if level is defined with go to the defined levle to find ancestor. Sinon on prend le current ancestor
339
- */
340
- getNodeAncestors(id, level) {
341
- const nodes = this.treeControl.dataNodes;
342
- const index = nodes.findIndex((node) => node.id === id);
343
- const targetLevel = level ?? Math.max(0, nodes[index].level - 1);
344
- return nodes
345
- .slice(0, index)
346
- .reverse()
347
- .find((node) => node.level === targetLevel);
348
- }
349
- getDirectDescendants(node) {
350
- const level = node.level + 1;
351
- return this.treeControl
352
- .getDescendants(node)
353
- .filter((child) => child.level === level);
354
- }
355
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
356
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: TreeDragDropDirective, isStandalone: true, selector: "[igoTreeDragDrop]", inputs: { treeControl: "treeControl", maxLevel: "maxLevel", treeDragDropIsDisabled: ["treeDragDropIsDisabled", "treeDragDropIsDisabled", booleanAttribute] }, outputs: { dragStart: "dragStart", onDrop: "onDrop", onDropError: "onDropError" }, host: { listeners: { "dragover": "hostDragOver($event)", "drop": "hostDrop($event)" }, properties: { "class.--dragging": "this.dragging" } }, queries: [{ propertyName: "nodes", predicate: MatTreeNode, descendants: true }], ngImport: i0 });
357
- }
358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropDirective, decorators: [{
359
- type: Directive,
360
- args: [{
361
- selector: '[igoTreeDragDrop]',
362
- standalone: true
363
- }]
364
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { treeControl: [{
365
- type: Input,
366
- args: [{ required: true }]
367
- }], maxLevel: [{
368
- type: Input
369
- }], treeDragDropIsDisabled: [{
370
- type: Input,
371
- args: [{ transform: booleanAttribute }]
372
- }], dragStart: [{
373
- type: Output
374
- }], onDrop: [{
375
- type: Output
376
- }], onDropError: [{
377
- type: Output
378
- }], hostDragOver: [{
379
- type: HostListener,
380
- args: ['dragover', ['$event']]
381
- }], hostDrop: [{
382
- type: HostListener,
383
- args: ['drop', ['$event']]
384
- }], dragging: [{
385
- type: HostBinding,
386
- args: ['class.--dragging']
387
- }], nodes: [{
388
- type: ContentChildren,
389
- args: [MatTreeNode, { descendants: true }]
390
- }] } });
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLWRyb3AuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL2RyYWctZHJvcC9zcmMvdHJlZS1kcmFnLWRyb3AvdHJlZS1kcmFnLWRyb3AuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQTBCckQ7Ozs7OztHQU1HO0FBS0gsTUFBTSxPQUFPLHFCQUFxQjtJQTBDdEI7SUFDQTtJQTFDVixXQUFXLENBQWU7SUFDMUIsY0FBYyxDQUFlO0lBQzdCLGFBQWEsQ0FBUztJQUN0QixjQUFjLENBQWtDO0lBQ2hELGNBQWMsQ0FBYztJQUM1QixlQUFlLEdBQUcsSUFBSSxjQUFjLEVBQWdCLENBQUM7SUFFMUIsV0FBVyxDQUFnQztJQUV0RSx1QkFBdUI7SUFDZCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXRCLElBQ0ksc0JBQXNCLENBQUMsUUFBaUI7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDM0IsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFDTyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRWpCLFNBQVMsR0FBRyxJQUFJLFlB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QkFBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgRmxhdFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgYm9vbGVhbkF0dHJpYnV0ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRyZWVOb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5cbmltcG9ydCB7XG4gIERyb3BQb3NpdGlvbixcbiAgRHJvcFBvc2l0aW9uVHlwZSxcbiAgVHJlZUZsYXROb2RlXG59IGZyb20gJy4vdHJlZS1kcmFnLWRyb3AuaW50ZXJmYWNlJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZURyb3BFdmVudDxUID0gYW55PiB7XG4gIG5vZGU6IFRyZWVGbGF0Tm9kZTxUPjtcbiAgcmVmOiBUcmVlRmxhdE5vZGU8VD47XG4gIHBvc2l0aW9uOiBEcm9wUG9zaXRpb25UeXBlO1xufVxuXG5pbnRlcmZhY2UgRHJhZ05vZGVMaXN0ZW5lcnMge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgbGlzdGVuZXJzOiBbc3RyaW5nLCBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0XVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyb3BQZXJtaXNzaW9uIHtcbiAgY2FuRHJvcDogYm9vbGVhbjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogVGhpcyBkaXJlY3RpdmUgc2hvdWxkIGJlIHVzZSB3aXRoIGEgTWF0VHJlZSBmbGF0ZW5lZFxuICogSXQgc2hvdWxkIGFkZCBhbGwgbG9naWMgdG8gZHJhZyB0aGUgTWF0VHJlZU5vZGUgYW5kIGNvbm5lY3QgdGhlIChvbkRyb3ApIG91dHB1dFxuICogQ2xhc3MgYWRkZWQ6XG4gKiAgICBUcmVlOiAtLWRyYWdnaW5nXG4gKiAgICBOb2RlOiAtLWRyYWctaG92ZXIgfCAtLWRyYWdnZWRcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2lnb1RyZWVEcmFnRHJvcF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVEcmFnRHJvcERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIGRyYWdnZWROb2RlOiBUcmVlRmxhdE5vZGU7XG4gIGRyb3BOb2RlVGFyZ2V0OiBUcmVlRmxhdE5vZGU7XG4gIGV4cGFuZFRpbWVvdXQ6IG51bWJlcjtcbiAgbm9kZXNMaXN0ZW5lcnM6IERyYWdOb2RlTGlzdGVuZXJzW10gfCB1bmRlZmluZWQ7XG4gIGRyb3BMaW5lVGFyZ2V0OiBIVE1MRWxlbWVudDtcbiAgaGlnaGxpZ2h0ZWROb2RlID0gbmV3IFNlbGVjdGlvbk1vZGVsPFRyZWVGbGF0Tm9kZT4oKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB0cmVlQ29udHJvbDogRmxhdFRyZWVDb250cm9sPFRyZWVGbGF0Tm9kZT47XG5cbiAgLyoqIFRoZSBkZWZhdWx0IGlzIDUgKi9cbiAgQElucHV0KCkgbWF4TGV2ZWwgPSA1O1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgdHJlZURyYWdEcm9wSXNEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIGRpc2FibGVkID8gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcigpIDogdGhpcy5hZGRBbGxMaXN0ZW5lcigpO1xuICB9XG4gIHByaXZhdGUgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBkcmFnU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVGbGF0Tm9kZT4oKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgQE91dHB1dCgpIG9uRHJvcCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZURyb3BFdmVudD4obnVsbCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gIEBPdXRwdXQoKSBvbkRyb3BFcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8RHJvcFBlcm1pc3Npb24+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKSBob3N0RHJhZ092ZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKSBob3N0RHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wKGV2ZW50KTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuLS1kcmFnZ2luZycpIGRyYWdnaW5nOiBib29sZWFuO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0VHJlZU5vZGUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgbm9kZXM6IFF1ZXJ5TGlzdDxNYXRUcmVlTm9kZTxUcmVlRmxhdE5vZGU+PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge1xuICAgIHRoaXMub25Ecm9wLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRyYWdFbmQoKSk7XG5cbiAgICB0aGlzLmhpZ2hsaWdodGVkTm9kZS5jaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJlbW92ZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTm9kZUNsYXNzKGNoYW5nZS5yZW1vdmVkWzBdLmlkLCAnLS1kcmFnLWhvdmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuYWRkZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkTm9kZUNsYXNzKGNoYW5nZS5hZGRlZFswXS5pZCwgJy0tZHJhZy1ob3ZlcicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubm9kZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hZGRBbGxMaXN0ZW5lcigpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcigpO1xuICB9XG5cbiAgb25EcmFnU3RhcnQobm9kZTogVHJlZUZsYXROb2RlKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5kcmFnZ2VkTm9kZSA9IG5vZGU7XG4gICAgdGhpcy5hZGROb2RlQ2xhc3Mobm9kZS5pZCwgJy0tZHJhZ2dlZCcpO1xuXG4gICAgdGhpcy5kcmFnU3RhcnQuZW1pdChub2RlKTtcbiAgfVxuXG4gIGRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmRyYWdnZWROb2RlKSB7XG4gICAgICB0aGlzLnJlbW92ZU5vZGVDbGFzcyh0aGlzLmRyYWdnZWROb2RlLmlkLCAnLS1kcmFnZ2VkJyk7XG4gICAgICB0aGlzLmRyYWdnZWROb2RlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdMZWF2ZSgpO1xuICAgIHRoaXMucmVtb3ZlRHJvcFRhcmdldExpbmUoKTtcbiAgfVxuXG4gIGRyYWdPdmVyKG5vZGU6IFRyZWVGbGF0Tm9kZSwgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmRyb3BOb2RlVGFyZ2V0ID0gbm9kZTtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihldmVudCwgbm9kZSk7XG5cbiAgICB0aGlzLnVwZGF0ZURyb3BUYXJnZXRMaW5lUG9zaXRpb24ocG9zaXRpb24pO1xuXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZE5vZGUobm9kZSk7XG5cbiAgICB0aGlzLmhhbmRsZUdyb3VwRXhwYW5zaW9uKG5vZGUsIHBvc2l0aW9uLnR5cGUgPT09ICdpbnNpZGUnKTtcbiAgfVxuXG4gIGRyYWdMZWF2ZSgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5leHBhbmRUaW1lb3V0KTtcbiAgICB0aGlzLmV4cGFuZFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWROb2RlLmNsZWFyKCk7XG4gIH1cblxuICBkcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcE5vZGVUYXJnZXQgfHwgdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcFBvc2l0aW9uOiBEcm9wUG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKFxuICAgICAgZXZlbnQsXG4gICAgICB0aGlzLmRyb3BOb2RlVGFyZ2V0XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLmNhbkRyb3BOb2RlKHRoaXMuZHJvcE5vZGVUYXJnZXQsIGRyb3BQb3NpdGlvbik7XG4gICAgaWYgKCF2YWxpZGF0aW9uLmNhbkRyb3ApIHtcbiAgICAgIHRoaXMub25Ecm9wRXJyb3IuZW1pdCh2YWxpZGF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0byBkcm9wIGEgbGFzdCBjaGlsZCBvdXRzaWRlIGlzIGdyb3VwLiBXZSByZWZlciB0byBpdCdzIGFuY2VzdG9yIGZvciB0aGUgdGFyZ2V0XG4gICAgaWYgKFxuICAgICAgZHJvcFBvc2l0aW9uLnR5cGUgPT09ICdiZWxvdycgJiZcbiAgICAgIGRyb3BQb3NpdGlvbi5sZXZlbCAhPT0gdGhpcy5kcm9wTm9kZVRhcmdldC5sZXZlbFxuICAgICkge1xuICAgICAgdGhpcy5kcm9wTm9kZVRhcmdldCA9IHRoaXMuZ2V0Tm9kZUFuY2VzdG9ycyhcbiAgICAgICAgdGhpcy5kcm9wTm9kZVRhcmdldC5pZCxcbiAgICAgICAgZHJvcFBvc2l0aW9uLmxldmVsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyb3BOb2RlVGFyZ2V0LmlzR3JvdXApIHtcbiAgICAgIGlmIChkcm9wUG9zaXRpb24udHlwZSA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0aGlzLmRyb3BOb2RlVGFyZ2V0KTtcbiAgICAgICAgaWYgKGlzRXhwYW5kZWQpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0RGlyZWN0RGVzY2VuZGFudHModGhpcy5kcm9wTm9kZVRhcmdldCk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuWzBdPy5pZCA9PT0gdGhpcy5kcmFnZ2VkTm9kZS5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMuZHJvcE5vZGVUYXJnZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5vbkRyb3AuZW1pdCh7XG4gICAgICAgICAgbm9kZTogdGhpcy5kcmFnZ2VkTm9kZSxcbiAgICAgICAgICByZWY6IHRoaXMuZHJvcE5vZGVUYXJnZXQsXG4gICAgICAgICAgcG9zaXRpb246IGRyb3BQb3NpdGlvbi50eXBlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRyb3BQb3NpdGlvbi50eXBlID09PSAnYmVsb3cnICYmXG4gICAgICBkcm9wUG9zaXRpb24ubGV2ZWwgIT09IHRoaXMuZHJvcE5vZGVUYXJnZXQubGV2ZWxcbiAgICApIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGhpcy5nZXROb2RlQW5jZXN0b3JzKHRoaXMuZHJvcE5vZGVUYXJnZXQuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMub25Ecm9wLmVtaXQoe1xuICAgICAgICBub2RlOiB0aGlzLmRyYWdnZWROb2RlLFxuICAgICAgICByZWY6IGFuY2VzdG9yLFxuICAgICAgICBwb3NpdGlvbjogZHJvcFBvc2l0aW9uLnR5cGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMub25Ecm9wLmVtaXQoe1xuICAgICAgbm9kZTogdGhpcy5kcmFnZ2VkTm9kZSxcbiAgICAgIHJlZjogdGhpcy5kcm9wTm9kZVRhcmdldCxcbiAgICAgIHBvc2l0aW9uOiBkcm9wUG9zaXRpb24udHlwZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGROb2RlQ2xhc3MoaWQ6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmRhdGEuaWQgPT09IGlkKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG5vZGVbJ19lbGVtZW50UmVmJ10ubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTm9kZUNsYXNzKGlkOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5kYXRhLmlkID09PSBpZCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhub2RlWydfZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEFsbExpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLm5vZGVzPy50b0FycmF5KCk7XG4gICAgaWYgKHRoaXMubm9kZXNMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzTGlzdGVuZXJzID0gbm9kZXM/Lm1hcCgobm9kZSkgPT4gdGhpcy5hZGRMaXN0ZW5lcihub2RlKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZExpc3RlbmVyKG5vZGU6IE1hdFRyZWVOb2RlPFRyZWVGbGF0Tm9kZT4pOiBEcmFnTm9kZUxpc3RlbmVycyB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5vZGVbJ19lbGVtZW50UmVmJ10ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RdW10gPSBbXG4gICAgICBbJ2RyYWdzdGFydCcsICgpID0+IHRoaXMub25EcmFnU3RhcnQobm9kZS5kYXRhKV0sXG4gICAgICBbJ2RyYWdlbmQnLCAoKSA9PiB0aGlzLmRyYWdFbmQoKV0sXG4gICAgICBbJ2RyYWdvdmVyJywgKGV2ZW50OiBEcmFnRXZlbnQpID0+IHRoaXMuZHJhZ092ZXIobm9kZS5kYXRhLCBldmVudCldLFxuICAgICAgWydkcmFnbGVhdmUnLCAoKSA9PiB0aGlzLmRyYWdMZWF2ZSgpXVxuICAgIF07XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKFt0eXBlLCBsaXN0ZW5lcl0pID0+XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpXG4gICAgKTtcblxuICAgIHJldHVybiB7IGVsZW1lbnQsIGxpc3RlbmVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBbGxMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVzTGlzdGVuZXJzPy5mb3JFYWNoKCh7IGVsZW1lbnQsIGxpc3RlbmVycyB9KSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoW3R5cGUsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgJ2ZhbHNlJyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm5vZGVzTGlzdGVuZXJzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SGlnaGxpZ2h0ZWROb2RlKG5vZGU6IFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IHRvSGlnaGxpZ2h0ID0gbm9kZS5pc0dyb3VwID8gbm9kZSA6IHRoaXMuZ2V0Tm9kZUFuY2VzdG9ycyhub2RlLmlkKTtcbiAgICB0b0hpZ2hsaWdodFxuICAgICAgPyB0aGlzLmhpZ2hsaWdodGVkTm9kZS5zZWxlY3QodG9IaWdobGlnaHQpXG4gICAgICA6IHRoaXMuaGlnaGxpZ2h0ZWROb2RlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZERyb3BUYXJnZXRMaW5lKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldDogSFRNTEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldC1saW5lJyk7XG4gICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcbiAgICAgICdzdHlsZScsXG4gICAgICBgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogNDsgaGVpZ2h0OiAycHg7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyB0cmFuc2l0aW9uOiBtYXJnaW4tbGVmdCAxNTBtcztgXG4gICAgKTtcbiAgICB0aGlzLmRyb3BMaW5lVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LFxuICAgICAgdGhpcy5kcm9wTGluZVRhcmdldFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURyb3BUYXJnZXRMaW5lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcm9wTGluZVRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgIHRoaXMuZHJvcExpbmVUYXJnZXRcbiAgICApO1xuICAgIHRoaXMuZHJvcExpbmVUYXJnZXQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wVGFyZ2V0TGluZVBvc2l0aW9uKHBvc2l0aW9uOiBEcm9wUG9zaXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcExpbmVUYXJnZXQpIHtcbiAgICAgIHRoaXMuYWRkRHJvcFRhcmdldExpbmUoKTtcbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24udHlwZSA9PT0gJ2luc2lkZScpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZURyb3BUYXJnZXRMaW5lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIHRoaXMuZHJvcExpbmVUYXJnZXQsXG4gICAgICAnbWFyZ2luLWxlZnQnLFxuICAgICAgcG9zaXRpb24ubGV2ZWwgKiAyNCArIDIwICsgJ3B4J1xuICAgICk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIHRoaXMuZHJvcExpbmVUYXJnZXQsXG4gICAgICAndHJhbnNmb3JtJyxcbiAgICAgICd0cmFuc2xhdGUzZCgwLCcgKyBwb3NpdGlvbi55ICsgJ3B4LCAwKSdcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVHcm91cEV4cGFuc2lvbihub2RlOiBUcmVlRmxhdE5vZGUsIGlzSW5zaWRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpc0luc2lkZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHJhZ0xlYXZlKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKTtcbiAgICBpZiAoIWlzT3BlbiAmJiAhdGhpcy5leHBhbmRUaW1lb3V0KSB7XG4gICAgICB0aGlzLmV4cGFuZFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgfSwgMTIwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlRWxlbWVudChub2RlOiBUcmVlRmxhdE5vZGUpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdHJlZU5vZGUgPSB0aGlzLm5vZGVzLmZpbmQoKG4pID0+IG4uZGF0YS5pZCA9PT0gbm9kZS5pZCk7XG4gICAgcmV0dXJuIHRyZWVOb2RlPy5bJ19lbGVtZW50UmVmJ10ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY2FuRHJvcE5vZGUoXG4gICAgaG92ZXJlZE5vZGU6IFRyZWVGbGF0Tm9kZSxcbiAgICBwb3NpdGlvbjogRHJvcFBvc2l0aW9uXG4gICk6IERyb3BQZXJtaXNzaW9uIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkTm9kZS5pc0dyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW5Ecm9wR3JvdXAoaG92ZXJlZE5vZGUsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNNYXhMZXZlbFJlc3RyaWN0aW9ucyA9IHRoaXMudmFsaWRhdGVNYXhIaWVyYXJjaHlMZXZlbChwb3NpdGlvbik7XG4gICAgaWYgKGhhc01heExldmVsUmVzdHJpY3Rpb25zKSB7XG4gICAgICByZXR1cm4gaGFzTWF4TGV2ZWxSZXN0cmljdGlvbnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2FuRHJvcDogdHJ1ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5Ecm9wR3JvdXAoXG4gICAgaG92ZXJlZE5vZGU6IFRyZWVGbGF0Tm9kZSxcbiAgICBwb3NpdGlvbjogRHJvcFBvc2l0aW9uXG4gICk6IERyb3BQZXJtaXNzaW9uIHtcbiAgICAvLyBPbiBuZSB2ZXV0IHBhcyBwZXJtZXR0cmUgbGUgRHJvcCBwb3VyIHVuIGdyb3VwZSBxdWkgcydhdXRvIHLDqWbDqXJlbmNlXG4gICAgaWYgKGhvdmVyZWROb2RlLmlkID09PSB0aGlzLmRyYWdnZWROb2RlLmlkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Ecm9wOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ2lnby5jb21tb24uZHJhZ0Ryb3AuY2Fubm90LmRyb3BJbnNpZGVJdHNlbGYnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc01heExldmVsUmVzdHJpY3Rpb25zID0gdGhpcy52YWxpZGF0ZU1heEhpZXJhcmNoeUxldmVsKHBvc2l0aW9uKTtcbiAgICBpZiAoaGFzTWF4TGV2ZWxSZXN0cmljdGlvbnMpIHtcbiAgICAgIHJldHVybiBoYXNNYXhMZXZlbFJlc3RyaWN0aW9ucztcbiAgICB9XG5cbiAgICBjb25zdCBpc0hvdmVyRGVzY2VuZGFudCA9IHRoaXMuaXNIb3ZlckRlc2NlbmRhbnQoaG92ZXJlZE5vZGUuaWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjYW5Ecm9wOiAhaXNIb3ZlckRlc2NlbmRhbnQsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBpc0hvdmVyRGVzY2VuZGFudCAmJiAnaWdvLmNvbW1vbi5kcmFnRHJvcC5jYW5ub3QuZHJvcEluc2lkZUl0c2VsZidcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZU1heEhpZXJhcmNoeUxldmVsKHBvc2l0aW9uOiBEcm9wUG9zaXRpb24pOiBEcm9wUGVybWlzc2lvbiB7XG4gICAgaWYgKCF0aGlzLm1heExldmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGxldmVsID1cbiAgICAgIHBvc2l0aW9uLnR5cGUgPT09ICdpbnNpZGUnID8gcG9zaXRpb24ubGV2ZWwgKyAxIDogcG9zaXRpb24ubGV2ZWw7XG5cbiAgICBpZiAodGhpcy5kcmFnZ2VkTm9kZS5pc0dyb3VwKSB7XG4gICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgbGV2ZWwgKzEgdG8gYXZvaWQgZW1wdHkgZ3JvdXAgaW4gZ3JvdXBcbiAgICAgIGxldmVsID0gbGV2ZWwgKyAodGhpcy5kcmFnZ2VkTm9kZS5kZXNjZW5kYW50TGV2ZWxzID8/IDApICsgMTtcbiAgICB9XG5cbiAgICBpZiAobGV2ZWwgPiB0aGlzLm1heExldmVsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Ecm9wOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ2lnby5jb21tb24uZHJhZ0Ryb3AuY2Fubm90Lm1heExldmVsJyxcbiAgICAgICAgcGFyYW1zOiB7IHZhbHVlOiB0aGlzLm1heExldmVsIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0hvdmVyRGVzY2VuZGFudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2xcbiAgICAgIC5nZXREZXNjZW5kYW50cyh0aGlzLmRyYWdnZWROb2RlKVxuICAgICAgLnNvbWUoKGNoaWxkKSA9PiBjaGlsZC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbihcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICAgIGhvdmVyZWROb2RlOiBUcmVlRmxhdE5vZGVcbiAgKTogRHJvcFBvc2l0aW9uIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkTm9kZS5pc0dyb3VwKSB7XG4gICAgICBpZiAodGhpcy5pc0hvdmVyRGVzY2VuZGFudChob3ZlcmVkTm9kZS5pZCkpIHtcbiAgICAgICAgaG92ZXJlZE5vZGUgPSB0aGlzLmRyYWdnZWROb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwb3NpdGlvblR5cGUgPSB0aGlzLmdldFBvc2l0aW9uVHlwZShldmVudCwgaG92ZXJlZE5vZGUpO1xuXG4gICAgY29uc3QgYmVsbG93T3BlbmVkR3JvdXAgPVxuICAgICAgaG92ZXJlZE5vZGUuaXNHcm91cCAmJlxuICAgICAgcG9zaXRpb25UeXBlID09PSAnYmVsb3cnICYmXG4gICAgICB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQoaG92ZXJlZE5vZGUpO1xuICAgIGlmIChiZWxsb3dPcGVuZWRHcm91cCkge1xuICAgICAgcG9zaXRpb25UeXBlID0gJ2luc2lkZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGV2ZW50LngsXG4gICAgICB5OiB0aGlzLmdldFBvc2l0aW9uWShob3ZlcmVkTm9kZSwgcG9zaXRpb25UeXBlKSxcbiAgICAgIGxldmVsOiB0aGlzLmdldFBvc2l0aW9uTGV2ZWwoaG92ZXJlZE5vZGUsIHBvc2l0aW9uVHlwZSwgZXZlbnQueCksXG4gICAgICB0eXBlOiBwb3NpdGlvblR5cGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvblkobm9kZTogVHJlZUZsYXROb2RlLCB0eXBlOiBEcm9wUG9zaXRpb25UeXBlKTogbnVtYmVyIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXROb2RlRWxlbWVudChub2RlKTtcbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnYmVsb3cnXG4gICAgICA/IGVsZW1lbnQub2Zmc2V0VG9wICsgcmVjdC5oZWlnaHQgLSAxXG4gICAgICA6IGVsZW1lbnQub2Zmc2V0VG9wICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25UeXBlKFxuICAgIGV2ZW50OiBEcmFnRXZlbnQsXG4gICAgaG92ZXJlZE5vZGU6IFRyZWVGbGF0Tm9kZVxuICApOiBEcm9wUG9zaXRpb25UeXBlIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldE5vZGVFbGVtZW50KGhvdmVyZWROb2RlKTtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1pZGRsZSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IHkgPSBldmVudC55O1xuXG4gICAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nID0gdGhpcy5kcmFnZ2VkTm9kZS5pZCA9PT0gaG92ZXJlZE5vZGUuaWQ7XG4gICAgaWYgKGhvdmVyZWROb2RlLmlzR3JvdXAgJiYgIXNlbGZSZWZlcmVuY2luZykge1xuICAgICAgY29uc3QgdG9sZXJlbmNlID0gNTtcbiAgICAgIGlmICh5IDw9IG1pZGRsZSArIHRvbGVyZW5jZSAmJiB5ID49IG1pZGRsZSAtIHRvbGVyZW5jZSkge1xuICAgICAgICByZXR1cm4gJ2luc2lkZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNCZWxvdyA9IHkgPiBtaWRkbGU7XG4gICAgcmV0dXJuIGlzQmVsb3cgPyAnYmVsb3cnIDogJ2Fib3ZlJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25MZXZlbChcbiAgICBob3ZlcmVkTm9kZTogVHJlZUZsYXROb2RlLFxuICAgIHR5cGU6IERyb3BQb3NpdGlvblR5cGUsXG4gICAgeDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgaWYgKGhvdmVyZWROb2RlLmxldmVsID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZ2V0Tm9kZUFuY2VzdG9ycyhob3ZlcmVkTm9kZS5pZCk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldERpcmVjdERlc2NlbmRhbnRzKGFuY2VzdG9yKTtcbiAgICBjb25zdCBsYXN0Q2hpbGQgPSBbLi4uY2hpbGRyZW5dLnBvcCgpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdiZWxvdycgJiYgbGFzdENoaWxkLmlkID09PSBob3ZlcmVkTm9kZS5pZCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXROb2RlRWxlbWVudChob3ZlcmVkTm9kZSk7XG4gICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBjb25zdCBpbmRlbnRhdGlvbiA9IDI0O1xuICAgICAgY29uc3QgeE1pbiA9IHJlY3QueCArIGluZGVudGF0aW9uO1xuICAgICAgY29uc3QgeE1heCA9IHhNaW4gKyBpbmRlbnRhdGlvbiAqIGhvdmVyZWROb2RlLmxldmVsO1xuXG4gICAgICBjb25zdCBpc0luc2lkZVNhbWVHcm91cCA9IHggPiB4TWF4O1xuICAgICAgaWYgKCFpc0luc2lkZVNhbWVHcm91cCkge1xuICAgICAgICBjb25zdCBsZXZlbFN1YnN0cmFjdGVkID0gTWF0aC5yb3VuZCgoeE1heCAtIHgpIC8gaW5kZW50YXRpb24pO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgaG92ZXJlZE5vZGUubGV2ZWwgLSBsZXZlbFN1YnN0cmFjdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG92ZXJlZE5vZGUubGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGxldmVsIGlmIGxldmVsIGlzIGRlZmluZWQgd2l0aCBnbyB0byB0aGUgZGVmaW5lZCBsZXZsZSB0byBmaW5kIGFuY2VzdG9yLiBTaW5vbiBvbiBwcmVuZCBsZSBjdXJyZW50IGFuY2VzdG9yXG4gICAqL1xuICBwcml2YXRlIGdldE5vZGVBbmNlc3RvcnMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBsZXZlbD86IG51bWJlclxuICApOiBUcmVlRmxhdE5vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXM7XG4gICAgY29uc3QgaW5kZXggPSBub2Rlcy5maW5kSW5kZXgoKG5vZGUpID0+IG5vZGUuaWQgPT09IGlkKTtcblxuICAgIGNvbnN0IHRhcmdldExldmVsID0gbGV2ZWwgPz8gTWF0aC5tYXgoMCwgbm9kZXNbaW5kZXhdLmxldmVsIC0gMSk7XG4gICAgcmV0dXJuIG5vZGVzXG4gICAgICAuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZCgobm9kZSkgPT4gbm9kZS5sZXZlbCA9PT0gdGFyZ2V0TGV2ZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXJlY3REZXNjZW5kYW50cyhub2RlOiBUcmVlRmxhdE5vZGUpOiBUcmVlRmxhdE5vZGVbXSB7XG4gICAgY29uc3QgbGV2ZWwgPSBub2RlLmxldmVsICsgMTtcbiAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbFxuICAgICAgLmdldERlc2NlbmRhbnRzKG5vZGUpXG4gICAgICAuZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQubGV2ZWwgPT09IGxldmVsKTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLWRyb3AuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL2RyYWctZHJvcC9zcmMvdHJlZS1kcmFnLWRyb3AvdHJlZS1kcmFnLWRyb3AuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFRyZWVGbGF0Tm9kZTxUID0gYW55PiB7XG4gIGlkOiBzdHJpbmc7XG4gIGlzR3JvdXA6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBsZXZlbDogbnVtYmVyO1xuICAvLyBHaXZlIHRoZSBudW1iZXIgb2YgbGV2ZWwgaW5zaWRlIGEgZ3JvdXA7XG4gIGRlc2NlbmRhbnRMZXZlbHM/OiBudW1iZXI7XG4gIGRhdGE6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcFBvc2l0aW9uIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGxldmVsOiBudW1iZXI7XG4gIHR5cGU6IERyb3BQb3NpdGlvblR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIERyb3BQb3NpdGlvblR5cGUgPSAnYWJvdmUnIHwgJ2JlbG93JyB8ICdpbnNpZGUnO1xuIl19
@@ -1,19 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { DynamicOutletComponent } from './dynamic-outlet/dynamic-outlet.component';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * @deprecated import the DynamicOutletComponent directly
6
- */
7
- export class IgoDynamicComponentModule {
8
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDynamicComponentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: IgoDynamicComponentModule, imports: [DynamicOutletComponent], exports: [DynamicOutletComponent] });
10
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDynamicComponentModule });
11
- }
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDynamicComponentModule, decorators: [{
13
- type: NgModule,
14
- args: [{
15
- imports: [DynamicOutletComponent],
16
- exports: [DynamicOutletComponent]
17
- }]
18
- }] });
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jb21wb25lbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL2R5bmFtaWMtY29tcG9uZW50L3NyYy9keW5hbWljLWNvbXBvbmVudC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7QUFFbkY7O0dBRUc7QUFLSCxNQUFNLE9BQU8seUJBQXlCO3dHQUF6Qix5QkFBeUI7eUdBQXpCLHlCQUF5QixZQUgxQixzQkFBc0IsYUFDdEIsc0JBQXNCO3lHQUVyQix5QkFBeUI7OzRGQUF6Qix5QkFBeUI7a0JBSnJDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IER5bmFtaWNPdXRsZXRDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtb3V0bGV0L2R5bmFtaWMtb3V0bGV0LmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW1wb3J0IHRoZSBEeW5hbWljT3V0bGV0Q29tcG9uZW50IGRpcmVjdGx5XG4gKi9cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtEeW5hbWljT3V0bGV0Q29tcG9uZW50XSxcbiAgZXhwb3J0czogW0R5bmFtaWNPdXRsZXRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIElnb0R5bmFtaWNDb21wb25lbnRNb2R1bGUge31cbiJdfQ==
@@ -1,129 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, ViewContainerRef } from '@angular/core';
2
- import { ObjectUtils } from '@igo2/utils';
3
- import { DynamicComponent } from '../shared/dynamic-component';
4
- import { DynamicComponentService } from '../shared/dynamic-component.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../shared/dynamic-component.service";
7
- export class DynamicOutletComponent {
8
- dynamicComponentService;
9
- cdRef;
10
- /**
11
- * The dynamic component base class or the dynamic component itself
12
- */
13
- component;
14
- /**
15
- * The dynamic component inputs
16
- */
17
- inputs = {};
18
- /**
19
- * The subscribers to the dynamic component outputs
20
- */
21
- subscribers = {};
22
- /**
23
- * The dynamic component
24
- */
25
- dynamicComponent;
26
- /**
27
- * The view element to render the component to
28
- * @ignore
29
- */
30
- target;
31
- constructor(dynamicComponentService, cdRef) {
32
- this.dynamicComponentService = dynamicComponentService;
33
- this.cdRef = cdRef;
34
- }
35
- /**
36
- * If the dynamic component changes, create it.
37
- * If the inputs or subscribers change, update the current component's
38
- * inputs or subscribers.
39
- * @internal
40
- */
41
- ngOnChanges(changes) {
42
- const component = changes.component;
43
- const inputs = changes.inputs;
44
- const subscribers = changes.subscribers;
45
- const eq = ObjectUtils.objectsAreEquivalent;
46
- if (!component || !component.currentValue) {
47
- return;
48
- }
49
- if (component.currentValue !== component.previousValue) {
50
- this.createComponent(component.currentValue);
51
- }
52
- else {
53
- const inputsAreEquivalents = inputs && eq(inputs.currentValue || {}, inputs.previousValue || {});
54
- const subscribersAreEquivalents = subscribers &&
55
- eq(subscribers.currentValue || {}, subscribers.previousValue || {});
56
- if (inputsAreEquivalents === false) {
57
- this.updateInputs();
58
- }
59
- if (subscribersAreEquivalents === false) {
60
- this.updateSubscribers();
61
- }
62
- }
63
- this.cdRef.detectChanges();
64
- }
65
- /**
66
- * Destroy the dynamic component and all it's subscribers
67
- * @internal
68
- */
69
- ngOnDestroy() {
70
- if (this.dynamicComponent) {
71
- this.dynamicComponent.destroy();
72
- }
73
- }
74
- /**
75
- * Create a DynamicComponent out of the component class and render it.
76
- * @internal
77
- */
78
- createComponent(component) {
79
- if (this.dynamicComponent !== undefined) {
80
- this.dynamicComponent.destroy();
81
- }
82
- this.dynamicComponent =
83
- component instanceof DynamicComponent
84
- ? component
85
- : this.dynamicComponentService.create(component);
86
- this.renderComponent();
87
- }
88
- /**
89
- * Create and render the dynamic component. Set it's inputs and subscribers
90
- * @internal
91
- */
92
- renderComponent() {
93
- this.updateInputs();
94
- this.updateSubscribers();
95
- this.dynamicComponent.setTarget(this.target);
96
- }
97
- /**
98
- * Update the dynamic component inputs. This is an update so any
99
- * key not defined won't be overwritten.
100
- * @internal
101
- */
102
- updateInputs() {
103
- this.dynamicComponent.updateInputs(this.inputs);
104
- }
105
- /**
106
- * Update the dynamic component subscribers. This is an update so any
107
- * key not defined won't be overwritten.
108
- * @internal
109
- */
110
- updateSubscribers() {
111
- this.dynamicComponent.updateSubscribers(this.subscribers);
112
- }
113
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicOutletComponent, deps: [{ token: i1.DynamicComponentService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
114
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DynamicOutletComponent, isStandalone: true, selector: "igo-dynamic-outlet", inputs: { component: "component", inputs: "inputs", subscribers: "subscribers" }, viewQueries: [{ propertyName: "target", first: true, predicate: ["target"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #target></ng-template>\n", styles: [":host{display:block;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
115
- }
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicOutletComponent, decorators: [{
117
- type: Component,
118
- args: [{ selector: 'igo-dynamic-outlet', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<ng-template #target></ng-template>\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
119
- }], ctorParameters: () => [{ type: i1.DynamicComponentService }, { type: i0.ChangeDetectorRef }], propDecorators: { component: [{
120
- type: Input
121
- }], inputs: [{
122
- type: Input
123
- }], subscribers: [{
124
- type: Input
125
- }], target: [{
126
- type: ViewChild,
127
- args: ['target', { read: ViewContainerRef, static: true }]
128
- }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1vdXRsZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL2R5bmFtaWMtY29tcG9uZW50L3NyYy9keW5hbWljLW91dGxldC9keW5hbWljLW91dGxldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZHluYW1pYy1jb21wb25lbnQvc3JjL2R5bmFtaWMtb3V0bGV0L2R5bmFtaWMtb3V0bGV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBSUwsU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUFTOUUsTUFBTSxPQUFPLHNCQUFzQjtJQTZCdkI7SUFDQTtJQTdCVjs7T0FFRztJQUNNLFNBQVMsQ0FBOEI7SUFFaEQ7O09BRUc7SUFDTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztJQUUxQzs7T0FFRztJQUNNLFdBQVcsR0FBeUMsRUFBRSxDQUFDO0lBRWhFOztPQUVHO0lBQ0ssZ0JBQWdCLENBQXdCO0lBRWhEOzs7T0FHRztJQUVLLE1BQU0sQ0FBbUI7SUFFakMsWUFDVSx1QkFBZ0QsRUFDaEQsS0FBd0I7UUFEeEIsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtJQUMvQixDQUFDO0lBRUo7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMs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RUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvZHluYW1pYy1jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZHluYW1pYy1jb21wb25lbnQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1keW5hbWljLW91dGxldCcsXG4gIHRlbXBsYXRlVXJsOiAnZHluYW1pYy1vdXRsZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZHluYW1pYy1vdXRsZXQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY091dGxldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRoZSBkeW5hbWljIGNvbXBvbmVudCBiYXNlIGNsYXNzIG9yIHRoZSBkeW5hbWljIGNvbXBvbmVudCBpdHNlbGZcbiAgICovXG4gIEBJbnB1dCgpIGNvbXBvbmVudDogRHluYW1pY0NvbXBvbmVudDxhbnk+IHwgYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgZHluYW1pYyBjb21wb25lbnQgaW5wdXRzXG4gICAqL1xuICBASW5wdXQoKSBpbnB1dHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIHN1YnNjcmliZXJzIHRvIHRoZSBkeW5hbWljIGNvbXBvbmVudCBvdXRwdXRzXG4gICAqL1xuICBASW5wdXQoKSBzdWJzY3JpYmVyczogUmVjb3JkPHN0cmluZywgKGV2ZW50OiBhbnkpID0+IHZvaWQ+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBkeW5hbWljIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50OiBEeW5hbWljQ29tcG9uZW50PGFueT47XG5cbiAgLyoqXG4gICAqIFRoZSB2aWV3IGVsZW1lbnQgdG8gcmVuZGVyIHRoZSBjb21wb25lbnQgdG9cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgndGFyZ2V0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSB0YXJnZXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50U2VydmljZTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZHluYW1pYyBjb21wb25lbnQgY2hhbmdlcywgY3JlYXRlIGl0LlxuICAgKiBJZiB0aGUgaW5wdXRzIG9yIHN1YnNjcmliZXJzIGNoYW5nZSwgdXBkYXRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCdzXG4gICAqIGlucHV0cyBvciBzdWJzY3JpYmVycy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gY2hhbmdlcy5jb21wb25lbnQ7XG4gICAgY29uc3QgaW5wdXRzID0gY2hhbmdlcy5pbnB1dHM7XG4gICAgY29uc3Qgc3Vic2NyaWJlcnMgPSBjaGFuZ2VzLnN1YnNjcmliZXJzO1xuICAgIGNvbnN0IGVxID0gT2JqZWN0VXRpbHMub2JqZWN0c0FyZUVxdWl2YWxlbnQ7XG5cbiAgICBpZiAoIWNvbXBvbmVudCB8fCAhY29tcG9uZW50LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnQuY3VycmVudFZhbHVlICE9PSBjb21wb25lbnQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50LmN1cnJlbnRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlucHV0c0FyZUVxdWl2YWxlbnRzID1cbiAgICAgICAgaW5wdXRzICYmIGVxKGlucHV0cy5jdXJyZW50VmFsdWUgfHwge30sIGlucHV0cy5wcmV2aW91c1ZhbHVlIHx8IHt9KTtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXJzQXJlRXF1aXZhbGVudHMgPVxuICAgICAgICBzdWJzY3JpYmVycyAmJlxuICAgICAgICBlcShzdWJzY3JpYmVycy5jdXJyZW50VmFsdWUgfHwge30sIHN1YnNjcmliZXJzLnByZXZpb3VzVmFsdWUgfHwge30pO1xuXG4gICAgICBpZiAoaW5wdXRzQXJlRXF1aXZhbGVudHMgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJzY3JpYmVyc0FyZUVxdWl2YWxlbnRzID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN1YnNjcmliZXJzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGR5bmFtaWMgY29tcG9uZW50IGFuZCBhbGwgaXQncyBzdWJzY3JpYmVyc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmR5bmFtaWNDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhICBEeW5hbWljQ29tcG9uZW50IG91dCBvZiB0aGUgY29tcG9uZW50IGNsYXNzIGFuZCByZW5kZXIgaXQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50OiBEeW5hbWljQ29tcG9uZW50PGFueT4gfCBhbnkpIHtcbiAgICBpZiAodGhpcy5keW5hbWljQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudCA9XG4gICAgICBjb21wb25lbnQgaW5zdGFuY2VvZiBEeW5hbWljQ29tcG9uZW50XG4gICAgICAgID8gY29tcG9uZW50XG4gICAgICAgIDogdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5jcmVhdGUoY29tcG9uZW50KTtcbiAgICB0aGlzLnJlbmRlckNvbXBvbmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmVuZGVyIHRoZSBkeW5hbWljIGNvbXBvbmVudC4gU2V0IGl0J3MgaW5wdXRzIGFuZCBzdWJzY3JpYmVyc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29tcG9uZW50KCkge1xuICAgIHRoaXMudXBkYXRlSW5wdXRzKCk7XG4gICAgdGhpcy51cGRhdGVTdWJzY3JpYmVycygpO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudC5zZXRUYXJnZXQodGhpcy50YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZHluYW1pYyBjb21wb25lbnQgaW5wdXRzLiBUaGlzIGlzIGFuIHVwZGF0ZSBzbyBhbnlcbiAgICoga2V5IG5vdCBkZWZpbmVkIHdvbid0IGJlIG92ZXJ3cml0dGVuLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSW5wdXRzKCkge1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudC51cGRhdGVJbnB1dHModGhpcy5pbnB1dHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZHluYW1pYyBjb21wb25lbnQgc3Vic2NyaWJlcnMuIFRoaXMgaXMgYW4gdXBkYXRlIHNvIGFueVxuICAgKiBrZXkgbm90IGRlZmluZWQgd29uJ3QgYmUgb3ZlcndyaXR0ZW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTdWJzY3JpYmVycygpIHtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnQudXBkYXRlU3Vic2NyaWJlcnModGhpcy5zdWJzY3JpYmVycyk7XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjdGFyZ2V0PjwvbmctdGVtcGxhdGU+XG4iXX0=