Просмотр исходного кода

修复支持库表格无法添加多个sheet的情况;优化团队协作

kuaifan 4 лет назад
Родитель
Сommit
64fb802ac5

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
     "name": "wookteam",
-    "version": "1.5.16",
+    "version": "1.5.17",
     "description": "WookTeam是一款轻量级的开源在线团队协作工具,提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,知识库管理等工具。",
     "scripts": {
         "ide-helper": "php artisan ide-helper:generate",

+ 22 - 8
resources/assets/js/main/components/docs/flow/index.vue

@@ -41,7 +41,10 @@
         name: "Flow",
         props: {
             value: {
-                type: ''
+                type: Object,
+                default: function () {
+                    return {}
+                }
             },
             readOnly: {
                 type: Boolean,
@@ -64,22 +67,33 @@
             window.addEventListener('message', this.handleMessage)
             this.flow = this.$refs.myFlow.contentWindow;
         },
+        watch: {
+            value: {
+                handler() {
+                    this.updateContent();
+                },
+                deep: true
+            }
+        },
         methods: {
+            updateContent() {
+                this.flow.postMessage({
+                    act: 'setXml',
+                    params: Object.assign(this.value, typeof this.value.xml === "undefined" ? {
+                        xml: this.value.content
+                    } : {})
+                }, '*')
+            },
             handleMessage (event) {
                 const data = event.data;
                 switch (data.act) {
                     case 'ready':
                         this.loadIng = false;
-                        this.flow.postMessage({
-                            act: 'setXml',
-                            params: {
-                                xml: this.value,
-                            }
-                        }, '*')
+                        this.updateContent();
                         break
 
                     case 'change':
-                        this.$emit('input', data.params.xml);
+                        this.$emit('input', data.params);
                         break
 
                     case 'save':

+ 14 - 2
resources/assets/js/main/components/docs/minder/minder.vue

@@ -216,6 +216,7 @@
             return {
                 minder: null,
                 isHand: false,
+                bakValue: '',
             };
         },
         methods: {
@@ -259,11 +260,17 @@
                 this.$nextTick(() => {
                     setTimeout(() => {
                         if (this.minder !== null) {
+                            if (this.bakValue == JSON.stringify(this.value)) {
+                                return;
+                            }
+                            this.bakValue = JSON.stringify(this.value);
+                            this.minder.importJson(this.value);
                             return;
                         }
                         window.__minderReadOnly = this.readOnly;
                         const Editor = require('./editor');
                         this.minder = window.editor = new Editor(document.getElementById(this.id)).minder;
+                        this.bakValue = JSON.stringify(this.value);
                         this.minder.importJson(this.value);
                         if (this.readOnly === true) {
                             this.minder.disable();
@@ -271,8 +278,13 @@
                             this.isHand = true;
                         }
                         this.$emit('minderHandle', this.minder);
-                        this.minder.on('contentchange', val => {
-                            this.$emit('input', this.minder.exportJson());
+                        this.minder.on('contentchange', e => {
+                            const newJson = this.minder.exportJson();
+                            if (this.bakValue == JSON.stringify(newJson)) {
+                                return;
+                            }
+                            this.bakValue = JSON.stringify(newJson);
+                            this.$emit('input', newJson);
                         });
                     }, 300)
                 });

+ 18 - 2
resources/assets/js/main/components/docs/sheet/index.vue

@@ -32,7 +32,7 @@
         name: "Sheet",
         props: {
             value: {
-                type: Object,
+                type: [Object, Array],
                 default: function () {
                     return {}
                 }
@@ -47,6 +47,8 @@
                 sheet: null,
                 clientHeight: 0,
                 clientWidth: 0,
+
+                bakValue: '',
             }
         },
         mounted() {
@@ -75,14 +77,28 @@
                 options.showToolbar = false
                 options.showContextmenu = false;
             }
+            this.bakValue = JSON.stringify(this.value);
             this.sheet = new Spreadsheet(this.$refs.xspreadsheet, options).loadData(this.value).change(data => {
                 if (!this.readOnly) {
-                    this.$emit('input', data);
+                    this.bakValue = JSON.stringify(this.sheet.getData());
+                    this.$emit('input', this.sheet.getData());
                 }
             });
             //
             this.sheet.validate()
         },
+        watch: {
+            value: {
+                handler(value) {
+                    if (this.bakValue == JSON.stringify(value)) {
+                        return;
+                    }
+                    this.bakValue = JSON.stringify(value);
+                    this.sheet.loadData(value);
+                },
+                deep: true
+            }
+        },
         methods: {
             exportExcel(name, bookType){
                 var new_wb = this.xtos(this.sheet.getData());

+ 13 - 9
resources/assets/js/main/pages/docs/edit.vue

@@ -75,7 +75,7 @@
                 </template>
                 <minder v-else-if="docDetail.type=='mind'" ref="myMind" class="body-mind" v-model="docContent" @saveData="handleClick('saveBefore')"></minder>
                 <sheet v-else-if="docDetail.type=='sheet'" ref="mySheet" class="body-sheet" v-model="docContent.content"></sheet>
-                <flow v-else-if="docDetail.type=='flow'" ref="myFlow" class="body-flow" v-model="docContent.content" @saveData="handleClick('saveBefore')"></flow>
+                <flow v-else-if="docDetail.type=='flow'" ref="myFlow" class="body-flow" v-model="docContent" @saveData="handleClick('saveBefore')"></flow>
             </div>
         </div>
 
@@ -446,13 +446,17 @@
                         break;
 
                     case 'update':
-                        this.$Modal.confirm({
-                            title: this.$L("更新提示"),
-                            content: this.$L('团队成员(%)更新了内容,<br/>更新时间:%。<br/><br/>点击【确定】加载最新内容。', body.nickname, $A.formatDate("Y-m-d H:i:s", body.time)),
-                            onOk: () => {
-                                this.refreshDetail();
-                            }
-                        });
+                        if (this.isLock) {
+                            this.getDetail();
+                        } else {
+                            this.$Modal.confirm({
+                                title: this.$L("更新提示"),
+                                content: this.$L('团队成员(%)更新了内容,<br/>更新时间:%。<br/><br/>点击【确定】加载最新内容。', body.nickname, $A.formatDate("Y-m-d H:i:s", body.time)),
+                                onOk: () => {
+                                    this.getDetail();
+                                }
+                            });
+                        }
                         break;
 
                     case 'lock':
@@ -794,7 +798,7 @@
                             },
                             success: (res) => {
                                 if (res.ret === 1) {
-                                    if (this.getSid() == res.data.sid) {
+                                    if (this.getSid() == res.data.sid && this.docDetail.type == 'document') {
                                         this.docContent = Object.assign({}, this.docContent, res.data.content);
                                     }
                                     this.$Message.success(res.msg);

+ 1 - 1
resources/assets/js/main/pages/docs/view.vue

@@ -26,7 +26,7 @@
                         </template>
                         <minder v-else-if="docDetail.type=='mind'" ref="myMind" class="body-mind" v-model="docContent" :readOnly="true"></minder>
                         <sheet v-else-if="docDetail.type=='sheet'" ref="mySheet" class="body-sheet" v-model="docContent.content" :readOnly="true"></sheet>
-                        <flow v-else-if="docDetail.type=='flow'" ref="myFlow" class="body-flow" v-model="docContent.content" :readOnly="true"></flow>
+                        <flow v-else-if="docDetail.type=='flow'" ref="myFlow" class="body-flow" v-model="docContent" :readOnly="true"></flow>
                     </div>
                 </div>
             </div>

+ 82 - 15
resources/assets/statics/public/js/grapheditor/index.html

@@ -83,31 +83,98 @@
             var editorUi = new EditorUi(new Editor(urlParams['chrome'] == '0', themes));
             var graph = editorUi.editor.graph;
 
-            var backupXml;
-            var newXml;
+            var getPos = function () {
+                var svg = null;
+                var childNodes = graph.container.childNodes;
+                for (var i = 0; i < childNodes.length; i++) {
+                    if (childNodes[i].nodeName.toLocaleLowerCase() == 'svg') {
+                        svg = childNodes[i];
+                        break;
+                    }
+                }
+                var data = {
+                    p1: {left: 0, top: 0},
+                    p2: {left: 0, top: 0},
+                };
+                if (svg != null) {
+                    data = {
+                        p1: {
+                            left: svg.clientWidth / 2,
+                            top: svg.clientHeight / 2,
+                        },
+                        p2: {
+                            left: graph.container.clientWidth / 2 + graph.container.scrollLeft,
+                            top: graph.container.clientHeight / 2 + graph.container.scrollTop,
+                        }
+                    };
+                }
+                return {
+                    left: data.p2.left - data.p1.left,
+                    top: data.p2.top - data.p1.top,
+                };
+            }
 
-            graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(editorUi, function() {
-                newXml = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
-                if (backupXml && backupXml.replace(/^<mxGraphModel(.*?)>/, '') == newXml.replace(/^<mxGraphModel(.*?)>/, '')) {
+            var setPos = function (diff) {
+                var svg = null;
+                var childNodes = graph.container.childNodes;
+                for (var i = 0; i < childNodes.length; i++) {
+                    if (childNodes[i].nodeName.toLocaleLowerCase() == 'svg') {
+                        svg = childNodes[i];
+                        break;
+                    }
+                }
+                if (svg == null) {
                     return;
                 }
-                backupXml = newXml;
-                window.parent.postMessage({
-                    act: 'change',
-                    params: {
-                        xml: newXml
+                graph.container.scrollLeft = svg.clientWidth / 2 + diff.left - graph.container.clientWidth / 2;
+                graph.container.scrollTop = svg.clientHeight / 2 + diff.top - graph.container.clientHeight / 2;
+            }
+
+            var newXml;
+            var newPos;
+            var randXml;
+            var backupParams;
+
+            var changePost = function (immediately) {
+                var randTmp = (randXml = Math.random());
+                setTimeout(() => {
+                    if (randTmp != randXml) {
+                        return;
                     }
-                }, '*');
-            }));
+                    newPos = getPos();
+                    newXml = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
+                    if (backupParams.xml && backupParams.xml.replace(/^<mxGraphModel(.*?)>/, '') == newXml.replace(/^<mxGraphModel(.*?)>/, '')) {
+                        if (backupParams.scale && backupParams.scale == graph.getView().scale) {
+                            if (typeof backupParams.diffpos === "object" && Math.abs(backupParams.diffpos.left - newPos.left) < 10 && Math.abs(backupParams.diffpos.top - newPos.top) < 10) {
+                                return;
+                            }
+                        }
+                    }
+                    backupParams.xml = newXml;
+                    window.parent.postMessage({
+                        act: 'change',
+                        params: {
+                            xml: newXml,
+                            scale: graph.getView().scale,
+                            diffpos: newPos,
+                        }
+                    }, '*');
+                }, immediately === true ? 0 : 200)
+            }
+
+            graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(editorUi, function() { changePost(true) }));
+            graph.getView().addListener(mxEvent.SCALE, mxUtils.bind(editorUi, function() {changePost(true) }));
+            graph.container.addEventListener("scroll", changePost);
 
             window.addEventListener("message", function(event){
                 var data = event.data;
                 switch (data.act) {
                     case 'setXml':
                         try {
-                            backupXml = data.params.xml;
-                            var defaultXml = mxUtils.parseXml(data.params.xml);
-                            editorUi.editor.setGraphXml(defaultXml.documentElement);
+                            backupParams = data.params;
+                            editorUi.editor.setGraphXml(mxUtils.parseXml(data.params.xml).documentElement);
+                            typeof data.params.scale === "number" && graph.zoomTo(data.params.scale);
+                            typeof data.params.diffpos === "object" && setPos(data.params.diffpos);
                         } catch (e) {
 
                         }

+ 3 - 0
resources/assets/statics/public/js/grapheditor/viewer.html

@@ -77,6 +77,9 @@
                         var xmlDoc = mxUtils.parseXml(data.params.xml);
                         var codec = new mxCodec(xmlDoc);
                         codec.decode(xmlDoc.documentElement, graph.getModel());
+                        typeof data.params.scale === "number" && graph.zoomTo(data.params.scale);
+                        // typeof data.params.scrollTop === "number" && (graph.container.scrollTop = data.params.scrollTop);
+                        // typeof data.params.scrollLeft === "number" && (graph.container.scrollLeft = data.params.scrollLeft);
                     } catch (e) {
 
                     }