| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { GroupMemberLite } from './group-member.vue' |
| | | |
| | | import { ref } from 'vue' |
| | | |
| | | import { Button, message, Modal } from 'ant-design-vue' |
| | | |
| | | import { removeGroupMember } from '#/api/im/group/member' |
| | | |
| | | import { GroupMemberPickerPanel } from '../picker' |
| | | |
| | | defineOptions({ name: 'ImGroupMemberRemoveDialog' }) |
| | | |
| | | const emit = defineEmits<{ |
| | | /** ç§»åºæåï¼ç¶ä¾§éå¸¸ç¨æ¥ reload ç¾¤æ°æ® */ |
| | | reload: [] |
| | | }>() |
| | | |
| | | const visible = ref(false) |
| | | const submitting = ref(false) |
| | | const groupId = ref(0) |
| | | const members = ref<GroupMemberLite[]>([]) |
| | | const hideIds = ref<number[]>([]) |
| | | const selectedIds = ref<number[]>([]) |
| | | |
| | | defineExpose({ |
| | | /** æå¼ç§»é¤ç¾¤æåå¼¹çªï¼reset â çå â visible=true */ |
| | | open(opts: { |
| | | groupId: number |
| | | /** éè userIdï¼ç¾¤ä¸»å§ç»éèï¼ç®¡çåè§è§é¢å¤éèå
¶å®ç®¡çå */ |
| | | hideIds?: number[] |
| | | members: GroupMemberLite[] |
| | | }) { |
| | | groupId.value = opts.groupId |
| | | members.value = opts.members |
| | | hideIds.value = opts.hideIds ? [...opts.hideIds] : [] |
| | | selectedIds.value = [] |
| | | submitting.value = false |
| | | visible.value = true |
| | | } |
| | | }) |
| | | |
| | | /** 䏿¬¡æ§æ¹é踢人ï¼é䏿å userId æ°ç»ä¼ ç»åç«¯ï¼æ¯å¾ªç¯è° N 次æ¥å£çå¾è¿ */ |
| | | async function handleOk() { |
| | | if (!groupId.value || selectedIds.value.length === 0) { |
| | | return |
| | | } |
| | | submitting.value = true |
| | | try { |
| | | const memberUserIds = [...selectedIds.value] |
| | | await removeGroupMember({ groupId: groupId.value, memberUserIds }) |
| | | message.success(`å·²ç§»é¤ ${memberUserIds.length} 使å`) |
| | | emit('reload') |
| | | visible.value = false |
| | | } finally { |
| | | submitting.value = false |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- |
| | | ç§»é¤ç¾¤æåï¼éæå â removeGroupMember æ¹é踢人 |
| | | - dialog 壳æ¬ç»ä»¶ææï¼éæ© UI å§æ GroupMemberPickerPanel |
| | | - 群主 / 管çåè§è§çä¸å¯ç§»é¤æåéè¿ hideIds éèï¼ç±è°ç¨æ¹ä¼ å
¥ |
| | | - 坹夿¥å£ï¼ref + open({ groupId, members, hideIds }) + emit reload() |
| | | --> |
| | | <Modal |
| | | v-model:open="visible" |
| | | title="ç§»åºç¾¤æå" |
| | | width="700px" |
| | | :mask-closable="false" |
| | | class="im-picker-dialog" |
| | | > |
| | | <div class="h-[480px]"> |
| | | <GroupMemberPickerPanel |
| | | v-model:selected-ids="selectedIds" |
| | | :members="members" |
| | | :hide-ids="hideIds" |
| | | :max-size="50" |
| | | /> |
| | | </div> |
| | | |
| | | <template #footer> |
| | | <Button @click="visible = false">åæ¶</Button> |
| | | <Button |
| | | type="primary" |
| | | :loading="submitting" |
| | | :disabled="selectedIds.length === 0" |
| | | @click="handleOk" |
| | | > |
| | | ç§»åº |
| | | </Button> |
| | | </template> |
| | | </Modal> |
| | | </template> |
| | | |
| | | <style scoped lang="scss"> |
| | | @use '../picker/picker-dialog' as picker; |
| | | |
| | | /* :deep ç©¿é el-dialog å
é¨ç±»ï¼å¤ç¨ picker å
Œ
± mixin */ |
| | | .im-picker-dialog { |
| | | @include picker.styles; |
| | | } |
| | | </style> |