- {/* Resize handle */}
+ {/* Table layout for consistent column alignment */}
+
+ {/* Column header */}
+
+
+ {availableColumns.filter((c) => c.visible).map((col) => (
handleColumnResize(col.key, e)}
- />
-
- ))}
-
-
-
- {filteredTickets.map((ticket) => {
- const selected = ticket.id === selectedId;
- const ownerName = ticket.owner_id
- ? users.find((u) => u.id === ticket.owner_id)?.username ?? "assigned"
- : null;
-
- return (
-
+
+ {filteredTickets.map((ticket) => {
+ const selected = ticket.id === selectedId;
+ const ownerName = ticket.owner_id
+ ? users.find((u) => u.id === ticket.owner_id)?.username ?? "assigned"
+ : null;
+
+ return (
+
setSelectedId(ticket.id)}
+ onDoubleClick={() => router.push(`/tickets/${ticket.id}`)}
+ onKeyDown={(e) => { if (e.key === "Enter") router.push(`/tickets/${ticket.id}`); }}
+ className={cn(
+ "cursor-pointer border-b border-border/80",
+ density === "compact" ? "" : "",
+ selected
+ ? "bg-accent/80 shadow-[inset_3px_0_0_var(--primary)]"
+ : "hover:bg-accent/45"
+ )}
+ style={{ display: "table-row" }}
+ >
+
e.stopPropagation()}>
+ toggleBatchId(ticket.id)}
+ className="h-3.5 w-3.5 rounded border-border accent-primary"
+ />
+
+ {availableColumns.filter((c) => c.visible).map((col) => {
+ const cellStyle = {
+ display: "table-cell" as const,
+ width: col.key === "subject" ? undefined : col.width,
+ verticalAlign: "middle" as const,
+ padding: density === "compact" ? "4px 12px" : "8px 12px",
+ };
+
+ if (col.key.startsWith("cf.")) {
+ const cfKey = col.key.slice(3);
+ const cfValue = ticket.custom_fields?.find((v) => v.custom_field?.key === cfKey || v.custom_field?.name === cfKey)?.value;
return (
-
- {formatTicketId(ticket.id)}
-
+
+ {cfValue ?? "—"}
+
);
- case "subject":
- return (
-
-
- {ticket.subject}
-
- {density === "comfortable" && (
-
- {ownerName ?? "Unassigned"}
-
- Created {relativeTime(ticket.created_at)}
+ }
+ switch (col.key) {
+ case "id":
+ return (
+
+ {formatTicketId(ticket.id)}
+
+ );
+ case "subject":
+ return (
+
+
+ {ticket.subject}
- )}
-
- );
- case "status":
- return (
-
-
-
- );
- case "queue":
- return (
-
- {queueName(queues, ticket.queue_id)}
-
- );
- case "owner":
- return (
-
- {ownerName ?? "—"}
-
- );
- case "created":
- return (
-
- {relativeTime(ticket.created_at)}
-
- );
- case "updated":
- return (
-
- {relativeTime(ticket.updated_at)}
-
- );
- default:
- return ;
- }
- })}
-
-
-
-
- );
- })}
+ {density === "comfortable" && (
+
+ {ownerName ?? "Unassigned"}
+
+ Created {relativeTime(ticket.created_at)}
+
+ )}
+
+ );
+ case "status":
+ return (
+
+
+
+ );
+ case "queue":
+ return (
+
+ {queueName(queues, ticket.queue_id)}
+
+ );
+ case "owner":
+ return (
+
+ {ownerName ?? "—"}
+
+ );
+ case "created":
+ return (
+
+ {relativeTime(ticket.created_at)}
+
+ );
+ case "updated":
+ return (
+
+ {relativeTime(ticket.updated_at)}
+
+ );
+ default:
+ return ;
+ }
+ })}
+
+
+
+