Abstract types from editor

This commit is contained in:
1ilit 2024-03-13 01:27:42 +02:00
parent 1280219ac9
commit 24eecdc39b
8 changed files with 136 additions and 120 deletions

View File

@ -43,11 +43,7 @@ import {
jsonToMariaDB, jsonToMariaDB,
jsonToSQLServer, jsonToSQLServer,
} from "../utils/toSQL"; } from "../utils/toSQL";
import { import { StateContext, TabContext } from "../pages/Editor";
StateContext,
TabContext,
TypeContext,
} from "../pages/Editor";
import { IconAddTable, IconAddArea, IconAddNote } from "./CustomIcons"; import { IconAddTable, IconAddArea, IconAddNote } from "./CustomIcons";
import { ObjectType, Action, Tab, State, Cardinality } from "../data/data"; import { ObjectType, Action, Tab, State, Cardinality } from "../data/data";
import jsPDF from "jspdf"; import jsPDF from "jspdf";
@ -71,6 +67,7 @@ import { ddbDiagramIsValid, jsonDiagramIsValid } from "../utils/validateSchema";
import { dataURItoBlob } from "../utils/utils"; import { dataURItoBlob } from "../utils/utils";
import useAreas from "../hooks/useAreas"; import useAreas from "../hooks/useAreas";
import useNotes from "../hooks/useNotes"; import useNotes from "../hooks/useNotes";
import useTypes from "../hooks/useTypes";
export default function ControlPanel({ export default function ControlPanel({
diagramId, diagramId,
@ -135,10 +132,8 @@ export default function ControlPanel({
addRelationship, addRelationship,
deleteRelationship, deleteRelationship,
} = useTables(); } = useTables();
const { types, addType, deleteType, updateType, setTypes } = const { types, addType, deleteType, updateType, setTypes } = useTypes();
useContext(TypeContext); const { notes, setNotes, updateNote, addNote, deleteNote } = useNotes();
const { notes, setNotes, updateNote, addNote, deleteNote } =
useNotes();
const { areas, setAreas, updateArea, addArea, deleteArea } = useAreas(); const { areas, setAreas, updateArea, addArea, deleteArea } = useAreas();
const { undoStack, redoStack, setUndoStack, setRedoStack } = useUndoRedo(); const { undoStack, redoStack, setUndoStack, setRedoStack } = useUndoRedo();
const { selectedElement, setSelectedElement } = useSelect(); const { selectedElement, setSelectedElement } = useSelect();

View File

@ -1,14 +1,14 @@
import { useContext, useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { Collapse, Badge } from "@douyinfe/semi-ui"; import { Collapse, Badge } from "@douyinfe/semi-ui";
import { TypeContext } from "../pages/Editor";
import { arrayIsEqual } from "../utils/utils"; import { arrayIsEqual } from "../utils/utils";
import { getIssues } from "../utils/issues"; import { getIssues } from "../utils/issues";
import useSettings from "../hooks/useSettings"; import useSettings from "../hooks/useSettings";
import useTables from "../hooks/useTables"; import useTables from "../hooks/useTables";
import useTypes from "../hooks/useTypes";
export default function Issues() { export default function Issues() {
const { settings } = useSettings(); const { settings } = useSettings();
const { types } = useContext(TypeContext); const { types } = useTypes();
const { tables, relationships } = useTables(); const { tables, relationships } = useTables();
const [issues, setIssues] = useState([]); const [issues, setIssues] = useState([]);

View File

@ -31,13 +31,14 @@ import {
SideSheet, SideSheet,
Toast, Toast,
} from "@douyinfe/semi-ui"; } from "@douyinfe/semi-ui";
import { TabContext, TypeContext } from "../pages/Editor"; import { TabContext } from "../pages/Editor";
import { getSize, hasCheck, hasPrecision, isSized } from "../utils/toSQL"; import { getSize, hasCheck, hasPrecision, isSized } from "../utils/toSQL";
import useLayout from "../hooks/useLayout"; import useLayout from "../hooks/useLayout";
import useSettings from "../hooks/useSettings"; import useSettings from "../hooks/useSettings";
import useUndoRedo from "../hooks/useUndoRedo"; import useUndoRedo from "../hooks/useUndoRedo";
import useTables from "../hooks/useTables"; import useTables from "../hooks/useTables";
import useSelect from "../hooks/useSelect"; import useSelect from "../hooks/useSelect";
import useTypes from "../hooks/useTypes";
export default function Table(props) { export default function Table(props) {
const [isHovered, setIsHovered] = useState(false); const [isHovered, setIsHovered] = useState(false);
@ -48,7 +49,7 @@ export default function Table(props) {
useTables(); useTables();
const { tab, setTab } = useContext(TabContext); const { tab, setTab } = useContext(TabContext);
const { settings } = useSettings(); const { settings } = useSettings();
const { types } = useContext(TypeContext); const { types } = useTypes();
const { setUndoStack, setRedoStack } = useUndoRedo(); const { setUndoStack, setRedoStack } = useUndoRedo();
const { selectedElement, setSelectedElement } = useSelect(); const { selectedElement, setSelectedElement } = useSelect();

View File

@ -1,4 +1,4 @@
import { useContext, useState } from "react"; import { useState } from "react";
import { import {
Action, Action,
ObjectType, ObjectType,
@ -35,11 +35,11 @@ import {
IllustrationNoContent, IllustrationNoContent,
IllustrationNoContentDark, IllustrationNoContentDark,
} from "@douyinfe/semi-illustrations"; } from "@douyinfe/semi-illustrations";
import { TypeContext } from "../pages/Editor";
import { getSize, hasCheck, hasPrecision, isSized } from "../utils/toSQL"; import { getSize, hasCheck, hasPrecision, isSized } from "../utils/toSQL";
import useTables from "../hooks/useTables"; import useTables from "../hooks/useTables";
import useUndoRedo from "../hooks/useUndoRedo"; import useUndoRedo from "../hooks/useUndoRedo";
import useSelect from "../hooks/useSelect"; import useSelect from "../hooks/useSelect";
import useTypes from "../hooks/useTypes";
export default function TableOverview() { export default function TableOverview() {
const [indexActiveKey, setIndexActiveKey] = useState(""); const [indexActiveKey, setIndexActiveKey] = useState("");
@ -52,7 +52,7 @@ export default function TableOverview() {
updateTable, updateTable,
setRelationships, setRelationships,
} = useTables(); } = useTables();
const { types } = useContext(TypeContext); const { types } = useTypes();
const { setUndoStack, setRedoStack } = useUndoRedo(); const { setUndoStack, setRedoStack } = useUndoRedo();
const { selectedElement, setSelectedElement } = useSelect(); const { selectedElement, setSelectedElement } = useSelect();
const [editField, setEditField] = useState({}); const [editField, setEditField] = useState({});

View File

@ -1,4 +1,4 @@
import { useContext, useState } from "react"; import { useState } from "react";
import { Action, ObjectType, sqlDataTypes } from "../data/data"; import { Action, ObjectType, sqlDataTypes } from "../data/data";
import { import {
Collapse, Collapse,
@ -27,13 +27,13 @@ import {
IllustrationNoContent, IllustrationNoContent,
IllustrationNoContentDark, IllustrationNoContentDark,
} from "@douyinfe/semi-illustrations"; } from "@douyinfe/semi-illustrations";
import { TypeContext } from "../pages/Editor";
import { isSized, hasPrecision, getSize } from "../utils/toSQL"; import { isSized, hasPrecision, getSize } from "../utils/toSQL";
import useUndoRedo from "../hooks/useUndoRedo"; import useUndoRedo from "../hooks/useUndoRedo";
import useTypes from "../hooks/useTypes";
export default function TableOverview() { export default function TableOverview() {
const [value, setValue] = useState(""); const [value, setValue] = useState("");
const { types, addType, deleteType, updateType } = useContext(TypeContext); const { types, addType, deleteType, updateType } = useTypes();
const { setUndoStack, setRedoStack } = useUndoRedo(); const { setUndoStack, setRedoStack } = useUndoRedo();
const [editField, setEditField] = useState({}); const [editField, setEditField] = useState({});
const [filteredResult, setFilteredResult] = useState( const [filteredResult, setFilteredResult] = useState(

View File

@ -0,0 +1,77 @@
import { createContext, useState } from "react";
import { Action, ObjectType } from "../data/data";
import useUndoRedo from "../hooks/useUndoRedo";
export const TypesContext = createContext(null);
export default function TypesContextProvider({ children }) {
const [types, setTypes] = useState([]);
const { setUndoStack, setRedoStack } = useUndoRedo();
const addType = (addToHistory = true, data) => {
if (data) {
setTypes((prev) => {
const temp = prev.slice();
temp.splice(data.id, 0, data);
return temp;
});
} else {
setTypes((prev) => [
...prev,
{
name: `type_${prev.length}`,
fields: [],
comment: "",
},
]);
}
if (addToHistory) {
setUndoStack((prev) => [
...prev,
{
action: Action.ADD,
element: ObjectType.TYPE,
message: `Add new type`,
},
]);
setRedoStack([]);
}
};
const deleteType = (id, addToHistory = true) => {
if (addToHistory) {
setUndoStack((prev) => [
...prev,
{
action: Action.DELETE,
element: ObjectType.TYPE,
id: id,
data: types[id],
message: `Delete type`,
},
]);
setRedoStack([]);
}
setTypes((prev) => prev.filter((e, i) => i !== id));
};
const updateType = (id, values) => {
setTypes((prev) =>
prev.map((e, i) => (i === id ? { ...e, ...values } : e))
);
};
return (
<TypesContext.Provider
value={{
types,
setTypes,
addType,
updateType,
deleteType,
}}
>
{children}
</TypesContext.Provider>
);
}

6
src/hooks/useTypes.js Normal file
View File

@ -0,0 +1,6 @@
import { useContext } from "react";
import { TypesContext } from "../context/TypesContext";
export default function useTypes() {
return useContext(TypesContext);
}

View File

@ -2,7 +2,7 @@ import { useState, createContext, useEffect, useCallback } from "react";
import ControlPanel from "../components/ControlPanel"; import ControlPanel from "../components/ControlPanel";
import Canvas from "../components/Canvas"; import Canvas from "../components/Canvas";
import SidePanel from "../components/SidePanel"; import SidePanel from "../components/SidePanel";
import { Tab, Action, ObjectType, State } from "../data/data"; import { Tab, State } from "../data/data";
import { db } from "../data/db"; import { db } from "../data/db";
import useLayout from "../hooks/useLayout"; import useLayout from "../hooks/useLayout";
import LayoutContextProvider from "../context/LayoutContext"; import LayoutContextProvider from "../context/LayoutContext";
@ -19,11 +19,12 @@ import Controls from "../components/Controls";
import useAreas from "../hooks/useAreas"; import useAreas from "../hooks/useAreas";
import useNotes from "../hooks/useNotes"; import useNotes from "../hooks/useNotes";
import NotesContextProvider from "../context/NotesContext"; import NotesContextProvider from "../context/NotesContext";
import useTypes from "../hooks/useTypes";
import TypesContextProvider from "../context/TypesContext";
export const StateContext = createContext(); export const StateContext = createContext();
export const TabContext = createContext(); export const TabContext = createContext();
export const TaskContext = createContext(); export const TaskContext = createContext();
export const TypeContext = createContext();
export default function Editor() { export default function Editor() {
return ( return (
@ -33,9 +34,11 @@ export default function Editor() {
<SelectContextProvider> <SelectContextProvider>
<AreasContextProvider> <AreasContextProvider>
<NotesContextProvider> <NotesContextProvider>
<TablesContextProvider> <TypesContextProvider>
<WorkSpace /> <TablesContextProvider>
</TablesContextProvider> <WorkSpace />
</TablesContextProvider>
</TypesContextProvider>
</NotesContextProvider> </NotesContextProvider>
</AreasContextProvider> </AreasContextProvider>
</SelectContextProvider> </SelectContextProvider>
@ -50,7 +53,7 @@ function WorkSpace() {
const [title, setTitle] = useState("Untitled Diagram"); const [title, setTitle] = useState("Untitled Diagram");
const [state, setState] = useState(State.NONE); const [state, setState] = useState(State.NONE);
const [lastSaved, setLastSaved] = useState(""); const [lastSaved, setLastSaved] = useState("");
const [types, setTypes] = useState([]); const { types, setTypes } = useTypes();
const [resize, setResize] = useState(false); const [resize, setResize] = useState(false);
const [width, setWidth] = useState(340); const [width, setWidth] = useState(340);
const [tab, setTab] = useState(Tab.tables); const [tab, setTab] = useState(Tab.tables);
@ -69,59 +72,6 @@ function WorkSpace() {
if (w > 340) setWidth(w); if (w > 340) setWidth(w);
}; };
const addType = (addToHistory = true, data) => {
if (data) {
setTypes((prev) => {
const temp = prev.slice();
temp.splice(data.id, 0, data);
return temp;
});
} else {
setTypes((prev) => [
...prev,
{
name: `type_${prev.length}`,
fields: [],
comment: "",
},
]);
}
if (addToHistory) {
setUndoStack((prev) => [
...prev,
{
action: Action.ADD,
element: ObjectType.TYPE,
message: `Add new type`,
},
]);
setRedoStack([]);
}
};
const deleteType = (id, addToHistory = true) => {
if (addToHistory) {
setUndoStack((prev) => [
...prev,
{
action: Action.DELETE,
element: ObjectType.TYPE,
id: id,
data: types[id],
message: `Delete type`,
},
]);
setRedoStack([]);
}
setTypes((prev) => prev.filter((e, i) => i !== id));
};
const updateType = (id, values) => {
setTypes((prev) =>
prev.map((e, i) => (i === id ? { ...e, ...values } : e))
);
};
const updateTask = (id, values) => const updateTask = (id, values) =>
setTasks((prev) => setTasks((prev) =>
prev.map((task, i) => (id === i ? { ...task, ...values } : task)) prev.map((task, i) => (id === i ? { ...task, ...values } : task))
@ -361,55 +311,42 @@ function WorkSpace() {
setTables, setTables,
setAreas, setAreas,
setNotes, setNotes,
setTypes,
]); ]);
return ( return (
<StateContext.Provider value={{ state, setState }}> <StateContext.Provider value={{ state, setState }}>
<TabContext.Provider value={{ tab, setTab }}> <TabContext.Provider value={{ tab, setTab }}>
<TypeContext.Provider <div className="h-[100vh] flex flex-col overflow-hidden theme">
value={{ <TaskContext.Provider value={{ tasks, setTasks, updateTask }}>
types, <ControlPanel
setTypes, diagramId={id}
addType, setDiagramId={setId}
updateType, title={title}
deleteType, setTitle={setTitle}
}} lastSaved={lastSaved}
> setLastSaved={setLastSaved}
<div className="h-[100vh] flex flex-col overflow-hidden theme"> />
<TaskContext.Provider value={{ tasks, setTasks, updateTask }}> </TaskContext.Provider>
<ControlPanel <div
diagramId={id} className="flex h-full overflow-y-auto"
setDiagramId={setId} onMouseUp={() => setResize(false)}
title={title} onMouseLeave={() => setResize(false)}
setTitle={setTitle} onMouseMove={handleResize}
lastSaved={lastSaved} >
setLastSaved={setLastSaved} {layout.sidebar && (
/> <SidePanel resize={resize} setResize={setResize} width={width} />
</TaskContext.Provider> )}
<div <div className="relative w-full h-full overflow-hidden">
className="flex h-full overflow-y-auto" <Canvas state={state} setState={setState} />
onMouseUp={() => setResize(false)} {!(layout.sidebar || layout.toolbar || layout.header) && (
onMouseLeave={() => setResize(false)} <div className="fixed right-5 bottom-4">
onMouseMove={handleResize} <Controls />
> </div>
{layout.sidebar && (
<SidePanel
resize={resize}
setResize={setResize}
width={width}
/>
)} )}
<div className="relative w-full h-full overflow-hidden">
<Canvas state={state} setState={setState} />
{!(layout.sidebar || layout.toolbar || layout.header) && (
<div className="fixed right-5 bottom-4">
<Controls />
</div>
)}
</div>
</div> </div>
</div> </div>
</TypeContext.Provider> </div>
</TabContext.Provider> </TabContext.Provider>
</StateContext.Provider> </StateContext.Provider>
); );