refactor(frontend): simplify ops health result catalog section
This commit is contained in:
@@ -7,7 +7,6 @@ import { syncWaterScenesFromDisk } from './api/water';
|
|||||||
import { listEngines, runWslCheck } from './api/dinsarProduction';
|
import { listEngines, runWslCheck } from './api/dinsarProduction';
|
||||||
import { getOrbitStatus, syncOrbitPools } from './api/orbit';
|
import { getOrbitStatus, syncOrbitPools } from './api/orbit';
|
||||||
import LogManagementPanel from './LogManagementPanel.clean';
|
import LogManagementPanel from './LogManagementPanel.clean';
|
||||||
import DinsarCatalogPanel from './components/DinsarCatalogPanel';
|
|
||||||
|
|
||||||
const toNumber = (value) => {
|
const toNumber = (value) => {
|
||||||
const parsed = Number(value);
|
const parsed = Number(value);
|
||||||
@@ -39,6 +38,29 @@ const formatIntegerText = (value) => {
|
|||||||
return Number.isFinite(parsed) ? parsed.toLocaleString() : '0';
|
return Number.isFinite(parsed) ? parsed.toLocaleString() : '0';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isCatalogHealthy = (catalog) => {
|
||||||
|
if (!catalog || typeof catalog !== 'object') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (catalog.enabled === false) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Boolean(catalog.ok) && !catalog.needs_rebuild;
|
||||||
|
};
|
||||||
|
|
||||||
|
const formatCatalogStatusLabel = (catalog, en = false) => {
|
||||||
|
if (!catalog || typeof catalog !== 'object') {
|
||||||
|
return en ? 'Unknown' : '未知';
|
||||||
|
}
|
||||||
|
if (catalog.enabled === false) {
|
||||||
|
return en ? 'Disabled' : '已禁用';
|
||||||
|
}
|
||||||
|
if (catalog.needs_rebuild) {
|
||||||
|
return en ? 'Rebuild required' : '需要重建';
|
||||||
|
}
|
||||||
|
return catalog.catalog_status || (en ? 'Unknown' : '未知');
|
||||||
|
};
|
||||||
|
|
||||||
const getOrbitSourcePath = (item) => item?.source || item?.source_path || '';
|
const getOrbitSourcePath = (item) => item?.source || item?.source_path || '';
|
||||||
|
|
||||||
const hasOrbitCorruptionSignal = (item) => Boolean(
|
const hasOrbitCorruptionSignal = (item) => Boolean(
|
||||||
@@ -312,6 +334,9 @@ const HealthCheckPanel = ({ language = 'zh', currentUser }) => {
|
|||||||
const formatPathText = (value) => value || (en ? 'Not configured' : '未配置');
|
const formatPathText = (value) => value || (en ? 'Not configured' : '未配置');
|
||||||
const databaseStatus = status?.database || {};
|
const databaseStatus = status?.database || {};
|
||||||
const dinsarBridge = asObject(status?.dinsar_bridge);
|
const dinsarBridge = asObject(status?.dinsar_bridge);
|
||||||
|
const dinsarResultCatalog = asObject(status?.dinsar_result_catalog || status?.result_catalog);
|
||||||
|
const dinsarCatalogNeedsRebuild =
|
||||||
|
typeof dinsarResultCatalog.needs_rebuild === 'boolean' ? dinsarResultCatalog.needs_rebuild : null;
|
||||||
const sourceRoots = asObject(status?.source_roots);
|
const sourceRoots = asObject(status?.source_roots);
|
||||||
const pairingSystem = asObject(status?.pairing_system);
|
const pairingSystem = asObject(status?.pairing_system);
|
||||||
const sourceRootItems = asArray(sourceRoots.items);
|
const sourceRootItems = asArray(sourceRoots.items);
|
||||||
@@ -556,7 +581,40 @@ const HealthCheckPanel = ({ language = 'zh', currentUser }) => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<DinsarCatalogPanel compact readOnly={!isAdmin} />
|
<div className="health-card">
|
||||||
|
<div className="health-card-title">{en ? 'D-InSAR Result Catalog' : 'D-InSAR 结果目录'}</div>
|
||||||
|
<div className="health-card-row">
|
||||||
|
<span>{en ? 'Catalog status' : '目录状态'}</span>
|
||||||
|
{renderBadge(
|
||||||
|
isCatalogHealthy(dinsarResultCatalog),
|
||||||
|
formatCatalogStatusLabel(dinsarResultCatalog, en)
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="health-card-row">
|
||||||
|
<span>{en ? 'Needs rebuild' : '需要重建'}</span>
|
||||||
|
{renderBadge(
|
||||||
|
dinsarCatalogNeedsRebuild === false,
|
||||||
|
dinsarCatalogNeedsRebuild === null
|
||||||
|
? (en ? 'Unknown' : '未知')
|
||||||
|
: (dinsarCatalogNeedsRebuild ? (en ? 'Yes' : '是') : (en ? 'No' : '否'))
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="health-card-row">
|
||||||
|
<span>{en ? 'Manifest / DB' : 'Manifest / 数据库'}</span>
|
||||||
|
<span>
|
||||||
|
{toNumber(dinsarResultCatalog.manifest_count)} / {toNumber(dinsarResultCatalog.db_count)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="health-card-row">
|
||||||
|
<span>{en ? 'Issue count' : '问题数量'}</span>
|
||||||
|
<span>{toNumber(dinsarResultCatalog.issue_count)}</span>
|
||||||
|
</div>
|
||||||
|
<div className="health-card-note">
|
||||||
|
{en
|
||||||
|
? 'Full directory details and maintenance actions remain in the D-InSAR Products workspace.'
|
||||||
|
: '完整目录详情和维护操作已保留在 “D-InSAR 产物工作台”,不再在自检页展开。'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="health-card">
|
<div className="health-card">
|
||||||
<div className="health-card-title">{en ? 'Pairing System' : '配对系统'}</div>
|
<div className="health-card-title">{en ? 'Pairing System' : '配对系统'}</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user