Просмотр исходного кода

dateclick api plugin hook, other fixes

Adam Shaw 7 лет назад
Родитель
Сommit
cc462d401e
6 измененных файлов с 43 добавлено и 21 удалено
  1. 26 11
      src/Calendar.ts
  2. 1 1
      src/common/slicing-utils.ts
  3. 1 1
      src/exports.ts
  4. 1 1
      src/interactions/DateClicking.ts
  5. 11 5
      src/plugin-system.ts
  6. 3 2
      src/structs/date-span.ts

+ 26 - 11
src/Calendar.ts

@@ -33,6 +33,17 @@ import * as exportHooks from './exports'
 import CalendarComponent from './CalendarComponent'
 
 
+export interface DateClickApi {
+  date: Date
+  dateStr: string
+  allDay: boolean
+  dayEl: HTMLElement
+  jsEvent: UIEvent
+  view: View
+}
+
+export type dateClickApiTransformer = (dateClick: DateClickApi, dateSpan: DateSpan) => void
+
 export default class Calendar {
 
   // global handler registry
@@ -829,17 +840,21 @@ export default class Calendar {
 
 
   // TODO: receive pev?
-  triggerDayClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent) {
-    this.publiclyTrigger('dateClick', [
-      {
-        date: this.dateEnv.toDate(dateSpan.range.start),
-        dateStr: this.dateEnv.formatIso(dateSpan.range.start, { omitTime: dateSpan.allDay }),
-        allDay: dateSpan.allDay,
-        dayEl,
-        jsEvent: ev,
-        view
-      }
-    ])
+  triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent) {
+    let dateClickApi: DateClickApi = {
+      date: this.dateEnv.toDate(dateSpan.range.start),
+      dateStr: this.dateEnv.formatIso(dateSpan.range.start, { omitTime: dateSpan.allDay }),
+      allDay: dateSpan.allDay,
+      dayEl,
+      jsEvent: ev,
+      view
+    }
+
+    for (let transformer of this.pluginSystem.hooks.dateClickApiTransformers) {
+      transformer(dateClickApi, dateSpan)
+    }
+
+    this.publiclyTrigger('dateClick', [ dateClickApi ])
   }
 
 

+ 1 - 1
src/common/slicing-utils.ts

@@ -51,7 +51,7 @@ export class Slicer<OtherArgsType extends any[], SegType extends Seg> {
       return []
     }
 
-    let eventRange = fabricateEventRange(dateSpan)
+    let eventRange = fabricateEventRange(dateSpan, this.component.calendar)
     let segs = this.dateSpanToSegs(dateSpan, otherArgs)
 
     for (let seg of segs) {

+ 1 - 1
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 Component, ComponentContext } from './component/Component'
 export { default as DateComponent, Seg, EventSegUiInteractionState } from './component/DateComponent'
-export { default as Calendar } from './Calendar'
+export { default as Calendar, dateClickApiTransformer, DateClickApi } from './Calendar'
 export { default as View, ViewProps } from './View'
 export { defineView, getViewConfig } from './ViewRegistry'
 export { default as FgEventRenderer } from './component/renderers/FgEventRenderer'

+ 1 - 1
src/interactions/DateClicking.ts

@@ -47,7 +47,7 @@ export default class DateClicking {
       let { initialHit, finalHit } = this.hitDragging
 
       if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
-        component.calendar.triggerDayClick(
+        component.calendar.triggerDateClick(
           initialHit.dateSpan,
           initialHit.dayEl,
           component.view,

+ 11 - 5
src/plugin-system.ts

@@ -2,6 +2,7 @@ import { reducerFunc } from './reducers/types'
 import { eventDefParserFunc } from './structs/event'
 import { eventDragMutationMassager } from './interactions/EventDragging'
 import { eventDefMutationApplier } from './structs/event-mutation'
+import { dateClickApiTransformer } from './Calendar'
 
 // TODO: easier way to add new hooks? need to update a million things
 
@@ -9,8 +10,9 @@ export interface PluginDefInput {
   deps?: PluginDef[]
   reducers?: reducerFunc[]
   eventDefParsers?: eventDefParserFunc[]
-  eventDragMutationMassagers: eventDragMutationMassager[]
-  eventDefMutationAppliers: eventDefMutationApplier[]
+  eventDragMutationMassagers?: eventDragMutationMassager[]
+  eventDefMutationAppliers?: eventDefMutationApplier[],
+  dateClickApiTransformers?: dateClickApiTransformer[]
 }
 
 export interface PluginHooks {
@@ -18,6 +20,7 @@ export interface PluginHooks {
   eventDefParsers: eventDefParserFunc[]
   eventDragMutationMassagers: eventDragMutationMassager[]
   eventDefMutationAppliers: eventDefMutationApplier[]
+  dateClickApiTransformers: dateClickApiTransformer[]
 }
 
 export interface PluginDef extends PluginHooks {
@@ -34,7 +37,8 @@ export function createPlugin(input: PluginDefInput): PluginDef {
     reducers: input.reducers || [],
     eventDefParsers: input.eventDefParsers || [],
     eventDragMutationMassagers: input.eventDragMutationMassagers || [],
-    eventDefMutationAppliers: input.eventDefMutationAppliers || []
+    eventDefMutationAppliers: input.eventDefMutationAppliers || [],
+    dateClickApiTransformers: input.dateClickApiTransformers || []
   }
 }
 
@@ -48,7 +52,8 @@ export class PluginSystem {
       reducers: [],
       eventDefParsers: [],
       eventDragMutationMassagers: [],
-      eventDefMutationAppliers: []
+      eventDefMutationAppliers: [],
+      dateClickApiTransformers: []
     }
     this.addedHash = {}
   }
@@ -72,6 +77,7 @@ function combineHooks(hooks0: PluginHooks, hooks1: PluginHooks): PluginHooks {
     reducers: hooks0.reducers.concat(hooks1.reducers),
     eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
     eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
-    eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers)
+    eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
+    dateClickApiTransformers: hooks0.dateClickApiTransformers.concat(hooks1.dateClickApiTransformers)
   }
 }

+ 3 - 2
src/structs/date-span.ts

@@ -5,6 +5,7 @@ import { Duration } from '../datelib/duration'
 import { assignTo } from '../util/object'
 import { parseEventDef, createEventInstance } from './event';
 import { computeEventDefUi, EventRenderRange } from '../component/event-rendering';
+import Calendar from '../Calendar'
 
 /*
 A data-structure for a date-range that will be visually displayed.
@@ -145,13 +146,13 @@ export function buildDateSpanApi(span: DateSpan, dateEnv: DateEnv): DateSpanApi
   return props
 }
 
-export function fabricateEventRange(dateSpan: DateSpan): EventRenderRange {
+export function fabricateEventRange(dateSpan: DateSpan, calendar: Calendar): EventRenderRange {
   let def = parseEventDef(
     { editable: false },
     '', // sourceId
     dateSpan.allDay,
     true, // hasEnd
-    this.calendar
+    calendar
   )
 
   return {