2023-09-19 20:48:51 +08:00
|
|
|
import React, { useState, createContext, useEffect } from "react";
|
2023-09-19 20:46:48 +08:00
|
|
|
import Sidebar from "../components/sidebar";
|
|
|
|
import ControlPanel from "../components/control_panel";
|
2023-09-19 20:47:01 +08:00
|
|
|
import { DndProvider } from "react-dnd";
|
2023-09-19 20:46:54 +08:00
|
|
|
import { HTML5Backend } from "react-dnd-html5-backend";
|
2023-09-19 20:47:43 +08:00
|
|
|
import Canvas from "../components/canvas";
|
2023-09-19 20:47:01 +08:00
|
|
|
import EditorPanel from "../components/editor_panel";
|
2023-09-19 20:48:57 +08:00
|
|
|
import { Tab } from "../data/data";
|
2023-09-19 20:46:54 +08:00
|
|
|
|
2023-09-19 20:48:46 +08:00
|
|
|
export const LayoutContext = createContext();
|
2023-09-19 20:48:48 +08:00
|
|
|
export const TableContext = createContext();
|
2023-09-19 20:48:49 +08:00
|
|
|
export const AreaContext = createContext();
|
2023-09-19 20:48:57 +08:00
|
|
|
export const TabContext = createContext();
|
2023-09-19 20:49:09 +08:00
|
|
|
export const NoteContext = createContext();
|
2023-09-19 20:49:14 +08:00
|
|
|
export const SettingsContext = createContext();
|
2023-09-19 20:49:41 +08:00
|
|
|
export const UndoRedoContext = createContext();
|
2023-09-19 20:48:46 +08:00
|
|
|
|
2023-09-19 20:46:46 +08:00
|
|
|
export default function Editor(props) {
|
2023-09-19 20:46:56 +08:00
|
|
|
const [code, setCode] = useState("");
|
2023-09-19 20:47:41 +08:00
|
|
|
const [tables, setTables] = useState([]);
|
2023-09-19 20:47:59 +08:00
|
|
|
const [relationships, setRelationships] = useState([]);
|
2023-09-19 20:48:04 +08:00
|
|
|
const [areas, setAreas] = useState([]);
|
2023-09-19 20:49:09 +08:00
|
|
|
const [notes, setNotes] = useState([]);
|
2023-09-19 20:48:30 +08:00
|
|
|
const [resize, setResize] = useState(false);
|
2023-09-19 20:49:39 +08:00
|
|
|
const [width, setWidth] = useState(340);
|
2023-09-19 20:48:53 +08:00
|
|
|
const [selectedTable, setSelectedTable] = useState("");
|
2023-09-19 20:48:57 +08:00
|
|
|
const [tab, setTab] = useState(Tab.tables);
|
2023-09-19 20:48:34 +08:00
|
|
|
const [layout, setLayout] = useState({
|
|
|
|
header: true,
|
|
|
|
sidebar: true,
|
|
|
|
services: true,
|
|
|
|
tables: true,
|
2023-09-19 20:48:55 +08:00
|
|
|
areas: true,
|
2023-09-19 20:48:34 +08:00
|
|
|
relationships: true,
|
|
|
|
issues: true,
|
|
|
|
editor: true,
|
2023-09-19 20:49:09 +08:00
|
|
|
notes: true,
|
2023-09-19 20:48:35 +08:00
|
|
|
fullscreen: false,
|
2023-09-19 20:48:34 +08:00
|
|
|
});
|
2023-09-19 20:49:14 +08:00
|
|
|
const [settings, setSettings] = useState({
|
|
|
|
strictMode: false,
|
2023-09-19 20:49:16 +08:00
|
|
|
showFieldSummary: true,
|
2023-09-19 20:49:36 +08:00
|
|
|
zoom: 1,
|
2023-09-19 20:49:48 +08:00
|
|
|
pan: {x: 0, y: 0},
|
2023-09-19 20:49:37 +08:00
|
|
|
showGrid: true,
|
2023-09-19 20:49:14 +08:00
|
|
|
});
|
2023-09-19 20:49:41 +08:00
|
|
|
const [undoStack, setUndoStack] = useState([]);
|
|
|
|
const [redoStack, setRedoStack] = useState([]);
|
2023-09-19 20:48:31 +08:00
|
|
|
|
|
|
|
const dragHandler = (e) => {
|
|
|
|
if (!resize) return;
|
|
|
|
const w = e.clientX;
|
2023-09-19 20:49:39 +08:00
|
|
|
if (w > 340) setWidth(w);
|
2023-09-19 20:48:31 +08:00
|
|
|
};
|
2023-09-19 20:46:56 +08:00
|
|
|
|
2023-09-19 20:48:57 +08:00
|
|
|
useEffect(() => {
|
2023-09-19 20:48:51 +08:00
|
|
|
document.title = "Editor";
|
2023-09-19 20:48:57 +08:00
|
|
|
}, []);
|
2023-09-19 20:48:51 +08:00
|
|
|
|
2023-09-19 20:46:46 +08:00
|
|
|
return (
|
2023-09-19 20:48:49 +08:00
|
|
|
<LayoutContext.Provider value={{ layout, setLayout }}>
|
|
|
|
<TableContext.Provider
|
|
|
|
value={{ tables, setTables, relationships, setRelationships }}
|
|
|
|
>
|
|
|
|
<AreaContext.Provider value={{ areas, setAreas }}>
|
2023-09-19 20:49:09 +08:00
|
|
|
<NoteContext.Provider value={{ notes, setNotes }}>
|
|
|
|
<TabContext.Provider value={{ tab, setTab }}>
|
2023-09-19 20:49:39 +08:00
|
|
|
<SettingsContext.Provider value={{ settings, setSettings }}>
|
2023-09-19 20:49:41 +08:00
|
|
|
<UndoRedoContext.Provider
|
|
|
|
value={{ undoStack, redoStack, setUndoStack, setRedoStack }}
|
|
|
|
>
|
|
|
|
<div className="h-[100vh] overflow-hidden">
|
|
|
|
<ControlPanel />
|
|
|
|
<div
|
|
|
|
className={
|
|
|
|
layout.header
|
|
|
|
? `flex h-[calc(100vh-123.93px)]`
|
|
|
|
: `flex h-[calc(100vh-51.97px)]`
|
|
|
|
}
|
|
|
|
onMouseUp={() => setResize(false)}
|
|
|
|
onMouseMove={dragHandler}
|
|
|
|
>
|
|
|
|
<DndProvider backend={HTML5Backend}>
|
|
|
|
{layout.sidebar && (
|
|
|
|
<EditorPanel
|
|
|
|
code={code}
|
|
|
|
setCode={setCode}
|
|
|
|
resize={resize}
|
|
|
|
setResize={setResize}
|
|
|
|
width={width}
|
|
|
|
selectedTable={selectedTable}
|
|
|
|
setSelectedTable={setSelectedTable}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
<Canvas
|
2023-09-19 20:49:14 +08:00
|
|
|
code={code}
|
|
|
|
setCode={setCode}
|
|
|
|
selectedTable={selectedTable}
|
|
|
|
setSelectedTable={setSelectedTable}
|
|
|
|
/>
|
2023-09-19 20:49:41 +08:00
|
|
|
</DndProvider>
|
|
|
|
{layout.services && <Sidebar />}
|
|
|
|
</div>
|
2023-09-19 20:49:14 +08:00
|
|
|
</div>
|
2023-09-19 20:49:41 +08:00
|
|
|
</UndoRedoContext.Provider>
|
2023-09-19 20:49:14 +08:00
|
|
|
</SettingsContext.Provider>
|
2023-09-19 20:49:09 +08:00
|
|
|
</TabContext.Provider>
|
|
|
|
</NoteContext.Provider>
|
2023-09-19 20:48:49 +08:00
|
|
|
</AreaContext.Provider>
|
2023-09-19 20:48:48 +08:00
|
|
|
</TableContext.Provider>
|
2023-09-19 20:48:46 +08:00
|
|
|
</LayoutContext.Provider>
|
2023-09-19 20:46:46 +08:00
|
|
|
);
|
|
|
|
}
|