diff --git a/astro-app/src/components/ProjectCard.tsx b/astro-app/src/components/ProjectCard.tsx index db68a6d..dbd9abd 100644 --- a/astro-app/src/components/ProjectCard.tsx +++ b/astro-app/src/components/ProjectCard.tsx @@ -66,7 +66,7 @@ export function ProjectCard({ project, onSeenStatusChange }: ProjectCardProps) { {/* Project Actions */}
- <> +
{/* Project URL */} {project.project_url && ( @@ -95,26 +95,24 @@ export function ProjectCard({ project, onSeenStatusChange }: ProjectCardProps) { )}
- {/* Seen Toggle */} - - + Seen + +
{/* Engagement Stats */} diff --git a/astro-app/src/components/ProjectsTable.tsx b/astro-app/src/components/ProjectsTable.tsx index 80aa32d..5b4374b 100644 --- a/astro-app/src/components/ProjectsTable.tsx +++ b/astro-app/src/components/ProjectsTable.tsx @@ -68,6 +68,36 @@ export function ProjectsTable({ projects, title, showUrlColumn = true, onSeenSta }; const columns = useMemo(() => [ + columnHelper.display({ + id: 'seen', + header: ({ table }) => ( +
+ +
+ ), + cell: ({ row }) => { + const projectId = row.original.id; + const isSeen = seenProjects.has(projectId); + + return ( +
+ toggleSeen(projectId)} + /> +
+ ); + }, + size: 60, + }), columnHelper.accessor('author_name', { header: ({ column }) => ( - - ); - }, - size: 120, - }), ], [showUrlColumn, seenProjects]); const table = useReactTable({ @@ -327,7 +325,7 @@ export function ProjectsTable({ projects, title, showUrlColumn = true, onSeenSta }, [projects]); // Calculate total width - const totalWidth = table.getHeaderGroups()[0]?.headers.reduce((acc, header) => acc + header.getSize(), 0) || 1000; + const totalWidth = table.getHeaderGroups()[0]?.headers.reduce((acc, header) => acc + header.getSize(), 0) || 800; return (
@@ -367,36 +365,37 @@ export function ProjectsTable({ projects, title, showUrlColumn = true, onSeenSta
{/* Table Container */} -
-
+
+
+
{/* Fixed Header */} -
+
{table.getHeaderGroups().map((headerGroup) => ( -
`${h.getSize()}px`).join(' ') }}> +
`${h.getSize()}px`).join(' ') }}> {headerGroup.headers.map((header) => ( -
+ > {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} -
+
))} -
+
))} -
+
- {/* Virtual Scrollable Body */} -
+ >
- {virtualizer.getVirtualItems().map((virtualRow) => { + {virtualizer.getVirtualItems().map((virtualRow) => { const row = rows[virtualRow.index]; return ( -
`${cell.column.getSize()}px`).join(' ') }} - > + > {row.getVisibleCells().map((cell) => ( -
+ > {flexRender(cell.column.columnDef.cell, cell.getContext())} -
+
))} -
+
); - })} + })} +
+ ); } \ No newline at end of file