diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 4db159b7..5cdfd862 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -747,7 +747,8 @@ class ProjectController extends AbstractController $task->updateTask($data, $updateContent); } $data = $task->toArray(); - $data['is_update_complete'] = $updateComplete; + $data['is_subtask'] = $task->parent_id > 0; + $data['is_update_complete'] = $task->parent_id == 0 && $updateComplete; $data['is_update_content'] = $updateContent; $task->pushMsg('update', $data); return Base::retSuccess('修改成功', $data); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 8c2dc8c0..0e6bdd8c 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -381,24 +381,26 @@ class ProjectTask extends AbstractModel } // 负责人 if (Arr::exists($data, 'owner')) { - $row = ProjectTaskUser::whereTaskId($this->id)->whereOwner(1)->first(); $owner = intval($data['owner']); - if ($row->userid != $owner) { - if (empty($this->useridInTheProject($owner))) { - throw new ApiException('请选择正确的负责人'); - } - $row->owner = 0; - $row->save(); - ProjectTaskUser::updateInsert([ + $row = ProjectTaskUser::whereTaskId($this->id)->whereUserid($owner)->first(); + if (empty($row)) { + $row = ProjectTaskUser::createInstance([ 'project_id' => $this->project_id, 'task_id' => $this->id, 'userid' => $owner, - ], [ 'owner' => 1, ]); - $this->syncDialogUser(); - $this->addLog("修改{任务}负责人为会员ID:" . $owner); + } else { + $row->owner = 1; } + $row->save(); + if ($this->parent_id) { + ProjectTaskUser::whereTaskId($this->id)->where('id', '!=', $row->id)->delete(); + } else { + ProjectTaskUser::whereTaskId($this->id)->where('id', '!=', $row->id)->update([ 'owner' => 0 ]); + } + $this->syncDialogUser(); + $this->addLog("修改{任务}负责人为会员ID:" . $row->userid); } // 计划时间 if (Arr::exists($data, 'times')) { diff --git a/resources/assets/js/components/UserAvatar.vue b/resources/assets/js/components/UserAvatar.vue index 2bdddce0..2c388687 100755 --- a/resources/assets/js/components/UserAvatar.vue +++ b/resources/assets/js/components/UserAvatar.vue @@ -86,7 +86,7 @@ return {} } return { - 'transform': 'scale(' + (size / 32) + ')', + 'transform': 'scale(' + Math.min(1, size / 32) + ')', } }, diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index a93f2e53..c454b6e5 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -627,7 +627,6 @@ export default { }).catch(({msg}) => { $A.modalError(msg); this.sortDisabled = false; - this.$store.state.tasks = this.tasks.filter(({project_id}) => project_id != this.projectId); this.$store.dispatch("getTasks", {project_id: this.projectId}) }); }, diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue index 440cbdd5..950cc4a5 100644 --- a/resources/assets/js/pages/manage/components/TaskDetail.vue +++ b/resources/assets/js/pages/manage/components/TaskDetail.vue @@ -140,7 +140,8 @@
- +
{{$L('附件')}}
- +
{{$L('子任务')}}
    - +
-
    +
    • task_id == this.taskId) + return content ? content.content : '' + }, + + fileList() { + if (!this.taskId) { + return []; + } + return this.taskFiles.filter(({task_id}) => { + return task_id == this.taskId + }).sort((a, b) => { + return a.id - b.id; + }); + }, + + subList() { + if (!this.taskId) { + return []; + } + return this.tasks.filter(({parent_id}) => { + return parent_id == this.taskId + }).sort((a, b) => { + return a.id - b.id; + }); + }, scrollerStyle() { const {innerHeight, taskDetail} = this; @@ -519,16 +550,6 @@ export default { return string; }, - hasFile() { - const {taskDetail} = this; - return $A.isArray(taskDetail.files) && taskDetail.files.length > 0; - }, - - hasSubtask() { - const {taskDetail} = this; - return $A.isArray(taskDetail.sub_task) && taskDetail.sub_task.length > 0; - }, - getOwner() { const {taskDetail} = this; if (!$A.isArray(taskDetail.task_user)) { @@ -569,14 +590,14 @@ export default { name: '截止时间', }); } - if (!($A.isArray(taskDetail.files) && taskDetail.files.length > 0)) { + if (this.fileList.length == 0) { list.push({ command: 'file', icon: '', name: '附件', }); } - if (!($A.isArray(taskDetail.sub_task) && taskDetail.sub_task.length > 0)) { + if (this.subList.length == 0) { list.push({ command: 'subtask', icon: '', @@ -756,6 +777,12 @@ export default { case 'times': this.$set(this.taskDetail, 'times', [params.start_at, params.end_at]) break; + case 'content': + if (this.$refs.desc.getContent() == this.taskContent) { + return; + } + this.$set(this.taskDetail, 'content', this.$refs.desc.getContent()) + break; } // let dataJson = {task_id: this.taskDetail.id}; diff --git a/resources/assets/js/pages/manage/components/TaskRow.vue b/resources/assets/js/pages/manage/components/TaskRow.vue index 53a1f728..b256bb31 100644 --- a/resources/assets/js/pages/manage/components/TaskRow.vue +++ b/resources/assets/js/pages/manage/components/TaskRow.vue @@ -60,7 +60,7 @@
-
{{item.column_name}}
+
{{columnName(item.column_id)}}
{{item.p_name}} @@ -91,7 +91,7 @@ :open-key="openKey" @command="dropTask"/> - + @@ -149,11 +149,15 @@ export default { }, computed: { - ...mapState(['tasks']), + ...mapState(['tasks', 'columns']), subTask() { return function(task_id) { - return this.tasks.filter(({parent_id}) => parent_id == task_id); + return this.tasks.filter(({parent_id}) => { + return parent_id == task_id + }).sort((a, b) => { + return a.id - b.id; + }); } }, @@ -171,6 +175,11 @@ export default { }, }, methods: { + columnName(column_id) { + const column = this.columns.find(({id}) => id == column_id) + return column ? column.name : ''; + }, + dropTask(task, command) { this.$emit("command", task, command) }, diff --git a/resources/assets/js/pages/manage/project.vue b/resources/assets/js/pages/manage/project.vue index 33ea185b..b600cf60 100644 --- a/resources/assets/js/pages/manage/project.vue +++ b/resources/assets/js/pages/manage/project.vue @@ -24,10 +24,12 @@ export default { this.project_id = route.params.id; }, project_id(id) { - this.$store.state.projectId = $A.runNum(id); - this.$store.dispatch("getProjectOne", id); - this.$store.dispatch("getColumns", id); - this.$store.dispatch("getTasks", {project_id: id}); + if (id > 0) { + this.$store.state.projectId = $A.runNum(id); + this.$store.dispatch("getProjectOne", id); + this.$store.dispatch("getColumns", id); + this.$store.dispatch("getTasks", {project_id: id}); + } } }, } diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index c59a7acb..5e35de24 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -439,11 +439,13 @@ export default { /** * 忘记列表数据 * @param state + * @param dispatch * @param column_id */ - forgetColumn({state}, column_id) { + forgetColumn({state, dispatch}, column_id) { let index = state.columns.findIndex(({id}) => id == column_id); if (index > -1) { + dispatch('getProjectOne', state.columns[index].project_id) state.columns.splice(index, 1); } state.method.setStorage("cacheColumns", state.cacheColumns = state.columns); @@ -493,6 +495,7 @@ export default { resolve(result) }).catch(e => { !e.ret && console.error(e); + reject(e); }); }); }, @@ -521,6 +524,16 @@ export default { } else { state.tasks.push(data); } + // + if (data.is_subtask) { + dispatch("getTaskOne", data.parent_id); + } + if (data.is_update_complete) { + dispatch("getProjectOne", data.project_id); + } + if (data.is_update_content) { + dispatch("getTaskContent", data.id); + } } state.method.setStorage("cacheTasks", state.cacheTasks = state.tasks); }, @@ -528,11 +541,14 @@ export default { /** * 忘记任务数据 * @param state + * @param dispatch * @param task_id */ - forgetTask({state}, task_id) { + forgetTask({state, dispatch}, task_id) { let index = state.tasks.findIndex(({id}) => id == task_id); if (index > -1) { + dispatch("getTaskOne", state.tasks[index].parent_id) + dispatch('getProjectOne', state.tasks[index].project_id) state.tasks.splice(index, 1); } if (state.taskId == task_id) { @@ -665,6 +681,7 @@ export default { resolve(result) }).catch(e => { !e.ret && console.error(e); + reject(e); }); }); }, @@ -695,6 +712,7 @@ export default { resolve(result) }).catch(e => { !e.ret && console.error(e); + reject(e); }); }); }, @@ -736,9 +754,11 @@ export default { const {new_column, task} = result.data; dispatch("saveColumn", new_column) dispatch("saveTask", task) + dispatch("getProjectOne", task.project_id); resolve(result) }).catch(e => { !e.ret && console.error(e); + reject(e); }); }); }, @@ -755,12 +775,13 @@ export default { url: 'project/task/addsub', data: data, }).then(result => { - const {new_column, task} = result.data; - dispatch("saveColumn", new_column) + const {task} = result.data; dispatch("saveTask", task) + dispatch("getTaskOne", task.parent_id); resolve(result) }).catch(e => { !e.ret && console.error(e); + reject(e); }); }); }, @@ -807,6 +828,7 @@ export default { resolve(result) }).catch(e => { !e.ret && console.error(e); + reject(e); }); }); }, diff --git a/resources/assets/js/store/getters.js b/resources/assets/js/store/getters.js index 4cbff7b4..fa23a7b2 100644 --- a/resources/assets/js/store/getters.js +++ b/resources/assets/js/store/getters.js @@ -46,10 +46,6 @@ export default { window.__taskId = taskId; const task = state.tasks.find(({id}) => id == taskId); if (task) { - const content = state.taskContents.find(({task_id}) => task_id == taskId); - task.content = content ? content.content : ''; - task.files = state.taskFiles.filter(({task_id}) => task_id == taskId); - task.sub_task = state.tasks.filter(({parent_id}) => parent_id == taskId); return task; } }