自定义checkbox新增disabled状态;选择人员新增已在群内人员禁止选择
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

This commit is contained in:
wangyifeng 2025-03-04 16:38:44 +08:00
parent aa9adb6211
commit 11aacea856
5 changed files with 87 additions and 53 deletions

View File

@ -1,56 +1,63 @@
<template> <template>
<div @click.stop="onCheck" > <div @click.stop="onCheck">
<tm-image :width="size" :height="size" :src="imageSrc"></tm-image> <tm-image :width="size" :height="size" :src="imageSrc"></tm-image>
</div> </div>
</template> </template>
<script setup> <script setup>
import { defineProps,computed,defineEmits } from "vue"; import { defineProps, computed, defineEmits } from 'vue'
import circle from "@/static/image/checkBox/circle@2x.png"; import circle from '@/static/image/checkBox/circle@2x.png'
import zu6039 from "@/static/image/checkBox/zu6039@2x.png"; import zu6039 from '@/static/image/checkBox/zu6039@2x.png'
import zu6040 from "@/static/image/checkBox/zu6040@2x.png"; import zu6040 from '@/static/image/checkBox/zu6040@2x.png'
import checkBoxDisabled from '@/static/image/checkBox/disabled.png'
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: String, type: String,
default: "noChecked", // noChecked, checked, halfChecked default: 'noChecked', // noChecked, checked, halfChecked, disabled
}, },
size: { size: {
type: Number, type: Number,
default: 28, default: 28,
}, },
}); disabled: {
type: Boolean,
default: false,
},
})
const emit = defineEmits(['update:modelValue','change']); const emit = defineEmits(['update:modelValue', 'change'])
const imageSrc = computed(() => { const imageSrc = computed(() => {
switch (props.modelValue) { if (props.disabled) {
case "noChecked": return checkBoxDisabled
return circle;
case "checked":
return zu6039;
case "halfChecked":
return zu6040;
} }
}); switch (props.modelValue) {
case 'noChecked':
return circle
case 'checked':
return zu6039
case 'halfChecked':
return zu6040
}
})
const onCheck = () => { const onCheck = () => {
if (props.disabled) return
switch (props.modelValue) { switch (props.modelValue) {
case "noChecked": case 'noChecked':
emit('update:modelValue', 'checked'); emit('update:modelValue', 'checked')
emit('change', 'checked'); emit('change', 'checked')
break; break
case "checked": case 'checked':
emit('update:modelValue', 'noChecked'); emit('update:modelValue', 'noChecked')
emit('change', 'noChecked'); emit('change', 'noChecked')
break; break
case "halfChecked": case 'halfChecked':
emit('update:modelValue', 'checked'); emit('update:modelValue', 'checked')
emit('change', 'checked'); emit('change', 'checked')
break; break
} }
}; }
</script> </script>
<style scoped lang='less'> <style scoped lang="less"></style>
</style>

View File

@ -103,7 +103,9 @@ const toUserDetailPage = (userItem) => {
// //
const groupAddMembers = () => { const groupAddMembers = () => {
uni.navigateTo({ uni.navigateTo({
url: '/pages/chooseByDeps/index?chooseMode=2', url:
'/pages/chooseByDeps/index?chooseMode=2&preSelectedMembers=' +
encodeURIComponent(JSON.stringify(props?.memberList)),
}) })
} }

View File

@ -42,16 +42,16 @@
<div <div
v-if=" v-if="
(state.chooseMode === 1 || state.chooseMode === 2) && (state.chooseMode === 1 || state.chooseMode === 2) &&
(currentCrumbs?.sons?.length > 0 || currentMembers?.length > 0) ((currentCrumbs?.sons?.length > 0 &&
((state.chooseMode === 2 && !searchVal) ||
state.chooseMode !== 2)) ||
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 <checkBox :modelValue="allCheckStatus"></checkBox>
:disabled="currentCrumbs?.sons?.length === 0"
:modelValue="allCheckStatus"
></checkBox>
</div> </div>
<div class="font-medium text-[28rpx] leading-[40rpx]"> <div class="font-medium text-[28rpx] leading-[40rpx]">
{{ $t('radio.btn.selectAll') }} {{ $t('radio.btn.selectAll') }}
@ -84,7 +84,6 @@
v-if="state.chooseMode === 1 || state.chooseMode === 2" v-if="state.chooseMode === 1 || state.chooseMode === 2"
> >
<checkBox <checkBox
:disabled="!item?.sons?.length"
v-model="item.checkStatus" v-model="item.checkStatus"
@change="(val) => checkItemChange(item, val)" @change="(val) => checkItemChange(item, val)"
></checkBox> ></checkBox>
@ -186,6 +185,7 @@
v-if="state.chooseMode === 1 || state.chooseMode === 2" v-if="state.chooseMode === 1 || state.chooseMode === 2"
> >
<checkBox <checkBox
:disabled="isPreSelectedMember(item)"
:modelValue=" :modelValue="
membersCheckedKeys.filter((v) => v.ID === item.ID) membersCheckedKeys.filter((v) => v.ID === item.ID)
.length > 0 .length > 0
@ -483,14 +483,34 @@ const currentMembers = ref([])
const state = reactive({ const state = reactive({
chooseMode: 1, //1=2=; 3= chooseMode: 1, //1=2=; 3=
preSelectedMembers: [], //
}) })
onLoad((options) => { onLoad((options) => {
if (options.chooseMode) { if (options.chooseMode) {
state.chooseMode = Number(options.chooseMode) state.chooseMode = Number(options.chooseMode)
} }
//
if (options.preSelectedMembers) {
try {
const preSelectedMembers = JSON.parse(
decodeURIComponent(options.preSelectedMembers),
)
state.preSelectedMembers = preSelectedMembers
} catch (e) {
console.error('解析预选成员数据失败:', e)
}
}
}) })
//
const isPreSelectedMember = (member) => {
return state.preSelectedMembers.some(
(preMember) => preMember.erp_user_id === member.ID,
)
}
const pageTitle = computed(() => { const pageTitle = computed(() => {
let page_title = '' let page_title = ''
if (state.chooseMode === 1) { if (state.chooseMode === 1) {
@ -591,30 +611,33 @@ const allCheckStatus = computed(() => {
? currentCrumbs?.value?.sons?.every( ? currentCrumbs?.value?.sons?.every(
(son) => son.checkStatus === 'checked', (son) => son.checkStatus === 'checked',
) )
: true // : true
// //
const selectableMembers = currentMembers.value.filter(
(member) => !isPreSelectedMember(member),
)
const allMembersChecked = const allMembersChecked =
currentMembers.value.length > 0 && selectableMembers.length > 0 &&
currentMembers.value.every((member) => selectableMembers.every((member) =>
membersCheckedKeys.value.some((checked) => checked.ID === member.ID), membersCheckedKeys.value.some((checked) => checked.ID === member.ID),
) )
// //
// 1.
// 2.
// 3.
if ( if (
(currentCrumbs?.value?.sons?.length > 0 && allDepsChecked) || //
(currentMembers.value.length > 0 && allMembersChecked) (currentCrumbs?.value?.sons?.length === 0 || allDepsChecked) &&
//
(selectableMembers.length === 0 || allMembersChecked)
) { ) {
return 'checked' return 'checked'
} else if ( } else if (
//
currentCrumbs?.value?.sons?.some( currentCrumbs?.value?.sons?.some(
(son) => (son) =>
son.checkStatus === 'checked' || son.checkStatus === 'halfChecked', son.checkStatus === 'checked' || son.checkStatus === 'halfChecked',
) || ) ||
currentMembers.value.some((member) => selectableMembers.some((member) =>
membersCheckedKeys.value.some((checked) => checked.ID === member.ID), membersCheckedKeys.value.some((checked) => checked.ID === member.ID),
) )
) { ) {
@ -812,16 +835,16 @@ const allCheck = (status) => {
// //
if (state.chooseMode === 2) { if (state.chooseMode === 2) {
if (statusT === 'checked') { if (statusT === 'checked') {
// //
const newMembers = currentMembers.value.filter( const newMembers = currentMembers.value.filter(
(member) => (member) =>
!membersCheckedKeys.value.some( !membersCheckedKeys.value.some(
(existing) => existing.ID === member.ID, (existing) => existing.ID === member.ID,
), ) && !isPreSelectedMember(member),
) )
membersCheckedKeys.value = [...membersCheckedKeys.value, ...newMembers] membersCheckedKeys.value = [...membersCheckedKeys.value, ...newMembers]
} else { } else {
// //
const currentMemberIds = new Set( const currentMemberIds = new Set(
currentMembers.value.map((member) => member.ID), currentMembers.value.map((member) => member.ID),
) )
@ -1020,6 +1043,9 @@ const getCurrentMembers = async (depItem) => {
} }
const checkMember = (item, val) => { const checkMember = (item, val) => {
if (isPreSelectedMember(item)) {
return
}
if (val === 'checked') { if (val === 'checked') {
membersCheckedKeys.value.push(item) membersCheckedKeys.value.push(item)
} else { } else {

View File

@ -99,7 +99,6 @@
<div @click="chooseMembers" class="left-box"> <div @click="chooseMembers" class="left-box">
<div class="ml-[32rpx] flex items-center"> <div class="ml-[32rpx] flex items-center">
<div <div
v-if="!groupAdmins.length"
class="text-[#B4B4B4] text-[28rpx] font-bold mr-[32rpx]" class="text-[#B4B4B4] text-[28rpx] font-bold mr-[32rpx]"
> >
全部({{ allChooseMembers?.length || 0 }}) 全部({{ allChooseMembers?.length || 0 }})

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B