97 lines
2.9 KiB
TypeScript
97 lines
2.9 KiB
TypeScript
import type { fetchMonitoring } from '../api';
|
|
import type { MileageSourceGroup } from '../types';
|
|
|
|
export type MonitoringRequestParams = NonNullable<Parameters<typeof fetchMonitoring>[0]>;
|
|
|
|
export interface MonitoringQueryModel {
|
|
sortBy: 'today' | 'total' | 'statisticTime';
|
|
sortOrder: 'asc' | 'desc';
|
|
searchTerm: string;
|
|
department: string;
|
|
customer: string;
|
|
project: string;
|
|
entity: string;
|
|
rentStatus: string;
|
|
platePrefix: string;
|
|
targetNames: string[];
|
|
region: string;
|
|
plates: string[];
|
|
mileageRange: { min: string; max: string };
|
|
rangeStart: string;
|
|
rangeEnd: string;
|
|
brands: string[];
|
|
sourcePriority: MileageSourceGroup[];
|
|
}
|
|
|
|
function optionalValue(value: string): string | undefined {
|
|
return value || undefined;
|
|
}
|
|
|
|
function selectedValue(value: string): string | undefined {
|
|
return value !== 'All' ? value : undefined;
|
|
}
|
|
|
|
function buildSharedQuery(
|
|
model: MonitoringQueryModel,
|
|
limit: number,
|
|
page: number,
|
|
): MonitoringRequestParams {
|
|
return {
|
|
sortBy: model.sortBy,
|
|
sortOrder: model.sortOrder,
|
|
limit,
|
|
page,
|
|
search: optionalValue(model.searchTerm),
|
|
dept: selectedValue(model.department),
|
|
customer: selectedValue(model.customer),
|
|
rentStatus: selectedValue(model.rentStatus),
|
|
platePrefix: selectedValue(model.platePrefix),
|
|
targetNames: model.targetNames.length > 0 ? model.targetNames : undefined,
|
|
region: selectedValue(model.region),
|
|
plate: model.plates.length > 0 ? model.plates.join(',') : undefined,
|
|
startDate: optionalValue(model.rangeStart),
|
|
endDate: optionalValue(model.rangeEnd),
|
|
brands: model.brands.length > 0 ? model.brands : undefined,
|
|
sourcePriority: model.sourcePriority,
|
|
};
|
|
}
|
|
|
|
function buildPagedQuery(
|
|
model: MonitoringQueryModel,
|
|
limit: number,
|
|
page: number,
|
|
): MonitoringRequestParams {
|
|
return {
|
|
...buildSharedQuery(model, limit, page),
|
|
project: selectedValue(model.project),
|
|
entity: selectedValue(model.entity),
|
|
mileageMin: optionalValue(model.mileageRange.min),
|
|
mileageMax: optionalValue(model.mileageRange.max),
|
|
};
|
|
}
|
|
|
|
export function buildInitialMonitoringQuery(
|
|
model: MonitoringQueryModel,
|
|
pageSize: number,
|
|
): MonitoringRequestParams {
|
|
return buildPagedQuery(model, pageSize, 1);
|
|
}
|
|
|
|
export function buildNextPageMonitoringQuery(
|
|
model: MonitoringQueryModel,
|
|
pageSize: number,
|
|
page: number,
|
|
): MonitoringRequestParams {
|
|
return buildPagedQuery(model, pageSize, page);
|
|
}
|
|
|
|
export function buildExportMonitoringQuery(model: MonitoringQueryModel): MonitoringRequestParams {
|
|
return buildPagedQuery(model, 9999, 1);
|
|
}
|
|
|
|
export function buildFullscreenMonitoringQuery(model: MonitoringQueryModel): MonitoringRequestParams {
|
|
// Characterization boundary: fullscreen historically omits these four filters.
|
|
// Keep project, entity, mileageMin and mileageMax out until a separate bug fix is approved.
|
|
return buildSharedQuery(model, 9999, 1);
|
|
}
|