This commit is contained in:
@@ -66,20 +66,20 @@ function BuildWorker({ job }: { job: LauncherBuildJob }) {
|
|||||||
const initial = name.trim().charAt(0).toUpperCase() || '?';
|
const initial = name.trim().charAt(0).toUpperCase() || '?';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<span className="inline-flex min-w-0 items-center gap-2">
|
<span className="inline-flex h-4 min-w-0 items-center gap-1.5 align-middle">
|
||||||
{avatarUrl && !failed ? (
|
{avatarUrl && !failed ? (
|
||||||
<img
|
<img
|
||||||
src={avatarUrl}
|
src={avatarUrl}
|
||||||
alt=""
|
alt=""
|
||||||
className="size-6 shrink-0 rounded-full border border-border bg-muted object-cover"
|
className="size-4 shrink-0 rounded-full border border-border bg-muted object-cover"
|
||||||
onError={() => setFailed(true)}
|
onError={() => setFailed(true)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<span className="inline-flex size-6 shrink-0 items-center justify-center rounded-full border border-border bg-muted text-[11px] font-semibold text-muted-foreground">
|
<span className="inline-flex size-4 shrink-0 items-center justify-center rounded-full border border-border bg-muted text-[9px] font-semibold leading-none text-muted-foreground">
|
||||||
{initial}
|
{initial}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
<b className="truncate text-foreground">{name}</b>
|
<b className="truncate leading-none text-foreground">{name}</b>
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -441,7 +441,7 @@ export function LauncherBuildPage() {
|
|||||||
<div className="mt-3 flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground">
|
<div className="mt-3 flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground">
|
||||||
<span>브랜치 <b className="text-foreground">{job.branch}</b></span>
|
<span>브랜치 <b className="text-foreground">{job.branch}</b></span>
|
||||||
<span>커밋 <b className="font-mono text-foreground">{job.commitSha || '-'}</b></span>
|
<span>커밋 <b className="font-mono text-foreground">{job.commitSha || '-'}</b></span>
|
||||||
<span className="inline-flex min-w-0 items-center gap-2">작업자 <BuildWorker job={job} /></span>
|
<span className="inline-flex h-4 min-w-0 items-center gap-1.5 align-middle">작업자 <BuildWorker job={job} /></span>
|
||||||
<span>생성 <b className="text-foreground">{formatDate(job.createdAt)}</b></span>
|
<span>생성 <b className="text-foreground">{formatDate(job.createdAt)}</b></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -73,6 +73,34 @@ function exposureCell(row: LauncherNotice) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function NoticeCreator({ notice }: { notice: LauncherNotice }) {
|
||||||
|
const [failed, setFailed] = useState(false);
|
||||||
|
const name = notice.createdByName || notice.createdByEmail || 'admin';
|
||||||
|
const avatarUrl = notice.createdByAvatarUrl || '';
|
||||||
|
const initial = name.trim().charAt(0).toUpperCase() || 'A';
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex min-w-0 items-center gap-2">
|
||||||
|
{avatarUrl && !failed ? (
|
||||||
|
<img
|
||||||
|
src={avatarUrl}
|
||||||
|
alt=""
|
||||||
|
className="size-7 shrink-0 rounded-full border border-border bg-muted object-cover"
|
||||||
|
onError={() => setFailed(true)}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<span className="inline-flex size-7 shrink-0 items-center justify-center rounded-full border border-border bg-muted text-xs font-semibold text-muted-foreground">
|
||||||
|
{initial}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
<div className="min-w-0">
|
||||||
|
<p className="truncate text-sm font-medium text-foreground">{name}</p>
|
||||||
|
<p className="mt-0.5 whitespace-nowrap text-xs text-muted-foreground">{formatNoticeDateTime(notice.createdAt)}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function toForm(notice: LauncherNotice): NoticeForm {
|
function toForm(notice: LauncherNotice): NoticeForm {
|
||||||
return {
|
return {
|
||||||
appKey: notice.appKey,
|
appKey: notice.appKey,
|
||||||
@@ -246,7 +274,7 @@ export function NoticesPage() {
|
|||||||
},
|
},
|
||||||
{ key: 'appKey', header: '대상 앱', cell: (row) => <StatusBadge status={row.appName} tone={isLauncherNoticeKey(row.appKey) ? 'violet' : 'blue'} /> },
|
{ key: 'appKey', header: '대상 앱', cell: (row) => <StatusBadge status={row.appName} tone={isLauncherNoticeKey(row.appKey) ? 'violet' : 'blue'} /> },
|
||||||
{ key: 'exposure', header: '노출 일시', className: 'w-48 px-5 py-3 font-medium', cell: exposureCell },
|
{ key: 'exposure', header: '노출 일시', className: 'w-48 px-5 py-3 font-medium', cell: exposureCell },
|
||||||
{ key: 'createdAt', header: '생성일시', cell: (row) => <span className="text-muted-foreground">{formatNoticeDateTime(row.createdAt)}</span> },
|
{ key: 'createdAt', header: '생성', className: 'w-48 px-5 py-3', cell: (row) => <NoticeCreator notice={row} /> },
|
||||||
{
|
{
|
||||||
key: 'actions',
|
key: 'actions',
|
||||||
header: '',
|
header: '',
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ export type LauncherNotice = {
|
|||||||
endsAt?: string | null;
|
endsAt?: string | null;
|
||||||
priority: number;
|
priority: number;
|
||||||
status?: string;
|
status?: string;
|
||||||
|
createdByName?: string | null;
|
||||||
|
createdByEmail?: string | null;
|
||||||
|
createdByAvatarUrl?: string | null;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt?: string;
|
updatedAt?: string;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user