@igo2/common 18.0.1-next.2 → 18.0.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/esm2022/action/action.module.mjs +19 -0
  3. package/esm2022/action/actionbar/actionbar-item.component.mjs +192 -0
  4. package/esm2022/action/actionbar/actionbar.component.mjs +277 -0
  5. package/esm2022/action/actionbar/actionbar.module.mjs +19 -0
  6. package/esm2022/action/igo2-common-action.mjs +5 -0
  7. package/esm2022/action/public_api.mjs +5 -0
  8. package/esm2022/action/shared/action.enums.mjs +7 -0
  9. package/esm2022/action/shared/action.interfaces.mjs +2 -0
  10. package/esm2022/action/shared/index.mjs +4 -0
  11. package/esm2022/action/shared/store.mjs +8 -0
  12. package/esm2022/backdrop/backdrop.component.mjs +21 -0
  13. package/esm2022/backdrop/backdrop.module.mjs +25 -0
  14. package/esm2022/backdrop/igo2-common-backdrop.mjs +5 -0
  15. package/esm2022/backdrop/public_api.mjs +3 -0
  16. package/esm2022/badge/badge-icon.directive.mjs +149 -0
  17. package/esm2022/badge/badge-icon.module.mjs +25 -0
  18. package/esm2022/badge/igo2-common-badge.mjs +5 -0
  19. package/esm2022/badge/public_api.mjs +3 -0
  20. package/esm2022/clickout/clickout.directive.mjs +32 -0
  21. package/esm2022/clickout/clickout.module.mjs +25 -0
  22. package/esm2022/clickout/igo2-common-clickout.mjs +5 -0
  23. package/esm2022/clickout/public_api.mjs +3 -0
  24. package/esm2022/clone/clone.module.mjs +25 -0
  25. package/esm2022/clone/clone.pipe.mjs +25 -0
  26. package/esm2022/clone/igo2-common-clone.mjs +5 -0
  27. package/esm2022/clone/public_api.mjs +3 -0
  28. package/esm2022/collapsible/collapse.directive.mjs +57 -0
  29. package/esm2022/collapsible/collapsible.component.mjs +38 -0
  30. package/esm2022/collapsible/collapsible.module.mjs +26 -0
  31. package/esm2022/collapsible/igo2-common-collapsible.mjs +5 -0
  32. package/esm2022/collapsible/public_api.mjs +10 -0
  33. package/esm2022/color/color-picker-form-field/color-picker-form-field.component.mjs +104 -0
  34. package/esm2022/color/color-picker-form-field/color-picker-form-field.module.mjs +19 -0
  35. package/esm2022/color/color-picker-form-field/index.mjs +3 -0
  36. package/esm2022/color/igo2-common-color.mjs +5 -0
  37. package/esm2022/color/public_api.mjs +2 -0
  38. package/esm2022/confirm-dialog/confirm-dialog.component.mjs +31 -0
  39. package/esm2022/confirm-dialog/confirm-dialog.interface.mjs +2 -0
  40. package/esm2022/confirm-dialog/confirm-dialog.module.mjs +27 -0
  41. package/esm2022/confirm-dialog/confirm-dialog.service.mjs +35 -0
  42. package/esm2022/confirm-dialog/igo2-common-confirm-dialog.mjs +5 -0
  43. package/esm2022/confirm-dialog/public_api.mjs +5 -0
  44. package/esm2022/context-menu/context-menu.directive.mjs +109 -0
  45. package/esm2022/context-menu/context-menu.module.mjs +26 -0
  46. package/esm2022/context-menu/igo2-common-context-menu.mjs +5 -0
  47. package/esm2022/context-menu/long-press.directive.mjs +65 -0
  48. package/esm2022/context-menu/public_api.mjs +10 -0
  49. package/esm2022/custom-html/custom-html.component.mjs +21 -0
  50. package/esm2022/custom-html/custom-html.module.mjs +25 -0
  51. package/esm2022/custom-html/custom-html.pipe.mjs +23 -0
  52. package/esm2022/custom-html/igo2-common-custom-html.mjs +5 -0
  53. package/esm2022/custom-html/public_api.mjs +10 -0
  54. package/esm2022/dom/dom.interfaces.mjs +2 -0
  55. package/esm2022/dom/dom.module.mjs +27 -0
  56. package/esm2022/dom/dom.service.mjs +35 -0
  57. package/esm2022/dom/igo2-common-dom.mjs +5 -0
  58. package/esm2022/dom/public_api.mjs +4 -0
  59. package/esm2022/drag-drop/drag-drop.directive.mjs +82 -0
  60. package/esm2022/drag-drop/drag-drop.module.mjs +26 -0
  61. package/esm2022/drag-drop/igo2-common-drag-drop.mjs +5 -0
  62. package/esm2022/drag-drop/public_api.mjs +4 -0
  63. package/esm2022/drag-drop/tree-drag-drop/index.mjs +3 -0
  64. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.directive.mjs +391 -0
  65. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.interface.mjs +2 -0
  66. package/esm2022/dynamic-component/dynamic-component.module.mjs +19 -0
  67. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +129 -0
  68. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +19 -0
  69. package/esm2022/dynamic-component/igo2-common-dynamic-component.mjs +5 -0
  70. package/esm2022/dynamic-component/public_api.mjs +5 -0
  71. package/esm2022/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -0
  72. package/esm2022/dynamic-component/shared/dynamic-component.mjs +183 -0
  73. package/esm2022/dynamic-component/shared/dynamic-component.service.mjs +30 -0
  74. package/esm2022/dynamic-component/shared/index.mjs +4 -0
  75. package/esm2022/entity/entity-selector/entity-selector.component.mjs +174 -0
  76. package/esm2022/entity/entity-selector/entity-selector.module.mjs +19 -0
  77. package/esm2022/entity/entity-selector/index.mjs +3 -0
  78. package/esm2022/entity/entity-table/entity-table-row.directive.mjs +138 -0
  79. package/esm2022/entity/entity-table/entity-table.component.mjs +883 -0
  80. package/esm2022/entity/entity-table/entity-table.module.mjs +19 -0
  81. package/esm2022/entity/entity-table/index.mjs +3 -0
  82. package/esm2022/entity/entity-table-paginator/entity-table-paginator.component.mjs +158 -0
  83. package/esm2022/entity/entity-table-paginator/entity-table-paginator.interface.mjs +2 -0
  84. package/esm2022/entity/entity-table-paginator/entity-table-paginator.module.mjs +19 -0
  85. package/esm2022/entity/entity-table-paginator/index.mjs +4 -0
  86. package/esm2022/entity/entity.module.mjs +30 -0
  87. package/esm2022/entity/igo2-common-entity.mjs +5 -0
  88. package/esm2022/entity/public_api.mjs +6 -0
  89. package/esm2022/entity/shared/entity.enums.mjs +28 -0
  90. package/esm2022/entity/shared/entity.interfaces.mjs +2 -0
  91. package/esm2022/entity/shared/entity.utils.mjs +73 -0
  92. package/esm2022/entity/shared/index.mjs +10 -0
  93. package/esm2022/entity/shared/state.mjs +194 -0
  94. package/esm2022/entity/shared/store.mjs +322 -0
  95. package/esm2022/entity/shared/strategies/filter-custom-function.mjs +80 -0
  96. package/esm2022/entity/shared/strategies/filter-selection.mjs +81 -0
  97. package/esm2022/entity/shared/strategies/index.mjs +4 -0
  98. package/esm2022/entity/shared/strategies/strategy.mjs +82 -0
  99. package/esm2022/entity/shared/transaction.mjs +329 -0
  100. package/esm2022/entity/shared/view.mjs +330 -0
  101. package/esm2022/entity/shared/watcher.mjs +135 -0
  102. package/esm2022/environment/environment.interface.mjs +2 -0
  103. package/esm2022/environment/igo2-common-environment.mjs +5 -0
  104. package/esm2022/environment/public_api.mjs +2 -0
  105. package/esm2022/flexible/flexible.component.mjs +137 -0
  106. package/esm2022/flexible/flexible.module.mjs +25 -0
  107. package/esm2022/flexible/flexible.type.mjs +2 -0
  108. package/esm2022/flexible/igo2-common-flexible.mjs +5 -0
  109. package/esm2022/flexible/public_api.mjs +4 -0
  110. package/esm2022/form/form/form.component.mjs +105 -0
  111. package/esm2022/form/form/form.module.mjs +19 -0
  112. package/esm2022/form/form/index.mjs +3 -0
  113. package/esm2022/form/form-dialog/form-dialog.component.mjs +94 -0
  114. package/esm2022/form/form-dialog/form-dialog.interface.mjs +2 -0
  115. package/esm2022/form/form-dialog/form-dialog.module.mjs +31 -0
  116. package/esm2022/form/form-dialog/form-dialog.service.mjs +30 -0
  117. package/esm2022/form/form-dialog/index.mjs +5 -0
  118. package/esm2022/form/form-field/form-field-select.component.mjs +117 -0
  119. package/esm2022/form/form-field/form-field-text.component.mjs +126 -0
  120. package/esm2022/form/form-field/form-field-textarea.component.mjs +95 -0
  121. package/esm2022/form/form-field/form-field.component.mjs +65 -0
  122. package/esm2022/form/form-field/form-field.directive.mjs +11 -0
  123. package/esm2022/form/form-field/form-field.module.mjs +23 -0
  124. package/esm2022/form/form-field/index.mjs +7 -0
  125. package/esm2022/form/form-group/form-group.component.mjs +81 -0
  126. package/esm2022/form/form-group/form-group.module.mjs +19 -0
  127. package/esm2022/form/form-group/index.mjs +3 -0
  128. package/esm2022/form/form.module.mjs +32 -0
  129. package/esm2022/form/igo2-common-form.mjs +5 -0
  130. package/esm2022/form/public_api.mjs +7 -0
  131. package/esm2022/form/shared/form-field-component.mjs +7 -0
  132. package/esm2022/form/shared/form-field.service.mjs +28 -0
  133. package/esm2022/form/shared/form.interfaces.mjs +2 -0
  134. package/esm2022/form/shared/form.service.mjs +82 -0
  135. package/esm2022/form/shared/form.utils.mjs +41 -0
  136. package/esm2022/form/shared/index.mjs +6 -0
  137. package/esm2022/home-button/home-button.component.mjs +25 -0
  138. package/esm2022/home-button/home-button.module.mjs +19 -0
  139. package/esm2022/home-button/igo2-common-home-button.mjs +5 -0
  140. package/esm2022/home-button/public_api.mjs +3 -0
  141. package/esm2022/icon/icon/icon.component.mjs +38 -0
  142. package/esm2022/icon/icon.provider.mjs +14 -0
  143. package/esm2022/icon/igo2-common-icon.mjs +5 -0
  144. package/esm2022/icon/public_api.mjs +4 -0
  145. package/esm2022/icon/shared/icon.interface.mjs +2 -0
  146. package/esm2022/icon/shared/icon.service.mjs +26 -0
  147. package/esm2022/icon/shared/icons.mjs +40 -0
  148. package/esm2022/icon/shared/index.mjs +4 -0
  149. package/esm2022/igo2-common.mjs +5 -0
  150. package/esm2022/image/igo2-common-image.mjs +5 -0
  151. package/esm2022/image/image-error.directive.mjs +35 -0
  152. package/esm2022/image/image.module.mjs +26 -0
  153. package/esm2022/image/public_api.mjs +7 -0
  154. package/esm2022/image/secure-image.pipe.mjs +66 -0
  155. package/esm2022/interactive-tour/igo2-common-interactive-tour.mjs +5 -0
  156. package/esm2022/interactive-tour/interactive-tour.component.mjs +131 -0
  157. package/esm2022/interactive-tour/interactive-tour.interface.mjs +2 -0
  158. package/esm2022/interactive-tour/interactive-tour.loader.mjs +49 -0
  159. package/esm2022/interactive-tour/interactive-tour.module.mjs +19 -0
  160. package/esm2022/interactive-tour/interactive-tour.service.mjs +303 -0
  161. package/esm2022/interactive-tour/public_api.mjs +6 -0
  162. package/esm2022/json-dialog/igo2-common-json-dialog.mjs +5 -0
  163. package/esm2022/json-dialog/json-dialog.component.mjs +38 -0
  164. package/esm2022/json-dialog/json-dialog.module.mjs +26 -0
  165. package/esm2022/json-dialog/json-dialog.service.mjs +26 -0
  166. package/esm2022/json-dialog/public_api.mjs +4 -0
  167. package/esm2022/keyvalue/igo2-common-keyvalue.mjs +5 -0
  168. package/esm2022/keyvalue/keyvalue.module.mjs +25 -0
  169. package/esm2022/keyvalue/keyvalue.pipe.mjs +19 -0
  170. package/esm2022/keyvalue/public_api.mjs +3 -0
  171. package/esm2022/list/igo2-common-list.mjs +5 -0
  172. package/esm2022/list/list-item.directive.mjs +166 -0
  173. package/esm2022/list/list.component.mjs +252 -0
  174. package/esm2022/list/list.module.mjs +26 -0
  175. package/esm2022/list/public_api.mjs +7 -0
  176. package/esm2022/panel/igo2-common-panel.mjs +5 -0
  177. package/esm2022/panel/panel.component.mjs +30 -0
  178. package/esm2022/panel/panel.module.mjs +19 -0
  179. package/esm2022/panel/public_api.mjs +3 -0
  180. package/esm2022/public_api.mjs +20 -0
  181. package/esm2022/select-value-dialog/igo2-common-select-value-dialog.mjs +5 -0
  182. package/esm2022/select-value-dialog/public_api.mjs +6 -0
  183. package/esm2022/select-value-dialog/select-value-check-radio-dialog.component.mjs +103 -0
  184. package/esm2022/select-value-dialog/select-value-dialog.enums.mjs +6 -0
  185. package/esm2022/select-value-dialog/select-value-dialog.interface.mjs +2 -0
  186. package/esm2022/select-value-dialog/select-value-dialog.module.mjs +27 -0
  187. package/esm2022/select-value-dialog/select-value-dialog.service.mjs +29 -0
  188. package/esm2022/sidenav/igo2-common-sidenav.mjs +5 -0
  189. package/esm2022/sidenav/public_api.mjs +3 -0
  190. package/esm2022/sidenav/sidenav-shim.directive.mjs +58 -0
  191. package/esm2022/sidenav/sidenav.module.mjs +25 -0
  192. package/esm2022/spinner/igo2-common-spinner.mjs +5 -0
  193. package/esm2022/spinner/public_api.mjs +4 -0
  194. package/esm2022/spinner/spinner-activity.directive.mjs +56 -0
  195. package/esm2022/spinner/spinner.component.mjs +29 -0
  196. package/esm2022/spinner/spinner.module.mjs +26 -0
  197. package/esm2022/stop-propagation/igo2-common-stop-propagation.mjs +5 -0
  198. package/esm2022/stop-propagation/public_api.mjs +10 -0
  199. package/esm2022/stop-propagation/stop-drop-propagation.directive.mjs +21 -0
  200. package/esm2022/stop-propagation/stop-propagation.directive.mjs +20 -0
  201. package/esm2022/stop-propagation/stop-propagation.module.mjs +26 -0
  202. package/esm2022/table/igo2-common-table.mjs +5 -0
  203. package/esm2022/table/public_api.mjs +7 -0
  204. package/esm2022/table/table-action-color.enum.mjs +7 -0
  205. package/esm2022/table/table-database.mjs +28 -0
  206. package/esm2022/table/table-datasource.mjs +66 -0
  207. package/esm2022/table/table-model.interface.mjs +2 -0
  208. package/esm2022/table/table.component.mjs +143 -0
  209. package/esm2022/table/table.module.mjs +25 -0
  210. package/esm2022/tool/igo2-common-tool.mjs +5 -0
  211. package/esm2022/tool/public_api.mjs +4 -0
  212. package/esm2022/tool/shared/index.mjs +6 -0
  213. package/esm2022/tool/shared/tool-component.mjs +9 -0
  214. package/esm2022/tool/shared/tool.interface.mjs +2 -0
  215. package/esm2022/tool/shared/tool.service.mjs +43 -0
  216. package/esm2022/tool/shared/toolbox.enums.mjs +2 -0
  217. package/esm2022/tool/shared/toolbox.mjs +192 -0
  218. package/esm2022/tool/tool.module.mjs +28 -0
  219. package/esm2022/tool/toolbox/index.mjs +3 -0
  220. package/esm2022/tool/toolbox/toolbox.animation.mjs +10 -0
  221. package/esm2022/tool/toolbox/toolbox.component.mjs +241 -0
  222. package/esm2022/tool/toolbox/toolbox.module.mjs +19 -0
  223. package/esm2022/widget/igo2-common-widget.mjs +5 -0
  224. package/esm2022/widget/public_api.mjs +4 -0
  225. package/esm2022/widget/shared/index.mjs +4 -0
  226. package/esm2022/widget/shared/widget.interfaces.mjs +2 -0
  227. package/esm2022/widget/shared/widget.mjs +4 -0
  228. package/esm2022/widget/shared/widget.service.mjs +22 -0
  229. package/esm2022/widget/widget-outlet/index.mjs +3 -0
  230. package/esm2022/widget/widget-outlet/widget-outlet.component.mjs +112 -0
  231. package/esm2022/widget/widget-outlet/widget-outlet.module.mjs +19 -0
  232. package/esm2022/widget/widget.module.mjs +22 -0
  233. package/esm2022/workspace/igo2-common-workspace.mjs +5 -0
  234. package/esm2022/workspace/public_api.mjs +5 -0
  235. package/esm2022/workspace/shared/index.mjs +4 -0
  236. package/esm2022/workspace/shared/store.mjs +37 -0
  237. package/esm2022/workspace/shared/workspace.interfaces.mjs +2 -0
  238. package/esm2022/workspace/shared/workspace.mjs +143 -0
  239. package/esm2022/workspace/workspace-selector/index.mjs +3 -0
  240. package/esm2022/workspace/workspace-selector/workspace-selector.component.mjs +51 -0
  241. package/esm2022/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
  242. package/esm2022/workspace/workspace-widget-outlet/index.mjs +3 -0
  243. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +73 -0
  244. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +19 -0
  245. package/esm2022/workspace/workspace.module.mjs +27 -0
  246. package/fesm2022/igo2-common-action.mjs +16 -16
  247. package/fesm2022/igo2-common-action.mjs.map +1 -1
  248. package/fesm2022/igo2-common-backdrop.mjs +8 -8
  249. package/fesm2022/igo2-common-backdrop.mjs.map +1 -1
  250. package/fesm2022/igo2-common-badge.mjs +7 -7
  251. package/fesm2022/igo2-common-badge.mjs.map +1 -1
  252. package/fesm2022/igo2-common-clickout.mjs +7 -7
  253. package/fesm2022/igo2-common-clickout.mjs.map +1 -1
  254. package/fesm2022/igo2-common-clone.mjs +7 -7
  255. package/fesm2022/igo2-common-clone.mjs.map +1 -1
  256. package/fesm2022/igo2-common-collapsible.mjs +11 -11
  257. package/fesm2022/igo2-common-collapsible.mjs.map +1 -1
  258. package/fesm2022/igo2-common-color.mjs +9 -9
  259. package/fesm2022/igo2-common-color.mjs.map +1 -1
  260. package/fesm2022/igo2-common-confirm-dialog.mjs +11 -11
  261. package/fesm2022/igo2-common-confirm-dialog.mjs.map +1 -1
  262. package/fesm2022/igo2-common-context-menu.mjs +10 -10
  263. package/fesm2022/igo2-common-context-menu.mjs.map +1 -1
  264. package/fesm2022/igo2-common-custom-html.mjs +11 -11
  265. package/fesm2022/igo2-common-custom-html.mjs.map +1 -1
  266. package/fesm2022/igo2-common-dom.mjs +7 -7
  267. package/fesm2022/igo2-common-dom.mjs.map +1 -1
  268. package/fesm2022/igo2-common-drag-drop.mjs +10 -10
  269. package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
  270. package/fesm2022/igo2-common-dynamic-component.mjs +14 -14
  271. package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -1
  272. package/fesm2022/igo2-common-entity.mjs +33 -33
  273. package/fesm2022/igo2-common-entity.mjs.map +1 -1
  274. package/fesm2022/igo2-common-flexible.mjs +7 -7
  275. package/fesm2022/igo2-common-flexible.mjs.map +1 -1
  276. package/fesm2022/igo2-common-form.mjs +57 -57
  277. package/fesm2022/igo2-common-form.mjs.map +1 -1
  278. package/fesm2022/igo2-common-home-button.mjs +8 -8
  279. package/fesm2022/igo2-common-home-button.mjs.map +1 -1
  280. package/fesm2022/igo2-common-icon.mjs +14 -13
  281. package/fesm2022/igo2-common-icon.mjs.map +1 -1
  282. package/fesm2022/igo2-common-image.mjs +10 -10
  283. package/fesm2022/igo2-common-image.mjs.map +1 -1
  284. package/fesm2022/igo2-common-interactive-tour.mjs +14 -14
  285. package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -1
  286. package/fesm2022/igo2-common-json-dialog.mjs +11 -11
  287. package/fesm2022/igo2-common-json-dialog.mjs.map +1 -1
  288. package/fesm2022/igo2-common-keyvalue.mjs +7 -7
  289. package/fesm2022/igo2-common-keyvalue.mjs.map +1 -1
  290. package/fesm2022/igo2-common-list.mjs +11 -11
  291. package/fesm2022/igo2-common-list.mjs.map +1 -1
  292. package/fesm2022/igo2-common-panel.mjs +8 -8
  293. package/fesm2022/igo2-common-panel.mjs.map +1 -1
  294. package/fesm2022/igo2-common-select-value-dialog.mjs +11 -11
  295. package/fesm2022/igo2-common-select-value-dialog.mjs.map +1 -1
  296. package/fesm2022/igo2-common-sidenav.mjs +7 -7
  297. package/fesm2022/igo2-common-sidenav.mjs.map +1 -1
  298. package/fesm2022/igo2-common-spinner.mjs +11 -11
  299. package/fesm2022/igo2-common-spinner.mjs.map +1 -1
  300. package/fesm2022/igo2-common-stop-propagation.mjs +10 -10
  301. package/fesm2022/igo2-common-stop-propagation.mjs.map +1 -1
  302. package/fesm2022/igo2-common-table.mjs +8 -8
  303. package/fesm2022/igo2-common-table.mjs.map +1 -1
  304. package/fesm2022/igo2-common-tool.mjs +15 -15
  305. package/fesm2022/igo2-common-tool.mjs.map +1 -1
  306. package/fesm2022/igo2-common-widget.mjs +15 -15
  307. package/fesm2022/igo2-common-widget.mjs.map +1 -1
  308. package/fesm2022/igo2-common-workspace.mjs +20 -20
  309. package/fesm2022/igo2-common-workspace.mjs.map +1 -1
  310. package/package.json +76 -8
  311. package/src/style/style.scss +1 -1
  312. package/style/style.css +1 -4
@@ -0,0 +1,194 @@
1
+ import { ReplaySubject } from 'rxjs';
2
+ import { getEntityId } from './entity.utils';
3
+ /**
4
+ * This class is used to track a store's entities state
5
+ */
6
+ export class EntityStateManager {
7
+ options;
8
+ /**
9
+ * State index
10
+ */
11
+ index = new Map();
12
+ /**
13
+ * Change emitter
14
+ */
15
+ change$ = new ReplaySubject(1);
16
+ /**
17
+ * Method to get an entity's id
18
+ */
19
+ getKey;
20
+ constructor(options = {}) {
21
+ this.options = options;
22
+ this.getKey = options.getKey ? options.getKey : getEntityId;
23
+ this.next();
24
+ }
25
+ /**
26
+ * Clear state
27
+ */
28
+ clear() {
29
+ if (this.index.size > 0) {
30
+ this.index.clear();
31
+ this.next();
32
+ }
33
+ }
34
+ /**
35
+ * Get an entity's state
36
+ * @param entity Entity
37
+ * @returns State
38
+ */
39
+ get(entity) {
40
+ return (this.index.get(this.getKey(entity)) || {});
41
+ }
42
+ /**
43
+ * Set an entity's state
44
+ * @param entity Entity
45
+ * @param state State
46
+ */
47
+ set(entity, state) {
48
+ this.setMany([entity], state);
49
+ }
50
+ /**
51
+ * Set many entitie's state
52
+ * @param entitie Entities
53
+ * @param state State
54
+ */
55
+ setMany(entities, state) {
56
+ entities.forEach((entity) => {
57
+ this.index.set(this.getKey(entity), Object.assign({}, state));
58
+ });
59
+ this.next();
60
+ }
61
+ /**
62
+ * Set state of all entities that already have a state. This is not
63
+ * the same as setting the state of all the store's entities.
64
+ * @param state State
65
+ */
66
+ setAll(state) {
67
+ Array.from(this.index.keys()).forEach((key) => {
68
+ this.index.set(key, Object.assign({}, state));
69
+ });
70
+ this.next();
71
+ }
72
+ /**
73
+ * Update an entity's state
74
+ * @param entity Entity
75
+ * @param changes State changes
76
+ */
77
+ update(entity, changes, exclusive = false) {
78
+ this.updateMany([entity], changes, exclusive);
79
+ }
80
+ /**
81
+ * Update many entitie's state
82
+ * @param entitie Entities
83
+ * @param changes State changes
84
+ */
85
+ updateMany(entities, changes, exclusive = false) {
86
+ if (exclusive === true) {
87
+ return this.updateManyExclusive(entities, changes);
88
+ }
89
+ entities.forEach((entity) => {
90
+ const state = Object.assign({}, this.get(entity), changes);
91
+ this.index.set(this.getKey(entity), state);
92
+ });
93
+ this.next();
94
+ }
95
+ /**
96
+ * Reversee an entity's state
97
+ * @param entity Entity
98
+ * @param keys State keys to reverse
99
+ */
100
+ reverse(entity, keys) {
101
+ this.reverseMany([entity], keys);
102
+ }
103
+ /**
104
+ * Reverse many entitie's state
105
+ * @param entitie Entities
106
+ * @param keys State keys to reverse
107
+ */
108
+ reverseMany(entities, keys) {
109
+ entities.forEach((entity) => {
110
+ const currentState = this.get(entity);
111
+ const changes = keys.reduce((acc, key) => {
112
+ acc[key] = currentState[key] || false;
113
+ return acc;
114
+ }, {});
115
+ const reversedChanges = this.reverseChanges(changes);
116
+ const state = Object.assign({}, currentState, reversedChanges);
117
+ this.index.set(this.getKey(entity), state);
118
+ });
119
+ this.next();
120
+ }
121
+ /**
122
+ * Update state of all entities that already have a state. This is not
123
+ * the same as updating the state of all the store's entities.
124
+ * @param changes State
125
+ */
126
+ updateAll(changes) {
127
+ const allKeys = this.getAllKeys();
128
+ Array.from(allKeys).forEach((key) => {
129
+ const state = Object.assign({}, this.index.get(key), changes);
130
+ this.index.set(key, state);
131
+ });
132
+ this.next();
133
+ }
134
+ /**
135
+ * When some state changes are flagged as 'exclusive', reverse
136
+ * the state of all other entities. Changes are reversable when
137
+ * they are boolean.
138
+ * @param entitie Entities
139
+ * @param changes State changes
140
+ */
141
+ updateManyExclusive(entities, changes) {
142
+ const reverseChanges = this.reverseChanges(changes);
143
+ const keys = entities.map((entity) => this.getKey(entity));
144
+ const allKeys = new Set(keys.concat(Array.from(this.getAllKeys())));
145
+ allKeys.forEach((key) => {
146
+ const state = this.index.get(key) || {};
147
+ if (keys.indexOf(key) >= 0) {
148
+ this.index.set(key, Object.assign({}, state, changes));
149
+ }
150
+ else {
151
+ // Update only if the reverse changes would modify
152
+ // a key already present in the current state
153
+ const shouldUpdate = Object.keys(reverseChanges).some((changeKey) => {
154
+ return (state[changeKey] !== undefined &&
155
+ state[changeKey] !== reverseChanges[changeKey]);
156
+ });
157
+ if (shouldUpdate === true) {
158
+ this.index.set(key, Object.assign({}, state, reverseChanges));
159
+ }
160
+ }
161
+ });
162
+ this.next();
163
+ }
164
+ /**
165
+ * Compute a 'reversed' version of some state changes.
166
+ * Changes are reversable when they are boolean.
167
+ * @param changes State changes
168
+ * @returns Reversed state changes
169
+ */
170
+ reverseChanges(changes) {
171
+ return Object.entries(changes).reduce((reverseChanges, bunch) => {
172
+ const [changeKey, value] = bunch;
173
+ if (typeof value === typeof true) {
174
+ reverseChanges[changeKey] = !value;
175
+ }
176
+ return reverseChanges;
177
+ }, {});
178
+ }
179
+ /**
180
+ * Return all the keys in that state and in the store it's bound to, if any.
181
+ * @returns Set of keys
182
+ */
183
+ getAllKeys() {
184
+ const storeKeys = Array.from(this.options?.index?.keys() ?? []);
185
+ return new Set(Array.from(this.index.keys()).concat(storeKeys));
186
+ }
187
+ /**
188
+ * Emit 'change' event
189
+ */
190
+ next() {
191
+ this.change$.next();
192
+ }
193
+ }
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPN0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBbUJUO0lBZnBCOztPQUVHO0lBQ00sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO0lBRXpDOztPQUVHO0lBQ00sT0FBTyxHQUFHLElBQUksYUFBYSxDQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTlDOztPQUVHO0lBQ00sTUFBTSxDQUFtQjtJQUVsQyxZQUFvQixVQUF3QyxFQUFFO1FBQTFDLFlBQU8sR0FBUCxPQUFPLENBQW1DO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRTVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLE1BQVM7UUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBTSxDQUFDO0lBQzFELENBQUM7SUFF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QTBCLEVBQUUsS0FBb0IsRUFBRSxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsY0FBeUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDO1lBQ0QsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLFVBQVU7UUFDaEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNLLElBQUk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRW50aXR5S2V5LCBFbnRpdHlTdGF0ZSB9IGZyb20gJy4vZW50aXR5LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0RW50aXR5SWQgfSBmcm9tICcuL2VudGl0eS51dGlscyc7XG5cbmludGVyZmFjZSBFbnRpdHlTdGF0ZU1hbmFnZXJPcHRpb25zPEUgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgZ2V0S2V5PzogKGVudGl0eTogb2JqZWN0KSA9PiBFbnRpdHlLZXk7XG4gIGluZGV4PzogTWFwPEVudGl0eUtleSwgRT47XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRyYWNrIGEgc3RvcmUncyBlbnRpdGllcyBzdGF0ZVxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5U3RhdGVNYW5hZ2VyPFxuICBFIGV4dGVuZHMgb2JqZWN0LFxuICBTIGV4dGVuZHMgRW50aXR5U3RhdGUgPSBFbnRpdHlTdGF0ZVxuPiB7XG4gIC8qKlxuICAgKiBTdGF0ZSBpbmRleFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXggPSBuZXcgTWFwPEVudGl0eUtleSwgUz4oKTtcblxuICAvKipcbiAgICogQ2hhbmdlIGVtaXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZSQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBpZFxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0S2V5OiAoRSkgPT4gRW50aXR5S2V5O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3B0aW9uczogRW50aXR5U3RhdGVNYW5hZ2VyT3B0aW9uczxFPiA9IHt9KSB7XG4gICAgdGhpcy5nZXRLZXkgPSBvcHRpb25zLmdldEtleSA/IG9wdGlvbnMuZ2V0S2V5IDogZ2V0RW50aXR5SWQ7XG5cbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBzdGF0ZVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaW5kZXguc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZW50aXR5J3Mgc3RhdGVcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcbiAgICogQHJldHVybnMgU3RhdGVcbiAgICovXG4gIGdldChlbnRpdHk6IEUpOiBTIHtcbiAgICByZXR1cm4gKHRoaXMuaW5kZXguZ2V0KHRoaXMuZ2V0S2V5KGVudGl0eSkpIHx8IHt9KSBhcyBTO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkncyBzdGF0ZVxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxuICAgKiBAcGFyYW0gc3RhdGUgU3RhdGVcbiAgICovXG4gIHNldChlbnRpdHk6IEUsIHN0YXRlOiBTKSB7XG4gICAgdGhpcy5zZXRNYW55KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1hbnkgZW50aXRpZSdzIHN0YXRlXG4gICAqIEBwYXJhbSBlbnRpdGllIEVudGl0aWVzXG4gICAqIEBwYXJhbSBzdGF0ZSBTdGF0ZVxuICAgKi9cbiAgc2V0TWFueShlbnRpdGllczogRVtdLCBzdGF0ZTogUykge1xuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4ge1xuICAgICAgdGhpcy5pbmRleC5zZXQodGhpcy5nZXRLZXkoZW50aXR5KSwgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpKTtcbiAgICB9KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3RhdGUgb2YgYWxsIGVudGl0aWVzIHRoYXQgYWxyZWFkeSBoYXZlIGEgc3RhdGUuIFRoaXMgaXMgbm90XG4gICAqIHRoZSBzYW1lIGFzIHNldHRpbmcgdGhlIHN0YXRlIG9mIGFsbCB0aGUgc3RvcmUncyBlbnRpdGllcy5cbiAgICogQHBhcmFtIHN0YXRlIFN0YXRlXG4gICAqL1xuICBzZXRBbGwoc3RhdGU6IFMpIHtcbiAgICBBcnJheS5mcm9tKHRoaXMuaW5kZXgua2V5cygpKS5mb3JFYWNoKChrZXk6IEVudGl0eUtleSkgPT4ge1xuICAgICAgdGhpcy5pbmRleC5zZXQoa2V5LCBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSkpO1xuICAgIH0pO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBlbnRpdHkncyBzdGF0ZVxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxuICAgKiBAcGFyYW0gY2hhbmdlcyBTdGF0ZSBjaGFuZ2VzXG4gICAqL1xuICB1cGRhdGUoZW50aXR5OiBFLCBjaGFuZ2VzOiBQYXJ0aWFsPFM+LCBleGNsdXNpdmUgPSBmYWxzZSkge1xuICAgIHRoaXMudXBkYXRlTWFueShbZW50aXR5XSwgY2hhbmdlcywgZXhjbHVzaXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWFueSBlbnRpdGllJ3Mgc3RhdGVcbiAgICogQHBhcmFtIGVudGl0aWUgRW50aXRpZXNcbiAgICogQHBhcmFtIGNoYW5nZXMgU3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgdXBkYXRlTWFueShlbnRpdGllczogRVtdLCBjaGFuZ2VzOiBQYXJ0aWFsPFM+LCBleGNsdXNpdmUgPSBmYWxzZSkge1xuICAgIGlmIChleGNsdXNpdmUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU1hbnlFeGNsdXNpdmUoZW50aXRpZXMsIGNoYW5nZXMpO1xuICAgIH1cblxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldChlbnRpdHkpLCBjaGFuZ2VzKTtcbiAgICAgIHRoaXMuaW5kZXguc2V0KHRoaXMuZ2V0S2V5KGVudGl0eSksIHN0YXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlZSBhbiBlbnRpdHkncyBzdGF0ZVxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxuICAgKiBAcGFyYW0ga2V5cyBTdGF0ZSBrZXlzIHRvIHJldmVyc2VcbiAgICovXG4gIHJldmVyc2UoZW50aXR5OiBFLCBrZXlzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMucmV2ZXJzZU1hbnkoW2VudGl0eV0sIGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyc2UgbWFueSBlbnRpdGllJ3Mgc3RhdGVcbiAgICogQHBhcmFtIGVudGl0aWUgRW50aXRpZXNcbiAgICogQHBhcmFtIGtleXMgU3RhdGUga2V5cyB0byByZXZlcnNlXG4gICAqL1xuICByZXZlcnNlTWFueShlbnRpdGllczogRVtdLCBrZXlzOiBzdHJpbmdbXSkge1xuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5nZXQoZW50aXR5KTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBrZXlzLnJlZHVjZShcbiAgICAgICAgKGFjYzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYWNjW2tleV0gPSBjdXJyZW50U3RhdGVba2V5XSB8fCBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKSBhcyBQYXJ0aWFsPFM+O1xuICAgICAgY29uc3QgcmV2ZXJzZWRDaGFuZ2VzID0gdGhpcy5yZXZlcnNlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudFN0YXRlLCByZXZlcnNlZENoYW5nZXMpO1xuICAgICAgdGhpcy5pbmRleC5zZXQodGhpcy5nZXRLZXkoZW50aXR5KSwgc3RhdGUpO1xuICAgIH0pO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdGF0ZSBvZiBhbGwgZW50aXRpZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBzdGF0ZS4gVGhpcyBpcyBub3RcbiAgICogdGhlIHNhbWUgYXMgdXBkYXRpbmcgdGhlIHN0YXRlIG9mIGFsbCB0aGUgc3RvcmUncyBlbnRpdGllcy5cbiAgICogQHBhcmFtIGNoYW5nZXMgU3RhdGVcbiAgICovXG4gIHVwZGF0ZUFsbChjaGFuZ2VzOiBQYXJ0aWFsPFM+KSB7XG4gICAgY29uc3QgYWxsS2V5cyA9IHRoaXMuZ2V0QWxsS2V5cygpO1xuICAgIEFycmF5LmZyb20oYWxsS2V5cykuZm9yRWFjaCgoa2V5OiBFbnRpdHlLZXkpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5pbmRleC5nZXQoa2V5KSwgY2hhbmdlcyk7XG4gICAgICB0aGlzLmluZGV4LnNldChrZXksIHN0YXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHNvbWUgc3RhdGUgY2hhbmdlcyBhcmUgZmxhZ2dlZCBhcyAnZXhjbHVzaXZlJywgcmV2ZXJzZVxuICAgKiB0aGUgc3RhdGUgb2YgYWxsIG90aGVyIGVudGl0aWVzLiBDaGFuZ2VzIGFyZSByZXZlcnNhYmxlIHdoZW5cbiAgICogdGhleSBhcmUgYm9vbGVhbi5cbiAgICogQHBhcmFtIGVudGl0aWUgRW50aXRpZXNcbiAgICogQHBhcmFtIGNoYW5nZXMgU3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVNYW55RXhjbHVzaXZlKGVudGl0aWVzOiBFW10sIGNoYW5nZXM6IFBhcnRpYWw8Uz4pIHtcbiAgICBjb25zdCByZXZlcnNlQ2hhbmdlcyA9IHRoaXMucmV2ZXJzZUNoYW5nZXMoY2hhbmdlcyk7XG5cbiAgICBjb25zdCBrZXlzID0gZW50aXRpZXMubWFwKChlbnRpdHk6IEUpID0+IHRoaXMuZ2V0S2V5KGVudGl0eSkpO1xuICAgIGNvbnN0IGFsbEtleXMgPSBuZXcgU2V0KGtleXMuY29uY2F0KEFycmF5LmZyb20odGhpcy5nZXRBbGxLZXlzKCkpKSk7XG4gICAgYWxsS2V5cy5mb3JFYWNoKChrZXk6IEVudGl0eUtleSkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmluZGV4LmdldChrZXkpIHx8ICh7fSBhcyBTKTtcblxuICAgICAgaWYgKGtleXMuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgdGhpcy5pbmRleC5zZXQoa2V5LCBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgY2hhbmdlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIG9ubHkgaWYgdGhlIHJldmVyc2UgY2hhbmdlcyB3b3VsZCBtb2RpZnlcbiAgICAgICAgLy8gYSBrZXkgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9IE9iamVjdC5rZXlzKHJldmVyc2VDaGFuZ2VzKS5zb21lKFxuICAgICAgICAgIChjaGFuZ2VLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgc3RhdGVbY2hhbmdlS2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgIHN0YXRlW2NoYW5nZUtleV0gIT09IHJldmVyc2VDaGFuZ2VzW2NoYW5nZUtleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5pbmRleC5zZXQoa2V5LCBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgcmV2ZXJzZUNoYW5nZXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBhICdyZXZlcnNlZCcgdmVyc2lvbiBvZiBzb21lIHN0YXRlIGNoYW5nZXMuXG4gICAqIENoYW5nZXMgYXJlIHJldmVyc2FibGUgd2hlbiB0aGV5IGFyZSBib29sZWFuLlxuICAgKiBAcGFyYW0gY2hhbmdlcyBTdGF0ZSBjaGFuZ2VzXG4gICAqIEByZXR1cm5zIFJldmVyc2VkIHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgcmV2ZXJzZUNoYW5nZXMoY2hhbmdlczogUGFydGlhbDxTPik6IFBhcnRpYWw8Uz4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKS5yZWR1Y2UoXG4gICAgICAocmV2ZXJzZUNoYW5nZXM6IFBhcnRpYWw8Uz4sIGJ1bmNoOiBbc3RyaW5nLCBhbnldKSA9PiB7XG4gICAgICAgIGNvbnN0IFtjaGFuZ2VLZXksIHZhbHVlXSA9IGJ1bmNoO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSB0eXBlb2YgdHJ1ZSkge1xuICAgICAgICAgIChyZXZlcnNlQ2hhbmdlcyBhcyBvYmplY3QpW2NoYW5nZUtleV0gPSAhdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldmVyc2VDaGFuZ2VzO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHRoZSBrZXlzIGluIHRoYXQgc3RhdGUgYW5kIGluIHRoZSBzdG9yZSBpdCdzIGJvdW5kIHRvLCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIFNldCBvZiBrZXlzXG4gICAqL1xuICBwcml2YXRlIGdldEFsbEtleXMoKTogU2V0PEVudGl0eUtleT4ge1xuICAgIGNvbnN0IHN0b3JlS2V5cyA9IEFycmF5LmZyb20odGhpcy5vcHRpb25zPy5pbmRleD8ua2V5cygpID8/IFtdKTtcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKHRoaXMuaW5kZXgua2V5cygpKS5jb25jYXQoc3RvcmVLZXlzKSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCAnY2hhbmdlJyBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBuZXh0KCkge1xuICAgIHRoaXMuY2hhbmdlJC5uZXh0KCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,322 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { getEntityId, getEntityProperty } from './entity.utils';
3
+ import { EntityStateManager } from './state';
4
+ import { EntityView } from './view';
5
+ /**
6
+ * An entity store class holds any number of entities
7
+ * as well as their state. It can be observed, filtered and sorted and
8
+ * provides methods to insert, update or delete entities.
9
+ */
10
+ export class EntityStore {
11
+ /**
12
+ * Observable of the raw entities
13
+ */
14
+ entities$ = new BehaviorSubject([]);
15
+ /**
16
+ * Number of entities
17
+ */
18
+ count$ = new BehaviorSubject(0);
19
+ get count() {
20
+ return this.count$.value;
21
+ }
22
+ /**
23
+ * Whether the store is empty
24
+ */
25
+ empty$ = new BehaviorSubject(true);
26
+ get empty() {
27
+ return this.empty$.value;
28
+ }
29
+ /**
30
+ * Entity store state
31
+ */
32
+ state;
33
+ /**
34
+ * View of all the entities
35
+ */
36
+ view;
37
+ /**
38
+ * View of all the entities and their state
39
+ */
40
+ stateView;
41
+ /**
42
+ * Method to get an entity's id
43
+ */
44
+ getKey;
45
+ /**
46
+ * Method to get an entity's named property
47
+ */
48
+ getProperty;
49
+ /**
50
+ * Store index
51
+ */
52
+ get index() {
53
+ return this._index;
54
+ }
55
+ _index;
56
+ /**
57
+ * Store index
58
+ */
59
+ get pristine() {
60
+ return this._pristine;
61
+ }
62
+ _pristine = true;
63
+ /**
64
+ * Strategies
65
+ */
66
+ strategies = [];
67
+ constructor(entities, options = {}) {
68
+ this.getKey = options.getKey ? options.getKey : getEntityId;
69
+ this.getProperty = options.getProperty
70
+ ? options.getProperty
71
+ : getEntityProperty;
72
+ this.state = this.createStateManager();
73
+ this.view = this.createDataView();
74
+ this.stateView = this.createStateView();
75
+ this.view.lift();
76
+ this.stateView.lift();
77
+ if (entities.length > 0) {
78
+ this.load(entities);
79
+ }
80
+ else {
81
+ this._index = this.generateIndex(entities);
82
+ }
83
+ }
84
+ /**
85
+ * Get an entity from the store by key
86
+ * @param key Key
87
+ * @returns Entity
88
+ */
89
+ get(key) {
90
+ return this.index.get(key);
91
+ }
92
+ /**
93
+ * Get all entities in the store
94
+ * @returns Array of entities
95
+ */
96
+ all() {
97
+ return this.entities$.value;
98
+ }
99
+ /**
100
+ * Set this store's entities
101
+ * @param entities Entities
102
+ */
103
+ load(entities, pristine = true) {
104
+ this._index = this.generateIndex(entities);
105
+ this._pristine = pristine;
106
+ this.next();
107
+ }
108
+ /**
109
+ * Clear the store's entities but keep the state and views intact.
110
+ * Views won't return any data but future data will be subject to the
111
+ * current views filter and sort
112
+ */
113
+ softClear() {
114
+ if (this.index && this.index.size > 0) {
115
+ this.index.clear();
116
+ this._pristine = true;
117
+ this.next();
118
+ }
119
+ else if (this.index) {
120
+ this.updateCount();
121
+ }
122
+ }
123
+ /**
124
+ * Clear the store's entities, state and views
125
+ */
126
+ clear() {
127
+ this.stateView.clear();
128
+ this.view.clear();
129
+ this.state.clear();
130
+ this.softClear();
131
+ }
132
+ destroy() {
133
+ this.stateView.destroy();
134
+ this.view.destroy();
135
+ this.clear();
136
+ }
137
+ /**
138
+ * Insert an entity into the store
139
+ * @param entity Entity
140
+ */
141
+ insert(entity) {
142
+ this.insertMany([entity]);
143
+ }
144
+ /**
145
+ * Insert many entities into the store
146
+ * @param entities Entities
147
+ */
148
+ insertMany(entities) {
149
+ entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
150
+ this._pristine = false;
151
+ this.next();
152
+ }
153
+ /**
154
+ * Update or insert an entity into the store
155
+ * @param entity Entity
156
+ */
157
+ update(entity) {
158
+ this.updateMany([entity]);
159
+ }
160
+ /**
161
+ * Update or insert many entities into the store
162
+ * @param entities Entities
163
+ */
164
+ updateMany(entities) {
165
+ entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
166
+ this._pristine = false;
167
+ this.next();
168
+ }
169
+ /**
170
+ * Add a strategy to this store
171
+ * @param strategy Entity store strategy
172
+ * @returns Entity store
173
+ */
174
+ addStrategy(strategy, activate = false) {
175
+ const existingStrategy = this.strategies.find((_strategy) => {
176
+ return strategy.constructor === _strategy.constructor;
177
+ });
178
+ if (existingStrategy !== undefined) {
179
+ throw new Error('A strategy of this type already exists on that EntityStore.');
180
+ }
181
+ this.strategies.push(strategy);
182
+ strategy.bindStore(this);
183
+ if (activate === true) {
184
+ strategy.activate();
185
+ }
186
+ return this;
187
+ }
188
+ /**
189
+ * Remove a strategy from this store
190
+ * @param strategy Entity store strategy
191
+ * @returns Entity store
192
+ */
193
+ removeStrategy(strategy) {
194
+ const index = this.strategies.indexOf(strategy);
195
+ if (index >= 0) {
196
+ this.strategies.splice(index, 1);
197
+ strategy.unbindStore(this);
198
+ }
199
+ return this;
200
+ }
201
+ /**
202
+ * Return strategies of a given type
203
+ * @param type Entity store strategy class
204
+ * @returns Strategies
205
+ */
206
+ getStrategyOfType(type) {
207
+ return this.strategies.find((strategy) => {
208
+ return strategy instanceof type;
209
+ });
210
+ }
211
+ /**
212
+ * Activate strategies of a given type
213
+ * @param type Entity store strategy class
214
+ */
215
+ activateStrategyOfType(type) {
216
+ const strategy = this.getStrategyOfType(type);
217
+ if (strategy !== undefined) {
218
+ strategy.activate();
219
+ }
220
+ }
221
+ /**
222
+ * Deactivate strategies of a given type
223
+ * @param type Entity store strategy class
224
+ */
225
+ deactivateStrategyOfType(type) {
226
+ const strategy = this.getStrategyOfType(type);
227
+ if (strategy !== undefined) {
228
+ strategy.deactivate();
229
+ }
230
+ }
231
+ /**
232
+ * Delete an entity from the store
233
+ * @param entity Entity
234
+ */
235
+ delete(entity) {
236
+ this.deleteMany([entity]);
237
+ }
238
+ /**
239
+ * Delete many entities from the store
240
+ * @param entities Entities
241
+ */
242
+ deleteMany(entities) {
243
+ entities.forEach((entity) => this.index.delete(this.getKey(entity)));
244
+ this._pristine = false;
245
+ this.next();
246
+ }
247
+ /**
248
+ * Generate a complete index of all the entities
249
+ * @param entities Entities
250
+ * @returns Index
251
+ */
252
+ generateIndex(entities) {
253
+ const entries = entities.map((entity) => [this.getKey(entity), entity]);
254
+ return new Map(entries);
255
+ }
256
+ /**
257
+ * Push the index's entities into the entities$ observable
258
+ */
259
+ next() {
260
+ this.entities$.next(Array.from(this.index.values()));
261
+ this.updateCount();
262
+ }
263
+ /**
264
+ * Update the store's count and empty
265
+ */
266
+ updateCount() {
267
+ const count = this.index.size;
268
+ const empty = count === 0;
269
+ this.count$.next(count);
270
+ this.empty$.next(empty);
271
+ }
272
+ /**
273
+ * Create the entity state manager
274
+ * @returns EntityStateManager
275
+ */
276
+ createStateManager() {
277
+ return new EntityStateManager({
278
+ getKey: this.getKey,
279
+ index: this.index
280
+ });
281
+ }
282
+ /**
283
+ * Create the data view
284
+ * @returns EntityView<E>
285
+ */
286
+ createDataView() {
287
+ return new EntityView(this.entities$);
288
+ }
289
+ /**
290
+ * Create the state view
291
+ * @returns EntityView<EntityRecord<E>>
292
+ */
293
+ createStateView() {
294
+ return new EntityView(this.view.all$())
295
+ .join({
296
+ source: this.state.change$,
297
+ reduce: (entity) => {
298
+ const key = this.getKey(entity);
299
+ const state = this.state.get(entity);
300
+ const currentRecord = this.stateView.get(key);
301
+ if (currentRecord !== undefined &&
302
+ currentRecord.entity === entity &&
303
+ this.statesAreTheSame(currentRecord.state, state)) {
304
+ return currentRecord;
305
+ }
306
+ const revision = currentRecord ? currentRecord.revision + 1 : 1;
307
+ const ref = `${key}-${revision}`;
308
+ return { entity, state, revision, ref };
309
+ }
310
+ })
311
+ .createIndex((record) => this.getKey(record.entity));
312
+ }
313
+ statesAreTheSame(currentState, newState) {
314
+ if (currentState === newState) {
315
+ return true;
316
+ }
317
+ const currentStateIsEmpty = Object.keys(currentState).length === 0;
318
+ const newStateIsEmpty = Object.keys(newState).length === 0;
319
+ return currentStateIsEmpty && newStateIsEmpty;
320
+ }
321
+ }
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUd2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFPcEM7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCOztPQUVHO0lBQ00sU0FBUyxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRWxEOztPQUVHO0lBQ00sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ00sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO0lBQ3JELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ00sS0FBSyxDQUEyQjtJQUV6Qzs7T0FFRztJQUNNLElBQUksQ0FBZ0I7SUFFN0I7O09BRUc7SUFDTSxTQUFTLENBQW9DO0lBRXREOztPQUVHO0lBQ00sTUFBTSxDQUFtQjtJQUVsQzs7T0FFRztJQUNNLFdBQVcsQ0FBMkI7SUFFL0M7O09BRUc7SUFDSCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNPLE1BQU0sQ0FBb0I7SUFFbEM7O09BRUc7SUFDSCxJ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QztnQkFFRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDMUMsQ0FBQztTQUNGLENBQUM7YUFDRCxXQUFXLENBQUMsQ0FBQyxNQUEwQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxZQUFlLEVBQUUsUUFBVztRQUNuRCxJQUFJLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUNuRSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDM0QsT0FBTyxtQkFBbUIsSUFBSSxlQUFlLENBQUM7SUFDaEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEVudGl0eUtleSwgRW50aXR5UmVjb3JkLCBFbnRpdHlTdGF0ZSB9IGZyb20gJy4vZW50aXR5LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0RW50aXR5SWQsIGdldEVudGl0eVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHkudXRpbHMnO1xuaW1wb3J0IHsgRW50aXR5U3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVN0b3JlU3RyYXRlZ3kgfSBmcm9tICcuL3N0cmF0ZWdpZXMvc3RyYXRlZ3knO1xuaW1wb3J0IHsgRW50aXR5VmlldyB9IGZyb20gJy4vdmlldyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U3RvcmVPcHRpb25zIHtcbiAgZ2V0S2V5PzogKGVudGl0eTogb2JqZWN0KSA9PiBFbnRpdHlLZXk7XG4gIGdldFByb3BlcnR5PzogKGVudGl0eTogb2JqZWN0LCBwcm9wZXJ0eTogc3RyaW5nKSA9PiBhbnk7XG59XG5cbi8qKlxuICogQW4gZW50aXR5IHN0b3JlIGNsYXNzIGhvbGRzIGFueSBudW1iZXIgb2YgZW50aXRpZXNcbiAqIGFzIHdlbGwgYXMgdGhlaXIgc3RhdGUuIEl0IGNhbiBiZSBvYnNlcnZlZCwgZmlsdGVyZWQgYW5kIHNvcnRlZCBhbmRcbiAqIHByb3ZpZGVzIG1ldGhvZHMgdG8gaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIGVudGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmU8XG4gIEUgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3QsXG4gIFMgZXh0ZW5kcyBFbnRpdHlTdGF0ZSA9IEVudGl0eVN0YXRlXG4+IHtcbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgdGhlIHJhdyBlbnRpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgZW50aXRpZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFW10+KFtdKTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBjb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50JC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eVxuICAgKi9cbiAgcmVhZG9ubHkgZW1wdHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVtcHR5JC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHkgc3RvcmUgc3RhdGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBFbnRpdHlTdGF0ZU1hbmFnZXI8RSwgUz47XG5cbiAgLyoqXG4gICAqIFZpZXcgb2YgYWxsIHRoZSBlbnRpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgdmlldzogRW50aXR5VmlldzxFPjtcblxuICAvKipcbiAgICogVmlldyBvZiBhbGwgdGhlIGVudGl0aWVzIGFuZCB0aGVpciBzdGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVWaWV3OiBFbnRpdHlWaWV3PEUsIEVudGl0eVJlY29yZDxFLCBTPj47XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBnZXQgYW4gZW50aXR5J3MgaWRcbiAgICovXG4gIHJlYWRvbmx5IGdldEtleTogKEUpID0+IEVudGl0eUtleTtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBuYW1lZCBwcm9wZXJ0eVxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UHJvcGVydHk6IChFLCBwcm9wOiBzdHJpbmcpID0+IGFueTtcblxuICAvKipcbiAgICogU3RvcmUgaW5kZXhcbiAgICovXG4gIGdldCBpbmRleCgpOiBNYXA8RW50aXR5S2V5LCBFPiB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG4gIHByaXZhdGUgX2luZGV4OiBNYXA8RW50aXR5S2V5LCBFPjtcblxuICAvKipcbiAgICogU3RvcmUgaW5kZXhcbiAgICovXG4gIGdldCBwcmlzdGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpc3RpbmU7XG4gIH1cbiAgcHJpdmF0ZSBfcHJpc3RpbmUgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTdHJhdGVnaWVzXG4gICAqL1xuICBwcml2YXRlIHN0cmF0ZWdpZXM6IEVudGl0eVN0b3JlU3RyYXRlZ3lbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGVudGl0aWVzOiBFW10sIG9wdGlvbnM6IEVudGl0eVN0b3JlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5nZXRLZXkgPSBvcHRpb25zLmdldEtleSA/IG9wdGlvbnMuZ2V0S2V5IDogZ2V0RW50aXR5SWQ7XG4gICAgdGhpcy5nZXRQcm9wZXJ0eSA9IG9wdGlvbnMuZ2V0UHJvcGVydHlcbiAgICAgID8gb3B0aW9ucy5nZXRQcm9wZXJ0eVxuICAgICAgOiBnZXRFbnRpdHlQcm9wZXJ0eTtcblxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmNyZWF0ZVN0YXRlTWFuYWdlcigpO1xuICAgIHRoaXMudmlldyA9IHRoaXMuY3JlYXRlRGF0YVZpZXcoKTtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuY3JlYXRlU3RhdGVWaWV3KCk7XG5cbiAgICB0aGlzLnZpZXcubGlmdCgpO1xuICAgIHRoaXMuc3RhdGVWaWV3LmxpZnQoKTtcblxuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWQoZW50aXRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbmRleCA9IHRoaXMuZ2VuZXJhdGVJbmRleChlbnRpdGllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBlbnRpdHkgZnJvbSB0aGUgc3RvcmUgYnkga2V5XG4gICAqIEBwYXJhbSBrZXkgS2V5XG4gICAqIEByZXR1cm5zIEVudGl0eVxuICAgKi9cbiAgZ2V0KGtleTogRW50aXR5S2V5KTogRSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnRpdGllcyBpbiB0aGUgc3RvcmVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZW50aXRpZXNcbiAgICovXG4gIGFsbCgpOiBFW10ge1xuICAgIHJldHVybiB0aGlzLmVudGl0aWVzJC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBzdG9yZSdzIGVudGl0aWVzXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xuICAgKi9cbiAgbG9hZChlbnRpdGllczogRVtdLCBwcmlzdGluZSA9IHRydWUpIHtcbiAgICB0aGlzLl9pbmRleCA9IHRoaXMuZ2VuZXJhdGVJbmRleChlbnRpdGllcyk7XG4gICAgdGhpcy5fcHJpc3RpbmUgPSBwcmlzdGluZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgc3RvcmUncyBlbnRpdGllcyBidXQga2VlcCB0aGUgc3RhdGUgYW5kIHZpZXdzIGludGFjdC5cbiAgICogVmlld3Mgd29uJ3QgcmV0dXJuIGFueSBkYXRhIGJ1dCBmdXR1cmUgZGF0YSB3aWxsIGJlIHN1YmplY3QgdG8gdGhlXG4gICAqIGN1cnJlbnQgdmlld3MgZmlsdGVyIGFuZCBzb3J0XG4gICAqL1xuICBzb2Z0Q2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaW5kZXggJiYgdGhpcy5pbmRleC5zaXplID4gMCkge1xuICAgICAgdGhpcy5pbmRleC5jbGVhcigpO1xuICAgICAgdGhpcy5fcHJpc3RpbmUgPSB0cnVlO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvdW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzdG9yZSdzIGVudGl0aWVzLCBzdGF0ZSBhbmQgdmlld3NcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuc3RhdGVWaWV3LmNsZWFyKCk7XG4gICAgdGhpcy52aWV3LmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZS5jbGVhcigpO1xuICAgIHRoaXMuc29mdENsZWFyKCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc3RhdGVWaWV3LmRlc3Ryb3koKTtcbiAgICB0aGlzLnZpZXcuZGVzdHJveSgpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYW4gZW50aXR5IGludG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBlbnRpdHkgRW50aXR5XG4gICAqL1xuICBpbnNlcnQoZW50aXR5OiBFKSB7XG4gICAgdGhpcy5pbnNlcnRNYW55KFtlbnRpdHldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgbWFueSBlbnRpdGllcyBpbnRvIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcbiAgICovXG4gIGluc2VydE1hbnkoZW50aXRpZXM6IEVbXSkge1xuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT5cbiAgICAgIHRoaXMuaW5kZXguc2V0KHRoaXMuZ2V0S2V5KGVudGl0eSksIGVudGl0eSlcbiAgICApO1xuICAgIHRoaXMuX3ByaXN0aW5lID0gZmFsc2U7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG9yIGluc2VydCBhbiBlbnRpdHkgaW50byB0aGUgc3RvcmVcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcbiAgICovXG4gIHVwZGF0ZShlbnRpdHk6IEUpIHtcbiAgICB0aGlzLnVwZGF0ZU1hbnkoW2VudGl0eV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBvciBpbnNlcnQgbWFueSBlbnRpdGllcyBpbnRvIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcbiAgICovXG4gIHVwZGF0ZU1hbnkoZW50aXRpZXM6IEVbXSkge1xuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT5cbiAgICAgIHRoaXMuaW5kZXguc2V0KHRoaXMuZ2V0S2V5KGVudGl0eSksIGVudGl0eSlcbiAgICApO1xuICAgIHRoaXMuX3ByaXN0aW5lID0gZmFsc2U7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc3RyYXRlZ3kgdG8gdGhpcyBzdG9yZVxuICAgKiBAcGFyYW0gc3RyYXRlZ3kgRW50aXR5IHN0b3JlIHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEVudGl0eSBzdG9yZVxuICAgKi9cbiAgYWRkU3RyYXRlZ3koc3RyYXRlZ3k6IEVudGl0eVN0b3JlU3RyYXRlZ3ksIGFjdGl2YXRlID0gZmFsc2UpOiBFbnRpdHlTdG9yZSB7XG4gICAgY29uc3QgZXhpc3RpbmdTdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5maW5kKFxuICAgICAgKF9zdHJhdGVneTogRW50aXR5U3RvcmVTdHJhdGVneSkgPT4ge1xuICAgICAgICByZXR1cm4gc3RyYXRlZ3kuY29uc3RydWN0b3IgPT09IF9zdHJhdGVneS5jb25zdHJ1Y3RvcjtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChleGlzdGluZ1N0cmF0ZWd5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Egc3RyYXRlZ3kgb2YgdGhpcyB0eXBlIGFscmVhZHkgZXhpc3RzIG9uIHRoYXQgRW50aXR5U3RvcmUuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmF0ZWdpZXMucHVzaChzdHJhdGVneSk7XG4gICAgc3RyYXRlZ3kuYmluZFN0b3JlKHRoaXMpO1xuXG4gICAgaWYgKGFjdGl2YXRlID09PSB0cnVlKSB7XG4gICAgICBzdHJhdGVneS5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHN0cmF0ZWd5IGZyb20gdGhpcyBzdG9yZVxuICAgKiBAcGFyYW0gc3RyYXRlZ3kgRW50aXR5IHN0b3JlIHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEVudGl0eSBzdG9yZVxuICAgKi9cbiAgcmVtb3ZlU3RyYXRlZ3koc3RyYXRlZ3k6IEVudGl0eVN0b3JlU3RyYXRlZ3kpOiBFbnRpdHlTdG9yZSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnN0cmF0ZWdpZXMuaW5kZXhPZihzdHJhdGVneSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuc3RyYXRlZ2llcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgc3RyYXRlZ3kudW5iaW5kU3RvcmUodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzdHJhdGVnaWVzIG9mIGEgZ2l2ZW4gdHlwZVxuICAgKiBAcGFyYW0gdHlwZSBFbnRpdHkgc3RvcmUgc3RyYXRlZ3kgY2xhc3NcbiAgICogQHJldHVybnMgU3RyYXRlZ2llc1xuICAgKi9cbiAgZ2V0U3RyYXRlZ3lPZlR5cGUodHlwZTogdHlwZW9mIEVudGl0eVN0b3JlU3RyYXRlZ3kpOiBFbnRpdHlTdG9yZVN0cmF0ZWd5IHtcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVnaWVzLmZpbmQoKHN0cmF0ZWd5OiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSA9PiB7XG4gICAgICByZXR1cm4gc3RyYXRlZ3kgaW5zdGFuY2VvZiB0eXBlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHN0cmF0ZWdpZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqIEBwYXJhbSB0eXBlIEVudGl0eSBzdG9yZSBzdHJhdGVneSBjbGFzc1xuICAgKi9cbiAgYWN0aXZhdGVTdHJhdGVneU9mVHlwZSh0eXBlOiB0eXBlb2YgRW50aXR5U3RvcmVTdHJhdGVneSkge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5nZXRTdHJhdGVneU9mVHlwZSh0eXBlKTtcbiAgICBpZiAoc3RyYXRlZ3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RyYXRlZ3kuYWN0aXZhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBzdHJhdGVnaWVzIG9mIGEgZ2l2ZW4gdHlwZVxuICAgKiBAcGFyYW0gdHlwZSBFbnRpdHkgc3RvcmUgc3RyYXRlZ3kgY2xhc3NcbiAgICovXG4gIGRlYWN0aXZhdGVTdHJhdGVneU9mVHlwZSh0eXBlOiB0eXBlb2YgRW50aXR5U3RvcmVTdHJhdGVneSkge1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5nZXRTdHJhdGVneU9mVHlwZSh0eXBlKTtcbiAgICBpZiAoc3RyYXRlZ3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RyYXRlZ3kuZGVhY3RpdmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IGZyb20gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBlbnRpdHkgRW50aXR5XG4gICAqL1xuICBkZWxldGUoZW50aXR5OiBFKSB7XG4gICAgdGhpcy5kZWxldGVNYW55KFtlbnRpdHldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbWFueSBlbnRpdGllcyBmcm9tIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcbiAgICovXG4gIGRlbGV0ZU1hbnkoZW50aXRpZXM6IEVbXSkge1xuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4gdGhpcy5pbmRleC5kZWxldGUodGhpcy5nZXRLZXkoZW50aXR5KSkpO1xuICAgIHRoaXMuX3ByaXN0aW5lID0gZmFsc2U7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBjb21wbGV0ZSBpbmRleCBvZiBhbGwgdGhlIGVudGl0aWVzXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xuICAgKiBAcmV0dXJucyBJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUluZGV4KGVudGl0aWVzOiBFW10pOiBNYXA8RW50aXR5S2V5LCBFPiB7XG4gICAgY29uc3QgZW50cmllcyA9IGVudGl0aWVzLm1hcCgoZW50aXR5OiBFKSA9PiBbdGhpcy5nZXRLZXkoZW50aXR5KSwgZW50aXR5XSk7XG4gICAgcmV0dXJuIG5ldyBNYXAoZW50cmllcyBhcyBbRW50aXR5S2V5LCBFXVtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIHRoZSBpbmRleCdzIGVudGl0aWVzIGludG8gdGhlIGVudGl0aWVzJCBvYnNlcnZhYmxlXG4gICAqL1xuICBwcml2YXRlIG5leHQoKSB7XG4gICAgdGhpcy5lbnRpdGllcyQubmV4dChBcnJheS5mcm9tKHRoaXMuaW5kZXgudmFsdWVzKCkpKTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzdG9yZSdzIGNvdW50IGFuZCBlbXB0eVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDb3VudCgpIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuaW5kZXguc2l6ZTtcbiAgICBjb25zdCBlbXB0eSA9IGNvdW50ID09PSAwO1xuICAgIHRoaXMuY291bnQkLm5leHQoY291bnQpO1xuICAgIHRoaXMuZW1wdHkkLm5leHQoZW1wdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgZW50aXR5IHN0YXRlIG1hbmFnZXJcbiAgICogQHJldHVybnMgRW50aXR5U3RhdGVNYW5hZ2VyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVN0YXRlTWFuYWdlcigpIHtcbiAgICByZXR1cm4gbmV3IEVudGl0eVN0YXRlTWFuYWdlcjxFLCBTPih7XG4gICAgICBnZXRLZXk6IHRoaXMuZ2V0S2V5LFxuICAgICAgaW5kZXg6IHRoaXMuaW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGRhdGEgdmlld1xuICAgKiBAcmV0dXJucyBFbnRpdHlWaWV3PEU+XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURhdGFWaWV3KCkge1xuICAgIHJldHVybiBuZXcgRW50aXR5VmlldzxFPih0aGlzLmVudGl0aWVzJCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBzdGF0ZSB2aWV3XG4gICAqIEByZXR1cm5zIEVudGl0eVZpZXc8RW50aXR5UmVjb3JkPEU+PlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0ZVZpZXcoKSB7XG4gICAgcmV0dXJuIG5ldyBFbnRpdHlWaWV3PEUsIEVudGl0eVJlY29yZDxFLCBTPj4odGhpcy52aWV3LmFsbCQoKSlcbiAgICAgIC5qb2luKHtcbiAgICAgICAgc291cmNlOiB0aGlzLnN0YXRlLmNoYW5nZSQsXG4gICAgICAgIHJlZHVjZTogKGVudGl0eTogRSk6IEVudGl0eVJlY29yZDxFLCBTPiA9PiB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZW50aXR5KTtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuZ2V0KGVudGl0eSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFJlY29yZCA9IHRoaXMuc3RhdGVWaWV3LmdldChrZXkpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY3VycmVudFJlY29yZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBjdXJyZW50UmVjb3JkLmVudGl0eSA9PT0gZW50aXR5ICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlc0FyZVRoZVNhbWUoY3VycmVudFJlY29yZC5zdGF0ZSwgc3RhdGUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlY29yZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXZpc2lvbiA9IGN1cnJlbnRSZWNvcmQgPyBjdXJyZW50UmVjb3JkLnJldmlzaW9uICsgMSA6IDE7XG4gICAgICAgICAgY29uc3QgcmVmID0gYCR7a2V5fS0ke3JldmlzaW9ufWA7XG4gICAgICAgICAgcmV0dXJuIHsgZW50aXR5LCBzdGF0ZSwgcmV2aXNpb24sIHJlZiB9O1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNyZWF0ZUluZGV4KChyZWNvcmQ6IEVudGl0eVJlY29yZDxFLCBTPikgPT4gdGhpcy5nZXRLZXkocmVjb3JkLmVudGl0eSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0ZXNBcmVUaGVTYW1lKGN1cnJlbnRTdGF0ZTogUywgbmV3U3RhdGU6IFMpOiBib29sZWFuIHtcbiAgICBpZiAoY3VycmVudFN0YXRlID09PSBuZXdTdGF0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFN0YXRlSXNFbXB0eSA9IE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSkubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IG5ld1N0YXRlSXNFbXB0eSA9IE9iamVjdC5rZXlzKG5ld1N0YXRlKS5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZUlzRW1wdHkgJiYgbmV3U3RhdGVJc0VtcHR5O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,80 @@
1
+ import { EntityStoreStrategy } from './strategy';
2
+ /**
3
+ * When active, this strategy filters a store's stateView to return
4
+ * selected entities only.
5
+ */
6
+ export class EntityStoreFilterCustomFuncStrategy extends EntityStoreStrategy {
7
+ options;
8
+ constructor(options) {
9
+ super(options);
10
+ this.options = options;
11
+ }
12
+ /**
13
+ * Store / filter ids map
14
+ */
15
+ filters = new Map();
16
+ /**
17
+ * Bind this strategy to a store and start filtering it
18
+ * @param store Entity store
19
+ */
20
+ bindStore(store) {
21
+ super.bindStore(store);
22
+ if (this.active === true) {
23
+ this.filterStore(store);
24
+ }
25
+ }
26
+ /**
27
+ * Unbind this strategy from a store and stop filtering it
28
+ * @param store Entity store
29
+ */
30
+ unbindStore(store) {
31
+ super.unbindStore(store);
32
+ if (this.active === true) {
33
+ this.unfilterStore(store);
34
+ }
35
+ }
36
+ /**
37
+ * Start filtering all stores
38
+ * @internal
39
+ */
40
+ doActivate() {
41
+ this.filterAll();
42
+ }
43
+ /**
44
+ * Stop filtering all stores
45
+ * @internal
46
+ */
47
+ doDeactivate() {
48
+ this.unfilterAll();
49
+ }
50
+ /**
51
+ * Filter all stores
52
+ */
53
+ filterAll() {
54
+ this.stores.forEach((store) => this.filterStore(store));
55
+ }
56
+ /**
57
+ * Unfilter all stores
58
+ */
59
+ unfilterAll() {
60
+ this.stores.forEach((store) => this.unfilterStore(store));
61
+ }
62
+ /**
63
+ * Filter a store and add it to the filters map
64
+ */
65
+ filterStore(store) {
66
+ this.filters.set(store, store.stateView.addFilter(this.options.filterClauseFunc));
67
+ }
68
+ /**
69
+ * Unfilter a store and delete it from the filters map
70
+ */
71
+ unfilterStore(store) {
72
+ const filterId = this.filters.get(store);
73
+ if (filterId === undefined) {
74
+ return;
75
+ }
76
+ store.stateView.removeFilter(filterId);
77
+ this.filters.delete(store);
78
+ }
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWN1c3RvbS1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9lbnRpdHkvc3JjL3NoYXJlZC9zdHJhdGVnaWVzL2ZpbHRlci1jdXN0b20tZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxtQ0FBb0MsU0FBUSxtQkFBbUI7SUFDcEQ7SUFBdEIsWUFBc0IsT0FBdUM7UUFDM0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBREssWUFBTyxHQUFQLE9BQU8sQ0FBZ0M7SUFFN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssT0FBTyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO0lBRWpEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxLQUFrQjtRQUMxQixLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEtBQWtCO1FBQzVCLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDTyxVQUFVO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sWUFBWTtRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBa0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVc7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLEtBQWtCO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNkLEtBQUssRUFDTCxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQ3pELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsS0FBa0I7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlTdG9yZVN0cmF0ZWd5RnVuY09wdGlvbnMgfSBmcm9tICcuLi9lbnRpdHkuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB7IEVudGl0eVN0b3JlU3RyYXRlZ3kgfSBmcm9tICcuL3N0cmF0ZWd5JztcblxuLyoqXG4gKiBXaGVuIGFjdGl2ZSwgdGhpcyBzdHJhdGVneSBmaWx0ZXJzIGEgc3RvcmUncyBzdGF0ZVZpZXcgdG8gcmV0dXJuXG4gKiBzZWxlY3RlZCBlbnRpdGllcyBvbmx5LlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmVGaWx0ZXJDdXN0b21GdW5jU3RyYXRlZ3kgZXh0ZW5kcyBFbnRpdHlTdG9yZVN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIG9wdGlvbnM6IEVudGl0eVN0b3JlU3RyYXRlZ3lGdW5jT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIC8gZmlsdGVyIGlkcyBtYXBcbiAgICovXG4gIHByaXZhdGUgZmlsdGVycyA9IG5ldyBNYXA8RW50aXR5U3RvcmUsIHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQmluZCB0aGlzIHN0cmF0ZWd5IHRvIGEgc3RvcmUgYW5kIHN0YXJ0IGZpbHRlcmluZyBpdFxuICAgKiBAcGFyYW0gc3RvcmUgRW50aXR5IHN0b3JlXG4gICAqL1xuICBiaW5kU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgc3VwZXIuYmluZFN0b3JlKHN0b3JlKTtcbiAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyU3RvcmUoc3RvcmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJpbmQgdGhpcyBzdHJhdGVneSBmcm9tIGEgc3RvcmUgYW5kIHN0b3AgZmlsdGVyaW5nIGl0XG4gICAqIEBwYXJhbSBzdG9yZSBFbnRpdHkgc3RvcmVcbiAgICovXG4gIHVuYmluZFN0b3JlKHN0b3JlOiBFbnRpdHlTdG9yZSkge1xuICAgIHN1cGVyLnVuYmluZFN0b3JlKHN0b3JlKTtcbiAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudW5maWx0ZXJTdG9yZShzdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGZpbHRlcmluZyBhbGwgc3RvcmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvQWN0aXZhdGUoKSB7XG4gICAgdGhpcy5maWx0ZXJBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGZpbHRlcmluZyBhbGwgc3RvcmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvRGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLnVuZmlsdGVyQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGFsbCBzdG9yZXNcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQWxsKCkge1xuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goKHN0b3JlOiBFbnRpdHlTdG9yZSkgPT4gdGhpcy5maWx0ZXJTdG9yZShzdG9yZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZmlsdGVyIGFsbCBzdG9yZXNcbiAgICovXG4gIHByaXZhdGUgdW5maWx0ZXJBbGwoKSB7XG4gICAgdGhpcy5zdG9yZXMuZm9yRWFjaCgoc3RvcmU6IEVudGl0eVN0b3JlKSA9PiB0aGlzLnVuZmlsdGVyU3RvcmUoc3RvcmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYSBzdG9yZSBhbmQgYWRkIGl0IHRvIHRoZSBmaWx0ZXJzIG1hcFxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJTdG9yZShzdG9yZTogRW50aXR5U3RvcmUpIHtcbiAgICB0aGlzLmZpbHRlcnMuc2V0KFxuICAgICAgc3RvcmUsXG4gICAgICBzdG9yZS5zdGF0ZVZpZXcuYWRkRmlsdGVyKHRoaXMub3B0aW9ucy5maWx0ZXJDbGF1c2VGdW5jKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVW5maWx0ZXIgYSBzdG9yZSBhbmQgZGVsZXRlIGl0IGZyb20gdGhlIGZpbHRlcnMgbWFwXG4gICAqL1xuICBwcml2YXRlIHVuZmlsdGVyU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgY29uc3QgZmlsdGVySWQgPSB0aGlzLmZpbHRlcnMuZ2V0KHN0b3JlKTtcbiAgICBpZiAoZmlsdGVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN0b3JlLnN0YXRlVmlldy5yZW1vdmVGaWx0ZXIoZmlsdGVySWQpO1xuICAgIHRoaXMuZmlsdGVycy5kZWxldGUoc3RvcmUpO1xuICB9XG59XG4iXX0=