in source/frontend/src/components/Drawer/Actions/TreeMenuExportMenu.js [13:152]
export default ({ compound }) => {
const [expanded, setExpanded] = React.useState([]);
const [saveJson, setSaveJson] = useState(false);
const [saveCSV, setSaveCSV] = useState(false);
const [savePNG, setSavePNG] = useState(false);
const [error, setError] = useState();
const handleToggle = (event, nodeIds) => {
setExpanded(nodeIds);
};
const handleSelect = (event, nodeId) => {
switch (nodeId) {
case '1':
setSaveCSV(!saveCSV);
return;
case '2':
setSaveJson(!saveJson);
return;
case '3':
setSavePNG(!savePNG);
return;
case '4':
generateDrawio();
return;
default:
}
};
const options = {
output: 'blob',
bg: '#fff',
full: true,
};
const exportView = () => {
return new Blob([compound.png(options)], { type: 'image/png' });
};
const exportJSON = () => {
// const expandableNodes = api.current.expandableNodes();
// api.current.expandAll();
const json = compound.json();
// api.current.collapse(expandableNodes);
return new Blob([JSON.stringify(json)], {
type: 'application/json;charset=utf-8',
});
};
const exportNodes = () => {
return compound.nodes().length > 0
? {
title: 'Current Graph',
nodes: processChildNodes(compound.nodes()[0], []),
}
: [];
};
const processChildNodes = (node, nodes) => {
let recursiveNodes = nodes;
if (node.children() && node.children().length > 0) {
node.children().forEach((child) => {
recursiveNodes.concat(processChildNodes(child, recursiveNodes));
});
} else {
recursiveNodes.push({ data: node.data() });
}
return recursiveNodes;
};
const generateDrawio = async () => {
const query = {
body: {data: compound.json().elements},
processor: (data) => data,
};
await sendDrawioPostRequest(query, query.processor)
.then(handleResponse)
.then((response) => window.open(response.body, '_blank', 'rel=noreferrer'))
.catch((err) => setError(err));
};
return (
<>
<ExpandableSection
className='second-level'
variant='navigation'
header='Export'>
<ColumnLayout columns={1} disableGutters>
<Button
variant='link'
onClick={() => setSavePNG(!savePNG)}
className='sidepanel-button'>
PNG
</Button>
<Button
variant='link'
onClick={() => setSaveCSV(!saveCSV)}
className='sidepanel-button'>
CSV
</Button>
<Button
variant='link'
onClick={() => setSaveJson(!saveJson)}
className='sidepanel-button'>
JSON
</Button>
<Button
iconName='external'
variant='link'
onClick={generateDrawio}
className='sidepanel-button'>
Drawio
</Button>
</ColumnLayout>
</ExpandableSection>
{saveJson && (
<SaveDialog
title='Download as JSON'
blob={exportJSON()}
type='json'
toggleDialog={() => setSaveJson(!saveJson)}
/>
)}
{saveCSV && (
<ExportTable
nodes={exportNodes()}
toggleDialog={() => setSaveCSV(!saveCSV)}
/>
)}
{savePNG && (
<SaveDialog
title='Download as PNG'
blob={exportView()}
type='png'
toggleDialog={() => setSavePNG(!savePNG)}
/>
)}
</>
);
};