Files
ln-bi/src/modules/mileage/monitoring/query-model.ts
T

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);
}