From 08826e6236cf0979032aa1292cccf9013d4136da Mon Sep 17 00:00:00 2001 From: song-cc-rock Date: Wed, 10 Apr 2024 18:43:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=BC=BA=E9=99=B7=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=BA=E9=99=B7=E6=9B=B4=E6=96=B0=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1038739 --user=宋昌昌 【缺陷管理】优化更新缺陷刷新方式 https://www.tapd.cn/55049933/s/1491966 --bug=1038537 --user=宋昌昌 【项目管理】添加文件提示和逻辑优化 https://www.tapd.cn/55049933/s/1493052 --bug=1039006 --user=宋昌昌 【项目管理】项目与权限-应用设置-用例管理-关联需求输入错误的key提示优化 https://www.tapd.cn/55049933/s/1493115 --- .../main/resources/i18n/project.properties | 2 + .../resources/i18n/project_en_US.properties | 2 + .../resources/i18n/project_zh_CN.properties | 2 + .../resources/i18n/project_zh_TW.properties | 2 + .../bug/service/BugSyncNoticeService.java | 10 +- .../service/NoticeTemplateService.java | 20 +- .../metersphere/system/dto/BugMessageDTO.java | 44 +++ .../metersphere/system/dto/BugNoticeDTO.java | 34 +-- .../system/dto/BugSyncNoticeDTO.java | 35 +-- .../notice/utils/MessageTemplateUtils.java | 4 +- .../system/service/MessageDetailService.java | 7 +- frontend/src/auto-import.d.ts | 1 - .../business/ms-detail-drawer/index.vue | 9 +- .../business/ms-prev-next-button/index.vue | 5 +- .../pure/ms-form-create/ms-form-create.vue | 29 +- .../components/pure/ms-upload/fileList.vue | 10 +- .../components/bug-detail-drawer.vue | 273 +++++++++--------- .../components/bugDetailTab.vue | 3 +- frontend/src/views/bug-management/edit.vue | 9 +- frontend/src/views/bug-management/utils.ts | 1 + .../components/caseTemplateDetail.vue | 12 +- .../menuManagement/components/relatedCase.vue | 6 +- .../menuManagement/locale/en-US.ts | 2 + .../menuManagement/locale/zh-CN.ts | 2 + 24 files changed, 285 insertions(+), 239 deletions(-) create mode 100644 backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugMessageDTO.java diff --git a/backend/framework/sdk/src/main/resources/i18n/project.properties b/backend/framework/sdk/src/main/resources/i18n/project.properties index 9044ff3827..2a21f71202 100644 --- a/backend/framework/sdk/src/main/resources/i18n/project.properties +++ b/backend/framework/sdk/src/main/resources/i18n/project.properties @@ -432,6 +432,8 @@ message.domain.bug_updateTime=更新时间 message.domain.bug_deleteUser=删除人 message.domain.bug_deleteTime=删除时间 message.domain.bug_handleUser=处理人 +message.domain.bug_sync_platform=同步平台 +message.domain.bug_sync_total_count=同步数量 #UI message.domain.ui_name=场景名称 message.domain.ui_level=用例等级 diff --git a/backend/framework/sdk/src/main/resources/i18n/project_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/project_en_US.properties index 7ff3b9f32f..058f36c40f 100644 --- a/backend/framework/sdk/src/main/resources/i18n/project_en_US.properties +++ b/backend/framework/sdk/src/main/resources/i18n/project_en_US.properties @@ -468,6 +468,8 @@ message.domain.bug_updateTime=Update time message.domain.bug_deleteUser=Delete user message.domain.bug_deleteTime=Delete time message.domain.bug_handleUser=Processor +message.domain.bug_sync_platform=Platform +message.domain.bug_sync_total_count=Total #UI message.domain.ui_name=Scenario name message.domain.ui_level=Case level diff --git a/backend/framework/sdk/src/main/resources/i18n/project_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/project_zh_CN.properties index 04d747539c..84a4f3c62b 100644 --- a/backend/framework/sdk/src/main/resources/i18n/project_zh_CN.properties +++ b/backend/framework/sdk/src/main/resources/i18n/project_zh_CN.properties @@ -467,6 +467,8 @@ message.domain.bug_updateTime=更新时间 message.domain.bug_deleteUser=删除人 message.domain.bug_deleteTime=删除时间 message.domain.bug_handleUser=处理人 +message.domain.bug_sync_platform=同步平台 +message.domain.bug_sync_total_count=同步数量 #UI message.domain.ui_name=场景名称 message.domain.ui_level=用例等级 diff --git a/backend/framework/sdk/src/main/resources/i18n/project_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/project_zh_TW.properties index d8346c7976..b2d650fb53 100644 --- a/backend/framework/sdk/src/main/resources/i18n/project_zh_TW.properties +++ b/backend/framework/sdk/src/main/resources/i18n/project_zh_TW.properties @@ -468,6 +468,8 @@ message.domain.bug_updateTime=更新時間 message.domain.bug_deleteUser=刪除人 message.domain.bug_deleteTime=刪除時間 message.domain.bug_handleUser=處理人 +message.domain.bug_sync_platform=同步平臺 +message.domain.bug_sync_total_count=同步數量 #UI message.domain.ui_name=場景名稱 message.domain.ui_level=用例等級 diff --git a/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugSyncNoticeService.java b/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugSyncNoticeService.java index 1633256227..505f0a00ef 100644 --- a/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugSyncNoticeService.java +++ b/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugSyncNoticeService.java @@ -1,5 +1,6 @@ package io.metersphere.bug.service; +import io.metersphere.project.service.ProjectApplicationService; import io.metersphere.system.domain.User; import io.metersphere.system.mapper.UserMapper; import io.metersphere.system.notice.NoticeModel; @@ -23,19 +24,24 @@ public class BugSyncNoticeService { @Resource private NoticeSendService noticeSendService; + @Resource + private ProjectApplicationService projectApplicationService; + public void sendNotice(int total, String currentUser, String language, String projectId) { + String platformName = projectApplicationService.getPlatformName(projectId); User user = userMapper.selectByPrimaryKey(currentUser); Map defaultTemplateMap = MessageTemplateUtils.getDefaultTemplateMap(); String template = defaultTemplateMap.get(NoticeConstants.TemplateText.BUG_SYNC_TASK_EXECUTE_COMPLETED); Map defaultSubjectMap = MessageTemplateUtils.getDefaultTemplateSubjectMap(); String subject = defaultSubjectMap.get(NoticeConstants.TemplateText.BUG_SYNC_TASK_EXECUTE_COMPLETED); // ${OPERATOR}同步了${total}条缺陷 - Map paramMap = new HashMap<>(3); + Map paramMap = new HashMap<>(4); paramMap.put(NoticeConstants.RelatedUser.OPERATOR, user.getName()); paramMap.put("total", total); paramMap.put("projectId", projectId); paramMap.put("Language", language); - NoticeModel noticeModel = NoticeModel.builder().operator(currentUser) + paramMap.put("platform", platformName); + NoticeModel noticeModel = NoticeModel.builder().operator(currentUser).excludeSelf(false) .context(template).subject(subject).paramMap(paramMap).event(NoticeConstants.Event.EXECUTE_COMPLETED).build(); noticeSendService.send(NoticeConstants.TaskType.BUG_SYNC_TASK, noticeModel); } diff --git a/backend/services/project-management/src/main/java/io/metersphere/project/service/NoticeTemplateService.java b/backend/services/project-management/src/main/java/io/metersphere/project/service/NoticeTemplateService.java index dacb9e985c..4b5f5e4d47 100644 --- a/backend/services/project-management/src/main/java/io/metersphere/project/service/NoticeTemplateService.java +++ b/backend/services/project-management/src/main/java/io/metersphere/project/service/NoticeTemplateService.java @@ -10,7 +10,10 @@ import io.metersphere.sdk.util.Translator; import io.metersphere.system.domain.CustomField; import io.metersphere.system.domain.CustomFieldExample; import io.metersphere.system.domain.Schedule; -import io.metersphere.system.dto.BugNoticeDTO; +import io.metersphere.system.dto.BugMessageDTO; +import io.metersphere.system.dto.BugSyncNoticeDTO; +import io.metersphere.system.dto.request.DefaultBugCustomField; +import io.metersphere.system.dto.request.DefaultFunctionalCustomField; import io.metersphere.system.dto.sdk.ApiDefinitionCaseDTO; import io.metersphere.system.dto.sdk.ApiScenarioMessageDTO; import io.metersphere.system.dto.sdk.FunctionalCaseMessageDTO; @@ -71,11 +74,16 @@ public class NoticeTemplateService { //TODO:获取报告 } case NoticeConstants.TaskType.BUG_TASK -> { - Field[] allFields = FieldUtils.getAllFields(BugNoticeDTO.class); + Field[] allFields = FieldUtils.getAllFields(BugMessageDTO.class); addOptionDto(messageTemplateFieldDTOList, allFields, null); addCustomFiled(messageTemplateFieldDTOList, projectId, TemplateScene.BUG.toString()); //TODO:获取报告 } + case NoticeConstants.TaskType.BUG_SYNC_TASK -> { + Field[] allFields = FieldUtils.getAllFields(BugSyncNoticeDTO.class); + addOptionDto(messageTemplateFieldDTOList, allFields, null); + //TODO:获取报告 + } case NoticeConstants.TaskType.UI_SCENARIO_TASK -> { Field[] allFields = FieldUtils.getAllFields(UiScenario.class); addOptionDto(messageTemplateFieldDTOList, allFields, "ui_"); @@ -120,7 +128,13 @@ public class NoticeTemplateService { for (CustomField customField : customFields) { MessageTemplateFieldDTO messageTemplateFieldDTO = new MessageTemplateFieldDTO(); messageTemplateFieldDTO.setId(customField.getName()); - messageTemplateFieldDTO.setName(StringUtils.isBlank(customField.getRemark()) ? "-" : customField.getRemark()); + if (StringUtils.equalsAnyIgnoreCase(customField.getName(), + DefaultBugCustomField.DEGREE.getName(), DefaultFunctionalCustomField.PRIORITY.getName())) { + // 缺陷严重程度, 用例等级 作为系统内置的自定义字段需要国际化后在模板展示 + messageTemplateFieldDTO.setName(Translator.get("custom_field." + customField.getName())); + } else { + messageTemplateFieldDTO.setName(customField.getName()); + } messageTemplateFieldDTO.setFieldSource(NoticeConstants.FieldSource.CUSTOM_FIELD); messageTemplateFieldDTOS.add(messageTemplateFieldDTO); } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugMessageDTO.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugMessageDTO.java new file mode 100644 index 0000000000..ea138ed3f5 --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugMessageDTO.java @@ -0,0 +1,44 @@ +package io.metersphere.system.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BugMessageDTO { + + @Schema(description ="message.domain.bug_num") + private String id; + + @Schema(description ="message.domain.bug_title") + private String title; + + @Schema(description ="message.domain.bug_handleUser") + private String handleUser; + + @Schema(description ="message.domain.bug_status") + private String status; + + @Schema(description = "message.domain.bug_createUser") + private String createUser; + + @Schema(description = "message.domain.bug_updateUser") + private String updateUser; + + @Schema(description = "message.domain.bug_deleteUser") + private String deleteUser; + + @Schema(description = "message.domain.bug_createTime") + private Long createTime; + + @Schema(description = "message.domain.bug_updateTime") + private Long updateTime; + + @Schema(description = "message.domain.bug_deleteTime") + private Long deleteTime; +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugNoticeDTO.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugNoticeDTO.java index bc7312b894..f7564e9b23 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugNoticeDTO.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugNoticeDTO.java @@ -3,47 +3,15 @@ package io.metersphere.system.dto; import io.metersphere.system.dto.sdk.OptionDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @Data -@Builder @NoArgsConstructor @AllArgsConstructor -public class BugNoticeDTO { - - @Schema(description ="message.domain.bug_num") - private String id; - - @Schema(description ="message.domain.bug_title") - private String title; - - @Schema(description ="message.domain.bug_handleUser") - private String handleUser; - - @Schema(description ="message.domain.bug_status") - private String status; - - @Schema(description = "message.domain.bug_createUser") - private String createUser; - - @Schema(description = "message.domain.bug_updateUser") - private String updateUser; - - @Schema(description = "message.domain.bug_deleteUser") - private String deleteUser; - - @Schema(description = "message.domain.bug_createTime") - private Long createTime; - - @Schema(description = "message.domain.bug_updateTime") - private Long updateTime; - - @Schema(description = "message.domain.bug_deleteTime") - private Long deleteTime; +public class BugNoticeDTO extends BugMessageDTO{ @Schema(description = "自定义字段内容") private List customFields; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugSyncNoticeDTO.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugSyncNoticeDTO.java index f24e00a9b3..40240b6b5d 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugSyncNoticeDTO.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/BugSyncNoticeDTO.java @@ -1,47 +1,20 @@ package io.metersphere.system.dto; -import io.metersphere.system.dto.sdk.OptionDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - @Data @Builder @NoArgsConstructor @AllArgsConstructor public class BugSyncNoticeDTO { - @Schema(description ="message.domain.bug_title") - private String title; + @Schema(description ="message.domain.bug_sync_platform") + private String platform; - @Schema(description ="message.domain.bug_handleUser") - private String handleUser; - - @Schema(description ="message.domain.bug_status") - private String status; - - @Schema(description = "message.domain.bug_createUser") - private String createUser; - - @Schema(description = "message.domain.bug_updateUser") - private String updateUser; - - @Schema(description = "message.domain.bug_deleteUser") - private String deleteUser; - - @Schema(description = "message.domain.bug_createTime") - private Long createTime; - - @Schema(description = "message.domain.bug_updateTime") - private Long updateTime; - - @Schema(description = "message.domain.bug_deleteTime") - private Long deleteTime; - - @Schema(description = "自定义字段内容") - private List customFields; + @Schema(description ="message.domain.bug_sync_total_count") + private Integer total; } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/notice/utils/MessageTemplateUtils.java b/backend/services/system-setting/src/main/java/io/metersphere/system/notice/utils/MessageTemplateUtils.java index 10abe12bf2..6a2d6622d7 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/notice/utils/MessageTemplateUtils.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/notice/utils/MessageTemplateUtils.java @@ -6,7 +6,7 @@ import io.metersphere.load.domain.LoadTest; import io.metersphere.plan.domain.TestPlan; import io.metersphere.sdk.util.Translator; import io.metersphere.system.domain.Schedule; -import io.metersphere.system.dto.BugNoticeDTO; +import io.metersphere.system.dto.BugMessageDTO; import io.metersphere.system.dto.sdk.ApiDefinitionCaseDTO; import io.metersphere.system.dto.sdk.FunctionalCaseMessageDTO; import io.metersphere.system.notice.constants.NoticeConstants; @@ -153,7 +153,7 @@ public class MessageTemplateUtils { allFields = FieldUtils.getAllFields(FunctionalCaseMessageDTO.class); } case NoticeConstants.TaskType.BUG_TASK -> { - allFields = FieldUtils.getAllFields(BugNoticeDTO.class); + allFields = FieldUtils.getAllFields(BugMessageDTO.class); } case NoticeConstants.TaskType.UI_SCENARIO_TASK -> { allFields = FieldUtils.getAllFields(UiScenario.class); diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/MessageDetailService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/MessageDetailService.java index 3f8ab40c2f..7a1ea31958 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/MessageDetailService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/MessageDetailService.java @@ -4,8 +4,8 @@ import io.metersphere.project.domain.*; import io.metersphere.project.mapper.MessageTaskBlobMapper; import io.metersphere.project.mapper.MessageTaskMapper; import io.metersphere.project.mapper.ProjectRobotMapper; -import io.metersphere.system.notice.MessageDetail; import io.metersphere.sdk.util.LogUtils; +import io.metersphere.system.notice.MessageDetail; import io.metersphere.system.notice.utils.MessageTemplateUtils; import jakarta.annotation.Resource; import org.apache.commons.collections.CollectionUtils; @@ -13,7 +13,10 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** diff --git a/frontend/src/auto-import.d.ts b/frontend/src/auto-import.d.ts index d298c3ccaa..5eb5ac528f 100644 --- a/frontend/src/auto-import.d.ts +++ b/frontend/src/auto-import.d.ts @@ -62,5 +62,4 @@ declare global { declare global { // @ts-ignore export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue' - import('vue') } diff --git a/frontend/src/components/business/ms-detail-drawer/index.vue b/frontend/src/components/business/ms-detail-drawer/index.vue index f8b0f77803..ce7d195224 100644 --- a/frontend/src/components/business/ms-detail-drawer/index.vue +++ b/frontend/src/components/business/ms-detail-drawer/index.vue @@ -29,6 +29,7 @@ :detail-id="props.detailId" :detail-index="props.detailIndex" :table-data="props.tableData" + @loading-detail="setDetailLoading" @loaded="handleDetailLoaded" />
@@ -59,7 +60,7 @@ getDetailFunc: (id: string) => Promise; // 获取详情的请求函数 }>(); - const emit = defineEmits(['update:visible', 'loaded']); + const emit = defineEmits(['update:visible', 'loaded', 'loadingDetail']); const prevNextButtonRef = ref>(); @@ -99,6 +100,10 @@ emit('loaded', val); } + function setDetailLoading() { + emit('loadingDetail'); + } + watch( () => innerVisible.value, (val) => { @@ -128,4 +133,4 @@ }); - + \ No newline at end of file diff --git a/frontend/src/components/business/ms-prev-next-button/index.vue b/frontend/src/components/business/ms-prev-next-button/index.vue index af8c5cfa5f..59498d0ebe 100644 --- a/frontend/src/components/business/ms-prev-next-button/index.vue +++ b/frontend/src/components/business/ms-prev-next-button/index.vue @@ -52,7 +52,7 @@ getDetailFunc: (id: string) => Promise; // 获取详情的请求函数 }>(); - const emit = defineEmits(['update:loading', 'loaded']); + const emit = defineEmits(['update:loading', 'loaded', 'loadingDetail']); const { t } = useI18n(); @@ -94,6 +94,7 @@ async function initDetail() { try { innerLoading.value = true; + emit('loadingDetail'); const res = await props.getDetailFunc(activeDetailId.value); emit('loaded', res); } catch (error) { @@ -171,4 +172,4 @@ }); - + \ No newline at end of file diff --git a/frontend/src/components/pure/ms-form-create/ms-form-create.vue b/frontend/src/components/pure/ms-form-create/ms-form-create.vue index cf6c0afff7..326668a7a8 100644 --- a/frontend/src/components/pure/ms-form-create/ms-form-create.vue +++ b/frontend/src/components/pure/ms-form-create/ms-form-create.vue @@ -225,6 +225,18 @@ tooltip: item.tooltip, }, }; + if (ruleItem.type === 'input') { + // input 需要单独emit监听事件 emit:['change', 'blur'], + ruleItem.on = { + blur: () => { + // 失去焦点后value值改变 + if (item.value !== fApi.value.getValue(item.name)) { + fApi.value.validateField(item.name); + emit('change', fApi.value.getValue(item.name), ruleItem, fApi.value); + } + }, + }; + } // 如果存在placeholder, 替换掉默认的placeholder if (item.platformPlaceHolder) { ruleItem.props.placeholder = item.platformPlaceHolder; @@ -256,6 +268,15 @@ } } + function changeHandler(value: any, defaultValue: any, formRuleItem: FormRuleItem, api: any) { + if (formRuleItem.type === 'input') { + // 输入框失去焦点后再保存 + return; + } + fApi.value.validateField(value); + emit('change', defaultValue, formRuleItem, api); + } + function getControlFormItems() { const convertedData = formItems.value.map((item: FormItem) => convertItem(item)); formRuleList.value = convertedData; @@ -270,7 +291,6 @@ } function setValue() { nextTick(() => { - console.log(props.formRule); const tempObj: Record = {}; props.formRule.forEach((item) => { tempObj[item.name] = item.value; @@ -306,11 +326,6 @@ }, }; - function changeHandler(value: any, defaultValue: any, formRuleItem: FormRuleItem, api: any) { - fApi.value.validateField(value); - emit('change', defaultValue, formRuleItem, api); - } - function handleMounted() { // setValue(); emit('mounted'); @@ -339,4 +354,4 @@ }); - + \ No newline at end of file diff --git a/frontend/src/components/pure/ms-upload/fileList.vue b/frontend/src/components/pure/ms-upload/fileList.vue index 390e8a58e9..1aedeca1b0 100644 --- a/frontend/src/components/pure/ms-upload/fileList.vue +++ b/frontend/src/components/pure/ms-upload/fileList.vue @@ -56,7 +56,7 @@ v-if="item.status === UploadStatus.init" class="text-[12px] leading-[16px] text-[var(--color-text-4)]" > - {{ t('ms.upload.waiting_save') }} + {{ initFileSaveTips ? initFileSaveTips : t('ms.upload.waiting') }}
-
- +
+ {{ t('ms.upload.uploadSuccess') }}
@@ -185,6 +185,7 @@ showDelete?: boolean; // 是否展示删除按钮 handleView?: (item: MsFileItem) => void; // 是否自定义预览 showUploadTypeDesc?: boolean; // 自定义上传类型关联于&上传于 + initFileSaveTips?: string; // 上传初始文件时的提示 }>(), { mode: 'remote', @@ -211,6 +212,7 @@ watch( () => props.fileList, (val) => { + console.log(props.initFileSaveTips); innerFileList.value = val.sort((a, b) => { if (a.status === UploadStatus.init && b.status !== UploadStatus.init) { return -1; // "init" 排在前面 @@ -381,4 +383,4 @@ justify-content: space-between; padding-bottom: 4px; } - + \ No newline at end of file diff --git a/frontend/src/views/bug-management/components/bug-detail-drawer.vue b/frontend/src/views/bug-management/components/bug-detail-drawer.vue index f164a9eaab..fa68ee45df 100644 --- a/frontend/src/views/bug-management/components/bug-detail-drawer.vue +++ b/frontend/src/views/bug-management/components/bug-detail-drawer.vue @@ -15,6 +15,7 @@ show-full-screen unmount-on-close :mask="false" + @loading-detail="setDetailLoading" @loaded="loadedBug" >