diff --git a/frontend/src/api/api.ts b/frontend/src/api/api.ts
index 7b5cd468..f085e67a 100644
--- a/frontend/src/api/api.ts
+++ b/frontend/src/api/api.ts
@@ -43,6 +43,7 @@ export interface CodesResponse {
results: Array<{
submission_id: number;
code: string;
+ line_count?: number;
}>;
}
diff --git a/frontend/src/pages/leaderboard/Leaderboard.tsx b/frontend/src/pages/leaderboard/Leaderboard.tsx
index 205a97e2..1b9e1b6e 100644
--- a/frontend/src/pages/leaderboard/Leaderboard.tsx
+++ b/frontend/src/pages/leaderboard/Leaderboard.tsx
@@ -417,6 +417,7 @@ function LeaderboardWithSidebar() {
navigationItems,
navigationIndex,
codes,
+ lineCounts,
isOpen,
isLoadingCodes,
navigate,
@@ -455,6 +456,7 @@ function LeaderboardWithSidebar() {
navigationItems={navigationItems}
navigationIndex={navigationIndex}
codes={codes}
+ lineCounts={lineCounts}
isLoadingCodes={isLoadingCodes}
onClose={close}
onNavigate={navigate}
diff --git a/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.test.tsx b/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.test.tsx
new file mode 100644
index 00000000..43eb5752
--- /dev/null
+++ b/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.test.tsx
@@ -0,0 +1,48 @@
+import { screen } from "@testing-library/react";
+import { describe, expect, it, vi } from "vitest";
+import { renderWithProviders } from "../../../tests/test-utils";
+import SubmissionCodeSidebar from "./SubmissionCodeSidebar";
+
+describe("SubmissionCodeSidebar", () => {
+ it("shows LOC when line count metadata is available", () => {
+ renderWithProviders(
+ ,
+ );
+
+ expect(screen.getByText("LOC")).toBeInTheDocument();
+ expect(screen.getByText("2")).toBeInTheDocument();
+ });
+
+ it("does not show LOC without line count metadata", () => {
+ renderWithProviders(
+ ,
+ );
+
+ expect(screen.queryByText("LOC")).not.toBeInTheDocument();
+ });
+});
diff --git a/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.tsx b/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.tsx
index 77a44a12..29132b2f 100644
--- a/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.tsx
+++ b/frontend/src/pages/leaderboard/components/SubmissionCodeSidebar.tsx
@@ -22,6 +22,7 @@ interface SubmissionCodeSidebarProps {
navigationItems: NavigationItem[];
navigationIndex: number;
codes: Map;
+ lineCounts?: Map;
isLoadingCodes?: boolean;
onClose: () => void;
onNavigate: (newIndex: number, item: NavigationItem) => void;
@@ -34,6 +35,7 @@ export default function SubmissionCodeSidebar({
navigationItems,
navigationIndex,
codes,
+ lineCounts,
isLoadingCodes = false,
onClose,
onNavigate,
@@ -91,6 +93,9 @@ export default function SubmissionCodeSidebar({
}, [onWidthChange]);
const drawerWidth = isMobile ? "100vw" : width;
+ const lineCount = selectedSubmission
+ ? lineCounts?.get(selectedSubmission.submissionId)
+ : undefined;
return (
)}
+ {lineCount !== undefined && (
+
+
+ LOC
+
+
+ {lineCount.toLocaleString()}
+
+
+ )}
{selectedSubmission.fileName && (
;
+ lineCounts: Map;
isOpen: boolean;
isLoadingCodes: boolean;
navigate: (newIndex: number, item: NavigationItem) => void;
@@ -40,6 +41,7 @@ export function SubmissionSidebarProvider({
const [navigationItems, setNavigationItems] = useState([]);
const [navigationIndex, setNavigationIndex] = useState(0);
const [codes, setCodes] = useState