Adam Shaw 6 лет назад
Родитель
Сommit
ee69b20cef

+ 2 - 1
packages/core/src/Calendar.tsx

@@ -348,7 +348,6 @@ export default class Calendar {
 
 
     calendarComponent.updateSize(false)
     calendarComponent.updateSize(false)
     this.drainAfterSizingCallbacks()
     this.drainAfterSizingCallbacks()
-    this.releaseAfterSizingTriggers()
 
 
     if (this.isViewUpdated) {
     if (this.isViewUpdated) {
       this.isViewUpdated = false
       this.isViewUpdated = false
@@ -373,6 +372,8 @@ export default class Calendar {
     if (this.isEventsUpdated) {
     if (this.isEventsUpdated) {
       this.isEventsUpdated = false
       this.isEventsUpdated = false
     }
     }
+
+    this.releaseAfterSizingTriggers()
   }
   }
 
 
 
 

+ 5 - 6
packages/core/src/CalendarComponent.tsx

@@ -71,26 +71,24 @@ export default class CalendarComponent extends BaseComponent<CalendarComponentPr
 
 
     return (
     return (
       <Fragment>
       <Fragment>
-        {header ?
+        {header &&
           <Toolbar
           <Toolbar
             ref={this.headerRef}
             ref={this.headerRef}
             extraClassName='fc-header-toolbar'
             extraClassName='fc-header-toolbar'
             model={header}
             model={header}
             { ...toolbarProps }
             { ...toolbarProps }
-            /> :
-          null
+            />
         }
         }
         <div class='fc-view-container' ref={this.setViewContainerEl} onClick={this.handleNavLinkClick}>
         <div class='fc-view-container' ref={this.setViewContainerEl} onClick={this.handleNavLinkClick}>
           {this.renderView(props, this.context)}
           {this.renderView(props, this.context)}
         </div>
         </div>
-        {footer ?
+        {footer &&
           <Toolbar
           <Toolbar
             ref={this.footerRef}
             ref={this.footerRef}
             extraClassName='fc-footer-toolbar'
             extraClassName='fc-footer-toolbar'
             model={footer}
             model={footer}
             { ...toolbarProps }
             { ...toolbarProps }
-            /> :
-          null
+            />
         }
         }
       </Fragment>
       </Fragment>
     )
     )
@@ -110,6 +108,7 @@ export default class CalendarComponent extends BaseComponent<CalendarComponentPr
 
 
 
 
   componentWillUnmount() {
   componentWillUnmount() {
+    this.subrenderDestroy()
     this.resizeRunner.clear()
     this.resizeRunner.clear()
     window.removeEventListener('resize', this.handleWindowResize)
     window.removeEventListener('resize', this.handleWindowResize)
   }
   }

+ 4 - 2
packages/core/src/component/GotoAnchor.tsx

@@ -40,6 +40,7 @@ export default class GotoAnchor extends BaseComponent<GotoAnchorProps> {
     }
     }
 
 
     let attrs = {} as any
     let attrs = {} as any
+    let children = props.children
 
 
     if (props.extraAttrs) {
     if (props.extraAttrs) {
       __assign(attrs, props.extraAttrs)
       __assign(attrs, props.extraAttrs)
@@ -47,15 +48,16 @@ export default class GotoAnchor extends BaseComponent<GotoAnchorProps> {
 
 
     if (typeof props.htmlContent === 'string') {
     if (typeof props.htmlContent === 'string') {
       attrs.dangerouslySetInnerHTML = { __html: props.htmlContent }
       attrs.dangerouslySetInnerHTML = { __html: props.htmlContent }
+      children = null
     }
     }
 
 
     if (!forceOff && props.navLinks) {
     if (!forceOff && props.navLinks) {
       return (
       return (
-        <a {...attrs} data-goto={JSON.stringify(finalOptions)}>{props.children}</a>
+        <a {...attrs} data-goto={JSON.stringify(finalOptions)}>{children}</a>
       )
       )
     } else {
     } else {
       return (
       return (
-        <span {...attrs}>{props.children}</span>
+        <span {...attrs}>{children}</span>
       )
       )
     }
     }
   }
   }

+ 3 - 2
packages/core/src/component/renderers/FgEventRenderer.ts

@@ -365,8 +365,9 @@ export function sortEventSegs(segs, eventOrderSpecs): Seg[] {
 
 
 // returns a object with all primitive props that can be compared
 // returns a object with all primitive props that can be compared
 export function buildSegCompareObj(seg: Seg) {
 export function buildSegCompareObj(seg: Seg) {
-  let eventDef = seg.eventRange.def
-  let range = seg.eventRange.instance.range
+  let { eventRange } = seg
+  let eventDef = eventRange.def
+  let range = eventRange.instance ? eventRange.instance.range : eventRange.range
   let start = range.start ? range.start.valueOf() : 0 // TODO: better support for open-range events
   let start = range.start ? range.start.valueOf() : 0 // TODO: better support for open-range events
   let end = range.end ? range.end.valueOf() : 0 // "
   let end = range.end ? range.end.valueOf() : 0 // "
 
 

+ 44 - 16
packages/core/src/util/runner.ts

@@ -1,9 +1,10 @@
 
 
 export class DelayedRunner {
 export class DelayedRunner {
 
 
-  private isDirty: boolean = false
-  private timeoutId: number = 0
+  private isRunning = false
   private pauseDepth: number = 0
   private pauseDepth: number = 0
+  private isDirty = false
+  private timeoutId: number = 0
 
 
   constructor(
   constructor(
     private drainedOption?: () => void
     private drainedOption?: () => void
@@ -61,9 +62,15 @@ export class DelayedRunner {
   }
   }
 
 
   drain() {
   drain() {
-    if (this.isDirty && !this.pauseDepth) {
-      this.isDirty = false
-      this.drained()
+    if (!this.isRunning && !this.pauseDepth) {
+      this.isRunning = true
+
+      while (this.isDirty) {
+        this.isDirty = false
+        this.drained() // might set isDirty to true again
+      }
+
+      this.isRunning = false
     }
     }
   }
   }
 
 
@@ -84,7 +91,7 @@ export class DelayedRunner {
 export class TaskRunner<Task> {
 export class TaskRunner<Task> {
 
 
   private isRunning = false
   private isRunning = false
-  private isPaused = false
+  private pauseDepth = 0
   private queue: Task[] = []
   private queue: Task[] = []
   private delayedRunner: DelayedRunner
   private delayedRunner: DelayedRunner
 
 
@@ -103,29 +110,50 @@ export class TaskRunner<Task> {
   drain() {
   drain() {
     let { queue } = this
     let { queue } = this
 
 
-    if (!this.isRunning && !this.isPaused && queue.length) {
+    if (!this.isRunning && !this.pauseDepth) {
       this.isRunning = true
       this.isRunning = true
 
 
-      let completedTasks: Task[] = []
-      let task: Task
+      while (queue.length) {
+        let completedTasks: Task[] = []
+        let task: Task
 
 
-      while (task = queue.shift()) {
-        this.runTask(task)
-        completedTasks.push(task)
+        while (task = queue.shift()) {
+          this.runTask(task)
+          completedTasks.push(task)
+        }
+
+        this.drained(completedTasks)
       }
       }
 
 
       this.isRunning = false
       this.isRunning = false
-      this.drained(completedTasks)
     }
     }
   }
   }
 
 
   pause() {
   pause() {
-    this.isPaused = true
+    this.setPauseDepth(1)
   }
   }
 
 
   resume() {
   resume() {
-    this.isPaused = false
-    this.drain()
+    this.setPauseDepth(0)
+  }
+
+  whilePaused(func) {
+    this.setPauseDepth(this.pauseDepth + 1)
+    func()
+    this.setPauseDepth(this.pauseDepth - 1)
+  }
+
+  private setPauseDepth(depth: number) {
+    let oldDepth = this.pauseDepth
+    this.pauseDepth = depth // for this.drain() call
+
+    if (depth) { // wants to pause
+      ;
+    } else { // wants to unpause
+      if (oldDepth) {
+        this.drain()
+      }
+    }
   }
   }
 
 
   protected runTask(task: Task) {
   protected runTask(task: Task) {

+ 1 - 1
packages/daygrid/src/Table.tsx

@@ -169,7 +169,7 @@ export default class Table extends BaseComponent<TableProps, TableState> {
     let { props, rowEls } = this
     let { props, rowEls } = this
     let colCnt = props.cells[0].length
     let colCnt = props.cells[0].length
 
 
-    if (props.eventDrag) {
+    if (props.eventDrag && props.eventDrag.segs.length) { // messy check
       this.renderHighlight({
       this.renderHighlight({
         type: 'highlight',
         type: 'highlight',
         renderIntro: props.renderIntro,
         renderIntro: props.renderIntro,

+ 1 - 1
packages/timegrid/src/TimeCols.tsx

@@ -231,7 +231,7 @@ export default class TimeCols extends BaseComponent<TimeColsProps> {
 
 
 
 
   subrenderMirror(props: TimeColsProps, mirrorContainerEls: HTMLElement[], options): TimeColsEvents | null {
   subrenderMirror(props: TimeColsProps, mirrorContainerEls: HTMLElement[], options): TimeColsEvents | null {
-    if (props.eventDrag) {
+    if (props.eventDrag && props.eventDrag.segs.length) { // messy check
       return this.renderMirrorEvents({
       return this.renderMirrorEvents({
         containerEls: mirrorContainerEls,
         containerEls: mirrorContainerEls,
         segs: props.eventDrag.segs,
         segs: props.eventDrag.segs,

+ 4 - 1
packages/timegrid/src/TimeColsView.tsx

@@ -83,6 +83,7 @@ export default abstract class TimeColsView extends View {
                   ref={this.scrollerRef}
                   ref={this.scrollerRef}
                   overflowX='hidden'
                   overflowX='hidden'
                   overflowY='auto'
                   overflowY='auto'
+                  extraClassName='fc-time-grid-container'
                 >
                 >
                   {timeChildren}
                   {timeChildren}
                 </Scroller>
                 </Scroller>
@@ -347,15 +348,17 @@ export default abstract class TimeColsView extends View {
   renderTableBgIntro = () => {
   renderTableBgIntro = () => {
     let { theme, options } = this.context
     let { theme, options } = this.context
     let spanAttrs = {} as any
     let spanAttrs = {} as any
+    let child = options.allDayText
 
 
     if (typeof options.allDayHtml === 'string') {
     if (typeof options.allDayHtml === 'string') {
       spanAttrs.dangerouslySetInnerHTML = { __html: options.allDayHtml }
       spanAttrs.dangerouslySetInnerHTML = { __html: options.allDayHtml }
+      child = null
     }
     }
 
 
     return [
     return [
       <td class={'fc-axis ' + theme.getClass('widgetContent')} style={this.getAxisStyles()}>
       <td class={'fc-axis ' + theme.getClass('widgetContent')} style={this.getAxisStyles()}>
         <span {...spanAttrs}>
         <span {...spanAttrs}>
-          {options.allDayText}
+          {child}
         </span>
         </span>
       </td>
       </td>
     ]
     ]