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

solve eventUi problem with dragging

Adam Shaw 7 лет назад
Родитель
Сommit
454faa8d8a

+ 5 - 5
src/agenda/AgendaView.ts

@@ -16,7 +16,7 @@ import { createFormatter } from '../datelib/formatting'
 import { EventStore, filterEventStoreDefs } from '../structs/event-store'
 import { EventStore, filterEventStoreDefs } from '../structs/event-store'
 import { RenderForceFlags } from '../component/Component'
 import { RenderForceFlags } from '../component/Component'
 import { DateComponentRenderState } from '../component/DateComponent'
 import { DateComponentRenderState } from '../component/DateComponent'
-import { EventInteractionState } from '../interactions/event-interaction-state'
+import { EventInteractionUiState } from '../interactions/event-interaction-state'
 import reselector from '../util/reselector'
 import reselector from '../util/reselector'
 import { EventUiHash, hasBgRendering } from '../component/event-rendering'
 import { EventUiHash, hasBgRendering } from '../component/event-rendering'
 
 
@@ -433,10 +433,10 @@ function filterEventsForDayGrid(eventStore: EventStore, eventUis: EventUiHash):
   })
   })
 }
 }
 
 
-function buildInteractionForTimeGrid(state: EventInteractionState): EventInteractionState {
+function buildInteractionForTimeGrid(state: EventInteractionUiState): EventInteractionUiState {
   if (state) {
   if (state) {
     return {
     return {
-      affectedEvents: filterEventsForTimeGrid(state.affectedEvents, state.eventUis),
+      affectedEvents: state.affectedEvents,
       mutatedEvents: filterEventsForTimeGrid(state.mutatedEvents, state.eventUis),
       mutatedEvents: filterEventsForTimeGrid(state.mutatedEvents, state.eventUis),
       eventUis: state.eventUis,
       eventUis: state.eventUis,
       isEvent: state.isEvent,
       isEvent: state.isEvent,
@@ -446,10 +446,10 @@ function buildInteractionForTimeGrid(state: EventInteractionState): EventInterac
   return null
   return null
 }
 }
 
 
-function buildInteractionForDayGrid(state: EventInteractionState): EventInteractionState {
+function buildInteractionForDayGrid(state: EventInteractionUiState): EventInteractionUiState {
   if (state) {
   if (state) {
     return {
     return {
-      affectedEvents: filterEventsForDayGrid(state.affectedEvents, state.eventUis),
+      affectedEvents: state.affectedEvents,
       mutatedEvents: filterEventsForDayGrid(state.mutatedEvents, state.eventUis),
       mutatedEvents: filterEventsForDayGrid(state.mutatedEvents, state.eventUis),
       eventUis: state.eventUis,
       eventUis: state.eventUis,
       isEvent: state.isEvent,
       isEvent: state.isEvent,

+ 7 - 7
src/component/DateComponent.ts

@@ -11,7 +11,7 @@ import { EventRenderRange, sliceEventStore, computeEventDefUi, EventUiHash, comp
 import { EventStore, expandEventStoreInstances } from '../structs/event-store'
 import { EventStore, expandEventStoreInstances } from '../structs/event-store'
 import { DateEnv } from '../datelib/env'
 import { DateEnv } from '../datelib/env'
 import Theme from '../theme/Theme'
 import Theme from '../theme/Theme'
-import { EventInteractionState } from '../interactions/event-interaction-state'
+import { EventInteractionUiState } from '../interactions/event-interaction-state'
 import { assignTo } from '../util/object'
 import { assignTo } from '../util/object'
 import browserContext from '../common/browser-context'
 import browserContext from '../common/browser-context'
 import { Hit } from '../interactions/HitDragging'
 import { Hit } from '../interactions/HitDragging'
@@ -27,8 +27,8 @@ export interface DateComponentRenderState {
   eventUis: EventUiHash
   eventUis: EventUiHash
   dateSelection: DateSpan | null
   dateSelection: DateSpan | null
   eventSelection: string
   eventSelection: string
-  eventDrag: EventInteractionState | null
-  eventResize: EventInteractionState | null
+  eventDrag: EventInteractionUiState | null
+  eventResize: EventInteractionUiState | null
 }
 }
 
 
 // NOTE: for fg-events, eventRange.range is NOT sliced,
 // NOTE: for fg-events, eventRange.range is NOT sliced,
@@ -87,8 +87,8 @@ export default abstract class DateComponent extends Component {
   eventUis: EventUiHash = null
   eventUis: EventUiHash = null
   dateSelection: DateSpan = null
   dateSelection: DateSpan = null
   eventSelection: string = ''
   eventSelection: string = ''
-  eventDrag: EventInteractionState = null
-  eventResize: EventInteractionState = null
+  eventDrag: EventInteractionUiState = null
+  eventResize: EventInteractionUiState = null
 
 
 
 
   constructor(_view, _options?) {
   constructor(_view, _options?) {
@@ -639,7 +639,7 @@ export default abstract class DateComponent extends Component {
   // ---------------------------------------------------------------------------------------------------------------
   // ---------------------------------------------------------------------------------------------------------------
 
 
 
 
-  renderEventDragState(state: EventInteractionState) {
+  renderEventDragState(state: EventInteractionUiState) {
     this.hideSegsByHash(state.affectedEvents.instances)
     this.hideSegsByHash(state.affectedEvents.instances)
     this.renderEventDrag(
     this.renderEventDrag(
       state.mutatedEvents,
       state.mutatedEvents,
@@ -694,7 +694,7 @@ export default abstract class DateComponent extends Component {
   // ---------------------------------------------------------------------------------------------------------------
   // ---------------------------------------------------------------------------------------------------------------
 
 
 
 
-  renderEventResizeState(state: EventInteractionState) {
+  renderEventResizeState(state: EventInteractionUiState) {
     this.hideSegsByHash(state.affectedEvents.instances)
     this.hideSegsByHash(state.affectedEvents.instances)
     this.renderEventResize(
     this.renderEventResize(
       state.mutatedEvents,
       state.mutatedEvents,

+ 0 - 6
src/interactions-external/ExternalElementDragging.ts

@@ -11,7 +11,6 @@ import { EventInteractionState } from '../interactions/event-interaction-state'
 import { DragMetaInput, DragMeta, parseDragMeta } from '../structs/drag-meta'
 import { DragMetaInput, DragMeta, parseDragMeta } from '../structs/drag-meta'
 import EventApi from '../api/EventApi'
 import EventApi from '../api/EventApi'
 import { elementMatches } from '../util/dom-manip'
 import { elementMatches } from '../util/dom-manip'
-import { computeEventDefUis } from '../component/event-rendering'
 
 
 export interface EventRes {
 export interface EventRes {
   def: EventDef
   def: EventDef
@@ -70,14 +69,9 @@ export default class ExternalElementDragging {
     // TODO: always store as event-store?
     // TODO: always store as event-store?
     let droppableEventStore = droppableEvent ? toEventStore(droppableEvent) : createEmptyEventStore()
     let droppableEventStore = droppableEvent ? toEventStore(droppableEvent) : createEmptyEventStore()
 
 
-    // we need to compute UI objects. no source or original calendar options,
-    // so just compute based off event defs.
-    let eventUis = computeEventDefUis(droppableEventStore.defs, {}, {})
-
     this.displayDrag(receivingCalendar, {
     this.displayDrag(receivingCalendar, {
       affectedEvents: createEmptyEventStore(),
       affectedEvents: createEmptyEventStore(),
       mutatedEvents: droppableEventStore,
       mutatedEvents: droppableEventStore,
-      eventUis,
       isEvent: this.dragMeta!.create,
       isEvent: this.dragMeta!.create,
       origSeg: null
       origSeg: null
     })
     })

+ 0 - 2
src/interactions/EventDragging.ts

@@ -159,7 +159,6 @@ export default class EventDragging { // TODO: rename to EventSelectingAndDraggin
     this.displayDrag(receivingCalendar, {
     this.displayDrag(receivingCalendar, {
       affectedEvents: relatedEvents,
       affectedEvents: relatedEvents,
       mutatedEvents: mutatedRelatedEvents || createEmptyEventStore(),
       mutatedEvents: mutatedRelatedEvents || createEmptyEventStore(),
-      eventUis: initialCalendar.state.eventUis,
       isEvent: true,
       isEvent: true,
       origSeg: this.subjectSeg
       origSeg: this.subjectSeg
     })
     })
@@ -298,7 +297,6 @@ export default class EventDragging { // TODO: rename to EventSelectingAndDraggin
           state: {
           state: {
             affectedEvents: state.affectedEvents,
             affectedEvents: state.affectedEvents,
             mutatedEvents: createEmptyEventStore(),
             mutatedEvents: createEmptyEventStore(),
-            eventUis: {},
             isEvent: true,
             isEvent: true,
             origSeg: state.origSeg
             origSeg: state.origSeg
           }
           }

+ 0 - 1
src/interactions/EventResizing.ts

@@ -113,7 +113,6 @@ export default class EventDragging {
         state: {
         state: {
           affectedEvents: relatedEvents,
           affectedEvents: relatedEvents,
           mutatedEvents: mutatedRelatedEvents,
           mutatedEvents: mutatedRelatedEvents,
-          eventUis: calendar.state.eventUis,
           isEvent: true,
           isEvent: true,
           origSeg: this.draggingSeg
           origSeg: this.draggingSeg
         }
         }

+ 4 - 1
src/interactions/event-interaction-state.ts

@@ -5,7 +5,10 @@ import { EventUiHash } from '../component/event-rendering'
 export interface EventInteractionState {
 export interface EventInteractionState {
   affectedEvents: EventStore
   affectedEvents: EventStore
   mutatedEvents: EventStore
   mutatedEvents: EventStore
-  eventUis: EventUiHash
   isEvent: boolean
   isEvent: boolean
   origSeg: Seg | null
   origSeg: Seg | null
 }
 }
+
+export interface EventInteractionUiState extends EventInteractionState {
+  eventUis: EventUiHash
+}

+ 39 - 8
src/reducers/main.ts

@@ -3,9 +3,10 @@ import reduceEventSources from './eventSources'
 import reduceEventStore from './eventStore'
 import reduceEventStore from './eventStore'
 import { DateProfile, isDateProfilesEqual } from '../DateProfileGenerator'
 import { DateProfile, isDateProfilesEqual } from '../DateProfileGenerator'
 import { DateSpan } from '../structs/date-span'
 import { DateSpan } from '../structs/date-span'
-import { EventInteractionState } from '../interactions/event-interaction-state'
+import { EventInteractionUiState } from '../interactions/event-interaction-state'
 import { CalendarState, Action } from './types'
 import { CalendarState, Action } from './types'
 import { EventSourceHash } from '../structs/event-source'
 import { EventSourceHash } from '../structs/event-source'
+import { computeEventDefUis } from '../component/event-rendering'
 
 
 export default function(state: CalendarState, action: Action, calendar: Calendar): CalendarState {
 export default function(state: CalendarState, action: Action, calendar: Calendar): CalendarState {
   calendar.publiclyTrigger(action.type, action) // for testing hooks
   calendar.publiclyTrigger(action.type, action) // for testing hooks
@@ -21,8 +22,8 @@ export default function(state: CalendarState, action: Action, calendar: Calendar
     businessHours: state.businessHours,
     businessHours: state.businessHours,
     dateSelection: reduceDateSelection(state.dateSelection, action),
     dateSelection: reduceDateSelection(state.dateSelection, action),
     eventSelection: reduceSelectedEvent(state.eventSelection, action),
     eventSelection: reduceSelectedEvent(state.eventSelection, action),
-    eventDrag: reduceEventDrag(state.eventDrag, action),
-    eventResize: reduceEventResize(state.eventResize, action),
+    eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar),
+    eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar),
     eventSourceLoadingLevel: computeLoadingLevel(eventSources),
     eventSourceLoadingLevel: computeLoadingLevel(eventSources),
     loadingLevel: computeLoadingLevel(eventSources)
     loadingLevel: computeLoadingLevel(eventSources)
   }
   }
@@ -61,25 +62,55 @@ function reduceSelectedEvent(currentInstanceId: string, action: Action): string
   }
   }
 }
 }
 
 
-function reduceEventDrag(currentDrag: EventInteractionState | null, action: Action) {
+function reduceEventDrag(currentDrag: EventInteractionUiState | null, action: Action, sources: EventSourceHash, calendar: Calendar): EventInteractionUiState | null {
   switch (action.type) {
   switch (action.type) {
+
     case 'SET_EVENT_DRAG':
     case 'SET_EVENT_DRAG':
-      return action.state
+      let newDrag = action.state
+      let eventUis = computeEventDefUis(
+        newDrag.mutatedEvents.defs,
+        sources,
+        calendar.view ? calendar.view.options : {} // yuck
+      )
+      return {
+        affectedEvents: newDrag.affectedEvents,
+        mutatedEvents: newDrag.mutatedEvents,
+        isEvent: newDrag.isEvent,
+        origSeg: newDrag.origSeg,
+        eventUis: eventUis
+      }
+
     case 'UNSET_EVENT_DRAG':
     case 'UNSET_EVENT_DRAG':
       return null
       return null
+
     default:
     default:
       return currentDrag
       return currentDrag
   }
   }
 }
 }
 
 
-function reduceEventResize(currentEventResize: EventInteractionState | null, action: Action) {
+function reduceEventResize(currentResize: EventInteractionUiState | null, action: Action, sources: EventSourceHash, calendar: Calendar): EventInteractionUiState | null {
   switch (action.type) {
   switch (action.type) {
+
     case 'SET_EVENT_RESIZE':
     case 'SET_EVENT_RESIZE':
-      return action.state
+      let newResize = action.state
+      let eventUis = computeEventDefUis(
+        newResize.mutatedEvents.defs,
+        sources,
+        calendar.view ? calendar.view.options : {} // yuck
+      )
+      return {
+        affectedEvents: newResize.affectedEvents,
+        mutatedEvents: newResize.mutatedEvents,
+        isEvent: newResize.isEvent,
+        origSeg: newResize.origSeg,
+        eventUis
+      }
+
     case 'UNSET_EVENT_RESIZE':
     case 'UNSET_EVENT_RESIZE':
       return null
       return null
+
     default:
     default:
-      return currentEventResize
+      return currentResize
   }
   }
 }
 }