export interface DetailDateRange { startDate?: string; endDate?: string; } type NullableValue = T | undefined | null | ''; export function pickDetailValue(...values: NullableValue[]): T | undefined { for (const value of values) { if (value !== undefined && value !== null && value !== '') { return value as T; } } return undefined; } export function pickDetailArrayValue(...values: Array): T[] | undefined { for (const value of values) { if (Array.isArray(value) && value.length) { return value; } } return undefined; } export function mergeDetailDateRange( baseRange: DetailDateRange = {}, scopedRange: DetailDateRange = {}, ): DetailDateRange { const startCandidates = [baseRange.startDate, scopedRange.startDate].filter(Boolean).sort(); const endCandidates = [baseRange.endDate, scopedRange.endDate].filter(Boolean).sort(); const startDate = startCandidates[startCandidates.length - 1]; const endDate = endCandidates[0]; if (startDate && endDate && startDate > endDate) { return { startDate: pickDetailValue(scopedRange.startDate, baseRange.startDate), endDate: pickDetailValue(scopedRange.endDate, baseRange.endDate), }; } return { startDate, endDate }; }