Abstract types from editor
This commit is contained in:
parent
1280219ac9
commit
24eecdc39b
@ -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();
|
||||||
|
@ -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([]);
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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({});
|
||||||
|
@ -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(
|
||||||
|
77
src/context/TypesContext.jsx
Normal file
77
src/context/TypesContext.jsx
Normal 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
6
src/hooks/useTypes.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { useContext } from "react";
|
||||||
|
import { TypesContext } from "../context/TypesContext";
|
||||||
|
|
||||||
|
export default function useTypes() {
|
||||||
|
return useContext(TypesContext);
|
||||||
|
}
|
@ -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>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user