|  | @@ -0,0 +1,160 @@
 | 
	
		
			
				|  |  | +const TurboType = {
 | 
	
		
			
				|  |  | +  SEQUENCE_FLOW: 1,
 | 
	
		
			
				|  |  | +  START_EVENT: 2,
 | 
	
		
			
				|  |  | +  END_EVENT: 3,
 | 
	
		
			
				|  |  | +  USER_TASK: 4,
 | 
	
		
			
				|  |  | +  SERVICE_TASK: 5,
 | 
	
		
			
				|  |  | +  EXCLUSIVE_GATEWAY: 6,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function getTurboType(type) {
 | 
	
		
			
				|  |  | +  switch (type) {
 | 
	
		
			
				|  |  | +    case 'bpmn:sequenceFlow':
 | 
	
		
			
				|  |  | +      return TurboType.SEQUENCE_FLOW;
 | 
	
		
			
				|  |  | +    case 'bpmn:startEvent':
 | 
	
		
			
				|  |  | +      return TurboType.START_EVENT;
 | 
	
		
			
				|  |  | +    case 'bpmn:endEvent':
 | 
	
		
			
				|  |  | +      return TurboType.END_EVENT;
 | 
	
		
			
				|  |  | +    case 'bpmn:userTask':
 | 
	
		
			
				|  |  | +      return TurboType.USER_TASK;
 | 
	
		
			
				|  |  | +    case 'bpmn:serviceTask':
 | 
	
		
			
				|  |  | +      return TurboType.SERVICE_TASK;
 | 
	
		
			
				|  |  | +    case 'bpmn:exclusiveGateway':
 | 
	
		
			
				|  |  | +      return TurboType.EXCLUSIVE_GATEWAY;
 | 
	
		
			
				|  |  | +    default:
 | 
	
		
			
				|  |  | +      return type;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function convertNodeToTurboElement(node) {
 | 
	
		
			
				|  |  | +  const { id, type, x, y, text = '', properties } = node;
 | 
	
		
			
				|  |  | +  return {
 | 
	
		
			
				|  |  | +    incoming: [],
 | 
	
		
			
				|  |  | +    outgoing: [],
 | 
	
		
			
				|  |  | +    dockers: [],
 | 
	
		
			
				|  |  | +    type: getTurboType(node.type),
 | 
	
		
			
				|  |  | +    properties: {
 | 
	
		
			
				|  |  | +      ...properties,
 | 
	
		
			
				|  |  | +      name: (text && text.value) || '',
 | 
	
		
			
				|  |  | +      x: x,
 | 
	
		
			
				|  |  | +      y: y,
 | 
	
		
			
				|  |  | +      text,
 | 
	
		
			
				|  |  | +      logicFlowType: type,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    key: id,
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function convertEdgeToTurboElement(edge) {
 | 
	
		
			
				|  |  | +  const {
 | 
	
		
			
				|  |  | +    id,
 | 
	
		
			
				|  |  | +    type,
 | 
	
		
			
				|  |  | +    sourceNodeId,
 | 
	
		
			
				|  |  | +    targetNodeId,
 | 
	
		
			
				|  |  | +    startPoint,
 | 
	
		
			
				|  |  | +    endPoint,
 | 
	
		
			
				|  |  | +    pointsList,
 | 
	
		
			
				|  |  | +    text = '',
 | 
	
		
			
				|  |  | +    properties,
 | 
	
		
			
				|  |  | +  } = edge;
 | 
	
		
			
				|  |  | +  return {
 | 
	
		
			
				|  |  | +    incoming: [sourceNodeId],
 | 
	
		
			
				|  |  | +    outgoing: [targetNodeId],
 | 
	
		
			
				|  |  | +    type: getTurboType(type),
 | 
	
		
			
				|  |  | +    dockers: [],
 | 
	
		
			
				|  |  | +    properties: {
 | 
	
		
			
				|  |  | +      ...properties,
 | 
	
		
			
				|  |  | +      name: (text && text.value) || '',
 | 
	
		
			
				|  |  | +      text,
 | 
	
		
			
				|  |  | +      startPoint,
 | 
	
		
			
				|  |  | +      endPoint,
 | 
	
		
			
				|  |  | +      pointsList,
 | 
	
		
			
				|  |  | +      logicFlowType: type,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    key: id,
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export function toTurboData(data) {
 | 
	
		
			
				|  |  | +  const nodeMap = new Map();
 | 
	
		
			
				|  |  | +  const turboData = {
 | 
	
		
			
				|  |  | +    flowElementList: [],
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  data.nodes.forEach((node) => {
 | 
	
		
			
				|  |  | +    const flowElement = convertNodeToTurboElement(node);
 | 
	
		
			
				|  |  | +    turboData.flowElementList.push(flowElement);
 | 
	
		
			
				|  |  | +    nodeMap.set(node.id, flowElement);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  data.edges.forEach((edge) => {
 | 
	
		
			
				|  |  | +    const flowElement = convertEdgeToTurboElement(edge);
 | 
	
		
			
				|  |  | +    const sourceElement = nodeMap.get(edge.sourceNodeId);
 | 
	
		
			
				|  |  | +    sourceElement.outgoing.push(flowElement.key);
 | 
	
		
			
				|  |  | +    const targetElement = nodeMap.get(edge.targetNodeId);
 | 
	
		
			
				|  |  | +    targetElement.incoming.push(flowElement.key);
 | 
	
		
			
				|  |  | +    turboData.flowElementList.push(flowElement);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return turboData;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function convertFlowElementToEdge(element) {
 | 
	
		
			
				|  |  | +  const { incoming, outgoing, properties, key } = element;
 | 
	
		
			
				|  |  | +  const { text, startPoint, endPoint, pointsList, logicFlowType } = properties;
 | 
	
		
			
				|  |  | +  const edge = {
 | 
	
		
			
				|  |  | +    id: key,
 | 
	
		
			
				|  |  | +    type: logicFlowType,
 | 
	
		
			
				|  |  | +    sourceNodeId: incoming[0],
 | 
	
		
			
				|  |  | +    targetNodeId: outgoing[0],
 | 
	
		
			
				|  |  | +    text,
 | 
	
		
			
				|  |  | +    startPoint,
 | 
	
		
			
				|  |  | +    endPoint,
 | 
	
		
			
				|  |  | +    pointsList,
 | 
	
		
			
				|  |  | +    properties: {},
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  const excludeProperties = ['startPoint', 'endPoint', 'pointsList', 'text', 'logicFlowType'];
 | 
	
		
			
				|  |  | +  Object.keys(element.properties).forEach((property) => {
 | 
	
		
			
				|  |  | +    if (excludeProperties.indexOf(property) === -1) {
 | 
	
		
			
				|  |  | +      edge.properties[property] = element.properties[property];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return edge;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function convertFlowElementToNode(element) {
 | 
	
		
			
				|  |  | +  const { properties, key } = element;
 | 
	
		
			
				|  |  | +  const { x, y, text, logicFlowType } = properties;
 | 
	
		
			
				|  |  | +  const node = {
 | 
	
		
			
				|  |  | +    id: key,
 | 
	
		
			
				|  |  | +    type: logicFlowType,
 | 
	
		
			
				|  |  | +    x,
 | 
	
		
			
				|  |  | +    y,
 | 
	
		
			
				|  |  | +    text,
 | 
	
		
			
				|  |  | +    properties: {},
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  const excludeProperties = ['x', 'y', 'text', 'logicFlowType'];
 | 
	
		
			
				|  |  | +  Object.keys(element.properties).forEach((property) => {
 | 
	
		
			
				|  |  | +    if (excludeProperties.indexOf(property) === -1) {
 | 
	
		
			
				|  |  | +      node.properties[property] = element.properties[property];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return node;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export function toLogicflowData(data) {
 | 
	
		
			
				|  |  | +  const lfData = {
 | 
	
		
			
				|  |  | +    nodes: [],
 | 
	
		
			
				|  |  | +    edges: [],
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  const list = data.flowElementList;
 | 
	
		
			
				|  |  | +  list &&
 | 
	
		
			
				|  |  | +    list.length > 0 &&
 | 
	
		
			
				|  |  | +    list.forEach((element) => {
 | 
	
		
			
				|  |  | +      if (element.type === TurboType.SEQUENCE_FLOW) {
 | 
	
		
			
				|  |  | +        const edge = convertFlowElementToEdge(element);
 | 
	
		
			
				|  |  | +        lfData.edges.push(edge);
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        const node = convertFlowElementToNode(element);
 | 
	
		
			
				|  |  | +        lfData.nodes.push(node);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  return lfData;
 | 
	
		
			
				|  |  | +}
 |