diff --git a/src/components/control_panel.jsx b/src/components/control_panel.jsx index b422630..2b6fa5e 100644 --- a/src/components/control_panel.jsx +++ b/src/components/control_panel.jsx @@ -83,6 +83,7 @@ export default function ControlPanel(props) { addTable, moveTable, deleteTable, + updateField, setRelationships, addRelationship, deleteRelationship, @@ -113,22 +114,6 @@ export default function ControlPanel(props) { setNotes(data.notes); }; - const updatedField = (tid, fid, updatedValues) => { - setTables((prev) => - prev.map((table, i) => { - if (tid === i) { - return { - ...table, - fields: table.fields.map((field, j) => - fid === j ? { ...field, ...updatedValues } : field - ), - }; - } - return table; - }) - ); - }; - const undo = () => { if (undoStack.length === 0) return; const a = undoStack.pop(); @@ -184,17 +169,95 @@ export default function ControlPanel(props) { return n; }) ); - }else if(a.element===ObjectType.TABLE){ - if(a.component==="field"){ - console.log(a); - updatedField(a.data.undo.tid, a.data.undo.fid, a.data.undo.values) + } else if (a.element === ObjectType.TABLE) { + if (a.component === "field") { + updateField(a.data.undo.tid, a.data.undo.fid, a.data.undo.values); + } else if (a.component === "field_delete") { + setTables((prev) => + prev.map((t, i) => { + if (t.id === a.tid) { + const temp = t.fields.slice(); + temp.splice(a.data.id, 0, a.data); + return { ...t, fields: temp.map((t, i) => ({ ...t, id: i })) }; + } + return t; + }) + ); + } else if (a.component === "field_add") { + setTables((prev) => + prev.map((t, i) => { + if (t.id === a.tid) { + return { + ...t, + fields: t.fields + .filter((e) => e.id !== tables[a.tid].fields.length - 1) + .map((t, i) => ({ ...t, id: i })), + }; + } + return t; + }) + ); + } else if (a.component === "comment") { + setTables((prev) => + prev.map((t, i) => { + if (t.id === a.data.undo.tid) { + return { + ...t, + ...a.data.undo.values, + }; + } + return t; + }) + ); + } else if (a.component === "index_add") { + setTables((prev) => + prev.map((table, i) => { + if (table.id === a.tid) { + return { + ...table, + indices: table.indices + .filter((e) => e.id !== tables[a.tid].indices.length - 1) + .map((t, i) => ({ ...t, id: i })), + }; + } + return table; + }) + ); + } else if (a.component === "index") { + setTables((prev) => + prev.map((table, i) => { + if (a.tid === i) { + return { + ...table, + indices: table.indices.map((idx) => + idx.id === a.iid ? { ...idx, ...a.undo.values } : idx + ), + }; + } + return table; + }) + ); + } else if (a.component === "index_delete") { + setTables((prev) => + prev.map((table, i) => { + if (table.id === a.tid) { + const temp = table.indices.slice(); + temp.splice(a.data.id, 0, a.data); + return { + ...table, + indices: temp.map((t, i) => ({ ...t, id: i })), + }; + } + return table; + }) + ); } } setRedoStack((prev) => [...prev, a]); } else if (a.action === Action.PAN) { setSettings((prev) => ({ ...prev, - pan: a.data.undo + pan: a.data.undo, })); setRedoStack((prev) => [...prev, a]); } @@ -255,17 +318,115 @@ export default function ControlPanel(props) { return n; }) ); - } else if(a.element===ObjectType.TABLE){ - if(a.component==="field"){ - console.log(a); - updatedField(a.data.redo.tid, a.data.redo.fid, a.data.redo.values) + } else if (a.element === ObjectType.TABLE) { + if (a.component === "field") { + updateField(a.data.redo.tid, a.data.redo.fid, a.data.redo.values); + } else if (a.component === "field_delete") { + setTables((prev) => + prev.map((t, i) => { + if (t.id === a.tid) { + return { + ...t, + fields: t.fields + .filter((e) => e.id !== a.data.id) + .map((t, i) => ({ ...t, id: i })), + }; + } + return t; + }) + ); + } else if (a.component === "field_add") { + setTables((prev) => + prev.map((t, i) => { + if (t.id === a.tid) { + return { + ...t, + fields: [ + ...t.fields, + { + name: "", + type: "", + default: "", + check: "", + primary: false, + unique: false, + notNull: false, + increment: false, + comment: "", + id: t.fields.length, + }, + ], + }; + } + return t; + }) + ); + } else if (a.component === "comment") { + setTables((prev) => + prev.map((t, i) => { + if (t.id === a.data.redo.tid) { + return { + ...t, + ...a.data.redo.values, + }; + } + return t; + }) + ); + } else if (a.component === "index_add") { + setTables((prev) => + prev.map((table) => { + if (table.id === a.tid) { + return { + ...table, + indices: [ + ...table.indices, + { + id: table.indices.length, + name: `index_${table.indices.length}`, + fields: [], + }, + ], + }; + } + return table; + }) + ); + } else if (a.component === "index") { + setTables((prev) => + prev.map((table, i) => { + if (a.tid === i) { + return { + ...table, + indices: table.indices.map((idx) => + idx.id === a.iid ? { ...idx, ...a.redo.values } : idx + ), + }; + } + return table; + }) + ); + } else if (a.component === "index_delete") { + setTables((prev) => + prev.map((table, i) => { + if (table.id === a.tid) { + return { + ...table, + indices: table.indices + .filter((e) => e.id !== a.data.id) + .map((t, i) => ({ ...t, id: i })), + }; + } + return table; + }) + ); } } setUndoStack((prev) => [...prev, a]); } else if (a.action === Action.PAN) { setSettings((prev) => ({ ...prev, - pan: a.data.redo + pan: a.data.redo, })); setUndoStack((prev) => [...prev, a]); } diff --git a/src/components/table_overview.jsx b/src/components/table_overview.jsx index 2ddc87d..fcb92eb 100644 --- a/src/components/table_overview.jsx +++ b/src/components/table_overview.jsx @@ -1,4 +1,4 @@ -import { React, useContext, useState, useRef } from "react"; +import { React, useContext, useState } from "react"; import { Action, ObjectType, @@ -11,7 +11,7 @@ import { Row, Col, Input, - Form, + TextArea, Button, Card, Popover, @@ -38,10 +38,10 @@ import { TableContext, UndoRedoContext } from "../pages/editor"; export default function TableOverview(props) { const [indexActiveKey, setIndexActiveKey] = useState(""); const [value, setValue] = useState(""); - const { tables, setTables, addTable, deleteTable } = useContext(TableContext); + const { tables, setTables, addTable, deleteTable, updateField } = + useContext(TableContext); const { setUndoStack, setRedoStack } = useContext(UndoRedoContext); const [editField, setEditField] = useState({}); - const selectRef = useRef(null); const [filteredResult, setFilteredResult] = useState( tables.map((t) => { return t.name; @@ -58,22 +58,6 @@ export default function TableOverview(props) { ); }; - const updatedField = (tid, fid, updatedValues) => { - setTables((prev) => - prev.map((table, i) => { - if (tid === i) { - return { - ...table, - fields: table.fields.map((field, j) => - fid === j ? { ...field, ...updatedValues } : field - ), - }; - } - return table; - }) - ); - }; - const updateTable = (tid, updatedValues) => { setTables((prev) => prev.map((table, i) => { @@ -142,218 +126,405 @@ export default function TableOverview(props) {
{t.name}
} itemKey={`${t.id}`}> {t.fields.map((f, j) => ( - - - - updatedField(i, j, { name: value }) - } - onFocus={(e) => - setEditField({ - tid: i, - fid: j, - values: { name: e.target.value }, - }) - } - onBlur={(e) => { - if (e.target.value === editField.name) return; - setUndoStack((prev) => [ - ...prev, - { - action: Action.EDIT, - element: ObjectType.TABLE, - component: "field", - data: { - undo: editField, - redo: { - tid: i, - fid: j, - values: { name: e.target.value }, - }, + + + updateField(i, j, { name: value })} + onFocus={(e) => + setEditField({ + tid: i, + fid: j, + values: { name: e.target.value }, + }) + } + onBlur={(e) => { + if (e.target.value === editField.name) return; + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.TABLE, + component: "field", + data: { + undo: editField, + redo: { + tid: i, + fid: j, + values: { name: e.target.value }, }, }, - ]); - setRedoStack([]); - setEditField({}); - }} - /> - - - { + return { + label: value, + value: value, + }; + })} + filter + value={f.type} + placeholder="Type" + onChange={(value) => { + if (value === f.type) return; + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.TABLE, + component: "field", + data: { + undo: { + tid: i, + fid: j, + values: { type: f.type }, + }, + redo: { + tid: i, + fid: j, + values: { type: value }, }, }, - ]); - setRedoStack([]); - setEditField({}); - }} - onFocus={() => { - setEditField({ - tid: i, - fid: j, - values: { type: selectRef.current.props.value }, - }); - }} - > - - - - - - - - - -
- updatedField(i, j, value.values) - } - > - - -
- - - updatedField(i, j, { - [checkedValues.target.value]: - checkedValues.target.checked, - }) - } - > -
-
- - - updatedField(i, j, { - [checkedValues.target.value]: - checkedValues.target.checked, - }) - } - > -
- - - + + + + + + +
Default value
+ + updateField(i, j, { default: value }) + } + onFocus={(e) => + setEditField({ + tid: i, + fid: j, + values: { default: e.target.value }, + }) + } + onBlur={(e) => { + if (e.target.value === editField.default) + return; + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.TABLE, + component: "field", + data: { + undo: editField, + redo: { + tid: i, + fid: j, + values: { default: e.target.value }, + }, + }, + }, + ]); + setRedoStack([]); + setEditField({}); + }} + /> +
+ Check Expression +
+ + updateField(i, j, { check: value }) + } + onFocus={(e) => + setEditField({ + tid: i, + fid: j, + values: { check: e.target.value }, + }) + } + onBlur={(e) => { + if (e.target.value === editField.check) return; + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.TABLE, + component: "field", + data: { + undo: editField, + redo: { + tid: i, + fid: j, + values: { check: e.target.value }, + }, + }, + }, + ]); + setRedoStack([]); + setEditField({}); + }} + /> +
+
Unique
+ { + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.TABLE, + component: "field", + data: { + undo: { + tid: i, + fid: j, + values: { + [checkedValues.target.value]: + !checkedValues.target.checked, + }, + }, + redo: { + tid: i, + fid: j, + values: { + [checkedValues.target.value]: + checkedValues.target.checked, + }, + }, + }, + }, + ]); + setRedoStack([]); + setEditField({}); + updateField(i, j, { + [checkedValues.target.value]: + checkedValues.target.checked, }); }} - > - Delete - + >
- } - trigger="click" - position="rightTop" - showArrow - > - -
- -
- +
+
Autoincrement
+ { + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.TABLE, + component: "field", + data: { + undo: { + tid: i, + fid: j, + values: { + [checkedValues.target.value]: + !checkedValues.target.checked, + }, + }, + redo: { + tid: i, + fid: j, + values: { + [checkedValues.target.value]: + checkedValues.target.checked, + }, + }, + }, + }, + ]); + setRedoStack([]); + setEditField({}); + updateField(i, j, { + [checkedValues.target.value]: + checkedValues.target.checked, + }); + }} + > +
+
Comment
+