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({});
- }}
- />
-
-
-
+
+
+
+
+
+
+
+
+
+ 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
+
))}
{t.indices.length > 0 && (
{
- const updatedTables = [...tables];
- const updatedIndices = [...t.indices];
- updatedIndices[k] = {
- name: `${value.join("_")}_index`,
- fields: [...value],
- };
- updatedTables[i] = {
- ...t,
- indices: [...updatedIndices],
- };
- setTables(updatedTables);
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "index",
+ tid: i,
+ iid: k,
+ undo: {
+ values: {
+ fields: [...idx.fields],
+ name: `${idx.fields.join("_")}_index`,
+ },
+ },
+ redo: {
+ values: {
+ fields: [...value],
+ name: `${value.join("_")}_index`,
+ },
+ },
+ },
+ ]);
+ setRedoStack([]);
+ setEditField({});
+ setTables((prev) =>
+ prev.map((table, i) => {
+ if (table.id === i) {
+ return {
+ ...table,
+ indices: table.indices.map((index) =>
+ index.id === k
+ ? {
+ ...index,
+ fields: [...value],
+ name: `${value.join(
+ "_"
+ )}_index`,
+ }
+ : index
+ ),
+ };
+ }
+ return table;
+ })
+ );
}}
/>
-
-
+
}
type="danger"
block
onClick={() => {
- const updatedTables = [...tables];
- const updatedIndices = [...t.indices];
- updatedIndices.splice(k, 1);
- updatedTables[i] = {
- ...t,
- indices: [...updatedIndices],
- };
- setTables(updatedTables);
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "index_delete",
+ tid: t.id,
+ data: idx,
+ },
+ ]);
+ setRedoStack([]);
+ setTables((prev) =>
+ prev.map((table) => {
+ if (table.id === i) {
+ return {
+ ...table,
+ indices: table.indices
+ .filter(
+ (index) => index.id !== idx.id
+ )
+ .map((e, j) => ({
+ ...e,
+ id: j,
+ })),
+ };
+ }
+ return table;
+ })
+ );
}}
>
Delete
@@ -449,18 +672,42 @@ export default function TableOverview(props) {
>
- updateTable(i, { comment: "" })}
- initValue={t.comment}
- autosize
- placeholder="Add comment"
- rows={1}
- />
-
+
@@ -539,15 +786,34 @@ export default function TableOverview(props) {
block
onClick={() => {
setIndexActiveKey("1");
- const updatedTables = [...tables];
- updatedTables[i] = {
- ...t,
- indices: [
- ...t.indices,
- { name: `index_${t.indices.length}`, fields: [] },
- ],
- };
- setTables(updatedTables);
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "index_add",
+ tid: t.id,
+ },
+ ]);
+ setRedoStack([]);
+ setTables((prev) =>
+ prev.map((table) => {
+ if (table.id === i) {
+ return {
+ ...table,
+ indices: [
+ ...table.indices,
+ {
+ id: table.indices.length,
+ name: `index_${table.indices.length}`,
+ fields: [],
+ },
+ ],
+ };
+ }
+ return table;
+ })
+ );
}}
>
Add index
@@ -556,22 +822,41 @@ export default function TableOverview(props) {