serv\web- 日志

This commit is contained in:
2025-10-30 16:40:56 +08:00
parent 82b6f14e64
commit 2b252e1b3c
91 changed files with 6003 additions and 1485 deletions

View File

@@ -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);

View File

@@ -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 {