perf: 添加任务模板

This commit is contained in:
kuaifan 2024-12-01 22:48:12 +08:00
parent 902844e008
commit 74fecdd941
4 changed files with 64 additions and 44 deletions

View File

@ -2762,8 +2762,8 @@ class ProjectController extends AbstractController
if (empty($name)) {
return Base::retError('请输入模板名称');
}
if (empty($title)) {
return Base::retError('请输入任务标题');
if (empty($title) && empty($content)) {
return Base::retError('请输入任务标题或内容');
}
$data = [
'project_id' => $projectId,
@ -2823,7 +2823,7 @@ class ProjectController extends AbstractController
}
/**
* @api {get} api/project/task/template_default 50. 设置任务模板为默认
* @api {get} api/project/task/template_default 50. 设置(取消)任务模板为默认
*
* @apiDescription 需要token身份项目负责人
* @apiVersion 1.0.0
@ -2854,9 +2854,12 @@ class ProjectController extends AbstractController
if (!$template) {
return Base::retError('模板不存在或已被删除');
}
// 先将所有模板设为非默认
if ($template->is_default) {
$template->update(['is_default' => false]);
return Base::retSuccess('取消成功');
}
//
ProjectTaskTemplate::where('project_id', $projectId)->update(['is_default' => false]);
// 设置当前模板为默认
$template->update(['is_default' => true]);
return Base::retSuccess('设置成功');
}

View File

@ -21,8 +21,8 @@
<span v-if="item.is_default" class="default-tag">{{$L('默认')}}</span>
</div>
<div class="template-content">
<div class="task-title">{{ item.title }}</div>
<div class="task-content">
<div v-if="item.title" class="task-title">{{ item.title }}</div>
<div v-if="item.content" class="task-content">
<VMPreviewNostyle ref="descPreview" :value="item.content"/>
</div>
</div>
@ -96,9 +96,6 @@ export default {
formRules: {
name: [
{ required: true, message: this.$L('请输入模板名称'), trigger: 'blur' }
],
title: [
{ required: true, message: this.$L('请输入任务标题'), trigger: 'blur' }
]
}
}
@ -135,7 +132,7 @@ export default {
})
this.templates = data || []
} catch ({msg}) {
this.$Message.error(msg || this.$L('加载模板失败'))
$A.messageError(msg || '加载模板失败')
}
this.loading = false
},
@ -155,7 +152,7 @@ export default {
//
async handleSave() {
if (!this.editingTemplate.name) {
this.$Message.warning(this.$L('请输入模板名称'))
$A.messageWarning('请输入模板名称')
return
}
@ -166,19 +163,19 @@ export default {
method: 'post',
spinner: 300
})
this.$Message.success(this.$L('保存成功'))
$A.messageSuccess('保存成功')
this.showEditModal = false
this.loadTemplates()
} catch ({msg}) {
this.$Message.error(msg || this.$L('保存失败'))
$A.messageError(msg || '保存失败')
}
},
//
async handleDelete(template) {
this.$Modal.confirm({
title: this.$L('确认删除'),
content: this.$L('确定要删除该模板吗?'),
$A.modalConfirm({
title: '确认删除',
content: '确定要删除该模板吗?',
onOk: async () => {
try {
await this.$store.dispatch("call", {
@ -188,10 +185,10 @@ export default {
},
spinner: 300
})
this.$Message.success(this.$L('删除成功'))
$A.messageSuccess('删除成功')
this.loadTemplates()
} catch ({msg}) {
this.$Message.error(msg || this.$L('删除失败'))
$A.messageError(msg || '删除失败')
}
}
})
@ -199,10 +196,6 @@ export default {
//
async handleSetDefault(template) {
if (template.is_default) {
return
}
try {
await this.$store.dispatch("call", {
url: 'project/task/template_default',
@ -212,10 +205,10 @@ export default {
},
spinner: 300
})
this.$Message.success(this.$L('设置成功'))
$A.messageSuccess('设置成功')
this.loadTemplates()
} catch ({msg}) {
this.$Message.error(msg || this.$L('设置失败'))
$A.messageError(msg || '设置失败')
}
}
}

View File

@ -13,7 +13,11 @@
filterable/>
</div>
<ul v-if="taskTemplateList.length > 0" class="task-add-template">
<li v-for="item in taskTemplateList" :key="item.id" @click="setTaskTemplate(item)">
<li
v-for="item in taskTemplateList"
:key="item.id"
:class="{active:templateActiveID === item.id}"
@click="setTaskTemplate(item)">
{{ item.name }}
</li>
</ul>
@ -268,7 +272,10 @@ export default {
beforeClose: [],
addContinue: false
addContinue: false,
templateActiveID: 0,
templateCompareData: {name: '', content: ''},
}
},
@ -279,7 +286,10 @@ export default {
async mounted() {
this.initCascaderData();
await this.initProjectData();
this.$nextTick(() => this.$refs.input.focus())
this.$nextTick(() => {
this.$refs.input.focus();
this.templateCompareData = {name: this.addData.name, content: this.addData.content};
})
this.isMounted = true
},
@ -325,12 +335,7 @@ export default {
'addData.project_id'(projectId) {
if (projectId > 0) {
$A.IDBSave("cacheAddTaskProjectId", projectId);
this.$store.dispatch("updateTaskTemplates", projectId).then(() => {
const defaultTemplate = this.taskTemplateList.find(({is_default}) => is_default);
if (defaultTemplate) {
this.setTaskTemplate(defaultTemplate);
}
})
this.$store.dispatch("updateTaskTemplates", projectId).then(this.setTaskDefaultTemplate)
}
},
'addData.column_id'(columnId) {
@ -555,11 +560,7 @@ export default {
this.$store.dispatch("taskAdd", this.addData).then(({msg}) => {
$A.messageSuccess(msg);
if (continued === true) {
this.addData = Object.assign({}, this.addData, {
name: "",
content: "",
subtasks: [],
});
this.addData = Object.assign({}, this.addData, this.templateCompareData, {subtasks: []});
this.$refs.input.focus();
} else {
this.addData = $A.cloneJSON(this.addDefault);
@ -626,11 +627,33 @@ export default {
}
},
setTaskTemplate(item) {
this.addData.name = item.title
this.addData.content = nostyle(item.content, {
sanitize: false,
setTaskTemplate(item, force = false) {
if (force) {
this.templateActiveID = item.id;
this.addData.name = item.name;
this.addData.content = nostyle(item.content, {sanitize: false});
this.$nextTick(() => {
this.$refs.input.focus();
this.templateCompareData = {name: this.addData.name, content: this.addData.content};
});
return;
}
if ((this.addData.name !== this.templateCompareData.name && this.addData.name !== '') ||
(this.addData.content !== this.templateCompareData.content && this.addData.content !== '')) {
$A.modalConfirm({
content: '当前已有修改的内容,是否要覆盖?',
onOk: () => this.setTaskTemplate(item, true)
});
} else {
this.setTaskTemplate(item, true);
}
},
setTaskDefaultTemplate() {
const defaultTemplate = this.taskTemplateList.find(({is_default}) => is_default);
if (defaultTemplate) {
this.setTaskTemplate(defaultTemplate);
}
}
}
}

View File

@ -53,6 +53,7 @@
.template-title {
font-weight: 500;
margin-bottom: 8px;
height: 22px;
display: flex;
align-items: center;
color: $primary-title-color;