mind-map/web/src/pages/Edit/components/NavigatorToolbar.vue

309 lines
7.3 KiB
Vue

<template>
<div class="navigatorContainer customScrollbar" :class="{ isDark: isDark }">
<div class="item">
<el-select
v-model="lang"
size="small"
style="width: 100px"
@change="onLangChange"
>
<el-option
v-for="item in langList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</div>
<div class="item">
<el-tooltip
effect="dark"
:content="$t('navigatorToolbar.backToRoot')"
placement="top"
>
<div class="btn iconfont icondingwei" @click="backToRoot"></div>
</el-tooltip>
</div>
<div class="item">
<div class="btn iconfont iconsousuo" @click="showSearch"></div>
</div>
<div class="item">
<MouseAction :isDark="isDark" :mindMap="mindMap"></MouseAction>
</div>
<div class="item">
<el-tooltip
effect="dark"
:content="
openMiniMap
? $t('navigatorToolbar.closeMiniMap')
: $t('navigatorToolbar.openMiniMap')
"
placement="top"
>
<div class="btn iconfont icondaohang1" @click="toggleMiniMap"></div>
</el-tooltip>
</div>
<div class="item">
<!-- <el-switch
v-model="isReadonly"
:active-text="$t('navigatorToolbar.readonly')"
:inactive-text="$t('navigatorToolbar.edit')"
@change="readonlyChange"
>
</el-switch> -->
<el-tooltip
effect="dark"
:content="
isReadonly
? $t('navigatorToolbar.edit')
: $t('navigatorToolbar.readonly')
"
placement="top"
>
<div
class="btn iconfont"
:class="[isReadonly ? 'iconyanjing' : 'iconbianji1']"
@click="readonlyChange"
></div>
</el-tooltip>
</div>
<div class="item">
<Fullscreen :isDark="isDark" :mindMap="mindMap"></Fullscreen>
</div>
<div class="item">
<Scale :isDark="isDark" :mindMap="mindMap"></Scale>
</div>
<div class="item">
<div
class="btn iconfont"
:class="[isDark ? 'iconmoon_line' : 'iconlieri']"
@click="toggleDark"
></div>
</div>
<!-- <div class="item">
<el-tooltip
effect="dark"
:content="$t('navigatorToolbar.changeSourceCodeEdit')"
placement="top"
>
<div class="btn iconfont iconyuanma" @click="openSourceCodeEdit"></div>
</el-tooltip>
</div> -->
<div class="item">
<Demonstrate :isDark="isDark" :mindMap="mindMap"></Demonstrate>
</div>
<div class="item">
<el-dropdown @command="handleCommand">
<div class="btn el-icon-more"></div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="shortcutKey">
<span class="iconfont iconjianpan"></span>
{{ $t('navigatorToolbar.shortcutKeys') }}
</el-dropdown-item>
<el-dropdown-item command="aiChat">
<span class="iconfont iconAIshengcheng"></span>
{{ $t('navigatorToolbar.ai') }}
</el-dropdown-item>
<el-dropdown-item command="client">
<span class="iconfont iconxiazai"></span>
{{ $t('navigatorToolbar.downloadClient') }}
</el-dropdown-item>
<el-dropdown-item command="github">
<span class="iconfont icongithub"></span>
Github
</el-dropdown-item>
<el-dropdown-item command="site">
<span class="iconfont iconwangzhan"></span>
{{ $t('navigatorToolbar.site') }}
</el-dropdown-item>
<el-dropdown-item disabled
>{{ $t('navigatorToolbar.current') }}v{{
version
}}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import Scale from './Scale.vue'
import Fullscreen from './Fullscreen.vue'
import MouseAction from './MouseAction.vue'
import { langList } from '@/config'
import i18n from '@/i18n'
import { storeLang, getLang } from '@/api'
import { mapState, mapMutations } from 'vuex'
import pkg from 'simple-mind-map/package.json'
import Demonstrate from './Demonstrate.vue'
// 导航器工具栏
export default {
components: {
Scale,
Fullscreen,
MouseAction,
Demonstrate
},
props: {
mindMap: {
type: Object
}
},
data() {
return {
version: pkg.version,
langList,
lang: '',
openMiniMap: false
}
},
computed: {
...mapState({
isReadonly: state => state.isReadonly,
isDark: state => state.localConfig.isDark
})
},
created() {
this.lang = getLang()
},
methods: {
...mapMutations([
'setLocalConfig',
'setIsReadonly',
'setIsSourceCodeEdit',
'setActiveSidebar'
]),
readonlyChange() {
this.setIsReadonly(!this.isReadonly)
this.mindMap.setMode(this.isReadonly ? 'readonly' : 'edit')
},
toggleMiniMap() {
this.openMiniMap = !this.openMiniMap
this.$bus.$emit('toggle_mini_map', this.openMiniMap)
},
onLangChange(lang) {
i18n.locale = lang
storeLang(lang)
this.$bus.$emit('lang_change')
},
showSearch() {
this.$bus.$emit('show_search')
},
toggleDark() {
this.setLocalConfig({
isDark: !this.isDark
})
},
handleCommand(command) {
if (command === 'shortcutKey') {
this.setActiveSidebar('shortcutKey')
return
} else if (command === 'aiChat') {
this.setActiveSidebar('ai')
return
}
let url = ''
switch (command) {
case 'github':
url = 'https://github.com/wanglin2/mind-map'
break
case 'helpDoc':
url = 'https://wanglin2.github.io/mind-map-docs/help/help1.html'
break
case 'devDoc':
url =
'https://wanglin2.github.io/mind-map-docs/start/introduction.html'
break
case 'site':
url = 'https://wanglin2.github.io/mind-map-docs/'
break
case 'issue':
url = 'https://github.com/wanglin2/mind-map/issues/new'
break
case 'client':
url = 'https://pan.baidu.com/s/1huasEbKsGNH2Af68dvWiOg?pwd=3bp3'
default:
break
}
const a = document.createElement('a')
a.href = url
a.target = '_blank'
a.click()
},
backToRoot() {
this.mindMap.renderer.setRootNodeCenter()
},
openSourceCodeEdit() {
this.setIsSourceCodeEdit(true)
}
}
}
</script>
<style lang="less" scoped>
.navigatorContainer {
padding: 0 12px;
position: fixed;
right: 20px;
bottom: 20px;
background: hsla(0, 0%, 100%, 0.8);
border-radius: 5px;
opacity: 0.8;
height: 44px;
font-size: 12px;
display: flex;
align-items: center;
&.isDark {
background: #262a2e;
.item {
a {
color: hsla(0, 0%, 100%, 0.6);
}
.btn {
color: hsla(0, 0%, 100%, 0.6);
}
}
}
.item {
margin-right: 20px;
&:last-of-type {
margin-right: 0;
}
a {
color: #303133;
text-decoration: none;
}
.btn {
cursor: pointer;
font-size: 18px;
}
}
}
@media screen and (max-width: 700px) {
.navigatorContainer {
left: 20px;
overflow-x: auto;
overflow-y: hidden;
height: 60px;
}
}
</style>