You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2020/09/01 02:59:26 UTC

[incubator-echarts-doc] branch next updated: editor: add language switch

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch next
in repository https://gitbox.apache.org/repos/asf/incubator-echarts-doc.git


The following commit(s) were added to refs/heads/next by this push:
     new 05bcd4b  editor: add language switch
05bcd4b is described below

commit 05bcd4bcac1b0d08774487a76db664751fd5950c
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Sep 1 10:58:15 2020 +0800

    editor: add language switch
---
 editor/server/main.js                  | 18 ++++++-------
 editor/src/components/Block.vue        |  2 +-
 editor/src/components/BlockContent.vue |  2 +-
 editor/src/components/BlockUse.vue     |  8 +++---
 editor/src/components/Nav.vue          |  5 +++-
 editor/src/components/Target.vue       |  6 ++---
 editor/src/layouts/EditorLayout.vue    | 47 ++++++++++++++++++++++++++++++----
 editor/src/router/routes.js            |  7 ++---
 editor/src/store/store.js              | 19 +++++++-------
 9 files changed, 76 insertions(+), 38 deletions(-)

diff --git a/editor/server/main.js b/editor/server/main.js
index 9a520cd..cbc6a62 100644
--- a/editor/server/main.js
+++ b/editor/server/main.js
@@ -11,10 +11,6 @@ console.log('Server Started');
 
 const fileModified = {};
 
-function fetchBlocks() {
-    return parseBlocks(path.resolve(__dirname, '../../zh/option'));
-}
-
 let globalSocket;
 
 function manageFilesStatus(socket) {
@@ -61,16 +57,18 @@ io.on('connection', function (socket) {
 
 
 const requestActions = {
-    save(data) {
-        for (let fileName in data) {
-            const fileTargets = data[fileName];
-            const filePath = path.resolve(__dirname, '../../zh/option/', fileName.replace('.', '/')) + '.md';
+    save({ blocks, lang }) {
+        lang = lang === 'zh' ? 'zh' : 'en';
+        for (let fileName in blocks) {
+            const fileTargets = blocks[fileName];
+            const filePath = path.resolve(__dirname, `../../${lang}/option/`, fileName.replace('.', '/')) + '.md';
             fs.writeFileSync(filePath, compositeTargets(fileTargets), 'utf-8');
         }
         console.log('Saved');
     },
 
-    fetch() {
-        return fetchBlocks();
+    fetch({ lang }) {
+        lang = lang === 'zh' ? 'zh' : 'en';
+        return parseBlocks(path.resolve(__dirname, `../../${lang}/option`));
     }
 }
diff --git a/editor/src/components/Block.vue b/editor/src/components/Block.vue
index 41c6438..1c4f003 100644
--- a/editor/src/components/Block.vue
+++ b/editor/src/components/Block.vue
@@ -23,7 +23,7 @@ export default {
             }
         };
     }
-}
+};
 </script>
 
 <style lang="scss">
diff --git a/editor/src/components/BlockContent.vue b/editor/src/components/BlockContent.vue
index f06f0b7..de10008 100644
--- a/editor/src/components/BlockContent.vue
+++ b/editor/src/components/BlockContent.vue
@@ -45,7 +45,7 @@ export default {
             }
         }
     }
-}
+};
 </script>
 
 <style lang="scss">
diff --git a/editor/src/components/BlockUse.vue b/editor/src/components/BlockUse.vue
index 896edc1..dce779e 100644
--- a/editor/src/components/BlockUse.vue
+++ b/editor/src/components/BlockUse.vue
@@ -50,7 +50,7 @@ export default {
     data() {
         return {
             targetFilterKeyword: ''
-        }
+        };
     },
 
     mounted() {
@@ -73,8 +73,8 @@ export default {
                 this.targetFilterKeyword = val;
             }, ref => {
                 if (val !== '' && ref.options.length > 0) {
-                    ref.setOptionIndex(-1) // reset optionIndex in case there is something selected
-                    ref.moveOptionSelection(1, true) // focus the first selectable option and do not update the input-value
+                    ref.setOptionIndex(-1); // reset optionIndex in case there is something selected
+                    ref.moveOptionSelection(1, true); // focus the first selectable option and do not update the input-value
                 }
             });
         },
@@ -96,7 +96,7 @@ export default {
             this.block.args.push(['', '']);
         }
     }
-}
+};
 </script>
 
 <style lang="scss">
diff --git a/editor/src/components/Nav.vue b/editor/src/components/Nav.vue
index a6e4acb..e618581 100644
--- a/editor/src/components/Nav.vue
+++ b/editor/src/components/Nav.vue
@@ -27,6 +27,9 @@
 import { store } from '../store/store';
 
 export default {
+
+    props: ['language'],
+
     data() {
         return {
             shared: store,
@@ -40,7 +43,7 @@ export default {
     watch: {
         selected(newVal) {
             if (newVal) {
-                const newPath = `/edit/${newVal}`;
+                const newPath = `/edit/${this.language}/${newVal}`;
                 if (this.$route.path !== newPath) {
                     this.$router.push({
                         path: newPath
diff --git a/editor/src/components/Target.vue b/editor/src/components/Target.vue
index 941685f..be908fe 100644
--- a/editor/src/components/Target.vue
+++ b/editor/src/components/Target.vue
@@ -141,7 +141,7 @@ export default {
 
     methods: {
         startEdit() {
-            this.editingLabel = this.target.name
+            this.editingLabel = this.target.name;
         },
         saveEdit() {
             this.target.name = this.editingLabel;
@@ -192,7 +192,7 @@ export default {
                     type: blockType,
                     // Default has same level of previous block
                     level: blockBefore.level
-                }
+                };
                 switch (blockType) {
                 case 'header':
                     block.propertyName = '';
@@ -209,7 +209,7 @@ export default {
             }
         }
     }
-}
+};
 </script>
 
 <style lang="scss">
diff --git a/editor/src/layouts/EditorLayout.vue b/editor/src/layouts/EditorLayout.vue
index 942f1c7..0bc3d37 100644
--- a/editor/src/layouts/EditorLayout.vue
+++ b/editor/src/layouts/EditorLayout.vue
@@ -13,11 +13,12 @@
                 <q-btn flat icon="refresh" @click="restore" v-if="hasUnsaved">Reset Editing</q-btn>
                 <q-btn flat icon="save" @click="save"> {{ hasUnsaved ? 'Unsaved' : ''}}</q-btn>
                 <q-btn flat icon="arrow_downward" @click="fetchFromServer"></q-btn>
+                <q-btn flat icon="language" @click="switchLanguage">{{language}}</q-btn>
             </q-toolbar>
         </q-header>
 
         <q-drawer :persistent="true" v-model="navOpen" side="left" overlay behavior="desktop" bordered>
-            <Nav />
+            <Nav :language="language" />
         </q-drawer>
 
         <q-page-container>
@@ -33,14 +34,16 @@ import {
     store,
     saveToServer,
     detectChangeAndSaveToLocal,
+    restoreFromLocalStorage,
     clearLocalStorage,
     fetchFromServer,
     restore
 } from '../store/store';
-import { socket } from '../store/socket';
 import { Notify } from 'quasar';
 
 export default {
+    props: ['language'],
+
     components: {
         Nav
     },
@@ -54,9 +57,16 @@ export default {
         };
     },
 
+    mounted() {
+        fetchFromServer(this.language, () => {
+            // Try restore from local storage.
+            restoreFromLocalStorage();
+        });
+    },
+
     methods: {
         save() {
-            saveToServer().then(() => {
+            saveToServer(this.language).then(() => {
                 this.hasUnsaved = false;
                 Notify.create({
                     message: 'Saved Successfuly'
@@ -90,7 +100,8 @@ export default {
                 persistent: true,
                 dark: true
             }).onOk(() => {
-                fetchFromServer().then(() => {
+                fetchFromServer(this.language).then(() => {
+                    clearLocalStorage();
                     Notify.create({
                         message: 'Fetched Successfuly'
                     });
@@ -100,6 +111,25 @@ export default {
                     });
                 });
             });
+        },
+
+        switchLanguage() {
+            this.$q.dialog({
+                title: 'Confirm',
+                message: 'Switch language will override the content you are editing. Are sure to do this?',
+                cancel: true,
+                persistent: true,
+                dark: true
+            }).onOk(() => {
+                const lang = this.language === 'zh' ? 'en' : 'zh';
+
+                const newPath = `/edit/${lang}/${this.$route.params.docPath}`;
+                if (this.$route.path !== newPath) {
+                    this.$router.push({
+                        path: newPath
+                    });
+                }
+            });
         }
     },
 
@@ -109,10 +139,17 @@ export default {
                 detectChangeAndSaveToLocal(() => {
                     this.hasUnsaved = true;
                 }, () => {
-                    this.hasUnsaved = false
+                    this.hasUnsaved = false;
                 });
             },
             deep: true
+        },
+
+        language() {
+            fetchFromServer(this.language, () => {
+                // Try restore from local storage.
+                restoreFromLocalStorage();
+            });
         }
     }
 };
diff --git a/editor/src/router/routes.js b/editor/src/router/routes.js
index 8828ea9..7f74524 100644
--- a/editor/src/router/routes.js
+++ b/editor/src/router/routes.js
@@ -3,15 +3,16 @@ const routes = [
     {
         path: '/',
         // TODO
-        redirect: '/edit/series.bar'
+        redirect: '/edit/en/series.bar'
     },
 
     {
-        path: '/',
+        path: '/edit/:language/',
         component: () => import('layouts/EditorLayout.vue'),
+        props: true,
         children: [
             // { path: 'index', component: () => import('pages/Index.vue') },
-            { path: 'edit/:docPath', component: () => import('pages/DocBlockEditor.vue'), props: true }
+            { path: '/edit/:language/:docPath', component: () => import('pages/DocBlockEditor.vue'), props: true }
         ]
     },
 
diff --git a/editor/src/store/store.js b/editor/src/store/store.js
index 8a55634..6c1f608 100644
--- a/editor/src/store/store.js
+++ b/editor/src/store/store.js
@@ -4,7 +4,6 @@ import { Notify } from 'quasar';
 
 export const store = {
     blocks: {},
-
     originalBlocks: null,
 
     blocksToCopy: [],
@@ -28,17 +27,14 @@ function updateTargets() {
     store.targetsMap = Object.freeze(targetsMap);
 }
 
-fetchFromServer(() => {
-    // Try restore from local storage.
-    restoreFromLocalStorage();
-});
-
 socket.on('editor-exists', function () {
     store.editorExists = true;
 });
 
-export function fetchFromServer(extraProcess) {
-    return socketRequest('fetch').then((blocks) => {
+export function fetchFromServer(lang, extraProcess) {
+    return socketRequest('fetch', {
+        lang
+    }).then((blocks) => {
         store.blocks = blocks;
         store.originalBlocks = Object.freeze(_.cloneDeep(blocks));
 
@@ -48,8 +44,11 @@ export function fetchFromServer(extraProcess) {
     });
 }
 
-export function saveToServer() {
-    return socketRequest('save').then(() => {
+export function saveToServer(lang) {
+    return socketRequest('save', {
+        blocks: store.blocks,
+        lang
+    }).then(() => {
         // Reset the base
         store.originalBlocks = Object.freeze(_.cloneDeep(store.blocks));
         clearLocalStorage();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org