@fullcalendar/core 7.0.0-beta.3 → 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 (184) hide show
  1. package/index.cjs +54 -45
  2. package/index.global.js +205 -151
  3. package/index.global.min.js +2 -2
  4. package/index.js +56 -47
  5. package/internal-common.cjs +5151 -5106
  6. package/internal-common.d.ts +128 -85
  7. package/internal-common.js +5150 -5106
  8. package/internal.cjs +2 -1
  9. package/internal.d.ts +1 -1
  10. package/internal.js +1 -1
  11. package/locales/af.global.js +1 -1
  12. package/locales/af.global.min.js +1 -1
  13. package/locales/ar-dz.global.js +1 -1
  14. package/locales/ar-dz.global.min.js +1 -1
  15. package/locales/ar-kw.global.js +1 -1
  16. package/locales/ar-kw.global.min.js +1 -1
  17. package/locales/ar-ly.global.js +1 -1
  18. package/locales/ar-ly.global.min.js +1 -1
  19. package/locales/ar-ma.global.js +1 -1
  20. package/locales/ar-ma.global.min.js +1 -1
  21. package/locales/ar-sa.global.js +1 -1
  22. package/locales/ar-sa.global.min.js +1 -1
  23. package/locales/ar-tn.global.js +1 -1
  24. package/locales/ar-tn.global.min.js +1 -1
  25. package/locales/ar.global.js +1 -1
  26. package/locales/ar.global.min.js +1 -1
  27. package/locales/az.global.js +1 -1
  28. package/locales/az.global.min.js +1 -1
  29. package/locales/bg.global.js +1 -1
  30. package/locales/bg.global.min.js +1 -1
  31. package/locales/bn.global.js +1 -1
  32. package/locales/bn.global.min.js +1 -1
  33. package/locales/bs.global.js +1 -1
  34. package/locales/bs.global.min.js +1 -1
  35. package/locales/ca.global.js +1 -1
  36. package/locales/ca.global.min.js +1 -1
  37. package/locales/cs.global.js +1 -1
  38. package/locales/cs.global.min.js +1 -1
  39. package/locales/cy.global.js +1 -1
  40. package/locales/cy.global.min.js +1 -1
  41. package/locales/da.global.js +1 -1
  42. package/locales/da.global.min.js +1 -1
  43. package/locales/de-at.cjs +1 -2
  44. package/locales/de-at.global.js +2 -3
  45. package/locales/de-at.global.min.js +2 -2
  46. package/locales/de-at.js +1 -2
  47. package/locales/de.cjs +1 -2
  48. package/locales/de.global.js +2 -3
  49. package/locales/de.global.min.js +2 -2
  50. package/locales/de.js +1 -2
  51. package/locales/el.global.js +1 -1
  52. package/locales/el.global.min.js +1 -1
  53. package/locales/en-au.global.js +1 -1
  54. package/locales/en-au.global.min.js +1 -1
  55. package/locales/en-gb.global.js +1 -1
  56. package/locales/en-gb.global.min.js +1 -1
  57. package/locales/en-nz.global.js +1 -1
  58. package/locales/en-nz.global.min.js +1 -1
  59. package/locales/eo.global.js +1 -1
  60. package/locales/eo.global.min.js +1 -1
  61. package/locales/es-us.global.js +1 -1
  62. package/locales/es-us.global.min.js +1 -1
  63. package/locales/es.cjs +1 -2
  64. package/locales/es.global.js +2 -3
  65. package/locales/es.global.min.js +2 -2
  66. package/locales/es.js +1 -2
  67. package/locales/et.global.js +1 -1
  68. package/locales/et.global.min.js +1 -1
  69. package/locales/eu.global.js +1 -1
  70. package/locales/eu.global.min.js +1 -1
  71. package/locales/fa.global.js +1 -1
  72. package/locales/fa.global.min.js +1 -1
  73. package/locales/fi.global.js +1 -1
  74. package/locales/fi.global.min.js +1 -1
  75. package/locales/fr-ca.global.js +1 -1
  76. package/locales/fr-ca.global.min.js +1 -1
  77. package/locales/fr-ch.global.js +1 -1
  78. package/locales/fr-ch.global.min.js +1 -1
  79. package/locales/fr.global.js +1 -1
  80. package/locales/fr.global.min.js +1 -1
  81. package/locales/gl.cjs +1 -2
  82. package/locales/gl.global.js +2 -3
  83. package/locales/gl.global.min.js +2 -2
  84. package/locales/gl.js +1 -2
  85. package/locales/he.global.js +1 -1
  86. package/locales/he.global.min.js +1 -1
  87. package/locales/hi.global.js +1 -1
  88. package/locales/hi.global.min.js +1 -1
  89. package/locales/hr.global.js +1 -1
  90. package/locales/hr.global.min.js +1 -1
  91. package/locales/hu.global.js +1 -1
  92. package/locales/hu.global.min.js +1 -1
  93. package/locales/hy-am.global.js +1 -1
  94. package/locales/hy-am.global.min.js +1 -1
  95. package/locales/id.global.js +1 -1
  96. package/locales/id.global.min.js +1 -1
  97. package/locales/is.global.js +1 -1
  98. package/locales/is.global.min.js +1 -1
  99. package/locales/it.global.js +1 -1
  100. package/locales/it.global.min.js +1 -1
  101. package/locales/ja.global.js +1 -1
  102. package/locales/ja.global.min.js +1 -1
  103. package/locales/ka.global.js +1 -1
  104. package/locales/ka.global.min.js +1 -1
  105. package/locales/kk.global.js +1 -1
  106. package/locales/kk.global.min.js +1 -1
  107. package/locales/km.global.js +1 -1
  108. package/locales/km.global.min.js +1 -1
  109. package/locales/ko.global.js +1 -1
  110. package/locales/ko.global.min.js +1 -1
  111. package/locales/ku.global.js +1 -1
  112. package/locales/ku.global.min.js +1 -1
  113. package/locales/lb.global.js +1 -1
  114. package/locales/lb.global.min.js +1 -1
  115. package/locales/lt.global.js +1 -1
  116. package/locales/lt.global.min.js +1 -1
  117. package/locales/lv.global.js +1 -1
  118. package/locales/lv.global.min.js +1 -1
  119. package/locales/mk.global.js +1 -1
  120. package/locales/mk.global.min.js +1 -1
  121. package/locales/ms.global.js +1 -1
  122. package/locales/ms.global.min.js +1 -1
  123. package/locales/nb.global.js +1 -1
  124. package/locales/nb.global.min.js +1 -1
  125. package/locales/ne.global.js +1 -1
  126. package/locales/ne.global.min.js +1 -1
  127. package/locales/nl.global.js +1 -1
  128. package/locales/nl.global.min.js +1 -1
  129. package/locales/nn.global.js +1 -1
  130. package/locales/nn.global.min.js +1 -1
  131. package/locales/pl.global.js +1 -1
  132. package/locales/pl.global.min.js +1 -1
  133. package/locales/pt-br.cjs +1 -2
  134. package/locales/pt-br.global.js +2 -3
  135. package/locales/pt-br.global.min.js +2 -2
  136. package/locales/pt-br.js +1 -2
  137. package/locales/pt.global.js +1 -1
  138. package/locales/pt.global.min.js +1 -1
  139. package/locales/ro.global.js +1 -1
  140. package/locales/ro.global.min.js +1 -1
  141. package/locales/ru.global.js +1 -1
  142. package/locales/ru.global.min.js +1 -1
  143. package/locales/si-lk.global.js +1 -1
  144. package/locales/si-lk.global.min.js +1 -1
  145. package/locales/sk.global.js +1 -1
  146. package/locales/sk.global.min.js +1 -1
  147. package/locales/sl.global.js +1 -1
  148. package/locales/sl.global.min.js +1 -1
  149. package/locales/sm.global.js +1 -1
  150. package/locales/sm.global.min.js +1 -1
  151. package/locales/sq.global.js +1 -1
  152. package/locales/sq.global.min.js +1 -1
  153. package/locales/sr-cyrl.global.js +1 -1
  154. package/locales/sr-cyrl.global.min.js +1 -1
  155. package/locales/sr.global.js +1 -1
  156. package/locales/sr.global.min.js +1 -1
  157. package/locales/sv.cjs +1 -2
  158. package/locales/sv.global.js +2 -3
  159. package/locales/sv.global.min.js +2 -2
  160. package/locales/sv.js +1 -2
  161. package/locales/ta-in.global.js +1 -1
  162. package/locales/ta-in.global.min.js +1 -1
  163. package/locales/th.global.js +1 -1
  164. package/locales/th.global.min.js +1 -1
  165. package/locales/tr.global.js +1 -1
  166. package/locales/tr.global.min.js +1 -1
  167. package/locales/ug.global.js +1 -1
  168. package/locales/ug.global.min.js +1 -1
  169. package/locales/uk.global.js +1 -1
  170. package/locales/uk.global.min.js +1 -1
  171. package/locales/uz-cy.global.js +1 -1
  172. package/locales/uz-cy.global.min.js +1 -1
  173. package/locales/uz.global.js +1 -1
  174. package/locales/uz.global.min.js +1 -1
  175. package/locales/vi.global.js +1 -1
  176. package/locales/vi.global.min.js +1 -1
  177. package/locales/zh-cn.global.js +1 -1
  178. package/locales/zh-cn.global.min.js +1 -1
  179. package/locales/zh-tw.global.js +1 -1
  180. package/locales/zh-tw.global.min.js +1 -1
  181. package/locales-all.global.js +7 -13
  182. package/locales-all.global.min.js +2 -2
  183. package/package.json +1 -1
  184. 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 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 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) {
@@ -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
  }
@@ -1628,27 +1638,41 @@ class ToolbarSection extends BaseComponent {
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
- children.push(createElement("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: joinClassNames(`fc-${buttonName}-button`, theme.getClassName('button'), isPressed && theme.getClassName('buttonActive')), 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 }) : '')));
1647
1668
  }
1648
1669
  }
1649
1670
  if (children.length > 1) {
1650
- let groupClassName = (isOnlyButtons && theme.getClassName('buttonGroup')) || '';
1651
- 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);
1652
1676
  }
1653
1677
  return children[0];
1654
1678
  }
@@ -1657,33 +1681,15 @@ class ToolbarSection extends BaseComponent {
1657
1681
  class Toolbar extends BaseComponent {
1658
1682
  render() {
1659
1683
  let { model, className } = this.props;
1660
- let forceLtr = false;
1661
- let startContent;
1662
- let endContent;
1663
- let sectionWidgets = model.sectionWidgets;
1664
- let centerContent = sectionWidgets.center;
1665
- if (sectionWidgets.left) {
1666
- forceLtr = true;
1667
- startContent = sectionWidgets.left;
1668
- }
1669
- else {
1670
- startContent = sectionWidgets.start;
1671
- }
1672
- if (sectionWidgets.right) {
1673
- forceLtr = true;
1674
- endContent = sectionWidgets.right;
1675
- }
1676
- else {
1677
- endContent = sectionWidgets.end;
1678
- }
1679
- return (createElement("div", { className: joinClassNames(className, 'fc-toolbar', forceLtr && 'fc-toolbar-ltr') },
1680
- this.renderSection('start', startContent || []),
1681
- this.renderSection('center', centerContent || []),
1682
- this.renderSection('end', endContent || [])));
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)));
1683
1689
  }
1684
1690
  renderSection(key, widgetGroups) {
1685
1691
  let { props } = this;
1686
- 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 }));
1687
1693
  }
1688
1694
  }
1689
1695
 
@@ -1782,6 +1788,7 @@ class CalendarContent extends PureComponent {
1782
1788
  this.buildViewPropTransformers = memoize(buildViewPropTransformers);
1783
1789
  this.buildToolbarProps = memoize(buildToolbarProps);
1784
1790
  this.interactionsStore = {};
1791
+ this.viewTitleId = getUniqueDomId();
1785
1792
  // Component Registration
1786
1793
  // -----------------------------------------------------------------------------------------------------------------
1787
1794
  this.registerInteractiveComponent = (component, settingsInput) => {
@@ -1832,9 +1839,9 @@ class CalendarContent extends PureComponent {
1832
1839
  }
1833
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);
1834
1841
  return (createElement(ViewContextType.Provider, { value: viewContext },
1835
- toolbarConfig.header && (createElement(Toolbar, Object.assign({ className: "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))),
1836
1843
  createElement(ViewHarness, { height: viewHeight, heightLiquid: viewHeightLiquid, aspectRatio: viewAspectRatio },
1837
- this.renderView(props),
1844
+ this.renderView(props, toolbarProps.title),
1838
1845
  this.buildAppendContent()),
1839
1846
  toolbarConfig.footer && (createElement(Toolbar, Object.assign({ className: "fc-footer-toolbar", model: toolbarConfig.footer }, toolbarProps)))));
1840
1847
  }
@@ -1867,9 +1874,9 @@ class CalendarContent extends PureComponent {
1867
1874
  let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props));
1868
1875
  return createElement(Fragment, {}, ...children);
1869
1876
  }
1870
- renderView(props) {
1877
+ renderView(props, title) {
1871
1878
  let { pluginHooks } = props;
1872
- let { viewSpec } = props;
1879
+ let { viewSpec, toolbarConfig } = props;
1873
1880
  let viewProps = {
1874
1881
  dateProfile: props.dateProfile,
1875
1882
  businessHours: props.businessHours,
@@ -1880,6 +1887,8 @@ class CalendarContent extends PureComponent {
1880
1887
  eventDrag: props.eventDrag,
1881
1888
  eventResize: props.eventResize,
1882
1889
  forPrint: props.forPrint,
1890
+ labelId: toolbarConfig.header && toolbarConfig.header.hasTitle ? this.viewTitleId : undefined,
1891
+ labelStr: toolbarConfig.header && toolbarConfig.header.hasTitle ? undefined : title,
1883
1892
  };
1884
1893
  let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
1885
1894
  for (let transformer of transformers) {
@@ -2057,6 +2066,6 @@ function sliceEvents(props, allDay) {
2057
2066
  return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
2058
2067
  }
2059
2068
 
2060
- const version = '7.0.0-beta.3';
2069
+ const version = '7.0.0-beta.4';
2061
2070
 
2062
2071
  export { Calendar, createPlugin, formatDate, formatRange, globalLocales, globalPlugins, sliceEvents, version };