<script lang="ts" setup>
|
import type { DmsPermissionGrant } from '#/api/x/dms/permission';
|
|
import { ref } from 'vue';
|
|
import { BasicDrawer, useDrawerInner } from '@jnpf/ui/drawer';
|
import { formatToDateTime } from '@jnpf/utils';
|
|
import { getPermissionGrant } from '#/api/x/dms/permission';
|
|
import { actionLabel, principalDisplayName, principalDisplayTitle, principalTypeLabel, scopeLabel, statusColor, statusLabel } from './permissionRules';
|
|
const detail = ref<DmsPermissionGrant>();
|
const [registerDrawer, { changeLoading }] = useDrawerInner(init);
|
|
async function init(data: { grantId: string }) {
|
detail.value = undefined;
|
changeLoading(true);
|
try {
|
const response = await getPermissionGrant(data.grantId);
|
detail.value = response.data;
|
} finally {
|
changeLoading(false);
|
}
|
}
|
|
function displayTime(value?: string) {
|
return value ? formatToDateTime(value, 'YYYY-MM-DD HH:mm:ss') : '—';
|
}
|
</script>
|
|
<template>
|
<BasicDrawer v-bind="$attrs" @register="registerDrawer" title="授权详情" width="min(720px, calc(100vw - 16px))" destroy-on-close>
|
<div class="detail-body" v-if="detail">
|
<a-descriptions bordered size="small" :column="1">
|
<a-descriptions-item label="状态">
|
<a-tag :color="statusColor(detail.status)">{{ statusLabel(detail.status) }}</a-tag>
|
</a-descriptions-item>
|
<a-descriptions-item label="授权主体">
|
<span :title="principalDisplayTitle(detail.principalName, detail.principalId)">
|
{{ principalTypeLabel(detail.principalType) }} / {{ principalDisplayName(detail.principalName, detail.principalId) }}
|
</span>
|
</a-descriptions-item>
|
<a-descriptions-item label="主体 ID">{{ detail.principalId }}</a-descriptions-item>
|
<a-descriptions-item label="操作与范围">{{ actionLabel(detail.actionCode) }} / {{ scopeLabel(detail.resourceScope) }}</a-descriptions-item>
|
<a-descriptions-item label="包含子组织">{{ detail.includeChildOrgs ? '是' : '否' }}</a-descriptions-item>
|
<a-descriptions-item label="有效期">{{ displayTime(detail.validFrom) }} 至 {{ displayTime(detail.validTo) }}</a-descriptions-item>
|
<a-descriptions-item label="使用次数">
|
{{ detail.usedCount }} / {{ detail.maxUseCount ?? '不限' }}
|
<span v-if="detail.remainingUseCount !== undefined">(剩余 {{ detail.remainingUseCount }})</span>
|
</a-descriptions-item>
|
<a-descriptions-item label="授权来源">{{ detail.sourceType }} / {{ detail.sourceId }}</a-descriptions-item>
|
<a-descriptions-item label="授权原因">{{ detail.grantReason || '—' }}</a-descriptions-item>
|
<a-descriptions-item label="撤销时间">{{ displayTime(detail.revokedAt) }}</a-descriptions-item>
|
<a-descriptions-item label="撤销原因">{{ detail.revokeReason || '—' }}</a-descriptions-item>
|
<a-descriptions-item label="版本号">{{ detail.revision }}</a-descriptions-item>
|
<a-descriptions-item label="权限 ID">{{ detail.id }}</a-descriptions-item>
|
</a-descriptions>
|
</div>
|
</BasicDrawer>
|
</template>
|
|
<style lang="scss" scoped>
|
.detail-body {
|
padding: 20px 24px 28px;
|
|
:deep(.ant-descriptions-item-content) {
|
overflow-wrap: anywhere;
|
}
|
}
|
</style>
|