mirror of
https://gitee.com/antv/g6.git
synced 2024-12-03 04:08:32 +08:00
feat: v5-quadratic (#4656)
* add: add a test demo * feat: add quadratic * add: add unit test demo * fix: add seItemState(selected、active、highlight、inactive、disable) test into spec.
This commit is contained in:
parent
1a029724cf
commit
7405f26c76
@ -24,7 +24,7 @@ import RotateCanvas3D from './behavior/rotate-canvas-3d';
|
|||||||
import TrackCanvas3D from './behavior/track-canvas-3d';
|
import TrackCanvas3D from './behavior/track-canvas-3d';
|
||||||
import OrbitCanvas3D from './behavior/orbit-canvas-3d';
|
import OrbitCanvas3D from './behavior/orbit-canvas-3d';
|
||||||
import { HoverActivate } from './behavior/hover-activate';
|
import { HoverActivate } from './behavior/hover-activate';
|
||||||
|
import { Quadratic } from './item/edge';
|
||||||
const stdLib = {
|
const stdLib = {
|
||||||
transforms: {
|
transforms: {
|
||||||
comboFromNode,
|
comboFromNode,
|
||||||
@ -63,6 +63,7 @@ const stdLib = {
|
|||||||
},
|
},
|
||||||
edges: {
|
edges: {
|
||||||
'line-edge': LineEdge,
|
'line-edge': LineEdge,
|
||||||
|
'quadratic-edge': Quadratic
|
||||||
},
|
},
|
||||||
combos: {},
|
combos: {},
|
||||||
};
|
};
|
||||||
|
@ -1 +1,2 @@
|
|||||||
export * from './line';
|
export * from './line';
|
||||||
|
export * from './quadratic'
|
119
packages/g6/src/stdlib/item/edge/quadratic.ts
Normal file
119
packages/g6/src/stdlib/item/edge/quadratic.ts
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
import { Point } from '../../../types/common';
|
||||||
|
import {
|
||||||
|
EdgeDisplayModel,
|
||||||
|
EdgeModelData,
|
||||||
|
EdgeShapeMap,
|
||||||
|
} from '../../../types/edge';
|
||||||
|
import { State } from '../../../types/item';
|
||||||
|
import { BaseEdge } from './base';
|
||||||
|
|
||||||
|
export class Quadratic extends BaseEdge {
|
||||||
|
public type = 'line-edge';
|
||||||
|
public defaultStyles = {
|
||||||
|
keyShape: {
|
||||||
|
controlPoints: [0, 0], //precise x-axis, y-axis coordinates of control points
|
||||||
|
curvePosition: 0, //control point coordinates described by percentage,range 0 to 1
|
||||||
|
curveOffset: [0, 0], //a point coordinate that quadratic curve to
|
||||||
|
stroke: '#000000',
|
||||||
|
isBillboard: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
// suggest to merge default styles like this to avoid style value missing
|
||||||
|
// this.defaultStyles = mergeStyles([this.baseDefaultStyles, this.defaultStyles]);
|
||||||
|
}
|
||||||
|
public draw(
|
||||||
|
model: EdgeDisplayModel,
|
||||||
|
sourcePoint: Point,
|
||||||
|
targetPoint: Point,
|
||||||
|
shapeMap: EdgeShapeMap,
|
||||||
|
diffData?: { previous: EdgeModelData; current: EdgeModelData },
|
||||||
|
diffState?: { previous: State[]; current: State[] },
|
||||||
|
): EdgeShapeMap {
|
||||||
|
const { data = {} } = model;
|
||||||
|
|
||||||
|
const shapes: EdgeShapeMap = { keyShape: undefined };
|
||||||
|
|
||||||
|
shapes.keyShape = this.drawKeyShape(
|
||||||
|
model,
|
||||||
|
sourcePoint,
|
||||||
|
targetPoint,
|
||||||
|
shapeMap,
|
||||||
|
diffData,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (data.haloShape) {
|
||||||
|
shapes.haloShape = this.drawHaloShape(model, shapeMap, diffData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.labelShape) {
|
||||||
|
shapes.labelShape = this.drawLabelShape(model, shapeMap, diffData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// labelBackgroundShape
|
||||||
|
if (data.labelBackgroundShape) {
|
||||||
|
shapes.labelBackgroundShape = this.drawLabelBackgroundShape(
|
||||||
|
model,
|
||||||
|
shapeMap,
|
||||||
|
diffData,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.iconShape) {
|
||||||
|
shapes.iconShape = this.drawIconShape(model, shapeMap, diffData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: other shapes
|
||||||
|
return shapes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public drawKeyShape(
|
||||||
|
model: EdgeDisplayModel,
|
||||||
|
sourcePoint: Point,
|
||||||
|
targetPoint: Point,
|
||||||
|
shapeMap: EdgeShapeMap,
|
||||||
|
diffData?: { previous: EdgeModelData; current: EdgeModelData },
|
||||||
|
diffState?: { previous: State[]; current: State[] },
|
||||||
|
) {
|
||||||
|
const { keyShape: keyShapeStyle } = this.mergedStyles as any;
|
||||||
|
|
||||||
|
const controlPoint = this.getControlPoint(sourcePoint, targetPoint, keyShapeStyle.curvePosition, keyShapeStyle.controlPoints, keyShapeStyle.curveOffset);
|
||||||
|
return this.upsertShape(
|
||||||
|
'path',
|
||||||
|
'keyShape',
|
||||||
|
{
|
||||||
|
...keyShapeStyle,
|
||||||
|
path: [['M', sourcePoint.x, sourcePoint.y], ['Q', controlPoint.x, controlPoint.y, targetPoint.x, targetPoint.y]],
|
||||||
|
},
|
||||||
|
shapeMap,
|
||||||
|
model,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* calculate the control point by curvePosition|controlPoints|curveOffset
|
||||||
|
* @param startPoint: source point position of edge
|
||||||
|
* @param endPoint target point position of edge
|
||||||
|
* @param percent the proportion of control points' in the segment, Range 0 to 1
|
||||||
|
* @param controlPoints the control point position
|
||||||
|
* @param offset the curveOffset
|
||||||
|
* @returns control points
|
||||||
|
*/
|
||||||
|
private getControlPoint: (startPoint: Point,
|
||||||
|
endPoint: Point,
|
||||||
|
percent: number,
|
||||||
|
controlPoints: number[],
|
||||||
|
offset: number[]
|
||||||
|
) => Point = (
|
||||||
|
startPoint: Point,
|
||||||
|
endPoint: Point,
|
||||||
|
percent = 0,
|
||||||
|
controlPoints,
|
||||||
|
offset,
|
||||||
|
) => ({
|
||||||
|
x: (1 - percent) * startPoint.x + percent * endPoint.x + controlPoints[0] + offset[0],
|
||||||
|
y: (1 - percent) * startPoint.y + percent * endPoint.y + controlPoints[1] + offset[1],
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
91
packages/g6/tests/intergration/demo/quadratic.ts
Normal file
91
packages/g6/tests/intergration/demo/quadratic.ts
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import G6 from '../../../src/index';
|
||||||
|
import { container, height, width } from '../../datasets/const';
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
const data = {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
data: {
|
||||||
|
x: 100,
|
||||||
|
y: 100,
|
||||||
|
type: 'circle-node',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
data: {
|
||||||
|
x: 200,
|
||||||
|
y: 100,
|
||||||
|
type: 'circle-node',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 1,
|
||||||
|
target: 2,
|
||||||
|
data: {
|
||||||
|
type: 'quadratic-edge'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
const edge: ((data: any) => any) = (edgeInnerModel: any) => {
|
||||||
|
|
||||||
|
const { id, data } = edgeInnerModel
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
data: {
|
||||||
|
...data,
|
||||||
|
keyShape: {
|
||||||
|
controlPoints: [150, 100],
|
||||||
|
// curvePosition: 0.5,
|
||||||
|
curveOffset: [0, 20],
|
||||||
|
stroke: 'blue'
|
||||||
|
},
|
||||||
|
// iconShape: {
|
||||||
|
// // img: 'https://gw.alipayobjects.com/zos/basement_prod/012bcf4f-423b-4922-8c24-32a89f8c41ce.svg',
|
||||||
|
// text: 'label',
|
||||||
|
// fill: 'blue'
|
||||||
|
// },
|
||||||
|
labelShape: {
|
||||||
|
text: 'label',
|
||||||
|
position: 'middle',
|
||||||
|
fill: 'blue'
|
||||||
|
},
|
||||||
|
labelBackgroundShape: {
|
||||||
|
fill: 'white'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const graph = new G6.Graph({
|
||||||
|
container,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
data,
|
||||||
|
type: 'graph',
|
||||||
|
modes: {
|
||||||
|
default: ['click-select', 'drag-canvas', 'zoom-canvas', 'drag-node'],
|
||||||
|
},
|
||||||
|
node: (nodeInnerModel: any) => {
|
||||||
|
const { id, data } = nodeInnerModel;
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
data: {
|
||||||
|
...data,
|
||||||
|
keyShape: {
|
||||||
|
r: 16
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
edge,
|
||||||
|
});
|
||||||
|
|
||||||
|
return graph;
|
||||||
|
|
||||||
|
}
|
@ -17,6 +17,7 @@ import demoFor4 from './demo/demoFor4';
|
|||||||
import bugReproduce from './demo/bugReproduce';
|
import bugReproduce from './demo/bugReproduce';
|
||||||
import rect from './demo/rect';
|
import rect from './demo/rect';
|
||||||
import visual from './visual/visual';
|
import visual from './visual/visual';
|
||||||
|
import quadratic from './demo/quadratic';
|
||||||
export {
|
export {
|
||||||
behaviors_activateRelations,
|
behaviors_activateRelations,
|
||||||
layouts_circular,
|
layouts_circular,
|
||||||
@ -37,4 +38,5 @@ export {
|
|||||||
bugReproduce,
|
bugReproduce,
|
||||||
rect,
|
rect,
|
||||||
visual,
|
visual,
|
||||||
|
quadratic
|
||||||
};
|
};
|
||||||
|
948
packages/g6/tests/unit/quadratic-spec.ts
Normal file
948
packages/g6/tests/unit/quadratic-spec.ts
Normal file
@ -0,0 +1,948 @@
|
|||||||
|
// @ts-nocheck
|
||||||
|
|
||||||
|
import { DisplayObject } from '@antv/g';
|
||||||
|
import { clone } from '@antv/util';
|
||||||
|
import G6, {
|
||||||
|
EdgeDisplayModel,
|
||||||
|
Graph,
|
||||||
|
IGraph,
|
||||||
|
NodeDisplayModel,
|
||||||
|
} from '../../src/index';
|
||||||
|
import { LineEdge } from '../../src/stdlib/item/edge';
|
||||||
|
import { CircleNode } from '../../src/stdlib/item/node';
|
||||||
|
import { NodeModelData, NodeShapeMap } from '../../src/types/node';
|
||||||
|
import { extend } from '../../src/util/extend';
|
||||||
|
import { upsertShape } from '../../src/util/shape';
|
||||||
|
|
||||||
|
const container = document.createElement('div');
|
||||||
|
const width = document.getElementById('container')?.clientWidth;
|
||||||
|
const height = document.getElementById('container')?.clientHeight;
|
||||||
|
document.querySelector('body').appendChild(container);
|
||||||
|
|
||||||
|
let graph: IGraph<any>;
|
||||||
|
|
||||||
|
const data = {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
data: {
|
||||||
|
x: 100,
|
||||||
|
y: 100,
|
||||||
|
type: 'circle-node',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
data: {
|
||||||
|
x: 200,
|
||||||
|
y: 100,
|
||||||
|
type: 'circle-node',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 1,
|
||||||
|
target: 2,
|
||||||
|
data: {
|
||||||
|
type: 'quadratic-edge'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
const edge: ((data: any) => any) = (edgeInnerModel: any) => {
|
||||||
|
|
||||||
|
const { id, data } = edgeInnerModel
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
data: {
|
||||||
|
keyShape: {
|
||||||
|
controlPoints: [0, 0],
|
||||||
|
curvePosition: 0.5,
|
||||||
|
curveOffset: [10, 10],
|
||||||
|
stroke: 'blue'
|
||||||
|
},
|
||||||
|
labelShape: {
|
||||||
|
text: 'label',
|
||||||
|
fill: 'blue'
|
||||||
|
},
|
||||||
|
labelBackgroundShape: {
|
||||||
|
fill: 'white'
|
||||||
|
},
|
||||||
|
...data,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('edge item', () => {
|
||||||
|
it('new graph with two nodes and one edge', (done) => {
|
||||||
|
graph = new G6.Graph({
|
||||||
|
container,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
data,
|
||||||
|
type: 'graph',
|
||||||
|
modes: {
|
||||||
|
default: ['click-select', 'drag-canvas', 'zoom-canvas', 'drag-node'],
|
||||||
|
},
|
||||||
|
node: (nodeInnerModel: any) => {
|
||||||
|
const { id, data } = nodeInnerModel;
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
data: {
|
||||||
|
...data,
|
||||||
|
keyShape: {
|
||||||
|
r: 16
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
edge,
|
||||||
|
});
|
||||||
|
|
||||||
|
graph.on('afterrender', () => {
|
||||||
|
const edgeItem = graph.itemController.itemMap['edge1'];
|
||||||
|
expect(edgeItem).not.toBe(undefined);
|
||||||
|
expect(edgeItem.shapeMap.labelShape.attributes.text).toBe('label');
|
||||||
|
expect(edgeItem.shapeMap.labelShape.attributes.fill).toBe('blue');
|
||||||
|
expect(edgeItem.shapeMap.labelBackgroundShape.attributes.fill).toBe('white');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('update edge label', (done) => {
|
||||||
|
const padding = [4, 16, 4, 8];
|
||||||
|
graph.updateData('edge', {
|
||||||
|
id: 'edge1',
|
||||||
|
data: {
|
||||||
|
labelShape: {
|
||||||
|
text: 'edge-label',
|
||||||
|
},
|
||||||
|
labelBackgroundShape: {
|
||||||
|
radius: 10,
|
||||||
|
padding,
|
||||||
|
fill: '#f00',
|
||||||
|
},
|
||||||
|
iconShape: {
|
||||||
|
text: 'A',
|
||||||
|
fill: '#f00',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const edgeItem = graph.itemController.itemMap['edge1'];
|
||||||
|
expect(edgeItem.shapeMap.labelShape).not.toBe(undefined);
|
||||||
|
expect(edgeItem.shapeMap.labelShape.attributes.text).toBe('edge-label');
|
||||||
|
const fill = edgeItem.shapeMap.labelShape.attributes.fill;
|
||||||
|
expect(fill).toBe('rgba(0,0,0,0.85)');
|
||||||
|
let labelBounds = edgeItem.shapeMap.labelShape.getGeometryBounds();
|
||||||
|
expect(edgeItem.shapeMap.labelBackgroundShape.attributes.width).toBe(
|
||||||
|
labelBounds.max[0] - labelBounds.min[0] + padding[1] + padding[3],
|
||||||
|
);
|
||||||
|
expect(edgeItem.shapeMap.labelBackgroundShape.attributes.height).toBe(
|
||||||
|
labelBounds.max[1] - labelBounds.min[1] + padding[0] + padding[2],
|
||||||
|
);
|
||||||
|
|
||||||
|
graph.updateData('edge', {
|
||||||
|
id: 'edge1',
|
||||||
|
data: {
|
||||||
|
labelShape: {
|
||||||
|
fill: '#00f',
|
||||||
|
position: 'start',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(edgeItem.shapeMap.labelShape.attributes.fill).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
edgeItem.shapeMap.labelShape.attributes.x -
|
||||||
|
edgeItem.shapeMap.labelBackgroundShape.attributes.x,
|
||||||
|
).toBe(padding[3]);
|
||||||
|
labelBounds = edgeItem.shapeMap.labelShape.getGeometryBounds();
|
||||||
|
const labelWidth = labelBounds.max[0] - labelBounds.min[0];
|
||||||
|
const labelHeight = labelBounds.max[1] - labelBounds.min[1];
|
||||||
|
const labelBgBounds =
|
||||||
|
edgeItem.shapeMap.labelBackgroundShape.getGeometryBounds();
|
||||||
|
const labelBgWidth = labelBgBounds.max[0] - labelBgBounds.min[0];
|
||||||
|
const labelBgHeight = labelBgBounds.max[1] - labelBgBounds.min[1];
|
||||||
|
expect(labelBgWidth - labelWidth).toBe(padding[1] + padding[3]);
|
||||||
|
expect(labelBgHeight - labelHeight).toBe(padding[0] + padding[2]);
|
||||||
|
|
||||||
|
graph.updateData('edge', {
|
||||||
|
id: 'edge1',
|
||||||
|
data: {
|
||||||
|
labelShape: undefined,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(edgeItem.shapeMap.labelShape).toBe(undefined);
|
||||||
|
expect(edgeItem.shapeMap.labelBackgroundShape).toBe(undefined);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
it('update edge icon', (done) => {
|
||||||
|
// add image icon to follow the label at path's center
|
||||||
|
graph.updateData('edge', {
|
||||||
|
id: 'edge1',
|
||||||
|
data: {
|
||||||
|
labelShape: {
|
||||||
|
text: 'abcddd',
|
||||||
|
fill: '#f00',
|
||||||
|
position: 'center',
|
||||||
|
},
|
||||||
|
iconShape: {
|
||||||
|
text: '',
|
||||||
|
img: 'https://gw.alipayobjects.com/zos/basement_prod/012bcf4f-423b-4922-8c24-32a89f8c41ce.svg',
|
||||||
|
// text: 'A',
|
||||||
|
fill: '#f00',
|
||||||
|
fontSize: 20,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const edgeItem = graph.itemController.itemMap['edge1'];
|
||||||
|
let { labelShape, iconShape, labelBackgroundShape } = edgeItem.shapeMap;
|
||||||
|
expect(iconShape.attributes.x + iconShape.attributes.width + 6).toBe(
|
||||||
|
labelBackgroundShape.getGeometryBounds().min[0] +
|
||||||
|
labelBackgroundShape.attributes.x,
|
||||||
|
);
|
||||||
|
expect(iconShape.attributes.transform).toBe(
|
||||||
|
labelBackgroundShape.attributes.transform,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
Math.floor(iconShape.attributes.y + iconShape.attributes.height / 2),
|
||||||
|
).toBeCloseTo(
|
||||||
|
Math.floor(
|
||||||
|
labelBackgroundShape.getGeometryBounds().center[1] +
|
||||||
|
labelBackgroundShape.attributes.y,
|
||||||
|
),
|
||||||
|
0.01,
|
||||||
|
);
|
||||||
|
|
||||||
|
// update icon to be a text
|
||||||
|
graph.updateData('edge', {
|
||||||
|
id: 'edge1',
|
||||||
|
data: {
|
||||||
|
iconShape: {
|
||||||
|
text: 'A',
|
||||||
|
fill: '#f00',
|
||||||
|
fontWeight: 800,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
labelShape = edgeItem.shapeMap['labelShape'];
|
||||||
|
iconShape = edgeItem.shapeMap['iconShape'];
|
||||||
|
labelBackgroundShape = edgeItem.shapeMap['labelBackgroundShape'];
|
||||||
|
expect(iconShape.attributes.x + iconShape.attributes.fontSize + 6).toBe(
|
||||||
|
labelBackgroundShape.getGeometryBounds().min[0] +
|
||||||
|
labelBackgroundShape.attributes.x,
|
||||||
|
);
|
||||||
|
expect(iconShape.attributes.transform).toBe(
|
||||||
|
labelBackgroundShape.attributes.transform,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
Math.floor(iconShape.attributes.y + iconShape.attributes.fontSize / 2),
|
||||||
|
).toBeCloseTo(
|
||||||
|
Math.floor(
|
||||||
|
labelBackgroundShape.getGeometryBounds().center[1] +
|
||||||
|
labelBackgroundShape.attributes.y,
|
||||||
|
),
|
||||||
|
0.01,
|
||||||
|
);
|
||||||
|
|
||||||
|
// move label to the start, and the icon follows
|
||||||
|
graph.updateData('edge', {
|
||||||
|
id: 'edge1',
|
||||||
|
data: {
|
||||||
|
labelShape: {
|
||||||
|
position: 'start',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
labelShape = edgeItem.shapeMap['labelShape'];
|
||||||
|
iconShape = edgeItem.shapeMap['iconShape'];
|
||||||
|
labelBackgroundShape = edgeItem.shapeMap['labelBackgroundShape'];
|
||||||
|
expect(iconShape.attributes.x + iconShape.attributes.fontSize + 6).toBe(
|
||||||
|
labelBackgroundShape.getGeometryBounds().min[0] +
|
||||||
|
labelBackgroundShape.attributes.x,
|
||||||
|
);
|
||||||
|
expect(iconShape.attributes.transform).toBe(
|
||||||
|
labelShape.attributes.transform,
|
||||||
|
);
|
||||||
|
expect(iconShape.attributes.y + iconShape.attributes.fontSize / 2).toBe(
|
||||||
|
labelBackgroundShape.getGeometryBounds().center[1] +
|
||||||
|
labelBackgroundShape.attributes.y,
|
||||||
|
);
|
||||||
|
graph.destroy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('state', () => {
|
||||||
|
it('edge state selected', (done) => {
|
||||||
|
const graph = new Graph({
|
||||||
|
container,
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
type: 'graph',
|
||||||
|
data: {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'node1',
|
||||||
|
data: { x: 100, y: 200 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node2',
|
||||||
|
data: { x: 100, y: 300 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node3',
|
||||||
|
data: { x: 200, y: 300 },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node2',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'edge2',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node3',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
edgeState: {
|
||||||
|
selected: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#0f0',
|
||||||
|
lineWidth: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
highlight: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#00f',
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
graph.on('afterrender', () => {
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(0);
|
||||||
|
graph.setItemState('edge1', 'selected', true);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'selected')[0]).toBe('edge1');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'selected', false);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
// set multiple edges state
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'selected', true);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'selected', false);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'selected')[0]).toBe('edge2');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'selected', false);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.setItemState(['edge2', 'edge1'], ['selected', 'highlight'], true);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(2);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
// should be merged styles from selected and highlight
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
|
||||||
|
// clear states
|
||||||
|
graph.clearItemState(['edge1', 'edge2']);
|
||||||
|
expect(graph.findIdByState('edge', 'selected').length).toBe(0);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.destroy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('edge state active', (done) => {
|
||||||
|
const graph = new Graph({
|
||||||
|
container,
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
type: 'graph',
|
||||||
|
data: {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'node1',
|
||||||
|
data: { x: 100, y: 200 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node2',
|
||||||
|
data: { x: 100, y: 300 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node3',
|
||||||
|
data: { x: 200, y: 300 },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node2',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'edge2',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node3',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
edgeState: {
|
||||||
|
active: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#0f0',
|
||||||
|
lineWidth: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
highlight: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#00f',
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
graph.on('afterrender', () => {
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(0);
|
||||||
|
graph.setItemState('edge1', 'active', true);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'active')[0]).toBe('edge1');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'active', false);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
// set multiple edges state
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'active', true);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'active', false);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'active')[0]).toBe('edge2');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'active', false);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.setItemState(['edge2', 'edge1'], ['active', 'highlight'], true);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(2);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
// should be merged styles from active and highlight
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
|
||||||
|
// clear states
|
||||||
|
graph.clearItemState(['edge1', 'edge2']);
|
||||||
|
expect(graph.findIdByState('edge', 'active').length).toBe(0);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.destroy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('edge state highlight', (done) => {
|
||||||
|
const graph = new Graph({
|
||||||
|
container,
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
type: 'graph',
|
||||||
|
data: {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'node1',
|
||||||
|
data: { x: 100, y: 200 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node2',
|
||||||
|
data: { x: 100, y: 300 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node3',
|
||||||
|
data: { x: 200, y: 300 },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node2',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'edge2',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node3',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
edgeState: {
|
||||||
|
highlight: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#0f0',
|
||||||
|
lineWidth: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
highlight: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#00f',
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
graph.on('afterrender', () => {
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
graph.setItemState('edge1', 'highlight', true);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight')[0]).toBe('edge1');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
graph.setItemState('edge1', 'highlight', false);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
// set multiple edges state
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'highlight', true);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
graph.setItemState('edge1', 'highlight', false);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight')[0]).toBe('edge2');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'highlight', false);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.setItemState(['edge2', 'edge1'], ['highlight', 'highlight'], true);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
// should be merged styles from highlight and highlight
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
|
||||||
|
// clear states
|
||||||
|
graph.clearItemState(['edge1', 'edge2']);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.destroy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('edge state inactive', (done) => {
|
||||||
|
const graph = new Graph({
|
||||||
|
container,
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
type: 'graph',
|
||||||
|
data: {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'node1',
|
||||||
|
data: { x: 100, y: 200 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node2',
|
||||||
|
data: { x: 100, y: 300 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node3',
|
||||||
|
data: { x: 200, y: 300 },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node2',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'edge2',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node3',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
edgeState: {
|
||||||
|
inactive: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#0f0',
|
||||||
|
lineWidth: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
highlight: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#00f',
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
graph.on('afterrender', () => {
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(0);
|
||||||
|
graph.setItemState('edge1', 'inactive', true);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive')[0]).toBe('edge1');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'inactive', false);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
// set multiple edges state
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'inactive', true);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'inactive', false);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive')[0]).toBe('edge2');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'inactive', false);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.setItemState(['edge2', 'edge1'], ['inactive', 'highlight'], true);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(2);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
// should be merged styles from inactive and highlight
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
|
||||||
|
// clear states
|
||||||
|
graph.clearItemState(['edge1', 'edge2']);
|
||||||
|
expect(graph.findIdByState('edge', 'inactive').length).toBe(0);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.destroy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('edge state disable', (done) => {
|
||||||
|
const graph = new Graph({
|
||||||
|
container,
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
type: 'graph',
|
||||||
|
data: {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'node1',
|
||||||
|
data: { x: 100, y: 200 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node2',
|
||||||
|
data: { x: 100, y: 300 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'node3',
|
||||||
|
data: { x: 200, y: 300 },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
edges: [
|
||||||
|
{
|
||||||
|
id: 'edge1',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node2',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'edge2',
|
||||||
|
source: 'node1',
|
||||||
|
target: 'node3',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
edgeState: {
|
||||||
|
disable: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#0f0',
|
||||||
|
lineWidth: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
highlight: {
|
||||||
|
keyShape: {
|
||||||
|
stroke: '#00f',
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
graph.on('afterrender', () => {
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(0);
|
||||||
|
graph.setItemState('edge1', 'disable', true);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'disable')[0]).toBe('edge1');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'disable', false);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
// set multiple edges state
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'disable', true);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#0f0');
|
||||||
|
graph.setItemState('edge1', 'disable', false);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(1);
|
||||||
|
expect(graph.findIdByState('edge', 'disable')[0]).toBe('edge2');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
graph.setItemState(['edge1', 'edge2'], 'disable', false);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.setItemState(['edge2', 'edge1'], ['disable', 'highlight'], true);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(2);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(2);
|
||||||
|
// should be merged styles from disable and highlight
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(2);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.stroke,
|
||||||
|
).toBe('#00f');
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge2'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(0.5);
|
||||||
|
|
||||||
|
// clear states
|
||||||
|
graph.clearItemState(['edge1', 'edge2']);
|
||||||
|
expect(graph.findIdByState('edge', 'disable').length).toBe(0);
|
||||||
|
expect(graph.findIdByState('edge', 'highlight').length).toBe(0);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.lineWidth,
|
||||||
|
).toBe(1);
|
||||||
|
expect(
|
||||||
|
graph.itemController.itemMap['edge1'].shapeMap.keyShape.style.opacity,
|
||||||
|
).toBe(1);
|
||||||
|
|
||||||
|
graph.destroy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user