| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | import type { ImManagerGroupApi } from '#/api/im/manager/group'; |
| | | |
| | | import { ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { confirm, Page, useVbenModal } from '#/packages/effects/common-ui/src'; |
| | | import { CommonStatusEnum, DICT_TYPE } from '#/packages/constants/src'; |
| | | |
| | | import { Avatar, message, Tag, Tooltip } from 'ant-design-vue'; |
| | | |
| | | import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { |
| | | dissolveManagerGroup, |
| | | getManagerGroupPage, |
| | | unbanManagerGroup, |
| | | } from '#/api/im/manager/group'; |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | import { formatUserLabel } from '#/views/im/manager/utils/format'; |
| | | |
| | | import { useGroupGridColumns, useGroupGridFormSchema } from './data'; |
| | | import BanForm from './modules/ban-form.vue'; |
| | | import Detail from './modules/detail.vue'; |
| | | |
| | | defineOptions({ name: 'ImManagerGroup' }); |
| | | |
| | | const router = useRouter(); |
| | | const detailRef = ref<InstanceType<typeof Detail>>(); |
| | | |
| | | const [BanModal, banModalApi] = useVbenModal({ |
| | | connectedComponent: BanForm, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** å·æ°è¡¨æ ¼ */ |
| | | function handleRefresh() { |
| | | gridApi.query(); |
| | | } |
| | | |
| | | /** æå¼è¯¦æ
*/ |
| | | function handleDetail(row: ImManagerGroupApi.Group) { |
| | | detailRef.value?.open(row); |
| | | } |
| | | |
| | | /** æ¥çç¾¤èæ¶æ¯ */ |
| | | function handleConversation(row: ImManagerGroupApi.Group) { |
| | | router.push({ |
| | | name: 'ImGroupMessage', |
| | | query: { groupId: row.id }, |
| | | }); |
| | | } |
| | | |
| | | /** æå¼å°ç¦å¼¹çª */ |
| | | function handleBan(row: ImManagerGroupApi.Group) { |
| | | banModalApi.setData(row).open(); |
| | | } |
| | | |
| | | /** è§£å°ç¾¤ */ |
| | | async function handleUnban(row: ImManagerGroupApi.Group) { |
| | | await confirm(`确认解å°ç¾¤ã${row.name}ãåï¼`); |
| | | await unbanManagerGroup(row.id); |
| | | message.success('è§£å°æå'); |
| | | handleRefresh(); |
| | | } |
| | | |
| | | /** è§£æ£ç¾¤ */ |
| | | async function handleDissolve(row: ImManagerGroupApi.Group) { |
| | | await confirm(`确认解æ£ç¾¤ã${row.name}ãåï¼`); |
| | | await dissolveManagerGroup(row.id); |
| | | message.success('è§£æ£æå'); |
| | | handleRefresh(); |
| | | } |
| | | |
| | | const [Grid, gridApi] = useVbenVxeGrid({ |
| | | formOptions: { |
| | | schema: useGroupGridFormSchema(), |
| | | }, |
| | | gridOptions: { |
| | | columns: useGroupGridColumns(), |
| | | height: 'auto', |
| | | keepSource: true, |
| | | proxyConfig: { |
| | | ajax: { |
| | | query: async ({ page }, formValues) => { |
| | | return await getManagerGroupPage({ |
| | | pageNo: page.currentPage, |
| | | pageSize: page.pageSize, |
| | | ...formValues, |
| | | }); |
| | | }, |
| | | }, |
| | | }, |
| | | rowConfig: { |
| | | keyField: 'id', |
| | | isHover: true, |
| | | }, |
| | | toolbarConfig: { |
| | | refresh: true, |
| | | search: true, |
| | | }, |
| | | } as VxeTableGridOptions<ImManagerGroupApi.Group>, |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <Page auto-content-height> |
| | | <BanModal @success="handleRefresh" /> |
| | | <Detail ref="detailRef" /> |
| | | <Grid table-title="群å表"> |
| | | <template #avatar="{ row }"> |
| | | <Avatar :src="row.avatar" :size="40"> |
| | | {{ row.name?.charAt(0) || '?' }} |
| | | </Avatar> |
| | | </template> |
| | | <template #owner="{ row }"> |
| | | {{ formatUserLabel(row.ownerNickname, row.ownerUserId) }} |
| | | </template> |
| | | <template #banned="{ row }"> |
| | | <Tooltip v-if="row.banned" :title="row.bannedReason"> |
| | | <DictTag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="row.banned" /> |
| | | </Tooltip> |
| | | <DictTag v-else :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="row.banned" /> |
| | | </template> |
| | | <template #mutedAll="{ row }"> |
| | | <Tag v-if="row.mutedAll" color="error">å·²ç¦è¨</Tag> |
| | | <Tag v-else>æªç¦è¨</Tag> |
| | | </template> |
| | | <template #actions="{ row }"> |
| | | <TableAction |
| | | :actions="[ |
| | | { |
| | | label: '详æ
', |
| | | type: 'link', |
| | | icon: ACTION_ICON.VIEW, |
| | | auth: ['im:manager:group:query'], |
| | | onClick: handleDetail.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'æ¥ç对è¯', |
| | | type: 'link', |
| | | icon: ACTION_ICON.VIEW, |
| | | onClick: handleConversation.bind(null, row), |
| | | }, |
| | | { |
| | | label: row.banned ? 'è§£å°' : 'å°ç¦', |
| | | type: 'link', |
| | | danger: !row.banned, |
| | | icon: ACTION_ICON.CLOSE, |
| | | auth: ['im:manager:group:ban'], |
| | | onClick: row.banned ? handleUnban.bind(null, row) : handleBan.bind(null, row), |
| | | }, |
| | | { |
| | | label: 'è§£æ£', |
| | | type: 'link', |
| | | danger: true, |
| | | icon: ACTION_ICON.DELETE, |
| | | auth: ['im:manager:group:dissolve'], |
| | | ifShow: row.status === CommonStatusEnum.ENABLE, |
| | | onClick: handleDissolve.bind(null, row), |
| | | }, |
| | | ]" |
| | | /> |
| | | </template> |
| | | </Grid> |
| | | </Page> |
| | | </template> |