Automate issuer overlay creation from ticker searches
This commit is contained in:
@@ -43,7 +43,7 @@ import { Input } from "@/components/ui/input";
|
||||
import { Panel } from "@/components/ui/panel";
|
||||
import { useAuthGuard } from "@/hooks/use-auth-guard";
|
||||
import { useLinkPrefetch } from "@/hooks/use-link-prefetch";
|
||||
import { queueFilingSync } from "@/lib/api";
|
||||
import { ensureTickerAutomation, queueFilingSync } from "@/lib/api";
|
||||
import {
|
||||
formatCurrencyByScale,
|
||||
formatFinancialStatementValue,
|
||||
@@ -104,6 +104,8 @@ const SURFACE_OPTIONS = [
|
||||
{ value: "income_statement", label: "Income" },
|
||||
{ value: "balance_sheet", label: "Balance" },
|
||||
{ value: "cash_flow_statement", label: "Cash Flow" },
|
||||
{ value: "equity_statement", label: "Stockholders' Equity" },
|
||||
{ value: "disclosures", label: "Disclosures" },
|
||||
{ value: "ratios", label: "Ratios" },
|
||||
{ value: "segments_kpis", label: "KPIs" },
|
||||
];
|
||||
@@ -166,7 +168,9 @@ function isStatementSurfaceKind(surfaceKind: FinancialSurfaceKind) {
|
||||
return (
|
||||
surfaceKind === "income_statement" ||
|
||||
surfaceKind === "balance_sheet" ||
|
||||
surfaceKind === "cash_flow_statement"
|
||||
surfaceKind === "cash_flow_statement" ||
|
||||
surfaceKind === "equity_statement" ||
|
||||
surfaceKind === "disclosures"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -324,7 +328,11 @@ function buildStatementTreeDisplayValue(input: {
|
||||
scale: NumberScaleUnit;
|
||||
surfaceKind: Extract<
|
||||
FinancialSurfaceKind,
|
||||
"income_statement" | "balance_sheet" | "cash_flow_statement"
|
||||
| "income_statement"
|
||||
| "balance_sheet"
|
||||
| "cash_flow_statement"
|
||||
| "equity_statement"
|
||||
| "disclosures"
|
||||
>;
|
||||
}) {
|
||||
const current = statementRowValue(input.row, input.periodId);
|
||||
@@ -535,7 +543,9 @@ function FinancialsPageContent() {
|
||||
const statementSurface =
|
||||
surfaceKind === "income_statement" ||
|
||||
surfaceKind === "balance_sheet" ||
|
||||
surfaceKind === "cash_flow_statement";
|
||||
surfaceKind === "cash_flow_statement" ||
|
||||
surfaceKind === "equity_statement" ||
|
||||
surfaceKind === "disclosures";
|
||||
if (!statementSurface && displayMode !== "standardized") {
|
||||
setDisplayMode("standardized");
|
||||
}
|
||||
@@ -551,6 +561,12 @@ function FinancialsPageContent() {
|
||||
}
|
||||
}, [displayMode, surfaceKind]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!financials?.displayModes.includes(displayMode)) {
|
||||
setDisplayMode(financials?.defaultDisplayMode ?? "standardized");
|
||||
}
|
||||
}, [displayMode, financials?.defaultDisplayMode, financials?.displayModes]);
|
||||
|
||||
const loadFinancials = useCallback(
|
||||
async (symbol: string, options?: LoadOptions) => {
|
||||
const normalizedTicker = symbol.trim().toUpperCase();
|
||||
@@ -560,7 +576,9 @@ function FinancialsPageContent() {
|
||||
(surfaceKind === "segments_kpis" ||
|
||||
surfaceKind === "income_statement" ||
|
||||
surfaceKind === "balance_sheet" ||
|
||||
surfaceKind === "cash_flow_statement");
|
||||
surfaceKind === "cash_flow_statement" ||
|
||||
surfaceKind === "equity_statement" ||
|
||||
surfaceKind === "disclosures");
|
||||
|
||||
if (!options?.append) {
|
||||
setLoading(true);
|
||||
@@ -672,6 +690,8 @@ function FinancialsPageContent() {
|
||||
case "income_statement":
|
||||
case "balance_sheet":
|
||||
case "cash_flow_statement":
|
||||
case "equity_statement":
|
||||
case "disclosures":
|
||||
return displayMode === "faithful"
|
||||
? (financials.statementRows?.faithful ?? [])
|
||||
: (financials.statementRows?.standardized ?? []);
|
||||
@@ -808,6 +828,15 @@ function FinancialsPageContent() {
|
||||
);
|
||||
}
|
||||
|
||||
if (surfaceKind === "equity_statement") {
|
||||
return (
|
||||
standardizedRows.find((row) => row.key === "total_equity") ??
|
||||
standardizedRows.find((row) => row.key === "retained_earnings") ??
|
||||
standardizedRows.find((row) => row.key === "common_stock_and_apic") ??
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
}, [displayMode, financials?.statementRows, surfaceKind]);
|
||||
|
||||
@@ -829,6 +858,11 @@ function FinancialsPageContent() {
|
||||
}, [trendSeries, visiblePeriods]);
|
||||
|
||||
const controlSections = useMemo<FinancialControlSection[]>(() => {
|
||||
const availableDisplayModeOptions = DISPLAY_MODE_OPTIONS.filter((option) =>
|
||||
financials?.displayModes
|
||||
? financials.displayModes.includes(option.value as FinancialDisplayMode)
|
||||
: option.value === "standardized" || surfaceKind !== "equity_statement",
|
||||
);
|
||||
const sections: FinancialControlSection[] = [
|
||||
{
|
||||
key: "surface",
|
||||
@@ -869,12 +903,14 @@ function FinancialsPageContent() {
|
||||
if (
|
||||
surfaceKind === "income_statement" ||
|
||||
surfaceKind === "balance_sheet" ||
|
||||
surfaceKind === "cash_flow_statement"
|
||||
surfaceKind === "cash_flow_statement" ||
|
||||
surfaceKind === "equity_statement" ||
|
||||
surfaceKind === "disclosures"
|
||||
) {
|
||||
sections.push({
|
||||
key: "display",
|
||||
label: "Display",
|
||||
options: DISPLAY_MODE_OPTIONS,
|
||||
options: availableDisplayModeOptions,
|
||||
value: displayMode,
|
||||
onChange: (value) => {
|
||||
setDisplayMode(value as FinancialDisplayMode);
|
||||
@@ -894,7 +930,7 @@ function FinancialsPageContent() {
|
||||
});
|
||||
|
||||
return sections;
|
||||
}, [cadence, displayMode, historyWindow, surfaceKind, valueScale]);
|
||||
}, [cadence, displayMode, financials?.displayModes, historyWindow, surfaceKind, valueScale]);
|
||||
|
||||
const toggleExpandedRow = useCallback((key: string) => {
|
||||
setExpandedRowKeys((current) => {
|
||||
@@ -1006,6 +1042,10 @@ function FinancialsPageContent() {
|
||||
if (!normalized) {
|
||||
return;
|
||||
}
|
||||
void ensureTickerAutomation({
|
||||
ticker: normalized,
|
||||
source: "financials",
|
||||
});
|
||||
setSelectedFlatRowKey(null);
|
||||
setSelectedRowRef(null);
|
||||
setExpandedRowKeys(new Set());
|
||||
@@ -1464,7 +1504,9 @@ function FinancialsPageContent() {
|
||||
|
||||
{(surfaceKind === "income_statement" ||
|
||||
surfaceKind === "balance_sheet" ||
|
||||
surfaceKind === "cash_flow_statement") && (
|
||||
surfaceKind === "cash_flow_statement" ||
|
||||
surfaceKind === "equity_statement" ||
|
||||
surfaceKind === "disclosures") && (
|
||||
<SummarySubsection title="Validation">
|
||||
<div className="mb-3 flex items-center gap-2 text-sm text-[color:var(--terminal-muted)]">
|
||||
<AlertTriangle className="size-4" />
|
||||
|
||||
Reference in New Issue
Block a user