feat:更改可见性样式

This commit is contained in:
weifashi 2023-06-29 19:15:07 +08:00
parent 99403fad7d
commit ff2f311d43
7 changed files with 224 additions and 137 deletions

View File

@ -1668,7 +1668,7 @@ class ProjectController extends AbstractController
'column_id' => $task->column_id,
'times' => [$task->start_at, $task->end_at],
'owner' => [User::userid()],
'is_all_visible' => 0,
'is_all_visible' => 2,
]);
$data = ProjectTask::oneTask($task->id);
$projectUserid = Project::whereId($data->project_id)->value('userid');
@ -1726,7 +1726,7 @@ class ProjectController extends AbstractController
//
$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');
$data['visibility_appointor'] = $data['is_all_visible'] == 1 ? [] : ProjectTaskUser::whereTaskId($task->id)->whereOwner(2)->pluck('userid');
$task->pushMsg('update', $data);
// 可见性推送
if (Arr::exists($param, 'is_all_visible') || Arr::exists($param, 'visibility_appointor')) {
@ -1740,18 +1740,18 @@ class ProjectController extends AbstractController
$addUserIds = array_diff($newVisibleUserIds, $oldVisibleUserIds);
$task->pushMsgVisibleUpdate($data, $deleteUserIds, $addUserIds);
}
if ($data['is_all_visible'] == 0 && empty($param['visibility_appointor'])) {
if ($data['is_all_visible'] != 1 && empty($param['visibility_appointor'])) {
$task->pushMsgVisibleRemove();
}
}
if (Arr::exists($param, 'owner') && $data['is_all_visible'] == 0) {
if (Arr::exists($param, 'owner') && $data['is_all_visible'] != 1) {
$subUserids = ProjectTaskUser::whereTaskPid($data['id'])->pluck('userid')->toArray();
$diff = array_diff($owners, $param['owner'], $subUserids);
$diff = array_diff($owners, $param['owner'] ?: [], $subUserids);
if ($diff) {
$task->pushMsgVisibleRemove($diff);
}
}
if (Arr::exists($param, 'assist') && $data['is_all_visible'] == 0) {
if (Arr::exists($param, 'assist') && $data['is_all_visible'] != 1) {
$diff = array_diff($owners, $param['assist']);
if ($diff) {
$task->pushMsgVisibleRemove($diff);

View File

@ -370,18 +370,8 @@ 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;
}
}
$is_all_visible = $data['visibility_appoint'];
$visibility_userids = $data['visibility_appointor'];
//
if (ProjectTask::whereProjectId($project_id)
->whereNull('project_tasks.complete_at')
@ -686,7 +676,7 @@ class ProjectTask extends AbstractModel
foreach ($owner as $uid) {
if (intval($uid) == 0) continue;
if (!$this->project->useridInTheProject($uid)) continue;
//
// DOTO
ProjectTaskUser::updateInsert([
'task_id' => $this->id,
'userid' => $uid,
@ -716,15 +706,13 @@ class ProjectTask extends AbstractModel
$this->syncDialogUser();
}
// 可见性
if (Arr::exists($data, 'visibility_appointor') || Arr::exists($data, 'is_all_visible')) {
if ($data['is_all_visible'] == 1) {
ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => 1]);
ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete();
} elseif ( isset($data['visibility_appointor']) || $data['is_all_visible'] == 0) {
ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => 0]);
// 覆盖
ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete();
foreach ($data['visibility_appointor'] as $uid) {
if (Arr::exists($data, 'is_all_visible') || Arr::exists($data, 'visibility_appointor')) {
if(Arr::exists($data, 'is_all_visible')){
ProjectTask::whereId($data['task_id'])->update(['is_all_visible' => $data["is_all_visible"]]);
}
ProjectTaskUser::whereTaskId($data['task_id'])->whereOwner(2)->delete();
foreach ($data['visibility_appointor'] as $uid) {
if($uid){
ProjectTaskUser::createInstance([
'project_id' => $this->project_id,
'task_id' => $this->id,
@ -733,7 +721,6 @@ class ProjectTask extends AbstractModel
'owner' => 2,
])->save();
}
}
}
// 计划时间(原则:子任务时间在主任务时间内)
@ -1508,7 +1495,7 @@ class ProjectTask extends AbstractModel
$array = [];
if ($pushUserIds) {
$userids = $pushUserIds;
}elseif ($this->is_all_visible == 0) {
}elseif ($this->is_all_visible != 1) {
$userids = ProjectTaskUser::select(['userid', 'owner'])->whereTaskId($this->id)->orWhere('task_pid' , '=', $this->id)->pluck('userid')->toArray();
} else {
$userids = ProjectUser::whereProjectId($this->project_id)->pluck('userid')->toArray(); // 项目成员

View File

@ -312,6 +312,7 @@ export default {
} else {
this.searchKey = ""
}
this.$emit("showUpdate",value)
},
searchKey() {

View File

@ -93,24 +93,50 @@
</ETooltip>
</div>
</FormItem>
<FormItem :label="$L('可见性')">
<RadioGroup>
<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>
</RadioGroup>
<RadioGroup v-model="addData.is_all_visible">
<Radio :label=1>{{$L('所有人员')}}</Radio>
<Radio :label=0>{{$L('指定成员')}}</Radio>
</RadioGroup>
<UserSelect
class="item-content user"
v-show="!addData.is_all_visible"
<FormItem>
<div class="item-label" slot="label">
<EDropdown ref="eDropdownRef" trigger="click" placement="bottom" @command="dropVisible">
<span cclass="dashed-text">{{$L('可见性')}}
<i class="taskfont" style="font-size: 10px;margin-right: 0;">&#xe740;</i>
</span>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
<Icon v-if="addData.visibility_appoint == 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="addData.visibility_appoint == 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="addData.visibility_appoint == 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 ivu-input ivu-input-default ivu-input-with-suffix" v-if="addData.visibility_appoint < 3" @click="showCisibleDropdown">
<span v-if="addData.visibility_appoint == 1" class="dashed-text">{{$L('项目人员可见')}}</span>
<span v-else-if="addData.visibility_appoint == 2" class="dashed-text">{{$L('任务人员可见')}}</span>
</div>
<UserSelect v-else
ref="visibleUserSelectRef"
v-model="addData.visibility_appointor"
:avatar-size="24"
:title="$L('选择指定人员')"
:project-id="addData.project_id"
@showUpdate="visibleUserSelectShowUpdate"
border
/>
/>
</FormItem>
<div class="subtasks">
<div v-if="addData.subtasks.length > 0" class="sublist">
@ -206,10 +232,7 @@ export default {
p_name: '',
p_color: '',
//
visibility_principal: 1,
visibility_assist: 1,
visibility_appoint: 1,
is_all_visible: 1,
visibility_appointor: [],
},
@ -533,6 +556,35 @@ export default {
close() {
this.$emit("input", !this.value)
},
showCisibleDropdown(){
this.$refs.eDropdownRef.show()
},
visibleUserSelectShowUpdate(isShow){
if(!isShow && (this.addData.visibility_appointor.length == 0 || !this.addData.visibility_appointor[0])){
let old = this.addData.old_visibility_appoint;
this.addData.visibility_appoint = old > 2 ? 1 : (old || 1);
if(this.addData.visibility_appoint < 3 ){
}
}
},
dropVisible(command) {
switch (command) {
case 1:
case 2:
this.addData.visibility_appoint = command
break;
case 3:
this.addData.old_visibility_appoint = this.addData.visibility_appoint
this.addData.visibility_appoint = command
this.$nextTick(() => {
this.$refs.visibleUserSelectRef.onSelection()
});
break;
}
},
}
}
</script>

View File

@ -114,10 +114,8 @@ export default {
p_name: '',
p_color: '',
//
visibility_principal: 1,
visibility_assist: 1,
visibility_appoint: 1,
visibility_appointor: [0],
visibility_appointor: [],
},
active: false,
@ -223,10 +221,8 @@ export default {
p_name: '',
p_color: '',
//
visibility_principal: 1,
visibility_assist: 1,
visibility_appoint: 1,
visibility_appointor: [0],
visibility_appointor: [],
}
}).catch(({msg}) => {
$A.modalError(msg);

View File

@ -1,71 +1,56 @@
<template>
<!--子任务-->
<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>
<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>
<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 style="display: flex;justify-content: space-between;">
<div style="display: flex;">
<div style="margin-left: 28px;" class="item-label" slot="label">
<i class="taskfont">&#xe6e8;</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">&#xe71d;</i>{{expiresFormat(taskDetail.end_at)}}</Tag>-->
<!-- <Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag>-->
<!-- </template>-->
</div>
</DatePicker>
</div>
<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"/>
<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 style="min-width: 80px;"
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
@ -218,25 +203,47 @@
</FormItem>
<FormItem>
<div class="item-label" slot="label">
<i class="taskfont">&#xe63f;</i>{{$L('可见性')}}
<i class="taskfont">&#xe77b;</i>
<EDropdown ref="eDropdownRef" trigger="click" placement="bottom" @command="dropVisible">
<span cclass="dashed-text" style="color: #bbbbbb; ">{{$L('可见性')}}
<i class="taskfont" style="font-size: 10px;margin-right: 0;">&#xe740;</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">
<RadioGroup >
<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>
</RadioGroup>
<RadioGroup v-model="taskDetail.is_all_visible">
<Radio :label=1>{{$L('所有人员')}}</Radio>
<Radio :label=0>{{$L('指定成员')}}</Radio>
</RadioGroup>
<UserSelect
v-show="!taskDetail.is_all_visible"
<span @click="showCisibleDropdown" v-if="taskDetail.is_all_visible == 1" class="dashed-text">{{$L('项目人员可见')}}</span>
<span @click="showCisibleDropdown" v-else-if="taskDetail.is_all_visible == 2" class="dashed-text">{{$L('任务人员可见')}}</span>
<UserSelect v-else
ref="visibleUserSelectRef"
v-model="taskDetail.visibility_appointor"
:avatar-size="28"
:title="$L('选择指定人员')"
:project-id="taskDetail.project_id"
/>
<Button size="small" type="primary" @click="updateVisible">{{$L('提交修改')}}</Button>
@showUpdate="visibleUserSelectShowUpdate"
/>
</div>
</FormItem>
<FormItem v-if="taskDetail.end_at || timeForce">
@ -324,11 +331,11 @@
</li>
</ul>
</FormItem>
<div v-if="subList.length > 0 || addsubForce">
<FormItem v-if="subList.length > 0 || addsubForce">
<div class="item-label" slot="label">
<i class="taskfont">&#xe6f0;</i>{{$L('子任务')}}
</div>
<ul style="overflow: hidden;" class="item-content subtask">
<ul class="item-content subtask">
<TaskDetail
v-for="(task, key) in subList"
:ref="`subTask_${task.id}`"
@ -356,7 +363,7 @@
</div>
</li>
</ul>
</div>
</FormItem>
</Form>
<div v-if="menuList.length > 0" class="add">
<EDropdown
@ -566,11 +573,6 @@ export default {
{key: 'year', label: '每年'},
{key: 'custom', label: '自定义'},
],
//
visibility_principal: 1,
visibility_assist: 1,
visibility_appoint: 1,
}
},
@ -845,6 +847,15 @@ export default {
this.timeValue = this.taskDetail.end_at ? [this.taskDetail.start_at, this.taskDetail.end_at] : [];
}
},
"taskDetail.visibility_appointor": {
handler(arr) {
if(arr?.length > 0 && arr[0]) {
this.taskDetail.is_all_visible = 3
this.updateVisible()
}
},
immediate: true
},
},
methods: {
@ -1535,6 +1546,37 @@ export default {
});
},
showCisibleDropdown(){
this.$refs.eDropdownRef.show()
},
visibleUserSelectShowUpdate(isShow){
if(!isShow && (this.taskDetail.visibility_appointor.length == 0 || !this.taskDetail.visibility_appointor[0])){
let old = this.taskDetail.old_is_all_visible;
this.taskDetail.is_all_visible = old > 2 ? 1 : (old || 1);
if(this.taskDetail.is_all_visible < 3 ){
this.updateVisible();
}
}
},
dropVisible(command) {
switch (command) {
case 1:
case 2:
this.taskDetail.is_all_visible = command
this.updateVisible();
break;
case 3:
this.taskDetail.old_is_all_visible = this.taskDetail.is_all_visible
this.taskDetail.is_all_visible = command
this.$nextTick(() => {
this.$refs.visibleUserSelectRef.onSelection()
});
break;
}
},
updateVisible() {
this.updateData(['is_all_visible', 'visibility_appointor'])
}
@ -1548,4 +1590,12 @@ export default {
::v-deep .sub-time {
color: #BBBBBB;
}
.dashed-text{
cursor: pointer;
border-bottom: 1px dashed #acacac;
}
.dashed-text .taskfont{
font-size: 10px;
margin-right: 0;
}
</style>

View File

@ -340,6 +340,7 @@
}
.subtask-flow {
> span {
white-space: nowrap;
font-size: 12px;
height: 18px;
min-width: 20px;