@kgdata/forcegraph
Version:
forcegraph
474 lines (399 loc) • 15.3 kB
JavaScript
import React, { useState, useEffect, forwardRef, useRef, useCallback, useMemo, useImperativeHandle } from 'react';
import G6 from '@antv/g6';
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
if (enumerableOnly) {
symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
});
}
keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
if (i % 2) {
ownKeys(Object(source), true).forEach(function (key) {
_defineProperty(target, key, source[key]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
}
return target;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
function _iterableToArrayLimit(arr, i) {
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
if (_i == null) return;
var _arr = [];
var _n = true;
var _d = false;
var _s, _e;
try {
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var mergeConfig = function mergeConfig(nextConfig, defaultConfig) {
var _defaultConfig$defaul, _nextConfig$defaultNo, _defaultConfig$defaul2, _nextConfig$defaultNo2, _defaultConfig$defaul3, _nextConfig$defaultEd, _defaultConfig$defaul4, _nextConfig$defaultEd2;
if (!nextConfig) {
return defaultConfig;
}
var layout = _objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : defaultConfig.layout) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.layout) || {});
var nodeLabelCfg = _objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : (_defaultConfig$defaul = defaultConfig.defaultNode) === null || _defaultConfig$defaul === void 0 ? void 0 : _defaultConfig$defaul.labelCfg) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : (_nextConfig$defaultNo = nextConfig.defaultNode) === null || _nextConfig$defaultNo === void 0 ? void 0 : _nextConfig$defaultNo.labelCfg) || {});
var nodeStyle = _objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : (_defaultConfig$defaul2 = defaultConfig.defaultNode) === null || _defaultConfig$defaul2 === void 0 ? void 0 : _defaultConfig$defaul2.style) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : (_nextConfig$defaultNo2 = nextConfig.defaultNode) === null || _nextConfig$defaultNo2 === void 0 ? void 0 : _nextConfig$defaultNo2.style) || {});
var defaultNode = _objectSpread2(_objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : defaultConfig.defaultNode) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.defaultNode) || {}), {
labelCfg: nodeLabelCfg,
style: nodeStyle
});
var edgeLabelCfg = _objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : (_defaultConfig$defaul3 = defaultConfig.defaultEdge) === null || _defaultConfig$defaul3 === void 0 ? void 0 : _defaultConfig$defaul3.labelCfg) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : (_nextConfig$defaultEd = nextConfig.defaultEdge) === null || _nextConfig$defaultEd === void 0 ? void 0 : _nextConfig$defaultEd.labelCfg) || {});
var edgeStyle = _objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : (_defaultConfig$defaul4 = defaultConfig.defaultEdge) === null || _defaultConfig$defaul4 === void 0 ? void 0 : _defaultConfig$defaul4.style) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : (_nextConfig$defaultEd2 = nextConfig.defaultEdge) === null || _nextConfig$defaultEd2 === void 0 ? void 0 : _nextConfig$defaultEd2.style) || {});
var defaultEdge = _objectSpread2(_objectSpread2(_objectSpread2({}, (defaultConfig === null || defaultConfig === void 0 ? void 0 : defaultConfig.defaultEdge) || {}), (nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.defaultEdge) || {}), {
labelCfg: edgeLabelCfg,
style: edgeStyle
});
return _objectSpread2(_objectSpread2(_objectSpread2({}, defaultConfig), nextConfig), {}, {
layout: layout,
defaultNode: defaultNode,
defaultEdge: defaultEdge
});
};
function getTargetElement(target, defaultElement) {
if (!target) {
return defaultElement;
}
var targetElement;
if (typeof target === 'function') {
targetElement = target();
} else if ('current' in target) {
targetElement = target.current;
} else {
targetElement = target;
}
return targetElement;
}
var computeHeight = function computeHeight(node) {
var totalHeight = parseInt(getComputedStyle(node).height, 10);
var padding = parseInt(getComputedStyle(node).paddingTop, 10) + parseInt(getComputedStyle(node).paddingBottom, 10);
return totalHeight - padding;
};
var getAutoHeight = function getAutoHeight(n) {
if (!n) {
return 0;
}
var node = n;
var height = computeHeight(node);
while (!height) {
node = node.parentNode;
if (node) {
height = computeHeight(node);
} else {
break;
}
}
return height;
};
var filterGraphData = function filterGraphData(data, requiredOoIds) {
var ret = data.filter(function (item) {
var ooId = item.ooId;
return requiredOoIds.includes(ooId);
});
return {
ret: ret,
$data: data
};
};
var useAutoHeight = function useAutoHeight(target) {
var _useState = useState(0),
_useState2 = _slicedToArray(_useState, 2),
height = _useState2[0],
setHeight = _useState2[1];
useEffect(function () {
var el = getTargetElement(target);
if (el) setHeight(getAutoHeight(el));
}, [target]);
return [height];
};
var useGraphCfg = function useGraphCfg(graphCfg) {
var newGraphCfg = useMemo(function () {
var defaultConfig = {
container: '',
modes: {
default: ['drag-canvas', 'zoom-canvas']
},
layout: {
type: 'force',
linkDistance: function linkDistance(item) {
if (item.linkHeight) {
return item.linkHeight;
}
return 100;
} // nodeStrength: 0,
// workerEnabled: true,
// gpuEnabled:true
},
defaultNode: {
shape: 'node',
labelCfg: {
position: 'top',
style: {
fill: '#fff',
fontSize: 10,
cursor: 'pointer'
}
},
style: {
stroke: '#72CC4A',
width: 150,
cursor: 'pointer'
}
},
nodeStateStyles: {
selected: {
fill: 'steelblue',
stroke: '#000',
lineWidth: 1
},
hover: {
fill: 'red',
stroke: '#000',
lineWidth: 1
}
},
defaultEdge: {
labelCfg: {
style: {
fill: '#000',
fontSize: 10
},
autoRotate: true
},
style: {
stroke: '#000',
lineWidth: 1,
endArrow: {
path: G6.Arrow.triangle(3, 6, 3),
d: 3
}
}
}
};
return mergeConfig(graphCfg, defaultConfig);
}, [graphCfg]);
return [newGraphCfg];
};
var FGD = /*#__PURE__*/forwardRef(function (props, fgRef) {
var graphData = props.graphData,
onNodeClick = props.onNodeClick,
onNodeDblClick = props.onNodeDblClick,
graphCfg = props.graphCfg,
style = props.style,
request = props.request,
params = props.params,
postData = props.postData;
var ref = useRef(null);
var graph = useRef();
var _useGraphCfg = useGraphCfg(graphCfg),
_useGraphCfg2 = _slicedToArray(_useGraphCfg, 1),
newGraphCfg = _useGraphCfg2[0];
var _useAutoHeight = useAutoHeight(ref),
_useAutoHeight2 = _slicedToArray(_useAutoHeight, 1),
height = _useAutoHeight2[0]; // 添加事件
var addEvent = useCallback(function (example, data) {
if (data && (data === null || data === void 0 ? void 0 : data.nodes.length) <= 200) {
console.log('绑定了=====》');
var refreshDragedNodePosition = function refreshDragedNodePosition(e) {
var model = e.item.get('model');
model.fx = e.x;
model.fy = e.y;
};
example.on('node:dragstart', function (e) {
example.layout();
refreshDragedNodePosition(e);
});
example.on('node:drag', function (e) {
refreshDragedNodePosition(e);
});
example.on('node:dragend', function (e) {
e.item.get('model').fx = null;
e.item.get('model').fy = null;
});
}
var timeId;
if (onNodeClick) {
example.on('node:click', function (e) {
clearTimeout(timeId);
timeId = window.setTimeout(function () {
console.log('click', e);
onNodeClick(e, example);
}, 300);
});
}
if (onNodeDblClick) {
example.on('node:dblclick', function (e) {
clearTimeout(timeId);
console.log('dblclick');
onNodeDblClick(e, example);
});
}
}, [onNodeClick, onNodeDblClick]);
var GraphData = useMemo( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var _yield$request, data;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (request) {
_context.next = 2;
break;
}
return _context.abrupt("return", graphData);
case 2:
_context.next = 4;
return request(params, graph.current);
case 4:
_yield$request = _context.sent;
data = _yield$request.data;
if (!postData) {
_context.next = 8;
break;
}
return _context.abrupt("return", postData(data));
case 8:
return _context.abrupt("return", data);
case 9:
case "end":
return _context.stop();
}
}
}, _callee);
})), [graphData, params, postData, request]);
useEffect(function () {
if (!graph.current) {
GraphData.then(function (res) {
var modes = JSON.parse(JSON.stringify(newGraphCfg.modes));
if (res && (res === null || res === void 0 ? void 0 : res.nodes.length) > 200) modes.default.push('drag-node');
graph.current = new G6.Graph(_objectSpread2(_objectSpread2({}, newGraphCfg), {}, {
container: ref.current,
modes: modes
}));
graph.current.data(res);
graph.current.get('canvas').set('localRefresh', false);
graph.current.render();
addEvent(graph.current, res);
});
if (typeof window !== 'undefined') window.onresize = function () {
var _ref$current, _ref$current2, _ref$current3, _ref$current4;
if (!graph.current || graph.current.get('destroyed')) return;
if (!ref || !(ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.scrollWidth) || !(ref === null || ref === void 0 ? void 0 : (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.scrollHeight)) return;
graph.current.changeSize(ref === null || ref === void 0 ? void 0 : (_ref$current3 = ref.current) === null || _ref$current3 === void 0 ? void 0 : _ref$current3.scrollWidth, ref === null || ref === void 0 ? void 0 : (_ref$current4 = ref.current) === null || _ref$current4 === void 0 ? void 0 : _ref$current4.scrollHeight);
};
} else {
GraphData.then(function (res) {
var _graph$current;
graph === null || graph === void 0 ? void 0 : (_graph$current = graph.current) === null || _graph$current === void 0 ? void 0 : _graph$current.changeData(res);
});
}
}, [newGraphCfg, GraphData, addEvent]);
useImperativeHandle(fgRef, function () {
return {
getInstance: function getInstance() {
return graph === null || graph === void 0 ? void 0 : graph.current;
}
};
}, []);
return /*#__PURE__*/React.createElement("div", {
style: _objectSpread2({
height: height
}, style),
className: "graph-box",
ref: ref
});
});
export default FGD;
export { computeHeight, filterGraphData, getAutoHeight, getTargetElement, mergeConfig, useAutoHeight };