| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { GroupMemberLite } from './group-member.vue' |
| | | |
| | | import { ref } from 'vue' |
| | | |
| | | import { Button, message, Modal } from 'ant-design-vue' |
| | | |
| | | import { addGroupAdmin, removeGroupAdmin } from '#/api/im/group' |
| | | import { GROUP_ADMIN_MAX_COUNT } from '#/views/im/utils/config' |
| | | |
| | | import { GroupMemberPickerPanel } from '../picker' |
| | | |
| | | defineOptions({ name: 'ImGroupAdminSetDialog' }) |
| | | |
| | | const emit = defineEmits<{ |
| | | /** 管çååæ´æåï¼ç¶ä¾§éå¸¸ç¨æ¥ reload ç¾¤æ°æ® */ |
| | | reload: [] |
| | | }>() |
| | | |
| | | const visible = ref(false) |
| | | const submitting = ref(false) |
| | | const groupId = ref(0) |
| | | const members = ref<GroupMemberLite[]>([]) |
| | | const currentAdminIds = ref<number[]>([]) // å½å管çå userId å表ï¼é»è®¤å¾é + æäº¤æ¶ diff |
| | | const hideIds = ref<number[]>([]) |
| | | const maxSize = ref(GROUP_ADMIN_MAX_COUNT) |
| | | const selectedIds = ref<number[]>([]) |
| | | |
| | | defineExpose({ |
| | | /** æå¼è®¾ç½®ç®¡çåå¼¹çªï¼reset â çå â visible=true */ |
| | | open(opts: { |
| | | /** å½å管çå userId å表ï¼é»è®¤å¾éï¼ */ |
| | | currentAdminIds: number[] |
| | | groupId: number |
| | | /** éè userIdï¼ç¾¤ä¸»ï¼ */ |
| | | hideIds?: number[] |
| | | /** 已鿰ä¸éï¼ä¸ä¼ èµ° GROUP_ADMIN_MAX_COUNT */ |
| | | maxSize?: number |
| | | members: GroupMemberLite[] |
| | | }) { |
| | | groupId.value = opts.groupId |
| | | members.value = opts.members |
| | | currentAdminIds.value = [...opts.currentAdminIds] |
| | | hideIds.value = opts.hideIds ? [...opts.hideIds] : [] |
| | | maxSize.value = opts.maxSize ?? GROUP_ADMIN_MAX_COUNT |
| | | selectedIds.value = [...opts.currentAdminIds] |
| | | submitting.value = false |
| | | visible.value = true |
| | | } |
| | | }) |
| | | |
| | | /** è·å½å管çåå表åå·®éï¼å嫿¿å°è¦æ°å¢ / æ¤éç userId */ |
| | | async function handleOk() { |
| | | if (!groupId.value) { |
| | | return |
| | | } |
| | | const previousIds = currentAdminIds.value |
| | | const previousIdSet = new Set(previousIds) |
| | | const nextIds = selectedIds.value |
| | | const nextIdSet = new Set(nextIds) |
| | | const addedIds = nextIds.filter((id) => !previousIdSet.has(id)) |
| | | const removedIds = previousIds.filter((id) => !nextIdSet.has(id)) |
| | | if (addedIds.length === 0 && removedIds.length === 0) { |
| | | visible.value = false |
| | | return |
| | | } |
| | | submitting.value = true |
| | | try { |
| | | if (addedIds.length > 0) { |
| | | await addGroupAdmin({ id: groupId.value, userIds: addedIds }) |
| | | } |
| | | if (removedIds.length > 0) { |
| | | await removeGroupAdmin({ id: groupId.value, userIds: removedIds }) |
| | | } |
| | | message.success(`å·²æ´æ°ç¾¤ç®¡çåï¼æ°å¢ ${addedIds.length} ä½ï¼æ¤é ${removedIds.length} ä½ï¼`) |
| | | emit('reload') |
| | | visible.value = false |
| | | } finally { |
| | | submitting.value = false |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- |
| | | 设置群管çåï¼ä¸ä¸ªå¼¹çªåå¹¶å¢ / å ï¼æäº¤æ¶è·å½å管çåå表 diff |
| | | - dialog 壳æ¬ç»ä»¶ææï¼éæ© UI å§æ GroupMemberPickerPanelï¼grid å½¢æå¯¹é½å½åè§è§ï¼ |
| | | - 群主ä»åéééèï¼ä¸è½è®¾ä¸ºç®¡çåï¼ |
| | | - 坹夿¥å£ï¼ref + open({ groupId, members, currentAdminIds, hideIds, maxSize }) + 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="maxSize" |
| | | selected-display="grid" |
| | | /> |
| | | </div> |
| | | |
| | | <template #footer> |
| | | <Button @click="visible = false">åæ¶</Button> |
| | | <Button type="primary" :loading="submitting" @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> |