Refine history modal loading state and MGM chart gating
This commit is contained in:
@@ -2237,6 +2237,46 @@
|
|||||||
height: 100% !important;
|
height: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-modal-loading) {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 420px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-card) {
|
||||||
|
min-width: min(100%, 420px);
|
||||||
|
padding: 22px 26px;
|
||||||
|
gap: 16px;
|
||||||
|
border-radius: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-card .loading-clouds),
|
||||||
|
.root :global(.history-modal .history-loading-card .loading-windfield) {
|
||||||
|
width: 180px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-radar) {
|
||||||
|
width: 86px;
|
||||||
|
height: 86px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-thermals) {
|
||||||
|
height: 22px;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-copy strong) {
|
||||||
|
font-size: 12px;
|
||||||
|
letter-spacing: 0.18em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-copy span) {
|
||||||
|
max-width: 300px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
.root :global(.history-modal .history-peak-reference) {
|
.root :global(.history-modal .history-peak-reference) {
|
||||||
margin-top: 18px;
|
margin-top: 18px;
|
||||||
padding: 14px 16px;
|
padding: 14px 16px;
|
||||||
@@ -2315,6 +2355,10 @@
|
|||||||
height: 360px;
|
height: 360px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-modal-loading) {
|
||||||
|
min-height: 340px;
|
||||||
|
}
|
||||||
|
|
||||||
.root :global(.history-modal .history-peak-reference-scroll) {
|
.root :global(.history-modal .history-peak-reference-scroll) {
|
||||||
max-height: 320px;
|
max-height: 320px;
|
||||||
}
|
}
|
||||||
@@ -2360,6 +2404,26 @@
|
|||||||
padding: 8px 10px 6px;
|
padding: 8px 10px 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-modal-loading) {
|
||||||
|
min-height: 280px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-card) {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 18px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-card .loading-clouds),
|
||||||
|
.root :global(.history-modal .history-loading-card .loading-windfield) {
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root :global(.history-modal .history-loading-radar) {
|
||||||
|
width: 72px;
|
||||||
|
height: 72px;
|
||||||
|
}
|
||||||
|
|
||||||
.root :global(.history-modal .history-peak-reference) {
|
.root :global(.history-modal .history-peak-reference) {
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ function HistoryChart() {
|
|||||||
);
|
);
|
||||||
const hasMgm =
|
const hasMgm =
|
||||||
store.selectedCity === "ankara" &&
|
store.selectedCity === "ankara" &&
|
||||||
|
summary.mgmSeriesComplete &&
|
||||||
summary.mgms.some((value) => value != null);
|
summary.mgms.some((value) => value != null);
|
||||||
const hasBestBaseline =
|
const hasBestBaseline =
|
||||||
Boolean(summary.bestModelName) &&
|
Boolean(summary.bestModelName) &&
|
||||||
@@ -260,20 +261,58 @@ export function HistoryModal() {
|
|||||||
: `${store.selectedDetail?.display_name || store.selectedCity || "该城市"}历史对账已按 NOAA ${noaaStationCode}(${noaaStationName})结算口径对齐:采用该日最终完成质控后的最高整度摄氏值。`}
|
: `${store.selectedDetail?.display_name || store.selectedCity || "该城市"}历史对账已按 NOAA ${noaaStationCode}(${noaaStationName})结算口径对齐:采用该日最终完成质控后的最高整度摄氏值。`}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="history-stats">
|
{isLoading ? (
|
||||||
{isLoading ? (
|
<div className="history-modal-loading">
|
||||||
<span style={{ color: "var(--text-muted)" }}>
|
<div className="loading-card history-loading-card">
|
||||||
{t("history.loading")}
|
<div className="loading-clouds" aria-hidden="true">
|
||||||
</span>
|
<span className="loading-cloud loading-cloud-1" />
|
||||||
) : error ? (
|
<span className="loading-cloud loading-cloud-2" />
|
||||||
|
</div>
|
||||||
|
<div className="loading-windfield" aria-hidden="true">
|
||||||
|
<span className="loading-windline loading-windline-1" />
|
||||||
|
<span className="loading-windline loading-windline-2" />
|
||||||
|
<span className="loading-windline loading-windline-3" />
|
||||||
|
</div>
|
||||||
|
<div className="loading-radar history-loading-radar" aria-hidden="true">
|
||||||
|
<div className="loading-radar-core" />
|
||||||
|
<div className="loading-radar-ring loading-radar-ring-1" />
|
||||||
|
<div className="loading-radar-ring loading-radar-ring-2" />
|
||||||
|
<div className="loading-radar-sweep" />
|
||||||
|
<div className="loading-radar-blip loading-radar-blip-1" />
|
||||||
|
<div className="loading-radar-blip loading-radar-blip-2" />
|
||||||
|
</div>
|
||||||
|
<div className="loading-thermals history-loading-thermals" aria-hidden="true">
|
||||||
|
<span className="loading-thermal loading-thermal-1" />
|
||||||
|
<span className="loading-thermal loading-thermal-2" />
|
||||||
|
<span className="loading-thermal loading-thermal-3" />
|
||||||
|
<span className="loading-thermal loading-thermal-4" />
|
||||||
|
</div>
|
||||||
|
<div className="loading-copy history-loading-copy">
|
||||||
|
<strong>
|
||||||
|
{locale === "en-US"
|
||||||
|
? "Scanning archived settlement history"
|
||||||
|
: "正在扫描历史结算档案"}
|
||||||
|
</strong>
|
||||||
|
<span>
|
||||||
|
{locale === "en-US"
|
||||||
|
? "Reconciling settled highs, DEB traces, and baseline forecasts..."
|
||||||
|
: "正在对齐实测高温、DEB 轨迹与基线预报..."}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<div className="history-stats">
|
||||||
|
{error ? (
|
||||||
<span style={{ color: "var(--accent-red)" }}>
|
<span style={{ color: "var(--accent-red)" }}>
|
||||||
{t("history.error")}
|
{t("history.error")}
|
||||||
</span>
|
</span>
|
||||||
) : !summary.recentData.length ? (
|
) : !summary.recentData.length ? (
|
||||||
<span style={{ color: "var(--text-muted)" }}>
|
<span style={{ color: "var(--text-muted)" }}>
|
||||||
{t("history.empty")}
|
{t("history.empty")}
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div className="h-stat-card">
|
<div className="h-stat-card">
|
||||||
<span className="label">{t("history.debHitRate")}</span>
|
<span className="label">{t("history.debHitRate")}</span>
|
||||||
@@ -314,10 +353,10 @@ export function HistoryModal() {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{!isLoading && !error && <HistoryChart />}
|
{!error && <HistoryChart />}
|
||||||
{!isLoading && !error && settledPeakRows.length > 0 && (
|
{!error && settledPeakRows.length > 0 && (
|
||||||
<div className="history-peak-reference">
|
<div className="history-peak-reference">
|
||||||
<div className="history-peak-reference-title">
|
<div className="history-peak-reference-title">
|
||||||
{locale === "en-US"
|
{locale === "en-US"
|
||||||
@@ -374,6 +413,8 @@ export function HistoryModal() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2247,6 +2247,12 @@ export function getHistorySummary(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const mgmSettledCount = settledData.reduce((count, row) => {
|
||||||
|
return toFinite(row.mgm) != null ? count + 1 : count;
|
||||||
|
}, 0);
|
||||||
|
const mgmSeriesComplete =
|
||||||
|
settledData.length >= 2 && mgmSettledCount === settledData.length;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dates: recentData.map((row) => row.date),
|
dates: recentData.map((row) => row.date),
|
||||||
debMae: debErrors.length
|
debMae: debErrors.length
|
||||||
@@ -2274,6 +2280,7 @@ export function getHistorySummary(
|
|||||||
hitRate: debErrors.length
|
hitRate: debErrors.length
|
||||||
? Number(((hits / debErrors.length) * 100).toFixed(0))
|
? Number(((hits / debErrors.length) * 100).toFixed(0))
|
||||||
: null,
|
: null,
|
||||||
|
mgmSeriesComplete,
|
||||||
mgms: recentData.map((row) => row.mgm ?? null),
|
mgms: recentData.map((row) => row.mgm ?? null),
|
||||||
recentData,
|
recentData,
|
||||||
settledCount: comparableSettledData.length,
|
settledCount: comparableSettledData.length,
|
||||||
|
|||||||
Reference in New Issue
Block a user