Parcourir la source

new event seg slicing

Adam Shaw il y a 7 ans
Parent
commit
7bf4bbdd40

+ 4 - 0
src/Calendar.ts

@@ -154,6 +154,10 @@ export default class Calendar {
       let newState = this.state
       this.isReducing = false
 
+      if (oldState.eventStore !== newState.eventStore) {
+        this.view.renderEventStore(newState.eventStore)
+      }
+
       if (!oldState.loadingLevel && newState.loadingLevel) {
         console.log('start loading...')
       } else if (oldState.loadingLevel && !newState.loadingLevel) {

+ 9 - 0
src/View.ts

@@ -12,6 +12,8 @@ import EventInstance from './models/event/EventInstance'
 import { DateMarker, addDays, addMs, diffWholeDays } from './datelib/marker'
 import { createDuration } from './datelib/duration'
 import { createFormatter } from './datelib/formatting'
+import { EventStore } from './reducers/event-store'
+import { EventRenderSegment, sliceEventSegments } from './reducers/event-rendering'
 
 
 /* An abstract class from which other views inherit from
@@ -385,6 +387,13 @@ export default abstract class View extends InteractiveDateComponent {
   }
 
 
+  renderEventStore(eventStore: EventStore) {
+    let dateProfile = this.get('dateProfile')
+    let segs = sliceEventSegments(eventStore.instances, eventStore, dateProfile.activeUnzonedRange)
+    this.renderEventSegs(segs)
+  }
+
+
   // Business Hour High-level Rendering
   // -----------------------------------------------------------------------------------------------------------------
 

+ 1 - 0
src/component/DateComponent.ts

@@ -7,6 +7,7 @@ import EventFootprint from '../models/event/EventFootprint'
 import { DateProfile } from '../DateProfileGenerator'
 import { DateMarker, DAY_IDS, addDays, startOfDay, diffDays, diffWholeDays } from '../datelib/marker'
 import { Duration, createDuration, asRoughMs } from '../datelib/duration'
+import { EventRenderSegment } from '../reducers/event-rendering'
 
 
 export default abstract class DateComponent extends Component {

+ 1 - 1
src/models/UnzonedRange.ts

@@ -62,7 +62,7 @@ export default class UnzonedRange {
   }
 
 
-  intersect(otherRange: UnzonedRange) {
+  intersect(otherRange: UnzonedRange): UnzonedRange {
     let start = this.start
     let end = this.end
     let newRange = null

+ 0 - 1
src/models/event/EventDef.ts

@@ -1,5 +1,4 @@
 import { assignTo } from '../../util/object'
-import Calendar from '../../Calendar'
 import {
   default as ParsableModelMixin,
   ParsableModelInterface

+ 94 - 0
src/reducers/event-rendering.ts

@@ -0,0 +1,94 @@
+import UnzonedRange from '../models/UnzonedRange'
+import { EventInstanceHash, EventStore, EventDef, EventInstance } from './event-store'
+
+export interface EventRenderSegment {
+  eventDef: EventDef
+  eventInstance: EventInstance
+  range: UnzonedRange
+}
+
+export function sliceEventSegments(instances: EventInstanceHash, store: EventStore, sliceRange: UnzonedRange): EventRenderSegment[] {
+  let groupedInverseBg = {}
+  let ungroupedInverseBg: EventInstance[] = []
+  let normal: EventInstance[] = []
+  let segs: EventRenderSegment[] = []
+
+  for (let instanceId in instances) {
+    let instance = instances[instanceId]
+    let def = store.defs[instance.defId]
+    let groupId = def.groupId
+
+    if (def.rendering === 'inverse-background') {
+      if (groupId) {
+        (groupedInverseBg[groupId] || (groupedInverseBg[groupId] = []))
+          .push(instance)
+      } else {
+        ungroupedInverseBg.push(instance)
+      }
+    } else {
+      normal.push(instance)
+    }
+  }
+
+  for (let groupId in groupedInverseBg) {
+    let inverseBgInstances = groupedInverseBg[groupId]
+    let ranges = inverseBgInstances.map(getInstanceRange)
+    let invertedRanges = UnzonedRange.invertRanges(ranges, sliceRange)
+
+    for (let range of invertedRanges) {
+      segs.push({
+        eventDef: store.defs[inverseBgInstances[0].defId],
+        eventInstance: inverseBgInstances[0],
+        range
+      })
+    }
+  }
+
+  for (let instance of ungroupedInverseBg) {
+    let invertedRanges = UnzonedRange.invertRanges([ instance.range ], sliceRange)
+
+    for (let range of invertedRanges) {
+      segs.push({
+        eventDef: store.defs[instance.defId],
+        eventInstance: instance,
+        range
+      })
+    }
+  }
+
+  for (let instance of normal) {
+    let slicedRange = instance.range.intersect(sliceRange)
+
+    if (slicedRange) {
+      segs.push({
+        eventDef: store.defs[instance.defId],
+        eventInstance: instance,
+        range: slicedRange
+      })
+    }
+  }
+
+  return segs
+}
+
+function getInstanceRange(eventInstance: EventInstance) {
+  return eventInstance.range
+}
+
+export function furtherSliceEventSegments(segs: EventRenderSegment[], sliceRange: UnzonedRange): EventRenderSegment[] {
+  let newSegs: EventRenderSegment[] = []
+
+  for (let seg of segs) {
+    let newRange = seg.range.intersect(sliceRange)
+
+    if (newRange) {
+      newSegs.push({
+        eventDef: seg.eventDef,
+        eventInstance: seg.eventInstance,
+        range: newRange
+      })
+    }
+  }
+
+  return newSegs
+}

+ 1 - 1
src/reducers/event-sources.ts

@@ -79,7 +79,7 @@ const SIMPLE_SOURCE_PROPS = {
   textColor: String
 }
 
-let sourceTypes: { [sourceTypeName: string]: EventSourceTypeSettings} = {}
+let sourceTypes: { [sourceTypeName: string]: EventSourceTypeSettings } = {}
 let guid = 0
 
 // reducers

+ 5 - 2
src/reducers/event-store.ts

@@ -59,9 +59,12 @@ export interface EventInstance {
   forcedEndTzo: number | null
 }
 
+export type EventInstanceHash = { [instanceId: string]: EventInstance }
+export type EventDefHash = { [defId: string]: EventDef }
+
 export interface EventStore {
-  defs: { [defId: string]: EventDef }
-  instances: { [instanceId: string]: EventInstance }
+  defs: EventDefHash
+  instances: EventInstanceHash
 }
 
 interface EventDateInfo {

+ 7 - 7
src/reducers/json-feed-event-source.ts

@@ -7,10 +7,10 @@ import { registerSourceType } from './event-sources'
 interface JsonFeedMeta {
   url: string
   method: string
-  extraData: any
-  startParam: string | null
-  endParam: string | null
-  timezoneParam: string | null
+  extraData?: any
+  startParam?: string
+  endParam?: string
+  timezoneParam?: string
 }
 
 registerSourceType('json-feed', {
@@ -26,9 +26,9 @@ registerSourceType('json-feed', {
       url: raw.url,
       method: (raw.method || 'GET').toUpperCase(),
       extraData: raw.data,
-      startParam: raw.startParam || null,
-      endParam: raw.endParam || null,
-      timezoneParam: raw.timezoneParam || null
+      startParam: raw.startParam,
+      endParam: raw.endParam,
+      timezoneParam: raw.timezoneParam
     }
   },