ソースを参照

mainly event struct changes

Adam Shaw 7 年 前
コミット
914a833ec8

+ 1 - 1
src/component/renderers/EventRenderer.ts

@@ -280,7 +280,7 @@ export default class EventRenderer {
         })
       } else {
         return dateEnv.format(start, formatter, {
-          forcedTimeZoneOffset: forcedStartTimeZoneOffset
+          forcedTzo: forcedStartTimeZoneOffset
         })
       }
     }

+ 8 - 8
src/datelib/env.ts

@@ -107,7 +107,7 @@ export class DateEnv {
       return null
     }
 
-    return { marker, isTimeUnspecified: false, forcedTimeZoneOffset: null }
+    return { marker, isTimeUnspecified: false, forcedTzo: null }
   }
 
   parse(s: string) {
@@ -117,17 +117,17 @@ export class DateEnv {
     }
 
     let marker = parts.marker
-    let forcedTimeZoneOffset = null
+    let forcedTzo = null
 
     if (parts.timeZoneOffset !== null) {
       if (this.canComputeOffset) {
         marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000)
       } else {
-        forcedTimeZoneOffset = parts.timeZoneOffset
+        forcedTzo = parts.timeZoneOffset
       }
     }
 
-    return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTimeZoneOffset }
+    return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo }
   }
 
 
@@ -338,8 +338,8 @@ export class DateEnv {
     return formatter.format(
       {
         marker: marker,
-        timeZoneOffset: dateOptions.forcedTimeZoneOffset != null ?
-          dateOptions.forcedTimeZoneOffset :
+        timeZoneOffset: dateOptions.forcedTzo != null ?
+          dateOptions.forcedTzo :
           this.offsetForMarker(marker)
       },
       this
@@ -373,8 +373,8 @@ export class DateEnv {
     let timeZoneOffset = null
 
     if (!extraOptions.omitTimeZoneOffset) {
-      if (extraOptions.forcedTimeZoneOffset != null) {
-        timeZoneOffset = extraOptions.forcedTimeZoneOffset
+      if (extraOptions.forcedTzo != null) {
+        timeZoneOffset = extraOptions.forcedTzo
       } else {
         timeZoneOffset = this.offsetForMarker(marker)
       }

+ 3 - 3
src/interactions-external/ExternalElementDragging.ts

@@ -2,7 +2,7 @@ import ElementDragging from '../dnd/ElementDragging'
 import HitDragging, { Hit } from '../interactions/HitDragging'
 import browserContext from '../common/browser-context'
 import { PointerDragEvent } from '../dnd/PointerDragging'
-import { parseDef, createInstance, EventDef, EventInstance } from '../structs/event'
+import { parseEventDef, createEventInstance, EventDef, EventInstance } from '../structs/event'
 import { EventStore, createEmptyEventStore } from '../structs/event-store'
 import UnzonedRange from '../models/UnzonedRange'
 import * as externalHooks from '../exports'
@@ -149,7 +149,7 @@ export default class ExternalElementDragging {
 // ----------------------------------------------------------------------------------------------------
 
 function computeEventForDateSpan(dateSpan: DateSpan, dragMeta: DragMeta, calendar: Calendar): EventRes {
-  let def = parseDef(
+  let def = parseEventDef(
     dragMeta.leftoverProps || {},
     '',
     dateSpan.isAllDay,
@@ -168,7 +168,7 @@ function computeEventForDateSpan(dateSpan: DateSpan, dragMeta: DragMeta, calenda
     calendar.dateEnv.add(start, dragMeta.duration) :
     calendar.getDefaultEventEnd(dateSpan.isAllDay, start)
 
-  let instance = createInstance(def.defId, new UnzonedRange(start, end))
+  let instance = createEventInstance(def.defId, new UnzonedRange(start, end))
 
   return { def, instance }
 }

+ 2 - 2
src/interactions/EventDragging.ts

@@ -2,12 +2,12 @@ import { default as DateComponent, Seg } from '../component/DateComponent'
 import { getElSeg } from '../component/renderers/EventRenderer'
 import { PointerDragEvent } from '../dnd/PointerDragging'
 import HitDragging, { isHitsEqual, Hit } from './HitDragging'
-import { EventMutation, diffDates, getRelatedEvents, applyMutationToAll } from '../structs/event-mutation'
+import { EventMutation, diffDates, applyMutationToAll } from '../structs/event-mutation'
 import browserContext from '../common/browser-context'
 import { startOfDay } from '../datelib/marker'
 import { elementClosest } from '../util/dom-manip'
 import FeaturefulElementDragging from '../dnd/FeaturefulElementDragging'
-import { EventStore, createEmptyEventStore } from '../structs/event-store'
+import { EventStore, getRelatedEvents, createEmptyEventStore } from '../structs/event-store'
 import Calendar from '../Calendar'
 import { EventInteractionState } from '../interactions/event-interaction-state'
 

+ 2 - 2
src/interactions/EventResizing.ts

@@ -1,13 +1,13 @@
 import { default as DateComponent, Seg } from '../component/DateComponent'
 import HitDragging, { isHitsEqual, Hit } from './HitDragging'
-import { EventMutation, diffDates, getRelatedEvents, applyMutationToAll } from '../structs/event-mutation'
+import { EventMutation, diffDates, applyMutationToAll } from '../structs/event-mutation'
 import { elementClosest } from '../util/dom-manip'
 import UnzonedRange from '../models/UnzonedRange'
 import FeaturefulElementDragging from '../dnd/FeaturefulElementDragging'
 import { PointerDragEvent } from '../dnd/PointerDragging'
 import { getElSeg } from '../component/renderers/EventRenderer'
 import { EventInstance } from '../structs/event'
-import { EventStore } from '../structs/event-store'
+import { EventStore, getRelatedEvents } from '../structs/event-store'
 
 export default class EventDragging {
 

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

@@ -3,7 +3,7 @@ import Calendar from '../Calendar'
 import { warn } from '../util/misc'
 import { EventSource, EventSourceHash, parseSource, sourceTypes } from '../structs/event-source'
 
-let guid = 0
+let uid = 0
 
 // reducers
 
@@ -43,7 +43,7 @@ export function reduceEventSourceHash(sourceHash: EventSourceHash, action: any,
     case 'FETCH_EVENT_SOURCE':
       eventSource = sourceHash[action.sourceId]
 
-      let fetchId = String(guid++)
+      let fetchId = String(uid++)
       sourceTypes[eventSource.sourceType].fetch(
         {
           eventSource,

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

@@ -1,8 +1,8 @@
 import Calendar from '../Calendar'
 import { filterHash } from '../util/object'
-import { applyMutationToRelated, mergeStores } from '../structs/event-mutation'
+import { applyMutationToRelated } from '../structs/event-mutation'
 import { EventDef, EventInstance } from '../structs/event'
-import { EventStore, addRawEvents } from '../structs/event-store'
+import { EventStore, addRawEvents, mergeStores } from '../structs/event-store'
 
 // reducing
 

+ 3 - 2
src/reducers/main.ts

@@ -1,10 +1,10 @@
 import Calendar from '../Calendar'
 import { DateComponentRenderState } from '../component/DateComponent'
 import { EventSourceHash } from '../structs/event-source'
-import { reduceEventSourceHash } from './event-sources'
-import { reduceEventStore } from './event-store'
 import { DateMarker } from '../datelib/marker'
 import { assignTo } from '../util/object'
+import { reduceEventSourceHash } from './event-sources'
+import { reduceEventStore } from './event-store'
 
 export interface CalendarState extends DateComponentRenderState {
   loadingLevel: number
@@ -46,6 +46,7 @@ export function reduce(state: CalendarState, action: any, calendar: Calendar): C
     case 'SET_DATE_PROFILE':
       if (action.dateProfile.isValid) {
         newState.dateProfile = action.dateProfile
+        // why not just always use action.dateProfile.date ???
         newState.currentDate = action.dateProfile.date // might have been constrained by view dates
         calendar.view.updateMiscDateProps(action.dateProfile)
       }

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

@@ -2,7 +2,7 @@ import Calendar from '../Calendar'
 import UnzonedRange from '../models/UnzonedRange'
 import { assignTo } from '../util/object'
 import { expandRecurring } from './recurring-event'
-import { EventInput, parseDef, createInstance } from './event'
+import { EventInput, parseEventDef, createEventInstance } from './event'
 import { EventStore } from './event-store'
 
 export type BusinessHourDef = boolean | EventInput | EventInput[] // TODO: rename to plural?
@@ -30,13 +30,13 @@ export function buildBusinessHourEventStore(
 
   // TODO: join with event-store
   for (let eventInput of eventInputs) {
-    let def = parseDef(eventInput, '', isAllDay, true) // nooo, do this second, with lefotvers
+    let def = parseEventDef(eventInput, '', isAllDay, true) // nooo, do this second, with lefotvers
     let ranges = expandRecurring(eventInput, framingRange, calendar).ranges
 
     eventStore.defs[def.defId] = def
 
     for (let range of ranges) {
-      let instance = createInstance(def.defId, range)
+      let instance = createEventInstance(def.defId, range)
 
       eventStore.instances[instance.instanceId] = instance
     }

+ 3 - 3
src/structs/drag-meta.ts

@@ -1,13 +1,13 @@
 import { createDuration, Duration, DurationInput } from '../datelib/duration'
 import { refineProps } from '../util/misc'
+import { EventNonDateInput } from '../structs/event'
 
-export interface DragMetaInput {
+export interface DragMetaInput extends EventNonDateInput {
   time?: DurationInput
   duration?: DurationInput
   create?: boolean
   stick?: boolean
-  [extendedPropName: string]: any
-  // TODO: somehow join with EventInput, but minus datetime props
+  [extendedProp: string]: any
 }
 
 export interface DragMeta {

+ 1 - 40
src/structs/event-mutation.ts

@@ -1,7 +1,7 @@
 import UnzonedRange from '../models/UnzonedRange'
 import { diffDayAndTime, diffDays, startOfDay, addDays } from '../datelib/marker'
 import { Duration, createDuration } from '../datelib/duration'
-import { EventStore } from './event-store'
+import { EventStore, mergeStores, getRelatedEvents } from './event-store'
 import { EventDef, EventInstance } from './event'
 import { assignTo } from '../util/object'
 import Calendar from '../Calendar'
@@ -38,45 +38,6 @@ export function applyMutationToAll(eventStore: EventStore, mutation: EventMutati
   return newStore
 }
 
-export function getRelatedEvents(eventStore: EventStore, instanceId: string): EventStore {
-  let newStore = { defs: {}, instances: {} } // TODO: better name
-  let eventInstance = eventStore.instances[instanceId]
-  let eventDef = eventStore.defs[eventInstance.defId]
-
-  if (eventDef && eventInstance) {
-    let matchGroupId = eventDef.groupId
-
-    for (let defId in eventStore.defs) {
-      let def = eventStore.defs[defId]
-
-      if (def === eventDef || matchGroupId && matchGroupId === def.groupId) {
-        newStore.defs[defId] = def
-      }
-    }
-
-    for (let instanceId in eventStore.instances) {
-      let instance = eventStore.instances[instanceId]
-
-      if (
-        instance === eventInstance ||
-        matchGroupId && matchGroupId === eventStore.defs[instance.defId].groupId
-      ) {
-        newStore.instances[instanceId] = instance
-      }
-    }
-  }
-
-  return newStore
-}
-
-// TODO: move to event-store
-export function mergeStores(store0: EventStore, store1: EventStore): EventStore {
-  return {
-    defs: assignTo({}, store0.defs, store1.defs),
-    instances: assignTo({}, store0.instances, store1.instances)
-  }
-}
-
 function applyMutationToDef(eventDef: EventDef, mutation: EventMutation) {
   let copy = assignTo({}, eventDef)
 

+ 2 - 2
src/structs/event-source.ts

@@ -85,7 +85,7 @@ const SIMPLE_SOURCE_PROPS = {
 }
 
 export let sourceTypes: { [sourceTypeName: string]: EventSourceTypeSettings } = {}
-let guid = 0
+let uid = 0
 
 export function registerSourceType(type: string, settings: EventSourceTypeSettings) {
   sourceTypes[type] = settings
@@ -98,7 +98,7 @@ export function parseSource(raw: EventSourceInput): EventSource {
 
     if (sourceTypeMeta) {
       let source: EventSource = refineProps(raw, SIMPLE_SOURCE_PROPS)
-      source.sourceId = String(guid++)
+      source.sourceId = String(uid++)
       source.sourceType = sourceTypeName
       source.sourceTypeMeta = sourceTypeMeta
 

+ 45 - 10
src/structs/event-store.ts

@@ -1,11 +1,8 @@
 import UnzonedRange from '../models/UnzonedRange'
-import { EventInput, EventDef, EventInstance, parseDef, parseDateInfo, createInstance } from './event'
+import { EventInput, EventDefHash, EventInstanceHash, parseEventDef, parseEventDateSpan, createEventInstance } from './event'
 import { expandRecurring } from './recurring-event'
 import Calendar from '../Calendar'
-
-// need these?
-export type EventInstanceHash = { [instanceId: string]: EventInstance }
-export type EventDefHash = { [defId: string]: EventDef }
+import { assignTo } from '../util/object'
 
 export interface EventStore {
   defs: EventDefHash
@@ -18,20 +15,20 @@ export function addRawEvents(eventStore: EventStore, sourceId: string, fetchRang
     let recurringDateInfo = expandRecurring(rawEvent, fetchRange, calendar, leftoverProps)
 
     if (recurringDateInfo) {
-      let def = parseDef(leftoverProps, sourceId, recurringDateInfo.isAllDay, recurringDateInfo.hasEnd)
+      let def = parseEventDef(leftoverProps, sourceId, recurringDateInfo.isAllDay, recurringDateInfo.hasEnd)
       eventStore.defs[def.defId] = def
 
       for (let range of recurringDateInfo.ranges) {
-        let instance = createInstance(def.defId, range)
+        let instance = createEventInstance(def.defId, range)
         eventStore.instances[instance.instanceId] = instance
       }
 
     } else {
-      let dateInfo = parseDateInfo(rawEvent, sourceId, calendar, leftoverProps)
+      let dateInfo = parseEventDateSpan(rawEvent, sourceId, calendar, leftoverProps)
 
       if (dateInfo) {
-        let def = parseDef(leftoverProps, sourceId, dateInfo.isAllDay, dateInfo.hasEnd)
-        let instance = createInstance(def.defId, dateInfo.range, dateInfo.forcedStartTzo, dateInfo.forcedEndTzo)
+        let def = parseEventDef(leftoverProps, sourceId, dateInfo.isAllDay, dateInfo.hasEnd)
+        let instance = createEventInstance(def.defId, dateInfo.range, dateInfo.forcedStartTzo, dateInfo.forcedEndTzo)
 
         eventStore.defs[def.defId] = def
         eventStore.instances[instance.instanceId] = instance
@@ -43,3 +40,41 @@ export function addRawEvents(eventStore: EventStore, sourceId: string, fetchRang
 export function createEmptyEventStore(): EventStore {
   return { defs: {}, instances: {} }
 }
+
+export function mergeStores(store0: EventStore, store1: EventStore): EventStore {
+  return {
+    defs: assignTo({}, store0.defs, store1.defs),
+    instances: assignTo({}, store0.instances, store1.instances)
+  }
+}
+
+export function getRelatedEvents(eventStore: EventStore, instanceId: string): EventStore {
+  let newStore = { defs: {}, instances: {} } // TODO: better name
+  let eventInstance = eventStore.instances[instanceId]
+  let eventDef = eventStore.defs[eventInstance.defId]
+
+  if (eventDef && eventInstance) {
+    let matchGroupId = eventDef.groupId
+
+    for (let defId in eventStore.defs) {
+      let def = eventStore.defs[defId]
+
+      if (def === eventDef || matchGroupId && matchGroupId === def.groupId) {
+        newStore.defs[defId] = def
+      }
+    }
+
+    for (let instanceId in eventStore.instances) {
+      let instance = eventStore.instances[instanceId]
+
+      if (
+        instance === eventInstance ||
+        matchGroupId && matchGroupId === eventStore.defs[instance.defId].groupId
+      ) {
+        newStore.instances[instanceId] = instance
+      }
+    }
+  }
+
+  return newStore
+}

+ 71 - 55
src/structs/event.ts

@@ -3,16 +3,13 @@ import { parseClassName, ClassNameInput } from '../util/html'
 import { DateInput } from '../datelib/env'
 import UnzonedRange from '../models/UnzonedRange'
 import Calendar from '../Calendar'
+import { assignTo } from '../util/object'
 
-export type RenderingChoices = '' | 'background' | 'inverse-background' | 'none'
+export type EventRenderingChoice = '' | 'background' | 'inverse-background' | 'none'
 
-export interface EventInput {
+export interface EventNonDateInput {
   id?: string | number
   groupId?: string | number
-  start?: DateInput
-  end?: DateInput
-  date?: DateInput
-  isAllDay?: boolean
   title?: string
   url?: string
   editable?: boolean
@@ -20,36 +17,45 @@ export interface EventInput {
   durationEditable?: boolean
   constraint?: any
   overlap?: any
-  rendering?: RenderingChoices
+  rendering?: EventRenderingChoice
   className?: ClassNameInput
   color?: string
   backgroundColor?: string
   borderColor?: string
   textColor?: string
-  [extendedPropName: string]: any
+  extendedProps?: object
+  [extendedProp: string]: any
 }
 
+export interface EventDateInput {
+  start?: DateInput
+  end?: DateInput
+  date?: DateInput
+  isAllDay?: boolean
+}
+
+export type EventInput = EventNonDateInput & EventDateInput
+
 export interface EventDef {
   defId: string
   sourceId: string
-  publicId: string | null
-  groupId: string | null
+  publicId: string
+  groupId: string
   hasEnd: boolean
   isAllDay: boolean
-  title: string | null
-  url: string | null
+  title: string
+  url: string
   editable: boolean | null
   startEditable: boolean | null
   durationEditable: boolean | null
   constraint: any
   overlap: any
-  rendering: RenderingChoices
+  rendering: EventRenderingChoice
   className: string[]
-  color: string | null
-  backgroundColor: string | null
-  borderColor: string | null
-  textColor: string | null
-  extendedProps: any
+  backgroundColor: string
+  borderColor: string
+  textColor: string
+  extendedProps: object
 }
 
 export interface EventInstance {
@@ -60,7 +66,7 @@ export interface EventInstance {
   forcedEndTzo: number | null
 }
 
-export interface EventDateInfo {
+export interface EventDateSpan {
   isAllDay: boolean
   hasEnd: boolean
   range: UnzonedRange
@@ -68,17 +74,11 @@ export interface EventDateInfo {
   forcedEndTzo: number | null
 }
 
+export type EventInstanceHash = { [instanceId: string]: EventInstance }
+export type EventDefHash = { [defId: string]: EventDef }
 
-// vars
-
-const DATE_PROPS = {
-  start: null,
-  date: null,
-  end: null,
-  isAllDay: null
-}
-
-const SIMPLE_DEF_PROPS = {
+const NON_DATE_PROPS = {
+  id: String,
   groupId: String,
   title: String,
   url: String,
@@ -92,47 +92,63 @@ const SIMPLE_DEF_PROPS = {
   color: String,
   backgroundColor: String,
   borderColor: String,
-  textColor: String
+  textColor: String,
+  extendedProps: null
 }
 
-let guid = 0
-
+const DATE_PROPS = {
+  start: null,
+  date: null,
+  end: null,
+  isAllDay: null
+}
 
+let uid = 0
 
-export function parseDef(raw: EventInput, sourceId: string, isAllDay: boolean, hasEnd: boolean): EventDef {
+export function parseEventDef(raw: EventNonDateInput, sourceId: string, isAllDay: boolean, hasEnd: boolean): EventDef {
   let leftovers = {} as any
-  let def = refineProps(raw, SIMPLE_DEF_PROPS, leftovers)
-
-  // TODO: allow explicit extendedProps hash
+  let props = refineProps(raw, NON_DATE_PROPS, leftovers)
 
-  if (leftovers.id != null) {
-    def.publicId = String(leftovers.id)
-    delete leftovers.id
-  } else {
-    def.publicId = null
+  return {
+    defId: String(uid++),
+    sourceId,
+    publicId: props.id || '',
+    groupId: props.groupId || '',
+    hasEnd,
+    isAllDay,
+    title: props.title || '',
+    url: props.url || '',
+    editable: props.editable,
+    startEditable: props.startEditable,
+    durationEditable: props.durationEditable,
+    constraint: props.constraint,
+    overlap: props.overlap,
+    rendering: props.rendering || '',
+    className: props.className || [],
+    backgroundColor: props.backgroundColor || props.color || '',
+    borderColor: props.borderColor || props.color || '',
+    textColor: props.textColor || '',
+    extendedProps: assignTo(leftovers, props.extendedProps || {})
   }
-
-  def.defId = String(guid++)
-  def.sourceId = sourceId
-  def.isAllDay = isAllDay
-  def.hasEnd = hasEnd
-  def.extendedProps = leftovers
-
-  return def
 }
 
-export function createInstance(
+export function createEventInstance(
   defId: string,
   range: UnzonedRange,
   forcedStartTzo: number | null = null,
   forcedEndTzo: number | null = null
 ): EventInstance {
-  let instanceId = String(guid++)
+  let instanceId = String(uid++)
   return { instanceId, defId, range, forcedStartTzo, forcedEndTzo }
 }
 
-export function parseDateInfo(rawEvent: EventInput, sourceId: string, calendar: Calendar, leftoverProps: any): EventDateInfo | null {
-  let dateProps = refineProps(rawEvent, DATE_PROPS, leftoverProps)
+export function parseEventDateSpan(
+  raw: EventDateInput,
+  sourceId: string,
+  calendar: Calendar,
+  leftovers: object
+): EventDateSpan | null {
+  let dateProps = refineProps(raw, DATE_PROPS, leftovers)
   let rawStart = dateProps.start
   let startMeta
   let hasEnd = false
@@ -191,7 +207,7 @@ export function parseDateInfo(rawEvent: EventInput, sourceId: string, calendar:
     isAllDay,
     hasEnd,
     range: new UnzonedRange(startMeta.marker, endMarker),
-    forcedStartTzo: startMeta.forcedTimeZoneOffset, // TODO: rename to 'tzo' elsewhere
-    forcedEndTzo: endMeta ? endMeta.forcedTimeZoneOffset : null
+    forcedStartTzo: startMeta.forcedTzo,
+    forcedEndTzo: endMeta ? endMeta.forcedTzo : null
   }
 }