detailQuery.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. export interface DetailDateRange {
  2. startDate?: string;
  3. endDate?: string;
  4. }
  5. type NullableValue<T> = T | undefined | null | '';
  6. export function pickDetailValue<T>(...values: NullableValue<T>[]): T | undefined {
  7. for (const value of values) {
  8. if (value !== undefined && value !== null && value !== '') {
  9. return value as T;
  10. }
  11. }
  12. return undefined;
  13. }
  14. export function pickDetailArrayValue<T>(...values: Array<T[] | undefined | null>): T[] | undefined {
  15. for (const value of values) {
  16. if (Array.isArray(value) && value.length) {
  17. return value;
  18. }
  19. }
  20. return undefined;
  21. }
  22. export function mergeDetailDateRange(
  23. baseRange: DetailDateRange = {},
  24. scopedRange: DetailDateRange = {},
  25. ): DetailDateRange {
  26. const startCandidates = [baseRange.startDate, scopedRange.startDate].filter(Boolean).sort();
  27. const endCandidates = [baseRange.endDate, scopedRange.endDate].filter(Boolean).sort();
  28. const startDate = startCandidates[startCandidates.length - 1];
  29. const endDate = endCandidates[0];
  30. if (startDate && endDate && startDate > endDate) {
  31. return {
  32. startDate: pickDetailValue(scopedRange.startDate, baseRange.startDate),
  33. endDate: pickDetailValue(scopedRange.endDate, baseRange.endDate),
  34. };
  35. }
  36. return { startDate, endDate };
  37. }