|
@@ -2,19 +2,41 @@
|
|
<div>
|
|
<div>
|
|
<i class="icon icon-chat-setting" @click="toggleShow"></i>
|
|
<i class="icon icon-chat-setting" @click="toggleShow"></i>
|
|
<div class="manage" :class="[isH5 ? 'manage-h5' : '']" v-if="show" ref="dialog">
|
|
<div class="manage" :class="[isH5 ? 'manage-h5' : '']" v-if="show" ref="dialog">
|
|
- <header class="manage-header">
|
|
|
|
|
|
+ <header :class="['manage-header', currentTab === 'onlyMute' ? 'currentModel' : '']">
|
|
<i class="icon icon-back" v-if="isH5 && !currentTab" @click="toggleShow"></i>
|
|
<i class="icon icon-back" v-if="isH5 && !currentTab" @click="toggleShow"></i>
|
|
|
|
+
|
|
<aside class="manage-header-left">
|
|
<aside class="manage-header-left">
|
|
- <i class="icon icon-back" v-if="currentTab" @click="setTab('')"></i>
|
|
|
|
- <main>
|
|
|
|
|
|
+ <i class="icon icon-back" v-if="currentTab" @click="() =>{
|
|
|
|
+ currentModel = 'not_mute'
|
|
|
|
+ setTab('')
|
|
|
|
+ }"></i>
|
|
|
|
+ <main v-if="currentTab !== 'onlyMute'">
|
|
<h1>{{ $t(`TUIChat.manage.${TabName}`) }}</h1>
|
|
<h1>{{ $t(`TUIChat.manage.${TabName}`) }}</h1>
|
|
</main>
|
|
</main>
|
|
|
|
+ <n-tabs
|
|
|
|
+ v-else
|
|
|
|
+ justify-content="center"
|
|
|
|
+ style="margin-left: -14Px;flex: 1; --n-tab-padding: 6px 0; --n-tab-gap: 34px; --n-tab-text-color: #000; --n-tab-text-color-hover: #0f0f0f; --n-tab-text-color-active: #000; --n-tab-font-weight-active: 600; --n-bar-color: #198cfe"
|
|
|
|
+ :bar-width="20"
|
|
|
|
+ :value="currentModel"
|
|
|
|
+ @update:value="
|
|
|
|
+ (val: any) => {
|
|
|
|
+ currentModel = val;
|
|
|
|
+ mutePage = 1
|
|
|
|
+ muteSearch = ''
|
|
|
|
+ getUserList()
|
|
|
|
+ }
|
|
|
|
+ "
|
|
|
|
+ >
|
|
|
|
+ <n-tab-pane name="not_mute" tab="未禁言"></n-tab-pane>
|
|
|
|
+ <n-tab-pane name="mute" tab="已禁言"></n-tab-pane>
|
|
|
|
+ </n-tabs>
|
|
</aside>
|
|
</aside>
|
|
- <span>
|
|
|
|
|
|
+ <span v-if="currentTab !== 'onlyMute'">
|
|
<i v-if="!isH5" class="icon icon-close" @click="toggleShow"></i>
|
|
<i v-if="!isH5" class="icon icon-close" @click="toggleShow"></i>
|
|
</span>
|
|
</span>
|
|
</header>
|
|
</header>
|
|
- <main class="main" style="background-color: #f4f5f9; height: 100%" v-if="!currentTab">
|
|
|
|
|
|
+ <main :class="['main']" style="background-color: #f4f5f9; height: 100%" v-if="!currentTab">
|
|
<ManageName class="space-top" :isAuth="isAuth" :isH5="isH5" :data="conversation.groupProfile" @update="updateProfile" style="background-color: #fff" />
|
|
<ManageName class="space-top" :isAuth="isAuth" :isH5="isH5" :data="conversation.groupProfile" @update="updateProfile" style="background-color: #fff" />
|
|
<div class="userInfo space-top" style="background-color: #fff">
|
|
<div class="userInfo space-top" style="background-color: #fff">
|
|
<header class="userInfo-header" @click="setTab('member')">
|
|
<header class="userInfo-header" @click="setTab('member')">
|
|
@@ -97,14 +119,29 @@
|
|
</li> -->
|
|
</li> -->
|
|
</ul>
|
|
</ul>
|
|
|
|
|
|
- <div v-if="currentUserDetail.groupRoleType === 'Owner'" class="admin-content space-top" style="background-color: #fff; padding-top: 12px">
|
|
|
|
|
|
+ <div v-if="currentUserDetail.groupRoleType === 'Owner'" class="admin-content space-top" style="background-color: #fff; padding-top: 12px;border-top: 1Px solid #f4f5f9;">
|
|
<aside>
|
|
<aside>
|
|
<label>学生禁言</label>
|
|
<label>学生禁言</label>
|
|
</aside>
|
|
</aside>
|
|
<Slider :open="groupDetail.configJson.mute" @change="setAllMuteTime" />
|
|
<Slider :open="groupDetail.configJson.mute" @change="setAllMuteTime" />
|
|
</div>
|
|
</div>
|
|
|
|
+ <div v-if="currentUserDetail.groupRoleType === 'Owner'" class="admin-content space-top" style="background-color: #fff; padding-top: 12px;border-top: 1Px solid #f4f5f9;" @click.stop="() => {
|
|
|
|
+ userInfo.muteList = []
|
|
|
|
+ setTab('onlyMute')
|
|
|
|
+ }">
|
|
|
|
+ <aside>
|
|
|
|
+ <label>禁言名单</label>
|
|
|
|
+ </aside>
|
|
|
|
+ <i class="icon icon-right end"></i>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-if="currentUserDetail.groupRoleType === 'Owner' && userInfo?.list.length > 1" class="admin-content space-top" style="background-color: #fff;padding-top: 12px; border-top: 1Px solid #f4f5f9;" @click.stop="toggleMask('changeOwner')">
|
|
|
|
+ <aside>
|
|
|
|
+ <label>移交群主</label>
|
|
|
|
+ </aside>
|
|
|
|
+ <i class="icon icon-right end"></i>
|
|
|
|
+ </div>
|
|
<ul class="footer space-top">
|
|
<ul class="footer space-top">
|
|
- <li v-if="currentUserDetail.groupRoleType === 'Owner' && userInfo?.list.length > 1" @click.stop="toggleMask('changeOwner')">移交群主</li>
|
|
|
|
|
|
+ <!-- <li v-if="currentUserDetail.groupRoleType === 'Owner' && userInfo?.list.length > 1" @click.stop="toggleMask('changeOwner')">移交群主</li> -->
|
|
<li v-if="currentUserDetail.groupRoleType === 'Owner'" @click.stop="dismiss(conversation.groupProfile)">解散群聊</li>
|
|
<li v-if="currentUserDetail.groupRoleType === 'Owner'" @click.stop="dismiss(conversation.groupProfile)">解散群聊</li>
|
|
<li v-else @click.stop="quit(conversation.groupProfile)">退出群组</li>
|
|
<li v-else @click.stop="quit(conversation.groupProfile)">退出群组</li>
|
|
</ul>
|
|
</ul>
|
|
@@ -158,6 +195,25 @@
|
|
</ol>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</main>
|
|
|
|
+ <ManageMute v-else-if="currentTab === 'onlyMute'" :currentModel="currentModel"
|
|
|
|
+ :total="muteTotal"
|
|
|
|
+ :self="conversation.groupProfile.selfInfo" :list="userInfo.muteList"
|
|
|
|
+ :conversation="conversation"
|
|
|
|
+ :muteLoading="muteLoading"
|
|
|
|
+ @more="getUserList('more')"
|
|
|
|
+ @del="submit"
|
|
|
|
+ @back="() => {
|
|
|
|
+ setTab('');
|
|
|
|
+ currentModel = 'not_mute'
|
|
|
|
+ }"
|
|
|
|
+ @search="(keyword) => {
|
|
|
|
+ mutePage = 1
|
|
|
|
+ muteSearch = keyword
|
|
|
|
+ userInfo.muteList = []
|
|
|
|
+ getUserList()
|
|
|
|
+ }"
|
|
|
|
+ @handleMemberProfileShow="handleMemberProfileShow" />
|
|
|
|
+
|
|
<MaskTUI :show="mask" @update:show="(e) => (mask = e)">
|
|
<MaskTUI :show="mask" @update:show="(e) => (mask = e)">
|
|
<Transfer :title="$t(`TUIChat.manage.${transferTitle}`)" :list="transferList" :isSearch="isSearch" :isRadio="isRadio" :selectedList="selectedList" @submit="submit" @cancel="cancel" @search="handleSearchMember" :isH5="isH5" />
|
|
<Transfer :title="$t(`TUIChat.manage.${transferTitle}`)" :list="transferList" :isSearch="isSearch" :isRadio="isRadio" :selectedList="selectedList" @submit="submit" @cancel="cancel" @search="handleSearchMember" :isH5="isH5" />
|
|
</MaskTUI>
|
|
</MaskTUI>
|
|
@@ -191,6 +247,7 @@ import ManageName from "./manage-name.vue";
|
|
import ManageNotification from "./manage-notification.vue";
|
|
import ManageNotification from "./manage-notification.vue";
|
|
import ManageMember from "./manage-member.vue";
|
|
import ManageMember from "./manage-member.vue";
|
|
import MemeberProfile from "./member-profile.vue";
|
|
import MemeberProfile from "./member-profile.vue";
|
|
|
|
+import ManageMute from './manage-mute.vue'
|
|
import DialogTUI from "../../../components/dialogTUi/index.vue";
|
|
import DialogTUI from "../../../components/dialogTUi/index.vue";
|
|
import { imGroupChangeGroupOwner, imGroupDetail, imGroupDismiss, imGroupMemberPage, imGroupMemberSaveImAll, imGroupMemberUserDetail, imGroupMuteAll, imGroupQuit, imUserFriendPage } from "../../../../api";
|
|
import { imGroupChangeGroupOwner, imGroupDetail, imGroupDismiss, imGroupMemberPage, imGroupMemberSaveImAll, imGroupMemberUserDetail, imGroupMuteAll, imGroupQuit, imUserFriendPage } from "../../../../api";
|
|
import Vuex from "vuex";
|
|
import Vuex from "vuex";
|
|
@@ -207,6 +264,7 @@ const manage = defineComponent({
|
|
ManageNotification,
|
|
ManageNotification,
|
|
ManageMember,
|
|
ManageMember,
|
|
MemeberProfile,
|
|
MemeberProfile,
|
|
|
|
+ ManageMute,
|
|
DialogTUI,
|
|
DialogTUI,
|
|
},
|
|
},
|
|
props: {
|
|
props: {
|
|
@@ -240,6 +298,7 @@ const manage = defineComponent({
|
|
userInfo: {
|
|
userInfo: {
|
|
isGroup: false,
|
|
isGroup: false,
|
|
list: [],
|
|
list: [],
|
|
|
|
+ muteList: []
|
|
},
|
|
},
|
|
isShowMuteTimeInput: false,
|
|
isShowMuteTimeInput: false,
|
|
editLableName: "",
|
|
editLableName: "",
|
|
@@ -275,7 +334,12 @@ const manage = defineComponent({
|
|
classGroupDetail: {}, // 群详情
|
|
classGroupDetail: {}, // 群详情
|
|
page: 1, // 当前默认查询第一页数据
|
|
page: 1, // 当前默认查询第一页数据
|
|
currentUserDetail: {} as any, // 用户信息
|
|
currentUserDetail: {} as any, // 用户信息
|
|
|
|
+ mutePage: 1,
|
|
|
|
+ muteSearch: '',
|
|
|
|
+ muteLoading: false,
|
|
|
|
+ muteTotal: 0,
|
|
groupDetail: {} as any,
|
|
groupDetail: {} as any,
|
|
|
|
+ currentModel: 'not_mute'
|
|
});
|
|
});
|
|
|
|
|
|
const dialog: any = ref();
|
|
const dialog: any = ref();
|
|
@@ -433,6 +497,37 @@ const manage = defineComponent({
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ // 禁言
|
|
|
|
+ const getUserList = async (type?: string) => {
|
|
|
|
+ data.muteLoading = true;
|
|
|
|
+ try {
|
|
|
|
+ const { conversation } = data;
|
|
|
|
+ const options: any = {
|
|
|
|
+ groupId: conversation?.groupProfile?.groupID,
|
|
|
|
+ rows: 100,
|
|
|
|
+ groupMute: data.currentModel === 'not_mute' ? false : true,
|
|
|
|
+ groupRoleTypes: ['Member'],
|
|
|
|
+ page: type && type === "more" ? data.mutePage + 1 : data.mutePage,
|
|
|
|
+ keyword: data.muteSearch
|
|
|
|
+ };
|
|
|
|
+ await imGroupMemberPage(options).then((res: any) => {
|
|
|
|
+ const rows = res.data.rows || [];
|
|
|
|
+ rows.forEach((row: any) => {
|
|
|
|
+ row.nick = row.nickname;
|
|
|
|
+ });
|
|
|
|
+ if (type && type === "more") {
|
|
|
|
+ data.userInfo.muteList = [...data.userInfo.list, ...rows];
|
|
|
|
+ } else {
|
|
|
|
+ data.userInfo.muteList = rows;
|
|
|
|
+ }
|
|
|
|
+ data.muteTotal = res.data.total || 0;
|
|
|
|
+ });
|
|
|
|
+ } catch {
|
|
|
|
+ //
|
|
|
|
+ }
|
|
|
|
+ data.muteLoading = false;
|
|
|
|
+ };
|
|
|
|
+
|
|
const addMember = async (userIDList: any) => {
|
|
const addMember = async (userIDList: any) => {
|
|
const { conversation } = data;
|
|
const { conversation } = data;
|
|
// const options: any = {
|
|
// const options: any = {
|
|
@@ -572,6 +667,9 @@ const manage = defineComponent({
|
|
};
|
|
};
|
|
|
|
|
|
const setTab = (tabName: string) => {
|
|
const setTab = (tabName: string) => {
|
|
|
|
+ if(tabName === 'onlyMute') {
|
|
|
|
+ getUserList()
|
|
|
|
+ }
|
|
data.currentTab = tabName;
|
|
data.currentTab = tabName;
|
|
data.editLableName = "";
|
|
data.editLableName = "";
|
|
if (data.currentTab === "member") {
|
|
if (data.currentTab === "member") {
|
|
@@ -580,6 +678,7 @@ const manage = defineComponent({
|
|
if (!data.currentTab) {
|
|
if (!data.currentTab) {
|
|
data.transferType = "";
|
|
data.transferType = "";
|
|
}
|
|
}
|
|
|
|
+
|
|
};
|
|
};
|
|
|
|
|
|
const handleSearchMember = async (value: string) => {
|
|
const handleSearchMember = async (value: string) => {
|
|
@@ -689,7 +788,7 @@ const manage = defineComponent({
|
|
break;
|
|
break;
|
|
case "changeOwner":
|
|
case "changeOwner":
|
|
data.isRadio = true;
|
|
data.isRadio = true;
|
|
- data.transferList = [...data.member.admin, ...data.member.member];
|
|
|
|
|
|
+ data.transferList = [...data.member.admin, ...data.member.member].filter(item => item.roleType !== "STUDENT");
|
|
data.transferTitle = "转让群组";
|
|
data.transferTitle = "转让群组";
|
|
console.log(data.transferList, "data.transferList");
|
|
console.log(data.transferList, "data.transferList");
|
|
break;
|
|
break;
|
|
@@ -894,6 +993,7 @@ const manage = defineComponent({
|
|
setTab,
|
|
setTab,
|
|
TabName,
|
|
TabName,
|
|
getMember,
|
|
getMember,
|
|
|
|
+ getUserList,
|
|
handleSearchMember,
|
|
handleSearchMember,
|
|
submit,
|
|
submit,
|
|
cancel,
|
|
cancel,
|