serv\web- 日志
This commit is contained in:
@@ -625,12 +625,6 @@ function toggleAvailable(itemId: string) {
|
||||
// 树形模式下的级联选择
|
||||
const node = findNodeInTree(itemId, treeData.value);
|
||||
if (node) {
|
||||
// 如果只允许选择叶子节点,检查是否为叶子节点
|
||||
if (props.onlyLeafSelectable && !isLeafNode(node)) {
|
||||
// 非叶子节点,不允许选择
|
||||
return;
|
||||
}
|
||||
|
||||
const childrenIds = getAllChildrenIds(node);
|
||||
|
||||
if (index > -1) {
|
||||
@@ -701,6 +695,11 @@ function moveSelectedToTarget() {
|
||||
itemsToMove = flatItems.filter(item =>
|
||||
selectedAvailable.value.includes(getNodeId(item))
|
||||
);
|
||||
|
||||
// 如果只允许选择叶子节点,过滤掉非叶子节点
|
||||
if (props.onlyLeafSelectable) {
|
||||
itemsToMove = itemsToMove.filter(item => isLeafNode(item));
|
||||
}
|
||||
} else {
|
||||
// 列表模式:从可选列表中查找
|
||||
itemsToMove = availableList.value.filter(item =>
|
||||
@@ -712,8 +711,10 @@ function moveSelectedToTarget() {
|
||||
|
||||
if (props.useTree && treeData.value.length > 0) {
|
||||
// 树形模式:需要重新构建树(移除已选项)
|
||||
// 只移除叶子节点
|
||||
const idsToRemove = new Set(itemsToMove.map(item => getNodeId(item)));
|
||||
availableList.value = availableList.value.filter(item =>
|
||||
!selectedAvailable.value.includes(getItemId(item))
|
||||
!idsToRemove.has(getItemId(item))
|
||||
);
|
||||
// 重新转换为树形结构
|
||||
if (props.treeTransform) {
|
||||
@@ -782,10 +783,27 @@ function moveToTarget(itemId: string) {
|
||||
function moveAllToTarget() {
|
||||
if (props.useTree && treeData.value.length > 0) {
|
||||
// 树形模式:扁平化所有节点
|
||||
const flatItems = flattenTree(treeData.value);
|
||||
let flatItems = flattenTree(treeData.value);
|
||||
|
||||
// 如果只允许选择叶子节点,过滤掉非叶子节点
|
||||
if (props.onlyLeafSelectable) {
|
||||
flatItems = flatItems.filter(item => isLeafNode(item));
|
||||
}
|
||||
|
||||
targetList.value.push(...flatItems);
|
||||
availableList.value = [];
|
||||
treeData.value = [];
|
||||
|
||||
// 从availableList中移除已移动的项
|
||||
const idsToRemove = new Set(flatItems.map(item => getNodeId(item)));
|
||||
availableList.value = availableList.value.filter(item =>
|
||||
!idsToRemove.has(getItemId(item))
|
||||
);
|
||||
|
||||
// 重新构建树(如果还有非叶子节点)
|
||||
if (props.onlyLeafSelectable && props.treeTransform) {
|
||||
treeData.value = props.treeTransform(availableList.value);
|
||||
} else {
|
||||
treeData.value = [];
|
||||
}
|
||||
} else {
|
||||
// 列表模式
|
||||
targetList.value.push(...availableList.value);
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
<div
|
||||
class="tree-node-content"
|
||||
:style="{ paddingLeft: `${level * 20}px` }"
|
||||
:class="{
|
||||
selected: selectedIds.includes(nodeId),
|
||||
disabled: isCheckboxDisabled
|
||||
}"
|
||||
:class="{ selected: selectedIds.includes(nodeId) }"
|
||||
@click.stop="handleClick"
|
||||
@dblclick.stop="handleDblClick"
|
||||
>
|
||||
@@ -25,7 +22,6 @@
|
||||
<input
|
||||
type="checkbox"
|
||||
:checked="selectedIds.includes(nodeId)"
|
||||
:disabled="isCheckboxDisabled"
|
||||
@click.stop="handleCheckboxClick"
|
||||
/>
|
||||
|
||||
@@ -107,36 +103,28 @@ const hasChildren = computed(() => children.value && children.value.length > 0);
|
||||
|
||||
const expanded = computed(() => props.expandedKeys.has(nodeId.value));
|
||||
|
||||
// 判断复选框是否应该被禁用
|
||||
const isCheckboxDisabled = computed(() => {
|
||||
// 如果只允许选择叶子节点,且当前节点有子节点,则禁用复选框
|
||||
return props.onlyLeafSelectable && hasChildren.value;
|
||||
});
|
||||
|
||||
function getChildId(child: any): string {
|
||||
const idProp = props.treeProps?.id || 'id';
|
||||
return String(child[idProp] || '');
|
||||
}
|
||||
|
||||
function handleClick() {
|
||||
// 点击节点主体时切换选中状态(如果复选框未禁用)
|
||||
if (!isCheckboxDisabled.value) {
|
||||
emit('toggle-select', nodeId.value);
|
||||
}
|
||||
// 点击节点主体时切换选中状态
|
||||
emit('toggle-select', nodeId.value);
|
||||
}
|
||||
|
||||
function handleCheckboxClick() {
|
||||
// 复选框点击事件(如果未禁用)
|
||||
if (!isCheckboxDisabled.value) {
|
||||
emit('toggle-select', nodeId.value);
|
||||
}
|
||||
// 复选框点击事件
|
||||
emit('toggle-select', nodeId.value);
|
||||
}
|
||||
|
||||
function handleDblClick() {
|
||||
// 双击时触发(如果复选框未禁用)
|
||||
if (!isCheckboxDisabled.value) {
|
||||
emit('dblclick', nodeId.value);
|
||||
// 双击时触发
|
||||
// 如果只允许选择叶子节点,且当前是非叶子节点,则不触发双击
|
||||
if (props.onlyLeafSelectable && hasChildren.value) {
|
||||
return;
|
||||
}
|
||||
emit('dblclick', nodeId.value);
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -191,11 +179,6 @@ function handleDblClick() {
|
||||
input[type="checkbox"] {
|
||||
margin: 0 8px;
|
||||
cursor: pointer;
|
||||
|
||||
&:disabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.4;
|
||||
}
|
||||
}
|
||||
|
||||
.node-label {
|
||||
@@ -203,14 +186,6 @@ function handleDblClick() {
|
||||
font-size: 14px;
|
||||
color: #606266;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
cursor: not-allowed;
|
||||
|
||||
.node-label {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-children {
|
||||
|
||||
Reference in New Issue
Block a user