178 lines
4.4 KiB
Vue
178 lines
4.4 KiB
Vue
<template>
|
||
<DiscussionItem
|
||
v-bind="$props"
|
||
:eventIcon="eventIcon === undefined ? 'gt-comment' : eventIcon"
|
||
:data="data"
|
||
:origin="origin"
|
||
:body="temp?.body"
|
||
:repo-id="repoId"
|
||
@save-content="saveDescription"
|
||
:can-delete="author?.username === user?.username"
|
||
:can-edit="author?.username === user?.username"
|
||
:loading="loading"
|
||
:targetId="temp?.iid"
|
||
@on-remove="handleDelete"
|
||
@quote-reply="$emit('quote-reply', temp?.body)"
|
||
@reply-discussion="handleReply"
|
||
:resolvable="temp.resolvable"
|
||
:resolved="resolvable === false ? false : temp.resolved"
|
||
@resolve-stat-change="resolveStatChange"
|
||
:event-msg="hasDiff ? undefined : '评论:'"
|
||
:diff="hasDiff ? temp.diff : ''"
|
||
:diffFile="hasDiff ? temp.diff_file : ''"
|
||
:addedLines="hasDiff ? origin.added_lines : undefined"
|
||
:removedLines="hasDiff ? origin.removed_lines : undefined"
|
||
:sourceBranch="sourceBranch"
|
||
:formatIng="formatIng"
|
||
@doFormat="doFormat"
|
||
:hasDiff="hasDiff"
|
||
:canResolve="canResolve"
|
||
ref="RefDiscussion"
|
||
>
|
||
<slot></slot>
|
||
</DiscussionItem>
|
||
</template>
|
||
<script lang="ts" setup>
|
||
defineOptions({ name: 'MrDiscussionItem' });
|
||
import { ref, computed, inject, type Ref } from 'vue';
|
||
import DiscussionItem from '@/views/Repo/components/DiscussionItem/index.vue';
|
||
import {
|
||
updateMRDiscussion,
|
||
delMRDiscussionsNote,
|
||
replayDiscussionsNote,
|
||
changes
|
||
} from '@/api/merge';
|
||
import { reqCatch } from '@/utils/catch';
|
||
import debounce from 'lodash/debounce';
|
||
import { repoInfoStore } from '@/stores/Repo';
|
||
const { isDeveloper } = repoInfoStore();
|
||
const isMrAuthor = inject('isMrAuthor') as Ref;
|
||
const mrInfo = inject('mrInfo') as Ref;
|
||
const repoId = inject('repoId') as Ref;
|
||
const iid = inject('iid') as number;
|
||
const mergeAbleChange = inject('mergeAbleChange') as Function;
|
||
const updatePage = inject('updatePage') as Function;
|
||
const props = defineProps<{
|
||
data: any;
|
||
origin: any;
|
||
hasDiff?: boolean;
|
||
eventIcon?: string;
|
||
author: any;
|
||
user: any;
|
||
resolvable?: any;
|
||
}>();
|
||
const key = ref(0);
|
||
const RefDiscussion = ref();
|
||
const loading = ref(false);
|
||
const formatIng = ref(false);
|
||
const temp = ref(props.data);
|
||
const sourceBranch = computed(() => mrInfo.value?.source_branch);
|
||
|
||
/**
|
||
* 1、建议级别:MR作者、评论者、开发者及以上权限可操作。
|
||
* 2、一般及以上级别:评论者、开发者及以上权限可操作,MR作者不可操作,即使有以上权限也不行。
|
||
*/
|
||
const canResolve = computed(() => {
|
||
if (mrInfo.value?.author?.username !== props.author?.username) {
|
||
return false;
|
||
} else if (isDeveloper) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
});
|
||
|
||
const emit = defineEmits<{
|
||
'delete': [];
|
||
'quote-reply': [value: string];
|
||
'add-reply': [obj: object];
|
||
}>();
|
||
|
||
/**
|
||
* 修改评论
|
||
*/
|
||
const saveDescription = async(str: string) => {
|
||
loading.value = true;
|
||
const res = await reqCatch(updateMRDiscussion, {
|
||
project_id: repoId.value,
|
||
merge_request_iid: iid,
|
||
discussion_id: props.origin.id,
|
||
body: str
|
||
});
|
||
loading.value = false;
|
||
if (!res.error) {
|
||
temp.value.body = str;
|
||
key.value++;
|
||
RefDiscussion.value.reset();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 修改问题解决状态
|
||
*/
|
||
const resolveStatChange = debounce(async(blod: boolean) => {
|
||
const res = await reqCatch(updateMRDiscussion, {
|
||
project_id: repoId.value,
|
||
merge_request_iid: iid,
|
||
discussion_id: props.origin.id,
|
||
resolved: blod
|
||
});
|
||
|
||
if (!res.error) {
|
||
temp.value = res.data.data.notes[0];
|
||
mergeAbleChange();
|
||
updatePage();
|
||
}
|
||
}, 500);
|
||
|
||
/**
|
||
* 删除评论
|
||
*/
|
||
const handleDelete = async() => {
|
||
const res = await reqCatch(delMRDiscussionsNote, {
|
||
project_id: repoId.value,
|
||
merge_request_iid: iid,
|
||
note_id: props.data.id
|
||
});
|
||
|
||
if (!res.error) {
|
||
emit('delete');
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 回复
|
||
*/
|
||
const handleReply = async(str: string) => {
|
||
const res = await reqCatch(replayDiscussionsNote, {
|
||
project_id: repoId.value,
|
||
merge_request_iid: iid,
|
||
discussion_id: props.origin.id,
|
||
body: str
|
||
});
|
||
|
||
if (!res.error) {
|
||
const msg = res.data.data;
|
||
RefDiscussion.value.reset();
|
||
key.value++;
|
||
emit('add-reply', msg);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 转码
|
||
*/
|
||
const doFormat = async() => {
|
||
formatIng.value = true;
|
||
const res = changes({
|
||
file_path: sourceBranch,
|
||
ignore_whitespace_change: false,
|
||
view: 'simple',
|
||
force_encode: true,
|
||
repoId: repoId.value,
|
||
iid: iid
|
||
});
|
||
formatIng.value = false;
|
||
};
|
||
</script>
|