Преглед изворни кода

some prep for updateSize/height refactor

Adam Shaw пре 6 година
родитељ
комит
48effee9b8

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

@@ -413,12 +413,7 @@ export default class Calendar {
 
 
 
 
   viewOpt(name: string) { // getter, used internally
   viewOpt(name: string) { // getter, used internally
-    return this.viewOpts()[name]
-  }
-
-
-  viewOpts() {
-    return this.viewSpecs[this.state.viewType].options
+    return this.viewSpecs[this.state.viewType].options[name]
   }
   }
 
 
   /*
   /*

+ 2 - 6
packages/core/src/Toolbar.tsx

@@ -1,4 +1,4 @@
-import { h, createRef } from './vdom'
+import { h } from './vdom'
 import { BaseComponent } from './vdom-util'
 import { BaseComponent } from './vdom-util'
 import { ToolbarModel, ToolbarWidget } from './toolbar-parse'
 import { ToolbarModel, ToolbarWidget } from './toolbar-parse'
 
 
@@ -19,16 +19,12 @@ export interface ToolbarContent {
 
 
 export default class Toolbar extends BaseComponent<ToolbarProps> {
 export default class Toolbar extends BaseComponent<ToolbarProps> {
 
 
-  private rootElRef = createRef<HTMLDivElement>()
-
-  public get rootEl() { return this.rootElRef.current }
-
 
 
   render(props: ToolbarProps) {
   render(props: ToolbarProps) {
     let { model } = props
     let { model } = props
 
 
     return (
     return (
-      <div ref={this.rootElRef} class={'fc-toolbar ' + props.extraClassName}>
+      <div class={'fc-toolbar ' + props.extraClassName}>
         {this.renderSection('left', model.left)}
         {this.renderSection('left', model.left)}
         {this.renderSection('center', model.center)}
         {this.renderSection('center', model.center)}
         {this.renderSection('right', model.right)}
         {this.renderSection('right', model.right)}

+ 1 - 0
packages/core/src/View.ts

@@ -23,6 +23,7 @@ export interface ViewProps {
   eventSelection: string
   eventSelection: string
   eventDrag: EventInteractionState | null
   eventDrag: EventInteractionState | null
   eventResize: EventInteractionState | null
   eventResize: EventInteractionState | null
+  isHeightAuto: boolean
 }
 }
 
 
 export default abstract class View<State={}> extends DateComponent<ViewProps, State> {
 export default abstract class View<State={}> extends DateComponent<ViewProps, State> {

+ 14 - 0
packages/core/src/_view.scss

@@ -2,10 +2,24 @@
 /* View Structure
 /* View Structure
 --------------------------------------------------------------------------------------------------*/
 --------------------------------------------------------------------------------------------------*/
 
 
+.fc {
+  display: flex;
+  flex-direction: column;
+}
+
 .fc-view-container {
 .fc-view-container {
+  flex-grow: 1;
   position: relative;
   position: relative;
+
+  display: flex;
+  flex-direction: column;
+
+  > * {
+    flex-grow: 1;
+  }
 }
 }
 
 
+
 /* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
 /* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
 /* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
 /* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
 .fc-view-container *,
 .fc-view-container *,

+ 2 - 3
packages/core/src/main.ts

@@ -88,7 +88,6 @@ export {
   computeEdges,
   computeEdges,
   computeHeightAndMargins,
   computeHeightAndMargins,
   getClippingParents,
   getClippingParents,
-  computeClippingRect,
   computeRect
   computeRect
 } from './util/dom-geom'
 } from './util/dom-geom'
 
 
@@ -101,7 +100,7 @@ export { default as PositionCache } from './common/PositionCache'
 export { default as Scroller, ScrollerProps, ScrollbarWidths } from './common/Scroller'
 export { default as Scroller, ScrollerProps, ScrollbarWidths } from './common/Scroller'
 export { ScrollController, ElementScrollController, WindowScrollController } from './common/scroll-controller'
 export { ScrollController, ElementScrollController, WindowScrollController } from './common/scroll-controller'
 export { default as Theme } from './theme/Theme'
 export { default as Theme } from './theme/Theme'
-export { default as ComponentContext } from './component/ComponentContext'
+export { default as ComponentContext, ComponentContextType } from './component/ComponentContext'
 export { default as DateComponent, Seg, EventSegUiInteractionState } from './component/DateComponent'
 export { default as DateComponent, Seg, EventSegUiInteractionState } from './component/DateComponent'
 export { default as Calendar, DatePointTransform, DateSpanTransform, DateSelectionApi } from './Calendar'
 export { default as Calendar, DatePointTransform, DateSpanTransform, DateSelectionApi } from './Calendar'
 export { default as View, ViewProps, getViewClassNames } from './View'
 export { default as View, ViewProps, getViewClassNames } from './View'
@@ -174,5 +173,5 @@ export { default as EventApi } from './api/EventApi'
 export { default as requestJson } from './util/requestJson'
 export { default as requestJson } from './util/requestJson'
 
 
 export * from './vdom'
 export * from './vdom'
-export { subrenderer, SubRenderer, BaseComponent, setRef, renderVNodes } from './vdom-util'
+export { subrenderer, SubRenderer, BaseComponent, setRef, renderVNodes, buildMapSubRenderer } from './vdom-util'
 export { DelayedRunner } from './util/runner'
 export { DelayedRunner } from './util/runner'

+ 1 - 23
packages/core/src/util/dom-geom.ts

@@ -1,4 +1,4 @@
-import { Rect, intersectRects } from './geom'
+import { Rect } from './geom'
 import { sanitizeScrollbarWidth, getIsRtlScrollbarOnLeft } from './scrollbars'
 import { sanitizeScrollbarWidth, getIsRtlScrollbarOnLeft } from './scrollbars'
 
 
 export interface EdgeInfo {
 export interface EdgeInfo {
@@ -87,16 +87,6 @@ export function computeRect(el): Rect {
 }
 }
 
 
 
 
-function computeViewportRect(): Rect {
-  return {
-    left: window.pageXOffset,
-    right: window.pageXOffset + document.documentElement.clientWidth,
-    top: window.pageYOffset,
-    bottom: window.pageYOffset + document.documentElement.clientHeight
-  }
-}
-
-
 export function computeHeightAndMargins(el: HTMLElement) {
 export function computeHeightAndMargins(el: HTMLElement) {
   return el.getBoundingClientRect().height + computeVMargins(el)
   return el.getBoundingClientRect().height + computeVMargins(el)
 }
 }
@@ -130,15 +120,3 @@ export function getClippingParents(el: HTMLElement): HTMLElement[] {
 
 
   return parents
   return parents
 }
 }
-
-
-export function computeClippingRect(el: HTMLElement): Rect {
-  return getClippingParents(el)
-    .map(function(el) {
-      return computeInnerRect(el)
-    })
-    .concat(computeViewportRect())
-    .reduce(function(rect0, rect1) {
-      return intersectRects(rect0, rect1) || rect1 // should always intersect
-    })
-}

+ 50 - 0
packages/core/src/vdom-util.tsx

@@ -213,6 +213,56 @@ function buildFuncSubRenderer(renderFunc, unrenderFunc) {
 }
 }
 
 
 
 
+export function buildMapSubRenderer(subRendererClass: SubRendererClass<any>) {
+  let currentInstances = {}
+
+  function destroyAll() {
+    for (let key in currentInstances) {
+      currentInstances[key].destroy()
+    }
+    currentInstances = {}
+  }
+
+  return function(this: SubRendererOwner, propMap) { // what about passing in Context?
+    let context = this.context
+
+    if (!propMap) {
+      destroyAll()
+
+    } else {
+
+      for (let key in currentInstances) {
+        if (!propMap[key]) {
+          currentInstances[key].destroy()
+          delete currentInstances[key]
+        }
+      }
+
+      for (let key in propMap) {
+        let props = propMap[key]
+        let instance = currentInstances[key]
+
+        if (!instance) {
+          instance = currentInstances[key] = new subRendererClass(props, context) // TODO: pass in state???
+          instance.render(props, context)
+
+        } else if (
+          !compareObjs(props, instance.props, instance.propEquality) ||
+          !compareObjs(context, instance.context)
+        ) {
+          instance.unrender()
+          instance.props = props
+          instance.context = context
+          instance.render(props, context)
+        }
+      }
+    }
+
+    return currentInstances
+  }
+}
+
+
 function compareObjs(oldProps, newProps, equalityFuncs: EqualityFuncs<any> = {}) {
 function compareObjs(oldProps, newProps, equalityFuncs: EqualityFuncs<any> = {}) {
 
 
   if (oldProps === newProps) {
   if (oldProps === newProps) {

+ 1 - 1
packages/core/src/vdom.ts

@@ -1,5 +1,5 @@
 
 
-export { Component, render, h, createRef, VNode, Fragment, ComponentChildren, createContext, Ref, options as preactOptions } from 'preact'
+export { Component, render, createRef, VNode, Fragment, ComponentChildren, createContext, Ref, h, options as preactOptions, RefObject } from 'preact'
 import { Component, h, options, render } from 'preact'
 import { Component, h, options, render } from 'preact'