浏览代码

forgot recurring-event-simple

Adam Shaw 7 年之前
父节点
当前提交
bb02b10f2d
共有 1 个文件被更改,包括 89 次插入0 次删除
  1. 89 0
      src/structs/recurring-event-simple.ts

+ 89 - 0
src/structs/recurring-event-simple.ts

@@ -0,0 +1,89 @@
+import { startOfDay, addDays } from '../datelib/marker'
+import { Duration, createDuration } from '../datelib/duration'
+import { arrayToHash } from '../util/object'
+import { refineProps } from '../util/misc'
+import { registerRecurringExpander, RecurringEventDateSpans } from './recurring-event'
+import UnzonedRange from '../models/UnzonedRange'
+import Calendar from '../Calendar'
+import { EventInput } from './event'
+
+/*
+*/
+
+const SIMPLE_RECURRING_PROPS = {
+  daysOfWeek: null,
+  startTime: createDuration,
+  endTime: createDuration
+}
+
+registerRecurringExpander(
+  function(rawEvent: EventInput, framingRange: UnzonedRange, calendar: Calendar, leftoverProps: object): RecurringEventDateSpans | null {
+    if (
+      rawEvent.daysOfWeek ||
+      rawEvent.startTime != null ||
+      rawEvent.endTime != null
+    ) {
+      let props = refineProps(rawEvent, SIMPLE_RECURRING_PROPS, {}, leftoverProps)
+
+      return {
+        isAllDay: !props.startTime && !props.endTime,
+        hasEnd: Boolean(props.endTime),
+        ranges: expandRanges(
+          props.daysOfWeek,
+          props.startTime,
+          props.endTime,
+          framingRange,
+          calendar
+        )
+      }
+    }
+
+    return null
+  }
+)
+
+function expandRanges(
+  daysOfWeek: number[] | null,
+  startTime: Duration | null,
+  endTime: Duration | null,
+  framingRange: UnzonedRange,
+  calendar: Calendar
+): UnzonedRange[] {
+  let dateEnv = calendar.dateEnv
+  let dowHash: { [num: string]: true } | null = daysOfWeek ? arrayToHash(daysOfWeek) : null
+  let dayMarker = startOfDay(framingRange.start)
+  let endMarker = framingRange.end
+  let instanceRanges = []
+
+  while (dayMarker < endMarker) {
+    let instanceStart
+    let instanceEnd
+
+    // if everyday, or this particular day-of-week
+    if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
+
+      if (startTime) {
+        instanceStart = dateEnv.add(dayMarker, startTime)
+      } else {
+        instanceStart = dayMarker
+      }
+
+      if (endTime) {
+        instanceEnd = dateEnv.add(dayMarker, endTime)
+      } else {
+        instanceEnd = dateEnv.add(
+          instanceStart,
+          startTime ? // a timed event?
+            calendar.defaultTimedEventDuration :
+            calendar.defaultAllDayEventDuration
+        )
+      }
+
+      instanceRanges.push(new UnzonedRange(instanceStart, instanceEnd))
+    }
+
+    dayMarker = addDays(dayMarker, 1)
+  }
+
+  return instanceRanges
+}