Files
PolyWeather/frontend/components/dashboard/OpportunityTable.utils.ts
T
2569718930@qq.com 2b1d7c0b65 Improve dashboard maintainability before the next release
The dashboard had several oversized orchestration, component, and CSS files that made product-copy changes and mobile/performance work risky. This refactor preserves behavior while splitting scan terminal CSS, opportunity helpers, future forecast panels, history/detail charts, and probability/model sections into smaller ownership boundaries.

Constraint: No user-visible version bump because this batch is architecture and performance cleanup, not a release announcement.

Rejected: Rewrite dashboard state management in the same batch | too broad for a safe upload after CSS and component splitting.

Confidence: high

Scope-risk: moderate

Reversibility: clean

Directive: Keep new component/CSS boundaries instead of moving product copy back into the large dashboard files.

Tested: npm run build; npm run test:business; git diff --check

Not-tested: Browser visual smoke test after push
2026-04-28 20:19:17 +08:00

88 lines
2.1 KiB
TypeScript

export { getWindowPhaseMeta, type PhaseMeta } from "./opportunity-window-phase";
export { getLocalizedRowText } from "./opportunity-copy";
export {
getAiMeta,
getExclusionReasons,
getOpportunityStrength,
getRecommendationReasons,
getRiskHints,
getShortAiConclusion,
} from "./opportunity-ai-meta";
export {
getDebDistanceSummary,
getMetarConflictSummary,
getModelSupportSummary,
} from "./opportunity-evidence-summary";
export type { V4CityForecast, V4TradeDecision } from "./opportunity-v4-types";
export {
getForecastContractFit,
getForecastRangeLabel,
getPaceDecisionTail,
getPaceDeviationRead,
getPaceSignalLabel,
getV4CityForecast,
median,
} from "./opportunity-v4-forecast";
export {
getForecastFitMeta,
getThresholdDecision,
getV4DecisionLabel,
getV4TradeDecision,
} from "./opportunity-v4-decision";
export {
getDecisionReasonItems,
getForecastRiskItems,
} from "./opportunity-v4-risk";
export {
getDetailForRow,
getDetailViewDate,
normalizeLookupKey,
} from "./opportunity-detail";
export {
bucketMatchesRow,
buildOpportunityGroups,
getBucketDisplayLabel,
getBucketText,
getDetailBucketEventProbability,
type OpportunityGroup,
} from "./opportunity-groups";
export {
formatModelClusterRange,
formatModelSources,
getModelSourceSummary,
} from "./opportunity-model-summary";
export {
formatAction,
formatMinuteSpan,
formatPercent,
formatQuoteCents,
formatTemperatureDelta,
formatThreshold,
formatTradeSide,
formatWindowMinutes,
normalizeProbability,
} from "./opportunity-format";
export {
extractNumbers,
getTargetRange,
normalizeBucketLabel,
} from "./opportunity-target";
export {
formatPeakWindowTiming,
getMetarGate,
getMetarObservationContext,
getObservationSortMinutes,
firstNonEmptyPoints,
normalizeObservationPoints,
type ObservationPoint,
} from "./opportunity-observation";
export {
decodeMetarWeatherToken,
decodeRawMetarCloud,
decodeRawMetarVisibility,
decodeRawMetarWeather,
formatAirportReportRead,
formatAirportWeatherRead,
getAirportWeatherInputs,
} from "./opportunity-airport-read";