diff --git a/app/filings/page.tsx b/app/filings/page.tsx index b7f73e6..ea20b27 100644 --- a/app/filings/page.tsx +++ b/app/filings/page.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { Suspense } from 'react'; import { format } from 'date-fns'; -import { Bot, Download, Search, TimerReset } from 'lucide-react'; +import { Bot, Download, ExternalLink, Search, TimerReset } from 'lucide-react'; import { useSearchParams } from 'next/navigation'; import { AppShell } from '@/components/shell/app-shell'; import { Panel } from '@/components/ui/panel'; @@ -24,6 +24,59 @@ export default function FilingsPage() { ); } +function formatFilingDate(value: string) { + const date = new Date(value); + + if (Number.isNaN(date.getTime())) { + return 'Unknown'; + } + + return format(date, 'MMM dd, yyyy'); +} + +function resolveOriginalFilingUrl(filing: Filing) { + if (filing.filing_url) { + return filing.filing_url; + } + + if (!filing.primary_document) { + return null; + } + + const cikDigits = filing.cik.replace(/\D/g, ''); + const cikValue = Number.parseInt(cikDigits, 10); + + if (!cikDigits || Number.isNaN(cikValue)) { + return null; + } + + const compactAccession = filing.accession_number.replace(/-/g, ''); + if (!compactAccession) { + return null; + } + + return `https://www.sec.gov/Archives/edgar/data/${cikValue}/${compactAccession}/${filing.primary_document}`; +} + +type FilingExternalLinkProps = { + href: string; + label: string; +}; + +function FilingExternalLink({ href, label }: FilingExternalLinkProps) { + return ( + + {label} + + + ); +} + function FilingsPageContent() { const { isPending, isAuthenticated } = useAuthGuard(); const searchParams = useSearchParams(); @@ -119,7 +172,7 @@ function FilingsPageContent() { title="Filings Stream" subtitle="Sync SEC submissions and generate AI red-flag analysis asynchronously." actions={( - @@ -127,8 +180,8 @@ function FilingsPageContent() { > {liveTask ? ( -
-

{liveTask.id}

+
+

{liveTask.id}

{liveTask.error ?

{liveTask.error}

: null} @@ -138,7 +191,7 @@ function FilingsPageContent() {
{ event.preventDefault(); void triggerSync(); @@ -148,9 +201,9 @@ function FilingsPageContent() { value={syncTickerInput} onChange={(event) => setSyncTickerInput(event.target.value.toUpperCase())} placeholder="Ticker (AAPL)" - className="max-w-xs" + className="w-full sm:max-w-xs" /> - @@ -159,7 +212,7 @@ function FilingsPageContent() { { event.preventDefault(); setSearchTicker(filterTickerInput.trim().toUpperCase()); @@ -169,15 +222,16 @@ function FilingsPageContent() { value={filterTickerInput} onChange={(event) => setFilterTickerInput(event.target.value.toUpperCase())} placeholder="Ticker filter" - className="max-w-xs" + className="w-full sm:max-w-xs" /> -
)}