Add simple tree graph mode #4
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -1,11 +1,18 @@
 | 
				
			|||||||
 | 
					import { mdiXml } from "@mdi/js";
 | 
				
			||||||
 | 
					import Icon from "@mdi/react";
 | 
				
			||||||
 | 
					import PictureAsPdfIcon from "@mui/icons-material/PictureAsPdf";
 | 
				
			||||||
 | 
					import { IconButton, Tooltip } from "@mui/material";
 | 
				
			||||||
 | 
					import jsPDF from "jspdf";
 | 
				
			||||||
import React from "react";
 | 
					import React from "react";
 | 
				
			||||||
 | 
					import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
 | 
				
			||||||
import { Couple } from "../../api/CoupleApi";
 | 
					import { Couple } from "../../api/CoupleApi";
 | 
				
			||||||
import { Member } from "../../api/MemberApi";
 | 
					import { Member } from "../../api/MemberApi";
 | 
				
			||||||
import { FamilyTreeNode } from "../../utils/family_tree";
 | 
					 | 
				
			||||||
import { getTextWidth } from "../../utils/render_utils";
 | 
					 | 
				
			||||||
import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
 | 
					 | 
				
			||||||
import { useDarkTheme } from "../../hooks/context_providers/DarkThemeProvider";
 | 
					import { useDarkTheme } from "../../hooks/context_providers/DarkThemeProvider";
 | 
				
			||||||
 | 
					import { FamilyTreeNode } from "../../utils/family_tree";
 | 
				
			||||||
 | 
					import { downloadBlob } from "../../utils/files_utils";
 | 
				
			||||||
 | 
					import { getTextWidth } from "../../utils/render_utils";
 | 
				
			||||||
import "./simpletree.css";
 | 
					import "./simpletree.css";
 | 
				
			||||||
 | 
					import "./Roboto-normal";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const FACE_WIDTH = 60;
 | 
					const FACE_WIDTH = 60;
 | 
				
			||||||
const FACE_HEIGHT = 70;
 | 
					const FACE_HEIGHT = 70;
 | 
				
			||||||
@@ -153,11 +160,66 @@ export function SimpleFamilyTree(p: {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  console.info(`tree width=${tree.width} height=${height}`);
 | 
					  console.info(`tree width=${tree.width} height=${height}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const doExport = async (onlySVG: boolean) => {
 | 
				
			||||||
 | 
					    const el = document.querySelector(".simpletree")!;
 | 
				
			||||||
 | 
					    const svg = el.outerHTML;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Download in SVG format
 | 
				
			||||||
 | 
					    if (onlySVG) {
 | 
				
			||||||
 | 
					      const blob = new Blob([svg], {
 | 
				
			||||||
 | 
					        type: "image/svg+xml",
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      downloadBlob(blob, "ArbreGenealogique.svg");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const PDF_MARGIN = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Download in PDF format
 | 
				
			||||||
 | 
					    const doc = new jsPDF({
 | 
				
			||||||
 | 
					      orientation: "l",
 | 
				
			||||||
 | 
					      format: [height + PDF_MARGIN * 2, tree.width + PDF_MARGIN * 2],
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    doc.setFont("Roboto", "normal");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await doc.svg(el, {
 | 
				
			||||||
 | 
					      x: PDF_MARGIN,
 | 
				
			||||||
 | 
					      y: PDF_MARGIN,
 | 
				
			||||||
 | 
					      height: height,
 | 
				
			||||||
 | 
					      width: tree.width,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Save the created pdf
 | 
				
			||||||
 | 
					    doc.save("ArbreGenealogique.pdf");
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const exportPDF = () => doExport(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const exportSVG = () => doExport(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
 | 
					    <div>
 | 
				
			||||||
 | 
					      <div style={{ textAlign: "right" }}>
 | 
				
			||||||
 | 
					        <Tooltip title="Exporter le graphique au format PDF">
 | 
				
			||||||
 | 
					          <IconButton onClick={exportPDF}>
 | 
				
			||||||
 | 
					            <PictureAsPdfIcon />
 | 
				
			||||||
 | 
					          </IconButton>
 | 
				
			||||||
 | 
					        </Tooltip>
 | 
				
			||||||
 | 
					        <Tooltip title="Exporter le graphique au format SVG">
 | 
				
			||||||
 | 
					          <IconButton onClick={exportSVG}>
 | 
				
			||||||
 | 
					            <Icon path={mdiXml} size={1} />
 | 
				
			||||||
 | 
					          </IconButton>
 | 
				
			||||||
 | 
					        </Tooltip>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
      <TransformWrapper maxScale={15} minScale={0.2}>
 | 
					      <TransformWrapper maxScale={15} minScale={0.2}>
 | 
				
			||||||
        <TransformComponent wrapperStyle={{ width: "100%", flex: "1" }}>
 | 
					        <TransformComponent wrapperStyle={{ width: "100%", flex: "1" }}>
 | 
				
			||||||
          <svg
 | 
					          <svg
 | 
				
			||||||
          className={`simpletree ${darkTheme.enabled ? "simpletree-dark" : ""}`}
 | 
					            className={`simpletree ${
 | 
				
			||||||
 | 
					              darkTheme.enabled ? "simpletree-dark" : ""
 | 
				
			||||||
 | 
					            }`}
 | 
				
			||||||
            width={tree.width}
 | 
					            width={tree.width}
 | 
				
			||||||
            height={height}
 | 
					            height={height}
 | 
				
			||||||
            xmlns="http://www.w3.org/2000/svg"
 | 
					            xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
@@ -166,6 +228,7 @@ export function SimpleFamilyTree(p: {
 | 
				
			|||||||
          </svg>
 | 
					          </svg>
 | 
				
			||||||
        </TransformComponent>
 | 
					        </TransformComponent>
 | 
				
			||||||
      </TransformWrapper>
 | 
					      </TransformWrapper>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user