Sfoglia il codice sorgente

event resize transforming

Adam Shaw 7 anni fa
parent
commit
ca23d6cbf7

+ 1 - 0
src/component/DateComponent.ts

@@ -44,6 +44,7 @@ export default class DateComponent<PropsType> extends Component<PropsType> {
   useEventCenter: boolean // for dragging geometry
   fgSegSelector: string // lets eventRender produce elements without fc-event class
   bgSegSelector: string
+  // IN SCHEDULER: allowEventResizeAcrossResources
 
   // if defined, holds the unit identified (ex: "year" or "month") that determines the level of granularity
   // of the date areas. if not defined, assumes to be day and time granularity.

+ 1 - 0
src/exports.ts

@@ -162,3 +162,4 @@ export { default as Slicer, SlicedProps } from './common/slicing-utils'
 
 export { EventMutation } from './structs/event-mutation'
 export { Constraint, ConstraintInput, AllowFunc, isPropsValid } from './validation'
+export { default as EventApi } from './api/EventApi'

+ 21 - 4
src/interactions/EventResizing.ts

@@ -99,7 +99,8 @@ export default class EventDragging {
         initialHit,
         hit,
         (ev.subjectEl as HTMLElement).classList.contains('fc-start-resizer'),
-        eventInstance.range
+        eventInstance.range,
+        calendar.pluginSystem.hooks.eventResizeJoinTransforms
       )
     }
 
@@ -206,7 +207,9 @@ export default class EventDragging {
 
 }
 
-function computeMutation(hit0: Hit, hit1: Hit, isFromStart: boolean, instanceRange: DateRange): EventMutation | null {
+export type EventResizeJoinTransforms = (hit0: Hit, hit1: Hit) => false | object
+
+function computeMutation(hit0: Hit, hit1: Hit, isFromStart: boolean, instanceRange: DateRange, transforms: EventResizeJoinTransforms[]): EventMutation | null {
   let dateEnv = hit0.component.dateEnv
   let date0 = hit0.dateSpan.range.start
   let date1 = hit1.dateSpan.range.start
@@ -217,13 +220,27 @@ function computeMutation(hit0: Hit, hit1: Hit, isFromStart: boolean, instanceRan
     hit0.component.largeUnit
   )
 
+  let props = {} as any
+
+  for (let transform of transforms) {
+    let res = transform(hit0, hit1)
+
+    if (res === false) {
+      return null
+    } else if (res) {
+      Object.assign(props, res)
+    }
+  }
+
   if (isFromStart) {
     if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
-      return { startDelta: delta }
+      props.startDelta = delta
+      return props
     }
   } else {
     if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
-      return { endDelta: delta }
+      props.endDelta = delta
+      return props
     }
   }
 

+ 9 - 3
src/plugin-system.ts

@@ -11,6 +11,7 @@ import { ViewProps } from './View'
 import { CalendarComponentProps } from './CalendarComponent'
 import { isPropsValidTester } from './validation'
 import { ExternalDefTransform } from './interactions-external/ExternalElementDragging'
+import { EventResizeJoinTransforms } from './interactions/EventResizing'
 
 // TODO: easier way to add new hooks? need to update a million things
 
@@ -28,6 +29,7 @@ export interface PluginDefInput {
   viewPropsTransformers?: ViewPropsTransformerClass[]
   isPropsValid?: isPropsValidTester
   externalDefTransforms?: ExternalDefTransform[]
+  eventResizeJoinTransforms?: EventResizeJoinTransforms[]
 }
 
 export interface PluginHooks {
@@ -43,6 +45,7 @@ export interface PluginHooks {
   viewPropsTransformers: ViewPropsTransformerClass[]
   isPropsValid: isPropsValidTester | null
   externalDefTransforms: ExternalDefTransform[]
+  eventResizeJoinTransforms: EventResizeJoinTransforms[]
 }
 
 export interface PluginDef extends PluginHooks {
@@ -74,7 +77,8 @@ export function createPlugin(input: PluginDefInput): PluginDef {
     viewSpecTransformers: input.viewSpecTransformers || [],
     viewPropsTransformers: input.viewPropsTransformers || [],
     isPropsValid: input.isPropsValid || null,
-    externalDefTransforms: input.externalDefTransforms || []
+    externalDefTransforms: input.externalDefTransforms || [],
+    eventResizeJoinTransforms: input.eventResizeJoinTransforms || []
   }
 }
 
@@ -96,7 +100,8 @@ export class PluginSystem {
       viewSpecTransformers: [],
       viewPropsTransformers: [],
       isPropsValid: null,
-      externalDefTransforms: []
+      externalDefTransforms: [],
+      eventResizeJoinTransforms: []
     }
     this.addedHash = {}
   }
@@ -128,6 +133,7 @@ function combineHooks(hooks0: PluginHooks, hooks1: PluginHooks): PluginHooks {
     viewSpecTransformers: hooks0.viewSpecTransformers.concat(hooks1.viewSpecTransformers),
     viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
     isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
-    externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms)
+    externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
+    eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms)
   }
 }