show disvoery date
This commit is contained in:
parent
2b2af06bb8
commit
585e5e19e0
@ -6,6 +6,7 @@ import React from "react";
|
||||
import {
|
||||
Calendar,
|
||||
CheckCircle2,
|
||||
Clock,
|
||||
Copy,
|
||||
DollarSign,
|
||||
Download,
|
||||
@ -49,6 +50,27 @@ const formatDate = (dateStr: string | null) => {
|
||||
}
|
||||
};
|
||||
|
||||
const formatDateTime = (dateStr: string | null) => {
|
||||
if (!dateStr) return null;
|
||||
try {
|
||||
const normalized = dateStr.includes("T") ? dateStr : dateStr.replace(" ", "T");
|
||||
const parsed = new Date(normalized);
|
||||
if (Number.isNaN(parsed.getTime())) return dateStr;
|
||||
const date = parsed.toLocaleDateString("en-GB", {
|
||||
day: "numeric",
|
||||
month: "short",
|
||||
year: "numeric",
|
||||
});
|
||||
const time = parsed.toLocaleTimeString("en-GB", {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
});
|
||||
return `${date} ${time}`;
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
};
|
||||
|
||||
const safeFilenamePart = (value: string) => value.replace(/[^a-z0-9]/gi, "_");
|
||||
|
||||
export const JobCard: React.FC<JobCardProps> = ({
|
||||
@ -75,6 +97,7 @@ export const JobCard: React.FC<JobCardProps> = ({
|
||||
const jobLink = job.applicationLink || job.jobUrl;
|
||||
const pdfHref = `/pdfs/resume_${job.id}.pdf`;
|
||||
const deadline = formatDate(job.deadline);
|
||||
const discoveredAt = formatDateTime(job.discoveredAt);
|
||||
const isHighlighted = highlightedJobId === job.id;
|
||||
|
||||
const handleCopyInfo = async () => {
|
||||
@ -117,6 +140,12 @@ export const JobCard: React.FC<JobCardProps> = ({
|
||||
{deadline}
|
||||
</span>
|
||||
)}
|
||||
{discoveredAt && (
|
||||
<span className="flex items-center gap-1">
|
||||
<Clock className="h-4 w-4" />
|
||||
Discovered {discoveredAt}
|
||||
</span>
|
||||
)}
|
||||
{job.salary && (
|
||||
<span className="flex items-center gap-1">
|
||||
<DollarSign className="h-4 w-4" />
|
||||
|
||||
@ -80,14 +80,22 @@ const defaultSortDirection: Record<JobSortKey, JobSortDirection> = {
|
||||
discoveredAt: "desc",
|
||||
};
|
||||
|
||||
const formatDate = (dateStr: string | null) => {
|
||||
const formatDateTime = (dateStr: string | null) => {
|
||||
if (!dateStr) return null;
|
||||
try {
|
||||
return new Date(dateStr).toLocaleDateString("en-GB", {
|
||||
const normalized = dateStr.includes("T") ? dateStr : dateStr.replace(" ", "T");
|
||||
const parsed = new Date(normalized);
|
||||
if (Number.isNaN(parsed.getTime())) return dateStr;
|
||||
const date = parsed.toLocaleDateString("en-GB", {
|
||||
day: "numeric",
|
||||
month: "short",
|
||||
year: "numeric",
|
||||
});
|
||||
const time = parsed.toLocaleTimeString("en-GB", {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
});
|
||||
return `${date} ${time}`;
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
@ -272,7 +280,7 @@ export const JobTable: React.FC<JobTableProps> = ({
|
||||
</TableCell>
|
||||
|
||||
<TableCell className="tabular-nums text-muted-foreground">
|
||||
{formatDate(job.discoveredAt)}
|
||||
{formatDateTime(job.discoveredAt)}
|
||||
</TableCell>
|
||||
|
||||
<TableCell className="pr-3 text-right">
|
||||
|
||||
@ -8,6 +8,7 @@ import {
|
||||
Calendar,
|
||||
CheckCircle2,
|
||||
ChevronDown,
|
||||
Clock,
|
||||
Copy,
|
||||
DollarSign,
|
||||
ExternalLink,
|
||||
@ -154,6 +155,27 @@ const formatDate = (dateStr: string | null) => {
|
||||
}
|
||||
};
|
||||
|
||||
const formatDateTime = (dateStr: string | null) => {
|
||||
if (!dateStr) return null;
|
||||
try {
|
||||
const normalized = dateStr.includes("T") ? dateStr : dateStr.replace(" ", "T");
|
||||
const parsed = new Date(normalized);
|
||||
if (Number.isNaN(parsed.getTime())) return dateStr;
|
||||
const date = parsed.toLocaleDateString("en-GB", {
|
||||
day: "numeric",
|
||||
month: "short",
|
||||
year: "numeric",
|
||||
});
|
||||
const time = parsed.toLocaleTimeString("en-GB", {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
});
|
||||
return `${date} ${time}`;
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
};
|
||||
|
||||
const dateValue = (value: string | null) => {
|
||||
if (!value) return null;
|
||||
const parsed = Date.parse(value);
|
||||
@ -494,6 +516,7 @@ export const OrchestratorPage: React.FC = () => {
|
||||
const selectedJobLink = selectedJob ? selectedJob.applicationLink || selectedJob.jobUrl : "#";
|
||||
const selectedPdfHref = selectedJob ? `/pdfs/resume_${selectedJob.id}.pdf` : "#";
|
||||
const selectedDeadline = selectedJob ? formatDate(selectedJob.deadline) : null;
|
||||
const selectedDiscoveredAt = selectedJob ? formatDateTime(selectedJob.discoveredAt) : null;
|
||||
const canApply = selectedJob?.status === "ready";
|
||||
const canProcess = selectedJob ? ["discovered", "ready"].includes(selectedJob.status) : false;
|
||||
const canReject = selectedJob ? ["discovered", "ready"].includes(selectedJob.status) : false;
|
||||
@ -771,6 +794,12 @@ export const OrchestratorPage: React.FC = () => {
|
||||
{formatDate(job.deadline)}
|
||||
</span>
|
||||
)}
|
||||
{job.discoveredAt && (
|
||||
<span className="flex items-center gap-1">
|
||||
<Clock className="h-3.5 w-3.5" />
|
||||
Discovered {formatDateTime(job.discoveredAt)}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col items-end gap-2">
|
||||
@ -820,6 +849,12 @@ export const OrchestratorPage: React.FC = () => {
|
||||
{selectedDeadline}
|
||||
</span>
|
||||
)}
|
||||
{selectedDiscoveredAt && (
|
||||
<span className="flex items-center gap-1">
|
||||
<Clock className="h-3.5 w-3.5" />
|
||||
Discovered {selectedDiscoveredAt}
|
||||
</span>
|
||||
)}
|
||||
{selectedJob.salary && (
|
||||
<span className="flex items-center gap-1">
|
||||
<DollarSign className="h-3.5 w-3.5" />
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user