Răsfoiți Sursa

switch ordering of parsing recurring vs normal

Adam Shaw 7 ani în urmă
părinte
comite
ceedd10373

+ 22 - 27
src/structs/event.ts

@@ -85,39 +85,34 @@ let uid = 0
 
 
 
 
 export function parseEvent(raw: EventInput, sourceId: string, calendar: Calendar): EventTuple | null {
 export function parseEvent(raw: EventInput, sourceId: string, calendar: Calendar): EventTuple | null {
-  let leftovers0 = {}
   let allDayDefault = computeIsAllDayDefault(sourceId, calendar)
   let allDayDefault = computeIsAllDayDefault(sourceId, calendar)
-  let singleRes = parseSingle(raw, allDayDefault, calendar, leftovers0)
-
-  if (singleRes) {
-    let def = parseEventDef(leftovers0, sourceId, singleRes.allDay, singleRes.hasEnd, calendar)
-    let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo)
+  let leftovers = {}
+  let recurringRes = parseRecurring(
+    raw, // raw, but with single-event stuff stripped out
+    allDayDefault,
+    calendar.dateEnv,
+    leftovers // will populate with non-recurring props
+  )
+
+  if (recurringRes) {
+    let def = parseEventDef(leftovers, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar)
+
+    def.recurringDef = { // don't want all the props from recurringRes. TODO: more efficient way to do this
+      typeId: recurringRes.typeId,
+      typeData: recurringRes.typeData,
+      duration: recurringRes.duration
+    }
 
 
-    return { def, instance }
+    return { def, instance: null }
 
 
   } else {
   } else {
-    let leftovers1 = {}
-    let recurringRes = parseRecurring(
-      leftovers0, // raw, but with single-event stuff stripped out
-      calendar.dateEnv,
-      leftovers1 // the new leftovers
-    )
-
-    if (recurringRes) {
-      let allDay =
-        (raw.allDay != null) ? Boolean(raw.allDay) : // need to get this from `raw` because already stripped out of `leftovers0`
-          (allDayDefault != null ? allDayDefault :
-            recurringRes.allDay) // fall back to the recurring date props LAST
-
-      let def = parseEventDef(leftovers1, sourceId, allDay, Boolean(recurringRes.duration), calendar)
+    let singleRes = parseSingle(raw, allDayDefault, calendar, leftovers)
 
 
-      def.recurringDef = { // TODO: more efficient way to do this
-        typeId: recurringRes.typeId,
-        typeData: recurringRes.typeData,
-        duration: recurringRes.duration
-      }
+    if (singleRes) {
+      let def = parseEventDef(leftovers, sourceId, singleRes.allDay, singleRes.hasEnd, calendar)
+      let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo)
 
 
-      return { def, instance: null }
+      return { def, instance }
     }
     }
   }
   }
 
 

+ 12 - 2
src/structs/recurring-event-simple.ts

@@ -25,7 +25,7 @@ interface SimpleParsedRecurring extends ParsedRecurring {
 
 
 registerRecurringType({
 registerRecurringType({
 
 
-  parse(rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv): SimpleParsedRecurring | null {
+  parse(rawEvent: EventInput, allDayDefault: boolean | null, leftoverProps: any, dateEnv: DateEnv): SimpleParsedRecurring | null {
     let createMarker = dateEnv.createMarker.bind(dateEnv)
     let createMarker = dateEnv.createMarker.bind(dateEnv)
     let processors = {
     let processors = {
       daysOfWeek: null,
       daysOfWeek: null,
@@ -45,9 +45,19 @@ registerRecurringType({
       }
       }
     }
     }
 
 
+    let allDay
+
+    if (props.startTime || props.endTime) {
+      allDay = false
+    } else if (allDayDefault != null) {
+      allDay = allDayDefault
+    } else {
+      allDay = true
+    }
+
     if (anyValid) {
     if (anyValid) {
       return {
       return {
-        allDay: !props.startTime && !props.endTime,
+        allDay,
         duration: (props.startTime && props.endTime) ?
         duration: (props.startTime && props.endTime) ?
           subtractDurations(props.endTime, props.startTime) :
           subtractDurations(props.endTime, props.startTime) :
           null,
           null,

+ 6 - 3
src/structs/recurring-event.ts

@@ -15,7 +15,7 @@ export interface ParsedRecurring {
 }
 }
 
 
 export interface RecurringType {
 export interface RecurringType {
-  parse: (rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv) => ParsedRecurring | null
+  parse: (rawEvent: EventInput, allDayDefault: boolean | null, leftoverProps: any, dateEnv: DateEnv) => ParsedRecurring | null
   expand: (typeData: any, eventDef: EventDef, framingRange: DateRange, dateEnv: DateEnv) => DateMarker[]
   expand: (typeData: any, eventDef: EventDef, framingRange: DateRange, dateEnv: DateEnv) => DateMarker[]
 }
 }
 
 
@@ -27,9 +27,12 @@ export function registerRecurringType(recurringType: RecurringType) {
 }
 }
 
 
 
 
-export function parseRecurring(eventInput: EventInput, dateEnv: DateEnv, leftovers: any) {
+/*
+KNOWN BUG: will populate lefovers only up until a recurring type works
+*/
+export function parseRecurring(eventInput: EventInput, allDayDefault: boolean | null, dateEnv: DateEnv, leftovers: any) {
   for (let i = 0; i < recurringTypes.length; i++) {
   for (let i = 0; i < recurringTypes.length; i++) {
-    let parsed = recurringTypes[i].parse(eventInput, leftovers, dateEnv) as ParsedRecurring
+    let parsed = recurringTypes[i].parse(eventInput, allDayDefault, leftovers, dateEnv) as ParsedRecurring
 
 
     if (parsed) {
     if (parsed) {
       return { // more efficient way to do this?
       return { // more efficient way to do this?

+ 2 - 2
tests/automated/datelib/rrule.js

@@ -108,7 +108,7 @@ describe('rrule plugin', function() {
       events: [
       events: [
         {
         {
           rrule: {
           rrule: {
-            dtstart: '2018-09-04',
+            dtstart: new Date('2018-09-04'), // no allDay info
             freq: 'weekly'
             freq: 'weekly'
           }
           }
         }
         }
@@ -128,7 +128,7 @@ describe('rrule plugin', function() {
         events: [
         events: [
           {
           {
             rrule: {
             rrule: {
-              dtstart: '2018-09-04',
+              dtstart: new Date('2018-09-04'), // no allDay info
               freq: 'weekly'
               freq: 'weekly'
             }
             }
           }
           }