diff --git a/src/components/control_panel.jsx b/src/components/control_panel.jsx index 9b009dc..49a150d 100644 --- a/src/components/control_panel.jsx +++ b/src/components/control_panel.jsx @@ -19,7 +19,7 @@ import { Image, Modal, } from "@douyinfe/semi-ui"; -import { toPng, toJpeg } from "html-to-image"; +import { toPng, toJpeg, toSvg } from "html-to-image"; import { saveAs } from "file-saver"; export default function ControlPanel() { @@ -65,7 +65,7 @@ export default function ControlPanel() { "Export as": { children: [ { - ".png": () => { + PNG: () => { toPng(document.getElementById("canvas")).then(function (dataUrl) { setDataUrl(dataUrl); }); @@ -74,7 +74,7 @@ export default function ControlPanel() { }, }, { - ".jpeg": () => { + JPEG: () => { toJpeg(document.getElementById("canvas"), { quality: 0.95 }).then( function (dataUrl) { setDataUrl(dataUrl); @@ -84,9 +84,20 @@ export default function ControlPanel() { setExtension("jpeg"); }, }, - { ".xml": () => {} }, - { ".svg": () => {} }, - { ".pdf": () => {} }, + { XML: () => {} }, + { + SVG: () => { + const filter = (node) => node.tagName !== "i"; + toSvg(document.getElementById("canvas"), { filter: filter }).then( + function (dataUrl) { + setDataUrl(dataUrl); + } + ); + setVisible(true); + setExtension("svg"); + }, + }, + { PDF: () => {} }, ], function: () => {}, }, @@ -374,7 +385,16 @@ export default function ControlPanel() { style={{ width: "180px" }} render={ - }> + + ) : ( +
+ ) + } + onClick={() => setShowToolBar((prev) => !prev)} + > Header
}> diff --git a/src/components/editor_panel.jsx b/src/components/editor_panel.jsx index d1987df..6816895 100644 --- a/src/components/editor_panel.jsx +++ b/src/components/editor_panel.jsx @@ -5,14 +5,12 @@ import { createTheme } from "@uiw/codemirror-themes"; import { sql } from "@codemirror/lang-sql"; import { tags as t } from "@lezer/highlight"; import Shape from "./shape"; -import { toPng } from "html-to-image"; import { Parser } from "node-sql-parser"; import { Tabs } from "@douyinfe/semi-ui"; import "react-resizable/css/styles.css"; import TableOverview from "./table_overview"; import ReferenceOverview from "./reference_overview"; import { defaultTableTheme } from "../data/data"; -import { ImagePreview } from "@douyinfe/semi-ui"; const myTheme = createTheme({ dark: "light", @@ -32,13 +30,6 @@ const EditorPanel = (props) => { const [tab, setTab] = useState("1"); const map = useRef(new Map()); - const [visible1, setVisible1] = useState(false); - const [dataUrl, setDataUrl] = useState(""); - - const visibleChange1 = (v) => { - setVisible1(v); - }; - const tabList = [ { tab: "Tables", itemKey: "1" }, { tab: "References", itemKey: "2" }, @@ -169,24 +160,6 @@ const EditorPanel = (props) => { > parse -
- - - ); diff --git a/src/components/table_overview.jsx b/src/components/table_overview.jsx index cdfe369..70f96a8 100644 --- a/src/components/table_overview.jsx +++ b/src/components/table_overview.jsx @@ -12,6 +12,7 @@ import { Select, AutoComplete, Toast, + Empty, } from "@douyinfe/semi-ui"; import { IconMore, @@ -22,6 +23,10 @@ import { IconPlus, IconSearch, } from "@douyinfe/semi-icons"; +import { + IllustrationNoContent, + IllustrationNoContentDark, +} from "@douyinfe/semi-illustrations"; export default function TableOverview(props) { const [indexActiveKey, setIndexActiveKey] = useState(""); @@ -141,406 +146,422 @@ export default function TableOverview(props) { onChange={(k) => setTableActiveKey(k)} accordion > - {props.tables.map((t, i) => ( -
- {t.name}
} itemKey={`${t.id}`}> - {t.fields.map((f, j) => ( -
updatedField(i, j, value.values)} - > - + } + darkModeImage={ + + } + title="No tables" + description="Start building your diagram!" + /> + ) : ( + props.tables.map((t, i) => ( +
+ {t.name}
} itemKey={`${t.id}`}> + {t.fields.map((f, j) => ( + updatedField(i, j, value.values)} > - - - - - { - return { - label: value, - value: value, - }; - })} - filter - initValue={f.type} - placeholder="Type" - > - - - - - - - - - - - updatedField(i, j, value.values) - } - > - - -
- - - updatedField(i, j, { - [checkedValues.target.value]: - checkedValues.target.checked, - }) - } - > -
-
- - - updatedField(i, j, { - [checkedValues.target.value]: - checkedValues.target.checked, - }) - } - > -
- - - + + + + + + +
+ updatedField(i, j, value.values) + } + > + + +
+ + + updatedField(i, j, { + [checkedValues.target.value]: + checkedValues.target.checked, + }) + } + > +
+
+ + + updatedField(i, j, { + [checkedValues.target.value]: + checkedValues.target.checked, + }) + } + > +
+ + + + + } + trigger="click" + position="rightTop" + showArrow + > + +
+ +
+ + ))} + {t.indices.length > 0 && ( + + setIndexActiveKey(itemKey)} + > + + {t.indices.map((idx, k) => ( +
+ ({ - value: e.name, - label: e.name, - }))} - className="w-full" - defaultValue={idx.fields} - onChange={(value) => { - const updatedTables = [...props.tables]; - const updatedIndices = [...t.indices]; - updatedIndices[k] = { - name: `${value.join("_")}_index`, - fields: [...value], - }; - updatedTables[i] = { - ...t, - indices: [...updatedIndices], - }; - props.setTables(updatedTables); - }} - /> - -
- - - -
- } - trigger="click" - position="rightTop" - showArrow - > - - - - ))} + + +
updateTable(i, value.values)}> + updateTable(i, { comment: "" })} + initValue={t.comment} + autosize + placeholder="Add comment" + rows={1} + /> +
- )} - - - -
updateTable(i, value.values)}> - updateTable(i, { comment: "" })} - initValue={t.comment} - autosize - placeholder="Add comment" - rows={1} - /> - -
-
-
- - - -
-
Theme
- -
-
-
-
- {tableThemes - .slice(0, Math.ceil(tableThemes.length / 2)) - .map((c) => ( - +
+
+
+
+ {tableThemes + .slice(0, Math.ceil(tableThemes.length / 2)) + .map((c) => ( + + ))} +
+
+ {tableThemes + .slice(Math.ceil(tableThemes.length / 2)) + .map((c) => ( + - ))} -
-
- {tableThemes - .slice(Math.ceil(tableThemes.length / 2)) - .map((c) => ( - - ))} + + ))} +
- - } - trigger="click" - position="bottomLeft" - showArrow - > + } + trigger="click" + position="bottomLeft" + showArrow + > + +
+ + + + + + + + - - - - - - - - - - - -
- - - ))} + + + + + )) + )} );