mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-04 10:12:05 +00:00
Split oversized API/mapper/UI modules and extract focused helpers so the exact head satisfies godfile and complexity ratchets without relaxing thresholds.
72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import type { WorkOrderAdvancedFilters } from "@/domain/work-orders/types/work-order-advanced-filters";
|
|
import type {
|
|
LocationOption,
|
|
VendorDropdownItem,
|
|
} from "@/domain/work-orders/types/work-order-common";
|
|
import type { WorkOrderBoardSearchQueryParams } from "@/domain/work-orders/types/work-order-board";
|
|
import {
|
|
BOARD_SEARCH_MAX_PAGE_SIZE,
|
|
toBoardSearchQueryParams,
|
|
} from "@/domain/work-orders/utils/board-query-params";
|
|
import { resolveSiteCode } from "@/domain/work-orders/mappers/work-order-board-mapper";
|
|
|
|
export type ResolvedBoardSearchParamsInput = {
|
|
advApplied: WorkOrderAdvancedFilters | null;
|
|
search: string;
|
|
page: number;
|
|
pageSize: number;
|
|
sortBy: string;
|
|
sortDir: string;
|
|
locations: LocationOption[];
|
|
vendors: VendorDropdownItem[];
|
|
};
|
|
|
|
function resolveSiteCodes(sites: Set<string>, locations: LocationOption[]): Set<string> {
|
|
const siteCodes = new Set<string>();
|
|
for (const siteKey of sites) {
|
|
const location = locations.find((item) => String(item.id) === siteKey);
|
|
if (location) {
|
|
const code = resolveSiteCode({ siteCode: location.siteCode, name: location.name });
|
|
if (code) {
|
|
siteCodes.add(code);
|
|
}
|
|
} else if (siteKey.trim()) {
|
|
siteCodes.add(siteKey);
|
|
}
|
|
}
|
|
return siteCodes;
|
|
}
|
|
|
|
function buildVendorIdsByCompanyName(vendors: VendorDropdownItem[]): Map<string, number> {
|
|
const vendorIdsByCompanyName = new Map<string, number>();
|
|
for (const vendor of vendors) {
|
|
const id = Number(vendor.id);
|
|
if (Number.isFinite(id) && vendor.companyName) {
|
|
vendorIdsByCompanyName.set(vendor.companyName, id);
|
|
}
|
|
}
|
|
return vendorIdsByCompanyName;
|
|
}
|
|
|
|
/** Resolves advanced-filter site keys/vendor names to API-ready board/search query params. */
|
|
export function buildResolvedBoardSearchParams(
|
|
input: ResolvedBoardSearchParamsInput,
|
|
): WorkOrderBoardSearchQueryParams | null {
|
|
const { advApplied } = input;
|
|
if (!advApplied) {
|
|
return null;
|
|
}
|
|
|
|
const siteCodes = resolveSiteCodes(advApplied.sites, input.locations);
|
|
const vendorIdsByCompanyName = buildVendorIdsByCompanyName(input.vendors);
|
|
|
|
return toBoardSearchQueryParams({
|
|
filters: { ...advApplied, sites: siteCodes },
|
|
search: input.search,
|
|
page: input.page,
|
|
pageSize: Math.min(input.pageSize || BOARD_SEARCH_MAX_PAGE_SIZE, BOARD_SEARCH_MAX_PAGE_SIZE),
|
|
sortBy: input.sortBy || "scheduledDate",
|
|
sortDir: input.sortDir || "asc",
|
|
vendorIdsByCompanyName,
|
|
});
|
|
}
|