fix: 完善文档权限接口接入

This commit is contained in:
xy
2026-09-03 12:33:16 +08:00
parent 48e5293509
commit 925d8c9202
4 changed files with 193 additions and 39 deletions
@@ -12,12 +12,16 @@ const props = defineProps<{
subjects: PermissionSubjectOption[]
loading: boolean
saving: boolean
error: boolean
previewUserId: string
}>()
const emit = defineEmits<{
'update:selectedTemplateId': [value: string]
'update:previewUserId': [value: string]
add: [form: TemplatePermissionForm]
delete: [permissionId: string]
retry: []
}>()
const form = reactive<TemplatePermissionForm>({
@@ -48,6 +52,8 @@ const availableSubjects = computed(() =>
props.subjects.filter((subject) => subject.type === form.subjectType),
)
const previewUsers = computed(() => props.subjects.filter((subject) => subject.type === 'USER'))
const selectedTemplate = computed(() =>
props.templates.find((template) => template.id === props.selectedTemplateId),
)
@@ -56,6 +62,10 @@ function handleTemplateChange(event: Event) {
emit('update:selectedTemplateId', (event.target as HTMLSelectElement).value)
}
function handlePreviewUserChange(event: Event) {
emit('update:previewUserId', (event.target as HTMLSelectElement).value)
}
function handleSubjectTypeChange() {
form.subjectId = availableSubjects.value[0]?.id ?? ''
}
@@ -105,10 +115,23 @@ watch(
<span v-if="selectedTemplate" class="template-meta">
{{ selectedTemplate.code || selectedTemplate.id }} · {{ selectedTemplate.category }}
</span>
<label class="template-select preview-select">
<span>继承预览用户</span>
<select :value="previewUserId" :disabled="loading" @change="handlePreviewUserChange">
<option value="">当前登录用户</option>
<option v-for="user in previewUsers" :key="user.id" :value="user.id">
{{ user.label }}
</option>
</select>
</label>
</div>
<div v-if="!selectedTemplateId" class="empty-state">暂无模板,请先选择一个模板。</div>
<div v-else-if="loading" class="loading-state">正在加载模板权限…</div>
<div v-else-if="error" class="error-state">
<span>模板权限加载失败</span>
<button type="button" class="retry-button" @click="emit('retry')">重新加载</button>
</div>
<template v-else>
<div class="permission-list">
<div class="list-heading">
@@ -128,7 +151,18 @@ watch(
</tr>
</thead>
<tbody>
<tr v-for="permission in permissions" :key="permission.id">
<tr
v-for="permission in permissions"
:key="
permission.id ??
[
permission.subjectType,
permission.subjectId,
permission.permissionLevel,
permission.effect,
].join('-')
"
>
<td>
<span class="subject-type">{{ subjectTypeLabels[permission.subjectType] }}</span>
{{ formatSubject(permission.subjectType, permission.subjectId) }}
@@ -232,6 +266,10 @@ watch(
min-width: min(420px, 100%);
}
.preview-select {
min-width: min(280px, 100%);
}
select {
min-width: 0;
padding: 7px 10px;
@@ -356,13 +394,37 @@ td {
}
.empty-state,
.loading-state {
.loading-state,
.error-state {
padding: 32px 16px;
color: var(--mut);
font-size: 12.5px;
text-align: center;
}
.error-state {
display: flex;
gap: 10px;
align-items: center;
justify-content: center;
color: var(--err);
background: #f8fbfc;
border-radius: 6px;
}
.retry-button {
padding: 4px 10px;
color: var(--brand);
font-size: 12px;
background: #fff;
border: 1px solid var(--brand);
border-radius: 5px;
}
.retry-button:hover {
background: var(--brand-l);
}
.empty-state.compact {
padding: 18px 12px;
margin: 0;