feat(项目管理): 同步缺陷集成ms-form-create
This commit is contained in:
parent
0da79cbe4f
commit
1a6e19e418
|
@ -1,3 +1,5 @@
|
||||||
|
import { FormItem } from '@/components/pure/ms-form-create/types';
|
||||||
|
|
||||||
import MSR from '@/api/http/index';
|
import MSR from '@/api/http/index';
|
||||||
import * as Url from '@/api/requrls/project-management/menuManagement';
|
import * as Url from '@/api/requrls/project-management/menuManagement';
|
||||||
|
|
||||||
|
@ -115,9 +117,9 @@ export function getPlatformOptions(organizationId: string, type: MenuEnum) {
|
||||||
*/
|
*/
|
||||||
export function getPlatformInfo(pluginId: string, type: MenuEnum) {
|
export function getPlatformInfo(pluginId: string, type: MenuEnum) {
|
||||||
if (type === MenuEnum.bugManagement) {
|
if (type === MenuEnum.bugManagement) {
|
||||||
return MSR.get<unknown>({ url: `${Url.getPluginInfoByBug}${pluginId}` });
|
return MSR.get<{ formItems: FormItem[] }>({ url: `${Url.getPluginInfoByBug}${pluginId}` });
|
||||||
}
|
}
|
||||||
return MSR.get<unknown>({ url: `${Url.getPluginInfoByCase}${pluginId}` });
|
return MSR.get<{ formItems: FormItem[] }>({ url: `${Url.getPluginInfoByCase}${pluginId}` });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<template>
|
||||||
|
<a-input
|
||||||
|
:value="props.modelValue"
|
||||||
|
:placeholder="t('project.menu.pleaseInputJiraKey')"
|
||||||
|
@change="(v: string) => emit('update:modelValue', v)"
|
||||||
|
/>
|
||||||
|
<div class="flex flex-row items-center gap-[10px] text-[12px] leading-[20px]">
|
||||||
|
<span class="text-[var(--color-text-4)]">{{ t('project.menu.howGetJiraKey') }}</span>
|
||||||
|
<a-popover position="rt">
|
||||||
|
<template #title>
|
||||||
|
{{ null }}
|
||||||
|
</template>
|
||||||
|
<template #content>
|
||||||
|
<img class="h-[247px] w-[398px]" :src="props.instructionsIcon" />
|
||||||
|
</template>
|
||||||
|
<span class="cursor-pointer text-[rgb(var(--primary-5))]">{{ t('project.menu.preview') }}</span>
|
||||||
|
</a-popover>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
modelValue: string;
|
||||||
|
instructionsIcon: string;
|
||||||
|
}>();
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(event: 'update:modelValue', value: string): void;
|
||||||
|
}>();
|
||||||
|
const { t } = useI18n();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
|
@ -145,6 +145,17 @@ export const TEXTAREA = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
export const JIRAKEY = {
|
||||||
|
type: 'JiraKey',
|
||||||
|
field: 'jiraKey',
|
||||||
|
title: '',
|
||||||
|
value: '',
|
||||||
|
props: {
|
||||||
|
moduleValue: '',
|
||||||
|
placeholder: '请输入',
|
||||||
|
instructionsIcon: '',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export const FieldTypeFormRules: Record<string, FormRule> = {
|
export const FieldTypeFormRules: Record<string, FormRule> = {
|
||||||
INPUT,
|
INPUT,
|
||||||
|
@ -160,4 +171,5 @@ export const FieldTypeFormRules: Record<string, FormRule> = {
|
||||||
FLOAT,
|
FLOAT,
|
||||||
MULTIPLE_INPUT,
|
MULTIPLE_INPUT,
|
||||||
TEXTAREA,
|
TEXTAREA,
|
||||||
|
JIRAKEY,
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
import { ref, watch } from 'vue';
|
import { ref, watch } from 'vue';
|
||||||
import { debounce } from 'lodash-es';
|
import { debounce } from 'lodash-es';
|
||||||
|
|
||||||
|
import JiraKey from './comp/jiraKey.vue';
|
||||||
import PassWord from './formcreate-password.vue';
|
import PassWord from './formcreate-password.vue';
|
||||||
import SearchSelect from './searchSelect.vue';
|
import SearchSelect from './searchSelect.vue';
|
||||||
|
|
||||||
|
@ -21,6 +22,7 @@
|
||||||
|
|
||||||
formCreate.component('PassWord', PassWord);
|
formCreate.component('PassWord', PassWord);
|
||||||
formCreate.component('SearchSelect', SearchSelect);
|
formCreate.component('SearchSelect', SearchSelect);
|
||||||
|
formCreate.component('JiraKey', JiraKey);
|
||||||
|
|
||||||
const FormCreate = formCreate.$form();
|
const FormCreate = formCreate.$form();
|
||||||
const option = {
|
const option = {
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, watch, watchEffect } from 'vue';
|
import { ref, watch, watchEffect } from 'vue';
|
||||||
|
|
||||||
|
import JiraKey from './comp/jiraKey.vue';
|
||||||
import PassWord from './formcreate-password.vue';
|
import PassWord from './formcreate-password.vue';
|
||||||
import SearchSelect from './searchSelect.vue';
|
import SearchSelect from './searchSelect.vue';
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
|
|
||||||
formCreate.component('PassWord', PassWord);
|
formCreate.component('PassWord', PassWord);
|
||||||
formCreate.component('SearchSelect', SearchSelect);
|
formCreate.component('SearchSelect', SearchSelect);
|
||||||
|
formCreate.component('JiraKey', JiraKey);
|
||||||
const FormCreate = formCreate.$form();
|
const FormCreate = formCreate.$form();
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
export enum FormCreateKeyEnum {
|
export enum FormCreateKeyEnum {
|
||||||
ORGANIZE_TEMPLATE = 'OrganizeTemplate',
|
ORGANIZE_TEMPLATE = 'OrganizeTemplate',
|
||||||
ORGANIZE_TEMPLATE_PREVIEW_TEMPLATE = 'OrganizeTemplatePreview',
|
ORGANIZE_TEMPLATE_PREVIEW_TEMPLATE = 'OrganizeTemplatePreview',
|
||||||
|
// 同步缺陷
|
||||||
|
PROJECT_DEFECT_SYNC_TEMPLATE = 'ProjectDefectSyncTemplate',
|
||||||
|
// 关联需求
|
||||||
|
PROJECT__RELATED_TEMPLATE = 'ProjectRelatedTemplate',
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {};
|
export default {};
|
||||||
|
|
|
@ -26,29 +26,13 @@
|
||||||
>
|
>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<!-- jira start -->
|
<!-- form-create -->
|
||||||
<a-form-item field="projectKey" :label="t('project.menu.projectKey')">
|
<MsFormCreate
|
||||||
<a-input v-model="form.projectKey" :placeholder="t('project.menu.pleaseInputJiraKey')" />
|
v-if="platformRules && platformRules.length"
|
||||||
<template #extra>
|
:form-rule="platformRules"
|
||||||
<div class="flex flex-row items-center gap-[4px]">
|
:form-create-key="FormCreateKeyEnum.PROJECT_DEFECT_SYNC_TEMPLATE"
|
||||||
<span class="text-[var(--color-text-4)]">{{ t('project.menu.howGetJiraKey') }}</span>
|
/>
|
||||||
<span class="cursor-pointer text-[rgb(var(--primary-5))]">{{ t('project.menu.preview') }}</span>
|
<!-- 同步机制 -->
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item field="defectType" :label="t('project.menu.defectType')">
|
|
||||||
<a-select :options="jiraDefectOption" :field-names="{ value: 'id', label: 'name' }"></a-select>
|
|
||||||
</a-form-item>
|
|
||||||
<!-- jira end -->
|
|
||||||
<a-form-item field="organizationId" :label="t('project.menu.organizationId')">
|
|
||||||
<a-input v-model="form.organizationId" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item field="projectId" :label="t('project.menu.projectId')">
|
|
||||||
<a-input v-model="form.projectId" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item field="azureId" :label="t('project.menu.azureId')">
|
|
||||||
<a-input v-model="form.azureId" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item field="MECHANISM" :label="t('project.menu.syncMechanism')">
|
<a-form-item field="MECHANISM" :label="t('project.menu.syncMechanism')">
|
||||||
<a-space>
|
<a-space>
|
||||||
<a-radio-group v-model="form.MECHANISM">
|
<a-radio-group v-model="form.MECHANISM">
|
||||||
|
@ -75,6 +59,7 @@
|
||||||
</a-radio-group>
|
</a-radio-group>
|
||||||
</a-space>
|
</a-space>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
<!-- 同步频率 -->
|
||||||
<a-form-item field="CRON_EXPRESSION" :label="t('project.menu.CRON_EXPRESSION')">
|
<a-form-item field="CRON_EXPRESSION" :label="t('project.menu.CRON_EXPRESSION')">
|
||||||
<a-select v-model="form.CRON_EXPRESSION">
|
<a-select v-model="form.CRON_EXPRESSION">
|
||||||
<a-option v-for="data in frequencyOption" :key="data.value" :value="data.value">
|
<a-option v-for="data in frequencyOption" :key="data.value" :value="data.value">
|
||||||
|
@ -117,6 +102,8 @@
|
||||||
import { FormInstance, Message, ValidatedError } from '@arco-design/web-vue';
|
import { FormInstance, Message, ValidatedError } from '@arco-design/web-vue';
|
||||||
|
|
||||||
import MsDrawer from '@/components/pure/ms-drawer/index.vue';
|
import MsDrawer from '@/components/pure/ms-drawer/index.vue';
|
||||||
|
import MsFormCreate from '@/components/pure/ms-form-create/form-create.vue';
|
||||||
|
import type { FormItem } from '@/components/pure/ms-form-create/types';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getPlatformInfo,
|
getPlatformInfo,
|
||||||
|
@ -128,6 +115,7 @@
|
||||||
|
|
||||||
import { PoolOption, SelectValue } from '@/models/projectManagement/menuManagement';
|
import { PoolOption, SelectValue } from '@/models/projectManagement/menuManagement';
|
||||||
import { MenuEnum } from '@/enums/commonEnum';
|
import { MenuEnum } from '@/enums/commonEnum';
|
||||||
|
import { FormCreateKeyEnum } from '@/enums/formCreateEnum';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
|
@ -141,7 +129,6 @@
|
||||||
{ label: '0 0 0/12 * * ?', extra: '(每隔12小时)', value: '12H' },
|
{ label: '0 0 0/12 * * ?', extra: '(每隔12小时)', value: '12H' },
|
||||||
{ label: '0 0 0 * * ?', extra: '(每隔一天)', value: '1D' },
|
{ label: '0 0 0 * * ?', extra: '(每隔一天)', value: '1D' },
|
||||||
]);
|
]);
|
||||||
const jiraDefectOption = ref<PoolOption[]>([]);
|
|
||||||
|
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
const currentProjectId = computed(() => appStore.currentProjectId);
|
const currentProjectId = computed(() => appStore.currentProjectId);
|
||||||
|
@ -150,6 +137,7 @@
|
||||||
const okLoading = ref(false);
|
const okLoading = ref(false);
|
||||||
|
|
||||||
const formRef = ref<FormInstance>();
|
const formRef = ref<FormInstance>();
|
||||||
|
const platformRules = ref<FormItem[]>([]);
|
||||||
|
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
platformKey: '',
|
platformKey: '',
|
||||||
|
@ -158,7 +146,6 @@
|
||||||
CRON_EXPRESSION: '', // 同步频率
|
CRON_EXPRESSION: '', // 同步频率
|
||||||
organizationId: '',
|
organizationId: '',
|
||||||
projectKey: '',
|
projectKey: '',
|
||||||
|
|
||||||
projectId: '',
|
projectId: '',
|
||||||
azureId: '',
|
azureId: '',
|
||||||
bugType: '',
|
bugType: '',
|
||||||
|
@ -175,8 +162,12 @@
|
||||||
};
|
};
|
||||||
const handlePlatformChange = async (value: SelectValue) => {
|
const handlePlatformChange = async (value: SelectValue) => {
|
||||||
try {
|
try {
|
||||||
// TODO: 获取平台信息 Pending
|
if (value) {
|
||||||
await getPlatformInfo(value as string, MenuEnum.bugManagement);
|
const res = await getPlatformInfo(value as string, MenuEnum.bugManagement);
|
||||||
|
platformRules.value = res.formItems;
|
||||||
|
} else {
|
||||||
|
platformRules.value = [];
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(error);
|
console.log(error);
|
||||||
|
@ -220,6 +211,9 @@
|
||||||
currentVisible.value = val;
|
currentVisible.value = val;
|
||||||
if (val) {
|
if (val) {
|
||||||
initPlatformOption();
|
initPlatformOption();
|
||||||
|
} else {
|
||||||
|
formRef.value?.resetFields();
|
||||||
|
platformRules.value = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,220 @@
|
||||||
|
<template>
|
||||||
|
<MsDrawer
|
||||||
|
v-model:visible="currentVisible"
|
||||||
|
:title="t('project.menu.CASE_RELATED')"
|
||||||
|
:destroy-on-close="true"
|
||||||
|
:closable="true"
|
||||||
|
:mask-closable="false"
|
||||||
|
:get-container="false"
|
||||||
|
:body-style="{ padding: '0px' }"
|
||||||
|
:width="680"
|
||||||
|
:ok-loading="okLoading"
|
||||||
|
:ok-disabled="okDisabled"
|
||||||
|
@cancel="handleCancel(false)"
|
||||||
|
@confirm="handleConfirm"
|
||||||
|
>
|
||||||
|
<a-form ref="formRef" class="rounded-[4px]" :model="form" layout="vertical">
|
||||||
|
<a-form-item field="platformKey" :label="t('project.menu.platformLabel')">
|
||||||
|
<a-select
|
||||||
|
v-model="form.platformKey"
|
||||||
|
allow-clear
|
||||||
|
:disabled="platformDisabled"
|
||||||
|
:options="platformOption"
|
||||||
|
:placeholder="platformDisabled ? t('project.menu.platformPlaceholder') : ''"
|
||||||
|
:field-names="{ label: 'name', value: 'id' }"
|
||||||
|
@change="handlePlatformChange"
|
||||||
|
>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
<!-- form-create -->
|
||||||
|
<MsFormCreate
|
||||||
|
v-if="platformRules && platformRules.length"
|
||||||
|
:form-rule="platformRules"
|
||||||
|
:form-create-key="FormCreateKeyEnum.PROJECT_DEFECT_SYNC_TEMPLATE"
|
||||||
|
/>
|
||||||
|
<!-- 同步机制 -->
|
||||||
|
<a-form-item field="MECHANISM" :label="t('project.menu.syncMechanism')">
|
||||||
|
<a-space>
|
||||||
|
<a-radio-group v-model="form.MECHANISM">
|
||||||
|
<a-radio value="increment">
|
||||||
|
<div class="flex flex-row items-center gap-[4px]">
|
||||||
|
<span class="text-[var(--color-text-1)]">{{ t('project.menu.incrementalSync') }}</span>
|
||||||
|
<a-tooltip :content="t('project.menu.incrementalSyncTip')" position="top">
|
||||||
|
<div>
|
||||||
|
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
|
||||||
|
</div>
|
||||||
|
</a-tooltip>
|
||||||
|
</div>
|
||||||
|
</a-radio>
|
||||||
|
<a-radio value="full">
|
||||||
|
<div class="flex flex-row items-center gap-[4px]">
|
||||||
|
<span class="text-[var(--color-text-1)]">{{ t('project.menu.fullSync') }}</span>
|
||||||
|
<a-tooltip :content="t('project.menu.fullSyncTip')" position="bl">
|
||||||
|
<div>
|
||||||
|
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
|
||||||
|
</div>
|
||||||
|
</a-tooltip>
|
||||||
|
</div>
|
||||||
|
</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-space>
|
||||||
|
</a-form-item>
|
||||||
|
<!-- 同步频率 -->
|
||||||
|
<a-form-item field="CRON_EXPRESSION" :label="t('project.menu.CRON_EXPRESSION')">
|
||||||
|
<a-select v-model="form.CRON_EXPRESSION">
|
||||||
|
<a-option v-for="data in frequencyOption" :key="data.value" :value="data.value">
|
||||||
|
<span class="text-[var(--color-text-1)]">
|
||||||
|
{{ data.label }}
|
||||||
|
</span>
|
||||||
|
<span v-if="data.extra" class="text-[var(--color-text-4)]"> {{ data.extra }} </span>
|
||||||
|
</a-option>
|
||||||
|
<a-option value="custom">
|
||||||
|
<div class="border-t-1 cursor-pointer text-[rgb(var(--primary-5))]">{{
|
||||||
|
t('project.menu.defect.customLabel')
|
||||||
|
}}</div>
|
||||||
|
</a-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
<template #footerLeft>
|
||||||
|
<div class="flex flex-row items-center gap-[4px]">
|
||||||
|
<a-switch size="small" />
|
||||||
|
<span class="text-[var(--color-text-1)]">
|
||||||
|
{{ t('project.menu.status') }}
|
||||||
|
</span>
|
||||||
|
<a-tooltip position="tl" :content-style="{ maxWidth: '500px' }">
|
||||||
|
<template #content>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<div>{{ t('project.menu.defect.enableTip') }}</div>
|
||||||
|
<div class="flex flex-nowrap">{{ t('project.menu.defect.closeTip') }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div>
|
||||||
|
<MsIcon class="ml-[4px] text-[var(--color-text-4)]" type="icon-icon-maybe_outlined" />
|
||||||
|
</div>
|
||||||
|
</a-tooltip>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</MsDrawer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { FormInstance, Message, ValidatedError } from '@arco-design/web-vue';
|
||||||
|
|
||||||
|
import MsDrawer from '@/components/pure/ms-drawer/index.vue';
|
||||||
|
import MsFormCreate from '@/components/pure/ms-form-create/form-create.vue';
|
||||||
|
import type { FormItem } from '@/components/pure/ms-form-create/types';
|
||||||
|
|
||||||
|
import {
|
||||||
|
getPlatformInfo,
|
||||||
|
getPlatformOptions,
|
||||||
|
postSaveDefectSync,
|
||||||
|
} from '@/api/modules/project-management/menuManagement';
|
||||||
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
import { useAppStore } from '@/store';
|
||||||
|
|
||||||
|
import { PoolOption, SelectValue } from '@/models/projectManagement/menuManagement';
|
||||||
|
import { MenuEnum } from '@/enums/commonEnum';
|
||||||
|
import { FormCreateKeyEnum } from '@/enums/formCreateEnum';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const props = defineProps<{
|
||||||
|
visible: boolean;
|
||||||
|
}>();
|
||||||
|
const currentVisible = ref<boolean>(props.visible);
|
||||||
|
const platformOption = ref<PoolOption[]>([]);
|
||||||
|
const frequencyOption = ref([
|
||||||
|
{ label: '0 0 0/1 * * ?', extra: '(每隔1小时)', value: '1H' },
|
||||||
|
{ label: '0 0 0/6 * * ?', extra: '(每隔6小时)', value: '6H' },
|
||||||
|
{ label: '0 0 0/12 * * ?', extra: '(每隔12小时)', value: '12H' },
|
||||||
|
{ label: '0 0 0 * * ?', extra: '(每隔一天)', value: '1D' },
|
||||||
|
]);
|
||||||
|
|
||||||
|
const appStore = useAppStore();
|
||||||
|
const currentProjectId = computed(() => appStore.currentProjectId);
|
||||||
|
const currentOrgId = computed(() => appStore.currentOrgId);
|
||||||
|
const platformDisabled = computed(() => platformOption.value.length === 0);
|
||||||
|
const okLoading = ref(false);
|
||||||
|
|
||||||
|
const formRef = ref<FormInstance>();
|
||||||
|
const platformRules = ref<FormItem[]>([]);
|
||||||
|
|
||||||
|
const form = reactive({
|
||||||
|
platformKey: '',
|
||||||
|
MECHANISM: '', // 同步机制
|
||||||
|
SYNC_ENABLE: 'false', // 同步开关
|
||||||
|
CRON_EXPRESSION: '', // 同步频率
|
||||||
|
organizationId: '',
|
||||||
|
projectKey: '',
|
||||||
|
projectId: '',
|
||||||
|
azureId: '',
|
||||||
|
bugType: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
const okDisabled = computed(() => !form.platformKey);
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(e: 'cancel', shouldSearch: boolean): void;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const handleCancel = (shouldSearch: boolean) => {
|
||||||
|
emit('cancel', shouldSearch);
|
||||||
|
};
|
||||||
|
const handlePlatformChange = async (value: SelectValue) => {
|
||||||
|
try {
|
||||||
|
if (value) {
|
||||||
|
const res = await getPlatformInfo(value as string, MenuEnum.bugManagement);
|
||||||
|
platformRules.value = res.formItems;
|
||||||
|
} else {
|
||||||
|
platformRules.value = [];
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleConfirm = async () => {
|
||||||
|
await formRef.value?.validate(async (errors: undefined | Record<string, ValidatedError>) => {
|
||||||
|
if (errors) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
okLoading.value = true;
|
||||||
|
await postSaveDefectSync(form, currentProjectId.value);
|
||||||
|
Message.success(t('common.createSuccess'));
|
||||||
|
handleCancel(true);
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(error);
|
||||||
|
} finally {
|
||||||
|
okLoading.value = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const initPlatformOption = async () => {
|
||||||
|
try {
|
||||||
|
const res = await getPlatformOptions(currentOrgId.value, MenuEnum.bugManagement);
|
||||||
|
if (res) {
|
||||||
|
platformOption.value = res;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.visible,
|
||||||
|
(val) => {
|
||||||
|
currentVisible.value = val;
|
||||||
|
if (val) {
|
||||||
|
initPlatformOption();
|
||||||
|
} else {
|
||||||
|
formRef.value?.resetFields();
|
||||||
|
platformRules.value = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
</script>
|
|
@ -35,9 +35,6 @@ export default {
|
||||||
'project.menu.BUG_SYNC': '同步缺陷',
|
'project.menu.BUG_SYNC': '同步缺陷',
|
||||||
'project.menu.SYNC_ENABLE': '状态',
|
'project.menu.SYNC_ENABLE': '状态',
|
||||||
'project.menu.MECHANISM': '接口测试待更新同步规则',
|
'project.menu.MECHANISM': '接口测试待更新同步规则',
|
||||||
'project.menu.sd': '同步缺陷',
|
|
||||||
'project.menu.rr': '关联需求',
|
|
||||||
'project.menu.far': '误报规则',
|
|
||||||
'project.menu.row1': '系统根据设定的规则将符合的数据展示在我的待办-待更新列表',
|
'project.menu.row1': '系统根据设定的规则将符合的数据展示在我的待办-待更新列表',
|
||||||
'project.menu.row2': '将平台创建的缺陷同步至第三方项目管理平台',
|
'project.menu.row2': '将平台创建的缺陷同步至第三方项目管理平台',
|
||||||
'project.menu.row3': '可将用例添加至公共用例库共用',
|
'project.menu.row3': '可将用例添加至公共用例库共用',
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
<!-- 同步缺陷 -->
|
<!-- 同步缺陷 -->
|
||||||
<span>{{ t('project.menu.row2') }}</span>
|
<span>{{ t('project.menu.row2') }}</span>
|
||||||
<div class="ml-[8px] cursor-pointer text-[rgb(var(--primary-7))]" @click="showDefectDrawer">{{
|
<div class="ml-[8px] cursor-pointer text-[rgb(var(--primary-7))]" @click="showDefectDrawer">{{
|
||||||
t('project.menu.sd')
|
t('project.menu.BUG_SYNC')
|
||||||
}}</div>
|
}}</div>
|
||||||
</template>
|
</template>
|
||||||
<div v-if="record.type === 'CASE_PUBLIC'">
|
<div v-if="record.type === 'CASE_PUBLIC'">
|
||||||
|
@ -50,8 +50,8 @@
|
||||||
<div v-if="record.type === 'CASE_RELATED'" class="flex flex-row">
|
<div v-if="record.type === 'CASE_RELATED'" class="flex flex-row">
|
||||||
<!-- 用例 关联需求 -->
|
<!-- 用例 关联需求 -->
|
||||||
<div>{{ t('project.menu.row4') }}</div>
|
<div>{{ t('project.menu.row4') }}</div>
|
||||||
<div class="ml-[8px] cursor-pointer text-[rgb(var(--primary-7))]" @click="showDefectDrawer">{{
|
<div class="ml-[8px] cursor-pointer text-[rgb(var(--primary-7))]" @click="showRelatedCaseDrawer">{{
|
||||||
t('project.menu.rr')
|
t('project.menu.CASE_RELATED')
|
||||||
}}</div>
|
}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="record.type === 'CASE_RE_REVIEW'">
|
<div v-if="record.type === 'CASE_RE_REVIEW'">
|
||||||
|
@ -127,7 +127,7 @@
|
||||||
</a-input-number>
|
</a-input-number>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-[8px] cursor-pointer text-[rgb(var(--primary-7))]" @click="pushFar">{{
|
<div class="ml-[8px] cursor-pointer text-[rgb(var(--primary-7))]" @click="pushFar">{{
|
||||||
t('project.menu.far')
|
t('project.menu.API_ERROR_REPORT_RULE')
|
||||||
}}</div>
|
}}</div>
|
||||||
<a-tooltip :content="t('project.menu.API_ERROR_REPORT_RULE_TIP')" position="right">
|
<a-tooltip :content="t('project.menu.API_ERROR_REPORT_RULE_TIP')" position="right">
|
||||||
<div>
|
<div>
|
||||||
|
@ -313,6 +313,7 @@
|
||||||
</template>
|
</template>
|
||||||
</MsBaseTable>
|
</MsBaseTable>
|
||||||
<DefectSync v-model:visible="defectDrawerVisible" @cancel="defectDrawerVisible = false" />
|
<DefectSync v-model:visible="defectDrawerVisible" @cancel="defectDrawerVisible = false" />
|
||||||
|
<RelatedCase v-model:visible="relatedCaseDrawerVisible" @cancel="relatedCaseDrawerVisible = false" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -327,6 +328,7 @@
|
||||||
import useTable from '@/components/pure/ms-table/useTable';
|
import useTable from '@/components/pure/ms-table/useTable';
|
||||||
import MsTimeSelectorVue from '@/components/pure/ms-time-selector/MsTimeSelector.vue';
|
import MsTimeSelectorVue from '@/components/pure/ms-time-selector/MsTimeSelector.vue';
|
||||||
import DefectSync from './components/defectSync.vue';
|
import DefectSync from './components/defectSync.vue';
|
||||||
|
import RelatedCase from './components/relatedCase.vue';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getAuditorOptions,
|
getAuditorOptions,
|
||||||
|
@ -347,6 +349,7 @@
|
||||||
const currentProjectId = computed(() => appStore.currentProjectId);
|
const currentProjectId = computed(() => appStore.currentProjectId);
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const defectDrawerVisible = ref(false);
|
const defectDrawerVisible = ref(false);
|
||||||
|
const relatedCaseDrawerVisible = ref(false);
|
||||||
const apiPoolOption = ref<PoolOption[]>([]);
|
const apiPoolOption = ref<PoolOption[]>([]);
|
||||||
const uiPoolOption = ref<PoolOption[]>([]);
|
const uiPoolOption = ref<PoolOption[]>([]);
|
||||||
const apiAuditorOption = ref<PoolOption[]>([]);
|
const apiAuditorOption = ref<PoolOption[]>([]);
|
||||||
|
@ -619,9 +622,14 @@
|
||||||
await loadList();
|
await loadList();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 打开同步缺陷
|
||||||
const showDefectDrawer = () => {
|
const showDefectDrawer = () => {
|
||||||
defectDrawerVisible.value = true;
|
defectDrawerVisible.value = true;
|
||||||
};
|
};
|
||||||
|
// 打开关联需求
|
||||||
|
const showRelatedCaseDrawer = () => {
|
||||||
|
relatedCaseDrawerVisible.value = true;
|
||||||
|
};
|
||||||
// 跳转到误报规则列表页
|
// 跳转到误报规则列表页
|
||||||
const pushFar = () => {
|
const pushFar = () => {
|
||||||
router.push({ name: ProjectManagementRouteEnum.PROJECT_MANAGEMENT_MENU_MANAGEMENT_ERROR_REPORT_RULE });
|
router.push({ name: ProjectManagementRouteEnum.PROJECT_MANAGEMENT_MENU_MANAGEMENT_ERROR_REPORT_RULE });
|
||||||
|
|
Loading…
Reference in New Issue