Explorar o código

all spitters need a whitelist now

Adam Shaw %!s(int64=7) %!d(string=hai) anos
pai
achega
b5f7208ff0
Modificáronse 4 ficheiros con 30 adicións e 33 borrados
  1. 2 3
      src/agenda/AgendaView.ts
  2. 4 0
      src/agenda/AllDaySplitter.ts
  3. 23 29
      src/component/event-splitting.ts
  4. 1 1
      src/exports.ts

+ 2 - 3
src/agenda/AgendaView.ts

@@ -9,7 +9,6 @@ import SimpleTimeGrid from './SimpleTimeGrid'
 import SimpleDayGrid from '../basic/SimpleDayGrid'
 import { memoize } from '../util/memoize'
 import { ViewProps } from '../View'
-import { EMPTY_PROPS } from '../component/event-splitting'
 
 
 export default class AgendaView extends AbstractAgendaView {
@@ -73,7 +72,7 @@ export default class AgendaView extends AbstractAgendaView {
     }
 
     this.simpleTimeGrid.receiveProps(
-      Object.assign({}, splitProps['timed'] || EMPTY_PROPS, {
+      Object.assign({}, splitProps['timed'], {
         dateProfile,
         dayTable,
         businessHours
@@ -82,7 +81,7 @@ export default class AgendaView extends AbstractAgendaView {
 
     if (this.simpleDayGrid) {
       this.simpleDayGrid.receiveProps(
-        Object.assign({}, splitProps['allDay'] || EMPTY_PROPS, {
+        Object.assign({}, splitProps['allDay'], {
           dateProfile,
           dayTable,
           businessHours,

+ 4 - 0
src/agenda/AllDaySplitter.ts

@@ -5,6 +5,10 @@ import { DateSpan } from '../structs/date-span'
 
 export default class AllDaySplitter extends Splitter {
 
+  getAllKeys() {
+    return [ 'allDay', 'timed' ]
+  }
+
   getKeysForDateSpan(dateSpan: DateSpan): string[] {
     if (dateSpan.allDay) {
       return [ 'allDay' ]

+ 23 - 29
src/component/event-splitting.ts

@@ -7,6 +7,7 @@ import { EventUiHash, EventUi, combineEventUis } from './event-ui'
 import { DateSpan } from '../structs/date-span'
 
 export interface SplittableProps {
+  businessHours: EventStore | null
   dateSelection: DateSpan | null
   eventStore: EventStore
   eventUiBases: EventUiHash
@@ -17,15 +18,6 @@ export interface SplittableProps {
 
 const EMPTY_EVENT_STORE = createEmptyEventStore() // for purecomponents. TODO: keep elsewhere
 
-export const EMPTY_PROPS: SplittableProps = {
-  dateSelection: null,
-  eventStore: EMPTY_EVENT_STORE,
-  eventUiBases: {},
-  eventSelection: '',
-  eventDrag: null,
-  eventResize: null
-}
-
 export default abstract class Splitter<PropsType extends SplittableProps = SplittableProps> {
 
   private getKeysForEventDefs = memoize(this._getKeysForEventDefs)
@@ -36,6 +28,7 @@ export default abstract class Splitter<PropsType extends SplittableProps = Split
   private splitEventResize = memoize(this._splitInteraction)
   protected eventUiBuilders: { [key: string]: typeof buildEventUiForKey } = {}
 
+  abstract getAllKeys(props: PropsType): string[]
   abstract getKeysForDateSpan(dateSpan: DateSpan): string[]
   abstract getKeysForEventDef(eventDef: EventDef): string[]
 
@@ -43,40 +36,41 @@ export default abstract class Splitter<PropsType extends SplittableProps = Split
     return {}
   }
 
+  getKeyBusinessHours(props: PropsType): { [key: string]: EventStore } {
+    return {}
+  }
+
   splitProps(props: PropsType): { [key: string]: SplittableProps } {
     let oldEventUiBuilders = this.eventUiBuilders
     this.eventUiBuilders = {}
 
-    let dateSelections = this.splitDateSelection(props.dateSelection)
-    let keysByDefId = this.getKeysForEventDefs(props.eventStore)
+    let keys = this.getAllKeys(props)
     let keyEventUis = this.getKeyEventUis(props)
+    let keyBusinessHours = this.getKeyBusinessHours(props)
+
+    let keysByDefId = this.getKeysForEventDefs(props.eventStore)
+    let dateSelections = this.splitDateSelection(props.dateSelection)
     let individualUi = this.splitIndividualUi(props.eventUiBases, keysByDefId)
     let eventStores = this.splitEventStore(props.eventStore, keysByDefId)
     let eventDrags = this.splitEventDrag(props.eventDrag, keysByDefId)
     let eventResizes = this.splitEventResize(props.eventResize, keysByDefId)
     let splitProps: { [key: string]: SplittableProps } = {}
 
-    let populate = (key: string) => {
-      if (!splitProps[key]) {
-        let eventStore = eventStores[key] || EMPTY_PROPS.eventStore
-        let buildEventUi = this.eventUiBuilders[key] = oldEventUiBuilders[key] || memoize(buildEventUiForKey)
-
-        splitProps[key] = {
-          dateSelection: dateSelections[key] || null,
-          eventStore,
-          eventUiBases: buildEventUi(props.eventUiBases[''], keyEventUis[key], individualUi[key]),
-          eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
-          eventDrag: eventDrags[key] || null,
-          eventResize: eventResizes[key] || null
-        }
+    for (let key of keys) {
+      let eventStore = eventStores[key] || EMPTY_EVENT_STORE
+      let buildEventUi = this.eventUiBuilders[key] = oldEventUiBuilders[key] || memoize(buildEventUiForKey)
+
+      splitProps[key] = {
+        businessHours: keyBusinessHours[key] || props.businessHours,
+        dateSelection: dateSelections[key] || null,
+        eventStore,
+        eventUiBases: buildEventUi(props.eventUiBases[''], keyEventUis[key], individualUi[key]),
+        eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
+        eventDrag: eventDrags[key] || null,
+        eventResize: eventResizes[key] || null
       }
     }
 
-    for (let key in dateSelections) { populate(key) }
-    for (let key in eventStores) { populate(key) }
-    for (let key in eventDrags) { populate(key) }
-    for (let key in eventResizes) { populate(key) }
-
     return splitProps
   }
 

+ 1 - 1
src/exports.ts

@@ -62,7 +62,7 @@ export {
 
 export { EventStore, filterEventStoreDefs, createEmptyEventStore } from './structs/event-store'
 export { EventUiHash, EventUi, processScopedUiProps, EventScopedEventUiInput, combineEventUis } from './component/event-ui'
-export { default as Splitter, SplittableProps, EMPTY_PROPS } from './component/event-splitting'
+export { default as Splitter, SplittableProps } from './component/event-splitting'
 export { buildGotoAnchorHtml, getAllDayHtml, getDayClasses } from './component/date-rendering'
 
 export {