Reorganize files
This commit is contained in:
parent
d4bc5a9669
commit
9df9527950
@ -12,14 +12,16 @@ import {
|
|||||||
tableThemes,
|
tableThemes,
|
||||||
defaultBlue,
|
defaultBlue,
|
||||||
State,
|
State,
|
||||||
} from "../data/constants";
|
} from "../../data/constants";
|
||||||
import useLayout from "../hooks/useLayout";
|
import {
|
||||||
import useSettings from "../hooks/useSettings";
|
useLayout,
|
||||||
import useUndoRedo from "../hooks/useUndoRedo";
|
useSettings,
|
||||||
import useSelect from "../hooks/useSelect";
|
useUndoRedo,
|
||||||
import useAreas from "../hooks/useAreas";
|
useSelect,
|
||||||
import useSaveState from "../hooks/useSaveState";
|
useAreas,
|
||||||
import useTransform from "../hooks/useTransform";
|
useSaveState,
|
||||||
|
useTransform,
|
||||||
|
} from "../../hooks";
|
||||||
|
|
||||||
export default function Area({ data, onMouseDown, setResize, setInitCoords }) {
|
export default function Area({ data, onMouseDown, setResize, setInitCoords }) {
|
||||||
const [hovered, setHovered] = useState(false);
|
const [hovered, setHovered] = useState(false);
|
@ -1,17 +1,17 @@
|
|||||||
import { useRef, useState, useEffect } from "react";
|
import { useRef, useState, useEffect } from "react";
|
||||||
import { Action, Cardinality, Constraint, ObjectType } from "../data/constants";
|
import { Action, Cardinality, Constraint, ObjectType } from "../../data/constants";
|
||||||
import { Toast } from "@douyinfe/semi-ui";
|
import { Toast } from "@douyinfe/semi-ui";
|
||||||
import Table from "./Table";
|
import Table from "./Table";
|
||||||
import Area from "./Area";
|
import Area from "./Area";
|
||||||
import Relationship from "./Relationship";
|
import Relationship from "./Relationship";
|
||||||
import Note from "./Note";
|
import Note from "./Note";
|
||||||
import useSettings from "../hooks/useSettings";
|
import useSettings from "../../hooks/useSettings";
|
||||||
import useTransform from "../hooks/useTransform";
|
import useTransform from "../../hooks/useTransform";
|
||||||
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 useAreas from "../hooks/useAreas";
|
import useAreas from "../../hooks/useAreas";
|
||||||
import useNotes from "../hooks/useNotes";
|
import useNotes from "../../hooks/useNotes";
|
||||||
|
|
||||||
export default function Canvas() {
|
export default function Canvas() {
|
||||||
const { tables, updateTable, relationships, addRelationship } = useTables();
|
const { tables, updateTable, relationships, addRelationship } = useTables();
|
@ -1,16 +1,16 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { Action, ObjectType, noteThemes, Tab, State } from "../data/constants";
|
import { Action, ObjectType, noteThemes, Tab, State } from "../../data/constants";
|
||||||
import { Input, Button, Popover, Toast } from "@douyinfe/semi-ui";
|
import { Input, Button, Popover, Toast } from "@douyinfe/semi-ui";
|
||||||
import {
|
import {
|
||||||
IconEdit,
|
IconEdit,
|
||||||
IconDeleteStroked,
|
IconDeleteStroked,
|
||||||
IconCheckboxTick,
|
IconCheckboxTick,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import useLayout from "../hooks/useLayout";
|
import useLayout from "../../hooks/useLayout";
|
||||||
import useUndoRedo from "../hooks/useUndoRedo";
|
import useUndoRedo from "../../hooks/useUndoRedo";
|
||||||
import useSelect from "../hooks/useSelect";
|
import useSelect from "../../hooks/useSelect";
|
||||||
import useNotes from "../hooks/useNotes";
|
import useNotes from "../../hooks/useNotes";
|
||||||
import useSaveState from "../hooks/useSaveState";
|
import useSaveState from "../../hooks/useSaveState";
|
||||||
|
|
||||||
export default function Note({ data, onMouseDown }) {
|
export default function Note({ data, onMouseDown }) {
|
||||||
const w = 180;
|
const w = 180;
|
@ -1,7 +1,7 @@
|
|||||||
import { useRef } from "react";
|
import { useRef } from "react";
|
||||||
import { Cardinality } from "../data/constants";
|
import { Cardinality } from "../../data/constants";
|
||||||
import useSettings from "../hooks/useSettings";
|
import useSettings from "../../hooks/useSettings";
|
||||||
import { calcPath } from "../utils/calcPath";
|
import { calcPath } from "../../utils/calcPath";
|
||||||
|
|
||||||
export default function Relationship({ data }) {
|
export default function Relationship({ data }) {
|
||||||
const { settings } = useSettings();
|
const { settings } = useSettings();
|
@ -6,7 +6,7 @@ import {
|
|||||||
Tab,
|
Tab,
|
||||||
Action,
|
Action,
|
||||||
ObjectType,
|
ObjectType,
|
||||||
} from "../data/constants";
|
} from "../../data/constants";
|
||||||
import {
|
import {
|
||||||
IconEdit,
|
IconEdit,
|
||||||
IconMore,
|
IconMore,
|
||||||
@ -31,13 +31,13 @@ import {
|
|||||||
SideSheet,
|
SideSheet,
|
||||||
Toast,
|
Toast,
|
||||||
} from "@douyinfe/semi-ui";
|
} from "@douyinfe/semi-ui";
|
||||||
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";
|
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);
|
@ -12,7 +12,7 @@ import {
|
|||||||
IconEdit,
|
IconEdit,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import { Link, useNavigate } from "react-router-dom";
|
import { Link, useNavigate } from "react-router-dom";
|
||||||
import icon from "../assets/icon_dark_64.png";
|
import icon from "../../assets/icon_dark_64.png";
|
||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
Divider,
|
Divider,
|
||||||
@ -31,9 +31,9 @@ import {
|
|||||||
Select,
|
Select,
|
||||||
Checkbox,
|
Checkbox,
|
||||||
} from "@douyinfe/semi-ui";
|
} from "@douyinfe/semi-ui";
|
||||||
import timeLine from "../assets/process.png";
|
import timeLine from "../../assets/process.png";
|
||||||
import timeLineDark from "../assets/process_dark.png";
|
import timeLineDark from "../../assets/process_dark.png";
|
||||||
import todo from "../assets/calendar.png";
|
import todo from "../../assets/calendar.png";
|
||||||
import { toPng, toJpeg, toSvg } from "html-to-image";
|
import { toPng, toJpeg, toSvg } from "html-to-image";
|
||||||
import { saveAs } from "file-saver";
|
import { saveAs } from "file-saver";
|
||||||
import {
|
import {
|
||||||
@ -42,32 +42,32 @@ import {
|
|||||||
jsonToSQLite,
|
jsonToSQLite,
|
||||||
jsonToMariaDB,
|
jsonToMariaDB,
|
||||||
jsonToSQLServer,
|
jsonToSQLServer,
|
||||||
} from "../utils/toSQL";
|
} from "../../utils/toSQL";
|
||||||
import { IconAddTable, IconAddArea, IconAddNote } from "./CustomIcons";
|
import { IconAddTable, IconAddArea, IconAddNote } from "../CustomIcons";
|
||||||
import { ObjectType, Action, Tab, State, Cardinality } from "../data/constants";
|
import { ObjectType, Action, Tab, State, Cardinality } from "../../data/constants";
|
||||||
import jsPDF from "jspdf";
|
import jsPDF from "jspdf";
|
||||||
import { useHotkeys } from "react-hotkeys-hook";
|
import { useHotkeys } from "react-hotkeys-hook";
|
||||||
import { Validator } from "jsonschema";
|
import { Validator } from "jsonschema";
|
||||||
import { areaSchema, noteSchema, tableSchema } from "../data/schemas";
|
import { areaSchema, noteSchema, tableSchema } from "../../data/schemas";
|
||||||
import Editor from "@monaco-editor/react";
|
import Editor from "@monaco-editor/react";
|
||||||
import { db } from "../data/db";
|
import { db } from "../../data/db";
|
||||||
import { useLiveQuery } from "dexie-react-hooks";
|
import { useLiveQuery } from "dexie-react-hooks";
|
||||||
import { Parser } from "node-sql-parser";
|
import { Parser } from "node-sql-parser";
|
||||||
import Todo from "./Todo";
|
import Todo from "./Todo";
|
||||||
import { Thumbnail } from "./Thumbnail";
|
import { Thumbnail } from "./Thumbnail";
|
||||||
import useLayout from "../hooks/useLayout";
|
import useLayout from "../../hooks/useLayout";
|
||||||
import useSettings from "../hooks/useSettings";
|
import useSettings from "../../hooks/useSettings";
|
||||||
import useTransform from "../hooks/useTransform";
|
import useTransform from "../../hooks/useTransform";
|
||||||
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 { enterFullscreen, exitFullscreen } from "../utils/fullscreen";
|
import { enterFullscreen, exitFullscreen } from "../../utils/fullscreen";
|
||||||
import { ddbDiagramIsValid, jsonDiagramIsValid } from "../utils/validateSchema";
|
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";
|
import useTypes from "../../hooks/useTypes";
|
||||||
import useSaveState from "../hooks/useSaveState";
|
import useSaveState from "../../hooks/useSaveState";
|
||||||
|
|
||||||
export default function ControlPanel({
|
export default function ControlPanel({
|
||||||
diagramId,
|
diagramId,
|
@ -1,4 +1,4 @@
|
|||||||
import { calcPath } from "../utils/calcPath";
|
import { calcPath } from "../../utils/calcPath";
|
||||||
|
|
||||||
export function Thumbnail({ diagram, i, zoom }) {
|
export function Thumbnail({ diagram, i, zoom }) {
|
||||||
const translateX = 32 * zoom;
|
const translateX = 32 * zoom;
|
@ -19,9 +19,9 @@ import {
|
|||||||
IconDeleteStroked,
|
IconDeleteStroked,
|
||||||
IconCaretdown,
|
IconCaretdown,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import { State } from "../data/constants";
|
import { State } from "../../data/constants";
|
||||||
import useTasks from "../hooks/useTasks";
|
import useTasks from "../../hooks/useTasks";
|
||||||
import useSaveState from "../hooks/useSaveState";
|
import useSaveState from "../../hooks/useSaveState";
|
||||||
|
|
||||||
const Priority = {
|
const Priority = {
|
||||||
NONE: 0,
|
NONE: 0,
|
@ -20,10 +20,10 @@ import {
|
|||||||
Action,
|
Action,
|
||||||
ObjectType,
|
ObjectType,
|
||||||
State,
|
State,
|
||||||
} from "../data/constants";
|
} from "../../data/constants";
|
||||||
import useUndoRedo from "../hooks/useUndoRedo";
|
import useUndoRedo from "../../hooks/useUndoRedo";
|
||||||
import useAreas from "../hooks/useAreas";
|
import useAreas from "../../hooks/useAreas";
|
||||||
import useSaveState from "../hooks/useSaveState";
|
import useSaveState from "../../hooks/useSaveState";
|
||||||
import Empty from "./Empty";
|
import Empty from "./Empty";
|
||||||
|
|
||||||
export default function AreasOverview() {
|
export default function AreasOverview() {
|
@ -1,10 +1,10 @@
|
|||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
import { Collapse, Badge } from "@douyinfe/semi-ui";
|
import { Collapse, Badge } from "@douyinfe/semi-ui";
|
||||||
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";
|
import useTypes from "../../hooks/useTypes";
|
||||||
|
|
||||||
export default function Issues() {
|
export default function Issues() {
|
||||||
const { settings } = useSettings();
|
const { settings } = useSettings();
|
@ -16,9 +16,9 @@ import {
|
|||||||
IconSearch,
|
IconSearch,
|
||||||
IconCheckboxTick,
|
IconCheckboxTick,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import { noteThemes, Action, ObjectType } from "../data/constants";
|
import { noteThemes, Action, ObjectType } from "../../data/constants";
|
||||||
import useUndoRedo from "../hooks/useUndoRedo";
|
import useUndoRedo from "../../hooks/useUndoRedo";
|
||||||
import useNotes from "../hooks/useNotes";
|
import useNotes from "../../hooks/useNotes";
|
||||||
import Empty from "./Empty";
|
import Empty from "./Empty";
|
||||||
|
|
||||||
export default function NotesOverview() {
|
export default function NotesOverview() {
|
@ -15,9 +15,9 @@ import {
|
|||||||
IconMore,
|
IconMore,
|
||||||
IconSearch,
|
IconSearch,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import { Cardinality, Constraint, Action, ObjectType } from "../data/constants";
|
import { Cardinality, Constraint, Action, ObjectType } from "../../data/constants";
|
||||||
import useTables from "../hooks/useTables";
|
import useTables from "../../hooks/useTables";
|
||||||
import useUndoRedo from "../hooks/useUndoRedo";
|
import useUndoRedo from "../../hooks/useUndoRedo";
|
||||||
import Empty from "./Empty";
|
import Empty from "./Empty";
|
||||||
|
|
||||||
export default function RelationshipsOverview() {
|
export default function RelationshipsOverview() {
|
@ -1,13 +1,13 @@
|
|||||||
import { Tabs } from "@douyinfe/semi-ui";
|
import { Tabs } from "@douyinfe/semi-ui";
|
||||||
import { Tab } from "../data/constants";
|
import { Tab } from "../../data/constants";
|
||||||
import TablesOverview from "./TablesOverview";
|
import TablesOverview from "./TablesOverview";
|
||||||
import RelationshipsOverview from "./RelationshipsOverview";
|
import RelationshipsOverview from "./RelationshipsOverview";
|
||||||
import AreasOverview from "./AreasOverview";
|
import AreasOverview from "./AreasOverview";
|
||||||
import NotesOverview from "./NotesOverview";
|
import NotesOverview from "./NotesOverview";
|
||||||
import TypesOverview from "./TypesOverview";
|
import TypesOverview from "./TypesOverview";
|
||||||
import Issues from "./Issues";
|
import Issues from "./Issues";
|
||||||
import useLayout from "../hooks/useLayout";
|
import useLayout from "../../hooks/useLayout";
|
||||||
import useSelect from "../hooks/useSelect";
|
import useSelect from "../../hooks/useSelect";
|
||||||
|
|
||||||
export default function SidePanel({ width, resize, setResize }) {
|
export default function SidePanel({ width, resize, setResize }) {
|
||||||
const { layout } = useLayout();
|
const { layout } = useLayout();
|
@ -5,7 +5,7 @@ import {
|
|||||||
defaultBlue,
|
defaultBlue,
|
||||||
sqlDataTypes,
|
sqlDataTypes,
|
||||||
tableThemes,
|
tableThemes,
|
||||||
} from "../data/constants";
|
} from "../../data/constants";
|
||||||
import {
|
import {
|
||||||
Collapse,
|
Collapse,
|
||||||
Row,
|
Row,
|
||||||
@ -30,11 +30,11 @@ import {
|
|||||||
IconPlus,
|
IconPlus,
|
||||||
IconSearch,
|
IconSearch,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
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";
|
import useTypes from "../../hooks/useTypes";
|
||||||
import NoElements from "./Empty";
|
import NoElements from "./Empty";
|
||||||
|
|
||||||
export default function TablesOverview() {
|
export default function TablesOverview() {
|
@ -1,5 +1,5 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { Action, ObjectType, sqlDataTypes } from "../data/constants";
|
import { Action, ObjectType, sqlDataTypes } from "../../data/constants";
|
||||||
import {
|
import {
|
||||||
Collapse,
|
Collapse,
|
||||||
Row,
|
Row,
|
||||||
@ -22,9 +22,9 @@ import {
|
|||||||
IconInfoCircle,
|
IconInfoCircle,
|
||||||
IconMore,
|
IconMore,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
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";
|
import useTypes from "../../hooks/useTypes";
|
||||||
import NoElements from "./Empty";
|
import NoElements from "./Empty";
|
||||||
|
|
||||||
export default function TypesOverview() {
|
export default function TypesOverview() {
|
@ -3,7 +3,7 @@ import useTransform from "../hooks/useTransform";
|
|||||||
import useLayout from "../hooks/useLayout";
|
import useLayout from "../hooks/useLayout";
|
||||||
import { exitFullscreen } from "../utils/fullscreen";
|
import { exitFullscreen } from "../utils/fullscreen";
|
||||||
|
|
||||||
export default function Controls() {
|
export default function FloatingControls() {
|
||||||
const { transform, setTransform } = useTransform();
|
const { transform, setTransform } = useTransform();
|
||||||
const { setLayout } = useLayout();
|
const { setLayout } = useLayout();
|
||||||
|
|
@ -8,11 +8,11 @@ import { MarkdownShortcutPlugin } from "@lexical/react/LexicalMarkdownShortcutPl
|
|||||||
import { ClearEditorPlugin } from "@lexical/react/LexicalClearEditorPlugin";
|
import { ClearEditorPlugin } from "@lexical/react/LexicalClearEditorPlugin";
|
||||||
import { TRANSFORMERS } from "@lexical/markdown";
|
import { TRANSFORMERS } from "@lexical/markdown";
|
||||||
import LexicalErrorBoundary from "@lexical/react/LexicalErrorBoundary";
|
import LexicalErrorBoundary from "@lexical/react/LexicalErrorBoundary";
|
||||||
import ToolbarPlugin from "../plugins/ToolbarPlugin";
|
import ToolbarPlugin from "./ToolbarPlugin";
|
||||||
import ListMaxIndentLevelPlugin from "../plugins/ListMaxIndentLevelPlugin";
|
import ListMaxIndentLevelPlugin from "./ListMaxIndentLevelPlugin";
|
||||||
import CodeHighlightPlugin from "../plugins/CodeHighlightPlugin";
|
import CodeHighlightPlugin from "./CodeHighlightPlugin";
|
||||||
import AutoLinkPlugin from "../plugins/AutoLinkPlugin";
|
import AutoLinkPlugin from "./AutoLinkPlugin";
|
||||||
import "../styles/richeditor.css";
|
import "./styles/index.css";
|
||||||
|
|
||||||
function Placeholder({ text }) {
|
function Placeholder({ text }) {
|
||||||
return <div className="editor-placeholder">{text || ""}</div>;
|
return <div className="editor-placeholder">{text || ""}</div>;
|
@ -40,7 +40,7 @@ import {
|
|||||||
getCodeLanguages,
|
getCodeLanguages,
|
||||||
} from "@lexical/code";
|
} from "@lexical/code";
|
||||||
import { Dropdown } from "@douyinfe/semi-ui";
|
import { Dropdown } from "@douyinfe/semi-ui";
|
||||||
import "../styles/richeditor.css";
|
import "./styles/index.css";
|
||||||
|
|
||||||
const LowPriority = 1;
|
const LowPriority = 1;
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
import { useState, useEffect, useCallback } from "react";
|
import { useState, useEffect, useCallback } from "react";
|
||||||
import ControlPanel from "../components/ControlPanel";
|
import ControlPanel from "./EditorHeader/ControlPanel";
|
||||||
import Canvas from "../components/Canvas";
|
import Canvas from "./EditorCanvas/Canvas";
|
||||||
import SidePanel from "../components/SidePanel";
|
import SidePanel from "./EditorSidePanel/SidePanel";
|
||||||
import { State } from "../data/constants";
|
import { State } from "../data/constants";
|
||||||
import { db } from "../data/db";
|
import { db } from "../data/db";
|
||||||
import useLayout from "../hooks/useLayout";
|
import useLayout from "../hooks/useLayout";
|
||||||
@ -9,7 +9,7 @@ import useSettings from "../hooks/useSettings";
|
|||||||
import useTransform from "../hooks/useTransform";
|
import useTransform from "../hooks/useTransform";
|
||||||
import useTables from "../hooks/useTables";
|
import useTables from "../hooks/useTables";
|
||||||
import useUndoRedo from "../hooks/useUndoRedo";
|
import useUndoRedo from "../hooks/useUndoRedo";
|
||||||
import Controls from "../components/Controls";
|
import FloatingControls from "./FloatingControls";
|
||||||
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";
|
import useTypes from "../hooks/useTypes";
|
||||||
@ -302,7 +302,7 @@ export default function WorkSpace() {
|
|||||||
<Canvas saveState={saveState} setSaveState={setSaveState} />
|
<Canvas saveState={saveState} setSaveState={setSaveState} />
|
||||||
{!(layout.sidebar || layout.toolbar || layout.header) && (
|
{!(layout.sidebar || layout.toolbar || layout.header) && (
|
||||||
<div className="fixed right-5 bottom-4">
|
<div className="fixed right-5 bottom-4">
|
||||||
<Controls />
|
<FloatingControls />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
25
src/hooks/index.js
Normal file
25
src/hooks/index.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import useAreas from "./useAreas";
|
||||||
|
import useLayout from "./useLayout";
|
||||||
|
import useNotes from "./useNotes";
|
||||||
|
import useSaveState from "./useSaveState";
|
||||||
|
import useSelect from "./useSelect";
|
||||||
|
import useSettings from "./useSettings";
|
||||||
|
import useTables from "./useTables";
|
||||||
|
import useTasks from "./useTasks";
|
||||||
|
import useTransform from "./useTransform";
|
||||||
|
import useTypes from "./useTypes";
|
||||||
|
import useUndoRedo from "./useUndoRedo";
|
||||||
|
|
||||||
|
export {
|
||||||
|
useAreas,
|
||||||
|
useLayout,
|
||||||
|
useNotes,
|
||||||
|
useSaveState,
|
||||||
|
useSelect,
|
||||||
|
useSettings,
|
||||||
|
useTables,
|
||||||
|
useTasks,
|
||||||
|
useTransform,
|
||||||
|
useTypes,
|
||||||
|
useUndoRedo,
|
||||||
|
};
|
@ -8,7 +8,7 @@ import {
|
|||||||
IconGithubLogo,
|
IconGithubLogo,
|
||||||
IconPaperclip,
|
IconPaperclip,
|
||||||
} from "@douyinfe/semi-icons";
|
} from "@douyinfe/semi-icons";
|
||||||
import RichEditor from "../components/RichEditor";
|
import RichEditor from "../components/LexicalEditor/RichEditor";
|
||||||
import { LexicalComposer } from "@lexical/react/LexicalComposer";
|
import { LexicalComposer } from "@lexical/react/LexicalComposer";
|
||||||
import { editorConfig } from "../data/editorConfig";
|
import { editorConfig } from "../data/editorConfig";
|
||||||
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
||||||
|
@ -13,7 +13,7 @@ import {
|
|||||||
TextArea,
|
TextArea,
|
||||||
} from "@douyinfe/semi-ui";
|
} from "@douyinfe/semi-ui";
|
||||||
import { IconSun, IconMoon } from "@douyinfe/semi-icons";
|
import { IconSun, IconMoon } from "@douyinfe/semi-icons";
|
||||||
import RichEditor from "../components/RichEditor";
|
import RichEditor from "../components/LexicalEditor/RichEditor";
|
||||||
import { LexicalComposer } from "@lexical/react/LexicalComposer";
|
import { LexicalComposer } from "@lexical/react/LexicalComposer";
|
||||||
import { editorConfig } from "../data/editorConfig";
|
import { editorConfig } from "../data/editorConfig";
|
||||||
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
||||||
|
@ -8,158 +8,6 @@ import { db } from "../data/db";
|
|||||||
import { useLiveQuery } from "dexie-react-hooks";
|
import { useLiveQuery } from "dexie-react-hooks";
|
||||||
import { calcPath } from "../utils/calcPath";
|
import { calcPath } from "../utils/calcPath";
|
||||||
|
|
||||||
function Thumbnail({ diagram, i }) {
|
|
||||||
const zoom = 0.3;
|
|
||||||
return (
|
|
||||||
<div className="w-full select-none">
|
|
||||||
<svg className="bg-white w-full h-full rounded-t-md">
|
|
||||||
<defs>
|
|
||||||
<pattern
|
|
||||||
id={"pattern-circles-" + i}
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
width="10"
|
|
||||||
height="10"
|
|
||||||
patternUnits="userSpaceOnUse"
|
|
||||||
patternContentUnits="userSpaceOnUse"
|
|
||||||
>
|
|
||||||
<circle
|
|
||||||
id={"pattern-circle-" + i}
|
|
||||||
cx="2"
|
|
||||||
cy="2"
|
|
||||||
r="0.4"
|
|
||||||
fill="rgb(99, 152, 191)"
|
|
||||||
></circle>
|
|
||||||
</pattern>
|
|
||||||
</defs>
|
|
||||||
<rect
|
|
||||||
x="0"
|
|
||||||
y="0"
|
|
||||||
width="100%"
|
|
||||||
height="100%"
|
|
||||||
fill={"url(#pattern-circles-" + i + ")"}
|
|
||||||
></rect>
|
|
||||||
<g>
|
|
||||||
{diagram.subjectAreas?.map((a) => (
|
|
||||||
<foreignObject
|
|
||||||
key={a.id}
|
|
||||||
x={a.x * zoom}
|
|
||||||
y={a.y * zoom}
|
|
||||||
width={a.width > 0 ? a.width * zoom : 0}
|
|
||||||
height={a.height > 0 ? a.height * zoom : 0}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
className={`border border-slate-400 w-full h-full rounded-sm relative`}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
className="opacity-40 w-fill h-full"
|
|
||||||
style={{ backgroundColor: a.color }}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="text-color absolute top-[4px] left-[6px] select-none text-[4px]">
|
|
||||||
{a.name}
|
|
||||||
</div>
|
|
||||||
</foreignObject>
|
|
||||||
))}
|
|
||||||
{diagram.tables?.map((table, i) => {
|
|
||||||
const height = table.fields.length * 36 + 50 + 7;
|
|
||||||
return (
|
|
||||||
<foreignObject
|
|
||||||
x={table.x * zoom}
|
|
||||||
y={table.y * zoom}
|
|
||||||
width={200 * zoom}
|
|
||||||
height={height * zoom}
|
|
||||||
key={i}
|
|
||||||
>
|
|
||||||
<div className="border-[1px] rounded-[3px] border-zinc-300 text-[4px] bg-zinc-100">
|
|
||||||
<div
|
|
||||||
className="h-[4px] w-full rounded-t-sm"
|
|
||||||
style={{ backgroundColor: table.color }}
|
|
||||||
></div>
|
|
||||||
<div className="rounded-b-[3px]">
|
|
||||||
<div className="bg-zinc-200 font-bold py-[2px] px-[4px] border-b border-gray-300">
|
|
||||||
{table.name}
|
|
||||||
</div>
|
|
||||||
{table.fields.map((f, j) => (
|
|
||||||
<div
|
|
||||||
className={`flex justify-between items-center py-[2px] px-[3px] ${
|
|
||||||
j < table.fields.length - 1 ? "border-b" : ""
|
|
||||||
}`}
|
|
||||||
key={j}
|
|
||||||
>
|
|
||||||
<div className="flex items-center justify-start">
|
|
||||||
<div
|
|
||||||
className={`w-[3px] h-[3px] bg-[#2f68ad] opacity-80 z-50 rounded-full me-[2px]`}
|
|
||||||
></div>
|
|
||||||
<div>{f.name}</div>
|
|
||||||
</div>
|
|
||||||
<div className="text-zinc-500">{f.type}</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</foreignObject>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
{diagram.relationships?.map((e, i) => (
|
|
||||||
<path
|
|
||||||
key={i}
|
|
||||||
d={calcPath(e.startX, e.endX, e.startY, e.endY, zoom)}
|
|
||||||
fill="none"
|
|
||||||
strokeWidth={1}
|
|
||||||
stroke="gray"
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
{diagram.notes?.map((n) => {
|
|
||||||
const x = n.x * zoom;
|
|
||||||
const y = n.y * zoom;
|
|
||||||
const w = 180 * zoom;
|
|
||||||
const r = 3 * zoom;
|
|
||||||
const fold = 24 * zoom;
|
|
||||||
const h = n.height * zoom;
|
|
||||||
return (
|
|
||||||
<g key={n.id}>
|
|
||||||
<path
|
|
||||||
d={`M${x + fold} ${y} L${x + w - r} ${y} A${r} ${r} 0 0 1 ${
|
|
||||||
x + w
|
|
||||||
} ${y + r} L${x + w} ${y + h - r} A${r} ${r} 0 0 1 ${
|
|
||||||
x + w - r
|
|
||||||
} ${y + h} L${x + r} ${y + h} A${r} ${r} 0 0 1 ${x} ${
|
|
||||||
y + h - r
|
|
||||||
} L${x} ${y + fold}`}
|
|
||||||
fill={n.color}
|
|
||||||
stroke="rgb(168 162 158)"
|
|
||||||
strokeLinejoin="round"
|
|
||||||
strokeWidth="0.5"
|
|
||||||
/>
|
|
||||||
<path
|
|
||||||
d={`M${x} ${y + fold} L${x + fold - r} ${
|
|
||||||
y + fold
|
|
||||||
} A${r} ${r} 0 0 0 ${x + fold} ${y + fold - r} L${
|
|
||||||
x + fold
|
|
||||||
} ${y} L${x} ${y + fold} Z`}
|
|
||||||
fill={n.color}
|
|
||||||
stroke={"rgb(168 162 158)"}
|
|
||||||
strokeLinejoin="round"
|
|
||||||
strokeWidth="0.5"
|
|
||||||
/>
|
|
||||||
<foreignObject x={x} y={y} width={w} height={h}>
|
|
||||||
<div className="text-gray-900 w-full h-full px-[4px] py-[2px] text-[4px]">
|
|
||||||
<label htmlFor={`note_${n.id}`} className="ms-[6px]">
|
|
||||||
{n.title}
|
|
||||||
</label>
|
|
||||||
<div className="text-[4px] mt-[2px]">{n.content}</div>
|
|
||||||
</div>
|
|
||||||
</foreignObject>
|
|
||||||
</g>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Templates() {
|
export default function Templates() {
|
||||||
const defaultTemplates = useLiveQuery(() =>
|
const defaultTemplates = useLiveQuery(() =>
|
||||||
db.templates.where({ custom: 0 }).toArray()
|
db.templates.where({ custom: 0 }).toArray()
|
||||||
@ -339,3 +187,155 @@ export default function Templates() {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Thumbnail({ diagram, i }) {
|
||||||
|
const zoom = 0.3;
|
||||||
|
return (
|
||||||
|
<div className="w-full select-none">
|
||||||
|
<svg className="bg-white w-full h-full rounded-t-md">
|
||||||
|
<defs>
|
||||||
|
<pattern
|
||||||
|
id={"pattern-circles-" + i}
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="10"
|
||||||
|
height="10"
|
||||||
|
patternUnits="userSpaceOnUse"
|
||||||
|
patternContentUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<circle
|
||||||
|
id={"pattern-circle-" + i}
|
||||||
|
cx="2"
|
||||||
|
cy="2"
|
||||||
|
r="0.4"
|
||||||
|
fill="rgb(99, 152, 191)"
|
||||||
|
></circle>
|
||||||
|
</pattern>
|
||||||
|
</defs>
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
fill={"url(#pattern-circles-" + i + ")"}
|
||||||
|
></rect>
|
||||||
|
<g>
|
||||||
|
{diagram.subjectAreas?.map((a) => (
|
||||||
|
<foreignObject
|
||||||
|
key={a.id}
|
||||||
|
x={a.x * zoom}
|
||||||
|
y={a.y * zoom}
|
||||||
|
width={a.width > 0 ? a.width * zoom : 0}
|
||||||
|
height={a.height > 0 ? a.height * zoom : 0}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className={`border border-slate-400 w-full h-full rounded-sm relative`}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="opacity-40 w-fill h-full"
|
||||||
|
style={{ backgroundColor: a.color }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="text-color absolute top-[4px] left-[6px] select-none text-[4px]">
|
||||||
|
{a.name}
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
))}
|
||||||
|
{diagram.tables?.map((table, i) => {
|
||||||
|
const height = table.fields.length * 36 + 50 + 7;
|
||||||
|
return (
|
||||||
|
<foreignObject
|
||||||
|
x={table.x * zoom}
|
||||||
|
y={table.y * zoom}
|
||||||
|
width={200 * zoom}
|
||||||
|
height={height * zoom}
|
||||||
|
key={i}
|
||||||
|
>
|
||||||
|
<div className="border-[1px] rounded-[3px] border-zinc-300 text-[4px] bg-zinc-100">
|
||||||
|
<div
|
||||||
|
className="h-[4px] w-full rounded-t-sm"
|
||||||
|
style={{ backgroundColor: table.color }}
|
||||||
|
></div>
|
||||||
|
<div className="rounded-b-[3px]">
|
||||||
|
<div className="bg-zinc-200 font-bold py-[2px] px-[4px] border-b border-gray-300">
|
||||||
|
{table.name}
|
||||||
|
</div>
|
||||||
|
{table.fields.map((f, j) => (
|
||||||
|
<div
|
||||||
|
className={`flex justify-between items-center py-[2px] px-[3px] ${
|
||||||
|
j < table.fields.length - 1 ? "border-b" : ""
|
||||||
|
}`}
|
||||||
|
key={j}
|
||||||
|
>
|
||||||
|
<div className="flex items-center justify-start">
|
||||||
|
<div
|
||||||
|
className={`w-[3px] h-[3px] bg-[#2f68ad] opacity-80 z-50 rounded-full me-[2px]`}
|
||||||
|
></div>
|
||||||
|
<div>{f.name}</div>
|
||||||
|
</div>
|
||||||
|
<div className="text-zinc-500">{f.type}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
{diagram.relationships?.map((e, i) => (
|
||||||
|
<path
|
||||||
|
key={i}
|
||||||
|
d={calcPath(e.startX, e.endX, e.startY, e.endY, zoom)}
|
||||||
|
fill="none"
|
||||||
|
strokeWidth={1}
|
||||||
|
stroke="gray"
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
{diagram.notes?.map((n) => {
|
||||||
|
const x = n.x * zoom;
|
||||||
|
const y = n.y * zoom;
|
||||||
|
const w = 180 * zoom;
|
||||||
|
const r = 3 * zoom;
|
||||||
|
const fold = 24 * zoom;
|
||||||
|
const h = n.height * zoom;
|
||||||
|
return (
|
||||||
|
<g key={n.id}>
|
||||||
|
<path
|
||||||
|
d={`M${x + fold} ${y} L${x + w - r} ${y} A${r} ${r} 0 0 1 ${
|
||||||
|
x + w
|
||||||
|
} ${y + r} L${x + w} ${y + h - r} A${r} ${r} 0 0 1 ${
|
||||||
|
x + w - r
|
||||||
|
} ${y + h} L${x + r} ${y + h} A${r} ${r} 0 0 1 ${x} ${
|
||||||
|
y + h - r
|
||||||
|
} L${x} ${y + fold}`}
|
||||||
|
fill={n.color}
|
||||||
|
stroke="rgb(168 162 158)"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="0.5"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d={`M${x} ${y + fold} L${x + fold - r} ${
|
||||||
|
y + fold
|
||||||
|
} A${r} ${r} 0 0 0 ${x + fold} ${y + fold - r} L${
|
||||||
|
x + fold
|
||||||
|
} ${y} L${x} ${y + fold} Z`}
|
||||||
|
fill={n.color}
|
||||||
|
stroke={"rgb(168 162 158)"}
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="0.5"
|
||||||
|
/>
|
||||||
|
<foreignObject x={x} y={y} width={w} height={h}>
|
||||||
|
<div className="text-gray-900 w-full h-full px-[4px] py-[2px] text-[4px]">
|
||||||
|
<label htmlFor={`note_${n.id}`} className="ms-[6px]">
|
||||||
|
{n.title}
|
||||||
|
</label>
|
||||||
|
<div className="text-[4px] mt-[2px]">{n.content}</div>
|
||||||
|
</div>
|
||||||
|
</foreignObject>
|
||||||
|
</g>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user