From 525ca9f5c7c73af2e7f5aa507d0d5a75ab8b0fdd Mon Sep 17 00:00:00 2001 From: 1ilit Date: Tue, 19 Sep 2023 15:48:32 +0300 Subject: [PATCH] Add search for relationships --- src/components/control_panel.jsx | 38 +-- src/components/editor_panel.jsx | 50 ++-- src/components/reference_overview.jsx | 370 +++++++++++++++----------- src/components/table_overview.jsx | 122 +++++---- src/pages/editor.jsx | 4 +- 5 files changed, 316 insertions(+), 268 deletions(-) diff --git a/src/components/control_panel.jsx b/src/components/control_panel.jsx index 80b40b6..ee665f1 100644 --- a/src/components/control_panel.jsx +++ b/src/components/control_panel.jsx @@ -319,7 +319,7 @@ export default function ControlPanel() { } > -
+
{category}
@@ -363,7 +363,7 @@ export default function ControlPanel() {
)} -
+
-
+
@@ -435,33 +435,27 @@ export default function ControlPanel() { } trigger="click" > -
+
zoom
- - @@ -478,31 +472,25 @@ export default function ControlPanel() { } trigger="click" > -
+
- -
props.setResize(true)} >
diff --git a/src/components/reference_overview.jsx b/src/components/reference_overview.jsx index 5b68631..e416a49 100644 --- a/src/components/reference_overview.jsx +++ b/src/components/reference_overview.jsx @@ -1,6 +1,8 @@ -import React from "react"; +import React, { useState } from "react"; import { + AutoComplete, Collapse, + Empty, Form, Row, Col, @@ -14,7 +16,12 @@ import { IconDeleteStroked, IconLoopTextStroked, IconMore, + IconSearch, } from "@douyinfe/semi-icons"; +import { + IllustrationNoContent, + IllustrationNoContentDark, +} from "@douyinfe/semi-illustrations"; import { Cardinality, Constraint } from "../data/data"; export default function ReferenceOverview(props) { @@ -28,158 +35,219 @@ export default function ReferenceOverview(props) { dataIndex: "foreign", }, ]; + const [refActiveIndex, setRefActiveIndex] = useState(""); + const [value, setValue] = useState(""); + const [filteredResult, setFilteredResult] = useState( + props.relationships.map((t) => { + return t.name; + }) + ); + + const handleStringSearch = (value) => { + setFilteredResult( + props.relationships + .map((t) => { + return t.name; + }) + .filter((i) => i.includes(value)) + ); + }; return ( - - {props.relationships.map((r, i) => ( - {r.name}
} itemKey={`${i}`}> -
- props.setRelationships((prev) => - prev.map((e, idx) => - idx === i ? { ...e, ...value.values } : e - ) - ) - } - > -
-
- Primary: - {props.tables[r.endTableId].name} -
-
- Foreign: - {props.tables[r.startTableId].name} -
-
- - -
- -
- - } - trigger="click" - position="rightTop" - showArrow - > - - - - - - ({ - label: v, - value: v, - }))} - field="cardinality" - label="Cardinality" - initValue={r.cardinality} - className="w-full" - > - - - ({ - label: v, - value: v, - }))} - field="updateConstraint" - label="On update" - initValue={r.updateConstraint} - className="w-full" - > - - - ({ - label: v, - value: v, - }))} - field="deleteConstraint" - label="On delete" - initValue={r.deleteConstraint} - className="w-full" - > - - -
- - - props.setRelationships((prev) => - prev.map((e, idx) => - idx === i - ? { - ...e, - [checkedValues.target.value]: - checkedValues.target.checked, - } - : e + <> + } + placeholder="Search..." + emptyContent={
No relationships found
} + onSearch={(v) => handleStringSearch(v)} + onChange={(v) => setValue(v)} + onSelect={(v) => { + const { id } = props.relationships.find((t) => t.name === v); + setRefActiveIndex(`${id}`); + document + .getElementById(`scroll_ref_${id}`) + .scrollIntoView({ behavior: "smooth" }); + }} + className="w-full" + /> + setRefActiveIndex(k)} + accordion + > + {props.relationships.length <= 0 ? ( +
+ + } + darkModeImage={ + + } + title="No relationships" + description="Drag to connect fields and form relationships!" + /> +
+ ) : ( + props.relationships.map((r, i) => ( +
+ {r.name}
} itemKey={`${i}`}> + + props.setRelationships((prev) => + prev.map((e, idx) => + idx === i ? { ...e, ...value.values } : e + ) ) - ) - } - >
+ } + > +
+
+ Primary: + {props.tables[r.endTableId].name} +
+
+ Foreign: + {props.tables[r.startTableId].name} +
+
+ +
+
+ +
+ + } + trigger="click" + position="rightTop" + showArrow + > + + + + + + ({ + label: v, + value: v, + }))} + field="cardinality" + label="Cardinality" + initValue={r.cardinality} + className="w-full" + > + + + ({ + label: v, + value: v, + }))} + field="updateConstraint" + label="On update" + initValue={r.updateConstraint} + className="w-full" + > + + + ({ + label: v, + value: v, + }))} + field="deleteConstraint" + label="On delete" + initValue={r.deleteConstraint} + className="w-full" + > + + +
+ + + props.setRelationships((prev) => + prev.map((e, idx) => + idx === i + ? { + ...e, + [checkedValues.target.value]: + checkedValues.target.checked, + } + : e + ) + ) + } + > +
+ + + + + + + + + + - - - - - - - - - - - ))} - + )) + )} + + ); } diff --git a/src/components/table_overview.jsx b/src/components/table_overview.jsx index bcd811e..305c9bf 100644 --- a/src/components/table_overview.jsx +++ b/src/components/table_overview.jsx @@ -80,67 +80,65 @@ export default function TableOverview(props) { return ( <> -
- -
- } - placeholder="Search..." - emptyContent={
No tables found
} - onSearch={(v) => handleStringSearch(v)} - onChange={(v) => setValue(v)} - onSelect={(v) => { - const { id, name } = props.tables.find((t) => t.name === v); - setTableActiveKey(`${id}`); - document - .getElementById(`${name}_scroll_id`) - .scrollIntoView({ behavior: "smooth" }); - }} - className="w-full" - /> - -
- - - - + + + } + placeholder="Search..." + emptyContent={
No tables found
} + onSearch={(v) => handleStringSearch(v)} + onChange={(v) => setValue(v)} + onSelect={(v) => { + const { id } = props.tables.find((t) => t.name === v); + setTableActiveKey(`${id}`); + document + .getElementById(`scroll_table_${id}`) + .scrollIntoView({ behavior: "smooth" }); + }} + className="w-full" + /> + +
+ + + setTableActiveKey(k)} @@ -163,7 +161,7 @@ export default function TableOverview(props) { ) : ( props.tables.map((t, i) => ( -
+
{t.name}
} itemKey={`${t.id}`}> {t.fields.map((f, j) => (
{ if (!resize) return; const w = e.clientX; - if (w > 320) setWidth(w); + if (w > 340) setWidth(w); }; return (