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

+ 8 - 12
packages/core/src/Calendar.tsx

@@ -24,7 +24,6 @@ import { buildViewSpecs, ViewSpecHash, ViewSpec } from './structs/view-spec'
 import { PluginSystem, PluginHooks } from './plugin-system'
 import CalendarComponent from './CalendarComponent'
 import { __assign } from 'tslib'
-import { refinePluginDefs } from './options'
 import DateComponent from './component/DateComponent'
 import { PointerDragEvent } from './interactions/pointer'
 import { InteractionSettingsInput, parseInteractionSettings, Interaction, interactionSettingsStore, InteractionClass } from './interactions/interaction'
@@ -36,6 +35,7 @@ import { render, h, createRef, flushToDom } from './vdom'
 import { TaskRunner, DelayedRunner } from './util/runner'
 import ViewApi from './ViewApi'
 import NowTimer, { NowTimerCallback } from './NowTimer'
+import { defaultPlugins } from './default-plugins'
 
 
 export interface DateClickApi extends DatePointApi {
@@ -123,7 +123,7 @@ export default class Calendar {
     this.el = el
 
     let optionsManager = this.optionsManager = new OptionsManager(overrides || {})
-    this.pluginSystem = new PluginSystem()
+    let pluginSystem = this.pluginSystem = new PluginSystem()
 
     let renderRunner = this.renderRunner = new DelayedRunner(
       this.updateComponent.bind(this)
@@ -138,7 +138,12 @@ export default class Calendar {
     )
     actionRunner.pause()
 
-    this.addPluginInputs(optionsManager.computed.plugins || []) // only do once. don't do in onOptionsChange. because can't remove plugins
+    // only do once. don't do in onOptionsChange. because can't remove plugins
+    let pluginDefs = defaultPlugins.concat(optionsManager.computed.plugins || [])
+    for (let pluginDef of pluginDefs) {
+      pluginSystem.add(pluginDef)
+    }
+
     this.onOptionsChange()
 
     this.publiclyTrigger('_init') // for tests
@@ -152,15 +157,6 @@ export default class Calendar {
   }
 
 
-  addPluginInputs(pluginInputs) {
-    let pluginDefs = refinePluginDefs(pluginInputs)
-
-    for (let pluginDef of pluginDefs) {
-      this.pluginSystem.add(pluginDef)
-    }
-  }
-
-
   // Public API for rendering
   // -----------------------------------------------------------------------------------------------------------------
 

+ 34 - 0
packages/core/src/default-plugins.ts

@@ -0,0 +1,34 @@
+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'
+import SimpleRecurrencePlugin from './structs/recurring-event-simple'
+import DefaultOptionChangeHandlers from './option-change-handlers'
+
+
+export let defaultPlugins: PluginDef[] = [
+  ArrayEventSourcePlugin,
+  FuncEventSourcePlugin,
+  JsonFeedEventSourcePlugin,
+  SimpleRecurrencePlugin,
+  DefaultOptionChangeHandlers
+]
+
+
+export function addDefaultPlugins(pluginDefs: PluginDef[]) {
+  defaultPlugins.push(...pluginDefs)
+}
+
+
+export function addDefaultPluginIfGlobal(pluginDef: PluginDef) {
+  if (isGlobal()) {
+    defaultPlugins.push(pluginDef)
+  }
+}
+
+
+function isGlobal() {
+  let globalNs = window['FullCalendar']
+  return globalNs && globalNs.addDefaultPluginIfGlobal === addDefaultPluginIfGlobal
+}

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

@@ -185,3 +185,4 @@ export { default as RefMap } from './util/RefMap'
 export { getIsRtlScrollbarOnLeft } from './util/scrollbar-side'
 
 export { default as NowTimer, NowTimerCallback } from './NowTimer'
+export { addDefaultPlugins, addDefaultPluginIfGlobal } from './default-plugins'

+ 0 - 41
packages/core/src/options.ts

@@ -1,11 +1,4 @@
 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'
-import SimpleRecurrencePlugin from './structs/recurring-event-simple'
-import { capitaliseFirstLetter } from './util/misc'
-import DefaultOptionChangeHandlers from './option-change-handlers'
 
 export const config = {} as any // TODO: make these options
 
@@ -120,37 +113,3 @@ let complexOptions = [ // names of options that are objects whose properties sho
 export function mergeOptions(optionObjs) {
   return mergeProps(optionObjs, complexOptions)
 }
-
-
-
-// TODO: move this stuff to a "plugin"-related file...
-
-const INTERNAL_PLUGINS: PluginDef[] = [
-  ArrayEventSourcePlugin,
-  FuncEventSourcePlugin,
-  JsonFeedEventSourcePlugin,
-  SimpleRecurrencePlugin,
-  DefaultOptionChangeHandlers
-]
-
-export function refinePluginDefs(pluginInputs: any[]): PluginDef[] {
-  let plugins = []
-
-  for (let pluginInput of pluginInputs) {
-
-    if (typeof pluginInput === 'string') {
-      let globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput)
-
-      if (!window[globalName]) {
-        console.warn('Plugin file not loaded for ' + pluginInput)
-      } else {
-        plugins.push(window[globalName].default) // is an ES6 module
-      }
-
-    } else {
-      plugins.push(pluginInput)
-    }
-  }
-
-  return INTERNAL_PLUGINS.concat(plugins)
-}