perf: 优化任务修改

This commit is contained in:
kuaifan 2023-12-22 11:09:43 +08:00
parent 15e37eded3
commit c1695a78d6
2 changed files with 116 additions and 102 deletions

View File

@ -122,7 +122,7 @@
</div>
</div>
</div>
<Scrollbar class="scroller">
<Scrollbar ref="scroller" class="scroller">
<div class="title">
<Input
v-model="taskDetail.name"
@ -200,62 +200,10 @@
<FormItem v-if="taskDetail.visibility > 1 || visibleForce || visibleKeep">
<div class="item-label" slot="label">
<i class="taskfont">&#xe77b;</i>
<EDropdown ref="eDropdownRef" trigger="click" placement="bottom" @command="dropVisible">
<span class="visibility-text color">{{$L('可见性')}}
<i class="taskfont">&#xe740;</i>
</span>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
<Icon v-if="taskDetail.visibility == 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.visibility == 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.visibility == 3" class="completed" :type="'md-checkmark-circle'"/>
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
{{$L('指定成员')}}
</div>
</EDropdownItem>
</EDropdownMenu>
</EDropdown>
<span class="visibility-text color" @click="showCisibleDropdown">{{$L('可见性')}} <i class="taskfont">&#xe740;</i></span>
</div>
<div class="item-content user">
<EDropdown v-if="taskDetail.visibility == 1 || taskDetail.visibility == 2" trigger="click" placement="bottom" @command="dropVisible">
<span class="visibility-text">{{ taskDetail.visibility == 1 ? $L('项目人员可见') : $L('任务人员可见') }}</span>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
<Icon v-if="taskDetail.visibility == 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.visibility == 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.visibility == 3" class="completed" :type="'md-checkmark-circle'"/>
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
{{$L('指定成员')}}
</div>
</EDropdownItem>
</EDropdownMenu>
</EDropdown>
<span v-if="taskDetail.visibility == 1 || taskDetail.visibility == 2" ref="visibilityText" class="visibility-text" @click="showCisibleDropdown">{{ taskDetail.visibility == 1 ? $L('项目人员可见') : $L('任务人员可见') }}</span>
<UserSelect v-else
ref="visibleUserSelectRef"
v-model="taskDetail.visibility_appointor"
@ -270,21 +218,7 @@
<div class="item-label" slot="label">
<i class="taskfont">&#xe6e8;</i>
<span v-if="!taskDetail.end_at" @click="timeOpen = true" class="visibility-text color">{{$L('截止时间')}}</span>
<EDropdown v-else ref="eDeadlineRef" trigger="click" placement="bottom" @command="dropDeadline">
<span class="visibility-text color">{{$L('截止时间')}}</span>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
{{$L('任务延期')}}
</div>
</EDropdownItem>
<EDropdownItem :command="2">
<div class="task-menu-icon" >
{{$L('修改时间')}}
</div>
</EDropdownItem>
</EDropdownMenu>
</EDropdown>
<span v-else class="visibility-text color" @click="showAtDropdown">{{$L('截止时间')}}</span>
</div>
<ul class="item-content">
<li>
@ -302,21 +236,7 @@
transfer>
<div class="picker-time">
<div v-if="!taskDetail.end_at" @click="timeOpen = true" class="time">{{taskDetail.end_at ? cutTime : '--'}}</div>
<EDropdown v-else ref="eDeadlineRef" trigger="click" placement="bottom" @command="dropDeadline">
<div @click="timeOpen = false" class="time">{{taskDetail.end_at ? cutTime : '--'}}</div>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
{{$L('任务延期')}}
</div>
</EDropdownItem>
<EDropdownItem :command="2">
<div class="task-menu-icon" >
{{$L('修改时间')}}
</div>
</EDropdownItem>
</EDropdownMenu>
</EDropdown>
<div v-else @click="showAtDropdown" 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">&#xe71d;</i>{{expiresFormat(taskDetail.end_at)}}</Tag>
<Tag v-if="isOverdue(taskDetail)" color="red">{{$L('超期未完成')}}</Tag>
@ -440,6 +360,47 @@
</EDropdownMenu>
</EDropdown>
</div>
<EDropdown ref="eDropdownRef" class="calculate-dropdown" trigger="click" placement="bottom" @command="dropVisible">
<div class="calculate-content"></div>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
<Icon v-if="taskDetail.visibility == 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.visibility == 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.visibility == 3" class="completed" :type="'md-checkmark-circle'"/>
<Icon v-else class="uncomplete" :type="'md-radio-button-off'"/>
{{$L('指定成员')}}
</div>
</EDropdownItem>
</EDropdownMenu>
</EDropdown>
<EDropdown ref="eDeadlineRef" class="calculate-dropdown" trigger="click" placement="bottom" @command="dropDeadline">
<div class="calculate-content"></div>
<EDropdownMenu slot="dropdown">
<EDropdownItem :command="1">
<div class="task-menu-icon" >
{{$L('任务延期')}}
</div>
</EDropdownItem>
<EDropdownItem :command="2">
<div class="task-menu-icon" >
{{$L('修改时间')}}
</div>
</EDropdownItem>
</EDropdownMenu>
</EDropdown>
</Scrollbar>
<TaskUpload ref="upload" class="upload" @on-select-file="onSelectFile"/>
</div>
@ -517,8 +478,7 @@
:styles="{
width: '90%',
maxWidth: '450px'
}"
>
}">
<Form ref="formDelayTaskRef" :model="delayTaskForm" :rules="delayTaskRule" label-position="left" label-width="auto" @submit.native.prevent>
<FormItem :label="$L('延期时长')" prop="time">
<Input type="number" v-model="delayTaskForm.time" :placeholder="$L('请输入时长')" >
@ -1093,7 +1053,8 @@ export default {
case 'content':
const content = this.$refs.desc.getContent();
if (content == this.taskContent) {
if (content == this.taskContent.replace(/\s+original-(width|height)="[^"]*"/g, "")) {
console.log(111);
return;
}
if (this.windowTouch) {
@ -1101,31 +1062,24 @@ export default {
title: '温馨提示',
content: '是否保存编辑内容?',
onOk: () => {
this.updateData("contentSave", params)
this.updateData("contentSave", {content})
},
onCancel: () => {
this.$refs.desc.updateContent(this.taskContent);
}
});
} else {
this.updateData("contentSave", params)
this.updateData("contentSave", {content})
}
return;
case 'contentSave':
const contentSave = this.$refs.desc.getContent();
if (contentSave == this.taskContent) {
return;
}
if (contentSave == this.taskContent.replace(/original-width="[^"]*"/g, "").replace(/original-height="[^"]*"/g, "").replace(/\" \//g, "\" /")) {
return;
}
this.$set(this.taskDetail, 'content', contentSave)
this.$set(this.taskDetail, 'content', params.content)
action = 'content';
successCallback = () => {
this.$store.dispatch("saveTaskContent", {
task_id: this.taskId,
content: contentSave
content: params.content
})
}
break;
@ -1392,7 +1346,7 @@ export default {
case 'visible':
this.visibleForce = true;
this.$nextTick(() => {
this.showCisibleDropdown();
this.showCisibleDropdown(null);
});
break;
@ -1699,8 +1653,47 @@ export default {
});
},
showCisibleDropdown(){
this.$refs.eDropdownRef.show()
showCisibleDropdown(e){
let eRect = null
if (e === null) {
eRect = this.$refs.visibilityText?.getBoundingClientRect()
} else {
eRect = e.target.getBoundingClientRect()
}
if (eRect === null) {
return
}
const boxRect = this.$refs.scroller.$el.getBoundingClientRect()
const refEl = this.$refs.eDropdownRef.$el
refEl.style.top = (eRect.top - boxRect.top) + 'px'
refEl.style.left = (eRect.left - boxRect.left) + 'px'
refEl.style.width = eRect.width + 'px'
refEl.style.height = eRect.height + 'px'
//
if (this.$refs.eDropdownRef.visible) {
this.$refs.eDropdownRef.hide()
}
setTimeout(() => {
this.$refs.eDropdownRef.show()
}, 0)
},
showAtDropdown({target}){
this.timeOpen = false
const eRect = target.getBoundingClientRect()
const boxRect = this.$refs.scroller.$el.getBoundingClientRect()
const refEl = this.$refs.eDeadlineRef.$el
refEl.style.top = (eRect.top - boxRect.top) + 'px'
refEl.style.left = (eRect.left - boxRect.left) + 'px'
refEl.style.width = eRect.width + 'px'
refEl.style.height = eRect.height + 'px'
//
if (this.$refs.eDeadlineRef.visible) {
this.$refs.eDeadlineRef.hide()
}
setTimeout(() => {
this.$refs.eDeadlineRef.show()
}, 0)
},
visibleUserSelectShowChange(isShow){

View File

@ -508,6 +508,27 @@
color: $primary-desc-color;
}
}
.calculate-dropdown {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 0;
height: 0;
z-index: -1;
pointer-events: none;
.calculate-content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
}
}
}
.upload {
display: none;