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

eventRange isStart/isEnd, and does real slicing

Adam Shaw 7 лет назад
Родитель
Сommit
1ec2e77aed
3 измененных файлов с 38 добавлено и 25 удалено
  1. 3 6
      src/basic/DayGrid.ts
  2. 5 0
      src/component/DateComponent.ts
  3. 30 19
      src/component/event-rendering.ts

+ 3 - 6
src/basic/DayGrid.ts

@@ -82,10 +82,10 @@ export default class DayGrid extends DateComponent {
 
   // Slices up the given span (unzoned start/end with other misc data) into an array of segments
   rangeToSegs(range: DateRange): Seg[] {
-    let validatedRange = intersectRanges(range, this.dateProfile.validRange)
+    range = intersectRanges(range, this.dateProfile.validRange)
 
-    if (validatedRange) {
-      let segs = this.sliceRangeByRow(validatedRange)
+    if (range) {
+      let segs = this.sliceRangeByRow(range)
 
       for (let i = 0; i < segs.length; i++) {
         let seg = segs[i]
@@ -98,9 +98,6 @@ export default class DayGrid extends DateComponent {
           seg.leftCol = seg.firstRowDayIndex
           seg.rightCol = seg.lastRowDayIndex
         }
-
-        seg.isStart = seg.isStart && range.start.valueOf() === validatedRange.start.valueOf()
-        seg.isEnd = seg.isEnd && range.end.valueOf() === validatedRange.end.valueOf()
       }
 
       return segs

+ 5 - 0
src/component/DateComponent.ts

@@ -895,6 +895,9 @@ export default abstract class DateComponent extends Component {
 
       for (let seg of segs) {
         seg.eventRange = eventRenderRange
+        seg.isStart = seg.isStart && eventRenderRange.isStart
+        seg.isEnd = seg.isEnd && eventRenderRange.isEnd
+
         allSegs.push(seg)
       }
     }
@@ -915,6 +918,8 @@ export default abstract class DateComponent extends Component {
         eventDef: def,
         eventInstance: createEventInstance(def.defId, selection.range),
         range: selection.range,
+        isStart: true,
+        isEnd: true,
         ui: computeEventDefUi(def, {}, {})
       }
 

+ 30 - 19
src/component/event-rendering.ts

@@ -1,6 +1,6 @@
 import { EventDef, EventInstance, EventDefHash } from '../structs/event'
 import { EventStore } from '../structs/event-store'
-import { DateRange, invertRanges } from '../datelib/date-range'
+import { DateRange, invertRanges, intersectRanges } from '../datelib/date-range'
 import { EventSourceHash } from '../structs/event-source'
 import { mapHash } from '../util/object'
 import { parseClassName } from '../util/html'
@@ -22,14 +22,14 @@ export type EventUiHash = { [defId: string]: EventUi }
 export interface EventRenderRange {
   eventDef: EventDef
   eventInstance?: EventInstance
-  range: DateRange // NOT sliced by framingRange
+  range: DateRange,
+  isStart: boolean
+  isEnd: boolean
   ui: EventUi
 }
 
 
 /*
-DOES NOT ACTUALLY SLIE RANGES via framingRange into new ranges, but instead,
-keeps fg event ranges intact but more importantly slices inverse-BG events.
 Specifying nextDayThreshold signals that all-day ranges should be sliced.
 */
 export function sliceEventStore(eventStore: EventStore, eventUis: EventUiHash, framingRange: DateRange, nextDayThreshold?: Duration) {
@@ -59,25 +59,32 @@ export function sliceEventStore(eventStore: EventStore, eventUis: EventUiHash, f
     let instance = eventStore.instances[instanceId]
     let def = eventStore.defs[instance.defId]
     let ui = eventUis[def.defId]
-    let range = instance.range
+    let origRange = instance.range
+    let slicedRange = intersectRanges(origRange, framingRange)
+    let visibleRange
 
-    if (!def.isAllDay && nextDayThreshold) {
-      range = computeVisibleDayRange(range, nextDayThreshold)
-    }
+    if (slicedRange) {
 
-    if (ui.rendering === 'inverse-background') {
-      if (def.groupId) {
-        inverseBgByGroupId[def.groupId].push(range)
+      visibleRange = (!def.isAllDay && nextDayThreshold) ?
+        computeVisibleDayRange(slicedRange, nextDayThreshold) :
+        slicedRange
+
+      if (ui.rendering === 'inverse-background') {
+        if (def.groupId) {
+          inverseBgByGroupId[def.groupId].push(visibleRange)
+        } else {
+          inverseBgByDefId[instance.defId].push(visibleRange)
+        }
       } else {
-        inverseBgByDefId[instance.defId].push(range)
+        renderRanges.push({
+          eventDef: def,
+          eventInstance: instance,
+          range: visibleRange,
+          isStart: origRange.start.valueOf() === slicedRange.start.valueOf(),
+          isEnd: origRange.end.valueOf() === slicedRange.end.valueOf(),
+          ui
+        })
       }
-    } else {
-      renderRanges.push({
-        eventDef: def,
-        eventInstance: instance,
-        range: range,
-        ui
-      })
     }
   }
 
@@ -92,6 +99,8 @@ export function sliceEventStore(eventStore: EventStore, eventUis: EventUiHash, f
       renderRanges.push({
         eventDef: def,
         range: invertedRange,
+        isStart: false,
+        isEnd: false,
         ui
       })
     }
@@ -105,6 +114,8 @@ export function sliceEventStore(eventStore: EventStore, eventUis: EventUiHash, f
       renderRanges.push({
         eventDef: eventStore.defs[defId],
         range: invertedRange,
+        isStart: false,
+        isEnd: false,
         ui: eventUis[defId]
       })
     }