118 lines
3.3 KiB
Vue
118 lines
3.3 KiB
Vue
|
|
<script setup lang="ts">
|
|||
|
|
import { ref, shallowRef, onMounted, computed, defineProps } from 'vue';
|
|||
|
|
import WebHookItem from './WebHookItem.vue';
|
|||
|
|
import { Message } from 'vue-devui/message';
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
const currentId = ref('');
|
|||
|
|
const loading = ref(true);
|
|||
|
|
|
|||
|
|
// 请求API都由父级决定 抽离方便复用
|
|||
|
|
const props = withDefaults(defineProps<{
|
|||
|
|
getRepoWebhooks: Function,
|
|||
|
|
editWebhook: Function,
|
|||
|
|
deleteWebHook: Function,
|
|||
|
|
repoId: string | null
|
|||
|
|
}>(), {
|
|||
|
|
getRepoWebhooks: () => {},
|
|||
|
|
editWebhook: () => {},
|
|||
|
|
deleteWebHook: () => {},
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const empty = computed(() => {
|
|||
|
|
return !loading.value && !webHookList.value.length;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const emit = defineEmits(['create', 'edit']);
|
|||
|
|
|
|||
|
|
const webHookList = shallowRef<any[]>([]);
|
|||
|
|
|
|||
|
|
const getConfig = async() => {
|
|||
|
|
const res = await props.getRepoWebhooks({ repoId: props.repoId, conf: { page: 1, per_page: 50 }});
|
|||
|
|
if (!res.error) {
|
|||
|
|
webHookList.value = res?.data?.data;
|
|||
|
|
}
|
|||
|
|
loading.value = false;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const handleDeal = async(data: Record<string, any>) => {
|
|||
|
|
const { hook_id, ...config } = data;
|
|||
|
|
const res = await props.editWebhook({ repoId: props.repoId, hook_id, conf: config });
|
|||
|
|
if (!res.error) {
|
|||
|
|
Message.success('操作成功');
|
|||
|
|
getConfig();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const handleDel = (data: { hook_id: string }) => {
|
|||
|
|
const { hook_id } = data;
|
|||
|
|
visible.value = true;
|
|||
|
|
currentId.value = hook_id;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const handleConfirm = async() => {
|
|||
|
|
|
|||
|
|
const res = await props.deleteWebHook({ repoId: props.repoId, hook_id: currentId.value });
|
|||
|
|
if (!res.error) {
|
|||
|
|
Message.success('webhook移除成功');
|
|||
|
|
getConfig();
|
|||
|
|
visible.value = false;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const handleEdit = (data: any) => {
|
|||
|
|
emit('edit', data);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
onMounted(() => {
|
|||
|
|
getConfig();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<template>
|
|||
|
|
<div class="box-border py-[24px]">
|
|||
|
|
<div class="repo-settings-title">
|
|||
|
|
<div>WebHook</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="g-content-card pb-[18px]">
|
|||
|
|
<div class="text-sm mb-[18px] flex items-center justify-between p-[18px] border-box border-b-[1px] border-solid border-[var(--color-CG200)]">
|
|||
|
|
<div class="mr-2">
|
|||
|
|
WebHook 将允许 GitCode 向你的外部服务进行通知,当某些特定事件发生时,我们将向你指定的 URL中发送一个 POST 请求。
|
|||
|
|
</div>
|
|||
|
|
<d-button variant="solid" color="primary" icon="add" @click="emit('create')">新建 WebHook</d-button>
|
|||
|
|
</div>
|
|||
|
|
<DataPanel :loading="loading" :empty="empty" :skeleton="loading" :card="false">
|
|||
|
|
<div class="border-box px-[18px]">
|
|||
|
|
<div class="repo-table-item" v-for="hook of webHookList" :key="hook.id">
|
|||
|
|
<WebHookItem
|
|||
|
|
:hook="hook"
|
|||
|
|
@edit="handleEdit"
|
|||
|
|
@run="handleDeal"
|
|||
|
|
@pause="handleDeal"
|
|||
|
|
@delete="handleDel"
|
|||
|
|
></WebHookItem>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</DataPanel>
|
|||
|
|
</div>
|
|||
|
|
<GModal v-model="visible" title="你正在删除webhook" @confirm="handleConfirm">
|
|||
|
|
<div class="px-[8px]">删除后将无法恢复, 确认继续么?</div>
|
|||
|
|
</GModal>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.repo-table-item {
|
|||
|
|
&:nth-last-of-type(1) {
|
|||
|
|
@apply border-b-[1px];
|
|||
|
|
}
|
|||
|
|
@apply flex items-center py-[14px] px-[24px] justify-between border-t-[1px] border-l-[1px] border-r-[1px] border-solid border-[var(--color-CG200)];
|
|||
|
|
}
|
|||
|
|
.g-content-card{
|
|||
|
|
.devui-button{
|
|||
|
|
min-width: 155px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|