feat(platform): persist mileage filters in route

This commit is contained in:
lingniu
2026-07-04 06:58:53 +08:00
parent 266b20b97a
commit db0b979ffb
3 changed files with 169 additions and 8 deletions

View File

@@ -29,6 +29,9 @@ export default function App() {
const [historyFilters, setHistoryFilters] = useState<Record<string, string>>(
initialRoute.page === 'history' ? historyFiltersFromRoute(initialRoute) : {}
);
const [mileageFilters, setMileageFilters] = useState<Record<string, string>>(
initialRoute.page === 'mileage' ? mileageFiltersFromRoute(initialRoute) : {}
);
const [qualityFilters, setQualityFilters] = useState<Record<string, string>>(
initialRoute.page === 'quality' ? qualityFiltersFromRoute(initialRoute) : {}
);
@@ -110,6 +113,9 @@ export default function App() {
if (route.page === 'history') {
setHistoryFilters(historyFiltersFromRoute(route));
}
if (route.page === 'mileage') {
setMileageFilters(mileageFiltersFromRoute(route));
}
if (route.page === 'quality') {
setQualityFilters(qualityFiltersFromRoute(route));
}
@@ -138,7 +144,7 @@ export default function App() {
replaceHistoryHash(historyFilters);
return;
}
replaceHash(page, analysisVin, activeProtocol);
replaceMileageHash(mileageFilters);
return;
}
if (page === 'quality') {
@@ -202,6 +208,21 @@ export default function App() {
replaceHash('history', keyword ?? analysisVin, protocol ?? activeProtocol, routeFilters);
};
const updateMileageFilters = (filters: Record<string, unknown> = {}) => {
const nextFilters = normalizeMileageFilterValues(filters);
setMileageFilters(nextFilters);
if (nextFilters.keyword) {
setAnalysisVin(nextFilters.keyword);
}
setActiveProtocol(nextFilters.protocol ?? '');
replaceMileageHash(nextFilters);
};
const replaceMileageHash = (filters: Record<string, string> = {}) => {
const { keyword, protocol, ...restFilters } = filters;
replaceHash('mileage', keyword ?? analysisVin, protocol ?? activeProtocol, restFilters);
};
const replaceQualityHash = (filters: Record<string, string> = {}) => {
const keyword = filters.keyword;
const protocol = filters.protocol;
@@ -275,6 +296,7 @@ export default function App() {
}
setAnalysisVin(nextVin);
setActiveProtocol(nextProtocol);
setMileageFilters({ keyword: nextVin, protocol: nextProtocol });
setActivePage('mileage');
replaceHash('mileage', nextVin, nextProtocol);
};
@@ -296,7 +318,7 @@ export default function App() {
realtime: <Realtime onOpenVehicle={openVehicle} onFiltersChange={updateRealtimeFilters} initialFilters={realtimeFilters} />,
detail: <VehicleDetail vin={activeVin} protocol={activeProtocol} onOpenHistory={openHistoryForVehicle} onOpenRaw={openRawForVehicle} onOpenMileage={openMileageForVehicle} onOpenVehicles={openVehicles} onQueryChange={updateVehicleDetailQuery} />,
history: <History initialVin={analysisVin} initialProtocol={activeProtocol} initialTab={historyTab} initialFilters={historyFilters} onFiltersChange={updateHistoryFilters} onOpenVehicle={openVehicle} />,
mileage: <Mileage initialVin={analysisVin} initialProtocol={activeProtocol} onOpenVehicle={openVehicle} />,
mileage: <Mileage initialVin={analysisVin} initialProtocol={activeProtocol} initialFilters={mileageFilters} onFiltersChange={updateMileageFilters} onOpenVehicle={openVehicle} />,
quality: <Quality onOpenVehicle={openVehicle} onHealthLoaded={(health) => setLinkIssueCount(health.linkHealth.filter((item) => item.status !== 'ok').length)} onFiltersChange={updateQualityFilters} initialFilters={qualityFilters} />
};
@@ -343,6 +365,26 @@ function historyFiltersFromRoute(route: ReturnType<typeof parseAppHash>): Record
});
}
function mileageFiltersFromRoute(route: ReturnType<typeof parseAppHash>): Record<string, string> {
return normalizeMileageFilterValues({
...(route.keyword ? { keyword: route.keyword } : {}),
...(route.protocol ? { protocol: route.protocol } : {}),
...(route.filters?.dateFrom ? { dateFrom: route.filters.dateFrom } : {}),
...(route.filters?.dateTo ? { dateTo: route.filters.dateTo } : {})
});
}
function normalizeMileageFilterValues(filters: Record<string, unknown> = {}): Record<string, string> {
const normalized: Record<string, string> = {};
for (const key of ['keyword', 'protocol', 'dateFrom', 'dateTo'] as const) {
const value = String(filters[key] ?? '').trim();
if (value) {
normalized[key] = value;
}
}
return normalized;
}
function normalizeHistoryFilterValues(filters: Record<string, unknown> = {}): Record<string, string> {
const normalized: Record<string, string> = {};
for (const key of ['keyword', 'protocol', 'dateFrom', 'dateTo', 'fields'] as const) {