@fullcalendar/core 4.3.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/main.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar Core Package v4.3.1
2
+ FullCalendar Core Package v4.4.0
3
3
  Docs & License: https://fullcalendar.io/
4
4
  (c) 2019 Adam Shaw
5
5
  */
@@ -2386,12 +2386,13 @@ function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshol
2386
2386
  function hasBgRendering(def) {
2387
2387
  return def.rendering === 'background' || def.rendering === 'inverse-background';
2388
2388
  }
2389
- function filterSegsViaEls(view, segs, isMirror) {
2390
- if (view.hasPublicHandlers('eventRender')) {
2389
+ function filterSegsViaEls(context, segs, isMirror) {
2390
+ var calendar = context.calendar, view = context.view;
2391
+ if (calendar.hasPublicHandlers('eventRender')) {
2391
2392
  segs = segs.filter(function (seg) {
2392
- var custom = view.publiclyTrigger('eventRender', [
2393
+ var custom = calendar.publiclyTrigger('eventRender', [
2393
2394
  {
2394
- event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance),
2395
+ event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
2395
2396
  isMirror: isMirror,
2396
2397
  isStart: seg.isStart,
2397
2398
  isEnd: seg.isEnd,
@@ -2438,6 +2439,65 @@ function compileEventUi(eventDef, eventUiBases) {
2438
2439
  uis.push(eventDef.ui);
2439
2440
  return combineEventUis(uis);
2440
2441
  }
2442
+ // triggers
2443
+ function triggerRenderedSegs(context, segs, isMirrors) {
2444
+ var calendar = context.calendar, view = context.view;
2445
+ if (calendar.hasPublicHandlers('eventPositioned')) {
2446
+ for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
2447
+ var seg = segs_2[_i];
2448
+ calendar.publiclyTriggerAfterSizing('eventPositioned', [
2449
+ {
2450
+ event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
2451
+ isMirror: isMirrors,
2452
+ isStart: seg.isStart,
2453
+ isEnd: seg.isEnd,
2454
+ el: seg.el,
2455
+ view: view
2456
+ }
2457
+ ]);
2458
+ }
2459
+ }
2460
+ if (!calendar.state.loadingLevel) { // avoid initial empty state while pending
2461
+ calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
2462
+ }
2463
+ }
2464
+ function triggerWillRemoveSegs(context, segs, isMirrors) {
2465
+ var calendar = context.calendar, view = context.view;
2466
+ for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
2467
+ var seg = segs_3[_i];
2468
+ calendar.trigger('eventElRemove', seg.el);
2469
+ }
2470
+ if (calendar.hasPublicHandlers('eventDestroy')) {
2471
+ for (var _a = 0, segs_4 = segs; _a < segs_4.length; _a++) {
2472
+ var seg = segs_4[_a];
2473
+ calendar.publiclyTrigger('eventDestroy', [
2474
+ {
2475
+ event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
2476
+ isMirror: isMirrors,
2477
+ el: seg.el,
2478
+ view: view
2479
+ }
2480
+ ]);
2481
+ }
2482
+ }
2483
+ }
2484
+ // is-interactable
2485
+ function computeEventDraggable(context, eventDef, eventUi) {
2486
+ var calendar = context.calendar, view = context.view;
2487
+ var transformers = calendar.pluginSystem.hooks.isDraggableTransformers;
2488
+ var val = eventUi.startEditable;
2489
+ for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
2490
+ var transformer = transformers_1[_i];
2491
+ val = transformer(val, eventDef, eventUi, view);
2492
+ }
2493
+ return val;
2494
+ }
2495
+ function computeEventStartResizable(context, eventDef, eventUi) {
2496
+ return eventUi.durationEditable && context.options.eventResizableFromStart;
2497
+ }
2498
+ function computeEventEndResizable(context, eventDef, eventUi) {
2499
+ return eventUi.durationEditable;
2500
+ }
2441
2501
 
2442
2502
  // applies the mutation to ALL defs/instances within the event store
2443
2503
  function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
@@ -3339,8 +3399,7 @@ function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
3339
3399
  // { date, type, forceOff }
3340
3400
  // `type` is a view-type like "day" or "week". default value is "day".
3341
3401
  // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
3342
- function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
3343
- var dateEnv = component.dateEnv;
3402
+ function buildGotoAnchorHtml(allOptions, dateEnv, gotoOptions, attrs, innerHtml) {
3344
3403
  var date;
3345
3404
  var type;
3346
3405
  var forceOff;
@@ -3363,7 +3422,7 @@ function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
3363
3422
  }
3364
3423
  attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
3365
3424
  innerHtml = innerHtml || '';
3366
- if (!forceOff && component.opt('navLinks')) {
3425
+ if (!forceOff && allOptions.navLinks) {
3367
3426
  return '<a' + attrs +
3368
3427
  ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
3369
3428
  innerHtml +
@@ -3375,12 +3434,12 @@ function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
3375
3434
  '</span>';
3376
3435
  }
3377
3436
  }
3378
- function getAllDayHtml(component) {
3379
- return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText'));
3437
+ function getAllDayHtml(allOptions) {
3438
+ return allOptions.allDayHtml || htmlEscape(allOptions.allDayText);
3380
3439
  }
3381
3440
  // Computes HTML classNames for a single-day element
3382
3441
  function getDayClasses(date, dateProfile, context, noThemeHighlight) {
3383
- var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv;
3442
+ var calendar = context.calendar, options = context.options, theme = context.theme, dateEnv = context.dateEnv;
3384
3443
  var classes = [];
3385
3444
  var todayStart;
3386
3445
  var todayEnd;
@@ -3389,7 +3448,7 @@ function getDayClasses(date, dateProfile, context, noThemeHighlight) {
3389
3448
  }
3390
3449
  else {
3391
3450
  classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
3392
- if (view.opt('monthMode') &&
3451
+ if (options.monthMode &&
3393
3452
  dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
3394
3453
  classes.push('fc-other-month');
3395
3454
  }
@@ -3854,34 +3913,54 @@ Theme.prototype.baseIconClass = '';
3854
3913
  Theme.prototype.iconOverridePrefix = '';
3855
3914
 
3856
3915
  var guid = 0;
3916
+ var ComponentContext = /** @class */ (function () {
3917
+ function ComponentContext(calendar, theme, dateEnv, options, view) {
3918
+ this.calendar = calendar;
3919
+ this.theme = theme;
3920
+ this.dateEnv = dateEnv;
3921
+ this.options = options;
3922
+ this.view = view;
3923
+ this.isRtl = options.dir === 'rtl';
3924
+ this.eventOrderSpecs = parseFieldSpecs(options.eventOrder);
3925
+ this.nextDayThreshold = createDuration(options.nextDayThreshold);
3926
+ }
3927
+ ComponentContext.prototype.extend = function (options, view) {
3928
+ return new ComponentContext(this.calendar, this.theme, this.dateEnv, options || this.options, view || this.view);
3929
+ };
3930
+ return ComponentContext;
3931
+ }());
3857
3932
  var Component = /** @class */ (function () {
3858
- function Component(context, isView) {
3859
- // HACK to populate view at top of component instantiation call chain
3860
- if (isView) {
3861
- context.view = this;
3862
- }
3933
+ function Component() {
3863
3934
  this.uid = String(guid++);
3864
- this.context = context;
3865
- this.dateEnv = context.dateEnv;
3866
- this.theme = context.theme;
3867
- this.view = context.view;
3868
- this.calendar = context.calendar;
3869
- this.isRtl = this.opt('dir') === 'rtl';
3870
3935
  }
3871
3936
  Component.addEqualityFuncs = function (newFuncs) {
3872
3937
  this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
3873
3938
  };
3874
- Component.prototype.opt = function (name) {
3875
- return this.context.options[name];
3876
- };
3877
- Component.prototype.receiveProps = function (props) {
3939
+ Component.prototype.receiveProps = function (props, context) {
3940
+ var oldContext = this.context;
3941
+ this.context = context;
3942
+ if (!oldContext) {
3943
+ this.firstContext(context);
3944
+ }
3878
3945
  var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
3879
3946
  this.props = comboProps;
3880
3947
  if (anyChanges) {
3881
- this.render(comboProps);
3948
+ if (oldContext) {
3949
+ this.beforeUpdate();
3950
+ }
3951
+ this.render(comboProps, context);
3952
+ if (oldContext) {
3953
+ this.afterUpdate();
3954
+ }
3882
3955
  }
3883
3956
  };
3884
- Component.prototype.render = function (props) {
3957
+ Component.prototype.render = function (props, context) {
3958
+ };
3959
+ Component.prototype.firstContext = function (context) {
3960
+ };
3961
+ Component.prototype.beforeUpdate = function () {
3962
+ };
3963
+ Component.prototype.afterUpdate = function () {
3885
3964
  };
3886
3965
  // after destroy is called, this component won't ever be used again
3887
3966
  Component.prototype.destroy = function () {
@@ -3923,8 +4002,8 @@ PURPOSES:
3923
4002
  */
3924
4003
  var DateComponent = /** @class */ (function (_super) {
3925
4004
  __extends(DateComponent, _super);
3926
- function DateComponent(context, el, isView) {
3927
- var _this = _super.call(this, context, isView) || this;
4005
+ function DateComponent(el) {
4006
+ var _this = _super.call(this) || this;
3928
4007
  _this.el = el;
3929
4008
  return _this;
3930
4009
  }
@@ -3932,38 +4011,6 @@ var DateComponent = /** @class */ (function (_super) {
3932
4011
  _super.prototype.destroy.call(this);
3933
4012
  removeElement(this.el);
3934
4013
  };
3935
- // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror)
3936
- //
3937
- // Event Drag-n-Drop Rendering (for both events and external elements)
3938
- // ---------------------------------------------------------------------------------------------------------------
3939
- /*
3940
- renderEventDragSegs(state: EventSegUiInteractionState) {
3941
- if (state) {
3942
- let { isEvent, segs, sourceSeg } = state
3943
-
3944
- if (this.eventRenderer) {
3945
- this.eventRenderer.hideByHash(state.affectedInstances)
3946
- }
3947
-
3948
- // if the user is dragging something that is considered an event with real event data,
3949
- // and this component likes to do drag mirrors OR the component where the seg came from
3950
- // likes to do drag mirrors, then render a drag mirror.
3951
- if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) {
3952
- if (this.mirrorRenderer) {
3953
- this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg })
3954
- }
3955
- }
3956
-
3957
- // if it would be impossible to render a drag mirror OR this component likes to render
3958
- // highlights, then render a highlight.
3959
- if (!isEvent || this.doesDragHighlight) {
3960
- if (this.fillRenderer) {
3961
- this.fillRenderer.renderSegs('highlight', segs)
3962
- }
3963
- }
3964
- }
3965
- }
3966
- */
3967
4014
  // Hit System
3968
4015
  // -----------------------------------------------------------------------------------------------------------------
3969
4016
  DateComponent.prototype.buildPositionCaches = function () {
@@ -3974,7 +4021,7 @@ var DateComponent = /** @class */ (function (_super) {
3974
4021
  // Validation
3975
4022
  // -----------------------------------------------------------------------------------------------------------------
3976
4023
  DateComponent.prototype.isInteractionValid = function (interaction) {
3977
- var calendar = this.calendar;
4024
+ var calendar = this.context.calendar;
3978
4025
  var dateProfile = this.props.dateProfile; // HACK
3979
4026
  var instances = interaction.mutatedEvents.instances;
3980
4027
  if (dateProfile) { // HACK for DayTile
@@ -3987,68 +4034,13 @@ var DateComponent = /** @class */ (function (_super) {
3987
4034
  return isInteractionValid(interaction, calendar);
3988
4035
  };
3989
4036
  DateComponent.prototype.isDateSelectionValid = function (selection) {
4037
+ var calendar = this.context.calendar;
3990
4038
  var dateProfile = this.props.dateProfile; // HACK
3991
4039
  if (dateProfile && // HACK for DayTile
3992
4040
  !rangeContainsRange(dateProfile.validRange, selection.range)) {
3993
4041
  return false;
3994
4042
  }
3995
- return isDateSelectionValid(selection, this.calendar);
3996
- };
3997
- // Triggering
3998
- // -----------------------------------------------------------------------------------------------------------------
3999
- // TODO: move to Calendar
4000
- DateComponent.prototype.publiclyTrigger = function (name, args) {
4001
- var calendar = this.calendar;
4002
- return calendar.publiclyTrigger(name, args);
4003
- };
4004
- DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) {
4005
- var calendar = this.calendar;
4006
- return calendar.publiclyTriggerAfterSizing(name, args);
4007
- };
4008
- DateComponent.prototype.hasPublicHandlers = function (name) {
4009
- var calendar = this.calendar;
4010
- return calendar.hasPublicHandlers(name);
4011
- };
4012
- DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) {
4013
- var calendar = this.calendar;
4014
- if (this.hasPublicHandlers('eventPositioned')) {
4015
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
4016
- var seg = segs_1[_i];
4017
- this.publiclyTriggerAfterSizing('eventPositioned', [
4018
- {
4019
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
4020
- isMirror: isMirrors,
4021
- isStart: seg.isStart,
4022
- isEnd: seg.isEnd,
4023
- el: seg.el,
4024
- view: this // safe to cast because this method is only called on context.view
4025
- }
4026
- ]);
4027
- }
4028
- }
4029
- if (!calendar.state.loadingLevel) { // avoid initial empty state while pending
4030
- calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
4031
- }
4032
- };
4033
- DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) {
4034
- var calendar = this.calendar;
4035
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
4036
- var seg = segs_2[_i];
4037
- calendar.trigger('eventElRemove', seg.el);
4038
- }
4039
- if (this.hasPublicHandlers('eventDestroy')) {
4040
- for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) {
4041
- var seg = segs_3[_a];
4042
- this.publiclyTrigger('eventDestroy', [
4043
- {
4044
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
4045
- isMirror: isMirrors,
4046
- el: seg.el,
4047
- view: this // safe to cast because this method is only called on context.view
4048
- }
4049
- ]);
4050
- }
4051
- }
4043
+ return isDateSelectionValid(selection, calendar);
4052
4044
  };
4053
4045
  // Pointer Interaction Utils
4054
4046
  // -----------------------------------------------------------------------------------------------------------------
@@ -4663,6 +4655,9 @@ var OptionsManager = /** @class */ (function () {
4663
4655
  this.compute();
4664
4656
  }
4665
4657
  OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
4658
+ if (!Object.keys(updates).length && !removals.length) {
4659
+ return;
4660
+ }
4666
4661
  var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
4667
4662
  __assign(overrideHash, updates);
4668
4663
  for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
@@ -5173,6 +5168,7 @@ function isSourceDirty(eventSource, fetchRange, calendar) {
5173
5168
  else {
5174
5169
  return !calendar.opt('lazyFetching') ||
5175
5170
  !eventSource.fetchRange ||
5171
+ eventSource.isFetching || // always cancel outdated in-progress fetches
5176
5172
  fetchRange.start < eventSource.fetchRange.start ||
5177
5173
  fetchRange.end > eventSource.fetchRange.end;
5178
5174
  }
@@ -5240,7 +5236,8 @@ function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
5240
5236
  var eventSource = sourceHash[sourceId];
5241
5237
  if (eventSource && // not already removed
5242
5238
  fetchId === eventSource.latestFetchId) {
5243
- return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a));
5239
+ return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange // also serves as a marker that at least one fetch has completed
5240
+ }), _a));
5244
5241
  }
5245
5242
  return sourceHash;
5246
5243
  }
@@ -5978,8 +5975,8 @@ function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
5978
5975
 
5979
5976
  var Toolbar = /** @class */ (function (_super) {
5980
5977
  __extends(Toolbar, _super);
5981
- function Toolbar(context, extraClassName) {
5982
- var _this = _super.call(this, context) || this;
5978
+ function Toolbar(extraClassName) {
5979
+ var _this = _super.call(this) || this;
5983
5980
  _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
5984
5981
  _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
5985
5982
  _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
@@ -6014,7 +6011,7 @@ var Toolbar = /** @class */ (function (_super) {
6014
6011
  };
6015
6012
  Toolbar.prototype.renderSection = function (position, buttonStr) {
6016
6013
  var _this = this;
6017
- var _a = this, theme = _a.theme, calendar = _a.calendar;
6014
+ var _a = this.context, theme = _a.theme, calendar = _a.calendar;
6018
6015
  var optionsManager = calendar.optionsManager;
6019
6016
  var viewSpecs = calendar.viewSpecs;
6020
6017
  var sectionEl = createElement('div', { className: 'fc-' + position });
@@ -6122,7 +6119,8 @@ var Toolbar = /** @class */ (function (_super) {
6122
6119
  });
6123
6120
  };
6124
6121
  Toolbar.prototype.updateActiveButton = function (buttonName) {
6125
- var className = this.theme.getClass('buttonActive');
6122
+ var theme = this.context.theme;
6123
+ var className = theme.getClass('buttonActive');
6126
6124
  findElements(this.el, 'button').forEach(function (buttonEl) {
6127
6125
  if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
6128
6126
  buttonEl.classList.add(className);
@@ -6142,24 +6140,29 @@ var Toolbar = /** @class */ (function (_super) {
6142
6140
 
6143
6141
  var CalendarComponent = /** @class */ (function (_super) {
6144
6142
  __extends(CalendarComponent, _super);
6145
- function CalendarComponent(context, el) {
6146
- var _this = _super.call(this, context) || this;
6147
- _this._renderToolbars = memoizeRendering(_this.renderToolbars);
6143
+ function CalendarComponent(el) {
6144
+ var _this = _super.call(this) || this;
6145
+ _this.elClassNames = [];
6146
+ _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
6147
+ _this.renderToolbars = memoizeRendering(_this._renderToolbars, _this._unrenderToolbars, [_this.renderSkeleton]);
6148
+ _this.buildComponentContext = memoize(buildComponentContext);
6148
6149
  _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
6149
6150
  _this.el = el;
6150
- prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' }));
6151
- var calendar = _this.calendar;
6152
- for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
6153
- var modifyViewContainer = _a[_i];
6154
- modifyViewContainer(_this.contentEl, calendar);
6155
- }
6156
- _this.toggleElClassNames(true);
6157
6151
  _this.computeTitle = memoize(computeTitle);
6158
6152
  _this.parseBusinessHours = memoize(function (input) {
6159
- return parseBusinessHours(input, _this.calendar);
6153
+ return parseBusinessHours(input, _this.context.calendar);
6160
6154
  });
6161
6155
  return _this;
6162
6156
  }
6157
+ CalendarComponent.prototype.render = function (props, context) {
6158
+ this.freezeHeight();
6159
+ var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
6160
+ this.renderSkeleton(context);
6161
+ this.renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, title);
6162
+ this.renderView(props, title);
6163
+ this.updateSize();
6164
+ this.thawHeight();
6165
+ };
6163
6166
  CalendarComponent.prototype.destroy = function () {
6164
6167
  if (this.header) {
6165
6168
  this.header.destroy();
@@ -6167,40 +6170,57 @@ var CalendarComponent = /** @class */ (function (_super) {
6167
6170
  if (this.footer) {
6168
6171
  this.footer.destroy();
6169
6172
  }
6173
+ this.renderSkeleton.unrender(); // will call destroyView
6174
+ _super.prototype.destroy.call(this);
6175
+ };
6176
+ CalendarComponent.prototype._renderSkeleton = function (context) {
6177
+ this.updateElClassNames(context);
6178
+ prependToElement(this.el, this.contentEl = createElement('div', { className: 'fc-view-container' }));
6179
+ var calendar = context.calendar;
6180
+ for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
6181
+ var modifyViewContainer = _a[_i];
6182
+ modifyViewContainer(this.contentEl, calendar);
6183
+ }
6184
+ };
6185
+ CalendarComponent.prototype._unrenderSkeleton = function () {
6186
+ // weird to have this here
6170
6187
  if (this.view) {
6188
+ this.savedScroll = this.view.queryScroll();
6171
6189
  this.view.destroy();
6190
+ this.view = null;
6172
6191
  }
6173
6192
  removeElement(this.contentEl);
6174
- this.toggleElClassNames(false);
6175
- _super.prototype.destroy.call(this);
6193
+ this.removeElClassNames();
6176
6194
  };
6177
- CalendarComponent.prototype.toggleElClassNames = function (bool) {
6195
+ CalendarComponent.prototype.removeElClassNames = function () {
6178
6196
  var classList = this.el.classList;
6179
- var dirClassName = 'fc-' + this.opt('dir');
6180
- var themeClassName = this.theme.getClass('widget');
6181
- if (bool) {
6182
- classList.add('fc');
6183
- classList.add(dirClassName);
6184
- classList.add(themeClassName);
6185
- }
6186
- else {
6187
- classList.remove('fc');
6188
- classList.remove(dirClassName);
6189
- classList.remove(themeClassName);
6190
- }
6191
- };
6192
- CalendarComponent.prototype.render = function (props) {
6193
- this.freezeHeight();
6194
- var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
6195
- this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title);
6196
- this.renderView(props, title);
6197
- this.updateSize();
6198
- this.thawHeight();
6199
- };
6200
- CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) {
6201
- var headerLayout = this.opt('header');
6202
- var footerLayout = this.opt('footer');
6203
- var now = this.calendar.getNow();
6197
+ for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
6198
+ var className = _a[_i];
6199
+ classList.remove(className);
6200
+ }
6201
+ this.elClassNames = [];
6202
+ };
6203
+ CalendarComponent.prototype.updateElClassNames = function (context) {
6204
+ this.removeElClassNames();
6205
+ var theme = context.theme, options = context.options;
6206
+ this.elClassNames = [
6207
+ 'fc',
6208
+ 'fc-' + options.dir,
6209
+ theme.getClass('widget')
6210
+ ];
6211
+ var classList = this.el.classList;
6212
+ for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
6213
+ var className = _a[_i];
6214
+ classList.add(className);
6215
+ }
6216
+ };
6217
+ CalendarComponent.prototype._renderToolbars = function (viewSpec, dateProfile, currentDate, title) {
6218
+ var _a = this, context = _a.context, header = _a.header, footer = _a.footer;
6219
+ var options = context.options, calendar = context.calendar;
6220
+ var headerLayout = options.header;
6221
+ var footerLayout = options.footer;
6222
+ var dateProfileGenerator = this.props.dateProfileGenerator;
6223
+ var now = calendar.getNow();
6204
6224
  var todayInfo = dateProfileGenerator.build(now);
6205
6225
  var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
6206
6226
  var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
@@ -6212,48 +6232,55 @@ var CalendarComponent = /** @class */ (function (_super) {
6212
6232
  isNextEnabled: nextInfo.isValid
6213
6233
  };
6214
6234
  if (headerLayout) {
6215
- if (!this.header) {
6216
- this.header = new Toolbar(this.context, 'fc-header-toolbar');
6217
- prependToElement(this.el, this.header.el);
6235
+ if (!header) {
6236
+ header = this.header = new Toolbar('fc-header-toolbar');
6237
+ prependToElement(this.el, header.el);
6218
6238
  }
6219
- this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps));
6239
+ header.receiveProps(__assign({ layout: headerLayout }, toolbarProps), context);
6220
6240
  }
6221
- else if (this.header) {
6222
- this.header.destroy();
6223
- this.header = null;
6241
+ else if (header) {
6242
+ header.destroy();
6243
+ header = this.header = null;
6224
6244
  }
6225
6245
  if (footerLayout) {
6226
- if (!this.footer) {
6227
- this.footer = new Toolbar(this.context, 'fc-footer-toolbar');
6228
- appendToElement(this.el, this.footer.el);
6246
+ if (!footer) {
6247
+ footer = this.footer = new Toolbar('fc-footer-toolbar');
6248
+ appendToElement(this.el, footer.el);
6229
6249
  }
6230
- this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps));
6250
+ footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps), context);
6251
+ }
6252
+ else if (footer) {
6253
+ footer.destroy();
6254
+ footer = this.footer = null;
6255
+ }
6256
+ };
6257
+ CalendarComponent.prototype._unrenderToolbars = function () {
6258
+ if (this.header) {
6259
+ this.header.destroy();
6260
+ this.header = null;
6231
6261
  }
6232
- else if (this.footer) {
6262
+ if (this.footer) {
6233
6263
  this.footer.destroy();
6234
6264
  this.footer = null;
6235
6265
  }
6236
6266
  };
6237
6267
  CalendarComponent.prototype.renderView = function (props, title) {
6238
6268
  var view = this.view;
6269
+ var _a = this.context, calendar = _a.calendar, options = _a.options;
6239
6270
  var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
6240
6271
  if (!view || view.viewSpec !== viewSpec) {
6241
6272
  if (view) {
6242
6273
  view.destroy();
6243
6274
  }
6244
- view = this.view = new viewSpec['class']({
6245
- calendar: this.calendar,
6246
- view: null,
6247
- dateEnv: this.dateEnv,
6248
- theme: this.theme,
6249
- options: viewSpec.options
6250
- }, viewSpec, dateProfileGenerator, this.contentEl);
6251
- }
6252
- else {
6253
- view.addScroll(view.queryScroll());
6275
+ view = this.view = new viewSpec['class'](viewSpec, this.contentEl);
6276
+ if (this.savedScroll) {
6277
+ view.addScroll(this.savedScroll, true);
6278
+ this.savedScroll = null;
6279
+ }
6254
6280
  }
6255
6281
  view.title = title; // for the API
6256
6282
  var viewProps = {
6283
+ dateProfileGenerator: dateProfileGenerator,
6257
6284
  dateProfile: props.dateProfile,
6258
6285
  businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
6259
6286
  eventStore: props.eventStore,
@@ -6263,20 +6290,20 @@ var CalendarComponent = /** @class */ (function (_super) {
6263
6290
  eventDrag: props.eventDrag,
6264
6291
  eventResize: props.eventResize
6265
6292
  };
6266
- var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);
6293
+ var transformers = this.buildViewPropTransformers(calendar.pluginSystem.hooks.viewPropsTransformers);
6267
6294
  for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
6268
6295
  var transformer = transformers_1[_i];
6269
- __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view));
6296
+ __assign(viewProps, transformer.transform(viewProps, viewSpec, props, options));
6270
6297
  }
6271
- view.receiveProps(viewProps);
6298
+ view.receiveProps(viewProps, this.buildComponentContext(this.context, viewSpec, view));
6272
6299
  };
6273
6300
  // Sizing
6274
6301
  // -----------------------------------------------------------------------------------------------------------------
6275
6302
  CalendarComponent.prototype.updateSize = function (isResize) {
6276
6303
  if (isResize === void 0) { isResize = false; }
6277
6304
  var view = this.view;
6278
- if (isResize) {
6279
- view.addScroll(view.queryScroll());
6305
+ if (!view) {
6306
+ return; // why?
6280
6307
  }
6281
6308
  if (isResize || this.isHeightAuto == null) {
6282
6309
  this.computeHeightVars();
@@ -6286,7 +6313,7 @@ var CalendarComponent = /** @class */ (function (_super) {
6286
6313
  view.popScroll(isResize);
6287
6314
  };
6288
6315
  CalendarComponent.prototype.computeHeightVars = function () {
6289
- var calendar = this.calendar; // yuck. need to handle dynamic options
6316
+ var calendar = this.context.calendar; // yuck. need to handle dynamic options
6290
6317
  var heightInput = calendar.opt('height');
6291
6318
  var contentHeightInput = calendar.opt('contentHeight');
6292
6319
  this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
@@ -6349,7 +6376,7 @@ function computeTitle(dateProfile, viewOptions) {
6349
6376
  else { // for day units or smaller, use the actual day range
6350
6377
  range = dateProfile.activeRange;
6351
6378
  }
6352
- return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
6379
+ return this.context.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
6353
6380
  }
6354
6381
  // Generates the format string that should be used to generate the title for the current date range.
6355
6382
  // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
@@ -6373,6 +6400,10 @@ function computeTitleFormat(dateProfile) {
6373
6400
  }
6374
6401
  }
6375
6402
  }
6403
+ // build a context scoped to the view
6404
+ function buildComponentContext(context, viewSpec, view) {
6405
+ return context.extend(viewSpec.options, view);
6406
+ }
6376
6407
  // Plugin
6377
6408
  // -----------------------------------------------------------------------------------------------------------------
6378
6409
  function buildViewPropTransformers(theClasses) {
@@ -6414,6 +6445,7 @@ var EventClicking = /** @class */ (function (_super) {
6414
6445
  var _this = _super.call(this, settings) || this;
6415
6446
  _this.handleSegClick = function (ev, segEl) {
6416
6447
  var component = _this.component;
6448
+ var _a = component.context, calendar = _a.calendar, view = _a.view;
6417
6449
  var seg = getElSeg(segEl);
6418
6450
  if (seg && // might be the <div> surrounding the more link
6419
6451
  component.isValidSegDownEl(ev.target)) {
@@ -6421,12 +6453,12 @@ var EventClicking = /** @class */ (function (_super) {
6421
6453
  // grab before trigger fired in case trigger trashes DOM thru rerendering
6422
6454
  var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
6423
6455
  var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
6424
- component.publiclyTrigger('eventClick', [
6456
+ calendar.publiclyTrigger('eventClick', [
6425
6457
  {
6426
6458
  el: segEl,
6427
- event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance),
6459
+ event: new EventApi(component.context.calendar, seg.eventRange.def, seg.eventRange.instance),
6428
6460
  jsEvent: ev,
6429
- view: component.view
6461
+ view: view
6430
6462
  }
6431
6463
  ]);
6432
6464
  if (url && !ev.defaultPrevented) {
@@ -6471,23 +6503,25 @@ var EventHovering = /** @class */ (function (_super) {
6471
6503
  };
6472
6504
  var component = settings.component;
6473
6505
  _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
6474
- component.calendar.on('eventElRemove', _this.handleEventElRemove);
6506
+ // how to make sure component already has context?
6507
+ component.context.calendar.on('eventElRemove', _this.handleEventElRemove);
6475
6508
  return _this;
6476
6509
  }
6477
6510
  EventHovering.prototype.destroy = function () {
6478
6511
  this.removeHoverListeners();
6479
- this.component.calendar.off('eventElRemove', this.handleEventElRemove);
6512
+ this.component.context.calendar.off('eventElRemove', this.handleEventElRemove);
6480
6513
  };
6481
6514
  EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
6482
6515
  var component = this.component;
6516
+ var _a = component.context, calendar = _a.calendar, view = _a.view;
6483
6517
  var seg = getElSeg(segEl);
6484
6518
  if (!ev || component.isValidSegDownEl(ev.target)) {
6485
- component.publiclyTrigger(publicEvName, [
6519
+ calendar.publiclyTrigger(publicEvName, [
6486
6520
  {
6487
6521
  el: segEl,
6488
- event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance),
6522
+ event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
6489
6523
  jsEvent: ev,
6490
- view: component.view
6524
+ view: view
6491
6525
  }
6492
6526
  ]);
6493
6527
  }
@@ -6532,6 +6566,7 @@ StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
6532
6566
  var Calendar = /** @class */ (function () {
6533
6567
  function Calendar(el, overrides) {
6534
6568
  var _this = this;
6569
+ this.buildComponentContext = memoize(buildComponentContext$1);
6535
6570
  this.parseRawLocales = memoize(parseRawLocales);
6536
6571
  this.buildLocale = memoize(buildLocale);
6537
6572
  this.buildDateEnv = memoize(buildDateEnv);
@@ -6545,7 +6580,6 @@ var Calendar = /** @class */ (function () {
6545
6580
  this.isReducing = false;
6546
6581
  // isDisplaying: boolean = false // installed in DOM? accepting renders?
6547
6582
  this.needsRerender = false; // needs a render?
6548
- this.needsFullRerender = false;
6549
6583
  this.isRendering = false; // currently in the executeRender function?
6550
6584
  this.renderingPauseDepth = 0;
6551
6585
  this.buildDelayedRerender = memoize(buildDelayedRerender);
@@ -6585,12 +6619,13 @@ var Calendar = /** @class */ (function () {
6585
6619
  // -----------------------------------------------------------------------------------------------------------------
6586
6620
  Calendar.prototype.render = function () {
6587
6621
  if (!this.component) {
6622
+ this.component = new CalendarComponent(this.el);
6588
6623
  this.renderableEventStore = createEmptyEventStore();
6589
6624
  this.bindHandlers();
6590
6625
  this.executeRender();
6591
6626
  }
6592
6627
  else {
6593
- this.requestRerender(true);
6628
+ this.requestRerender();
6594
6629
  }
6595
6630
  };
6596
6631
  Calendar.prototype.destroy = function () {
@@ -6699,12 +6734,12 @@ var Calendar = /** @class */ (function () {
6699
6734
  this.publiclyTrigger('loading', [false]);
6700
6735
  }
6701
6736
  var view = this.component && this.component.view;
6702
- if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) {
6737
+ if (oldState.eventStore !== newState.eventStore) {
6703
6738
  if (oldState.eventStore) {
6704
6739
  this.isEventsUpdated = true;
6705
6740
  }
6706
6741
  }
6707
- if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) {
6742
+ if (oldState.dateProfile !== newState.dateProfile) {
6708
6743
  if (oldState.dateProfile && view) { // why would view be null!?
6709
6744
  this.publiclyTrigger('datesDestroy', [
6710
6745
  {
@@ -6715,7 +6750,7 @@ var Calendar = /** @class */ (function () {
6715
6750
  }
6716
6751
  this.isDatesUpdated = true;
6717
6752
  }
6718
- if (oldState.viewType !== newState.viewType || this.needsFullRerender) {
6753
+ if (oldState.viewType !== newState.viewType) {
6719
6754
  if (oldState.viewType && view) { // why would view be null!?
6720
6755
  this.publiclyTrigger('viewSkeletonDestroy', [
6721
6756
  {
@@ -6734,10 +6769,8 @@ var Calendar = /** @class */ (function () {
6734
6769
  };
6735
6770
  // Render Queue
6736
6771
  // -----------------------------------------------------------------------------------------------------------------
6737
- Calendar.prototype.requestRerender = function (needsFull) {
6738
- if (needsFull === void 0) { needsFull = false; }
6772
+ Calendar.prototype.requestRerender = function () {
6739
6773
  this.needsRerender = true;
6740
- this.needsFullRerender = this.needsFullRerender || needsFull;
6741
6774
  this.delayedRerender(); // will call a debounced-version of tryRerender
6742
6775
  };
6743
6776
  Calendar.prototype.tryRerender = function () {
@@ -6760,12 +6793,10 @@ var Calendar = /** @class */ (function () {
6760
6793
  // Rendering
6761
6794
  // -----------------------------------------------------------------------------------------------------------------
6762
6795
  Calendar.prototype.executeRender = function () {
6763
- var needsFullRerender = this.needsFullRerender; // save before clearing
6764
6796
  // clear these BEFORE the render so that new values will accumulate during render
6765
6797
  this.needsRerender = false;
6766
- this.needsFullRerender = false;
6767
6798
  this.isRendering = true;
6768
- this.renderComponent(needsFullRerender);
6799
+ this.renderComponent();
6769
6800
  this.isRendering = false;
6770
6801
  // received a rerender request while rendering
6771
6802
  if (this.needsRerender) {
@@ -6775,11 +6806,10 @@ var Calendar = /** @class */ (function () {
6775
6806
  /*
6776
6807
  don't call this directly. use executeRender instead
6777
6808
  */
6778
- Calendar.prototype.renderComponent = function (needsFull) {
6809
+ Calendar.prototype.renderComponent = function () {
6779
6810
  var _a = this, state = _a.state, component = _a.component;
6780
6811
  var viewType = state.viewType;
6781
6812
  var viewSpec = this.viewSpecs[viewType];
6782
- var savedScroll = (needsFull && component) ? component.view.queryScroll() : null;
6783
6813
  if (!viewSpec) {
6784
6814
  throw new Error("View type \"" + viewType + "\" is not valid");
6785
6815
  }
@@ -6792,26 +6822,7 @@ var Calendar = /** @class */ (function () {
6792
6822
  var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
6793
6823
  var eventUiBySource = this.buildEventUiBySource(state.eventSources);
6794
6824
  var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
6795
- if (needsFull || !component) {
6796
- if (component) {
6797
- component.freezeHeight(); // next component will unfreeze it
6798
- component.destroy();
6799
- }
6800
- component = this.component = new CalendarComponent({
6801
- calendar: this,
6802
- view: null,
6803
- dateEnv: this.dateEnv,
6804
- theme: this.theme,
6805
- options: this.optionsManager.computed
6806
- }, this.el);
6807
- this.isViewUpdated = true;
6808
- this.isDatesUpdated = true;
6809
- this.isEventsUpdated = true;
6810
- }
6811
- component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }));
6812
- if (savedScroll) {
6813
- component.view.applyScroll(savedScroll, false);
6814
- }
6825
+ component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfileGenerator: this.dateProfileGenerators[viewType], dateProfile: state.dateProfile, eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }), this.buildComponentContext(this.theme, this.dateEnv, this.optionsManager.computed));
6815
6826
  if (this.isViewUpdated) {
6816
6827
  this.isViewUpdated = false;
6817
6828
  this.publiclyTrigger('viewSkeletonRender', [
@@ -6888,7 +6899,6 @@ var Calendar = /** @class */ (function () {
6888
6899
  this.optionsManager.mutate(normalUpdates, removals, isDynamic);
6889
6900
  if (anyDifficultOptions) {
6890
6901
  this.handleOptions(this.optionsManager.computed);
6891
- this.needsFullRerender = true;
6892
6902
  }
6893
6903
  this.batchRendering(function () {
6894
6904
  if (anyDifficultOptions) {
@@ -6899,7 +6909,7 @@ var Calendar = /** @class */ (function () {
6899
6909
  });
6900
6910
  }
6901
6911
  /* HACK
6902
- has the same effect as calling this.requestRerender(true)
6912
+ has the same effect as calling this.requestRerender()
6903
6913
  but recomputes the state's dateProfile
6904
6914
  */
6905
6915
  _this.dispatch({
@@ -7405,6 +7415,9 @@ var Calendar = /** @class */ (function () {
7405
7415
  EmitterMixin.mixInto(Calendar);
7406
7416
  // for memoizers
7407
7417
  // -----------------------------------------------------------------------------------------------------------------
7418
+ function buildComponentContext$1(theme, dateEnv, options) {
7419
+ return new ComponentContext(this, theme, dateEnv, options, null);
7420
+ }
7408
7421
  function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
7409
7422
  return new DateEnv({
7410
7423
  calendarSystem: 'gregory',
@@ -7446,9 +7459,8 @@ function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
7446
7459
 
7447
7460
  var View = /** @class */ (function (_super) {
7448
7461
  __extends(View, _super);
7449
- function View(context, viewSpec, dateProfileGenerator, parentEl) {
7450
- var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK)
7451
- ) || this;
7462
+ function View(viewSpec, parentEl) {
7463
+ var _this = _super.call(this, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' })) || this;
7452
7464
  _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
7453
7465
  _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
7454
7466
  _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
@@ -7457,10 +7469,7 @@ var View = /** @class */ (function (_super) {
7457
7469
  _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
7458
7470
  _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
7459
7471
  _this.viewSpec = viewSpec;
7460
- _this.dateProfileGenerator = dateProfileGenerator;
7461
7472
  _this.type = viewSpec.type;
7462
- _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder'));
7463
- _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold'));
7464
7473
  parentEl.appendChild(_this.el);
7465
7474
  _this.initialize();
7466
7475
  return _this;
@@ -7471,35 +7480,35 @@ var View = /** @class */ (function (_super) {
7471
7480
  // Date Setting/Unsetting
7472
7481
  // -----------------------------------------------------------------------------------------------------------------
7473
7482
  get: function () {
7474
- return this.dateEnv.toDate(this.props.dateProfile.activeRange.start);
7483
+ return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start);
7475
7484
  },
7476
7485
  enumerable: true,
7477
7486
  configurable: true
7478
7487
  });
7479
7488
  Object.defineProperty(View.prototype, "activeEnd", {
7480
7489
  get: function () {
7481
- return this.dateEnv.toDate(this.props.dateProfile.activeRange.end);
7490
+ return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end);
7482
7491
  },
7483
7492
  enumerable: true,
7484
7493
  configurable: true
7485
7494
  });
7486
7495
  Object.defineProperty(View.prototype, "currentStart", {
7487
7496
  get: function () {
7488
- return this.dateEnv.toDate(this.props.dateProfile.currentRange.start);
7497
+ return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start);
7489
7498
  },
7490
7499
  enumerable: true,
7491
7500
  configurable: true
7492
7501
  });
7493
7502
  Object.defineProperty(View.prototype, "currentEnd", {
7494
7503
  get: function () {
7495
- return this.dateEnv.toDate(this.props.dateProfile.currentRange.end);
7504
+ return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end);
7496
7505
  },
7497
7506
  enumerable: true,
7498
7507
  configurable: true
7499
7508
  });
7500
7509
  // General Rendering
7501
7510
  // -----------------------------------------------------------------------------------------------------------------
7502
- View.prototype.render = function (props) {
7511
+ View.prototype.render = function (props, context) {
7503
7512
  this.renderDatesMem(props.dateProfile);
7504
7513
  this.renderBusinessHoursMem(props.businessHours);
7505
7514
  this.renderDateSelectionMem(props.dateSelection);
@@ -7508,6 +7517,9 @@ var View = /** @class */ (function (_super) {
7508
7517
  this.renderEventDragMem(props.eventDrag);
7509
7518
  this.renderEventResizeMem(props.eventResize);
7510
7519
  };
7520
+ View.prototype.beforeUpdate = function () {
7521
+ this.addScroll(this.queryScroll());
7522
+ };
7511
7523
  View.prototype.destroy = function () {
7512
7524
  _super.prototype.destroy.call(this);
7513
7525
  this.renderDatesMem.unrender(); // should unrender everything else
@@ -7515,7 +7527,10 @@ var View = /** @class */ (function (_super) {
7515
7527
  // Sizing
7516
7528
  // -----------------------------------------------------------------------------------------------------------------
7517
7529
  View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
7518
- var calendar = this.calendar;
7530
+ var calendar = this.context.calendar;
7531
+ if (isResize) {
7532
+ this.addScroll(this.queryScroll()); // NOTE: same code as in beforeUpdate
7533
+ }
7519
7534
  if (isResize || // HACKS...
7520
7535
  calendar.isViewUpdated ||
7521
7536
  calendar.isDatesUpdated ||
@@ -7524,6 +7539,7 @@ var View = /** @class */ (function (_super) {
7524
7539
  // anything that might cause dimension changes
7525
7540
  this.updateBaseSize(isResize, viewHeight, isAuto);
7526
7541
  }
7542
+ // NOTE: popScroll is called by CalendarComponent
7527
7543
  };
7528
7544
  View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
7529
7545
  };
@@ -7532,9 +7548,8 @@ var View = /** @class */ (function (_super) {
7532
7548
  View.prototype.renderDatesWrap = function (dateProfile) {
7533
7549
  this.renderDates(dateProfile);
7534
7550
  this.addScroll({
7535
- duration: createDuration(this.opt('scrollTime'))
7551
+ duration: createDuration(this.context.options.scrollTime)
7536
7552
  });
7537
- this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon
7538
7553
  };
7539
7554
  View.prototype.unrenderDatesWrap = function () {
7540
7555
  this.stopNowIndicator();
@@ -7567,22 +7582,7 @@ var View = /** @class */ (function (_super) {
7567
7582
  // util for subclasses
7568
7583
  View.prototype.sliceEvents = function (eventStore, allDay) {
7569
7584
  var props = this.props;
7570
- return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;
7571
- };
7572
- View.prototype.computeEventDraggable = function (eventDef, eventUi) {
7573
- var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers;
7574
- var val = eventUi.startEditable;
7575
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
7576
- var transformer = transformers_1[_i];
7577
- val = transformer(val, eventDef, eventUi, this);
7578
- }
7579
- return val;
7580
- };
7581
- View.prototype.computeEventStartResizable = function (eventDef, eventUi) {
7582
- return eventUi.durationEditable && this.opt('eventResizableFromStart');
7583
- };
7584
- View.prototype.computeEventEndResizable = function (eventDef, eventUi) {
7585
- return eventUi.durationEditable;
7585
+ return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.context.nextDayThreshold : null).fg;
7586
7586
  };
7587
7587
  // Event Selection
7588
7588
  // -----------------------------------------------------------------------------------------------------------------
@@ -7631,17 +7631,18 @@ var View = /** @class */ (function (_super) {
7631
7631
  // Immediately render the current time indicator and begins re-rendering it at an interval,
7632
7632
  // which is defined by this.getNowIndicatorUnit().
7633
7633
  // TODO: somehow do this for the current whole day's background too
7634
- View.prototype.startNowIndicator = function (dateProfile) {
7634
+ // USAGE: must be called manually from subclasses' render methods! don't need to call stopNowIndicator tho
7635
+ View.prototype.startNowIndicator = function (dateProfile, dateProfileGenerator) {
7635
7636
  var _this = this;
7636
- var dateEnv = this.dateEnv;
7637
+ var _a = this.context, calendar = _a.calendar, dateEnv = _a.dateEnv, options = _a.options;
7637
7638
  var unit;
7638
7639
  var update;
7639
7640
  var delay; // ms wait value
7640
- if (this.opt('nowIndicator')) {
7641
- unit = this.getNowIndicatorUnit(dateProfile);
7641
+ if (options.nowIndicator && !this.initialNowDate) {
7642
+ unit = this.getNowIndicatorUnit(dateProfile, dateProfileGenerator);
7642
7643
  if (unit) {
7643
7644
  update = this.updateNowIndicator.bind(this);
7644
- this.initialNowDate = this.calendar.getNow();
7645
+ this.initialNowDate = calendar.getNow();
7645
7646
  this.initialNowQueriedMs = new Date().valueOf();
7646
7647
  // wait until the beginning of the next interval
7647
7648
  delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
@@ -7675,20 +7676,20 @@ var View = /** @class */ (function (_super) {
7675
7676
  // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
7676
7677
  // Won't cause side effects if indicator isn't rendered.
7677
7678
  View.prototype.stopNowIndicator = function () {
7679
+ if (this.nowIndicatorTimeoutID) {
7680
+ clearTimeout(this.nowIndicatorTimeoutID);
7681
+ this.nowIndicatorTimeoutID = null;
7682
+ }
7683
+ if (this.nowIndicatorIntervalID) {
7684
+ clearInterval(this.nowIndicatorIntervalID);
7685
+ this.nowIndicatorIntervalID = null;
7686
+ }
7678
7687
  if (this.isNowIndicatorRendered) {
7679
- if (this.nowIndicatorTimeoutID) {
7680
- clearTimeout(this.nowIndicatorTimeoutID);
7681
- this.nowIndicatorTimeoutID = null;
7682
- }
7683
- if (this.nowIndicatorIntervalID) {
7684
- clearInterval(this.nowIndicatorIntervalID);
7685
- this.nowIndicatorIntervalID = null;
7686
- }
7687
7688
  this.unrenderNowIndicator();
7688
7689
  this.isNowIndicatorRendered = false;
7689
7690
  }
7690
7691
  };
7691
- View.prototype.getNowIndicatorUnit = function (dateProfile) {
7692
+ View.prototype.getNowIndicatorUnit = function (dateProfile, dateProfileGenerator) {
7692
7693
  // subclasses should implement
7693
7694
  };
7694
7695
  // Renders a current time indicator at the given datetime
@@ -7701,16 +7702,20 @@ var View = /** @class */ (function (_super) {
7701
7702
  };
7702
7703
  /* Scroller
7703
7704
  ------------------------------------------------------------------------------------------------------------------*/
7704
- View.prototype.addScroll = function (scroll) {
7705
- var queuedScroll = this.queuedScroll || (this.queuedScroll = {});
7706
- __assign(queuedScroll, scroll);
7705
+ View.prototype.addScroll = function (scroll, isForced) {
7706
+ if (isForced) {
7707
+ scroll.isForced = isForced;
7708
+ }
7709
+ __assign(this.queuedScroll || (this.queuedScroll = {}), scroll);
7707
7710
  };
7708
7711
  View.prototype.popScroll = function (isResize) {
7709
7712
  this.applyQueuedScroll(isResize);
7710
7713
  this.queuedScroll = null;
7711
7714
  };
7712
7715
  View.prototype.applyQueuedScroll = function (isResize) {
7713
- this.applyScroll(this.queuedScroll || {}, isResize);
7716
+ if (this.queuedScroll) {
7717
+ this.applyScroll(this.queuedScroll, isResize);
7718
+ }
7714
7719
  };
7715
7720
  View.prototype.queryScroll = function () {
7716
7721
  var scroll = {};
@@ -7720,8 +7725,8 @@ var View = /** @class */ (function (_super) {
7720
7725
  return scroll;
7721
7726
  };
7722
7727
  View.prototype.applyScroll = function (scroll, isResize) {
7723
- var duration = scroll.duration;
7724
- if (duration != null) {
7728
+ var duration = scroll.duration, isForced = scroll.isForced;
7729
+ if (duration != null && !isForced) {
7725
7730
  delete scroll.duration;
7726
7731
  if (this.props.dateProfile) { // dates rendered yet?
7727
7732
  __assign(scroll, this.computeDateScroll(duration));
@@ -7751,12 +7756,12 @@ View.prototype.usesMinMaxTime = false;
7751
7756
  View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
7752
7757
 
7753
7758
  var FgEventRenderer = /** @class */ (function () {
7754
- function FgEventRenderer(context) {
7759
+ function FgEventRenderer() {
7755
7760
  this.segs = [];
7756
7761
  this.isSizeDirty = false;
7757
- this.context = context;
7758
7762
  }
7759
- FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) {
7763
+ FgEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
7764
+ this.context = context;
7760
7765
  this.rangeUpdated(); // called too frequently :(
7761
7766
  // render an `.el` on each seg
7762
7767
  // returns a subset of the segs. segs that were actually rendered
@@ -7764,10 +7769,10 @@ var FgEventRenderer = /** @class */ (function () {
7764
7769
  this.segs = segs;
7765
7770
  this.attachSegs(segs, mirrorInfo);
7766
7771
  this.isSizeDirty = true;
7767
- this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo));
7772
+ triggerRenderedSegs(this.context, this.segs, Boolean(mirrorInfo));
7768
7773
  };
7769
- FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) {
7770
- this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo));
7774
+ FgEventRenderer.prototype.unrender = function (context, _segs, mirrorInfo) {
7775
+ triggerWillRemoveSegs(this.context, this.segs, Boolean(mirrorInfo));
7771
7776
  this.detachSegs(this.segs);
7772
7777
  this.segs = [];
7773
7778
  };
@@ -7806,7 +7811,7 @@ var FgEventRenderer = /** @class */ (function () {
7806
7811
  seg.el = el;
7807
7812
  }
7808
7813
  });
7809
- segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo));
7814
+ segs = filterSegsViaEls(this.context, segs, Boolean(mirrorInfo));
7810
7815
  }
7811
7816
  return segs;
7812
7817
  };
@@ -7888,7 +7893,7 @@ var FgEventRenderer = /** @class */ (function () {
7888
7893
  };
7889
7894
  };
7890
7895
  FgEventRenderer.prototype.sortEventSegs = function (segs) {
7891
- var specs = this.context.view.eventOrderSpecs;
7896
+ var specs = this.context.eventOrderSpecs;
7892
7897
  var objs = segs.map(buildSegCompareObj);
7893
7898
  objs.sort(function (obj0, obj1) {
7894
7899
  return compareByFieldSpecs(obj0, obj1, specs);
@@ -7969,19 +7974,22 @@ function buildSegCompareObj(seg) {
7969
7974
  });
7970
7975
  }
7971
7976
 
7977
+ /*
7978
+ TODO: when refactoring this class, make a new FillRenderer instance for each `type`
7979
+ */
7972
7980
  var FillRenderer = /** @class */ (function () {
7973
- function FillRenderer(context) {
7981
+ function FillRenderer() {
7974
7982
  this.fillSegTag = 'div';
7975
7983
  this.dirtySizeFlags = {};
7976
- this.context = context;
7977
7984
  this.containerElsByType = {};
7978
7985
  this.segsByType = {};
7979
7986
  }
7980
7987
  FillRenderer.prototype.getSegsByType = function (type) {
7981
7988
  return this.segsByType[type] || [];
7982
7989
  };
7983
- FillRenderer.prototype.renderSegs = function (type, segs) {
7990
+ FillRenderer.prototype.renderSegs = function (type, context, segs) {
7984
7991
  var _a;
7992
+ this.context = context;
7985
7993
  var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
7986
7994
  var containerEls = this.attachSegs(type, renderedSegs);
7987
7995
  if (containerEls) {
@@ -7989,16 +7997,16 @@ var FillRenderer = /** @class */ (function () {
7989
7997
  }
7990
7998
  this.segsByType[type] = renderedSegs;
7991
7999
  if (type === 'bgEvent') {
7992
- this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false
8000
+ triggerRenderedSegs(context, renderedSegs, false); // isMirror=false
7993
8001
  }
7994
8002
  this.dirtySizeFlags[type] = true;
7995
8003
  };
7996
8004
  // Unrenders a specific type of fill that is currently rendered on the grid
7997
- FillRenderer.prototype.unrender = function (type) {
8005
+ FillRenderer.prototype.unrender = function (type, context) {
7998
8006
  var segs = this.segsByType[type];
7999
8007
  if (segs) {
8000
8008
  if (type === 'bgEvent') {
8001
- this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false
8009
+ triggerWillRemoveSegs(context, segs, false); // isMirror=false
8002
8010
  }
8003
8011
  this.detachSegs(type, segs);
8004
8012
  }
@@ -8023,7 +8031,7 @@ var FillRenderer = /** @class */ (function () {
8023
8031
  }
8024
8032
  });
8025
8033
  if (type === 'bgEvent') {
8026
- segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements
8034
+ segs = filterSegsViaEls(this.context, segs, false // isMirror. background events can never be mirror elements
8027
8035
  );
8028
8036
  }
8029
8037
  // correct element type? (would be bad if a non-TD were inserted into a table for example)
@@ -8189,7 +8197,7 @@ function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
8189
8197
  }
8190
8198
  }
8191
8199
  function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
8192
- var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options;
8200
+ var dateEnv = context.dateEnv, theme = context.theme, options = context.options;
8193
8201
  var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
8194
8202
  var classNames = [
8195
8203
  'fc-day-header',
@@ -8229,7 +8237,7 @@ function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, c
8229
8237
  '>' +
8230
8238
  (isDateValid ?
8231
8239
  // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
8232
- buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
8240
+ buildGotoAnchorHtml(options, dateEnv, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
8233
8241
  // if not valid, display text, but no link
8234
8242
  innerHtml) +
8235
8243
  '</th>';
@@ -8237,37 +8245,48 @@ function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, c
8237
8245
 
8238
8246
  var DayHeader = /** @class */ (function (_super) {
8239
8247
  __extends(DayHeader, _super);
8240
- function DayHeader(context, parentEl) {
8241
- var _this = _super.call(this, context) || this;
8242
- parentEl.innerHTML = ''; // because might be nbsp
8243
- parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
8244
- '<table class="' + _this.theme.getClass('tableGrid') + '">' +
8245
- '<thead></thead>' +
8246
- '</table>' +
8247
- '</div>'));
8248
- _this.thead = _this.el.querySelector('thead');
8248
+ function DayHeader(parentEl) {
8249
+ var _this = _super.call(this) || this;
8250
+ _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
8251
+ _this.parentEl = parentEl;
8249
8252
  return _this;
8250
8253
  }
8251
- DayHeader.prototype.destroy = function () {
8252
- removeElement(this.el);
8253
- };
8254
- DayHeader.prototype.render = function (props) {
8254
+ DayHeader.prototype.render = function (props, context) {
8255
8255
  var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
8256
8256
  var parts = [];
8257
+ this.renderSkeleton(context);
8257
8258
  if (props.renderIntroHtml) {
8258
8259
  parts.push(props.renderIntroHtml());
8259
8260
  }
8260
- var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') ||
8261
+ var colHeadFormat = createFormatter(context.options.columnHeaderFormat ||
8261
8262
  computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
8262
8263
  for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
8263
8264
  var date = dates_1[_i];
8264
- parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context));
8265
+ parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, context));
8265
8266
  }
8266
- if (this.isRtl) {
8267
+ if (context.isRtl) {
8267
8268
  parts.reverse();
8268
8269
  }
8269
8270
  this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
8270
8271
  };
8272
+ DayHeader.prototype.destroy = function () {
8273
+ _super.prototype.destroy.call(this);
8274
+ this.renderSkeleton.unrender();
8275
+ };
8276
+ DayHeader.prototype._renderSkeleton = function (context) {
8277
+ var theme = context.theme;
8278
+ var parentEl = this.parentEl;
8279
+ parentEl.innerHTML = ''; // because might be nbsp
8280
+ parentEl.appendChild(this.el = htmlToElement('<div class="fc-row ' + theme.getClass('headerRow') + '">' +
8281
+ '<table class="' + theme.getClass('tableGrid') + '">' +
8282
+ '<thead></thead>' +
8283
+ '</table>' +
8284
+ '</div>'));
8285
+ this.thead = this.el.querySelector('thead');
8286
+ };
8287
+ DayHeader.prototype._unrenderSkeleton = function () {
8288
+ removeElement(this.el);
8289
+ };
8271
8290
  return DayHeader;
8272
8291
  }(Component));
8273
8292
 
@@ -8416,16 +8435,16 @@ var Slicer = /** @class */ (function () {
8416
8435
  this.sliceEventDrag = memoize(this._sliceInteraction);
8417
8436
  this.sliceEventResize = memoize(this._sliceInteraction);
8418
8437
  }
8419
- Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) {
8438
+ Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, calendar, component) {
8420
8439
  var extraArgs = [];
8421
- for (var _i = 4; _i < arguments.length; _i++) {
8422
- extraArgs[_i - 4] = arguments[_i];
8440
+ for (var _i = 5; _i < arguments.length; _i++) {
8441
+ extraArgs[_i - 5] = arguments[_i];
8423
8442
  }
8424
8443
  var eventUiBases = props.eventUiBases;
8425
8444
  var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
8426
8445
  return {
8427
8446
  dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
8428
- businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)),
8447
+ businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, calendar, component].concat(extraArgs)),
8429
8448
  fgEventSegs: eventSegs.fg,
8430
8449
  bgEventSegs: eventSegs.bg,
8431
8450
  eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
@@ -8443,15 +8462,15 @@ var Slicer = /** @class */ (function () {
8443
8462
  {},
8444
8463
  component].concat(extraArgs));
8445
8464
  };
8446
- Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) {
8465
+ Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, calendar, component) {
8447
8466
  var extraArgs = [];
8448
- for (var _i = 4; _i < arguments.length; _i++) {
8449
- extraArgs[_i - 4] = arguments[_i];
8467
+ for (var _i = 5; _i < arguments.length; _i++) {
8468
+ extraArgs[_i - 5] = arguments[_i];
8450
8469
  }
8451
8470
  if (!businessHours) {
8452
8471
  return [];
8453
8472
  }
8454
- return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar),
8473
+ return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), calendar),
8455
8474
  {},
8456
8475
  dateProfile,
8457
8476
  nextDayThreshold,
@@ -8497,7 +8516,7 @@ var Slicer = /** @class */ (function () {
8497
8516
  if (!dateSpan) {
8498
8517
  return [];
8499
8518
  }
8500
- var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar);
8519
+ var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.context.calendar);
8501
8520
  var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
8502
8521
  for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
8503
8522
  var seg = segs_1[_a];
@@ -8553,6 +8572,6 @@ function computeActiveRange(dateProfile, isComponentAllDay) {
8553
8572
 
8554
8573
  // exports
8555
8574
  // --------------------------------------------------------------------------------------------------
8556
- var version = '4.3.1';
8575
+ var version = '4.4.0';
8557
8576
 
8558
- export { Calendar, Component, DateComponent, DateEnv, DateProfileGenerator, DayHeader, DaySeries, DayTable, ElementDragging, ElementScrollController, EmitterMixin, EventApi, FgEventRenderer, FillRenderer, Interaction, Mixin, NamedTimeZoneImpl, PositionCache, ScrollComponent, ScrollController, Slicer, Splitter, Theme, View, WindowScrollController, addDays, addDurations, addMs, addWeeks, allowContextMenu, allowSelection, appendToElement, applyAll, applyMutationToEventStore, applyStyle, applyStyleProp, asRoughMinutes, asRoughMs, asRoughSeconds, buildGotoAnchorHtml, buildSegCompareObj, capitaliseFirstLetter, combineEventUis, compareByFieldSpec, compareByFieldSpecs, compareNumbers, compensateScroll, computeClippingRect, computeEdges, computeFallbackHeaderFormat, computeHeightAndMargins, computeInnerRect, computeRect, computeVisibleDayRange, config, constrainPoint, createDuration, createElement, createEmptyEventStore, createEventInstance, createFormatter, createPlugin, cssToStr, debounce, diffDates, diffDayAndTime, diffDays, diffPoints, diffWeeks, diffWholeDays, diffWholeWeeks, disableCursor, distributeHeight, elementClosest, elementMatches, enableCursor, eventTupleToStore, filterEventStoreDefs, filterHash, findChildren, findElements, flexibleCompare, forceClassName, formatDate, formatIsoTimeString, formatRange, getAllDayHtml, getClippingParents, getDayClasses, getElSeg, getRectCenter, getRelevantEvents, globalDefaults, greatestDurationDenominator, hasBgRendering, htmlEscape, htmlToElement, insertAfterElement, interactionSettingsStore, interactionSettingsToStore, intersectRanges, intersectRects, isArraysEqual, isDateSpansEqual, isInt, isInteractionValid, isMultiDayRange, isPropsEqual, isPropsValid, isSingleDay, isValidDate, listenBySelector, mapHash, matchCellWidths, memoize, memoizeOutput, memoizeRendering, mergeEventStores, multiplyDuration, padStart, parseBusinessHours, parseDragMeta, parseEventDef, parseFieldSpecs, parse as parseMarker, pointInsideRect, prependToElement, preventContextMenu, preventDefault, preventSelection, processScopedUiProps, rangeContainsMarker, rangeContainsRange, rangesEqual, rangesIntersect, refineProps, removeElement, removeExact, renderDateCell, requestJson, sliceEventStore, startOfDay, subtractInnerElHeight, translateRect, uncompensateScroll, undistributeHeight, unpromisify, version, whenTransitionDone, wholeDivideDurations };
8577
+ export { Calendar, Component, ComponentContext, DateComponent, DateEnv, DateProfileGenerator, DayHeader, DaySeries, DayTable, ElementDragging, ElementScrollController, EmitterMixin, EventApi, FgEventRenderer, FillRenderer, Interaction, Mixin, NamedTimeZoneImpl, PositionCache, ScrollComponent, ScrollController, Slicer, Splitter, Theme, View, WindowScrollController, addDays, addDurations, addMs, addWeeks, allowContextMenu, allowSelection, appendToElement, applyAll, applyMutationToEventStore, applyStyle, applyStyleProp, asRoughMinutes, asRoughMs, asRoughSeconds, buildGotoAnchorHtml, buildSegCompareObj, capitaliseFirstLetter, combineEventUis, compareByFieldSpec, compareByFieldSpecs, compareNumbers, compensateScroll, computeClippingRect, computeEdges, computeEventDraggable, computeEventEndResizable, computeEventStartResizable, computeFallbackHeaderFormat, computeHeightAndMargins, computeInnerRect, computeRect, computeVisibleDayRange, config, constrainPoint, createDuration, createElement, createEmptyEventStore, createEventInstance, createFormatter, createPlugin, cssToStr, debounce, diffDates, diffDayAndTime, diffDays, diffPoints, diffWeeks, diffWholeDays, diffWholeWeeks, disableCursor, distributeHeight, elementClosest, elementMatches, enableCursor, eventTupleToStore, filterEventStoreDefs, filterHash, findChildren, findElements, flexibleCompare, forceClassName, formatDate, formatIsoTimeString, formatRange, getAllDayHtml, getClippingParents, getDayClasses, getElSeg, getRectCenter, getRelevantEvents, globalDefaults, greatestDurationDenominator, hasBgRendering, htmlEscape, htmlToElement, insertAfterElement, interactionSettingsStore, interactionSettingsToStore, intersectRanges, intersectRects, isArraysEqual, isDateSpansEqual, isInt, isInteractionValid, isMultiDayRange, isPropsEqual, isPropsValid, isSingleDay, isValidDate, listenBySelector, mapHash, matchCellWidths, memoize, memoizeOutput, memoizeRendering, mergeEventStores, multiplyDuration, padStart, parseBusinessHours, parseDragMeta, parseEventDef, parseFieldSpecs, parse as parseMarker, pointInsideRect, prependToElement, preventContextMenu, preventDefault, preventSelection, processScopedUiProps, rangeContainsMarker, rangeContainsRange, rangesEqual, rangesIntersect, refineProps, removeElement, removeExact, renderDateCell, requestJson, sliceEventStore, startOfDay, subtractInnerElHeight, translateRect, uncompensateScroll, undistributeHeight, unpromisify, version, whenTransitionDone, wholeDivideDurations };