diff --git a/packages/web/src/designer/Designer.js b/packages/web/src/designer/Designer.js
index 9e769e0dc..bf62e05a4 100644
--- a/packages/web/src/designer/Designer.js
+++ b/packages/web/src/designer/Designer.js
@@ -1,6 +1,7 @@
import React from 'react';
import styled from 'styled-components';
import DesignerTable from './DesignerTable';
+import uuidv1 from 'uuid/v1';
const Wrapper = styled.div`
flex: 1;
@@ -13,6 +14,7 @@ export default function Designer({ value, onChange }) {
e.preventDefault();
if (!data) return;
var json = JSON.parse(data);
+ json.designerId = uuidv1();
onChange({
...value,
tables: [...(tables || []), json],
@@ -26,20 +28,29 @@ export default function Designer({ value, onChange }) {
};
const changeTable = React.useCallback(
- (table, index) => {
- const newValue = {
- ...value,
- tables: (tables || []).map((t, i) => (i == index ? table : t)),
- };
- onChange(newValue);
+ (table) => {
+ onChange((current) => ({
+ ...current,
+ tables: (current.tables || []).map((x) => (x.designerId == table.designerId ? table : x)),
+ }));
+ },
+ [onChange]
+ );
+
+ const bringToFront = React.useCallback(
+ (table) => {
+ onChange((current) => ({
+ ...current,
+ tables: [...(current.tables || []).filter((x) => x.designerId != table.designerId), table],
+ }));
},
[onChange]
);
return (
e.preventDefault()} onDrop={handleDrop}>
- {(tables || []).map((table, index) => (
-
+ {(tables || []).map((table) => (
+
))}
);
diff --git a/packages/web/src/designer/DesignerTable.js b/packages/web/src/designer/DesignerTable.js
index aee8921ee..eb9e3c0ae 100644
--- a/packages/web/src/designer/DesignerTable.js
+++ b/packages/web/src/designer/DesignerTable.js
@@ -23,7 +23,7 @@ const ColumnsWrapper = styled.div`
`;
export default function DesignerTable(props) {
- const { pureName, columns, left, top, onChangeTable, index } = props;
+ const { pureName, columns, left, top, onChangeTable, onBringToFront } = props;
const [movingPosition, setMovingPosition] = React.useState(null);
const movingPositionRef = React.useRef(null);
@@ -54,14 +54,11 @@ export default function DesignerTable(props) {
const handleMoveEnd = React.useCallback(
(e) => {
if (movingPositionRef.current) {
- onChangeTable(
- {
- ...props,
- left: movingPositionRef.current.left,
- top: movingPositionRef.current.top,
- },
- index
- );
+ onChangeTable({
+ ...props,
+ left: movingPositionRef.current.left,
+ top: movingPositionRef.current.top,
+ });
}
movingPositionRef.current = null;
@@ -71,7 +68,7 @@ export default function DesignerTable(props) {
// this.props.designer.changedModel(true);
},
- [onChangeTable, index]
+ [onChangeTable, props]
);
React.useEffect(() => {
@@ -103,6 +100,7 @@ export default function DesignerTable(props) {
left: movingPosition ? movingPosition.left : left,
top: movingPosition ? movingPosition.top : top,
}}
+ onMouseDown={() => onBringToFront(props)}
>
diff --git a/packages/web/src/utility/useEditorData.js b/packages/web/src/utility/useEditorData.js
index 25ec2cb6a..e582b9c71 100644
--- a/packages/web/src/utility/useEditorData.js
+++ b/packages/web/src/utility/useEditorData.js
@@ -4,6 +4,19 @@ import localforage from 'localforage';
import { changeTab } from './common';
import { useSetOpenedTabs } from './globalState';
+function getParsedLocalStorage(key) {
+ const value = localStorage.getItem(key);
+ if (value != null) {
+ try {
+ const res = JSON.parse(value);
+ return res;
+ } catch (e) {
+ localStorage.removeItem(key);
+ }
+ }
+ return null;
+}
+
export default function useEditorData({ tabid, reloadToken = 0, loadFromArgs = null }) {
const localStorageKey = `tabdata_editor_${tabid}`;
const setOpenedTabs = useSetOpenedTabs();
@@ -34,7 +47,7 @@ export default function useEditorData({ tabid, reloadToken = 0, loadFromArgs = n
console.error(err.response);
}
} else {
- const initFallback = localStorage.getItem(localStorageKey);
+ const initFallback = getParsedLocalStorage(localStorageKey);
if (initFallback != null) {
const init = JSON.parse(initFallback);
setValue(init);