新增群公告空页面和编辑页面,并处理对应的状态切换按钮

This commit is contained in:
wangyifeng 2025-05-19 19:56:28 +08:00
parent 19e4954484
commit cecca6df9c
3 changed files with 174 additions and 22 deletions

View File

@ -10,28 +10,32 @@
{{ title }} {{ title }}
</template> </template>
<div class="custom-close-btn" v-if="customCloseBtn"> <div class="custom-close-btn" v-if="customCloseBtn">
<img src="@/assets/image/icon/close-btn-grey.png" alt="" @click="handleCloseModal"/> <img src="@/assets/image/icon/close-btn-grey.png" alt="" @click="handleCloseModal" />
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<slot name="content"></slot> <slot name="content"></slot>
<template #footer v-if="actionBtns.cancelBtn || actionBtns.confirmBtn"> <template #footer v-if="actionBtns?.cancelBtn || actionBtns?.confirmBtn">
<div class="custom-modal-btns"> <div
class="custom-modal-btns"
:style="props?.customModalBtnsStyle ? props.customModalBtnsStyle : ''"
>
<customBtn <customBtn
color="#C7C7C9" color="#C7C7C9"
style="width: 161px; height: 34px;" style="width: 161px; height: 34px;"
@click="handleCancel" @click="handleCancel"
v-if="actionBtns.cancelBtn" v-if="actionBtns?.cancelBtn"
>取消</customBtn >{{ actionBtns?.cancelBtn?.text || '取消' }}</customBtn
> >
<customBtn <customBtn
color="#46299D" color="#46299D"
style="width: 161px; height: 34px;" style="width: 161px; height: 34px;"
@click="handleConfirm" @click="handleConfirm"
:loading="state.confirmBtnLoading" :disabled="actionBtns?.confirmBtn?.disabled"
v-if="actionBtns.confirmBtn" :loading="state.confirmBtnLoading && actionBtns?.confirmBtn?.doLoading"
>确定</customBtn v-if="actionBtns?.confirmBtn"
>{{ actionBtns?.confirmBtn?.text || '确定' }}</customBtn
> >
</div> </div>
</template> </template>
@ -63,6 +67,11 @@ const props = defineProps({
// //
type: Boolean, type: Boolean,
default: false default: false
},
customModalBtnsStyle: {
//
type: String,
default: ''
} }
}) })
@ -74,12 +83,16 @@ const show = computed({
}) })
const handleCancel = () => { const handleCancel = () => {
show.value = false if (props.actionBtns?.cancelBtn?.hideModal) {
show.value = false
}
emit('cancel') emit('cancel')
} }
const handleConfirm = () => { const handleConfirm = () => {
state.confirmBtnLoading = true if (props.actionBtns?.confirmBtn?.doLoading) {
state.confirmBtnLoading = true
}
emit('confirm', closeLoading) emit('confirm', closeLoading)
} }

View File

@ -19,7 +19,12 @@ import UserCardModal from '@/components/user/UserCardModal.vue'
const userStore = useUserStore() const userStore = useUserStore()
const { showUserInfoModal } = useInject() const { showUserInfoModal } = useInject()
const emit = defineEmits(['close', 'to-talk', 'handleSearchRecordByConditionModalShow']) const emit = defineEmits([
'close',
'to-talk',
'handleSearchRecordByConditionModalShow',
'handleGroupNoticeModalShow'
])
const props = defineProps({ const props = defineProps({
gid: { gid: {
type: Number, type: Number,
@ -59,8 +64,12 @@ const state = reactive({
chatSettingOperateHint: '', // chatSettingOperateHint: '', //
chatSettingOperateSubHint: '', // chatSettingOperateSubHint: '', //
actionBtns: { actionBtns: {
confirmBtn: true, confirmBtn: {
cancelBtn: true doLoading: true
},
cancelBtn: {
hideModal: true
}
}, // }, //
showAllMember: false, // showAllMember: false, //
openGroupMemberSearch: false, // openGroupMemberSearch: false, //
@ -192,9 +201,11 @@ const showChatSettingOperateModal = (type: string) => {
switch (type) { switch (type) {
case 'clear': case 'clear':
state.chatSettingOperateHint = '确定清空聊天记录' state.chatSettingOperateHint = '确定清空聊天记录'
state.chatSettingOperateSubHint = ''
break break
case 'dismiss': case 'dismiss':
state.chatSettingOperateHint = '确定解散本群' state.chatSettingOperateHint = '确定解散本群'
state.chatSettingOperateSubHint = ''
break break
case 'quit': case 'quit':
state.chatSettingOperateHint = '确定退出群聊' state.chatSettingOperateHint = '确定退出群聊'
@ -209,6 +220,7 @@ const showChatSettingOperateModal = (type: string) => {
} }
} }
//
const showSearchRecordByConditionModal = () => { const showSearchRecordByConditionModal = () => {
emit('handleSearchRecordByConditionModalShow', true) emit('handleSearchRecordByConditionModalShow', true)
} }
@ -243,6 +255,11 @@ const showMemberInfo = (memberItem: any) => {
state.userInfo = memberItem state.userInfo = memberItem
state.isShowUserCardModal = true state.isShowUserCardModal = true
} }
//
const showGroupNoticeModal = () => {
emit('handleGroupNoticeModalShow', true)
}
</script> </script>
<template> <template>
<section class="el-container is-vertical section"> <section class="el-container is-vertical section">
@ -402,7 +419,7 @@ const showMemberInfo = (memberItem: any) => {
</div> --> </div> -->
<div class="b-box b-box-bottomBorder" style="padding: 0 0 12px;"> <div class="b-box b-box-bottomBorder" style="padding: 0 0 12px;">
<div class="block"> <div class="block" @click="showGroupNoticeModal" style="cursor: pointer;">
<div class="title">群公告</div> <div class="title">群公告</div>
<!-- <div class="text"> --> <!-- <div class="text"> -->
<!-- <n-button type="primary" text> 更多 </n-button> --> <!-- <n-button type="primary" text> 更多 </n-button> -->
@ -414,12 +431,8 @@ const showMemberInfo = (memberItem: any) => {
</div> </div>
<div class="info-box"> <div class="info-box">
<div <div class="b-box b-box-bottomBorder">
class="b-box b-box-bottomBorder" <div class="block" @click="showSearchRecordByConditionModal" style="cursor: pointer;">
@click="showSearchRecordByConditionModal"
style="cursor: pointer;"
>
<div class="block">
<div class="title">查找聊天记录</div> <div class="title">查找聊天记录</div>
<img class="icon-right" src="@/assets/image/icon/arrow-right-grey.png" alt="" /> <img class="icon-right" src="@/assets/image/icon/arrow-right-grey.png" alt="" />
</div> </div>

View File

@ -42,7 +42,24 @@ const state = reactive({
}, // }, //
searchRecordByConditionText: '', // searchRecordByConditionText: '', //
conditionTag: '', // conditionTag: '', //
conditionType: '' // conditionType: '', //
isShowGroupNoticeModal: false, //
customGroupNoticeModalStyle: {
width: '997px',
height: '740px'
}, //
groupNoticeModalActionBtns: {
confirmBtn: {
text: '编辑',
doLoading: false,
disabled: false
},
cancelBtn: false
}, //
groupNoticeModalActionBtnsStyle: 'padding: 20px 0;', //
groupNoticeInEdit: '', //
groupNoticeEditMode: 3, //2=3=
groupNoticeModalConfirmBtnEvent: 'edit' //
}) })
const events = { const events = {
@ -82,6 +99,48 @@ const changeConditionTag = (tag) => {
state.conditionTag = '' state.conditionTag = ''
} }
} }
//
const handleGroupNoticeModalConfirm = () => {
if (state.groupNoticeModalConfirmBtnEvent === 'edit') {
//
state.groupNoticeEditMode = 2
state.groupNoticeModalActionBtns = {
confirmBtn: {
text: '完成',
doLoading: true,
disabled: true
},
cancelBtn: true
}
}
}
//
const handleGroupNoticeModalCancel = () => {
if (state.groupNoticeModalConfirmBtnEvent === 'edit') {
//
state.groupNoticeEditMode = 3
state.groupNoticeModalActionBtns = {
confirmBtn: {
text: '编辑',
doLoading: false,
disabled: false
},
cancelBtn: false
}
}
}
//
const handleGroupNoticeModalInput = (value) => {
console.log(value)
if (value.trim()) {
state.groupNoticeModalActionBtns.confirmBtn.disabled = false
} else {
state.groupNoticeModalActionBtns.confirmBtn.disabled = true
}
}
</script> </script>
<template> <template>
@ -164,12 +223,15 @@ const changeConditionTag = (tag) => {
@close="state.isShowGroupAside = false" @close="state.isShowGroupAside = false"
:talkType="talkParams.type" :talkType="talkParams.type"
@handleSearchRecordByConditionModalShow="state.isShowSearchRecordByConditionModal = true" @handleSearchRecordByConditionModalShow="state.isShowSearchRecordByConditionModal = true"
@handleGroupNoticeModalShow="state.isShowGroupNoticeModal = true"
/> />
</n-drawer> </n-drawer>
<customModal <customModal
v-model:show="state.isShowSearchRecordByConditionModal" v-model:show="state.isShowSearchRecordByConditionModal"
:title="`${talkParams.type === 1 ? '与' : ''}&quot;${talkParams.username}&quot;的聊天记录`" :title="`${talkParams.type === 1 ? '与' : ''}&nbsp;&quot;${
talkParams.username
}&quot;&nbsp;的聊天记录`"
:style="state.customSearchRecordByConditionModalStyle" :style="state.customSearchRecordByConditionModalStyle"
:customCloseBtn="true" :customCloseBtn="true"
:closable="false" :closable="false"
@ -239,6 +301,41 @@ const changeConditionTag = (tag) => {
</div> </div>
</template> </template>
</customModal> </customModal>
<customModal
v-model:show="state.isShowGroupNoticeModal"
:title="`&quot;${talkParams.username}&quot;&nbsp;的群公告`"
:style="state.customGroupNoticeModalStyle"
:customCloseBtn="true"
:closable="false"
:actionBtns="state.groupNoticeModalActionBtns"
:customModalBtnsStyle="state.groupNoticeModalActionBtnsStyle"
@confirm="handleGroupNoticeModalConfirm"
@cancel="handleGroupNoticeModalCancel"
>
<template #content>
<div class="group-notice-modal-content">
<div class="group-notice-text-area" v-if="state.groupNoticeEditMode === 2">
<n-input
v-model:value="state.groupNoticeInEdit"
type="textarea"
:autosize="{
minRows: 22,
maxRows: 22
}"
placeholder="请输入"
:maxlength="500"
:show-count="true"
@input="handleGroupNoticeModalInput"
/>
</div>
<div class="group-notice-empty" v-if="state.groupNoticeEditMode === 3">
<img src="@/assets/image/chatList/search-empty.png" alt="" />
<span>暂无公告</span>
</div>
</div>
</template>
</customModal>
</template> </template>
<style lang="less" scoped> <style lang="less" scoped>
@ -312,4 +409,33 @@ const changeConditionTag = (tag) => {
} }
} }
} }
.group-notice-modal-content {
.group-notice-text-area {
:deep(.n-input-wrapper) {
padding: 20px 23px 15px;
}
:deep(.n-input-word-count) {
right: 23px;
bottom: 15px;
}
}
.group-notice-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 552px;
box-sizing: border-box;
img {
width: 160px;
height: 104px;
}
span {
font-size: 14px;
color: #999;
font-weight: 400;
margin: 14px 0 0;
}
}
}
</style> </style>