Files
Situation-Awareness-Platfor…/src/components/Discussion/Module/Select/index.vue

155 lines
4.4 KiB
Vue
Raw Normal View History

2025-03-12 18:41:20 +08:00
<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>