Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ui/src/api/types/system-user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export interface SystemUser {
role_workspace?: Record<string, string[]>
role_setting?: SystemUserRoleAssignment[]
user_group_names?: string[]
user_group_workspace?: { workspace: string; user_group_names: string[] }[]
user_group_ids?: string[]
create_time: string
update_time?: string
Expand Down
9 changes: 6 additions & 3 deletions ui/src/components/COMPONENT_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -660,9 +660,12 @@ Skills 场景传入 `[TOOL_TYPE.SKILL]`,并通过 `title` 指定标题。两
### WorkspaceRelationTags

用于展示标签组,并在悬浮表格中展示每个标签关联的工作空间。
`tags` 控制表格单元格中的折叠标签;`tagWorkspace` 使用标签名称作为键、工作空间
名称数组作为值;`tableRenderParams.property` 和 `tableRenderParams.value` 分别设置
悬浮表格的标签列与工作空间列标题。
`tags` 控制表格单元格中的折叠标签;`data` 接收关联记录数组,`columns` 按顺序配置
`prop`(字段名)和 `label`(列名),列宽由表格自动分配。组件不转换接口数据结构,
旧对象映射由调用页面转换为行数组。用户组直接传入 `user_group_workspace` 数组,
使用 `workspace`、`user_group_names` 两列;角色映射由用户列表页面转换。
数组单元格以“、”连接,空数组、空字符串、null 和 undefined 显示 `-`,长文本使用溢出提示。
`data` 为空时禁用关联浮层,保留标签展示;内部 `MkTagGroup` 的标签浮层保持禁用。

### ResourceAuthorizationDrawer

Expand Down
37 changes: 23 additions & 14 deletions ui/src/components/business/workspace-relation-tags/index.vue
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
<script setup lang="ts">
import { computed } from 'vue'

defineOptions({ name: 'WorkspaceRelationTags' })

const props = defineProps<{ tableRenderParams: Record<'property' | 'value', string>; tags?: string[]; tagWorkspace?: Record<string, string[]> }>()
interface RelationColumn {
prop: string
label: string
}

defineProps<{
tags?: string[]
data: Record<string, unknown>[]
columns: RelationColumn[]
}>()

const tableData = computed(() => {
return Object.entries(props.tagWorkspace ?? {}).map(([tagName, workspaces]) => ({
property: tagName,
value: workspaces[0] === 'None' ? '-' : workspaces.join(', '),
}))
})
function formatCellValue(value: unknown): string {
if (Array.isArray(value)) return value.length ? value.join('、') : '-'
return value === null || value === undefined || value === '' ? '-' : String(value)
}
</script>

<template>
<el-popover placement="bottom" trigger="hover" :width="420" :persistent="false" :show-after="300">
<el-popover placement="bottom" trigger="hover" :width="420" :persistent="false" :show-after="300" :disabled="!data.length">
<template #reference>
<MkTagGroup :tags="tags" popover-disabled class="cursor-pointer" />
<MkTagGroup :tags="tags" popover-disabled :class="{ 'cursor-pointer': data.length }" />
</template>
<div class="p-6">
<MkTable :data="tableData" max-height="300" size="small">
<template v-for="(label, prop) in tableRenderParams" :key="prop">
<el-table-column :label="label" :prop="prop" :show-overflow-tooltip="{ appendTo: 'body' }" />
<MkTable :data="data" max-height="300" size="small">
<template v-for="column in columns" :key="column.prop">
<el-table-column :label="column.label" :prop="column.prop" :show-overflow-tooltip="{ appendTo: 'body' }">
<template #default="{ row }">
{{ formatCellValue(row[column.prop]) }}
</template>
</el-table-column>
</template>
</MkTable>
</div>
Expand Down
2 changes: 1 addition & 1 deletion ui/src/components/mk-edit-avatar/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ onBeforeUnmount(() => fileReader?.abort())
</template>

<div v-click-outside="closeOutside" class="p-4" @keydown.esc.stop="close" @click.stop>
<div class="mb-1">Logo 设置<span class="ml-0.5 text-danger">*</span></div>
<div class="mb-1">Logo 设置</div>
<el-radio-group v-model="logoMode" :disabled="reading" class="mb-2">
<el-radio value="default">默认 Logo</el-radio>
<el-radio value="custom">自定义上传</el-radio>
Expand Down
2 changes: 2 additions & 0 deletions ui/src/styles/element-plus.scss
Original file line number Diff line number Diff line change
Expand Up @@ -671,8 +671,10 @@
/* popover */
.el-popover {
--el-popover-border-radius: var(--el-border-radius-base);

&.el-popper {
padding: 0;
line-height: var(--mk-line-height-base);
color: var(--el-text-color-primary) !important;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ function handleClosePortalEdit() {
<MkIcon name="icon_edit_outlined" />
</el-button>
<MkDialog v-model="editVisible" title="编辑" @closed="handleClosePortalEdit">
<el-form ref="portalFormRef" :model="portalForm" :rules="portalRules" label-position="top" @submit.prevent>
<el-form ref="portalFormRef" :model="portalForm" :rules="portalRules" label-position="top" require-asterisk-position="right" @submit.prevent>
<el-form-item label="名称" prop="name">
<div class="flex-align-center w-full gap-3">
<!-- <MkEditAvatar v-model="portalForm.logo" :default-icon="defaultLogo" :size="32" @change="handleLogoChange" /> -->
<MkEditAvatar v-model="portalForm.logo" :default-icon="defaultLogo" :size="32" @change="handleLogoChange" />
<el-input v-model="portalForm.name" maxlength="64" show-word-limit :disabled="saving" placeholder="请输入门户名称" />
</div>
</el-form-item>
Expand Down
14 changes: 10 additions & 4 deletions ui/src/views/system/identity/groups/GroupsListView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import type { Dict, OptionItem, WorkspaceItem, SystemUserGroup, SystemUserGroupM
import { MsgConfirm, MsgSuccess } from '@/utils/message'
import WorkspaceDropdown from '@/components/business/workspace-dropdown/index.vue'
import MkSearchList from '@/components/mk-search-list/index.vue'
import WorkspaceRelationTags from '@/components/business/workspace-relation-tags/index.vue'
import CreateOrUpdateGroupDialog from './dialog/CreateOrUpdateGroupDialog.vue'
import CreateGroupMemberDialog from './dialog/CreateGroupMemberDialog.vue'
import { useStore } from '@/stores'
Expand Down Expand Up @@ -152,7 +151,9 @@ function handleRemoveMembers(member?: SystemUserGroupMember) {
).then(() => {
MsgSuccess('移除成功')
const removedRelationIds = new Set(members.map(({ system_user_group_relation_id }) => system_user_group_relation_id))
userGroupMembers.value = userGroupMembers.value.filter(({ system_user_group_relation_id }) => !removedRelationIds.has(system_user_group_relation_id))
userGroupMembers.value = userGroupMembers.value.filter(
({ system_user_group_relation_id }) => !removedRelationIds.has(system_user_group_relation_id),
)
paginationConfig.value.total = userGroupMembers.value.length
selectedGroupMembers.value = []
loadUserGroups()
Expand Down Expand Up @@ -241,7 +242,7 @@ onMounted(() => {
<el-table-column prop="username" label="用户名" min-width="198" show-overflow-tooltip />
<el-table-column label="角色" min-width="198">
<template #default="{ row }">
<WorkspaceRelationTags :table-render-params="{ property: '角色', value: '工作空间' }" :tags="row.roles" />
<MkTagGroup :tags="row.roles" />
</template>
</el-table-column>
<el-table-column prop="source" label="用户来源" min-width="198" show-overflow-tooltip />
Expand All @@ -265,5 +266,10 @@ onMounted(() => {
</template>
</MkViewLayout>
<CreateOrUpdateGroupDialog ref="groupDialogRef" :workspace-id="selectedWorkspaceId" @refresh="handleGroupSaved" />
<CreateGroupMemberDialog ref="memberDialogRef" :workspace-id="selectedWorkspaceId" :current-group="currentGroup" @refresh="loadUserGroupMembers(true)" />
<CreateGroupMemberDialog
ref="memberDialogRef"
:workspace-id="selectedWorkspaceId"
:current-group="currentGroup"
@refresh="loadUserGroupMembers(true)"
/>
</template>
15 changes: 11 additions & 4 deletions ui/src/views/system/identity/users/UserListView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const userTableRef = useTemplateRef('userTableRef')
const systemUsersLoading = ref(false)
const paginationConfig = ref({ currentPage: 1, pageSize: 20, total: 0 })
const systemUsersData = ref<SystemUser[]>([])

const searchFields: OptionItem<string>[] = [
{ label: '用户名', value: 'username' },
{ label: '姓名', value: 'nick_name' },
Expand Down Expand Up @@ -168,9 +169,12 @@ onMounted(() => loadSystemUsers())
<el-table-column v-if="auth.isEE || auth.isPE" prop="role_name" width="180" label="角色">
<template #default="{ row }">
<WorkspaceRelationTags
:table-render-params="{ property: '角色', value: '工作空间' }"
:columns="[
{ prop: 'role', label: '角色' },
{ prop: 'workspace', label: '工作空间' },
]"
:tags="row.role_name"
:tag-workspace="row.role_workspace"
:data="row.role_workspace"
/>
</template>
</el-table-column>
Expand All @@ -180,9 +184,12 @@ onMounted(() => loadSystemUsers())
<span v-if="!row.user_group_names?.length">-</span>
<WorkspaceRelationTags
v-else
:table-render-params="{ property: '用户组', value: '工作空间' }"
:columns="[
{ prop: 'user_group_names', label: '用户组' },
{ prop: 'workspace', label: '工作空间' },
]"
:tags="row.user_group_names"
:tag-workspace="row.user_group_workspace"
:data="row.user_group_workspace ?? []"
/>
</template>
</el-table-column>
Expand Down
Loading