From e4a41dbeccaa88536d40318ee46ce802fd4aa3c2 Mon Sep 17 00:00:00 2001 From: Lu Chaohai Date: Mon, 9 Dec 2019 16:15:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Etabs=E7=9A=84=E6=8B=96?= =?UTF-8?q?=E6=8B=BD=E6=8E=92=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 5 +++++ package.json | 1 + .../header-aside/components/tabs/index.vue | 15 +++++++++++++-- src/layout/header-aside/layout.vue | 4 ++-- src/store/modules/d2admin/modules/page.js | 18 ++++++++++++++++++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 213de9ce..8619808f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14314,6 +14314,11 @@ "is-plain-obj": "^1.0.0" } }, + "sortablejs": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.1.tgz", + "integrity": "sha512-N6r7GrVmO8RW1rn0cTdvK3JR0BcqecAJ0PmYMCL3ZuqTH3pY+9QyqkmJSkkLyyDvd+AJnwaxTP22Ybr/83V9hQ==" + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", diff --git a/package.json b/package.json index 2f728af9..03cad115 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "quill": "^1.3.6", "screenfull": "^4.2.0", "simplemde": "^1.11.2", + "sortablejs": "^1.10.1", "ua-parser-js": "^0.7.20", "v-charts": "^1.19.0", "v-contextmenu": "^2.8.0", diff --git a/src/layout/header-aside/components/tabs/index.vue b/src/layout/header-aside/components/tabs/index.vue index 2dd7ca8e..1f186284 100644 --- a/src/layout/header-aside/components/tabs/index.vue +++ b/src/layout/header-aside/components/tabs/index.vue @@ -11,7 +11,7 @@ @rowClick="contextmenuClick"/> import { mapState, mapActions } from 'vuex' +import Sortable from 'sortablejs' export default { components: { D2Contextmenu: () => import('../contextmenu'), @@ -94,7 +95,8 @@ export default { 'closeLeft', 'closeRight', 'closeOther', - 'closeAll' + 'closeAll', + 'openedSort' ]), /** * @description 右键菜单功能点击 @@ -172,6 +174,15 @@ export default { }) } } + }, + mounted () { + const el = document.querySelectorAll('.d2-multiple-page-sort .el-tabs__nav')[0] + Sortable.create(el, { + onEnd: (evt) => { + const { oldIndex, newIndex } = evt + this.openedSort({ oldIndex, newIndex }) + } + }) } } diff --git a/src/layout/header-aside/layout.vue b/src/layout/header-aside/layout.vue index a1f0d8ab..67082428 100644 --- a/src/layout/header-aside/layout.vue +++ b/src/layout/header-aside/layout.vue @@ -15,10 +15,10 @@ }" flex-box="0" flex> -
+ -
+
diff --git a/src/store/modules/d2admin/modules/page.js b/src/store/modules/d2admin/modules/page.js index 2773390b..5022f593 100644 --- a/src/store/modules/d2admin/modules/page.js +++ b/src/store/modules/d2admin/modules/page.js @@ -113,6 +113,24 @@ export default { resolve() }) }, + /** + * @class opened + * @description 重排页面列表上的某一项 + * @param {Object} context + * @param {Object} payload { oldIndex, newIndex } 位置信息 + */ + openedSort ({ state, commit, dispatch }, { oldIndex, newIndex }) { + return new Promise(async resolve => { + // 重排页面列表某一项 + let page = state.opened[oldIndex] + state.opened.splice(oldIndex, 1) + state.opened.splice(newIndex, 0, page) + // 持久化 + await dispatch('opened2db') + // end + resolve() + }) + }, /** * @class opened * @description 新增一个 tag (打开一个页面) -- Gitee