Skip to content

Commit

Permalink
pluginify event source types
Browse files Browse the repository at this point in the history
  • Loading branch information
arshaw committed Jan 28, 2019
1 parent 602c160 commit 86dcdcd
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 35 deletions.
9 changes: 6 additions & 3 deletions src/core/event-sources/array-event-source.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { registerEventSourceDef } from '../structs/event-source'
import { createPlugin } from '../plugin-system'
import { EventSourceDef } from '../structs/event-source'
import { EventInput } from '../structs/event'

registerEventSourceDef({

let eventSourceDef: EventSourceDef = {
ignoreRange: true,

parseMeta(raw: any): EventInput[] | null {
Expand All @@ -19,5 +19,8 @@ registerEventSourceDef({
rawEvents: arg.eventSource.meta as EventInput[]
})
}
}

export default createPlugin({
eventSourceDefs: [ eventSourceDef ]
})
9 changes: 7 additions & 2 deletions src/core/event-sources/func-event-source.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { unpromisify } from '../util/promise'
import { registerEventSourceDef, EventSourceError } from '../structs/event-source'
import { EventSourceError, EventSourceDef } from '../structs/event-source'
import { EventInput } from '../structs/event'
import { createPlugin } from '../plugin-system'

export type EventSourceFunc = (
arg: {
Expand All @@ -13,7 +14,7 @@ export type EventSourceFunc = (
) => (void | PromiseLike<EventInput[]>)


registerEventSourceDef({
let eventSourceDef: EventSourceDef = {

parseMeta(raw: any): EventSourceFunc {
if (typeof raw === 'function') { // short form
Expand Down Expand Up @@ -43,4 +44,8 @@ registerEventSourceDef({
)
}

}

export default createPlugin({
eventSourceDefs: [ eventSourceDef ]
})
9 changes: 7 additions & 2 deletions src/core/event-sources/json-feed-event-source.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import request from 'superagent'
import Calendar from '../Calendar'
import { registerEventSourceDef } from '../structs/event-source'
import { EventSourceDef } from '../structs/event-source'
import { DateRange } from '../datelib/date-range'
import { __assign } from 'tslib'
import { createPlugin } from '../plugin-system'

interface JsonFeedMeta {
url: string
Expand All @@ -13,7 +14,7 @@ interface JsonFeedMeta {
timeZoneParam?: string
}

registerEventSourceDef({
let eventSourceDef: EventSourceDef = {

parseMeta(raw: any): JsonFeedMeta | null {
if (typeof raw === 'string') { // short form
Expand Down Expand Up @@ -66,6 +67,10 @@ registerEventSourceDef({
})
}

}

export default createPlugin({
eventSourceDefs: [ eventSourceDef ]
})

function buildRequestParams(meta: JsonFeedMeta, range: DateRange, calendar: Calendar) {
Expand Down
2 changes: 1 addition & 1 deletion src/core/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ export { NamedTimeZoneImpl, registerNamedTimeZoneImpl } from './datelib/timezone
export { registerCmdFormatter } from './datelib/formatting-cmd'
export { parse as parseMarker } from './datelib/parsing'

export { registerEventSourceDef, EventSource, EventSourceHash } from './structs/event-source'
export { EventSourceDef, EventSource, EventSourceHash } from './structs/event-source'

export { Interaction, InteractionSettings, interactionSettingsToStore, interactionSettingsStore, InteractionSettingsStore } from './interactions/interaction'
export { PointerDragEvent } from './interactions/pointer'
Expand Down
13 changes: 13 additions & 0 deletions src/core/options.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { mergeProps } from './util/object'
import { PluginDef } from './plugin-system'
import ArrayEventSourcePlugin from './event-sources/array-event-source'
import FuncEventSourcePlugin from './event-sources/func-event-source'
import JsonFeedEventSourcePlugin from './event-sources/json-feed-event-source'

export const globalHooks = {} as any // TODO: make these options

Expand Down Expand Up @@ -124,7 +127,17 @@ export function mergeOptions(optionObjs) {
}


const INTERNAL_PLUGINS: PluginDef[] = [
ArrayEventSourcePlugin,
FuncEventSourcePlugin,
JsonFeedEventSourcePlugin
]

export function getDefaultPlugins(): PluginDef[] {
return INTERNAL_PLUGINS.concat(getBrowserGlobalPlugins())
}

function getBrowserGlobalPlugins(): PluginDef[] {
let globalPluginHash = window['FullCalendarPlugins']
let plugins = []

Expand Down
12 changes: 9 additions & 3 deletions src/core/plugin-system.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { ExternalDefTransform } from './interactions/external-element-dragging'
import { InteractionClass } from './interactions/interaction'
import { ThemeClass } from './theme/Theme'
import { __assign } from 'tslib'
import { EventSourceDef } from './structs/event-source'

// TODO: easier way to add new hooks? need to update a million things

Expand All @@ -37,6 +38,7 @@ export interface PluginDefInput {
componentInteractions?: InteractionClass[]
calendarInteractions?: CalendarInteractionClass[]
themeClasses?: { [themeSystemName: string]: ThemeClass }
eventSourceDefs?: EventSourceDef[]
}

export interface PluginHooks {
Expand All @@ -58,6 +60,7 @@ export interface PluginHooks {
componentInteractions: InteractionClass[]
calendarInteractions: CalendarInteractionClass[]
themeClasses: { [themeSystemName: string]: ThemeClass }
eventSourceDefs: EventSourceDef[]
}

export interface PluginDef extends PluginHooks {
Expand Down Expand Up @@ -97,7 +100,8 @@ export function createPlugin(input: PluginDefInput): PluginDef {
eventDropTransformers: input.eventDropTransformers || [],
componentInteractions: input.componentInteractions || [],
calendarInteractions: input.calendarInteractions || [],
themeClasses: input.themeClasses || {}
themeClasses: input.themeClasses || {},
eventSourceDefs: input.eventSourceDefs || []
}
}

Expand Down Expand Up @@ -125,7 +129,8 @@ export class PluginSystem {
eventDropTransformers: [],
componentInteractions: [],
calendarInteractions: [],
themeClasses: {}
themeClasses: {},
eventSourceDefs: []
}
this.addedHash = {}
}
Expand Down Expand Up @@ -173,6 +178,7 @@ function combineHooks(hooks0: PluginHooks, hooks1: PluginHooks): PluginHooks {
eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses)
themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs)
}
}
12 changes: 6 additions & 6 deletions src/core/reducers/eventSources.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EventSource, EventSourceHash, getEventSourceDef, doesSourceNeedRange } from '../structs/event-source'
import { EventSource, EventSourceHash, doesSourceNeedRange } from '../structs/event-source'
import Calendar from '../Calendar'
import { arrayToHash, filterHash } from '../util/object'
import { DateRange } from '../datelib/date-range'
Expand Down Expand Up @@ -31,7 +31,7 @@ export default function(eventSources: EventSourceHash, action: Action, dateProfi
eventSources,
(action as any).sourceIds ?
arrayToHash((action as any).sourceIds) :
excludeStaticSources(eventSources),
excludeStaticSources(eventSources, calendar),
dateProfile ? dateProfile.activeRange : null,
calendar
)
Expand Down Expand Up @@ -88,7 +88,7 @@ function fetchDirtySources(sourceHash: EventSourceHash, fetchRange: DateRange, c

function isSourceDirty(eventSource: EventSource, fetchRange: DateRange, calendar: Calendar) {

if (!doesSourceNeedRange(eventSource)) {
if (!doesSourceNeedRange(eventSource, calendar)) {
return !eventSource.latestFetchId
} else {
return !calendar.opt('lazyFetching') ||
Expand Down Expand Up @@ -122,7 +122,7 @@ function fetchSourcesByIds(


function fetchSource(eventSource: EventSource, fetchRange: DateRange, calendar: Calendar) {
let sourceDef = getEventSourceDef(eventSource.sourceDefId)
let sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId]
let fetchId = String(uid++)

sourceDef.fetch(
Expand Down Expand Up @@ -205,8 +205,8 @@ function receiveResponse(sourceHash: EventSourceHash, sourceId: string, fetchId:
}


function excludeStaticSources(eventSources: EventSourceHash): EventSourceHash {
function excludeStaticSources(eventSources: EventSourceHash, calendar: Calendar): EventSourceHash {
return filterHash(eventSources, function(eventSource) {
return doesSourceNeedRange(eventSource)
return doesSourceNeedRange(eventSource, calendar)
})
}
16 changes: 4 additions & 12 deletions src/core/structs/event-source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,25 +106,17 @@ const SIMPLE_SOURCE_PROPS = {
failure: Function
}

let defs: EventSourceDef[] = []
let uid = 0

// NOTE: if we ever want to remove defs,
// we need to null out the entry in the array, not delete it,
// because our event source IDs rely on the index.
export function registerEventSourceDef(def: EventSourceDef) {
defs.push(def)
}

export function getEventSourceDef(id: number): EventSourceDef {
return defs[id]
}
export function doesSourceNeedRange(eventSource: EventSource, calendar: Calendar) {
let defs = calendar.pluginSystem.hooks.eventSourceDefs

export function doesSourceNeedRange(eventSource: EventSource) {
return !defs[eventSource.sourceDefId].ignoreRange
}

export function parseEventSource(raw: EventSourceInput, calendar: Calendar): EventSource | null {
let defs = calendar.pluginSystem.hooks.eventSourceDefs

for (let i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
let def = defs[i]
let meta = def.parseMeta(raw)
Expand Down
12 changes: 6 additions & 6 deletions src/gcal/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as request from 'superagent'
import { registerEventSourceDef, refineProps, addDays, DateEnv } from '@fullcalendar/core'
import { createPlugin, EventSourceDef, refineProps, addDays, DateEnv } from '@fullcalendar/core'

// TODO: expose somehow
const API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'
Expand All @@ -11,7 +11,7 @@ const STANDARD_PROPS = {
data: null
}

registerEventSourceDef({
let eventSourceDef: EventSourceDef = {

parseMeta(raw) {
if (typeof raw === 'string') {
Expand Down Expand Up @@ -80,7 +80,7 @@ registerEventSourceDef({
})
}
}
})
}


function parseGoogleCalendarId(url) {
Expand Down Expand Up @@ -174,6 +174,6 @@ function injectQsComponent(url, component) {
})
}

export default {
warning: 'TODO: convert fullcalendar-gcal to real plugin. will still work though.'
}
export default createPlugin({
eventSourceDefs: [ eventSourceDef ]
})

0 comments on commit 86dcdcd

Please sign in to comment.