|
@@ -72,13 +72,19 @@ export default function erModel() {
|
|
|
const timer = useRef<any>();
|
|
|
const saveData = (info: ProjectInfo) => {
|
|
|
// 提交服务器
|
|
|
- // 清除定时器
|
|
|
- clearTimeout(timer.current);
|
|
|
- timer.current = setTimeout(() => {
|
|
|
- SaveDataModel(info);
|
|
|
- // 格式化当前时间
|
|
|
- setSaveTime(dayjs().format("YYYY-MM-DD HH:mm:ss"));
|
|
|
- }, 500);
|
|
|
+ setPlayModeEnable(state => {
|
|
|
+ if(!state) {
|
|
|
+ // 清除定时器
|
|
|
+ clearTimeout(timer.current);
|
|
|
+ timer.current = setTimeout(() => {
|
|
|
+ SaveDataModel(info);
|
|
|
+ // 格式化当前时间
|
|
|
+ setSaveTime(dayjs().format("YYYY-MM-DD HH:mm:ss"));
|
|
|
+ }, 500);
|
|
|
+ }
|
|
|
+
|
|
|
+ return !!state;
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -150,7 +156,8 @@ export default function erModel() {
|
|
|
const initGraph = (
|
|
|
container: HTMLElement,
|
|
|
width?: number,
|
|
|
- height?: number
|
|
|
+ height?: number,
|
|
|
+ preview?: boolean
|
|
|
) => {
|
|
|
graphRef.current?.dispose?.();
|
|
|
const instance = new Graph({
|
|
@@ -229,7 +236,7 @@ export default function erModel() {
|
|
|
new Transform({
|
|
|
resizing: {
|
|
|
enabled: (node) => {
|
|
|
- return node.shape !== "table-node";
|
|
|
+ return node.shape !== "table-node" && !preview;
|
|
|
},
|
|
|
},
|
|
|
})
|
|
@@ -273,46 +280,43 @@ export default function erModel() {
|
|
|
}
|
|
|
);
|
|
|
|
|
|
- instance.on(
|
|
|
- "node:moved",
|
|
|
- (args) => {
|
|
|
- const position = args.node.position();
|
|
|
- const data = args.node.data;
|
|
|
- if (data.isTable) {
|
|
|
- updateTable({
|
|
|
- ...data,
|
|
|
- table: {
|
|
|
- ...data.table,
|
|
|
- style: {
|
|
|
- ...data.table.style,
|
|
|
- x: position.x,
|
|
|
- y: position.y,
|
|
|
- },
|
|
|
- },
|
|
|
- });
|
|
|
- }
|
|
|
- if (data.isTopicArea) {
|
|
|
- updateTopicArea({
|
|
|
- ...data,
|
|
|
- style: {
|
|
|
- ...data.style,
|
|
|
- x: position.x,
|
|
|
- y: position.y,
|
|
|
- },
|
|
|
- });
|
|
|
- }
|
|
|
- if (data.isRemark) {
|
|
|
- updateRemark({
|
|
|
- ...data,
|
|
|
+ instance.on("node:moved", (args) => {
|
|
|
+ const position = args.node.position();
|
|
|
+ const data = args.node.data;
|
|
|
+ if (data.isTable) {
|
|
|
+ updateTable({
|
|
|
+ ...data,
|
|
|
+ table: {
|
|
|
+ ...data.table,
|
|
|
style: {
|
|
|
- ...data.style,
|
|
|
+ ...data.table.style,
|
|
|
x: position.x,
|
|
|
y: position.y,
|
|
|
},
|
|
|
- });
|
|
|
- }
|
|
|
+ },
|
|
|
+ });
|
|
|
}
|
|
|
- );
|
|
|
+ if (data.isTopicArea) {
|
|
|
+ updateTopicArea({
|
|
|
+ ...data,
|
|
|
+ style: {
|
|
|
+ ...data.style,
|
|
|
+ x: position.x,
|
|
|
+ y: position.y,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (data.isRemark) {
|
|
|
+ updateRemark({
|
|
|
+ ...data,
|
|
|
+ style: {
|
|
|
+ ...data.style,
|
|
|
+ x: position.x,
|
|
|
+ y: position.y,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
instance.on("node:resized", (args) => {
|
|
|
console.log("node:resized", args);
|
|
@@ -338,7 +342,7 @@ export default function erModel() {
|
|
|
},
|
|
|
});
|
|
|
}
|
|
|
- })
|
|
|
+ });
|
|
|
|
|
|
instance.bindKey("ctrl+z", onUndo);
|
|
|
instance.bindKey("ctrl+y", onRedo);
|
|
@@ -639,7 +643,10 @@ export default function erModel() {
|
|
|
},
|
|
|
};
|
|
|
setProject((state) => {
|
|
|
- const obj = getRelations(state, {...newRelation, dataModelId: state.id});
|
|
|
+ const obj = getRelations(state, {
|
|
|
+ ...newRelation,
|
|
|
+ dataModelId: state.id,
|
|
|
+ });
|
|
|
if (obj.canAdd) {
|
|
|
return {
|
|
|
...state,
|
|
@@ -878,6 +885,7 @@ export default function erModel() {
|
|
|
*/
|
|
|
const exitPlayMode = () => {
|
|
|
exitFullscreen();
|
|
|
+ graphRef.current?.enableKeyboard();
|
|
|
setPlayModeEnable(false);
|
|
|
};
|
|
|
|
|
@@ -885,28 +893,44 @@ export default function erModel() {
|
|
|
* 保存项目
|
|
|
*/
|
|
|
const onSave = async () => {
|
|
|
- const msg = message.loading('保存中...', 0);
|
|
|
- console.log(msg, project);
|
|
|
- // todo 获取新数据
|
|
|
- graph?.toPNG(async (dataUri) => {
|
|
|
- const file = base64ToFile(dataUri, project?.id || '封面图', "image/png");
|
|
|
-
|
|
|
- const formData = new FormData();
|
|
|
- formData.append("file", file);
|
|
|
- const res = await UploadFile(formData);
|
|
|
-
|
|
|
- await SaveDataModel({...project, coverImage: res?.result?.[0]?.id}).finally(() => {
|
|
|
- message.destroy();
|
|
|
- });
|
|
|
- setSaveTime(dayjs().format("YYYY-MM-DD HH:mm:ss"));
|
|
|
- message.success("保存成功");
|
|
|
- }, {
|
|
|
- width: 300,
|
|
|
- height: 150,
|
|
|
- quality: 0.2,
|
|
|
- copyStyles: true
|
|
|
+ setProjectInfo((state) => {
|
|
|
+ message.loading("保存中...", 0);
|
|
|
+ graph?.toPNG(
|
|
|
+ async (dataUri) => {
|
|
|
+ const file = base64ToFile(
|
|
|
+ dataUri,
|
|
|
+ project?.id || "封面图",
|
|
|
+ "image/png"
|
|
|
+ );
|
|
|
+
|
|
|
+ const formData = new FormData();
|
|
|
+ formData.append("file", file);
|
|
|
+ const res = await UploadFile(formData);
|
|
|
+
|
|
|
+ await SaveDataModel({
|
|
|
+ ...state,
|
|
|
+ coverImage: res?.result?.[0]?.id,
|
|
|
+ }).finally(() => {
|
|
|
+ message.destroy();
|
|
|
+ });
|
|
|
+ setProjectInfo({
|
|
|
+ ...state,
|
|
|
+ coverImage: res?.result?.[0]?.id,
|
|
|
+ })
|
|
|
+ setSaveTime(dayjs().format("YYYY-MM-DD HH:mm:ss"));
|
|
|
+ message.success("保存成功");
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 300,
|
|
|
+ height: 150,
|
|
|
+ quality: 0.2,
|
|
|
+ copyStyles: true,
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ return state;
|
|
|
});
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
return {
|
|
|
initGraph,
|