Bläddra i källkod

more general api for firing datespan events. external dragging hook

Adam Shaw 7 år sedan
förälder
incheckning
582dd644d3
4 ändrade filer med 75 tillägg och 38 borttagningar
  1. 29 11
      src/Calendar.ts
  2. 2 2
      src/exports.ts
  3. 24 11
      src/interactions-external/ExternalElementDragging.ts
  4. 20 14
      src/plugin-system.ts

+ 29 - 11
src/Calendar.ts

@@ -43,8 +43,8 @@ export interface DateSelectionApi extends DateSpanApi {
   view: View
   view: View
 }
 }
 
 
-export type dateClickApiTransformer = (dateClick: DateClickApi, dateSpan: DateSpan, calendar: Calendar) => void
-export type dateSelectionApiTransformer = (dateSelection: DateSelectionApi, dateSpan: DateSpan, calendar: Calendar) => void
+export type DatePointTransform = (dateSpan: DateSpan, calendar: Calendar) => any
+export type DateSpanTransform = (dateSpan: DateSpan, calendar: Calendar) => any
 
 
 export default class Calendar {
 export default class Calendar {
 
 
@@ -898,15 +898,11 @@ export default class Calendar {
 
 
 
 
   triggerDateSelect(selection: DateSpan, pev?: PointerDragEvent) {
   triggerDateSelect(selection: DateSpan, pev?: PointerDragEvent) {
-    let arg = buildDateSpanApi(selection, this.dateEnv) as DateSelectionApi
+    let arg = this.buildDateSpanApi(selection) as DateSelectionApi
 
 
     arg.jsEvent = pev ? pev.origEvent : null
     arg.jsEvent = pev ? pev.origEvent : null
     arg.view = this.view
     arg.view = this.view
 
 
-    for (let transformer of this.pluginSystem.hooks.dateSelectionApiTransformers) {
-      transformer(arg, selection, this)
-    }
-
     this.publiclyTrigger('select', [ arg ])
     this.publiclyTrigger('select', [ arg ])
 
 
     if (pev) {
     if (pev) {
@@ -927,17 +923,39 @@ export default class Calendar {
 
 
   // TODO: receive pev?
   // TODO: receive pev?
   triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent) {
   triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent) {
-    let arg = buildDatePointApi(dateSpan, this.dateEnv) as DateClickApi
+    let arg = this.buildDatePointApi(dateSpan) as DateClickApi
 
 
     arg.dayEl = dayEl
     arg.dayEl = dayEl
     arg.jsEvent = ev
     arg.jsEvent = ev
     arg.view = view
     arg.view = view
 
 
-    for (let transformer of this.pluginSystem.hooks.dateClickApiTransformers) {
-      transformer(arg, dateSpan, this)
+    this.publiclyTrigger('dateClick', [ arg ])
+  }
+
+
+  buildDatePointApi(dateSpan: DateSpan) {
+    let props = {} as DatePointApi
+
+    for (let transform of this.pluginSystem.hooks.datePointTransforms) {
+      Object.assign(props, transform(dateSpan, this))
     }
     }
 
 
-    this.publiclyTrigger('dateClick', [ arg ])
+    Object.assign(props, buildDatePointApi(dateSpan, this.dateEnv))
+
+    return props
+  }
+
+
+  buildDateSpanApi(dateSpan: DateSpan) {
+    let props = {} as DateSpanApi
+
+    for (let transform of this.pluginSystem.hooks.dateSpanTransforms) {
+      Object.assign(props, transform(dateSpan, this))
+    }
+
+    Object.assign(props, buildDateSpanApi(dateSpan, this.dateEnv))
+
+    return props
   }
   }
 
 
 
 

+ 2 - 2
src/exports.ts

@@ -89,7 +89,7 @@ export { default as ScrollComponent, ScrollbarWidths } from './common/ScrollComp
 export { default as Theme } from './theme/Theme'
 export { default as Theme } from './theme/Theme'
 export { default as Component, ComponentContext } from './component/Component'
 export { default as Component, ComponentContext } from './component/Component'
 export { default as DateComponent, Seg, EventSegUiInteractionState } from './component/DateComponent'
 export { default as DateComponent, Seg, EventSegUiInteractionState } from './component/DateComponent'
-export { default as Calendar, dateClickApiTransformer, DateClickApi, DateSelectionApi } from './Calendar'
+export { default as Calendar, DatePointTransform, DateSpanTransform } from './Calendar'
 export { default as View, ViewProps } from './View'
 export { default as View, ViewProps } from './View'
 export { default as FgEventRenderer } from './component/renderers/FgEventRenderer'
 export { default as FgEventRenderer } from './component/renderers/FgEventRenderer'
 export { default as FillRenderer } from './component/renderers/FillRenderer'
 export { default as FillRenderer } from './component/renderers/FillRenderer'
@@ -105,7 +105,7 @@ export { default as ListView } from './list/ListView'
 export { default as DateProfileGenerator, DateProfile } from './DateProfileGenerator'
 export { default as DateProfileGenerator, DateProfile } from './DateProfileGenerator'
 export { ViewDef } from './structs/view-def'
 export { ViewDef } from './structs/view-def'
 export { ViewSpec, ViewSpecTransformer } from './structs/view-spec'
 export { ViewSpec, ViewSpecTransformer } from './structs/view-spec'
-export { DateSpan } from './structs/date-span'
+export { DateSpan, DateSpanApi, DatePointApi } from './structs/date-span'
 
 
 export { DateMarker, addDays, startOfDay, addMs, diffWholeWeeks, diffWholeDays, diffDayAndTime, isValidDate } from './datelib/marker'
 export { DateMarker, addDays, startOfDay, addMs, diffWholeWeeks, diffWholeDays, diffDayAndTime, isValidDate } from './datelib/marker'
 export {
 export {

+ 24 - 11
src/interactions-external/ExternalElementDragging.ts

@@ -5,7 +5,7 @@ import { PointerDragEvent } from '../dnd/PointerDragging'
 import { parseEventDef, createEventInstance, EventTuple } from '../structs/event'
 import { parseEventDef, createEventInstance, EventTuple } from '../structs/event'
 import { createEmptyEventStore, eventTupleToStore } from '../structs/event-store'
 import { createEmptyEventStore, eventTupleToStore } from '../structs/event-store'
 import * as externalHooks from '../exports'
 import * as externalHooks from '../exports'
-import { DateSpan } from '../structs/date-span'
+import { DateSpan, DatePointApi } from '../structs/date-span'
 import Calendar from '../Calendar'
 import Calendar from '../Calendar'
 import { EventInteractionState } from '../interactions/event-interaction-state'
 import { EventInteractionState } from '../interactions/event-interaction-state'
 import { DragMetaInput, DragMeta, parseDragMeta } from '../structs/drag-meta'
 import { DragMetaInput, DragMeta, parseDragMeta } from '../structs/drag-meta'
@@ -13,9 +13,17 @@ import EventApi from '../api/EventApi'
 import { elementMatches } from '../util/dom-manip'
 import { elementMatches } from '../util/dom-manip'
 import { enableCursor, disableCursor } from '../util/misc'
 import { enableCursor, disableCursor } from '../util/misc'
 import { isInteractionValid } from '../validation'
 import { isInteractionValid } from '../validation'
+import View from '../View'
 
 
 export type DragMetaGenerator = DragMetaInput | ((el: HTMLElement) => DragMetaInput)
 export type DragMetaGenerator = DragMetaInput | ((el: HTMLElement) => DragMetaInput)
 
 
+export interface ExternalDropApi extends DatePointApi {
+  draggedEl: HTMLElement
+  jsEvent: UIEvent
+  view: View
+}
+
+
 /*
 /*
 Given an already instantiated draggable object for one-or-more elements,
 Given an already instantiated draggable object for one-or-more elements,
 Interprets any dragging as an attempt to drag an events that lives outside
 Interprets any dragging as an attempt to drag an events that lives outside
@@ -118,16 +126,13 @@ export default class ExternalElementDragging {
       let finalHit = this.hitDragging.finalHit!
       let finalHit = this.hitDragging.finalHit!
       let finalView = finalHit.component.view
       let finalView = finalHit.component.view
       let dragMeta = this.dragMeta!
       let dragMeta = this.dragMeta!
+      let arg = receivingCalendar.buildDatePointApi(finalHit.dateSpan) as ExternalDropApi
 
 
-      receivingCalendar.publiclyTrigger('drop', [
-        {
-          draggedEl: pev.subjectEl,
-          date: receivingCalendar.dateEnv.toDate(finalHit.dateSpan.range.start),
-          allDay: finalHit.dateSpan.allDay,
-          jsEvent: pev.origEvent,
-          view: finalView
-        }
-      ])
+      arg.draggedEl = pev.subjectEl as HTMLElement
+      arg.jsEvent = pev.origEvent
+      arg.view = finalView
+
+      receivingCalendar.publiclyTrigger('drop', [ arg ])
 
 
       if (dragMeta.create) {
       if (dragMeta.create) {
         receivingCalendar.dispatch({
         receivingCalendar.dispatch({
@@ -196,9 +201,17 @@ export default class ExternalElementDragging {
 // Utils for computing event store from the DragMeta
 // Utils for computing event store from the DragMeta
 // ----------------------------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------------------------
 
 
+export type ExternalDefTransform = (dateSpan: DateSpan, dragMeta: DragMeta) => any
+
 function computeEventForDateSpan(dateSpan: DateSpan, dragMeta: DragMeta, calendar: Calendar): EventTuple {
 function computeEventForDateSpan(dateSpan: DateSpan, dragMeta: DragMeta, calendar: Calendar): EventTuple {
+  let defProps = Object.assign({}, dragMeta.leftoverProps)
+
+  for (let transform of calendar.pluginSystem.hooks.externalDefTransforms) {
+    Object.assign(defProps, transform(dateSpan, dragMeta))
+  }
+
   let def = parseEventDef(
   let def = parseEventDef(
-    dragMeta.leftoverProps,
+    defProps,
     dragMeta.sourceId,
     dragMeta.sourceId,
     dateSpan.allDay,
     dateSpan.allDay,
     Boolean(dragMeta.duration), // hasEnd
     Boolean(dragMeta.duration), // hasEnd

+ 20 - 14
src/plugin-system.ts

@@ -2,7 +2,7 @@ import { reducerFunc } from './reducers/types'
 import { eventDefParserFunc } from './structs/event'
 import { eventDefParserFunc } from './structs/event'
 import { eventDragMutationMassager } from './interactions/EventDragging'
 import { eventDragMutationMassager } from './interactions/EventDragging'
 import { eventDefMutationApplier } from './structs/event-mutation'
 import { eventDefMutationApplier } from './structs/event-mutation'
-import { dateClickApiTransformer, dateSelectionApiTransformer } from './Calendar'
+import { DatePointTransform, DateSpanTransform } from './Calendar'
 import { dateSelectionJoinTransformer } from './interactions/DateSelecting'
 import { dateSelectionJoinTransformer } from './interactions/DateSelecting'
 import { ViewConfigInputHash } from './structs/view-config'
 import { ViewConfigInputHash } from './structs/view-config'
 import { assignTo } from './util/object'
 import { assignTo } from './util/object'
@@ -10,6 +10,7 @@ import { ViewSpecTransformer, ViewSpec } from './structs/view-spec'
 import { ViewProps } from './View'
 import { ViewProps } from './View'
 import { CalendarComponentProps } from './CalendarComponent'
 import { CalendarComponentProps } from './CalendarComponent'
 import { isPropsValidTester } from './validation'
 import { isPropsValidTester } from './validation'
+import { ExternalDefTransform } from './interactions-external/ExternalElementDragging'
 
 
 // TODO: easier way to add new hooks? need to update a million things
 // TODO: easier way to add new hooks? need to update a million things
 
 
@@ -20,12 +21,13 @@ export interface PluginDefInput {
   eventDragMutationMassagers?: eventDragMutationMassager[]
   eventDragMutationMassagers?: eventDragMutationMassager[]
   eventDefMutationAppliers?: eventDefMutationApplier[]
   eventDefMutationAppliers?: eventDefMutationApplier[]
   dateSelectionTransformers?: dateSelectionJoinTransformer[]
   dateSelectionTransformers?: dateSelectionJoinTransformer[]
-  dateClickApiTransformers?: dateClickApiTransformer[]
-  dateSelectionApiTransformers?: dateSelectionApiTransformer[]
+  datePointTransforms?: DatePointTransform[]
+  dateSpanTransforms?: DateSpanTransform[]
   viewConfigs?: ViewConfigInputHash
   viewConfigs?: ViewConfigInputHash
   viewSpecTransformers?: ViewSpecTransformer[]
   viewSpecTransformers?: ViewSpecTransformer[]
   viewPropsTransformers?: ViewPropsTransformerClass[]
   viewPropsTransformers?: ViewPropsTransformerClass[]
   isPropsValid?: isPropsValidTester
   isPropsValid?: isPropsValidTester
+  externalDefTransforms?: ExternalDefTransform[]
 }
 }
 
 
 export interface PluginHooks {
 export interface PluginHooks {
@@ -34,12 +36,13 @@ export interface PluginHooks {
   eventDragMutationMassagers: eventDragMutationMassager[]
   eventDragMutationMassagers: eventDragMutationMassager[]
   eventDefMutationAppliers: eventDefMutationApplier[]
   eventDefMutationAppliers: eventDefMutationApplier[]
   dateSelectionTransformers: dateSelectionJoinTransformer[]
   dateSelectionTransformers: dateSelectionJoinTransformer[]
-  dateClickApiTransformers: dateClickApiTransformer[]
-  dateSelectionApiTransformers: dateSelectionApiTransformer[]
+  datePointTransforms: DatePointTransform[]
+  dateSpanTransforms: DateSpanTransform[]
   viewConfigs: ViewConfigInputHash // TODO: parse before gets to this step?
   viewConfigs: ViewConfigInputHash // TODO: parse before gets to this step?
   viewSpecTransformers: ViewSpecTransformer[]
   viewSpecTransformers: ViewSpecTransformer[]
   viewPropsTransformers: ViewPropsTransformerClass[]
   viewPropsTransformers: ViewPropsTransformerClass[]
   isPropsValid: isPropsValidTester | null
   isPropsValid: isPropsValidTester | null
+  externalDefTransforms: ExternalDefTransform[]
 }
 }
 
 
 export interface PluginDef extends PluginHooks {
 export interface PluginDef extends PluginHooks {
@@ -65,12 +68,13 @@ export function createPlugin(input: PluginDefInput): PluginDef {
     eventDragMutationMassagers: input.eventDragMutationMassagers || [],
     eventDragMutationMassagers: input.eventDragMutationMassagers || [],
     eventDefMutationAppliers: input.eventDefMutationAppliers || [],
     eventDefMutationAppliers: input.eventDefMutationAppliers || [],
     dateSelectionTransformers: input.dateSelectionTransformers || [],
     dateSelectionTransformers: input.dateSelectionTransformers || [],
-    dateClickApiTransformers: input.dateClickApiTransformers || [],
-    dateSelectionApiTransformers: input.dateSelectionApiTransformers || [],
+    datePointTransforms: input.datePointTransforms || [],
+    dateSpanTransforms: input.dateSpanTransforms || [],
     viewConfigs: input.viewConfigs || {},
     viewConfigs: input.viewConfigs || {},
     viewSpecTransformers: input.viewSpecTransformers || [],
     viewSpecTransformers: input.viewSpecTransformers || [],
     viewPropsTransformers: input.viewPropsTransformers || [],
     viewPropsTransformers: input.viewPropsTransformers || [],
-    isPropsValid: input.isPropsValid || null
+    isPropsValid: input.isPropsValid || null,
+    externalDefTransforms: input.externalDefTransforms || []
   }
   }
 }
 }
 
 
@@ -86,12 +90,13 @@ export class PluginSystem {
       eventDragMutationMassagers: [],
       eventDragMutationMassagers: [],
       eventDefMutationAppliers: [],
       eventDefMutationAppliers: [],
       dateSelectionTransformers: [],
       dateSelectionTransformers: [],
-      dateClickApiTransformers: [],
-      dateSelectionApiTransformers: [],
+      datePointTransforms: [],
+      dateSpanTransforms: [],
       viewConfigs: {},
       viewConfigs: {},
       viewSpecTransformers: [],
       viewSpecTransformers: [],
       viewPropsTransformers: [],
       viewPropsTransformers: [],
-      isPropsValid: null
+      isPropsValid: null,
+      externalDefTransforms: []
     }
     }
     this.addedHash = {}
     this.addedHash = {}
   }
   }
@@ -117,11 +122,12 @@ function combineHooks(hooks0: PluginHooks, hooks1: PluginHooks): PluginHooks {
     eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
     eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
     eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
     eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
     dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
     dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
-    dateClickApiTransformers: hooks0.dateClickApiTransformers.concat(hooks1.dateClickApiTransformers),
-    dateSelectionApiTransformers: hooks0.dateSelectionApiTransformers.concat(hooks1.dateSelectionApiTransformers),
+    datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
+    dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
     viewConfigs: assignTo({}, hooks0.viewConfigs, hooks1.viewConfigs),
     viewConfigs: assignTo({}, hooks0.viewConfigs, hooks1.viewConfigs),
     viewSpecTransformers: hooks0.viewSpecTransformers.concat(hooks1.viewSpecTransformers),
     viewSpecTransformers: hooks0.viewSpecTransformers.concat(hooks1.viewSpecTransformers),
     viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
     viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
-    isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid
+    isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
+    externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms)
   }
   }
 }
 }