53 lines
1.4 KiB
Vue
53 lines
1.4 KiB
Vue
<script setup lang="ts">
|
||||
|
|
import { computed } from 'vue'
|
|||
|
|
import { ChevronDown, UserRoundCog } from '@lucide/vue'
|
|||
|
|
import type { Role } from '@/types/admin'
|
|||
|
|
|
|||
|
|
const props = defineProps<{
|
|||
|
|
roles: Role[]
|
|||
|
|
currentRole: Role | null
|
|||
|
|
}>()
|
|||
|
|
|
|||
|
|
const emit = defineEmits<{
|
|||
|
|
select: [roleId: string]
|
|||
|
|
}>()
|
|||
|
|
|
|||
|
|
const roleName = computed(() => props.currentRole?.name ?? '无可用角色')
|
|||
|
|
const accessibleLabel = computed(() => `权限预览:${roleName.value},数据范围未模拟`)
|
|||
|
|
|
|||
|
|
function handleCommand(command: string | number) {
|
|||
|
|
emit('select', String(command))
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<template>
|
|||
|
|
<el-dropdown :disabled="roles.length === 0" trigger="click" @command="handleCommand">
|
|||
|
|
<button
|
|||
|
|
class="role-preview-trigger"
|
|||
|
|
type="button"
|
|||
|
|
:aria-label="accessibleLabel"
|
|||
|
|
:title="accessibleLabel"
|
|||
|
|
>
|
|||
|
|
<UserRoundCog :size="18" aria-hidden="true" />
|
|||
|
|
<span class="role-preview-copy">
|
|||
|
|
<strong>权限预览:{{ roleName }}</strong>
|
|||
|
|
<small>仅预览菜单、页面和操作;数据范围未模拟</small>
|
|||
|
|
</span>
|
|||
|
|
<ChevronDown :size="15" aria-hidden="true" />
|
|||
|
|
</button>
|
|||
|
|
|
|||
|
|
<template #dropdown>
|
|||
|
|
<el-dropdown-menu>
|
|||
|
|
<el-dropdown-item
|
|||
|
|
v-for="role in roles"
|
|||
|
|
:key="role.id"
|
|||
|
|
:command="role.id"
|
|||
|
|
:disabled="role.id === currentRole?.id"
|
|||
|
|
>
|
|||
|
|
{{ role.name }}
|
|||
|
|
</el-dropdown-item>
|
|||
|
|
</el-dropdown-menu>
|
|||
|
|
</template>
|
|||
|
|
</el-dropdown>
|
|||
|
|
</template>
|