fix: handle graph with new depends_on structures

pull/117/head
corpulent 3 years ago
parent d1395f12d2
commit 4e7476e23f

@ -8,7 +8,8 @@ import {
IServiceNodeItem, IServiceNodeItem,
IVolumeNodeItem, IVolumeNodeItem,
IServiceNodePosition, IServiceNodePosition,
IProject IProject,
IEditServiceFormDependsOn
} from "../../types"; } from "../../types";
import eventBus from "../../events/eventBus"; import eventBus from "../../events/eventBus";
import { useMutation } from "react-query"; import { useMutation } from "react-query";
@ -40,6 +41,7 @@ import EditVolumeModal from "../modals/docker-compose/volume/EditVolumeModal";
import CodeEditor from "../CodeEditor"; import CodeEditor from "../CodeEditor";
import { useTitle } from "../../hooks"; import { useTitle } from "../../hooks";
import VisibilitySwitch from "../global/VisibilitySwitch"; import VisibilitySwitch from "../global/VisibilitySwitch";
import _ from "lodash";
interface IProjectProps { interface IProjectProps {
isAuthenticated: boolean; isAuthenticated: boolean;
@ -248,6 +250,22 @@ export default function Project(props: IProjectProps) {
setNetworks({ ..._networks }); setNetworks({ ..._networks });
}; };
const getDependsOnKeys = (dependsOn: any): string[] => {
let dependsOnKeys: string[] = [];
if (dependsOn) {
if (dependsOn.constructor === Object) {
dependsOnKeys = Object.keys(dependsOn);
}
if (Array.isArray(dependsOn)) {
dependsOnKeys = dependsOn as [];
}
}
return dependsOnKeys;
};
const onUpdateEndpoint = (nodeItem: IServiceNodeItem) => { const onUpdateEndpoint = (nodeItem: IServiceNodeItem) => {
const key = nodeItem.key; const key = nodeItem.key;
@ -266,23 +284,21 @@ export default function Project(props: IProjectProps) {
}); });
} }
if ( const dependsOnData = nodeItem.serviceConfig.depends_on;
nodeItem.serviceConfig?.depends_on && const dependsOnKeys = getDependsOnKeys(dependsOnData);
Array.isArray(nodeItem.serviceConfig.depends_on)
) {
nodeItem.serviceConfig.depends_on.forEach((dep: string) => {
const depObject = Object.keys(nodes).find((key: string) => {
const node = nodes[key];
if (node.canvasConfig.node_name === dep) {
return node;
}
});
if (depObject) { dependsOnKeys.forEach((dep: string) => {
onConnectionAttached([key, depObject]); const depObject = Object.keys(nodes).find((key: string) => {
const node = nodes[key];
if (node.canvasConfig.node_name === dep) {
return node;
} }
}); });
}
if (depObject) {
onConnectionAttached([key, depObject]);
}
});
setNodes({ ...nodes, [nodeItem.key]: nodeItem }); setNodes({ ...nodes, [nodeItem.key]: nodeItem });
}; };
@ -301,19 +317,25 @@ export default function Project(props: IProjectProps) {
} as IServiceNodeItem; } as IServiceNodeItem;
const targetNode = stateNodesRef.current[data[1]]; const targetNode = stateNodesRef.current[data[1]];
const targetServiceName = targetNode.canvasConfig.node_name; const targetServiceName = targetNode.canvasConfig.node_name;
const sourceDependsOn = sourceNode.serviceConfig.depends_on as string[]; const sourceDependsOn = sourceNode.serviceConfig.depends_on as any;
if (sourceDependsOn && sourceDependsOn.length) { if (targetServiceName) {
if (targetServiceName) { const dependsOnKeys = getDependsOnKeys(sourceDependsOn);
const filtered = sourceDependsOn.filter(
(nodeName: string) => nodeName !== targetServiceName dependsOnKeys.forEach((key: string) => {
); if (key === targetServiceName) {
if (Array.isArray(sourceDependsOn)) {
if (filtered.length) { _.remove(sourceDependsOn, (key) => key === targetServiceName);
sourceNode.serviceConfig.depends_on = filtered; }
} else {
delete sourceNode.serviceConfig.depends_on; if (sourceDependsOn && sourceDependsOn.constructor === Object) {
delete sourceDependsOn[key];
}
} }
});
if (!getDependsOnKeys(sourceDependsOn).length) {
delete sourceNode.serviceConfig.depends_on;
} }
} }
} }
@ -337,12 +359,21 @@ export default function Project(props: IProjectProps) {
} as IServiceNodeItem; } as IServiceNodeItem;
const targetNode = stateNodesRef.current[data[1]]; const targetNode = stateNodesRef.current[data[1]];
const targetServiceName = targetNode.canvasConfig.node_name; const targetServiceName = targetNode.canvasConfig.node_name;
let sourceDependsOn = sourceNode.serviceConfig.depends_on as string[]; let sourceDependsOn = sourceNode.serviceConfig.depends_on as any;
const dependsOnKeys = getDependsOnKeys(sourceDependsOn);
if (sourceDependsOn && sourceDependsOn.length) { if (sourceDependsOn) {
if (targetServiceName) { if (targetServiceName) {
if (!sourceDependsOn.includes(targetServiceName)) { if (!dependsOnKeys.includes(targetServiceName)) {
sourceDependsOn.push(targetServiceName); if (Array.isArray(sourceDependsOn)) {
sourceDependsOn.push(targetServiceName);
}
if (sourceDependsOn.constructor === Object) {
sourceDependsOn[targetServiceName] = {
condition: "service_healthy"
};
}
} }
} }
} else { } else {

Loading…
Cancel
Save