@igo2/common 1.15.4 → 1.15.5

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 (354) hide show
  1. package/esm2020/igo2-common.mjs +4 -4
  2. package/esm2020/lib/action/action.module.mjs +27 -27
  3. package/esm2020/lib/action/actionbar/actionbar-item.component.mjs +252 -252
  4. package/esm2020/lib/action/actionbar/actionbar.component.mjs +370 -370
  5. package/esm2020/lib/action/actionbar/actionbar.module.mjs +57 -57
  6. package/esm2020/lib/action/index.mjs +3 -3
  7. package/esm2020/lib/action/shared/action.enums.mjs +7 -7
  8. package/esm2020/lib/action/shared/action.interfaces.mjs +2 -2
  9. package/esm2020/lib/action/shared/index.mjs +4 -4
  10. package/esm2020/lib/action/shared/store.mjs +8 -8
  11. package/esm2020/lib/backdrop/backdrop.component.mjs +26 -26
  12. package/esm2020/lib/backdrop/backdrop.module.mjs +25 -25
  13. package/esm2020/lib/backdrop/index.mjs +2 -2
  14. package/esm2020/lib/badge-icon/badge-icon.directive.mjs +141 -141
  15. package/esm2020/lib/badge-icon/badge-icon.module.mjs +26 -26
  16. package/esm2020/lib/badge-icon/index.mjs +2 -2
  17. package/esm2020/lib/clickout/clickout.directive.mjs +32 -32
  18. package/esm2020/lib/clickout/clickout.module.mjs +24 -24
  19. package/esm2020/lib/clickout/index.mjs +2 -2
  20. package/esm2020/lib/clone/clone.module.mjs +24 -24
  21. package/esm2020/lib/clone/clone.pipe.mjs +24 -24
  22. package/esm2020/lib/clone/index.mjs +2 -2
  23. package/esm2020/lib/collapsible/collapse.directive.mjs +55 -55
  24. package/esm2020/lib/collapsible/collapsible.component.mjs +57 -57
  25. package/esm2020/lib/collapsible/collapsible.module.mjs +27 -27
  26. package/esm2020/lib/collapsible/index.mjs +3 -3
  27. package/esm2020/lib/confirm-dialog/confirm-dialog.component.mjs +44 -44
  28. package/esm2020/lib/confirm-dialog/confirm-dialog.module.mjs +29 -29
  29. package/esm2020/lib/confirm-dialog/confirm-dialog.service.mjs +24 -24
  30. package/esm2020/lib/confirm-dialog/index.mjs +3 -3
  31. package/esm2020/lib/context-menu/context-menu.directive.mjs +103 -103
  32. package/esm2020/lib/context-menu/context-menu.module.mjs +25 -25
  33. package/esm2020/lib/context-menu/index.mjs +3 -3
  34. package/esm2020/lib/context-menu/long-press.directive.mjs +67 -67
  35. package/esm2020/lib/custom-html/custom-html.component.mjs +28 -28
  36. package/esm2020/lib/custom-html/custom-html.module.mjs +47 -47
  37. package/esm2020/lib/custom-html/custom-html.pipe.mjs +18 -18
  38. package/esm2020/lib/custom-html/index.mjs +3 -3
  39. package/esm2020/lib/dom/dom.interfaces.mjs +2 -2
  40. package/esm2020/lib/dom/dom.module.mjs +23 -23
  41. package/esm2020/lib/dom/dom.service.mjs +30 -30
  42. package/esm2020/lib/dom/index.mjs +3 -3
  43. package/esm2020/lib/drag-drop/drag-drop.directive.mjs +87 -87
  44. package/esm2020/lib/drag-drop/drag-drop.module.mjs +24 -24
  45. package/esm2020/lib/drag-drop/index.mjs +2 -2
  46. package/esm2020/lib/dynamic-component/dynamic-component.module.mjs +31 -31
  47. package/esm2020/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +122 -122
  48. package/esm2020/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +28 -28
  49. package/esm2020/lib/dynamic-component/index.mjs +3 -3
  50. package/esm2020/lib/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -2
  51. package/esm2020/lib/dynamic-component/shared/dynamic-component.mjs +174 -174
  52. package/esm2020/lib/dynamic-component/shared/dynamic-component.service.mjs +29 -29
  53. package/esm2020/lib/dynamic-component/shared/index.mjs +4 -4
  54. package/esm2020/lib/entity/entity-selector/entity-selector.component.mjs +194 -194
  55. package/esm2020/lib/entity/entity-selector/entity-selector.module.mjs +32 -32
  56. package/esm2020/lib/entity/entity-table/entity-table-row.directive.mjs +137 -137
  57. package/esm2020/lib/entity/entity-table/entity-table.component.mjs +1376 -1376
  58. package/esm2020/lib/entity/entity-table/entity-table.module.mjs +102 -102
  59. package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.component.mjs +132 -132
  60. package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.interface.mjs +2 -2
  61. package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.module.mjs +28 -28
  62. package/esm2020/lib/entity/entity.module.mjs +31 -31
  63. package/esm2020/lib/entity/index.mjs +6 -6
  64. package/esm2020/lib/entity/shared/entity.enums.mjs +28 -28
  65. package/esm2020/lib/entity/shared/entity.interfaces.mjs +2 -2
  66. package/esm2020/lib/entity/shared/entity.utils.mjs +67 -67
  67. package/esm2020/lib/entity/shared/index.mjs +10 -10
  68. package/esm2020/lib/entity/shared/state.mjs +191 -191
  69. package/esm2020/lib/entity/shared/store.mjs +288 -288
  70. package/esm2020/lib/entity/shared/strategies/filter-custom-function.mjs +79 -79
  71. package/esm2020/lib/entity/shared/strategies/filter-selection.mjs +84 -84
  72. package/esm2020/lib/entity/shared/strategies/index.mjs +4 -4
  73. package/esm2020/lib/entity/shared/strategies/strategy.mjs +75 -75
  74. package/esm2020/lib/entity/shared/transaction.mjs +316 -316
  75. package/esm2020/lib/entity/shared/view.mjs +315 -315
  76. package/esm2020/lib/entity/shared/watcher.mjs +120 -120
  77. package/esm2020/lib/flexible/flexible.component.mjs +148 -148
  78. package/esm2020/lib/flexible/flexible.module.mjs +24 -24
  79. package/esm2020/lib/flexible/flexible.type.mjs +2 -2
  80. package/esm2020/lib/flexible/index.mjs +3 -3
  81. package/esm2020/lib/form/form/form.component.mjs +117 -117
  82. package/esm2020/lib/form/form/form.module.mjs +40 -40
  83. package/esm2020/lib/form/form-field/form-field-select.component.mjs +127 -127
  84. package/esm2020/lib/form/form-field/form-field-text.component.mjs +104 -104
  85. package/esm2020/lib/form/form-field/form-field-textarea.component.mjs +105 -105
  86. package/esm2020/lib/form/form-field/form-field.component.mjs +72 -72
  87. package/esm2020/lib/form/form-field/form-field.module.mjs +74 -74
  88. package/esm2020/lib/form/form-field/index.mjs +5 -5
  89. package/esm2020/lib/form/form-group/form-group.component.mjs +105 -105
  90. package/esm2020/lib/form/form-group/form-group.module.mjs +40 -40
  91. package/esm2020/lib/form/form.module.mjs +49 -49
  92. package/esm2020/lib/form/index.mjs +5 -5
  93. package/esm2020/lib/form/shared/form-field-component.mjs +7 -7
  94. package/esm2020/lib/form/shared/form-field.service.mjs +29 -29
  95. package/esm2020/lib/form/shared/form.interfaces.mjs +2 -2
  96. package/esm2020/lib/form/shared/form.service.mjs +81 -81
  97. package/esm2020/lib/form/shared/form.utils.mjs +40 -40
  98. package/esm2020/lib/form/shared/index.mjs +6 -6
  99. package/esm2020/lib/home-button/home-button.component.mjs +31 -31
  100. package/esm2020/lib/home-button/home-button.module.mjs +41 -41
  101. package/esm2020/lib/home-button/index.mjs +2 -2
  102. package/esm2020/lib/image/image-error.directive.mjs +35 -35
  103. package/esm2020/lib/image/image.module.mjs +25 -25
  104. package/esm2020/lib/image/index.mjs +3 -3
  105. package/esm2020/lib/image/secure-image.pipe.mjs +59 -59
  106. package/esm2020/lib/interactive-tour/index.mjs +5 -5
  107. package/esm2020/lib/interactive-tour/interactive-tour.component.mjs +135 -135
  108. package/esm2020/lib/interactive-tour/interactive-tour.interface.mjs +2 -2
  109. package/esm2020/lib/interactive-tour/interactive-tour.loader.mjs +44 -44
  110. package/esm2020/lib/interactive-tour/interactive-tour.module.mjs +40 -40
  111. package/esm2020/lib/interactive-tour/interactive-tour.service.mjs +285 -285
  112. package/esm2020/lib/json-dialog/index.mjs +3 -3
  113. package/esm2020/lib/json-dialog/json-dialog.component.mjs +109 -109
  114. package/esm2020/lib/json-dialog/json-dialog.module.mjs +29 -29
  115. package/esm2020/lib/json-dialog/json-dialog.service.mjs +24 -24
  116. package/esm2020/lib/keyvalue/index.mjs +2 -2
  117. package/esm2020/lib/keyvalue/keyvalue.module.mjs +24 -24
  118. package/esm2020/lib/keyvalue/keyvalue.pipe.mjs +18 -18
  119. package/esm2020/lib/list/index.mjs +3 -3
  120. package/esm2020/lib/list/list-item.directive.mjs +165 -165
  121. package/esm2020/lib/list/list.component.mjs +262 -262
  122. package/esm2020/lib/list/list.module.mjs +29 -29
  123. package/esm2020/lib/panel/index.mjs +2 -2
  124. package/esm2020/lib/panel/panel.component.mjs +59 -59
  125. package/esm2020/lib/panel/panel.module.mjs +19 -19
  126. package/esm2020/lib/sidenav/index.mjs +2 -2
  127. package/esm2020/lib/sidenav/sidenav-shim.directive.mjs +55 -55
  128. package/esm2020/lib/sidenav/sidenav.module.mjs +24 -24
  129. package/esm2020/lib/spinner/index.mjs +3 -3
  130. package/esm2020/lib/spinner/spinner-activity.directive.mjs +47 -47
  131. package/esm2020/lib/spinner/spinner.component.mjs +35 -35
  132. package/esm2020/lib/spinner/spinner.module.mjs +21 -21
  133. package/esm2020/lib/stop-propagation/index.mjs +3 -3
  134. package/esm2020/lib/stop-propagation/stop-drop-propagation.directive.mjs +22 -22
  135. package/esm2020/lib/stop-propagation/stop-propagation.directive.mjs +21 -21
  136. package/esm2020/lib/stop-propagation/stop-propagation.module.mjs +25 -25
  137. package/esm2020/lib/table/index.mjs +6 -6
  138. package/esm2020/lib/table/table-action-color.enum.mjs +7 -7
  139. package/esm2020/lib/table/table-database.mjs +28 -28
  140. package/esm2020/lib/table/table-datasource.mjs +61 -61
  141. package/esm2020/lib/table/table-model.interface.mjs +2 -2
  142. package/esm2020/lib/table/table.component.mjs +297 -297
  143. package/esm2020/lib/table/table.module.mjs +67 -67
  144. package/esm2020/lib/tool/index.mjs +3 -3
  145. package/esm2020/lib/tool/shared/index.mjs +6 -6
  146. package/esm2020/lib/tool/shared/tool-component.mjs +9 -9
  147. package/esm2020/lib/tool/shared/tool.interface.mjs +2 -2
  148. package/esm2020/lib/tool/shared/tool.service.mjs +43 -43
  149. package/esm2020/lib/tool/shared/toolbox.enums.mjs +7 -7
  150. package/esm2020/lib/tool/shared/toolbox.mjs +179 -179
  151. package/esm2020/lib/tool/tool.module.mjs +32 -32
  152. package/esm2020/lib/tool/toolbox/toolbox.animation.mjs +10 -10
  153. package/esm2020/lib/tool/toolbox/toolbox.component.mjs +255 -255
  154. package/esm2020/lib/tool/toolbox/toolbox.module.mjs +36 -36
  155. package/esm2020/lib/widget/index.mjs +3 -3
  156. package/esm2020/lib/widget/shared/index.mjs +4 -4
  157. package/esm2020/lib/widget/shared/widget.interfaces.mjs +2 -2
  158. package/esm2020/lib/widget/shared/widget.mjs +4 -4
  159. package/esm2020/lib/widget/shared/widget.service.mjs +20 -20
  160. package/esm2020/lib/widget/widget-outlet/widget-outlet.component.mjs +116 -116
  161. package/esm2020/lib/widget/widget-outlet/widget-outlet.module.mjs +32 -32
  162. package/esm2020/lib/widget/widget.module.mjs +32 -32
  163. package/esm2020/lib/workspace/index.mjs +4 -4
  164. package/esm2020/lib/workspace/shared/index.mjs +4 -4
  165. package/esm2020/lib/workspace/shared/store.mjs +40 -40
  166. package/esm2020/lib/workspace/shared/workspace.interfaces.mjs +2 -2
  167. package/esm2020/lib/workspace/shared/workspace.mjs +117 -117
  168. package/esm2020/lib/workspace/workspace-selector/workspace-selector.component.mjs +51 -51
  169. package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +32 -32
  170. package/esm2020/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +88 -88
  171. package/esm2020/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +32 -32
  172. package/esm2020/lib/workspace/workspace.module.mjs +27 -27
  173. package/esm2020/public_api.mjs +74 -74
  174. package/fesm2015/igo2-common.mjs +10016 -10016
  175. package/fesm2015/igo2-common.mjs.map +1 -1
  176. package/fesm2020/igo2-common.mjs +9319 -9319
  177. package/fesm2020/igo2-common.mjs.map +1 -1
  178. package/index.d.ts +5 -5
  179. package/lib/action/action.module.d.ts +8 -8
  180. package/lib/action/actionbar/actionbar-item.component.d.ts +78 -78
  181. package/lib/action/actionbar/actionbar.component.d.ts +146 -146
  182. package/lib/action/actionbar/actionbar.module.d.ts +20 -20
  183. package/lib/action/index.d.ts +2 -2
  184. package/lib/action/shared/action.enums.d.ts +5 -5
  185. package/lib/action/shared/action.interfaces.d.ts +17 -17
  186. package/lib/action/shared/index.d.ts +3 -3
  187. package/lib/action/shared/store.d.ts +8 -8
  188. package/lib/backdrop/backdrop.component.d.ts +9 -9
  189. package/lib/backdrop/backdrop.module.d.ts +10 -10
  190. package/lib/backdrop/index.d.ts +1 -1
  191. package/lib/badge-icon/badge-icon.directive.d.ts +36 -36
  192. package/lib/badge-icon/badge-icon.module.d.ts +11 -11
  193. package/lib/badge-icon/index.d.ts +1 -1
  194. package/lib/clickout/clickout.directive.d.ts +10 -10
  195. package/lib/clickout/clickout.module.d.ts +9 -9
  196. package/lib/clickout/index.d.ts +1 -1
  197. package/lib/clone/clone.module.d.ts +9 -9
  198. package/lib/clone/clone.pipe.d.ts +7 -7
  199. package/lib/clone/index.d.ts +1 -1
  200. package/lib/collapsible/collapse.directive.d.ts +19 -19
  201. package/lib/collapsible/collapsible.component.d.ts +13 -13
  202. package/lib/collapsible/collapsible.module.d.ts +12 -12
  203. package/lib/collapsible/index.d.ts +2 -2
  204. package/lib/confirm-dialog/confirm-dialog.component.d.ts +9 -9
  205. package/lib/confirm-dialog/confirm-dialog.module.d.ts +12 -12
  206. package/lib/confirm-dialog/confirm-dialog.service.d.ts +12 -12
  207. package/lib/confirm-dialog/index.d.ts +2 -2
  208. package/lib/context-menu/context-menu.directive.d.ts +21 -21
  209. package/lib/context-menu/context-menu.module.d.ts +10 -10
  210. package/lib/context-menu/index.d.ts +2 -2
  211. package/lib/context-menu/long-press.directive.d.ts +20 -20
  212. package/lib/custom-html/custom-html.component.d.ts +9 -9
  213. package/lib/custom-html/custom-html.module.d.ts +16 -16
  214. package/lib/custom-html/custom-html.pipe.d.ts +10 -10
  215. package/lib/custom-html/index.d.ts +2 -2
  216. package/lib/dom/dom.interfaces.d.ts +10 -10
  217. package/lib/dom/dom.module.d.ts +8 -8
  218. package/lib/dom/dom.service.d.ts +10 -10
  219. package/lib/dom/index.d.ts +2 -2
  220. package/lib/drag-drop/drag-drop.directive.d.ts +14 -14
  221. package/lib/drag-drop/drag-drop.module.d.ts +9 -9
  222. package/lib/drag-drop/index.d.ts +1 -1
  223. package/lib/dynamic-component/dynamic-component.module.d.ts +8 -8
  224. package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.d.ts +70 -70
  225. package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.d.ts +11 -11
  226. package/lib/dynamic-component/index.d.ts +2 -2
  227. package/lib/dynamic-component/shared/dynamic-component.d.ts +88 -88
  228. package/lib/dynamic-component/shared/dynamic-component.interfaces.d.ts +3 -3
  229. package/lib/dynamic-component/shared/dynamic-component.service.d.ts +18 -18
  230. package/lib/dynamic-component/shared/index.d.ts +3 -3
  231. package/lib/entity/entity-selector/entity-selector.component.d.ts +92 -92
  232. package/lib/entity/entity-selector/entity-selector.module.d.ts +13 -13
  233. package/lib/entity/entity-table/entity-table-row.directive.d.ts +69 -69
  234. package/lib/entity/entity-table/entity-table.component.d.ts +333 -333
  235. package/lib/entity/entity-table/entity-table.module.d.ts +29 -29
  236. package/lib/entity/entity-table-paginator/entity-table-paginator.component.d.ts +49 -49
  237. package/lib/entity/entity-table-paginator/entity-table-paginator.interface.d.ts +8 -8
  238. package/lib/entity/entity-table-paginator/entity-table-paginator.module.d.ts +11 -11
  239. package/lib/entity/entity.module.d.ts +10 -10
  240. package/lib/entity/index.d.ts +5 -5
  241. package/lib/entity/shared/entity.enums.d.ts +23 -23
  242. package/lib/entity/shared/entity.interfaces.d.ts +114 -114
  243. package/lib/entity/shared/entity.utils.d.ts +49 -49
  244. package/lib/entity/shared/index.d.ts +9 -9
  245. package/lib/entity/shared/state.d.ts +103 -103
  246. package/lib/entity/shared/store.d.ts +176 -176
  247. package/lib/entity/shared/strategies/filter-custom-function.d.ts +51 -51
  248. package/lib/entity/shared/strategies/filter-selection.d.ts +48 -48
  249. package/lib/entity/shared/strategies/index.d.ts +3 -3
  250. package/lib/entity/shared/strategies/strategy.d.ts +56 -56
  251. package/lib/entity/shared/transaction.d.ts +168 -168
  252. package/lib/entity/shared/view.d.ts +193 -193
  253. package/lib/entity/shared/watcher.d.ts +72 -72
  254. package/lib/flexible/flexible.component.d.ts +41 -41
  255. package/lib/flexible/flexible.module.d.ts +9 -9
  256. package/lib/flexible/flexible.type.d.ts +2 -2
  257. package/lib/flexible/index.d.ts +2 -2
  258. package/lib/form/form/form.component.d.ts +53 -53
  259. package/lib/form/form/form.module.d.ts +12 -12
  260. package/lib/form/form-field/form-field-select.component.d.ts +48 -48
  261. package/lib/form/form-field/form-field-text.component.d.ts +41 -41
  262. package/lib/form/form-field/form-field-textarea.component.d.ts +41 -41
  263. package/lib/form/form-field/form-field.component.d.ts +34 -34
  264. package/lib/form/form-field/form-field.module.d.ts +21 -21
  265. package/lib/form/form-field/index.d.ts +4 -4
  266. package/lib/form/form-group/form-group.component.d.ts +49 -49
  267. package/lib/form/form-group/form-group.module.d.ts +14 -14
  268. package/lib/form/form.module.d.ts +13 -13
  269. package/lib/form/index.d.ts +4 -4
  270. package/lib/form/shared/form-field-component.d.ts +1 -1
  271. package/lib/form/shared/form-field.service.d.ts +19 -19
  272. package/lib/form/shared/form.interfaces.d.ts +57 -57
  273. package/lib/form/shared/form.service.d.ts +15 -15
  274. package/lib/form/shared/form.utils.d.ts +11 -11
  275. package/lib/form/shared/index.d.ts +5 -5
  276. package/lib/home-button/home-button.component.d.ts +9 -9
  277. package/lib/home-button/home-button.module.d.ts +15 -15
  278. package/lib/home-button/index.d.ts +1 -1
  279. package/lib/image/image-error.directive.d.ts +11 -11
  280. package/lib/image/image.module.d.ts +10 -10
  281. package/lib/image/index.d.ts +2 -2
  282. package/lib/image/secure-image.pipe.d.ts +13 -13
  283. package/lib/interactive-tour/index.d.ts +4 -4
  284. package/lib/interactive-tour/interactive-tour.component.d.ts +30 -30
  285. package/lib/interactive-tour/interactive-tour.interface.d.ts +32 -32
  286. package/lib/interactive-tour/interactive-tour.loader.d.ts +18 -18
  287. package/lib/interactive-tour/interactive-tour.module.d.ts +12 -12
  288. package/lib/interactive-tour/interactive-tour.service.d.ts +29 -29
  289. package/lib/json-dialog/index.d.ts +2 -2
  290. package/lib/json-dialog/json-dialog.component.d.ts +13 -13
  291. package/lib/json-dialog/json-dialog.module.d.ts +13 -13
  292. package/lib/json-dialog/json-dialog.service.d.ts +10 -10
  293. package/lib/keyvalue/index.d.ts +1 -1
  294. package/lib/keyvalue/keyvalue.module.d.ts +9 -9
  295. package/lib/keyvalue/keyvalue.pipe.d.ts +7 -7
  296. package/lib/list/index.d.ts +2 -2
  297. package/lib/list/list-item.directive.d.ts +43 -43
  298. package/lib/list/list.component.d.ts +51 -51
  299. package/lib/list/list.module.d.ts +14 -14
  300. package/lib/panel/index.d.ts +1 -1
  301. package/lib/panel/panel.component.d.ts +10 -10
  302. package/lib/panel/panel.module.d.ts +8 -8
  303. package/lib/sidenav/index.d.ts +1 -1
  304. package/lib/sidenav/sidenav-shim.directive.d.ts +20 -20
  305. package/lib/sidenav/sidenav.module.d.ts +9 -9
  306. package/lib/spinner/index.d.ts +2 -2
  307. package/lib/spinner/spinner-activity.directive.d.ts +32 -32
  308. package/lib/spinner/spinner.component.d.ts +12 -12
  309. package/lib/spinner/spinner.module.d.ts +10 -10
  310. package/lib/stop-propagation/index.d.ts +2 -2
  311. package/lib/stop-propagation/stop-drop-propagation.directive.d.ts +6 -6
  312. package/lib/stop-propagation/stop-propagation.directive.d.ts +6 -6
  313. package/lib/stop-propagation/stop-propagation.module.d.ts +10 -10
  314. package/lib/table/index.d.ts +5 -5
  315. package/lib/table/table-action-color.enum.d.ts +5 -5
  316. package/lib/table/table-database.d.ts +10 -10
  317. package/lib/table/table-datasource.d.ts +17 -17
  318. package/lib/table/table-model.interface.d.ts +28 -28
  319. package/lib/table/table.component.d.ts +40 -40
  320. package/lib/table/table.module.d.ts +20 -20
  321. package/lib/tool/index.d.ts +2 -2
  322. package/lib/tool/shared/index.d.ts +5 -5
  323. package/lib/tool/shared/tool-component.d.ts +2 -2
  324. package/lib/tool/shared/tool.interface.d.ts +18 -18
  325. package/lib/tool/shared/tool.service.d.ts +30 -30
  326. package/lib/tool/shared/toolbox.d.ts +95 -95
  327. package/lib/tool/shared/toolbox.enums.d.ts +5 -5
  328. package/lib/tool/tool.module.d.ts +10 -10
  329. package/lib/tool/toolbox/toolbox.animation.d.ts +2 -2
  330. package/lib/tool/toolbox/toolbox.component.d.ts +127 -127
  331. package/lib/tool/toolbox/toolbox.module.d.ts +13 -13
  332. package/lib/widget/index.d.ts +2 -2
  333. package/lib/widget/shared/index.d.ts +3 -3
  334. package/lib/widget/shared/widget.d.ts +4 -4
  335. package/lib/widget/shared/widget.interfaces.d.ts +12 -12
  336. package/lib/widget/shared/widget.service.d.ts +10 -10
  337. package/lib/widget/widget-outlet/widget-outlet.component.d.ts +71 -71
  338. package/lib/widget/widget-outlet/widget-outlet.module.d.ts +12 -12
  339. package/lib/widget/widget.module.d.ts +8 -8
  340. package/lib/workspace/index.d.ts +3 -3
  341. package/lib/workspace/shared/index.d.ts +3 -3
  342. package/lib/workspace/shared/store.d.ts +20 -20
  343. package/lib/workspace/shared/workspace.d.ts +108 -108
  344. package/lib/workspace/shared/workspace.interfaces.d.ts +11 -11
  345. package/lib/workspace/workspace-selector/workspace-selector.component.d.ts +39 -39
  346. package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +12 -12
  347. package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +57 -57
  348. package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.d.ts +12 -12
  349. package/lib/workspace/workspace.module.d.ts +9 -9
  350. package/package.json +3 -3
  351. package/public_api.d.ts +70 -70
  352. package/style/common.theming.scss +12 -12
  353. package/style/partial/action.scss +18 -18
  354. package/style/partial/common.variables.scss +8 -8
@@ -1,315 +1,315 @@
1
- import { BehaviorSubject, combineLatest } from 'rxjs';
2
- import { debounceTime, map, skip } from 'rxjs/operators';
3
- import { ObjectUtils, uuid } from '@igo2/utils';
4
- /**
5
- * An entity view streams entities from an observable source. These entities
6
- * can be filtered or sorted without affecting the source. A view can also
7
- * combine data from multiple sources, joined together.
8
- */
9
- export class EntityView {
10
- constructor(source$) {
11
- this.source$ = source$;
12
- /**
13
- * Observable stream of values
14
- */
15
- this.values$ = new BehaviorSubject([]);
16
- /**
17
- * Whether this view has been lifted
18
- */
19
- this.lifted = false;
20
- /**
21
- * Join clauses
22
- */
23
- this.joins = [];
24
- /**
25
- * Observable of a filter clause
26
- */
27
- this.filter$ = new BehaviorSubject(undefined);
28
- /**
29
- * Observable of filter clauses
30
- */
31
- this.filters$ = new BehaviorSubject([]);
32
- /**
33
- * Filters index
34
- */
35
- this.filterIndex = new Map();
36
- /**
37
- * Observable of a sort clause
38
- */
39
- this.sort$ = new BehaviorSubject(undefined);
40
- this.getKey$ = new BehaviorSubject(undefined);
41
- /**
42
- * Number of entities
43
- */
44
- this.count$ = new BehaviorSubject(0);
45
- /**
46
- * Whether the store is empty
47
- */
48
- this.empty$ = new BehaviorSubject(true);
49
- }
50
- /**
51
- * Method for indexing
52
- */
53
- get getKey() { return this.getKey$.value; }
54
- get count() { return this.count$.value; }
55
- get empty() { return this.empty$.value; }
56
- /**
57
- * Store index
58
- */
59
- get index() { return this._index; }
60
- /**
61
- * Get a value from the view by key
62
- * @param key Key
63
- * @returns Value
64
- */
65
- get(key) {
66
- if (this._index === undefined) {
67
- throw new Error('This view has no index, therefore, this method is unavailable.');
68
- }
69
- return this.index.get(key);
70
- }
71
- /**
72
- * Get all the values
73
- * @returns Array of values
74
- */
75
- all() {
76
- return this.values$.value;
77
- }
78
- /**
79
- * Observe all the values
80
- * @returns Observable of values
81
- */
82
- all$() {
83
- return this.values$;
84
- }
85
- /**
86
- * Get the first value that respects a criteria
87
- * @returns A value
88
- */
89
- firstBy(clause) {
90
- return this.values$.value.find(clause);
91
- }
92
- /**
93
- * Observe the first value that respects a criteria
94
- * @returns Observable of a value
95
- */
96
- firstBy$(clause) {
97
- return this.values$.pipe(map((values) => values.find(clause)));
98
- }
99
- /**
100
- * Get all the values that respect a criteria
101
- * @returns Array of values
102
- */
103
- manyBy(clause) {
104
- return this.values$.value.filter(clause);
105
- }
106
- /**
107
- * Observe all the values that respect a criteria
108
- * @returns Observable of values
109
- */
110
- manyBy$(clause) {
111
- return this.values$.pipe(map((values) => values.filter(clause)));
112
- }
113
- /**
114
- * Clear the filter and sort and unsubscribe from the source
115
- */
116
- clear() {
117
- this.filter(undefined);
118
- this.sort(undefined);
119
- }
120
- destroy() {
121
- if (this.values$$ !== undefined) {
122
- this.values$$.unsubscribe();
123
- }
124
- this.clear();
125
- }
126
- /**
127
- * Create an index
128
- * @param getKey Method to get a value's id
129
- * @returns The view
130
- */
131
- createIndex(getKey) {
132
- this._index = new Map();
133
- this.getKey$.next(getKey);
134
- return this;
135
- }
136
- /**
137
- * Join another source to the stream (chainable)
138
- * @param clause Join clause
139
- * @returns The view
140
- */
141
- join(clause) {
142
- if (this.lifted === true) {
143
- throw new Error('This view has already been lifted, therefore, no join is allowed.');
144
- }
145
- this.joins.push(clause);
146
- return this;
147
- }
148
- /**
149
- * Filter values (chainable)
150
- * @param clause Filter clause
151
- * @returns The view
152
- */
153
- filter(clause) {
154
- this.filter$.next(clause);
155
- return this;
156
- }
157
- /**
158
- * @param clause Filter clause
159
- * @returns The filter id
160
- */
161
- addFilter(clause) {
162
- const id = uuid();
163
- this.filterIndex.set(id, clause);
164
- this.filters$.next(Array.from(this.filterIndex.values()));
165
- return id;
166
- }
167
- /**
168
- * Remove a filter by id
169
- * @param clause Filter clause
170
- */
171
- removeFilter(id) {
172
- this.filterIndex.delete(id);
173
- this.filters$.next(Array.from(this.filterIndex.values()));
174
- }
175
- /**
176
- * Sort values (chainable)
177
- * @param clauseSort clause
178
- * @returns The view
179
- */
180
- sort(clause) {
181
- this.sort$.next(clause);
182
- return this;
183
- }
184
- /**
185
- * Create the final observable
186
- * @returns Observable
187
- */
188
- lift() {
189
- this.lifted = true;
190
- const source$ = this.joins.length > 0 ? this.liftJoinedSource() : this.liftSource();
191
- const observables$ = [
192
- source$,
193
- this.filters$,
194
- this.filter$,
195
- this.sort$,
196
- this.getKey$
197
- ];
198
- this.values$$ = combineLatest(observables$)
199
- .pipe(skip(1), debounceTime(5))
200
- .subscribe((bunch) => {
201
- const [_values, filters, filter, sort, getKey] = bunch;
202
- const values = this.processValues(_values, filters, filter, sort);
203
- const generateIndex = getKey !== undefined;
204
- this.setValues(values, generateIndex);
205
- });
206
- }
207
- /**
208
- * Create the source observable when no joins are defined
209
- * @returns Observable
210
- */
211
- liftSource() {
212
- return this.source$;
213
- }
214
- /**
215
- * Create the source observable when joins are defined
216
- * @returns Observable
217
- */
218
- liftJoinedSource() {
219
- const sources$ = [this.source$, combineLatest(this.joins.map((join) => join.source))];
220
- return combineLatest(sources$)
221
- .pipe(map((bunch) => {
222
- const [entities, joinData] = bunch;
223
- return entities.reduce((values, entity) => {
224
- const value = this.computeJoinedValue(entity, joinData);
225
- if (value !== undefined) {
226
- values.push(value);
227
- }
228
- return values;
229
- }, []);
230
- }));
231
- }
232
- /**
233
- * Apply joins to a source's entity and return the final value
234
- * @returns Final value
235
- */
236
- computeJoinedValue(entity, joinData) {
237
- let value = entity;
238
- let joinIndex = 0;
239
- while (value !== undefined && joinIndex < this.joins.length) {
240
- value = this.joins[joinIndex].reduce(value, joinData[joinIndex]);
241
- joinIndex += 1;
242
- }
243
- return value;
244
- }
245
- /**
246
- * Filter and sort values before streaming them
247
- * @param values Values
248
- * @param filters Filter clauses
249
- * @param filter Filter clause
250
- * @param sort Sort clause
251
- * @returns Filtered and sorted values
252
- */
253
- processValues(values, filters, filter, sort) {
254
- values = values.slice(0);
255
- values = this.filterValues(values, filters.concat([filter]));
256
- values = this.sortValues(values, sort);
257
- return values;
258
- }
259
- /**
260
- * Filter values
261
- * @param values Values
262
- * @param filters Filter clauses
263
- * @returns Filtered values
264
- */
265
- filterValues(values, clauses) {
266
- if (clauses.length === 0) {
267
- return values;
268
- }
269
- return values
270
- .filter((value) => {
271
- return clauses
272
- .filter((clause) => clause !== undefined)
273
- .every((clause) => clause(value));
274
- });
275
- }
276
- /**
277
- * Sort values
278
- * @param values Values
279
- * @param sort Sort clause
280
- * @returns Sorted values
281
- */
282
- sortValues(values, clause) {
283
- if (clause === undefined) {
284
- return values;
285
- }
286
- return values.sort((v1, v2) => {
287
- return ObjectUtils.naturalCompare(clause.valueAccessor(v1), clause.valueAccessor(v2), clause.direction, clause.nullsFirst);
288
- });
289
- }
290
- /**
291
- * Set value and optionally generate an index
292
- * @param values Values
293
- * @param generateIndex boolean
294
- */
295
- setValues(values, generateIndex) {
296
- if (generateIndex === true) {
297
- this._index = this.generateIndex(values);
298
- }
299
- this.values$.next(values);
300
- const count = values.length;
301
- const empty = count === 0;
302
- this.count$.next(count);
303
- this.empty$.next(empty);
304
- }
305
- /**
306
- * Generate a complete index of all the values
307
- * @param entities Entities
308
- * @returns Index
309
- */
310
- generateIndex(values) {
311
- const entries = values.map((value) => [this.getKey(value), value]);
312
- return new Map(entries);
313
- }
314
- }
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvbGliL2VudGl0eS9zaGFyZWQvdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUE0QixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFRaEQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBa0VyQixZQUFvQixPQUE2QjtRQUE3QixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQWhFakQ7O1dBRUc7UUFDTSxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7UUFPaEQ7O1dBRUc7UUFDSyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXZCOztXQUVHO1FBQ0ssVUFBSyxHQUF1QixFQUFFLENBQUM7UUFFdkM7O1dBRUc7UUFDSyxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQ7O1dBRUc7UUFDSyxhQUFRLEdBQTBDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxGOztXQUVHO1FBQ0ssZ0JBQVcsR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVqRTs7V0FFRztRQUNLLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQU12QyxZQUFPLEdBQXNDLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBGOztXQUVHO1FBQ00sV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBR2pEOztXQUVHO1FBQ00sV0FBTSxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FB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SSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxNQUFXO1FBQy9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBMkIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgT2JqZWN0VXRpbHMsIHV1aWQgfSBmcm9tICdAaWdvMi91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgRW50aXR5S2V5LFxyXG4gIEVudGl0eUZpbHRlckNsYXVzZSxcclxuICBFbnRpdHlTb3J0Q2xhdXNlLFxyXG4gIEVudGl0eUpvaW5DbGF1c2VcclxufSBmcm9tICcuL2VudGl0eS5pbnRlcmZhY2VzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBlbnRpdHkgdmlldyBzdHJlYW1zIGVudGl0aWVzIGZyb20gYW4gb2JzZXJ2YWJsZSBzb3VyY2UuIFRoZXNlIGVudGl0aWVzXHJcbiAqIGNhbiBiZSBmaWx0ZXJlZCBvciBzb3J0ZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIHNvdXJjZS4gQSB2aWV3IGNhbiBhbHNvXHJcbiAqIGNvbWJpbmUgZGF0YSBmcm9tIG11bHRpcGxlIHNvdXJjZXMsIGpvaW5lZCB0b2dldGhlci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlWaWV3PEUgZXh0ZW5kcyBvYmplY3QsIFYgZXh0ZW5kcyBvYmplY3QgPSBFPiB7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgc3RyZWFtIG9mIHZhbHVlc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZbXT4oW10pO1xyXG5cclxuICAvKipcclxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIHNvdXJjZSAoYW5kIGpvaW5lZCBzb3VyY2VzKSB2YWx1ZXNcclxuICAgKi9cclxuICBwcml2YXRlIHZhbHVlcyQkOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhpcyB2aWV3IGhhcyBiZWVuIGxpZnRlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbGlmdGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEpvaW4gY2xhdXNlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgam9pbnM6IEVudGl0eUpvaW5DbGF1c2VbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIG9mIGEgZmlsdGVyIGNsYXVzZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBvZiBmaWx0ZXIgY2xhdXNlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVycyQ6IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlGaWx0ZXJDbGF1c2VbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVycyBpbmRleFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVySW5kZXg6IE1hcDxzdHJpbmcsIEVudGl0eUZpbHRlckNsYXVzZT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgb2YgYSBzb3J0IGNsYXVzZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZCBmb3IgaW5kZXhpbmdcclxuICAgKi9cclxuICBnZXQgZ2V0S2V5KCk6IChWKSA9PiBFbnRpdHlLZXkgeyByZXR1cm4gdGhpcy5nZXRLZXkkLnZhbHVlOyB9XHJcbiAgcHJpdmF0ZSBnZXRLZXkkOiBCZWhhdmlvclN1YmplY3Q8KFYpID0+IEVudGl0eUtleT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE51bWJlciBvZiBlbnRpdGllc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICBnZXQgY291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY291bnQkLnZhbHVlOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5XHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZW1wdHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmVtcHR5JC52YWx1ZTsgfVxyXG5cclxuICAvKipcclxuICAgKiBTdG9yZSBpbmRleFxyXG4gICAqL1xyXG4gIGdldCBpbmRleCgpOiBNYXA8RW50aXR5S2V5LCBWPiB7IHJldHVybiB0aGlzLl9pbmRleDsgfVxyXG4gIHByaXZhdGUgX2luZGV4OiBNYXA8RW50aXR5S2V5LCBWPjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzb3VyY2UkOiBCZWhhdmlvclN1YmplY3Q8RVtdPikge31cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgdmFsdWUgZnJvbSB0aGUgdmlldyBieSBrZXlcclxuICAgKiBAcGFyYW0ga2V5IEtleVxyXG4gICAqIEByZXR1cm5zIFZhbHVlXHJcbiAgICovXHJcbiAgZ2V0KGtleTogRW50aXR5S2V5KTogViB7XHJcbiAgICBpZiAodGhpcy5faW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBoYXMgbm8gaW5kZXgsIHRoZXJlZm9yZSwgdGhpcyBtZXRob2QgaXMgdW5hdmFpbGFibGUuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pbmRleC5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgdGhlIHZhbHVlc1xyXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHZhbHVlc1xyXG4gICAqL1xyXG4gIGFsbCgpOiBWW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmUgYWxsIHRoZSB2YWx1ZXNcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHZhbHVlc1xyXG4gICAqL1xyXG4gIGFsbCQoKTogQmVoYXZpb3JTdWJqZWN0PFZbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzJDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZmlyc3QgdmFsdWUgdGhhdCByZXNwZWN0cyBhIGNyaXRlcmlhXHJcbiAgICogQHJldHVybnMgQSB2YWx1ZVxyXG4gICAqL1xyXG4gIGZpcnN0QnkoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBWIHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlcyQudmFsdWUuZmluZChjbGF1c2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2ZSB0aGUgZmlyc3QgdmFsdWUgdGhhdCByZXNwZWN0cyBhIGNyaXRlcmlhXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBhIHZhbHVlXHJcbiAgICovXHJcbiAgZmlyc3RCeSQoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBPYnNlcnZhYmxlPFY+IHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlcyQucGlwZShtYXAoKHZhbHVlczogVltdKSA9PiB2YWx1ZXMuZmluZChjbGF1c2UpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIHRoZSB2YWx1ZXMgdGhhdCByZXNwZWN0IGEgY3JpdGVyaWFcclxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWx1ZXNcclxuICAgKi9cclxuICBtYW55QnkoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBWW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzJC52YWx1ZS5maWx0ZXIoY2xhdXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmUgYWxsIHRoZSB2YWx1ZXMgdGhhdCByZXNwZWN0IGEgY3JpdGVyaWFcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHZhbHVlc1xyXG4gICAqL1xyXG4gIG1hbnlCeSQoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBPYnNlcnZhYmxlPFZbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzJC5waXBlKG1hcCgodmFsdWVzOiBWW10pID0+IHZhbHVlcy5maWx0ZXIoY2xhdXNlKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGZpbHRlciBhbmQgc29ydCBhbmQgdW5zdWJzY3JpYmUgZnJvbSB0aGUgc291cmNlXHJcbiAgICovXHJcbiAgY2xlYXIoKSB7XHJcbiAgICB0aGlzLmZpbHRlcih1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5zb3J0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMudmFsdWVzJCQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnZhbHVlcyQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW5kZXhcclxuICAgKiBAcGFyYW0gZ2V0S2V5IE1ldGhvZCB0byBnZXQgYSB2YWx1ZSdzIGlkXHJcbiAgICogQHJldHVybnMgVGhlIHZpZXdcclxuICAgKi9cclxuICBjcmVhdGVJbmRleChnZXRLZXk6IChFKSA9PiBFbnRpdHlLZXkpOiBFbnRpdHlWaWV3PEUsIFY+IHtcclxuICAgIHRoaXMuX2luZGV4ID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy5nZXRLZXkkLm5leHQoZ2V0S2V5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSm9pbiBhbm90aGVyIHNvdXJjZSB0byB0aGUgc3RyZWFtIChjaGFpbmFibGUpXHJcbiAgICogQHBhcmFtIGNsYXVzZSBKb2luIGNsYXVzZVxyXG4gICAqIEByZXR1cm5zIFRoZSB2aWV3XHJcbiAgICovXHJcbiAgam9pbihjbGF1c2U6IEVudGl0eUpvaW5DbGF1c2UpOiBFbnRpdHlWaWV3PEUsIFY+IHtcclxuICAgIGlmICh0aGlzLmxpZnRlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBoYXMgYWxyZWFkeSBiZWVuIGxpZnRlZCwgdGhlcmVmb3JlLCBubyBqb2luIGlzIGFsbG93ZWQuJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmpvaW5zLnB1c2goY2xhdXNlKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIHZhbHVlcyAoY2hhaW5hYmxlKVxyXG4gICAqIEBwYXJhbSBjbGF1c2UgRmlsdGVyIGNsYXVzZVxyXG4gICAqIEByZXR1cm5zIFRoZSB2aWV3XHJcbiAgICovXHJcbiAgZmlsdGVyKGNsYXVzZTogRW50aXR5RmlsdGVyQ2xhdXNlPFY+KTogRW50aXR5VmlldzxFLCBWPiB7XHJcbiAgICB0aGlzLmZpbHRlciQubmV4dChjbGF1c2UpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gY2xhdXNlIEZpbHRlciBjbGF1c2VcclxuICAgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGlkXHJcbiAgICovXHJcbiAgYWRkRmlsdGVyKGNsYXVzZTogRW50aXR5RmlsdGVyQ2xhdXNlPFY+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGlkID0gdXVpZCgpO1xyXG4gICAgdGhpcy5maWx0ZXJJbmRleC5zZXQoaWQsIGNsYXVzZSk7XHJcbiAgICB0aGlzLmZpbHRlcnMkLm5leHQoQXJyYXkuZnJvbSh0aGlzLmZpbHRlckluZGV4LnZhbHVlcygpKSk7XHJcbiAgICByZXR1cm4gaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYSBmaWx0ZXIgYnkgaWRcclxuICAgKiBAcGFyYW0gY2xhdXNlIEZpbHRlciBjbGF1c2VcclxuICAgKi9cclxuICByZW1vdmVGaWx0ZXIoaWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJJbmRleC5kZWxldGUoaWQpO1xyXG4gICAgdGhpcy5maWx0ZXJzJC5uZXh0KEFycmF5LmZyb20odGhpcy5maWx0ZXJJbmRleC52YWx1ZXMoKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCB2YWx1ZXMgKGNoYWluYWJsZSlcclxuICAgKiBAcGFyYW0gY2xhdXNlU29ydCBjbGF1c2VcclxuICAgKiBAcmV0dXJucyBUaGUgdmlld1xyXG4gICAqL1xyXG4gIHNvcnQoY2xhdXNlOiBFbnRpdHlTb3J0Q2xhdXNlPFY+KTogRW50aXR5VmlldzxFLCBWPiB7XHJcbiAgICB0aGlzLnNvcnQkLm5leHQoY2xhdXNlKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRoZSBmaW5hbCBvYnNlcnZhYmxlXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIGxpZnQoKSB7XHJcbiAgICB0aGlzLmxpZnRlZCA9IHRydWU7XHJcbiAgICBjb25zdCBzb3VyY2UkID0gdGhpcy5qb2lucy5sZW5ndGggPiAwID8gdGhpcy5saWZ0Sm9pbmVkU291cmNlKCkgOiB0aGlzLmxpZnRTb3VyY2UoKTtcclxuICAgIGNvbnN0IG9ic2VydmFibGVzJCA9IFtcclxuICAgICAgc291cmNlJCxcclxuICAgICAgdGhpcy5maWx0ZXJzJCxcclxuICAgICAgdGhpcy5maWx0ZXIkLFxyXG4gICAgICB0aGlzLnNvcnQkLFxyXG4gICAgICB0aGlzLmdldEtleSRcclxuICAgIF07XHJcblxyXG4gICAgdGhpcy52YWx1ZXMkJCA9IGNvbWJpbmVMYXRlc3Qob2JzZXJ2YWJsZXMkKVxyXG4gICAgICAucGlwZShza2lwKDEpLCBkZWJvdW5jZVRpbWUoNSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGJ1bmNoOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFtfdmFsdWVzLCBmaWx0ZXJzLCBmaWx0ZXIsIHNvcnQsIGdldEtleV0gPSBidW5jaDtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnByb2Nlc3NWYWx1ZXMoX3ZhbHVlcywgZmlsdGVycywgZmlsdGVyLCBzb3J0KTtcclxuICAgICAgICBjb25zdCBnZW5lcmF0ZUluZGV4ID0gZ2V0S2V5ICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZXModmFsdWVzLCBnZW5lcmF0ZUluZGV4KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHdoZW4gbm8gam9pbnMgYXJlIGRlZmluZWRcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsaWZ0U291cmNlKCk6IE9ic2VydmFibGU8VltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zb3VyY2UkIGFzIGFueSBhcyBPYnNlcnZhYmxlPFZbXT47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHdoZW4gam9pbnMgYXJlIGRlZmluZWRcclxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsaWZ0Sm9pbmVkU291cmNlKCk6IE9ic2VydmFibGU8VltdPiB7XHJcbiAgICBjb25zdCBzb3VyY2VzJCA9IFt0aGlzLnNvdXJjZSQsIGNvbWJpbmVMYXRlc3QoXHJcbiAgICAgIHRoaXMuam9pbnMubWFwKChqb2luOiBFbnRpdHlKb2luQ2xhdXNlKSA9PiBqb2luLnNvdXJjZSlcclxuICAgICldO1xyXG5cclxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHNvdXJjZXMkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKGJ1bmNoOiBbRVtdLCBhbnlbXV0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IFtlbnRpdGllcywgam9pbkRhdGFdID0gYnVuY2g7XHJcbiAgICAgICAgICByZXR1cm4gZW50aXRpZXMucmVkdWNlKCh2YWx1ZXM6IFZbXSwgZW50aXR5OiBFKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb21wdXRlSm9pbmVkVmFsdWUoZW50aXR5LCBqb2luRGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgICAgICAgICB9LCBbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGpvaW5zIHRvIGEgc291cmNlJ3MgZW50aXR5IGFuZCByZXR1cm4gdGhlIGZpbmFsIHZhbHVlXHJcbiAgICogQHJldHVybnMgRmluYWwgdmFsdWVcclxuICAgKi9cclxuICBwcml2YXRlIGNvbXB1dGVKb2luZWRWYWx1ZShlbnRpdHk6IEUsIGpvaW5EYXRhOiBhbnlbXSk6IFYgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IHZhbHVlID0gZW50aXR5IGFzIFBhcnRpYWw8Vj47XHJcbiAgICBsZXQgam9pbkluZGV4ID0gMDtcclxuICAgIHdoaWxlICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGpvaW5JbmRleCA8IHRoaXMuam9pbnMubGVuZ3RoKSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5qb2luc1tqb2luSW5kZXhdLnJlZHVjZSh2YWx1ZSwgam9pbkRhdGFbam9pbkluZGV4XSk7XHJcbiAgICAgIGpvaW5JbmRleCArPSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlIGFzIFY7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgYW5kIHNvcnQgdmFsdWVzIGJlZm9yZSBzdHJlYW1pbmcgdGhlbVxyXG4gICAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzXHJcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVyIGNsYXVzZXNcclxuICAgKiBAcGFyYW0gZmlsdGVyIEZpbHRlciBjbGF1c2VcclxuICAgKiBAcGFyYW0gc29ydCBTb3J0IGNsYXVzZVxyXG4gICAqIEByZXR1cm5zIEZpbHRlcmVkIGFuZCBzb3J0ZWQgdmFsdWVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzVmFsdWVzKFxyXG4gICAgdmFsdWVzOiBWW10sIGZpbHRlcnM6IEVudGl0eUZpbHRlckNsYXVzZVtdLCBmaWx0ZXI6IEVudGl0eUZpbHRlckNsYXVzZSwgc29ydDogRW50aXR5U29ydENsYXVzZVxyXG4gICk6IFZbXSB7XHJcbiAgICB2YWx1ZXMgPSB2YWx1ZXMuc2xpY2UoMCk7XHJcbiAgICB2YWx1ZXMgPSB0aGlzLmZpbHRlclZhbHVlcyh2YWx1ZXMsIGZpbHRlcnMuY29uY2F0KFtmaWx0ZXJdKSk7XHJcbiAgICB2YWx1ZXMgPSB0aGlzLnNvcnRWYWx1ZXModmFsdWVzLCBzb3J0KTtcclxuICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgdmFsdWVzXHJcbiAgICogQHBhcmFtIHZhbHVlcyBWYWx1ZXNcclxuICAgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXIgY2xhdXNlc1xyXG4gICAqIEByZXR1cm5zIEZpbHRlcmVkIHZhbHVlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyVmFsdWVzKHZhbHVlczogVltdLCBjbGF1c2VzOiBFbnRpdHlGaWx0ZXJDbGF1c2VbXSk6IFZbXSB7XHJcbiAgICBpZiAoY2xhdXNlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHZhbHVlczsgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZXNcclxuICAgICAgLmZpbHRlcigodmFsdWU6IFYpID0+IHtcclxuICAgICAgICByZXR1cm4gY2xhdXNlc1xyXG4gICAgICAgICAgLmZpbHRlcigoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2UpID0+IGNsYXVzZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgLmV2ZXJ5KChjbGF1c2U6IEVudGl0eUZpbHRlckNsYXVzZSkgPT4gY2xhdXNlKHZhbHVlKSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCB2YWx1ZXNcclxuICAgKiBAcGFyYW0gdmFsdWVzIFZhbHVlc1xyXG4gICAqIEBwYXJhbSBzb3J0IFNvcnQgY2xhdXNlXHJcbiAgICogQHJldHVybnMgU29ydGVkIHZhbHVlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFZhbHVlcyh2YWx1ZXM6IFZbXSwgY2xhdXNlOiBFbnRpdHlTb3J0Q2xhdXNlKTogVltdIHtcclxuICAgIGlmIChjbGF1c2UgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdmFsdWVzOyB9XHJcbiAgICByZXR1cm4gdmFsdWVzLnNvcnQoKHYxOiBWLCB2MjogVikgPT4ge1xyXG4gICAgICByZXR1cm4gT2JqZWN0VXRpbHMubmF0dXJhbENvbXBhcmUoXHJcbiAgICAgICAgY2xhdXNlLnZhbHVlQWNjZXNzb3IodjEpLFxyXG4gICAgICAgIGNsYXVzZS52YWx1ZUFjY2Vzc29yKHYyKSxcclxuICAgICAgICBjbGF1c2UuZGlyZWN0aW9uLFxyXG4gICAgICAgIGNsYXVzZS5udWxsc0ZpcnN0XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB2YWx1ZSBhbmQgb3B0aW9uYWxseSBnZW5lcmF0ZSBhbiBpbmRleFxyXG4gICAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzXHJcbiAgICogQHBhcmFtIGdlbmVyYXRlSW5kZXggYm9vbGVhblxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0VmFsdWVzKHZhbHVlczogVltdLCBnZW5lcmF0ZUluZGV4OiBib29sZWFuKSB7XHJcbiAgICBpZiAoZ2VuZXJhdGVJbmRleCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLl9pbmRleCA9IHRoaXMuZ2VuZXJhdGVJbmRleCh2YWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmFsdWVzJC5uZXh0KHZhbHVlcyk7XHJcblxyXG4gICAgY29uc3QgY291bnQgPSB2YWx1ZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgZW1wdHkgPSBjb3VudCA9PT0gMDtcclxuICAgIHRoaXMuY291bnQkLm5leHQoY291bnQpO1xyXG4gICAgdGhpcy5lbXB0eSQubmV4dChlbXB0eSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIGNvbXBsZXRlIGluZGV4IG9mIGFsbCB0aGUgdmFsdWVzXHJcbiAgICogQHBhcmFtIGVudGl0aWVzIEVudGl0aWVzXHJcbiAgICogQHJldHVybnMgSW5kZXhcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlSW5kZXgodmFsdWVzOiBWW10pOiBNYXA8RW50aXR5S2V5LCBWPiB7XHJcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWVzLm1hcCgodmFsdWU6IFYpID0+IFt0aGlzLmdldEtleSh2YWx1ZSksIHZhbHVlXSk7XHJcbiAgICByZXR1cm4gbmV3IE1hcChlbnRyaWVzIGFzIFtFbnRpdHlLZXksIFZdW10pO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { BehaviorSubject, combineLatest } from 'rxjs';
2
+ import { debounceTime, map, skip } from 'rxjs/operators';
3
+ import { ObjectUtils, uuid } from '@igo2/utils';
4
+ /**
5
+ * An entity view streams entities from an observable source. These entities
6
+ * can be filtered or sorted without affecting the source. A view can also
7
+ * combine data from multiple sources, joined together.
8
+ */
9
+ export class EntityView {
10
+ constructor(source$) {
11
+ this.source$ = source$;
12
+ /**
13
+ * Observable stream of values
14
+ */
15
+ this.values$ = new BehaviorSubject([]);
16
+ /**
17
+ * Whether this view has been lifted
18
+ */
19
+ this.lifted = false;
20
+ /**
21
+ * Join clauses
22
+ */
23
+ this.joins = [];
24
+ /**
25
+ * Observable of a filter clause
26
+ */
27
+ this.filter$ = new BehaviorSubject(undefined);
28
+ /**
29
+ * Observable of filter clauses
30
+ */
31
+ this.filters$ = new BehaviorSubject([]);
32
+ /**
33
+ * Filters index
34
+ */
35
+ this.filterIndex = new Map();
36
+ /**
37
+ * Observable of a sort clause
38
+ */
39
+ this.sort$ = new BehaviorSubject(undefined);
40
+ this.getKey$ = new BehaviorSubject(undefined);
41
+ /**
42
+ * Number of entities
43
+ */
44
+ this.count$ = new BehaviorSubject(0);
45
+ /**
46
+ * Whether the store is empty
47
+ */
48
+ this.empty$ = new BehaviorSubject(true);
49
+ }
50
+ /**
51
+ * Method for indexing
52
+ */
53
+ get getKey() { return this.getKey$.value; }
54
+ get count() { return this.count$.value; }
55
+ get empty() { return this.empty$.value; }
56
+ /**
57
+ * Store index
58
+ */
59
+ get index() { return this._index; }
60
+ /**
61
+ * Get a value from the view by key
62
+ * @param key Key
63
+ * @returns Value
64
+ */
65
+ get(key) {
66
+ if (this._index === undefined) {
67
+ throw new Error('This view has no index, therefore, this method is unavailable.');
68
+ }
69
+ return this.index.get(key);
70
+ }
71
+ /**
72
+ * Get all the values
73
+ * @returns Array of values
74
+ */
75
+ all() {
76
+ return this.values$.value;
77
+ }
78
+ /**
79
+ * Observe all the values
80
+ * @returns Observable of values
81
+ */
82
+ all$() {
83
+ return this.values$;
84
+ }
85
+ /**
86
+ * Get the first value that respects a criteria
87
+ * @returns A value
88
+ */
89
+ firstBy(clause) {
90
+ return this.values$.value.find(clause);
91
+ }
92
+ /**
93
+ * Observe the first value that respects a criteria
94
+ * @returns Observable of a value
95
+ */
96
+ firstBy$(clause) {
97
+ return this.values$.pipe(map((values) => values.find(clause)));
98
+ }
99
+ /**
100
+ * Get all the values that respect a criteria
101
+ * @returns Array of values
102
+ */
103
+ manyBy(clause) {
104
+ return this.values$.value.filter(clause);
105
+ }
106
+ /**
107
+ * Observe all the values that respect a criteria
108
+ * @returns Observable of values
109
+ */
110
+ manyBy$(clause) {
111
+ return this.values$.pipe(map((values) => values.filter(clause)));
112
+ }
113
+ /**
114
+ * Clear the filter and sort and unsubscribe from the source
115
+ */
116
+ clear() {
117
+ this.filter(undefined);
118
+ this.sort(undefined);
119
+ }
120
+ destroy() {
121
+ if (this.values$$ !== undefined) {
122
+ this.values$$.unsubscribe();
123
+ }
124
+ this.clear();
125
+ }
126
+ /**
127
+ * Create an index
128
+ * @param getKey Method to get a value's id
129
+ * @returns The view
130
+ */
131
+ createIndex(getKey) {
132
+ this._index = new Map();
133
+ this.getKey$.next(getKey);
134
+ return this;
135
+ }
136
+ /**
137
+ * Join another source to the stream (chainable)
138
+ * @param clause Join clause
139
+ * @returns The view
140
+ */
141
+ join(clause) {
142
+ if (this.lifted === true) {
143
+ throw new Error('This view has already been lifted, therefore, no join is allowed.');
144
+ }
145
+ this.joins.push(clause);
146
+ return this;
147
+ }
148
+ /**
149
+ * Filter values (chainable)
150
+ * @param clause Filter clause
151
+ * @returns The view
152
+ */
153
+ filter(clause) {
154
+ this.filter$.next(clause);
155
+ return this;
156
+ }
157
+ /**
158
+ * @param clause Filter clause
159
+ * @returns The filter id
160
+ */
161
+ addFilter(clause) {
162
+ const id = uuid();
163
+ this.filterIndex.set(id, clause);
164
+ this.filters$.next(Array.from(this.filterIndex.values()));
165
+ return id;
166
+ }
167
+ /**
168
+ * Remove a filter by id
169
+ * @param clause Filter clause
170
+ */
171
+ removeFilter(id) {
172
+ this.filterIndex.delete(id);
173
+ this.filters$.next(Array.from(this.filterIndex.values()));
174
+ }
175
+ /**
176
+ * Sort values (chainable)
177
+ * @param clauseSort clause
178
+ * @returns The view
179
+ */
180
+ sort(clause) {
181
+ this.sort$.next(clause);
182
+ return this;
183
+ }
184
+ /**
185
+ * Create the final observable
186
+ * @returns Observable
187
+ */
188
+ lift() {
189
+ this.lifted = true;
190
+ const source$ = this.joins.length > 0 ? this.liftJoinedSource() : this.liftSource();
191
+ const observables$ = [
192
+ source$,
193
+ this.filters$,
194
+ this.filter$,
195
+ this.sort$,
196
+ this.getKey$
197
+ ];
198
+ this.values$$ = combineLatest(observables$)
199
+ .pipe(skip(1), debounceTime(5))
200
+ .subscribe((bunch) => {
201
+ const [_values, filters, filter, sort, getKey] = bunch;
202
+ const values = this.processValues(_values, filters, filter, sort);
203
+ const generateIndex = getKey !== undefined;
204
+ this.setValues(values, generateIndex);
205
+ });
206
+ }
207
+ /**
208
+ * Create the source observable when no joins are defined
209
+ * @returns Observable
210
+ */
211
+ liftSource() {
212
+ return this.source$;
213
+ }
214
+ /**
215
+ * Create the source observable when joins are defined
216
+ * @returns Observable
217
+ */
218
+ liftJoinedSource() {
219
+ const sources$ = [this.source$, combineLatest(this.joins.map((join) => join.source))];
220
+ return combineLatest(sources$)
221
+ .pipe(map((bunch) => {
222
+ const [entities, joinData] = bunch;
223
+ return entities.reduce((values, entity) => {
224
+ const value = this.computeJoinedValue(entity, joinData);
225
+ if (value !== undefined) {
226
+ values.push(value);
227
+ }
228
+ return values;
229
+ }, []);
230
+ }));
231
+ }
232
+ /**
233
+ * Apply joins to a source's entity and return the final value
234
+ * @returns Final value
235
+ */
236
+ computeJoinedValue(entity, joinData) {
237
+ let value = entity;
238
+ let joinIndex = 0;
239
+ while (value !== undefined && joinIndex < this.joins.length) {
240
+ value = this.joins[joinIndex].reduce(value, joinData[joinIndex]);
241
+ joinIndex += 1;
242
+ }
243
+ return value;
244
+ }
245
+ /**
246
+ * Filter and sort values before streaming them
247
+ * @param values Values
248
+ * @param filters Filter clauses
249
+ * @param filter Filter clause
250
+ * @param sort Sort clause
251
+ * @returns Filtered and sorted values
252
+ */
253
+ processValues(values, filters, filter, sort) {
254
+ values = values.slice(0);
255
+ values = this.filterValues(values, filters.concat([filter]));
256
+ values = this.sortValues(values, sort);
257
+ return values;
258
+ }
259
+ /**
260
+ * Filter values
261
+ * @param values Values
262
+ * @param filters Filter clauses
263
+ * @returns Filtered values
264
+ */
265
+ filterValues(values, clauses) {
266
+ if (clauses.length === 0) {
267
+ return values;
268
+ }
269
+ return values
270
+ .filter((value) => {
271
+ return clauses
272
+ .filter((clause) => clause !== undefined)
273
+ .every((clause) => clause(value));
274
+ });
275
+ }
276
+ /**
277
+ * Sort values
278
+ * @param values Values
279
+ * @param sort Sort clause
280
+ * @returns Sorted values
281
+ */
282
+ sortValues(values, clause) {
283
+ if (clause === undefined) {
284
+ return values;
285
+ }
286
+ return values.sort((v1, v2) => {
287
+ return ObjectUtils.naturalCompare(clause.valueAccessor(v1), clause.valueAccessor(v2), clause.direction, clause.nullsFirst);
288
+ });
289
+ }
290
+ /**
291
+ * Set value and optionally generate an index
292
+ * @param values Values
293
+ * @param generateIndex boolean
294
+ */
295
+ setValues(values, generateIndex) {
296
+ if (generateIndex === true) {
297
+ this._index = this.generateIndex(values);
298
+ }
299
+ this.values$.next(values);
300
+ const count = values.length;
301
+ const empty = count === 0;
302
+ this.count$.next(count);
303
+ this.empty$.next(empty);
304
+ }
305
+ /**
306
+ * Generate a complete index of all the values
307
+ * @param entities Entities
308
+ * @returns Index
309
+ */
310
+ generateIndex(values) {
311
+ const entries = values.map((value) => [this.getKey(value), value]);
312
+ return new Map(entries);
313
+ }
314
+ }
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvbGliL2VudGl0eS9zaGFyZWQvdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUE0QixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFRaEQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBa0VyQixZQUFvQixPQUE2QjtRQUE3QixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQWhFakQ7O1dBRUc7UUFDTSxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7UUFPaEQ7O1dBRUc7UUFDSyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXZCOztXQUVHO1FBQ0ssVUFBSyxHQUF1QixFQUFFLENBQUM7UUFFdkM7O1dBRUc7UUFDSyxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQ7O1dBRUc7UUFDSyxhQUFRLEdBQTBDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxGOztXQUVHO1FBQ0ssZ0JBQVcsR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVqRTs7V0FFRztRQUNLLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQU12QyxZQUFPLEdBQXNDLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBGOztXQUVHO1FBQ00sV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBR2pEOztXQUVHO1FBQ00sV0FBTSxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FB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SSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxNQUFXO1FBQy9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBMkIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgT2JqZWN0VXRpbHMsIHV1aWQgfSBmcm9tICdAaWdvMi91dGlscyc7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIEVudGl0eUZpbHRlckNsYXVzZSxcbiAgRW50aXR5U29ydENsYXVzZSxcbiAgRW50aXR5Sm9pbkNsYXVzZVxufSBmcm9tICcuL2VudGl0eS5pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBBbiBlbnRpdHkgdmlldyBzdHJlYW1zIGVudGl0aWVzIGZyb20gYW4gb2JzZXJ2YWJsZSBzb3VyY2UuIFRoZXNlIGVudGl0aWVzXG4gKiBjYW4gYmUgZmlsdGVyZWQgb3Igc29ydGVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBzb3VyY2UuIEEgdmlldyBjYW4gYWxzb1xuICogY29tYmluZSBkYXRhIGZyb20gbXVsdGlwbGUgc291cmNlcywgam9pbmVkIHRvZ2V0aGVyLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5VmlldzxFIGV4dGVuZHMgb2JqZWN0LCBWIGV4dGVuZHMgb2JqZWN0ID0gRT4ge1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHN0cmVhbSBvZiB2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZbXT4oW10pO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIHNvdXJjZSAoYW5kIGpvaW5lZCBzb3VyY2VzKSB2YWx1ZXNcbiAgICovXG4gIHByaXZhdGUgdmFsdWVzJCQ6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHZpZXcgaGFzIGJlZW4gbGlmdGVkXG4gICAqL1xuICBwcml2YXRlIGxpZnRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBKb2luIGNsYXVzZXNcbiAgICovXG4gIHByaXZhdGUgam9pbnM6IEVudGl0eUpvaW5DbGF1c2VbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIGEgZmlsdGVyIGNsYXVzZVxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIGZpbHRlciBjbGF1c2VzXG4gICAqL1xuICBwcml2YXRlIGZpbHRlcnMkOiBCZWhhdmlvclN1YmplY3Q8RW50aXR5RmlsdGVyQ2xhdXNlW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgaW5kZXhcbiAgICovXG4gIHByaXZhdGUgZmlsdGVySW5kZXg6IE1hcDxzdHJpbmcsIEVudGl0eUZpbHRlckNsYXVzZT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgYSBzb3J0IGNsYXVzZVxuICAgKi9cbiAgcHJpdmF0ZSBzb3J0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcblxuICAvKipcbiAgICogTWV0aG9kIGZvciBpbmRleGluZ1xuICAgKi9cbiAgZ2V0IGdldEtleSgpOiAoVikgPT4gRW50aXR5S2V5IHsgcmV0dXJuIHRoaXMuZ2V0S2V5JC52YWx1ZTsgfVxuICBwcml2YXRlIGdldEtleSQ6IEJlaGF2aW9yU3ViamVjdDwoVikgPT4gRW50aXR5S2V5PiA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBjb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIGdldCBjb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5jb3VudCQudmFsdWU7IH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RvcmUgaXMgZW1wdHlcbiAgICovXG4gIHJlYWRvbmx5IGVtcHR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZW1wdHkkLnZhbHVlOyB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIGluZGV4XG4gICAqL1xuICBnZXQgaW5kZXgoKTogTWFwPEVudGl0eUtleSwgVj4geyByZXR1cm4gdGhpcy5faW5kZXg7IH1cbiAgcHJpdmF0ZSBfaW5kZXg6IE1hcDxFbnRpdHlLZXksIFY+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc291cmNlJDogQmVoYXZpb3JTdWJqZWN0PEVbXT4pIHt9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGZyb20gdGhlIHZpZXcgYnkga2V5XG4gICAqIEBwYXJhbSBrZXkgS2V5XG4gICAqIEByZXR1cm5zIFZhbHVlXG4gICAqL1xuICBnZXQoa2V5OiBFbnRpdHlLZXkpOiBWIHtcbiAgICBpZiAodGhpcy5faW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHZpZXcgaGFzIG5vIGluZGV4LCB0aGVyZWZvcmUsIHRoaXMgbWV0aG9kIGlzIHVuYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbmRleC5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSB2YWx1ZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsdWVzXG4gICAqL1xuICBhbGwoKTogVltdIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMkLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgYWxsIHRoZSB2YWx1ZXNcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB2YWx1ZXNcbiAgICovXG4gIGFsbCQoKTogQmVoYXZpb3JTdWJqZWN0PFZbXT4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcyQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCB2YWx1ZSB0aGF0IHJlc3BlY3RzIGEgY3JpdGVyaWFcbiAgICogQHJldHVybnMgQSB2YWx1ZVxuICAgKi9cbiAgZmlyc3RCeShjbGF1c2U6IEVudGl0eUZpbHRlckNsYXVzZTxWPik6IFYge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcyQudmFsdWUuZmluZChjbGF1c2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgdGhlIGZpcnN0IHZhbHVlIHRoYXQgcmVzcGVjdHMgYSBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIGEgdmFsdWVcbiAgICovXG4gIGZpcnN0QnkkKGNsYXVzZTogRW50aXR5RmlsdGVyQ2xhdXNlPFY+KTogT2JzZXJ2YWJsZTxWPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzJC5waXBlKG1hcCgodmFsdWVzOiBWW10pID0+IHZhbHVlcy5maW5kKGNsYXVzZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSB2YWx1ZXMgdGhhdCByZXNwZWN0IGEgY3JpdGVyaWFcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsdWVzXG4gICAqL1xuICBtYW55QnkoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBWW10ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcyQudmFsdWUuZmlsdGVyKGNsYXVzZSk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBhbGwgdGhlIHZhbHVlcyB0aGF0IHJlc3BlY3QgYSBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHZhbHVlc1xuICAgKi9cbiAgbWFueUJ5JChjbGF1c2U6IEVudGl0eUZpbHRlckNsYXVzZTxWPik6IE9ic2VydmFibGU8VltdPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzJC5waXBlKG1hcCgodmFsdWVzOiBWW10pID0+IHZhbHVlcy5maWx0ZXIoY2xhdXNlKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBmaWx0ZXIgYW5kIHNvcnQgYW5kIHVuc3Vic2NyaWJlIGZyb20gdGhlIHNvdXJjZVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5maWx0ZXIodW5kZWZpbmVkKTtcbiAgICB0aGlzLnNvcnQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudmFsdWVzJCQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWx1ZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluZGV4XG4gICAqIEBwYXJhbSBnZXRLZXkgTWV0aG9kIHRvIGdldCBhIHZhbHVlJ3MgaWRcbiAgICogQHJldHVybnMgVGhlIHZpZXdcbiAgICovXG4gIGNyZWF0ZUluZGV4KGdldEtleTogKEUpID0+IEVudGl0eUtleSk6IEVudGl0eVZpZXc8RSwgVj4ge1xuICAgIHRoaXMuX2luZGV4ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZ2V0S2V5JC5uZXh0KGdldEtleSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSm9pbiBhbm90aGVyIHNvdXJjZSB0byB0aGUgc3RyZWFtIChjaGFpbmFibGUpXG4gICAqIEBwYXJhbSBjbGF1c2UgSm9pbiBjbGF1c2VcbiAgICogQHJldHVybnMgVGhlIHZpZXdcbiAgICovXG4gIGpvaW4oY2xhdXNlOiBFbnRpdHlKb2luQ2xhdXNlKTogRW50aXR5VmlldzxFLCBWPiB7XG4gICAgaWYgKHRoaXMubGlmdGVkID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBoYXMgYWxyZWFkeSBiZWVuIGxpZnRlZCwgdGhlcmVmb3JlLCBubyBqb2luIGlzIGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIHRoaXMuam9pbnMucHVzaChjbGF1c2UpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB2YWx1ZXMgKGNoYWluYWJsZSlcbiAgICogQHBhcmFtIGNsYXVzZSBGaWx0ZXIgY2xhdXNlXG4gICAqIEByZXR1cm5zIFRoZSB2aWV3XG4gICAqL1xuICBmaWx0ZXIoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBFbnRpdHlWaWV3PEUsIFY+IHtcbiAgICB0aGlzLmZpbHRlciQubmV4dChjbGF1c2UpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjbGF1c2UgRmlsdGVyIGNsYXVzZVxuICAgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGlkXG4gICAqL1xuICBhZGRGaWx0ZXIoY2xhdXNlOiBFbnRpdHlGaWx0ZXJDbGF1c2U8Vj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkID0gdXVpZCgpO1xuICAgIHRoaXMuZmlsdGVySW5kZXguc2V0KGlkLCBjbGF1c2UpO1xuICAgIHRoaXMuZmlsdGVycyQubmV4dChBcnJheS5mcm9tKHRoaXMuZmlsdGVySW5kZXgudmFsdWVzKCkpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgZmlsdGVyIGJ5IGlkXG4gICAqIEBwYXJhbSBjbGF1c2UgRmlsdGVyIGNsYXVzZVxuICAgKi9cbiAgcmVtb3ZlRmlsdGVyKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlckluZGV4LmRlbGV0ZShpZCk7XG4gICAgdGhpcy5maWx0ZXJzJC5uZXh0KEFycmF5LmZyb20odGhpcy5maWx0ZXJJbmRleC52YWx1ZXMoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgdmFsdWVzIChjaGFpbmFibGUpXG4gICAqIEBwYXJhbSBjbGF1c2VTb3J0IGNsYXVzZVxuICAgKiBAcmV0dXJucyBUaGUgdmlld1xuICAgKi9cbiAgc29ydChjbGF1c2U6IEVudGl0eVNvcnRDbGF1c2U8Vj4pOiBFbnRpdHlWaWV3PEUsIFY+IHtcbiAgICB0aGlzLnNvcnQkLm5leHQoY2xhdXNlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGZpbmFsIG9ic2VydmFibGVcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZVxuICAgKi9cbiAgbGlmdCgpIHtcbiAgICB0aGlzLmxpZnRlZCA9IHRydWU7XG4gICAgY29uc3Qgc291cmNlJCA9IHRoaXMuam9pbnMubGVuZ3RoID4gMCA/IHRoaXMubGlmdEpvaW5lZFNvdXJjZSgpIDogdGhpcy5saWZ0U291cmNlKCk7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZXMkID0gW1xuICAgICAgc291cmNlJCxcbiAgICAgIHRoaXMuZmlsdGVycyQsXG4gICAgICB0aGlzLmZpbHRlciQsXG4gICAgICB0aGlzLnNvcnQkLFxuICAgICAgdGhpcy5nZXRLZXkkXG4gICAgXTtcblxuICAgIHRoaXMudmFsdWVzJCQgPSBjb21iaW5lTGF0ZXN0KG9ic2VydmFibGVzJClcbiAgICAgIC5waXBlKHNraXAoMSksIGRlYm91bmNlVGltZSg1KSlcbiAgICAgIC5zdWJzY3JpYmUoKGJ1bmNoOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBbX3ZhbHVlcywgZmlsdGVycywgZmlsdGVyLCBzb3J0LCBnZXRLZXldID0gYnVuY2g7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMucHJvY2Vzc1ZhbHVlcyhfdmFsdWVzLCBmaWx0ZXJzLCBmaWx0ZXIsIHNvcnQpO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZUluZGV4ID0gZ2V0S2V5ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2V0VmFsdWVzKHZhbHVlcywgZ2VuZXJhdGVJbmRleCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHdoZW4gbm8gam9pbnMgYXJlIGRlZmluZWRcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBsaWZ0U291cmNlKCk6IE9ic2VydmFibGU8VltdPiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlJCBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxWW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgc291cmNlIG9ic2VydmFibGUgd2hlbiBqb2lucyBhcmUgZGVmaW5lZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlXG4gICAqL1xuICBwcml2YXRlIGxpZnRKb2luZWRTb3VyY2UoKTogT2JzZXJ2YWJsZTxWW10+IHtcbiAgICBjb25zdCBzb3VyY2VzJCA9IFt0aGlzLnNvdXJjZSQsIGNvbWJpbmVMYXRlc3QoXG4gICAgICB0aGlzLmpvaW5zLm1hcCgoam9pbjogRW50aXR5Sm9pbkNsYXVzZSkgPT4gam9pbi5zb3VyY2UpXG4gICAgKV07XG5cbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChzb3VyY2VzJClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGJ1bmNoOiBbRVtdLCBhbnlbXV0pID0+IHtcbiAgICAgICAgICBjb25zdCBbZW50aXRpZXMsIGpvaW5EYXRhXSA9IGJ1bmNoO1xuICAgICAgICAgIHJldHVybiBlbnRpdGllcy5yZWR1Y2UoKHZhbHVlczogVltdLCBlbnRpdHk6IEUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb21wdXRlSm9pbmVkVmFsdWUoZW50aXR5LCBqb2luRGF0YSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgam9pbnMgdG8gYSBzb3VyY2UncyBlbnRpdHkgYW5kIHJldHVybiB0aGUgZmluYWwgdmFsdWVcbiAgICogQHJldHVybnMgRmluYWwgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUpvaW5lZFZhbHVlKGVudGl0eTogRSwgam9pbkRhdGE6IGFueVtdKTogViB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHZhbHVlID0gZW50aXR5IGFzIFBhcnRpYWw8Vj47XG4gICAgbGV0IGpvaW5JbmRleCA9IDA7XG4gICAgd2hpbGUgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgam9pbkluZGV4IDwgdGhpcy5qb2lucy5sZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5qb2luc1tqb2luSW5kZXhdLnJlZHVjZSh2YWx1ZSwgam9pbkRhdGFbam9pbkluZGV4XSk7XG4gICAgICBqb2luSW5kZXggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGFuZCBzb3J0IHZhbHVlcyBiZWZvcmUgc3RyZWFtaW5nIHRoZW1cbiAgICogQHBhcmFtIHZhbHVlcyBWYWx1ZXNcbiAgICogQHBhcmFtIGZpbHRlcnMgRmlsdGVyIGNsYXVzZXNcbiAgICogQHBhcmFtIGZpbHRlciBGaWx0ZXIgY2xhdXNlXG4gICAqIEBwYXJhbSBzb3J0IFNvcnQgY2xhdXNlXG4gICAqIEByZXR1cm5zIEZpbHRlcmVkIGFuZCBzb3J0ZWQgdmFsdWVzXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NWYWx1ZXMoXG4gICAgdmFsdWVzOiBWW10sIGZpbHRlcnM6IEVudGl0eUZpbHRlckNsYXVzZVtdLCBmaWx0ZXI6IEVudGl0eUZpbHRlckNsYXVzZSwgc29ydDogRW50aXR5U29ydENsYXVzZVxuICApOiBWW10ge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5zbGljZSgwKTtcbiAgICB2YWx1ZXMgPSB0aGlzLmZpbHRlclZhbHVlcyh2YWx1ZXMsIGZpbHRlcnMuY29uY2F0KFtmaWx0ZXJdKSk7XG4gICAgdmFsdWVzID0gdGhpcy5zb3J0VmFsdWVzKHZhbHVlcywgc29ydCk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdmFsdWVzXG4gICAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzXG4gICAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlciBjbGF1c2VzXG4gICAqIEByZXR1cm5zIEZpbHRlcmVkIHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJWYWx1ZXModmFsdWVzOiBWW10sIGNsYXVzZXM6IEVudGl0eUZpbHRlckNsYXVzZVtdKTogVltdIHtcbiAgICBpZiAoY2xhdXNlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHZhbHVlczsgfVxuXG4gICAgcmV0dXJuIHZhbHVlc1xuICAgICAgLmZpbHRlcigodmFsdWU6IFYpID0+IHtcbiAgICAgICAgcmV0dXJuIGNsYXVzZXNcbiAgICAgICAgICAuZmlsdGVyKChjbGF1c2U6IEVudGl0eUZpbHRlckNsYXVzZSkgPT4gY2xhdXNlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgLmV2ZXJ5KChjbGF1c2U6IEVudGl0eUZpbHRlckNsYXVzZSkgPT4gY2xhdXNlKHZhbHVlKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IHZhbHVlc1xuICAgKiBAcGFyYW0gdmFsdWVzIFZhbHVlc1xuICAgKiBAcGFyYW0gc29ydCBTb3J0IGNsYXVzZVxuICAgKiBAcmV0dXJucyBTb3J0ZWQgdmFsdWVzXG4gICAqL1xuICBwcml2YXRlIHNvcnRWYWx1ZXModmFsdWVzOiBWW10sIGNsYXVzZTogRW50aXR5U29ydENsYXVzZSk6IFZbXSB7XG4gICAgaWYgKGNsYXVzZSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB2YWx1ZXM7IH1cbiAgICByZXR1cm4gdmFsdWVzLnNvcnQoKHYxOiBWLCB2MjogVikgPT4ge1xuICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLm5hdHVyYWxDb21wYXJlKFxuICAgICAgICBjbGF1c2UudmFsdWVBY2Nlc3Nvcih2MSksXG4gICAgICAgIGNsYXVzZS52YWx1ZUFjY2Vzc29yKHYyKSxcbiAgICAgICAgY2xhdXNlLmRpcmVjdGlvbixcbiAgICAgICAgY2xhdXNlLm51bGxzRmlyc3RcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIGFuZCBvcHRpb25hbGx5IGdlbmVyYXRlIGFuIGluZGV4XG4gICAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzXG4gICAqIEBwYXJhbSBnZW5lcmF0ZUluZGV4IGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgc2V0VmFsdWVzKHZhbHVlczogVltdLCBnZW5lcmF0ZUluZGV4OiBib29sZWFuKSB7XG4gICAgaWYgKGdlbmVyYXRlSW5kZXggPT09IHRydWUpIHtcbiAgICAgIHRoaXMuX2luZGV4ID0gdGhpcy5nZW5lcmF0ZUluZGV4KHZhbHVlcyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZXMkLm5leHQodmFsdWVzKTtcblxuICAgIGNvbnN0IGNvdW50ID0gdmFsdWVzLmxlbmd0aDtcbiAgICBjb25zdCBlbXB0eSA9IGNvdW50ID09PSAwO1xuICAgIHRoaXMuY291bnQkLm5leHQoY291bnQpO1xuICAgIHRoaXMuZW1wdHkkLm5leHQoZW1wdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgY29tcGxldGUgaW5kZXggb2YgYWxsIHRoZSB2YWx1ZXNcbiAgICogQHBhcmFtIGVudGl0aWVzIEVudGl0aWVzXG4gICAqIEByZXR1cm5zIEluZGV4XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlSW5kZXgodmFsdWVzOiBWW10pOiBNYXA8RW50aXR5S2V5LCBWPiB7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbHVlcy5tYXAoKHZhbHVlOiBWKSA9PiBbdGhpcy5nZXRLZXkodmFsdWUpLCB2YWx1ZV0pO1xuICAgIHJldHVybiBuZXcgTWFwKGVudHJpZXMgYXMgW0VudGl0eUtleSwgVl1bXSk7XG4gIH1cbn1cbiJdfQ==