add tags-view control

This commit is contained in:
Pan 2019-03-14 13:48:57 +08:00
parent fd550545af
commit 4414a25b77
10 changed files with 144 additions and 16 deletions

View File

@ -18,10 +18,6 @@ import { addClass, removeClass } from '@/utils'
export default { export default {
name: 'RightPanel', name: 'RightPanel',
props: { props: {
value: {
default: false,
type: Boolean
},
clickNotClose: { clickNotClose: {
default: false, default: false,
type: Boolean type: Boolean
@ -29,7 +25,7 @@ export default {
}, },
data() { data() {
return { return {
show: false show: true
} }
}, },
watch: { watch: {
@ -52,7 +48,7 @@ export default {
window.addEventListener('click', this.closeSidebar) window.addEventListener('click', this.closeSidebar)
}, },
closeSidebar(evt) { closeSidebar(evt) {
const parent = evt.target.closest('.rightPanel') const parent = evt.target.closest('.rightPanel-container')
if (!parent) { if (!parent) {
this.show = false this.show = false
window.removeEventListener('click', this.closeSidebar) window.removeEventListener('click', this.closeSidebar)

View File

@ -2,18 +2,20 @@
<div :class="classObj" class="app-wrapper"> <div :class="classObj" class="app-wrapper">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<sidebar class="sidebar-container" /> <sidebar class="sidebar-container" />
<div class="main-container"> <div :class="{hasTagsView:needTagsView}" class="main-container">
<navbar /> <navbar />
<tags-view /> <tags-view v-if="needTagsView" />
<app-main /> <app-main />
<right-panel v-if="showSettings" /> <right-panel v-if="showSettings">
<settings />
</right-panel>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import RightPanel from '@/components/RightPanel' import RightPanel from '@/components/RightPanel'
import { Navbar, Sidebar, AppMain, TagsView } from './components' import { Navbar, Sidebar, AppMain, TagsView, Settings } from './components'
import ResizeMixin from './mixin/ResizeHandler' import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex' import { mapState } from 'vuex'
@ -24,14 +26,16 @@ export default {
Navbar, Navbar,
Sidebar, Sidebar,
AppMain, AppMain,
TagsView TagsView,
Settings
}, },
mixins: [ResizeMixin], mixins: [ResizeMixin],
computed: { computed: {
...mapState({ ...mapState({
sidebar: state => state.app.sidebar, sidebar: state => state.app.sidebar,
device: state => state.app.device, device: state => state.app.device,
showSettings: state => state.app.showSettings showSettings: state => state.settings.showSettings,
needTagsView: state => state.settings.tagsView
}), }),
classObj() { classObj() {
return { return {

View File

@ -24,11 +24,16 @@ export default {
<style scoped> <style scoped>
.app-main { .app-main {
/*84 = navbar + tags-view = 50 +34 */ /*50= navbar 50 */
min-height: calc(100vh - 84px); min-height: calc(100vh - 50px);
width: 100%; width: 100%;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
} }
.hasTagsView .app-main {
/*84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 84px);
}
</style> </style>

View File

@ -92,9 +92,16 @@ export default {
</script> </script>
<style rel="stylesheet/scss" lang="scss" scoped> <style rel="stylesheet/scss" lang="scss" scoped>
.hasTagsView {
.navbar {
border-bottom: none;
}
}
.navbar { .navbar {
height: 50px; height: 50px;
overflow: hidden; overflow: hidden;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
.hamburger-container { .hamburger-container {
line-height: 46px; line-height: 46px;
@ -150,6 +157,7 @@ export default {
.avatar-wrapper { .avatar-wrapper {
margin-top: 5px; margin-top: 5px;
position: relative; position: relative;
.user-avatar { .user-avatar {
cursor: pointer; cursor: pointer;
width: 40px; width: 40px;

View File

@ -0,0 +1,68 @@
<template>
<div class="drawer-container">
<div>
<h3 class="drawer-title">
系统布局配置
</h3>
<div class="drawer-item">
<span>开启 Tags-View</span>
<el-switch v-model="tagsView" class="drawer-switch" />
</div>
<div class="drawer-item">
<span>显示 Logo</span>
<el-switch v-model="sidebarLogo" class="drawer-switch" />
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
sidebarLogo: true
}
},
computed: {
tagsView: {
get() {
return this.$store.state.settings.tagsView
},
set(val) {
this.$store.dispatch('changeSetting', {
key: 'tagsView',
value: val
})
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.drawer-container {
padding: 24px;
font-size: 14px;
line-height: 1.5;
word-wrap: break-word;
.drawer-title {
margin-bottom: 12px;
color: rgba(0, 0, 0, .85);
font-size: 14px;
line-height: 22px;
}
.drawer-item {
color: rgba(0, 0, 0, .65);
font-size: 14px;
padding: 12px 0;
}
.drawer-switch {
float: right
}
}
</style>

View File

@ -2,3 +2,4 @@ export { default as Navbar } from './Navbar'
export { default as Sidebar } from './Sidebar/index.vue' export { default as Sidebar } from './Sidebar/index.vue'
export { default as TagsView } from './TagsView/index.vue' export { default as TagsView } from './TagsView/index.vue'
export { default as AppMain } from './AppMain' export { default as AppMain } from './AppMain'
export { default as Settings } from './Settings'

22
src/settings.js Normal file
View File

@ -0,0 +1,22 @@
export default {
/**
* @type {boolean} true | false
* @description Whether show the settings right-panel
*/
showSettings: true,
/**
* @type {boolean} true | false
* @description Whether need tagsView
*/
tagsView: true,
/**
* @type {string | array} 'production' | ['production','development']
* @description Need show err logs component.
* The default is only used in the production env
* If you want to use it in dev, you can pass ['production','development']
*/
errorLog: 'production'
}

View File

@ -4,6 +4,7 @@ import app from './modules/app'
import errorLog from './modules/errorLog' import errorLog from './modules/errorLog'
import permission from './modules/permission' import permission from './modules/permission'
import tagsView from './modules/tagsView' import tagsView from './modules/tagsView'
import settings from './modules/settings'
import user from './modules/user' import user from './modules/user'
import getters from './getters' import getters from './getters'
@ -15,6 +16,7 @@ const store = new Vuex.Store({
errorLog, errorLog,
permission, permission,
tagsView, tagsView,
settings,
user user
}, },
getters getters

View File

@ -8,8 +8,7 @@ const app = {
}, },
device: 'desktop', device: 'desktop',
language: Cookies.get('language') || 'en', language: Cookies.get('language') || 'en',
size: Cookies.get('size') || 'medium', size: Cookies.get('size') || 'medium'
showSettings: true
}, },
mutations: { mutations: {
TOGGLE_SIDEBAR: state => { TOGGLE_SIDEBAR: state => {

View File

@ -0,0 +1,23 @@
import defaultSettings from '@/settings'
const { showSettings, tagsView } = defaultSettings
const settings = {
state: {
showSettings: showSettings,
tagsView: tagsView
},
mutations: {
CHANGE_SETTING: (state, { key, value }) => {
if (state.hasOwnProperty(key)) {
state[key] = value
}
}
},
actions: {
changeSetting({ commit }, data) {
commit('CHANGE_SETTING', data)
}
}
}
export default settings