mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-13 12:02:51 +00:00
178 lines
4.8 KiB
Vue
178 lines
4.8 KiB
Vue
<template>
|
|
<div class="task-add">
|
|
<Cascader
|
|
v-model="cascader"
|
|
:data="cascaderData"
|
|
:clearable="false"
|
|
:placeholder="$L('请选择项目')"
|
|
:load-data="cascaderLoadData"
|
|
@on-input-change="cascaderInputChange"
|
|
@on-visible-change="cascaderShow=!cascaderShow"
|
|
filterable/>
|
|
<div class="ivu-modal-footer">
|
|
<div class="adaption">
|
|
<Button type="default" @click="close">{{$L('取消')}}</Button>
|
|
<Button type="primary" :loading="loadIng > 0" @click="onConfirm">{{$L('确定')}}</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {mapState} from "vuex";
|
|
|
|
export default {
|
|
name: "TaskMove",
|
|
props: {
|
|
value: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
task: {
|
|
type: Object,
|
|
default: false
|
|
},
|
|
|
|
},
|
|
data() {
|
|
return {
|
|
cascader: [],
|
|
cascaderShow: false,
|
|
cascaderData: [],
|
|
cascaderValue: '',
|
|
cascaderLoading: 0,
|
|
cascaderAlready: [],
|
|
|
|
loadIng: 0,
|
|
beforeClose: [],
|
|
}
|
|
},
|
|
|
|
async mounted() {
|
|
this.initCascaderData();
|
|
},
|
|
|
|
beforeDestroy() {
|
|
this.beforeClose.some(func => {
|
|
typeof func === "function" && func()
|
|
})
|
|
this.beforeClose = [];
|
|
},
|
|
|
|
computed: {
|
|
...mapState(['cacheProjects', 'cacheColumns']),
|
|
},
|
|
|
|
watch: {
|
|
task: {
|
|
handler: function (val) {
|
|
this.cascader = [val.project_id, val.column_id];
|
|
},
|
|
deep: true,
|
|
immediate: true
|
|
},
|
|
},
|
|
|
|
methods: {
|
|
/**
|
|
* 初始化级联数据
|
|
*/
|
|
initCascaderData() {
|
|
const data = $A.cloneJSON(this.cacheProjects).sort((a, b) => {
|
|
if (a.top_at || b.top_at) {
|
|
return $A.Date(b.top_at) - $A.Date(a.top_at);
|
|
}
|
|
return b.id - a.id;
|
|
});
|
|
this.cascaderData = data.map(project => {
|
|
const children = this.cacheColumns.filter(({project_id}) => project_id == project.id).map(column => {
|
|
return {
|
|
value: column.id,
|
|
label: column.name
|
|
}
|
|
});
|
|
const data = {
|
|
value: project.id,
|
|
label: project.name,
|
|
children,
|
|
};
|
|
if (children.length == 0) {
|
|
data.loading = false;
|
|
}
|
|
return data
|
|
});
|
|
},
|
|
|
|
cascaderLoadData(item, callback) {
|
|
item.loading = true;
|
|
this.$store.dispatch("getColumns", item.value).then((data) => {
|
|
item.children = data.map(column => {
|
|
return {
|
|
value: column.id,
|
|
label: column.name
|
|
}
|
|
});
|
|
item.loading = false;
|
|
callback();
|
|
}).catch(() => {
|
|
item.loading = false;
|
|
callback();
|
|
});
|
|
},
|
|
|
|
cascaderInputChange(key) {
|
|
this.cascaderValue = key || "";
|
|
//
|
|
if (this.cascaderAlready[this.cascaderValue] === true) {
|
|
return;
|
|
}
|
|
this.cascaderAlready[this.cascaderValue] = true;
|
|
//
|
|
setTimeout(() => {
|
|
this.cascaderLoading++;
|
|
}, 1000)
|
|
this.$store.dispatch("getProjects", {
|
|
keys: {
|
|
name: this.cascaderValue,
|
|
},
|
|
getcolumn: 'yes'
|
|
}).then(() => {
|
|
this.cascaderLoading--;
|
|
this.initCascaderData();
|
|
}).catch(() => {
|
|
this.cascaderLoading--;
|
|
});
|
|
},
|
|
|
|
|
|
async onConfirm() {
|
|
this.loadIng++;
|
|
this.$store.dispatch("call", {
|
|
url: "project/task/move",
|
|
data: {
|
|
task_id: this.task.id,
|
|
project_id: this.cascader[0],
|
|
column_id: this.cascader[1],
|
|
}
|
|
}).then(({msg}) => {
|
|
this.loadIng--;
|
|
this.$store.dispatch("saveTask", {
|
|
id: this.task.id,
|
|
project_id: this.cascader[0],
|
|
column_id: this.cascader[1],
|
|
});
|
|
$A.messageSuccess(msg);
|
|
this.close()
|
|
}).catch(({msg}) => {
|
|
this.loadIng--;
|
|
$A.modalError(msg);
|
|
})
|
|
},
|
|
|
|
close() {
|
|
this.$emit("input", !this.value)
|
|
},
|
|
}
|
|
}
|
|
</script>
|