2021-06-01 13:18:37 +08:00

395 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="manage-box">
<div class="manage-box-menu">
<div class="manage-box-title">
<div class="manage-box-logo"></div>
<span>Doo Task</span>
</div>
<ul>
<li @click="toggleRoute('dashboard')" :class="classNameRoute('dashboard')">
<Icon type="md-speedometer" />
<div class="menu-title">Dashboard</div>
</li>
<li @click="toggleRoute('setting')" :class="classNameRoute('setting')">
<Icon type="md-cog" />
<div class="menu-title">Setting</div>
</li>
<li @click="toggleRoute('calendar')" :class="classNameRoute('calendar')">
<Icon type="md-calendar" />
<div class="menu-title">Calendar</div>
</li>
<li class="menu-project">
<ul>
<li v-for="(item, key) in projectLists" :key="key" @click="toggleRoute('project/' + item.id)" :class="classNameRoute('project/' + item.id)">{{item.name}}</li>
<li @click="toggleRoute('project/1')" :class="classNameRoute('project/1')">✔️ Daily Task</li>
<li @click="toggleRoute('project/2')" :class="classNameRoute('project/2')">✈️ Meetings Summary</li>
<li @click="toggleRoute('project/3')" :class="classNameRoute('project/3')">🛰 Resources</li>
<li @click="toggleRoute('project/4')" :class="classNameRoute('project/4')">💺 Availibity</li>
<li @click="toggleRoute('project/5')" :class="classNameRoute('project/5')">🍒 Brainstroaming</li>
</ul>
<Loading v-if="projectLoad > 0"/>
</li>
</ul>
<Button class="manage-box-new" type="primary" icon="md-add" @click="addShow=true">New Project</Button>
</div>
<div class="manage-box-main">
<div class="manage-box-body">
<div class="manage-box-body-content">
<keep-alive>
<router-view class="manage-box-view"></router-view>
</keep-alive>
</div>
</div>
</div>
<!--新建项目-->
<Modal
v-model="addShow"
:title="$L('新建项目')"
:closable="false"
:mask-closable="false"
class-name="simple-modal">
<Form ref="addProject" :model="addData" :rules="addRule" label-width="auto" @submit.native.prevent>
<FormItem prop="title" :label="$L('项目名称')">
<Input type="text" v-model="addData.title"></Input>
</FormItem>
<FormItem prop="columns" :label="$L('项目模板')">
<Select v-model="addData.template" @on-change="(res) => {$set(addData, 'columns', columns[res].value)}" :placeholder="$L('请选择模板')">
<Option v-for="(item, index) in columns" :value="index" :key="index">{{ item.label }}</Option>
</Select>
</FormItem>
<FormItem v-if="addData.columns.length > 0" :label="$L('任务分类')">
<div style="line-height:38px">
<span v-for="(item, index) in addData.columns">
<Tag @on-close="() => { addData.columns.splice(index, 1)}" closable size="large" color="primary">{{item}}</Tag>
</span>
</div>
<div style="margin-top:4px;"></div>
<div style="margin-bottom:-16px">
<Button icon="ios-add" type="dashed" @click="addColumns">{{$L('添加分类')}}</Button>
</div>
</FormItem>
</Form>
<div slot="footer">
<Button type="default" @click="addShow=false">{{$L('取消')}}</Button>
<Button type="primary" :loading="projectLoad > 0" @click="onAddProject">{{$L('添加')}}</Button>
</div>
</Modal>
</div>
</template>
<style lang="scss" scoped>
:global {
.manage-box {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
.manage-box-menu {
flex-grow: 0;
flex-shrink: 0;
width: 255px;
height: 100%;
background: #F4F5F7;
display: flex;
flex-direction: column;
align-items: center;
transition: all 0.2s;
.manage-box-title {
display: flex;
align-items: center;
flex-shrink: 0;
width: 86%;
padding: 6px;
margin-top: 27px;
border-radius: 8px;
background-color: #ffffff;
.manage-box-logo {
width: 36px;
height: 36px;
background: url("../../statics/images/logo.svg") no-repeat center center;
background-size: contain;
}
> span {
padding-left: 12px;
font-size: 16px;
font-weight: 600;
}
}
> ul {
flex: 1;
width: 100%;
margin-top: 16px;
overflow: auto;
> li {
display: flex;
align-items: center;
height: 38px;
color: #6C7D8C;
cursor: pointer;
position: relative;
width: 80%;
max-width: 100%;
margin: 8px auto;
padding: 0 4%;
border-radius: 4px;
> i {
opacity: 0.3;
font-size: 22px;
margin-right: 10px;
margin-top: -1px;
}
.menu-title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
&.menu-project {
display: flex;
flex-direction: column;
align-items: center;
height: auto;
padding: 14px 0 0;
> ul {
width: 100%;
> li {
position: relative;
list-style: none;
padding: 0 8px 0 30px;
height: 38px;
line-height: 38px;
margin: 4px auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border-radius: 4px;
color: #333333;
&:before {
content: "";
position: absolute;
top: 50%;
left: 8px;
transform: translateY(-50%);
width: 12px;
height: 12px;
background: url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjIyMzkwODExNTQxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI0OTk3IiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiPjxwYXRoIGQ9Ik0zNjYuMTgyNCAxMDguMjM2OEw4MTIuMDMyIDQyOC4wMzJhMTAyLjQgMTAyLjQgMCAwIDEgMCAxNjYuNTAyNEwzNjYuMTgyNCA5MTQuMzI5NmExMDIuNCAxMDIuNCAwIDAgMS0xNjIuMDk5Mi04My4yNTEyVjE5MS40ODhhMTAyLjQgMTAyLjQgMCAwIDEgMTYyLjA5OTItODMuMjUxMnoiIHAtaWQ9IjI0OTk4IiBmaWxsPSIjOTk5OTk5Ij48L3BhdGg+PC9zdmc+") no-repeat center center;
background-size: contain;
}
&.active {
background-color: #ffffff;
}
}
}
.common-loading {
margin: 6px;
width: 22px;
height: 22px;
}
}
&.active {
background-color: #ffffff;
}
}
}
.manage-box-new {
width: 80%;
height: 38px;
margin-top: 16px;
margin-bottom: 20px;
}
}
.manage-box-main {
flex: 1;
height: 100%;
display: flex;
flex-direction: column;
background: white;
.manage-box-body {
width: 100%;
flex: 1;
position: relative;
overflow: auto;
display: flex;
flex-direction: column;
.manage-box-body-content {
flex: 1;
position: relative;
.manage-box-view {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
}
}
}
}
}
}
</style>
<script>
import { mapState } from 'vuex'
export default {
data() {
return {
loadIng: 0,
curPath: this.$route.path,
addShow: false,
addData: {
title: '',
columns: [],
template: 0,
},
addRule: {},
columns: [],
projectLoad: 0,
projectLists: [],
projectListTotal: 0,
}
},
mounted() {
$A.getUserInfo(this.getProjectLists);
},
deactivated() {
this.addShow = false;
},
computed: {
...mapState(['userId']),
},
watch: {
'$route' (To) {
this.curPath = To.path;
},
userId(userid) {
if (userid > 0) {
this.getProjectLists()
}
}
},
methods: {
initLanguage() {
this.columns = [{
label: this.$L('空白模板'),
value: [],
}, {
label: this.$L('软件开发'),
value: [this.$L('产品规划'),this.$L('前端开发'),this.$L('后端开发'),this.$L('测试'),this.$L('发布'),this.$L('其它')],
}, {
label: this.$L('产品开发'),
value: [this.$L('产品计划'), this.$L('正在设计'), this.$L('正在研发'), this.$L('测试'), this.$L('准备发布'), this.$L('发布成功')],
}];
this.addRule = {
title: [
{ required: true, message: this.$L('请填写项目名称!'), trigger: 'change' },
{ type: 'string', min: 2, message: this.$L('项目名称至少2个字'), trigger: 'change' }
]
};
},
toggleRoute(path) {
this.goForward({path: '/manage/' + path});
},
classNameRoute(path) {
return {
"active": this.curPath == '/manage/' + path
};
},
addColumns() {
this.columnsValue = "";
$A.modalConfirm({
render: (h) => {
return h('div', [
h('div', {
style: {
fontSize: '16px',
fontWeight: '500',
marginBottom: '20px',
}
}, this.$L('添加流程')),
h('TagInput', {
props: {
value: this.columnsValue,
autofocus: true,
placeholder: this.$L('请输入流程名称,多个可用英文逗号分隔。')
},
on: {
input: (val) => {
this.columnsValue = val;
}
}
})
])
},
onOk: () => {
if (this.columnsValue) {
let array = $A.trim(this.columnsValue).split(",");
array.forEach((name) => {
if ($A.trim(name)) {
this.addData.columns.push($A.trim(name));
}
});
}
},
})
},
onAddProject() {
this.$refs.addProject.validate((valid) => {
if (valid) {
this.projectLoad++;
$A.apiAjax({
url: 'project/add',
data: this.addData,
complete: () => {
this.projectLoad--;
},
success: ({ret, data, msg}) => {
if (ret === 1) {
$A.messageSuccess(msg);
this.addShow = false;
this.$refs.addProject.resetFields();
this.$set(this.addData, 'template', 0);
//
this.getProjectLists(true);
} else {
$A.modalError(msg);
}
}
});
}
});
},
getProjectLists() {
this.projectLoad++;
$A.apiAjax({
url: 'project/lists',
complete: () => {
this.projectLoad--;
},
success: ({ret, data, msg}) => {
if (ret === 1) {
this.projectLists = data.data;
this.projectListTotal = data.total;
} else {
this.projectLists = [];
this.projectListTotal = 0;
}
}
});
}
}
}
</script>