| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { ImManagerGroupApi } from '#/api/im/manager/group'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | import { CommonStatusEnum, DICT_TYPE } from '#/packages/constants/src'; |
| | | |
| | | import { |
| | | Avatar, |
| | | Checkbox, |
| | | Descriptions, |
| | | DescriptionsItem, |
| | | Drawer, |
| | | Table, |
| | | Tag, |
| | | } from 'ant-design-vue'; |
| | | |
| | | import { getManagerGroupMemberList } from '#/api/im/manager/group'; |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | import { |
| | | formatDateTimeText, |
| | | formatUserLabel, |
| | | } from '#/views/im/manager/utils/format'; |
| | | |
| | | const visible = ref(false); |
| | | const detail = ref<ImManagerGroupApi.Group>({} as ImManagerGroupApi.Group); |
| | | const loading = ref(false); |
| | | const activeOnly = ref(true); |
| | | const memberList = ref<ImManagerGroupApi.GroupMember[]>([]); |
| | | |
| | | const filteredMembers = computed(() => |
| | | activeOnly.value |
| | | ? memberList.value.filter((item) => item.status === CommonStatusEnum.ENABLE) |
| | | : memberList.value, |
| | | ); |
| | | |
| | | const columns = [ |
| | | { title: '头å', dataIndex: 'avatar', width: 80 }, |
| | | { title: 'ç¨æ·ç¼å·', dataIndex: 'userId', width: 100 }, |
| | | { title: 'è§è²', dataIndex: 'role', width: 100 }, |
| | | { title: 'æµç§°', dataIndex: 'nickname' }, |
| | | { title: 'ç»å
æ¾ç¤ºå', dataIndex: 'displayUserName' }, |
| | | { title: 'ç¾¤å¤æ³¨', dataIndex: 'groupRemark' }, |
| | | { title: 'å
ææ°', dataIndex: 'silent', width: 90 }, |
| | | { title: 'ç¶æ', dataIndex: 'status', width: 100 }, |
| | | { title: 'å
¥ç¾¤æ¶é´', dataIndex: 'joinTime', width: 180 }, |
| | | { title: 'é群æ¶é´', dataIndex: 'quitTime', width: 180 }, |
| | | { title: 'ç¦è¨ç¶æ', dataIndex: 'muteEndTime', width: 180 }, |
| | | ]; |
| | | |
| | | /** æå¼è¯¦æ
*/ |
| | | async function open(row: ImManagerGroupApi.Group) { |
| | | detail.value = row; |
| | | visible.value = true; |
| | | activeOnly.value = true; |
| | | loading.value = true; |
| | | try { |
| | | memberList.value = await getManagerGroupMemberList(row.id); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | defineExpose({ open }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Drawer v-model:open="visible" destroy-on-close title="群详æ
" width="900"> |
| | | <Descriptions bordered :column="2"> |
| | | <DescriptionsItem label="群ç¼å·">{{ detail.id }}</DescriptionsItem> |
| | | <DescriptionsItem label="群åç§°">{{ detail.name }}</DescriptionsItem> |
| | | <DescriptionsItem label="头å"> |
| | | <Avatar :src="detail.avatar" :size="36"> |
| | | {{ detail.name?.charAt(0) || '?' }} |
| | | </Avatar> |
| | | </DescriptionsItem> |
| | | <DescriptionsItem label="群主"> |
| | | {{ formatUserLabel(detail.ownerNickname, detail.ownerUserId) }} |
| | | </DescriptionsItem> |
| | | <DescriptionsItem label="æåæ°">{{ detail.memberCount || 0 }}</DescriptionsItem> |
| | | <DescriptionsItem label="ç¾¤ç¶æ"> |
| | | <DictTag :type="DICT_TYPE.IM_GROUP_STATUS" :value="detail.status" /> |
| | | </DescriptionsItem> |
| | | <DescriptionsItem label="å°ç¦ç¶æ"> |
| | | <DictTag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="detail.banned" /> |
| | | <span v-if="detail.banned" class="ml-2 text-gray-400"> |
| | | {{ detail.bannedReason }} |
| | | </span> |
| | | </DescriptionsItem> |
| | | <DescriptionsItem label="å
¨ç¾¤ç¦è¨"> |
| | | <Tag v-if="detail.mutedAll" color="error">å·²ç¦è¨</Tag> |
| | | <Tag v-else>æªç¦è¨</Tag> |
| | | </DescriptionsItem> |
| | | <DescriptionsItem label="群å
Œ" :span="2"> |
| | | {{ detail.notice || '-' }} |
| | | </DescriptionsItem> |
| | | <DescriptionsItem label="å建æ¶é´" :span="2"> |
| | | {{ formatDateTimeText(detail.createTime) }} |
| | | </DescriptionsItem> |
| | | </Descriptions> |
| | | |
| | | <div class="mb-4 mt-5 flex items-center justify-between"> |
| | | <span class="font-bold">群æå</span> |
| | | <Checkbox v-model:checked="activeOnly">ä»
å±ç¤ºå½å群å
çæå</Checkbox> |
| | | </div> |
| | | <Table |
| | | :columns="columns" |
| | | :data-source="filteredMembers" |
| | | :loading="loading" |
| | | :pagination="false" |
| | | bordered |
| | | row-key="userId" |
| | | size="small" |
| | | > |
| | | <template #bodyCell="{ column, record, text }"> |
| | | <template v-if="column.dataIndex === 'avatar'"> |
| | | <Avatar :src="record.avatar" :size="40"> |
| | | {{ record.nickname?.charAt(0) || '?' }} |
| | | </Avatar> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'role'"> |
| | | <DictTag :type="DICT_TYPE.IM_GROUP_MEMBER_ROLE" :value="record.role" /> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'silent'"> |
| | | <DictTag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="record.silent" /> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'status'"> |
| | | <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="record.status" /> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'joinTime'"> |
| | | {{ formatDateTimeText(record.joinTime) }} |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'quitTime'"> |
| | | {{ formatDateTimeText(record.quitTime) }} |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'muteEndTime'"> |
| | | <template v-if="record.muteEndTime && new Date(record.muteEndTime) > new Date()"> |
| | | <Tag color="error">ç¦è¨ä¸</Tag> |
| | | <div class="mt-1 text-xs text-gray-400"> |
| | | {{ formatDateTimeText(record.muteEndTime) }} |
| | | </div> |
| | | </template> |
| | | <span v-else>-</span> |
| | | </template> |
| | | <template v-else> |
| | | {{ text || '-' }} |
| | | </template> |
| | | </template> |
| | | </Table> |
| | | </Drawer> |
| | | </template> |