mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 11:19:56 +00:00
feat(任务可见性功能、子任务优化):新增任务可见性操作模块、任务详情子任务样式优化
This commit is contained in:
parent
f613a8cfc6
commit
ad5cb79d40
@ -16,6 +16,7 @@ use App\Models\ProjectLog;
|
||||
use App\Models\ProjectTask;
|
||||
use App\Models\ProjectTaskFile;
|
||||
use App\Models\ProjectTaskFlowChange;
|
||||
use App\Models\ProjectTaskUser;
|
||||
use App\Models\ProjectUser;
|
||||
use App\Models\User;
|
||||
use App\Models\WebSocketDialog;
|
||||
@ -880,8 +881,17 @@ class ProjectController extends AbstractController
|
||||
public function task__lists()
|
||||
{
|
||||
$user = User::auth();
|
||||
//
|
||||
|
||||
// 任务可见性
|
||||
$project_ids = Project::whereUserid($user->userid)->pluck('id')->toArray(); // 负责人项目ids
|
||||
$main_task_ids = ProjectTask::whereIn('project_id', $project_ids)->pluck('id')->toArray(); // 负责人项目任务ids
|
||||
$other_task_ids = ProjectTaskUser::whereUserid($user->userid)->whereColumn('task_id', '=', 'task_pid')->whereNotIn('project_id', $project_ids)->pluck('task_id')->toArray(); // 非负责人项目任务ids
|
||||
$all_visible_task_ids = ProjectTask::whereIsAllVisible(1)->pluck('id')->toArray(); // 所有人可见项目ids
|
||||
$one_task_ids = array_merge($main_task_ids, $other_task_ids);
|
||||
$visibility_task_ids = array_merge($one_task_ids, $all_visible_task_ids);
|
||||
|
||||
$builder = ProjectTask::with(['taskUser', 'taskTag']);
|
||||
$builder->whereIn("project_tasks.id", $visibility_task_ids);
|
||||
//
|
||||
$parent_id = intval(Request::input('parent_id'));
|
||||
$project_id = intval(Request::input('project_id'));
|
||||
@ -1326,17 +1336,26 @@ class ProjectController extends AbstractController
|
||||
*/
|
||||
public function task__one()
|
||||
{
|
||||
User::auth();
|
||||
$user = User::auth();
|
||||
//
|
||||
$task_id = intval(Request::input('task_id'));
|
||||
$archived = Request::input('archived', 'no');
|
||||
//
|
||||
$isArchived = str_replace(['all', 'yes', 'no'], [null, false, true], $archived);
|
||||
$task = ProjectTask::userTask($task_id, $isArchived, true, false, ['taskUser', 'taskTag']);
|
||||
// 项目可见性
|
||||
$project_userid = Project::whereId($task->project_id)->value('userid'); // 项目负责人
|
||||
if ($task->is_all_visible != 1 && $user->userid != $project_userid) {
|
||||
$visibleUserids = ProjectTaskUser::whereTaskId($task_id)->pluck('userid')->toArray();
|
||||
if (!in_array($user->userid, $visibleUserids)) {
|
||||
return Base::retError('无任务权限');
|
||||
}
|
||||
}
|
||||
//
|
||||
$data = $task->toArray();
|
||||
$data['project_name'] = $task->project?->name;
|
||||
$data['column_name'] = $task->projectColumn?->name;
|
||||
$data['visibility_appointor'] = $task->is_all_visible==1 ? [0] : ProjectTaskUser::whereTaskId($task_id)->whereOwner(2)->pluck('userid');
|
||||
return Base::retSuccess('success', $data);
|
||||
}
|
||||
|
||||
@ -1542,7 +1561,7 @@ class ProjectController extends AbstractController
|
||||
*/
|
||||
public function task__add()
|
||||
{
|
||||
User::auth();
|
||||
$user = User::auth();
|
||||
//
|
||||
$data = Request::input();
|
||||
$project_id = intval($data['project_id']);
|
||||
@ -1587,6 +1606,17 @@ class ProjectController extends AbstractController
|
||||
$data = $data->toArray();
|
||||
$data['new_column'] = $newColumn;
|
||||
}
|
||||
|
||||
|
||||
if ($data['is_all_visible'] == 1) {
|
||||
$data['is_visible'] = 1;
|
||||
} else {
|
||||
$projectOwner = Project::whereId($data['project_id'])->pluck('userid')->toArray(); // 项目负责人
|
||||
$taskOwnerAndAssists = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($data['id'])->pluck('userid')->toArray();
|
||||
$visibleIds = array_merge($projectOwner, $taskOwnerAndAssists);
|
||||
$data['is_visible'] = in_array($user->userid, $visibleIds) ? 1 : 0;
|
||||
}
|
||||
|
||||
$task->pushMsg('add', $data);
|
||||
$task->taskPush(null, 0);
|
||||
return Base::retSuccess('添加成功', $data);
|
||||
@ -1648,6 +1678,7 @@ class ProjectController extends AbstractController
|
||||
* @apiParam {String} [content] 任务详情(子任务不支持)
|
||||
* @apiParam {String} [color] 背景色(子任务不支持)
|
||||
* @apiParam {Array} [assist] 修改协助人员(子任务不支持)
|
||||
* @apiParam {Array} [visibility_appointor] 修改可见性人员
|
||||
*
|
||||
* @apiParam {Number} [p_level] 优先级相关(子任务不支持)
|
||||
* @apiParam {String} [p_name] 优先级相关(子任务不支持)
|
||||
@ -1664,17 +1695,31 @@ class ProjectController extends AbstractController
|
||||
{
|
||||
User::auth();
|
||||
//
|
||||
$data = Request::input();
|
||||
$task_id = intval($data['task_id']);
|
||||
$param = Request::input();
|
||||
$task_id = intval($param['task_id']);
|
||||
//
|
||||
$task = ProjectTask::userTask($task_id, true, true, 2);
|
||||
// 更新任务
|
||||
$updateMarking = [];
|
||||
$task->updateTask($data, $updateMarking);
|
||||
$task->updateTask($param, $updateMarking);
|
||||
//
|
||||
$data = ProjectTask::oneTask($task->id)->toArray();
|
||||
$data['update_marking'] = $updateMarking ?: json_decode('{}');
|
||||
$data['visibility_appointor'] = $data['is_all_visible'] == 1 ? [0] : ProjectTaskUser::whereTaskId($task->id)->whereOwner(2)->pluck('userid');
|
||||
$task->pushMsg('update', $data);
|
||||
// 可见性推送
|
||||
if (Arr::exists($param, 'visibility_appointor')) {
|
||||
if ($data['is_all_visible'] == 1) {
|
||||
$task->pushMsgVisibleAdd($data);
|
||||
}
|
||||
if ($data['is_all_visible'] == 0) {
|
||||
if ($param['visibility_appointor']) {
|
||||
$task->pushMsgVisibleUpdate($data);
|
||||
} else {
|
||||
$task->pushMsgVisibleRemove();
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
return Base::retSuccess('修改成功', $data);
|
||||
}
|
||||
|
||||
@ -370,6 +370,18 @@ class ProjectTask extends AbstractModel
|
||||
$p_color = $data['p_color'];
|
||||
$top = intval($data['top']);
|
||||
$userid = User::userid();
|
||||
$visibility_appoint = $data['visibility_appoint'];
|
||||
$visibility_appointor = $data['visibility_appointor'];
|
||||
// 可见性
|
||||
$visibility_userids = [];
|
||||
$is_all_visible = 0;
|
||||
if ($visibility_appoint) {
|
||||
if (in_array(0, $visibility_appointor)) {
|
||||
$is_all_visible = 1;
|
||||
} else {
|
||||
$visibility_userids = $visibility_appointor;
|
||||
}
|
||||
}
|
||||
//
|
||||
if (ProjectTask::whereProjectId($project_id)
|
||||
->whereNull('project_tasks.complete_at')
|
||||
@ -398,6 +410,7 @@ class ProjectTask extends AbstractModel
|
||||
'p_level' => $p_level,
|
||||
'p_name' => $p_name,
|
||||
'p_color' => $p_color,
|
||||
'is_all_visible' => $is_all_visible
|
||||
]);
|
||||
if ($content) {
|
||||
$task->desc = Base::getHtml($content, 100);
|
||||
@ -462,7 +475,7 @@ class ProjectTask extends AbstractModel
|
||||
}
|
||||
}
|
||||
//
|
||||
return AbstractModel::transaction(function() use ($assist, $times, $subtasks, $content, $owner, $task) {
|
||||
return AbstractModel::transaction(function() use ($assist, $times, $subtasks, $content, $owner, $task, $visibility_userids) {
|
||||
$task->save();
|
||||
$owner = array_values(array_unique($owner));
|
||||
foreach ($owner as $uid) {
|
||||
@ -484,6 +497,17 @@ class ProjectTask extends AbstractModel
|
||||
'owner' => 0,
|
||||
])->save();
|
||||
}
|
||||
|
||||
foreach ($visibility_userids as $uid) {
|
||||
ProjectTaskUser::createInstance([
|
||||
'project_id' => $task->project_id,
|
||||
'task_id' => $task->id,
|
||||
'task_pid' => $task->parent_id ?: $task->id,
|
||||
'userid' => $uid,
|
||||
'owner' => 2,
|
||||
])->save();
|
||||
}
|
||||
|
||||
if ($content) {
|
||||
ProjectTaskContent::createInstance([
|
||||
'project_id' => $task->project_id,
|
||||
@ -691,6 +715,26 @@ class ProjectTask extends AbstractModel
|
||||
$updateMarking['is_update_project'] = true;
|
||||
$this->syncDialogUser();
|
||||
}
|
||||
// 可见性
|
||||
if (Arr::exists($data, 'visibility_appointor')) {
|
||||
if (in_array(0, $data['visibility_appointor'])) {
|
||||
ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => 1]);
|
||||
} else {
|
||||
ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => 0]);
|
||||
// 覆盖
|
||||
ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete();
|
||||
foreach ($data['visibility_appointor'] as $uid) {
|
||||
ProjectTaskUser::createInstance([
|
||||
'project_id' => $this->project_id,
|
||||
'task_id' => $this->id,
|
||||
'task_pid' => $this->parent_id ?: $this->id,
|
||||
'userid' => $uid,
|
||||
'owner' => 2,
|
||||
])->save();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// 计划时间(原则:子任务时间在主任务时间内)
|
||||
if (Arr::exists($data, 'times')) {
|
||||
$oldAt = [Carbon::parse($this->start_at), Carbon::parse($this->end_at)];
|
||||
@ -1372,6 +1416,8 @@ class ProjectTask extends AbstractModel
|
||||
$userids = $this->project->relationUserids();
|
||||
} elseif (!is_array($userid)) {
|
||||
$userids = [$userid];
|
||||
} elseif (is_array($userid)) {
|
||||
$userids = $userid;
|
||||
}
|
||||
//
|
||||
$array = [];
|
||||
@ -1391,8 +1437,10 @@ class ProjectTask extends AbstractModel
|
||||
];
|
||||
}
|
||||
// 协助人
|
||||
$assists = $taskUser->pluck('userid')->toArray();
|
||||
$assists = array_intersect($userids, array_diff($assists, $owners));
|
||||
// $assists = $taskUser->pluck('userid')->toArray();
|
||||
// $assists = array_intersect($userids, array_diff($assists, $owners));
|
||||
$assists = $taskUser->where('owner', 0)->pluck('userid')->toArray();
|
||||
$assists = array_intersect($userids, $assists);
|
||||
if ($assists) {
|
||||
$array[] = [
|
||||
'userid' => array_values($assists),
|
||||
@ -1403,13 +1451,21 @@ class ProjectTask extends AbstractModel
|
||||
];
|
||||
}
|
||||
// 项目成员(其他人)
|
||||
$userids = array_diff($userids, $owners, $assists);
|
||||
if ($data['is_all_visible'] == 1) {
|
||||
// 全部可见
|
||||
$userids = array_diff($userids, $owners, $assists);
|
||||
} else {
|
||||
// 指定可见
|
||||
$visible = $taskUser->where('owner', 2)->pluck('userid')->toArray();
|
||||
$userids = $visible;
|
||||
}
|
||||
$data = array_merge($data, [
|
||||
'owner' => 0,
|
||||
'assist' => 0,
|
||||
]);
|
||||
}
|
||||
}
|
||||
//
|
||||
$array[] = [
|
||||
'userid' => array_values($userids),
|
||||
'data' => $data
|
||||
@ -1430,6 +1486,116 @@ class ProjectTask extends AbstractModel
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加可见性任务 推送
|
||||
* @param array|self $data 发送内容,默认为[id, parent_id, project_id, column_id, dialog_id]
|
||||
*/
|
||||
public function pushMsgVisibleAdd($data = null)
|
||||
{
|
||||
if (!$this->project) {
|
||||
return;
|
||||
}
|
||||
if ($data === null) {
|
||||
$data = [
|
||||
'id' => $this->id,
|
||||
'parent_id' => $this->parent_id,
|
||||
'project_id' => $this->project_id,
|
||||
'column_id' => $this->column_id,
|
||||
'dialog_id' => $this->dialog_id,
|
||||
];
|
||||
} elseif ($data instanceof self) {
|
||||
$data = $data->toArray();
|
||||
}
|
||||
//
|
||||
$array = [];
|
||||
if ($this->is_all_visible == 0) {
|
||||
$userids = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($this->id)->pluck('userid')->toArray();
|
||||
} else {
|
||||
$userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员
|
||||
}
|
||||
//
|
||||
$array[] = [
|
||||
'userid' => array_values($userids),
|
||||
'data' => $data
|
||||
];
|
||||
//
|
||||
foreach ($array as $item) {
|
||||
$params = [
|
||||
// 'ignoreFd' => Request::header('fd'),
|
||||
'ignoreFd' => '0',
|
||||
'userid' => array_values($item),
|
||||
'msg' => [
|
||||
'type' => 'projectTask',
|
||||
'action' => 'add',
|
||||
'data' => $item['data'],
|
||||
]
|
||||
];
|
||||
$task = new PushTask($params, false);
|
||||
Task::deliver($task);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除可见性任务 推送
|
||||
* @param string $action
|
||||
* @param array|self $data 发送内容,默认为[id, parent_id, project_id, column_id, dialog_id]
|
||||
*/
|
||||
public function pushMsgVisibleRemove($data = null)
|
||||
{
|
||||
if (!$this->project) {
|
||||
return;
|
||||
}
|
||||
if ($data === null) {
|
||||
$data = [
|
||||
'id' => $this->id,
|
||||
'parent_id' => $this->parent_id,
|
||||
'project_id' => $this->project_id,
|
||||
'column_id' => $this->column_id,
|
||||
'dialog_id' => $this->dialog_id,
|
||||
];
|
||||
} elseif ($data instanceof self) {
|
||||
$data = $data->toArray();
|
||||
}
|
||||
//
|
||||
$array = [];
|
||||
// 项目成员 与 项目负责人,任务负责人、协助人的差集
|
||||
$projectUserids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员
|
||||
$projectOwner = Project::whereId($this->project_id)->pluck('userid')->toArray(); // 项目负责人
|
||||
$taskOwnerAndAssists = ProjectTaskUser::select(['userid', 'owner'])->whereIn('owner', [0, 1])->whereTaskId($this->id)->pluck('userid')->toArray();
|
||||
$userids = array_diff($projectUserids, $projectOwner, $taskOwnerAndAssists);
|
||||
//
|
||||
$array[] = [
|
||||
'userid' => array_values($userids),
|
||||
'data' => $data
|
||||
];
|
||||
//
|
||||
foreach ($array as $item) {
|
||||
$params = [
|
||||
// 'ignoreFd' => Request::header('fd'),
|
||||
'ignoreFd' => '0',
|
||||
'userid' => array_values($item),
|
||||
'msg' => [
|
||||
'type' => 'projectTask',
|
||||
'action' => 'delete',
|
||||
'data' => $item['data'],
|
||||
]
|
||||
];
|
||||
$task = new PushTask($params, false);
|
||||
Task::deliver($task);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新可见性任务 推送
|
||||
* @param array|self $data 发送内容,默认为[id, parent_id, project_id, column_id, dialog_id]
|
||||
*/
|
||||
public function pushMsgVisibleUpdate($data)
|
||||
{
|
||||
$this->pushMsgVisibleRemove();
|
||||
usleep(300);
|
||||
$this->pushMsgVisibleAdd($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务提醒
|
||||
* @param $userids
|
||||
|
||||
@ -149,7 +149,7 @@ class PushTask extends AbstractTask
|
||||
if (!is_array($userid)) {
|
||||
$userid = [$userid];
|
||||
}
|
||||
foreach ($userid as $uid) {
|
||||
foreach ($userid[0] as $uid) {
|
||||
$row = WebSocket::select(['fd'])->whereUserid($uid)->pluck('fd');
|
||||
if ($row->isNotEmpty()) {
|
||||
$array = array_merge($array, $row->toArray());
|
||||
@ -162,6 +162,8 @@ class PushTask extends AbstractTask
|
||||
$ignoreFd = is_array($ignoreFd) ? $ignoreFd : [$ignoreFd];
|
||||
}
|
||||
// 开始发送
|
||||
\Log::info('fd');
|
||||
\Log::info($array);
|
||||
foreach ($array as $fid) {
|
||||
if ($ignoreFd) {
|
||||
if (in_array($fid, $ignoreFd)) continue;
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddProjectTasksIsAllVisible extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
//
|
||||
Schema::table('project_tasks', function (Blueprint $table) {
|
||||
if (!Schema::hasColumn('project_tasks', 'is_all_visible')) {
|
||||
$table->tinyInteger('is_all_visible')->nullable()->default(1)->after('is_default')->comment('是否所有人可见');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
Schema::table('project_tasks', function (Blueprint $table) {
|
||||
$table->dropColumn("avatar");
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -92,6 +92,25 @@
|
||||
</ETooltip>
|
||||
</div>
|
||||
</FormItem>
|
||||
<FormItem :label="$L('可见性')">
|
||||
<Checkbox disabled v-model="addData.visibility_principal" :true-value="1" :false-value="0">{{$L('项目负责人')}}</Checkbox>
|
||||
<Checkbox disabled v-model="addData.visibility_assist" :true-value="1" :false-value="0">{{$L('项目协助人')}}</Checkbox>
|
||||
<Checkbox v-model="addData.visibility_appoint" :true-value="1" :false-value="0">{{$L('指定人员')}}</Checkbox>
|
||||
<UserInput
|
||||
v-show="addData.visibility_appoint"
|
||||
v-model="addData.visibility_appointor"
|
||||
:placeholder="$L('选择指定人员')"
|
||||
:project-id="addData.project_id"
|
||||
:transfer="false">
|
||||
<Option slot="option-prepend" :value="0" :label="$L('所有人')" >
|
||||
<div class="user-input-option">
|
||||
<div class="user-input-avatar"><EAvatar class="avatar" icon="el-icon-s-custom"/></div>
|
||||
<div class="user-input-nickname">{{ $L('所有人') }}</div>
|
||||
<div class="user-input-userid">All</div>
|
||||
</div>
|
||||
</Option>
|
||||
</UserInput>
|
||||
</FormItem>
|
||||
<div class="subtasks">
|
||||
<div v-if="addData.subtasks.length > 0" class="sublist">
|
||||
<Row>
|
||||
@ -185,6 +204,11 @@ export default {
|
||||
p_level: 0,
|
||||
p_name: '',
|
||||
p_color: '',
|
||||
// 可见性
|
||||
visibility_principal: 1,
|
||||
visibility_assist: 1,
|
||||
visibility_appoint: 1,
|
||||
visibility_appointor: [0],
|
||||
},
|
||||
|
||||
cascaderShow: false,
|
||||
|
||||
@ -113,6 +113,11 @@ export default {
|
||||
p_level: 0,
|
||||
p_name: '',
|
||||
p_color: '',
|
||||
// 可见性
|
||||
visibility_principal: 1,
|
||||
visibility_assist: 1,
|
||||
visibility_appoint: 1,
|
||||
visibility_appointor: [0],
|
||||
},
|
||||
active: false,
|
||||
|
||||
@ -217,6 +222,11 @@ export default {
|
||||
p_level: 0,
|
||||
p_name: '',
|
||||
p_color: '',
|
||||
// 可见性
|
||||
visibility_principal: 1,
|
||||
visibility_assist: 1,
|
||||
visibility_appoint: 1,
|
||||
visibility_appointor: [0],
|
||||
}
|
||||
}).catch(({msg}) => {
|
||||
$A.modalError(msg);
|
||||
|
||||
@ -1,73 +1,89 @@
|
||||
<template>
|
||||
<!--子任务-->
|
||||
<li v-if="ready && taskDetail.parent_id > 0">
|
||||
<div class="subtask-icon">
|
||||
<TaskMenu
|
||||
: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)}}
|
||||
<li style="display: block;margin-bottom: 16px;" v-if="ready && taskDetail.parent_id > 0">
|
||||
<div style="display: flex; margin-left: 6px;">
|
||||
<div class="subtask-icon">
|
||||
<TaskMenu
|
||||
:ref="`taskMenu_${taskDetail.id}`"
|
||||
:disabled="taskId === 0"
|
||||
:task="taskDetail"
|
||||
:load-status="taskDetail.loading === true"
|
||||
@on-update="getLogLists"/>
|
||||
</div>
|
||||
<Icon v-else class="clock" type="ios-clock-outline" @click="openTime" />
|
||||
</DatePicker>
|
||||
<Poptip
|
||||
ref="owner"
|
||||
class="subtask-avatar"
|
||||
popper-class="task-detail-user-popper"
|
||||
:title="$L('修改负责人')"
|
||||
:width="240"
|
||||
placement="bottom"
|
||||
@on-popper-show="openOwner"
|
||||
@on-ok="onOwner"
|
||||
transfer>
|
||||
<div slot="content">
|
||||
<UserInput
|
||||
v-model="ownerData.owner_userid"
|
||||
:multiple-max="10"
|
||||
:project-id="taskDetail.project_id"
|
||||
:placeholder="$L('选择任务负责人')"
|
||||
:transfer="false"
|
||||
max-hidden-select/>
|
||||
<div class="task-detail-avatar-buttons">
|
||||
<Button size="small" type="primary" @click="$refs.owner.ok()">{{$L('确定')}}</Button>
|
||||
<!-- <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>
|
||||
</div>
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<div style="display: flex;">
|
||||
<div style="margin-left: 28px;" class="item-label" slot="label">
|
||||
<i class="taskfont"></i>
|
||||
</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" />-->
|
||||
<div class="picker-time">
|
||||
<div @click="openTime" class="time sub-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>
|
||||
</DatePicker>
|
||||
</div>
|
||||
<template v-if="getOwner.length > 0">
|
||||
<UserAvatar v-for="item in getOwner" :key="item.userid" :userid="item.userid" :size="20" tooltipDisabled/>
|
||||
</template>
|
||||
<div v-else>--</div>
|
||||
</Poptip>
|
||||
<Poptip
|
||||
ref="owner"
|
||||
class="subtask-avatar"
|
||||
popper-class="task-detail-user-popper"
|
||||
:title="$L('修改负责人')"
|
||||
:width="240"
|
||||
placement="bottom"
|
||||
@on-popper-show="openOwner"
|
||||
@on-ok="onOwner"
|
||||
transfer>
|
||||
<div slot="content">
|
||||
<UserInput
|
||||
v-model="ownerData.owner_userid"
|
||||
:multiple-max="10"
|
||||
:project-id="taskDetail.project_id"
|
||||
:placeholder="$L('选择任务负责人')"
|
||||
:transfer="false"
|
||||
max-hidden-select/>
|
||||
<div class="task-detail-avatar-buttons">
|
||||
<Button size="small" type="primary" @click="$refs.owner.ok()">{{$L('确定')}}</Button>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="getOwner.length > 0">
|
||||
<UserAvatar v-for="item in getOwner" :key="item.userid" :userid="item.userid" :size="20" tooltipDisabled/>
|
||||
</template>
|
||||
<div v-else>--</div>
|
||||
</Poptip>
|
||||
</div>
|
||||
</li>
|
||||
<!--主任务-->
|
||||
<div
|
||||
@ -249,6 +265,29 @@
|
||||
<div v-else>--</div>
|
||||
</Poptip>
|
||||
</FormItem>
|
||||
<FormItem>
|
||||
<div class="item-label" slot="label">
|
||||
<i class="taskfont"></i>{{$L('可见性')}}
|
||||
</div>
|
||||
<Checkbox disabled v-model="visibility_principal" :true-value="1" :false-value="0">{{$L('项目负责人')}}</Checkbox>
|
||||
<Checkbox disabled v-model="visibility_assist" :true-value="1" :false-value="0">{{$L('项目协助人')}}</Checkbox>
|
||||
<Checkbox v-model="visibility_appoint" :true-value="1" :false-value="0">{{$L('指定人员')}}</Checkbox>
|
||||
<UserInput
|
||||
v-show="visibility_appoint"
|
||||
v-model="taskDetail.visibility_appointor"
|
||||
:placeholder="$L('选择指定人员')"
|
||||
:project-id="taskDetail.project_id"
|
||||
:transfer="false">
|
||||
<Option slot="option-prepend" :value="0" :label="$L('所有人')" >
|
||||
<div class="user-input-option">
|
||||
<div class="user-input-avatar"><EAvatar class="avatar" icon="el-icon-s-custom"/></div>
|
||||
<div class="user-input-nickname">{{ $L('所有人') }}</div>
|
||||
<div class="user-input-userid">All</div>
|
||||
</div>
|
||||
</Option>
|
||||
</UserInput>
|
||||
<Button size="small" type="primary" @click="updateVisible">{{$L('提交修改')}}</Button>
|
||||
</FormItem>
|
||||
<FormItem v-if="taskDetail.end_at || timeForce">
|
||||
<div class="item-label" slot="label">
|
||||
<i class="taskfont"></i>{{$L('截止时间')}}
|
||||
@ -334,11 +373,11 @@
|
||||
</li>
|
||||
</ul>
|
||||
</FormItem>
|
||||
<FormItem v-if="subList.length > 0 || addsubForce">
|
||||
<div v-if="subList.length > 0 || addsubForce">
|
||||
<div class="item-label" slot="label">
|
||||
<i class="taskfont"></i>{{$L('子任务')}}
|
||||
</div>
|
||||
<ul class="item-content subtask">
|
||||
<ul style="overflow: hidden;" class="item-content subtask">
|
||||
<TaskDetail
|
||||
v-for="(task, key) in subList"
|
||||
:ref="`subTask_${task.id}`"
|
||||
@ -349,7 +388,7 @@
|
||||
:can-update-blur="canUpdateBlur"/>
|
||||
</ul>
|
||||
<ul :class="['item-content', subList.length === 0 ? 'nosub' : '']">
|
||||
<li>
|
||||
<li style="margin-left: 8px;">
|
||||
<Input
|
||||
v-if="addsubShow"
|
||||
v-model="addsubName"
|
||||
@ -366,7 +405,7 @@
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</FormItem>
|
||||
</div>
|
||||
</Form>
|
||||
<div v-if="menuList.length > 0" class="add">
|
||||
<EDropdown
|
||||
@ -571,7 +610,12 @@ export default {
|
||||
{key: 'month', label: '每月'},
|
||||
{key: 'year', label: '每年'},
|
||||
{key: 'custom', label: '自定义'},
|
||||
]
|
||||
],
|
||||
|
||||
// 可见性
|
||||
visibility_principal: 1,
|
||||
visibility_assist: 1,
|
||||
visibility_appoint: 1,
|
||||
}
|
||||
},
|
||||
|
||||
@ -727,7 +771,7 @@ export default {
|
||||
if (!$A.isArray(taskDetail.task_user)) {
|
||||
return [];
|
||||
}
|
||||
return taskDetail.task_user.filter(({owner}) => owner !== 1).sort((a, b) => {
|
||||
return taskDetail.task_user.filter(({owner}) => owner === 0).sort((a, b) => {
|
||||
return a.id - b.id;
|
||||
});
|
||||
},
|
||||
@ -831,6 +875,22 @@ export default {
|
||||
this.timeValue = this.taskDetail.end_at ? [this.taskDetail.start_at, this.taskDetail.end_at] : [];
|
||||
}
|
||||
},
|
||||
'taskDetail.visibility_appointor': {
|
||||
handler(val) {
|
||||
if (val && val.length === 0) {
|
||||
this.visibility_appoint = 0;
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
'visibility_appoint': {
|
||||
handler(val) {
|
||||
if (val === 0) {
|
||||
this.taskDetail.visibility_appointor = [];
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
@ -1194,6 +1254,7 @@ export default {
|
||||
},
|
||||
|
||||
getLogLists() {
|
||||
console.log('dddd')
|
||||
if (this.navActive != 'log') {
|
||||
return;
|
||||
}
|
||||
@ -1400,6 +1461,8 @@ export default {
|
||||
},
|
||||
|
||||
openMenu(event, task) {
|
||||
console.log(event)
|
||||
console.log(task)
|
||||
const el = this.$refs[`taskMenu_${task.id}`];
|
||||
el && el.handleClick(event)
|
||||
},
|
||||
@ -1517,7 +1580,21 @@ export default {
|
||||
this.$store.dispatch('downUrl', $A.apiUrl(`project/task/filedown?file_id=${file.id}`))
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
updateVisible() {
|
||||
console.log('bbb')
|
||||
console.log(this.taskDetail.visibility_appointor)
|
||||
this.updateData('visibility_appointor')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
::v-deep .ivu-poptip-rel {
|
||||
display: flex;
|
||||
}
|
||||
::v-deep .sub-time {
|
||||
color: #BBBBBB;
|
||||
}
|
||||
</style>
|
||||
|
||||
4
resources/assets/js/store/actions.js
vendored
4
resources/assets/js/store/actions.js
vendored
@ -1819,7 +1819,9 @@ export default {
|
||||
data: post,
|
||||
method: 'post',
|
||||
}).then(result => {
|
||||
dispatch("addTaskSuccess", result.data)
|
||||
if (result.data.is_visible === 1) {
|
||||
dispatch("addTaskSuccess", result.data)
|
||||
}
|
||||
resolve(result)
|
||||
}).catch(e => {
|
||||
console.warn(e);
|
||||
|
||||
@ -19,7 +19,8 @@
|
||||
&:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 36px;
|
||||
//left: 36px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 1px;
|
||||
@ -149,9 +150,9 @@
|
||||
}
|
||||
}
|
||||
.scroller {
|
||||
margin-left: 28px;
|
||||
padding-left: 8px;
|
||||
padding-right: 36px;
|
||||
//margin-left: 28px;
|
||||
//padding-left: 8px;
|
||||
//padding-right: 36px;
|
||||
.title {
|
||||
margin-top: 18px;
|
||||
.ivu-input {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user