diff --git a/src/components/control_panel.jsx b/src/components/control_panel.jsx
index 83a6d25..33dd2b1 100644
--- a/src/components/control_panel.jsx
+++ b/src/components/control_panel.jsx
@@ -186,19 +186,11 @@ export default function ControlPanel(props) {
})
);
} 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;
- })
- );
+ updateTable(a.tid, {
+ fields: tables[a.tid].fields
+ .filter((e) => e.id !== tables[a.tid].fields.length - 1)
+ .map((t, i) => ({ ...t, id: i })),
+ });
} else if (a.component === "comment") {
updateTable(a.tid, a.undo, false);
} else if (a.component === "index_add") {
diff --git a/src/components/table.jsx b/src/components/table.jsx
index 148db62..af386d0 100644
--- a/src/components/table.jsx
+++ b/src/components/table.jsx
@@ -4,6 +4,8 @@ import {
tableThemes,
defaultTableTheme,
Tab,
+ Action,
+ ObjectType,
} from "../data/data";
import {
IconEdit,
@@ -17,6 +19,8 @@ import {
import {
Popconfirm,
Select,
+ Input,
+ TextArea,
Card,
Form,
Checkbox,
@@ -33,51 +37,26 @@ import {
SettingsContext,
TabContext,
TableContext,
+ UndoRedoContext,
} from "../pages/editor";
export default function Table(props) {
const [isHovered, setIsHovered] = useState(false);
+ const [indexActiveKey, setIndexActiveKey] = useState("");
const [hoveredField, setHoveredField] = useState(-1);
const [visible, setVisible] = useState(false);
const { layout } = useContext(LayoutContext);
- const { setTables, deleteTable } = useContext(TableContext);
+ const { setTables, deleteTable, updateTable, updateField } =
+ useContext(TableContext);
const { tab, setTab } = useContext(TabContext);
const { settings } = useContext(SettingsContext);
const height = props.tableData.fields.length * 36 + 50 + 3;
- 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) => {
- if (tid === i) {
- return {
- ...table,
- ...updatedValues,
- };
- }
- return table;
- })
- );
- };
-
+ const { setUndoStack, setRedoStack } = useContext(UndoRedoContext);
+ const [editField, setEditField] = useState({});
return (
-
+ <>
Default :{" "}
{e.default === "" ? "Not set" : e.default}
-
- Comment :{" "}
- {e.comment === "" ? "Not comment" : e.comment}
-
>
}
position="right"
@@ -260,178 +235,335 @@ export default function Table(props) {
setVisible((prev) => !prev)}
style={{ paddingBottom: "16px" }}
>
-
+ Name:
+
+ updateTable(props.tableData.id, { name: value })
+ }
+ onFocus={(e) => setEditField({ name: e.target.value })}
+ onBlur={(e) => {
+ if (e.target.value === editField.name) return;
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "self",
+ tid: props.tableData.id,
+ undo: editField,
+ redo: { name: e.target.value },
+ },
+ ]);
+ setRedoStack([]);
+ }}
/>
-
+
{props.tableData.fields.map((f, j) => (
-
+
+
Autoincrement
+
{
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "field",
+ tid: props.tableData.id,
+ fid: j,
+ undo: {
+ [checkedValues.target.value]:
+ !checkedValues.target.checked,
+ },
+ redo: {
+ [checkedValues.target.value]:
+ checkedValues.target.checked,
+ },
+ },
+ ]);
+ setRedoStack([]);
+ updateField(props.tableData.id, j, {
+ [checkedValues.target.value]:
+ checkedValues.target.checked,
+ });
+ }}
+ >
+
+
Comment
+
+ }
+ trigger="click"
+ position="rightTop"
+ showArrow
+ >
+ }>
+
+
+
))}
{props.tableData.indices.length > 0 && (
- Indices
+ Indices
{props.tableData.indices.map((idx, k) => (
+
@@ -555,11 +711,23 @@ export default function Table(props) {
@@ -574,9 +742,21 @@ export default function Table(props) {
key={c}
style={{ backgroundColor: c }}
className="p-3 rounded-full mx-1"
- onClick={() =>
- updateTable(props.tableData.id, { color: c })
- }
+ onClick={() => {
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "self",
+ tid: props.tableData.id,
+ undo: { color: props.tableData.color },
+ redo: { color: c },
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(props.tableData.id, { color: c });
+ }}
>
{props.tableData.color === c ? (
@@ -594,9 +774,21 @@ export default function Table(props) {
key={c}
style={{ backgroundColor: c }}
className="p-3 rounded-full mx-1"
- onClick={() =>
- updateTable(props.tableData.id, { color: c })
- }
+ onClick={() => {
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "self",
+ tid: props.tableData.id,
+ undo: { color: props.tableData.color },
+ redo: { color: c },
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(props.tableData.id, { color: c });
+ }}
>
{
- setTables((prev) =>
- prev.map((t, i) => {
- if (t.id === props.tableData.id) {
- return {
- ...t,
- indices: [
- ...t.indices,
- { name: `index_${t.indices.length}`, fields: [] },
- ],
- };
- }
- return t;
- })
- );
+ setIndexActiveKey("1");
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "index_add",
+ tid: props.tableData.id,
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(props.tableData.id, {
+ indices: [
+ ...props.tableData.indices,
+ {
+ id: props.tableData.indices.length,
+ name: `index_${props.tableData.indices.length}`,
+ fields: [],
+ },
+ ],
+ });
}}
>
Add index
@@ -643,30 +842,33 @@ export default function Table(props) {
-
+ >
);
function field(fieldData, index) {
@@ -733,17 +935,24 @@ export default function Table(props) {
- setTables((prev) => {
- const updatedTables = [...prev];
- const updatedFields = [
- ...updatedTables[props.tableData.id].fields,
- ];
- updatedFields.splice(index, 1);
- updatedTables[props.tableData.id].fields = [...updatedFields];
- return updatedTables;
- })
- }
+ onConfirm={() => {
+ setUndoStack((prev) => [
+ ...prev,
+ {
+ action: Action.EDIT,
+ element: ObjectType.TABLE,
+ component: "field_delete",
+ tid: props.tableData.id,
+ data: fieldData,
+ },
+ ]);
+ setRedoStack([]);
+ updateTable(props.tableData.id, {
+ fields: props.tableData.fields
+ .filter((e) => e.id !== fieldData.id)
+ .map((t, i) => ({ ...t, id: i })),
+ });
+ }}
onCancel={() => {}}
>