fix(ui): shared UserCell для display UUID actor'ов везде
Browser QA на staging показал что UUID actor'а render'ится raw во многих местах кроме drawer (MR !158 — там был inline fix): - /reviews Records tab — column AUTHOR - /reviews Schemas tab — column AUTHOR - /audit log — column USER 77ec2cc8-98e3-4d70-8037-94038fcbde67 — нечитаемо для оператора. Тот же паттерн что я делал в MR !158, теперь shared helper: src/lib/useUserDisplay.tsx: - useUserDisplay(uuid) hook — returns { display, isMe, fullId } - UserCell component — readonly cell с title=fullId tooltip - Match current user (JWT sub claim) → 'Я • <preferred_username>' - Other user → short UUID (8 chars) + full в title - null/undefined → 'anonymous' Применено: - reviews.tsx:334,625 — records + schemas table AUTHOR cells - audit.tsx:476 — USER cell - SchemaDraftDrawer.tsx — refactor (был inline в MR !158 → теперь shared) TODO Phase 1d: backend endpoint /admin/users/{sub}/display чтобы и для не-current-user отображать username.
This commit is contained in:
@@ -28,6 +28,7 @@ import {
|
||||
useWithdrawSchemaDraft,
|
||||
} from '@/api/mutations'
|
||||
import { useCanPublishSchema, useCanReviewSchema } from '@/auth/usePermissions'
|
||||
import { UserCell } from '@/lib/useUserDisplay'
|
||||
|
||||
type Props = {
|
||||
open: boolean
|
||||
@@ -321,33 +322,10 @@ function StatusBadge({ status }: { status: SchemaDraftStatus }) {
|
||||
|
||||
function DraftMeta({ draft }: { draft: SchemaDraft }) {
|
||||
const { t } = useTranslation()
|
||||
const auth = useAuth()
|
||||
// Resolve author display: если maker = current user, показываем имя текущего
|
||||
// юзера ("Я • <username>"). Иначе — short UUID (первые 8 chars) с full
|
||||
// tooltip. Полное UUID показывать бессмысленно — это Keycloak sub claim,
|
||||
// нечитаемый для оператора.
|
||||
//
|
||||
// TODO Phase 1d: backend endpoint /admin/users/{sub}/display чтобы для
|
||||
// не-current-user тоже показывать username. Пока — best-effort: current
|
||||
// user resolved через JWT profile claim, другие — UUID prefix.
|
||||
const currentSub = auth.user?.profile?.sub
|
||||
const isMe = currentSub && currentSub === draft.makerId
|
||||
const myDisplay =
|
||||
auth.user?.profile?.preferred_username ||
|
||||
auth.user?.profile?.name ||
|
||||
auth.user?.profile?.email
|
||||
const authorDisplay = isMe
|
||||
? `Я${myDisplay ? ` • ${myDisplay}` : ''}`
|
||||
: draft.makerId.substring(0, 8)
|
||||
return (
|
||||
<dl className="grid grid-cols-[120px_1fr] gap-y-1 gap-x-3 text-cell">
|
||||
<Row label={t('workflow.schemaDraft.maker', { defaultValue: 'Автор' })}>
|
||||
<span
|
||||
className={isMe ? 'text-ink' : 'font-mono text-mute'}
|
||||
title={draft.makerId}
|
||||
>
|
||||
{authorDisplay}
|
||||
</span>
|
||||
<UserCell uuid={draft.makerId} />
|
||||
</Row>
|
||||
<Row label={t('workflow.schemaDraft.from', { defaultValue: 'От версии' })}>
|
||||
v{draft.branchedFromVersion}
|
||||
|
||||
Reference in New Issue
Block a user