@fullcalendar/core 7.0.0-beta.1 → 7.0.0-beta.4

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.
Files changed (187) hide show
  1. package/index.cjs +68 -76
  2. package/index.d.ts +0 -1
  3. package/index.global.js +1454 -1325
  4. package/index.global.min.js +2 -2
  5. package/index.js +70 -78
  6. package/internal-common.cjs +2757 -2620
  7. package/internal-common.d.ts +263 -220
  8. package/internal-common.js +2743 -2603
  9. package/internal.cjs +12 -16
  10. package/internal.d.ts +1 -2
  11. package/internal.js +1 -1
  12. package/locales/af.global.js +1 -1
  13. package/locales/af.global.min.js +1 -1
  14. package/locales/ar-dz.global.js +1 -1
  15. package/locales/ar-dz.global.min.js +1 -1
  16. package/locales/ar-kw.global.js +1 -1
  17. package/locales/ar-kw.global.min.js +1 -1
  18. package/locales/ar-ly.global.js +1 -1
  19. package/locales/ar-ly.global.min.js +1 -1
  20. package/locales/ar-ma.global.js +1 -1
  21. package/locales/ar-ma.global.min.js +1 -1
  22. package/locales/ar-sa.global.js +1 -1
  23. package/locales/ar-sa.global.min.js +1 -1
  24. package/locales/ar-tn.global.js +1 -1
  25. package/locales/ar-tn.global.min.js +1 -1
  26. package/locales/ar.global.js +1 -1
  27. package/locales/ar.global.min.js +1 -1
  28. package/locales/az.global.js +1 -1
  29. package/locales/az.global.min.js +1 -1
  30. package/locales/bg.global.js +1 -1
  31. package/locales/bg.global.min.js +1 -1
  32. package/locales/bn.global.js +1 -1
  33. package/locales/bn.global.min.js +1 -1
  34. package/locales/bs.global.js +1 -1
  35. package/locales/bs.global.min.js +1 -1
  36. package/locales/ca.global.js +1 -1
  37. package/locales/ca.global.min.js +1 -1
  38. package/locales/cs.global.js +1 -1
  39. package/locales/cs.global.min.js +1 -1
  40. package/locales/cy.global.js +1 -1
  41. package/locales/cy.global.min.js +1 -1
  42. package/locales/da.global.js +1 -1
  43. package/locales/da.global.min.js +1 -1
  44. package/locales/de-at.cjs +1 -2
  45. package/locales/de-at.global.js +2 -3
  46. package/locales/de-at.global.min.js +2 -2
  47. package/locales/de-at.js +1 -2
  48. package/locales/de.cjs +1 -2
  49. package/locales/de.global.js +2 -3
  50. package/locales/de.global.min.js +2 -2
  51. package/locales/de.js +1 -2
  52. package/locales/el.global.js +1 -1
  53. package/locales/el.global.min.js +1 -1
  54. package/locales/en-au.global.js +1 -1
  55. package/locales/en-au.global.min.js +1 -1
  56. package/locales/en-gb.global.js +1 -1
  57. package/locales/en-gb.global.min.js +1 -1
  58. package/locales/en-nz.global.js +1 -1
  59. package/locales/en-nz.global.min.js +1 -1
  60. package/locales/eo.global.js +1 -1
  61. package/locales/eo.global.min.js +1 -1
  62. package/locales/es-us.global.js +1 -1
  63. package/locales/es-us.global.min.js +1 -1
  64. package/locales/es.cjs +1 -2
  65. package/locales/es.global.js +2 -3
  66. package/locales/es.global.min.js +2 -2
  67. package/locales/es.js +1 -2
  68. package/locales/et.global.js +1 -1
  69. package/locales/et.global.min.js +1 -1
  70. package/locales/eu.global.js +1 -1
  71. package/locales/eu.global.min.js +1 -1
  72. package/locales/fa.global.js +1 -1
  73. package/locales/fa.global.min.js +1 -1
  74. package/locales/fi.global.js +1 -1
  75. package/locales/fi.global.min.js +1 -1
  76. package/locales/fr-ca.global.js +1 -1
  77. package/locales/fr-ca.global.min.js +1 -1
  78. package/locales/fr-ch.global.js +1 -1
  79. package/locales/fr-ch.global.min.js +1 -1
  80. package/locales/fr.global.js +1 -1
  81. package/locales/fr.global.min.js +1 -1
  82. package/locales/gl.cjs +1 -2
  83. package/locales/gl.global.js +2 -3
  84. package/locales/gl.global.min.js +2 -2
  85. package/locales/gl.js +1 -2
  86. package/locales/he.global.js +1 -1
  87. package/locales/he.global.min.js +1 -1
  88. package/locales/hi.global.js +1 -1
  89. package/locales/hi.global.min.js +1 -1
  90. package/locales/hr.global.js +1 -1
  91. package/locales/hr.global.min.js +1 -1
  92. package/locales/hu.global.js +1 -1
  93. package/locales/hu.global.min.js +1 -1
  94. package/locales/hy-am.global.js +1 -1
  95. package/locales/hy-am.global.min.js +1 -1
  96. package/locales/id.global.js +1 -1
  97. package/locales/id.global.min.js +1 -1
  98. package/locales/is.global.js +1 -1
  99. package/locales/is.global.min.js +1 -1
  100. package/locales/it.global.js +1 -1
  101. package/locales/it.global.min.js +1 -1
  102. package/locales/ja.global.js +1 -1
  103. package/locales/ja.global.min.js +1 -1
  104. package/locales/ka.global.js +1 -1
  105. package/locales/ka.global.min.js +1 -1
  106. package/locales/kk.global.js +1 -1
  107. package/locales/kk.global.min.js +1 -1
  108. package/locales/km.global.js +1 -1
  109. package/locales/km.global.min.js +1 -1
  110. package/locales/ko.global.js +1 -1
  111. package/locales/ko.global.min.js +1 -1
  112. package/locales/ku.global.js +1 -1
  113. package/locales/ku.global.min.js +1 -1
  114. package/locales/lb.global.js +1 -1
  115. package/locales/lb.global.min.js +1 -1
  116. package/locales/lt.global.js +1 -1
  117. package/locales/lt.global.min.js +1 -1
  118. package/locales/lv.global.js +1 -1
  119. package/locales/lv.global.min.js +1 -1
  120. package/locales/mk.global.js +1 -1
  121. package/locales/mk.global.min.js +1 -1
  122. package/locales/ms.global.js +1 -1
  123. package/locales/ms.global.min.js +1 -1
  124. package/locales/nb.global.js +1 -1
  125. package/locales/nb.global.min.js +1 -1
  126. package/locales/ne.global.js +1 -1
  127. package/locales/ne.global.min.js +1 -1
  128. package/locales/nl.global.js +1 -1
  129. package/locales/nl.global.min.js +1 -1
  130. package/locales/nn.global.js +1 -1
  131. package/locales/nn.global.min.js +1 -1
  132. package/locales/pl.global.js +1 -1
  133. package/locales/pl.global.min.js +1 -1
  134. package/locales/pt-br.cjs +1 -2
  135. package/locales/pt-br.global.js +2 -3
  136. package/locales/pt-br.global.min.js +2 -2
  137. package/locales/pt-br.js +1 -2
  138. package/locales/pt.global.js +1 -1
  139. package/locales/pt.global.min.js +1 -1
  140. package/locales/ro.global.js +1 -1
  141. package/locales/ro.global.min.js +1 -1
  142. package/locales/ru.global.js +1 -1
  143. package/locales/ru.global.min.js +1 -1
  144. package/locales/si-lk.global.js +1 -1
  145. package/locales/si-lk.global.min.js +1 -1
  146. package/locales/sk.global.js +1 -1
  147. package/locales/sk.global.min.js +1 -1
  148. package/locales/sl.global.js +1 -1
  149. package/locales/sl.global.min.js +1 -1
  150. package/locales/sm.global.js +1 -1
  151. package/locales/sm.global.min.js +1 -1
  152. package/locales/sq.global.js +1 -1
  153. package/locales/sq.global.min.js +1 -1
  154. package/locales/sr-cyrl.global.js +1 -1
  155. package/locales/sr-cyrl.global.min.js +1 -1
  156. package/locales/sr.global.js +1 -1
  157. package/locales/sr.global.min.js +1 -1
  158. package/locales/sv.cjs +1 -2
  159. package/locales/sv.global.js +2 -3
  160. package/locales/sv.global.min.js +2 -2
  161. package/locales/sv.js +1 -2
  162. package/locales/ta-in.global.js +1 -1
  163. package/locales/ta-in.global.min.js +1 -1
  164. package/locales/th.global.js +1 -1
  165. package/locales/th.global.min.js +1 -1
  166. package/locales/tr.global.js +1 -1
  167. package/locales/tr.global.min.js +1 -1
  168. package/locales/ug.global.js +1 -1
  169. package/locales/ug.global.min.js +1 -1
  170. package/locales/uk.global.js +1 -1
  171. package/locales/uk.global.min.js +1 -1
  172. package/locales/uz-cy.global.js +1 -1
  173. package/locales/uz-cy.global.min.js +1 -1
  174. package/locales/uz.global.js +1 -1
  175. package/locales/uz.global.min.js +1 -1
  176. package/locales/vi.global.js +1 -1
  177. package/locales/vi.global.min.js +1 -1
  178. package/locales/zh-cn.global.js +1 -1
  179. package/locales/zh-cn.global.min.js +1 -1
  180. package/locales/zh-tw.global.js +1 -1
  181. package/locales/zh-tw.global.min.js +1 -1
  182. package/locales-all.global.js +7 -13
  183. package/locales-all.global.min.js +2 -2
  184. package/package.json +1 -1
  185. package/preact.cjs +1 -0
  186. package/preact.d.ts +3 -2
  187. package/preact.js +1 -1
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { m as mergeProps, g as guid, i as isArraysEqual, T as Theme, a as mapHash, B as BaseComponent, V as ViewContextType, C as ContentContainer, b as buildViewClassNames, c as greatestDurationDenominator, d as createDuration, e as BASE_OPTION_DEFAULTS, f as arrayToHash, h as filterHash, j as buildEventSourceRefiners, p as parseEventSource, k as formatWithOrdinals, u as unpromisify, l as buildRangeApiWithTimeZone, n as identity, r as requestJson, s as subtractDurations, o as intersectRanges, q as startOfDay, t as addDays, v as hashValuesToArray, w as buildEventApis, D as DelayedRunner, x as createFormatter, y as diffWholeDays, z as memoize, A as memoizeObjArg, E as isPropsEqual, F as Emitter, G as getInitialDate, H as rangeContainsMarker, I as createEmptyEventStore, J as reduceCurrentDate, K as reduceEventStore, L as rezoneEventStoreDates, M as mergeRawOptions, N as BASE_OPTION_REFINERS, O as CALENDAR_LISTENER_REFINERS, P as CALENDAR_OPTION_REFINERS, Q as COMPLEX_OPTION_COMPARATORS, R as VIEW_OPTION_REFINERS, S as DateEnv, U as DateProfileGenerator, W as createEventUi, X as parseBusinessHours, Y as Interaction, Z as getElEventRange, _ as elementClosest, $ as EventImpl, a0 as listenBySelector, a1 as listenToHoverBySelector, a2 as PureComponent, a3 as buildViewContext, a4 as parseInteractionSettings, a5 as interactionSettingsStore, a6 as getNow, a7 as getIsHeightAuto, a8 as CalendarImpl, a9 as flushSync, aa as CalendarRoot, ab as RenderId, ac as ensureElHasStyles, ad as applyStyleProp, ae as sliceEventStore } from './internal-common.js';
2
- export { af as JsonRequestError } from './internal-common.js';
1
+ import { m as mergeProps, g as guid, i as isArraysEqual, T as Theme, a as mapHash, B as BaseComponent, V as ViewContextType, C as ContentContainer, b as buildViewClassName, c as greatestDurationDenominator, d as createDuration, e as BASE_OPTION_DEFAULTS, f as arrayToHash, h as filterHash, j as buildEventSourceRefiners, p as parseEventSource, k as formatWithOrdinals, u as unpromisify, l as buildRangeApiWithTimeZone, n as identity, r as requestJson, s as subtractDurations, o as intersectRanges, q as startOfDay, t as addDays, v as hashValuesToArray, w as buildEventApis, D as DelayedRunner, x as createFormatter, y as diffWholeDays, z as memoize, A as memoizeObjArg, E as isPropsEqual, F as Emitter, G as getInitialDate, H as rangeContainsMarker, I as createEmptyEventStore, J as reduceCurrentDate, K as reduceEventStore, L as rezoneEventStoreDates, M as mergeRawOptions, N as BASE_OPTION_REFINERS, O as CALENDAR_LISTENER_REFINERS, P as CALENDAR_OPTION_REFINERS, Q as COMPLEX_OPTION_COMPARATORS, R as VIEW_OPTION_REFINERS, S as DateEnv, U as DateProfileGenerator, W as createEventUi, X as parseBusinessHours, Y as joinClassNames, Z as Interaction, _ as getElEventRange, $ as EventImpl, a0 as listenBySelector, a1 as listenToHoverBySelector, a2 as PureComponent, a3 as buildViewContext, a4 as getUniqueDomId, a5 as parseInteractionSettings, a6 as interactionSettingsStore, a7 as getNow, a8 as getIsHeightAuto, a9 as CalendarImpl, aa as flushSync, ab as CalendarRoot, ac as RenderId, ad as ensureElHasStyles, ae as applyStyleProp, af as sliceEventStore } from './internal-common.js';
2
+ export { ag as JsonRequestError } from './internal-common.js';
3
3
  import { createElement, Component, Fragment, render } from 'preact';
4
4
  import 'preact/compat';
5
5
 
@@ -27,9 +27,9 @@ const MINIMAL_RAW_EN_LOCALE = {
27
27
  weekText: 'W',
28
28
  weekTextLong: 'Week',
29
29
  closeHint: 'Close',
30
- timeHint: 'Time',
31
- eventHint: 'Event',
30
+ eventsHint: 'Events',
32
31
  allDayText: 'all-day',
32
+ timedText: 'timed',
33
33
  moreLinkText: 'more',
34
34
  noEventsText: 'No events to display',
35
35
  };
@@ -44,7 +44,7 @@ const RAW_EN_LOCALE = Object.assign(Object.assign({}, MINIMAL_RAW_EN_LOCALE), {
44
44
  ? 'Today'
45
45
  : `This ${buttonText}`;
46
46
  },
47
- }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) {
47
+ }, viewHint: '$0 view', viewChangeHint: 'Change view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) {
48
48
  return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
49
49
  } });
50
50
  function organizeRawLocales(explicitRawLocales) {
@@ -356,7 +356,7 @@ function parseViewConfig(input) {
356
356
  };
357
357
  }
358
358
  function createViewHookComponent(options) {
359
- return (viewProps) => (createElement(ViewContextType.Consumer, null, (context) => (createElement(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, customGenerator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount }))));
359
+ return (viewProps) => (createElement(ViewContextType.Consumer, null, (context) => (createElement(ContentContainer, { tag: "div", className: buildViewClassName(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, customGenerator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount }))));
360
360
  }
361
361
 
362
362
  function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
@@ -716,17 +716,25 @@ function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpec
716
716
  return { header, footer };
717
717
  }
718
718
  function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
719
- let sectionWidgets = {};
719
+ let isRtl = calendarOptions.direction === 'rtl';
720
720
  let viewsWithButtons = [];
721
721
  let hasTitle = false;
722
- for (let sectionName in sectionStrHash) {
723
- let sectionStr = sectionStrHash[sectionName];
722
+ function processSectionStr(sectionStr) {
724
723
  let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi);
725
- sectionWidgets[sectionName] = sectionRes.widgets;
726
724
  viewsWithButtons.push(...sectionRes.viewsWithButtons);
727
725
  hasTitle = hasTitle || sectionRes.hasTitle;
726
+ return sectionRes.widgets;
728
727
  }
729
- return { sectionWidgets, viewsWithButtons, hasTitle };
728
+ const sectionWidgets = {
729
+ start: processSectionStr(sectionStrHash[isRtl ? 'right' : 'left'] || sectionStrHash.start || ''),
730
+ center: processSectionStr(sectionStrHash.center || ''),
731
+ end: processSectionStr(sectionStrHash[isRtl ? 'left' : 'right'] || sectionStrHash.end || ''),
732
+ };
733
+ return {
734
+ sectionWidgets,
735
+ viewsWithButtons,
736
+ hasTitle,
737
+ };
730
738
  }
731
739
  /*
732
740
  BAD: querying icons and text here. should be done at render time
@@ -754,6 +762,7 @@ theme, viewSpecs, calendarApi) {
754
762
  let buttonIcon; // only one of these will be set
755
763
  let buttonText; // "
756
764
  let buttonHint;
765
+ let isView = false;
757
766
  // ^ for the title="" attribute, for accessibility
758
767
  if ((customButtonProps = calendarCustomButtons[buttonName])) {
759
768
  buttonClick = (ev) => {
@@ -767,6 +776,7 @@ theme, viewSpecs, calendarApi) {
767
776
  buttonHint = customButtonProps.hint || customButtonProps.text;
768
777
  }
769
778
  else if ((viewSpec = viewSpecs[buttonName])) {
779
+ isView = true;
770
780
  viewsWithButtons.push(buttonName);
771
781
  buttonClick = () => {
772
782
  calendarApi.changeView(buttonName);
@@ -804,7 +814,7 @@ theme, viewSpecs, calendarApi) {
804
814
  ], calendarButtonText[buttonName]);
805
815
  }
806
816
  }
807
- return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
817
+ return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint, isView };
808
818
  })));
809
819
  return { widgets, viewsWithButtons, hasTitle };
810
820
  }
@@ -1624,35 +1634,45 @@ class ToolbarSection extends BaseComponent {
1624
1634
  render() {
1625
1635
  let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup));
1626
1636
  return createElement('div', {
1627
- className: 'fc-toolbar-chunk fc-toolbar-' + this.props.name
1637
+ className: 'fc-toolbar-section fc-toolbar-' + this.props.name
1628
1638
  }, ...children);
1629
1639
  }
1630
1640
  renderWidgetGroup(widgetGroup) {
1631
- let { props } = this;
1632
- let { theme } = this.context;
1641
+ let { props, context } = this;
1642
+ let { options, theme } = context;
1633
1643
  let children = [];
1634
1644
  let isOnlyButtons = true;
1645
+ let isOnlyView = true;
1646
+ for (const widget of widgetGroup) {
1647
+ const { buttonName, isView } = widget;
1648
+ if (buttonName === 'title') {
1649
+ isOnlyButtons = false;
1650
+ }
1651
+ else if (!isView) {
1652
+ isOnlyView = false;
1653
+ }
1654
+ }
1635
1655
  for (let widget of widgetGroup) {
1636
1656
  let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget;
1637
1657
  if (buttonName === 'title') {
1638
- isOnlyButtons = false;
1639
- children.push(createElement("h2", { className: "fc-toolbar-title" }, props.title));
1658
+ children.push(createElement("div", { role: 'heading', "aria-level": options.headingLevel, id: props.titleId, className: 'fc-toolbar-title' }, props.title));
1640
1659
  }
1641
1660
  else {
1642
1661
  let isPressed = buttonName === props.activeButton;
1643
1662
  let isDisabled = (!props.isTodayEnabled && buttonName === 'today') ||
1644
1663
  (!props.isPrevEnabled && buttonName === 'prev') ||
1645
1664
  (!props.isNextEnabled && buttonName === 'next');
1646
- let buttonClasses = [`fc-${buttonName}-button`, theme.getClass('button')];
1647
- if (isPressed) {
1648
- buttonClasses.push(theme.getClass('buttonActive'));
1649
- }
1650
- children.push(createElement("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? createElement("span", { className: buttonIcon, role: "img" }) : '')));
1665
+ children.push(createElement("button", Object.assign({ type: "button", disabled: isDisabled }, ((isOnlyButtons && isOnlyView)
1666
+ ? { 'role': 'tab', 'aria-selected': isPressed }
1667
+ : { 'aria-pressed': isPressed }), { "aria-label": typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, className: joinClassNames(`fc-${buttonName}-button`, theme.getClassName('button'), isPressed && theme.getClassName('buttonActive')), onClick: buttonClick }), buttonText || (buttonIcon ? createElement("span", { className: buttonIcon, "aria-hidden": true }) : '')));
1651
1668
  }
1652
1669
  }
1653
1670
  if (children.length > 1) {
1654
- let groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || '';
1655
- return createElement('div', { className: groupClassName }, ...children);
1671
+ return createElement('div', {
1672
+ role: (isOnlyButtons && isOnlyView) ? 'tablist' : undefined,
1673
+ 'aria-label': (isOnlyButtons && isOnlyView) ? options.viewChangeHint : undefined,
1674
+ className: isOnlyButtons ? theme.getClassName('buttonGroup') : undefined,
1675
+ }, ...children);
1656
1676
  }
1657
1677
  return children[0];
1658
1678
  }
@@ -1660,39 +1680,16 @@ class ToolbarSection extends BaseComponent {
1660
1680
 
1661
1681
  class Toolbar extends BaseComponent {
1662
1682
  render() {
1663
- let { model, extraClassName } = this.props;
1664
- let forceLtr = false;
1665
- let startContent;
1666
- let endContent;
1667
- let sectionWidgets = model.sectionWidgets;
1668
- let centerContent = sectionWidgets.center;
1669
- if (sectionWidgets.left) {
1670
- forceLtr = true;
1671
- startContent = sectionWidgets.left;
1672
- }
1673
- else {
1674
- startContent = sectionWidgets.start;
1675
- }
1676
- if (sectionWidgets.right) {
1677
- forceLtr = true;
1678
- endContent = sectionWidgets.right;
1679
- }
1680
- else {
1681
- endContent = sectionWidgets.end;
1682
- }
1683
- let classNames = [
1684
- extraClassName || '',
1685
- 'fc-toolbar',
1686
- forceLtr ? 'fc-toolbar-ltr' : '',
1687
- ];
1688
- return (createElement("div", { className: classNames.join(' ') },
1689
- this.renderSection('start', startContent || []),
1690
- this.renderSection('center', centerContent || []),
1691
- this.renderSection('end', endContent || [])));
1683
+ let { model, className } = this.props;
1684
+ let { sectionWidgets } = model;
1685
+ return (createElement("div", { className: joinClassNames(className, 'fc-toolbar') },
1686
+ this.renderSection('start', sectionWidgets.start),
1687
+ this.renderSection('center', sectionWidgets.center),
1688
+ this.renderSection('end', sectionWidgets.end)));
1692
1689
  }
1693
1690
  renderSection(key, widgetGroups) {
1694
1691
  let { props } = this;
1695
- return (createElement(ToolbarSection, { key: key, name: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled }));
1692
+ return (createElement(ToolbarSection, { key: key, name: key, widgetGroups: widgetGroups, title: props.title, titleId: props.titleId, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled }));
1696
1693
  }
1697
1694
  }
1698
1695
 
@@ -1708,19 +1705,12 @@ class EventClicking extends Interaction {
1708
1705
  let eventRange = getElEventRange(segEl);
1709
1706
  if (eventRange && // might be the <div> surrounding the more link
1710
1707
  component.isValidSegDownEl(ev.target)) {
1711
- // our way to simulate a link click for elements that can't be <a> tags
1712
- // grab before trigger fired in case trigger trashes DOM thru rerendering
1713
- let hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url');
1714
- let url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
1715
1708
  context.emitter.trigger('eventClick', {
1716
1709
  el: segEl,
1717
1710
  event: new EventImpl(component.context, eventRange.def, eventRange.instance),
1718
1711
  jsEvent: ev,
1719
1712
  view: context.viewApi,
1720
1713
  });
1721
- if (url && !ev.defaultPrevented) {
1722
- window.location.href = url;
1723
- }
1724
1714
  }
1725
1715
  };
1726
1716
  this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events
@@ -1777,16 +1767,12 @@ class EventHovering extends Interaction {
1777
1767
  class ViewHarness extends Component {
1778
1768
  render() {
1779
1769
  const { props } = this;
1780
- return (createElement("div", { className: [
1781
- 'fc-view-harness',
1782
- props.height != null
1783
- ? 'fc-view-harness-fixedheight'
1784
- : props.heightLiquid
1785
- ? 'fc-view-harness-liquid'
1786
- : props.aspectRatio != null
1787
- ? 'fc-view-harness-aspectratio'
1788
- : ''
1789
- ].join(' '), style: {
1770
+ return (createElement("div", { className: joinClassNames('fc-view-outer', props.height != null
1771
+ ? 'fc-view-outer-static'
1772
+ : props.heightLiquid
1773
+ ? 'fc-view-outer-liquid'
1774
+ : props.aspectRatio != null
1775
+ && 'fc-view-outer-aspect-ratio'), style: {
1790
1776
  height: props.height,
1791
1777
  paddingBottom: props.aspectRatio != null
1792
1778
  ? `${(1 / props.aspectRatio) * 100}%`
@@ -1802,6 +1788,7 @@ class CalendarContent extends PureComponent {
1802
1788
  this.buildViewPropTransformers = memoize(buildViewPropTransformers);
1803
1789
  this.buildToolbarProps = memoize(buildToolbarProps);
1804
1790
  this.interactionsStore = {};
1791
+ this.viewTitleId = getUniqueDomId();
1805
1792
  // Component Registration
1806
1793
  // -----------------------------------------------------------------------------------------------------------------
1807
1794
  this.registerInteractiveComponent = (component, settingsInput) => {
@@ -1810,7 +1797,10 @@ class CalendarContent extends PureComponent {
1810
1797
  EventClicking,
1811
1798
  EventHovering,
1812
1799
  ];
1813
- let interactionClasses = DEFAULT_INTERACTIONS.concat(this.props.pluginHooks.componentInteractions);
1800
+ let interactionClasses = DEFAULT_INTERACTIONS;
1801
+ if (!settingsInput.disableHits) {
1802
+ interactionClasses = interactionClasses.concat(this.props.pluginHooks.componentInteractions);
1803
+ }
1814
1804
  let interactions = interactionClasses.map((TheInteractionClass) => new TheInteractionClass(settings));
1815
1805
  this.interactionsStore[component.uid] = interactions;
1816
1806
  interactionSettingsStore[component.uid] = settings;
@@ -1849,11 +1839,11 @@ class CalendarContent extends PureComponent {
1849
1839
  }
1850
1840
  let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent);
1851
1841
  return (createElement(ViewContextType.Provider, { value: viewContext },
1852
- toolbarConfig.header && (createElement(Toolbar, Object.assign({ extraClassName: "fc-header-toolbar", model: toolbarConfig.header }, toolbarProps))),
1842
+ toolbarConfig.header && (createElement(Toolbar, Object.assign({ className: "fc-header-toolbar", model: toolbarConfig.header, titleId: this.viewTitleId }, toolbarProps))),
1853
1843
  createElement(ViewHarness, { height: viewHeight, heightLiquid: viewHeightLiquid, aspectRatio: viewAspectRatio },
1854
- this.renderView(props),
1844
+ this.renderView(props, toolbarProps.title),
1855
1845
  this.buildAppendContent()),
1856
- toolbarConfig.footer && (createElement(Toolbar, Object.assign({ extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer }, toolbarProps)))));
1846
+ toolbarConfig.footer && (createElement(Toolbar, Object.assign({ className: "fc-footer-toolbar", model: toolbarConfig.footer }, toolbarProps)))));
1857
1847
  }
1858
1848
  componentDidMount() {
1859
1849
  let { props } = this;
@@ -1884,9 +1874,9 @@ class CalendarContent extends PureComponent {
1884
1874
  let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props));
1885
1875
  return createElement(Fragment, {}, ...children);
1886
1876
  }
1887
- renderView(props) {
1877
+ renderView(props, title) {
1888
1878
  let { pluginHooks } = props;
1889
- let { viewSpec } = props;
1879
+ let { viewSpec, toolbarConfig } = props;
1890
1880
  let viewProps = {
1891
1881
  dateProfile: props.dateProfile,
1892
1882
  businessHours: props.businessHours,
@@ -1897,6 +1887,8 @@ class CalendarContent extends PureComponent {
1897
1887
  eventDrag: props.eventDrag,
1898
1888
  eventResize: props.eventResize,
1899
1889
  forPrint: props.forPrint,
1890
+ labelId: toolbarConfig.header && toolbarConfig.header.hasTitle ? this.viewTitleId : undefined,
1891
+ labelStr: toolbarConfig.header && toolbarConfig.header.hasTitle ? undefined : title,
1900
1892
  };
1901
1893
  let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
1902
1894
  for (let transformer of transformers) {
@@ -2074,6 +2066,6 @@ function sliceEvents(props, allDay) {
2074
2066
  return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
2075
2067
  }
2076
2068
 
2077
- const version = '7.0.0-beta.1';
2069
+ const version = '7.0.0-beta.4';
2078
2070
 
2079
2071
  export { Calendar, createPlugin, formatDate, formatRange, globalLocales, globalPlugins, sliceEvents, version };