+
{jobLink ? (
) : null}
@@ -141,3 +99,4 @@ export const DecideMode: React.FC
= ({
);
};
+
diff --git a/orchestrator/src/client/components/index.ts b/orchestrator/src/client/components/index.ts
index 989ae45..5af0fa5 100644
--- a/orchestrator/src/client/components/index.ts
+++ b/orchestrator/src/client/components/index.ts
@@ -2,6 +2,7 @@ export { Header } from './Header';
export { Stats } from './Stats';
export { StatusBadge } from './StatusBadge';
export { ScoreIndicator } from './ScoreIndicator';
+export { JobHeader } from './JobHeader';
export { FitAssessment } from './FitAssessment';
export { PipelineProgress } from './PipelineProgress';
export { TailoringEditor } from './TailoringEditor';
diff --git a/orchestrator/src/client/pages/orchestrator/JobDetailPanel.tsx b/orchestrator/src/client/pages/orchestrator/JobDetailPanel.tsx
index 63c5ee6..e65beeb 100644
--- a/orchestrator/src/client/pages/orchestrator/JobDetailPanel.tsx
+++ b/orchestrator/src/client/pages/orchestrator/JobDetailPanel.tsx
@@ -1,14 +1,11 @@
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
import {
- Calendar,
CheckCircle2,
Copy,
- DollarSign,
Edit2,
ExternalLink,
FileText,
Loader2,
- MapPin,
MoreHorizontal,
RefreshCcw,
Save,
@@ -29,9 +26,9 @@ import {
} from "@/components/ui/dropdown-menu";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Textarea } from "@/components/ui/textarea";
-import { cn, copyTextToClipboard, formatDate, formatJobForWebhook, sourceLabel, safeFilenamePart, stripHtml } from "@/lib/utils";
+import { cn, copyTextToClipboard, formatJobForWebhook, safeFilenamePart, stripHtml } from "@/lib/utils";
-import { DiscoveredPanel } from "../../components";
+import { DiscoveredPanel, JobHeader } from "../../components";
import { ReadyPanel } from "../../components/ReadyPanel";
import { TailoringEditor } from "../../components/TailoringEditor";
import * as api from "../../api";
@@ -48,40 +45,6 @@ interface JobDetailPanelProps {
onSetActiveTab: (tab: FilterTab) => void;
}
-// Subdued status pill for inspector panel - not competing with list
-const StatusPill: React.FC<{ status: JobStatus }> = ({ status }) => {
- const tokens = statusTokens[status] ?? defaultStatusToken;
- return (
-
-
- {tokens.label}
-
- );
-};
-
-// Compact score meter for inspector panel
-const ScoreMeter: React.FC<{ score: number | null }> = ({ score }) => {
- if (score == null) {
- return
-;
- }
-
- return (
-
- );
-};
-
export const JobDetailPanel: React.FC
= ({
activeTab,
activeJobs,
@@ -258,7 +221,6 @@ export const JobDetailPanel: React.FC = ({
const selectedPdfHref = selectedJob
? `/pdfs/resume_${selectedJob.id}.pdf?v=${encodeURIComponent(selectedJob.updatedAt)}`
: "#";
- const selectedDeadline = selectedJob ? formatDate(selectedJob.deadline) : null;
const canApply = selectedJob?.status === "ready";
const canProcess = selectedJob ? ["discovered", "ready"].includes(selectedJob.status) : false;
const canSkip = selectedJob ? ["discovered", "ready"].includes(selectedJob.status) : false;
@@ -309,44 +271,7 @@ export const JobDetailPanel: React.FC = ({
return (
- {/* Detail header: lighter weight than list items */}
-
-
-
{selectedJob.title}
-
{selectedJob.employer}
-
-
- {sourceLabel[selectedJob.source]}
-
-
-
- {/* Tertiary metadata - subdued */}
-
- {selectedJob.location && (
-
-
- {selectedJob.location}
-
- )}
- {selectedDeadline && (
-
-
- {selectedDeadline}
-
- )}
- {selectedJob.salary && (
-
-
- {selectedJob.salary}
-
- )}
-
-
- {/* Status and score: single line, subdued */}
-
-
-
-
+