@fullcalendar/core 4.0.2 → 4.3.1

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.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /*!
2
- FullCalendar Core Package v4.0.2
2
+ FullCalendar Core Package v4.3.1
3
3
  Docs & License: https://fullcalendar.io/
4
4
  (c) 2019 Adam Shaw
5
5
  */
6
+
6
7
  (function (global, factory) {
7
8
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
8
9
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
@@ -276,6 +277,7 @@ Docs & License: https://fullcalendar.io/
276
277
  var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
277
278
  var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
278
279
  var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
280
+ // must use offset(Width|Height) because compatible with client(Width|Height)
279
281
  var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
280
282
  var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
281
283
  var res = {
@@ -337,9 +339,11 @@ Docs & License: https://fullcalendar.io/
337
339
  };
338
340
  }
339
341
  function computeHeightAndMargins(el) {
342
+ return el.getBoundingClientRect().height + computeVMargins(el);
343
+ }
344
+ function computeVMargins(el) {
340
345
  var computed = window.getComputedStyle(el);
341
- return el.getBoundingClientRect().height +
342
- parseInt(computed.marginTop, 10) +
346
+ return parseInt(computed.marginTop, 10) +
343
347
  parseInt(computed.marginBottom, 10);
344
348
  }
345
349
  // does not return window
@@ -800,11 +804,12 @@ Docs & License: https://fullcalendar.io/
800
804
  // important to query for heights in a single first pass (to avoid reflow oscillation).
801
805
  els.forEach(function (el, i) {
802
806
  var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
803
- var naturalOffset = computeHeightAndMargins(el);
807
+ var naturalHeight = el.getBoundingClientRect().height;
808
+ var naturalOffset = naturalHeight + computeVMargins(el);
804
809
  if (naturalOffset < minOffset) {
805
810
  flexEls.push(el);
806
811
  flexOffsets.push(naturalOffset);
807
- flexHeights.push(el.offsetHeight);
812
+ flexHeights.push(naturalHeight);
808
813
  }
809
814
  else {
810
815
  // this element stretches past recommended height (non-expandable). mark the space as occupied.
@@ -842,7 +847,7 @@ Docs & License: https://fullcalendar.io/
842
847
  els.forEach(function (el) {
843
848
  var innerEl = el.firstChild; // hopefully an element
844
849
  if (innerEl instanceof HTMLElement) {
845
- var innerWidth_1 = innerEl.offsetWidth;
850
+ var innerWidth_1 = innerEl.getBoundingClientRect().width;
846
851
  if (innerWidth_1 > maxInnerWidth) {
847
852
  maxInnerWidth = innerWidth_1;
848
853
  }
@@ -864,7 +869,9 @@ Docs & License: https://fullcalendar.io/
864
869
  };
865
870
  applyStyle(outerEl, reflowStyleProps);
866
871
  applyStyle(innerEl, reflowStyleProps);
867
- var diff = outerEl.offsetHeight - innerEl.offsetHeight; // grab the dimensions
872
+ var diff = // grab the dimensions
873
+ outerEl.getBoundingClientRect().height -
874
+ innerEl.getBoundingClientRect().height;
868
875
  // undo hack
869
876
  var resetStyleProps = { position: '', left: '' };
870
877
  applyStyle(outerEl, resetStyleProps);
@@ -1071,16 +1078,6 @@ Docs & License: https://fullcalendar.io/
1071
1078
  }
1072
1079
  return refined;
1073
1080
  }
1074
- /*
1075
- Get a snapshot of an object, so we can compare it to later revisions.
1076
- Intentionally only works with arrays, jaja
1077
- */
1078
- function freezeRaw(raw) {
1079
- if (Array.isArray(raw)) {
1080
- return Array.prototype.slice.call(raw);
1081
- }
1082
- return raw;
1083
- }
1084
1081
  /* Date stuff that doesn't belong in datelib core
1085
1082
  ----------------------------------------------------------------------------------------------------------------------*/
1086
1083
  // given a timed range, computes an all-day range that has the same exact duration,
@@ -1203,9 +1200,12 @@ Docs & License: https://fullcalendar.io/
1203
1200
  /*
1204
1201
  Event MUST have a recurringDef
1205
1202
  */
1206
- function expandRecurringRanges(eventDef, framingRange, dateEnv, recurringTypes) {
1203
+ function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
1207
1204
  var typeDef = recurringTypes[eventDef.recurringDef.typeId];
1208
- var markers = typeDef.expand(eventDef.recurringDef.typeData, framingRange, dateEnv);
1205
+ var markers = typeDef.expand(eventDef.recurringDef.typeData, {
1206
+ start: dateEnv.subtract(framingRange.start, duration),
1207
+ end: framingRange.end
1208
+ }, dateEnv);
1209
1209
  // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
1210
1210
  if (eventDef.allDay) {
1211
1211
  markers = markers.map(startOfDay);
@@ -1213,6 +1213,7 @@ Docs & License: https://fullcalendar.io/
1213
1213
  return markers;
1214
1214
  }
1215
1215
 
1216
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
1216
1217
  // Merges an array of objects into a single object.
1217
1218
  // The second argument allows for an array of property names who's object values will be merged together.
1218
1219
  function mergeProps(propObjs, complexProps) {
@@ -1286,6 +1287,23 @@ Docs & License: https://fullcalendar.io/
1286
1287
  }
1287
1288
  return a;
1288
1289
  }
1290
+ function isPropsEqual(obj0, obj1) {
1291
+ for (var key in obj0) {
1292
+ if (hasOwnProperty.call(obj0, key)) {
1293
+ if (!(key in obj1)) {
1294
+ return false;
1295
+ }
1296
+ }
1297
+ }
1298
+ for (var key in obj1) {
1299
+ if (hasOwnProperty.call(obj1, key)) {
1300
+ if (obj0[key] !== obj1[key]) {
1301
+ return false;
1302
+ }
1303
+ }
1304
+ }
1305
+ return true;
1306
+ }
1289
1307
 
1290
1308
  function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
1291
1309
  var eventStore = createEmptyEventStore();
@@ -1316,13 +1334,13 @@ Docs & License: https://fullcalendar.io/
1316
1334
  for (var defId in defs) {
1317
1335
  var def = defs[defId];
1318
1336
  if (def.recurringDef) {
1319
- var starts = expandRecurringRanges(def, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
1320
1337
  var duration = def.recurringDef.duration;
1321
1338
  if (!duration) {
1322
1339
  duration = def.allDay ?
1323
1340
  calendar.defaultAllDayEventDuration :
1324
1341
  calendar.defaultTimedEventDuration;
1325
1342
  }
1343
+ var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
1326
1344
  for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
1327
1345
  var start = starts_1[_i];
1328
1346
  var instance = createEventInstance(defId, {
@@ -2035,13 +2053,12 @@ Docs & License: https://fullcalendar.io/
2035
2053
  if (start && this._instance) { // TODO: warning if parsed bad
2036
2054
  var instanceRange = this._instance.range;
2037
2055
  var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
2038
- var endDelta = null;
2039
2056
  if (options.maintainDuration) {
2040
- var origDuration = diffDates(instanceRange.start, instanceRange.end, dateEnv, options.granularity);
2041
- var newDuration = diffDates(start, instanceRange.end, dateEnv, options.granularity);
2042
- endDelta = subtractDurations(origDuration, newDuration);
2057
+ this.mutate({ datesDelta: startDelta });
2058
+ }
2059
+ else {
2060
+ this.mutate({ startDelta: startDelta });
2043
2061
  }
2044
- this.mutate({ startDelta: startDelta, endDelta: endDelta });
2045
2062
  }
2046
2063
  };
2047
2064
  EventApi.prototype.setEnd = function (endInput, options) {
@@ -2089,11 +2106,16 @@ Docs & License: https://fullcalendar.io/
2089
2106
  var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
2090
2107
  if (end) {
2091
2108
  var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
2092
- this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
2109
+ if (durationsEqual(startDelta, endDelta)) {
2110
+ this.mutate({ datesDelta: startDelta, standardProps: standardProps });
2111
+ }
2112
+ else {
2113
+ this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
2114
+ }
2093
2115
  }
2094
- else {
2116
+ else { // means "clear the end"
2095
2117
  standardProps.hasEnd = false;
2096
- this.mutate({ startDelta: startDelta, standardProps: standardProps });
2118
+ this.mutate({ datesDelta: startDelta, standardProps: standardProps });
2097
2119
  }
2098
2120
  }
2099
2121
  };
@@ -2112,7 +2134,7 @@ Docs & License: https://fullcalendar.io/
2112
2134
  EventApi.prototype.moveDates = function (deltaInput) {
2113
2135
  var delta = createDuration(deltaInput);
2114
2136
  if (delta) { // TODO: warning if parsed bad
2115
- this.mutate({ startDelta: delta, endDelta: delta });
2137
+ this.mutate({ datesDelta: delta });
2116
2138
  }
2117
2139
  };
2118
2140
  EventApi.prototype.setAllDay = function (allDay, options) {
@@ -2445,7 +2467,7 @@ Docs & License: https://fullcalendar.io/
2445
2467
  // and thus, we need to mark the event as having a real end
2446
2468
  if (standardProps.hasEnd == null &&
2447
2469
  eventConfig.durationEditable &&
2448
- willDeltasAffectDuration(eventConfig.startEditable ? mutation.startDelta : null, mutation.endDelta || null)) {
2470
+ (mutation.startDelta || mutation.endDelta)) {
2449
2471
  standardProps.hasEnd = true; // TODO: is this mutation okay?
2450
2472
  }
2451
2473
  var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
@@ -2461,21 +2483,6 @@ Docs & License: https://fullcalendar.io/
2461
2483
  }
2462
2484
  return copy;
2463
2485
  }
2464
- function willDeltasAffectDuration(startDelta, endDelta) {
2465
- if (startDelta && !asRoughMs(startDelta)) {
2466
- startDelta = null;
2467
- }
2468
- if (endDelta && !asRoughMs(endDelta)) {
2469
- endDelta = null;
2470
- }
2471
- if (!startDelta && !endDelta) {
2472
- return false;
2473
- }
2474
- if (Boolean(startDelta) !== Boolean(endDelta)) {
2475
- return true;
2476
- }
2477
- return !durationsEqual(startDelta, endDelta);
2478
- }
2479
2486
  function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
2480
2487
  eventConfig, mutation, calendar) {
2481
2488
  var dateEnv = calendar.dateEnv;
@@ -2485,25 +2492,28 @@ Docs & License: https://fullcalendar.io/
2485
2492
  if (forceAllDay) {
2486
2493
  copy.range = computeAlignedDayRange(copy.range);
2487
2494
  }
2488
- if (mutation.startDelta && eventConfig.startEditable) {
2495
+ if (mutation.datesDelta && eventConfig.startEditable) {
2496
+ copy.range = {
2497
+ start: dateEnv.add(copy.range.start, mutation.datesDelta),
2498
+ end: dateEnv.add(copy.range.end, mutation.datesDelta)
2499
+ };
2500
+ }
2501
+ if (mutation.startDelta && eventConfig.durationEditable) {
2489
2502
  copy.range = {
2490
2503
  start: dateEnv.add(copy.range.start, mutation.startDelta),
2491
2504
  end: copy.range.end
2492
2505
  };
2493
2506
  }
2494
- if (clearEnd) {
2507
+ if (mutation.endDelta && eventConfig.durationEditable) {
2495
2508
  copy.range = {
2496
2509
  start: copy.range.start,
2497
- end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
2510
+ end: dateEnv.add(copy.range.end, mutation.endDelta)
2498
2511
  };
2499
2512
  }
2500
- else if (mutation.endDelta &&
2501
- (eventConfig.durationEditable ||
2502
- !willDeltasAffectDuration(// TODO: nonDRY logic above
2503
- eventConfig.startEditable ? mutation.startDelta : null, mutation.endDelta))) {
2513
+ if (clearEnd) {
2504
2514
  copy.range = {
2505
2515
  start: copy.range.start,
2506
- end: dateEnv.add(copy.range.end, mutation.endDelta)
2516
+ end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
2507
2517
  };
2508
2518
  }
2509
2519
  // in case event was all-day but the supplied deltas were not
@@ -2709,11 +2719,12 @@ Docs & License: https://fullcalendar.io/
2709
2719
  }
2710
2720
  }
2711
2721
  // allow (a function)
2722
+ var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
2712
2723
  for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
2713
2724
  var subjectAllow = _a[_i];
2714
2725
  var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
2715
- var origDef = state.eventStore.defs[subjectDef.defId];
2716
- var origInstance = state.eventStore.instances[subjectInstanceId];
2726
+ var origDef = calendarEventStore.defs[subjectDef.defId];
2727
+ var origInstance = calendarEventStore.instances[subjectInstanceId];
2717
2728
  var eventApi = void 0;
2718
2729
  if (origDef) { // was previously in the calendar
2719
2730
  eventApi = new EventApi(calendar, origDef, origInstance);
@@ -3187,90 +3198,6 @@ Docs & License: https://fullcalendar.io/
3187
3198
  return res;
3188
3199
  }
3189
3200
 
3190
- function isValuesSimilar(val0, val1, depth) {
3191
- if (depth === void 0) { depth = 1; }
3192
- if (val0 === val1) {
3193
- return true;
3194
- }
3195
- else if (Array.isArray(val0) && Array.isArray(val1)) {
3196
- return isArraysSimilar(val0, val1, depth);
3197
- }
3198
- else if (typeof val0 === 'object' && val0 && typeof val1 === 'object' && val1) { // non-null objects
3199
- return isObjectsSimilar(val0, val1, depth);
3200
- }
3201
- else {
3202
- return false;
3203
- }
3204
- }
3205
- function isArraysSimilar(a0, a1, depth) {
3206
- if (depth === void 0) { depth = 1; }
3207
- if (a0 === a1) {
3208
- return true;
3209
- }
3210
- else if (depth > 0) {
3211
- if (a0.length !== a1.length) {
3212
- return false;
3213
- }
3214
- else {
3215
- for (var i = 0; i < a0.length; i++) {
3216
- if (!isValuesSimilar(a0[i], a1[i], depth - 1)) {
3217
- return false;
3218
- }
3219
- }
3220
- return true;
3221
- }
3222
- }
3223
- else {
3224
- return false;
3225
- }
3226
- }
3227
- function isObjectsSimilar(obj0, obj1, depth) {
3228
- if (depth === void 0) { depth = 1; }
3229
- if (obj0 === obj1) {
3230
- return true;
3231
- }
3232
- else if (depth > 0) {
3233
- for (var prop in obj0) {
3234
- if (!(prop in obj1)) {
3235
- return false;
3236
- }
3237
- }
3238
- for (var prop in obj1) {
3239
- if (!(prop in obj0)) {
3240
- return false;
3241
- }
3242
- else {
3243
- if (!isValuesSimilar(obj0[prop], obj1[prop], depth - 1)) {
3244
- return false;
3245
- }
3246
- }
3247
- }
3248
- return true;
3249
- }
3250
- else {
3251
- return false;
3252
- }
3253
- }
3254
- function computeChangedProps(obj0, obj1, depth) {
3255
- if (depth === void 0) { depth = 1; }
3256
- var res = {};
3257
- for (var prop in obj1) {
3258
- if (!(prop in obj0) ||
3259
- !isValuesSimilar(obj0[prop], obj1[prop], depth - 1)) {
3260
- res[prop] = obj1[prop];
3261
- }
3262
- }
3263
- return res;
3264
- }
3265
- function anyKeysRemoved(obj0, obj1) {
3266
- for (var prop in obj0) {
3267
- if (!(prop in obj1)) {
3268
- return true;
3269
- }
3270
- }
3271
- return false;
3272
- }
3273
-
3274
3201
  var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
3275
3202
  var Splitter = /** @class */ (function () {
3276
3203
  function Splitter() {
@@ -4045,6 +3972,8 @@ Docs & License: https://fullcalendar.io/
4045
3972
  */
4046
3973
  // Hit System
4047
3974
  // -----------------------------------------------------------------------------------------------------------------
3975
+ DateComponent.prototype.buildPositionCaches = function () {
3976
+ };
4048
3977
  DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
4049
3978
  return null; // this should be abstract
4050
3979
  };
@@ -4098,7 +4027,7 @@ Docs & License: https://fullcalendar.io/
4098
4027
  isStart: seg.isStart,
4099
4028
  isEnd: seg.isEnd,
4100
4029
  el: seg.el,
4101
- view: this // ?
4030
+ view: this // safe to cast because this method is only called on context.view
4102
4031
  }
4103
4032
  ]);
4104
4033
  }
@@ -4121,7 +4050,7 @@ Docs & License: https://fullcalendar.io/
4121
4050
  event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
4122
4051
  isMirror: isMirrors,
4123
4052
  el: seg.el,
4124
- view: this // ?
4053
+ view: this // safe to cast because this method is only called on context.view
4125
4054
  }
4126
4055
  ]);
4127
4056
  }
@@ -4162,6 +4091,7 @@ Docs & License: https://fullcalendar.io/
4162
4091
  deps: input.deps || [],
4163
4092
  reducers: input.reducers || [],
4164
4093
  eventDefParsers: input.eventDefParsers || [],
4094
+ isDraggableTransformers: input.isDraggableTransformers || [],
4165
4095
  eventDragMutationMassagers: input.eventDragMutationMassagers || [],
4166
4096
  eventDefMutationAppliers: input.eventDefMutationAppliers || [],
4167
4097
  dateSelectionTransformers: input.dateSelectionTransformers || [],
@@ -4191,6 +4121,7 @@ Docs & License: https://fullcalendar.io/
4191
4121
  this.hooks = {
4192
4122
  reducers: [],
4193
4123
  eventDefParsers: [],
4124
+ isDraggableTransformers: [],
4194
4125
  eventDragMutationMassagers: [],
4195
4126
  eventDefMutationAppliers: [],
4196
4127
  dateSelectionTransformers: [],
@@ -4232,6 +4163,7 @@ Docs & License: https://fullcalendar.io/
4232
4163
  return {
4233
4164
  reducers: hooks0.reducers.concat(hooks1.reducers),
4234
4165
  eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
4166
+ isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
4235
4167
  eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
4236
4168
  eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
4237
4169
  dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
@@ -4439,11 +4371,17 @@ Docs & License: https://fullcalendar.io/
4439
4371
  }
4440
4372
  }
4441
4373
  if (anyValid) {
4374
+ var duration = null;
4375
+ if ('duration' in leftoverProps) {
4376
+ duration = createDuration(leftoverProps.duration);
4377
+ delete leftoverProps.duration;
4378
+ }
4379
+ if (!duration && props.startTime && props.endTime) {
4380
+ duration = subtractDurations(props.endTime, props.startTime);
4381
+ }
4442
4382
  return {
4443
4383
  allDayGuess: Boolean(!props.startTime && !props.endTime),
4444
- duration: (props.startTime && props.endTime) ?
4445
- subtractDurations(props.endTime, props.startTime) :
4446
- null,
4384
+ duration: duration,
4447
4385
  typeData: props // doesn't need endTime anymore but oh well
4448
4386
  };
4449
4387
  }
@@ -4488,21 +4426,21 @@ Docs & License: https://fullcalendar.io/
4488
4426
 
4489
4427
  var DefaultOptionChangeHandlers = createPlugin({
4490
4428
  optionChangeHandlers: {
4491
- events: function (events, calendar) {
4492
- handleEventSources([events], calendar);
4429
+ events: function (events, calendar, deepEqual) {
4430
+ handleEventSources([events], calendar, deepEqual);
4493
4431
  },
4494
4432
  eventSources: handleEventSources,
4495
4433
  plugins: handlePlugins
4496
4434
  }
4497
4435
  });
4498
- function handleEventSources(inputs, calendar) {
4436
+ function handleEventSources(inputs, calendar, deepEqual) {
4499
4437
  var unfoundSources = hashValuesToArray(calendar.state.eventSources);
4500
4438
  var newInputs = [];
4501
4439
  for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
4502
4440
  var input = inputs_1[_i];
4503
4441
  var inputFound = false;
4504
4442
  for (var i = 0; i < unfoundSources.length; i++) {
4505
- if (isValuesSimilar(unfoundSources[i]._raw, input, 2)) {
4443
+ if (deepEqual(unfoundSources[i]._raw, input)) {
4506
4444
  unfoundSources.splice(i, 1); // delete
4507
4445
  inputFound = true;
4508
4446
  break;
@@ -4730,16 +4668,13 @@ Docs & License: https://fullcalendar.io/
4730
4668
  this.dynamicOverrides = {};
4731
4669
  this.compute();
4732
4670
  }
4733
- OptionsManager.prototype.add = function (props) {
4734
- __assign(this.overrides, props);
4735
- this.compute();
4736
- };
4737
- OptionsManager.prototype.addDynamic = function (props) {
4738
- __assign(this.dynamicOverrides, props);
4739
- this.compute();
4740
- };
4741
- OptionsManager.prototype.reset = function (props) {
4742
- this.overrides = props;
4671
+ OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
4672
+ var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
4673
+ __assign(overrideHash, updates);
4674
+ for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
4675
+ var propName = removals_1[_i];
4676
+ delete overrideHash[propName];
4677
+ }
4743
4678
  this.compute();
4744
4679
  };
4745
4680
  // Computes the flattened options hash for the calendar and assigns to `this.options`.
@@ -4797,39 +4732,25 @@ Docs & License: https://fullcalendar.io/
4797
4732
  }());
4798
4733
  registerCalendarSystem('gregory', GregorianCalendarSystem);
4799
4734
 
4800
- var ISO_START = /^\s*\d{4}-\d\d-\d\d([T ]\d)?/;
4801
- var ISO_TZO_RE = /(?:(Z)|([-+])(\d\d)(?::(\d\d))?)$/;
4735
+ var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
4802
4736
  function parse(str) {
4803
- var timeZoneOffset = null;
4804
- var isTimeUnspecified = false;
4805
- var m = ISO_START.exec(str);
4737
+ var m = ISO_RE.exec(str);
4806
4738
  if (m) {
4807
- isTimeUnspecified = !m[1];
4808
- if (isTimeUnspecified) {
4809
- str += 'T00:00:00Z';
4810
- }
4811
- else {
4812
- str = str.replace(ISO_TZO_RE, function (whole, z, sign, minutes, seconds) {
4813
- if (z) {
4814
- timeZoneOffset = 0;
4815
- }
4816
- else {
4817
- timeZoneOffset = (parseInt(minutes, 10) * 60 +
4818
- parseInt(seconds || 0, 10)) * (sign === '-' ? -1 : 1);
4819
- }
4820
- return '';
4821
- }) + 'Z'; // otherwise will parse in local
4739
+ var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
4740
+ if (isValidDate(marker)) {
4741
+ var timeZoneOffset = null;
4742
+ if (m[13]) {
4743
+ timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
4744
+ Number(m[18] || 0));
4745
+ }
4746
+ return {
4747
+ marker: marker,
4748
+ isTimeUnspecified: !m[6],
4749
+ timeZoneOffset: timeZoneOffset
4750
+ };
4822
4751
  }
4823
4752
  }
4824
- var marker = new Date(str);
4825
- if (!isValidDate(marker)) {
4826
- return null;
4827
- }
4828
- return {
4829
- marker: marker,
4830
- isTimeUnspecified: isTimeUnspecified,
4831
- timeZoneOffset: timeZoneOffset
4832
- };
4753
+ return null;
4833
4754
  }
4834
4755
 
4835
4756
  var DateEnv = /** @class */ (function () {
@@ -4848,7 +4769,7 @@ Docs & License: https://fullcalendar.io/
4848
4769
  this.weekDow = 1;
4849
4770
  this.weekDoy = 4;
4850
4771
  }
4851
- else if (typeof settings.firstDay === 'number') {
4772
+ if (typeof settings.firstDay === 'number') {
4852
4773
  this.weekDow = settings.firstDay;
4853
4774
  }
4854
4775
  if (typeof settings.weekNumberCalculation === 'function') {
@@ -5176,7 +5097,7 @@ Docs & License: https://fullcalendar.io/
5176
5097
  var meta = def.parseMeta(raw);
5177
5098
  if (meta) {
5178
5099
  var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
5179
- res._raw = freezeRaw(raw);
5100
+ res._raw = raw;
5180
5101
  return res;
5181
5102
  }
5182
5103
  }
@@ -5662,10 +5583,19 @@ Docs & License: https://fullcalendar.io/
5662
5583
  }());
5663
5584
  // TODO: find a way to avoid comparing DateProfiles. it's tedious
5664
5585
  function isDateProfilesEqual(p0, p1) {
5665
- return rangesEqual(p0.activeRange, p1.activeRange) &&
5666
- rangesEqual(p0.validRange, p1.validRange) &&
5586
+ return rangesEqual(p0.validRange, p1.validRange) &&
5587
+ rangesEqual(p0.activeRange, p1.activeRange) &&
5588
+ rangesEqual(p0.renderRange, p1.renderRange) &&
5667
5589
  durationsEqual(p0.minTime, p1.minTime) &&
5668
5590
  durationsEqual(p0.maxTime, p1.maxTime);
5591
+ /*
5592
+ TODO: compare more?
5593
+ currentRange: DateRange
5594
+ currentRangeUnit: string
5595
+ isRangeAllDay: boolean
5596
+ isValid: boolean
5597
+ dateIncrement: Duration
5598
+ */
5669
5599
  }
5670
5600
 
5671
5601
  function reduce (state, action, calendar) {
@@ -5941,7 +5871,13 @@ Docs & License: https://fullcalendar.io/
5941
5871
  findViewNameBySubclass(theClass, overrideConfigs) ||
5942
5872
  findViewNameBySubclass(theClass, defaultConfigs);
5943
5873
  }
5944
- var superDef = superType ? ensureViewDef(superType, hash, defaultConfigs, overrideConfigs) : null;
5874
+ var superDef = null;
5875
+ if (superType) {
5876
+ if (superType === viewType) {
5877
+ throw new Error('Can\'t have a custom view type that references itself');
5878
+ }
5879
+ superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
5880
+ }
5945
5881
  if (!theClass && superDef) {
5946
5882
  theClass = superDef.class;
5947
5883
  }
@@ -6373,10 +6309,11 @@ Docs & License: https://fullcalendar.io/
6373
6309
  this.viewHeight = heightInput() - this.queryToolbarsHeight();
6374
6310
  }
6375
6311
  else if (heightInput === 'parent') { // set to height of parent element
6376
- this.viewHeight = this.el.parentNode.offsetHeight - this.queryToolbarsHeight();
6312
+ var parentEl = this.el.parentNode;
6313
+ this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
6377
6314
  }
6378
6315
  else {
6379
- this.viewHeight = Math.round(this.contentEl.offsetWidth /
6316
+ this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
6380
6317
  Math.max(calendar.opt('aspectRatio'), .5));
6381
6318
  }
6382
6319
  };
@@ -6394,7 +6331,7 @@ Docs & License: https://fullcalendar.io/
6394
6331
  // -----------------------------------------------------------------------------------------------------------------
6395
6332
  CalendarComponent.prototype.freezeHeight = function () {
6396
6333
  applyStyle(this.el, {
6397
- height: this.el.offsetHeight,
6334
+ height: this.el.getBoundingClientRect().height,
6398
6335
  overflow: 'hidden'
6399
6336
  });
6400
6337
  };
@@ -6607,7 +6544,7 @@ Docs & License: https://fullcalendar.io/
6607
6544
  this.buildTheme = memoize(buildTheme);
6608
6545
  this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
6609
6546
  this.buildSelectionConfig = memoize(this._buildSelectionConfig);
6610
- this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isObjectsSimilar);
6547
+ this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
6611
6548
  this.buildEventUiBases = memoize(buildEventUiBases);
6612
6549
  this.interactionsStore = {};
6613
6550
  this.actionQueue = [];
@@ -6873,6 +6810,9 @@ Docs & License: https://fullcalendar.io/
6873
6810
  theme: this.theme,
6874
6811
  options: this.optionsManager.computed
6875
6812
  }, this.el);
6813
+ this.isViewUpdated = true;
6814
+ this.isDatesUpdated = true;
6815
+ this.isEventsUpdated = true;
6876
6816
  }
6877
6817
  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 }));
6878
6818
  if (savedScroll) {
@@ -6903,98 +6843,61 @@ Docs & License: https://fullcalendar.io/
6903
6843
  };
6904
6844
  // Options
6905
6845
  // -----------------------------------------------------------------------------------------------------------------
6906
- /*
6907
- Not meant for public API
6908
- */
6909
- Calendar.prototype.resetOptions = function (options) {
6910
- var _this = this;
6911
- var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
6912
- var oldOptions = this.optionsManager.overrides;
6913
- var oldNormalOptions = {};
6914
- var normalOptions = {};
6915
- var specialOptions = {};
6916
- for (var name_1 in oldOptions) {
6917
- if (!changeHandlers[name_1]) {
6918
- oldNormalOptions[name_1] = oldOptions[name_1];
6919
- }
6920
- }
6921
- for (var name_2 in options) {
6922
- if (changeHandlers[name_2]) {
6923
- specialOptions[name_2] = options[name_2];
6924
- }
6925
- else {
6926
- normalOptions[name_2] = options[name_2];
6927
- }
6928
- }
6929
- this.batchRendering(function () {
6930
- if (anyKeysRemoved(oldNormalOptions, normalOptions)) {
6931
- _this.processOptions(options, 'reset');
6932
- }
6933
- else {
6934
- _this.processOptions(computeChangedProps(oldNormalOptions, normalOptions));
6935
- }
6936
- // handle special options last
6937
- for (var name_3 in specialOptions) {
6938
- changeHandlers[name_3](specialOptions[name_3], _this);
6939
- }
6940
- });
6846
+ Calendar.prototype.setOption = function (name, val) {
6847
+ var _a;
6848
+ this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
6849
+ };
6850
+ Calendar.prototype.getOption = function (name) {
6851
+ return this.optionsManager.computed[name];
6852
+ };
6853
+ Calendar.prototype.opt = function (name) {
6854
+ return this.optionsManager.computed[name];
6855
+ };
6856
+ Calendar.prototype.viewOpt = function (name) {
6857
+ return this.viewOpts()[name];
6858
+ };
6859
+ Calendar.prototype.viewOpts = function () {
6860
+ return this.viewSpecs[this.state.viewType].options;
6941
6861
  };
6942
6862
  /*
6943
- Not meant for public API. Won't give the same precedence that setOption does
6863
+ handles option changes (like a diff)
6944
6864
  */
6945
- Calendar.prototype.setOptions = function (options) {
6865
+ Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
6946
6866
  var _this = this;
6947
6867
  var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
6948
- var normalOptions = {};
6949
- var specialOptions = {};
6950
- for (var name_4 in options) {
6951
- if (changeHandlers[name_4]) {
6952
- specialOptions[name_4] = options[name_4];
6868
+ var normalUpdates = {};
6869
+ var specialUpdates = {};
6870
+ var oldDateEnv = this.dateEnv; // do this before handleOptions
6871
+ var isTimeZoneDirty = false;
6872
+ var isSizeDirty = false;
6873
+ var anyDifficultOptions = Boolean(removals.length);
6874
+ for (var name_1 in updates) {
6875
+ if (changeHandlers[name_1]) {
6876
+ specialUpdates[name_1] = updates[name_1];
6953
6877
  }
6954
6878
  else {
6955
- normalOptions[name_4] = options[name_4];
6879
+ normalUpdates[name_1] = updates[name_1];
6956
6880
  }
6957
6881
  }
6958
- this.batchRendering(function () {
6959
- _this.processOptions(normalOptions);
6960
- // handle special options last
6961
- for (var name_5 in specialOptions) {
6962
- changeHandlers[name_5](specialOptions[name_5], _this);
6963
- }
6964
- });
6965
- };
6966
- Calendar.prototype.processOptions = function (options, mode) {
6967
- var _this = this;
6968
- var oldDateEnv = this.dateEnv; // do this before handleOptions
6969
- var isTimeZoneDirty = false;
6970
- var isSizeDirty = false;
6971
- var anyDifficultOptions = false;
6972
- for (var name_6 in options) {
6973
- if (/^(height|contentHeight|aspectRatio)$/.test(name_6)) {
6882
+ for (var name_2 in normalUpdates) {
6883
+ if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
6974
6884
  isSizeDirty = true;
6975
6885
  }
6976
- else if (/^(defaultDate|defaultView)$/.test(name_6)) ;
6886
+ else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
6977
6887
  else {
6978
6888
  anyDifficultOptions = true;
6979
- if (name_6 === 'timeZone') {
6889
+ if (name_2 === 'timeZone') {
6980
6890
  isTimeZoneDirty = true;
6981
6891
  }
6982
6892
  }
6983
6893
  }
6984
- if (mode === 'reset') {
6985
- anyDifficultOptions = true;
6986
- this.optionsManager.reset(options);
6987
- }
6988
- else if (mode === 'dynamic') {
6989
- this.optionsManager.addDynamic(options); // takes higher precedence
6990
- }
6991
- else {
6992
- this.optionsManager.add(options);
6993
- }
6894
+ this.optionsManager.mutate(normalUpdates, removals, isDynamic);
6994
6895
  if (anyDifficultOptions) {
6995
- this.handleOptions(this.optionsManager.computed); // only for "difficult" options
6896
+ this.handleOptions(this.optionsManager.computed);
6996
6897
  this.needsFullRerender = true;
6997
- this.batchRendering(function () {
6898
+ }
6899
+ this.batchRendering(function () {
6900
+ if (anyDifficultOptions) {
6998
6901
  if (isTimeZoneDirty) {
6999
6902
  _this.dispatch({
7000
6903
  type: 'CHANGE_TIMEZONE',
@@ -7009,27 +6912,17 @@ Docs & License: https://fullcalendar.io/
7009
6912
  type: 'SET_VIEW_TYPE',
7010
6913
  viewType: _this.state.viewType
7011
6914
  });
7012
- });
7013
- }
7014
- if (isSizeDirty) {
7015
- this.updateSize();
7016
- }
7017
- };
7018
- Calendar.prototype.setOption = function (name, val) {
7019
- var _a;
7020
- this.processOptions((_a = {}, _a[name] = val, _a), 'dynamic');
7021
- };
7022
- Calendar.prototype.getOption = function (name) {
7023
- return this.optionsManager.computed[name];
7024
- };
7025
- Calendar.prototype.opt = function (name) {
7026
- return this.optionsManager.computed[name];
7027
- };
7028
- Calendar.prototype.viewOpt = function (name) {
7029
- return this.viewOpts()[name];
7030
- };
7031
- Calendar.prototype.viewOpts = function () {
7032
- return this.viewSpecs[this.state.viewType].options;
6915
+ }
6916
+ else if (isSizeDirty) {
6917
+ _this.updateSize();
6918
+ }
6919
+ // special updates
6920
+ if (deepEqual) {
6921
+ for (var name_3 in specialUpdates) {
6922
+ changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
6923
+ }
6924
+ }
6925
+ });
7033
6926
  };
7034
6927
  /*
7035
6928
  rebuilds things based off of a complete set of refined options
@@ -7084,10 +6977,10 @@ Docs & License: https://fullcalendar.io/
7084
6977
  };
7085
6978
  Calendar.prototype.releaseAfterSizingTriggers = function () {
7086
6979
  var afterSizingTriggers = this.afterSizingTriggers;
7087
- for (var name_7 in afterSizingTriggers) {
7088
- for (var _i = 0, _a = afterSizingTriggers[name_7]; _i < _a.length; _i++) {
6980
+ for (var name_4 in afterSizingTriggers) {
6981
+ for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
7089
6982
  var args = _a[_i];
7090
- this.publiclyTrigger(name_7, args);
6983
+ this.publiclyTrigger(name_4, args);
7091
6984
  }
7092
6985
  }
7093
6986
  this.afterSizingTriggers = {};
@@ -7102,7 +6995,7 @@ Docs & License: https://fullcalendar.io/
7102
6995
  var dateMarker = null;
7103
6996
  if (dateOrRange) {
7104
6997
  if (dateOrRange.start && dateOrRange.end) { // a range
7105
- this.optionsManager.addDynamic({ visibleRange: dateOrRange }); // will not rerender
6998
+ this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
7106
6999
  this.handleOptions(this.optionsManager.computed); // ...but yuck
7107
7000
  }
7108
7001
  else { // a date
@@ -7142,11 +7035,17 @@ Docs & License: https://fullcalendar.io/
7142
7035
  // Given a duration singular unit, like "week" or "day", finds a matching view spec.
7143
7036
  // Preference is given to views that have corresponding buttons.
7144
7037
  Calendar.prototype.getUnitViewSpec = function (unit) {
7145
- var viewTypes;
7038
+ var component = this.component;
7039
+ var viewTypes = [];
7146
7040
  var i;
7147
7041
  var spec;
7148
- // put views that have buttons first. there will be duplicates, but oh well
7149
- viewTypes = this.component.header.viewsWithButtons; // TODO: include footer as well?
7042
+ // put views that have buttons first. there will be duplicates, but oh
7043
+ if (component.header) {
7044
+ viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
7045
+ }
7046
+ if (component.footer) {
7047
+ viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
7048
+ }
7150
7049
  for (var viewType in this.viewSpecs) {
7151
7050
  viewTypes.push(viewType);
7152
7051
  }
@@ -7315,9 +7214,7 @@ Docs & License: https://fullcalendar.io/
7315
7214
  }
7316
7215
  };
7317
7216
  Calendar.prototype.triggerDateSelect = function (selection, pev) {
7318
- var arg = this.buildDateSpanApi(selection);
7319
- arg.jsEvent = pev ? pev.origEvent : null;
7320
- arg.view = this.view;
7217
+ var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
7321
7218
  this.publiclyTrigger('select', [arg]);
7322
7219
  };
7323
7220
  Calendar.prototype.triggerDateUnselect = function (pev) {
@@ -7330,10 +7227,8 @@ Docs & License: https://fullcalendar.io/
7330
7227
  };
7331
7228
  // TODO: receive pev?
7332
7229
  Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
7333
- var arg = this.buildDatePointApi(dateSpan);
7334
- arg.dayEl = dayEl;
7335
- arg.jsEvent = ev;
7336
- arg.view = view;
7230
+ var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
7231
+ view: view });
7337
7232
  this.publiclyTrigger('dateClick', [arg]);
7338
7233
  };
7339
7234
  Calendar.prototype.buildDatePointApi = function (dateSpan) {
@@ -7503,6 +7398,14 @@ Docs & License: https://fullcalendar.io/
7503
7398
  Calendar.prototype.refetchEvents = function () {
7504
7399
  this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
7505
7400
  };
7401
+ // Scroll
7402
+ // -----------------------------------------------------------------------------------------------------------------
7403
+ Calendar.prototype.scrollToTime = function (timeInput) {
7404
+ var duration = createDuration(timeInput);
7405
+ if (duration) {
7406
+ this.component.view.scrollToDuration(duration);
7407
+ }
7408
+ };
7506
7409
  return Calendar;
7507
7410
  }());
7508
7411
  EmitterMixin.mixInto(Calendar);
@@ -7619,7 +7522,10 @@ Docs & License: https://fullcalendar.io/
7619
7522
  // -----------------------------------------------------------------------------------------------------------------
7620
7523
  View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
7621
7524
  var calendar = this.calendar;
7622
- if (isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated) {
7525
+ if (isResize || // HACKS...
7526
+ calendar.isViewUpdated ||
7527
+ calendar.isDatesUpdated ||
7528
+ calendar.isEventsUpdated) {
7623
7529
  // sort of the catch-all sizing
7624
7530
  // anything that might cause dimension changes
7625
7531
  this.updateBaseSize(isResize, viewHeight, isAuto);
@@ -7631,7 +7537,9 @@ Docs & License: https://fullcalendar.io/
7631
7537
  // -----------------------------------------------------------------------------------------------------------------
7632
7538
  View.prototype.renderDatesWrap = function (dateProfile) {
7633
7539
  this.renderDates(dateProfile);
7634
- this.addScroll({ isDateInit: true });
7540
+ this.addScroll({
7541
+ duration: createDuration(this.opt('scrollTime'))
7542
+ });
7635
7543
  this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon
7636
7544
  };
7637
7545
  View.prototype.unrenderDatesWrap = function () {
@@ -7667,6 +7575,21 @@ Docs & License: https://fullcalendar.io/
7667
7575
  var props = this.props;
7668
7576
  return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;
7669
7577
  };
7578
+ View.prototype.computeEventDraggable = function (eventDef, eventUi) {
7579
+ var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers;
7580
+ var val = eventUi.startEditable;
7581
+ for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
7582
+ var transformer = transformers_1[_i];
7583
+ val = transformer(val, eventDef, eventUi, this);
7584
+ }
7585
+ return val;
7586
+ };
7587
+ View.prototype.computeEventStartResizable = function (eventDef, eventUi) {
7588
+ return eventUi.durationEditable && this.opt('eventResizableFromStart');
7589
+ };
7590
+ View.prototype.computeEventEndResizable = function (eventDef, eventUi) {
7591
+ return eventUi.durationEditable;
7592
+ };
7670
7593
  // Event Selection
7671
7594
  // -----------------------------------------------------------------------------------------------------------------
7672
7595
  View.prototype.renderEventSelectionWrap = function (instanceId) {
@@ -7803,17 +7726,18 @@ Docs & License: https://fullcalendar.io/
7803
7726
  return scroll;
7804
7727
  };
7805
7728
  View.prototype.applyScroll = function (scroll, isResize) {
7806
- if (scroll.isDateInit) {
7807
- delete scroll.isDateInit;
7729
+ var duration = scroll.duration;
7730
+ if (duration != null) {
7731
+ delete scroll.duration;
7808
7732
  if (this.props.dateProfile) { // dates rendered yet?
7809
- __assign(scroll, this.computeInitialDateScroll());
7733
+ __assign(scroll, this.computeDateScroll(duration));
7810
7734
  }
7811
7735
  }
7812
7736
  if (this.props.dateProfile) { // dates rendered yet?
7813
7737
  this.applyDateScroll(scroll);
7814
7738
  }
7815
7739
  };
7816
- View.prototype.computeInitialDateScroll = function () {
7740
+ View.prototype.computeDateScroll = function (duration) {
7817
7741
  return {}; // subclasses must implement
7818
7742
  };
7819
7743
  View.prototype.queryDateScroll = function () {
@@ -7822,6 +7746,10 @@ Docs & License: https://fullcalendar.io/
7822
7746
  View.prototype.applyDateScroll = function (scroll) {
7823
7747
  // subclasses must implement
7824
7748
  };
7749
+ // for API
7750
+ View.prototype.scrollToDuration = function (duration) {
7751
+ this.applyScroll({ duration: duration }, false);
7752
+ };
7825
7753
  return View;
7826
7754
  }(DateComponent));
7827
7755
  EmitterMixin.mixInto(View);
@@ -8631,7 +8559,7 @@ Docs & License: https://fullcalendar.io/
8631
8559
 
8632
8560
  // exports
8633
8561
  // --------------------------------------------------------------------------------------------------
8634
- var version = '4.0.2';
8562
+ var version = '4.3.1';
8635
8563
 
8636
8564
  exports.Calendar = Calendar;
8637
8565
  exports.Component = Component;
@@ -8719,7 +8647,6 @@ Docs & License: https://fullcalendar.io/
8719
8647
  exports.formatDate = formatDate;
8720
8648
  exports.formatIsoTimeString = formatIsoTimeString;
8721
8649
  exports.formatRange = formatRange;
8722
- exports.freezeRaw = freezeRaw;
8723
8650
  exports.getAllDayHtml = getAllDayHtml;
8724
8651
  exports.getClippingParents = getClippingParents;
8725
8652
  exports.getDayClasses = getDayClasses;
@@ -8741,11 +8668,10 @@ Docs & License: https://fullcalendar.io/
8741
8668
  exports.isInt = isInt;
8742
8669
  exports.isInteractionValid = isInteractionValid;
8743
8670
  exports.isMultiDayRange = isMultiDayRange;
8744
- exports.isObjectsSimilar = isObjectsSimilar;
8671
+ exports.isPropsEqual = isPropsEqual;
8745
8672
  exports.isPropsValid = isPropsValid;
8746
8673
  exports.isSingleDay = isSingleDay;
8747
8674
  exports.isValidDate = isValidDate;
8748
- exports.isValuesSimilar = isValuesSimilar;
8749
8675
  exports.listenBySelector = listenBySelector;
8750
8676
  exports.mapHash = mapHash;
8751
8677
  exports.matchCellWidths = matchCellWidths;