mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-17 23:02:49 +00:00
Merge branch 'pro' of github.com:hitosea/dootask into pro
This commit is contained in:
commit
aebcca76e4
@ -1051,6 +1051,7 @@ class ProjectController extends AbstractController
|
|||||||
* @apiGroup project
|
* @apiGroup project
|
||||||
* @apiName task__easylists
|
* @apiName task__easylists
|
||||||
|
|
||||||
|
* @apiParam {String} [taskid] 排除的任务ID
|
||||||
* @apiParam {String} [userid] 用户ID(如:1,2)
|
* @apiParam {String} [userid] 用户ID(如:1,2)
|
||||||
* @apiParam {String} [timerange] 时间范围(如:2022-03-01 12:12:12,2022-05-01 12:12:12)
|
* @apiParam {String} [timerange] 时间范围(如:2022-03-01 12:12:12,2022-05-01 12:12:12)
|
||||||
*
|
*
|
||||||
@ -1062,24 +1063,31 @@ class ProjectController extends AbstractController
|
|||||||
{
|
{
|
||||||
User::auth();
|
User::auth();
|
||||||
//
|
//
|
||||||
$userid = trim(Request::input('userid'));
|
$taskid = trim(Request::input('taskid'));
|
||||||
|
$userid = Request::input('userid');
|
||||||
$timerange = Request::input('timerange');
|
$timerange = Request::input('timerange');
|
||||||
//
|
//
|
||||||
$list = ProjectTask::query()
|
$list = ProjectTask::with(['taskUser'])
|
||||||
->select('project_tasks.id', 'project_tasks.name', 'project_tasks.created_at', 'project_tasks.updated_at')
|
->select('projects.name as project_name', 'project_tasks.id', 'project_tasks.name', 'project_tasks.start_at', 'project_tasks.end_at')
|
||||||
|
->join('projects','project_tasks.project_id','=','projects.id')
|
||||||
->leftJoin('project_task_users', function ($query) {
|
->leftJoin('project_task_users', function ($query) {
|
||||||
$query->on('project_tasks.id', '=', 'project_task_users.task_id');
|
$query->on('project_tasks.id', '=', 'project_task_users.task_id')->where('project_task_users.owner', '=', 1);
|
||||||
})
|
})
|
||||||
->whereIn('project_task_users.userid', explode(',', $userid))
|
->whereIn('project_task_users.userid', is_array($userid) ? $userid : explode(',', $userid) )
|
||||||
->when(!empty($timerange), function ($query) use ($timerange) {
|
->when(!empty($timerange), function ($query) use ($timerange) {
|
||||||
if (!is_array($timerange)) {
|
if (!is_array($timerange)) {
|
||||||
$timerange = explode(',', $timerange);
|
$timerange = explode(',', $timerange);
|
||||||
}
|
}
|
||||||
if (Base::isDateOrTime($timerange[0]) && Base::isDateOrTime($timerange[1])) {
|
if (Base::isDateOrTime($timerange[0]) && Base::isDateOrTime($timerange[1])) {
|
||||||
$query->whereBetween('project_tasks.created_at', [Carbon::parse($timerange[0])->startOfDay(), Carbon::parse($timerange[1])->endOfDay()]);
|
$query->where('project_tasks.start_at', '>=', Carbon::parse($timerange[0])->startOfDay());
|
||||||
|
$query->where('project_tasks.end_at', '<=', Carbon::parse($timerange[1])->endOfDay());
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
->when(!empty($taskid), function ($query) use ($taskid) {
|
||||||
|
$query->where('project_tasks.id', "!=", $taskid);
|
||||||
|
})
|
||||||
->whereNull('complete_at')
|
->whereNull('complete_at')
|
||||||
|
->distinct()
|
||||||
->orderByDesc('project_tasks.id')
|
->orderByDesc('project_tasks.id')
|
||||||
->paginate(Base::getPaginate(200, 100));
|
->paginate(Base::getPaginate(200, 100));
|
||||||
//
|
//
|
||||||
|
|||||||
@ -1248,4 +1248,7 @@ Markdown 格式发送
|
|||||||
确定要离开会议吗?
|
确定要离开会议吗?
|
||||||
继续
|
继续
|
||||||
退出
|
退出
|
||||||
会议组件加载失败!
|
会议组件加载失败!
|
||||||
|
|
||||||
|
以下人员已存在任务
|
||||||
|
确定
|
||||||
@ -16883,5 +16883,16 @@
|
|||||||
"de": "Geladen mit fallender fracht des meetings!",
|
"de": "Geladen mit fallender fracht des meetings!",
|
||||||
"fr": "Échec du chargement du composant conférence!",
|
"fr": "Échec du chargement du composant conférence!",
|
||||||
"id": "Perakitan perakitan gagal!"
|
"id": "Perakitan perakitan gagal!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "以下人员已存在任务",
|
||||||
|
"zh": "",
|
||||||
|
"zh-CHT": "以下人員已存在任務",
|
||||||
|
"en": "The following personnel already have tasks",
|
||||||
|
"ko": "다음 구성원에 대한 작업이 이미 있습니다",
|
||||||
|
"ja": "次の者には任務があります",
|
||||||
|
"de": "Die folgenden personen haben den auftrag erledigt",
|
||||||
|
"fr": "Les personnes suivantes ont déjà une mission",
|
||||||
|
"id": "Yang berikut ini ada tugas"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
2
public/language/web/de.js
vendored
2
public/language/web/de.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/en.js
vendored
2
public/language/web/en.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/fr.js
vendored
2
public/language/web/fr.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/id.js
vendored
2
public/language/web/id.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ja.js
vendored
2
public/language/web/ja.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/key.js
vendored
2
public/language/web/key.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ko.js
vendored
2
public/language/web/ko.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/zh-CHT.js
vendored
2
public/language/web/zh-CHT.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/zh.js
vendored
2
public/language/web/zh.js
vendored
@ -1 +1 @@
|
|||||||
if(typeof window.LANGUAGE_DATA==="undefined")window.LANGUAGE_DATA={};window.LANGUAGE_DATA["zh"]=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]
|
if(typeof window.LANGUAGE_DATA==="undefined")window.LANGUAGE_DATA={};window.LANGUAGE_DATA["zh"]=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]
|
||||||
@ -1,8 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="common-tag-input" :class="{focus:isFocus}" @paste="pasteText($event)" @click="focus">
|
<div class="common-tag-input" :class="{focus:isFocus}" @paste="pasteText($event)" @click="focus">
|
||||||
<div class="tags-item" v-for="(text, index) in disSource">
|
<Draggable
|
||||||
<span class="tags-content" @click.stop="">{{text}}</span><span class="tags-del" @click.stop="delTag(index)">×</span>
|
:list="disSource"
|
||||||
</div>
|
:animation="150"
|
||||||
|
tag="ul"
|
||||||
|
draggable=".column-item"
|
||||||
|
>
|
||||||
|
<div class="tags-item column-item" v-for="(text, index) in disSource">
|
||||||
|
<span class="tags-content" @click.stop="edit(disSource,index)">{{text}}</span><span class="tags-del" @click.stop="delTag(index)">×</span>
|
||||||
|
</div>
|
||||||
|
</Draggable>
|
||||||
<textarea
|
<textarea
|
||||||
ref="myTextarea"
|
ref="myTextarea"
|
||||||
class="tags-input"
|
class="tags-input"
|
||||||
@ -22,8 +29,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import Draggable from 'vuedraggable'
|
||||||
export default {
|
export default {
|
||||||
name: 'TagInput',
|
name: 'TagInput',
|
||||||
|
components: {Draggable},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
default: ''
|
default: ''
|
||||||
@ -52,11 +61,13 @@
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const disSource = [];
|
const disSource = [];
|
||||||
this.value?.split(",").forEach(item => {
|
if( this.value ){
|
||||||
if (item) {
|
this.value?.split(",").forEach(item => {
|
||||||
disSource.push(item)
|
if (item) {
|
||||||
}
|
disSource.push(item)
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
minWidth: 80,
|
minWidth: 80,
|
||||||
|
|
||||||
@ -69,7 +80,19 @@
|
|||||||
|
|
||||||
disSource,
|
disSource,
|
||||||
|
|
||||||
isFocus: false
|
isFocus: false,
|
||||||
|
|
||||||
|
editShow: false,
|
||||||
|
editData:{
|
||||||
|
index:0,
|
||||||
|
disSource:[],
|
||||||
|
name:""
|
||||||
|
},
|
||||||
|
addRule: {
|
||||||
|
name: [
|
||||||
|
{ required: true, message: this.$L('请填写名称!'), trigger: 'change' },
|
||||||
|
]
|
||||||
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -80,13 +103,15 @@
|
|||||||
this.wayMinWidth();
|
this.wayMinWidth();
|
||||||
},
|
},
|
||||||
value(val) {
|
value(val) {
|
||||||
let disSource = [];
|
if( val && typeof val == 'string' ){
|
||||||
val?.split(",").forEach(item => {
|
let disSource = [];
|
||||||
if (item) {
|
val?.split(",").forEach(item => {
|
||||||
disSource.push(item)
|
if (item) {
|
||||||
}
|
disSource.push(item)
|
||||||
});
|
}
|
||||||
this.disSource = disSource;
|
});
|
||||||
|
this.disSource = disSource;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
disSource(val) {
|
disSource(val) {
|
||||||
let temp = '';
|
let temp = '';
|
||||||
@ -109,6 +134,26 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
edit(disSource,index){
|
||||||
|
this.editData.disSource = disSource
|
||||||
|
this.editData.index = index
|
||||||
|
this.editData.name = disSource[index] + ''
|
||||||
|
$A.modalInput({
|
||||||
|
title: `编辑`,
|
||||||
|
placeholder: `请输入名称`,
|
||||||
|
okText: "确定",
|
||||||
|
value: disSource[index] + '',
|
||||||
|
onOk: (desc) => {
|
||||||
|
if (!desc) {
|
||||||
|
return `请输入名称`
|
||||||
|
}
|
||||||
|
this.editData.name = desc
|
||||||
|
this.editData.disSource[this.editData.index] = desc
|
||||||
|
this.$set(this.disSource,this.editData.index,desc)
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
focus(option) {
|
focus(option) {
|
||||||
const $el = this.$refs.myTextarea;
|
const $el = this.$refs.myTextarea;
|
||||||
$el.focus(option);
|
$el.focus(option);
|
||||||
|
|||||||
@ -199,6 +199,8 @@
|
|||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<TaskExistTips ref="taskExistTipsRef" @onAdd="onAdd(again,true)"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -206,10 +208,11 @@
|
|||||||
import TEditor from "../../../components/TEditor";
|
import TEditor from "../../../components/TEditor";
|
||||||
import {mapState} from "vuex";
|
import {mapState} from "vuex";
|
||||||
import UserSelect from "../../../components/UserSelect.vue";
|
import UserSelect from "../../../components/UserSelect.vue";
|
||||||
|
import TaskExistTips from "./TaskExistTips.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "TaskAdd",
|
name: "TaskAdd",
|
||||||
components: {UserSelect, TEditor},
|
components: {UserSelect, TEditor, TaskExistTips},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@ -276,6 +279,8 @@ export default {
|
|||||||
isMounted: false,
|
isMounted: false,
|
||||||
|
|
||||||
beforeClose: [],
|
beforeClose: [],
|
||||||
|
|
||||||
|
again: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -515,12 +520,30 @@ export default {
|
|||||||
this.addData = Object.assign({}, this.addData, data);
|
this.addData = Object.assign({}, this.addData, data);
|
||||||
},
|
},
|
||||||
|
|
||||||
onAdd(again) {
|
async onAdd(again,affirm=false) {
|
||||||
if (!this.addData.name) {
|
if (!this.addData.name) {
|
||||||
$A.messageError("任务描述不能为空");
|
$A.messageError("任务描述不能为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.loadIng++;
|
this.loadIng++;
|
||||||
|
|
||||||
|
// 存在任务提示
|
||||||
|
if(!affirm && this.addData.owner.length>0){
|
||||||
|
this.$refs['taskExistTipsRef'].isExistTask({
|
||||||
|
userids: this.addData.owner,
|
||||||
|
timerange: this.addData.times
|
||||||
|
}).then(res=>{
|
||||||
|
if(!res){
|
||||||
|
this.onAdd(again,true)
|
||||||
|
}else{
|
||||||
|
this.loadIng--;
|
||||||
|
this.again = again
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.$store.dispatch("taskAdd", this.addData).then(({msg}) => {
|
this.$store.dispatch("taskAdd", this.addData).then(({msg}) => {
|
||||||
this.loadIng--;
|
this.loadIng--;
|
||||||
$A.messageSuccess(msg);
|
$A.messageSuccess(msg);
|
||||||
|
|||||||
@ -1,397 +1,413 @@
|
|||||||
<template>
|
<template>
|
||||||
<!--子任务-->
|
<div>
|
||||||
<li v-if="ready && taskDetail.parent_id > 0">
|
<!--子任务-->
|
||||||
<div class="subtask-icon">
|
<li v-if="ready && taskDetail.parent_id > 0">
|
||||||
<TaskMenu
|
<div class="subtask-icon">
|
||||||
:ref="`taskMenu_${taskDetail.id}`"
|
|
||||||
:disabled="taskId === 0"
|
|
||||||
:task="taskDetail"
|
|
||||||
:load-status="taskDetail.loading === true"
|
|
||||||
@on-update="getLogLists"/>
|
|
||||||
</div>
|
|
||||||
<div v-if="taskDetail.flow_item_name" class="subtask-flow">
|
|
||||||
<span :class="taskDetail.flow_item_status" @click.stop="openMenu($event, taskDetail)">{{taskDetail.flow_item_name}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="subtask-name">
|
|
||||||
<Input
|
|
||||||
v-model="taskDetail.name"
|
|
||||||
ref="name"
|
|
||||||
type="textarea"
|
|
||||||
:rows="1"
|
|
||||||
:autosize="{ minRows: 1, maxRows: 8 }"
|
|
||||||
:maxlength="255"
|
|
||||||
enterkeyhint="done"
|
|
||||||
@on-blur="updateBlur('name')"
|
|
||||||
@on-keydown="onNameKeydown"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<DatePicker
|
|
||||||
v-model="timeValue"
|
|
||||||
:open="timeOpen"
|
|
||||||
:options="timeOptions"
|
|
||||||
format="yyyy/MM/dd HH:mm"
|
|
||||||
type="datetimerange"
|
|
||||||
class="subtask-time"
|
|
||||||
placement="bottom-end"
|
|
||||||
@on-open-change="timeChange"
|
|
||||||
@on-clear="timeClear"
|
|
||||||
@on-ok="timeOk"
|
|
||||||
transfer>
|
|
||||||
<div v-if="!taskDetail.complete_at && taskDetail.end_at && taskDetail.end_at != mainEndAt" @click="openTime" :class="['time', taskDetail.today ? 'today' : '', taskDetail.overdue ? 'overdue' : '']">
|
|
||||||
{{expiresFormat(taskDetail.end_at)}}
|
|
||||||
</div>
|
|
||||||
<Icon v-else class="clock" type="ios-clock-outline" @click="openTime" />
|
|
||||||
</DatePicker>
|
|
||||||
<UserSelect
|
|
||||||
class="subtask-avatar"
|
|
||||||
v-model="ownerData.owner_userid"
|
|
||||||
:multiple-max="10"
|
|
||||||
:avatar-size="20"
|
|
||||||
:title="$L('修改负责人')"
|
|
||||||
:add-icon="false"
|
|
||||||
:project-id="taskDetail.project_id"
|
|
||||||
:before-submit="onOwner"/>
|
|
||||||
</li>
|
|
||||||
<!--主任务-->
|
|
||||||
<div
|
|
||||||
v-else-if="ready"
|
|
||||||
:class="{'task-detail':true, 'open-dialog': hasOpenDialog, 'completed': taskDetail.complete_at}"
|
|
||||||
:style="taskDetailStyle">
|
|
||||||
<div v-show="taskDetail.id > 0" class="task-info">
|
|
||||||
<div class="head">
|
|
||||||
<TaskMenu
|
<TaskMenu
|
||||||
:ref="`taskMenu_${taskDetail.id}`"
|
:ref="`taskMenu_${taskDetail.id}`"
|
||||||
:disabled="taskId === 0"
|
:disabled="taskId === 0"
|
||||||
:task="taskDetail"
|
:task="taskDetail"
|
||||||
class="icon"
|
:load-status="taskDetail.loading === true"
|
||||||
size="medium"
|
|
||||||
:color-show="false"
|
|
||||||
@on-update="getLogLists"/>
|
@on-update="getLogLists"/>
|
||||||
<div v-if="taskDetail.flow_item_name" class="flow">
|
</div>
|
||||||
<span :class="taskDetail.flow_item_status" @click.stop="openMenu($event, taskDetail)">{{taskDetail.flow_item_name}}</span>
|
<div v-if="taskDetail.flow_item_name" class="subtask-flow">
|
||||||
|
<span :class="taskDetail.flow_item_status" @click.stop="openMenu($event, taskDetail)">{{taskDetail.flow_item_name}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="subtask-name">
|
||||||
|
<Input
|
||||||
|
v-model="taskDetail.name"
|
||||||
|
ref="name"
|
||||||
|
type="textarea"
|
||||||
|
:rows="1"
|
||||||
|
:autosize="{ minRows: 1, maxRows: 8 }"
|
||||||
|
:maxlength="255"
|
||||||
|
enterkeyhint="done"
|
||||||
|
@on-blur="updateBlur('name')"
|
||||||
|
@on-keydown="onNameKeydown"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<DatePicker
|
||||||
|
v-model="timeValue"
|
||||||
|
:open="timeOpen"
|
||||||
|
:options="timeOptions"
|
||||||
|
format="yyyy/MM/dd HH:mm"
|
||||||
|
type="datetimerange"
|
||||||
|
class="subtask-time"
|
||||||
|
placement="bottom-end"
|
||||||
|
@on-open-change="timeChange"
|
||||||
|
@on-clear="timeClear"
|
||||||
|
@on-ok="timeOk"
|
||||||
|
transfer>
|
||||||
|
<div v-if="!taskDetail.complete_at && taskDetail.end_at && taskDetail.end_at != mainEndAt" @click="openTime" :class="['time', taskDetail.today ? 'today' : '', taskDetail.overdue ? 'overdue' : '']">
|
||||||
|
{{expiresFormat(taskDetail.end_at)}}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="taskDetail.archived_at" class="flow">
|
<Icon v-else class="clock" type="ios-clock-outline" @click="openTime" />
|
||||||
<span class="archived" @click.stop="openMenu($event, taskDetail)">{{$L('已归档')}}</span>
|
</DatePicker>
|
||||||
</div>
|
<UserSelect
|
||||||
<div class="nav">
|
class="subtask-avatar"
|
||||||
<p v-if="projectName"><span>{{projectName}}</span></p>
|
v-model="ownerData.owner_userid"
|
||||||
<p v-if="columnName"><span>{{columnName}}</span></p>
|
:multiple-max="10"
|
||||||
<p v-if="taskDetail.id"><span>{{taskDetail.id}}</span></p>
|
:avatar-size="20"
|
||||||
</div>
|
:title="$L('修改负责人')"
|
||||||
<div class="function">
|
:add-icon="false"
|
||||||
<EPopover
|
:project-id="taskDetail.project_id"
|
||||||
v-if="getOwner.length === 0"
|
:before-submit="onOwner"/>
|
||||||
v-model="receiveShow"
|
</li>
|
||||||
placement="bottom">
|
<!--主任务-->
|
||||||
<div class="task-detail-receive">
|
<div
|
||||||
<div class="receive-title">
|
v-else-if="ready"
|
||||||
<Icon type="ios-help-circle"/>
|
:class="{'task-detail':true, 'open-dialog': hasOpenDialog, 'completed': taskDetail.complete_at}"
|
||||||
{{$L('确认计划时间领取任务')}}
|
:style="taskDetailStyle">
|
||||||
</div>
|
<div v-show="taskDetail.id > 0" class="task-info">
|
||||||
<div class="receive-time">
|
<div class="head">
|
||||||
<DatePicker
|
<TaskMenu
|
||||||
v-model="timeValue"
|
:ref="`taskMenu_${taskDetail.id}`"
|
||||||
:options="timeOptions"
|
:disabled="taskId === 0"
|
||||||
format="yyyy/MM/dd HH:mm"
|
:task="taskDetail"
|
||||||
type="datetimerange"
|
class="icon"
|
||||||
:placeholder="$L('请设置计划时间')"
|
size="medium"
|
||||||
:clearable="false"
|
:color-show="false"
|
||||||
:editable="false"/>
|
@on-update="getLogLists"/>
|
||||||
</div>
|
<div v-if="taskDetail.flow_item_name" class="flow">
|
||||||
<div class="receive-bottom">
|
<span :class="taskDetail.flow_item_status" @click.stop="openMenu($event, taskDetail)">{{taskDetail.flow_item_name}}</span>
|
||||||
<Button size="small" type="text" @click="receiveShow=false">取消</Button>
|
</div>
|
||||||
<Button :loading="ownerLoad > 0" size="small" type="primary" @click="onOwner(true)">确定</Button>
|
<div v-if="taskDetail.archived_at" class="flow">
|
||||||
|
<span class="archived" @click.stop="openMenu($event, taskDetail)">{{$L('已归档')}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="nav">
|
||||||
|
<p v-if="projectName"><span>{{projectName}}</span></p>
|
||||||
|
<p v-if="columnName"><span>{{columnName}}</span></p>
|
||||||
|
<p v-if="taskDetail.id"><span>{{taskDetail.id}}</span></p>
|
||||||
|
</div>
|
||||||
|
<div class="function">
|
||||||
|
<EPopover
|
||||||
|
v-if="getOwner.length === 0"
|
||||||
|
v-model="receiveShow"
|
||||||
|
placement="bottom">
|
||||||
|
<div class="task-detail-receive">
|
||||||
|
<div class="receive-title">
|
||||||
|
<Icon type="ios-help-circle"/>
|
||||||
|
{{$L('确认计划时间领取任务')}}
|
||||||
|
</div>
|
||||||
|
<div class="receive-time">
|
||||||
|
<DatePicker
|
||||||
|
v-model="timeValue"
|
||||||
|
:options="timeOptions"
|
||||||
|
format="yyyy/MM/dd HH:mm"
|
||||||
|
type="datetimerange"
|
||||||
|
:placeholder="$L('请设置计划时间')"
|
||||||
|
:clearable="false"
|
||||||
|
:editable="false"/>
|
||||||
|
</div>
|
||||||
|
<div class="receive-bottom">
|
||||||
|
<Button size="small" type="text" @click="receiveShow=false">取消</Button>
|
||||||
|
<Button :loading="ownerLoad > 0" size="small" type="primary" @click="onOwner(true)">确定</Button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<Button slot="reference" :loading="ownerLoad > 0" class="pick" type="primary">{{$L('我要领取任务')}}</Button>
|
||||||
|
</EPopover>
|
||||||
|
<ETooltip v-if="$Electron" :disabled="$isEEUiApp || windowTouch" :content="$L('新窗口打开')">
|
||||||
|
<i class="taskfont open" @click="openNewWin"></i>
|
||||||
|
</ETooltip>
|
||||||
|
<div class="menu">
|
||||||
|
<TaskMenu
|
||||||
|
:disabled="taskId === 0"
|
||||||
|
:task="taskDetail"
|
||||||
|
icon="ios-more"
|
||||||
|
completed-icon="ios-more"
|
||||||
|
size="medium"
|
||||||
|
:color-show="false"
|
||||||
|
@on-update="getLogLists"/>
|
||||||
</div>
|
</div>
|
||||||
<Button slot="reference" :loading="ownerLoad > 0" class="pick" type="primary">{{$L('我要领取任务')}}</Button>
|
|
||||||
</EPopover>
|
|
||||||
<ETooltip v-if="$Electron" :disabled="$isEEUiApp || windowTouch" :content="$L('新窗口打开')">
|
|
||||||
<i class="taskfont open" @click="openNewWin"></i>
|
|
||||||
</ETooltip>
|
|
||||||
<div class="menu">
|
|
||||||
<TaskMenu
|
|
||||||
:disabled="taskId === 0"
|
|
||||||
:task="taskDetail"
|
|
||||||
icon="ios-more"
|
|
||||||
completed-icon="ios-more"
|
|
||||||
size="medium"
|
|
||||||
:color-show="false"
|
|
||||||
@on-update="getLogLists"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<Scrollbar class-name="scroller">
|
||||||
<Scrollbar class-name="scroller">
|
<div class="title">
|
||||||
<div class="title">
|
<Input
|
||||||
<Input
|
v-model="taskDetail.name"
|
||||||
v-model="taskDetail.name"
|
ref="name"
|
||||||
ref="name"
|
type="textarea"
|
||||||
type="textarea"
|
:rows="1"
|
||||||
:rows="1"
|
:autosize="{ minRows: 1, maxRows: 8 }"
|
||||||
:autosize="{ minRows: 1, maxRows: 8 }"
|
:maxlength="255"
|
||||||
:maxlength="255"
|
enterkeyhint="done"
|
||||||
enterkeyhint="done"
|
@on-blur="updateBlur('name')"
|
||||||
@on-blur="updateBlur('name')"
|
@on-keydown="onNameKeydown"/>
|
||||||
@on-keydown="onNameKeydown"/>
|
</div>
|
||||||
</div>
|
<div class="desc">
|
||||||
<div class="desc">
|
<TEditor
|
||||||
<TEditor
|
ref="desc"
|
||||||
ref="desc"
|
:value="taskContent"
|
||||||
:value="taskContent"
|
:plugins="taskPlugins"
|
||||||
:plugins="taskPlugins"
|
:options="taskOptions"
|
||||||
:options="taskOptions"
|
:option-full="taskOptionFull"
|
||||||
:option-full="taskOptionFull"
|
:placeholder="$L('详细描述...')"
|
||||||
:placeholder="$L('详细描述...')"
|
scroll-hide-operate-class-name="task-modal"
|
||||||
scroll-hide-operate-class-name="task-modal"
|
@on-blur="updateBlur('content')"
|
||||||
@on-blur="updateBlur('content')"
|
inline/>
|
||||||
inline/>
|
</div>
|
||||||
</div>
|
<Form class="items" label-position="left" label-width="auto" @submit.native.prevent>
|
||||||
<Form class="items" label-position="left" label-width="auto" @submit.native.prevent>
|
<FormItem v-if="taskDetail.p_name">
|
||||||
<FormItem v-if="taskDetail.p_name">
|
<div class="item-label" slot="label">
|
||||||
<div class="item-label" slot="label">
|
<i class="taskfont"></i>{{$L('优先级')}}
|
||||||
<i class="taskfont"></i>{{$L('优先级')}}
|
</div>
|
||||||
</div>
|
<ul class="item-content">
|
||||||
<ul class="item-content">
|
<li>
|
||||||
<li>
|
<EDropdown
|
||||||
<EDropdown
|
ref="priority"
|
||||||
ref="priority"
|
trigger="click"
|
||||||
trigger="click"
|
placement="bottom"
|
||||||
placement="bottom"
|
@command="updateData('priority', $event)">
|
||||||
@command="updateData('priority', $event)">
|
<TaskPriority :backgroundColor="taskDetail.p_color">{{taskDetail.p_name}}</TaskPriority>
|
||||||
<TaskPriority :backgroundColor="taskDetail.p_color">{{taskDetail.p_name}}</TaskPriority>
|
<EDropdownMenu slot="dropdown">
|
||||||
<EDropdownMenu slot="dropdown">
|
<EDropdownItem v-for="(item, key) in taskPriority" :key="key" :command="item">
|
||||||
<EDropdownItem v-for="(item, key) in taskPriority" :key="key" :command="item">
|
<i
|
||||||
<i
|
class="taskfont"
|
||||||
class="taskfont"
|
:style="{color:item.color}"
|
||||||
:style="{color:item.color}"
|
v-html="taskDetail.p_name == item.name ? '' : ''"></i>
|
||||||
v-html="taskDetail.p_name == item.name ? '' : ''"></i>
|
{{item.name}}
|
||||||
{{item.name}}
|
</EDropdownItem>
|
||||||
</EDropdownItem>
|
</EDropdownMenu>
|
||||||
</EDropdownMenu>
|
</EDropdown>
|
||||||
</EDropdown>
|
</li>
|
||||||
</li>
|
</ul>
|
||||||
</ul>
|
</FormItem>
|
||||||
</FormItem>
|
<FormItem v-if="getOwner.length > 0">
|
||||||
<FormItem v-if="getOwner.length > 0">
|
<div class="item-label" slot="label">
|
||||||
<div class="item-label" slot="label">
|
<i class="taskfont"></i>{{$L('负责人')}}
|
||||||
<i class="taskfont"></i>{{$L('负责人')}}
|
</div>
|
||||||
</div>
|
|
||||||
<UserSelect
|
|
||||||
class="item-content user"
|
|
||||||
v-model="ownerData.owner_userid"
|
|
||||||
:multiple-max="10"
|
|
||||||
:avatar-size="28"
|
|
||||||
:title="$L('修改负责人')"
|
|
||||||
:project-id="taskDetail.project_id"
|
|
||||||
:add-icon="false"
|
|
||||||
:before-submit="onOwner"/>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem v-if="getAssist.length > 0 || assistForce">
|
|
||||||
<div class="item-label" slot="label">
|
|
||||||
<i class="taskfont"></i>{{$L('协助人员')}}
|
|
||||||
</div>
|
|
||||||
<UserSelect
|
|
||||||
ref="assist"
|
|
||||||
class="item-content user"
|
|
||||||
v-model="assistData.assist_userid"
|
|
||||||
:multiple-max="10"
|
|
||||||
:avatar-size="28"
|
|
||||||
:title="$L(getAssist.length > 0 ? '修改协助人员' : '添加协助人员')"
|
|
||||||
:project-id="taskDetail.project_id"
|
|
||||||
:disabled-choice="assistData.disabled"
|
|
||||||
:add-icon="false"
|
|
||||||
:before-submit="onAssist"/>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem>
|
|
||||||
<div class="item-label" slot="label">
|
|
||||||
<i class="taskfont"></i>
|
|
||||||
<EDropdown ref="eDropdownRef" trigger="click" placement="bottom" @command="dropVisible">
|
|
||||||
<span class="visibility-text color">{{$L('可见性')}}
|
|
||||||
<i class="taskfont"></i>
|
|
||||||
</span>
|
|
||||||
<EDropdownMenu slot="dropdown">
|
|
||||||
<EDropdownItem :command="1">
|
|
||||||
<div class="task-menu-icon" >
|
|
||||||
<Icon v-if="taskDetail.is_all_visible == 1" class="completed" :type="'md-checkmark-circle'"/>
|
|
||||||
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
|
|
||||||
{{$L('项目人员')}}
|
|
||||||
</div>
|
|
||||||
</EDropdownItem>
|
|
||||||
<EDropdownItem :command="2">
|
|
||||||
<div class="task-menu-icon" >
|
|
||||||
<Icon v-if="taskDetail.is_all_visible == 2" class="completed" :type="'md-checkmark-circle'"/>
|
|
||||||
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
|
|
||||||
{{$L('任务人员')}}
|
|
||||||
</div>
|
|
||||||
</EDropdownItem>
|
|
||||||
<EDropdownItem :command="3">
|
|
||||||
<div class="task-menu-icon" >
|
|
||||||
<Icon v-if="taskDetail.is_all_visible == 3" class="completed" :type="'md-checkmark-circle'"/>
|
|
||||||
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
|
|
||||||
{{$L('指定成员')}}
|
|
||||||
</div>
|
|
||||||
</EDropdownItem>
|
|
||||||
</EDropdownMenu>
|
|
||||||
</EDropdown>
|
|
||||||
</div>
|
|
||||||
<div class="item-content user">
|
|
||||||
<span @click="showCisibleDropdown" v-if="taskDetail.is_all_visible == 1" class="visibility-text">{{$L('项目人员可见')}}</span>
|
|
||||||
<span @click="showCisibleDropdown" v-else-if="taskDetail.is_all_visible == 2" class="visibility-text">{{$L('任务人员可见')}}</span>
|
|
||||||
<UserSelect
|
<UserSelect
|
||||||
v-else
|
class="item-content user"
|
||||||
ref="visibleUserSelectRef"
|
v-model="ownerData.owner_userid"
|
||||||
v-model="taskDetail.visibility_appointor"
|
:multiple-max="10"
|
||||||
:avatar-size="28"
|
:avatar-size="28"
|
||||||
:title="$L('选择指定人员')"
|
:title="$L('修改负责人')"
|
||||||
:project-id="taskDetail.project_id"
|
:project-id="taskDetail.project_id"
|
||||||
:add-icon="false"
|
:add-icon="false"
|
||||||
@on-show-change="visibleUserSelectShowChange"/>
|
:before-submit="onOwner"/>
|
||||||
</div>
|
</FormItem>
|
||||||
</FormItem>
|
<FormItem v-if="getAssist.length > 0 || assistForce">
|
||||||
<FormItem v-if="taskDetail.end_at || timeForce">
|
<div class="item-label" slot="label">
|
||||||
<div class="item-label" slot="label">
|
<i class="taskfont"></i>{{$L('协助人员')}}
|
||||||
<i class="taskfont"></i>{{$L('截止时间')}}
|
</div>
|
||||||
</div>
|
<UserSelect
|
||||||
<ul class="item-content">
|
ref="assist"
|
||||||
<li>
|
class="item-content user"
|
||||||
<DatePicker
|
v-model="assistData.assist_userid"
|
||||||
v-model="timeValue"
|
:multiple-max="10"
|
||||||
:open="timeOpen"
|
:avatar-size="28"
|
||||||
:options="timeOptions"
|
:title="$L(getAssist.length > 0 ? '修改协助人员' : '添加协助人员')"
|
||||||
format="yyyy/MM/dd HH:mm"
|
:project-id="taskDetail.project_id"
|
||||||
type="datetimerange"
|
:disabled-choice="assistData.disabled"
|
||||||
@on-open-change="timeChange"
|
:add-icon="false"
|
||||||
@on-clear="timeClear"
|
:before-submit="onAssist"/>
|
||||||
@on-ok="timeOk"
|
</FormItem>
|
||||||
transfer>
|
<FormItem>
|
||||||
<div class="picker-time">
|
<div class="item-label" slot="label">
|
||||||
<div @click="openTime" class="time">{{taskDetail.end_at ? cutTime : '--'}}</div>
|
<i class="taskfont"></i>
|
||||||
<template v-if="!taskDetail.complete_at && taskDetail.end_at">
|
<EDropdown ref="eDropdownRef" trigger="click" placement="bottom" @command="dropVisible">
|
||||||
<Tag v-if="within24Hours(taskDetail.end_at)" color="blue"><i class="taskfont"></i>{{expiresFormat(taskDetail.end_at)}}</Tag>
|
<span class="visibility-text color">{{$L('可见性')}}
|
||||||
<Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag>
|
<i class="taskfont"></i>
|
||||||
</template>
|
</span>
|
||||||
</div>
|
<EDropdownMenu slot="dropdown">
|
||||||
</DatePicker>
|
<EDropdownItem :command="1">
|
||||||
</li>
|
<div class="task-menu-icon" >
|
||||||
</ul>
|
<Icon v-if="taskDetail.is_all_visible == 1" class="completed" :type="'md-checkmark-circle'"/>
|
||||||
</FormItem>
|
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
|
||||||
<FormItem v-if="(taskDetail.loop && taskDetail.loop != 'never') || loopForce">
|
{{$L('项目人员')}}
|
||||||
<div class="item-label" slot="label">
|
</div>
|
||||||
<i class="taskfont"></i>{{$L('重复周期')}}
|
</EDropdownItem>
|
||||||
</div>
|
<EDropdownItem :command="2">
|
||||||
<ul class="item-content">
|
<div class="task-menu-icon" >
|
||||||
<li>
|
<Icon v-if="taskDetail.is_all_visible == 2" class="completed" :type="'md-checkmark-circle'"/>
|
||||||
<EDropdown
|
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
|
||||||
ref="loop"
|
{{$L('任务人员')}}
|
||||||
trigger="click"
|
</div>
|
||||||
placement="bottom"
|
</EDropdownItem>
|
||||||
@command="updateData('loop', $event)">
|
<EDropdownItem :command="3">
|
||||||
<ETooltip :disabled="$isEEUiApp || windowTouch || !taskDetail.loop_at" :content="`${$L('下个周期')}: ${taskDetail.loop_at}`" placement="right">
|
<div class="task-menu-icon" >
|
||||||
<span>{{$L(loopLabel(taskDetail.loop))}}</span>
|
<Icon v-if="taskDetail.is_all_visible == 3" class="completed" :type="'md-checkmark-circle'"/>
|
||||||
</ETooltip>
|
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
|
||||||
<EDropdownMenu slot="dropdown" class="task-detail-loop">
|
{{$L('指定成员')}}
|
||||||
<EDropdownItem v-for="item in loops" :key="item.key" :command="item.key">
|
</div>
|
||||||
{{$L(item.label)}}
|
|
||||||
</EDropdownItem>
|
</EDropdownItem>
|
||||||
</EDropdownMenu>
|
</EDropdownMenu>
|
||||||
</EDropdown>
|
</EDropdown>
|
||||||
</li>
|
</div>
|
||||||
</ul>
|
<div class="item-content user">
|
||||||
</FormItem>
|
<span @click="showCisibleDropdown" v-if="taskDetail.is_all_visible == 1" class="visibility-text">{{$L('项目人员可见')}}</span>
|
||||||
<FormItem v-if="fileList.length > 0">
|
<span @click="showCisibleDropdown" v-else-if="taskDetail.is_all_visible == 2" class="visibility-text">{{$L('任务人员可见')}}</span>
|
||||||
<div class="item-label" slot="label">
|
<UserSelect
|
||||||
<i class="taskfont"></i>{{$L('附件')}}
|
v-else
|
||||||
</div>
|
ref="visibleUserSelectRef"
|
||||||
<ul class="item-content file">
|
v-model="taskDetail.visibility_appointor"
|
||||||
<li v-if="taskDetail.file_num > 50" class="tip">{{$L(`共${taskDetail.file_num}个文件,仅显示最新50个`)}}</li>
|
:avatar-size="28"
|
||||||
<li v-for="file in fileList">
|
:title="$L('选择指定人员')"
|
||||||
<img v-if="file.id" class="file-ext" :src="file.thumb"/>
|
:project-id="taskDetail.project_id"
|
||||||
<Loading v-else class="file-load"/>
|
:add-icon="false"
|
||||||
<div class="file-name">{{file.name}}</div>
|
@on-show-change="visibleUserSelectShowChange"/>
|
||||||
<div class="file-size">{{$A.bytesToSize(file.size)}}</div>
|
</div>
|
||||||
<div class="file-menu" :class="{show:file._show_menu}">
|
</FormItem>
|
||||||
<Icon @click="viewFile(file)" type="md-eye" />
|
<FormItem v-if="taskDetail.end_at || timeForce">
|
||||||
<Icon @click="downFile(file)" type="md-arrow-round-down" />
|
<div class="item-label" slot="label">
|
||||||
<EPopover v-model="file._show_menu" class="file-delete">
|
<i class="taskfont"></i>{{$L('截止时间')}}
|
||||||
<div class="task-detail-delete-file-popover">
|
</div>
|
||||||
<p>{{$L('你确定要删除这个文件吗?')}}</p>
|
<ul class="item-content">
|
||||||
<div class="buttons">
|
<li>
|
||||||
<Button size="small" type="text" @click="file._show_menu=false">{{$L('取消')}}</Button>
|
<DatePicker
|
||||||
<Button size="small" type="primary" @click="deleteFile(file)">{{$L('确定')}}</Button>
|
v-model="timeValue"
|
||||||
</div>
|
:open="timeOpen"
|
||||||
|
:options="timeOptions"
|
||||||
|
format="yyyy/MM/dd HH:mm"
|
||||||
|
type="datetimerange"
|
||||||
|
@on-open-change="timeChange"
|
||||||
|
@on-clear="timeClear"
|
||||||
|
@on-ok="timeOk"
|
||||||
|
transfer>
|
||||||
|
<div class="picker-time">
|
||||||
|
<div @click="openTime" class="time">{{taskDetail.end_at ? cutTime : '--'}}</div>
|
||||||
|
<template v-if="!taskDetail.complete_at && taskDetail.end_at">
|
||||||
|
<Tag v-if="within24Hours(taskDetail.end_at)" color="blue"><i class="taskfont"></i>{{expiresFormat(taskDetail.end_at)}}</Tag>
|
||||||
|
<Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="taskfont del"></i>
|
</DatePicker>
|
||||||
</EPopover>
|
</li>
|
||||||
|
</ul>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem v-if="(taskDetail.loop && taskDetail.loop != 'never') || loopForce">
|
||||||
|
<div class="item-label" slot="label">
|
||||||
|
<i class="taskfont"></i>{{$L('重复周期')}}
|
||||||
|
</div>
|
||||||
|
<ul class="item-content">
|
||||||
|
<li>
|
||||||
|
<EDropdown
|
||||||
|
ref="loop"
|
||||||
|
trigger="click"
|
||||||
|
placement="bottom"
|
||||||
|
@command="updateData('loop', $event)">
|
||||||
|
<ETooltip :disabled="$isEEUiApp || windowTouch || !taskDetail.loop_at" :content="`${$L('下个周期')}: ${taskDetail.loop_at}`" placement="right">
|
||||||
|
<span>{{$L(loopLabel(taskDetail.loop))}}</span>
|
||||||
|
</ETooltip>
|
||||||
|
<EDropdownMenu slot="dropdown" class="task-detail-loop">
|
||||||
|
<EDropdownItem v-for="item in loops" :key="item.key" :command="item.key">
|
||||||
|
{{$L(item.label)}}
|
||||||
|
</EDropdownItem>
|
||||||
|
</EDropdownMenu>
|
||||||
|
</EDropdown>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem v-if="fileList.length > 0">
|
||||||
|
<div class="item-label" slot="label">
|
||||||
|
<i class="taskfont"></i>{{$L('附件')}}
|
||||||
|
</div>
|
||||||
|
<ul class="item-content file">
|
||||||
|
<li v-if="taskDetail.file_num > 50" class="tip">{{$L(`共${taskDetail.file_num}个文件,仅显示最新50个`)}}</li>
|
||||||
|
<li v-for="file in fileList">
|
||||||
|
<img v-if="file.id" class="file-ext" :src="file.thumb"/>
|
||||||
|
<Loading v-else class="file-load"/>
|
||||||
|
<div class="file-name">{{file.name}}</div>
|
||||||
|
<div class="file-size">{{$A.bytesToSize(file.size)}}</div>
|
||||||
|
<div class="file-menu" :class="{show:file._show_menu}">
|
||||||
|
<Icon @click="viewFile(file)" type="md-eye" />
|
||||||
|
<Icon @click="downFile(file)" type="md-arrow-round-down" />
|
||||||
|
<EPopover v-model="file._show_menu" class="file-delete">
|
||||||
|
<div class="task-detail-delete-file-popover">
|
||||||
|
<p>{{$L('你确定要删除这个文件吗?')}}</p>
|
||||||
|
<div class="buttons">
|
||||||
|
<Button size="small" type="text" @click="file._show_menu=false">{{$L('取消')}}</Button>
|
||||||
|
<Button size="small" type="primary" @click="deleteFile(file)">{{$L('确定')}}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<i slot="reference" class="taskfont del"></i>
|
||||||
|
</EPopover>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="item-content">
|
||||||
|
<li>
|
||||||
|
<div class="add-button" @click="onUploadClick(true)">
|
||||||
|
<i class="taskfont"></i>{{$L('添加附件')}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem v-if="subList.length > 0 || addsubForce">
|
||||||
|
<div class="item-label" slot="label">
|
||||||
|
<i class="taskfont"></i>{{$L('子任务')}}
|
||||||
|
</div>
|
||||||
|
<ul class="item-content subtask">
|
||||||
|
<TaskDetail
|
||||||
|
v-for="(task, key) in subList"
|
||||||
|
:ref="`subTask_${task.id}`"
|
||||||
|
:key="key"
|
||||||
|
:task-id="task.id"
|
||||||
|
:open-task="task"
|
||||||
|
:main-end-at="taskDetail.end_at"
|
||||||
|
:can-update-blur="canUpdateBlur"/>
|
||||||
|
</ul>
|
||||||
|
<ul :class="['item-content', subList.length === 0 ? 'nosub' : '']">
|
||||||
|
<li>
|
||||||
|
<Input
|
||||||
|
v-if="addsubShow"
|
||||||
|
v-model="addsubName"
|
||||||
|
ref="addsub"
|
||||||
|
class="add-input"
|
||||||
|
:placeholder="$L('+ 输入子任务,回车添加子任务')"
|
||||||
|
:icon="addsubLoad > 0 ? 'ios-loading' : ''"
|
||||||
|
:class="{loading: addsubLoad > 0}"
|
||||||
|
enterkeyhint="done"
|
||||||
|
@on-blur="addsubChackClose"
|
||||||
|
@on-keydown="addsubKeydown"/>
|
||||||
|
<div v-else class="add-button" @click="addsubOpen">
|
||||||
|
<i class="taskfont"></i>{{$L('添加子任务')}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div v-if="menuList.length > 0" class="add">
|
||||||
|
<EDropdown
|
||||||
|
trigger="click"
|
||||||
|
placement="bottom"
|
||||||
|
@command="dropAdd">
|
||||||
|
<div class="add-button">
|
||||||
|
<i class="taskfont"></i>
|
||||||
|
{{$L('添加')}}
|
||||||
|
<em>{{menuText}}</em>
|
||||||
|
</div>
|
||||||
|
<EDropdownMenu slot="dropdown">
|
||||||
|
<EDropdownItem v-for="(item, key) in menuList" :key="key" :command="item.command">
|
||||||
|
<div class="item">
|
||||||
|
<i class="taskfont" v-html="item.icon"></i>{{$L(item.name)}}
|
||||||
|
</div>
|
||||||
|
</EDropdownItem>
|
||||||
|
</EDropdownMenu>
|
||||||
|
</EDropdown>
|
||||||
|
</div>
|
||||||
|
</Scrollbar>
|
||||||
|
<TaskUpload ref="upload" class="upload" @on-select-file="onSelectFile"/>
|
||||||
|
</div>
|
||||||
|
<div v-show="taskDetail.id > 0" class="task-dialog" :style="dialogStyle">
|
||||||
|
<template v-if="hasOpenDialog">
|
||||||
|
<DialogWrapper v-if="taskId > 0" ref="dialog" :dialog-id="taskDetail.dialog_id">
|
||||||
|
<div slot="head" class="head">
|
||||||
|
<Icon class="icon" type="ios-chatbubbles-outline" />
|
||||||
|
<div class="nav">
|
||||||
|
<p :class="{active:navActive=='dialog'}" @click="navActive='dialog'">{{$L('聊天')}}</p>
|
||||||
|
<p :class="{active:navActive=='log'}" @click="navActive='log'">{{$L('动态')}}</p>
|
||||||
|
<div v-if="navActive=='log'" class="refresh">
|
||||||
|
<Loading v-if="logLoadIng"/>
|
||||||
|
<Icon v-else type="ios-refresh" @click="getLogLists"></Icon>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</div>
|
||||||
</ul>
|
|
||||||
<ul class="item-content">
|
|
||||||
<li>
|
|
||||||
<div class="add-button" @click="onUploadClick(true)">
|
|
||||||
<i class="taskfont"></i>{{$L('添加附件')}}
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</FormItem>
|
|
||||||
<FormItem v-if="subList.length > 0 || addsubForce">
|
|
||||||
<div class="item-label" slot="label">
|
|
||||||
<i class="taskfont"></i>{{$L('子任务')}}
|
|
||||||
</div>
|
</div>
|
||||||
<ul class="item-content subtask">
|
</DialogWrapper>
|
||||||
<TaskDetail
|
<ProjectLog v-if="navActive=='log' && taskId > 0" ref="log" :task-id="taskDetail.id" @on-load-change="logLoadChange"/>
|
||||||
v-for="(task, key) in subList"
|
</template>
|
||||||
:ref="`subTask_${task.id}`"
|
<div v-else>
|
||||||
:key="key"
|
<div class="head">
|
||||||
:task-id="task.id"
|
|
||||||
:open-task="task"
|
|
||||||
:main-end-at="taskDetail.end_at"
|
|
||||||
:can-update-blur="canUpdateBlur"/>
|
|
||||||
</ul>
|
|
||||||
<ul :class="['item-content', subList.length === 0 ? 'nosub' : '']">
|
|
||||||
<li>
|
|
||||||
<Input
|
|
||||||
v-if="addsubShow"
|
|
||||||
v-model="addsubName"
|
|
||||||
ref="addsub"
|
|
||||||
class="add-input"
|
|
||||||
:placeholder="$L('+ 输入子任务,回车添加子任务')"
|
|
||||||
:icon="addsubLoad > 0 ? 'ios-loading' : ''"
|
|
||||||
:class="{loading: addsubLoad > 0}"
|
|
||||||
enterkeyhint="done"
|
|
||||||
@on-blur="addsubChackClose"
|
|
||||||
@on-keydown="addsubKeydown"/>
|
|
||||||
<div v-else class="add-button" @click="addsubOpen">
|
|
||||||
<i class="taskfont"></i>{{$L('添加子任务')}}
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</FormItem>
|
|
||||||
</Form>
|
|
||||||
<div v-if="menuList.length > 0" class="add">
|
|
||||||
<EDropdown
|
|
||||||
trigger="click"
|
|
||||||
placement="bottom"
|
|
||||||
@command="dropAdd">
|
|
||||||
<div class="add-button">
|
|
||||||
<i class="taskfont"></i>
|
|
||||||
{{$L('添加')}}
|
|
||||||
<em>{{menuText}}</em>
|
|
||||||
</div>
|
|
||||||
<EDropdownMenu slot="dropdown">
|
|
||||||
<EDropdownItem v-for="(item, key) in menuList" :key="key" :command="item.command">
|
|
||||||
<div class="item">
|
|
||||||
<i class="taskfont" v-html="item.icon"></i>{{$L(item.name)}}
|
|
||||||
</div>
|
|
||||||
</EDropdownItem>
|
|
||||||
</EDropdownMenu>
|
|
||||||
</EDropdown>
|
|
||||||
</div>
|
|
||||||
</Scrollbar>
|
|
||||||
<TaskUpload ref="upload" class="upload" @on-select-file="onSelectFile"/>
|
|
||||||
</div>
|
|
||||||
<div v-show="taskDetail.id > 0" class="task-dialog" :style="dialogStyle">
|
|
||||||
<template v-if="hasOpenDialog">
|
|
||||||
<DialogWrapper v-if="taskId > 0" ref="dialog" :dialog-id="taskDetail.dialog_id">
|
|
||||||
<div slot="head" class="head">
|
|
||||||
<Icon class="icon" type="ios-chatbubbles-outline" />
|
<Icon class="icon" type="ios-chatbubbles-outline" />
|
||||||
<div class="nav">
|
<div class="nav">
|
||||||
<p :class="{active:navActive=='dialog'}" @click="navActive='dialog'">{{$L('聊天')}}</p>
|
<p :class="{active:navActive=='dialog'}" @click="navActive='dialog'">{{$L('聊天')}}</p>
|
||||||
@ -401,56 +417,44 @@
|
|||||||
<Icon v-else type="ios-refresh" @click="getLogLists"></Icon>
|
<Icon v-else type="ios-refresh" @click="getLogLists"></Icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="menu">
|
||||||
</DialogWrapper>
|
<div v-if="navActive=='dialog' && taskDetail.msg_num > 0" class="menu-item" @click.stop="onSend('open')">
|
||||||
<ProjectLog v-if="navActive=='log' && taskId > 0" ref="log" :task-id="taskDetail.id" @on-load-change="logLoadChange"/>
|
<div v-if="openLoad > 0" class="menu-load"><Loading/></div>
|
||||||
</template>
|
{{$L('任务聊天')}}
|
||||||
<div v-else>
|
<em>({{taskDetail.msg_num > 999 ? '999+' : taskDetail.msg_num}})</em>
|
||||||
<div class="head">
|
<i class="taskfont"></i>
|
||||||
<Icon class="icon" type="ios-chatbubbles-outline" />
|
</div>
|
||||||
<div class="nav">
|
|
||||||
<p :class="{active:navActive=='dialog'}" @click="navActive='dialog'">{{$L('聊天')}}</p>
|
|
||||||
<p :class="{active:navActive=='log'}" @click="navActive='log'">{{$L('动态')}}</p>
|
|
||||||
<div v-if="navActive=='log'" class="refresh">
|
|
||||||
<Loading v-if="logLoadIng"/>
|
|
||||||
<Icon v-else type="ios-refresh" @click="getLogLists"></Icon>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="menu">
|
<ProjectLog v-if="navActive=='log' && taskId > 0" ref="log" :task-id="taskDetail.id" :show-load="false" @on-load-change="logLoadChange"/>
|
||||||
<div v-if="navActive=='dialog' && taskDetail.msg_num > 0" class="menu-item" @click.stop="onSend('open')">
|
<div v-else class="no-dialog"
|
||||||
<div v-if="openLoad > 0" class="menu-load"><Loading/></div>
|
@drop.prevent="taskPasteDrag($event, 'drag')"
|
||||||
{{$L('任务聊天')}}
|
@dragover.prevent="taskDragOver(true, $event)"
|
||||||
<em>({{taskDetail.msg_num > 999 ? '999+' : taskDetail.msg_num}})</em>
|
@dragleave.prevent="taskDragOver(false, $event)">
|
||||||
<i class="taskfont"></i>
|
<div class="no-tip">{{$L('暂无消息')}}</div>
|
||||||
|
<div class="no-input">
|
||||||
|
<ChatInput
|
||||||
|
ref="chatInput"
|
||||||
|
:task-id="taskId"
|
||||||
|
v-model="msgText"
|
||||||
|
:loading="sendLoad > 0"
|
||||||
|
:maxlength="200000"
|
||||||
|
:placeholder="$L('输入消息...')"
|
||||||
|
@on-more="onEventMore"
|
||||||
|
@on-file="onSelectFile"
|
||||||
|
@on-record="onRecord"
|
||||||
|
@on-send="onSend"/>
|
||||||
|
</div>
|
||||||
|
<div v-if="dialogDrag" class="drag-over" @click="dialogDrag=false">
|
||||||
|
<div class="drag-text">{{$L('拖动到这里发送')}}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<ProjectLog v-if="navActive=='log' && taskId > 0" ref="log" :task-id="taskDetail.id" :show-load="false" @on-load-change="logLoadChange"/>
|
|
||||||
<div v-else class="no-dialog"
|
|
||||||
@drop.prevent="taskPasteDrag($event, 'drag')"
|
|
||||||
@dragover.prevent="taskDragOver(true, $event)"
|
|
||||||
@dragleave.prevent="taskDragOver(false, $event)">
|
|
||||||
<div class="no-tip">{{$L('暂无消息')}}</div>
|
|
||||||
<div class="no-input">
|
|
||||||
<ChatInput
|
|
||||||
ref="chatInput"
|
|
||||||
:task-id="taskId"
|
|
||||||
v-model="msgText"
|
|
||||||
:loading="sendLoad > 0"
|
|
||||||
:maxlength="200000"
|
|
||||||
:placeholder="$L('输入消息...')"
|
|
||||||
@on-more="onEventMore"
|
|
||||||
@on-file="onSelectFile"
|
|
||||||
@on-record="onRecord"
|
|
||||||
@on-send="onSend"/>
|
|
||||||
</div>
|
|
||||||
<div v-if="dialogDrag" class="drag-over" @click="dialogDrag=false">
|
|
||||||
<div class="drag-text">{{$L('拖动到这里发送')}}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="!taskDetail.id" class="task-load"><Loading/></div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!taskDetail.id" class="task-load"><Loading/></div>
|
<!-- 提示 -->
|
||||||
|
<TaskExistTips ref="taskExistTipsRef" @onAdd="updateData('times', updateParams)"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -465,12 +469,21 @@ import {Store} from "le5le-store";
|
|||||||
import TaskMenu from "./TaskMenu";
|
import TaskMenu from "./TaskMenu";
|
||||||
import ChatInput from "./ChatInput";
|
import ChatInput from "./ChatInput";
|
||||||
import UserSelect from "../../../components/UserSelect.vue";
|
import UserSelect from "../../../components/UserSelect.vue";
|
||||||
|
import TaskExistTips from "./TaskExistTips.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "TaskDetail",
|
name: "TaskDetail",
|
||||||
components: {
|
components: {
|
||||||
UserSelect,
|
UserSelect,
|
||||||
ChatInput, TaskMenu, ProjectLog, DialogWrapper, TaskUpload, TaskPriority, TEditor},
|
TaskExistTips,
|
||||||
|
ChatInput,
|
||||||
|
TaskMenu,
|
||||||
|
ProjectLog,
|
||||||
|
DialogWrapper,
|
||||||
|
TaskUpload,
|
||||||
|
TaskPriority,
|
||||||
|
TEditor
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
taskId: {
|
taskId: {
|
||||||
type: Number,
|
type: Number,
|
||||||
@ -574,6 +587,8 @@ export default {
|
|||||||
{key: 'year', label: '每年'},
|
{key: 'year', label: '每年'},
|
||||||
{key: 'custom', label: '自定义'},
|
{key: 'custom', label: '自定义'},
|
||||||
],
|
],
|
||||||
|
|
||||||
|
updateParams: {},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -957,7 +972,16 @@ export default {
|
|||||||
if (!desc) {
|
if (!desc) {
|
||||||
return `请输入修改备注`
|
return `请输入修改备注`
|
||||||
}
|
}
|
||||||
this.updateData("times", Object.assign(params, {desc}))
|
this.updateParams = Object.assign(params, {desc})
|
||||||
|
this.$refs['taskExistTipsRef'].isExistTask({
|
||||||
|
taskid: this.taskDetail.id,
|
||||||
|
userids: this.taskDetail.owner_userid,
|
||||||
|
timerange: [params.start_at,params.end_at]
|
||||||
|
}).then(res=>{
|
||||||
|
if(!res){
|
||||||
|
this.updateData("times", this.updateParams)
|
||||||
|
}
|
||||||
|
});
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
103
resources/assets/js/pages/manage/components/TaskExistTips.vue
Normal file
103
resources/assets/js/pages/manage/components/TaskExistTips.vue
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<template>
|
||||||
|
<Modal v-model="show" :title="$L('以下人员已存在任务')" class="task-exist-tips" width="640">
|
||||||
|
<List :split="false" size="small">
|
||||||
|
<ListItem v-for="(items, userid) in tipsTask" :key="userid">
|
||||||
|
<div class="list-content">
|
||||||
|
<UserAvatar :userid="userid" :size="28" :show-icon="true" :show-name="true" tooltipDisabled />
|
||||||
|
<div class="list-task" v-for="(item, key) in items" :key="key">
|
||||||
|
<div class="list-task-info">
|
||||||
|
<span>[{{ item.project_name }}] </span>
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="list-task-date">{{ getCutTime(item) }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ListItem>
|
||||||
|
</List>
|
||||||
|
<div slot="footer">
|
||||||
|
<Button type="default" @click="show = false">{{ $L('取消') }}</Button>
|
||||||
|
<Button type="primary" @click="onAdd()">{{ $L('确定') }}</Button>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import TEditor from "../../../components/TEditor";
|
||||||
|
import UserSelect from "../../../components/UserSelect.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "TaskExistTips",
|
||||||
|
components: { UserSelect, TEditor },
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isExist: false,
|
||||||
|
show: false,
|
||||||
|
tipsTask: [],
|
||||||
|
loadIng: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
onAdd() {
|
||||||
|
this.$emit('onAdd', {})
|
||||||
|
this.show = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
getCutTime(item) {
|
||||||
|
let start_at = $A.Date(item.start_at, true);
|
||||||
|
let end_at = $A.Date(item.end_at, true);
|
||||||
|
let string = "";
|
||||||
|
if ($A.formatDate('Y/m/d', start_at) == $A.formatDate('Y/m/d', end_at)) {
|
||||||
|
string = $A.formatDate('Y/m/d H:i', start_at) + " ~ " + $A.formatDate('H:i', end_at)
|
||||||
|
} else if ($A.formatDate('Y', start_at) == $A.formatDate('Y', end_at)) {
|
||||||
|
string = $A.formatDate('Y/m/d', start_at) + " ~ " + $A.formatDate('m/d', end_at)
|
||||||
|
string = string.replace(/( 00:00| 23:59)/g, "")
|
||||||
|
} else {
|
||||||
|
string = $A.formatDate('Y/m/d H:i', start_at) + " ~ " + $A.formatDate('Y/m/d H:i', end_at)
|
||||||
|
string = string.replace(/( 00:00| 23:59)/g, "")
|
||||||
|
}
|
||||||
|
return string
|
||||||
|
},
|
||||||
|
|
||||||
|
isExistTask({ userids, timerange, taskid }) {
|
||||||
|
this.isExist = false;
|
||||||
|
return new Promise(async resolve => {
|
||||||
|
this.$store.dispatch("call", {
|
||||||
|
url: 'project/task/easylists',
|
||||||
|
data: {
|
||||||
|
userid: userids,
|
||||||
|
timerange: timerange,
|
||||||
|
taskid: taskid
|
||||||
|
},
|
||||||
|
method: 'get',
|
||||||
|
}).then(({ data }) => {
|
||||||
|
if (data.data.length > 0) {
|
||||||
|
this.show = true;
|
||||||
|
let taskObj = {}
|
||||||
|
userids.map(userid => {
|
||||||
|
data.data.map(h => {
|
||||||
|
if ((h.task_user || []).map(k => k.owner ? k.userid : 0).indexOf(userid) !== -1) {
|
||||||
|
if (!taskObj[userid]) {
|
||||||
|
taskObj[userid] = [];
|
||||||
|
}
|
||||||
|
taskObj[userid].push(h);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
this.tipsTask = taskObj
|
||||||
|
this.isExist = true;
|
||||||
|
}
|
||||||
|
resolve(this.isExist)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -23,3 +23,4 @@
|
|||||||
@import "task-priority";
|
@import "task-priority";
|
||||||
@import "team-management";
|
@import "team-management";
|
||||||
@import "update-log";
|
@import "update-log";
|
||||||
|
@import "task-exist-tips";
|
||||||
|
|||||||
40
resources/assets/sass/pages/components/task-exist-tips.scss
vendored
Normal file
40
resources/assets/sass/pages/components/task-exist-tips.scss
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
.task-exist-tips {
|
||||||
|
|
||||||
|
.ivu-modal-body {
|
||||||
|
padding: 0px 26px 16px 26px !important;
|
||||||
|
max-height: 500px;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-content {
|
||||||
|
flex: 1;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-task {
|
||||||
|
@media (min-width: 450px) {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
margin-left: 34px;
|
||||||
|
margin-top: 10px;
|
||||||
|
width: calc(100% - 34px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-task-info {
|
||||||
|
min-width: 135px;
|
||||||
|
flex: 1;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
span:first-child {
|
||||||
|
color: #A7ABB5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-task-date {
|
||||||
|
min-width: 135px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user