force-graph 1.44.1 → 1.45.0

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.
@@ -824,7 +824,7 @@ var CanvasForceGraph = Kapsule({
824
824
  // Main canvas object to manipulate
825
825
  state.ctx = canvasCtx;
826
826
  },
827
- update: function update(state) {
827
+ update: function update(state, changedProps) {
828
828
  state.engineRunning = false; // Pause simulation
829
829
  state.onUpdate();
830
830
  if (state.nodeAutoColorBy !== null) {
@@ -864,18 +864,23 @@ var CanvasForceGraph = Kapsule({
864
864
  var maxDepth = Math.max.apply(Math, _toConsumableArray(Object.values(nodeDepths || [])));
865
865
  var dagLevelDistance = state.dagLevelDistance || state.graphData.nodes.length / (maxDepth || 1) * DAG_LEVEL_NODE_RATIO * (['radialin', 'radialout'].indexOf(state.dagMode) !== -1 ? 0.7 : 1);
866
866
 
867
+ // Reset relevant fx/fy when swapping dag modes
868
+ if (['lr', 'rl', 'td', 'bu'].includes(changedProps.dagMode)) {
869
+ var resetProp = ['lr', 'rl'].includes(changedProps.dagMode) ? 'fx' : 'fy';
870
+ state.graphData.nodes.filter(state.dagNodeFilter).forEach(function (node) {
871
+ return delete node[resetProp];
872
+ });
873
+ }
874
+
867
875
  // Fix nodes to x,y for dag mode
868
- if (state.dagMode) {
869
- var getFFn = function getFFn(fix, invert) {
870
- return function (node) {
871
- return !fix ? undefined : (nodeDepths[node[state.nodeId]] - maxDepth / 2) * dagLevelDistance * (invert ? -1 : 1);
872
- };
876
+ if (['lr', 'rl', 'td', 'bu'].includes(state.dagMode)) {
877
+ var invert = ['rl', 'bu'].includes(state.dagMode);
878
+ var fixFn = function fixFn(node) {
879
+ return (nodeDepths[node[state.nodeId]] - maxDepth / 2) * dagLevelDistance * (invert ? -1 : 1);
873
880
  };
874
- var fxFn = getFFn(['lr', 'rl'].indexOf(state.dagMode) !== -1, state.dagMode === 'rl');
875
- var fyFn = getFFn(['td', 'bu'].indexOf(state.dagMode) !== -1, state.dagMode === 'bu');
881
+ var _resetProp = ['lr', 'rl'].includes(state.dagMode) ? 'fx' : 'fy';
876
882
  state.graphData.nodes.filter(state.dagNodeFilter).forEach(function (node) {
877
- node.fx = fxFn(node);
878
- node.fy = fyFn(node);
883
+ return node[_resetProp] = fixFn(node);
879
884
  });
880
885
  }
881
886
 
@@ -1460,7 +1465,7 @@ var forceGraph = Kapsule({
1460
1465
  state.zoom.filter(function (ev) {
1461
1466
  return (
1462
1467
  // disable zoom interaction
1463
- !ev.button && state.enableZoomPanInteraction && (state.enableZoomInteraction || ev.type !== 'wheel') && (state.enablePanInteraction || ev.type === 'wheel')
1468
+ !ev.button && state.enableZoomPanInteraction && (ev.type !== 'wheel' || accessorFn(state.enableZoomInteraction)(ev)) && (ev.type === 'wheel' || accessorFn(state.enablePanInteraction)(ev))
1464
1469
  );
1465
1470
  }).on('zoom', function (ev) {
1466
1471
  var t = ev.transform;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "force-graph",
3
- "version": "1.44.1",
3
+ "version": "1.45.0",
4
4
  "description": "2D force-directed graph rendered on HTML5 canvas",
5
5
  "type": "module",
6
6
  "unpkg": "dist/force-graph.min.js",
@@ -462,7 +462,7 @@ export default Kapsule({
462
462
  state.ctx = canvasCtx;
463
463
  },
464
464
 
465
- update(state) {
465
+ update(state, changedProps) {
466
466
  state.engineRunning = false; // Pause simulation
467
467
  state.onUpdate();
468
468
 
@@ -510,19 +510,19 @@ export default Kapsule({
510
510
  * (['radialin', 'radialout'].indexOf(state.dagMode) !== -1 ? 0.7 : 1)
511
511
  );
512
512
 
513
+ // Reset relevant fx/fy when swapping dag modes
514
+ if (['lr', 'rl', 'td', 'bu'].includes(changedProps.dagMode)) {
515
+ const resetProp = ['lr', 'rl'].includes(changedProps.dagMode) ? 'fx' : 'fy';
516
+ state.graphData.nodes.filter(state.dagNodeFilter).forEach(node => delete node[resetProp]);
517
+ }
518
+
513
519
  // Fix nodes to x,y for dag mode
514
- if (state.dagMode) {
515
- const getFFn = (fix, invert) => node => !fix
516
- ? undefined
517
- : (nodeDepths[node[state.nodeId]] - maxDepth / 2) * dagLevelDistance * (invert ? -1 : 1);
518
-
519
- const fxFn = getFFn(['lr', 'rl'].indexOf(state.dagMode) !== -1, state.dagMode === 'rl');
520
- const fyFn = getFFn(['td', 'bu'].indexOf(state.dagMode) !== -1, state.dagMode === 'bu');
521
-
522
- state.graphData.nodes.filter(state.dagNodeFilter).forEach(node => {
523
- node.fx = fxFn(node);
524
- node.fy = fyFn(node);
525
- });
520
+ if (['lr', 'rl', 'td', 'bu'].includes(state.dagMode)) {
521
+ const invert = ['rl', 'bu'].includes(state.dagMode);
522
+ const fixFn = node => (nodeDepths[node[state.nodeId]] - maxDepth / 2) * dagLevelDistance * (invert ? -1 : 1);
523
+
524
+ const resetProp = ['lr', 'rl'].includes(state.dagMode) ? 'fx' : 'fy';
525
+ state.graphData.nodes.filter(state.dagNodeFilter).forEach(node => node[resetProp] = fixFn(node));
526
526
  }
527
527
 
528
528
  // Use radial force for radial dags
@@ -467,9 +467,9 @@ export default Kapsule({
467
467
  .filter(ev =>
468
468
  // disable zoom interaction
469
469
  !ev.button
470
- && state.enableZoomPanInteraction
471
- && (state.enableZoomInteraction || ev.type !== 'wheel')
472
- && (state.enablePanInteraction || ev.type === 'wheel')
470
+ && state.enableZoomPanInteraction
471
+ && (ev.type !== 'wheel' || accessorFn(state.enableZoomInteraction)(ev))
472
+ && (ev.type === 'wheel' || accessorFn(state.enablePanInteraction)(ev))
473
473
  )
474
474
  .on('zoom', ev => {
475
475
  const t = ev.transform;
package/src/index.d.ts CHANGED
@@ -177,9 +177,9 @@ export interface ForceGraphGenericInstance<ChainableInstance> {
177
177
  enableNodeDrag(): boolean;
178
178
  enableNodeDrag(enable: boolean): ChainableInstance;
179
179
  enableZoomInteraction(): boolean;
180
- enableZoomInteraction(enable: boolean): ChainableInstance;
180
+ enableZoomInteraction(enable: boolean | ((event: MouseEvent) => boolean)): ChainableInstance;
181
181
  enablePanInteraction(): boolean;
182
- enablePanInteraction(enable: boolean): ChainableInstance;
182
+ enablePanInteraction(enable: boolean | ((event: MouseEvent) => boolean)): ChainableInstance;
183
183
  enablePointerInteraction(): boolean;
184
184
  enablePointerInteraction(enable?: boolean): ChainableInstance;
185
185