@deck.gl-community/graph-layers 9.1.1 → 9.2.0-beta.3
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/dist/_deprecated/old-constants.d.ts +107 -0
- package/dist/_deprecated/old-constants.d.ts.map +1 -0
- package/dist/_deprecated/old-constants.js +111 -0
- package/dist/_deprecated/old-constants.js.map +1 -0
- package/dist/core/cache.d.ts +0 -1
- package/dist/core/cache.js +0 -1
- package/dist/core/constants.d.ts +12 -100
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +3 -44
- package/dist/core/constants.js.map +1 -1
- package/dist/core/graph-engine.d.ts +63 -20
- package/dist/core/graph-engine.d.ts.map +1 -1
- package/dist/core/graph-engine.js +163 -72
- package/dist/core/graph-engine.js.map +1 -1
- package/dist/core/graph-layout.d.ts +63 -32
- package/dist/core/graph-layout.d.ts.map +1 -1
- package/dist/core/graph-layout.js +118 -36
- package/dist/core/graph-layout.js.map +1 -1
- package/dist/core/interaction-manager.d.ts +7 -5
- package/dist/core/interaction-manager.d.ts.map +1 -1
- package/dist/core/interaction-manager.js +64 -20
- package/dist/core/interaction-manager.js.map +1 -1
- package/dist/graph/arrow-graph.d.ts +69 -0
- package/dist/graph/arrow-graph.d.ts.map +1 -0
- package/dist/graph/arrow-graph.js +513 -0
- package/dist/graph/arrow-graph.js.map +1 -0
- package/dist/graph/classic-graph.d.ts +169 -0
- package/dist/graph/classic-graph.d.ts.map +1 -0
- package/dist/graph/classic-graph.js +390 -0
- package/dist/graph/classic-graph.js.map +1 -0
- package/dist/graph/edge.d.ts +12 -12
- package/dist/graph/edge.d.ts.map +1 -1
- package/dist/graph/edge.js +3 -6
- package/dist/graph/edge.js.map +1 -1
- package/dist/graph/functions/arrow-utils.d.ts +6 -0
- package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
- package/dist/graph/functions/arrow-utils.js +67 -0
- package/dist/graph/functions/arrow-utils.js.map +1 -0
- package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
- package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
- package/dist/graph/functions/create-graph-from-data.js +12 -0
- package/dist/graph/functions/create-graph-from-data.js.map +1 -0
- package/dist/graph/graph-normalization.d.ts +10 -0
- package/dist/graph/graph-normalization.d.ts.map +1 -0
- package/dist/graph/graph-normalization.js +65 -0
- package/dist/graph/graph-normalization.js.map +1 -0
- package/dist/graph/graph.d.ts +62 -156
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +11 -301
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/node.d.ts +12 -13
- package/dist/graph/node.d.ts.map +1 -1
- package/dist/graph/node.js +5 -7
- package/dist/graph/node.js.map +1 -1
- package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
- package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/arrow-graph-data-builder.js +105 -0
- package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data-builder.d.ts +6 -0
- package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/graph-data-builder.js +1 -0
- package/dist/graph-data/graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data.d.ts +40 -0
- package/dist/graph-data/graph-data.d.ts.map +1 -0
- package/dist/graph-data/graph-data.js +11 -0
- package/dist/graph-data/graph-data.js.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.js +105 -0
- package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
- package/dist/graph-style-schema.cdn.d.ts +2 -0
- package/dist/graph-style-schema.cdn.js +2 -0
- package/dist/graph-style-schema.json +12 -0
- package/dist/index.cjs +7851 -3250
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +35 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -25
- package/dist/index.js.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -3
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
- package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +0 -1
- package/dist/layers/common-layers/marker-layer/atlas-data-url.js +0 -1
- package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +0 -1
- package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -3
- package/dist/layers/common-layers/marker-layer/marker-list.d.ts +2 -63
- package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -1
- package/dist/layers/common-layers/marker-layer/marker-list.js +1 -65
- package/dist/layers/common-layers/marker-layer/marker-list.js.map +1 -1
- package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +0 -1
- package/dist/layers/common-layers/marker-layer/marker-mapping.js +0 -1
- package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +0 -1
- package/dist/layers/common-layers/spline-layer/spline-layer.js +0 -1
- package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +0 -1
- package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +0 -1
- package/dist/layers/edge-attachment-helper.d.ts +15 -0
- package/dist/layers/edge-attachment-helper.d.ts.map +1 -0
- package/dist/layers/edge-attachment-helper.js +229 -0
- package/dist/layers/edge-attachment-helper.js.map +1 -0
- package/dist/layers/edge-layer.d.ts +1 -5
- package/dist/layers/edge-layer.d.ts.map +1 -1
- package/dist/layers/edge-layer.js +9 -11
- package/dist/layers/edge-layer.js.map +1 -1
- package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +4 -0
- package/dist/layers/edge-layers/arrow-2d-geometry.d.ts.map +1 -0
- package/dist/layers/edge-layers/arrow-2d-geometry.js +42 -0
- package/dist/layers/edge-layers/arrow-2d-geometry.js.map +1 -0
- package/dist/layers/edge-layers/curved-edge-layer.d.ts +1 -2
- package/dist/layers/edge-layers/curved-edge-layer.js +1 -2
- package/dist/layers/edge-layers/edge-arrow-layer.d.ts +21 -0
- package/dist/layers/edge-layers/edge-arrow-layer.d.ts.map +1 -0
- package/dist/layers/edge-layers/edge-arrow-layer.js +131 -0
- package/dist/layers/edge-layers/edge-arrow-layer.js.map +1 -0
- package/dist/layers/edge-layers/edge-label-layer.d.ts +1 -2
- package/dist/layers/edge-layers/edge-label-layer.js +1 -2
- package/dist/layers/edge-layers/flow-layer.d.ts +1 -2
- package/dist/layers/edge-layers/flow-layer.js +1 -2
- package/dist/layers/edge-layers/path-edge-layer.d.ts +0 -1
- package/dist/layers/edge-layers/path-edge-layer.js +0 -1
- package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +0 -1
- package/dist/layers/edge-layers/straight-line-edge-layer.js +0 -1
- package/dist/layers/graph-layer.d.ts +85 -29
- package/dist/layers/graph-layer.d.ts.map +1 -1
- package/dist/layers/graph-layer.js +635 -94
- package/dist/layers/graph-layer.js.map +1 -1
- package/dist/layers/node-layers/circle-layer.d.ts +0 -1
- package/dist/layers/node-layers/circle-layer.js +0 -1
- package/dist/layers/node-layers/image-layer.d.ts +0 -1
- package/dist/layers/node-layers/image-layer.js +0 -1
- package/dist/layers/node-layers/label-layer.d.ts +1 -2
- package/dist/layers/node-layers/label-layer.js +1 -2
- package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +0 -1
- package/dist/layers/node-layers/path-rounded-rectangle-layer.js +1 -2
- package/dist/layers/node-layers/rectangle-layer.d.ts +0 -1
- package/dist/layers/node-layers/rectangle-layer.js +0 -1
- package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +0 -1
- package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +0 -1
- package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +1 -2
- package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -3
- package/dist/layers/node-layers/zoomable-marker-layer.d.ts +1 -2
- package/dist/layers/node-layers/zoomable-marker-layer.js +1 -2
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts +102 -0
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -0
- package/dist/layouts/d3-dag/d3-dag-layout.js +531 -0
- package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -0
- package/dist/layouts/d3-force/d3-force-layout.d.ts +23 -11
- package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
- package/dist/layouts/d3-force/d3-force-layout.js +63 -29
- package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
- package/dist/layouts/d3-force/worker.d.ts +0 -1
- package/dist/layouts/d3-force/worker.js +0 -1
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts +25 -20
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/force-multi-graph-layout.js +60 -47
- package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.d.ts +26 -20
- package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.js +43 -39
- package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
- package/dist/layouts/experimental/radial-layout.d.ts +20 -12
- package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/radial-layout.js +41 -19
- package/dist/layouts/experimental/radial-layout.js.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts +15 -12
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.js +71 -59
- package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
- package/dist/layouts/gpu-force/worker.d.ts +0 -1
- package/dist/layouts/gpu-force/worker.js +0 -1
- package/dist/layouts/simple-layout.d.ts +21 -31
- package/dist/layouts/simple-layout.d.ts.map +1 -1
- package/dist/layouts/simple-layout.js +33 -26
- package/dist/layouts/simple-layout.js.map +1 -1
- package/dist/loaders/dot-graph-loader.d.ts +25 -0
- package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
- package/dist/loaders/dot-graph-loader.js +668 -0
- package/dist/loaders/dot-graph-loader.js.map +1 -0
- package/dist/loaders/json-graph-loader.d.ts +6 -0
- package/dist/loaders/json-graph-loader.d.ts.map +1 -0
- package/dist/loaders/json-graph-loader.js +31 -0
- package/dist/loaders/json-graph-loader.js.map +1 -0
- package/dist/loaders/parsers/edge-parsers.d.ts +2 -0
- package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
- package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +2 -3
- package/dist/loaders/parsers/edge-parsers.js.map +1 -0
- package/dist/loaders/parsers/node-parsers.d.ts +2 -0
- package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
- package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +2 -3
- package/dist/loaders/parsers/node-parsers.js.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.js +78 -0
- package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
- package/dist/style/graph-layer-stylesheet.d.ts +34 -0
- package/dist/style/graph-layer-stylesheet.d.ts.map +1 -0
- package/dist/style/graph-layer-stylesheet.js +39 -0
- package/dist/style/graph-layer-stylesheet.js.map +1 -0
- package/dist/style/graph-style-accessor-map.d.ts +93 -0
- package/dist/style/graph-style-accessor-map.d.ts.map +1 -0
- package/dist/style/graph-style-accessor-map.js +93 -0
- package/dist/style/graph-style-accessor-map.js.map +1 -0
- package/dist/style/graph-style-engine.d.ts +12 -0
- package/dist/style/graph-style-engine.d.ts.map +1 -0
- package/dist/style/graph-style-engine.js +164 -0
- package/dist/style/graph-style-engine.js.map +1 -0
- package/dist/style/graph-stylesheet.schema.d.ts +310 -0
- package/dist/style/graph-stylesheet.schema.d.ts.map +1 -0
- package/dist/style/graph-stylesheet.schema.js +237 -0
- package/dist/style/graph-stylesheet.schema.js.map +1 -0
- package/dist/style/style-property.d.ts +2 -3
- package/dist/style/style-property.d.ts.map +1 -1
- package/dist/style/style-property.js +224 -48
- package/dist/style/style-property.js.map +1 -1
- package/dist/style/stylesheet-engine.d.ts +33 -0
- package/dist/style/stylesheet-engine.d.ts.map +1 -0
- package/dist/style/stylesheet-engine.js +121 -0
- package/dist/style/stylesheet-engine.js.map +1 -0
- package/dist/utils/collapsed-chains.d.ts +17 -0
- package/dist/utils/collapsed-chains.d.ts.map +1 -0
- package/dist/utils/collapsed-chains.js +192 -0
- package/dist/utils/collapsed-chains.js.map +1 -0
- package/dist/utils/layer-utils.d.ts +0 -1
- package/dist/utils/layer-utils.d.ts.map +1 -1
- package/dist/utils/layer-utils.js +0 -1
- package/dist/utils/log.d.ts +2 -1
- package/dist/utils/log.d.ts.map +1 -1
- package/dist/utils/log.js +12 -2
- package/dist/utils/log.js.map +1 -1
- package/dist/utils/node-boundary.d.ts +10 -0
- package/dist/utils/node-boundary.d.ts.map +1 -0
- package/dist/utils/node-boundary.js +130 -0
- package/dist/utils/node-boundary.js.map +1 -0
- package/dist/utils/polygon-calculations.d.ts +0 -1
- package/dist/utils/polygon-calculations.js +0 -1
- package/dist/utils/rank-grid.d.ts +30 -0
- package/dist/utils/rank-grid.d.ts.map +1 -0
- package/dist/utils/rank-grid.js +306 -0
- package/dist/utils/rank-grid.js.map +1 -0
- package/package.json +25 -13
- package/src/_deprecated/old-constants.ts +122 -0
- package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
- package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
- package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
- package/src/core/constants.ts +21 -43
- package/src/core/graph-engine.ts +212 -80
- package/src/core/graph-layout.ts +175 -47
- package/src/core/interaction-manager.ts +93 -33
- package/src/graph/arrow-graph.ts +648 -0
- package/src/graph/classic-graph.ts +447 -0
- package/src/graph/edge.ts +13 -13
- package/src/graph/functions/arrow-utils.ts +72 -0
- package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
- package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
- package/src/graph/functions/create-graph-from-data.ts +16 -0
- package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
- package/src/graph/graph-normalization.ts +87 -0
- package/src/graph/graph.ts +68 -339
- package/src/graph/node.ts +15 -15
- package/src/graph/tabular-graph.ts.disabled +761 -0
- package/src/graph-data/arrow-graph-data-builder.ts +165 -0
- package/src/graph-data/graph-data-builder.ts +7 -0
- package/src/graph-data/graph-data.ts +57 -0
- package/src/graph-data/plain-graph-data-builder.ts +132 -0
- package/src/index.ts +82 -17
- package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
- package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
- package/src/layers/common-layers/marker-layer/marker-list.ts +62 -64
- package/src/layers/edge-attachment-helper.ts +361 -0
- package/src/layers/edge-layer.ts +6 -7
- package/src/layers/edge-layers/arrow-2d-geometry.ts +51 -0
- package/src/layers/edge-layers/edge-arrow-layer.ts +171 -0
- package/src/layers/graph-layer.ts +928 -130
- package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
- package/src/layouts/d3-dag/d3-dag-layout.ts +739 -0
- package/src/layouts/d3-force/d3-force-layout.ts +83 -39
- package/src/layouts/experimental/force-multi-graph-layout.ts +72 -57
- package/src/layouts/experimental/hive-plot-layout.ts +60 -49
- package/src/layouts/experimental/radial-layout.ts +57 -26
- package/src/layouts/gpu-force/gpu-force-layout.ts +86 -72
- package/src/layouts/simple-layout.ts +51 -52
- package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
- package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
- package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +4 -4
- package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +9 -9
- package/src/loaders/dot-graph-loader.ts +860 -0
- package/src/loaders/json-graph-loader.ts +48 -0
- package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
- package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +3 -3
- package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +3 -3
- package/src/loaders/parsers/parse-json-graph.ts +134 -0
- package/src/style/graph-layer-stylesheet.ts +99 -0
- package/src/style/graph-style-accessor-map.ts +103 -0
- package/src/style/graph-style-engine.ts +232 -0
- package/src/style/graph-stylesheet.schema.ts +344 -0
- package/src/style/style-property.ts +314 -51
- package/src/style/stylesheet-engine.ts +168 -0
- package/src/utils/collapsed-chains.ts +255 -0
- package/src/utils/log.ts +15 -1
- package/src/utils/node-boundary.ts +238 -0
- package/src/utils/rank-grid.ts +426 -0
- package/dist/loaders/create-graph.d.ts +0 -13
- package/dist/loaders/create-graph.d.ts.map +0 -1
- package/dist/loaders/create-graph.js +0 -39
- package/dist/loaders/create-graph.js.map +0 -1
- package/dist/loaders/edge-parsers.d.ts +0 -3
- package/dist/loaders/edge-parsers.d.ts.map +0 -1
- package/dist/loaders/edge-parsers.js.map +0 -1
- package/dist/loaders/json-loader.d.ts +0 -8
- package/dist/loaders/json-loader.d.ts.map +0 -1
- package/dist/loaders/json-loader.js +0 -17
- package/dist/loaders/json-loader.js.map +0 -1
- package/dist/loaders/node-parsers.d.ts +0 -3
- package/dist/loaders/node-parsers.d.ts.map +0 -1
- package/dist/loaders/node-parsers.js.map +0 -1
- package/dist/loaders/simple-json-graph-loader.d.ts +0 -12
- package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
- package/dist/loaders/simple-json-graph-loader.js +0 -21
- package/dist/loaders/simple-json-graph-loader.js.map +0 -1
- package/dist/loaders/table-graph-loader.d.ts +0 -17
- package/dist/loaders/table-graph-loader.d.ts.map +0 -1
- package/dist/loaders/table-graph-loader.js +0 -92
- package/dist/loaders/table-graph-loader.js.map +0 -1
- package/dist/style/style-sheet.d.ts +0 -11
- package/dist/style/style-sheet.d.ts.map +0 -1
- package/dist/style/style-sheet.js +0 -253
- package/dist/style/style-sheet.js.map +0 -1
- package/dist/widgets/long-press-button.d.ts +0 -13
- package/dist/widgets/long-press-button.d.ts.map +0 -1
- package/dist/widgets/long-press-button.js +0 -32
- package/dist/widgets/long-press-button.js.map +0 -1
- package/dist/widgets/view-control-widget.d.ts +0 -78
- package/dist/widgets/view-control-widget.d.ts.map +0 -1
- package/dist/widgets/view-control-widget.js +0 -195
- package/dist/widgets/view-control-widget.js.map +0 -1
- package/src/loaders/json-loader.ts +0 -19
- package/src/style/style-sheet.ts +0 -277
- package/src/widgets/long-press-button.tsx +0 -50
- package/src/widgets/view-control-widget.tsx +0 -337
package/src/core/graph-layout.ts
CHANGED
|
@@ -2,37 +2,74 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
|
|
7
|
-
import type {
|
|
5
|
+
import type {Bounds2D} from '@math.gl/types';
|
|
6
|
+
|
|
7
|
+
import type {Graph, NodeInterface, EdgeInterface} from '../graph/graph';
|
|
8
8
|
|
|
9
9
|
import isEqual from 'lodash.isequal';
|
|
10
|
-
import {
|
|
10
|
+
import {log} from '../utils/log';
|
|
11
11
|
|
|
12
12
|
// the status of the layout
|
|
13
|
-
export type GraphLayoutState = '
|
|
13
|
+
export type GraphLayoutState = 'init' | 'start' | 'calculating' | 'done' | 'error';
|
|
14
|
+
|
|
15
|
+
export type GraphLayoutEventDetail = {
|
|
16
|
+
bounds: Bounds2D | null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type GraphLayoutProps = {
|
|
20
|
+
onLayoutStart?: (detail?: GraphLayoutEventDetail) => void;
|
|
21
|
+
onLayoutChange?: (detail?: GraphLayoutEventDetail) => void;
|
|
22
|
+
onLayoutDone?: (detail?: GraphLayoutEventDetail) => void;
|
|
23
|
+
onLayoutError?: (error?: unknown) => void;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
export abstract class GraphLayout<
|
|
28
|
+
PropsT extends GraphLayoutProps = GraphLayoutProps
|
|
29
|
+
> {
|
|
30
|
+
static defaultProps: Readonly<Required<GraphLayoutProps>> = {
|
|
31
|
+
onLayoutStart: undefined,
|
|
32
|
+
onLayoutChange: undefined,
|
|
33
|
+
onLayoutDone: undefined,
|
|
34
|
+
onLayoutError: undefined
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
get [Symbol.toStringTag](): string {
|
|
38
|
+
return 'GraphLayout';
|
|
39
|
+
}
|
|
14
40
|
|
|
15
|
-
|
|
41
|
+
/** Extra configuration props of the layout. */
|
|
42
|
+
protected props: Required<PropsT>;
|
|
16
43
|
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
protected _options: OptionsT;
|
|
44
|
+
/**
|
|
45
|
+
* Last computed layout bounds in local layout coordinates.
|
|
46
|
+
*
|
|
47
|
+
* Subclasses should update this value by overriding {@link _updateBounds}
|
|
48
|
+
* so it reflects the latest geometry before layout lifecycle events fire.
|
|
49
|
+
*/
|
|
50
|
+
protected _bounds: Bounds2D | null = null;
|
|
25
51
|
|
|
26
52
|
public version = 0;
|
|
27
|
-
public state: GraphLayoutState = '
|
|
53
|
+
public state: GraphLayoutState = 'init';
|
|
28
54
|
|
|
29
55
|
/**
|
|
30
56
|
* Constructor of GraphLayout
|
|
31
|
-
* @param
|
|
57
|
+
* @param props extra configuration props of the layout
|
|
32
58
|
*/
|
|
33
|
-
constructor(
|
|
34
|
-
|
|
35
|
-
|
|
59
|
+
constructor(props: PropsT, defaultProps?: Required<PropsT>) {
|
|
60
|
+
this.props = {
|
|
61
|
+
...GraphLayout.defaultProps,
|
|
62
|
+
...defaultProps,
|
|
63
|
+
...props
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getProps(): PropsT {
|
|
68
|
+
return {...this.props};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
setProps(props: Partial<PropsT>): void {
|
|
72
|
+
this.props = {...this.props, ...props};
|
|
36
73
|
}
|
|
37
74
|
|
|
38
75
|
/**
|
|
@@ -44,31 +81,20 @@ export class GraphLayout<
|
|
|
44
81
|
if (!layout || !(layout instanceof GraphLayout)) {
|
|
45
82
|
return false;
|
|
46
83
|
}
|
|
47
|
-
return this
|
|
84
|
+
return this instanceof layout.constructor && isEqual(this.props, layout.props);
|
|
48
85
|
}
|
|
49
86
|
|
|
50
|
-
|
|
87
|
+
// Accessors
|
|
51
88
|
|
|
52
|
-
/** first time to pass the graph data into this layout */
|
|
53
|
-
initializeGraph(graph: Graph) {}
|
|
54
|
-
/** update the existing graph */
|
|
55
|
-
updateGraph(graph: Graph) {}
|
|
56
|
-
/** start the layout calculation */
|
|
57
|
-
start() {}
|
|
58
|
-
/** update the layout calculation */
|
|
59
|
-
update() {}
|
|
60
|
-
/** resume the layout calculation */
|
|
61
|
-
resume() {}
|
|
62
|
-
/** stop the layout calculation */
|
|
63
|
-
stop() {}
|
|
64
89
|
/** access the position of the node in the layout */
|
|
65
|
-
getNodePosition(node:
|
|
90
|
+
getNodePosition(node: NodeInterface): [number, number] {
|
|
66
91
|
return [0, 0];
|
|
67
92
|
}
|
|
93
|
+
|
|
68
94
|
/** access the layout information of the edge */
|
|
69
|
-
getEdgePosition(edge:
|
|
95
|
+
getEdgePosition(edge: EdgeInterface) {
|
|
70
96
|
return {
|
|
71
|
-
type:
|
|
97
|
+
type: 'line',
|
|
72
98
|
sourcePosition: [0, 0],
|
|
73
99
|
targetPosition: [0, 0],
|
|
74
100
|
controlPoints: []
|
|
@@ -81,66 +107,168 @@ export class GraphLayout<
|
|
|
81
107
|
* @param x x coordinate
|
|
82
108
|
* @param y y coordinate
|
|
83
109
|
*/
|
|
84
|
-
lockNodePosition(node:
|
|
110
|
+
lockNodePosition(node: NodeInterface, x: number, y: number) {}
|
|
85
111
|
|
|
86
112
|
/**
|
|
87
113
|
* Unlock the node, the node will be able to move freely.
|
|
88
114
|
* @param {Object} node Node to be unlocked
|
|
89
115
|
*/
|
|
90
|
-
unlockNodePosition(node:
|
|
116
|
+
unlockNodePosition(node: NodeInterface) {}
|
|
117
|
+
|
|
118
|
+
/** Returns the last computed layout bounds, if available. */
|
|
119
|
+
getBounds(): Bounds2D | null {
|
|
120
|
+
return this._bounds;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** virtual functions: will be implemented in the child class */
|
|
124
|
+
|
|
125
|
+
/** first time to pass the graph data into this layout */
|
|
126
|
+
abstract initializeGraph(graph: Graph): void;
|
|
127
|
+
/** update the existing graph */
|
|
128
|
+
abstract updateGraph(graph: Graph): void;
|
|
129
|
+
/** start the layout calculation */
|
|
130
|
+
abstract start();
|
|
131
|
+
/** update the layout calculation */
|
|
132
|
+
abstract update();
|
|
133
|
+
/** resume the layout calculation */
|
|
134
|
+
abstract resume();
|
|
135
|
+
/** stop the layout calculation */
|
|
136
|
+
abstract stop();
|
|
137
|
+
|
|
91
138
|
|
|
92
139
|
// INTERNAL METHODS
|
|
93
140
|
|
|
94
|
-
|
|
141
|
+
/** Hook for subclasses to update bounds prior to emitting events. */
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
143
|
+
protected _updateBounds(): void {}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Utility for subclasses to derive layout bounds from an iterable of [x, y] positions.
|
|
147
|
+
* @param positions Iterable of node positions.
|
|
148
|
+
* @returns Layout bounds for the supplied positions or `null` if none are finite.
|
|
149
|
+
*/
|
|
150
|
+
protected _calculateBounds(
|
|
151
|
+
positions: Iterable<Readonly<[number, number]> | null | undefined>
|
|
152
|
+
): Bounds2D | null {
|
|
153
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
154
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
155
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
156
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
157
|
+
|
|
158
|
+
for (const position of positions) {
|
|
159
|
+
if (!position) {
|
|
160
|
+
// eslint-disable-next-line no-continue
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const [x, y] = position;
|
|
164
|
+
if (!Number.isFinite(x) || !Number.isFinite(y)) {
|
|
165
|
+
// eslint-disable-next-line no-continue
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
minX = Math.min(minX, x);
|
|
170
|
+
maxX = Math.max(maxX, x);
|
|
171
|
+
minY = Math.min(minY, y);
|
|
172
|
+
maxY = Math.max(maxY, y);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (minX === Number.POSITIVE_INFINITY) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return [
|
|
180
|
+
[minX, minY],
|
|
181
|
+
[maxX, maxY]
|
|
182
|
+
];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Attempt to coerce an arbitrary value into a finite 2D point.
|
|
187
|
+
* @param value Candidate value that may represent a position.
|
|
188
|
+
* @returns Finite [x, y] tuple or null if the value cannot be interpreted.
|
|
189
|
+
*/
|
|
190
|
+
protected _normalizePosition(value: unknown): [number, number] | null {
|
|
191
|
+
if (Array.isArray(value) && value.length >= 2) {
|
|
192
|
+
const [x, y] = value as [unknown, unknown];
|
|
193
|
+
if (this._isFiniteNumber(x) && this._isFiniteNumber(y)) {
|
|
194
|
+
return [x, y];
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (value && typeof value === 'object') {
|
|
200
|
+
const {x, y} = value as {x?: unknown; y?: unknown};
|
|
201
|
+
if (this._isFiniteNumber(x) && this._isFiniteNumber(y)) {
|
|
202
|
+
return [x, y];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private _isFiniteNumber(value: unknown): value is number {
|
|
210
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
protected _updateState(state: GraphLayoutState) {
|
|
95
214
|
this.state = state;
|
|
96
215
|
this.version += 1;
|
|
97
216
|
}
|
|
98
217
|
|
|
99
218
|
/** @fires GraphLayout#onLayoutStart */
|
|
100
219
|
protected _onLayoutStart = (): void => {
|
|
101
|
-
|
|
220
|
+
log.log(0, `GraphLayout(${this}): start`)();
|
|
221
|
+
this._updateBounds();
|
|
222
|
+
this._updateState('calculating');
|
|
102
223
|
|
|
103
224
|
/**
|
|
104
225
|
* Layout calculation start.
|
|
105
226
|
* @event GraphLayout#onLayoutChange
|
|
106
227
|
* @type {CustomEvent}
|
|
107
228
|
*/
|
|
108
|
-
this.
|
|
229
|
+
const detail: GraphLayoutEventDetail = {bounds: this._bounds};
|
|
230
|
+
this.props.onLayoutStart?.(detail);
|
|
109
231
|
};
|
|
110
232
|
|
|
111
233
|
/** @fires GraphLayout#onLayoutChange */
|
|
112
234
|
protected _onLayoutChange = (): void => {
|
|
113
|
-
|
|
235
|
+
log.log(0, `GraphLayout(${this}): update`)();
|
|
236
|
+
this._updateBounds();
|
|
237
|
+
this._updateState('calculating');
|
|
114
238
|
|
|
115
239
|
/**
|
|
116
240
|
* Layout calculation iteration.
|
|
117
241
|
* @event GraphLayout#onLayoutChange
|
|
118
242
|
* @type {CustomEvent}
|
|
119
243
|
*/
|
|
120
|
-
this.
|
|
244
|
+
const detail: GraphLayoutEventDetail = {bounds: this._bounds};
|
|
245
|
+
this.props.onLayoutChange?.(detail);
|
|
121
246
|
};
|
|
122
247
|
|
|
123
248
|
/** @fires GraphLayout#onLayoutDone */
|
|
124
249
|
protected _onLayoutDone = (): void => {
|
|
125
|
-
|
|
250
|
+
log.log(0, `GraphLayout(${this}): end`)();
|
|
251
|
+
this._updateBounds();
|
|
252
|
+
this._updateState('done');
|
|
126
253
|
|
|
127
254
|
/**
|
|
128
255
|
* Layout calculation is done.
|
|
129
256
|
* @event GraphLayout#onLayoutDone
|
|
130
257
|
* @type {CustomEvent}
|
|
131
258
|
*/
|
|
132
|
-
this.
|
|
259
|
+
const detail: GraphLayoutEventDetail = {bounds: this._bounds};
|
|
260
|
+
this.props.onLayoutDone?.(detail);
|
|
133
261
|
};
|
|
134
262
|
|
|
135
263
|
/** @fires GraphLayout#onLayoutError */
|
|
136
264
|
protected _onLayoutError = (): void => {
|
|
137
|
-
this._updateState('
|
|
265
|
+
this._updateState('error');
|
|
138
266
|
|
|
139
267
|
/**
|
|
140
268
|
* Layout calculation went wrong.
|
|
141
269
|
* @event GraphLayout#onLayoutError
|
|
142
270
|
* @type {CustomEvent}
|
|
143
271
|
*/
|
|
144
|
-
this.
|
|
272
|
+
this.props.onLayoutError?.();
|
|
145
273
|
};
|
|
146
274
|
}
|
|
@@ -2,33 +2,48 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {Edge} from '../graph/edge';
|
|
7
|
-
import {Node} from '../graph/node';
|
|
5
|
+
import type {EdgeState, NodeState} from './constants';
|
|
8
6
|
import {GraphEngine} from './graph-engine';
|
|
7
|
+
import type {EdgeInterface, NodeInterface} from '../graph/graph';
|
|
8
|
+
import {log} from '../utils/log';
|
|
9
|
+
import {
|
|
10
|
+
resolveChainInteractionSource,
|
|
11
|
+
type ChainInteractionSource
|
|
12
|
+
} from '../utils/collapsed-chains';
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
export {resolveChainInteractionSource};
|
|
15
|
+
export type {ChainInteractionSource};
|
|
16
|
+
|
|
17
|
+
export function shouldToggleCollapsedChain(
|
|
18
|
+
isCollapsed: boolean,
|
|
19
|
+
source: ChainInteractionSource
|
|
20
|
+
): boolean {
|
|
21
|
+
if (isCollapsed) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return source === 'expanded-marker' || source === 'expanded-outline';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const NODE_TO_EDGE_STATE_MAP: Record<NodeState, EdgeState> = {
|
|
28
|
+
default: 'default',
|
|
29
|
+
hover: 'hover',
|
|
30
|
+
dragging: 'dragging',
|
|
31
|
+
selected: 'selected'
|
|
15
32
|
};
|
|
16
33
|
|
|
17
|
-
function shouldEdgeBeSelected(edge:
|
|
34
|
+
function shouldEdgeBeSelected(edge: EdgeInterface): boolean {
|
|
18
35
|
return edge
|
|
19
36
|
.getConnectedNodes()
|
|
20
|
-
.some(
|
|
21
|
-
(node) => node.getState() === NODE_STATE.SELECTED && node.shouldHighlightConnectedEdges()
|
|
22
|
-
);
|
|
37
|
+
.some((node) => node.getState() === 'selected' && node.shouldHighlightConnectedEdges());
|
|
23
38
|
}
|
|
24
39
|
|
|
25
|
-
function setNodeState(node:
|
|
40
|
+
function setNodeState(node: NodeInterface, state: NodeState) {
|
|
26
41
|
node.setState(state);
|
|
27
42
|
if (node.shouldHighlightConnectedEdges()) {
|
|
28
43
|
node.getConnectedEdges().forEach((edge) => {
|
|
29
44
|
let newEdgeState = NODE_TO_EDGE_STATE_MAP[state];
|
|
30
45
|
if (shouldEdgeBeSelected(edge)) {
|
|
31
|
-
newEdgeState =
|
|
46
|
+
newEdgeState = 'selected';
|
|
32
47
|
}
|
|
33
48
|
edge.setState(newEdgeState);
|
|
34
49
|
});
|
|
@@ -39,7 +54,7 @@ interface EventMap {
|
|
|
39
54
|
onClick?: (info: unknown, event: Event) => void;
|
|
40
55
|
onHover?: (info: unknown) => void;
|
|
41
56
|
onMouseEnter?: (info: unknown) => void;
|
|
42
|
-
onMouseLeave?: (node:
|
|
57
|
+
onMouseLeave?: (node: NodeInterface) => void;
|
|
43
58
|
onDragStart?: (info: unknown) => void;
|
|
44
59
|
onDrag?: (info: unknown) => void;
|
|
45
60
|
onDragEnd?: (info: unknown) => void;
|
|
@@ -56,8 +71,8 @@ export interface InteractionManagerProps {
|
|
|
56
71
|
export class InteractionManager {
|
|
57
72
|
public notifyCallback: Function;
|
|
58
73
|
private _lastInteraction = 0;
|
|
59
|
-
private _lastHoveredNode:
|
|
60
|
-
private _lastSelectedNode:
|
|
74
|
+
private _lastHoveredNode: NodeInterface | null = null;
|
|
75
|
+
private _lastSelectedNode: NodeInterface | null = null;
|
|
61
76
|
|
|
62
77
|
public nodeEvents: EventMap = undefined!;
|
|
63
78
|
public edgeEvents: EventMap = undefined!;
|
|
@@ -93,6 +108,7 @@ export class InteractionManager {
|
|
|
93
108
|
return this._lastInteraction;
|
|
94
109
|
}
|
|
95
110
|
|
|
111
|
+
// eslint-disable-next-line max-statements, complexity
|
|
96
112
|
onClick(info, event): void {
|
|
97
113
|
const {object} = info;
|
|
98
114
|
|
|
@@ -101,12 +117,55 @@ export class InteractionManager {
|
|
|
101
117
|
}
|
|
102
118
|
|
|
103
119
|
if (object.isNode) {
|
|
104
|
-
|
|
120
|
+
const node = object as NodeInterface;
|
|
121
|
+
const chainId = node.getPropertyValue('collapsedChainId');
|
|
122
|
+
const collapsedNodeIds = node.getPropertyValue('collapsedNodeIds');
|
|
123
|
+
const representativeId = node.getPropertyValue('collapsedChainRepresentativeId');
|
|
124
|
+
const isCollapsed = Boolean(node.getPropertyValue('isCollapsedChain'));
|
|
125
|
+
const hasChainMetadata =
|
|
126
|
+
chainId !== null &&
|
|
127
|
+
chainId !== undefined &&
|
|
128
|
+
Array.isArray(collapsedNodeIds) &&
|
|
129
|
+
collapsedNodeIds.length > 1 &&
|
|
130
|
+
representativeId !== null &&
|
|
131
|
+
representativeId !== undefined;
|
|
132
|
+
const isRepresentative = hasChainMetadata && representativeId === node.getId();
|
|
133
|
+
|
|
134
|
+
if (hasChainMetadata && isRepresentative) {
|
|
135
|
+
const layout: any = this.engine?.props?.layout;
|
|
136
|
+
if (layout && typeof layout.toggleCollapsedChain === 'function') {
|
|
137
|
+
const interactionSource = resolveChainInteractionSource(info ?? null);
|
|
138
|
+
|
|
139
|
+
// eslint-disable-next-line max-depth
|
|
140
|
+
if (shouldToggleCollapsedChain(isCollapsed, interactionSource)) {
|
|
141
|
+
const action = isCollapsed ? 'expand' : 'collapse';
|
|
142
|
+
const chainIdStr = String(chainId);
|
|
143
|
+
log.log(
|
|
144
|
+
0,
|
|
145
|
+
`InteractionManager: ${action} chain ${chainIdStr} via ${interactionSource}`
|
|
146
|
+
);
|
|
147
|
+
// eslint-disable-next-line no-console
|
|
148
|
+
console.log(
|
|
149
|
+
`InteractionManager: ${action} chain ${chainIdStr} via ${interactionSource}`
|
|
150
|
+
);
|
|
151
|
+
layout.toggleCollapsedChain(chainIdStr);
|
|
152
|
+
this._lastInteraction = Date.now();
|
|
153
|
+
this.notifyCallback();
|
|
154
|
+
// eslint-disable-next-line max-depth
|
|
155
|
+
if (this.nodeEvents.onClick) {
|
|
156
|
+
this.nodeEvents.onClick(info, event);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (node.isSelectable()) {
|
|
105
164
|
if (this._lastSelectedNode) {
|
|
106
|
-
setNodeState(this._lastSelectedNode,
|
|
165
|
+
setNodeState(this._lastSelectedNode, 'default');
|
|
107
166
|
}
|
|
108
|
-
setNodeState(
|
|
109
|
-
this._lastSelectedNode =
|
|
167
|
+
setNodeState(node, 'selected');
|
|
168
|
+
this._lastSelectedNode = node;
|
|
110
169
|
this._lastInteraction = Date.now();
|
|
111
170
|
this.notifyCallback();
|
|
112
171
|
}
|
|
@@ -116,7 +175,7 @@ export class InteractionManager {
|
|
|
116
175
|
}
|
|
117
176
|
}
|
|
118
177
|
|
|
119
|
-
if (object.isEdge && this.edgeEvents.onClick) {
|
|
178
|
+
if ((object as EdgeInterface).isEdge && this.edgeEvents.onClick) {
|
|
120
179
|
this.edgeEvents.onClick(info, event);
|
|
121
180
|
}
|
|
122
181
|
}
|
|
@@ -124,12 +183,11 @@ export class InteractionManager {
|
|
|
124
183
|
_mouseLeaveNode(): void {
|
|
125
184
|
const lastHoveredNode = this._lastHoveredNode;
|
|
126
185
|
|
|
127
|
-
if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() ===
|
|
186
|
+
if (!(lastHoveredNode.isSelectable() && lastHoveredNode.getState() === 'selected')) {
|
|
128
187
|
// reset the last hovered node's state
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
: NODE_STATE.DEFAULT;
|
|
188
|
+
const lastSelectedId = this._lastSelectedNode?.getId();
|
|
189
|
+
const lastHoveredId = this._lastHoveredNode?.getId();
|
|
190
|
+
const newState = lastSelectedId !== undefined && lastSelectedId === lastHoveredId ? 'selected' : 'default';
|
|
133
191
|
setNodeState(lastHoveredNode, newState);
|
|
134
192
|
}
|
|
135
193
|
// trigger the callback if exists
|
|
@@ -140,7 +198,7 @@ export class InteractionManager {
|
|
|
140
198
|
|
|
141
199
|
_mouseEnterNode(info): void {
|
|
142
200
|
// set the node's state to hover
|
|
143
|
-
setNodeState(info.object as
|
|
201
|
+
setNodeState(info.object as NodeInterface, 'hover');
|
|
144
202
|
// trigger the callback if exists
|
|
145
203
|
if (this.nodeEvents.onMouseEnter) {
|
|
146
204
|
this.nodeEvents.onMouseEnter(info);
|
|
@@ -163,7 +221,9 @@ export class InteractionManager {
|
|
|
163
221
|
|
|
164
222
|
// hover over on a node
|
|
165
223
|
if (info.object.isNode) {
|
|
166
|
-
const
|
|
224
|
+
const lastHoveredId = this._lastHoveredNode?.getId();
|
|
225
|
+
const currentId = (info.object as NodeInterface).getId();
|
|
226
|
+
const isSameNode = lastHoveredId !== undefined && lastHoveredId === currentId;
|
|
167
227
|
// stay in the same node
|
|
168
228
|
if (isSameNode) {
|
|
169
229
|
return;
|
|
@@ -202,9 +262,9 @@ export class InteractionManager {
|
|
|
202
262
|
const bounds = info.layer.context.viewport.getBounds(); // [minX, minY, maxX, maxY]
|
|
203
263
|
const x = Math.min(Math.max(coordinates[0], bounds[0]), bounds[2]);
|
|
204
264
|
const y = Math.min(Math.max(coordinates[1], bounds[1]), bounds[3]);
|
|
205
|
-
this.engine.lockNodePosition(info.object, x, y);
|
|
265
|
+
this.engine.lockNodePosition(info.object as NodeInterface, x, y);
|
|
206
266
|
|
|
207
|
-
setNodeState(info.object,
|
|
267
|
+
setNodeState(info.object as NodeInterface, 'dragging');
|
|
208
268
|
this._lastInteraction = Date.now();
|
|
209
269
|
this.notifyCallback();
|
|
210
270
|
if (this.nodeEvents.onDrag) {
|
|
@@ -219,7 +279,7 @@ export class InteractionManager {
|
|
|
219
279
|
if (this.resumeLayoutAfterDragging) {
|
|
220
280
|
this.engine.resume();
|
|
221
281
|
}
|
|
222
|
-
setNodeState(info.object,
|
|
223
|
-
this.engine.unlockNodePosition(info.object);
|
|
282
|
+
setNodeState(info.object as NodeInterface, 'default');
|
|
283
|
+
this.engine.unlockNodePosition(info.object as NodeInterface);
|
|
224
284
|
}
|
|
225
285
|
}
|