co2 galvo owner test

This commit is contained in:
makearmy 2025-10-01 19:01:32 -04:00
parent 39d9723e23
commit eea0c52ea4

View file

@ -10,6 +10,7 @@ export default function CO2GalvoSettingDetailPage() {
const [setting, setSetting] = useState<any>(null); const [setting, setSetting] = useState<any>(null);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
// claim UI state
const [claimBusy, setClaimBusy] = useState(false); const [claimBusy, setClaimBusy] = useState(false);
const [claimMsg, setClaimMsg] = useState<string | null>(null); const [claimMsg, setClaimMsg] = useState<string | null>(null);
const [claimErr, setClaimErr] = useState<string | null>(null); const [claimErr, setClaimErr] = useState<string | null>(null);
@ -24,7 +25,7 @@ export default function CO2GalvoSettingDetailPage() {
"submission_id", "submission_id",
"setting_title", "setting_title",
"uploader", "uploader",
// ✅ request username explicitly // request owner explicitly (username is what we display)
"owner.id", "owner.id",
"owner.username", "owner.username",
"setting_notes", "setting_notes",
@ -45,7 +46,7 @@ export default function CO2GalvoSettingDetailPage() {
"lens_apt.name", "lens_apt.name",
"lens_exp.name", "lens_exp.name",
"focus", "focus",
// ✅ handle string-or-relation // laser software can be string or relation
"laser_soft", "laser_soft",
"laser_soft.name", "laser_soft.name",
"repeat_all", "repeat_all",
@ -67,15 +68,15 @@ export default function CO2GalvoSettingDetailPage() {
if (loading) return <p className="p-6">Loading setting...</p>; if (loading) return <p className="p-6">Loading setting...</p>;
if (!setting) return <p className="p-6">Setting not found.</p>; if (!setting) return <p className="p-6">Setting not found.</p>;
// ✅ prefer username; fall back to id or uploader (just in case) // owner username (what Directus returns when requesting owner.username)
const ownerName = (row: any) => const ownerUsername: string | null =
row?.owner?.username ?? (row?.owner?.id ? String(row.owner.id) : null) ?? null; (setting?.owner && setting.owner.username) ? String(setting.owner.username) : null;
// show string or relation.name // show string or relation.name
const softwareLabel = const softwareLabel: string =
typeof setting.laser_soft === "object" typeof setting?.laser_soft === "object"
? setting.laser_soft?.name ?? "—" ? (setting.laser_soft?.name ?? "—")
: setting.laser_soft ?? "—"; : (setting?.laser_soft ?? "—");
const formatBoolean = (val: any) => const formatBoolean = (val: any) =>
val ? "Enabled" : val === false ? "Disabled" : "—"; val ? "Enabled" : val === false ? "Disabled" : "—";
@ -97,7 +98,7 @@ export default function CO2GalvoSettingDetailPage() {
return ( return (
<p key={key} className="text-sm"> <p key={key} className="text-sm">
<strong>{label}:</strong>{" "} <strong>{label}:</strong>{" "}
{typeof value === "boolean" ? formatBoolean(value) : value || "—"} {typeof value === "boolean" ? formatBoolean(value) : value ?? "—"}
</p> </p>
); );
})} })}
@ -147,8 +148,6 @@ export default function CO2GalvoSettingDetailPage() {
} }
}; };
const owner = ownerName(setting);
return ( return (
<div className="p-6 max-w-7xl mx-auto"> <div className="p-6 max-w-7xl mx-auto">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
@ -159,14 +158,15 @@ export default function CO2GalvoSettingDetailPage() {
<div className="space-y-1 text-sm text-muted-foreground mb-3"> <div className="space-y-1 text-sm text-muted-foreground mb-3">
<p> <p>
<strong>Owner:</strong> {owner ? <span>{owner}</span> : <span></span>} <strong>Owner:</strong>{" "}
<span>{ownerUsername ?? "—"}</span>
</p> </p>
<p> <p>
<strong>Uploader:</strong> {setting.uploader || "—"} <strong>Uploader:</strong> {setting.uploader || "—"}
</p> </p>
</div> </div>
{!owner && ( {!ownerUsername && (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<button <button
onClick={onClaim} onClick={onClaim}