155 lines
4.4 KiB
Vue
155 lines
4.4 KiB
Vue
<script setup lang="ts">
|
||
import DiscussionTypeItem from '../components/DiscussionTypeItem.vue';
|
||
import { ref } from 'vue';
|
||
import type {
|
||
discussionTypeOrSection,
|
||
categoryType
|
||
} from '@/api/discussion/types';
|
||
import { useRouter } from 'vue-router';
|
||
import { getAllTypes } from '@/api/discussion';
|
||
import { DISCUSS_FORMAT } from '@/constant/discuss';
|
||
import isArray from 'lodash/isArray';
|
||
import isEmpty from 'lodash/isEmpty';
|
||
import { useDiscussGetUserInfo, useDiscussionOpen } from '@/api/discussion/hook';
|
||
import { orgInfoStore } from '@/stores/Org';
|
||
import { repoInfoStore } from '@/stores/Repo';
|
||
import { Message } from 'vue-devui/message';
|
||
|
||
defineOptions({
|
||
name: 'DiscussionSelectType'
|
||
});
|
||
|
||
const props = withDefaults(defineProps<{
|
||
sourceType: 1|2; // 组织1,项目2
|
||
orgNamespace?: string; // 组织namespace
|
||
}>(), {
|
||
sourceType: 1
|
||
});
|
||
|
||
const router = useRouter();
|
||
|
||
// 获取当前用户信息 & 是否登录
|
||
const { isLogin = false, userInfo = {}} = useDiscussGetUserInfo();
|
||
if (!isLogin) router.push('/404');
|
||
|
||
// 确认讨论是否开启
|
||
const { id: source_id, discussOpen, getDiscussionStatus } = useDiscussionOpen(props.sourceType, props.orgNamespace);
|
||
|
||
// 获取当前用户项目/组织权限
|
||
const access_level = props.sourceType === 1 ? orgInfoStore().access_level : repoInfoStore().access_level;
|
||
|
||
const loading = ref(false);
|
||
const typeList = ref([] as discussionTypeOrSection[]);
|
||
// 获取所有 type
|
||
const getDiscussionTypeList = async() => {
|
||
loading.value = true;
|
||
const res = await getAllTypes({ id: source_id.value, source_type: props.sourceType });
|
||
if (!res.error) {
|
||
const resData = res?.data?.data;
|
||
const tempData = access_level > 30 ? resData : resData.filter((item:categoryType) => item.category_type !== DISCUSS_FORMAT.ANNOUNCE);
|
||
// 赋值
|
||
typeList.value =
|
||
isArray(resData) && !isEmpty(resData)
|
||
? tempData.map((item: categoryType) => ({
|
||
id: item.id,
|
||
icon: item.category_icon,
|
||
title: item.category_name,
|
||
desc: item.category_desc,
|
||
answerAcceptEnable: item.category_type === 2,
|
||
isGroup: false
|
||
}))
|
||
: [];
|
||
}
|
||
loading.value = false;
|
||
};
|
||
|
||
const initialData = async() => {
|
||
await getDiscussionStatus();
|
||
if (source_id.value && discussOpen.value === '1') {
|
||
await getDiscussionTypeList();
|
||
} else {
|
||
Message.warning(`${props.sourceType === 1 ? '组织' : '项目'}讨论未开启`);
|
||
router.replace('/404');
|
||
}
|
||
};
|
||
initialData();
|
||
|
||
const onDiscussionCreate = (item: discussionTypeOrSection) => {
|
||
router.push({
|
||
name: `${props.sourceType === 1 ? 'org' : 'repo'}DiscussionCreate`,
|
||
params: {
|
||
discussionTypeId: item.id
|
||
}
|
||
});
|
||
};
|
||
|
||
const goToTypeManage = () => {
|
||
router.push({ name: `${props.sourceType === 1 ? 'org' : 'repo'}DiscussionType` });
|
||
};
|
||
|
||
</script>
|
||
|
||
<template>
|
||
<div class="discussion-select space-y-20 mt-6">
|
||
<d-skeleton :loading="loading">
|
||
<header>
|
||
<p class="discussion-select__title">请选择你要创建的讨论类型</p>
|
||
<d-button v-if="access_level>30" variant="solid" color="primary" @click="goToTypeManage">
|
||
讨论内容分类设置
|
||
</d-button>
|
||
</header>
|
||
<Card simple>
|
||
<DiscussionTypeItem v-for="item in typeList" :key="item.id" :info="item">
|
||
<!-- 替换为 emoji -->
|
||
<template #icon>
|
||
<span class="emoji-icon">{{ item.icon }}</span>
|
||
</template>
|
||
<template #tools>
|
||
<d-button class="create-btn" size="md" @click="onDiscussionCreate(item)"
|
||
>发起讨论</d-button
|
||
>
|
||
</template>
|
||
</DiscussionTypeItem>
|
||
</Card>
|
||
</d-skeleton>
|
||
</div>
|
||
</template>
|
||
|
||
<style scoped lang="scss">
|
||
@import 'devui-theme/styles-var/devui-var.scss';
|
||
.discussion-select {
|
||
& > header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
}
|
||
&__title {
|
||
font-size: 18px;
|
||
font-weight: 500;
|
||
color: #2d2d2e;
|
||
line-height: 32px;
|
||
}
|
||
:deep(.discussion-type-item) {
|
||
border-top: 0;
|
||
border-radius: 0;
|
||
border-bottom: 1px solid var(--color-border-light);
|
||
box-shadow: none;
|
||
&:first-of-type {
|
||
border-top-left-radius: var(--border-radius);
|
||
border-top-right-radius: var(--border-radius);
|
||
}
|
||
&:last-of-type {
|
||
border-bottom-left-radius: var(--border-radius);
|
||
border-bottom-right-radius: var(--border-radius);
|
||
border-bottom: none;
|
||
}
|
||
}
|
||
}
|
||
|
||
.create-btn {
|
||
padding: 6px 20px;
|
||
border-radius: var(--border-radius);
|
||
font-weight: 500;
|
||
}
|
||
</style>
|