helpers.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { CanvasDirection, NodeData, EdgeData } from "reaflow";
  2. import { parser } from "src/utils/json-editor-parser";
  3. export function getEdgeNodes(
  4. graph: string,
  5. isExpanded: boolean = true
  6. ): {
  7. nodes: NodeData[];
  8. edges: EdgeData[];
  9. } {
  10. const elements = parser(JSON.parse(graph));
  11. let nodes: NodeData[] = [],
  12. edges: EdgeData[] = [];
  13. for (let i = 0; i < elements.length; i++) {
  14. const el = elements[i];
  15. if (isNode(el)) {
  16. const text = renderText(el.text);
  17. const lines = text.split("\n");
  18. const lineLengths = lines
  19. .map((line) => line.length)
  20. .sort((a, b) => a - b);
  21. const longestLine = lineLengths.reverse()[0];
  22. const height = lines.length * 17.8 < 30 ? 40 : lines.length * 17.8;
  23. nodes.push({
  24. id: el.id,
  25. text: el.text,
  26. data: {
  27. isParent: el.parent,
  28. },
  29. width: isExpanded ? 35 + longestLine * (el.parent ? 9 : 8) : 180,
  30. height,
  31. });
  32. } else {
  33. edges.push(el);
  34. }
  35. }
  36. return {
  37. nodes,
  38. edges,
  39. };
  40. }
  41. export function getNextLayout(layout: CanvasDirection) {
  42. switch (layout) {
  43. case "RIGHT":
  44. return "DOWN";
  45. case "DOWN":
  46. return "LEFT";
  47. case "LEFT":
  48. return "UP";
  49. default:
  50. return "RIGHT";
  51. }
  52. }
  53. function renderText(value: string | object) {
  54. if (value instanceof Object) {
  55. let temp = "";
  56. const entries = Object.entries(value);
  57. if (Object.keys(value).every((val) => !isNaN(+val))) {
  58. return Object.values(value).join("");
  59. }
  60. entries.forEach((entry) => {
  61. temp += `${entry[0]}: ${String(entry[1])}\n`;
  62. });
  63. return temp;
  64. }
  65. return value;
  66. }
  67. function isNode(element: NodeData | EdgeData) {
  68. if ("text" in element) return true;
  69. return false;
  70. }