Răsfoiți Sursa

make instance expanding happen differently

Adam Shaw 7 ani în urmă
părinte
comite
a2e921921c
4 a modificat fișierele cu 41 adăugiri și 22 ștergeri
  1. 6 5
      src/Calendar.ts
  2. 10 7
      src/reducers/eventStore.ts
  3. 2 2
      src/structs/business-hours.ts
  4. 23 8
      src/structs/event-store.ts

+ 6 - 5
src/Calendar.ts

@@ -25,7 +25,7 @@ import browserContext from './common/browser-context'
 import { DateRangeInput, rangeContainsMarker } from './datelib/date-range'
 import { DateProfile } from './DateProfileGenerator'
 import { EventSourceInput, parseEventSource } from './structs/event-source'
-import { EventInput, EventInstance, EventDef } from './structs/event'
+import { EventInput, EventDef } from './structs/event'
 import { CalendarState, Action } from './reducers/types'
 import EventSourceApi from './api/EventSourceApi'
 import EventApi from './api/EventApi'
@@ -1061,9 +1061,9 @@ export default class Calendar {
 
 
   addEvent(eventInput: EventInput, isSticky: boolean = false): EventApi | null {
-    let subset = parseEventStore([ eventInput ], '', this.state.dateProfile.activeRange, this)
+    let activeRange = this.state.dateProfile.activeRange
+    let subset = parseEventStore([ eventInput ], '', this, activeRange)
     let def: EventDef = objectValues(subset.defs)[0]
-    let instances: EventInstance[] = objectValues(subset.instances)
 
     if (def) {
 
@@ -1071,6 +1071,7 @@ export default class Calendar {
         def.isTemporary = true // will mutate subet, which is good for ADD_EVENTS
       }
 
+      // TODO: make this regenerate recurring events
       this.dispatch({
         type: 'ADD_EVENTS',
         eventStore: subset
@@ -1078,8 +1079,8 @@ export default class Calendar {
 
       return new EventApi(
         this,
-        def,
-        instances.length === 1 ? instances[0] : null
+        def, // TODO: do for getEventById as well
+        def.recurringDef ? null : objectValues(subset.instances)[0]
       )
     }
 

+ 10 - 7
src/reducers/eventStore.ts

@@ -64,17 +64,20 @@ function receiveEvents(
     rawEvents = runEventDataTransform(rawEvents, eventSource.eventDataTransform)
     rawEvents = runEventDataTransform(rawEvents, calendar.opt('eventDataTransform'))
 
+    let dest = filterDefs(
+      eventStore,
+      function(eventDef: EventDef) {
+        // not the best isTemporary solution
+        return eventDef.sourceId !== eventSource.sourceId && !eventDef.isTemporary
+      }
+    )
+
     return parseEventStore(
       rawEvents,
       eventSource.sourceId,
-      fetchRange,
       calendar,
-      filterDefs( // dest
-        eventStore,
-        function(eventDef: EventDef) {
-          return eventDef.sourceId !== eventSource.sourceId && !eventDef.isTemporary
-        }
-      )
+      fetchRange,
+      dest
     )
   }
 

+ 2 - 2
src/structs/business-hours.ts

@@ -29,8 +29,8 @@ export function buildBusinessHours(
   return parseEventStore(
     refineInputs(input, isAllDay),
     '',
-    framingRange,
-    calendar
+    calendar,
+    framingRange
   )
 }
 

+ 23 - 8
src/structs/event-store.ts

@@ -1,4 +1,4 @@
-import { EventInput, EventDefHash, EventInstanceHash, parseEventDef, parseEventDateSpan, createEventInstance } from './event'
+import { EventInput, EventDefHash, EventInstanceHash, parseEventDef, parseEventDateSpan, createEventInstance, EventDef } from './event'
 import { parseEventDefRecurring, expandEventDef } from './recurring-event'
 import Calendar from '../Calendar'
 import { assignTo } from '../util/object'
@@ -18,9 +18,9 @@ export interface EventStore {
 export function parseEventStore(
   rawEvents: EventInput[],
   sourceId: string,
-  fetchRange: DateRange,
   calendar: Calendar,
-  dest: EventStore = createEmptyEventStore() // specify this arg to append to an existing EventStore
+  expandRange?: DateRange,
+  dest: EventStore = createEmptyEventStore(), // specify this arg to append to an existing EventStore
 ): EventStore {
 
   for (let rawEvent of rawEvents) {
@@ -30,6 +30,7 @@ export function parseEventStore(
     // a recurring event?
     if (parsedRecurring) {
       let def = parseEventDef(leftovers, sourceId, parsedRecurring.isAllDay, parsedRecurring.hasEnd)
+
       def.recurringDef = {
         typeId: parsedRecurring.typeId,
         typeData: parsedRecurring.typeData
@@ -37,11 +38,8 @@ export function parseEventStore(
 
       dest.defs[def.defId] = def
 
-      let ranges = expandEventDef(def, fetchRange, calendar)
-
-      for (let range of ranges) {
-        let instance = createEventInstance(def.defId, range)
-        dest.instances[instance.instanceId] = instance
+      if (expandRange) {
+        expandEventDefInstances(def, expandRange, calendar, dest.instances)
       }
 
     // a non-recurring event
@@ -61,6 +59,23 @@ export function parseEventStore(
   return dest
 }
 
+export function expandEventDefInstances(
+  def: EventDef,
+  framingRange: DateRange,
+  calendar: Calendar,
+  dest: EventInstanceHash
+) {
+  if (def.recurringDef) { // need to have this check?
+    let ranges = expandEventDef(def, framingRange, calendar)
+
+    for (let range of ranges) {
+      let instance = createEventInstance(def.defId, range)
+
+      dest[instance.instanceId] = instance
+    }
+  }
+}
+
 // retrieves events that have the same groupId as the instance specified by `instanceId`
 export function getRelatedEvents(eventStore: EventStore, instanceId: string): EventStore {
   let dest = createEmptyEventStore()