diff --git a/web/components/accounts-table.tsx b/web/components/accounts-table.tsx index 9994393..7278310 100644 --- a/web/components/accounts-table.tsx +++ b/web/components/accounts-table.tsx @@ -195,17 +195,15 @@ export default function AccountsTable({ initial, prefixPattern }: Props) { /> -
- - setEditingKey(k("status"))} - onEditEnd={() => setEditingKey(null)} - onSave={(v) => saveCell(row.username, "status", v)} - /> -
+ setEditingKey(k("status"))} + onEditEnd={() => setEditingKey(null)} + onSave={(v) => saveCell(row.username, "status", v)} + renderView={(v) => } + /> {row.username} -
- - { - setDeleteError(null); - setDeleteTarget(row.username); - }} - /> -
+ { + setDeleteError(null); + setDeleteTarget(row.username); + }} + />
@@ -273,6 +268,7 @@ export default function AccountsTable({ initial, prefixPattern }: Props) { onEditStart={() => setEditingKey(k("status"))} onEditEnd={() => setEditingKey(null)} onSave={(v) => saveCell(row.username, "status", v)} + renderView={(v) => } /> diff --git a/web/components/editable-cell.tsx b/web/components/editable-cell.tsx index 2193d02..259e105 100644 --- a/web/components/editable-cell.tsx +++ b/web/components/editable-cell.tsx @@ -9,6 +9,12 @@ type EditableCellProps = { isCurrentlyEditing?: boolean; onEditStart?: () => void; onEditEnd?: () => void; + /** + * Override how the value is rendered in view mode. Use this to show + * something other than plain text (e.g., a status pill) — clicking + * the rendered element still starts edit mode. + */ + renderView?: (value: string) => React.ReactNode; }; export default function EditableCell({ @@ -18,6 +24,7 @@ export default function EditableCell({ isCurrentlyEditing, onEditStart, onEditEnd, + renderView, }: EditableCellProps) { const [editing, setEditing] = useState(false); const [draft, setDraft] = useState(value); @@ -75,10 +82,12 @@ export default function EditableCell({ type="button" onClick={begin} aria-label={label ? `Edit ${label}` : undefined} - className="group flex w-full min-w-0 items-start gap-2 -mx-2 rounded-md px-2 py-1 text-left font-mono text-[13px] text-zinc-900 transition-colors hover:bg-zinc-100/70 focus:outline-none focus-visible:ring-2 focus-visible:ring-zinc-900" + className="group flex w-full min-w-0 items-center gap-2 -mx-2 rounded-md px-2 py-1 text-left font-mono text-[13px] text-zinc-900 transition-colors hover:bg-zinc-100/70 focus:outline-none focus-visible:ring-2 focus-visible:ring-zinc-900" > - {value || } + {renderView + ? renderView(value) + : value || }