/** * Showcase · アクセス承認キュー / Access approval queue — the canonical five-column * approval collection at 1440 · 1024 · 390 using ONLY public API. * * The whole responsive contract is `Table preset="action-collection"` plus a `priority` on each * column's `TableHead`/`TableCell`. Below the collapse step the package swaps the desktop * intrinsic column widths for the token-owned priority measures under `table-layout: fixed` and * lets cells wrap, so 申請者 · 対象 · 理由 · 申請日時 · 操作 all stay inside the initial 390px * frame — no page-local CSS, no consumer width, no hidden column, no horizontal scroll. * * The table stays a REAL table at every width: `` / `` / `` / `` are * untouched, so header association and screen-reader table navigation are identical at 390 and at * 1440. Row actions are a single kebab menu, the affordance whose measure the preset reserves * first — it can never be pushed outside the viewport. * * Content is JA + EN + VI, including a deliberately long reason and a long resource path. */ import { ClipboardCheck, LayoutDashboard, MoreHorizontal, ScrollText } from "lucide-react"; import { Badge, Card, CardContent, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@godxjp/ui/data-display"; import { Button, Text } from "@godxjp/ui/general"; import { AppShell, Flex, PageContainer, Sidebar, Topbar } from "@godxjp/ui/layout"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@godxjp/ui/navigation"; type Request = { id: string; requester: string; requesterMail: string; target: string; reason: string; requestedAt: string; state: "pending" | "escalated"; }; const REQUESTS: Request[] = [ { id: "req-1041", requester: "田中 太郎", requesterMail: "taro.tanaka@example.co.jp", target: "会計 / 請求書エクスポート", reason: "月次決算のため請求データの一括出力権限が必要です。", requestedAt: "2026-08-03T09:12:00+09:00", state: "pending", }, { id: "req-1042", requester: "Nguyễn Thị Hồng Ánh", requesterMail: "hong.anh.nguyen@example.vn", target: "Kho vận / Quản trị phiếu xuất kho khu vực miền Nam", reason: "Cần quyền quản trị để xử lý phiếu xuất kho tồn đọng của chi nhánh miền Nam trong kỳ kiểm kê quý III.", requestedAt: "2026-08-03T11:47:00+09:00", state: "escalated", }, { id: "req-1043", requester: "Margaret Whitmore-Ashcombe", requesterMail: "margaret.whitmore@example.com", target: "Identity / Service account administration", reason: "Rotating the service-account credentials scheduled for the August maintenance window.", requestedAt: "2026-08-04T02:05:00+09:00", state: "pending", }, { id: "req-1044", requester: "佐藤 花子", requesterMail: "hanako.sato@example.co.jp", target: "勤怠 / 部門レポート", reason: "部門別の残業集計を確認するため。", requestedAt: "2026-08-04T08:30:00+09:00", state: "pending", }, ]; const REQUESTED_AT = new Intl.DateTimeFormat("ja-JP", { dateStyle: "short", timeStyle: "short", timeZone: "Asia/Tokyo", }); export default function TableApprovalQueue() { return ( } topbar={アクセス承認} />} > 申請者 対象 理由 申請日時 操作 {REQUESTS.map((request) => ( {request.requester} {request.requesterMail} {request.target} {request.state === "escalated" && ( エスカレーション )} {request.reason} 承認する 却下する 詳細を表示 ))}
); }