date-span.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { DateRange, rangesEqual } from '../datelib/date-range'
  2. import { DateInput, DateEnv } from '../datelib/env'
  3. import { refineProps } from '../util/misc'
  4. /*
  5. A data-structure for a date-range that will be visually displayed.
  6. Contains other metadata like isAllDay, and anything else Components might like to store.
  7. */
  8. export interface DateSpanInput {
  9. start: DateInput
  10. end: DateInput
  11. isAllDay?: boolean
  12. [otherProp: string]: any
  13. }
  14. export interface DateSpan {
  15. range: DateRange
  16. isAllDay: boolean
  17. [otherProp: string]: any
  18. }
  19. const STANDARD_PROPS = {
  20. start: null,
  21. end: null,
  22. isAllDay: Boolean
  23. }
  24. export function parseDateSpan(raw: DateSpanInput, dateEnv: DateEnv): DateSpan | null {
  25. let leftovers = {} as DateSpan
  26. let standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers)
  27. let startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null
  28. let endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null
  29. let isAllDay = standardProps.isAllDay
  30. if (startMeta && endMeta) {
  31. if (isAllDay == null) {
  32. isAllDay = startMeta.isTimeUnspecified && endMeta.isTimeUnspecified
  33. }
  34. // use this leftover object as the selection object
  35. leftovers.range = { start: startMeta.marker, end: endMeta.marker }
  36. leftovers.isAllDay = isAllDay
  37. return leftovers
  38. }
  39. return null
  40. }
  41. export function isDateSpansEqual(span0: DateSpan, span1: DateSpan): boolean {
  42. if (!rangesEqual(span0.range, span1.range)) {
  43. return false
  44. }
  45. for (let propName in span1) {
  46. if (propName !== 'range') {
  47. if (span0[propName] !== span1[propName]) {
  48. return false
  49. }
  50. }
  51. }
  52. for (let propName in span0) {
  53. if (!(propName in span1)) {
  54. return false
  55. }
  56. }
  57. return true
  58. }