Adam Shaw пре 7 година
родитељ
комит
67aa417720
4 измењених фајлова са 40 додато и 13 уклоњено
  1. 8 4
      src/reducers/eventStore.ts
  2. 4 0
      src/structs/event-source.ts
  3. 25 6
      src/structs/event-store.ts
  4. 3 3
      src/types/input-types.ts

+ 8 - 4
src/reducers/eventStore.ts

@@ -8,9 +8,9 @@ import {
   getRelevantEvents,
   createEmptyEventStore,
   filterEventStoreDefs,
-  transformRawEvents,
   parseEvents,
-  expandRecurring
+  expandRecurring,
+  transformRawEvents
 } from '../structs/event-store'
 import { Action } from './types'
 import { EventSourceHash, EventSource } from '../structs/event-source'
@@ -94,8 +94,12 @@ function receiveRawEvents(
     eventSource && // not already removed
     fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
   ) {
-    rawEvents = transformRawEvents(rawEvents, eventSource.eventDataTransform)
-    let subset = parseEvents(rawEvents, eventSource.sourceId, calendar)
+
+    let subset = parseEvents(
+      transformRawEvents(rawEvents, eventSource, calendar),
+      eventSource.sourceId,
+      calendar
+    )
 
     if (fetchRange) {
       subset = expandRecurring(subset, fetchRange, calendar)

+ 4 - 0
src/structs/event-source.ts

@@ -20,12 +20,14 @@ export type EventSourceError = {
 }
 
 export type EventInputTransformer = (eventInput: EventInput) => EventInput | null
+export type EventRootInputTransformer = (eventRootInput: any) => EventInput[]
 export type EventSourceSuccessResponseHandler = (rawEvents: EventInput[], response: any) => void
 export type EventSourceErrorResponseHandler = (error: EventSourceError) => void
 
 export interface ExtendedEventSourceInput {
   id?: string | number
   allDayDefault?: boolean
+  rootDataTransform?: EventRootInputTransformer
   eventDataTransform?: EventInputTransformer
   editable?: boolean
   startEditable?: boolean
@@ -72,6 +74,7 @@ export interface EventSource {
   latestFetchId: string
   fetchRange: DateRange | null
   allDayDefault: boolean | null
+  rootDataTransform?: EventRootInputTransformer
   eventDataTransform: EventInputTransformer
   startEditable: boolean | null
   durationEditable: boolean | null
@@ -108,6 +111,7 @@ export interface EventSourceDef {
 const SIMPLE_SOURCE_PROPS = {
   id: String,
   allDayDefault: Boolean,
+  rootDataTransform: Function,
   eventDataTransform: Function,
   editable: Boolean,
   startEditable: Boolean,

+ 25 - 6
src/structs/event-store.ts

@@ -8,6 +8,7 @@ import {
   parseEvent,
   EventTuple
 } from './event'
+import { EventSource } from './event-source'
 import { expandRecurringRanges } from './recurring-event'
 import Calendar from '../Calendar'
 import { assignTo, filterHash } from '../util/object'
@@ -30,11 +31,6 @@ export function parseEvents(
   calendar: Calendar
 ): EventStore {
   let eventStore = createEmptyEventStore()
-  let transform = calendar.opt('eventDataTransform')
-
-  if (transform) {
-    rawEvents = transformRawEvents(rawEvents, transform)
-  }
 
   for (let rawEvent of rawEvents) {
     let tuple = parseEvent(rawEvent, sourceId, calendar)
@@ -121,7 +117,30 @@ export function isEventDefsGrouped(def0: EventDef, def1: EventDef): boolean {
   return Boolean(def0.groupId && def0.groupId === def1.groupId)
 }
 
-export function transformRawEvents(rawEvents, func) {
+export function transformRawEvents(rawEvents, eventSource: EventSource, calendar: Calendar) {
+  let calRootTransform = calendar.opt('eventRootDataTransform')
+  let calEachTransform = calendar.opt('eventDataTransform')
+  let sourceRootTransform = eventSource ? eventSource.rootDataTransform : null
+  let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null
+
+  if (sourceRootTransform) {
+    rawEvents = sourceRootTransform(rawEvents) || []
+  } else if (calRootTransform) { // can't let more than one thing massage the root data
+    rawEvents = calRootTransform(rawEvents) || []
+  }
+
+  if (sourceEachTransform) {
+    rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform)
+  }
+
+  if (calEachTransform) {
+    rawEvents = transformEachRawEvent(rawEvents, calEachTransform)
+  }
+
+  return rawEvents
+}
+
+function transformEachRawEvent(rawEvents, func) {
   let refinedEvents
 
   if (!func) {

+ 3 - 3
src/types/input-types.ts

@@ -4,13 +4,12 @@ https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/fullcalenda
 */
 
 import View from '../View'
-import { EventSourceInput } from '../structs/event-source'
+import { EventSourceInput, EventRootInputTransformer, EventInputTransformer } from '../structs/event-source'
 import { Duration, DurationInput } from '../datelib/duration'
 import { DateInput } from '../datelib/env'
 import { FormatterInput } from '../datelib/formatting'
 import { DateRangeInput } from '../datelib/date-range'
 import { BusinessHoursInput } from '../structs/business-hours'
-import { EventInput } from '../structs/event'
 import EventApi from '../api/EventApi'
 import { Allow, ConstraintInput, Overlap } from '../validation'
 
@@ -178,7 +177,8 @@ export interface OptionsInputBase {
   eventMouseLeave?(arg: { el: HTMLElement, event: EventApi, jsEvent: MouseEvent, view: View }): void
   select?(arg: { start: Date, end: Date, allDay: boolean, resource: any, jsEvent: MouseEvent, view: View }): void // resource for Scheduler
   unselect?(arg: { view: View, jsEvent: Event }): void
-  eventDataTransform?(eventData: any): EventInput
+  eventRootDataTransform?: EventRootInputTransformer
+  eventDataTransform?: EventInputTransformer
   loading?(isLoading: boolean, view: View): void
   eventRender?(arg: { event: EventApi, el: HTMLElement, view: View }): void
   eventPositioned?(arg: { event: EventApi, el: HTMLElement, view: View }): void