|
|
@ -17,27 +17,79 @@ const emits = defineEmits<{ |
|
|
(e: 'update:modelValue', value: string): void |
|
|
(e: 'update:modelValue', value: string): void |
|
|
}>() |
|
|
}>() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const value = ref([]) |
|
|
const value = ref([]) |
|
|
const treeData = ref([]) // 存储懒加载的数据 |
|
|
const treeData = ref([]) // 存储懒加载的数据 |
|
|
const isDataLoaded = ref(false) // 标记数据是否已加载 |
|
|
const isDataLoaded = ref(false) // 标记数据是否已加载 |
|
|
const loading = ref(false) // 是否正在加载 |
|
|
const loading = ref(false) // 是否正在加载 |
|
|
const treeSelectRef = ref() // 树选择器引用 |
|
|
const treeSelectRef = ref() // 树选择器引用 |
|
|
|
|
|
|
|
|
watch(value, (newValue) => { |
|
|
// 上一次选择的值,用于比较 |
|
|
if (newValue.length > 0) { |
|
|
const lastSelectedValue = ref(null) |
|
|
let str = "" |
|
|
|
|
|
let userAry = new Array |
|
|
// 处理值变化 |
|
|
|
|
|
const handleValueChange = (newValue) => { |
|
|
newValue.forEach(item => { |
|
|
if (!multiSelect.value) { |
|
|
userAry.push(item) |
|
|
// 单选模式 |
|
|
}) |
|
|
if (newValue.length === 0) { |
|
|
str = userAry.join(',') |
|
|
// 清空选择 |
|
|
emits('update:modelValue', str) |
|
|
emits('update:modelValue', ''); |
|
|
|
|
|
lastSelectedValue.value = null; |
|
|
|
|
|
} else if (newValue.length === 1) { |
|
|
|
|
|
// 单选模式下只有一个选择 |
|
|
|
|
|
const currentValue = newValue[0]; |
|
|
|
|
|
emits('update:modelValue', currentValue); |
|
|
|
|
|
lastSelectedValue.value = currentValue; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 当有多个选择时,找出新增的那个 |
|
|
|
|
|
const newSelections = newValue.filter(item => item !== lastSelectedValue.value); |
|
|
|
|
|
if (newSelections.length > 0) { |
|
|
|
|
|
// 只保留最新选择的那个 |
|
|
|
|
|
const latestSelection = newSelections[newSelections.length - 1]; |
|
|
|
|
|
value.value = [latestSelection]; |
|
|
|
|
|
emits('update:modelValue', latestSelection); |
|
|
|
|
|
lastSelectedValue.value = latestSelection; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 如果没有新增的选择,可能是取消选择,保持原样 |
|
|
|
|
|
value.value = newValue; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
let str = "" |
|
|
// 多选模式下的处理 |
|
|
emits('update:modelValue', str) |
|
|
if (newValue.length > 0) { |
|
|
|
|
|
let str = "" |
|
|
|
|
|
let userAry = new Array |
|
|
|
|
|
if(Array.isArray(newValue)){ |
|
|
|
|
|
newValue.forEach(item => { |
|
|
|
|
|
userAry.push(item) |
|
|
|
|
|
}) |
|
|
|
|
|
str = userAry.join(',') |
|
|
|
|
|
emits('update:modelValue', str) |
|
|
|
|
|
}else{ |
|
|
|
|
|
let a = new Array |
|
|
|
|
|
a.push(newValue) |
|
|
|
|
|
a.forEach(item => { |
|
|
|
|
|
userAry.push(item) |
|
|
|
|
|
}) |
|
|
|
|
|
str = userAry.join(',') |
|
|
|
|
|
emits('update:modelValue', str) |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
let str = "" |
|
|
|
|
|
emits('update:modelValue', str) |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}, { deep: true }) |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
watch(value, handleValueChange, { deep: true }) |
|
|
|
|
|
|
|
|
|
|
|
const multiSelect = computed(()=>{ |
|
|
|
|
|
if(props.data.control.multiSelect && props.data.control.multiSelect == "1"){ |
|
|
|
|
|
return true |
|
|
|
|
|
}else{ |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
function parseStringToArray(str: string) { |
|
|
function parseStringToArray(str: string) { |
|
|
try { |
|
|
try { |
|
|
@ -54,10 +106,33 @@ function parseStringToArray(str: string) { |
|
|
|
|
|
|
|
|
onBeforeMount(() => { |
|
|
onBeforeMount(() => { |
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
value.value = parseStringToArray(props.modelValue) |
|
|
const initialValue = parseStringToArray(props.modelValue) |
|
|
|
|
|
value.value = initialValue; |
|
|
|
|
|
if (initialValue.length > 0 && !multiSelect.value) { |
|
|
|
|
|
lastSelectedValue.value = initialValue[initialValue.length - 1]; |
|
|
|
|
|
} |
|
|
}, 500) |
|
|
}, 500) |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
// 递归处理树节点,将部门节点设置为禁用 |
|
|
|
|
|
const processTreeData = (data: any[]) => { |
|
|
|
|
|
return data.map(node => { |
|
|
|
|
|
const newNode = { ...node }; |
|
|
|
|
|
|
|
|
|
|
|
// 如果multiSelect为false且id长度小于5,设置为禁用 |
|
|
|
|
|
if (!multiSelect.value && node.id && node.id.toString().length < 5) { |
|
|
|
|
|
newNode.disabled = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 递归处理子节点 |
|
|
|
|
|
if (newNode.children && Array.isArray(newNode.children)) { |
|
|
|
|
|
newNode.children = processTreeData(newNode.children); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return newNode; |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 加载完整数据的函数 |
|
|
// 加载完整数据的函数 |
|
|
const loadFullData = async () => { |
|
|
const loadFullData = async () => { |
|
|
if (isDataLoaded.value) return treeData.value; |
|
|
if (isDataLoaded.value) return treeData.value; |
|
|
@ -69,9 +144,13 @@ const loadFullData = async () => { |
|
|
await new Promise(resolve => setTimeout(resolve, 800)); |
|
|
await new Promise(resolve => setTimeout(resolve, 800)); |
|
|
|
|
|
|
|
|
const result = await checkorgAndManTree1(); |
|
|
const result = await checkorgAndManTree1(); |
|
|
treeData.value = result; |
|
|
|
|
|
|
|
|
// 根据multiSelect的值处理数据 |
|
|
|
|
|
const processedData = !multiSelect.value ? processTreeData(result) : result; |
|
|
|
|
|
|
|
|
|
|
|
treeData.value = processedData; |
|
|
isDataLoaded.value = true; |
|
|
isDataLoaded.value = true; |
|
|
return result; |
|
|
return processedData; |
|
|
} catch (error) { |
|
|
} catch (error) { |
|
|
console.error('加载组织数据失败:', error); |
|
|
console.error('加载组织数据失败:', error); |
|
|
return []; |
|
|
return []; |
|
|
@ -111,7 +190,7 @@ function checkorgAndManTree1() { |
|
|
if (i == props.orgAndManTree.length) { |
|
|
if (i == props.orgAndManTree.length) { |
|
|
props.orgAndManTree.forEach((item: any) => { |
|
|
props.orgAndManTree.forEach((item: any) => { |
|
|
if (props.data.name == item.name) { |
|
|
if (props.data.name == item.name) { |
|
|
console.log(item.tree) |
|
|
//console.log(item.tree) |
|
|
result = item.tree |
|
|
result = item.tree |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
@ -167,9 +246,9 @@ const valPrint = (val: any) => { |
|
|
node-key="number" |
|
|
node-key="number" |
|
|
v-model="value" |
|
|
v-model="value" |
|
|
:data="resData" |
|
|
:data="resData" |
|
|
multiple |
|
|
multiple |
|
|
:render-after-expand="false" |
|
|
:render-after-expand="false" |
|
|
show-checkbox |
|
|
show-checkbox |
|
|
clearable |
|
|
clearable |
|
|
collapse-tags |
|
|
collapse-tags |
|
|
collapse-tags-tooltip |
|
|
collapse-tags-tooltip |
|
|
@ -234,4 +313,10 @@ const valPrint = (val: any) => { |
|
|
color: #909399; |
|
|
color: #909399; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.el-select-dropdown__item.is-disabled { |
|
|
|
|
|
background-color: unset; |
|
|
|
|
|
color: #606266; |
|
|
|
|
|
cursor: not-allowed; |
|
|
|
|
|
} |
|
|
</style> |
|
|
</style> |