Adam Shaw %!s(int64=7) %!d(string=hai) anos
pai
achega
319232e3be
Modificáronse 2 ficheiros con 48 adicións e 14 borrados
  1. 27 14
      src/structs/recurring-event-simple.ts
  2. 21 0
      tests/automated/event-data/recurring.js

+ 27 - 14
src/structs/recurring-event-simple.ts

@@ -4,23 +4,19 @@ import { arrayToHash } from '../util/object'
 import { refineProps } from '../util/misc'
 import { registerRecurringType, ParsedRecurring } from './recurring-event'
 import { EventInput, EventDef } from './event'
-import { DateRange } from '../datelib/date-range'
+import { DateRange, OpenDateRange, intersectRanges } from '../datelib/date-range'
 import { DateEnv } from '../datelib/env'
 
 /*
 An implementation of recurring events that only supports every-day or weekly recurrences.
 */
 
-const SIMPLE_RECURRING_PROPS = {
-  daysOfWeek: null,
-  startTime: createDuration,
-  endTime: createDuration
-}
-
 interface SimpleRecurringData {
   daysOfWeek: number[] | null
   startTime: Duration | null
   endTime: Duration | null
+  startRecur: DateMarker | null
+  endRecur: DateMarker | null
 }
 
 interface SimpleParsedRecurring extends ParsedRecurring {
@@ -29,14 +25,27 @@ interface SimpleParsedRecurring extends ParsedRecurring {
 
 registerRecurringType({
 
-  parse(rawEvent: EventInput, leftoverProps: any): SimpleParsedRecurring | null {
-    if (
-      rawEvent.daysOfWeek ||
-      rawEvent.startTime != null ||
-      rawEvent.endTime != null
-    ) {
-      let props = refineProps(rawEvent, SIMPLE_RECURRING_PROPS, {}, leftoverProps) as SimpleRecurringData
+  parse(rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv): SimpleParsedRecurring | null {
+    let createMarker = dateEnv.createMarker.bind(dateEnv)
+    let processors = {
+      daysOfWeek: null,
+      startTime: createDuration,
+      endTime: createDuration,
+      startRecur: createMarker,
+      endRecur: createMarker
+    }
+
+    let props = refineProps(rawEvent, processors, {}, leftoverProps) as SimpleRecurringData
+    let anyValid = false
 
+    for (let propName in props) {
+      if (props[propName] != null) {
+        anyValid = true
+        break
+      }
+    }
+
+    if (anyValid) {
       return {
         allDay: !props.startTime && !props.endTime,
         duration: (props.startTime && props.endTime) ?
@@ -53,6 +62,7 @@ registerRecurringType({
     return expandRanges(
       typeData.daysOfWeek,
       typeData.startTime,
+      { start: typeData.startRecur, end: typeData.endRecur },
       framingRange,
       dateEnv
     )
@@ -63,9 +73,12 @@ registerRecurringType({
 function expandRanges(
   daysOfWeek: number[] | null,
   startTime: Duration | null,
+  recurRange: OpenDateRange,
   framingRange: DateRange,
   dateEnv: DateEnv
 ): DateMarker[] {
+  framingRange = intersectRanges(framingRange, recurRange)
+
   let dowHash: { [num: string]: true } | null = daysOfWeek ? arrayToHash(daysOfWeek) : null
   let dayMarker = startOfDay(framingRange.start)
   let endMarker = framingRange.end

+ 21 - 0
tests/automated/event-data/recurring.js

@@ -24,4 +24,25 @@ describe('recurring events', function() {
     })
   })
 
+  describe('when give recur range', function() {
+    pushOptions({
+      defaultView: 'month',
+      defaultDate: '2017-07-03',
+      events: [
+        { startTime: '09:00', endTime: '11:00', startRecur: '2017-07-05', endRecur: '2017-07-08' }
+      ]
+    })
+
+    it('expands within given range', function() {
+      initCalendar()
+
+      var events = currentCalendar.getEvents()
+      expect(events.length).toBe(3)
+
+      expect(events[0].start).toEqualDate('2017-07-05T09:00:00Z')
+      expect(events[1].start).toEqualDate('2017-07-06T09:00:00Z')
+      expect(events[2].start).toEqualDate('2017-07-07T09:00:00Z')
+    })
+  })
+
 })