Skip to content

Commit

Permalink
use ReducerContext instead of Calendar in many plaecs
Browse files Browse the repository at this point in the history
  • Loading branch information
arshaw committed Apr 17, 2020
1 parent 4813e5b commit 456cace
Show file tree
Hide file tree
Showing 36 changed files with 379 additions and 355 deletions.
2 changes: 1 addition & 1 deletion packages-premium
17 changes: 9 additions & 8 deletions packages/core/src/Calendar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { removeExact } from './util/array'
import { guid } from './util/misc'
import { CssDimValue } from './scrollgrid/util'
import { applyStyleProp } from './util/dom-manip'
import { ReducerContext } from './reducers/ReducerContext'
import { CalendarStateReducer } from './reducers/CalendarStateReducer'
import { parseToolbars } from './toolbar-parse'
import { getNow } from './reducers/current-date'
Expand Down Expand Up @@ -231,7 +232,7 @@ export class Calendar {
this.renderableEventStore :
state.eventStore

let eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options)
let eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options, this.state)
let eventUiBySource = this.buildEventUiBySource(state.eventSources)
let eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource)

Expand Down Expand Up @@ -363,7 +364,7 @@ export class Calendar {
this.defaultAllDayEventDuration = createDuration(rawOptions.defaultAllDayEventDuration)
this.defaultTimedEventDuration = createDuration(rawOptions.defaultTimedEventDuration)

this.selectionConfig = buildSelectionConfig(rawOptions, this) // relies on dateEnv
this.selectionConfig = buildSelectionConfig(rawOptions, this.state)

this.toolbarConfig = parseToolbars(rawOptions, this.state.theme, rawOptions.direction === 'rtl', this)
}
Expand Down Expand Up @@ -840,7 +841,7 @@ export class Calendar {
}
}

let tuple = parseEvent(eventInput, sourceId, this)
let tuple = parseEvent(eventInput, sourceId, this.state)

if (tuple) {

Expand Down Expand Up @@ -956,7 +957,7 @@ export class Calendar {
return sourceInput
}

let eventSource = parseEventSource(sourceInput, this.state.pluginHooks, this)
let eventSource = parseEventSource(sourceInput, this.state)

if (eventSource) { // TODO: error otherwise?
this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [ eventSource ] })
Expand Down Expand Up @@ -997,16 +998,16 @@ export class Calendar {
// -----------------------------------------------------------------------------------------------------------------


function buildSelectionConfig(rawOptions, calendar: Calendar) {
return processScopedUiProps('select', rawOptions, calendar)
function buildSelectionConfig(rawOptions, context: ReducerContext) {
return processScopedUiProps('select', rawOptions, context)
}


function buildEventUiSingleBase(this: Calendar, rawOptions) { // DANGEROUS: `this` context must be a Calendar
function buildEventUiSingleBase(rawOptions, context: ReducerContext) {
if (rawOptions.editable) { // so 'editable' affected events
rawOptions = { ...rawOptions, eventEditable: true }
}
return processScopedUiProps('event', rawOptions, this)
return processScopedUiProps('event', rawOptions, context)
}


Expand Down
6 changes: 4 additions & 2 deletions packages/core/src/CalendarComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export class CalendarComponent extends Component<CalendarComponentProps, Calenda

private computeTitle = memoize(computeTitle)
private buildViewContext = memoize(buildViewContext)
private parseBusinessHours = memoize((input) => parseBusinessHours(input, this.props.calendar))
private parseBusinessHours = memoize((input) => parseBusinessHours(input, this.props))
private buildViewPropTransformers = memoize(buildViewPropTransformers)
private buildToolbarProps = memoize(buildToolbarProps)
private reportClassNames = memoize(reportClassNames)
Expand Down Expand Up @@ -110,8 +110,10 @@ export class CalendarComponent extends Component<CalendarComponentProps, Calenda
props.dateProfile,
props.dateProfileGenerator,
props.dateEnv,
props.pluginHooks,
props.theme,
props.pluginHooks,
props.dispatch,
props.emitter,
props.calendar
)

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/OptionsManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { globalDefaults, mergeOptions } from './options'
import { organizeRawLocales, buildLocale } from './datelib/locale'
import { __assign } from 'tslib'


export function compileOptions(overrides, dynamicOverrides, viewDefaults?, viewOverrides?) {
let locales = firstDefined( // explicit locale option given?
dynamicOverrides.locales,
Expand Down
1 change: 0 additions & 1 deletion packages/core/src/Toolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ export interface ToolbarContent {

export class Toolbar extends BaseComponent<ToolbarProps> {


render(props: ToolbarProps) {
let { model } = props
let forceLtr = false
Expand Down
20 changes: 10 additions & 10 deletions packages/core/src/common/slicing-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { EventInteractionState } from '../interactions/event-interaction-state'
import { Duration } from '../datelib/duration'
import { memoize } from '../util/memoize'
import { DateMarker, addMs, addDays } from '../datelib/marker'
import { Calendar } from '../Calendar'
import { ReducerContext } from '../reducers/ReducerContext'

export interface SliceableProps {
dateSelection: DateSpan
Expand Down Expand Up @@ -46,15 +46,15 @@ export abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []>
props: SliceableProps,
dateProfile: DateProfile,
nextDayThreshold: Duration | null,
calendar: Calendar,
context: ReducerContext,
...extraArgs: ExtraArgs
): SlicedProps<SegType> {
let { eventUiBases } = props
let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs)

return {
dateSelectionSegs: this.sliceDateSelection(props.dateSelection, eventUiBases, calendar, ...extraArgs),
businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, calendar, ...extraArgs),
dateSelectionSegs: this.sliceDateSelection(props.dateSelection, eventUiBases, context, ...extraArgs),
businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs),
fgEventSegs: eventSegs.fg,
bgEventSegs: eventSegs.bg,
eventDrag: this.sliceEventDrag(props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs),
Expand All @@ -65,13 +65,13 @@ export abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []>

sliceNowDate( // does not memoize
date: DateMarker,
calendar: Calendar,
context: ReducerContext,
...extraArgs: ExtraArgs
): SegType[] {
return this._sliceDateSpan(
{ range: { start: date, end: addMs(date, 1) }, allDay: false }, // add 1 ms, protect against null range
{},
calendar,
context,
...extraArgs
)
}
Expand All @@ -80,7 +80,7 @@ export abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []>
businessHours: EventStore,
dateProfile: DateProfile,
nextDayThreshold: Duration | null,
calendar: Calendar,
context: ReducerContext,
...extraArgs: ExtraArgs
): SegType[] {
if (!businessHours) {
Expand All @@ -91,7 +91,7 @@ export abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []>
expandRecurring(
businessHours,
computeActiveRange(dateProfile, Boolean(nextDayThreshold)),
calendar
context
),
{},
dateProfile,
Expand Down Expand Up @@ -153,14 +153,14 @@ export abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []>
private _sliceDateSpan(
dateSpan: DateSpan,
eventUiBases: EventUiHash,
calendar: Calendar,
context: ReducerContext,
...extraArgs: ExtraArgs
): SegType[] {
if (!dateSpan) {
return []
}

let eventRange = fabricateEventRange(dateSpan, eventUiBases, calendar)
let eventRange = fabricateEventRange(dateSpan, eventUiBases, context)
let segs = this.sliceRange(dateSpan.range, ...extraArgs)

for (let seg of segs) {
Expand Down
55 changes: 22 additions & 33 deletions packages/core/src/component/ComponentContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,31 @@ import { ResizeHandler } from '../Calendar'
import { ViewApi } from '../ViewApi'
import { Theme } from '../theme/Theme'
import { DateEnv } from '../datelib/env'
import { parseFieldSpecs } from '../util/misc'
import { createDuration, Duration } from '../datelib/duration'
import { PluginHooks } from '../plugin-system'
import { createContext } from '../vdom'
import { ScrollResponder, ScrollRequestHandler } from '../ScrollResponder'
import { DateProfile, DateProfileGenerator } from '../DateProfileGenerator'
import { ViewSpec } from '../structs/view-spec'
import { ReducerContext, buildComputedOptions } from '../reducers/ReducerContext'
import { Action } from '../reducers/types'
import { Emitter } from '../common/Emitter'


export const ComponentContextType = createContext<ComponentContext>({} as any) // for Components

// TODO: rename file
// TODO: rename to ViewContext

export interface ComponentContext {
export interface ComponentContext extends ReducerContext {
isRtl: boolean
theme: Theme
dateProfileGenerator: DateProfileGenerator
dateProfile: DateProfile
viewSpec: ViewSpec
viewApi: ViewApi
options: any
dateProfile: DateProfile
dateProfileGenerator: DateProfileGenerator
dateEnv: DateEnv
pluginHooks: PluginHooks
theme: Theme
calendar: Calendar

addResizeHandler: (handler: ResizeHandler) => void
removeResizeHandler: (handler: ResizeHandler) => void
createScrollResponder: (execFunc: ScrollRequestHandler) => ScrollResponder

// computed from options...
isRtl: boolean
eventOrderSpecs: any
nextDayThreshold: Duration
}


Expand All @@ -44,26 +37,33 @@ export function buildViewContext(
dateProfile: DateProfile,
dateProfileGenerator: DateProfileGenerator,
dateEnv: DateEnv,
pluginHooks: PluginHooks,
theme: Theme,
calendar: Calendar,
pluginHooks: PluginHooks,
dispatch: (action: Action) => void,
emitter: Emitter,
calendar: Calendar
): ComponentContext {
let { options } = viewSpec

return {
viewSpec,
viewApi: buildViewApi(viewSpec, viewTitle, dateProfile, dateEnv),
options: viewSpec.options,
dateProfile,
dateProfileGenerator,
dateEnv,
pluginHooks,
isRtl: options.direction === 'rtl',
theme,
options,
computedOptions: buildComputedOptions(options),
pluginHooks,
dispatch,
emitter,
calendar,
addResizeHandler: calendar.addResizeHandler,
removeResizeHandler: calendar.removeResizeHandler,
createScrollResponder(execFunc: ScrollRequestHandler) {
return new ScrollResponder(calendar, execFunc)
},
...computeContextProps(viewSpec.options, theme, calendar)
}
}
}

Expand All @@ -78,14 +78,3 @@ function buildViewApi(viewSpec: ViewSpec, viewTitle: string, dateProfile: DatePr
currentEnd: dateEnv.toDate(dateProfile.currentRange.end)
}
}


function computeContextProps(options: any, theme: Theme, calendar: Calendar) {
let isRtl = options.direction === 'rtl'

return {
isRtl,
eventOrderSpecs: parseFieldSpecs(options.eventOrder),
nextDayThreshold: createDuration(options.nextDayThreshold)
}
}
6 changes: 2 additions & 4 deletions packages/core/src/component/DateComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ export abstract class DateComponent<Props={}, State={}> extends BaseComponent<Pr
// -----------------------------------------------------------------------------------------------------------------

isInteractionValid(interaction: EventInteractionState) {
let { calendar } = this.context
let dateProfile = (this.props as any).dateProfile // HACK
let instances = interaction.mutatedEvents.instances

Expand All @@ -77,11 +76,10 @@ export abstract class DateComponent<Props={}, State={}> extends BaseComponent<Pr
}
}

return isInteractionValid(interaction, calendar)
return isInteractionValid(interaction, this.context)
}

isDateSelectionValid(selection: DateSpan): boolean {
let { calendar } = this.context
let dateProfile = (this.props as any).dateProfile // HACK

if (
Expand All @@ -91,7 +89,7 @@ export abstract class DateComponent<Props={}, State={}> extends BaseComponent<Pr
return false
}

return isDateSelectionValid(selection, calendar)
return isDateSelectionValid(selection, this.context)
}


Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/component/event-rendering.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,13 +225,13 @@ export interface EventMeta { // for *Content handlers


export function computeSegDraggable(seg: Seg, context: ComponentContext) {
let { pluginHooks, calendar } = context
let { pluginHooks } = context
let transformers = pluginHooks.isDraggableTransformers
let { def, ui } = seg.eventRange
let val = ui.startEditable

for (let transformer of transformers) {
val = transformer(val, def, ui, calendar)
val = transformer(val, def, ui, context)
}

return val
Expand Down
10 changes: 5 additions & 5 deletions packages/core/src/component/event-ui.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Constraint, AllowFunc, normalizeConstraint, ConstraintInput } from '../validation'
import { parseClassName } from '../util/html'
import { refineProps, capitaliseFirstLetter } from '../util/misc'
import { Calendar } from '../Calendar'
import { ReducerContext } from '../reducers/ReducerContext'

// TODO: better called "EventSettings" or "EventConfig"
// TODO: move this file into structs
Expand Down Expand Up @@ -53,9 +53,9 @@ export const UNSCOPED_EVENT_UI_PROPS = {
textColor: String
}

export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, calendar: Calendar, leftovers?): EventUi {
export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, context: ReducerContext, leftovers?): EventUi {
let props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers)
let constraint = normalizeConstraint(props.constraint, calendar)
let constraint = normalizeConstraint(props.constraint, context)

return {
display: props.display,
Expand All @@ -71,7 +71,7 @@ export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, calendar:
}
}

export function processScopedUiProps(prefix: string, rawScoped: any, calendar: Calendar, leftovers?): EventUi {
export function processScopedUiProps(prefix: string, rawScoped: any, context: ReducerContext, leftovers?): EventUi {
let rawUnscoped = {} as any
let wasFound = {} as any

Expand All @@ -93,7 +93,7 @@ export function processScopedUiProps(prefix: string, rawScoped: any, calendar: C
}
}

return processUnscopedUiProps(rawUnscoped, calendar)
return processUnscopedUiProps(rawUnscoped, context)
}

const EMPTY_EVENT_UI: EventUi = {
Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/interactions/event-dragging.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { Calendar } from '../Calendar'
import { EventMutation } from '../structs/event-mutation'
import { Hit } from './hit'
import { EventDef } from '../structs/event'
import { EventUi } from '../component/event-ui'
import { ReducerContext } from '../reducers/ReducerContext'

export type eventDragMutationMassager = (mutation: EventMutation, hit0: Hit, hit1: Hit) => void
export type EventDropTransformers = (mutation: EventMutation, calendar: Calendar) => any
export type eventIsDraggableTransformer = (val: boolean, eventDef: EventDef, eventUi: EventUi, Calendar: Calendar) => boolean
export type EventDropTransformers = (mutation: EventMutation, context: ReducerContext) => any
export type eventIsDraggableTransformer = (val: boolean, eventDef: EventDef, eventUi: EventUi, context: ReducerContext) => boolean
1 change: 1 addition & 0 deletions packages/core/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ export { DragMetaInput, DragMeta, parseDragMeta } from './structs/drag-meta'

export { createPlugin, PluginDef, PluginDefInput, ViewPropsTransformer, ViewContainerAppend } from './plugin-system'
export { reducerFunc, Action, CalendarState } from './reducers/types'
export { ReducerContext } from './reducers/ReducerContext'
export { CalendarComponentProps } from './CalendarComponent'

export { DayHeader } from './common/DayHeader'
Expand Down

0 comments on commit 456cace

Please sign in to comment.