Add a setting to resize table width (#21)

This commit is contained in:
1ilit 2024-04-10 06:47:06 +03:00
parent 6ab13a70d2
commit 895c1da2b0
9 changed files with 65 additions and 38 deletions

View File

@ -41,7 +41,7 @@ export default function Relationship({ data }) {
cardinalityStartX = point1.x; cardinalityStartX = point1.x;
cardinalityStartY = point1.y; cardinalityStartY = point1.y;
const point2 = pathRef.current.getPointAtLength( const point2 = pathRef.current.getPointAtLength(
pathLength - cardinalityOffset pathLength - cardinalityOffset,
); );
cardinalityEndX = point2.x; cardinalityEndX = point2.x;
cardinalityEndY = point2.y; cardinalityEndY = point2.y;
@ -51,17 +51,20 @@ export default function Relationship({ data }) {
<g className="select-none group"> <g className="select-none group">
<path <path
ref={pathRef} ref={pathRef}
d={calcPath({ d={calcPath(
...data, {
startTable: { ...data,
x: tables[data.startTableId].x, startTable: {
y: tables[data.startTableId].y, x: tables[data.startTableId].x,
y: tables[data.startTableId].y,
},
endTable: {
x: tables[data.endTableId].x,
y: tables[data.endTableId].y,
},
}, },
endTable: { settings.tableWidth,
x: tables[data.endTableId].x, )}
y: tables[data.endTableId].y,
},
})}
stroke="gray" stroke="gray"
className="group-hover:stroke-sky-700" className="group-hover:stroke-sky-700"
fill="none" fill="none"

View File

@ -39,7 +39,7 @@ export default function Table(props) {
key={tableData.id} key={tableData.id}
x={tableData.x} x={tableData.x}
y={tableData.y} y={tableData.y}
width={200} width={settings.tableWidth}
height={height} height={height}
className="group drop-shadow-lg rounded-md cursor-move" className="group drop-shadow-lg rounded-md cursor-move"
onMouseDown={onMouseDown} onMouseDown={onMouseDown}

View File

@ -187,7 +187,7 @@ export default function ControlPanel({
return { ...t, fields: temp.map((t, i) => ({ ...t, id: i })) }; return { ...t, fields: temp.map((t, i) => ({ ...t, id: i })) };
} }
return t; return t;
}) }),
); );
} else if (a.component === "field_add") { } else if (a.component === "field_add") {
updateTable(a.tid, { updateTable(a.tid, {
@ -209,7 +209,7 @@ export default function ControlPanel({
...index, ...index,
...a.undo, ...a.undo,
} }
: index : index,
), ),
}); });
} else if (a.component === "index_delete") { } else if (a.component === "index_delete") {
@ -224,27 +224,27 @@ export default function ControlPanel({
}; };
} }
return table; return table;
}) }),
); );
} else if (a.component === "self") { } else if (a.component === "self") {
updateTable(a.tid, a.undo); updateTable(a.tid, a.undo);
} }
} else if (a.element === ObjectType.RELATIONSHIP) { } else if (a.element === ObjectType.RELATIONSHIP) {
setRelationships((prev) => setRelationships((prev) =>
prev.map((e, idx) => (idx === a.rid ? { ...e, ...a.undo } : e)) prev.map((e, idx) => (idx === a.rid ? { ...e, ...a.undo } : e)),
); );
} else if (a.element === ObjectType.TYPE) { } else if (a.element === ObjectType.TYPE) {
if (a.component === "field_add") { if (a.component === "field_add") {
updateType(a.tid, { updateType(a.tid, {
fields: types[a.tid].fields.filter( fields: types[a.tid].fields.filter(
(e, i) => i !== types[a.tid].fields.length - 1 (e, i) => i !== types[a.tid].fields.length - 1,
), ),
}); });
} }
if (a.component === "field") { if (a.component === "field") {
updateType(a.tid, { updateType(a.tid, {
fields: types[a.tid].fields.map((e, i) => fields: types[a.tid].fields.map((e, i) =>
i === a.fid ? { ...e, ...a.undo } : e i === a.fid ? { ...e, ...a.undo } : e,
), ),
}); });
} else if (a.component === "field_delete") { } else if (a.component === "field_delete") {
@ -256,7 +256,7 @@ export default function ControlPanel({
return { ...t, fields: temp }; return { ...t, fields: temp };
} }
return t; return t;
}) }),
); );
} else if (a.component === "self") { } else if (a.component === "self") {
updateType(a.tid, a.undo); updateType(a.tid, a.undo);
@ -388,7 +388,7 @@ export default function ControlPanel({
}; };
} }
return table; return table;
}) }),
); );
} else if (a.component === "index") { } else if (a.component === "index") {
updateTable(a.tid, { updateTable(a.tid, {
@ -398,7 +398,7 @@ export default function ControlPanel({
...index, ...index,
...a.redo, ...a.redo,
} }
: index : index,
), ),
}); });
} else if (a.component === "index_delete") { } else if (a.component === "index_delete") {
@ -412,7 +412,7 @@ export default function ControlPanel({
} }
} else if (a.element === ObjectType.RELATIONSHIP) { } else if (a.element === ObjectType.RELATIONSHIP) {
setRelationships((prev) => setRelationships((prev) =>
prev.map((e, idx) => (idx === a.rid ? { ...e, ...a.redo } : e)) prev.map((e, idx) => (idx === a.rid ? { ...e, ...a.redo } : e)),
); );
} else if (a.element === ObjectType.TYPE) { } else if (a.element === ObjectType.TYPE) {
if (a.component === "field_add") { if (a.component === "field_add") {
@ -428,7 +428,7 @@ export default function ControlPanel({
} else if (a.component === "field") { } else if (a.component === "field") {
updateType(a.tid, { updateType(a.tid, {
fields: types[a.tid].fields.map((e, i) => fields: types[a.tid].fields.map((e, i) =>
i === a.fid ? { ...e, ...a.redo } : e i === a.fid ? { ...e, ...a.redo } : e,
), ),
}); });
} else if (a.component === "field_delete") { } else if (a.component === "field_delete") {
@ -466,7 +466,7 @@ export default function ControlPanel({
showFieldSummary: !prev.showFieldSummary, showFieldSummary: !prev.showFieldSummary,
})); }));
Toast.success( Toast.success(
`Field summary is ${settings.showFieldSummary ? "off" : "on"}.` `Field summary is ${settings.showFieldSummary ? "off" : "on"}.`,
); );
}; };
const copyAsImage = () => { const copyAsImage = () => {
@ -762,7 +762,7 @@ export default function ControlPanel({
data: dataUrl, data: dataUrl,
extension: "jpeg", extension: "jpeg",
})); }));
} },
); );
setModal(MODAL.IMG); setModal(MODAL.IMG);
}, },
@ -780,7 +780,7 @@ export default function ControlPanel({
title: title, title: title,
}, },
null, null,
2 2,
); );
setExportData((prev) => ({ setExportData((prev) => ({
...prev, ...prev,
@ -799,7 +799,7 @@ export default function ControlPanel({
data: dataUrl, data: dataUrl,
extension: "svg", extension: "svg",
})); }));
} },
); );
setModal(MODAL.IMG); setModal(MODAL.IMG);
}, },
@ -818,7 +818,7 @@ export default function ControlPanel({
0, 0,
0, 0,
canvas.offsetWidth, canvas.offsetWidth,
canvas.offsetHeight canvas.offsetHeight,
); );
doc.save(`${exportData.filename}.pdf`); doc.save(`${exportData.filename}.pdf`);
}); });
@ -838,7 +838,7 @@ export default function ControlPanel({
types: types, types: types,
}, },
null, null,
2 2,
); );
const blob = new Blob([result], { const blob = new Blob([result], {
type: "text/plain;charset=utf-8", type: "text/plain;charset=utf-8",
@ -1086,6 +1086,9 @@ export default function ControlPanel({
return { ...prev, panning: !prev.panning }; return { ...prev, panning: !prev.panning };
}), }),
}, },
"Table width": {
function: () => setModal(MODAL.TABLE_WIDTH),
},
"Flush storage": { "Flush storage": {
function: async () => { function: async () => {
db.delete() db.delete()
@ -1389,7 +1392,7 @@ export default function ControlPanel({
> >
{Object.keys(e)[0]} {Object.keys(e)[0]}
</Dropdown.Item> </Dropdown.Item>
) ),
)} )}
</Dropdown.Menu> </Dropdown.Menu>
} }

View File

@ -27,6 +27,7 @@ import New from "./New";
import ImportDiagram from "./ImportDiagram"; import ImportDiagram from "./ImportDiagram";
import ImportSource from "./ImportSource"; import ImportSource from "./ImportSource";
import Editor from "@monaco-editor/react"; import Editor from "@monaco-editor/react";
import SetTableWidth from "./SetTableWidth";
export default function Modal({ export default function Modal({
modal, modal,
@ -105,7 +106,7 @@ export default function Modal({
ast = parser.astify(importSource.src, { database: "MySQL" }); ast = parser.astify(importSource.src, { database: "MySQL" });
} catch (err) { } catch (err) {
Toast.error( Toast.error(
"Could not parse the sql file. Make sure there are no syntax errors." "Could not parse the sql file. Make sure there are no syntax errors.",
); );
return; return;
} }
@ -135,7 +136,7 @@ export default function Modal({
case MODAL.IMG: case MODAL.IMG:
saveAs( saveAs(
exportData.data, exportData.data,
`${exportData.filename}.${exportData.extension}` `${exportData.filename}.${exportData.extension}`,
); );
return; return;
case MODAL.CODE: { case MODAL.CODE: {
@ -259,6 +260,8 @@ export default function Modal({
</div> </div>
); );
} }
case MODAL.TABLE_WIDTH:
return <SetTableWidth />;
default: default:
return <></>; return <></>;
} }

View File

@ -0,0 +1,17 @@
import { InputNumber } from "@douyinfe/semi-ui";
import { useSettings } from "../../../hooks";
export default function SetTableWidth() {
const { settings, setSettings } = useSettings();
return (
<InputNumber
className="w-full"
value={settings.tableWidth}
onChange={(c) => {
if (c < 180) return;
setSettings((prev) => ({ ...prev, tableWidth: c }));
}}
/>
);
}

View File

@ -1,4 +1,5 @@
import { createContext, useState } from "react"; import { createContext, useState } from "react";
import { tableWidth } from "../data/constants";
export const SettingsContext = createContext(null); export const SettingsContext = createContext(null);
@ -11,6 +12,7 @@ export default function SettingsContextProvider({ children }) {
autosave: true, autosave: true,
panning: true, panning: true,
showCardinality: true, showCardinality: true,
tableWidth: tableWidth,
}); });
return ( return (

View File

@ -110,6 +110,7 @@ export const MODAL = {
SAVEAS: 6, SAVEAS: 6,
NEW: 7, NEW: 7,
IMPORT_SRC: 8, IMPORT_SRC: 8,
TABLE_WIDTH: 9,
}; };
export const STATUS = { export const STATUS = {

View File

@ -1,10 +1,6 @@
import { import { tableFieldHeight, tableHeaderHeight } from "../data/constants";
tableFieldHeight,
tableHeaderHeight,
tableWidth,
} from "../data/constants";
export function calcPath(r, zoom = 1) { export function calcPath(r, tableWidth = 200, zoom = 1) {
const width = tableWidth * zoom; const width = tableWidth * zoom;
let x1 = r.startTable.x; let x1 = r.startTable.x;
let y1 = let y1 =

View File

@ -17,6 +17,8 @@ export const getModalTitle = (modal) => {
return "Save as"; return "Save as";
case MODAL.NEW: case MODAL.NEW:
return "Create new diagram"; return "Create new diagram";
case MODAL.TABLE_WIDTH:
return "Set the table width";
default: default:
return ""; return "";
} }