public override string DuplicateNode(string originalNodeConfigId, string desingComponentJson) { if (string.IsNullOrEmpty(originalNodeConfigId)) { throw new Exception("Missing node component id"); } var oldNodeConfiguration = Source.Nodes?.FirstOrDefault(it => it.Id == originalNodeConfigId); if (oldNodeConfiguration == null) { throw new Exception("Missing node configuration"); } var hyperWorkflowHyperNodeData = (HyperWorkflowNodeData)oldNodeConfiguration.CreateNodeInstance(true); FlowDesignComponent nodeConfig = JsonConvert.DeserializeObject <FlowDesignComponent>(desingComponentJson, FlowDesignConverter.Settings); var types = GetHyperWorkflowNodeDataTypes(); var type = types.FirstOrDefault(it => it.FullName == nodeConfig.Type); if (type == null) { throw new ApplicationException("Missing node type"); } var node = new NodeConfiguration(type) { AllowMultiOutputPortConnections = true }; node.CopySettingsFromNode(hyperWorkflowHyperNodeData); nodeConfig.Id = node.Id; var nodeName = nodeConfig.State.Text; if (nodeName != null) { node.Name = nodeName; } var nodeColor = nodeConfig.State.Color; if (!string.IsNullOrEmpty(nodeColor)) { var colorR = UniColorFromHex(nodeColor); node.Color = colorR; } var nodeGroup = nodeConfig.Group; if (nodeGroup != null) { node.Group = nodeGroup; } node.GUIPosition = new UniPoint2f(nodeConfig.X, nodeConfig.Y); Source.AddNode(node); var nodeConfigJson = JsonConvert.SerializeObject(nodeConfig, FlowDesignConverter.Settings); return(nodeConfigJson); }