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

@@ -32,12 +32,32 @@ function canOpenVehicle(vin?: string) {
return Boolean(value && value !== 'unknown');
}
export function Mileage({ initialVin, initialProtocol, onOpenVehicle }: { initialVin: string; initialProtocol?: string; onOpenVehicle: (vin: string, protocol?: string) => void }) {
function mergeInitialFilters(initialVin: string, initialProtocol?: string, initialFilters: Record<string, string> = {}) {
return {
keyword: initialVin,
protocol: initialProtocol ?? '',
...initialFilters
};
}
export function Mileage({
initialVin,
initialProtocol,
initialFilters = {},
onFiltersChange,
onOpenVehicle
}: {
initialVin: string;
initialProtocol?: string;
initialFilters?: Record<string, string>;
onFiltersChange?: (filters: Record<string, string>) => void;
onOpenVehicle: (vin: string, protocol?: string) => void;
}) {
const [rows, setRows] = useState<DailyMileageRow[]>([]);
const [summary, setSummary] = useState<MileageSummary>(emptySummary);
const [loading, setLoading] = useState(true);
const [summaryLoading, setSummaryLoading] = useState(true);
const [filters, setFilters] = useState<Record<string, string>>({ keyword: initialVin, protocol: initialProtocol ?? '' });
const [filters, setFilters] = useState<Record<string, string>>(mergeInitialFilters(initialVin, initialProtocol, initialFilters));
const [pagination, setPagination] = useState({ currentPage: 1, pageSize: 20, total: 0 });
const currentVehicleKeyword = filters.keyword?.trim() ?? '';
const currentProtocol = filters.protocol?.trim() ?? '';
@@ -62,11 +82,11 @@ export function Mileage({ initialVin, initialProtocol, onOpenVehicle }: { initia
};
useEffect(() => {
const nextFilters = { keyword: initialVin, protocol: initialProtocol ?? '' };
const nextFilters = mergeInitialFilters(initialVin, initialProtocol, initialFilters);
setFilters(nextFilters);
loadSummary(nextFilters);
load(nextFilters, 1, pagination.pageSize);
}, [initialVin, initialProtocol]);
}, [initialVin, initialProtocol, JSON.stringify(initialFilters)]);
return (
<div className="vp-page">
@@ -85,9 +105,10 @@ export function Mileage({ initialVin, initialProtocol, onOpenVehicle }: { initia
<Typography.Text type="tertiary"></Typography.Text>
</div>
<Card bordered>
<Form key={filters.keyword ?? ''} initValues={filters} layout="horizontal" onSubmit={(values) => {
<Form key={JSON.stringify(filters)} initValues={filters} layout="horizontal" onSubmit={(values) => {
const nextFilters = values as Record<string, string>;
setFilters(nextFilters);
onFiltersChange?.(nextFilters);
loadSummary(nextFilters);
load(nextFilters, 1, pagination.pageSize);
}}>
@@ -102,8 +123,9 @@ export function Mileage({ initialVin, initialProtocol, onOpenVehicle }: { initia
<Space>
<Button htmlType="submit" theme="solid" type="primary"></Button>
<Button onClick={() => {
const nextFilters = { keyword: initialVin, protocol: initialProtocol ?? '' };
const nextFilters = mergeInitialFilters(initialVin, initialProtocol, {});
setFilters(nextFilters);
onFiltersChange?.(nextFilters);
loadSummary(nextFilters);
load(nextFilters, 1, pagination.pageSize);
}}></Button>