@igo2/common 1.14.3 → 1.14.4
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.
- package/esm2020/igo2-common.mjs +4 -4
- package/esm2020/lib/action/action.module.mjs +26 -26
- package/esm2020/lib/action/actionbar/actionbar-item.component.mjs +251 -251
- package/esm2020/lib/action/actionbar/actionbar.component.mjs +369 -369
- package/esm2020/lib/action/actionbar/actionbar.module.mjs +56 -56
- package/esm2020/lib/action/index.mjs +3 -3
- package/esm2020/lib/action/shared/action.enums.mjs +7 -7
- package/esm2020/lib/action/shared/action.interfaces.mjs +1 -1
- package/esm2020/lib/action/shared/index.mjs +4 -4
- package/esm2020/lib/action/shared/store.mjs +7 -7
- package/esm2020/lib/backdrop/backdrop.component.mjs +25 -25
- package/esm2020/lib/backdrop/backdrop.module.mjs +24 -24
- package/esm2020/lib/backdrop/index.mjs +2 -2
- package/esm2020/lib/badge-icon/badge-icon.directive.mjs +140 -140
- package/esm2020/lib/badge-icon/badge-icon.module.mjs +25 -25
- package/esm2020/lib/badge-icon/index.mjs +2 -2
- package/esm2020/lib/clickout/clickout.directive.mjs +31 -31
- package/esm2020/lib/clickout/clickout.module.mjs +23 -23
- package/esm2020/lib/clickout/index.mjs +2 -2
- package/esm2020/lib/clone/clone.module.mjs +23 -23
- package/esm2020/lib/clone/clone.pipe.mjs +23 -23
- package/esm2020/lib/clone/index.mjs +2 -2
- package/esm2020/lib/collapsible/collapse.directive.mjs +54 -54
- package/esm2020/lib/collapsible/collapsible.component.mjs +56 -56
- package/esm2020/lib/collapsible/collapsible.module.mjs +26 -26
- package/esm2020/lib/collapsible/index.mjs +2 -2
- package/esm2020/lib/confirm-dialog/confirm-dialog.component.mjs +43 -43
- package/esm2020/lib/confirm-dialog/confirm-dialog.module.mjs +28 -28
- package/esm2020/lib/confirm-dialog/confirm-dialog.service.mjs +21 -21
- package/esm2020/lib/confirm-dialog/index.mjs +2 -2
- package/esm2020/lib/context-menu/context-menu.directive.mjs +102 -102
- package/esm2020/lib/context-menu/context-menu.module.mjs +24 -24
- package/esm2020/lib/context-menu/index.mjs +2 -2
- package/esm2020/lib/context-menu/long-press.directive.mjs +62 -62
- package/esm2020/lib/custom-html/custom-html.component.mjs +28 -28
- package/esm2020/lib/custom-html/custom-html.module.mjs +46 -46
- package/esm2020/lib/custom-html/custom-html.pipe.mjs +17 -17
- package/esm2020/lib/custom-html/index.mjs +2 -2
- package/esm2020/lib/dom/dom.interfaces.mjs +2 -2
- package/esm2020/lib/dom/dom.module.mjs +22 -22
- package/esm2020/lib/dom/dom.service.mjs +29 -29
- package/esm2020/lib/dom/index.mjs +3 -3
- package/esm2020/lib/drag-drop/drag-drop.directive.mjs +87 -87
- package/esm2020/lib/drag-drop/drag-drop.module.mjs +23 -23
- package/esm2020/lib/drag-drop/index.mjs +2 -2
- package/esm2020/lib/dynamic-component/dynamic-component.module.mjs +30 -30
- package/esm2020/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +122 -122
- package/esm2020/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +27 -27
- package/esm2020/lib/dynamic-component/index.mjs +3 -3
- package/esm2020/lib/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -2
- package/esm2020/lib/dynamic-component/shared/dynamic-component.mjs +173 -173
- package/esm2020/lib/dynamic-component/shared/dynamic-component.service.mjs +28 -28
- package/esm2020/lib/dynamic-component/shared/index.mjs +4 -4
- package/esm2020/lib/entity/entity-selector/entity-selector.component.mjs +193 -193
- package/esm2020/lib/entity/entity-selector/entity-selector.module.mjs +31 -31
- package/esm2020/lib/entity/entity-table/entity-table-row.directive.mjs +136 -136
- package/esm2020/lib/entity/entity-table/entity-table.component.mjs +1367 -1367
- package/esm2020/lib/entity/entity-table/entity-table.module.mjs +101 -101
- package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.component.mjs +131 -131
- package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.interface.mjs +1 -1
- package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.module.mjs +27 -27
- package/esm2020/lib/entity/entity.module.mjs +30 -30
- package/esm2020/lib/entity/index.mjs +5 -5
- package/esm2020/lib/entity/shared/entity.enums.mjs +28 -28
- package/esm2020/lib/entity/shared/entity.interfaces.mjs +1 -1
- package/esm2020/lib/entity/shared/entity.utils.mjs +66 -66
- package/esm2020/lib/entity/shared/index.mjs +10 -10
- package/esm2020/lib/entity/shared/state.mjs +190 -190
- package/esm2020/lib/entity/shared/store.mjs +287 -287
- package/esm2020/lib/entity/shared/strategies/filter-custom-function.mjs +78 -78
- package/esm2020/lib/entity/shared/strategies/filter-selection.mjs +83 -83
- package/esm2020/lib/entity/shared/strategies/index.mjs +4 -4
- package/esm2020/lib/entity/shared/strategies/strategy.mjs +74 -74
- package/esm2020/lib/entity/shared/transaction.mjs +315 -315
- package/esm2020/lib/entity/shared/view.mjs +314 -314
- package/esm2020/lib/entity/shared/watcher.mjs +119 -119
- package/esm2020/lib/flexible/flexible.component.mjs +147 -147
- package/esm2020/lib/flexible/flexible.module.mjs +23 -23
- package/esm2020/lib/flexible/flexible.type.mjs +2 -2
- package/esm2020/lib/flexible/index.mjs +3 -3
- package/esm2020/lib/form/form/form.component.mjs +116 -116
- package/esm2020/lib/form/form/form.module.mjs +39 -39
- package/esm2020/lib/form/form-field/form-field-select.component.mjs +126 -126
- package/esm2020/lib/form/form-field/form-field-text.component.mjs +103 -103
- package/esm2020/lib/form/form-field/form-field-textarea.component.mjs +104 -104
- package/esm2020/lib/form/form-field/form-field.component.mjs +71 -71
- package/esm2020/lib/form/form-field/form-field.module.mjs +73 -73
- package/esm2020/lib/form/form-field/index.mjs +4 -4
- package/esm2020/lib/form/form-group/form-group.component.mjs +104 -104
- package/esm2020/lib/form/form-group/form-group.module.mjs +39 -39
- package/esm2020/lib/form/form.module.mjs +48 -48
- package/esm2020/lib/form/index.mjs +4 -4
- package/esm2020/lib/form/shared/form-field-component.mjs +7 -7
- package/esm2020/lib/form/shared/form-field.service.mjs +28 -28
- package/esm2020/lib/form/shared/form.interfaces.mjs +1 -1
- package/esm2020/lib/form/shared/form.service.mjs +80 -80
- package/esm2020/lib/form/shared/form.utils.mjs +39 -39
- package/esm2020/lib/form/shared/index.mjs +6 -6
- package/esm2020/lib/home-button/home-button.component.mjs +30 -30
- package/esm2020/lib/home-button/home-button.module.mjs +40 -40
- package/esm2020/lib/home-button/index.mjs +2 -2
- package/esm2020/lib/image/image-error.directive.mjs +34 -34
- package/esm2020/lib/image/image.module.mjs +24 -24
- package/esm2020/lib/image/index.mjs +2 -2
- package/esm2020/lib/image/secure-image.pipe.mjs +59 -59
- package/esm2020/lib/interactive-tour/index.mjs +5 -5
- package/esm2020/lib/interactive-tour/interactive-tour.component.mjs +134 -134
- package/esm2020/lib/interactive-tour/interactive-tour.interface.mjs +1 -1
- package/esm2020/lib/interactive-tour/interactive-tour.loader.mjs +43 -43
- package/esm2020/lib/interactive-tour/interactive-tour.module.mjs +39 -39
- package/esm2020/lib/interactive-tour/interactive-tour.service.mjs +284 -284
- package/esm2020/lib/json-dialog/index.mjs +3 -3
- package/esm2020/lib/json-dialog/json-dialog.component.mjs +108 -108
- package/esm2020/lib/json-dialog/json-dialog.module.mjs +28 -28
- package/esm2020/lib/json-dialog/json-dialog.service.mjs +23 -23
- package/esm2020/lib/keyvalue/index.mjs +2 -2
- package/esm2020/lib/keyvalue/keyvalue.module.mjs +23 -23
- package/esm2020/lib/keyvalue/keyvalue.pipe.mjs +17 -17
- package/esm2020/lib/list/index.mjs +2 -2
- package/esm2020/lib/list/list-item.directive.mjs +164 -164
- package/esm2020/lib/list/list.component.mjs +261 -261
- package/esm2020/lib/list/list.module.mjs +28 -28
- package/esm2020/lib/panel/index.mjs +2 -2
- package/esm2020/lib/panel/panel.component.mjs +58 -58
- package/esm2020/lib/panel/panel.module.mjs +18 -18
- package/esm2020/lib/sidenav/index.mjs +2 -2
- package/esm2020/lib/sidenav/sidenav-shim.directive.mjs +54 -54
- package/esm2020/lib/sidenav/sidenav.module.mjs +23 -23
- package/esm2020/lib/spinner/index.mjs +2 -2
- package/esm2020/lib/spinner/spinner-activity.directive.mjs +46 -46
- package/esm2020/lib/spinner/spinner.component.mjs +34 -34
- package/esm2020/lib/spinner/spinner.module.mjs +20 -20
- package/esm2020/lib/stop-propagation/index.mjs +2 -2
- package/esm2020/lib/stop-propagation/stop-drop-propagation.directive.mjs +21 -21
- package/esm2020/lib/stop-propagation/stop-propagation.directive.mjs +20 -20
- package/esm2020/lib/stop-propagation/stop-propagation.module.mjs +24 -24
- package/esm2020/lib/table/index.mjs +6 -6
- package/esm2020/lib/table/table-action-color.enum.mjs +7 -7
- package/esm2020/lib/table/table-database.mjs +28 -28
- package/esm2020/lib/table/table-datasource.mjs +60 -60
- package/esm2020/lib/table/table-model.interface.mjs +1 -1
- package/esm2020/lib/table/table.component.mjs +296 -296
- package/esm2020/lib/table/table.module.mjs +66 -66
- package/esm2020/lib/tool/index.mjs +3 -3
- package/esm2020/lib/tool/shared/index.mjs +6 -6
- package/esm2020/lib/tool/shared/tool-component.mjs +8 -8
- package/esm2020/lib/tool/shared/tool.interface.mjs +1 -1
- package/esm2020/lib/tool/shared/tool.service.mjs +43 -43
- package/esm2020/lib/tool/shared/toolbox.enums.mjs +6 -6
- package/esm2020/lib/tool/shared/toolbox.mjs +178 -178
- package/esm2020/lib/tool/tool.module.mjs +31 -31
- package/esm2020/lib/tool/toolbox/toolbox.animation.mjs +9 -9
- package/esm2020/lib/tool/toolbox/toolbox.component.mjs +255 -255
- package/esm2020/lib/tool/toolbox/toolbox.module.mjs +35 -35
- package/esm2020/lib/widget/index.mjs +3 -3
- package/esm2020/lib/widget/shared/index.mjs +4 -4
- package/esm2020/lib/widget/shared/widget.interfaces.mjs +2 -2
- package/esm2020/lib/widget/shared/widget.mjs +4 -4
- package/esm2020/lib/widget/shared/widget.service.mjs +19 -19
- package/esm2020/lib/widget/widget-outlet/widget-outlet.component.mjs +115 -115
- package/esm2020/lib/widget/widget-outlet/widget-outlet.module.mjs +31 -31
- package/esm2020/lib/widget/widget.module.mjs +31 -31
- package/esm2020/lib/workspace/index.mjs +3 -3
- package/esm2020/lib/workspace/shared/index.mjs +4 -4
- package/esm2020/lib/workspace/shared/store.mjs +39 -39
- package/esm2020/lib/workspace/shared/workspace.interfaces.mjs +1 -1
- package/esm2020/lib/workspace/shared/workspace.mjs +116 -116
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.component.mjs +50 -50
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +31 -31
- package/esm2020/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +87 -87
- package/esm2020/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +31 -31
- package/esm2020/lib/workspace/workspace.module.mjs +26 -26
- package/esm2020/public_api.mjs +73 -73
- package/fesm2015/igo2-common.mjs +10003 -10003
- package/fesm2015/igo2-common.mjs.map +1 -1
- package/fesm2020/igo2-common.mjs +9306 -9306
- package/fesm2020/igo2-common.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/action/action.module.d.ts +8 -8
- package/lib/action/actionbar/actionbar-item.component.d.ts +78 -78
- package/lib/action/actionbar/actionbar.component.d.ts +146 -146
- package/lib/action/actionbar/actionbar.module.d.ts +20 -20
- package/lib/action/index.d.ts +2 -2
- package/lib/action/shared/action.enums.d.ts +5 -5
- package/lib/action/shared/action.interfaces.d.ts +17 -17
- package/lib/action/shared/index.d.ts +3 -3
- package/lib/action/shared/store.d.ts +8 -8
- package/lib/backdrop/backdrop.component.d.ts +9 -9
- package/lib/backdrop/backdrop.module.d.ts +10 -10
- package/lib/backdrop/index.d.ts +1 -1
- package/lib/badge-icon/badge-icon.directive.d.ts +36 -36
- package/lib/badge-icon/badge-icon.module.d.ts +11 -11
- package/lib/badge-icon/index.d.ts +1 -1
- package/lib/clickout/clickout.directive.d.ts +10 -10
- package/lib/clickout/clickout.module.d.ts +9 -9
- package/lib/clickout/index.d.ts +1 -1
- package/lib/clone/clone.module.d.ts +9 -9
- package/lib/clone/clone.pipe.d.ts +7 -7
- package/lib/clone/index.d.ts +1 -1
- package/lib/collapsible/collapse.directive.d.ts +19 -19
- package/lib/collapsible/collapsible.component.d.ts +13 -13
- package/lib/collapsible/collapsible.module.d.ts +12 -12
- package/lib/collapsible/index.d.ts +2 -2
- package/lib/confirm-dialog/confirm-dialog.component.d.ts +9 -9
- package/lib/confirm-dialog/confirm-dialog.module.d.ts +12 -12
- package/lib/confirm-dialog/confirm-dialog.service.d.ts +10 -10
- package/lib/confirm-dialog/index.d.ts +2 -2
- package/lib/context-menu/context-menu.directive.d.ts +21 -21
- package/lib/context-menu/context-menu.module.d.ts +10 -10
- package/lib/context-menu/index.d.ts +2 -2
- package/lib/context-menu/long-press.directive.d.ts +20 -20
- package/lib/custom-html/custom-html.component.d.ts +9 -9
- package/lib/custom-html/custom-html.module.d.ts +16 -16
- package/lib/custom-html/custom-html.pipe.d.ts +10 -10
- package/lib/custom-html/index.d.ts +2 -2
- package/lib/dom/dom.interfaces.d.ts +10 -10
- package/lib/dom/dom.module.d.ts +8 -8
- package/lib/dom/dom.service.d.ts +10 -10
- package/lib/dom/index.d.ts +2 -2
- package/lib/drag-drop/drag-drop.directive.d.ts +14 -14
- package/lib/drag-drop/drag-drop.module.d.ts +9 -9
- package/lib/drag-drop/index.d.ts +1 -1
- package/lib/dynamic-component/dynamic-component.module.d.ts +8 -8
- package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.d.ts +70 -70
- package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.d.ts +11 -11
- package/lib/dynamic-component/index.d.ts +2 -2
- package/lib/dynamic-component/shared/dynamic-component.d.ts +88 -88
- package/lib/dynamic-component/shared/dynamic-component.interfaces.d.ts +3 -3
- package/lib/dynamic-component/shared/dynamic-component.service.d.ts +18 -18
- package/lib/dynamic-component/shared/index.d.ts +3 -3
- package/lib/entity/entity-selector/entity-selector.component.d.ts +92 -92
- package/lib/entity/entity-selector/entity-selector.module.d.ts +13 -13
- package/lib/entity/entity-table/entity-table-row.directive.d.ts +69 -69
- package/lib/entity/entity-table/entity-table.component.d.ts +327 -327
- package/lib/entity/entity-table/entity-table.module.d.ts +29 -29
- package/lib/entity/entity-table-paginator/entity-table-paginator.component.d.ts +49 -49
- package/lib/entity/entity-table-paginator/entity-table-paginator.interface.d.ts +8 -8
- package/lib/entity/entity-table-paginator/entity-table-paginator.module.d.ts +11 -11
- package/lib/entity/entity.module.d.ts +10 -10
- package/lib/entity/index.d.ts +5 -5
- package/lib/entity/shared/entity.enums.d.ts +23 -23
- package/lib/entity/shared/entity.interfaces.d.ts +114 -114
- package/lib/entity/shared/entity.utils.d.ts +49 -49
- package/lib/entity/shared/index.d.ts +9 -9
- package/lib/entity/shared/state.d.ts +103 -103
- package/lib/entity/shared/store.d.ts +176 -176
- package/lib/entity/shared/strategies/filter-custom-function.d.ts +51 -51
- package/lib/entity/shared/strategies/filter-selection.d.ts +48 -48
- package/lib/entity/shared/strategies/index.d.ts +3 -3
- package/lib/entity/shared/strategies/strategy.d.ts +56 -56
- package/lib/entity/shared/transaction.d.ts +168 -168
- package/lib/entity/shared/view.d.ts +193 -193
- package/lib/entity/shared/watcher.d.ts +72 -72
- package/lib/flexible/flexible.component.d.ts +41 -41
- package/lib/flexible/flexible.module.d.ts +9 -9
- package/lib/flexible/flexible.type.d.ts +2 -2
- package/lib/flexible/index.d.ts +2 -2
- package/lib/form/form/form.component.d.ts +53 -53
- package/lib/form/form/form.module.d.ts +12 -12
- package/lib/form/form-field/form-field-select.component.d.ts +48 -48
- package/lib/form/form-field/form-field-text.component.d.ts +41 -41
- package/lib/form/form-field/form-field-textarea.component.d.ts +41 -41
- package/lib/form/form-field/form-field.component.d.ts +34 -34
- package/lib/form/form-field/form-field.module.d.ts +21 -21
- package/lib/form/form-field/index.d.ts +4 -4
- package/lib/form/form-group/form-group.component.d.ts +49 -49
- package/lib/form/form-group/form-group.module.d.ts +14 -14
- package/lib/form/form.module.d.ts +13 -13
- package/lib/form/index.d.ts +4 -4
- package/lib/form/shared/form-field-component.d.ts +1 -1
- package/lib/form/shared/form-field.service.d.ts +19 -19
- package/lib/form/shared/form.interfaces.d.ts +57 -57
- package/lib/form/shared/form.service.d.ts +15 -15
- package/lib/form/shared/form.utils.d.ts +11 -11
- package/lib/form/shared/index.d.ts +5 -5
- package/lib/home-button/home-button.component.d.ts +9 -9
- package/lib/home-button/home-button.module.d.ts +15 -15
- package/lib/home-button/index.d.ts +1 -1
- package/lib/image/image-error.directive.d.ts +11 -11
- package/lib/image/image.module.d.ts +10 -10
- package/lib/image/index.d.ts +2 -2
- package/lib/image/secure-image.pipe.d.ts +13 -13
- package/lib/interactive-tour/index.d.ts +4 -4
- package/lib/interactive-tour/interactive-tour.component.d.ts +30 -30
- package/lib/interactive-tour/interactive-tour.interface.d.ts +32 -32
- package/lib/interactive-tour/interactive-tour.loader.d.ts +18 -18
- package/lib/interactive-tour/interactive-tour.module.d.ts +12 -12
- package/lib/interactive-tour/interactive-tour.service.d.ts +29 -29
- package/lib/json-dialog/index.d.ts +2 -2
- package/lib/json-dialog/json-dialog.component.d.ts +13 -13
- package/lib/json-dialog/json-dialog.module.d.ts +13 -13
- package/lib/json-dialog/json-dialog.service.d.ts +10 -10
- package/lib/keyvalue/index.d.ts +1 -1
- package/lib/keyvalue/keyvalue.module.d.ts +9 -9
- package/lib/keyvalue/keyvalue.pipe.d.ts +7 -7
- package/lib/list/index.d.ts +2 -2
- package/lib/list/list-item.directive.d.ts +43 -43
- package/lib/list/list.component.d.ts +51 -51
- package/lib/list/list.module.d.ts +14 -14
- package/lib/panel/index.d.ts +1 -1
- package/lib/panel/panel.component.d.ts +10 -10
- package/lib/panel/panel.module.d.ts +8 -8
- package/lib/sidenav/index.d.ts +1 -1
- package/lib/sidenav/sidenav-shim.directive.d.ts +20 -20
- package/lib/sidenav/sidenav.module.d.ts +9 -9
- package/lib/spinner/index.d.ts +2 -2
- package/lib/spinner/spinner-activity.directive.d.ts +32 -32
- package/lib/spinner/spinner.component.d.ts +12 -12
- package/lib/spinner/spinner.module.d.ts +10 -10
- package/lib/stop-propagation/index.d.ts +2 -2
- package/lib/stop-propagation/stop-drop-propagation.directive.d.ts +6 -6
- package/lib/stop-propagation/stop-propagation.directive.d.ts +6 -6
- package/lib/stop-propagation/stop-propagation.module.d.ts +10 -10
- package/lib/table/index.d.ts +5 -5
- package/lib/table/table-action-color.enum.d.ts +5 -5
- package/lib/table/table-database.d.ts +10 -10
- package/lib/table/table-datasource.d.ts +17 -17
- package/lib/table/table-model.interface.d.ts +28 -28
- package/lib/table/table.component.d.ts +40 -40
- package/lib/table/table.module.d.ts +20 -20
- package/lib/tool/index.d.ts +2 -2
- package/lib/tool/shared/index.d.ts +5 -5
- package/lib/tool/shared/tool-component.d.ts +2 -2
- package/lib/tool/shared/tool.interface.d.ts +18 -18
- package/lib/tool/shared/tool.service.d.ts +30 -30
- package/lib/tool/shared/toolbox.d.ts +95 -95
- package/lib/tool/shared/toolbox.enums.d.ts +5 -5
- package/lib/tool/tool.module.d.ts +10 -10
- package/lib/tool/toolbox/toolbox.animation.d.ts +2 -2
- package/lib/tool/toolbox/toolbox.component.d.ts +127 -127
- package/lib/tool/toolbox/toolbox.module.d.ts +13 -13
- package/lib/widget/index.d.ts +2 -2
- package/lib/widget/shared/index.d.ts +3 -3
- package/lib/widget/shared/widget.d.ts +4 -4
- package/lib/widget/shared/widget.interfaces.d.ts +12 -12
- package/lib/widget/shared/widget.service.d.ts +10 -10
- package/lib/widget/widget-outlet/widget-outlet.component.d.ts +71 -71
- package/lib/widget/widget-outlet/widget-outlet.module.d.ts +12 -12
- package/lib/widget/widget.module.d.ts +8 -8
- package/lib/workspace/index.d.ts +3 -3
- package/lib/workspace/shared/index.d.ts +3 -3
- package/lib/workspace/shared/store.d.ts +20 -20
- package/lib/workspace/shared/workspace.d.ts +108 -108
- package/lib/workspace/shared/workspace.interfaces.d.ts +11 -11
- package/lib/workspace/workspace-selector/workspace-selector.component.d.ts +39 -39
- package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +12 -12
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +57 -57
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.d.ts +12 -12
- package/lib/workspace/workspace.module.d.ts +9 -9
- package/package.json +3 -3
- package/public_api.d.ts +70 -70
|
@@ -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
|
-
}
|
|
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
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==
|