Compare commits

...

2 Commits

Author SHA1 Message Date
dd31ad21be Merge branch 'LiWenHao'
Some checks are pending
Check / lint (push) Waiting to run
Check / typecheck (push) Waiting to run
Check / build (build, 18.x, ubuntu-latest) (push) Waiting to run
Check / build (build, 18.x, windows-latest) (push) Waiting to run
Check / build (build:app, 18.x, ubuntu-latest) (push) Waiting to run
Check / build (build:app, 18.x, windows-latest) (push) Waiting to run
Check / build (build:mp-weixin, 18.x, ubuntu-latest) (push) Waiting to run
Check / build (build:mp-weixin, 18.x, windows-latest) (push) Waiting to run
2025-04-24 09:49:20 +08:00
c139828e71 通讯录 2025-04-24 09:48:52 +08:00
4 changed files with 877 additions and 945 deletions

View File

@ -1,6 +1,7 @@
<template> <template>
<tm-navbar <tm-navbar
:hideBack="props.hideBack" :hideBack="props.hideBack"
:hideHome="props.hideHome"
:title="props.title" :title="props.title"
:shadow="props.shadowNum" :shadow="props.shadowNum"
:fontSize="34" :fontSize="34"
@ -37,6 +38,10 @@ const props = defineProps({
type: Number, type: Number,
default: 1, default: 1,
}, },
hideHome: {
type: Boolean,
default: false,
},
}) })
</script> </script>

View File

@ -90,6 +90,12 @@ export function createApp() {
window.updateUserInfo = () => { window.updateUserInfo = () => {
useUserStore().loadSetting() useUserStore().loadSetting()
} }
// 通讯录跳转
window.handleContacts = () => {
uni.navigateTo({
url: '/pages/chooseByDeps/index?chooseMode=3&type=true'
});
};
//处理OA、墨册强制刷新时聊天同步强制刷新 //处理OA、墨册强制刷新时聊天同步强制刷新
window.doLocationRefresh = () => { window.doLocationRefresh = () => {

View File

@ -3,58 +3,47 @@
<zPaging ref="zPaging" :show-scrollbar="false"> <zPaging ref="zPaging" :show-scrollbar="false">
<template #top> <template #top>
<div :class="state.chooseMode === 3 ? 'top_bg' : ''"> <div :class="state.chooseMode === 3 ? 'top_bg' : ''">
<customNavbar <!-- <customNavbar
:class="state.chooseMode === 3 ? 'index_top_navbar' : ''" :class="state.chooseMode === 3 ? 'index_top_navbar' : ''"
:title="pageTitle" :title="pageTitle"
></customNavbar> ></customNavbar> -->
<customNavbar :class="state.chooseMode === 3 ? 'index_top_navbar' : ''" :title="pageTitle" :hideHome="navshow"
:hideBack="navshow">
<template #left>
<tm-icon @click="goWebHome" v-if="navshow" name="tmicon-angle-left"
style="padding-left: 30rpx;"></tm-icon>
</template>
</customNavbar>
<div class="pl-[32rpx] pr-[32rpx] pt-[32rpx] pb-[32rpx]"> <div class="pl-[32rpx] pr-[32rpx] pt-[32rpx] pb-[32rpx]">
<customInput <customInput :searchText="searchVal" @inputSearchText="inputSearchText"></customInput>
:searchText="searchVal"
@inputSearchText="inputSearchText"
></customInput>
</div> </div>
</div> </div>
</template> </template>
<div class="choose-deps"> <div class="choose-deps">
<div class="w-full pl-[32rpx] pr-[32rpx]"> <div class="w-full pl-[32rpx] pr-[32rpx]">
<div <div v-if="crumbs.length"
v-if="crumbs.length"
class="w-full overflow-x-auto mt-[22rpx] leading-[48rpx] text-[#2F2F2F] flex items-center no-scrollbar" class="w-full overflow-x-auto mt-[22rpx] leading-[48rpx] text-[#2F2F2F] flex items-center no-scrollbar"
ref="crumbsContainer" ref="crumbsContainer">
> <div v-for="(item, index) in crumbs"
<div class="flex items-center text-[28rpx] leading-[48rpx] whitespace-nowrap" :class="[
v-for="(item, index) in crumbs"
class="flex items-center text-[28rpx] leading-[48rpx] whitespace-nowrap"
:class="[
index === crumbsIndex ? 'text-[#747474]' : 'text-[#46299D]', index === crumbsIndex ? 'text-[#747474]' : 'text-[#46299D]',
index === 0 ? '' : 'ml-[12rpx]', index === 0 ? '' : 'ml-[12rpx]',
]" ]" @click="handleCrumbsClick(index)">
@click="handleCrumbsClick(index)"
>
<div>{{ item.name }}</div> <div>{{ item.name }}</div>
<div <div v-if="index !== crumbs.length - 1" class="ml-[20rpx] flex items-center mb-[2rpx]">
v-if="index !== crumbs.length - 1" <tm-icon name="tmicon-angle-right" :font-size="20"
class="ml-[20rpx] flex items-center mb-[2rpx]" :color="index !== crumbs.length - 1 ? '#7A58DE' : '#C1B4EA'"></tm-icon>
>
<tm-icon
name="tmicon-angle-right"
:font-size="20"
:color="index !== crumbs.length - 1 ? '#7A58DE' : '#C1B4EA'"
></tm-icon>
</div> </div>
</div> </div>
</div> </div>
<div <div v-if="
v-if="
(state.chooseMode === 1 || state.chooseMode === 2) && (state.chooseMode === 1 || state.chooseMode === 2) &&
((currentCrumbs?.sons?.length > 0 && ((currentCrumbs?.sons?.length > 0 &&
((state.chooseMode === 2 && !searchVal) || ((state.chooseMode === 2 && !searchVal) ||
state.chooseMode !== 2)) || state.chooseMode !== 2)) ||
currentMembers?.length > 0) currentMembers?.length > 0)
" " class="pl-[32rpx] bg-[#FFFFFF] mt-[20rpx] h-[110rpx] flex items-center"
class="pl-[32rpx] bg-[#FFFFFF] mt-[20rpx] h-[110rpx] flex items-center" @click="() => allCheck(allCheckStatus)">
@click="() => allCheck(allCheckStatus)"
>
<div class="mr-[20rpx]"> <div class="mr-[20rpx]">
<checkBox @change="(val) => allCheck(allCheckStatus)" :modelValue="allCheckStatus"></checkBox> <checkBox @change="(val) => allCheck(allCheckStatus)" :modelValue="allCheckStatus"></checkBox>
</div> </div>
@ -62,13 +51,10 @@
{{ $t('radio.btn.selectAll') }} {{ $t('radio.btn.selectAll') }}
</div> </div>
</div> </div>
<div <div v-if="
v-if="
currentCrumbs?.sons?.length > 0 && currentCrumbs?.sons?.length > 0 &&
((state.chooseMode === 2 && !searchVal) || state.chooseMode !== 2) ((state.chooseMode === 2 && !searchVal) || state.chooseMode !== 2)
" " v-for="item in currentCrumbs?.sons" @click="
v-for="item in currentCrumbs?.sons"
@click="
state.chooseMode === 1 || state.chooseMode === 2 state.chooseMode === 1 || state.chooseMode === 2
? checkItemChange( ? checkItemChange(
item, item,
@ -79,19 +65,11 @@
: 'checked', : 'checked',
) )
: '' : ''
" " class="pl-[32rpx] bg-[#FFFFFF] mt-[20rpx] h-[110rpx] flex items-center">
class="pl-[32rpx] bg-[#FFFFFF] mt-[20rpx] h-[110rpx] flex items-center"
>
<div class="w-full flex items-center justify-between"> <div class="w-full flex items-center justify-between">
<div class="flex items-center"> <div class="flex items-center">
<div <div class="mr-[20rpx]" v-if="state.chooseMode === 1 || state.chooseMode === 2">
class="mr-[20rpx]" <checkBox v-model="item.checkStatus" @change="(val) => checkItemChange(item, val)"></checkBox>
v-if="state.chooseMode === 1 || state.chooseMode === 2"
>
<checkBox
v-model="item.checkStatus"
@change="(val) => checkItemChange(item, val)"
></checkBox>
</div> </div>
<div class="font-medium text-[28rpx] leading-[40rpx]"> <div class="font-medium text-[28rpx] leading-[40rpx]">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
@ -100,63 +78,38 @@
</span> </span>
</div> </div>
</div> </div>
<div <div v-if="
v-if="
(item.sons?.length && state.chooseMode === 1) || (item.sons?.length && state.chooseMode === 1) ||
((state.chooseMode === 2 || state.chooseMode === 3) && ((state.chooseMode === 2 || state.chooseMode === 3) &&
getDepTotalMembers(item) > 0) getDepTotalMembers(item) > 0)
" " class="flex items-center mr-[32rpx]">
class="flex items-center mr-[32rpx]" <div class="vDivider mr-[32rpx]" v-if="state.chooseMode === 1"></div>
> <div v-if="state.chooseMode === 1" @click.stop="checkCurrentItem(item)"
<div class="flex items-center mr-[32rpx]" :class="{
class="vDivider mr-[32rpx]"
v-if="state.chooseMode === 1"
></div>
<div
v-if="state.chooseMode === 1"
@click.stop="checkCurrentItem(item)"
class="flex items-center mr-[32rpx]"
:class="{
'opacity-50 cursor-not-allowed': 'opacity-50 cursor-not-allowed':
item.checkStatus === 'checked', item.checkStatus === 'checked',
}" }">
>
<div class="mr-[20rpx]"> <div class="mr-[20rpx]">
<checkBox <checkBox :modelValue="
:modelValue="
item.currentChecked ? 'checked' : 'noChecked' item.currentChecked ? 'checked' : 'noChecked'
" " @change="() => checkCurrentItem(item)"></checkBox>
@change="() => checkCurrentItem(item)"
></checkBox>
</div> </div>
<div <div class="text-[28rpx] leading-[40rpx] font-medium text-[#46299D]">
class="text-[28rpx] leading-[40rpx] font-medium text-[#46299D]"
>
{{ $t('choose.deps.current') }} {{ $t('choose.deps.current') }}
</div> </div>
</div> </div>
<div class="vDivider mr-[32rpx]"></div> <div class="vDivider mr-[32rpx]"></div>
<div <div @click.stop="() => toNextLevel(item)" class="flex items-center">
@click.stop="() => toNextLevel(item)"
class="flex items-center"
>
<div class="mr-[12rpx]"> <div class="mr-[12rpx]">
<tm-image <tm-image :width="26" :height="26" :src="
:width="26"
:height="26"
:src="
item.checkStatus !== 'checked' ? downDep : downDepDis item.checkStatus !== 'checked' ? downDep : downDepDis
" "></tm-image>
></tm-image>
</div> </div>
<div <div class="text-[28rpx] leading-[40rpx] font-medium" :class="
class="text-[28rpx] leading-[40rpx] font-medium"
:class="
item.checkStatus !== 'checked' item.checkStatus !== 'checked'
? 'text-[#46299D]' ? 'text-[#46299D]'
: 'text-[#C1B4EA]' : 'text-[#C1B4EA]'
" ">
>
{{ $t('choose.deps.nextLevel') }} {{ $t('choose.deps.nextLevel') }}
</div> </div>
</div> </div>
@ -164,13 +117,10 @@
</div> </div>
</div> </div>
<div <div v-if="
v-if="
currentMembers.length && currentMembers.length &&
(state.chooseMode === 2 || state.chooseMode === 3) (state.chooseMode === 2 || state.chooseMode === 3)
" " v-for="item in currentMembers" @click="
v-for="item in currentMembers"
@click="
state.chooseMode === 1 || state.chooseMode === 2 state.chooseMode === 1 || state.chooseMode === 2
? checkMember( ? checkMember(
item, item,
@ -180,68 +130,39 @@
: 'checked', : 'checked',
) )
: toUserDetail(item) : toUserDetail(item)
" " class="pl-[32rpx] pr-[32rpx] bg-[#FFFFFF] mt-[20rpx] h-[110rpx] flex items-center">
class="pl-[32rpx] pr-[32rpx] bg-[#FFFFFF] mt-[20rpx] h-[110rpx] flex items-center"
>
<div class="w-full flex items-center justify-between"> <div class="w-full flex items-center justify-between">
<div class="w-full flex items-center"> <div class="w-full flex items-center">
<div <div class="mr-[20rpx]" v-if="state.chooseMode === 1 || state.chooseMode === 2">
class="mr-[20rpx]" <checkBox :disabled="isPreSelectedMember(item)" :modelValue="
v-if="state.chooseMode === 1 || state.chooseMode === 2"
>
<checkBox
:disabled="isPreSelectedMember(item)"
:modelValue="
membersCheckedKeys.filter((v) => v.ID === item.ID) membersCheckedKeys.filter((v) => v.ID === item.ID)
.length > 0 .length > 0
? 'checked' ? 'checked'
: 'noChecked' : 'noChecked'
" " @change="(val) => checkMember(item, val)"></checkBox>
@change="(val) => checkMember(item, val)"
></checkBox>
</div> </div>
<div class="w-full flex items-center"> <div class="w-full flex items-center">
<div <div class="userAvatar flex items-center justify-center" style="flex-shrink: 0;">
class="userAvatar flex items-center justify-center"
style="flex-shrink: 0;"
>
{{ item.nickName.slice(-2) }} {{ item.nickName.slice(-2) }}
</div> </div>
<div <div class="ml-[20rpx] flex flex-col justify-center w-[112rpx]"
class="ml-[20rpx] flex flex-col justify-center w-[112rpx]" style="word-break: break-all; flex-shrink: 0;">
style="word-break: break-all; flex-shrink: 0;"
>
<div class="text-[28rpx] font-medium leading-[40rpx]"> <div class="text-[28rpx] font-medium leading-[40rpx]">
{{ item.nickName }} {{ item.nickName }}
</div> </div>
<div <div class="text-[20rpx] text-[#747474] leading-[28rpx] font-regular">
class="text-[20rpx] text-[#747474] leading-[28rpx] font-regular"
>
{{ item.jobNum }} {{ item.jobNum }}
</div> </div>
</div> </div>
<tm-popover <tm-popover position="tc" style="max-width: calc(100% - 64rpx - 112rpx - 20rpx);">
position="tc" <div class="max-w-full ml-[6rpx] flex max-h-[68rpx] flex-wrap line-clamp-2">
style="max-width: calc(100% - 64rpx - 112rpx - 20rpx);" <div v-for="post in item.positions" class="postTag truncate mb-[4rpx] ml-[14rpx] max-w-[164rpx]">
>
<div
class="max-w-full ml-[6rpx] flex max-h-[68rpx] flex-wrap line-clamp-2"
>
<div
v-for="post in item.positions"
class="postTag truncate mb-[4rpx] ml-[14rpx] max-w-[164rpx]"
>
{{ post.name }} {{ post.name }}
</div> </div>
</div> </div>
<template v-slot:label> <template v-slot:label>
<div <div class="max-h-[250rpx] overflow-y-auto pt-[10rpx] pl-[18rpx] pr-[18rpx] pb-[12rpx]">
class="max-h-[250rpx] overflow-y-auto pt-[10rpx] pl-[18rpx] pr-[18rpx] pb-[12rpx]" <div v-for="post in item.positions" class="postTag truncate mb-[10rpx]">
>
<div
v-for="post in item.positions"
class="postTag truncate mb-[10rpx]"
>
{{ post.name }} {{ post.name }}
</div> </div>
</div> </div>
@ -254,15 +175,11 @@
</div> </div>
</div> </div>
<template #bottom v-if="state.chooseMode === 1 || state.chooseMode === 2"> <template #bottom v-if="state.chooseMode === 1 || state.chooseMode === 2">
<div <div class="h-[162rpx] pl-[32rpx] pr-[32rpx] bg-[#FFFFFF] confirm-btn-area">
class="h-[162rpx] pl-[32rpx] pr-[32rpx] bg-[#FFFFFF] confirm-btn-area"
>
<div class="mt-[2rpx] flex justify-between"> <div class="mt-[2rpx] flex justify-between">
<div class="flex flex-col mt-[32rpx]"> <div class="flex flex-col mt-[32rpx]">
<div <div @click="openDrawer"
@click="openDrawer" class="flex items-center text-[28rpx] leading-[40rpx] text-[#000000] font-medium">
class="flex items-center text-[28rpx] leading-[40rpx] text-[#000000] font-medium"
>
<div> <div>
<span v-if="state.chooseMode === 1"> <span v-if="state.chooseMode === 1">
{{ $t('statistics.selected.deps') }} {{ $t('statistics.selected.deps') }}
@ -280,64 +197,38 @@
</span> </span>
</div> </div>
<div class="ml-[28rpx]"> <div class="ml-[28rpx]">
<tm-icon <tm-icon :fontSize="24" color="#46299D" name="tmicon-angle-up"></tm-icon>
:fontSize="24"
color="#46299D"
name="tmicon-angle-up"
></tm-icon>
</div> </div>
</div> </div>
<div <div class="text-[24rpx] leading-[34rpx] text-[#7A58DE] w-[280rpx] truncate">
class="text-[24rpx] leading-[34rpx] text-[#7A58DE] w-[280rpx] truncate"
>
<span v-if="state.chooseMode === 1"> <span v-if="state.chooseMode === 1">
{{ allCheckedList.map((v) => v.name).toString() }} {{ allCheckedList.map((v) => v.name).toString() }}
</span> </span>
<span <span v-if="state.chooseMode === 2" v-for="item in allCheckedList">
v-if="state.chooseMode === 2"
v-for="item in allCheckedList"
>
<span v-if="item.showInPopup"> <span v-if="item.showInPopup">
{{ item.name }}({{ getDepTotalMembers(item) }}) {{ item.name }}({{ getDepTotalMembers(item) }})
</span> </span>
</span> </span>
<span <span v-if="state.chooseMode === 2" v-for="(item, index) in membersCheckedKeys">
v-if="state.chooseMode === 2"
v-for="(item, index) in membersCheckedKeys"
>
{{ item.nickName }} {{ item.nickName }}
{{ index !== membersCheckedKeys.length - 1 ? ',' : '' }} {{ index !== membersCheckedKeys.length - 1 ? ',' : '' }}
</span> </span>
</div> </div>
</div> </div>
<div class="btnBox"> <div class="btnBox">
<customBtn <customBtn :btnText="$t('ok')" @clickBtn="handleConfirm" :disabled="
:btnText="$t('ok')"
@clickBtn="handleConfirm"
:disabled="
state.chooseMode === 1 state.chooseMode === 1
? !allCheckedList.length ? !allCheckedList.length
: state.chooseMode === 2 : state.chooseMode === 2
? !allCheckedList.length && !membersCheckedKeys.length ? !allCheckedList.length && !membersCheckedKeys.length
: true : true
" "></customBtn>
></customBtn>
</div> </div>
</div> </div>
</div> </div>
<tm-drawer <tm-drawer placement="bottom" v-model:show="showWin" :height="800" :hideHeader="true" :round="5">
placement="bottom" <div class="flex flex-col w-full h-full pt-[36rpx] pl-[32rpx] pr-[32rpx] leading-[60rpx]">
v-model:show="showWin" <div class="text-[32rpx] font-medium leading-[44rpx] flex items-center justify-between">
:height="800"
:hideHeader="true"
:round="5"
>
<div
class="flex flex-col w-full h-full pt-[36rpx] pl-[32rpx] pr-[32rpx] leading-[60rpx]"
>
<div
class="text-[32rpx] font-medium leading-[44rpx] flex items-center justify-between"
>
<div class="flex items-center ml-[10rpx]"> <div class="flex items-center ml-[10rpx]">
<div> <div>
<span v-if="state.chooseMode === 1"> <span v-if="state.chooseMode === 1">
@ -356,30 +247,19 @@
</span> </span>
</div> </div>
</div> </div>
<div <div class="text-[#7A58DE] mr-[10rpx]" @click="() => (showWin = false)">
class="text-[#7A58DE] mr-[10rpx]"
@click="() => (showWin = false)"
>
{{ $t('ok') }} {{ $t('ok') }}
</div> </div>
</div> </div>
<scroll-view <scroll-view scroll-y class="h-[690rpx] mt-[30rpx] scroll-view-style">
scroll-y
class="h-[690rpx] mt-[30rpx] scroll-view-style"
>
<div class="flex-1 pb-[20rpx]"> <div class="flex-1 pb-[20rpx]">
<div <div v-for="(item, index) in allCheckedList" class="flex flex-col">
v-for="(item, index) in allCheckedList"
class="flex flex-col"
>
<div v-if="index === 0" class="divider"></div> <div v-if="index === 0" class="divider"></div>
<div <div v-if="
v-if="
(item.showInPopup && state.chooseMode === 2) || (item.showInPopup && state.chooseMode === 2) ||
state.chooseMode !== 2 state.chooseMode !== 2
" "
class="flex items-center justify-between mt-[36rpx] font-medium text-[#000000] leading-[40rpx] mb-[34rpx]" class="flex items-center justify-between mt-[36rpx] font-medium text-[#000000] leading-[40rpx] mb-[34rpx]">
>
<div class="text-[28rpx] ml-[10rpx]"> <div class="text-[28rpx] ml-[10rpx]">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
<span v-if="state.chooseMode === 2"> <span v-if="state.chooseMode === 2">
@ -387,56 +267,35 @@
</span> </span>
</div> </div>
<div class="diyBtn"> <div class="diyBtn">
<customBtn <customBtn :plain="true" :btnText="$t('chatSettings.btn.removeAdmin')"
:plain="true" @clickBtn="deleteNode(item)"></customBtn>
:btnText="$t('chatSettings.btn.removeAdmin')"
@clickBtn="deleteNode(item)"
></customBtn>
</div> </div>
</div> </div>
<div <div class="divider" v-if="
class="divider"
v-if="
(item.showInPopup && state.chooseMode === 2) || (item.showInPopup && state.chooseMode === 2) ||
state.chooseMode !== 2 state.chooseMode !== 2
" "></div>
></div>
</div> </div>
<div <div v-for="(item, index) in membersCheckedKeys" class="flex flex-col">
v-for="(item, index) in membersCheckedKeys" <div v-if="
class="flex flex-col"
>
<div
v-if="
index === 0 && index === 0 &&
allCheckedList.length == 0 && allCheckedList.length == 0 &&
state.chooseMode === 2 state.chooseMode === 2
" " class="divider"></div>
class="divider" <div v-if="state.chooseMode === 2"
></div> class="flex items-center justify-between mt-[36rpx] font-medium text-[#000000] leading-[40rpx] mb-[34rpx]">
<div
v-if="state.chooseMode === 2"
class="flex items-center justify-between mt-[36rpx] font-medium text-[#000000] leading-[40rpx] mb-[34rpx]"
>
<div class="text-[28rpx] ml-[10rpx] flex"> <div class="text-[28rpx] ml-[10rpx] flex">
<div>{{ item.nickName }}({{ item.jobNum }})</div> <div>{{ item.nickName }}({{ item.jobNum }})</div>
<div <div class="ml-[20rpx] flex h-[68rpx] flex-wrap line-clamp-2 max-w-[342rpx]">
class="ml-[20rpx] flex h-[68rpx] flex-wrap line-clamp-2 max-w-[342rpx]" <div v-for="post in item.positions"
> class="postTag truncate mb-[4rpx] mr-[14rpx] max-w-[164rpx]">
<div
v-for="post in item.positions"
class="postTag truncate mb-[4rpx] mr-[14rpx] max-w-[164rpx]"
>
{{ post.name }} {{ post.name }}
</div> </div>
</div> </div>
</div> </div>
<div class="diyBtn"> <div class="diyBtn">
<customBtn <customBtn :plain="true" :btnText="$t('chatSettings.btn.removeAdmin')"
:plain="true" @clickBtn="deleteMember(item)"></customBtn>
:btnText="$t('chatSettings.btn.removeAdmin')"
@clickBtn="deleteMember(item)"
></customBtn>
</div> </div>
</div> </div>
<div class="divider" v-if="state.chooseMode === 2"></div> <div class="divider" v-if="state.chooseMode === 2"></div>
@ -453,20 +312,45 @@
import customInput from '@/components/custom-input/custom-input.vue' import customInput from '@/components/custom-input/custom-input.vue'
import customBtn from '@/components/custom-btn/custom-btn.vue' import customBtn from '@/components/custom-btn/custom-btn.vue'
import zPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue' import zPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue'
import { ref, watch, computed, onMounted, nextTick, reactive } from 'vue' import {
import { onShow, onLoad } from '@dcloudio/uni-app' ref,
import { useChatList } from '@/store/chatList/index.js' watch,
import { useAuth } from '@/store/auth' computed,
import { useTalkStore, useUserStore } from '@/store' onMounted,
import { useGroupTypeStore } from '@/store/groupType' nextTick,
reactive
} from 'vue'
import {
onShow,
onLoad
} from '@dcloudio/uni-app'
import {
useChatList
} from '@/store/chatList/index.js'
import {
useAuth
} from '@/store/auth'
import {
useTalkStore,
useUserStore
} from '@/store'
import {
useGroupTypeStore
} from '@/store/groupType'
import downDep from '@/static/image/chatList/downDep.png' import downDep from '@/static/image/chatList/downDep.png'
import downDepDis from '@/static/image/chatList/downDepDis.png' import downDepDis from '@/static/image/chatList/downDepDis.png'
import checkBox from '@/components/checkBox/index.vue' import checkBox from '@/components/checkBox/index.vue'
import lodash from 'lodash' import lodash from 'lodash'
import { handleSetWebviewStyle } from '@/utils/common' import {
handleSetWebviewStyle
} from '@/utils/common'
import { useI18n } from 'vue-i18n' import {
const { t } = useI18n() useI18n
} from 'vue-i18n'
const {
t
} = useI18n()
const { const {
groupActiveIndex, groupActiveIndex,
@ -481,7 +365,7 @@ const {
allChooseMembers, allChooseMembers,
} = useGroupTypeStore() } = useGroupTypeStore()
const userStore = useUserStore() const userStore = useUserStore()
const navshow = ref(false)
const searchVal = ref('') const searchVal = ref('')
const crumbsContainer = ref(null) const crumbsContainer = ref(null)
const showWin = ref(false) const showWin = ref(false)
@ -496,6 +380,9 @@ onLoad((options) => {
if (options.chooseMode) { if (options.chooseMode) {
state.chooseMode = Number(options.chooseMode) state.chooseMode = Number(options.chooseMode)
} }
if (options.type) {
navshow.value = true
}
// //
if (options.preSelectedMembers) { if (options.preSelectedMembers) {
@ -509,7 +396,15 @@ onLoad((options) => {
} }
} }
}) })
const goWebHome = () => {
uni.navigateBack()
let OAWebView = plus.webview.all()
OAWebView.forEach((webview) => {
if (webview.id === 'webviewId1') {
webview.evalJS(`handleBackHost()`)
}
})
}
// //
const isPreSelectedMember = (member) => { const isPreSelectedMember = (member) => {
return state.preSelectedMembers.some( return state.preSelectedMembers.some(
@ -590,6 +485,7 @@ const currentCrumbs = computed(() => {
const buildDepsMap = (departments) => { const buildDepsMap = (departments) => {
const index = new Map() const index = new Map()
function traverse(deps) { function traverse(deps) {
for (let dep of deps) { for (let dep of deps) {
index.set(`${dep.name}`, dep) index.set(`${dep.name}`, dep)
@ -613,11 +509,11 @@ const allCheckStatus = computed(() => {
if (state.chooseMode === 2) { if (state.chooseMode === 2) {
// //
const allDepsChecked = const allDepsChecked =
currentCrumbs?.value?.sons?.length > 0 currentCrumbs?.value?.sons?.length > 0 ?
? currentCrumbs?.value?.sons?.every( currentCrumbs?.value?.sons?.every(
(son) => son.checkStatus === 'checked', (son) => son.checkStatus === 'checked',
) ) :
: true true
// //
const selectableMembers = currentMembers.value.filter( const selectableMembers = currentMembers.value.filter(
@ -863,8 +759,7 @@ const allCheck = (status) => {
const openDrawer = () => { const openDrawer = () => {
showWin.value = true showWin.value = true
if (allCheckedList.length > 0) { if (allCheckedList.length > 0) {}
}
} }
// watch(() => depTreeMyList.value, (newValue, oldValue) => { // watch(() => depTreeMyList.value, (newValue, oldValue) => {
@ -925,7 +820,9 @@ const init = async () => {
ID: 'all', ID: 'all',
name: t('choose.deps.all'), name: t('choose.deps.all'),
sons: [...depTreeMyList.value], // 使 sons: [...depTreeMyList.value], // 使
staffNum: calculateTotalStaffNum({ sons: depTreeMyList.value }), staffNum: calculateTotalStaffNum({
sons: depTreeMyList.value
}),
} }
depTreeMyList.value = [allNode] depTreeMyList.value = [allNode]
crumbs.value = [allNode] crumbs.value = [allNode]
@ -1019,7 +916,9 @@ const getCurrentMembers = async (depItem) => {
return return
} }
// 使 // 使
let params = { status: 'notactive' } let params = {
status: 'notactive'
}
if (searchVal.value) { if (searchVal.value) {
params = { params = {
fatherDepartmentId: depItem.ID, fatherDepartmentId: depItem.ID,
@ -1036,14 +935,13 @@ const getCurrentMembers = async (depItem) => {
} }
const res = await getDepMembers(params) const res = await getDepMembers(params)
if (res.code === 200) { if (res.code === 200) {
currentMembers.value = res?.data?.data?.length currentMembers.value = res?.data?.data?.length ?
? res.data.data.map((v) => { res.data.data.map((v) => {
return { return {
...v, ...v,
isMember: true, isMember: true,
} }
}) }) : []
: []
} else { } else {
currentMembers.value = [] currentMembers.value = []
} }
@ -1068,8 +966,9 @@ watch(
if (newValue?.ID && (state.chooseMode === 2 || state.chooseMode === 3)) { if (newValue?.ID && (state.chooseMode === 2 || state.chooseMode === 3)) {
getCurrentMembers(newValue) getCurrentMembers(newValue)
} }
}, {
immediate: true
}, },
{ immediate: true },
) )
const deleteMember = (item) => { const deleteMember = (item) => {
@ -1100,8 +999,7 @@ const totalMembers = computed(() => {
const toUserDetail = (userItem) => { const toUserDetail = (userItem) => {
console.log(userItem) console.log(userItem)
uni.navigateTo({ uni.navigateTo({
url: url: '/pages/dialog/dialogDetail/userDetail??erpUserId=' +
'/pages/dialog/dialogDetail/userDetail??erpUserId=' +
(userItem.erp_user_id || userItem.ID), (userItem.erp_user_id || userItem.ID),
}) })
} }
@ -1111,9 +1009,11 @@ const toUserDetail = (userItem) => {
height: 100%; height: 100%;
display: flex; display: flex;
} }
::v-deep .index_top_navbar .tmicon-angle-left { ::v-deep .index_top_navbar .tmicon-angle-left {
color: #fff !important; color: #fff !important;
} }
::v-deep .index_top_navbar .text-weight-b { ::v-deep .index_top_navbar .text-weight-b {
color: #fff !important; color: #fff !important;
} }
@ -1122,11 +1022,13 @@ const toUserDetail = (userItem) => {
background: transparent !important; background: transparent !important;
border: none !important; border: none !important;
} }
.top_bg { .top_bg {
background: url('@/static/image/mine/page_top.png') no-repeat; background: url('@/static/image/mine/page_top.png') no-repeat;
background-size: cover; background-size: cover;
background-position: bottom center; background-position: bottom center;
} }
.choose-deps-page { .choose-deps-page {
.choose-deps { .choose-deps {
flex: 1; flex: 1;
@ -1146,6 +1048,7 @@ const toUserDetail = (userItem) => {
background-color: #707070; background-color: #707070;
opacity: 0.1; opacity: 0.1;
} }
.vDivider { .vDivider {
width: 1rpx; width: 1rpx;
height: 48rpx; height: 48rpx;
@ -1159,6 +1062,7 @@ const toUserDetail = (userItem) => {
border-radius: 50%; border-radius: 50%;
margin-bottom: 40rpx; margin-bottom: 40rpx;
} }
.groupCard { .groupCard {
height: 272rpx; height: 272rpx;
width: 100%; width: 100%;
@ -1166,45 +1070,58 @@ const toUserDetail = (userItem) => {
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
border-radius: 12rpx; border-radius: 12rpx;
&.firstPanel { &.firstPanel {
background-image: url('@/static/image/chatList/zu6033@2x.png'); background-image: url('@/static/image/chatList/zu6033@2x.png');
} }
&.secondPanel { &.secondPanel {
background-image: url('@/static/image/chatList/zu6031@2x.png'); background-image: url('@/static/image/chatList/zu6031@2x.png');
margin-top: 28rpx; margin-top: 28rpx;
margin-bottom: 28rpx; margin-bottom: 28rpx;
} }
&.thirdPanel { &.thirdPanel {
background-image: url('@/static/image/chatList/zu6032@2x.png'); background-image: url('@/static/image/chatList/zu6032@2x.png');
} }
&.activePanel { &.activePanel {
box-shadow: 0 0 0 3rpx #46299d; box-shadow: 0 0 0 3rpx #46299d;
} }
} }
.btnBox { .btnBox {
margin: 14rpx 0 0; margin: 14rpx 0 0;
::v-deep .custom-btn-class { ::v-deep .custom-btn-class {
padding: 18rpx 104rpx !important; padding: 18rpx 104rpx !important;
width: unset !important; width: unset !important;
} }
::v-deep .is-disabled { ::v-deep .is-disabled {
background-color: #e6e6e6 !important; background-color: #e6e6e6 !important;
color: #bebebe !important; color: #bebebe !important;
} }
::v-deep .wd-button__text { ::v-deep .wd-button__text {
font-size: 28rpx !important; font-size: 28rpx !important;
font-weight: 500 !important; font-weight: 500 !important;
line-height: 40rpx !important; line-height: 40rpx !important;
} }
} }
.no-scrollbar { .no-scrollbar {
-ms-overflow-style: none; /* IE and Edge */ -ms-overflow-style: none;
scrollbar-width: none; /* Firefox */ /* IE and Edge */
scrollbar-width: none;
/* Firefox */
} }
.no-scrollbar::-webkit-scrollbar { .no-scrollbar::-webkit-scrollbar {
display: none; /* Chrome, Safari, and Opera */ display: none;
/* Chrome, Safari, and Opera */
} }
.diyBtn { .diyBtn {
::v-deep .custom-btn-class { ::v-deep .custom-btn-class {
padding: 8rpx 30rpx !important; padding: 8rpx 30rpx !important;
@ -1212,12 +1129,14 @@ const toUserDetail = (userItem) => {
min-width: unset !important; min-width: unset !important;
height: unset !important; height: unset !important;
} }
::v-deep .wd-button__text { ::v-deep .wd-button__text {
font-size: 24rpx !important; font-size: 24rpx !important;
font-weight: 400 !important; font-weight: 400 !important;
line-height: 34rpx !important; line-height: 34rpx !important;
color: #191919; color: #191919;
} }
::v-deep .custom-btn-class { ::v-deep .custom-btn-class {
background-color: #fff !important; background-color: #fff !important;
border: 2rpx solid #d6d6d8 !important; border: 2rpx solid #d6d6d8 !important;
@ -1231,6 +1150,7 @@ const toUserDetail = (userItem) => {
.scroll-view-style { .scroll-view-style {
-ms-overflow-style: none; -ms-overflow-style: none;
overflow: -moz-scrollbars-none; overflow: -moz-scrollbars-none;
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 0 !important; width: 0 !important;
} }
@ -1245,6 +1165,7 @@ const toUserDetail = (userItem) => {
font-size: 24rpx; font-size: 24rpx;
font-weight: bold; font-weight: bold;
} }
.postTag { .postTag {
background-color: #eee9f8; background-color: #eee9f8;
height: 32rpx; height: 32rpx;

View File

@ -5,7 +5,7 @@ import { userInfoApi } from "@/api/user";
import {ref} from 'vue' import {ref} from 'vue'
export const useAuth = createGlobalState(() => { export const useAuth = createGlobalState(() => {
const token = useStorage('token', '', uniStorage) const token = useStorage('token', '', uniStorage)
// const token = ref("79b5c732d96d2b27a48a99dfd4a5566c43aaa5796242e854ebe3ffc198d6876b9628e7b764d9af65ab5dbb2d517ced88170491b74b048c0ba827c0d3741462cb89dc59ed46653a449af837a8262941caba0afc18e7cb819d125e8c04282beb5d4dd454307169f7eb51cd3dbbee20c1a17784f78ad30c3b3a102bd03c3218080beedae501a95c365d360a7a0d682cba2eca94a2915c13f0bdcb42f2eab9458cb4bd89ae6f3200fe4893d64caf1bce02894aab876f94f7825d23be507733468deba21734b6d666b75fd0bee74753fdd6ca5def7ec42cd7dbb47750e61cac6965f34fd71b52be66a472d3ee5b1e4661e59d4489860c2e1d8c178de5b43853ef9be822f00e0903b5c97efaa9ba0d9c76a1a91a2d6d77c5a19c551906a67fbfd3af69bd6a59310b8b300658e9b7248d9dd51a66be399ef412cb7c83bc81abfc15b65b") // const token = ref("2046c3941ed4959f6d988d3d4a0fe40d4b52f33f3f5fc1001406064554641d9406bb13cacb92939b0ca223c17e2c2f2fe70212ef017dbae8965d5cf86bad48ce4316e605ca187bd9ffd4aa6b56865be4ad4e422701d330b52d60cfe649cd48cf3a21a2a6e9a9cabafff364ee9c311ec634b0afc09db0d3215bedce561e9d50e5a8da6092062e2ebe35f747d77d72a68ad492a4ab218c07887c9cd4867f2c2d28e4ae1fd671144cc20ef0632f9ce067289004d67f6adf41b20d6ef5cdbfb74aadc2d2736ececf07254f1a76552bde4f1161a0fca7bfe32a29685ce1e76366116b81ae2195b3713dbb04285e5ddfd36184fe671c5524d20b4fe74a555db755f8d939b0bc46fb0cb998323d54c9925729d7ca835b7925999a677faa0cbe1cbc67b5203d85317653883aec81d3e71d865b326376bea726cc66d9f7f5a160d43f671c")
const refreshToken = useStorage('refreshToken', '', uniStorage) const refreshToken = useStorage('refreshToken', '', uniStorage)
const userInfo = useStorage('userInfo', {}, uniStorage) const userInfo = useStorage('userInfo', {}, uniStorage)
const leaderList = useStorage('leaderList', [], uniStorage) const leaderList = useStorage('leaderList', [], uniStorage)