diff --git a/src/components/CrudTable.vue b/src/components/CrudTable.vue index fa47b27..a3a739b 100644 --- a/src/components/CrudTable.vue +++ b/src/components/CrudTable.vue @@ -252,6 +252,31 @@ async function onHandleSubmit(): Promise { } } +/** + * 单元格点击 → 行点击回调(props.onRowClick) + * + * 用 cell-click 而不是 row-click:vxe-table 没有 row-click 事件(事件表里只有 + * cell-click),原先的 @row-click 绑定从未触发过。 + * 两类点击必须放过,否则会误触发行点击行为: + * - 复选/单选/展开列:勾选行不应该弹出详情 + * - 行内按钮(查看/编辑/删除):按钮有自己的动作 + */ +function handleCellClick(params: { + row: T + column?: { type?: string } + $event?: MouseEvent + triggerCheckbox?: boolean + triggerRadio?: boolean +}): void { + if (!props.onRowClick) return + const columnType = params.column?.type + if (columnType && ['checkbox', 'radio', 'seq', 'expand'].includes(columnType)) return + if (params.triggerCheckbox || params.triggerRadio) return + const target = params.$event?.target as HTMLElement | null | undefined + if (target?.closest('button, a, .el-checkbox, .el-switch')) return + handleRowClick(params.row) +} + // 查询条件变化(如工单管理页的状态筛选):重置到第一页并重新加载。 // 父组件传响应式 query(computed)时触发;无 query 的页面不受影响。 watch( @@ -559,7 +584,7 @@ defineExpose({ :row-config="{ isHover: true }" :column-config="{ resizable: true }" :checkbox-config="{ range: true }" - @row-click="(params: { row: T }) => handleRowClick(params.row)" + @cell-click="handleCellClick" @checkbox-change="onCheckboxChange" @checkbox-all="onCheckboxChange" > diff --git a/src/components/UserDetailPanel.vue b/src/components/UserDetailPanel.vue new file mode 100644 index 0000000..3219e8f --- /dev/null +++ b/src/components/UserDetailPanel.vue @@ -0,0 +1,844 @@ + + + + + diff --git a/src/views/company/DepartmentDetail.vue b/src/views/company/DepartmentDetail.vue index 93534e2..d7fc80a 100644 --- a/src/views/company/DepartmentDetail.vue +++ b/src/views/company/DepartmentDetail.vue @@ -25,6 +25,7 @@ import InfoGrid from '@/components/InfoGrid.vue' import CrudTable from '@/components/CrudTable.vue' import EntityPicker from '@/components/EntityPicker.vue' import BatchPositionDialog from '@/components/BatchPositionDialog.vue' +import UserDetailPanel from '@/components/UserDetailPanel.vue' import { formApi } from '@/api/form' import { useResolveUUIDs } from '@/composables/useResolveUUIDs' import { setPageTitle } from '@/utils/serverScope' @@ -185,11 +186,27 @@ async function handleSubmit(): Promise { // === 子表跳转 === -/** UserRole 子表查看 → 用户详情 */ +/** UserRole 子表查看按钮 → 用户详情页 */ function goUserDetail(row: Record): void { router.push({ path: '/system/user-detail', query: { UserUUID: row.UserUUID || '' } }) } +// === 行点击 → 用户详情抽屉 === +// 整行任意位置点击即弹出 60% 宽抽屉,内容与 /system/user-detail 页面完全一致 +// (同一个 UserDetailPanel 组件);「查看」按钮仍保持跳转到整页。 +const userDrawerVisible = ref(false) +const userDrawerUUID = ref('') +const userDrawerTitle = ref('用户详情') + +/** 打开用户详情抽屉(行内没有 UserUUID 时忽略,避免打开空抽屉) */ +function openUserDrawer(row: Record): void { + const uuid = String(row.UserUUID || '') + if (!uuid) return + userDrawerTitle.value = row.UserUUID_label ? String(row.UserUUID_label) : '用户详情' + userDrawerUUID.value = uuid + userDrawerVisible.value = true +} + // === 批量调整职务 === const deptTableRef = ref() const batchDialogVisible = ref(false) @@ -275,6 +292,7 @@ watch(deptUUID, () => { pageable :max-height="400" :on-view="goUserDetail" + :on-row-click="openUserDrawer" > + + +
+ +
+
+ { - + diff --git a/src/views/system/UserDetail.vue b/src/views/system/UserDetail.vue index 2241bf3..9c64b2c 100644 --- a/src/views/system/UserDetail.vue +++ b/src/views/system/UserDetail.vue @@ -1,843 +1,50 @@ - -