优化左上角菜单集合
This commit is contained in:
parent
1f76278d2b
commit
f17009a988
@ -19,39 +19,84 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<DropdownMenu slot="list">
|
<DropdownMenu slot="list">
|
||||||
<DropdownItem
|
<template v-for="item in menu">
|
||||||
v-for="(item, key) in menu"
|
<!-- 团队管理 -->
|
||||||
v-if="item.visible !== false"
|
<Dropdown
|
||||||
:key="key"
|
v-if="item.path === 'team'"
|
||||||
:divided="!!item.divided"
|
placement="right-start">
|
||||||
:name="item.path">
|
|
||||||
{{$L(item.name)}}
|
|
||||||
<Badge v-if="item.path === 'version'" class="manage-menu-report-badge" :text="clientNewVersion"/>
|
|
||||||
<Badge v-if="item.path === 'workReport'" class="manage-menu-report-badge" :count="reportUnreadNumber"/>
|
|
||||||
</DropdownItem>
|
|
||||||
<Dropdown placement="right-start" @on-click="setTheme">
|
|
||||||
<DropdownItem divided>
|
<DropdownItem divided>
|
||||||
<div class="manage-menu-language">
|
<div class="manage-menu-flex">
|
||||||
{{$L('主题皮肤')}}
|
{{$L(item.name)}}
|
||||||
|
<Badge v-if="reportUnreadNumber > 0" class="manage-menu-report-badge" :count="reportUnreadNumber"/>
|
||||||
|
<Icon v-else type="ios-arrow-forward"></Icon>
|
||||||
|
</div>
|
||||||
|
</DropdownItem>
|
||||||
|
<DropdownMenu slot="list">
|
||||||
|
<DropdownItem name="allUser">{{$L('团队管理')}}</DropdownItem>
|
||||||
|
<DropdownItem name="workReport">
|
||||||
|
<div class="manage-menu-flex">
|
||||||
|
{{$L('工作报告')}}
|
||||||
|
<Badge v-if="reportUnreadNumber > 0" class="manage-menu-report-badge" :count="reportUnreadNumber"/>
|
||||||
|
</div>
|
||||||
|
</DropdownItem>
|
||||||
|
<DropdownItem name="exportTask">{{$L('导出任务记录')}}</DropdownItem>
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
|
<!-- 主题皮肤 -->
|
||||||
|
<Dropdown
|
||||||
|
v-else-if="item.path === 'theme'"
|
||||||
|
placement="right-start"
|
||||||
|
@on-click="setTheme">
|
||||||
|
<DropdownItem divided>
|
||||||
|
<div class="manage-menu-flex">
|
||||||
|
{{$L(item.name)}}
|
||||||
<Icon type="ios-arrow-forward"></Icon>
|
<Icon type="ios-arrow-forward"></Icon>
|
||||||
</div>
|
</div>
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<DropdownMenu slot="list">
|
<DropdownMenu slot="list">
|
||||||
<Dropdown-item v-for="(item, key) in themeList" :key="key" :name="item.value" :selected="themeMode === item.value">{{$L(item.name)}}</Dropdown-item>
|
<DropdownItem
|
||||||
|
v-for="(item, key) in themeList"
|
||||||
|
:key="key"
|
||||||
|
:name="item.value"
|
||||||
|
:selected="themeMode === item.value">{{$L(item.name)}}</DropdownItem>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
<Dropdown placement="right-start" @on-click="setLanguage">
|
<!-- 语言设置 -->
|
||||||
|
<Dropdown
|
||||||
|
v-else-if="item.path === 'language'"
|
||||||
|
placement="right-start"
|
||||||
|
@on-click="setLanguage">
|
||||||
<DropdownItem divided>
|
<DropdownItem divided>
|
||||||
<div class="manage-menu-language">
|
<div class="manage-menu-flex">
|
||||||
{{currentLanguage}}
|
{{currentLanguage}}
|
||||||
<Icon type="ios-arrow-forward"></Icon>
|
<Icon type="ios-arrow-forward"></Icon>
|
||||||
</div>
|
</div>
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
<DropdownMenu slot="list">
|
<DropdownMenu slot="list">
|
||||||
<Dropdown-item v-for="(item, key) in languageList" :key="key" :name="key" :selected="getLanguage() === key">{{item}}</Dropdown-item>
|
<DropdownItem
|
||||||
|
v-for="(item, key) in languageList"
|
||||||
|
:key="key"
|
||||||
|
:name="key"
|
||||||
|
:selected="getLanguage() === key">{{item}}</DropdownItem>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
<DropdownItem divided name="signout" style="color:#f40">{{$L('退出登录')}}</DropdownItem>
|
<!-- 其他菜单 -->
|
||||||
|
<DropdownItem
|
||||||
|
v-else-if="item.visible !== false"
|
||||||
|
:divided="!!item.divided"
|
||||||
|
:name="item.path"
|
||||||
|
:style="item.style || {}">
|
||||||
|
{{$L(item.name)}}
|
||||||
|
<Badge
|
||||||
|
v-if="item.path === 'version'"
|
||||||
|
class="manage-menu-report-badge"
|
||||||
|
:text="clientNewVersion"/>
|
||||||
|
<Badge
|
||||||
|
v-else-if="item.path === 'workReport' && reportUnreadNumber > 0"
|
||||||
|
class="manage-menu-report-badge"
|
||||||
|
:count="reportUnreadNumber"/>
|
||||||
|
</DropdownItem>
|
||||||
|
</template>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
<ul :class="overlayClass" @scroll="handleClickTopOperateOutside">
|
<ul :class="overlayClass" @scroll="handleClickTopOperateOutside">
|
||||||
@ -184,6 +229,30 @@
|
|||||||
<TaskAdd ref="addTask" v-model="addTaskShow"/>
|
<TaskAdd ref="addTask" v-model="addTaskShow"/>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<!--导出任务记录-->
|
||||||
|
<Modal
|
||||||
|
v-model="exportTaskShow"
|
||||||
|
:title="$L('导出任务记录')"
|
||||||
|
:mask-closable="false">
|
||||||
|
<Form ref="exportTask" :model="exportData" label-width="auto" @submit.native.prevent>
|
||||||
|
<FormItem :label="$L('导出会员')">
|
||||||
|
<UserInput v-model="exportData.userids" :multiple-max="20" :placeholder="$L('请选择会员')"/>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('时间范围')">
|
||||||
|
<DatePicker
|
||||||
|
v-model="exportData.times"
|
||||||
|
type="daterange"
|
||||||
|
format="yyyy/MM/dd"
|
||||||
|
style="width:100%"
|
||||||
|
:placeholder="$L('请选择时间')"/>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div slot="footer" class="adaption">
|
||||||
|
<Button type="default" @click="exportTaskShow=false">{{$L('取消')}}</Button>
|
||||||
|
<Button type="primary" :loading="exportLoadIng > 0" @click="onExportTask">{{$L('导出')}}</Button>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
<!--任务详情-->
|
<!--任务详情-->
|
||||||
<Modal
|
<Modal
|
||||||
:value="taskId > 0"
|
:value="taskId > 0"
|
||||||
@ -248,20 +317,27 @@
|
|||||||
import { mapState, mapGetters } from 'vuex'
|
import { mapState, mapGetters } from 'vuex'
|
||||||
import TaskDetail from "./manage/components/TaskDetail";
|
import TaskDetail from "./manage/components/TaskDetail";
|
||||||
import ProjectArchived from "./manage/components/ProjectArchived";
|
import ProjectArchived from "./manage/components/ProjectArchived";
|
||||||
import notificationKoro from "notification-koro1";
|
|
||||||
import TeamManagement from "./manage/components/TeamManagement";
|
import TeamManagement from "./manage/components/TeamManagement";
|
||||||
import ProjectManagement from "./manage/components/ProjectManagement";
|
import ProjectManagement from "./manage/components/ProjectManagement";
|
||||||
import DrawerOverlay from "../components/DrawerOverlay";
|
import DrawerOverlay from "../components/DrawerOverlay";
|
||||||
import DragBallComponent from "../components/DragBallComponent";
|
import DragBallComponent from "../components/DragBallComponent";
|
||||||
import TaskAdd from "./manage/components/TaskAdd";
|
import TaskAdd from "./manage/components/TaskAdd";
|
||||||
import Report from "./manage/components/Report";
|
import Report from "./manage/components/Report";
|
||||||
|
import notificationKoro from "notification-koro1";
|
||||||
import {Store} from "le5le-store";
|
import {Store} from "le5le-store";
|
||||||
|
import UserInput from "../components/UserInput";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
UserInput,
|
||||||
TaskAdd,
|
TaskAdd,
|
||||||
|
TaskDetail,
|
||||||
Report,
|
Report,
|
||||||
DragBallComponent, DrawerOverlay, ProjectManagement, TeamManagement, ProjectArchived, TaskDetail},
|
DragBallComponent,
|
||||||
|
DrawerOverlay,
|
||||||
|
ProjectManagement,
|
||||||
|
TeamManagement,
|
||||||
|
ProjectArchived},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loadIng: 0,
|
loadIng: 0,
|
||||||
@ -280,6 +356,13 @@ export default {
|
|||||||
addTaskShow: false,
|
addTaskShow: false,
|
||||||
addTaskSubscribe: null,
|
addTaskSubscribe: null,
|
||||||
|
|
||||||
|
exportTaskShow: false,
|
||||||
|
exportLoadIng: 0,
|
||||||
|
exportData: {
|
||||||
|
userids: [],
|
||||||
|
times: [],
|
||||||
|
},
|
||||||
|
|
||||||
dialogMsgSubscribe: null,
|
dialogMsgSubscribe: null,
|
||||||
|
|
||||||
projectKeyValue: '',
|
projectKeyValue: '',
|
||||||
@ -399,21 +482,37 @@ export default {
|
|||||||
{path: 'personal', name: '个人设置'},
|
{path: 'personal', name: '个人设置'},
|
||||||
{path: 'password', name: '密码设置'},
|
{path: 'password', name: '密码设置'},
|
||||||
{path: 'clearCache', name: '清除缓存'},
|
{path: 'clearCache', name: '清除缓存'},
|
||||||
|
|
||||||
{path: 'system', name: '系统设置', divided: true},
|
{path: 'system', name: '系统设置', divided: true},
|
||||||
{path: 'version', name: '更新版本', visible: !!this.clientNewVersion},
|
{path: 'version', name: '更新版本', visible: !!this.clientNewVersion},
|
||||||
{path: 'workReport', name: '工作报告', divided: true},
|
|
||||||
{path: 'allUser', name: '团队管理'},
|
{path: 'allProject', name: '所有项目', divided: true},
|
||||||
{path: 'allProject', name: '所有项目'},
|
{path: 'archivedProject', name: '已归档的项目'},
|
||||||
{path: 'archivedProject', name: '已归档的项目'}
|
|
||||||
|
{path: 'team', name: '团队管理', divided: true},
|
||||||
|
|
||||||
|
{path: 'theme', name: '主题皮肤', divided: true},
|
||||||
|
|
||||||
|
{path: 'language', name: this.currentLanguage, divided: true},
|
||||||
|
|
||||||
|
{path: 'logout', name: '退出登录', style: {color: '#f40'}, divided: true},
|
||||||
]
|
]
|
||||||
} else {
|
} else {
|
||||||
return [
|
return [
|
||||||
{path: 'personal', name: '个人设置'},
|
{path: 'personal', name: '个人设置'},
|
||||||
{path: 'password', name: '密码设置'},
|
{path: 'password', name: '密码设置'},
|
||||||
{path: 'clearCache', name: '清除缓存'},
|
{path: 'clearCache', name: '清除缓存'},
|
||||||
|
|
||||||
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
|
{path: 'version', name: '更新版本', divided: true, visible: !!this.clientNewVersion},
|
||||||
|
|
||||||
{path: 'workReport', name: '工作报告', divided: true},
|
{path: 'workReport', name: '工作报告', divided: true},
|
||||||
{path: 'archivedProject', name: '已归档的项目'}
|
{path: 'archivedProject', name: '已归档的项目'},
|
||||||
|
|
||||||
|
{path: 'theme', name: '主题皮肤', divided: true},
|
||||||
|
|
||||||
|
{path: 'language', name: this.currentLanguage, divided: true},
|
||||||
|
|
||||||
|
{path: 'logout', name: '退出登录', style: {color: '#f40'}, divided: true},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -429,7 +528,7 @@ export default {
|
|||||||
|
|
||||||
projectLists() {
|
projectLists() {
|
||||||
const {projectKeyValue, cacheProjects} = this;
|
const {projectKeyValue, cacheProjects} = this;
|
||||||
const data = cacheProjects.sort((a, b) => {
|
const data = $A.cloneJSON(cacheProjects).sort((a, b) => {
|
||||||
if (a.top_at || b.top_at) {
|
if (a.top_at || b.top_at) {
|
||||||
return $A.Date(b.top_at) - $A.Date(a.top_at);
|
return $A.Date(b.top_at) - $A.Date(a.top_at);
|
||||||
}
|
}
|
||||||
@ -575,6 +674,9 @@ export default {
|
|||||||
case 'archivedProject':
|
case 'archivedProject':
|
||||||
this.archivedProjectShow = true;
|
this.archivedProjectShow = true;
|
||||||
return;
|
return;
|
||||||
|
case 'exportTask':
|
||||||
|
this.exportTaskShow = true;
|
||||||
|
return;
|
||||||
case 'workReport':
|
case 'workReport':
|
||||||
if (this.reportUnreadNumber > 0) {
|
if (this.reportUnreadNumber > 0) {
|
||||||
this.reportTabs = "receive";
|
this.reportTabs = "receive";
|
||||||
@ -592,7 +694,7 @@ export default {
|
|||||||
window.location.reload()
|
window.location.reload()
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
case 'signout':
|
case 'logout':
|
||||||
$A.modalConfirm({
|
$A.modalConfirm({
|
||||||
title: '退出登录',
|
title: '退出登录',
|
||||||
content: '你确定要登出系统?',
|
content: '你确定要登出系统?',
|
||||||
@ -756,11 +858,59 @@ export default {
|
|||||||
this.$store.dispatch("call", {
|
this.$store.dispatch("call", {
|
||||||
url: 'report/unread',
|
url: 'report/unread',
|
||||||
}).then(({data}) => {
|
}).then(({data}) => {
|
||||||
this.reportUnreadNumber = data.total ? data.total : 0;
|
this.reportUnreadNumber = data.total || 0;
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
}, typeof timeout === "number" ? timeout : 1000)
|
}, typeof timeout === "number" ? timeout : 1000)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
handleRightClick(event, item) {
|
||||||
|
this.handleClickTopOperateOutside();
|
||||||
|
this.topOperateItem = item;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
const projectWrap = this.$refs.projectWrapper;
|
||||||
|
const projectBounding = projectWrap.getBoundingClientRect();
|
||||||
|
this.topOperateStyles = {
|
||||||
|
left: `${event.clientX - projectBounding.left}px`,
|
||||||
|
top: `${event.clientY - projectBounding.top}px`
|
||||||
|
};
|
||||||
|
this.topOperateVisible = true;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleClickTopOperateOutside() {
|
||||||
|
this.topOperateVisible = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
handleTopClick() {
|
||||||
|
this.$store.dispatch("call", {
|
||||||
|
url: 'project/top',
|
||||||
|
data: {
|
||||||
|
project_id: this.topOperateItem.id,
|
||||||
|
},
|
||||||
|
}).then(() => {
|
||||||
|
this.$store.dispatch("getProjects").catch(() => {});
|
||||||
|
}).catch(({msg}) => {
|
||||||
|
$A.modalError(msg, 301);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
onExportTask() {
|
||||||
|
if (this.exportLoadIng > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.exportLoadIng++;
|
||||||
|
this.$store.dispatch("call", {
|
||||||
|
url: 'project/task/export',
|
||||||
|
data: this.exportData,
|
||||||
|
}).then(({data}) => {
|
||||||
|
this.exportLoadIng--;
|
||||||
|
$A.downFile(data.url);
|
||||||
|
}).catch(({msg}) => {
|
||||||
|
this.exportLoadIng--;
|
||||||
|
$A.modalError(msg);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
notificationInit() {
|
notificationInit() {
|
||||||
this.notificationClass = new notificationKoro(this.$L("打开通知成功"));
|
this.notificationClass = new notificationKoro(this.$L("打开通知成功"));
|
||||||
if (this.notificationClass.support) {
|
if (this.notificationClass.support) {
|
||||||
@ -821,37 +971,6 @@ export default {
|
|||||||
}
|
}
|
||||||
document.addEventListener(visibilityChangeEvent, visibilityChangeListener);
|
document.addEventListener(visibilityChangeEvent, visibilityChangeListener);
|
||||||
},
|
},
|
||||||
|
|
||||||
handleRightClick(event, item) {
|
|
||||||
this.handleClickTopOperateOutside();
|
|
||||||
this.topOperateItem = item;
|
|
||||||
this.$nextTick(() => {
|
|
||||||
const projectWrap = this.$refs.projectWrapper;
|
|
||||||
const projectBounding = projectWrap.getBoundingClientRect();
|
|
||||||
this.topOperateStyles = {
|
|
||||||
left: `${event.clientX - projectBounding.left}px`,
|
|
||||||
top: `${event.clientY - projectBounding.top}px`
|
|
||||||
};
|
|
||||||
this.topOperateVisible = true;
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
handleClickTopOperateOutside() {
|
|
||||||
this.topOperateVisible = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
handleTopClick() {
|
|
||||||
this.$store.dispatch("call", {
|
|
||||||
url: 'project/top',
|
|
||||||
data: {
|
|
||||||
project_id: this.topOperateItem.id,
|
|
||||||
},
|
|
||||||
}).then(() => {
|
|
||||||
this.$store.dispatch("getProjects").catch(() => {});
|
|
||||||
}).catch(({msg}) => {
|
|
||||||
$A.modalError(msg, 301);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
2
resources/assets/sass/pages/page-manage.scss
vendored
2
resources/assets/sass/pages/page-manage.scss
vendored
@ -87,7 +87,7 @@
|
|||||||
transform: scale(0.9);
|
transform: scale(0.9);
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
.manage-menu-language {
|
.manage-menu-flex {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user