diff --git a/app/assets/javascripts/property_hire_fullcalendar.js b/app/assets/javascripts/property_hire_fullcalendar.js index 96918d4..a3fb4a6 100644 --- a/app/assets/javascripts/property_hire_fullcalendar.js +++ b/app/assets/javascripts/property_hire_fullcalendar.js @@ -1,337 +1,8 @@ /*! -FullCalendar Scheduler v5.8.0 -Docs & License: https://fullcalendar.io/scheduler +FullCalendar v5.11.0 +Docs & License: https://fullcalendar.io/ (c) 2021 Adam Shaw */ -var ie_args = navigator && navigator.userAgent.match(/MSIE\s+(\d+)/); -var is_below_es6 = false; -if(ie_args){ - var ie_ver = parseInt(ie_args[1]); - if(ie_ver <= 10 || !Object.__proto__){ - Object.setPrototypeOf = function(obj, proto) { - obj.prototype = Object.create(proto.prototype); - obj.prototype.constructor = obj; - obj.__proto__ = proto; - var own_props = Object.getOwnPropertyNames(proto); - own_props.forEach(function(prop){ - try{ - if(prop == "caller" || prop == "length" || prop == "arguments") - return; - obj[prop] = proto[prop]; - }catch(e){}; - }) - return obj; - } - var global = (((typeof(globalThis)).toLowerCase() == "undefined") ? window : globalThis); - if((typeof(DOMTokenList)).toLowerCase() == "undefined"){ - /** - * Polyfill of DOMTokenList for IE < 9 - * Monkey patch of .add, .remove for IE 10 / 11, Firefox < 26 to support multiple arguments - * Monkey patch of .toggle for IE 10 / 11, Firefox < 24 to support second argument - */ - /*global define: false, module: false */ - /*jslint nomen: true */ - (function domTokenListModule(global, definition) { // non-exporting module magic dance - 'use strict'; - - var - amd = 'amd', - exports = 'exports'; // keeps the method names for CommonJS / AMD from being compiled to single character variable - - if (typeof define === 'function' && define[amd]) { - define(function definer() { - return definition(global); - }); - } else if (typeof module === 'function' && module[exports]) { - module[exports] = definition(global); - } else { - definition(global); - } - }(this, function domTokenListPolyfill(global) { - 'use strict'; - - if (!global.Element) { - return; - } - - var - document = global.document, - id = 0, - lists = {}, - test = document.createElement('_'); - - /** - * @private - */ - function createMethod(method) { - var - original = this.prototype[method]; - - this.prototype[method] = function override() { - var - counter, - length, - token; - - for (counter = 0, length = arguments.length; counter < length; counter += 1) { - token = arguments[counter]; - original.call(this, token); - } - }; - } - - /** - * @private - * @param {string} token Token to search for - */ - function indexOf(token) { - var - arrayPrototype = Array.prototype, - counter; - - if (!!arrayPrototype.indexOf) { - return arrayPrototype.indexOf.call(this, token); - } - - counter = this.length - 1; - while (counter > -1) { - if (this[counter] === token) { - return counter; - } - - counter -= 1; - } - - return -1; - } - - /** - * @private - */ - function newId() { - id += 1; - - return id; - } - - /** - * @private - */ - function onchange() { - var - classes = this.classes, - classesString = classes.join(' '); - - if (this.isSVG) { - this.setAttribute('class', classesString); - } else { - this.element.className = classesString; - } - - this.list.length = classes.length; - } - - /** - * @param {string} token Token to find - */ - function contains(token) { - return indexOf.call(lists[this.id].classes, token) !== -1; - } - - function add() { - var - counter = 0, - item = lists[this.id], - classes = item.classes, - length = arguments.length, - token, - updated = false; - - while (counter < length) { - token = arguments[counter]; - if (indexOf.call(classes, token) === -1) { - classes.push(token); - updated = true; - } - - counter += 1; - } - - if (updated) { - onchange.call(item); - } - } - - /** - * @param {number} index Index of list to return value - */ - function item(index) { - return lists[this.id].classes[index] || null; - } - - function remove() { - var - counter = arguments.length - 1, - entry = lists[this.id], - classes = entry.classes, - index, - token, - updated = false; - - while (counter > -1) { - token = arguments[counter]; - index = indexOf.call(classes, token); - if (index !== -1) { - classes.splice(index, 1); - updated = true; - } - - counter -= 1; - } - - if (updated) { - onchange.call(entry); - } - } - - function toString() { - var - entry = lists[this.id]; - - onchange.call(entry); - return entry.element.className; - } - - /** - * @param {string} token Token to toggle - * @param {force=} force Flag to force toggle - */ - function toggle(token, force) { - var - hasToken = indexOf.call(lists[this.id].classes, token) !== -1, - method; - - if (hasToken) { - if (force !== true) { - method = 'remove'; - } - } else { - if (force !== false) { - method = 'add'; - } - } - - if (method) { - this[method](token); - } - - return (force === true || force === false) ? force : !hasToken; - } - - /** - * @constructor - */ - function DOMTokenList(element) { - var - className, - listId, - isSVG; - - listId = element.domTokenListId; - if (listId && (listId in lists)) { - return lists[listId].list; - } - - isSVG = typeof element.className === 'object'; - className = element.className; - className = String(isSVG ? className.baseVal : className).replace(/^\s+|\s+$/, ''); - listId = newId(); - - lists[listId] = { - classes: className.length !== 0 ? className.split(/\s+/) : [], - element: element, - list: this, - isSVG: isSVG - }; - this.id = listId; - this.length = lists[listId].classes.length; - element.domTokenListId = listId; // apply id lookup reference to element - } - - if (!('classList' in test)) { - (function () { - var - counter, - elementPrototype = global.Element.prototype, - methodList = [add, contains, item, remove, toString, toggle], - methods = ['add', 'contains', 'item', 'remove', 'toString', 'toggle'], - propertyDescriptor, - prototype = DOMTokenList.prototype; - - function get() { - var - thisId = this.domTokenListId; - - return thisId && (thisId in lists) ? lists[thisId].list : new DOMTokenList(this); - } - - counter = methods.length - 1; - while (counter > -1) { - prototype[methods[counter]] = methodList[counter]; - counter -= 1; - } - - propertyDescriptor = { - get: get, - configurable: true, - enumerable: true - }; - - if (Object.defineProperty) { - try { - Object.defineProperty(elementPrototype, 'classList', propertyDescriptor); - } catch (ex) { - if (ex.number === -0x7FF5EC54) { // IE 8 doesn't like it to be enumerable - propertyDescriptor.enumerable = false; - Object.defineProperty(elementPrototype, 'classList', propertyDescriptor); - } - } - } else if (Object.prototype.__defineGetter__) { - elementPrototype.__defineGetter__('classList', propertyDescriptor); - } - - global.DOMTokenList = DOMTokenList; - }()); - } else { - test.classList.add('c1', 'c2'); - - if (!test.classList.contains('c2')) { // IE 10 / 11, Firefox < 26 - createMethod.call(global.DOMTokenList, 'add'); - createMethod.call(global.DOMTokenList, 'remove'); - } - - test.classList.toggle('c3', false); - if (test.classList.contains('c3')) { // IE 10 / 11, Firefox < 24 - global.DOMTokenList.prototype.toggle = (function () { - var - original = global.DOMTokenList.prototype.toggle; - - return function toggle(token, force) { - var - notForce = !force; - - return (arguments.length > 1 && !(this.contains(token) === notForce)) ? force : original.call(this, token); - }; - }()); - } - - test = null; - } - })); - } - is_below_es6 = true; - } -} var FullCalendar = (function (exports) { 'use strict'; @@ -362,7 +33,6 @@ var FullCalendar = (function (exports) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); - d.__proto__ = b; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } @@ -378,10 +48,14 @@ var FullCalendar = (function (exports) { return __assign.apply(this, arguments); }; - function __spreadArray(to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) - to[j] = from[i]; - return to; + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || from); } var n,u,i$1,t,o,r$1={},f$1=[],e$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function c$1(n,l){for(var u in l)n[u]=l[u];return n}function s(n){var l=n.parentNode;l&&l.removeChild(n);}function a$1(n,l,u){var i,t,o,r=arguments,f={};for(o in l)"key"==o?i=l[o]:"ref"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o0?v$1(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(_=A[h])||_&&k.key==_.key&&k.type===_.type)A[h]=void 0;else for(p=0;p 0 ? explicitRawLocales[0].code : 'en'; var allRawLocales = globalLocales.concat(explicitRawLocales); var rawLocaleMap = { - en: RAW_EN_LOCALE, // necessary? + en: RAW_EN_LOCALE, }; for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) { var rawLocale = allRawLocales_1[_i]; @@ -4492,7 +4264,7 @@ var FullCalendar = (function (exports) { return null; } function parseLocale(codeArg, codes, raw) { - var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']); + var merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']); delete merged.code; // don't want this part of the options var week = merged.week; delete merged.week; @@ -4840,12 +4612,33 @@ var FullCalendar = (function (exports) { return classNames; } - function buildNavLinkData(date, type) { - if (type === void 0) { type = 'day'; } - return JSON.stringify({ - date: formatDayString(date), - type: type, - }); + var DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' }); + var WEEK_FORMAT = createFormatter({ week: 'long' }); + function buildNavLinkAttrs(context, dateMarker, viewType, isTabbable) { + if (viewType === void 0) { viewType = 'day'; } + if (isTabbable === void 0) { isTabbable = true; } + var dateEnv = context.dateEnv, options = context.options, calendarApi = context.calendarApi; + var dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT); + if (options.navLinks) { + var zonedDate = dateEnv.toDate(dateMarker); + var handleInteraction = function (ev) { + var customAction = viewType === 'day' ? options.navLinkDayClick : + viewType === 'week' ? options.navLinkWeekClick : null; + if (typeof customAction === 'function') { + customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev); + } + else { + if (typeof customAction === 'string') { + viewType = customAction; + } + calendarApi.zoomTo(dateMarker, viewType); + } + }; + return __assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable + ? createAriaClickAttrs(handleInteraction) + : { onClick: handleInteraction })); + } + return { 'aria-label': dateStr }; } var _isRtlScrollbarOnLeft = null; @@ -5058,8 +4851,8 @@ var FullCalendar = (function (exports) { } }; Emitter.prototype.hasHandlers = function (type) { - return (this.handlers[type] && this.handlers[type].length) || - (this.options && this.options[type]); + return Boolean((this.handlers[type] && this.handlers[type].length) || + (this.options && this.options[type])); }; return Emitter; }()); @@ -5328,7 +5121,7 @@ var FullCalendar = (function (exports) { var Fragment = FullCalendarVDom.Fragment; var createContext = FullCalendarVDom.createContext; var createPortal = FullCalendarVDom.createPortal; - var flushToDom = FullCalendarVDom.flushToDom; + var flushSync = FullCalendarVDom.flushSync; var unmountComponentAtNode = FullCalendarVDom.unmountComponentAtNode; /* eslint-enable */ @@ -5762,39 +5555,56 @@ var FullCalendar = (function (exports) { } }; ContentHookInner.prototype.renderInnerContent = function () { - var contentTypeHandlers = this.context.pluginHooks.contentTypeHandlers; - var _a = this, props = _a.props, customContentInfo = _a.customContentInfo; - var rawVal = props.content; - var innerContent = normalizeContent(rawVal, props.hookProps); - var innerContentVDom = null; + var customContentInfo = this.customContentInfo; // only populated if using non-[p]react node(s) + var innerContent = this.getInnerContent(); + var meta = this.getContentMeta(innerContent); + // initial run, or content-type changing? (from vue -> react for example) + if (!customContentInfo || customContentInfo.contentKey !== meta.contentKey) { + // clearing old value + if (customContentInfo) { + if (customContentInfo.destroy) { + customContentInfo.destroy(); + } + customContentInfo = this.customContentInfo = null; + } + // assigning new value + if (meta.contentKey) { + customContentInfo = this.customContentInfo = __assign({ contentKey: meta.contentKey, contentVal: innerContent[meta.contentKey] }, meta.buildLifecycleFuncs()); + } + // updating + } + else if (customContentInfo) { + customContentInfo.contentVal = innerContent[meta.contentKey]; + } + return customContentInfo + ? [] // signal that something was specified + : innerContent; // assume a [p]react vdom node. use it + }; + ContentHookInner.prototype.getInnerContent = function () { + var props = this.props; + var innerContent = normalizeContent(props.content, props.hookProps); if (innerContent === undefined) { // use the default innerContent = normalizeContent(props.defaultContent, props.hookProps); } - if (innerContent !== undefined) { // we allow custom content handlers to return nothing - if (customContentInfo) { - customContentInfo.contentVal = innerContent[customContentInfo.contentKey]; - } - else if (typeof innerContent === 'object') { - // look for a prop that would indicate a custom content handler is needed - for (var contentKey in contentTypeHandlers) { - if (innerContent[contentKey] !== undefined) { - var stuff = contentTypeHandlers[contentKey](); - customContentInfo = this.customContentInfo = __assign({ contentKey: contentKey, contentVal: innerContent[contentKey] }, stuff); - break; - } + return innerContent == null ? null : innerContent; // convert undefined to null (better for React) + }; + ContentHookInner.prototype.getContentMeta = function (innerContent) { + var contentTypeHandlers = this.context.pluginHooks.contentTypeHandlers; + var contentKey = ''; + var buildLifecycleFuncs = null; + if (innerContent) { // allowed to be null, for convenience to caller + for (var searchKey in contentTypeHandlers) { + if (innerContent[searchKey] !== undefined) { + contentKey = searchKey; + buildLifecycleFuncs = contentTypeHandlers[searchKey]; + break; } } - if (customContentInfo) { - innerContentVDom = []; // signal that something was specified - } - else { - innerContentVDom = innerContent; // assume a [p]react vdom node. use it - } } - return innerContentVDom; + return { contentKey: contentKey, buildLifecycleFuncs: buildLifecycleFuncs }; }; ContentHookInner.prototype.updateCustomContent = function () { - if (this.customContentInfo) { + if (this.customContentInfo) { // for non-[p]react this.customContentInfo.render(this.innerElRef.current || this.props.backupElRef.current, // the element to render into this.customContentInfo.contentVal); } @@ -5938,6 +5748,20 @@ var FullCalendar = (function (exports) { } return null; }; + var queryButtonTitle = function (optionsSubset) { + var buttonHints = optionsSubset.buttonHints || {}; + var buttonKey = viewDef.defaults.buttonTextKey; // use same key as text + if (buttonKey != null && buttonHints[buttonKey] != null) { + return buttonHints[buttonKey]; + } + if (buttonHints[viewDef.type] != null) { + return buttonHints[viewDef.type]; + } + if (buttonHints[singleUnit] != null) { + return buttonHints[singleUnit]; + } + return null; + }; return { type: viewDef.type, component: viewDef.component, @@ -5952,7 +5776,15 @@ var FullCalendar = (function (exports) { buttonTextDefault: queryButtonText(localeDefaults) || viewDef.defaults.buttonText || queryButtonText(BASE_OPTION_DEFAULTS) || - viewDef.type, // fall back to given view name + viewDef.type, + // not DRY + buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) || + queryButtonTitle(optionOverrides) || + viewDef.overrides.buttonHint, + buttonTitleDefault: queryButtonTitle(localeDefaults) || + viewDef.defaults.buttonHint || + queryButtonTitle(BASE_OPTION_DEFAULTS), + // will eventually fall back to buttonText }; } // hack to get memoization working @@ -6343,7 +6175,7 @@ var FullCalendar = (function (exports) { excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); case 'RECEIVE_EVENTS': case 'RECEIVE_EVENT_ERROR': - return receiveResponse$1(eventSources, action.sourceId, action.fetchId, action.fetchRange); + return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); case 'REMOVE_ALL_EVENT_SOURCES': return {}; default: @@ -6394,7 +6226,7 @@ var FullCalendar = (function (exports) { for (var sourceId in prevSources) { var source = prevSources[sourceId]; if (sourceIdHash[sourceId]) { - nextSources[sourceId] = fetchSource$1(source, fetchRange, isRefetch, context); + nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context); } else { nextSources[sourceId] = source; @@ -6402,7 +6234,7 @@ var FullCalendar = (function (exports) { } return nextSources; } - function fetchSource$1(eventSource, fetchRange, isRefetch, context) { + function fetchSource(eventSource, fetchRange, isRefetch, context) { var options = context.options, calendarApi = context.calendarApi; var sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; var fetchId = guid(); @@ -6444,7 +6276,7 @@ var FullCalendar = (function (exports) { }); return __assign(__assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); } - function receiveResponse$1(sourceHash, sourceId, fetchId, fetchRange) { + function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { var _a; var eventSource = sourceHash[sourceId]; if (eventSource && // not already removed @@ -6643,25 +6475,41 @@ var FullCalendar = (function (exports) { } function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { - var viewsWithButtons = []; - var headerToolbar = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) : null; - var footerToolbar = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) : null; - return { headerToolbar: headerToolbar, footerToolbar: footerToolbar, viewsWithButtons: viewsWithButtons }; + var header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; + var footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; + return { header: header, footer: footer }; } - function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) { - return mapHash(sectionStrHash, function (sectionStr) { return parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons); }); + function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { + var sectionWidgets = {}; + var viewsWithButtons = []; + var hasTitle = false; + for (var sectionName in sectionStrHash) { + var sectionStr = sectionStrHash[sectionName]; + var sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); + sectionWidgets[sectionName] = sectionRes.widgets; + viewsWithButtons.push.apply(viewsWithButtons, sectionRes.viewsWithButtons); + hasTitle = hasTitle || sectionRes.hasTitle; + } + return { sectionWidgets: sectionWidgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; } /* BAD: querying icons and text here. should be done at render time */ - function parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) { + function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined + calendarOptionOverrides, // overrides only!, unrefined :( + theme, viewSpecs, calendarApi) { var isRtl = calendarOptions.direction === 'rtl'; var calendarCustomButtons = calendarOptions.customButtons || {}; var calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; var calendarButtonText = calendarOptions.buttonText || {}; + var calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; + var calendarButtonHints = calendarOptions.buttonHints || {}; var sectionSubstrs = sectionStr ? sectionStr.split(' ') : []; - return sectionSubstrs.map(function (buttonGroupStr) { return (buttonGroupStr.split(',').map(function (buttonName) { + var viewsWithButtons = []; + var hasTitle = false; + var widgets = sectionSubstrs.map(function (buttonGroupStr) { return (buttonGroupStr.split(',').map(function (buttonName) { if (buttonName === 'title') { + hasTitle = true; return { buttonName: buttonName }; } var customButtonProps; @@ -6669,6 +6517,8 @@ var FullCalendar = (function (exports) { var buttonClick; var buttonIcon; // only one of these will be set var buttonText; // " + var buttonHint; + // ^ for the title="" attribute, for accessibility if ((customButtonProps = calendarCustomButtons[buttonName])) { buttonClick = function (ev) { if (customButtonProps.click) { @@ -6678,6 +6528,7 @@ var FullCalendar = (function (exports) { (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = customButtonProps.text); + buttonHint = customButtonProps.hint || customButtonProps.text; } else if ((viewSpec = viewSpecs[buttonName])) { viewsWithButtons.push(buttonName); @@ -6687,6 +6538,12 @@ var FullCalendar = (function (exports) { (buttonText = viewSpec.buttonTextOverride) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = viewSpec.buttonTextDefault); + var textFallback = viewSpec.buttonTextOverride || + viewSpec.buttonTextDefault; + buttonHint = formatWithOrdinals(viewSpec.buttonTitleOverride || + viewSpec.buttonTitleDefault || + calendarOptions.viewHint, [textFallback, buttonName], // view-name = buttonName + textFallback); } else if (calendarApi[buttonName]) { // a calendarApi method buttonClick = function () { @@ -6694,11 +6551,26 @@ var FullCalendar = (function (exports) { }; (buttonText = calendarButtonTextOverrides[buttonName]) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || - (buttonText = calendarButtonText[buttonName]); - // ^ everything else is considered default + (buttonText = calendarButtonText[buttonName]); // everything else is considered default + if (buttonName === 'prevYear' || buttonName === 'nextYear') { + var prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next'; + buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || + calendarButtonHints[prevOrNext], [ + calendarButtonText.year || 'year', + 'year', + ], calendarButtonText[buttonName]); + } + else { + buttonHint = function (navUnit) { return formatWithOrdinals(calendarButtonHintOverrides[buttonName] || + calendarButtonHints[buttonName], [ + calendarButtonText[navUnit] || navUnit, + navUnit, + ], calendarButtonText[buttonName]); }; + } } - return { buttonName: buttonName, buttonClick: buttonClick, buttonIcon: buttonIcon, buttonText: buttonText }; + return { buttonName: buttonName, buttonClick: buttonClick, buttonIcon: buttonIcon, buttonText: buttonText, buttonHint: buttonHint }; })); }); + return { widgets: widgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; } var eventSourceDef$3 = { @@ -6817,7 +6689,7 @@ var FullCalendar = (function (exports) { }, fetch: function (arg, success, failure) { var meta = arg.eventSource.meta; - var requestParams = buildRequestParams$2(meta, arg.range, arg.context); + var requestParams = buildRequestParams$1(meta, arg.range, arg.context); requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) { success({ rawEvents: rawEvents, xhr: xhr }); }, function (errorMessage, xhr) { @@ -6829,7 +6701,7 @@ var FullCalendar = (function (exports) { eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, eventSourceDefs: [eventSourceDef$1], }); - function buildRequestParams$2(meta, range, context) { + function buildRequestParams$1(meta, range, context) { var dateEnv = context.dateEnv, options = context.options; var startParam; var endParam; @@ -7003,8 +6875,8 @@ var FullCalendar = (function (exports) { function (state) { return computeEventSourcesLoading(state.eventSources); }, ], contentTypeHandlers: { - html: function () { return ({ render: injectHtml }); }, - domNodes: function () { return ({ render: injectDomNodes }); }, + html: buildHtmlRenderer, + domNodes: buildDomNodeRenderer, }, propSetHandlers: { dateProfile: handleDateProfile, @@ -7012,19 +6884,45 @@ var FullCalendar = (function (exports) { }, }), ]; - function injectHtml(el, html) { - el.innerHTML = html; - } - function injectDomNodes(el, domNodes) { - var oldNodes = Array.prototype.slice.call(el.childNodes); // TODO: use array util - var newNodes = Array.prototype.slice.call(domNodes); // TODO: use array util - if (!isArraysEqual(oldNodes, newNodes)) { - for (var _i = 0, newNodes_1 = newNodes; _i < newNodes_1.length; _i++) { - var newNode = newNodes_1[_i]; - el.appendChild(newNode); + function buildHtmlRenderer() { + var currentEl = null; + var currentHtml = ''; + function render(el, html) { + if (el !== currentEl || html !== currentHtml) { + el.innerHTML = html; } - oldNodes.forEach(removeElement); + currentEl = el; + currentHtml = html; } + function destroy() { + currentEl.innerHTML = ''; + currentEl = null; + currentHtml = ''; + } + return { render: render, destroy: destroy }; + } + function buildDomNodeRenderer() { + var currentEl = null; + var currentDomNodes = []; + function render(el, domNodes) { + var newDomNodes = Array.prototype.slice.call(domNodes); + if (el !== currentEl || !isArraysEqual(currentDomNodes, newDomNodes)) { + // append first, remove second (for scroll resetting) + for (var _i = 0, newDomNodes_1 = newDomNodes; _i < newDomNodes_1.length; _i++) { + var newNode = newDomNodes_1[_i]; + el.appendChild(newNode); + } + destroy(); + } + currentEl = el; + currentDomNodes = newDomNodes; + } + function destroy() { + currentDomNodes.forEach(removeElement); + currentDomNodes = []; + currentEl = null; + } + return { render: render, destroy: destroy }; } var DelayedRunner = /** @class */ (function () { @@ -7603,12 +7501,10 @@ var FullCalendar = (function (exports) { return parseBusinessHours(calendarContext.options.businessHours, calendarContext); } function warnUnknownOptions(options, viewName) { - if(!viewName) return 0; for (var optionName in options) { console.warn("Unknown option '" + optionName + "'" + (viewName ? " for view '" + viewName + "'" : '')); } - return 0; } // TODO: move this to react plugin? @@ -7694,31 +7590,29 @@ var FullCalendar = (function (exports) { // returns number of new entries inserted SegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { if (this.allowReslicing && insertion.touchingEntry) { - return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries, true); + return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); } hiddenEntries.push(entry); return 0; }; - SegHierarchy.prototype.splitEntry = function (entry, barrier, hiddenEntries, invalid_call) { + SegHierarchy.prototype.splitEntry = function (entry, barrier, hiddenEntries) { var partCnt = 0; var splitHiddenEntries = []; var entrySpan = entry.span; var barrierSpan = barrier.span; - if(!invalid_call){ - if (entrySpan.start < barrierSpan.start) { - partCnt += this.insertEntry({ - index: entry.index, - thickness: entry.thickness, - span: { start: entrySpan.start, end: barrierSpan.start }, - }, splitHiddenEntries); - } - if (entrySpan.end > barrierSpan.end) { - partCnt += this.insertEntry({ - index: entry.index, - thickness: entry.thickness, - span: { start: barrierSpan.end, end: entrySpan.end }, - }, splitHiddenEntries); - } + if (entrySpan.start < barrierSpan.start) { + partCnt += this.insertEntry({ + index: entry.index, + thickness: entry.thickness, + span: { start: entrySpan.start, end: barrierSpan.start }, + }, splitHiddenEntries); + } + if (entrySpan.end > barrierSpan.end) { + partCnt += this.insertEntry({ + index: entry.index, + thickness: entry.thickness, + span: { start: barrierSpan.end, end: entrySpan.end }, + }, splitHiddenEntries); } if (partCnt) { hiddenEntries.push.apply(hiddenEntries, __spreadArray([{ @@ -7733,70 +7627,77 @@ var FullCalendar = (function (exports) { }; SegHierarchy.prototype.insertEntryAt = function (entry, insertion) { var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; - var destLevel = insertion.level; - if (destLevel >= levelCoords.length || // level doesn't exist yet - levelCoords[destLevel] > insertion.levelCoord // destLevel needs to be pushed forward to make way - ) { + if (insertion.lateral === -1) { // create a new level - insertAt(levelCoords, destLevel, insertion.levelCoord); - insertAt(entriesByLevel, destLevel, [entry]); + insertAt(levelCoords, insertion.level, insertion.levelCoord); + insertAt(entriesByLevel, insertion.level, [entry]); } else { // insert into existing level - insertAt(entriesByLevel[destLevel], insertion.lateralEnd, entry); + insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); } this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; }; SegHierarchy.prototype.findInsertion = function (newEntry) { - var _a = this, levelCoords = _a.levelCoords, entriesByLevel = _a.entriesByLevel, stackCnts = _a.stackCnts, strictOrder = _a.strictOrder; + var _a = this, levelCoords = _a.levelCoords, entriesByLevel = _a.entriesByLevel, strictOrder = _a.strictOrder, stackCnts = _a.stackCnts; var levelCnt = levelCoords.length; - var resLevelCoord = 0; - var resLevel = 0; - var lateralStart = 0; - var lateralEnd = 0; + var candidateCoord = 0; var touchingLevel = -1; - var touchingEntry = null; // last touch entry - for (var level = 0; level < levelCnt; level += 1) { - var levelCoord = levelCoords[level]; + var touchingLateral = -1; + var touchingEntry = null; + var stackCnt = 0; + for (var trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { + var trackingCoord = levelCoords[trackingLevel]; // if the current level is past the placed entry, we have found a good empty space and can stop. // if strictOrder, keep finding more lateral intersections. - if (!strictOrder && levelCoord >= resLevelCoord + newEntry.thickness) { + if (!strictOrder && trackingCoord >= candidateCoord + newEntry.thickness) { break; } - var entries = entriesByLevel[level]; - var entry = void 0; - var searchRes = binarySearch(entries, newEntry.span.start, getEntrySpanEnd); - lateralStart = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one - lateralEnd = lateralStart; // also functions as a moving index + var trackingEntries = entriesByLevel[trackingLevel]; + var trackingEntry = void 0; + var searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end + var lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one while ( // loop through entries that horizontally intersect - (entry = entries[lateralEnd]) && // but not past the whole entry list - entry.span.start < newEntry.span.end // and not entirely past newEntry + (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list + trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry ) { - if (strictOrder || // strict-mode doesn't care about vert intersection. record touch and keep pushing down - ( // vertically intersects? - resLevelCoord < levelCoord + entry.thickness && - resLevelCoord + newEntry.thickness > levelCoord)) { - // push down the potential destination - resLevelCoord = levelCoord + entry.thickness; // move to bottom of colliding entry - touchingLevel = level; - touchingEntry = entry; + var trackingEntryBottom = trackingCoord + trackingEntry.thickness; + // intersects into the top of the candidate? + if (trackingEntryBottom > candidateCoord) { + candidateCoord = trackingEntryBottom; + touchingEntry = trackingEntry; + touchingLevel = trackingLevel; + touchingLateral = lateralIndex; } - lateralEnd += 1; - } - // regardless of whether there were collisions in the current level, - // keep updating the final-destination level until it goes past the final-destination coord. - if (levelCoord < resLevelCoord) { - resLevel = level + 1; + // butts up against top of candidate? (will happen if just intersected as well) + if (trackingEntryBottom === candidateCoord) { + // accumulate the highest possible stackCnt of the trackingEntries that butt up + stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1); + } + lateralIndex += 1; } } + // the destination level will be after touchingEntry's level. find it + var destLevel = 0; + if (touchingEntry) { + destLevel = touchingLevel + 1; + while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) { + destLevel += 1; + } + } + // if adding to an existing level, find where to insert + var destLateral = -1; + if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { + destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; + } return { - level: resLevel, - levelCoord: resLevelCoord, - lateralStart: lateralStart, - lateralEnd: lateralEnd, touchingLevel: touchingLevel, + touchingLateral: touchingLateral, touchingEntry: touchingEntry, - stackCnt: touchingEntry ? stackCnts[buildEntryKey(touchingEntry)] + 1 : 0, + stackCnt: stackCnt, + levelCoord: candidateCoord, + level: destLevel, + lateral: destLateral, }; }; // sorted by levelCoord (lowest to highest) @@ -7992,21 +7893,21 @@ var FullCalendar = (function (exports) { var isOnlyButtons = true; for (var _i = 0, widgetGroup_1 = widgetGroup; _i < widgetGroup_1.length; _i++) { var widget = widgetGroup_1[_i]; - var buttonName = widget.buttonName, buttonClick = widget.buttonClick, buttonText = widget.buttonText, buttonIcon = widget.buttonIcon; + var buttonName = widget.buttonName, buttonClick = widget.buttonClick, buttonText = widget.buttonText, buttonIcon = widget.buttonIcon, buttonHint = widget.buttonHint; if (buttonName === 'title') { isOnlyButtons = false; - children.push(createElement("h2", { className: "fc-toolbar-title" }, props.title)); + children.push(createElement("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); } else { - var ariaAttrs = buttonIcon ? { 'aria-label': buttonName } : {}; - var buttonClasses = ["fc-" + buttonName + "-button", theme.getClass('button')]; - if (buttonName === props.activeButton) { - buttonClasses.push(theme.getClass('buttonActive')); - } + var isPressed = buttonName === props.activeButton; var isDisabled = (!props.isTodayEnabled && buttonName === 'today') || (!props.isPrevEnabled && buttonName === 'prev') || (!props.isNextEnabled && buttonName === 'next'); - children.push(createElement("button", __assign({ disabled: isDisabled, className: buttonClasses.join(' '), onClick: buttonClick, type: "button" }, ariaAttrs), buttonText || (buttonIcon ? createElement("span", { className: buttonIcon }) : ''))); + var buttonClasses = ["fc-" + buttonName + "-button", theme.getClass('button')]; + if (isPressed) { + buttonClasses.push(theme.getClass('buttonActive')); + } + 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 }) : ''))); } } if (children.length > 1) { @@ -8028,20 +7929,21 @@ var FullCalendar = (function (exports) { var forceLtr = false; var startContent; var endContent; - var centerContent = model.center; - if (model.left) { + var sectionWidgets = model.sectionWidgets; + var centerContent = sectionWidgets.center; + if (sectionWidgets.left) { forceLtr = true; - startContent = model.left; + startContent = sectionWidgets.left; } else { - startContent = model.start; + startContent = sectionWidgets.start; } - if (model.right) { + if (sectionWidgets.right) { forceLtr = true; - endContent = model.right; + endContent = sectionWidgets.right; } else { - endContent = model.end; + endContent = sectionWidgets.end; } var classNames = [ extraClassName || '', @@ -8055,7 +7957,7 @@ var FullCalendar = (function (exports) { }; Toolbar.prototype.renderSection = function (key, widgetGroups) { var props = this.props; - return (createElement(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled })); + return (createElement(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId })); }; return Toolbar; }(BaseComponent)); @@ -8104,7 +8006,7 @@ var FullCalendar = (function (exports) { else { height = props.height || ''; } - return (createElement("div", { ref: this.handleEl, onClick: props.onClick, className: classNames.join(' '), style: { height: height, paddingBottom: paddingBottom } }, props.children)); + return (createElement("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height: height, paddingBottom: paddingBottom } }, props.children)); }; ViewContainer.prototype.componentDidMount = function () { this.context.addResizeHandler(this.handleResize); @@ -8213,10 +8115,13 @@ var FullCalendar = (function (exports) { _this.buildViewContext = memoize(buildViewContext); _this.buildViewPropTransformers = memoize(buildViewPropTransformers); _this.buildToolbarProps = memoize(buildToolbarProps); - _this.handleNavLinkClick = buildDelegationHandler('a[data-navlink]', _this._handleNavLinkClick.bind(_this)); _this.headerRef = createRef(); _this.footerRef = createRef(); _this.interactionsStore = {}; + // eslint-disable-next-line + _this.state = { + viewLabelId: getUniqueDomId(), + }; // Component Registration // ----------------------------------------------------------------------------------------------------------------- _this.registerInteractiveComponent = function (component, settingsInput) { @@ -8231,11 +8136,14 @@ var FullCalendar = (function (exports) { interactionSettingsStore[component.uid] = settings; }; _this.unregisterInteractiveComponent = function (component) { - for (var _i = 0, _a = _this.interactionsStore[component.uid]; _i < _a.length; _i++) { - var listener = _a[_i]; - listener.destroy(); + var listeners = _this.interactionsStore[component.uid]; + if (listeners) { + for (var _i = 0, listeners_1 = listeners; _i < listeners_1.length; _i++) { + var listener = listeners_1[_i]; + listener.destroy(); + } + delete _this.interactionsStore[component.uid]; } - delete _this.interactionsStore[component.uid]; delete interactionSettingsStore[component.uid]; }; // Resizing @@ -8278,12 +8186,15 @@ var FullCalendar = (function (exports) { viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall } var 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); + var viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle) + ? this.state.viewLabelId + : ''; return (createElement(ViewContextType.Provider, { value: viewContext }, - toolbarConfig.headerToolbar && (createElement(Toolbar, __assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.headerToolbar }, toolbarProps))), - createElement(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, onClick: this.handleNavLinkClick }, + toolbarConfig.header && (createElement(Toolbar, __assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))), + createElement(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, this.renderView(props), this.buildAppendContent()), - toolbarConfig.footerToolbar && (createElement(Toolbar, __assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footerToolbar }, toolbarProps))))); + toolbarConfig.footer && (createElement(Toolbar, __assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))))); }; CalendarContent.prototype.componentDidMount = function () { var props = this.props; @@ -8313,24 +8224,6 @@ var FullCalendar = (function (exports) { } this.props.emitter.trigger('_unmount'); }; - CalendarContent.prototype._handleNavLinkClick = function (ev, anchorEl) { - var _a = this.props, dateEnv = _a.dateEnv, options = _a.options, calendarApi = _a.calendarApi; - var navLinkOptions = anchorEl.getAttribute('data-navlink'); - navLinkOptions = navLinkOptions ? JSON.parse(navLinkOptions) : {}; - var dateMarker = dateEnv.createMarker(navLinkOptions.date); - var viewType = navLinkOptions.type; - var customAction = viewType === 'day' ? options.navLinkDayClick : - viewType === 'week' ? options.navLinkWeekClick : null; - if (typeof customAction === 'function') { - customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev); - } - else { - if (typeof customAction === 'string') { - viewType = customAction; - } - calendarApi.zoomTo(dateMarker, viewType); - } - }; CalendarContent.prototype.buildAppendContent = function () { var props = this.props; var children = props.pluginHooks.viewContainerAppends.map(function (buildAppendContent) { return buildAppendContent(props); }); @@ -8369,6 +8262,7 @@ var FullCalendar = (function (exports) { return { title: title, activeButton: viewSpec.type, + navUnit: viewSpec.singleUnit, isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), isPrevEnabled: prevInfo.isValid, isNextEnabled: nextInfo.isValid, @@ -8456,11 +8350,11 @@ var FullCalendar = (function (exports) { var classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); var text = dateEnv.format(date, props.dayHeaderFormat); // if colCnt is 1, we are already in a day-view and don't need a navlink - var navLinkAttrs = (options.navLinks && !dayMeta.isDisabled && props.colCnt > 1) - ? { 'data-navlink': buildNavLinkData(date), tabIndex: 0 } + var navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1) + ? buildNavLinkAttrs(this.context, date) : {}; var hookProps = __assign(__assign(__assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraHookProps), { text: text }), dayMeta); - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": !dayMeta.isDisabled ? formatDayString(date) : undefined, colSpan: props.colSpan }, props.extraDataAttrs), + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), "data-date": !dayMeta.isDisabled ? formatDayString(date) : undefined, colSpan: props.colSpan }, props.extraDataAttrs), createElement("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (createElement("a", __assign({ ref: innerElRef, className: [ 'fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : '', @@ -8469,6 +8363,7 @@ var FullCalendar = (function (exports) { return TableDateCell; }(BaseComponent)); + var WEEKDAY_FORMAT = createFormatter({ weekday: 'long' }); var TableDowCell = /** @class */ (function (_super) { __extends(TableDowCell, _super); function TableDowCell() { @@ -8490,9 +8385,9 @@ var FullCalendar = (function (exports) { var text = dateEnv.format(date, props.dayHeaderFormat); var hookProps = __assign(__assign(__assign(__assign({ // TODO: make this public? date: date }, dateMeta), { view: viewApi }), props.extraHookProps), { text: text }); - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' '), colSpan: props.colSpan }, props.extraDataAttrs), + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), colSpan: props.colSpan }, props.extraDataAttrs), createElement("div", { className: "fc-scrollgrid-sync-inner" }, - createElement("a", { className: [ + createElement("a", { "aria-label": dateEnv.format(date, WEEKDAY_FORMAT), className: [ 'fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : '', ].join(' '), ref: innerElRef }, innerContent)))); })); @@ -8574,7 +8469,7 @@ var FullCalendar = (function (exports) { var context = this.context; var _a = this.props, dates = _a.dates, dateProfile = _a.dateProfile, datesRepDistinctDays = _a.datesRepDistinctDays, renderIntro = _a.renderIntro; var dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); - return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return (createElement("tr", null, + return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return (createElement("tr", { role: "row" }, renderIntro && renderIntro('day'), dates.map(function (date) { return (datesRepDistinctDays ? (createElement(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (createElement(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat }))); }))); })); }; @@ -9218,11 +9113,12 @@ var FullCalendar = (function (exports) { getSectionHasLiquidHeight(props, sectionConfig); // if the section is liquid height, it might condense enough to require scrollbars } // TODO: ONLY use `arg`. force out internal function to use same API - function renderChunkContent(sectionConfig, chunkConfig, arg) { + function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) { var expandRows = arg.expandRows; var content = typeof chunkConfig.content === 'function' ? chunkConfig.content(arg) : createElement('table', { + role: 'presentation', className: [ chunkConfig.tableClassName, sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : '', @@ -9232,7 +9128,11 @@ var FullCalendar = (function (exports) { width: arg.clientWidth, height: expandRows ? arg.clientHeight : '', // css `height` on a serves as a min-height }, - }, arg.tableColGroupNode, createElement('tbody', {}, typeof chunkConfig.rowContent === 'function' ? chunkConfig.rowContent(arg) : chunkConfig.rowContent)); + }, arg.tableColGroupNode, createElement(isHeader ? 'thead' : 'tbody', { + role: 'presentation', + }, typeof chunkConfig.rowContent === 'function' + ? chunkConfig.rowContent(arg) + : chunkConfig.rowContent)); return content; } function isColPropsEqual(cols0, cols1) { @@ -9354,15 +9254,15 @@ var FullCalendar = (function (exports) { var bodySectionNodes = []; var footSectionNodes = []; while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { - headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode)); + headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); configI += 1; } while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { - bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode)); + bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); configI += 1; } while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { - footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode)); + footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); configI += 1; } // firefox bug: when setting height on table and there is a thead or tfoot, @@ -9370,18 +9270,20 @@ var FullCalendar = (function (exports) { // use getCanVGrowWithinCell as a way to detect table-stupid firefox. // if so, use a simpler dom structure, jam everything into a lone tbody. var isBuggy = !getCanVGrowWithinCell(); + var roleAttrs = { role: 'rowgroup' }; return createElement('table', { + role: 'grid', className: classNames.join(' '), style: { height: props.height }, - }, Boolean(!isBuggy && headSectionNodes.length) && createElement.apply(void 0, __spreadArray(['thead', {}], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && createElement.apply(void 0, __spreadArray(['tbody', {}], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && createElement.apply(void 0, __spreadArray(['tfoot', {}], footSectionNodes)), isBuggy && createElement.apply(void 0, __spreadArray(__spreadArray(__spreadArray(['tbody', {}], headSectionNodes), bodySectionNodes), footSectionNodes))); + }, Boolean(!isBuggy && headSectionNodes.length) && createElement.apply(void 0, __spreadArray(['thead', roleAttrs], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && createElement.apply(void 0, __spreadArray(['tbody', roleAttrs], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && createElement.apply(void 0, __spreadArray(['tfoot', roleAttrs], footSectionNodes)), isBuggy && createElement.apply(void 0, __spreadArray(__spreadArray(__spreadArray(['tbody', roleAttrs], headSectionNodes), bodySectionNodes), footSectionNodes))); }; - SimpleScrollGrid.prototype.renderSection = function (sectionConfig, microColGroupNode) { + SimpleScrollGrid.prototype.renderSection = function (sectionConfig, microColGroupNode, isHeader) { if ('outerContent' in sectionConfig) { return (createElement(Fragment, { key: sectionConfig.key }, sectionConfig.outerContent)); } - return (createElement("tr", { key: sectionConfig.key, className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk))); + return (createElement("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader))); }; - SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig, microColGroupNode, chunkConfig) { + SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig, microColGroupNode, chunkConfig, isHeader) { if ('outerContent' in chunkConfig) { return chunkConfig.outerContent; } @@ -9392,7 +9294,7 @@ var FullCalendar = (function (exports) { // for `!props.liquid` - is WHOLE scrollgrid natural height? // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars var overflowY = !props.liquid ? 'visible' : - forceYScrollbars ? 'auto' : + forceYScrollbars ? 'scroll' : !needsYScrolling ? 'hidden' : 'auto'; var sectionKey = sectionConfig.key; @@ -9405,11 +9307,13 @@ var FullCalendar = (function (exports) { syncRowHeights: false, rowSyncHeights: [], reportRowHeightChange: function () { }, - }); - return (createElement("td", { ref: chunkConfig.elRef }, - createElement("div", { className: "fc-scroller-harness" + (isLiquid ? ' fc-scroller-harness-liquid' : '') }, - createElement(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness - : true }, content)))); + }, isHeader); + return createElement(isHeader ? 'th' : 'td', { + ref: chunkConfig.elRef, + role: 'presentation', + }, createElement("div", { className: "fc-scroller-harness" + (isLiquid ? ' fc-scroller-harness-liquid' : '') }, + createElement(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness + : true }, content))); }; SimpleScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) { var section = getSectionByKey(this.props.sections, key); @@ -9538,10 +9442,10 @@ var FullCalendar = (function (exports) { var seg = props.seg; var timeFormat = context.options.eventTimeFormat || props.defaultTimeFormat; var timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); - return (createElement(EventRoot, { seg: seg, timeText: timeText, disableDragging: props.disableDragging, disableResizing: props.disableResizing, defaultContent: props.defaultContent || renderInnerContent$6, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("a", __assign({ className: props.extraClassNames.concat(classNames).join(' '), style: { + return (createElement(EventRoot, { seg: seg, timeText: timeText, disableDragging: props.disableDragging, disableResizing: props.disableResizing, defaultContent: props.defaultContent || renderInnerContent$4, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("a", __assign({ className: props.extraClassNames.concat(classNames).join(' '), style: { borderColor: hookProps.borderColor, backgroundColor: hookProps.backgroundColor, - }, ref: rootElRef }, getSegAnchorAttrs$1(seg)), + }, ref: rootElRef }, getSegAnchorAttrs(seg, context)), createElement("div", { className: "fc-event-main", ref: innerElRef, style: { color: hookProps.textColor } }, innerContent), hookProps.isStartResizable && createElement("div", { className: "fc-event-resizer fc-event-resizer-start" }), @@ -9550,16 +9454,12 @@ var FullCalendar = (function (exports) { }; return StandardEvent; }(BaseComponent)); - function renderInnerContent$6(innerProps) { + function renderInnerContent$4(innerProps) { return (createElement("div", { className: "fc-event-main-frame" }, innerProps.timeText && (createElement("div", { className: "fc-event-time" }, innerProps.timeText)), createElement("div", { className: "fc-event-title-container" }, createElement("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || createElement(Fragment, null, "\u00A0"))))); } - function getSegAnchorAttrs$1(seg) { - var url = seg.eventRange.def.url; - return url ? { href: url } : {}; - } var NowIndicatorRoot = function (props) { return (createElement(ViewContextType.Consumer, null, function (context) { var options = context.options; @@ -9633,10 +9533,10 @@ var FullCalendar = (function (exports) { function renderFill(fillType) { return (createElement("div", { className: "fc-" + fillType })); } - var BgEvent = function (props) { return (createElement(EventRoot, { defaultContent: renderInnerContent$5, seg: props.seg /* uselesss i think */, timeText: "", disableDragging: true, disableResizing: true, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("div", { ref: rootElRef, className: ['fc-bg-event'].concat(classNames).join(' '), style: { + var BgEvent = function (props) { return (createElement(EventRoot, { defaultContent: renderInnerContent$3, seg: props.seg /* uselesss i think */, timeText: "", disableDragging: true, disableResizing: true, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("div", { ref: rootElRef, className: ['fc-bg-event'].concat(classNames).join(' '), style: { backgroundColor: hookProps.backgroundColor, } }, innerContent)); })); }; - function renderInnerContent$5(props) { + function renderInnerContent$3(props) { var title = props.event.title; return title && (createElement("div", { className: "fc-event-title" }, props.event.title)); } @@ -9659,6 +9559,9 @@ var FullCalendar = (function (exports) { __extends(Popover, _super); function Popover() { var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { + titleId: getUniqueDomId(), + }; _this.handleRootEl = function (el) { _this.rootEl = el; if (_this.props.elRef) { @@ -9666,13 +9569,18 @@ var FullCalendar = (function (exports) { } }; // Triggered when the user clicks *anywhere* in the document, for the autoHide feature - _this.handleDocumentMousedown = function (ev) { + _this.handleDocumentMouseDown = function (ev) { // only hide the popover if the click happened outside the popover var target = getEventTargetViaRoot(ev); if (!_this.rootEl.contains(target) && window.auto_close_popup !== false) { _this.handleCloseClick(); } }; + _this.handleDocumentKeyDown = function (ev) { + if (ev.key === 'Escape') { + _this.handleCloseClick(); + } + }; _this.handleCloseClick = function () { var onClose = _this.props.onClose; if (onClose) { @@ -9682,24 +9590,26 @@ var FullCalendar = (function (exports) { return _this; } Popover.prototype.render = function () { - var theme = this.context.theme; - var props = this.props; + var _a = this.context, theme = _a.theme, options = _a.options; + var _b = this, props = _b.props, state = _b.state; var classNames = [ 'fc-popover', theme.getClass('popover'), ].concat(props.extraClassNames || []); - return createPortal(createElement("div", __assign({ className: classNames.join(' ') }, props.extraAttrs, { ref: this.handleRootEl }), + return createPortal(createElement("div", __assign({ id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId }, props.extraAttrs, { ref: this.handleRootEl }), createElement("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, - createElement("span", { className: "fc-popover-title" }, props.title), - createElement("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), onClick: this.handleCloseClick })), + createElement("span", { className: "fc-popover-title", id: state.titleId }, props.title), + createElement("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), createElement("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); }; Popover.prototype.componentDidMount = function () { - document.addEventListener('mousedown', this.handleDocumentMousedown); + document.addEventListener('mousedown', this.handleDocumentMouseDown); + document.addEventListener('keydown', this.handleDocumentKeyDown); this.updateSize(); }; Popover.prototype.componentWillUnmount = function () { - document.removeEventListener('mousedown', this.handleDocumentMousedown); + document.removeEventListener('mousedown', this.handleDocumentMouseDown); + document.removeEventListener('keydown', this.handleDocumentKeyDown); }; Popover.prototype.updateSize = function () { var isRtl = this.context.isRtl; @@ -9715,18 +9625,14 @@ var FullCalendar = (function (exports) { var popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; // constrain rootEl.style.display = "block"; - var popup_width = rootEl.clientWidth, - popup_height = rootEl.clientHeigh; popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); - popoverLeft = Math.min(popoverLeft - popup_width, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popup_width); + popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); - var origin_1 = rootEl.offsetParent.getBoundingClientRect(); - var offset = { + applyStyle(rootEl, { top: popoverTop - origin_1.top, left: popoverLeft - origin_1.left, - } - applyStyle(rootEl, offset); + }); } }; return Popover; @@ -9755,7 +9661,7 @@ var FullCalendar = (function (exports) { var props = this.props; var startDate = props.startDate, todayRange = props.todayRange, dateProfile = props.dateProfile; var title = dateEnv.format(startDate, options.dayPopoverFormat); - return (createElement(DayCellRoot, { date: startDate, dateProfile: dateProfile, todayRange: todayRange, elRef: this.handleRootEl }, function (rootElRef, dayClassNames, dataAttrs) { return (createElement(Popover, { elRef: rootElRef, title: title, extraClassNames: ['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, + return (createElement(DayCellRoot, { date: startDate, dateProfile: dateProfile, todayRange: todayRange, elRef: this.handleRootEl }, function (rootElRef, dayClassNames, dataAttrs) { return (createElement(Popover, { elRef: rootElRef, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, createElement(DayCellContent, { date: startDate, dateProfile: dateProfile, todayRange: todayRange }, function (innerElRef, innerContent) { return (innerContent && createElement("div", { className: "fc-more-popover-misc", ref: innerElRef }, innerContent)); }), props.children)); })); @@ -9792,6 +9698,7 @@ var FullCalendar = (function (exports) { _this.linkElRef = createRef(); _this.state = { isPopoverOpen: false, + popoverId: getUniqueDomId(), }; _this.handleClick = function (ev) { var _a = _this, props = _a.props, context = _a.context; @@ -9831,23 +9738,25 @@ var FullCalendar = (function (exports) { } MoreLinkRoot.prototype.render = function () { var _this = this; - var props = this.props; + var _a = this, props = _a.props, state = _a.state; return (createElement(ViewContextType.Consumer, null, function (context) { var viewApi = context.viewApi, options = context.options, calendarApi = context.calendarApi; var moreLinkText = options.moreLinkText; var moreCnt = props.moreCnt; var range = computeRange(props); + var text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals + ? moreLinkText.call(calendarApi, moreCnt) + : "+" + moreCnt + " " + moreLinkText; + var title = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); var hookProps = { num: moreCnt, shortText: "+" + moreCnt, - text: typeof moreLinkText === 'function' - ? moreLinkText.call(calendarApi, moreCnt) - : "+" + moreCnt + " " + moreLinkText, + text: text, view: viewApi, }; return (createElement(Fragment, null, - Boolean(props.moreCnt) && (createElement(RenderHook, { elRef: _this.linkElRef, hookProps: hookProps, classNames: options.moreLinkClassNames, content: options.moreLinkContent, defaultContent: props.defaultContent || renderMoreLinkInner$1, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, ['fc-more-link'].concat(customClassNames), innerElRef, innerContent, _this.handleClick); })), - _this.state.isPopoverOpen && (createElement(MorePopover, { startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: _this.parentEl, alignmentEl: props.alignmentElRef.current, alignGridTop: props.alignGridTop, onClose: _this.handlePopoverClose }, props.popoverContent())))); + Boolean(props.moreCnt) && (createElement(RenderHook, { elRef: _this.linkElRef, hookProps: hookProps, classNames: options.moreLinkClassNames, content: options.moreLinkContent, defaultContent: props.defaultContent || renderMoreLinkInner$1, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, ['fc-more-link'].concat(customClassNames), innerElRef, innerContent, _this.handleClick, title, state.isPopoverOpen, state.isPopoverOpen ? state.popoverId : ''); })), + state.isPopoverOpen && (createElement(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: _this.parentEl, alignmentEl: props.alignmentElRef.current, alignGridTop: props.alignGridTop, onClose: _this.handlePopoverClose }, props.popoverContent())))); })); }; MoreLinkRoot.prototype.componentDidMount = function () { @@ -9894,7 +9803,7 @@ var FullCalendar = (function (exports) { // exports // -------------------------------------------------------------------------------------------------- - var version = '5.8.0'; // important to type it, so .d.ts has generic string + var version = '5.11.0'; // important to type it, so .d.ts has generic string var Calendar = /** @class */ (function (_super) { __extends(Calendar, _super); @@ -9921,12 +9830,14 @@ var FullCalendar = (function (exports) { if (_this.isRendering) { _this.isRendered = true; var currentData_1 = _this.currentData; - render(createElement(CalendarRoot, { options: currentData_1.calendarOptions, theme: currentData_1.theme, emitter: currentData_1.emitter }, function (classNames, height, isHeightAuto, forPrint) { - _this.setClassNames(classNames); - _this.setHeight(height); - return (createElement(CustomContentRenderContext.Provider, { value: _this.customContentRenderId }, - createElement(CalendarContent, __assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1)))); - }), _this.el); + flushSync(function () { + render(createElement(CalendarRoot, { options: currentData_1.calendarOptions, theme: currentData_1.theme, emitter: currentData_1.emitter }, function (classNames, height, isHeightAuto, forPrint) { + _this.setClassNames(classNames); + _this.setHeight(height); + return (createElement(CustomContentRenderContext.Provider, { value: _this.customContentRenderId }, + createElement(CalendarContent, __assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1)))); + }), _this.el); + }); } else if (_this.isRendered) { _this.isRendered = false; @@ -9934,7 +9845,6 @@ var FullCalendar = (function (exports) { _this.setClassNames([]); _this.setHeight(''); } - flushToDom(); }; _this.el = el; _this.renderRunner = new DelayedRunner(_this.handleRenderRequest); @@ -9972,8 +9882,10 @@ var FullCalendar = (function (exports) { } }; Calendar.prototype.updateSize = function () { - _super.prototype.updateSize.call(this); - flushToDom(); + var _this = this; + flushSync(function () { + _super.prototype.updateSize.call(_this); + }); }; Calendar.prototype.batchRendering = function (func) { this.renderRunner.pause('batchRendering'); @@ -10294,7 +10206,7 @@ var FullCalendar = (function (exports) { this.mirrorEl = null; this.sourceElRect = null; // screen coords relative to viewport // options that can be set directly by caller - this.parentNode = document.body; + this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues this.zIndex = 9999; this.revertDuration = 0; } @@ -10563,9 +10475,9 @@ var FullCalendar = (function (exports) { } }; } - AutoScroller.prototype.start = function (pageX, pageY) { + AutoScroller.prototype.start = function (pageX, pageY, scrollStartEl) { if (this.isEnabled) { - this.scrollCaches = this.buildCaches(); + this.scrollCaches = this.buildCaches(scrollStartEl); this.pointerScreenX = null; this.pointerScreenY = null; this.everMovedUp = false; @@ -10642,8 +10554,9 @@ var FullCalendar = (function (exports) { AutoScroller.prototype.computeBestEdge = function (left, top) { var edgeThreshold = this.edgeThreshold; var bestSide = null; - for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { - var scrollCache = _a[_i]; + var scrollCaches = this.scrollCaches || []; + for (var _i = 0, scrollCaches_1 = scrollCaches; _i < scrollCaches_1.length; _i++) { + var scrollCache = scrollCaches_1[_i]; var rect = scrollCache.clientRect; var leftDist = left - rect.left; var rightDist = rect.right - left; @@ -10671,15 +10584,15 @@ var FullCalendar = (function (exports) { } return bestSide; }; - AutoScroller.prototype.buildCaches = function () { - return this.queryScrollEls().map(function (el) { + AutoScroller.prototype.buildCaches = function (scrollStartEl) { + return this.queryScrollEls(scrollStartEl).map(function (el) { if (el === window) { return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls } return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls }); }; - AutoScroller.prototype.queryScrollEls = function () { + AutoScroller.prototype.queryScrollEls = function (scrollStartEl) { var els = []; for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) { var query = _a[_i]; @@ -10687,7 +10600,7 @@ var FullCalendar = (function (exports) { els.push(query); } else { - els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query))); + els.push.apply(els, Array.prototype.slice.call(getElRoot(scrollStartEl).querySelectorAll(query))); } } return els; @@ -10705,6 +10618,7 @@ var FullCalendar = (function (exports) { __extends(FeaturefulElementDragging, _super); function FeaturefulElementDragging(containerEl, selector) { var _this = _super.call(this, containerEl) || this; + _this.containerEl = containerEl; // options that can be directly set by caller // the caller can also set the PointerDragging's options as well _this.delay = null; @@ -10822,7 +10736,7 @@ var FullCalendar = (function (exports) { if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { this.isDragging = true; this.mirrorNeedsRevert = false; - this.autoScroller.start(ev.pageX, ev.pageY); + this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl); this.emitter.trigger('dragstart', ev); if (this.touchScrollAllowed === false) { this.pointer.cancelTouchScroll(); @@ -10985,7 +10899,7 @@ var FullCalendar = (function (exports) { var adjustedPoint = origPoint; var subjectEl = ev.subjectEl; var subjectRect; - if (subjectEl !== document) { + if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot subjectRect = computeRect(subjectEl); adjustedPoint = constrainPoint(adjustedPoint, subjectRect); } @@ -11367,7 +11281,7 @@ var FullCalendar = (function (exports) { _this.dragging.setMirrorNeedsRevert(!mutation); // render the mirror if no already-rendered mirror // TODO: wish we could somehow wait for dispatch to guarantee render - _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-event-mirror')); + _this.dragging.setMirrorIsVisible(!hit || !getElRoot(_this.subjectEl).querySelector('.fc-event-mirror')); // assign states based on new hit _this.receivingContext = receivingContext; _this.validMutation = mutation; @@ -11768,7 +11682,7 @@ var FullCalendar = (function (exports) { }; this.onDocumentPointerDown = function (pev) { var unselectCancel = _this.context.options.unselectCancel; - var downEl = pev.origEvent.target; + var downEl = getEventTargetViaRoot(pev.origEvent); _this.matchesCancel = !!elementClosest(downEl, unselectCancel); _this.matchesEvent = !!elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event? }; @@ -11811,10 +11725,10 @@ var FullCalendar = (function (exports) { return UnselectAuto; }()); - var OPTION_REFINERS$5 = { + var OPTION_REFINERS$3 = { fixedMirrorParent: identity, }; - var LISTENER_REFINERS$1 = { + var LISTENER_REFINERS = { dateClick: identity, eventDragStart: identity, eventDragStop: identity, @@ -12100,9 +12014,10 @@ var FullCalendar = (function (exports) { } } else { - var mirrorEl = this.mirrorSelector ? - document.querySelector(this.mirrorSelector) : - null; + var mirrorEl = this.mirrorSelector + // TODO: somehow query FullCalendars WITHIN shadow-roots + ? document.querySelector(this.mirrorSelector) + : null; if (mirrorEl) { this.currentMirrorEl = mirrorEl; mirrorEl.style.visibility = 'hidden'; @@ -12151,8 +12066,8 @@ var FullCalendar = (function (exports) { componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], calendarInteractions: [UnselectAuto], elementDraggingImpl: FeaturefulElementDragging, - optionRefiners: OPTION_REFINERS$5, - listenerRefiners: LISTENER_REFINERS$1, + optionRefiners: OPTION_REFINERS$3, + listenerRefiners: LISTENER_REFINERS, }); /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. @@ -12291,11 +12206,9 @@ var FullCalendar = (function (exports) { } TableCellTop.prototype.render = function () { var props = this.props; - var navLinkAttrs = this.context.options.navLinks - ? { 'data-navlink': buildNavLinkData(props.date), tabIndex: 0 } - : {}; + var navLinkAttrs = buildNavLinkAttrs(this.context, props.date); return (createElement(DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, defaultContent: renderTopInner }, function (innerElRef, innerContent) { return ((innerContent || props.forceDayTop) && (createElement("div", { className: "fc-daygrid-day-top", ref: innerElRef }, - createElement("a", __assign({ className: "fc-daygrid-day-number" }, navLinkAttrs), innerContent || createElement(Fragment, null, "\u00A0"))))); })); + createElement("a", __assign({ id: props.dayNumberId, className: "fc-daygrid-day-number" }, navLinkAttrs), innerContent || createElement(Fragment, null, "\u00A0"))))); })); }; return TableCellTop; }(BaseComponent)); @@ -12340,21 +12253,17 @@ var FullCalendar = (function (exports) { var _a = this, props = _a.props, context = _a.context; var timeFormat = context.options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; var timeText = buildSegTimeText(props.seg, timeFormat, context, true, props.defaultDisplayEventEnd); - return (createElement(EventRoot, { seg: props.seg, timeText: timeText, defaultContent: renderInnerContent$4, isDragging: props.isDragging, isResizing: false, isDateSelecting: false, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent) { return ( // we don't use styles! - createElement("a", __assign({ className: ['fc-daygrid-event', 'fc-daygrid-dot-event'].concat(classNames).join(' '), ref: rootElRef }, getSegAnchorAttrs(props.seg)), innerContent)); })); + return (createElement(EventRoot, { seg: props.seg, timeText: timeText, defaultContent: renderInnerContent$2, isDragging: props.isDragging, isResizing: false, isDateSelecting: false, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent) { return ( // we don't use styles! + createElement("a", __assign({ className: ['fc-daygrid-event', 'fc-daygrid-dot-event'].concat(classNames).join(' '), ref: rootElRef }, getSegAnchorAttrs(props.seg, context)), innerContent)); })); }; return TableListItemEvent; }(BaseComponent)); - function renderInnerContent$4(innerProps) { + function renderInnerContent$2(innerProps) { return (createElement(Fragment, null, createElement("div", { className: "fc-daygrid-event-dot", style: { borderColor: innerProps.borderColor || innerProps.backgroundColor } }), innerProps.timeText && (createElement("div", { className: "fc-event-time" }, innerProps.timeText)), createElement("div", { className: "fc-event-title" }, innerProps.event.title || createElement(Fragment, null, "\u00A0")))); } - function getSegAnchorAttrs(seg) { - var url = seg.eventRange.def.url; - return url ? { href: url } : {}; - } var TableCellMoreLink = /** @class */ (function (_super) { __extends(TableCellMoreLink, _super); @@ -12376,7 +12285,7 @@ var FullCalendar = (function (exports) { visibility: isForcedInvisible[instanceId] ? 'hidden' : '', } }, hasListItemDisplay(seg) ? (createElement(TableListItemEvent, __assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))) : (createElement(TableBlockEvent, __assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange)))))); }))); - } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick) { return (createElement("a", { ref: rootElRef, className: ['fc-daygrid-more-link'].concat(classNames).join(' '), onClick: handleClick }, innerContent)); })); + } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return (createElement("a", __assign({ ref: rootElRef, className: ['fc-daygrid-more-link'].concat(classNames).join(' '), title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, createAriaClickAttrs(handleClick)), innerContent)); })); }; return TableCellMoreLink; }(BaseComponent)); @@ -12399,6 +12308,9 @@ var FullCalendar = (function (exports) { function TableCell() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = createRef(); + _this.state = { + dayNumberId: getUniqueDomId(), + }; _this.handleRootEl = function (el) { setRef(_this.rootElRef, el); setRef(_this.props.elRef, el); @@ -12406,16 +12318,13 @@ var FullCalendar = (function (exports) { return _this; } TableCell.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context, rootElRef = _a.rootElRef; - var options = context.options; + var _a = this, context = _a.context, props = _a.props, state = _a.state, rootElRef = _a.rootElRef; var date = props.date, dateProfile = props.dateProfile; - var navLinkAttrs = options.navLinks - ? { 'data-navlink': buildNavLinkData(date, 'week'), tabIndex: 0 } - : {}; - return (createElement(DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, elRef: this.handleRootEl }, function (dayElRef, dayClassNames, rootDataAttrs, isDisabled) { return (createElement("td", __assign({ ref: dayElRef, className: ['fc-daygrid-day'].concat(dayClassNames, props.extraClassNames || []).join(' ') }, rootDataAttrs, props.extraDataAttrs), + var navLinkAttrs = buildNavLinkAttrs(context, date, 'week'); + return (createElement(DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, elRef: this.handleRootEl }, function (dayElRef, dayClassNames, rootDataAttrs, isDisabled) { return (createElement("td", __assign({ ref: dayElRef, role: "gridcell", className: ['fc-daygrid-day'].concat(dayClassNames, props.extraClassNames || []).join(' ') }, rootDataAttrs, props.extraDataAttrs, (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), createElement("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef /* different from hook system! RENAME */ }, props.showWeekNumber && (createElement(WeekNumberRoot, { date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 }, function (weekElRef, weekClassNames, innerElRef, innerContent) { return (createElement("a", __assign({ ref: weekElRef, className: ['fc-daygrid-week-number'].concat(weekClassNames).join(' ') }, navLinkAttrs), innerContent)); })), - !isDisabled && (createElement(TableCellTop, { date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber, forceDayTop: props.forceDayTop, todayRange: props.todayRange, extraHookProps: props.extraHookProps })), + !isDisabled && (createElement(TableCellTop, { date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber, dayNumberId: state.dayNumberId, forceDayTop: props.forceDayTop, todayRange: props.todayRange, extraHookProps: props.extraHookProps })), createElement("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, props.fgContent, createElement("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, @@ -12538,7 +12447,7 @@ var FullCalendar = (function (exports) { seg: resliceSeg(seg, col, col + 1, cells), isVisible: true, isAbsolute: false, - absoluteTop: 0, + absoluteTop: rect.levelCoord, marginTop: rect.levelCoord - currentHeight, }); currentHeight = rect.levelCoord + rect.thickness; @@ -12571,7 +12480,7 @@ var FullCalendar = (function (exports) { seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), isVisible: true, isAbsolute: false, - absoluteTop: 0, + absoluteTop: rect.levelCoord, marginTop: currentMarginTop, // claim the margin }); currentMarginTop = 0; @@ -12636,25 +12545,21 @@ var FullCalendar = (function (exports) { }; DayGridSegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { var _a = this, entriesByLevel = _a.entriesByLevel, forceHidden = _a.forceHidden; - var touchingLevel = insertion.touchingLevel; - if (this.hiddenConsumes && touchingLevel >= 0) { - for (var lateral = insertion.lateralStart; lateral < insertion.lateralEnd; lateral += 1) { - var leadingEntry = entriesByLevel[touchingLevel][lateral]; + var touchingEntry = insertion.touchingEntry, touchingLevel = insertion.touchingLevel, touchingLateral = insertion.touchingLateral; + if (this.hiddenConsumes && touchingEntry) { + var touchingEntryId = buildEntryKey(touchingEntry); + // if not already hidden + if (!forceHidden[touchingEntryId]) { if (this.allowReslicing) { - var placeholderEntry = __assign(__assign({}, leadingEntry), { span: intersectSpans(leadingEntry.span, entry.span) }); + var placeholderEntry = __assign(__assign({}, touchingEntry), { span: intersectSpans(touchingEntry.span, entry.span) }); var placeholderEntryId = buildEntryKey(placeholderEntry); - if (!forceHidden[placeholderEntryId]) { // if not already hidden - forceHidden[placeholderEntryId] = true; - entriesByLevel[touchingLevel][lateral] = placeholderEntry; // replace leadingEntry with our placeholder - this.splitEntry(leadingEntry, entry, hiddenEntries); // split up the leadingEntry, reinsert it - } + forceHidden[placeholderEntryId] = true; + entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder + this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it } else { - var placeholderEntryId = buildEntryKey(leadingEntry); - if (!forceHidden[placeholderEntryId]) { - forceHidden[placeholderEntryId] = true; - hiddenEntries.push(leadingEntry); - } + forceHidden[touchingEntryId] = true; + hiddenEntries.push(touchingEntry); } } } @@ -12693,11 +12598,11 @@ var FullCalendar = (function (exports) { (props.eventDrag && props.eventDrag.affectedInstances) || (props.eventResize && props.eventResize.affectedInstances) || {}; - return (createElement("tr", { ref: this.rootElRef }, + return (createElement("tr", { ref: this.rootElRef, role: "row" }, props.renderIntro && props.renderIntro(), props.cells.map(function (cell, col) { var normalFgNodes = _this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); - var mirrorFgNodes = _this.renderFgSegs(col, buildMirrorPlacements$1(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); + var mirrorFgNodes = _this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); return (createElement(TableCell, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), innerElRef: _this.frameElRefs.createRef(cell.key) /* FF ? - createElement("tr", { className: "fc-scrollgrid-section" }, + createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), }); } @@ -13299,7 +13209,7 @@ var FullCalendar = (function (exports) { chunks: [ { key: 'axis', - rowContent: function (arg) { return (createElement("tr", null, _this.renderHeadAxis('day', arg.rowSyncHeights[0]))); }, + rowContent: function (arg) { return (createElement("tr", { role: "presentation" }, _this.renderHeadAxis('day', arg.rowSyncHeights[0]))); }, }, { key: 'cols', @@ -13318,7 +13228,7 @@ var FullCalendar = (function (exports) { chunks: [ { key: 'axis', - rowContent: function (contentArg) { return (createElement("tr", null, _this.renderTableRowAxis(contentArg.rowSyncHeights[0]))); }, + rowContent: function (contentArg) { return (createElement("tr", { role: "presentation" }, _this.renderTableRowAxis(contentArg.rowSyncHeights[0]))); }, }, { key: 'cols', @@ -13330,7 +13240,7 @@ var FullCalendar = (function (exports) { key: 'all-day-divider', type: 'body', outerContent: ( // TODO: rename to cellContent so don't need to define ? - createElement("tr", { className: "fc-scrollgrid-section" }, + createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))), }); } @@ -13346,7 +13256,7 @@ var FullCalendar = (function (exports) { content: function (arg) { return ( // TODO: make this now-indicator arrow more DRY with TimeColsContent createElement("div", { className: "fc-timegrid-axis-chunk" }, - createElement("table", { style: { height: arg.expandRows ? arg.clientHeight : '' } }, + createElement("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, arg.tableColGroupNode, createElement("tbody", null, createElement(TimeBodyAxis, { slatMetas: slatMetas }))), @@ -13502,8 +13412,8 @@ var FullCalendar = (function (exports) { } TimeColsSlats.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; - return (createElement("div", { className: "fc-timegrid-slots", ref: this.rootElRef }, - createElement("table", { className: context.theme.getClass('table'), style: { + return (createElement("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, + createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { minWidth: props.tableMinWidth, width: props.clientWidth, height: props.minHeight, @@ -13585,10 +13495,10 @@ var FullCalendar = (function (exports) { TimeColMoreLink.prototype.render = function () { var _this = this; var props = this.props; - return (createElement(MoreLinkRoot, { allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, alignmentElRef: this.rootElRef, defaultContent: renderMoreLinkInner, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: function () { return renderPlainFgSegs(props.hiddenSegs, props); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick) { return (createElement("a", { ref: function (el) { + return (createElement(MoreLinkRoot, { allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, alignmentElRef: this.rootElRef, defaultContent: renderMoreLinkInner, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: function () { return renderPlainFgSegs(props.hiddenSegs, props); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return (createElement("a", { ref: function (el) { setRef(rootElRef, el); setRef(_this.rootElRef, el); - }, className: ['fc-timegrid-more-link'].concat(classNames).join(' '), style: { top: props.top, bottom: props.bottom }, onClick: handleClick }, + }, className: ['fc-timegrid-more-link'].concat(classNames).join(' '), style: { top: props.top, bottom: props.bottom }, onClick: handleClick, title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, createElement("div", { ref: innerElRef, className: "fc-timegrid-more-link-inner fc-sticky" }, innerContent))); })); }; return TimeColMoreLink; @@ -13759,7 +13669,7 @@ var FullCalendar = (function (exports) { } return vcoords; } - function computeFgSegPlacements$1(segs, segVCoords, // might not have for every seg + function computeFgSegPlacements(segs, segVCoords, // might not have for every seg eventOrderStrict, eventMaxStack) { var segInputs = []; var dumbSegs = []; // segs without coords @@ -13792,7 +13702,7 @@ var FullCalendar = (function (exports) { return { segPlacements: segPlacements, hiddenGroups: hiddenGroups }; } - var DEFAULT_TIME_FORMAT$2 = createFormatter({ + var DEFAULT_TIME_FORMAT$1 = createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: false, @@ -13810,7 +13720,7 @@ var FullCalendar = (function (exports) { if (this.props.isShort) { classNames.push('fc-timegrid-event-short'); } - return (createElement(StandardEvent, __assign({}, this.props, { defaultTimeFormat: DEFAULT_TIME_FORMAT$2, extraClassNames: classNames }))); + return (createElement(StandardEvent, __assign({}, this.props, { defaultTimeFormat: DEFAULT_TIME_FORMAT$1, extraClassNames: classNames }))); }; return TimeColEvent; }(BaseComponent)); @@ -13849,7 +13759,7 @@ var FullCalendar = (function (exports) { (props.eventResize && props.eventResize.affectedInstances) || {}; var sortedFgSegs = this.sortEventSegs(props.fgEventSegs, context.options.eventOrder); - return (createElement(DayCellRoot, { elRef: props.elRef, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (rootElRef, classNames, dataAttrs) { return (createElement("td", __assign({ ref: rootElRef, className: ['fc-timegrid-col'].concat(classNames, props.extraClassNames || []).join(' ') }, dataAttrs, props.extraDataAttrs), + return (createElement(DayCellRoot, { elRef: props.elRef, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (rootElRef, classNames, dataAttrs) { return (createElement("td", __assign({ ref: rootElRef, role: "gridcell", className: ['fc-timegrid-col'].concat(classNames, props.extraClassNames || []).join(' ') }, dataAttrs, props.extraDataAttrs), createElement("div", { className: "fc-timegrid-col-frame" }, createElement("div", { className: "fc-timegrid-col-bg" }, _this.renderFillSegs(props.businessHourSegs, 'non-business'), @@ -13874,7 +13784,7 @@ var FullCalendar = (function (exports) { var _b = this.props, date = _b.date, slatCoords = _b.slatCoords, eventSelection = _b.eventSelection, todayRange = _b.todayRange, nowDate = _b.nowDate; var isMirror = isDragging || isResizing || isDateSelecting; var segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); - var _c = computeFgSegPlacements$1(segs, segVCoords, eventOrderStrict, eventMaxStack), segPlacements = _c.segPlacements, hiddenGroups = _c.hiddenGroups; + var _c = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack), segPlacements = _c.segPlacements, hiddenGroups = _c.hiddenGroups; return (createElement(Fragment, null, this.renderHiddenGroups(hiddenGroups, segs), segPlacements.map(function (segPlacement) { @@ -14005,14 +13915,14 @@ var FullCalendar = (function (exports) { var eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); var eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); return (createElement("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, - createElement("table", { style: { + createElement("table", { role: "presentation", style: { minWidth: props.tableMinWidth, width: props.clientWidth, } }, props.tableColGroupNode, - createElement("tbody", null, - createElement("tr", null, - props.axis && (createElement("td", { className: "fc-timegrid-col fc-timegrid-axis" }, + createElement("tbody", { role: "presentation" }, + createElement("tr", { role: "row" }, + props.axis && (createElement("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, createElement("div", { className: "fc-timegrid-col-frame" }, createElement("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (createElement(NowIndicatorRoot, { isAxis: true, date: props.nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent)); })))))), props.cells.map(function (cell, i) { return (createElement(TimeCol, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint })); })))))); @@ -14028,13 +13938,13 @@ var FullCalendar = (function (exports) { if (props.onColCoords && props.clientWidth !== null // means sizing has stabilized ) { - props.onColCoords(new PositionCache(this.rootElRef.current, collectCellEls$1(this.cellElRefs.currentMap, props.cells), true, // horizontal + props.onColCoords(new PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal false)); } }; return TimeColsContent; }(BaseComponent)); - function collectCellEls$1(elMap, cells) { + function collectCellEls(elMap, cells) { return cells.map(function (cell) { return elMap[cell.key]; }); } @@ -14212,7 +14122,7 @@ var FullCalendar = (function (exports) { // potential nice values for the slot-duration and interval-duration // from largest to smallest - var STOCK_SUB_DURATIONS$1 = [ + var STOCK_SUB_DURATIONS = [ { hours: 1 }, { minutes: 30 }, { minutes: 15 }, @@ -14246,8 +14156,8 @@ var FullCalendar = (function (exports) { var labelInterval; var slotsPerLabel; // find the smallest stock label interval that results in more than one slots-per-label - for (i = STOCK_SUB_DURATIONS$1.length - 1; i >= 0; i -= 1) { - labelInterval = createDuration(STOCK_SUB_DURATIONS$1[i]); + for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) { + labelInterval = createDuration(STOCK_SUB_DURATIONS[i]); slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration); if (slotsPerLabel !== null && slotsPerLabel > 1) { return labelInterval; @@ -14289,13 +14199,13 @@ var FullCalendar = (function (exports) { return new DayTableModel(daySeries, false); } - var OPTION_REFINERS$4 = { + var OPTION_REFINERS$2 = { allDaySlot: Boolean, }; var timeGridPlugin = createPlugin({ initialView: 'timeGridWeek', - optionRefiners: OPTION_REFINERS$4, + optionRefiners: OPTION_REFINERS$2, views: { timeGrid: { component: DayTimeColsView, @@ -14318,40 +14228,39 @@ var FullCalendar = (function (exports) { var ListViewHeaderRow = /** @class */ (function (_super) { __extends(ListViewHeaderRow, _super); function ListViewHeaderRow() { - return _super !== null && _super.apply(this, arguments) || this; + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { + textId: getUniqueDomId(), + }; + return _this; } ListViewHeaderRow.prototype.render = function () { - var _a = this.props, dayDate = _a.dayDate, todayRange = _a.todayRange; - var _b = this.context, theme = _b.theme, dateEnv = _b.dateEnv, options = _b.options, viewApi = _b.viewApi; + var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options, viewApi = _a.viewApi; + var _b = this.props, cellId = _b.cellId, dayDate = _b.dayDate, todayRange = _b.todayRange; + var textId = this.state.textId; var dayMeta = getDateMeta(dayDate, todayRange); // will ever be falsy? var text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; // will ever be falsy? also, BAD NAME "alt" var sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; - var navLinkData = options.navLinks - ? buildNavLinkData(dayDate) - : null; - var hookProps = __assign({ date: dateEnv.toDate(dayDate), view: viewApi, text: text, - sideText: sideText, - navLinkData: navLinkData }, dayMeta); + var hookProps = __assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId: textId, + text: text, + sideText: sideText, navLinkAttrs: buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); var classNames = ['fc-list-day'].concat(getDayClassNames(dayMeta, theme)); // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInnerContent$2, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("tr", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": formatDayString(dayDate) }, - createElement("th", { colSpan: 3 }, + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInnerContent, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("tr", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": formatDayString(dayDate) }, + createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, createElement("div", { className: 'fc-list-day-cushion ' + theme.getClass('tableCellShaded'), ref: innerElRef }, innerContent)))); })); }; return ListViewHeaderRow; }(BaseComponent)); - function renderInnerContent$2(props) { - var navLinkAttrs = props.navLinkData // is there a type for this? - ? { 'data-navlink': props.navLinkData, tabIndex: 0 } - : {}; + function renderInnerContent(props) { return (createElement(Fragment, null, - props.text && (createElement("a", __assign({ className: "fc-list-day-text" }, navLinkAttrs), props.text)), - props.sideText && (createElement("a", __assign({ className: "fc-list-day-side-text" }, navLinkAttrs), props.sideText)))); + props.text && (createElement("a", __assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)), + props.sideText && ( /* not keyboard tabbable */createElement("a", __assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)))); } - var DEFAULT_TIME_FORMAT$1 = createFormatter({ + var DEFAULT_TIME_FORMAT = createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: 'short', @@ -14363,24 +14272,22 @@ var FullCalendar = (function (exports) { } ListViewEventRow.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; - var seg = props.seg; - var timeFormat = context.options.eventTimeFormat || DEFAULT_TIME_FORMAT$1; + var seg = props.seg, timeHeaderId = props.timeHeaderId, eventHeaderId = props.eventHeaderId, dateHeaderId = props.dateHeaderId; + var timeFormat = context.options.eventTimeFormat || DEFAULT_TIME_FORMAT; return (createElement(EventRoot, { seg: seg, timeText: "" // BAD. because of all-day content - , disableDragging: true, disableResizing: true, defaultContent: renderEventInnerContent, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, isSelected: props.isSelected, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("tr", { className: ['fc-list-event', hookProps.event.url ? 'fc-event-forced-url' : ''].concat(classNames).join(' '), ref: rootElRef }, - buildTimeContent(seg, timeFormat, context), - createElement("td", { className: "fc-list-event-graphic" }, + , disableDragging: true, disableResizing: true, defaultContent: function () { return renderEventInnerContent(seg, context); } /* weird */, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, isSelected: props.isSelected, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("tr", { className: ['fc-list-event', hookProps.event.url ? 'fc-event-forced-url' : ''].concat(classNames).join(' '), ref: rootElRef }, + buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), + createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, createElement("span", { className: "fc-list-event-dot", style: { borderColor: hookProps.borderColor || hookProps.backgroundColor } })), - createElement("td", { className: "fc-list-event-title", ref: innerElRef }, innerContent))); })); + createElement("td", { ref: innerElRef, headers: eventHeaderId + " " + dateHeaderId, className: "fc-list-event-title" }, innerContent))); })); }; return ListViewEventRow; }(BaseComponent)); - function renderEventInnerContent(props) { - var event = props.event; - var url = event.url; - var anchorAttrs = url ? { href: url } : {}; - return (createElement("a", __assign({}, anchorAttrs), event.title)); + function renderEventInnerContent(seg, context) { + var interactiveAttrs = getSegAnchorAttrs(seg, context); + return (createElement("a", __assign({}, interactiveAttrs), seg.eventRange.def.title)); } - function buildTimeContent(seg, timeFormat, context) { + function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { var options = context.options; if (options.displayEventTime !== false) { var eventDef = seg.eventRange.def; @@ -14409,7 +14316,7 @@ var FullCalendar = (function (exports) { text: context.options.allDayText, view: context.viewApi, }; - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { className: ['fc-list-event-time'].concat(classNames).join(' '), ref: rootElRef }, innerContent)); })); + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, headers: timeHeaderId + " " + dateHeaderId, className: ['fc-list-event-time'].concat(classNames).join(' ') }, innerContent)); })); } return (createElement("td", { className: "fc-list-event-time" }, timeText)); } @@ -14428,6 +14335,11 @@ var FullCalendar = (function (exports) { var _this = _super !== null && _super.apply(this, arguments) || this; _this.computeDateVars = memoize(computeDateVars); _this.eventStoreToSegs = memoize(_this._eventStoreToSegs); + _this.state = { + timeHeaderId: getUniqueDomId(), + eventHeaderId: getUniqueDomId(), + dateHeaderIdRoot: getUniqueDomId(), + }; _this.setRootEl = function (rootEl) { if (rootEl) { _this.context.registerInteractiveComponent(_this, { @@ -14466,23 +14378,30 @@ var FullCalendar = (function (exports) { }; ListView.prototype.renderSegList = function (allSegs, dayDates) { var _a = this.context, theme = _a.theme, options = _a.options; + var _b = this.state, timeHeaderId = _b.timeHeaderId, eventHeaderId = _b.eventHeaderId, dateHeaderIdRoot = _b.dateHeaderIdRoot; var segsByDay = groupSegsByDay(allSegs); // sparse array return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { var innerNodes = []; for (var dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { var daySegs = segsByDay[dayIndex]; if (daySegs) { // sparse array, so might be undefined - var dayStr = dayDates[dayIndex].toISOString(); + var dayStr = formatDayString(dayDates[dayIndex]); + var dateHeaderId = dateHeaderIdRoot + '-' + dayStr; // append a day header - innerNodes.push(createElement(ListViewHeaderRow, { key: dayStr, dayDate: dayDates[dayIndex], todayRange: todayRange })); + innerNodes.push(createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); daySegs = sortEventSegs(daySegs, options.eventOrder); for (var _i = 0, daySegs_1 = daySegs; _i < daySegs_1.length; _i++) { var seg = daySegs_1[_i]; - innerNodes.push(createElement(ListViewEventRow, __assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false }, getSegMeta(seg, todayRange, nowDate)))); + innerNodes.push(createElement(ListViewEventRow, __assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, getSegMeta(seg, todayRange, nowDate)))); } } } return (createElement("table", { className: 'fc-list-table ' + theme.getClass('table') }, + createElement("thead", null, + createElement("tr", null, + createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint), + createElement("th", { scope: "col", "aria-hidden": true }), + createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))), createElement("tbody", null, innerNodes))); })); }; @@ -14566,7 +14485,7 @@ var FullCalendar = (function (exports) { return segsByDay; } - var OPTION_REFINERS$3 = { + var OPTION_REFINERS$1 = { listDayFormat: createFalsableFormatter, listDaySideFormat: createFalsableFormatter, noEventsClassNames: identity, @@ -14580,7 +14499,7 @@ var FullCalendar = (function (exports) { } var listPlugin = createPlugin({ - optionRefiners: OPTION_REFINERS$3, + optionRefiners: OPTION_REFINERS$1, views: { list: { component: ListView, @@ -14611,14 +14530,14 @@ var FullCalendar = (function (exports) { }, }); - var BootstrapTheme = /** @class */ (function (_super) { + var BootstrapTheme$1 = /** @class */ (function (_super) { __extends(BootstrapTheme, _super); function BootstrapTheme() { return _super !== null && _super.apply(this, arguments) || this; } return BootstrapTheme; }(Theme)); - BootstrapTheme.prototype.classes = { + BootstrapTheme$1.prototype.classes = { root: 'fc-theme-bootstrap', table: 'table-bordered', tableCellShaded: 'table-active', @@ -14629,31 +14548,72 @@ var FullCalendar = (function (exports) { popoverHeader: 'popover-header', popoverContent: 'popover-body', }; - BootstrapTheme.prototype.baseIconClass = 'fa'; - BootstrapTheme.prototype.iconClasses = { + BootstrapTheme$1.prototype.baseIconClass = 'fa'; + BootstrapTheme$1.prototype.iconClasses = { close: 'fa-times', prev: 'fa-chevron-left', next: 'fa-chevron-right', prevYear: 'fa-angle-double-left', nextYear: 'fa-angle-double-right', }; - BootstrapTheme.prototype.rtlIconClasses = { + BootstrapTheme$1.prototype.rtlIconClasses = { prev: 'fa-chevron-right', next: 'fa-chevron-left', prevYear: 'fa-angle-double-right', nextYear: 'fa-angle-double-left', }; - BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome'; // TODO: make TS-friendly. move the option-processing into this plugin - BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome'; - BootstrapTheme.prototype.iconOverridePrefix = 'fa-'; + BootstrapTheme$1.prototype.iconOverrideOption = 'bootstrapFontAwesome'; // TODO: make TS-friendly. move the option-processing into this plugin + BootstrapTheme$1.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome'; + BootstrapTheme$1.prototype.iconOverridePrefix = 'fa-'; + var plugin$1 = createPlugin({ + themeClasses: { + bootstrap: BootstrapTheme$1, + }, + }); + + var BootstrapTheme = /** @class */ (function (_super) { + __extends(BootstrapTheme, _super); + function BootstrapTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return BootstrapTheme; + }(Theme)); + BootstrapTheme.prototype.classes = { + root: 'fc-theme-bootstrap5', + tableCellShaded: 'fc-theme-bootstrap5-shaded', + buttonGroup: 'btn-group', + button: 'btn btn-primary', + buttonActive: 'active', + popover: 'popover', + popoverHeader: 'popover-header', + popoverContent: 'popover-body', + }; + BootstrapTheme.prototype.baseIconClass = 'bi'; + BootstrapTheme.prototype.iconClasses = { + close: 'bi-x-lg', + prev: 'bi-chevron-left', + next: 'bi-chevron-right', + prevYear: 'bi-chevron-double-left', + nextYear: 'bi-chevron-double-right', + }; + BootstrapTheme.prototype.rtlIconClasses = { + prev: 'bi-chevron-right', + next: 'bi-chevron-left', + prevYear: 'bi-chevron-double-right', + nextYear: 'bi-chevron-double-left', + }; + // wtf + BootstrapTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly + BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'icon'; + BootstrapTheme.prototype.iconOverridePrefix = 'bi-'; var plugin = createPlugin({ themeClasses: { - bootstrap: BootstrapTheme, + bootstrap5: BootstrapTheme, }, }); // rename this file to options.ts like other packages? - var OPTION_REFINERS$2 = { + var OPTION_REFINERS = { googleCalendarApiKey: String, }; @@ -14696,7 +14656,7 @@ var FullCalendar = (function (exports) { // TODO: make DRY with json-feed-event-source var extraParams = meta.extraParams; var extraParamsObj = typeof extraParams === 'function' ? extraParams() : extraParams; - var requestParams_1 = buildRequestParams$1(arg.range, apiKey, extraParamsObj, dateEnv); + var requestParams_1 = buildRequestParams(arg.range, apiKey, extraParamsObj, dateEnv); requestJson('GET', url, requestParams_1, function (body, xhr) { if (body.error) { onFailure({ @@ -14737,7 +14697,7 @@ var FullCalendar = (function (exports) { } return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events'; } - function buildRequestParams$1(range, apiKey, extraParams, dateEnv) { + function buildRequestParams(range, apiKey, extraParams, dateEnv) { var params; var startStr; var endStr; @@ -14788,5261 +14748,17 @@ var FullCalendar = (function (exports) { } var googleCalendarPlugin = createPlugin({ eventSourceDefs: [eventSourceDef], - optionRefiners: OPTION_REFINERS$2, + optionRefiners: OPTION_REFINERS, eventSourceRefiners: EVENT_SOURCE_REFINERS, }); - var RELEASE_DATE = '2021-06-16'; // for Scheduler - var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too - var INVALID_LICENSE_URL = 'http://fullcalendar.io/docs/schedulerLicenseKey#invalid'; - var OUTDATED_LICENSE_URL = 'http://fullcalendar.io/docs/schedulerLicenseKey#outdated'; - var PRESET_LICENSE_KEYS = [ - 'GPL-My-Project-Is-Open-Source', - 'CC-Attribution-NonCommercial-NoDerivatives', - ]; - var CSS = { - position: 'absolute', - zIndex: 99999, - bottom: '1px', - left: '1px', - background: '#eee', - borderColor: '#ddd', - borderStyle: 'solid', - borderWidth: '1px 1px 0 0', - padding: '2px 4px', - fontSize: '12px', - borderTopRightRadius: '3px', - }; - /* - This decryption is not meant to be bulletproof. Just a way to remind about an upgrade. - */ - function processLicenseKey(key) { - if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) { - return 'valid'; - } - var parts = (key || '').match(/^(\d+)-fcs-(\d+)$/); - if (parts && (parts[1].length === 10)) { - var purchaseDate = new Date(parseInt(parts[2], 10) * 1000); - var releaseDate = new Date(config.mockSchedulerReleaseDate || RELEASE_DATE); - if (isValidDate$1(releaseDate)) { // token won't be replaced in dev mode - var minPurchaseDate = addDays(releaseDate, -UPGRADE_WINDOW); - if (minPurchaseDate < purchaseDate) { - return 'valid'; - } - return 'outdated'; - } - } - return 'invalid'; - } - function isImmuneUrl(url) { - return /\w+:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url); - } + globalPlugins.push(interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, plugin$1, plugin, googleCalendarPlugin); - var OPTION_REFINERS$1 = { - schedulerLicenseKey: String, - }; - - var premiumCommonPlugin = createPlugin({ - optionRefiners: OPTION_REFINERS$1, - viewContainerAppends: [], - }); - - var WHEEL_EVENT_NAMES = 'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' '); - /* - ALSO, with the ability to disable touch - */ - var ScrollListener = /** @class */ (function () { - function ScrollListener(el) { - var _this = this; - this.el = el; - this.emitter = new Emitter(); - this.isScrolling = false; - this.isTouching = false; // user currently has finger down? - this.isRecentlyWheeled = false; - this.isRecentlyScrolled = false; - this.wheelWaiter = new DelayedRunner(this._handleWheelWaited.bind(this)); - this.scrollWaiter = new DelayedRunner(this._handleScrollWaited.bind(this)); - // Handlers - // ---------------------------------------------------------------------------------------------- - this.handleScroll = function () { - _this.startScroll(); - _this.emitter.trigger('scroll', _this.isRecentlyWheeled, _this.isTouching); - _this.isRecentlyScrolled = true; - _this.scrollWaiter.request(500); - }; - // will fire *before* the scroll event is fired (might not cause a scroll) - this.handleWheel = function () { - _this.isRecentlyWheeled = true; - _this.wheelWaiter.request(500); - }; - // will fire *before* the scroll event is fired (might not cause a scroll) - this.handleTouchStart = function () { - _this.isTouching = true; - }; - this.handleTouchEnd = function () { - _this.isTouching = false; - // if the user ended their touch, and the scroll area wasn't moving, - // we consider this to be the end of the scroll. - if (!_this.isRecentlyScrolled) { - _this.endScroll(); // won't fire if already ended - } - }; - el.addEventListener('scroll', this.handleScroll); - el.addEventListener('touchstart', this.handleTouchStart, { passive: true }); - el.addEventListener('touchend', this.handleTouchEnd); - for (var _i = 0, WHEEL_EVENT_NAMES_1 = WHEEL_EVENT_NAMES; _i < WHEEL_EVENT_NAMES_1.length; _i++) { - var eventName = WHEEL_EVENT_NAMES_1[_i]; - el.addEventListener(eventName, this.handleWheel); - } - } - ScrollListener.prototype.destroy = function () { - var el = this.el; - el.removeEventListener('scroll', this.handleScroll); - el.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); - el.removeEventListener('touchend', this.handleTouchEnd); - for (var _i = 0, WHEEL_EVENT_NAMES_2 = WHEEL_EVENT_NAMES; _i < WHEEL_EVENT_NAMES_2.length; _i++) { - var eventName = WHEEL_EVENT_NAMES_2[_i]; - el.removeEventListener(eventName, this.handleWheel); - } - }; - // Start / Stop - // ---------------------------------------------------------------------------------------------- - ScrollListener.prototype.startScroll = function () { - if (!this.isScrolling) { - this.isScrolling = true; - this.emitter.trigger('scrollStart', this.isRecentlyWheeled, this.isTouching); - } - }; - ScrollListener.prototype.endScroll = function () { - if (this.isScrolling) { - this.emitter.trigger('scrollEnd'); - this.isScrolling = false; - this.isRecentlyScrolled = true; - this.isRecentlyWheeled = false; - this.scrollWaiter.clear(); - this.wheelWaiter.clear(); - } - }; - ScrollListener.prototype._handleScrollWaited = function () { - this.isRecentlyScrolled = false; - // only end the scroll if not currently touching. - // if touching, the scrolling will end later, on touchend. - if (!this.isTouching) { - this.endScroll(); // won't fire if already ended - } - }; - ScrollListener.prototype._handleWheelWaited = function () { - this.isRecentlyWheeled = false; - }; - return ScrollListener; - }()); - - // TODO: assume the el has no borders? - function getScrollCanvasOrigin(scrollEl) { - var rect = scrollEl.getBoundingClientRect(); - var edges = computeEdges(scrollEl); // TODO: pass in isRtl? - return { - left: rect.left + edges.borderLeft + edges.scrollbarLeft - getScrollFromLeftEdge(scrollEl), - top: rect.top + edges.borderTop - scrollEl.scrollTop, - }; - } - function getScrollFromLeftEdge(el) { - var scrollLeft = el.scrollLeft; - var computedStyles = window.getComputedStyle(el); // TODO: pass in isRtl instead? - if (computedStyles.direction === 'rtl') { - switch (getRtlScrollSystem()) { - case 'negative': - scrollLeft *= -1; // convert to 'reverse'. fall through... - case 'reverse': // scrollLeft is distance between scrollframe's right edge scrollcanvas's right edge - scrollLeft = el.scrollWidth - scrollLeft - el.clientWidth; - } - } - return scrollLeft; - } - function setScrollFromLeftEdge(el, scrollLeft) { - var computedStyles = window.getComputedStyle(el); // TODO: pass in isRtl instead? - if (computedStyles.direction === 'rtl') { - switch (getRtlScrollSystem()) { - case 'reverse': - scrollLeft = el.scrollWidth - scrollLeft; - break; - case 'negative': - scrollLeft = -(el.scrollWidth - scrollLeft); - break; - } - } - el.scrollLeft = scrollLeft; - } - // Horizontal Scroll System Detection - // ---------------------------------------------------------------------------------------------- - var _rtlScrollSystem; - function getRtlScrollSystem() { - return _rtlScrollSystem || (_rtlScrollSystem = detectRtlScrollSystem()); - } - function detectRtlScrollSystem() { - var el = document.createElement('div'); - el.style.position = 'absolute'; - el.style.top = '-1000px'; - el.style.width = '1px'; - el.style.height = '1px'; - el.style.overflow = 'scroll'; - el.style.direction = 'rtl'; - el.style.fontSize = '100px'; - el.innerHTML = 'A'; - document.body.appendChild(el); - var system; - if (el.scrollLeft > 0) { - system = 'positive'; // scroll is a positive number from the left edge - } - else { - el.scrollLeft = 1; - if (el.scrollLeft > 0) { - system = 'reverse'; // scroll is a positive number from the right edge - } - else { - system = 'negative'; // scroll is a negative number from the right edge - } - } - removeElement(el); - return system; - } - - var IS_MS_EDGE = typeof navigator !== 'undefined' && /Edge/.test(navigator.userAgent); // TODO: what about Chromeum-based Edge? - var STICKY_SELECTOR = '.fc-sticky'; - /* - useful beyond the native position:sticky for these reasons: - - support in IE11 - - nice centering support - - REQUIREMENT: fc-sticky elements, if the fc-sticky className is taken away, should NOT have relative or absolute positioning. - This is because we attach the coords with JS, and the VDOM might take away the fc-sticky class but doesn't know kill the positioning. - - TODO: don't query text-align:center. isn't compatible with flexbox centering. instead, check natural X coord within parent container - */ - var StickyScrolling = /** @class */ (function () { - function StickyScrolling(scrollEl, isRtl) { - var _this = this; - this.scrollEl = scrollEl; - this.isRtl = isRtl; - this.usingRelative = null; - this.updateSize = function () { - var scrollEl = _this.scrollEl; - var els = findElements(scrollEl, STICKY_SELECTOR); - var elGeoms = _this.queryElGeoms(els); - var viewportWidth = scrollEl.clientWidth; - var viewportHeight = scrollEl.clientHeight; - if (_this.usingRelative) { - var elDestinations = _this.computeElDestinations(elGeoms, viewportWidth); // read before prepPositioning - assignRelativePositions(els, elGeoms, elDestinations, viewportWidth, viewportHeight); - } - else { - assignStickyPositions(els, elGeoms, viewportWidth); - } - }; - this.usingRelative = - !computeStickyPropVal() || // IE11 - // https://stackoverflow.com/questions/56835658/in-microsoft-edge-sticky-positioning-doesnt-work-when-combined-with-dir-rtl - (IS_MS_EDGE && isRtl); - if (this.usingRelative) { - this.listener = new ScrollListener(scrollEl); - this.listener.emitter.on('scrollEnd', this.updateSize); - } - } - StickyScrolling.prototype.destroy = function () { - if (this.listener) { - this.listener.destroy(); - } - }; - StickyScrolling.prototype.queryElGeoms = function (els) { - var _a = this, scrollEl = _a.scrollEl, isRtl = _a.isRtl; - var canvasOrigin = getScrollCanvasOrigin(scrollEl); - var elGeoms = []; - for (var _i = 0, els_1 = els; _i < els_1.length; _i++) { - var el = els_1[_i]; - var parentBound = translateRect(computeInnerRect(el.parentNode, true, true), // weird way to call this!!! - -canvasOrigin.left, -canvasOrigin.top); - var elRect = el.getBoundingClientRect(); - var computedStyles = window.getComputedStyle(el); - var textAlign = window.getComputedStyle(el.parentNode).textAlign; // ask the parent - var naturalBound = null; - if (textAlign === 'start') { - textAlign = isRtl ? 'right' : 'left'; - } - else if (textAlign === 'end') { - textAlign = isRtl ? 'left' : 'right'; - } - if (computedStyles.position !== 'sticky') { - naturalBound = translateRect(elRect, -canvasOrigin.left - (parseFloat(computedStyles.left) || 0), // could be 'auto' - -canvasOrigin.top - (parseFloat(computedStyles.top) || 0)); - } - elGeoms.push({ - parentBound: parentBound, - naturalBound: naturalBound, - elWidth: elRect.width, - elHeight: elRect.height, - textAlign: textAlign, - }); - } - return elGeoms; - }; - // only for IE - StickyScrolling.prototype.computeElDestinations = function (elGeoms, viewportWidth) { - var scrollEl = this.scrollEl; - var viewportTop = scrollEl.scrollTop; - var viewportLeft = getScrollFromLeftEdge(scrollEl); - var viewportRight = viewportLeft + viewportWidth; - return elGeoms.map(function (elGeom) { - var elWidth = elGeom.elWidth, elHeight = elGeom.elHeight, parentBound = elGeom.parentBound, naturalBound = elGeom.naturalBound; - var destLeft; // relative to canvas topleft - var destTop; // " - switch (elGeom.textAlign) { - case 'left': - destLeft = viewportLeft; - break; - case 'right': - destLeft = viewportRight - elWidth; - break; - case 'center': - destLeft = (viewportLeft + viewportRight) / 2 - elWidth / 2; /// noooo, use half-width insteadddddddd - break; - } - destLeft = Math.min(destLeft, parentBound.right - elWidth); - destLeft = Math.max(destLeft, parentBound.left); - destTop = viewportTop; - destTop = Math.min(destTop, parentBound.bottom - elHeight); - destTop = Math.max(destTop, naturalBound.top); // better to use natural top for upper bound - return { left: destLeft, top: destTop }; - }); - }; - return StickyScrolling; - }()); - function assignRelativePositions(els, elGeoms, elDestinations, viewportWidth, viewportHeight) { - els.forEach(function (el, i) { - var _a = elGeoms[i], naturalBound = _a.naturalBound, parentBound = _a.parentBound; - var parentWidth = parentBound.right - parentBound.left; - var parentHeight = parentBound.bottom - parentBound.bottom; - var left; - var top; - if (parentWidth > viewportWidth || - parentHeight > viewportHeight) { - left = elDestinations[i].left - naturalBound.left; - top = elDestinations[i].top - naturalBound.top; - } - else { // if parent container can be completely in view, we don't need stickiness - left = ''; - top = ''; - } - applyStyle(el, { - position: 'relative', - left: left, - right: -left, - top: top, - }); - }); - } - function assignStickyPositions(els, elGeoms, viewportWidth) { - els.forEach(function (el, i) { - var _a = elGeoms[i], textAlign = _a.textAlign, elWidth = _a.elWidth, parentBound = _a.parentBound; - var parentWidth = parentBound.right - parentBound.left; - var left; - if (textAlign === 'center' && - parentWidth > viewportWidth) { - left = (viewportWidth - elWidth) / 2; - } - else { // if parent container can be completely in view, we don't need stickiness - left = ''; - } - applyStyle(el, { - left: left, - right: left, - top: 0, - }); - }); - } - // overkill now that we use the stylesheet to set it! - // just test that the 'position' value of a div with the fc-sticky classname has the word 'sticky' in it - function computeStickyPropVal() { - var el = document.createElement('div'); - el.className = 'fc-sticky'; - document.body.appendChild(el); - var val = window.getComputedStyle(el).position; - removeElement(el); - if (val.indexOf('sticky') !== -1) { - return val; - } - return null; - } - - var ClippedScroller = /** @class */ (function (_super) { - __extends(ClippedScroller, _super); - function ClippedScroller() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.elRef = createRef(); - _this.state = { - xScrollbarWidth: 0, - yScrollbarWidth: 0, - }; - _this.handleScroller = function (scroller) { - _this.scroller = scroller; - setRef(_this.props.scrollerRef, scroller); - }; - _this.handleSizing = function () { - var props = _this.props; - if (props.overflowY === 'scroll-hidden') { - _this.setState({ yScrollbarWidth: _this.scroller.getYScrollbarWidth() }); - } - if (props.overflowX === 'scroll-hidden') { - _this.setState({ xScrollbarWidth: _this.scroller.getXScrollbarWidth() }); - } - }; - return _this; - } - ClippedScroller.prototype.render = function () { - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var isScrollbarOnLeft = context.isRtl && getIsRtlScrollbarOnLeft(); - var overcomeLeft = 0; - var overcomeRight = 0; - var overcomeBottom = 0; - if (props.overflowX === 'scroll-hidden') { - overcomeBottom = state.xScrollbarWidth; - } - if (props.overflowY === 'scroll-hidden') { - if (state.yScrollbarWidth != null) { - if (isScrollbarOnLeft) { - overcomeLeft = state.yScrollbarWidth; - } - else { - overcomeRight = state.yScrollbarWidth; - } - } - } - return (createElement("div", { ref: this.elRef, className: 'fc-scroller-harness' + (props.liquid ? ' fc-scroller-harness-liquid' : '') }, - createElement(Scroller, { ref: this.handleScroller, elRef: this.props.scrollerElRef, overflowX: props.overflowX === 'scroll-hidden' ? 'scroll' : props.overflowX, overflowY: props.overflowY === 'scroll-hidden' ? 'scroll' : props.overflowY, overcomeLeft: overcomeLeft, overcomeRight: overcomeRight, overcomeBottom: overcomeBottom, maxHeight: typeof props.maxHeight === 'number' - ? (props.maxHeight + (props.overflowX === 'scroll-hidden' ? state.xScrollbarWidth : 0)) - : '', liquid: props.liquid, liquidIsAbsolute: true }, props.children))); - }; - ClippedScroller.prototype.componentDidMount = function () { - this.handleSizing(); - this.context.addResizeHandler(this.handleSizing); - }; - ClippedScroller.prototype.componentDidUpdate = function (prevProps) { - if (!isPropsEqual(prevProps, this.props)) { // an external change? - this.handleSizing(); - } - }; - ClippedScroller.prototype.componentWillUnmount = function () { - this.context.removeResizeHandler(this.handleSizing); - }; - ClippedScroller.prototype.needsXScrolling = function () { - return this.scroller.needsXScrolling(); - }; - ClippedScroller.prototype.needsYScrolling = function () { - return this.scroller.needsYScrolling(); - }; - return ClippedScroller; - }(BaseComponent)); - - var ScrollSyncer = /** @class */ (function () { - function ScrollSyncer(isVertical, scrollEls) { - var _this = this; - this.isVertical = isVertical; - this.scrollEls = scrollEls; - this.isPaused = false; - this.scrollListeners = scrollEls.map(function (el) { return _this.bindScroller(el); }); - } - ScrollSyncer.prototype.destroy = function () { - for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { - var scrollListener = _a[_i]; - scrollListener.destroy(); - } - }; - ScrollSyncer.prototype.bindScroller = function (el) { - var _this = this; - var _a = this, scrollEls = _a.scrollEls, isVertical = _a.isVertical; - var scrollListener = new ScrollListener(el); - var onScroll = function (isWheel, isTouch) { - if (!_this.isPaused) { - if (!_this.masterEl || (_this.masterEl !== el && (isWheel || isTouch))) { - _this.assignMaster(el); - } - if (_this.masterEl === el) { // dealing with current - for (var _i = 0, scrollEls_1 = scrollEls; _i < scrollEls_1.length; _i++) { - var otherEl = scrollEls_1[_i]; - if (otherEl !== el) { - if (isVertical) { - otherEl.scrollTop = el.scrollTop; - } - else { - otherEl.scrollLeft = el.scrollLeft; - } - } - } - } - } - }; - var onScrollEnd = function () { - if (_this.masterEl === el) { - _this.masterEl = null; - } - }; - scrollListener.emitter.on('scroll', onScroll); - scrollListener.emitter.on('scrollEnd', onScrollEnd); - return scrollListener; - }; - ScrollSyncer.prototype.assignMaster = function (el) { - this.masterEl = el; - for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { - var scrollListener = _a[_i]; - if (scrollListener.el !== el) { - scrollListener.endScroll(); // to prevent residual scrolls from reclaiming master - } - } - }; - /* - will normalize the scrollLeft value - */ - ScrollSyncer.prototype.forceScrollLeft = function (scrollLeft) { - this.isPaused = true; - for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { - var listener = _a[_i]; - setScrollFromLeftEdge(listener.el, scrollLeft); - } - this.isPaused = false; - }; - ScrollSyncer.prototype.forceScrollTop = function (top) { - this.isPaused = true; - for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) { - var listener = _a[_i]; - listener.el.scrollTop = top; - } - this.isPaused = false; - }; - return ScrollSyncer; - }()); - - /* - TODO: make subcomponent - NOTE: doesn't support collapsibleWidth (which is sortof a hack anyway) - */ - var ScrollGrid = /** @class */ (function (_super) { - __extends(ScrollGrid, _super); - function ScrollGrid() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.compileColGroupStats = memoizeArraylike(compileColGroupStat, isColGroupStatsEqual); - _this.renderMicroColGroups = memoizeArraylike(renderMicroColGroup); // yucky to memoize VNodes, but much more efficient for consumers - _this.clippedScrollerRefs = new RefMap(); - // doesn't hold non-scrolling els used just for padding - _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this)); - _this.chunkElRefs = new RefMap(_this._handleChunkEl.bind(_this)); - _this.getStickyScrolling = memoizeArraylike(initStickyScrolling, null, destroyStickyScrolling); - _this.getScrollSyncersBySection = memoizeHashlike(initScrollSyncer.bind(_this, true), null, destroyScrollSyncer); - _this.getScrollSyncersByColumn = memoizeHashlike(initScrollSyncer.bind(_this, false), null, destroyScrollSyncer); - _this.stickyScrollings = []; - _this.scrollSyncersBySection = {}; - _this.scrollSyncersByColumn = {}; - // for row-height-syncing - _this.rowUnstableMap = new Map(); // no need to groom. always self-cancels - _this.rowInnerMaxHeightMap = new Map(); - _this.anyRowHeightsChanged = false; - _this.recentSizingCnt = 0; - _this.state = { - shrinkWidths: [], - forceYScrollbars: false, - forceXScrollbars: false, - scrollerClientWidths: {}, - scrollerClientHeights: {}, - sectionRowMaxHeights: [], - }; - _this.handleSizing = function (isForcedResize, sectionRowMaxHeightsChanged) { - if (!_this.allowSizing()) { - return; - } - if (!sectionRowMaxHeightsChanged) { // something else changed, probably external - _this.anyRowHeightsChanged = true; - } - var otherState = {}; - // if reacting to self-change of sectionRowMaxHeightsChanged, or not stable, don't do anything - if (isForcedResize || (!sectionRowMaxHeightsChanged && !_this.rowUnstableMap.size)) { - otherState.sectionRowMaxHeights = _this.computeSectionRowMaxHeights(); - } - _this.setState(__assign(__assign({ shrinkWidths: _this.computeShrinkWidths() }, _this.computeScrollerDims()), otherState), function () { - if (!_this.rowUnstableMap.size) { - _this.updateStickyScrolling(); // needs to happen AFTER final positioning committed to DOM - } - }); - }; - _this.handleRowHeightChange = function (rowEl, isStable) { - var _a = _this, rowUnstableMap = _a.rowUnstableMap, rowInnerMaxHeightMap = _a.rowInnerMaxHeightMap; - if (!isStable) { - rowUnstableMap.set(rowEl, true); - } - else { - rowUnstableMap.delete(rowEl); - var innerMaxHeight = getRowInnerMaxHeight(rowEl); - if (!rowInnerMaxHeightMap.has(rowEl) || rowInnerMaxHeightMap.get(rowEl) !== innerMaxHeight) { - rowInnerMaxHeightMap.set(rowEl, innerMaxHeight); - _this.anyRowHeightsChanged = true; - } - if (!rowUnstableMap.size && _this.anyRowHeightsChanged) { - _this.anyRowHeightsChanged = false; - _this.setState({ - sectionRowMaxHeights: _this.computeSectionRowMaxHeights(), - }); - } - } - }; - return _this; - } - ScrollGrid.prototype.render = function () { - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var shrinkWidths = state.shrinkWidths; - var colGroupStats = this.compileColGroupStats(props.colGroups.map(function (colGroup) { return [colGroup]; })); - var microColGroupNodes = this.renderMicroColGroups(colGroupStats.map(function (stat, i) { return [stat.cols, shrinkWidths[i]]; })); - var classNames = getScrollGridClassNames(props.liquid, context); - var _b = this.getDims(); _b[0]; _b[1]; - // TODO: make DRY - var sectionConfigs = props.sections; - var configCnt = sectionConfigs.length; - var configI = 0; - var currentConfig; - var headSectionNodes = []; - var bodySectionNodes = []; - var footSectionNodes = []; - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { - headSectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights)); - configI += 1; - } - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { - bodySectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights)); - configI += 1; - } - while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { - footSectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights)); - configI += 1; - } - var isBuggy = !getCanVGrowWithinCell(); // see NOTE in SimpleScrollGrid - return createElement('table', { - ref: props.elRef, - className: classNames.join(' '), - }, renderMacroColGroup(colGroupStats, shrinkWidths), Boolean(!isBuggy && headSectionNodes.length) && createElement.apply(void 0, __spreadArray(['thead', {}], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && createElement.apply(void 0, __spreadArray(['tbody', {}], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && createElement.apply(void 0, __spreadArray(['tfoot', {}], footSectionNodes)), isBuggy && createElement.apply(void 0, __spreadArray(__spreadArray(__spreadArray(['tbody', {}], headSectionNodes), bodySectionNodes), footSectionNodes))); - }; - ScrollGrid.prototype.renderSection = function (sectionConfig, sectionIndex, colGroupStats, microColGroupNodes, sectionRowMaxHeights) { - var _this = this; - if ('outerContent' in sectionConfig) { - return (createElement(Fragment, { key: sectionConfig.key }, sectionConfig.outerContent)); - } - return (createElement("tr", { key: sectionConfig.key, className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, sectionConfig.chunks.map(function (chunkConfig, i) { return _this.renderChunk(sectionConfig, sectionIndex, colGroupStats[i], microColGroupNodes[i], chunkConfig, i, (sectionRowMaxHeights[sectionIndex] || [])[i] || []); }))); - }; - ScrollGrid.prototype.renderChunk = function (sectionConfig, sectionIndex, colGroupStat, microColGroupNode, chunkConfig, chunkIndex, rowHeights) { - if ('outerContent' in chunkConfig) { - return (createElement(Fragment, { key: chunkConfig.key }, chunkConfig.outerContent)); - } - var state = this.state; - var scrollerClientWidths = state.scrollerClientWidths, scrollerClientHeights = state.scrollerClientHeights; - var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; - var index = sectionIndex * chunksPerSection + chunkIndex; - var sideScrollIndex = (!this.context.isRtl || getIsRtlScrollbarOnLeft()) ? chunksPerSection - 1 : 0; - var isVScrollSide = chunkIndex === sideScrollIndex; - var isLastSection = sectionIndex === sectionCnt - 1; - var forceXScrollbars = isLastSection && state.forceXScrollbars; // NOOOO can result in `null` - var forceYScrollbars = isVScrollSide && state.forceYScrollbars; // NOOOO can result in `null` - var allowXScrolling = colGroupStat && colGroupStat.allowXScrolling; // rename? - var allowYScrolling = getAllowYScrolling(this.props, sectionConfig); // rename? do in section func? - var chunkVGrow = getSectionHasLiquidHeight(this.props, sectionConfig); // do in section func? - var expandRows = sectionConfig.expandRows && chunkVGrow; - var tableMinWidth = (colGroupStat && colGroupStat.totalColMinWidth) || ''; - var content = renderChunkContent(sectionConfig, chunkConfig, { - tableColGroupNode: microColGroupNode, - tableMinWidth: tableMinWidth, - clientWidth: scrollerClientWidths[index] !== undefined ? scrollerClientWidths[index] : null, - clientHeight: scrollerClientHeights[index] !== undefined ? scrollerClientHeights[index] : null, - expandRows: expandRows, - syncRowHeights: Boolean(sectionConfig.syncRowHeights), - rowSyncHeights: rowHeights, - reportRowHeightChange: this.handleRowHeightChange, - }); - var overflowX = forceXScrollbars ? (isLastSection ? 'auto' : 'scroll-hidden') : - !allowXScrolling ? 'hidden' : - (isLastSection ? 'auto' : 'scroll-hidden'); - var overflowY = forceYScrollbars ? (isVScrollSide ? 'auto' : 'scroll-hidden') : - !allowYScrolling ? 'hidden' : - (isVScrollSide ? 'auto' : 'scroll-hidden'); - // it *could* be possible to reduce DOM wrappers by only doing a ClippedScroller when allowXScrolling or allowYScrolling, - // but if these values were to change, the inner components would be unmounted/remounted because of the parent change. - content = (createElement(ClippedScroller, { ref: this.clippedScrollerRefs.createRef(index), scrollerElRef: this.scrollerElRefs.createRef(index), overflowX: overflowX, overflowY: overflowY, liquid: chunkVGrow, maxHeight: sectionConfig.maxHeight }, content)); - return (createElement("td", { key: chunkConfig.key, ref: this.chunkElRefs.createRef(index) }, content)); - }; - ScrollGrid.prototype.componentDidMount = function () { - this.updateScrollSyncers(); - this.handleSizing(false); - this.context.addResizeHandler(this.handleSizing); - }; - ScrollGrid.prototype.componentDidUpdate = function (prevProps, prevState) { - this.updateScrollSyncers(); - // TODO: need better solution when state contains non-sizing things - this.handleSizing(false, prevState.sectionRowMaxHeights !== this.state.sectionRowMaxHeights); - }; - ScrollGrid.prototype.componentWillUnmount = function () { - this.context.removeResizeHandler(this.handleSizing); - this.destroyStickyScrolling(); - this.destroyScrollSyncers(); - }; - ScrollGrid.prototype.allowSizing = function () { - var now = new Date(); - if (!this.lastSizingDate || - now.valueOf() > this.lastSizingDate.valueOf() + config.SCROLLGRID_RESIZE_INTERVAL) { - this.lastSizingDate = now; - this.recentSizingCnt = 0; - return true; - } - return (this.recentSizingCnt += 1) <= 10; - }; - ScrollGrid.prototype.computeShrinkWidths = function () { - var _this = this; - var colGroupStats = this.compileColGroupStats(this.props.colGroups.map(function (colGroup) { return [colGroup]; })); - var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; - var cnt = sectionCnt * chunksPerSection; - var shrinkWidths = []; - colGroupStats.forEach(function (colGroupStat, i) { - if (colGroupStat.hasShrinkCol) { - var chunkEls = _this.chunkElRefs.collect(i, cnt, chunksPerSection); // in one col - shrinkWidths[i] = computeShrinkWidth(chunkEls); - } - }); - return shrinkWidths; - }; - // has the side effect of grooming rowInnerMaxHeightMap - // TODO: somehow short-circuit if there are no new height changes - ScrollGrid.prototype.computeSectionRowMaxHeights = function () { - var newHeightMap = new Map(); - var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; - var sectionRowMaxHeights = []; - for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { - var sectionConfig = this.props.sections[sectionI]; - var assignableHeights = []; // chunk, row - if (sectionConfig && sectionConfig.syncRowHeights) { - var rowHeightsByChunk = []; - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - var index = sectionI * chunksPerSection + chunkI; - var rowHeights = []; - var chunkEl = this.chunkElRefs.currentMap[index]; - if (chunkEl) { - rowHeights = findElements(chunkEl, '.fc-scrollgrid-sync-table tr').map(function (rowEl) { - var max = getRowInnerMaxHeight(rowEl); - newHeightMap.set(rowEl, max); - return max; - }); - } - else { - rowHeights = []; - } - rowHeightsByChunk.push(rowHeights); - } - var rowCnt = rowHeightsByChunk[0].length; - var isEqualRowCnt = true; - for (var chunkI = 1; chunkI < chunksPerSection; chunkI += 1) { - var isOuterContent = sectionConfig.chunks[chunkI] && sectionConfig.chunks[chunkI].outerContent !== undefined; // can be null - if (!isOuterContent && rowHeightsByChunk[chunkI].length !== rowCnt) { // skip outer content - isEqualRowCnt = false; - break; - } - } - if (!isEqualRowCnt) { - var chunkHeightSums = []; - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - chunkHeightSums.push(sumNumbers(rowHeightsByChunk[chunkI]) + rowHeightsByChunk[chunkI].length); - } - var maxTotalSum = Math.max.apply(Math, chunkHeightSums); - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - var rowInChunkCnt = rowHeightsByChunk[chunkI].length; - var rowInChunkTotalHeight = maxTotalSum - rowInChunkCnt; // subtract border - // height of non-first row. we do this to avoid rounding, because it's unreliable within a table - var rowInChunkHeightOthers = Math.floor(rowInChunkTotalHeight / rowInChunkCnt); - // whatever is leftover goes to the first row - var rowInChunkHeightFirst = rowInChunkTotalHeight - rowInChunkHeightOthers * (rowInChunkCnt - 1); - var rowInChunkHeights = []; - var row = 0; - if (row < rowInChunkCnt) { - rowInChunkHeights.push(rowInChunkHeightFirst); - row += 1; - } - while (row < rowInChunkCnt) { - rowInChunkHeights.push(rowInChunkHeightOthers); - row += 1; - } - assignableHeights.push(rowInChunkHeights); - } - } - else { - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - assignableHeights.push([]); - } - for (var row = 0; row < rowCnt; row += 1) { - var rowHeightsAcrossChunks = []; - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - var h = rowHeightsByChunk[chunkI][row]; - if (h != null) { // protect against outerContent - rowHeightsAcrossChunks.push(h); - } - } - var maxHeight = Math.max.apply(Math, rowHeightsAcrossChunks); - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - assignableHeights[chunkI].push(maxHeight); - } - } - } - } - sectionRowMaxHeights.push(assignableHeights); - } - this.rowInnerMaxHeightMap = newHeightMap; - return sectionRowMaxHeights; - }; - ScrollGrid.prototype.computeScrollerDims = function () { - var scrollbarWidth = getScrollbarWidths(); - var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; - var sideScrollI = (!this.context.isRtl || getIsRtlScrollbarOnLeft()) ? chunksPerSection - 1 : 0; - var lastSectionI = sectionCnt - 1; - var currentScrollers = this.clippedScrollerRefs.currentMap; - var scrollerEls = this.scrollerElRefs.currentMap; - var forceYScrollbars = false; - var forceXScrollbars = false; - var scrollerClientWidths = {}; - var scrollerClientHeights = {}; - for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { // along edge - var index = sectionI * chunksPerSection + sideScrollI; - var scroller = currentScrollers[index]; - if (scroller && scroller.needsYScrolling()) { - forceYScrollbars = true; - break; - } - } - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { // along last row - var index = lastSectionI * chunksPerSection + chunkI; - var scroller = currentScrollers[index]; - if (scroller && scroller.needsXScrolling()) { - forceXScrollbars = true; - break; - } - } - for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { - for (var chunkI = 0; chunkI < chunksPerSection; chunkI += 1) { - var index = sectionI * chunksPerSection + chunkI; - var scrollerEl = scrollerEls[index]; - if (scrollerEl) { - // TODO: weird way to get this. need harness b/c doesn't include table borders - var harnessEl = scrollerEl.parentNode; - scrollerClientWidths[index] = Math.floor(harnessEl.getBoundingClientRect().width - ((chunkI === sideScrollI && forceYScrollbars) - ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future - : 0)); - scrollerClientHeights[index] = Math.floor(harnessEl.getBoundingClientRect().height - ((sectionI === lastSectionI && forceXScrollbars) - ? scrollbarWidth.x // use global because scroller might not have scrollbars yet but will need them in future - : 0)); - } - } - } - return { forceYScrollbars: forceYScrollbars, forceXScrollbars: forceXScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights }; - }; - ScrollGrid.prototype.updateStickyScrolling = function () { - var isRtl = this.context.isRtl; - var argsByKey = this.scrollerElRefs.getAll().map(function (scrollEl) { return [scrollEl, isRtl]; }); - var stickyScrollings = this.getStickyScrolling(argsByKey); - stickyScrollings.forEach(function (stickyScrolling) { return stickyScrolling.updateSize(); }); - this.stickyScrollings = stickyScrollings; - }; - ScrollGrid.prototype.destroyStickyScrolling = function () { - this.stickyScrollings.forEach(destroyStickyScrolling); - }; - ScrollGrid.prototype.updateScrollSyncers = function () { - var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1]; - var cnt = sectionCnt * chunksPerSection; - var scrollElsBySection = {}; - var scrollElsByColumn = {}; - var scrollElMap = this.scrollerElRefs.currentMap; - for (var sectionI = 0; sectionI < sectionCnt; sectionI += 1) { - var startIndex = sectionI * chunksPerSection; - var endIndex = startIndex + chunksPerSection; - scrollElsBySection[sectionI] = collectFromHash(scrollElMap, startIndex, endIndex, 1); // use the filtered - } - for (var col = 0; col < chunksPerSection; col += 1) { - scrollElsByColumn[col] = this.scrollerElRefs.collect(col, cnt, chunksPerSection); // DON'T use the filtered - } - this.scrollSyncersBySection = this.getScrollSyncersBySection(scrollElsBySection); - this.scrollSyncersByColumn = this.getScrollSyncersByColumn(scrollElsByColumn); - }; - ScrollGrid.prototype.destroyScrollSyncers = function () { - mapHash(this.scrollSyncersBySection, destroyScrollSyncer); - mapHash(this.scrollSyncersByColumn, destroyScrollSyncer); - }; - ScrollGrid.prototype.getChunkConfigByIndex = function (index) { - var chunksPerSection = this.getDims()[1]; - var sectionI = Math.floor(index / chunksPerSection); - var chunkI = index % chunksPerSection; - var sectionConfig = this.props.sections[sectionI]; - return sectionConfig && sectionConfig.chunks[chunkI]; - }; - ScrollGrid.prototype.forceScrollLeft = function (col, scrollLeft) { - var scrollSyncer = this.scrollSyncersByColumn[col]; - if (scrollSyncer) { - scrollSyncer.forceScrollLeft(scrollLeft); - } - }; - ScrollGrid.prototype.forceScrollTop = function (sectionI, scrollTop) { - var scrollSyncer = this.scrollSyncersBySection[sectionI]; - if (scrollSyncer) { - scrollSyncer.forceScrollTop(scrollTop); - } - }; - ScrollGrid.prototype._handleChunkEl = function (chunkEl, key) { - var chunkConfig = this.getChunkConfigByIndex(parseInt(key, 10)); - if (chunkConfig) { // null if section disappeared. bad, b/c won't null-set the elRef - setRef(chunkConfig.elRef, chunkEl); - } - }; - ScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) { - var chunkConfig = this.getChunkConfigByIndex(parseInt(key, 10)); - if (chunkConfig) { // null if section disappeared. bad, b/c won't null-set the elRef - setRef(chunkConfig.scrollerElRef, scrollerEl); - } - }; - ScrollGrid.prototype.getDims = function () { - var sectionCnt = this.props.sections.length; - var chunksPerSection = sectionCnt ? this.props.sections[0].chunks.length : 0; - return [sectionCnt, chunksPerSection]; - }; - return ScrollGrid; - }(BaseComponent)); - ScrollGrid.addStateEquality({ - shrinkWidths: isArraysEqual, - scrollerClientWidths: isPropsEqual, - scrollerClientHeights: isPropsEqual, - }); - function sumNumbers(numbers) { - var sum = 0; - for (var _i = 0, numbers_1 = numbers; _i < numbers_1.length; _i++) { - var n = numbers_1[_i]; - sum += n; - } - return sum; - } - function getRowInnerMaxHeight(rowEl) { - var innerHeights = findElements(rowEl, '.fc-scrollgrid-sync-inner').map(getElHeight); - if (innerHeights.length) { - return Math.max.apply(Math, innerHeights); - } - return 0; - } - function getElHeight(el) { - return el.offsetHeight; // better to deal with integers, for rounding, for PureComponent - } - function renderMacroColGroup(colGroupStats, shrinkWidths) { - var children = colGroupStats.map(function (colGroupStat, i) { - var width = colGroupStat.width; - if (width === 'shrink') { - width = colGroupStat.totalColWidth + sanitizeShrinkWidth(shrinkWidths[i]) + 1; // +1 for border :( - } - return ( // eslint-disable-next-line react/jsx-key - createElement("col", { style: { width: width } })); - }); - return createElement.apply(void 0, __spreadArray(['colgroup', {}], children)); - } - function compileColGroupStat(colGroupConfig) { - var totalColWidth = sumColProp(colGroupConfig.cols, 'width'); // excludes "shrink" - var totalColMinWidth = sumColProp(colGroupConfig.cols, 'minWidth'); - var hasShrinkCol = hasShrinkWidth(colGroupConfig.cols); - var allowXScrolling = colGroupConfig.width !== 'shrink' && Boolean(totalColWidth || totalColMinWidth || hasShrinkCol); - return { - hasShrinkCol: hasShrinkCol, - totalColWidth: totalColWidth, - totalColMinWidth: totalColMinWidth, - allowXScrolling: allowXScrolling, - cols: colGroupConfig.cols, - width: colGroupConfig.width, - }; - } - function sumColProp(cols, propName) { - var total = 0; - for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) { - var col = cols_1[_i]; - var val = col[propName]; - if (typeof val === 'number') { - total += val * (col.span || 1); - } - } - return total; - } - var COL_GROUP_STAT_EQUALITY = { - cols: isColPropsEqual, - }; - function isColGroupStatsEqual(stat0, stat1) { - return compareObjs(stat0, stat1, COL_GROUP_STAT_EQUALITY); - } - // for memoizers... - function initScrollSyncer(isVertical) { - var scrollEls = []; - for (var _i = 1; _i < arguments.length; _i++) { - scrollEls[_i - 1] = arguments[_i]; - } - return new ScrollSyncer(isVertical, scrollEls); - } - function destroyScrollSyncer(scrollSyncer) { - scrollSyncer.destroy(); - } - function initStickyScrolling(scrollEl, isRtl) { - return new StickyScrolling(scrollEl, isRtl); - } - function destroyStickyScrolling(stickyScrolling) { - stickyScrolling.destroy(); - } - - var scrollGridPlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - ], - scrollGridImpl: ScrollGrid, - }); - config.SCROLLGRID_RESIZE_INTERVAL = 500; - - config.COLLAPSIBLE_WIDTH_THRESHOLD = 1200; - var contexts = []; - var undoFuncs = []; - var adaptivePlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - ], - contextInit: function (context) { - if (!contexts.length) { - attachGlobalHandlers(); - } - contexts.push(context); - context.calendarApi.on('_unmount', function () { - removeExact(contexts, context); - if (!contexts.length) { - removeGlobalHandlers(); - } - }); - }, - }); - function attachGlobalHandlers() { - window.addEventListener('beforeprint', handleBeforePrint); - window.addEventListener('afterprint', handleAfterPrint); - // // for testing - // let forPrint = false - // document.addEventListener('keypress', (ev) => { - // if (ev.key === 'p') { - // forPrint = !forPrint - // if (forPrint) { - // handleBeforePrint() - // } else { - // handleAfterPrint() - // } - // } - // }) - } - function removeGlobalHandlers() { - window.removeEventListener('beforeprint', handleBeforePrint); - window.removeEventListener('afterprint', handleAfterPrint); - } - function handleBeforePrint() { - var scrollEls = queryScrollerEls(); - var scrollCoords = queryScrollerCoords(scrollEls); - for (var _i = 0, contexts_1 = contexts; _i < contexts_1.length; _i++) { - var context = contexts_1[_i]; - context.emitter.trigger('_beforeprint'); - } - flushToDom(); // because printing grabs DOM immediately after - killHorizontalScrolling(scrollEls, scrollCoords); - undoFuncs.push(function () { return restoreScrollerCoords(scrollEls, scrollCoords); }); - undoFuncs.push(freezeScrollgridWidths()); - } - function handleAfterPrint() { - for (var _i = 0, contexts_2 = contexts; _i < contexts_2.length; _i++) { - var context = contexts_2[_i]; - context.emitter.trigger('_afterprint'); - } - flushToDom(); // guarantee that there are real scrollers - while (undoFuncs.length) { - undoFuncs.shift()(); - } - } - // scrollgrid widths - function freezeScrollgridWidths() { - var els = findElements(document.body, '.fc-scrollgrid'); - els.forEach(freezeScrollGridWidth); - return function () { return els.forEach(unfreezeScrollGridWidth); }; - } - function freezeScrollGridWidth(el) { - var elWidth = el.getBoundingClientRect().width; - // along with collapsibleWidth, this is a hack for #5707 - if (!el.classList.contains('fc-scrollgrid-collapsible') || elWidth < config.COLLAPSIBLE_WIDTH_THRESHOLD) { - el.style.width = elWidth + 'px'; - } - } - function unfreezeScrollGridWidth(el) { - el.style.width = ''; - } - // scrollers - // TODO: use scroll normalization!? yes - function queryScrollerEls() { - return findElements(document.body, '.fc-scroller-harness > .fc-scroller'); - } - function queryScrollerCoords(els) { - return els.map(function (el) { - var computedStyle = window.getComputedStyle(el); - return { - scrollLeft: el.scrollLeft, - scrollTop: el.scrollTop, - overflowX: computedStyle.overflowX, - overflowY: computedStyle.overflowY, - marginBottom: computedStyle.marginBottom, - }; - }); - } - function killHorizontalScrolling(els, coords) { - els.forEach(function (el, i) { - el.style.overflowX = 'visible'; // need to clear X/Y to get true overflow - el.style.overflowY = 'visible'; // " - el.style.marginBottom = ''; // for clipping away scrollbar. disable - el.style.left = -coords[i].scrollLeft + 'px'; // simulate scrollLeft! will be position:relative - }); - } - function restoreScrollerCoords(els, coords) { - els.forEach(function (el, i) { - var c = coords[i]; - el.style.overflowX = c.overflowX; - el.style.overflowY = c.overflowY; - el.style.marginBottom = c.marginBottom; - el.style.left = ''; - el.scrollLeft = c.scrollLeft; - el.scrollTop = c.scrollTop; - }); - } - - var MIN_AUTO_LABELS = 18; // more than `12` months but less that `24` hours - var MAX_AUTO_SLOTS_PER_LABEL = 6; // allows 6 10-min slots in an hour - var MAX_AUTO_CELLS = 200; // allows 4-days to have a :30 slot duration - config.MAX_TIMELINE_SLOTS = 1000; - // potential nice values for slot-duration and interval-duration - var STOCK_SUB_DURATIONS = [ - { years: 1 }, - { months: 1 }, - { days: 1 }, - { hours: 1 }, - { minutes: 30 }, - { minutes: 15 }, - { minutes: 10 }, - { minutes: 5 }, - { minutes: 1 }, - { seconds: 30 }, - { seconds: 15 }, - { seconds: 10 }, - { seconds: 5 }, - { seconds: 1 }, - { milliseconds: 500 }, - { milliseconds: 100 }, - { milliseconds: 10 }, - { milliseconds: 1 }, - ]; - function buildTimelineDateProfile(dateProfile, dateEnv, allOptions, dateProfileGenerator) { - var tDateProfile = { - labelInterval: allOptions.slotLabelInterval, - slotDuration: allOptions.slotDuration, - }; - validateLabelAndSlot(tDateProfile, dateProfile, dateEnv); // validate after computed grid duration - ensureLabelInterval(tDateProfile, dateProfile, dateEnv); - ensureSlotDuration(tDateProfile, dateProfile, dateEnv); - var input = allOptions.slotLabelFormat; - var rawFormats = Array.isArray(input) ? input : - (input != null) ? [input] : - computeHeaderFormats(tDateProfile, dateProfile, dateEnv, allOptions); - tDateProfile.headerFormats = rawFormats.map(function (rawFormat) { return createFormatter(rawFormat); }); - tDateProfile.isTimeScale = Boolean(tDateProfile.slotDuration.milliseconds); - var largeUnit = null; - if (!tDateProfile.isTimeScale) { - var slotUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit; - if (/year|month|week/.test(slotUnit)) { - largeUnit = slotUnit; - } - } - tDateProfile.largeUnit = largeUnit; - tDateProfile.emphasizeWeeks = - asCleanDays(tDateProfile.slotDuration) === 1 && - currentRangeAs('weeks', dateProfile, dateEnv) >= 2 && - !allOptions.businessHours; - /* - console.log('label interval =', timelineView.labelInterval.humanize()) - console.log('slot duration =', timelineView.slotDuration.humanize()) - console.log('header formats =', timelineView.headerFormats) - console.log('isTimeScale', timelineView.isTimeScale) - console.log('largeUnit', timelineView.largeUnit) - */ - var rawSnapDuration = allOptions.snapDuration; - var snapDuration; - var snapsPerSlot; - if (rawSnapDuration) { - snapDuration = createDuration(rawSnapDuration); - snapsPerSlot = wholeDivideDurations(tDateProfile.slotDuration, snapDuration); - // ^ TODO: warning if not whole? - } - if (snapsPerSlot == null) { - snapDuration = tDateProfile.slotDuration; - snapsPerSlot = 1; - } - tDateProfile.snapDuration = snapDuration; - tDateProfile.snapsPerSlot = snapsPerSlot; - // more... - var timeWindowMs = asRoughMs(dateProfile.slotMaxTime) - asRoughMs(dateProfile.slotMinTime); - // TODO: why not use normalizeRange!? - var normalizedStart = normalizeDate(dateProfile.renderRange.start, tDateProfile, dateEnv); - var normalizedEnd = normalizeDate(dateProfile.renderRange.end, tDateProfile, dateEnv); - // apply slotMinTime/slotMaxTime - // TODO: View should be responsible. - if (tDateProfile.isTimeScale) { - normalizedStart = dateEnv.add(normalizedStart, dateProfile.slotMinTime); - normalizedEnd = dateEnv.add(addDays(normalizedEnd, -1), dateProfile.slotMaxTime); - } - tDateProfile.timeWindowMs = timeWindowMs; - tDateProfile.normalizedRange = { start: normalizedStart, end: normalizedEnd }; - var slotDates = []; - var date = normalizedStart; - while (date < normalizedEnd) { - if (isValidDate(date, tDateProfile, dateProfile, dateProfileGenerator)) { - slotDates.push(date); - } - date = dateEnv.add(date, tDateProfile.slotDuration); - } - tDateProfile.slotDates = slotDates; - // more... - var snapIndex = -1; - var snapDiff = 0; // index of the diff :( - var snapDiffToIndex = []; - var snapIndexToDiff = []; - date = normalizedStart; - while (date < normalizedEnd) { - if (isValidDate(date, tDateProfile, dateProfile, dateProfileGenerator)) { - snapIndex += 1; - snapDiffToIndex.push(snapIndex); - snapIndexToDiff.push(snapDiff); - } - else { - snapDiffToIndex.push(snapIndex + 0.5); - } - date = dateEnv.add(date, tDateProfile.snapDuration); - snapDiff += 1; - } - tDateProfile.snapDiffToIndex = snapDiffToIndex; - tDateProfile.snapIndexToDiff = snapIndexToDiff; - tDateProfile.snapCnt = snapIndex + 1; // is always one behind - tDateProfile.slotCnt = tDateProfile.snapCnt / tDateProfile.snapsPerSlot; - // more... - tDateProfile.isWeekStarts = buildIsWeekStarts(tDateProfile, dateEnv); - tDateProfile.cellRows = buildCellRows(tDateProfile, dateEnv); - tDateProfile.slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration); - return tDateProfile; - } - /* - snaps to appropriate unit - */ - function normalizeDate(date, tDateProfile, dateEnv) { - var normalDate = date; - if (!tDateProfile.isTimeScale) { - normalDate = startOfDay(normalDate); - if (tDateProfile.largeUnit) { - normalDate = dateEnv.startOf(normalDate, tDateProfile.largeUnit); - } - } - return normalDate; - } - /* - snaps to appropriate unit - */ - function normalizeRange(range, tDateProfile, dateEnv) { - if (!tDateProfile.isTimeScale) { - range = computeVisibleDayRange(range); - if (tDateProfile.largeUnit) { - var dayRange = range; // preserve original result - range = { - start: dateEnv.startOf(range.start, tDateProfile.largeUnit), - end: dateEnv.startOf(range.end, tDateProfile.largeUnit), - }; - // if date is partially through the interval, or is in the same interval as the start, - // make the exclusive end be the *next* interval - if (range.end.valueOf() !== dayRange.end.valueOf() || range.end <= range.start) { - range = { - start: range.start, - end: dateEnv.add(range.end, tDateProfile.slotDuration), - }; - } - } - } - return range; - } - function isValidDate(date, tDateProfile, dateProfile, dateProfileGenerator) { - if (dateProfileGenerator.isHiddenDay(date)) { - return false; - } - if (tDateProfile.isTimeScale) { - // determine if the time is within slotMinTime/slotMaxTime, which may have wacky values - var day = startOfDay(date); - var timeMs = date.valueOf() - day.valueOf(); - var ms = timeMs - asRoughMs(dateProfile.slotMinTime); // milliseconds since slotMinTime - ms = ((ms % 86400000) + 86400000) % 86400000; // make negative values wrap to 24hr clock - return ms < tDateProfile.timeWindowMs; // before the slotMaxTime? - } - return true; - } - function validateLabelAndSlot(tDateProfile, dateProfile, dateEnv) { - var currentRange = dateProfile.currentRange; - // make sure labelInterval doesn't exceed the max number of cells - if (tDateProfile.labelInterval) { - var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.labelInterval); - if (labelCnt > config.MAX_TIMELINE_SLOTS) { - console.warn('slotLabelInterval results in too many cells'); - tDateProfile.labelInterval = null; - } - } - // make sure slotDuration doesn't exceed the maximum number of cells - if (tDateProfile.slotDuration) { - var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.slotDuration); - if (slotCnt > config.MAX_TIMELINE_SLOTS) { - console.warn('slotDuration results in too many cells'); - tDateProfile.slotDuration = null; - } - } - // make sure labelInterval is a multiple of slotDuration - if (tDateProfile.labelInterval && tDateProfile.slotDuration) { - var slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration); - if (slotsPerLabel === null || slotsPerLabel < 1) { - console.warn('slotLabelInterval must be a multiple of slotDuration'); - tDateProfile.slotDuration = null; - } - } - } - function ensureLabelInterval(tDateProfile, dateProfile, dateEnv) { - var currentRange = dateProfile.currentRange; - var labelInterval = tDateProfile.labelInterval; - if (!labelInterval) { - // compute based off the slot duration - // find the largest label interval with an acceptable slots-per-label - var input = void 0; - if (tDateProfile.slotDuration) { - for (var _i = 0, STOCK_SUB_DURATIONS_1 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_1.length; _i++) { - input = STOCK_SUB_DURATIONS_1[_i]; - var tryLabelInterval = createDuration(input); - var slotsPerLabel = wholeDivideDurations(tryLabelInterval, tDateProfile.slotDuration); - if (slotsPerLabel !== null && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) { - labelInterval = tryLabelInterval; - break; - } - } - // use the slot duration as a last resort - if (!labelInterval) { - labelInterval = tDateProfile.slotDuration; - } - // compute based off the view's duration - // find the largest label interval that yields the minimum number of labels - } - else { - for (var _a = 0, STOCK_SUB_DURATIONS_2 = STOCK_SUB_DURATIONS; _a < STOCK_SUB_DURATIONS_2.length; _a++) { - input = STOCK_SUB_DURATIONS_2[_a]; - labelInterval = createDuration(input); - var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, labelInterval); - if (labelCnt >= MIN_AUTO_LABELS) { - break; - } - } - } - tDateProfile.labelInterval = labelInterval; - } - return labelInterval; - } - function ensureSlotDuration(tDateProfile, dateProfile, dateEnv) { - var currentRange = dateProfile.currentRange; - var slotDuration = tDateProfile.slotDuration; - if (!slotDuration) { - var labelInterval = ensureLabelInterval(tDateProfile, dateProfile, dateEnv); // will compute if necessary - // compute based off the label interval - // find the largest slot duration that is different from labelInterval, but still acceptable - for (var _i = 0, STOCK_SUB_DURATIONS_3 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_3.length; _i++) { - var input = STOCK_SUB_DURATIONS_3[_i]; - var trySlotDuration = createDuration(input); - var slotsPerLabel = wholeDivideDurations(labelInterval, trySlotDuration); - if (slotsPerLabel !== null && slotsPerLabel > 1 && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) { - slotDuration = trySlotDuration; - break; - } - } - // only allow the value if it won't exceed the view's # of slots limit - if (slotDuration) { - var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, slotDuration); - if (slotCnt > MAX_AUTO_CELLS) { - slotDuration = null; - } - } - // use the label interval as a last resort - if (!slotDuration) { - slotDuration = labelInterval; - } - tDateProfile.slotDuration = slotDuration; - } - return slotDuration; - } - function computeHeaderFormats(tDateProfile, dateProfile, dateEnv, allOptions) { - var format1; - var format2; - var labelInterval = tDateProfile.labelInterval; - var unit = greatestDurationDenominator(labelInterval).unit; - var weekNumbersVisible = allOptions.weekNumbers; - var format0 = (format1 = (format2 = null)); - // NOTE: weekNumber computation function wont work - if ((unit === 'week') && !weekNumbersVisible) { - unit = 'day'; - } - switch (unit) { - case 'year': - format0 = { year: 'numeric' }; // '2015' - break; - case 'month': - if (currentRangeAs('years', dateProfile, dateEnv) > 1) { - format0 = { year: 'numeric' }; // '2015' - } - format1 = { month: 'short' }; // 'Jan' - break; - case 'week': - if (currentRangeAs('years', dateProfile, dateEnv) > 1) { - format0 = { year: 'numeric' }; // '2015' - } - format1 = { week: 'narrow' }; // 'Wk4' - break; - case 'day': - if (currentRangeAs('years', dateProfile, dateEnv) > 1) { - format0 = { year: 'numeric', month: 'long' }; // 'January 2014' - } - else if (currentRangeAs('months', dateProfile, dateEnv) > 1) { - format0 = { month: 'long' }; // 'January' - } - if (weekNumbersVisible) { - format1 = { week: 'short' }; // 'Wk 4' - } - format2 = { weekday: 'narrow', day: 'numeric' }; // 'Su 9' - break; - case 'hour': - if (weekNumbersVisible) { - format0 = { week: 'short' }; // 'Wk 4' - } - if (currentRangeAs('days', dateProfile, dateEnv) > 1) { - format1 = { weekday: 'short', day: 'numeric', month: 'numeric', omitCommas: true }; // Sat 4/7 - } - format2 = { - hour: 'numeric', - minute: '2-digit', - omitZeroMinute: true, - meridiem: 'short', - }; - break; - case 'minute': - // sufficiently large number of different minute cells? - if ((asRoughMinutes(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) { - format0 = { - hour: 'numeric', - meridiem: 'short', - }; - format1 = function (params) { return (':' + padStart(params.date.minute, 2) // ':30' - ); }; - } - else { - format0 = { - hour: 'numeric', - minute: 'numeric', - meridiem: 'short', - }; - } - break; - case 'second': - // sufficiently large number of different second cells? - if ((asRoughSeconds(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) { - format0 = { hour: 'numeric', minute: '2-digit', meridiem: 'lowercase' }; // '8:30 PM' - format1 = function (params) { return (':' + padStart(params.date.second, 2) // ':30' - ); }; - } - else { - format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM' - } - break; - case 'millisecond': - format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM' - format1 = function (params) { return ('.' + padStart(params.millisecond, 3)); }; - break; - } - return [].concat(format0 || [], format1 || [], format2 || []); - } - // Compute the number of the give units in the "current" range. - // Won't go more precise than days. - // Will return `0` if there's not a clean whole interval. - function currentRangeAs(unit, dateProfile, dateEnv) { - var range = dateProfile.currentRange; - var res = null; - if (unit === 'years') { - res = dateEnv.diffWholeYears(range.start, range.end); - } - else if (unit === 'months') { - res = dateEnv.diffWholeMonths(range.start, range.end); - } - else if (unit === 'weeks') { - res = dateEnv.diffWholeMonths(range.start, range.end); - } - else if (unit === 'days') { - res = diffWholeDays(range.start, range.end); - } - return res || 0; - } - function buildIsWeekStarts(tDateProfile, dateEnv) { - var slotDates = tDateProfile.slotDates, emphasizeWeeks = tDateProfile.emphasizeWeeks; - var prevWeekNumber = null; - var isWeekStarts = []; - for (var _i = 0, slotDates_1 = slotDates; _i < slotDates_1.length; _i++) { - var slotDate = slotDates_1[_i]; - var weekNumber = dateEnv.computeWeekNumber(slotDate); - var isWeekStart = emphasizeWeeks && (prevWeekNumber !== null) && (prevWeekNumber !== weekNumber); - prevWeekNumber = weekNumber; - isWeekStarts.push(isWeekStart); - } - return isWeekStarts; - } - function buildCellRows(tDateProfile, dateEnv) { - var slotDates = tDateProfile.slotDates; - var formats = tDateProfile.headerFormats; - var cellRows = formats.map(function () { return []; }); // indexed by row,col - var slotAsDays = asCleanDays(tDateProfile.slotDuration); - var guessedSlotUnit = slotAsDays === 7 ? 'week' : - slotAsDays === 1 ? 'day' : - null; - // specifically for navclicks - var rowUnitsFromFormats = formats.map(function (format) { return (format.getLargestUnit ? format.getLargestUnit() : null); }); - // builds cellRows and slotCells - for (var i = 0; i < slotDates.length; i += 1) { - var date = slotDates[i]; - var isWeekStart = tDateProfile.isWeekStarts[i]; - for (var row = 0; row < formats.length; row += 1) { - var format = formats[row]; - var rowCells = cellRows[row]; - var leadingCell = rowCells[rowCells.length - 1]; - var isLastRow = row === formats.length - 1; - var isSuperRow = formats.length > 1 && !isLastRow; // more than one row and not the last - var newCell = null; - var rowUnit = rowUnitsFromFormats[row] || (isLastRow ? guessedSlotUnit : null); - if (isSuperRow) { - var text = dateEnv.format(date, format); - if (!leadingCell || (leadingCell.text !== text)) { - newCell = buildCellObject(date, text, rowUnit); - } - else { - leadingCell.colspan += 1; - } - } - else if (!leadingCell || - isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval))) { - var text = dateEnv.format(date, format); - newCell = buildCellObject(date, text, rowUnit); - } - else { - leadingCell.colspan += 1; - } - if (newCell) { - newCell.weekStart = isWeekStart; - rowCells.push(newCell); - } - } - } - return cellRows; - } - function buildCellObject(date, text, rowUnit) { - return { date: date, text: text, rowUnit: rowUnit, colspan: 1, isWeekStart: false }; - } - - var TimelineHeaderThInner = /** @class */ (function (_super) { - __extends(TimelineHeaderThInner, _super); - function TimelineHeaderThInner() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineHeaderThInner.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - var navLinkAttrs = props.navLinkData - ? { 'data-navlink': props.navLinkData, tabIndex: 0 } - : {}; - return (createElement(ContentHook, { hookProps: props.hookProps, content: context.options.slotLabelContent, defaultContent: renderInnerContent$1 }, function (innerElRef, innerContent) { return (createElement("a", __assign({ ref: innerElRef, className: 'fc-timeline-slot-cushion fc-scrollgrid-sync-inner' + (props.isSticky ? ' fc-sticky' : '') }, navLinkAttrs), innerContent)); })); - }; - return TimelineHeaderThInner; - }(BaseComponent)); - function renderInnerContent$1(props) { - return props.text; - } - function refineHookProps$2(input) { - return { - level: input.level, - date: input.dateEnv.toDate(input.dateMarker), - view: input.viewApi, - text: input.text, - }; - } - - var TimelineHeaderTh = /** @class */ (function (_super) { - __extends(TimelineHeaderTh, _super); - function TimelineHeaderTh() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.refineHookProps = memoizeObjArg(refineHookProps$2); - _this.normalizeClassNames = buildClassNameNormalizer(); - return _this; - } - TimelineHeaderTh.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - var dateEnv = context.dateEnv, options = context.options; - var cell = props.cell, dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; - // the cell.rowUnit is f'd - // giving 'month' for a 3-day view - // workaround: to infer day, do NOT time - var dateMeta = getDateMeta(cell.date, props.todayRange, props.nowDate, dateProfile); - var classNames = ['fc-timeline-slot', 'fc-timeline-slot-label'].concat(cell.rowUnit === 'time' // TODO: so slot classnames for week/month/bigger. see note above about rowUnit - ? getSlotClassNames(dateMeta, context.theme) - : getDayClassNames(dateMeta, context.theme)); - if (cell.isWeekStart) { - classNames.push('fc-timeline-slot-em'); - } - var navLinkData = (options.navLinks && cell.rowUnit && cell.rowUnit !== 'time') - ? buildNavLinkData(cell.date, cell.rowUnit) - : null; - var hookProps = this.refineHookProps({ - level: props.rowLevel, - dateMarker: cell.date, - text: cell.text, - dateEnv: context.dateEnv, - viewApi: context.viewApi, - }); - var customClassNames = this.normalizeClassNames(options.slotLabelClassNames, hookProps); - return (createElement(MountHook, { hookProps: hookProps, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef) { return (createElement("th", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": dateEnv.formatIso(cell.date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }), colSpan: cell.colspan }, - createElement("div", { className: "fc-timeline-slot-frame", style: { height: props.rowInnerHeight } }, - createElement(TimelineHeaderThInner, { hookProps: hookProps, isSticky: props.isSticky, navLinkData: navLinkData })))); })); - }; - return TimelineHeaderTh; - }(BaseComponent)); - - var TimelineHeaderRows = /** @class */ (function (_super) { - __extends(TimelineHeaderRows, _super); - function TimelineHeaderRows() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineHeaderRows.prototype.render = function () { - var _a = this.props, dateProfile = _a.dateProfile, tDateProfile = _a.tDateProfile, rowInnerHeights = _a.rowInnerHeights, todayRange = _a.todayRange, nowDate = _a.nowDate; - var cellRows = tDateProfile.cellRows; - return (createElement(Fragment, null, cellRows.map(function (rowCells, rowLevel) { - var isLast = rowLevel === cellRows.length - 1; - var isChrono = tDateProfile.isTimeScale && isLast; // the final row, with times? - var classNames = [ - 'fc-timeline-header-row', - isChrono ? 'fc-timeline-header-row-chrono' : '', - ]; - return ( // eslint-disable-next-line react/no-array-index-key - createElement("tr", { key: rowLevel, className: classNames.join(' ') }, rowCells.map(function (cell) { return (createElement(TimelineHeaderTh, { key: cell.date.toISOString(), cell: cell, rowLevel: rowLevel, dateProfile: dateProfile, tDateProfile: tDateProfile, todayRange: todayRange, nowDate: nowDate, rowInnerHeight: rowInnerHeights && rowInnerHeights[rowLevel], isSticky: !isLast })); }))); - }))); - }; - return TimelineHeaderRows; - }(BaseComponent)); - - var TimelineCoords = /** @class */ (function () { - function TimelineCoords(slatRootEl, // okay to expose? - slatEls, dateProfile, tDateProfile, dateEnv, isRtl) { - this.slatRootEl = slatRootEl; - this.dateProfile = dateProfile; - this.tDateProfile = tDateProfile; - this.dateEnv = dateEnv; - this.isRtl = isRtl; - this.outerCoordCache = new PositionCache(slatRootEl, slatEls, true, // isHorizontal - false); - // for the inner divs within the slats - // used for event rendering and scrollTime, to disregard slat border - this.innerCoordCache = new PositionCache(slatRootEl, findDirectChildren(slatEls, 'div'), true, // isHorizontal - false); - } - TimelineCoords.prototype.isDateInRange = function (date) { - return rangeContainsMarker(this.dateProfile.currentRange, date); - }; - // results range from negative width of area to 0 - TimelineCoords.prototype.dateToCoord = function (date) { - var tDateProfile = this.tDateProfile; - var snapCoverage = this.computeDateSnapCoverage(date); - var slotCoverage = snapCoverage / tDateProfile.snapsPerSlot; - var slotIndex = Math.floor(slotCoverage); - slotIndex = Math.min(slotIndex, tDateProfile.slotCnt - 1); - var partial = slotCoverage - slotIndex; - var _a = this, innerCoordCache = _a.innerCoordCache, outerCoordCache = _a.outerCoordCache; - if (this.isRtl) { - return outerCoordCache.originClientRect.width - (outerCoordCache.rights[slotIndex] - - (innerCoordCache.getWidth(slotIndex) * partial)); - } - return (outerCoordCache.lefts[slotIndex] + - (innerCoordCache.getWidth(slotIndex) * partial)); - }; - TimelineCoords.prototype.rangeToCoords = function (range) { - return { - start: this.dateToCoord(range.start), - end: this.dateToCoord(range.end), - }; - }; - TimelineCoords.prototype.durationToCoord = function (duration) { - var _a = this, dateProfile = _a.dateProfile, tDateProfile = _a.tDateProfile, dateEnv = _a.dateEnv, isRtl = _a.isRtl; - var coord = 0; - if (dateProfile) { - var date = dateEnv.add(dateProfile.activeRange.start, duration); - if (!tDateProfile.isTimeScale) { - date = startOfDay(date); - } - coord = this.dateToCoord(date); - // hack to overcome the left borders of non-first slat - if (!isRtl && coord) { - coord += 1; - } - } - return coord; - }; - TimelineCoords.prototype.coordFromLeft = function (coord) { - if (this.isRtl) { - return this.outerCoordCache.originClientRect.width - coord; - } - return coord; - }; - // returned value is between 0 and the number of snaps - TimelineCoords.prototype.computeDateSnapCoverage = function (date) { - return computeDateSnapCoverage(date, this.tDateProfile, this.dateEnv); - }; - return TimelineCoords; - }()); - // returned value is between 0 and the number of snaps - function computeDateSnapCoverage(date, tDateProfile, dateEnv) { - var snapDiff = dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.snapDuration); - if (snapDiff < 0) { - return 0; - } - if (snapDiff >= tDateProfile.snapDiffToIndex.length) { - return tDateProfile.snapCnt; - } - var snapDiffInt = Math.floor(snapDiff); - var snapCoverage = tDateProfile.snapDiffToIndex[snapDiffInt]; - if (isInt(snapCoverage)) { // not an in-between value - snapCoverage += snapDiff - snapDiffInt; // add the remainder - } - else { - // a fractional value, meaning the date is not visible - // always round up in this case. works for start AND end dates in a range. - snapCoverage = Math.ceil(snapCoverage); - } - return snapCoverage; - } - function coordToCss(hcoord, isRtl) { - if (hcoord === null) { - return { left: '', right: '' }; - } - if (isRtl) { - return { right: hcoord, left: '' }; - } - return { left: hcoord, right: '' }; - } - function coordsToCss(hcoords, isRtl) { - if (!hcoords) { - return { left: '', right: '' }; - } - if (isRtl) { - return { right: hcoords.start, left: -hcoords.end }; - } - return { left: hcoords.start, right: -hcoords.end }; - } - - var TimelineHeader = /** @class */ (function (_super) { - __extends(TimelineHeader, _super); - function TimelineHeader() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.rootElRef = createRef(); - return _this; - } - TimelineHeader.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - // TODO: very repetitive - // TODO: make part of tDateProfile? - var timerUnit = greatestDurationDenominator(props.tDateProfile.slotDuration).unit; - // WORKAROUND: make ignore slatCoords when out of sync with dateProfile - var slatCoords = props.slatCoords && props.slatCoords.dateProfile === props.dateProfile ? props.slatCoords : null; - return (createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement("div", { className: "fc-timeline-header", ref: _this.rootElRef }, - createElement("table", { className: "fc-scrollgrid-sync-table", style: { minWidth: props.tableMinWidth, width: props.clientWidth } }, - props.tableColGroupNode, - createElement("tbody", null, - createElement(TimelineHeaderRows, { dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, rowInnerHeights: props.rowInnerHeights }))), - context.options.nowIndicator && ( - // need to have a container regardless of whether the current view has a visible now indicator - // because apparently removal of the element resets the scroll for some reasons (issue #5351). - // this issue doesn't happen for the timeline body however ( - createElement("div", { className: "fc-timeline-now-indicator-container" }, (slatCoords && slatCoords.isDateInRange(nowDate)) && (createElement(NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-arrow'].concat(classNames).join(' '), style: coordToCss(slatCoords.dateToCoord(nowDate), context.isRtl) }, innerContent)); })))))); })); - }; - TimelineHeader.prototype.componentDidMount = function () { - this.updateSize(); - }; - TimelineHeader.prototype.componentDidUpdate = function () { - this.updateSize(); - }; - TimelineHeader.prototype.updateSize = function () { - if (this.props.onMaxCushionWidth) { - this.props.onMaxCushionWidth(this.computeMaxCushionWidth()); - } - }; - TimelineHeader.prototype.computeMaxCushionWidth = function () { - return Math.max.apply(Math, findElements(this.rootElRef.current, '.fc-timeline-header-row:last-child .fc-timeline-slot-cushion').map(function (el) { return el.getBoundingClientRect().width; })); - }; - return TimelineHeader; - }(BaseComponent)); - - var TimelineSlatCell = /** @class */ (function (_super) { - __extends(TimelineSlatCell, _super); - function TimelineSlatCell() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineSlatCell.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - var dateEnv = context.dateEnv, options = context.options, theme = context.theme; - var date = props.date, tDateProfile = props.tDateProfile, isEm = props.isEm; - var dateMeta = getDateMeta(props.date, props.todayRange, props.nowDate, props.dateProfile); - var classNames = ['fc-timeline-slot', 'fc-timeline-slot-lane']; - var dataAttrs = { 'data-date': dateEnv.formatIso(date, { omitTimeZoneOffset: true, omitTime: !tDateProfile.isTimeScale }) }; - var hookProps = __assign(__assign({ date: dateEnv.toDate(props.date) }, dateMeta), { view: context.viewApi }); - if (isEm) { - classNames.push('fc-timeline-slot-em'); - } - if (tDateProfile.isTimeScale) { - classNames.push(isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, props.date, tDateProfile.labelInterval)) ? - 'fc-timeline-slot-major' : - 'fc-timeline-slot-minor'); - } - classNames.push.apply(classNames, (props.isDay - ? getDayClassNames(dateMeta, theme) - : getSlotClassNames(dateMeta, theme))); - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount, elRef: props.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' ') }, dataAttrs), - createElement("div", { ref: innerElRef }, innerContent))); })); - }; - return TimelineSlatCell; - }(BaseComponent)); - - var TimelineSlatsBody = /** @class */ (function (_super) { - __extends(TimelineSlatsBody, _super); - function TimelineSlatsBody() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineSlatsBody.prototype.render = function () { - var props = this.props; - var tDateProfile = props.tDateProfile, cellElRefs = props.cellElRefs; - var slotDates = tDateProfile.slotDates, isWeekStarts = tDateProfile.isWeekStarts; - var isDay = !tDateProfile.isTimeScale && !tDateProfile.largeUnit; - return (createElement("tbody", null, - createElement("tr", null, slotDates.map(function (slotDate, i) { - var key = slotDate.toISOString(); - return (createElement(TimelineSlatCell, { key: key, elRef: cellElRefs.createRef(key), date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay })); - })))); - }; - return TimelineSlatsBody; - }(BaseComponent)); - - var TimelineSlats = /** @class */ (function (_super) { - __extends(TimelineSlats, _super); - function TimelineSlats() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.rootElRef = createRef(); - _this.cellElRefs = new RefMap(); - _this.handleScrollRequest = function (request) { - var onScrollLeftRequest = _this.props.onScrollLeftRequest; - var coords = _this.coords; - if (onScrollLeftRequest && coords) { - if (request.time) { - var scrollLeft = coords.coordFromLeft(coords.durationToCoord(request.time)); - onScrollLeftRequest(scrollLeft); - } - return true; - } - return null; // best? - }; - return _this; - } - TimelineSlats.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - return (createElement("div", { className: "fc-timeline-slots", ref: this.rootElRef }, - createElement("table", { className: context.theme.getClass('table'), style: { - minWidth: props.tableMinWidth, - width: props.clientWidth, - } }, - props.tableColGroupNode, - createElement(TimelineSlatsBody, { cellElRefs: this.cellElRefs, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange })))); - }; - TimelineSlats.prototype.componentDidMount = function () { - this.updateSizing(); - this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); - }; - TimelineSlats.prototype.componentDidUpdate = function (prevProps) { - this.updateSizing(); - this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); - }; - TimelineSlats.prototype.componentWillUnmount = function () { - this.scrollResponder.detach(); - if (this.props.onCoords) { - this.props.onCoords(null); - } - }; - TimelineSlats.prototype.updateSizing = function () { - var _a = this, props = _a.props, context = _a.context; - if (props.clientWidth !== null && // is sizing stable? - this.scrollResponder - // ^it's possible to have clientWidth immediately after mount (when returning from print view), but w/o scrollResponder - ) { - var rootEl = this.rootElRef.current; - if (rootEl.offsetWidth) { // not hidden by css - this.coords = new TimelineCoords(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.tDateProfile.slotDates), props.dateProfile, props.tDateProfile, context.dateEnv, context.isRtl); - if (props.onCoords) { - props.onCoords(this.coords); - } - this.scrollResponder.update(false); // TODO: wouldn't have to do this if coords were in state - } - } - }; - TimelineSlats.prototype.positionToHit = function (leftPosition) { - var outerCoordCache = this.coords.outerCoordCache; - var _a = this.context, dateEnv = _a.dateEnv, isRtl = _a.isRtl; - var tDateProfile = this.props.tDateProfile; - var slatIndex = outerCoordCache.leftToIndex(leftPosition); - if (slatIndex != null) { - // somewhat similar to what TimeGrid does. consolidate? - var slatWidth = outerCoordCache.getWidth(slatIndex); - var partial = isRtl ? - (outerCoordCache.rights[slatIndex] - leftPosition) / slatWidth : - (leftPosition - outerCoordCache.lefts[slatIndex]) / slatWidth; - var localSnapIndex = Math.floor(partial * tDateProfile.snapsPerSlot); - var start = dateEnv.add(tDateProfile.slotDates[slatIndex], multiplyDuration(tDateProfile.snapDuration, localSnapIndex)); - var end = dateEnv.add(start, tDateProfile.snapDuration); - return { - dateSpan: { - range: { start: start, end: end }, - allDay: !this.props.tDateProfile.isTimeScale, - }, - dayEl: this.cellElRefs.currentMap[slatIndex], - left: outerCoordCache.lefts[slatIndex], - right: outerCoordCache.rights[slatIndex], - }; - } - return null; - }; - return TimelineSlats; - }(BaseComponent)); - function collectCellEls(elMap, slotDates) { - return slotDates.map(function (slotDate) { - var key = slotDate.toISOString(); - return elMap[key]; - }); - } - - function computeSegHCoords(segs, minWidth, timelineCoords) { - var hcoords = []; - if (timelineCoords) { - for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { - var seg = segs_1[_i]; - var res = timelineCoords.rangeToCoords(seg); - var start = Math.round(res.start); // for barely-overlapping collisions - var end = Math.round(res.end); // - if (end - start < minWidth) { - end = start + minWidth; - } - hcoords.push({ start: start, end: end }); - } - } - return hcoords; - } - function computeFgSegPlacements(segs, segHCoords, // might not have for every seg - eventInstanceHeights, // might not have for every seg - moreLinkHeights, // might not have for every more-link - strictOrder, maxStackCnt) { - var segInputs = []; - var crudePlacements = []; // when we don't know dims - for (var i = 0; i < segs.length; i += 1) { - var seg = segs[i]; - var instanceId = seg.eventRange.instance.instanceId; - var height = eventInstanceHeights[instanceId]; - var hcoords = segHCoords[i]; - if (height && hcoords) { - segInputs.push({ - index: i, - span: hcoords, - thickness: height, - }); - } - else { - crudePlacements.push({ - seg: seg, - hcoords: hcoords, - top: null, - }); - } - } - var hierarchy = new SegHierarchy(); - if (strictOrder != null) { - hierarchy.strictOrder = strictOrder; - } - if (maxStackCnt != null) { - hierarchy.maxStackCnt = maxStackCnt; - } - var hiddenEntries = hierarchy.addSegs(segInputs); - var hiddenPlacements = hiddenEntries.map(function (entry) { return ({ - seg: segs[entry.index], - hcoords: entry.span, - top: 0, - }); }); - var hiddenGroups = groupIntersectingEntries(hiddenEntries); - var moreLinkInputs = []; - var moreLinkCrudePlacements = []; - var extractSeg = function (entry) { return segs[entry.index]; }; - for (var i = 0; i < hiddenGroups.length; i += 1) { - var hiddenGroup = hiddenGroups[i]; - var sortedSegs = hiddenGroup.entries.map(extractSeg); - var height = moreLinkHeights[buildIsoString(computeEarliestSegStart(sortedSegs))]; // not optimal :( - if (height != null) { - // NOTE: the hiddenGroup's spanStart/spanEnd are already computed by rangeToCoords. computed during input. - moreLinkInputs.push({ - index: segs.length + i, - thickness: height, - span: hiddenGroup.span, - }); - } - else { - moreLinkCrudePlacements.push({ - seg: sortedSegs, - hcoords: hiddenGroup.span, - top: null, - }); - } - } - // add more-links into the hierarchy, but don't limit - hierarchy.maxStackCnt = -1; - hierarchy.addSegs(moreLinkInputs); - var visibleRects = hierarchy.toRects(); - var visiblePlacements = []; - var maxHeight = 0; - for (var _i = 0, visibleRects_1 = visibleRects; _i < visibleRects_1.length; _i++) { - var rect = visibleRects_1[_i]; - var segIndex = rect.index; - visiblePlacements.push({ - seg: segIndex < segs.length - ? segs[segIndex] // a real seg - : hiddenGroups[segIndex - segs.length].entries.map(extractSeg), - hcoords: rect.span, - top: rect.levelCoord, - }); - maxHeight = Math.max(maxHeight, rect.levelCoord + rect.thickness); - } - return [ - visiblePlacements.concat(crudePlacements, hiddenPlacements, moreLinkCrudePlacements), - maxHeight, - ]; - } - - var TimelineLaneBg = /** @class */ (function (_super) { - __extends(TimelineLaneBg, _super); - function TimelineLaneBg() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineLaneBg.prototype.render = function () { - var props = this.props; - var highlightSeg = [].concat(props.eventResizeSegs, props.dateSelectionSegs); - return props.timelineCoords && (createElement("div", { className: "fc-timeline-bg" }, - this.renderSegs(props.businessHourSegs || [], props.timelineCoords, 'non-business'), - this.renderSegs(props.bgEventSegs || [], props.timelineCoords, 'bg-event'), - this.renderSegs(highlightSeg, props.timelineCoords, 'highlight'))); - }; - TimelineLaneBg.prototype.renderSegs = function (segs, timelineCoords, fillType) { - var _a = this.props, todayRange = _a.todayRange, nowDate = _a.nowDate; - var isRtl = this.context.isRtl; - var segHCoords = computeSegHCoords(segs, 0, timelineCoords); - var children = segs.map(function (seg, i) { - var hcoords = segHCoords[i]; - var hStyle = coordsToCss(hcoords, isRtl); - return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timeline-bg-harness", style: hStyle }, fillType === 'bg-event' ? - createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, todayRange, nowDate))) : - renderFill(fillType))); - }); - return createElement(Fragment, null, children); - }; - return TimelineLaneBg; - }(BaseComponent)); - - var TimelineLaneSlicer = /** @class */ (function (_super) { - __extends(TimelineLaneSlicer, _super); - function TimelineLaneSlicer() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineLaneSlicer.prototype.sliceRange = function (origRange, dateProfile, dateProfileGenerator, tDateProfile, dateEnv) { - var normalRange = normalizeRange(origRange, tDateProfile, dateEnv); - var segs = []; - // protect against when the span is entirely in an invalid date region - if (computeDateSnapCoverage(normalRange.start, tDateProfile, dateEnv) - < computeDateSnapCoverage(normalRange.end, tDateProfile, dateEnv)) { - // intersect the footprint's range with the grid's range - var slicedRange = intersectRanges(normalRange, tDateProfile.normalizedRange); - if (slicedRange) { - segs.push({ - start: slicedRange.start, - end: slicedRange.end, - isStart: slicedRange.start.valueOf() === normalRange.start.valueOf() - && isValidDate(slicedRange.start, tDateProfile, dateProfile, dateProfileGenerator), - isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf() - && isValidDate(addMs(slicedRange.end, -1), tDateProfile, dateProfile, dateProfileGenerator), - }); - } - } - return segs; - }; - return TimelineLaneSlicer; - }(Slicer)); - - var DEFAULT_TIME_FORMAT = createFormatter({ - hour: 'numeric', - minute: '2-digit', - omitZeroMinute: true, - meridiem: 'narrow', - }); - var TimelineEvent = /** @class */ (function (_super) { - __extends(TimelineEvent, _super); - function TimelineEvent() { - return _super !== null && _super.apply(this, arguments) || this; - } - TimelineEvent.prototype.render = function () { - var props = this.props; - return (createElement(StandardEvent, __assign({}, props, { extraClassNames: ['fc-timeline-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TIME_FORMAT, defaultDisplayEventTime: !props.isTimeScale }))); - }; - return TimelineEvent; - }(BaseComponent)); - - var TimelineLaneMoreLink = /** @class */ (function (_super) { - __extends(TimelineLaneMoreLink, _super); - function TimelineLaneMoreLink() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.rootElRef = createRef(); - return _this; - } - TimelineLaneMoreLink.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var hiddenSegs = props.hiddenSegs, elRef = props.elRef, placement = props.placement, resourceId = props.resourceId; - var top = placement.top, hcoords = placement.hcoords; - var isVisible = hcoords && top !== null; - var hStyle = coordsToCss(hcoords, context.isRtl); - var extraDateSpan = resourceId ? { resourceId: resourceId } : {}; - return (createElement(MoreLinkRoot, { allDayDate: null, moreCnt: hiddenSegs.length, allSegs: hiddenSegs, hiddenSegs: hiddenSegs, alignmentElRef: this.rootElRef, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: extraDateSpan, popoverContent: function () { return (createElement(Fragment, null, hiddenSegs.map(function (seg) { - var instanceId = seg.eventRange.instance.instanceId; - return (createElement("div", { key: instanceId, style: { visibility: props.isForcedInvisible[instanceId] ? 'hidden' : '' } }, - createElement(TimelineEvent, __assign({ isTimeScale: props.isTimeScale, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection }, getSegMeta(seg, props.todayRange, props.nowDate))))); - }))); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick) { return (createElement("a", { ref: function (el) { - setRef(rootElRef, el); // for MoreLinkRoot - setRef(elRef, el); // for props props - setRef(_this.rootElRef, el); // for this component - }, className: ['fc-timeline-more-link'].concat(classNames).join(' '), style: __assign({ visibility: isVisible ? '' : 'hidden', top: top || 0 }, hStyle), onClick: handleClick }, - createElement("div", { ref: innerElRef, className: "fc-timeline-more-link-inner fc-sticky" }, innerContent))); })); - }; - return TimelineLaneMoreLink; - }(BaseComponent)); - - var TimelineLane = /** @class */ (function (_super) { - __extends(TimelineLane, _super); - function TimelineLane() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.slicer = new TimelineLaneSlicer(); - _this.sortEventSegs = memoize(sortEventSegs); - _this.harnessElRefs = new RefMap(); - _this.moreElRefs = new RefMap(); - _this.innerElRef = createRef(); - // TODO: memoize event positioning - _this.state = { - eventInstanceHeights: {}, - moreLinkHeights: {}, - }; - return _this; - } - TimelineLane.prototype.render = function () { - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var options = context.options; - var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; - var slicedProps = this.slicer.sliceProps(props, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't have to pass in the rest of the args... - dateProfile, context.dateProfileGenerator, tDateProfile, context.dateEnv); - var mirrorSegs = (slicedProps.eventDrag ? slicedProps.eventDrag.segs : null) || - (slicedProps.eventResize ? slicedProps.eventResize.segs : null) || - []; - var fgSegs = this.sortEventSegs(slicedProps.fgEventSegs, options.eventOrder); - var fgSegHCoords = computeSegHCoords(fgSegs, options.eventMinWidth, props.timelineCoords); - var _b = computeFgSegPlacements(fgSegs, fgSegHCoords, state.eventInstanceHeights, state.moreLinkHeights, options.eventOrderStrict, options.eventMaxStack), fgPlacements = _b[0], fgHeight = _b[1]; - var isForcedInvisible = // TODO: more convenient - (slicedProps.eventDrag ? slicedProps.eventDrag.affectedInstances : null) || - (slicedProps.eventResize ? slicedProps.eventResize.affectedInstances : null) || - {}; - return (createElement(Fragment, null, - createElement(TimelineLaneBg, { businessHourSegs: slicedProps.businessHourSegs, bgEventSegs: slicedProps.bgEventSegs, timelineCoords: props.timelineCoords, eventResizeSegs: slicedProps.eventResize ? slicedProps.eventResize.segs : [] /* bad new empty array? */, dateSelectionSegs: slicedProps.dateSelectionSegs, nowDate: props.nowDate, todayRange: props.todayRange }), - createElement("div", { className: "fc-timeline-events fc-scrollgrid-sync-inner", ref: this.innerElRef, style: { height: fgHeight } }, - this.renderFgSegs(fgPlacements, isForcedInvisible, false, false, false), - this.renderFgSegs(buildMirrorPlacements(mirrorSegs, props.timelineCoords, fgPlacements), {}, Boolean(slicedProps.eventDrag), Boolean(slicedProps.eventResize), false)))); - }; - TimelineLane.prototype.componentDidMount = function () { - this.updateSize(); - }; - TimelineLane.prototype.componentDidUpdate = function (prevProps, prevState) { - if (prevProps.eventStore !== this.props.eventStore || // external thing changed? - prevProps.timelineCoords !== this.props.timelineCoords || // external thing changed? - prevState.moreLinkHeights !== this.state.moreLinkHeights // HACK. see addStateEquality - ) { - this.updateSize(); - } - }; - TimelineLane.prototype.updateSize = function () { - var _this = this; - var props = this.props; - var timelineCoords = props.timelineCoords; - if (props.onHeightChange) { - props.onHeightChange(this.innerElRef.current, false); - } - if (timelineCoords) { - this.setState({ - eventInstanceHeights: mapHash(this.harnessElRefs.currentMap, function (harnessEl) { return (Math.round(harnessEl.getBoundingClientRect().height)); }), - moreLinkHeights: mapHash(this.moreElRefs.currentMap, function (moreEl) { return (Math.round(moreEl.getBoundingClientRect().height)); }), - }, function () { - if (props.onHeightChange) { - props.onHeightChange(_this.innerElRef.current, true); - } - }); - } - }; - TimelineLane.prototype.renderFgSegs = function (segPlacements, isForcedInvisible, isDragging, isResizing, isDateSelecting) { - var _a = this, harnessElRefs = _a.harnessElRefs, moreElRefs = _a.moreElRefs, props = _a.props, context = _a.context; - var isMirror = isDragging || isResizing || isDateSelecting; - return (createElement(Fragment, null, segPlacements.map(function (segPlacement) { - var seg = segPlacement.seg, hcoords = segPlacement.hcoords, top = segPlacement.top; - if (Array.isArray(seg)) { // a more-link - var isoStr = buildIsoString(computeEarliestSegStart(seg)); - return (createElement(TimelineLaneMoreLink, { key: 'm:' + isoStr /* "m" for "more" */, elRef: moreElRefs.createRef(isoStr), hiddenSegs: seg, placement: segPlacement, dateProfile: props.dateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isTimeScale: props.tDateProfile.isTimeScale, eventSelection: props.eventSelection, resourceId: props.resourceId, isForcedInvisible: isForcedInvisible })); - } - var instanceId = seg.eventRange.instance.instanceId; - var isVisible = isMirror || Boolean(!isForcedInvisible[instanceId] && hcoords && top !== null); - var hStyle = coordsToCss(hcoords, context.isRtl); - return (createElement("div", { key: 'e:' + instanceId /* "e" for "event" */, ref: isMirror ? null : harnessElRefs.createRef(instanceId), className: "fc-timeline-event-harness", style: __assign({ visibility: isVisible ? '' : 'hidden', top: top || 0 }, hStyle) }, - createElement(TimelineEvent, __assign({ isTimeScale: props.tDateProfile.isTimeScale, seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === props.eventSelection /* TODO: bad for mirror? */ }, getSegMeta(seg, props.todayRange, props.nowDate))))); - }))); - }; - return TimelineLane; - }(BaseComponent)); - TimelineLane.addStateEquality({ - eventInstanceHeights: isPropsEqual, - moreLinkHeights: isPropsEqual, - }); - function buildMirrorPlacements(mirrorSegs, timelineCoords, fgPlacements) { - if (!mirrorSegs.length || !timelineCoords) { - return []; - } - var topsByInstanceId = buildAbsoluteTopHash(fgPlacements); // TODO: cache this at first render? - return mirrorSegs.map(function (seg) { return ({ - seg: seg, - hcoords: timelineCoords.rangeToCoords(seg), - top: topsByInstanceId[seg.eventRange.instance.instanceId], - }); }); - } - function buildAbsoluteTopHash(placements) { - var topsByInstanceId = {}; - for (var _i = 0, placements_1 = placements; _i < placements_1.length; _i++) { - var placement = placements_1[_i]; - var seg = placement.seg; - if (!Array.isArray(seg)) { // doesn't represent a more-link - topsByInstanceId[seg.eventRange.instance.instanceId] = placement.top; - } - } - return topsByInstanceId; - } - - var TimelineGrid = /** @class */ (function (_super) { - __extends(TimelineGrid, _super); - function TimelineGrid() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.slatsRef = createRef(); - _this.state = { - coords: null, - }; - _this.handeEl = function (el) { - if (el) { - _this.context.registerInteractiveComponent(_this, { el: el }); - } - else { - _this.context.unregisterInteractiveComponent(_this); - } - }; - _this.handleCoords = function (coords) { - _this.setState({ coords: coords }); - if (_this.props.onSlatCoords) { - _this.props.onSlatCoords(coords); - } - }; - return _this; - } - TimelineGrid.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var options = context.options; - var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; - var timerUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit; - return (createElement("div", { className: "fc-timeline-body", ref: this.handeEl, style: { - minWidth: props.tableMinWidth, - height: props.clientHeight, - width: props.clientWidth, - } }, - createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement(Fragment, null, - createElement(TimelineSlats, { ref: _this.slatsRef, dateProfile: dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, clientWidth: props.clientWidth, tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, onCoords: _this.handleCoords, onScrollLeftRequest: props.onScrollLeftRequest }), - createElement(TimelineLane, { dateProfile: dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, nextDayThreshold: options.nextDayThreshold, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, timelineCoords: state.coords }), - (options.nowIndicator && state.coords && state.coords.isDateInRange(nowDate)) && (createElement("div", { className: "fc-timeline-now-indicator-container" }, - createElement(NowIndicatorRoot, { isAxis: false, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-line'].concat(classNames).join(' '), style: coordToCss(state.coords.dateToCoord(nowDate), context.isRtl) }, innerContent)); }))))); }))); - }; - // Hit System - // ------------------------------------------------------------------------------------------ - TimelineGrid.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { - var slats = this.slatsRef.current; - var slatHit = slats.positionToHit(positionLeft); - if (slatHit) { - return { - dateProfile: this.props.dateProfile, - dateSpan: slatHit.dateSpan, - rect: { - left: slatHit.left, - right: slatHit.right, - top: 0, - bottom: elHeight, - }, - dayEl: slatHit.dayEl, - layer: 0, - }; - } - return null; - }; - return TimelineGrid; - }(DateComponent)); - - var TimelineView = /** @class */ (function (_super) { - __extends(TimelineView, _super); - function TimelineView() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.buildTimelineDateProfile = memoize(buildTimelineDateProfile); - _this.scrollGridRef = createRef(); - _this.state = { - slatCoords: null, - slotCushionMaxWidth: null, - }; - _this.handleSlatCoords = function (slatCoords) { - _this.setState({ slatCoords: slatCoords }); - }; - _this.handleScrollLeftRequest = function (scrollLeft) { - var scrollGrid = _this.scrollGridRef.current; - scrollGrid.forceScrollLeft(0, scrollLeft); - }; - _this.handleMaxCushionWidth = function (slotCushionMaxWidth) { - _this.setState({ - slotCushionMaxWidth: Math.ceil(slotCushionMaxWidth), // for less rerendering TODO: DRY - }); - }; - return _this; - } - TimelineView.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var options = context.options; - var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(options); - var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options); - var tDateProfile = this.buildTimelineDateProfile(props.dateProfile, context.dateEnv, options, context.dateProfileGenerator); - var extraClassNames = [ - 'fc-timeline', - options.eventOverlap === false ? 'fc-timeline-overlap-disabled' : '', - ]; - var slotMinWidth = options.slotMinWidth; - var slatCols = buildSlatCols(tDateProfile, slotMinWidth || this.computeFallbackSlotMinWidth(tDateProfile)); - var sections = [ - { - type: 'header', - key: 'header', - isSticky: stickyHeaderDates, - chunks: [{ - key: 'timeline', - content: function (contentArg) { return (createElement(TimelineHeader, { dateProfile: props.dateProfile, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, tDateProfile: tDateProfile, slatCoords: state.slatCoords, onMaxCushionWidth: slotMinWidth ? null : _this.handleMaxCushionWidth })); }, - }], - }, - { - type: 'body', - key: 'body', - liquid: true, - chunks: [{ - key: 'timeline', - content: function (contentArg) { return (createElement(TimelineGrid, __assign({}, props, { clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, tDateProfile: tDateProfile, onSlatCoords: _this.handleSlatCoords, onScrollLeftRequest: _this.handleScrollLeftRequest }))); }, - }], - }, - ]; - if (stickyFooterScrollbar) { - sections.push({ - type: 'footer', - key: 'footer', - isSticky: true, - chunks: [{ - key: 'timeline', - content: renderScrollShim, - }], - }); - } - return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, - createElement(ScrollGrid, { ref: _this.scrollGridRef, liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ - { cols: slatCols }, - ], sections: sections }))); })); - }; - TimelineView.prototype.computeFallbackSlotMinWidth = function (tDateProfile) { - return Math.max(30, ((this.state.slotCushionMaxWidth || 0) / tDateProfile.slotsPerLabel)); - }; - return TimelineView; - }(DateComponent)); - function buildSlatCols(tDateProfile, slotMinWidth) { - return [{ - span: tDateProfile.slotCnt, - minWidth: slotMinWidth || 1, // needs to be a non-zero number to trigger horizontal scrollbars!?????? - }]; - } - - var timelinePlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - ], - initialView: 'timelineDay', - views: { - timeline: { - component: TimelineView, - usesMinMaxTime: true, - eventResizableFromStart: true, // how is this consumed for TimelineView tho? - }, - timelineDay: { - type: 'timeline', - duration: { days: 1 }, - }, - timelineWeek: { - type: 'timeline', - duration: { weeks: 1 }, - }, - timelineMonth: { - type: 'timeline', - duration: { months: 1 }, - }, - timelineYear: { - type: 'timeline', - duration: { years: 1 }, - }, - }, - }); - - function massageEventDragMutation(eventMutation, hit0, hit1) { - var resource0 = hit0.dateSpan.resourceId; - var resource1 = hit1.dateSpan.resourceId; - if (resource0 && resource1 && - resource0 !== resource1) { - eventMutation.resourceMutation = { - matchResourceId: resource0, - setResourceId: resource1, - }; - } - } - /* - TODO: all this would be much easier if we were using a hash! - */ - function applyEventDefMutation(eventDef, mutation, context) { - var resourceMutation = mutation.resourceMutation; - if (resourceMutation && computeResourceEditable(eventDef, context)) { - var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId); - if (index !== -1) { - var resourceIds = eventDef.resourceIds.slice(); // copy - resourceIds.splice(index, 1); // remove - if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there - resourceIds.push(resourceMutation.setResourceId); // add - } - eventDef.resourceIds = resourceIds; - } - } - } - /* - HACK - TODO: use EventUi system instead of this - */ - function computeResourceEditable(eventDef, context) { - var resourceEditable = eventDef.resourceEditable; - if (resourceEditable == null) { - var source = eventDef.sourceId && context.getCurrentData().eventSources[eventDef.sourceId]; - if (source) { - resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack - } - if (resourceEditable == null) { - resourceEditable = context.options.eventResourceEditable; - if (resourceEditable == null) { - resourceEditable = context.options.editable; // TODO: use defaults system instead - } - } - } - return resourceEditable; - } - function transformEventDrop(mutation, context) { - var resourceMutation = mutation.resourceMutation; - if (resourceMutation) { - var calendarApi = context.calendarApi; - return { - oldResource: calendarApi.getResourceById(resourceMutation.matchResourceId), - newResource: calendarApi.getResourceById(resourceMutation.setResourceId), - }; - } - return { - oldResource: null, - newResource: null, - }; - } - - var ResourceDataAdder = /** @class */ (function () { - function ResourceDataAdder() { - this.filterResources = memoize(filterResources); - } - ResourceDataAdder.prototype.transform = function (viewProps, calendarProps) { - if (calendarProps.viewSpec.optionDefaults.needsResourceData) { - return { - resourceStore: this.filterResources(calendarProps.resourceStore, calendarProps.options.filterResourcesWithEvents, calendarProps.eventStore, calendarProps.dateProfile.activeRange), - resourceEntityExpansions: calendarProps.resourceEntityExpansions, - }; - } - return null; - }; - return ResourceDataAdder; - }()); - function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) { - if (doFilterResourcesWithEvents) { - var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange); - var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs); - __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore)); - return filterHash(resourceStore, function (resource, resourceId) { return hasEvents_1[resourceId]; }); - } - return resourceStore; - } - function filterEventInstancesInRange(eventInstances, activeRange) { - return filterHash(eventInstances, function (eventInstance) { return rangesIntersect(eventInstance.range, activeRange); }); - } - function computeHasEvents(eventInstances, eventDefs) { - var hasEvents = {}; - for (var instanceId in eventInstances) { - var instance = eventInstances[instanceId]; - for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) { - var resourceId = _a[_i]; - hasEvents[resourceId] = true; - } - } - return hasEvents; - } - /* - mark resources as having events if any of their ancestors have them - NOTE: resourceStore might not have all the resources that hasEvents{} has keyed - */ - function computeAncestorHasEvents(hasEvents, resourceStore) { - var res = {}; - for (var resourceId in hasEvents) { - var resource = void 0; - while ((resource = resourceStore[resourceId])) { - resourceId = resource.parentId; // now functioning as the parentId - if (resourceId) { - res[resourceId] = true; - } - else { - break; - } - } - } - return res; - } - /* - for making sure events that have editable resources are always draggable in resource views - */ - function transformIsDraggable(val, eventDef, eventUi, context) { - if (!val) { - var state = context.getCurrentData(); - var viewSpec = state.viewSpecs[state.currentViewType]; - if (viewSpec.optionDefaults.needsResourceData) { - if (computeResourceEditable(eventDef, context)) { - return true; - } - } - } - return val; - } - - // for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data) - var ResourceEventConfigAdder = /** @class */ (function () { - function ResourceEventConfigAdder() { - this.buildResourceEventUis = memoize(buildResourceEventUis, isPropsEqual); - this.injectResourceEventUis = memoize(injectResourceEventUis); - } - ResourceEventConfigAdder.prototype.transform = function (viewProps, calendarProps) { - if (!calendarProps.viewSpec.optionDefaults.needsResourceData) { - return { - eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore)), - }; - } - return null; - }; - return ResourceEventConfigAdder; - }()); - function buildResourceEventUis(resourceStore) { - return mapHash(resourceStore, function (resource) { return resource.ui; }); - } - function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) { - return mapHash(eventUiBases, function (eventUi, defId) { - if (defId) { // not the '' key - return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis); - } - return eventUi; - }); - } - function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) { - var parts = []; - // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts - for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) { - var resourceId = _a[_i]; - if (resourceEventUis[resourceId]) { - parts.unshift(resourceEventUis[resourceId]); - } - } - parts.unshift(origEventUi); - return combineEventUis(parts); - } - - var defs = []; // TODO: use plugin system - function registerResourceSourceDef(def) { - defs.push(def); - } - function getResourceSourceDef(id) { - return defs[id]; - } - function getResourceSourceDefs() { - return defs; - } - - // TODO: make this a plugin-able parser - // TODO: success/failure - var RESOURCE_SOURCE_REFINERS = { - id: String, - // for array. TODO: move to resource-array - resources: identity, - // for json feed. TODO: move to resource-json-feed - url: String, - method: String, - startParam: String, - endParam: String, - timeZoneParam: String, - extraParams: identity, - }; - function parseResourceSource(input) { - var inputObj; - if (typeof input === 'string') { - inputObj = { url: input }; - } - else if (typeof input === 'function' || Array.isArray(input)) { - inputObj = { resources: input }; - } - else if (typeof input === 'object' && input) { // non-null object - inputObj = input; - } - if (inputObj) { - var _a = refineProps(inputObj, RESOURCE_SOURCE_REFINERS), refined = _a.refined, extra = _a.extra; - warnUnknownProps(extra); - var metaRes = buildResourceSourceMeta(refined); - if (metaRes) { - return { - _raw: input, - sourceId: guid(), - sourceDefId: metaRes.sourceDefId, - meta: metaRes.meta, - publicId: refined.id || '', - isFetching: false, - latestFetchId: '', - fetchRange: null, - }; - } - } - return null; - } - function buildResourceSourceMeta(refined) { - var defs = getResourceSourceDefs(); - for (var i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence - var def = defs[i]; - var meta = def.parseMeta(refined); - if (meta) { - return { meta: meta, sourceDefId: i }; - } - } - return null; - } - function warnUnknownProps(props) { - for (var propName in props) { - console.warn("Unknown resource prop '" + propName + "'"); - } - } - - function reduceResourceSource(source, action, context) { - var options = context.options, dateProfile = context.dateProfile; - if (!source || !action) { - return createSource(options.initialResources || options.resources, dateProfile.activeRange, options.refetchResourcesOnNavigate, context); - } - switch (action.type) { - case 'RESET_RESOURCE_SOURCE': - return createSource(action.resourceSourceInput, dateProfile.activeRange, options.refetchResourcesOnNavigate, context); - case 'PREV': // TODO: how do we track all actions that affect dateProfile :( - case 'NEXT': - case 'CHANGE_DATE': - case 'CHANGE_VIEW_TYPE': - return handleRangeChange(source, dateProfile.activeRange, options.refetchResourcesOnNavigate, context); - case 'RECEIVE_RESOURCES': - case 'RECEIVE_RESOURCE_ERROR': - return receiveResponse(source, action.fetchId, action.fetchRange); - case 'REFETCH_RESOURCES': - return fetchSource(source, dateProfile.activeRange, context); - default: - return source; - } - } - function createSource(input, activeRange, refetchResourcesOnNavigate, context) { - if (input) { - var source = parseResourceSource(input); - source = fetchSource(source, refetchResourcesOnNavigate ? activeRange : null, context); - return source; - } - return null; - } - function handleRangeChange(source, activeRange, refetchResourcesOnNavigate, context) { - if (refetchResourcesOnNavigate && - !doesSourceIgnoreRange(source) && - (!source.fetchRange || !rangesEqual(source.fetchRange, activeRange))) { - return fetchSource(source, activeRange, context); - } - return source; - } - function doesSourceIgnoreRange(source) { - return Boolean(getResourceSourceDef(source.sourceDefId).ignoreRange); - } - function fetchSource(source, fetchRange, context) { - var sourceDef = getResourceSourceDef(source.sourceDefId); - var fetchId = guid(); - sourceDef.fetch({ - resourceSource: source, - range: fetchRange, - context: context, - }, function (res) { - context.dispatch({ - type: 'RECEIVE_RESOURCES', - fetchId: fetchId, - fetchRange: fetchRange, - rawResources: res.rawResources, - }); - }, function (error) { - context.dispatch({ - type: 'RECEIVE_RESOURCE_ERROR', - fetchId: fetchId, - fetchRange: fetchRange, - error: error, - }); - }); - return __assign(__assign({}, source), { isFetching: true, latestFetchId: fetchId }); - } - function receiveResponse(source, fetchId, fetchRange) { - if (fetchId === source.latestFetchId) { - return __assign(__assign({}, source), { isFetching: false, fetchRange: fetchRange }); - } - return source; - } - - var PRIVATE_ID_PREFIX = '_fc:'; - var RESOURCE_REFINERS = { - id: String, - parentId: String, - children: identity, - title: String, - businessHours: identity, - extendedProps: identity, - // event-ui - eventEditable: Boolean, - eventStartEditable: Boolean, - eventDurationEditable: Boolean, - eventConstraint: identity, - eventOverlap: Boolean, - eventAllow: identity, - eventClassNames: parseClassNames, - eventBackgroundColor: String, - eventBorderColor: String, - eventTextColor: String, - eventColor: String, - }; - /* - needs a full store so that it can populate children too - */ - function parseResource(raw, parentId, store, context) { - if (parentId === void 0) { parentId = ''; } - var _a = refineProps(raw, RESOURCE_REFINERS), refined = _a.refined, extra = _a.extra; - var resource = { - id: refined.id || (PRIVATE_ID_PREFIX + guid()), - parentId: refined.parentId || parentId, - title: refined.title || '', - businessHours: refined.businessHours ? parseBusinessHours(refined.businessHours, context) : null, - ui: createEventUi({ - editable: refined.eventEditable, - startEditable: refined.eventStartEditable, - durationEditable: refined.eventDurationEditable, - constraint: refined.eventConstraint, - overlap: refined.eventOverlap, - allow: refined.eventAllow, - classNames: refined.eventClassNames, - backgroundColor: refined.eventBackgroundColor, - borderColor: refined.eventBorderColor, - textColor: refined.eventTextColor, - color: refined.eventColor, - }, context), - extendedProps: __assign(__assign({}, extra), refined.extendedProps), - }; - // help out ResourceApi from having user modify props - Object.freeze(resource.ui.classNames); - Object.freeze(resource.extendedProps); - if (store[resource.id]) ; - else { - store[resource.id] = resource; - if (refined.children) { - for (var _i = 0, _b = refined.children; _i < _b.length; _i++) { - var childInput = _b[_i]; - parseResource(childInput, resource.id, store, context); - } - } - } - return resource; - } - /* - TODO: use this in more places - */ - function getPublicId(id) { - if (id.indexOf(PRIVATE_ID_PREFIX) === 0) { - return ''; - } - return id; - } - - function reduceResourceStore(store, action, source, context) { - if (!store || !action) { - return {}; - } - switch (action.type) { - case 'RECEIVE_RESOURCES': - return receiveRawResources(store, action.rawResources, action.fetchId, source, context); - case 'ADD_RESOURCE': - return addResource(store, action.resourceHash); - case 'REMOVE_RESOURCE': - return removeResource(store, action.resourceId); - case 'SET_RESOURCE_PROP': - return setResourceProp(store, action.resourceId, action.propName, action.propValue); - case 'SET_RESOURCE_EXTENDED_PROP': - return setResourceExtendedProp(store, action.resourceId, action.propName, action.propValue); - default: - return store; - } - } - function receiveRawResources(existingStore, inputs, fetchId, source, context) { - if (source.latestFetchId === fetchId) { - var nextStore = {}; - for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { - var input = inputs_1[_i]; - parseResource(input, '', nextStore, context); - } - return nextStore; - } - return existingStore; - } - function addResource(existingStore, additions) { - // TODO: warn about duplicate IDs - return __assign(__assign({}, existingStore), additions); - } - function removeResource(existingStore, resourceId) { - var newStore = __assign({}, existingStore); - delete newStore[resourceId]; - // promote children - for (var childResourceId in newStore) { // a child, *maybe* but probably not - if (newStore[childResourceId].parentId === resourceId) { - newStore[childResourceId] = __assign(__assign({}, newStore[childResourceId]), { parentId: '' }); - } - } - return newStore; - } - function setResourceProp(existingStore, resourceId, name, value) { - var _a, _b; - var existingResource = existingStore[resourceId]; - // TODO: sanitization - if (existingResource) { - return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), (_b = {}, _b[name] = value, _b)), _a)); - } - return existingStore; - } - function setResourceExtendedProp(existingStore, resourceId, name, value) { - var _a, _b; - var existingResource = existingStore[resourceId]; - if (existingResource) { - return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), { extendedProps: __assign(__assign({}, existingResource.extendedProps), (_b = {}, _b[name] = value, _b)) }), _a)); - } - return existingStore; - } - - function reduceResourceEntityExpansions(expansions, action) { - var _a; - if (!expansions || !action) { - return {}; - } - switch (action.type) { - case 'SET_RESOURCE_ENTITY_EXPANDED': - return __assign(__assign({}, expansions), (_a = {}, _a[action.id] = action.isExpanded, _a)); - default: - return expansions; - } - } - - function reduceResources(state, action, context) { - var resourceSource = reduceResourceSource(state && state.resourceSource, action, context); - var resourceStore = reduceResourceStore(state && state.resourceStore, action, resourceSource, context); - var resourceEntityExpansions = reduceResourceEntityExpansions(state && state.resourceEntityExpansions, action); - return { - resourceSource: resourceSource, - resourceStore: resourceStore, - resourceEntityExpansions: resourceEntityExpansions, - }; - } - - var EVENT_REFINERS = { - resourceId: String, - resourceIds: identity, - resourceEditable: Boolean, - }; - function generateEventDefResourceMembers(refined) { - return { - resourceIds: ensureStringArray(refined.resourceIds) - .concat(refined.resourceId ? [refined.resourceId] : []), - resourceEditable: refined.resourceEditable, - }; - } - function ensureStringArray(items) { - return (items || []).map(function (item) { return String(item); }); - } - - function transformDateSelectionJoin(hit0, hit1) { - var resourceId0 = hit0.dateSpan.resourceId; - var resourceId1 = hit1.dateSpan.resourceId; - if (resourceId0 && resourceId1) { - return { resourceId: resourceId0 }; - } - return null; - } - - var ResourceApi = /** @class */ (function () { - function ResourceApi(_context, _resource) { - this._context = _context; - this._resource = _resource; - } - ResourceApi.prototype.setProp = function (name, value) { - var oldResource = this._resource; - this._context.dispatch({ - type: 'SET_RESOURCE_PROP', - resourceId: oldResource.id, - propName: name, - propValue: value, - }); - this.sync(oldResource); - }; - ResourceApi.prototype.setExtendedProp = function (name, value) { - var oldResource = this._resource; - this._context.dispatch({ - type: 'SET_RESOURCE_EXTENDED_PROP', - resourceId: oldResource.id, - propName: name, - propValue: value, - }); - this.sync(oldResource); - }; - ResourceApi.prototype.sync = function (oldResource) { - var context = this._context; - var resourceId = oldResource.id; - // TODO: what if dispatch didn't complete synchronously? - this._resource = context.getCurrentData().resourceStore[resourceId]; - context.emitter.trigger('resourceChange', { - oldResource: new ResourceApi(context, oldResource), - resource: this, - revert: function () { - var _a; - context.dispatch({ - type: 'ADD_RESOURCE', - resourceHash: (_a = {}, - _a[resourceId] = oldResource, - _a), - }); - }, - }); - }; - ResourceApi.prototype.remove = function () { - var context = this._context; - var internalResource = this._resource; - var resourceId = internalResource.id; - context.dispatch({ - type: 'REMOVE_RESOURCE', - resourceId: resourceId, - }); - context.emitter.trigger('resourceRemove', { - resource: this, - revert: function () { - var _a; - context.dispatch({ - type: 'ADD_RESOURCE', - resourceHash: (_a = {}, - _a[resourceId] = internalResource, - _a), - }); - }, - }); - }; - ResourceApi.prototype.getParent = function () { - var context = this._context; - var parentId = this._resource.parentId; - if (parentId) { - return new ResourceApi(context, context.getCurrentData().resourceSource[parentId]); - } - return null; - }; - ResourceApi.prototype.getChildren = function () { - var thisResourceId = this._resource.id; - var context = this._context; - var resourceStore = context.getCurrentData().resourceStore; - var childApis = []; - for (var resourceId in resourceStore) { - if (resourceStore[resourceId].parentId === thisResourceId) { - childApis.push(new ResourceApi(context, resourceStore[resourceId])); - } - } - return childApis; - }; - /* - this is really inefficient! - TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state - */ - ResourceApi.prototype.getEvents = function () { - var thisResourceId = this._resource.id; - var context = this._context; - var _a = context.getCurrentData().eventStore, defs = _a.defs, instances = _a.instances; - var eventApis = []; - for (var instanceId in instances) { - var instance = instances[instanceId]; - var def = defs[instance.defId]; - if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!! - eventApis.push(new EventApi(context, def, instance)); - } - } - return eventApis; - }; - Object.defineProperty(ResourceApi.prototype, "id", { - get: function () { return getPublicId(this._resource.id); }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "title", { - get: function () { return this._resource.title; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventConstraint", { - get: function () { return this._resource.ui.constraints[0] || null; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventOverlap", { - get: function () { return this._resource.ui.overlap; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventAllow", { - get: function () { return this._resource.ui.allows[0] || null; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", { - get: function () { return this._resource.ui.backgroundColor; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventBorderColor", { - get: function () { return this._resource.ui.borderColor; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventTextColor", { - get: function () { return this._resource.ui.textColor; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "eventClassNames", { - // NOTE: user can't modify these because Object.freeze was called in event-def parsing - get: function () { return this._resource.ui.classNames; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ResourceApi.prototype, "extendedProps", { - get: function () { return this._resource.extendedProps; }, - enumerable: false, - configurable: true - }); - ResourceApi.prototype.toPlainObject = function (settings) { - if (settings === void 0) { settings = {}; } - var internal = this._resource; - var ui = internal.ui; - var publicId = this.id; - var res = {}; - if (publicId) { - res.id = publicId; - } - if (internal.title) { - res.title = internal.title; - } - if (settings.collapseEventColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { - res.eventColor = ui.backgroundColor; - } - else { - if (ui.backgroundColor) { - res.eventBackgroundColor = ui.backgroundColor; - } - if (ui.borderColor) { - res.eventBorderColor = ui.borderColor; - } - } - if (ui.textColor) { - res.eventTextColor = ui.textColor; - } - if (ui.classNames.length) { - res.eventClassNames = ui.classNames; - } - if (Object.keys(internal.extendedProps).length) { - if (settings.collapseExtendedProps) { - __assign(res, internal.extendedProps); - } - else { - res.extendedProps = internal.extendedProps; - } - } - return res; - }; - ResourceApi.prototype.toJSON = function () { - return this.toPlainObject(); - }; - return ResourceApi; - }()); - function buildResourceApis(resourceStore, context) { - var resourceApis = []; - for (var resourceId in resourceStore) { - resourceApis.push(new ResourceApi(context, resourceStore[resourceId])); - } - return resourceApis; - } - - CalendarApi.prototype.addResource = function (input, scrollTo) { - var _a; - var _this = this; - if (scrollTo === void 0) { scrollTo = true; } - var currentState = this.getCurrentData(); - var resourceHash; - var resource; - if (input instanceof ResourceApi) { - resource = input._resource; - resourceHash = (_a = {}, _a[resource.id] = resource, _a); - } - else { - resourceHash = {}; - resource = parseResource(input, '', resourceHash, currentState); - } - this.dispatch({ - type: 'ADD_RESOURCE', - resourceHash: resourceHash, - }); - if (scrollTo) { - // TODO: wait til dispatch completes somehow - this.trigger('_scrollRequest', { resourceId: resource.id }); - } - var resourceApi = new ResourceApi(currentState, resource); - currentState.emitter.trigger('resourceAdd', { - resource: resourceApi, - revert: function () { - _this.dispatch({ - type: 'REMOVE_RESOURCE', - resourceId: resource.id, - }); - }, - }); - return resourceApi; - }; - CalendarApi.prototype.getResourceById = function (id) { - id = String(id); - var currentState = this.getCurrentData(); // eslint-disable-line react/no-this-in-sfc - if (currentState.resourceStore) { // guard against calendar with no resource functionality - var rawResource = currentState.resourceStore[id]; - if (rawResource) { - return new ResourceApi(currentState, rawResource); - } - } - return null; - }; - CalendarApi.prototype.getResources = function () { - var currentState = this.getCurrentData(); - var resourceStore = currentState.resourceStore; - var resourceApis = []; - if (resourceStore) { // guard against calendar with no resource functionality - for (var resourceId in resourceStore) { - resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId])); - } - } - return resourceApis; - }; - CalendarApi.prototype.getTopLevelResources = function () { - var currentState = this.getCurrentData(); - var resourceStore = currentState.resourceStore; - var resourceApis = []; - if (resourceStore) { // guard against calendar with no resource functionality - for (var resourceId in resourceStore) { - if (!resourceStore[resourceId].parentId) { - resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId])); - } - } - } - return resourceApis; - }; - CalendarApi.prototype.refetchResources = function () { - this.dispatch({ - type: 'REFETCH_RESOURCES', - }); - }; - function transformDatePoint(dateSpan, context) { - return dateSpan.resourceId ? - { resource: context.calendarApi.getResourceById(dateSpan.resourceId) } : - {}; - } - function transformDateSpan(dateSpan, context) { - return dateSpan.resourceId ? - { resource: context.calendarApi.getResourceById(dateSpan.resourceId) } : - {}; - } - - /* - splits things BASED OFF OF which resources they are associated with. - creates a '' entry which is when something has NO resource. - */ - var ResourceSplitter = /** @class */ (function (_super) { - __extends(ResourceSplitter, _super); - function ResourceSplitter() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceSplitter.prototype.getKeyInfo = function (props) { - return __assign({ '': {} }, props.resourceStore); - }; - ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) { - return [dateSpan.resourceId || '']; - }; - ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) { - var resourceIds = eventDef.resourceIds; - if (!resourceIds.length) { - return ['']; - } - return resourceIds; - }; - return ResourceSplitter; - }(Splitter)); - - function isPropsValidWithResources(combinedProps, context) { - var splitter = new ResourceSplitter(); - var sets = splitter.splitProps(__assign(__assign({}, combinedProps), { resourceStore: context.getCurrentData().resourceStore })); - for (var resourceId in sets) { - var props = sets[resourceId]; - // merge in event data from the non-resource segment - if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one - props = __assign(__assign({}, props), { eventStore: mergeEventStores(sets[''].eventStore, props.eventStore), eventUiBases: __assign(__assign({}, sets[''].eventUiBases), props.eventUiBases) }); - } - if (!isPropsValid(props, context, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) { - return false; - } - } - return true; - } - function filterConfig(resourceId, config) { - return __assign(__assign({}, config), { constraints: filterConstraints(resourceId, config.constraints) }); - } - function filterConstraints(resourceId, constraints) { - return constraints.map(function (constraint) { - var defs = constraint.defs; - if (defs) { // we are dealing with an EventStore - // if any of the events define constraints to resources that are NOT this resource, - // then this resource is unconditionally prohibited, which is what a `false` value does. - for (var defId in defs) { - var resourceIds = defs[defId].resourceIds; - if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too) - return false; - } - } - } - return constraint; - }); - } - - function transformExternalDef(dateSpan) { - return dateSpan.resourceId ? - { resourceId: dateSpan.resourceId } : - {}; - } - - EventApi.prototype.getResources = function () { - var calendarApi = this._context.calendarApi; - return this._def.resourceIds.map(function (resourceId) { return calendarApi.getResourceById(resourceId); }); - }; - EventApi.prototype.setResources = function (resources) { - var resourceIds = []; - // massage resources -> resourceIds - for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) { - var resource = resources_1[_i]; - var resourceId = null; - if (typeof resource === 'string') { - resourceId = resource; - } - else if (typeof resource === 'number') { - resourceId = String(resource); - } - else if (resource instanceof ResourceApi) { - resourceId = resource.id; // guaranteed to always have an ID. hmmm - } - else { - console.warn('unknown resource type: ' + resource); - } - if (resourceId) { - resourceIds.push(resourceId); - } - } - this.mutate({ - standardProps: { - resourceIds: resourceIds, - }, - }); - }; - - var optionChangeHandlers = { - resources: handleResources, - }; - function handleResources(newSourceInput, context) { - var oldSourceInput = context.getCurrentData().resourceSource._raw; - if (oldSourceInput !== newSourceInput) { - context.dispatch({ - type: 'RESET_RESOURCE_SOURCE', - resourceSourceInput: newSourceInput, - }); - } - } - - var DEFAULT_RESOURCE_ORDER = parseFieldSpecs('id,title'); - function handleResourceStore(resourceStore, calendarData) { - var emitter = calendarData.emitter; - if (emitter.hasHandlers('resourcesSet')) { - emitter.trigger('resourcesSet', buildResourceApis(resourceStore, calendarData)); - } - } - - var OPTION_REFINERS = { - initialResources: identity, - resources: identity, - eventResourceEditable: Boolean, - refetchResourcesOnNavigate: Boolean, - resourceOrder: parseFieldSpecs, - filterResourcesWithEvents: Boolean, - resourceGroupField: String, - resourceAreaWidth: identity, - resourceAreaColumns: identity, - resourcesInitiallyExpanded: Boolean, - datesAboveResources: Boolean, - needsResourceData: Boolean, - resourceAreaHeaderClassNames: identity, - resourceAreaHeaderContent: identity, - resourceAreaHeaderDidMount: identity, - resourceAreaHeaderWillUnmount: identity, - resourceGroupLabelClassNames: identity, - resourceGroupLabelContent: identity, - resourceGroupLabelDidMount: identity, - resourceGroupLabelWillUnmount: identity, - resourceLabelClassNames: identity, - resourceLabelContent: identity, - resourceLabelDidMount: identity, - resourceLabelWillUnmount: identity, - resourceLaneClassNames: identity, - resourceLaneContent: identity, - resourceLaneDidMount: identity, - resourceLaneWillUnmount: identity, - resourceGroupLaneClassNames: identity, - resourceGroupLaneContent: identity, - resourceGroupLaneDidMount: identity, - resourceGroupLaneWillUnmount: identity, - }; - var LISTENER_REFINERS = { - resourcesSet: identity, - resourceAdd: identity, - resourceChange: identity, - resourceRemove: identity, - }; - - registerResourceSourceDef({ - ignoreRange: true, - parseMeta: function (refined) { - if (Array.isArray(refined.resources)) { - return refined.resources; - } - return null; - }, - fetch: function (arg, successCallback) { - successCallback({ - rawResources: arg.resourceSource.meta, - }); - }, - }); - - registerResourceSourceDef({ - parseMeta: function (refined) { - if (typeof refined.resources === 'function') { - return refined.resources; - } - return null; - }, - fetch: function (arg, success, failure) { - var dateEnv = arg.context.dateEnv; - var func = arg.resourceSource.meta; - var publicArg = arg.range ? { - start: dateEnv.toDate(arg.range.start), - end: dateEnv.toDate(arg.range.end), - startStr: dateEnv.formatIso(arg.range.start), - endStr: dateEnv.formatIso(arg.range.end), - timeZone: dateEnv.timeZone, - } : {}; - // TODO: make more dry with EventSourceFunc - // TODO: accept a response? - unpromisify(func.bind(null, publicArg), function (rawResources) { - success({ rawResources: rawResources }); // needs an object response - }, failure); - }, - }); - - registerResourceSourceDef({ - parseMeta: function (refined) { - if (refined.url) { - return { - url: refined.url, - method: (refined.method || 'GET').toUpperCase(), - extraParams: refined.extraParams, - }; - } - return null; - }, - fetch: function (arg, successCallback, failureCallback) { - var meta = arg.resourceSource.meta; - var requestParams = buildRequestParams(meta, arg.range, arg.context); - requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) { - successCallback({ rawResources: rawResources, xhr: xhr }); - }, function (message, xhr) { - failureCallback({ message: message, xhr: xhr }); - }); - }, - }); - // TODO: somehow consolidate with event json feed - function buildRequestParams(meta, range, context) { - var dateEnv = context.dateEnv, options = context.options; - var startParam; - var endParam; - var timeZoneParam; - var customRequestParams; - var params = {}; - if (range) { - startParam = meta.startParam; - if (startParam == null) { - startParam = options.startParam; - } - endParam = meta.endParam; - if (endParam == null) { - endParam = options.endParam; - } - timeZoneParam = meta.timeZoneParam; - if (timeZoneParam == null) { - timeZoneParam = options.timeZoneParam; - } - params[startParam] = dateEnv.formatIso(range.start); - params[endParam] = dateEnv.formatIso(range.end); - if (dateEnv.timeZone !== 'local') { - params[timeZoneParam] = dateEnv.timeZone; - } - } - // retrieve any outbound GET/POST data from the options - if (typeof meta.extraParams === 'function') { - // supplied as a function that returns a key/value object - customRequestParams = meta.extraParams(); - } - else { - // probably supplied as a straight key/value object - customRequestParams = meta.extraParams || {}; - } - __assign(params, customRequestParams); - return params; - } - - // TODO: not used for Spreadsheet. START USING. difficult because of col-specific rendering props - function ResourceLabelRoot(props) { - return (createElement(ViewContextType.Consumer, null, function (context) { - var options = context.options; - var hookProps = { - resource: new ResourceApi(context, props.resource), - date: props.date ? context.dateEnv.toDate(props.date) : null, - view: context.viewApi, - }; - var dataAttrs = { - 'data-resource-id': props.resource.id, - 'data-date': props.date ? formatDayString(props.date) : undefined, - }; - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.resourceLabelClassNames, content: options.resourceLabelContent, defaultContent: renderInnerContent, didMount: options.resourceLabelDidMount, willUnmount: options.resourceLabelWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return props.children(rootElRef, classNames, // TODO: pass in 'fc-resource' ? - dataAttrs, innerElRef, innerContent); })); - })); - } - function renderInnerContent(props) { - return props.resource.title || props.resource.id; - } - - var ResourceCell = /** @class */ (function (_super) { - __extends(ResourceCell, _super); - function ResourceCell() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceCell.prototype.render = function () { - var props = this.props; - return (createElement(ResourceLabelRoot, { resource: props.resource, date: props.date }, function (elRef, customClassNames, dataAttrs, innerElRef, innerContent) { return (createElement("th", __assign({ ref: elRef, className: ['fc-col-header-cell', 'fc-resource'].concat(customClassNames).join(' '), colSpan: props.colSpan }, dataAttrs), - createElement("div", { className: "fc-scrollgrid-sync-inner" }, - createElement("span", { className: [ - 'fc-col-header-cell-cushion', - props.isSticky ? 'fc-sticky' : '', - ].join(' '), ref: innerElRef }, innerContent)))); })); - }; - return ResourceCell; - }(BaseComponent)); - - var ResourceDayHeader = /** @class */ (function (_super) { - __extends(ResourceDayHeader, _super); - function ResourceDayHeader() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.buildDateFormat = memoize(buildDateFormat); - return _this; - } - ResourceDayHeader.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var dateFormat = this.buildDateFormat(context.options.dayHeaderFormat, props.datesRepDistinctDays, props.dates.length); - return (createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { - if (props.dates.length === 1) { - return _this.renderResourceRow(props.resources, props.dates[0]); - } - if (context.options.datesAboveResources) { - return _this.renderDayAndResourceRows(props.dates, dateFormat, todayRange, props.resources); - } - return _this.renderResourceAndDayRows(props.resources, props.dates, dateFormat, todayRange); - })); - }; - ResourceDayHeader.prototype.renderResourceRow = function (resources, date) { - var resourceCells = resources.map(function (resource) { return (createElement(ResourceCell, { key: resource.id, resource: resource, colSpan: 1, date: date })); }); - return this.buildTr(resourceCells, 'resources'); - }; - ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, dateFormat, todayRange, resources) { - var dateCells = []; - var resourceCells = []; - for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) { - var date = dates_1[_i]; - dateCells.push(this.renderDateCell(date, dateFormat, todayRange, resources.length, null, true)); - for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) { - var resource = resources_1[_a]; - resourceCells.push(createElement(ResourceCell, { key: resource.id + ':' + date.toISOString(), resource: resource, colSpan: 1, date: date })); - } - } - return (createElement(Fragment, null, - this.buildTr(dateCells, 'day'), - this.buildTr(resourceCells, 'resources'))); - }; - ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates, dateFormat, todayRange) { - var resourceCells = []; - var dateCells = []; - for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) { - var resource = resources_2[_i]; - resourceCells.push(createElement(ResourceCell, { key: resource.id, resource: resource, colSpan: dates.length, isSticky: true })); - for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) { - var date = dates_2[_a]; - dateCells.push(this.renderDateCell(date, dateFormat, todayRange, 1, resource)); - } - } - return (createElement(Fragment, null, - this.buildTr(resourceCells, 'resources'), - this.buildTr(dateCells, 'day'))); - }; - // a cell with date text. might have a resource associated with it - ResourceDayHeader.prototype.renderDateCell = function (date, dateFormat, todayRange, colSpan, resource, isSticky) { - var props = this.props; - var keyPostfix = resource ? ":" + resource.id : ''; - var extraHookProps = resource ? { resource: new ResourceApi(this.context, resource) } : {}; - var extraDataAttrs = resource ? { 'data-resource-id': resource.id } : {}; - return props.datesRepDistinctDays ? (createElement(TableDateCell, { key: date.toISOString() + keyPostfix, date: date, dateProfile: props.dateProfile, todayRange: todayRange, colCnt: props.dates.length * props.resources.length, dayHeaderFormat: dateFormat, colSpan: colSpan, isSticky: isSticky, extraHookProps: extraHookProps, extraDataAttrs: extraDataAttrs })) : (createElement(TableDowCell // we can't leverage the pure-componentness becausae the extra* props are new every time :( - , { key: date.getUTCDay() + keyPostfix, dow: date.getUTCDay(), dayHeaderFormat: dateFormat, colSpan: colSpan, isSticky: isSticky, extraHookProps: extraHookProps, extraDataAttrs: extraDataAttrs })); - }; - ResourceDayHeader.prototype.buildTr = function (cells, key) { - var renderIntro = this.props.renderIntro; - if (!cells.length) { - cells = [createElement("td", { key: 0 }, "\u00A0")]; - } - return (createElement("tr", { key: key }, - renderIntro && renderIntro(key), - cells)); - }; - return ResourceDayHeader; - }(BaseComponent)); - function buildDateFormat(dayHeaderFormat, datesRepDistinctDays, dayCnt) { - return dayHeaderFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt); - } - - var ResourceIndex = /** @class */ (function () { - function ResourceIndex(resources) { - var indicesById = {}; - var ids = []; - for (var i = 0; i < resources.length; i += 1) { - var id = resources[i].id; - ids.push(id); - indicesById[id] = i; - } - this.ids = ids; - this.indicesById = indicesById; - this.length = resources.length; - } - return ResourceIndex; - }()); - - var AbstractResourceDayTableModel = /** @class */ (function () { - function AbstractResourceDayTableModel(dayTableModel, resources, context) { - this.dayTableModel = dayTableModel; - this.resources = resources; - this.context = context; - this.resourceIndex = new ResourceIndex(resources); - this.rowCnt = dayTableModel.rowCnt; - this.colCnt = dayTableModel.colCnt * resources.length; - this.cells = this.buildCells(); - } - AbstractResourceDayTableModel.prototype.buildCells = function () { - var _a = this, rowCnt = _a.rowCnt, dayTableModel = _a.dayTableModel, resources = _a.resources; - var rows = []; - for (var row = 0; row < rowCnt; row += 1) { - var rowCells = []; - for (var dateCol = 0; dateCol < dayTableModel.colCnt; dateCol += 1) { - for (var resourceCol = 0; resourceCol < resources.length; resourceCol += 1) { - var resource = resources[resourceCol]; - var extraHookProps = { resource: new ResourceApi(this.context, resource) }; - var extraDataAttrs = { 'data-resource-id': resource.id }; - var extraClassNames = ['fc-resource']; - var extraDateSpan = { resourceId: resource.id }; - var date = dayTableModel.cells[row][dateCol].date; - rowCells[this.computeCol(dateCol, resourceCol)] = { - key: resource.id + ':' + date.toISOString(), - date: date, - extraHookProps: extraHookProps, - extraDataAttrs: extraDataAttrs, - extraClassNames: extraClassNames, - extraDateSpan: extraDateSpan, - }; - } - } - rows.push(rowCells); - } - return rows; - }; - return AbstractResourceDayTableModel; - }()); - - /* - resources over dates - */ - var ResourceDayTableModel = /** @class */ (function (_super) { - __extends(ResourceDayTableModel, _super); - function ResourceDayTableModel() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceDayTableModel.prototype.computeCol = function (dateI, resourceI) { - return resourceI * this.dayTableModel.colCnt + dateI; - }; - /* - all date ranges are intact - */ - ResourceDayTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) { - return [ - { - firstCol: this.computeCol(dateStartI, resourceI), - lastCol: this.computeCol(dateEndI, resourceI), - isStart: true, - isEnd: true, - }, - ]; - }; - return ResourceDayTableModel; - }(AbstractResourceDayTableModel)); - - /* - dates over resources - */ - var DayResourceTableModel = /** @class */ (function (_super) { - __extends(DayResourceTableModel, _super); - function DayResourceTableModel() { - return _super !== null && _super.apply(this, arguments) || this; - } - DayResourceTableModel.prototype.computeCol = function (dateI, resourceI) { - return dateI * this.resources.length + resourceI; - }; - /* - every single day is broken up - */ - DayResourceTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) { - var segs = []; - for (var i = dateStartI; i <= dateEndI; i += 1) { - var col = this.computeCol(i, resourceI); - segs.push({ - firstCol: col, - lastCol: col, - isStart: i === dateStartI, - isEnd: i === dateEndI, - }); - } - return segs; - }; - return DayResourceTableModel; - }(AbstractResourceDayTableModel)); - - var NO_SEGS = []; // for memoizing - var VResourceJoiner = /** @class */ (function () { - function VResourceJoiner() { - this.joinDateSelection = memoize(this.joinSegs); - this.joinBusinessHours = memoize(this.joinSegs); - this.joinFgEvents = memoize(this.joinSegs); - this.joinBgEvents = memoize(this.joinSegs); - this.joinEventDrags = memoize(this.joinInteractions); - this.joinEventResizes = memoize(this.joinInteractions); - } - /* - propSets also has a '' key for things with no resource - */ - VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) { - var dateSelectionSets = []; - var businessHoursSets = []; - var fgEventSets = []; - var bgEventSets = []; - var eventDrags = []; - var eventResizes = []; - var eventSelection = ''; - var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key - for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { - var key = keys_1[_i]; - var props = propSets[key]; - dateSelectionSets.push(props.dateSelectionSegs); - businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours - fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs - bgEventSets.push(props.bgEventSegs); - eventDrags.push(props.eventDrag); - eventResizes.push(props.eventResize); - eventSelection = eventSelection || props.eventSelection; - } - return { - dateSelectionSegs: this.joinDateSelection.apply(this, __spreadArray([resourceDayTable], dateSelectionSets)), - businessHourSegs: this.joinBusinessHours.apply(this, __spreadArray([resourceDayTable], businessHoursSets)), - fgEventSegs: this.joinFgEvents.apply(this, __spreadArray([resourceDayTable], fgEventSets)), - bgEventSegs: this.joinBgEvents.apply(this, __spreadArray([resourceDayTable], bgEventSets)), - eventDrag: this.joinEventDrags.apply(this, __spreadArray([resourceDayTable], eventDrags)), - eventResize: this.joinEventResizes.apply(this, __spreadArray([resourceDayTable], eventResizes)), - eventSelection: eventSelection, - }; - }; - VResourceJoiner.prototype.joinSegs = function (resourceDayTable) { - var segGroups = []; - for (var _i = 1; _i < arguments.length; _i++) { - segGroups[_i - 1] = arguments[_i]; - } - var resourceCnt = resourceDayTable.resources.length; - var transformedSegs = []; - for (var i = 0; i < resourceCnt; i += 1) { - for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) { - var seg = _b[_a]; - transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); - } - for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource - var seg = _d[_c]; - transformedSegs.push.apply(// one beyond. the all-resource - transformedSegs, this.transformSeg(seg, resourceDayTable, i)); - } - } - return transformedSegs; - }; - /* - for expanding non-resource segs to all resources. - only for public use. - no memoizing. - */ - VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) { - var resourceCnt = resourceDayTable.resources.length; - var transformedSegs = []; - for (var i = 0; i < resourceCnt; i += 1) { - for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { - var seg = segs_1[_i]; - transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); - } - } - return transformedSegs; - }; - VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) { - var interactions = []; - for (var _i = 1; _i < arguments.length; _i++) { - interactions[_i - 1] = arguments[_i]; - } - var resourceCnt = resourceDayTable.resources.length; - var affectedInstances = {}; - var transformedSegs = []; - var anyInteractions = false; - var isEvent = false; - for (var i = 0; i < resourceCnt; i += 1) { - var interaction = interactions[i]; - if (interaction) { - anyInteractions = true; - for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) { - var seg = _b[_a]; - transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); - } - __assign(affectedInstances, interaction.affectedInstances); - isEvent = isEvent || interaction.isEvent; - } - if (interactions[resourceCnt]) { // one beyond. the all-resource - for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) { - var seg = _d[_c]; - transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i)); - } - } - } - if (anyInteractions) { - return { - affectedInstances: affectedInstances, - segs: transformedSegs, - isEvent: isEvent, - }; - } - return null; - }; - return VResourceJoiner; - }()); - - /* - TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter - */ - var VResourceSplitter = /** @class */ (function (_super) { - __extends(VResourceSplitter, _super); - function VResourceSplitter() { - return _super !== null && _super.apply(this, arguments) || this; - } - VResourceSplitter.prototype.getKeyInfo = function (props) { - var resourceDayTableModel = props.resourceDayTableModel; - var hash = mapHash(resourceDayTableModel.resourceIndex.indicesById, function (i) { return resourceDayTableModel.resources[i]; }); // :( - hash[''] = {}; - return hash; - }; - VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) { - return [dateSpan.resourceId || '']; - }; - VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) { - var resourceIds = eventDef.resourceIds; - if (!resourceIds.length) { - return ['']; - } - return resourceIds; - }; - return VResourceSplitter; - }(Splitter)); - - /* - doesn't accept grouping - */ - function flattenResources(resourceStore, orderSpecs) { - return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true) - .map(function (node) { return node.resource; }); - } - function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) { - var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs); - var flatNodes = []; - flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault); - return flatNodes; - } - function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) { - for (var i = 0; i < complexNodes.length; i += 1) { - var complexNode = complexNodes[i]; - var group = complexNode.group; - if (group) { - if (isVGrouping) { - var firstRowIndex = res.length; - var rowSpanIndex = rowSpans.length; - flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault); - if (firstRowIndex < res.length) { - var firstRow = res[firstRowIndex]; - var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice(); - firstRowSpans[rowSpanIndex] = res.length - firstRowIndex; - } - } - else { - var id = group.spec.field + ':' + group.value; - var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault; - res.push({ id: id, group: group, isExpanded: isExpanded }); - if (isExpanded) { - flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault); - } - } - } - else if (complexNode.resource) { - var id = complexNode.resource.id; - var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault; - res.push({ - id: id, - rowSpans: rowSpans, - depth: depth, - isExpanded: isExpanded, - hasChildren: Boolean(complexNode.children.length), - resource: complexNode.resource, - resourceFields: complexNode.resourceFields, - }); - if (isExpanded) { - flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault); - } - } - } - } - function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) { - var resourceNodes = buildResourceNodes(resourceStore, orderSpecs); - var builtNodes = []; - for (var resourceId in resourceNodes) { - var resourceNode = resourceNodes[resourceId]; - if (!resourceNode.resource.parentId) { - insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs); - } - } - return builtNodes; - } - function buildResourceNodes(resourceStore, orderSpecs) { - var nodeHash = {}; - for (var resourceId in resourceStore) { - var resource = resourceStore[resourceId]; - nodeHash[resourceId] = { - resource: resource, - resourceFields: buildResourceFields(resource), - children: [], - }; - } - for (var resourceId in resourceStore) { - var resource = resourceStore[resourceId]; - if (resource.parentId) { - var parentNode = nodeHash[resource.parentId]; - if (parentNode) { - insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs); - } - } - } - return nodeHash; - } - function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) { - if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) { - var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]); - insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs); - } - else { - insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs); - } - } - function ensureGroupNodes(resourceNode, nodes, groupSpec) { - var groupValue = resourceNode.resourceFields[groupSpec.field]; - var groupNode; - var newGroupIndex; - // find an existing group that matches, or determine the position for a new group - if (groupSpec.order) { - for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex += 1) { - var node = nodes[newGroupIndex]; - if (node.group) { - var cmp = flexibleCompare(groupValue, node.group.value) * groupSpec.order; - if (cmp === 0) { - groupNode = node; - break; - } - else if (cmp < 0) { - break; - } - } - } - } - else { // the groups are unordered - for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex += 1) { - var node = nodes[newGroupIndex]; - if (node.group && groupValue === node.group.value) { - groupNode = node; - break; - } - } - } - if (!groupNode) { - groupNode = { - group: { - value: groupValue, - spec: groupSpec, - }, - children: [], - }; - nodes.splice(newGroupIndex, 0, groupNode); - } - return groupNode; - } - function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) { - var i; - for (i = 0; i < siblings.length; i += 1) { - var cmp = compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs); // TODO: pass in ResourceApi? - if (cmp > 0) { // went 1 past. insert at i - break; - } - } - siblings.splice(i, 0, resourceNode); - } - function buildResourceFields(resource) { - var obj = __assign(__assign(__assign({}, resource.extendedProps), resource.ui), resource); - delete obj.ui; - delete obj.extendedProps; - return obj; - } - function isGroupsEqual(group0, group1) { - return group0.spec === group1.spec && group0.value === group1.value; - } - - var resourceCommonPlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - ], - reducers: [ - reduceResources, - ], - isLoadingFuncs: [ - function (state) { return state.resourceSource && state.resourceSource.isFetching; }, - ], - eventRefiners: EVENT_REFINERS, - eventDefMemberAdders: [generateEventDefResourceMembers], - isDraggableTransformers: [transformIsDraggable], - eventDragMutationMassagers: [massageEventDragMutation], - eventDefMutationAppliers: [applyEventDefMutation], - dateSelectionTransformers: [transformDateSelectionJoin], - datePointTransforms: [transformDatePoint], - dateSpanTransforms: [transformDateSpan], - viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder], - isPropsValid: isPropsValidWithResources, - externalDefTransforms: [transformExternalDef], - eventDropTransformers: [transformEventDrop], - optionChangeHandlers: optionChangeHandlers, - optionRefiners: OPTION_REFINERS, - listenerRefiners: LISTENER_REFINERS, - propSetHandlers: { resourceStore: handleResourceStore }, - }); - - var ResourceDayTableJoiner = /** @class */ (function (_super) { - __extends(ResourceDayTableJoiner, _super); - function ResourceDayTableJoiner() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceDayTableJoiner.prototype.transformSeg = function (seg, resourceDayTableModel, resourceI) { - var colRanges = resourceDayTableModel.computeColRanges(seg.firstCol, seg.lastCol, resourceI); - return colRanges.map(function (colRange) { return (__assign(__assign(__assign({}, seg), colRange), { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd })); }); - }; - return ResourceDayTableJoiner; - }(VResourceJoiner)); - - var ResourceDayTable = /** @class */ (function (_super) { - __extends(ResourceDayTable, _super); - function ResourceDayTable() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.splitter = new VResourceSplitter(); - _this.slicers = {}; - _this.joiner = new ResourceDayTableJoiner(); - _this.tableRef = createRef(); - _this.isHitComboAllowed = function (hit0, hit1) { - var allowAcrossResources = _this.props.resourceDayTableModel.dayTableModel.colCnt === 1; - return allowAcrossResources || hit0.dateSpan.resourceId === hit1.dateSpan.resourceId; - }; - return _this; - } - ResourceDayTable.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var resourceDayTableModel = props.resourceDayTableModel, nextDayThreshold = props.nextDayThreshold, dateProfile = props.dateProfile; - var splitProps = this.splitter.splitProps(props); - this.slicers = mapHash(splitProps, function (split, resourceId) { return _this.slicers[resourceId] || new DayTableSlicer(); }); - var slicedProps = mapHash(this.slicers, function (slicer, resourceId) { return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, context, resourceDayTableModel.dayTableModel); }); - return (createElement(Table, __assign({ forPrint: props.forPrint, ref: this.tableRef }, this.joiner.joinProps(slicedProps, resourceDayTableModel), { cells: resourceDayTableModel.cells, dateProfile: dateProfile, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, isHitComboAllowed: this.isHitComboAllowed }))); - }; - return ResourceDayTable; - }(DateComponent)); - - var ResourceDayTableView = /** @class */ (function (_super) { - __extends(ResourceDayTableView, _super); - function ResourceDayTableView() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.flattenResources = memoize(flattenResources); - _this.buildResourceDayTableModel = memoize(buildResourceDayTableModel); - _this.headerRef = createRef(); - _this.tableRef = createRef(); - return _this; - } - ResourceDayTableView.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var options = context.options; - var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER; - var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs); - var resourceDayTableModel = this.buildResourceDayTableModel(props.dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context); - var headerContent = options.dayHeaders && (createElement(ResourceDayHeader, { ref: this.headerRef, resources: resources, dateProfile: props.dateProfile, dates: resourceDayTableModel.dayTableModel.headerDates, datesRepDistinctDays: true })); - var bodyContent = function (contentArg) { return (createElement(ResourceDayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, resourceDayTableModel: resourceDayTableModel, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); }; - return options.dayMinWidth - ? this.renderHScrollLayout(headerContent, bodyContent, resourceDayTableModel.colCnt, options.dayMinWidth) - : this.renderSimpleLayout(headerContent, bodyContent); - }; - return ResourceDayTableView; - }(TableView)); - function buildResourceDayTableModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) { - var dayTable = buildDayTableModel(dateProfile, dateProfileGenerator); - return datesAboveResources ? - new DayResourceTableModel(dayTable, resources, context) : - new ResourceDayTableModel(dayTable, resources, context); - } - - var resourceDayGridPlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - resourceCommonPlugin, - dayGridPlugin, - ], - initialView: 'resourceDayGridDay', - views: { - resourceDayGrid: { - type: 'dayGrid', - component: ResourceDayTableView, - needsResourceData: true, - }, - resourceDayGridDay: { - type: 'resourceDayGrid', - duration: { days: 1 }, - }, - resourceDayGridWeek: { - type: 'resourceDayGrid', - duration: { weeks: 1 }, - }, - resourceDayGridMonth: { - type: 'resourceDayGrid', - duration: { months: 1 }, - // TODO: wish we didn't have to C&P from dayGrid's file - monthMode: true, - fixedWeekCount: true, - }, - }, - }); - - var ResourceDayTimeColsJoiner = /** @class */ (function (_super) { - __extends(ResourceDayTimeColsJoiner, _super); - function ResourceDayTimeColsJoiner() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceDayTimeColsJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) { - return [ - __assign(__assign({}, seg), { col: resourceDayTable.computeCol(seg.col, resourceI) }), - ]; - }; - return ResourceDayTimeColsJoiner; - }(VResourceJoiner)); - - var ResourceDayTimeCols = /** @class */ (function (_super) { - __extends(ResourceDayTimeCols, _super); - function ResourceDayTimeCols() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.buildDayRanges = memoize(buildDayRanges); - _this.splitter = new VResourceSplitter(); - _this.slicers = {}; - _this.joiner = new ResourceDayTimeColsJoiner(); - _this.timeColsRef = createRef(); - _this.isHitComboAllowed = function (hit0, hit1) { - var allowAcrossResources = _this.dayRanges.length === 1; - return allowAcrossResources || hit0.dateSpan.resourceId === hit1.dateSpan.resourceId; - }; - return _this; - } - ResourceDayTimeCols.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var dateEnv = context.dateEnv, options = context.options; - var dateProfile = props.dateProfile, resourceDayTableModel = props.resourceDayTableModel; - var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTableModel.dayTableModel, dateProfile, dateEnv); - var splitProps = this.splitter.splitProps(props); - this.slicers = mapHash(splitProps, function (split, resourceId) { return _this.slicers[resourceId] || new DayTimeColsSlicer(); }); - var slicedProps = mapHash(this.slicers, function (slicer, resourceId) { return slicer.sliceProps(splitProps[resourceId], dateProfile, null, context, dayRanges); }); - return ( // TODO: would move this further down hierarchy, but sliceNowDate needs it - createElement(NowTimer, { unit: options.nowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return (createElement(TimeCols, __assign({ ref: _this.timeColsRef }, _this.joiner.joinProps(slicedProps, resourceDayTableModel), { dateProfile: dateProfile, axis: props.axis, slotDuration: props.slotDuration, slatMetas: props.slatMetas, cells: resourceDayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: options.nowIndicator && _this.buildNowIndicatorSegs(nowDate), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, forPrint: props.forPrint, onSlatCoords: props.onSlatCoords, isHitComboAllowed: _this.isHitComboAllowed }))); })); - }; - ResourceDayTimeCols.prototype.buildNowIndicatorSegs = function (date) { - var nonResourceSegs = this.slicers[''].sliceNowDate(date, this.context, this.dayRanges); - return this.joiner.expandSegs(this.props.resourceDayTableModel, nonResourceSegs); - }; - return ResourceDayTimeCols; - }(DateComponent)); - - var ResourceDayTimeColsView = /** @class */ (function (_super) { - __extends(ResourceDayTimeColsView, _super); - function ResourceDayTimeColsView() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.flattenResources = memoize(flattenResources); - _this.buildResourceTimeColsModel = memoize(buildResourceTimeColsModel); - _this.buildSlatMetas = memoize(buildSlatMetas); - return _this; - } - ResourceDayTimeColsView.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var options = context.options, dateEnv = context.dateEnv; - var dateProfile = props.dateProfile; - var splitProps = this.allDaySplitter.splitProps(props); - var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER; - var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs); - var resourceDayTableModel = this.buildResourceTimeColsModel(dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context); - var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); - var dayMinWidth = options.dayMinWidth; - var hasAttachedAxis = !dayMinWidth; - var hasDetachedAxis = dayMinWidth; - var headerContent = options.dayHeaders && (createElement(ResourceDayHeader, { resources: resources, dates: resourceDayTableModel.dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null })); - var allDayContent = (options.allDaySlot !== false) && (function (contentArg) { return (createElement(ResourceDayTable, __assign({}, splitProps.allDay, { dateProfile: dateProfile, resourceDayTableModel: resourceDayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps()))); }); - var timeGridContent = function (contentArg) { return (createElement(ResourceDayTimeCols, __assign({}, splitProps.timed, { dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, resourceDayTableModel: resourceDayTableModel, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, forPrint: props.forPrint, onScrollTopRequest: _this.handleScrollTopRequest }))); }; - return hasDetachedAxis - ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, resourceDayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) - : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); - }; - return ResourceDayTimeColsView; - }(TimeColsView)); - function buildResourceTimeColsModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) { - var dayTable = buildTimeColsModel(dateProfile, dateProfileGenerator); - return datesAboveResources ? - new DayResourceTableModel(dayTable, resources, context) : - new ResourceDayTableModel(dayTable, resources, context); - } - - var resourceTimeGridPlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - resourceCommonPlugin, - timeGridPlugin, - ], - initialView: 'resourceTimeGridDay', - views: { - resourceTimeGrid: { - type: 'timeGrid', - component: ResourceDayTimeColsView, - needsResourceData: true, - }, - resourceTimeGridDay: { - type: 'resourceTimeGrid', - duration: { days: 1 }, - }, - resourceTimeGridWeek: { - type: 'resourceTimeGrid', - duration: { weeks: 1 }, - }, - }, - }); - - /* - Renders the DOM responsible for the subrow expander area, - as well as the space before it (used to align expanders of similar depths) - */ - function ExpanderIcon(_a) { - var depth = _a.depth, hasChildren = _a.hasChildren, isExpanded = _a.isExpanded, onExpanderClick = _a.onExpanderClick; - var nodes = []; - for (var i = 0; i < depth; i += 1) { - nodes.push(createElement("span", { className: "fc-icon" })); - } - var iconClassNames = ['fc-icon']; - if (hasChildren) { - if (isExpanded) { - iconClassNames.push('fc-icon-minus-square'); - } - else { - iconClassNames.push('fc-icon-plus-square'); - } - } - nodes.push(createElement("span", { className: 'fc-datagrid-expander' + (hasChildren ? '' : ' fc-datagrid-expander-placeholder'), onClick: onExpanderClick }, - createElement("span", { className: iconClassNames.join(' ') }))); - return createElement.apply(void 0, __spreadArray([Fragment, {}], nodes)); - } - - function refineHookProps$1(raw) { - return { - resource: new ResourceApi(raw.context, raw.resource), - fieldValue: raw.fieldValue, - view: raw.context.viewApi, - }; - } - - var SpreadsheetIndividualCellInner = /** @class */ (function (_super) { - __extends(SpreadsheetIndividualCellInner, _super); - function SpreadsheetIndividualCellInner() { - return _super !== null && _super.apply(this, arguments) || this; - } - SpreadsheetIndividualCellInner.prototype.render = function () { - var props = this.props; - return (createElement(ContentHook, { hookProps: props.hookProps, content: props.colSpec.cellContent, defaultContent: renderResourceInner }, function (innerElRef, innerContent) { return (createElement("span", { className: "fc-datagrid-cell-main", ref: innerElRef }, innerContent)); })); - }; - return SpreadsheetIndividualCellInner; - }(BaseComponent)); - function renderResourceInner(hookProps) { - return hookProps.fieldValue || createElement(Fragment, null, "\u00A0"); - } - - // worth making a PureComponent? (because of innerHeight) - var SpreadsheetIndividualCell = /** @class */ (function (_super) { - __extends(SpreadsheetIndividualCell, _super); - function SpreadsheetIndividualCell() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.refineHookProps = memoizeObjArg(refineHookProps$1); - _this.normalizeClassNames = buildClassNameNormalizer(); - _this.onExpanderClick = function (ev) { - var props = _this.props; - if (props.hasChildren) { - _this.context.dispatch({ - type: 'SET_RESOURCE_ENTITY_EXPANDED', - id: props.resource.id, - isExpanded: !props.isExpanded, - }); - } - }; - return _this; - } - SpreadsheetIndividualCell.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var colSpec = props.colSpec; - var hookProps = this.refineHookProps({ - resource: props.resource, - fieldValue: props.fieldValue, - context: context, - }); - var customClassNames = this.normalizeClassNames(colSpec.cellClassNames, hookProps); - return (createElement(MountHook, { hookProps: hookProps, didMount: colSpec.cellDidMount, willUnmount: colSpec.cellWillUnmount }, function (rootElRef) { return (createElement("td", { ref: rootElRef, "data-resource-id": props.resource.id, className: [ - 'fc-datagrid-cell', - 'fc-resource', - ].concat(customClassNames).join(' ') }, - createElement("div", { className: "fc-datagrid-cell-frame", style: { height: props.innerHeight } }, - createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner" }, - colSpec.isMain && (createElement(ExpanderIcon, { depth: props.depth, hasChildren: props.hasChildren, isExpanded: props.isExpanded, onExpanderClick: _this.onExpanderClick })), - createElement(SpreadsheetIndividualCellInner, { hookProps: hookProps, colSpec: colSpec }))))); })); - }; - return SpreadsheetIndividualCell; - }(BaseComponent)); - - // for VERTICAL cell grouping, in spreadsheet area - var SpreadsheetGroupCell = /** @class */ (function (_super) { - __extends(SpreadsheetGroupCell, _super); - function SpreadsheetGroupCell() { - return _super !== null && _super.apply(this, arguments) || this; - } - SpreadsheetGroupCell.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - var colSpec = props.colSpec; - var hookProps = { - groupValue: props.fieldValue, - view: context.viewApi, - }; - // a grouped cell. no data that is specific to this specific resource - // `colSpec` is for the group. a GroupSpec :( - return (createElement(RenderHook, { hookProps: hookProps, classNames: colSpec.cellClassNames, content: colSpec.cellContent, defaultContent: renderGroupInner, didMount: colSpec.cellDidMount, willUnmount: colSpec.cellWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return ( - // TODO: make data-attr with group value? - createElement("td", { className: ['fc-datagrid-cell', 'fc-resource-group'].concat(classNames).join(' '), rowSpan: props.rowSpan, ref: rootElRef }, - createElement("div", { className: "fc-datagrid-cell-frame fc-datagrid-cell-frame-liquid" }, - createElement("div", { className: "fc-datagrid-cell-cushion fc-sticky", ref: innerElRef }, innerContent)))); })); - }; - return SpreadsheetGroupCell; - }(BaseComponent)); - function renderGroupInner(hookProps) { - return hookProps.groupValue || createElement(Fragment, null, "\u00A0"); - } - - var SpreadsheetRow = /** @class */ (function (_super) { - __extends(SpreadsheetRow, _super); - function SpreadsheetRow() { - return _super !== null && _super.apply(this, arguments) || this; - } - SpreadsheetRow.prototype.render = function () { - var props = this.props; - var resource = props.resource, rowSpans = props.rowSpans, depth = props.depth; - var resourceFields = buildResourceFields(resource); // slightly inefficient. already done up the call stack - return (createElement("tr", null, props.colSpecs.map(function (colSpec, i) { - var rowSpan = rowSpans[i]; - if (rowSpan === 0) { // not responsible for group-based rows. VRowGroup is - return null; - } - if (rowSpan == null) { - rowSpan = 1; - } - var fieldValue = colSpec.field ? resourceFields[colSpec.field] : - (resource.title || getPublicId(resource.id)); - if (rowSpan > 1) { - return (createElement(SpreadsheetGroupCell, { key: i, colSpec: colSpec, fieldValue: fieldValue, rowSpan: rowSpan })); - } - return (createElement(SpreadsheetIndividualCell, { key: i, colSpec: colSpec, resource: resource, fieldValue: fieldValue, depth: depth, hasChildren: props.hasChildren, isExpanded: props.isExpanded, innerHeight: props.innerHeight })); - }))); - }; - return SpreadsheetRow; - }(BaseComponent)); - SpreadsheetRow.addPropsEquality({ - rowSpans: isArraysEqual, - }); - - // for HORIZONTAL cell grouping, in spreadsheet area - var SpreadsheetGroupRow = /** @class */ (function (_super) { - __extends(SpreadsheetGroupRow, _super); - function SpreadsheetGroupRow() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.innerInnerRef = createRef(); - _this.onExpanderClick = function () { - var props = _this.props; - _this.context.dispatch({ - type: 'SET_RESOURCE_ENTITY_EXPANDED', - id: props.id, - isExpanded: !props.isExpanded, - }); - }; - return _this; - } - SpreadsheetGroupRow.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var hookProps = { groupValue: props.group.value, view: context.viewApi }; - var spec = props.group.spec; - return (createElement("tr", null, - createElement(RenderHook, { hookProps: hookProps, classNames: spec.labelClassNames, content: spec.labelContent, defaultContent: renderCellInner, didMount: spec.labelDidMount, willUnmount: spec.labelWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, colSpan: props.spreadsheetColCnt, className: [ - 'fc-datagrid-cell', - 'fc-resource-group', - context.theme.getClass('tableCellShaded'), - ].concat(classNames).join(' ') }, - createElement("div", { className: "fc-datagrid-cell-frame", style: { height: props.innerHeight } }, - createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner", ref: _this.innerInnerRef }, - createElement(ExpanderIcon, { depth: 0, hasChildren: true, isExpanded: props.isExpanded, onExpanderClick: _this.onExpanderClick }), - createElement("span", { className: "fc-datagrid-cell-main", ref: innerElRef }, innerContent))))); }))); - }; - return SpreadsheetGroupRow; - }(BaseComponent)); - SpreadsheetGroupRow.addPropsEquality({ - group: isGroupsEqual, - }); - function renderCellInner(hookProps) { - return hookProps.groupValue || createElement(Fragment, null, "\u00A0"); - } - - var SPREADSHEET_COL_MIN_WIDTH = 20; - var SpreadsheetHeader = /** @class */ (function (_super) { - __extends(SpreadsheetHeader, _super); - function SpreadsheetHeader() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.resizerElRefs = new RefMap(_this._handleColResizerEl.bind(_this)); - _this.colDraggings = {}; - return _this; - } - SpreadsheetHeader.prototype.render = function () { - var _this = this; - var _a = this.props, colSpecs = _a.colSpecs, superHeaderRendering = _a.superHeaderRendering, rowInnerHeights = _a.rowInnerHeights; - var hookProps = { view: this.context.viewApi }; - var rowNodes = []; - rowInnerHeights = rowInnerHeights.slice(); // copy, because we're gonna pop - if (superHeaderRendering) { - var rowInnerHeight_1 = rowInnerHeights.shift(); - rowNodes.push(createElement("tr", { key: "row-super" }, - createElement(RenderHook, { hookProps: hookProps, classNames: superHeaderRendering.headerClassNames, content: superHeaderRendering.headerContent, didMount: superHeaderRendering.headerDidMount, willUnmount: superHeaderRendering.headerWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { colSpan: colSpecs.length, ref: rootElRef, className: [ - 'fc-datagrid-cell', - 'fc-datagrid-cell-super', - ].concat(classNames).join(' ') }, - createElement("div", { className: "fc-datagrid-cell-frame", style: { height: rowInnerHeight_1 } }, - createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner", ref: innerElRef }, innerContent)))); }))); - } - var rowInnerHeight = rowInnerHeights.shift(); - rowNodes.push(createElement("tr", { key: "row" }, colSpecs.map(function (colSpec, i) { - var isLastCol = i === (colSpecs.length - 1); - // need empty inner div for abs positioning for resizer - return (createElement(RenderHook, { key: i, hookProps: hookProps, classNames: colSpec.headerClassNames, content: colSpec.headerContent, didMount: colSpec.headerDidMount, willUnmount: colSpec.headerWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, className: ['fc-datagrid-cell'].concat(classNames).join(' ') }, - createElement("div", { className: "fc-datagrid-cell-frame", style: { height: rowInnerHeight } }, - createElement("div", { className: "fc-datagrid-cell-cushion fc-scrollgrid-sync-inner" }, - colSpec.isMain && (createElement("span", { className: "fc-datagrid-expander fc-datagrid-expander-placeholder" }, - createElement("span", { className: "fc-icon" }))), - createElement("span", { className: "fc-datagrid-cell-main", ref: innerElRef }, innerContent)), - !isLastCol && - createElement("div", { className: "fc-datagrid-cell-resizer", ref: _this.resizerElRefs.createRef(i) })))); })); - }))); - return (createElement(Fragment, null, rowNodes)); - }; - SpreadsheetHeader.prototype._handleColResizerEl = function (resizerEl, index) { - var colDraggings = this.colDraggings; - if (!resizerEl) { - var dragging = colDraggings[index]; - if (dragging) { - dragging.destroy(); - delete colDraggings[index]; - } - } - else { - var dragging = this.initColResizing(resizerEl, parseInt(index, 10)); - if (dragging) { - colDraggings[index] = dragging; - } - } - }; - SpreadsheetHeader.prototype.initColResizing = function (resizerEl, index) { - var _a = this.context, pluginHooks = _a.pluginHooks, isRtl = _a.isRtl; - var onColWidthChange = this.props.onColWidthChange; - var ElementDraggingImpl = pluginHooks.elementDraggingImpl; - if (ElementDraggingImpl) { - var dragging = new ElementDraggingImpl(resizerEl); - var startWidth_1; // of just the single column - var currentWidths_1; // of all columns - dragging.emitter.on('dragstart', function () { - var allCells = findElements(elementClosest(resizerEl, 'tr'), 'th'); - currentWidths_1 = allCells.map(function (cellEl) { return (cellEl.getBoundingClientRect().width); }); - startWidth_1 = currentWidths_1[index]; - }); - dragging.emitter.on('dragmove', function (pev) { - currentWidths_1[index] = Math.max(startWidth_1 + pev.deltaX * (isRtl ? -1 : 1), SPREADSHEET_COL_MIN_WIDTH); - if (onColWidthChange) { - onColWidthChange(currentWidths_1.slice()); // send a copy since currentWidths continues to be mutated - } - }); - dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area - return dragging; - } - return null; - }; - return SpreadsheetHeader; - }(BaseComponent)); - - var ResourceTimelineLaneMisc = /** @class */ (function (_super) { - __extends(ResourceTimelineLaneMisc, _super); - function ResourceTimelineLaneMisc() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceTimelineLaneMisc.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - var hookProps = { resource: new ResourceApi(context, props.resource) }; // just easier to make directly - return (createElement(ContentHook, { hookProps: hookProps, content: context.options.resourceLaneContent }, function (innerElRef, innerContent) { return (innerContent && // TODO: test how this would interfere with height - createElement("div", { className: "fc-timeline-lane-misc", ref: innerElRef }, innerContent)); })); - }; - return ResourceTimelineLaneMisc; - }(BaseComponent)); - - var ResourceTimelineLane = /** @class */ (function (_super) { - __extends(ResourceTimelineLane, _super); - function ResourceTimelineLane() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.refineHookProps = memoizeObjArg(refineHookProps); - _this.normalizeClassNames = buildClassNameNormalizer(); - _this.handleHeightChange = function (innerEl, isStable) { - if (_this.props.onHeightChange) { - _this.props.onHeightChange( - // would want to use own ref, but not guaranteed to be ready when this fires - elementClosest(innerEl, 'tr'), isStable); - } - }; - return _this; - } - ResourceTimelineLane.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, context = _a.context; - var options = context.options; - var hookProps = this.refineHookProps({ resource: props.resource, context: context }); - var customClassNames = this.normalizeClassNames(options.resourceLaneClassNames, hookProps); - return (createElement("tr", { ref: props.elRef }, - createElement(MountHook, { hookProps: hookProps, didMount: options.resourceLaneDidMount, willUnmount: options.resourceLaneWillUnmount }, function (rootElRef) { return (createElement("td", { ref: rootElRef, className: ['fc-timeline-lane', 'fc-resource'].concat(customClassNames).join(' '), "data-resource-id": props.resource.id }, - createElement("div", { className: "fc-timeline-lane-frame", style: { height: props.innerHeight } }, - createElement(ResourceTimelineLaneMisc, { resource: props.resource }), - createElement(TimelineLane, { dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, nextDayThreshold: props.nextDayThreshold, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, timelineCoords: props.timelineCoords, onHeightChange: _this.handleHeightChange, resourceId: props.resource.id })))); }))); // important NOT to do liquid-height. dont want to shrink height smaller than content - }; - return ResourceTimelineLane; - }(BaseComponent)); - function refineHookProps(raw) { - return { - resource: new ResourceApi(raw.context, raw.resource), - }; - } - - /* - parallels the SpreadsheetGroupRow - */ - var DividerRow = /** @class */ (function (_super) { - __extends(DividerRow, _super); - function DividerRow() { - return _super !== null && _super.apply(this, arguments) || this; - } - DividerRow.prototype.render = function () { - var _this = this; - var props = this.props; - var renderingHooks = this.props.renderingHooks; - var hookProps = { groupValue: props.groupValue, view: this.context.viewApi }; - return (createElement("tr", { ref: props.elRef }, - createElement(RenderHook, { hookProps: hookProps, classNames: renderingHooks.laneClassNames, content: renderingHooks.laneContent, didMount: renderingHooks.laneDidMount, willUnmount: renderingHooks.laneWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: [ - 'fc-timeline-lane', - 'fc-resource-group', - _this.context.theme.getClass('tableCellShaded'), - ].concat(classNames).join(' ') }, - createElement("div", { style: { height: props.innerHeight }, ref: innerElRef }, innerContent))); }))); - }; - return DividerRow; - }(BaseComponent)); - - var ResourceTimelineLanesBody = /** @class */ (function (_super) { - __extends(ResourceTimelineLanesBody, _super); - function ResourceTimelineLanesBody() { - return _super !== null && _super.apply(this, arguments) || this; - } - ResourceTimelineLanesBody.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - var rowElRefs = props.rowElRefs, innerHeights = props.innerHeights; - return (createElement("tbody", null, props.rowNodes.map(function (node, index) { - if (node.group) { - return (createElement(DividerRow, { key: node.id, elRef: rowElRefs.createRef(node.id), groupValue: node.group.value, renderingHooks: node.group.spec, innerHeight: innerHeights[index] || '' })); - } - if (node.resource) { - var resource = node.resource; - return (createElement(ResourceTimelineLane, __assign({ key: node.id, elRef: rowElRefs.createRef(node.id) }, props.splitProps[resource.id], { resource: resource, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, nextDayThreshold: context.options.nextDayThreshold, businessHours: resource.businessHours || props.fallbackBusinessHours, innerHeight: innerHeights[index] || '', timelineCoords: props.slatCoords, onHeightChange: props.onRowHeightChange }))); - } - return null; - }))); - }; - return ResourceTimelineLanesBody; - }(BaseComponent)); - - var ResourceTimelineLanes = /** @class */ (function (_super) { - __extends(ResourceTimelineLanes, _super); - function ResourceTimelineLanes() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.rootElRef = createRef(); - _this.rowElRefs = new RefMap(); - return _this; - } - ResourceTimelineLanes.prototype.render = function () { - var _a = this, props = _a.props, context = _a.context; - return (createElement("table", { ref: this.rootElRef, className: 'fc-scrollgrid-sync-table ' + context.theme.getClass('table'), style: { - minWidth: props.tableMinWidth, - width: props.clientWidth, - height: props.minHeight, - } }, - createElement(ResourceTimelineLanesBody, { rowElRefs: this.rowElRefs, rowNodes: props.rowNodes, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, splitProps: props.splitProps, fallbackBusinessHours: props.fallbackBusinessHours, slatCoords: props.slatCoords, innerHeights: props.innerHeights, onRowHeightChange: props.onRowHeightChange }))); - }; - ResourceTimelineLanes.prototype.componentDidMount = function () { - this.updateCoords(); - }; - ResourceTimelineLanes.prototype.componentDidUpdate = function () { - this.updateCoords(); - }; - ResourceTimelineLanes.prototype.componentWillUnmount = function () { - if (this.props.onRowCoords) { - this.props.onRowCoords(null); - } - }; - ResourceTimelineLanes.prototype.updateCoords = function () { - var props = this.props; - if (props.onRowCoords && props.clientWidth !== null) { // a populated clientWidth means sizing has stabilized - this.props.onRowCoords(new PositionCache(this.rootElRef.current, collectRowEls(this.rowElRefs.currentMap, props.rowNodes), false, true)); - } - }; - return ResourceTimelineLanes; - }(BaseComponent)); - function collectRowEls(elMap, rowNodes) { - return rowNodes.map(function (rowNode) { return elMap[rowNode.id]; }); - } - - var ResourceTimelineGrid = /** @class */ (function (_super) { - __extends(ResourceTimelineGrid, _super); - function ResourceTimelineGrid() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.computeHasResourceBusinessHours = memoize(computeHasResourceBusinessHours); - _this.resourceSplitter = new ResourceSplitter(); // doesn't let it do businessHours tho - _this.bgSlicer = new TimelineLaneSlicer(); - _this.slatsRef = createRef(); // needed for Hit creation :( - _this.state = { - slatCoords: null, - }; - _this.handleEl = function (el) { - if (el) { - _this.context.registerInteractiveComponent(_this, { el: el }); - } - else { - _this.context.unregisterInteractiveComponent(_this); - } - }; - _this.handleSlatCoords = function (slatCoords) { - _this.setState({ slatCoords: slatCoords }); - if (_this.props.onSlatCoords) { - _this.props.onSlatCoords(slatCoords); - } - }; - _this.handleRowCoords = function (rowCoords) { - _this.rowCoords = rowCoords; - if (_this.props.onRowCoords) { - _this.props.onRowCoords(rowCoords); - } - }; - return _this; - } - ResourceTimelineGrid.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile; - var timerUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit; - var hasResourceBusinessHours = this.computeHasResourceBusinessHours(props.rowNodes); - var splitProps = this.resourceSplitter.splitProps(props); - var bgLaneProps = splitProps['']; - var bgSlicedProps = this.bgSlicer.sliceProps(bgLaneProps, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't need to pass in the rest of these args... - dateProfile, context.dateProfileGenerator, tDateProfile, context.dateEnv); - // WORKAROUND: make ignore slatCoords when out of sync with dateProfile - var slatCoords = state.slatCoords && state.slatCoords.dateProfile === props.dateProfile ? state.slatCoords : null; - return (createElement("div", { ref: this.handleEl, className: [ - 'fc-timeline-body', - props.expandRows ? 'fc-timeline-body-expandrows' : '', - ].join(' '), style: { minWidth: props.tableMinWidth } }, - createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement(Fragment, null, - createElement(TimelineSlats, { ref: _this.slatsRef, dateProfile: dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, clientWidth: props.clientWidth, tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, onCoords: _this.handleSlatCoords, onScrollLeftRequest: props.onScrollLeftRequest }), - createElement(TimelineLaneBg, { businessHourSegs: hasResourceBusinessHours ? null : bgSlicedProps.businessHourSegs, bgEventSegs: bgSlicedProps.bgEventSegs, timelineCoords: slatCoords, - // empty array will result in unnecessary rerenders? - eventResizeSegs: (bgSlicedProps.eventResize ? bgSlicedProps.eventResize.segs : []), dateSelectionSegs: bgSlicedProps.dateSelectionSegs, nowDate: nowDate, todayRange: todayRange }), - createElement(ResourceTimelineLanes, { rowNodes: props.rowNodes, dateProfile: dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, splitProps: splitProps, fallbackBusinessHours: hasResourceBusinessHours ? props.businessHours : null, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, innerHeights: props.rowInnerHeights, slatCoords: slatCoords, onRowCoords: _this.handleRowCoords, onRowHeightChange: props.onRowHeightChange }), - (context.options.nowIndicator && slatCoords && slatCoords.isDateInRange(nowDate)) && (createElement("div", { className: "fc-timeline-now-indicator-container" }, - createElement(NowIndicatorRoot, { isAxis: false, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-line'].concat(classNames).join(' '), style: coordToCss(slatCoords.dateToCoord(nowDate), context.isRtl) }, innerContent)); }))))); }))); - }; - // Hit System - // ------------------------------------------------------------------------------------------ - ResourceTimelineGrid.prototype.queryHit = function (positionLeft, positionTop) { - var rowCoords = this.rowCoords; - var rowIndex = rowCoords.topToIndex(positionTop); - if (rowIndex != null) { - var resource = this.props.rowNodes[rowIndex].resource; - if (resource) { // not a group - var slatHit = this.slatsRef.current.positionToHit(positionLeft); - if (slatHit) { - return { - dateProfile: this.props.dateProfile, - dateSpan: { - range: slatHit.dateSpan.range, - allDay: slatHit.dateSpan.allDay, - resourceId: resource.id, - }, - rect: { - left: slatHit.left, - right: slatHit.right, - top: rowCoords.tops[rowIndex], - bottom: rowCoords.bottoms[rowIndex], - }, - dayEl: slatHit.dayEl, - layer: 0, - }; - } - } - } - return null; - }; - return ResourceTimelineGrid; - }(DateComponent)); - function computeHasResourceBusinessHours(rowNodes) { - for (var _i = 0, rowNodes_1 = rowNodes; _i < rowNodes_1.length; _i++) { - var node = rowNodes_1[_i]; - var resource = node.resource; - if (resource && resource.businessHours) { - return true; - } - } - return false; - } - - var MIN_RESOURCE_AREA_WIDTH = 30; // definitely bigger than scrollbars - // RENAME? - var ResourceTimelineViewLayout = /** @class */ (function (_super) { - __extends(ResourceTimelineViewLayout, _super); - function ResourceTimelineViewLayout() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.scrollGridRef = createRef(); - _this.timeBodyScrollerElRef = createRef(); - _this.spreadsheetHeaderChunkElRef = createRef(); - _this.rootElRef = createRef(); - _this.ensureScrollGridResizeId = 0; - _this.state = { - resourceAreaWidthOverride: null, - }; - /* - ghetto debounce. don't race with ScrollGrid's resizing delay. solves #6140 - */ - _this.ensureScrollGridResize = function () { - if (_this.ensureScrollGridResizeId) { - clearTimeout(_this.ensureScrollGridResizeId); - } - _this.ensureScrollGridResizeId = setTimeout(function () { - _this.scrollGridRef.current.handleSizing(false); - }, config.SCROLLGRID_RESIZE_INTERVAL + 1); - }; - return _this; - } - ResourceTimelineViewLayout.prototype.render = function () { - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var options = context.options; - var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(options); - var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options); - var sections = [ - { - type: 'header', - key: 'header', - syncRowHeights: true, - isSticky: stickyHeaderDates, - chunks: [ - { - key: 'datagrid', - elRef: this.spreadsheetHeaderChunkElRef, - // TODO: allow the content to specify this. have general-purpose 'content' with obj with keys - tableClassName: 'fc-datagrid-header', - rowContent: props.spreadsheetHeaderRows, - }, - { - key: 'divider', - outerContent: (createElement("td", { className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') })), - }, - { - key: 'timeline', - content: props.timeHeaderContent, - }, - ], - }, - { - type: 'body', - key: 'body', - syncRowHeights: true, - liquid: true, - expandRows: Boolean(options.expandRows), - chunks: [ - { - key: 'datagrid', - tableClassName: 'fc-datagrid-body', - rowContent: props.spreadsheetBodyRows, - }, - { - key: 'divider', - outerContent: (createElement("td", { className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') })), - }, - { - key: 'timeline', - scrollerElRef: this.timeBodyScrollerElRef, - content: props.timeBodyContent, - }, - ], - }, - ]; - if (stickyFooterScrollbar) { - sections.push({ - type: 'footer', - key: 'footer', - isSticky: true, - chunks: [ - { - key: 'datagrid', - content: renderScrollShim, - }, - { - key: 'divider', - outerContent: (createElement("td", { className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') })), - }, - { - key: 'timeline', - content: renderScrollShim, - }, - ], - }); - } - var resourceAreaWidth = state.resourceAreaWidthOverride != null - ? state.resourceAreaWidthOverride - : options.resourceAreaWidth; - return (createElement(ScrollGrid, { ref: this.scrollGridRef, elRef: this.rootElRef, liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [ - { cols: props.spreadsheetCols, width: resourceAreaWidth }, - { cols: [] }, - { cols: props.timeCols }, - ], sections: sections })); - }; - ResourceTimelineViewLayout.prototype.forceTimeScroll = function (left) { - var scrollGrid = this.scrollGridRef.current; - scrollGrid.forceScrollLeft(2, left); // 2 = the time area - }; - ResourceTimelineViewLayout.prototype.forceResourceScroll = function (top) { - var scrollGrid = this.scrollGridRef.current; - scrollGrid.forceScrollTop(1, top); // 1 = the body - }; - ResourceTimelineViewLayout.prototype.getResourceScroll = function () { - var timeBodyScrollerEl = this.timeBodyScrollerElRef.current; - return timeBodyScrollerEl.scrollTop; - }; - // Resource Area Resizing - // ------------------------------------------------------------------------------------------ - // NOTE: a callback Ref for the resizer was firing multiple times with same elements (Preact) - // that's why we use spreadsheetResizerElRef instead - ResourceTimelineViewLayout.prototype.componentDidMount = function () { - this.initSpreadsheetResizing(); - }; - ResourceTimelineViewLayout.prototype.componentWillUnmount = function () { - this.destroySpreadsheetResizing(); - }; - ResourceTimelineViewLayout.prototype.initSpreadsheetResizing = function () { - var _this = this; - var _a = this.context, isRtl = _a.isRtl, pluginHooks = _a.pluginHooks; - var ElementDraggingImpl = pluginHooks.elementDraggingImpl; - var spreadsheetHeadEl = this.spreadsheetHeaderChunkElRef.current; - if (ElementDraggingImpl) { - var rootEl_1 = this.rootElRef.current; - var dragging = this.spreadsheetResizerDragging = new ElementDraggingImpl(rootEl_1, '.fc-resource-timeline-divider'); - var dragStartWidth_1; - var viewWidth_1; - dragging.emitter.on('dragstart', function () { - dragStartWidth_1 = spreadsheetHeadEl.getBoundingClientRect().width; - viewWidth_1 = rootEl_1.getBoundingClientRect().width; - }); - dragging.emitter.on('dragmove', function (pev) { - var newWidth = dragStartWidth_1 + pev.deltaX * (isRtl ? -1 : 1); - newWidth = Math.max(newWidth, MIN_RESOURCE_AREA_WIDTH); - newWidth = Math.min(newWidth, viewWidth_1 - MIN_RESOURCE_AREA_WIDTH); - // scrollgrid will ignore resize requests if there are too many :| - _this.setState({ - resourceAreaWidthOverride: newWidth, - }, _this.ensureScrollGridResize); - }); - dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area - } - }; - ResourceTimelineViewLayout.prototype.destroySpreadsheetResizing = function () { - if (this.spreadsheetResizerDragging) { - this.spreadsheetResizerDragging.destroy(); - } - }; - return ResourceTimelineViewLayout; - }(BaseComponent)); - - var ResourceTimelineView = /** @class */ (function (_super) { - __extends(ResourceTimelineView, _super); - function ResourceTimelineView(props, context) { - var _this = _super.call(this, props, context) || this; - _this.processColOptions = memoize(processColOptions); - _this.buildTimelineDateProfile = memoize(buildTimelineDateProfile); - _this.hasNesting = memoize(hasNesting); - _this.buildRowNodes = memoize(buildRowNodes); - _this.layoutRef = createRef(); - _this.rowNodes = []; - _this.renderedRowNodes = []; - _this.buildRowIndex = memoize(buildRowIndex); - _this.handleSlatCoords = function (slatCoords) { - _this.setState({ slatCoords: slatCoords }); - }; - _this.handleRowCoords = function (rowCoords) { - _this.rowCoords = rowCoords; - _this.scrollResponder.update(false); // TODO: could eliminate this if rowCoords lived in state - }; - _this.handleMaxCushionWidth = function (slotCushionMaxWidth) { - _this.setState({ - slotCushionMaxWidth: Math.ceil(slotCushionMaxWidth), // for less rerendering TODO: DRY - }); - }; - // Scrolling - // ------------------------------------------------------------------------------------------------------------------ - // this is useful for scrolling prev/next dates while resource is scrolled down - _this.handleScrollLeftRequest = function (scrollLeft) { - var layout = _this.layoutRef.current; - layout.forceTimeScroll(scrollLeft); - }; - _this.handleScrollRequest = function (request) { - var rowCoords = _this.rowCoords; - var layout = _this.layoutRef.current; - var rowId = request.rowId || request.resourceId; - if (rowCoords) { - if (rowId) { - var rowIdToIndex = _this.buildRowIndex(_this.renderedRowNodes); - var index = rowIdToIndex[rowId]; - if (index != null) { - var scrollTop = (request.fromBottom != null ? - rowCoords.bottoms[index] - request.fromBottom : // pixels from bottom edge - rowCoords.tops[index] // just use top edge - ); - layout.forceResourceScroll(scrollTop); - } - } - return true; - } - return null; - }; - // Resource INDIVIDUAL-Column Area Resizing - // ------------------------------------------------------------------------------------------ - _this.handleColWidthChange = function (colWidths) { - _this.setState({ - spreadsheetColWidths: colWidths, - }); - }; - _this.state = { - resourceAreaWidth: context.options.resourceAreaWidth, - spreadsheetColWidths: [], - }; - return _this; - } - ResourceTimelineView.prototype.render = function () { - var _this = this; - var _a = this, props = _a.props, state = _a.state, context = _a.context; - var options = context.options, viewSpec = context.viewSpec; - var _b = this.processColOptions(context.options), superHeaderRendering = _b.superHeaderRendering, groupSpecs = _b.groupSpecs, orderSpecs = _b.orderSpecs, isVGrouping = _b.isVGrouping, colSpecs = _b.colSpecs; - var tDateProfile = this.buildTimelineDateProfile(props.dateProfile, context.dateEnv, options, context.dateProfileGenerator); - var rowNodes = this.rowNodes = this.buildRowNodes(props.resourceStore, groupSpecs, orderSpecs, isVGrouping, props.resourceEntityExpansions, options.resourcesInitiallyExpanded); - var extraClassNames = [ - 'fc-resource-timeline', - this.hasNesting(rowNodes) ? '' : 'fc-resource-timeline-flat', - 'fc-timeline', - options.eventOverlap === false ? 'fc-timeline-overlap-disabled' : 'fc-timeline-overlap-enabled', - ]; - var slotMinWidth = options.slotMinWidth; - var slatCols = buildSlatCols(tDateProfile, slotMinWidth || this.computeFallbackSlotMinWidth(tDateProfile)); - return (createElement(ViewRoot, { viewSpec: viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, - createElement(ResourceTimelineViewLayout, { ref: _this.layoutRef, forPrint: props.forPrint, isHeightAuto: props.isHeightAuto, spreadsheetCols: buildSpreadsheetCols(colSpecs, state.spreadsheetColWidths, ''), spreadsheetHeaderRows: function (contentArg) { return (createElement(SpreadsheetHeader // TODO: rename to SpreadsheetHeaderRows - , { superHeaderRendering: superHeaderRendering, colSpecs: colSpecs, onColWidthChange: _this.handleColWidthChange, rowInnerHeights: contentArg.rowSyncHeights })); }, spreadsheetBodyRows: function (contentArg) { return (createElement(Fragment, null, _this.renderSpreadsheetRows(rowNodes, colSpecs, contentArg.rowSyncHeights))); }, timeCols: slatCols, timeHeaderContent: function (contentArg) { return (createElement(TimelineHeader, { clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, dateProfile: props.dateProfile, tDateProfile: tDateProfile, slatCoords: state.slatCoords, rowInnerHeights: contentArg.rowSyncHeights, onMaxCushionWidth: slotMinWidth ? null : _this.handleMaxCushionWidth })); }, timeBodyContent: function (contentArg) { return (createElement(ResourceTimelineGrid, { dateProfile: props.dateProfile, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, expandRows: contentArg.expandRows, tDateProfile: tDateProfile, rowNodes: rowNodes, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, resourceStore: props.resourceStore, nextDayThreshold: context.options.nextDayThreshold, rowInnerHeights: contentArg.rowSyncHeights, onSlatCoords: _this.handleSlatCoords, onRowCoords: _this.handleRowCoords, onScrollLeftRequest: _this.handleScrollLeftRequest, onRowHeightChange: contentArg.reportRowHeightChange })); } }))); })); - }; - ResourceTimelineView.prototype.renderSpreadsheetRows = function (nodes, colSpecs, rowSyncHeights) { - return nodes.map(function (node, index) { - if (node.group) { - return (createElement(SpreadsheetGroupRow, { key: node.id, id: node.id, spreadsheetColCnt: colSpecs.length, isExpanded: node.isExpanded, group: node.group, innerHeight: rowSyncHeights[index] || '' })); - } - if (node.resource) { - return (createElement(SpreadsheetRow, { key: node.id, colSpecs: colSpecs, rowSpans: node.rowSpans, depth: node.depth, isExpanded: node.isExpanded, hasChildren: node.hasChildren, resource: node.resource, innerHeight: rowSyncHeights[index] || '' })); - } - return null; - }); - }; - ResourceTimelineView.prototype.componentDidMount = function () { - this.renderedRowNodes = this.rowNodes; - this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); - }; - ResourceTimelineView.prototype.getSnapshotBeforeUpdate = function () { - if (!this.props.forPrint) { // because print-view is always zero? - return { resourceScroll: this.queryResourceScroll() }; - } - return {}; - }; - ResourceTimelineView.prototype.componentDidUpdate = function (prevProps, prevState, snapshot) { - this.renderedRowNodes = this.rowNodes; - this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); - if (snapshot.resourceScroll) { - this.handleScrollRequest(snapshot.resourceScroll); // TODO: this gets triggered too often - } - }; - ResourceTimelineView.prototype.componentWillUnmount = function () { - this.scrollResponder.detach(); - }; - ResourceTimelineView.prototype.computeFallbackSlotMinWidth = function (tDateProfile) { - return Math.max(30, ((this.state.slotCushionMaxWidth || 0) / tDateProfile.slotsPerLabel)); - }; - ResourceTimelineView.prototype.queryResourceScroll = function () { - var _a = this, rowCoords = _a.rowCoords, renderedRowNodes = _a.renderedRowNodes; - if (rowCoords) { - var layout = this.layoutRef.current; - var trBottoms = rowCoords.bottoms; - var scrollTop = layout.getResourceScroll(); - var scroll_1 = {}; - for (var i = 0; i < trBottoms.length; i += 1) { - var rowNode = renderedRowNodes[i]; - var elBottom = trBottoms[i] - scrollTop; // from the top of the scroller - if (elBottom > 0) { - scroll_1.rowId = rowNode.id; - scroll_1.fromBottom = elBottom; - break; - } - } - return scroll_1; - } - return null; - }; - return ResourceTimelineView; - }(BaseComponent)); - ResourceTimelineView.addStateEquality({ - spreadsheetColWidths: isArraysEqual, - }); - function buildRowIndex(rowNodes) { - var rowIdToIndex = {}; - for (var i = 0; i < rowNodes.length; i += 1) { - rowIdToIndex[rowNodes[i].id] = i; - } - return rowIdToIndex; - } - function buildSpreadsheetCols(colSpecs, forcedWidths, fallbackWidth) { - if (fallbackWidth === void 0) { fallbackWidth = ''; } - return colSpecs.map(function (colSpec, i) { return ({ - className: colSpec.isMain ? 'fc-main-col' : '', - width: forcedWidths[i] || colSpec.width || fallbackWidth, - }); }); - } - function hasNesting(nodes) { - for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { - var node = nodes_1[_i]; - if (node.group) { - return true; - } - if (node.resource) { - if (node.hasChildren) { - return true; - } - } - } - return false; - } - function processColOptions(options) { - var allColSpecs = options.resourceAreaColumns || []; - var superHeaderRendering = null; - if (!allColSpecs.length) { - allColSpecs.push({ - headerClassNames: options.resourceAreaHeaderClassNames, - headerContent: options.resourceAreaHeaderContent || 'Resources', - headerDidMount: options.resourceAreaHeaderDidMount, - headerWillUnmount: options.resourceAreaHeaderWillUnmount, - }); - } - else if (options.resourceAreaHeaderContent) { // weird way to determine if content - superHeaderRendering = { - headerClassNames: options.resourceAreaHeaderClassNames, - headerContent: options.resourceAreaHeaderContent, - headerDidMount: options.resourceAreaHeaderDidMount, - headerWillUnmount: options.resourceAreaHeaderWillUnmount, - }; - } - var plainColSpecs = []; - var groupColSpecs = []; // part of the colSpecs, but filtered out in order to put first - var groupSpecs = []; - var isVGrouping = false; - for (var _i = 0, allColSpecs_1 = allColSpecs; _i < allColSpecs_1.length; _i++) { - var colSpec = allColSpecs_1[_i]; - if (colSpec.group) { - groupColSpecs.push(__assign(__assign({}, colSpec), { cellClassNames: colSpec.cellClassNames || options.resourceGroupLabelClassNames, cellContent: colSpec.cellContent || options.resourceGroupLabelContent, cellDidMount: colSpec.cellDidMount || options.resourceGroupLabelDidMount, cellWillUnmount: colSpec.cellWillUnmount || options.resourceGroupLaneWillUnmount })); - } - else { - plainColSpecs.push(colSpec); - } - } - // BAD: mutates a user-supplied option - var mainColSpec = plainColSpecs[0]; - mainColSpec.isMain = true; - mainColSpec.cellClassNames = mainColSpec.cellClassNames || options.resourceLabelClassNames; - mainColSpec.cellContent = mainColSpec.cellContent || options.resourceLabelContent; - mainColSpec.cellDidMount = mainColSpec.cellDidMount || options.resourceLabelDidMount; - mainColSpec.cellWillUnmount = mainColSpec.cellWillUnmount || options.resourceLabelWillUnmount; - if (groupColSpecs.length) { - groupSpecs = groupColSpecs; - isVGrouping = true; - } - else { - var hGroupField = options.resourceGroupField; - if (hGroupField) { - groupSpecs.push({ - field: hGroupField, - labelClassNames: options.resourceGroupLabelClassNames, - labelContent: options.resourceGroupLabelContent, - labelDidMount: options.resourceGroupLabelDidMount, - labelWillUnmount: options.resourceGroupLabelWillUnmount, - laneClassNames: options.resourceGroupLaneClassNames, - laneContent: options.resourceGroupLaneContent, - laneDidMount: options.resourceGroupLaneDidMount, - laneWillUnmount: options.resourceGroupLaneWillUnmount, - }); - } - } - var allOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER; - var plainOrderSpecs = []; - for (var _a = 0, allOrderSpecs_1 = allOrderSpecs; _a < allOrderSpecs_1.length; _a++) { - var orderSpec = allOrderSpecs_1[_a]; - var isGroup = false; - for (var _b = 0, groupSpecs_1 = groupSpecs; _b < groupSpecs_1.length; _b++) { - var groupSpec = groupSpecs_1[_b]; - if (groupSpec.field === orderSpec.field) { - groupSpec.order = orderSpec.order; // -1, 0, 1 - isGroup = true; - break; - } - } - if (!isGroup) { - plainOrderSpecs.push(orderSpec); - } - } - return { - superHeaderRendering: superHeaderRendering, - isVGrouping: isVGrouping, - groupSpecs: groupSpecs, - colSpecs: groupColSpecs.concat(plainColSpecs), - orderSpecs: plainOrderSpecs, - }; - } - - var resourceTimelinePlugin = createPlugin({ - deps: [ - premiumCommonPlugin, - resourceCommonPlugin, - timelinePlugin, - ], - initialView: 'resourceTimelineDay', - views: { - resourceTimeline: { - type: 'timeline', - component: ResourceTimelineView, - needsResourceData: true, - resourceAreaWidth: '30%', - resourcesInitiallyExpanded: true, - eventResizableFromStart: true, // TODO: not DRY with this same setting in the main timeline config - }, - resourceTimelineDay: { - type: 'resourceTimeline', - duration: { days: 1 }, - }, - resourceTimelineWeek: { - type: 'resourceTimeline', - duration: { weeks: 1 }, - }, - resourceTimelineMonth: { - type: 'resourceTimeline', - duration: { months: 1 }, - }, - resourceTimelineYear: { - type: 'resourceTimeline', - duration: { years: 1 }, - }, - }, - }); - - globalPlugins.push(interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, plugin, googleCalendarPlugin, scrollGridPlugin, adaptivePlugin, timelinePlugin, resourceCommonPlugin, resourceDayGridPlugin, resourceTimeGridPlugin, resourceTimelinePlugin); - - exports.AbstractResourceDayTableModel = AbstractResourceDayTableModel; exports.BASE_OPTION_DEFAULTS = BASE_OPTION_DEFAULTS; exports.BASE_OPTION_REFINERS = BASE_OPTION_REFINERS; exports.BaseComponent = BaseComponent; exports.BgEvent = BgEvent; - exports.BootstrapTheme = BootstrapTheme; + exports.BootstrapTheme = BootstrapTheme$1; exports.Calendar = Calendar; exports.CalendarApi = CalendarApi; exports.CalendarContent = CalendarContent; @@ -20052,7 +14768,6 @@ var FullCalendar = (function (exports) { exports.Component = Component; exports.ContentHook = ContentHook; exports.CustomContentRenderContext = CustomContentRenderContext; - exports.DEFAULT_RESOURCE_ORDER = DEFAULT_RESOURCE_ORDER; exports.DateComponent = DateComponent; exports.DateEnv = DateEnv; exports.DateProfileGenerator = DateProfileGenerator; @@ -20060,7 +14775,6 @@ var FullCalendar = (function (exports) { exports.DayCellRoot = DayCellRoot; exports.DayGridView = DayTableView; exports.DayHeader = DayHeader; - exports.DayResourceTableModel = DayResourceTableModel; exports.DaySeriesModel = DaySeriesModel; exports.DayTable = DayTable; exports.DayTableModel = DayTableModel; @@ -20089,26 +14803,13 @@ var FullCalendar = (function (exports) { exports.PositionCache = PositionCache; exports.RefMap = RefMap; exports.RenderHook = RenderHook; - exports.ResourceApi = ResourceApi; - exports.ResourceDayHeader = ResourceDayHeader; - exports.ResourceDayTable = ResourceDayTable; - exports.ResourceDayTableModel = ResourceDayTableModel; - exports.ResourceDayTableView = ResourceDayTableView; - exports.ResourceDayTimeCols = ResourceDayTimeCols; - exports.ResourceDayTimeColsView = ResourceDayTimeColsView; - exports.ResourceLabelRoot = ResourceLabelRoot; - exports.ResourceSplitter = ResourceSplitter; - exports.ResourceTimelineLane = ResourceTimelineLane; - exports.ResourceTimelineView = ResourceTimelineView; exports.ScrollController = ScrollController; - exports.ScrollGrid = ScrollGrid; exports.ScrollResponder = ScrollResponder; exports.Scroller = Scroller; exports.SegHierarchy = SegHierarchy; exports.SimpleScrollGrid = SimpleScrollGrid; exports.Slicer = Slicer; exports.Splitter = Splitter; - exports.SpreadsheetRow = SpreadsheetRow; exports.StandardEvent = StandardEvent; exports.Table = Table; exports.TableDateCell = TableDateCell; @@ -20119,16 +14820,6 @@ var FullCalendar = (function (exports) { exports.TimeCols = TimeCols; exports.TimeColsSlatsCoords = TimeColsSlatsCoords; exports.TimeColsView = TimeColsView; - exports.TimelineCoords = TimelineCoords; - exports.TimelineHeader = TimelineHeader; - exports.TimelineHeaderRows = TimelineHeaderRows; - exports.TimelineLane = TimelineLane; - exports.TimelineLaneBg = TimelineLaneBg; - exports.TimelineLaneSlicer = TimelineLaneSlicer; - exports.TimelineSlats = TimelineSlats; - exports.TimelineView = TimelineView; - exports.VResourceJoiner = VResourceJoiner; - exports.VResourceSplitter = VResourceSplitter; exports.ViewApi = ViewApi; exports.ViewContextType = ViewContextType; exports.ViewRoot = ViewRoot; @@ -20156,15 +14847,11 @@ var FullCalendar = (function (exports) { exports.buildEventRangeKey = buildEventRangeKey; exports.buildHashFromArray = buildHashFromArray; exports.buildIsoString = buildIsoString; - exports.buildNavLinkData = buildNavLinkData; - exports.buildResourceFields = buildResourceFields; - exports.buildRowNodes = buildRowNodes; + exports.buildNavLinkAttrs = buildNavLinkAttrs; exports.buildSegCompareObj = buildSegCompareObj; exports.buildSegTimeText = buildSegTimeText; - exports.buildSlatCols = buildSlatCols; exports.buildSlatMetas = buildSlatMetas; exports.buildTimeColsModel = buildTimeColsModel; - exports.buildTimelineDateProfile = buildTimelineDateProfile; exports.collectFromHash = collectFromHash; exports.combineEventUis = combineEventUis; exports.compareByFieldSpec = compareByFieldSpec; @@ -20185,8 +14872,7 @@ var FullCalendar = (function (exports) { exports.computeVisibleDayRange = computeVisibleDayRange; exports.config = config; exports.constrainPoint = constrainPoint; - exports.coordToCss = coordToCss; - exports.coordsToCss = coordsToCss; + exports.createAriaClickAttrs = createAriaClickAttrs; exports.createContext = createContext; exports.createDuration = createDuration; exports.createElement = createElement; @@ -20213,9 +14899,8 @@ var FullCalendar = (function (exports) { exports.filterHash = filterHash; exports.findDirectChildren = findDirectChildren; exports.findElements = findElements; - exports.flattenResources = flattenResources; exports.flexibleCompare = flexibleCompare; - exports.flushToDom = flushToDom; + exports.flushSync = flushSync; exports.formatDate = formatDate; exports.formatDayString = formatDayString; exports.formatIsoTimeString = formatIsoTimeString; @@ -20226,22 +14911,25 @@ var FullCalendar = (function (exports) { exports.getDateMeta = getDateMeta; exports.getDayClassNames = getDayClassNames; exports.getDefaultEventEnd = getDefaultEventEnd; + exports.getElRoot = getElRoot; exports.getElSeg = getElSeg; exports.getEntrySpanEnd = getEntrySpanEnd; exports.getEventClassNames = getEventClassNames; + exports.getEventTargetViaRoot = getEventTargetViaRoot; exports.getIsRtlScrollbarOnLeft = getIsRtlScrollbarOnLeft; - exports.getPublicId = getPublicId; exports.getRectCenter = getRectCenter; exports.getRelevantEvents = getRelevantEvents; exports.getScrollGridClassNames = getScrollGridClassNames; exports.getScrollbarWidths = getScrollbarWidths; exports.getSectionClassNames = getSectionClassNames; exports.getSectionHasLiquidHeight = getSectionHasLiquidHeight; + exports.getSegAnchorAttrs = getSegAnchorAttrs; exports.getSegMeta = getSegMeta; exports.getSlotClassNames = getSlotClassNames; exports.getStickyFooterScrollbar = getStickyFooterScrollbar; exports.getStickyHeaderDates = getStickyHeaderDates; exports.getUnequalProps = getUnequalProps; + exports.getUniqueDomId = getUniqueDomId; exports.globalLocales = globalLocales; exports.globalPlugins = globalPlugins; exports.greatestDurationDenominator = greatestDurationDenominator; @@ -20259,13 +14947,12 @@ var FullCalendar = (function (exports) { exports.isColPropsEqual = isColPropsEqual; exports.isDateSelectionValid = isDateSelectionValid; exports.isDateSpansEqual = isDateSpansEqual; - exports.isGroupsEqual = isGroupsEqual; exports.isInt = isInt; exports.isInteractionValid = isInteractionValid; exports.isMultiDayRange = isMultiDayRange; exports.isPropsEqual = isPropsEqual; exports.isPropsValid = isPropsValid; - exports.isValidDate = isValidDate$1; + exports.isValidDate = isValidDate; exports.joinSpans = joinSpans; exports.listenBySelector = listenBySelector; exports.mapHash = mapHash; @@ -20303,7 +14990,6 @@ var FullCalendar = (function (exports) { exports.sanitizeShrinkWidth = sanitizeShrinkWidth; exports.setElSeg = setElSeg; exports.setRef = setRef; - exports.setScrollFromLeftEdge = setScrollFromLeftEdge; exports.sliceEventStore = sliceEventStore; exports.sliceEvents = sliceEvents; exports.sortEventSegs = sortEventSegs; diff --git a/app/assets/javascripts/property_hire_fullcalendar.min.js b/app/assets/javascripts/property_hire_fullcalendar.min.js index 341f14e..0f197fe 100644 --- a/app/assets/javascripts/property_hire_fullcalendar.min.js +++ b/app/assets/javascripts/property_hire_fullcalendar.min.js @@ -1,19 +1,6 @@ /*! -FullCalendar Scheduler v5.8.0 -Docs & License: https://fullcalendar.io/scheduler +FullCalendar v5.11.0 +Docs & License: https://fullcalendar.io/ (c) 2021 Adam Shaw */ -var ie_args=navigator&&navigator.userAgent.match(/MSIE\s+(\d+)/),is_below_es6=!1,ie_ver,global,FullCalendar;ie_args&&(ie_ver=parseInt(ie_args[1]),(ie_ver<=10||!Object.__proto__)&&(Object.setPrototypeOf=function(n,t){n.prototype=Object.create(t.prototype);n.prototype.constructor=n;n.__proto__=t;var i=Object.getOwnPropertyNames(t);return i.forEach(function(i){try{if(i=="caller"||i=="length"||i=="arguments")return;n[i]=t[i]}catch(r){}}),n},global=(typeof globalThis).toLowerCase()=="undefined"?window:globalThis,(typeof DOMTokenList).toLowerCase()=="undefined"&&function(n,t){"use strict";var i="exports";typeof define=="function"&&define["amd"]?define(function(){return t(n)}):typeof module=="function"&&module[i]?module[i]=t(n):t(n)}(this,function(n){"use strict";function o(n){var t=this.prototype[n];this.prototype[n]=function(){for(var r,n=0,i=arguments.length;n-1;){if(this[t]===n)return t;t-=1}return-1}function h(){return e+=1}function u(){var n=this.classes,t=n.join(" ");this.isSVG?this.setAttribute("class",t):this.element.className=t;this.list.length=n.length}function c(n){return r.call(t[this.id].classes,n)!==-1}function l(){for(var n=0,f=t[this.id],e=f.classes,s=arguments.length,i,o=!1;n-1;)o=arguments[n],i=r.call(e,o),i!==-1&&(e.splice(i,1),s=!0),n-=1;s&&u.call(f)}function y(){var n=t[this.id];return u.call(n),n.element.className}function p(n,i){var f=r.call(t[this.id].classes,n)!==-1,u;return f?i!==!0&&(u="remove"):i!==!1&&(u="add"),u&&this[u](n),i===!0||i===!1?i:!f}function f(n){var r,i,u;if(i=n.domTokenListId,i&&i in t)return t[i].list;u=typeof n.className=="object";r=n.className;r=String(u?r.baseVal:r).replace(/^\s+|\s+$/,"");i=h();t[i]={classes:r.length!==0?r.split(/\s+/):[],element:n,list:this,isSVG:u};this.id=i;this.length=t[i].classes.length;n.domTokenListId=i}if(n.Element){var s=n.document,e=0,t={},i=s.createElement("_");"classList"in i?(i.classList.add("c1","c2"),i.classList.contains("c2")||(o.call(n.DOMTokenList,"add"),o.call(n.DOMTokenList,"remove")),i.classList.toggle("c3",!1),i.classList.contains("c3")&&(n.DOMTokenList.prototype.toggle=function(){var t=n.DOMTokenList.prototype.toggle;return function(n,i){var r=!i;return arguments.length>1&&!(this.contains(n)===r)?i:t.call(this,n)}}()),i=null):function(){function h(){var n=this.domTokenListId;return n&&n in t?t[n].list:new f(this)}for(var u=n.Element.prototype,o=[l,c,a,v,y,p],e=["add","contains","item","remove","toString","toggle"],r,s=f.prototype,i=e.length-1;i>-1;)s[e[i]]=o[i],i-=1;if(r={get:h,configurable:!0,enumerable:!0},Object.defineProperty)try{Object.defineProperty(u,"classList",r)}catch(w){w.number===-2146823252&&(r.enumerable=!1,Object.defineProperty(u,"classList",r))}else Object.prototype.__defineGetter__&&u.__defineGetter__("classList",r);n.DOMTokenList=f}()}}),is_below_es6=!0));FullCalendar=function(n){"use strict"; -/*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ -function u(n,t){function i(){this.constructor=n}if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");vh(n,t);n.__proto__=t;n.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}function l(n,t){for(var i=0,u=t.length,r=n.length;i3)for(i=[i],r=3;r0?re(c.type,c.props,c.key,null,c.__v):c)){if(c.__=i,c.__b=i.__b+1,null===(a=v[l])||a&&c.key==a.key&&c.type===a.type)v[l]=void 0;else for(p=0;p>>1,1);t.i.removeChild(n)}}),cu(si(cft,{context:t.context},n.__v),t.l)):t.l&&t.componentWillUnmount()}function aft(n,t){return si(lft,{__v:n,i:t})}function wft(){}function bft(){return this.cancelBubble}function kft(){return this.defaultPrevented}function dft(){function i(t){n.push(t)}var t=o.debounceRendering,n=[];for(o.debounceRendering=i,cu(si(ub,{}),document.createElement("div"));n.length;)n.shift()();o.debounceRendering=t}function gft(n){var t=oft(n),i=t.Provider;return t.Provider=function(){var t=this,r=!this.getChildContext,u=i.apply(this,arguments),n;return r&&(n=[],this.shouldComponentUpdate=function(i){t.props.value!==i.value&&n.forEach(function(n){n.context=i.value;n.forceUpdate()})},this.sub=function(t){n.push(t);var i=t.componentWillUnmount;t.componentWillUnmount=function(){n.splice(n.indexOf(t),1);i&&i.call(t)}}),u},t}function net(n){cu(null,n)}function vr(n){n.parentNode&&n.parentNode.removeChild(n)}function d(n,t){if(n.closest)return n.closest(t);if(!document.documentElement.contains(n))return null;do{if(he(n,t))return n;n=n.parentElement||n.parentNode}while(n!==null&&n.nodeType===1);return null}function he(n,t){var i=n.matches||n.matchesSelector||n.msMatchesSelector;return i.call(n,t)}function dt(n,t){for(var u,i,f=n instanceof HTMLElement?[n]:n,e=[],r=0;r=1)?Math.min(u,f):u}function wc(n,t,i,r){var u=et([t,0,1+cet(t,i,r)]),f=a(n),e=Math.round(ni(u,f));return Math.floor(e/7)+1}function cet(n,t,i){var r=7+t-i,u=(7+et([n,0,r]).getUTCDay()-t)%7;return-u+r-1}function db(n){return[n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds(),n.getMilliseconds(),]}function gb(n){return new Date(n[0],n[1]||0,n[2]==null?1:n[2],n[3]||0,n[4]||0,n[5]||0)}function ai(n){return[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate(),n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds(),n.getUTCMilliseconds(),]}function et(n){return n.length===1&&(n=n.concat([0])),new Date(Date.UTC.apply(Date,n))}function le(n){return!isNaN(n.valueOf())}function vi(n){return n.getUTCHours()*36e5+n.getUTCMinutes()*6e4+n.getUTCSeconds()*1e3+n.getUTCMilliseconds()}function yu(n,t,i,r){return{instanceId:vt(),defId:n,range:t,forcedStartTzo:i==null?null:i,forcedEndTzo:r==null?null:r}}function bc(n,t){var u={},f,e,r,i,s,o;if(t)for(f in t){for(e=[],i=n.length-1;i>=0;i-=1)if(r=n[i][f],typeof r=="object"&&r)e.unshift(r);else if(r!==undefined){u[f]=r;break}e.length&&(u[f]=bc(e))}for(i=n.length-1;i>=0;i-=1){s=n[i];for(o in s)o in u||(u[o]=s[o])}return u}function pt(n,t){var r={};for(var i in n)t(n[i],i)&&(r[i]=n[i]);return r}function w(n,t){var r={};for(var i in n)r[i]=t(n[i],i);return r}function nk(n){for(var u,i={},t=0,r=n;t10&&(t==null?r=r.replace("Z",""):t!==0&&(r=r.replace("Z",rl(t,!0)))),r}function br(n){return n.toISOString().replace(/T.*$/,"")}function fk(n){return yt(n.getUTCHours(),2)+":"+yt(n.getUTCMinutes(),2)+":"+yt(n.getUTCSeconds(),2)}function rl(n,t){t===void 0&&(t=!1);var r=n<0?"-":"+",u=Math.abs(n),f=Math.floor(u/60),i=Math.round(u%60);return t?r+yt(f,2)+":"+yt(i,2):"GMT"+r+f+(i?":"+yt(i,2):"")}function ek(n,t){for(var r=0,i=0;i=tt(t)&&(i=p(i,1))),n.start&&(r=a(n.start),i&&i<=r&&(i=p(r,1))),{start:r,end:i}}function dk(n){var t=tf(n);return ni(t.start,t.end)>1}function tr(n,t,i,r){return r==="year"?s(i.diffWholeYears(n,t),"year"):r==="month"?s(i.diffWholeMonths(n,t),"month"):bb(n,t)}function got(n,t){var i=null,r=null;return(n.start&&(i=t.createMarker(n.start)),n.end&&(r=t.createMarker(n.end)),!i&&!r)?null:i&&r&&ri&&f.push({start:i,end:r.start}),r.end>i&&(i=r.end);return it.start)&&(n.start===null||t.end===null||n.start=n.start)&&(n.end===null||t.end!==null&&t.end<=n.end)}function wt(n,t){return(n.start===null||t>=n.start)&&(n.end===null||t=t.end?new Date(t.end.valueOf()-1):n}function ff(n,t,i,r){var h={},c={},k={},l=[],it=[],a=ro(n.defs,t),u,e,rt,d,w,g,f,y,p,b,tt,nt;for(f in n.defs)u=n.defs[f],e=a[u.defId],e.display==="inverse-background"&&(u.groupId?(h[u.groupId]=[],k[u.groupId]||(k[u.groupId]=u)):c[f]=[]);for(rt in n.instances){var v=n.instances[rt],u=n.defs[v.defId],e=a[u.defId],ut=v.range,s=!u.allDay&&r?tf(ut,r):ut,o=ui(s,i);o&&(e.display==="inverse-background"?u.groupId?h[u.groupId].push(o):c[v.defId].push(o):e.display!=="none"&&(e.display==="background"?l:it).push({def:u,ui:e,instance:v,range:o,isStart:s.start&&s.start.valueOf()===o.start.valueOf(),isEnd:s.end&&s.end.valueOf()===o.end.valueOf()}))}for(d in h)for(y=h[d],p=gk(y,i),w=0,g=p;w=(i||t.end),isToday:t&&wt(t,r.start)}}function ed(n){var t=["fc-event"];return n.isMirror&&t.push("fc-event-mirror"),n.isDraggable&&t.push("fc-event-draggable"),(n.isStartResizable||n.isEndResizable)&&t.push("fc-event-resizable"),n.isDragging&&t.push("fc-event-dragging"),n.isResizing&&t.push("fc-event-resizing"),n.isSelected&&t.push("fc-event-selected"),n.isStart&&t.push("fc-event-start"),n.isEnd&&t.push("fc-event-end"),n.isPast&&t.push("fc-event-past"),n.isToday&&t.push("fc-event-today"),n.isFuture&&t.push("fc-event-future"),t}function uo(n){return n.instance?n.instance.instanceId:n.def.defId+":"+n.range.start.toISOString()}function ist(n,t,i){var u=rst(n,t),r=u.range;if(!r.start)return null;if(!r.end){if(i==null)return null;r.end=t.add(r.start,i)}return u}function rst(n,t){var o=nr(n,od),r=o.refined,s=o.extra,u=r.start?t.createMarkerMeta(r.start):null,f=r.end?t.createMarkerMeta(r.end):null,e=r.allDay;return e==null&&(e=u&&u.isTimeUnspecified&&(!f||f.isTimeUnspecified)),i({range:{start:u?u.marker:null,end:f?f.marker:null},allDay:e},s)}function sd(n,t){return hl(n.range,t.range)&&n.allDay===t.allDay&&ust(n,t)}function ust(n,t){for(var i in t)if(i!=="range"&&i!=="allDay"&&n[i]!==t[i])return!1;for(i in n)if(!(i in t))return!1;return!0}function fst(n,t){return i(i({},cd(n.range,t,n.allDay)),{allDay:n.allDay})}function hd(n,t,r){return i(i({},cd(n,t,r)),{timeZone:t.timeZone})}function cd(n,t,i){return{start:t.toDate(n.start),end:t.toDate(n.end),startStr:t.formatIso(n.start,{omitTime:i}),endStr:t.formatIso(n.end,{omitTime:i})}}function est(n,t,i){var u=io({editable:!1},i),r=nf(u.refined,u.extra,"",n.allDay,!0,i);return{def:r,ui:td(r,t),instance:yu(r.defId,n.range),range:n.range,isStart:!0,isEnd:!0}}function ll(n,t,r){r.emitter.trigger("select",i(i({},al(n,r)),{jsEvent:t?t.origEvent:null,view:r.viewApi||r.calendarApi.view}))}function ost(n,t){t.emitter.trigger("unselect",{jsEvent:n?n.origEvent:null,view:t.viewApi||t.calendarApi.view})}function al(n,t){for(var e,r={},u=0,f=t.pluginHooks.dateSpanTransforms;u=0;i-=1)if(f=u[i],r=f.parseMeta(n),r)return{sourceDefId:i,meta:r};return null}function lst(n,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return n}}function ast(n,t){var i=n.initialDate;return i!=null?t.createMarker(i):of(n.now,t)}function of(n,t){return(typeof n=="function"&&(n=n()),n==null)?t.createNowMarker():t.createMarker(n)}function yd(n){var t,i,u=n._def,r=n._instance;return{defs:(t={},t[u.defId]=u,t),instances:r?(i={},i[r.instanceId]=r,i):{}}}function wi(n,t,i){var s=n.defs,u=n.instances,f=[],h=i?i.instanceId:"",e,r,o;for(e in u)r=u[e],o=s[r.defId],r.instanceId!==h&&f.push(new v(t,o,r));return f}function vst(n,t){yl[n]=t}function yst(n){return new yl[n]}function bd(n){var t=wd.exec(n),i,r;return t&&(i=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?Number("0."+t[12])*1e3:0)),le(i))?(r=null,t[13]&&(r=(t[15]==="-"?-1:1)*(Number(t[16]||0)*60+Number(t[18]||0))),{marker:i,isTimeUnspecified:!t[6],timeZoneOffset:r}):null}function dd(n){for(var i,f=n.length>0?n[0].code:"en",e=kd.concat(n),r={en:wl},t=0,u=e;t0;r-=1)if(f=u.slice(0,r).join("-"),t[f])return t[f];return null}function gd(n,t,i){var r=bc([wl,i],["buttonText"]),u;return delete r.code,u=r.week,delete r.week,{codeArg:n,codes:t,week:u,simpleNumberFormat:new Intl.NumberFormat(n),options:r}}function bst(n,t){t===void 0&&(t={});var r=ng(t),u=y(t),i=r.createMarkerMeta(n);return i?r.format(i.marker,u,{forcedTzo:i.forcedTzo}):""}function kst(n,t,i){var r=ng(typeof i=="object"&&i?i:{}),e=y(i),u=r.createMarkerMeta(n),f=r.createMarkerMeta(t);return!u||!f?"":r.formatRange(u.marker,f.marker,e,{forcedStartTzo:u.forcedTzo,forcedEndTzo:f.forcedTzo,isEndExclusive:i.isEndExclusive,defaultSeparator:ri.defaultRangeSeparator})}function ng(n){var t=bl(n.locale||"en",dd([]).map);return new pl(i(i({timeZone:ri.timeZone,calendarSystem:"gregory"},n),{locale:t}))}function kl(n,t){return de(dst(n),null,t)}function dst(n){var t;return t=n===!0?[{}]:Array.isArray(n)?n.filter(function(n){return n.daysOfWeek}):typeof n=="object"&&n?[n]:[],t.map(function(n){return i(i({},tg),n)})}function ig(n,t){return n.left>=t.left&&n.left=t.top&&n.top
problem, but okay to use for left/right. TODO: rename prop */, dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: _this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the keys createElement(Fragment, null, createElement(Fragment, null, normalFgNodes), @@ -12811,9 +12716,14 @@ var FullCalendar = (function (exports) { }); } } + var oldInstanceHeights = this.state.eventInstanceHeights; + var newInstanceHeights = this.queryEventInstanceHeights(); var limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; this.setState({ - eventInstanceHeights: this.queryEventInstanceHeights(), + // HACK to prevent oscillations of events being shown/hidden from max-event-rows + // Essentially, once you compute an element's height, never null-out. + // TODO: always display all events, as visibility:hidden? + eventInstanceHeights: __assign(__assign({}, oldInstanceHeights), newInstanceHeights), maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null, }); } @@ -12844,11 +12754,11 @@ var FullCalendar = (function (exports) { TableRow.addStateEquality({ eventInstanceHeights: isPropsEqual, }); - function buildMirrorPlacements$1(mirrorSegs, colPlacements) { + function buildMirrorPlacements(mirrorSegs, colPlacements) { if (!mirrorSegs.length) { return []; } - var topsByInstanceId = buildAbsoluteTopHash$1(colPlacements); // TODO: cache this at first render? + var topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render? return mirrorSegs.map(function (seg) { return ({ seg: seg, isVisible: true, @@ -12857,7 +12767,7 @@ var FullCalendar = (function (exports) { marginTop: 0, }); }); } - function buildAbsoluteTopHash$1(colPlacements) { + function buildAbsoluteTopHash(colPlacements) { var topsByInstanceId = {}; for (var _i = 0, colPlacements_1 = colPlacements; _i < colPlacements_1.length; _i++) { var placements = colPlacements_1[_i]; @@ -12866,7 +12776,7 @@ var FullCalendar = (function (exports) { topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; } } - return colPlacements; + return topsByInstanceId; } var Table = /** @class */ (function (_super) { @@ -12925,13 +12835,13 @@ var FullCalendar = (function (exports) { minWidth: props.tableMinWidth, } }, createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return (createElement(Fragment, null, - createElement("table", { className: "fc-scrollgrid-sync-table", style: { + createElement("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { width: props.clientWidth, minWidth: props.tableMinWidth, height: expandRows ? props.clientHeight : '', } }, props.colGroupNode, - createElement("tbody", null, props.cells.map(function (cells, row) { return (createElement(TableRow, { ref: _this.rowRefs.createRef(row), key: cells.length + createElement("tbody", { role: "presentation" }, props.cells.map(function (cells, row) { return (createElement(TableRow, { ref: _this.rowRefs.createRef(row), key: cells.length ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */ : row // in case there are no cells (like when resource view is loading) , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })); }))))); }))); @@ -13149,12 +13059,12 @@ var FullCalendar = (function (exports) { view: viewApi, text: dateEnv.format(props.date, labelFormat), }; - return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLabelClassNames, content: options.slotLabelContent, defaultContent: renderInnerContent$3, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": props.isoTimeStr }, + return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLabelClassNames, content: options.slotLabelContent, defaultContent: renderInnerContent$1, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": props.isoTimeStr }, createElement("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, createElement("div", { className: "fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion", ref: innerElRef }, innerContent)))); })); })); } - function renderInnerContent$3(props) { + function renderInnerContent$1(props) { return props.text; } @@ -13197,18 +13107,18 @@ var FullCalendar = (function (exports) { var dateProfile = _this.props.dateProfile; var range = dateProfile.renderRange; var dayCnt = diffDays(range.start, range.end); - var navLinkAttrs = (options.navLinks && dayCnt === 1) // only do in day views (to avoid doing in week views that dont need it) - ? { 'data-navlink': buildNavLinkData(range.start, 'week'), tabIndex: 0 } + var navLinkAttrs = (dayCnt === 1) // only do in day views (to avoid doing in week views that dont need it) + ? buildNavLinkAttrs(_this.context, range.start, 'week') : {}; if (options.weekNumbers && rowKey === 'day') { - return (createElement(WeekNumberRoot, { date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, className: [ + return (createElement(WeekNumberRoot, { date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, "aria-hidden": true, className: [ 'fc-timegrid-axis', 'fc-scrollgrid-shrink', ].concat(classNames).join(' ') }, createElement("div", { className: "fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid", style: { height: frameHeight } }, createElement("a", __assign({ ref: innerElRef, className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner" }, navLinkAttrs), innerContent)))); })); } - return (createElement("th", { className: "fc-timegrid-axis" }, + return (createElement("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, createElement("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } }))); }; /* Table Component Render Methods @@ -13223,7 +13133,7 @@ var FullCalendar = (function (exports) { }; return ( // TODO: make reusable hook. used in list view too - createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner$1, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: [ + createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner$1, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, "aria-hidden": true, className: [ 'fc-timegrid-axis', 'fc-scrollgrid-shrink', ].concat(classNames).join(' ') }, @@ -13263,7 +13173,7 @@ var FullCalendar = (function (exports) { type: 'body', key: 'all-day-divider', outerContent: ( // TODO: rename to cellContent so don't need to define
<\/div><\/td><\/tr><\/table>",n.querySelector("table").style.height="100px",n.querySelector("div").style.height="100%",document.body.appendChild(n),t=n.querySelector("div"),i=t.offsetHeight>0,document.body.removeChild(n),i)}function nht(n,t,r){var u=[],f;return n&&u.push(n),t&&u.push(t),f={"":no(u)},r&&i(f,r),f}function nu(n,t,i,r){return{dow:n.getUTCDay(),isDisabled:Boolean(r&&!wt(r.activeRange,n)),isOther:Boolean(r&&!wt(r.currentRange,n)),isToday:Boolean(t&&wt(t,n)),isPast:Boolean(i?ni:t?n>=t.end:!1)}}function rr(n,t){var i=["fc-day","fc-day-"+yc[n.dow],];return n.isDisabled?i.push("fc-day-disabled"):(n.isToday&&(i.push("fc-day-today"),i.push(t.getClass("today"))),n.isPast&&i.push("fc-day-past"),n.isFuture&&i.push("fc-day-future"),n.isOther&&i.push("fc-day-other")),i}function ta(n,t){var i=["fc-slot","fc-slot-"+yc[n.dow],];return n.isDisabled?i.push("fc-slot-disabled"):(n.isToday&&(i.push("fc-slot-today"),i.push(t.getClass("today"))),n.isPast&&i.push("fc-slot-past"),n.isFuture&&i.push("fc-slot-future")),i}function ur(n,t){return t===void 0&&(t="day"),JSON.stringify({date:br(n),type:t})}function hf(){return ho===null&&(ho=tht()),ho}function tht(){var n=document.createElement("div"),t,i;return ci(n,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),n.innerHTML="
<\/div>",document.body.appendChild(n),t=n.firstChild,i=t.getBoundingClientRect().left>n.getBoundingClientRect().left,vr(n),i}function ra(){return ia||(ia=iht()),ia}function iht(){var n=document.createElement("div"),t;return n.style.overflow="scroll",n.style.position="absolute",n.style.top="-9999px",n.style.left="-9999px",document.body.appendChild(n),t=eg(n),document.body.removeChild(n),t}function eg(n){return{x:n.offsetHeight-n.clientHeight,y:n.offsetWidth-n.clientWidth}}function ua(n,t){t===void 0&&(t=!1);var i=window.getComputedStyle(n),u=parseInt(i.borderLeftWidth,10)||0,f=parseInt(i.borderRightWidth,10)||0,e=parseInt(i.borderTopWidth,10)||0,o=parseInt(i.borderBottomWidth,10)||0,s=eg(n),h=s.y-u-f,c=s.x-e-o,r={borderLeft:u,borderRight:f,borderTop:e,borderBottom:o,scrollbarBottom:c,scrollbarLeft:0,scrollbarRight:0};return hf()&&i.direction==="rtl"?r.scrollbarLeft=h:r.scrollbarRight=h,t&&(r.paddingLeft=parseInt(i.paddingLeft,10)||0,r.paddingRight=parseInt(i.paddingRight,10)||0,r.paddingTop=parseInt(i.paddingTop,10)||0,r.paddingBottom=parseInt(i.paddingBottom,10)||0),r}function fa(n,t,i){t===void 0&&(t=!1);var f=i?n.getBoundingClientRect():co(n),r=ua(n,t),u={left:f.left+r.borderLeft+r.scrollbarLeft,right:f.right-r.borderRight-r.scrollbarRight,top:f.top+r.borderTop,bottom:f.bottom-r.borderBottom-r.scrollbarBottom};return t&&(u.left+=r.paddingLeft,u.right-=r.paddingRight,u.top+=r.paddingTop,u.bottom-=r.paddingBottom),u}function co(n){var t=n.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function rht(n){for(var f,r,e=ea(n),t=n.getBoundingClientRect(),i=0,u=e;in.fetchRange.end:!n.latestFetchId}function la(n,t,i,r,u){var o={},f,e;for(f in n)e=n[f],o[f]=t[f]?sct(e,i,r,u):e;return o}function sct(n,t,r,u){var f=u.options,e=u.calendarApi,s=u.pluginHooks.eventSourceDefs[n.sourceDefId],o=vt();return s.fetch({eventSource:n,range:t,isRefetch:r,context:u},function(i){var r=i.rawEvents;f.eventSourceSuccess&&(r=f.eventSourceSuccess.call(e,r,i.xhr)||r);n.success&&(r=n.success.call(e,r,i.xhr)||r);u.dispatch({type:"RECEIVE_EVENTS",sourceId:n.sourceId,fetchId:o,fetchRange:t,rawEvents:r})},function(i){console.warn(i.message,i);f.eventSourceFailure&&f.eventSourceFailure.call(e,i);n.failure&&n.failure(i);u.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:n.sourceId,fetchId:o,fetchRange:t,error:i})}),i(i({},n),{isFetching:!0,latestFetchId:o})}function hct(n,t,r,u){var f,e=n[t];return e&&r===e.latestFetchId?i(i({},n),(f={},f[t]=i(i({},e),{isFetching:!1,fetchRange:u}),f)):n}function gg(n,t){return pt(n,function(n){return nn(n,t)})}function cct(n,t){var s=vd(t),r=[].concat(n.eventSources||[]),e=[],i,u,o,f;for(n.initialEvents&&r.unshift(n.initialEvents),n.events&&r.unshift(n.events),i=0,u=r;i=200&&f.status<400){var n=!1,t=void 0;try{t=JSON.parse(f.responseText);n=!0}catch(i){}n?r(t,f):u("Failure parsing JSON",f)}else u("Request failed",f)};f.onerror=function(){u("Request failed",f)};f.send(e)}function elt(n,t){return n+(n.indexOf("?")===-1?"?":"&")+fn(t)}function fn(n){var t=[];for(var i in n)t.push(encodeURIComponent(i)+"="+encodeURIComponent(n[i]));return t.join("&")}function clt(n,t,r){var f=r.dateEnv,h=r.options,e,o,s,c,u={};return e=n.startParam,e==null&&(e=h.startParam),o=n.endParam,o==null&&(o=h.endParam),s=n.timeZoneParam,s==null&&(s=h.timeZoneParam),c=typeof n.extraParams=="function"?n.extraParams():n.extraParams||{},i(u,c),u[e]=f.formatIso(t.start),u[o]=f.formatIso(t.end),f.timeZone!=="local"&&(u[s]=f.timeZone),u}function ylt(n,t,i,r){for(var e=n?nk(n):null,u=a(i.start),s=i.end,o=[],f;u1)?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}function nat(n,t,i,r,u,f,e,o){var s=bl(t||e.defaultCode,e.map);return new pl({calendarSystem:"gregory",timeZone:n,namedTimeZoneImpl:f.namedTimeZonedImpl,locale:s,weekNumberCalculation:i,firstDay:r,weekText:u,cmdFormatter:f.cmdFormatter,defaultSeparator:o})}function tat(n,t){var i=t.themeClasses[n.themeSystem]||ei;return new i(n)}function iat(n){var t=n.dateProfileGeneratorClass||yo;return new t(n)}function rat(n,t,i){return new vl(n,t,i)}function uat(n){return w(n,function(n){return n.ui})}function fat(n,t,i){var f={"":t},u,r;for(u in n)r=n[u],r.sourceId&&i[r.sourceId]&&(f[u]=i[r.sourceId]);return f}function eat(n){var t=n.options;return{eventUiSingleBase:dr({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:typeof t.eventOverlap=="boolean"?t.eventOverlap:undefined,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},n),selectionConfig:dr({constraint:t.selectConstraint,overlap:typeof t.selectOverlap=="boolean"?t.selectOverlap:undefined,allow:t.selectAllow},n)}}function aa(n,t){for(var u,i=0,r=t.pluginHooks.isLoadingFuncs;ii(n[u-1]))return[u,0];while(re)r=f+1;else return[f,1];return[r,0]}function hat(n,t){return{component:n,el:t.el,useEventCenter:t.useEventCenter!=null?t.useEventCenter:!0,isHitComboAllowed:t.isHitComboAllowed||null}}function go(n){var t;return t={},t[n.component.uid]=n,t}function ns(n){var i=nr(n,cat),t=i.refined,r=i.extra;return{startTime:t.startTime||null,duration:t.duration||null,create:t.create!=null?t.create:!0,sourceId:t.sourceId,leftoverProps:r}}function pat(n,t,i,r,u,f){var e=i.build(u,undefined,!1),o=i.buildPrev(t,r,!1),s=i.buildNext(t,r,!1);return{title:f,activeButton:n.type,isTodayEnabled:e.isValid&&!wt(t.currentRange,u),isPrevEnabled:o.isValid,isNextEnabled:s.isValid}}function wat(n){return n.map(function(n){return new n})}function da(n,t){return!n||t>10?y({weekday:"short"}):t>1?y({weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}):y({weekday:"long"})}function pn(n){return n.text}function wn(n){var t=a(n),i=p(t,1);return{start:t,end:i}}function bat(n,t,i){return n||da(t,i)}function uv(n,t){var i=n.activeRange;return t?i:{start:gt(i.start,n.slotMinTime.milliseconds),end:gt(i.end,n.slotMaxTime.milliseconds-864e5)}}function rs(n,t,i){var r=n.mutatedEvents.instances;for(var u in r)if(!uf(t.validRange,r[u].range))return!1;return kn({eventDrag:n},i)}function bn(n,t,i){return uf(t.validRange,n.range)?kn({dateSelection:n},i):!1}function kn(n,t){var r=t.getCurrentData(),u=i({businessHours:r.businessHours,dateSelection:"",eventStore:r.eventStore,eventUiBases:r.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},n);return(t.pluginHooks.isPropsValid||fv)(u,t)}function fv(n,t,i,r){return(i===void 0&&(i={}),n.eventDrag&&!kat(n,t,i,r))?!1:n.dateSelection&&!dat(n,t,i,r)?!1:!0}function kat(n,t,r,u){var g=t.getCurrentData(),o=n.eventDrag,nt=o.mutatedEvents,tt=nt.defs,it=nt.instances,c=ro(tt,o.isEvent?n.eventUiBases:{"":g.selectionConfig}),a,p,b,et,e,ot,k,h,d;u&&(c=w(c,u));var l=wct(n.eventStore,o.affectedEvents.instances),rt=l.defs,ut=l.instances,ct=ro(rt,n.eventUiBases);for(a in it){var f=it[a],ft=f.range,y=c[f.defId],s=tt[f.defId];if(!dn(y.constraints,ft,l,n.businessHours,t))return!1;p=t.options.eventOverlap;b=typeof p=="function"?p:null;for(et in ut)if(e=ut[et],rf(ft,e.range)&&((ot=ct[e.defId].overlap,ot===!1&&o.isEvent)||y.overlap===!1||b&&!b(new v(t,rt[e.defId],e),new v(t,s,f))))return!1;for(k=g.eventStore,h=0,d=y.allows;ht.eventRange.range.end?n:t}function vvt(n){return n.button===0&&!n.ctrlKey}function yvt(){bv+=1;setTimeout(function(){bv-=1},ot.touchMouseIgnoreWait)}function pvt(){ls+=1;ls===1&&window.addEventListener("touchmove",rtt,{passive:!1})}function wvt(){ls-=1;ls||window.removeEventListener("touchmove",rtt,{passive:!1})}function rtt(n){kv&&n.preventDefault()}function nyt(n){var t=n.tagName;return t==="HTML"||t==="BODY"}function vs(n,t){return!n&&!t?!0:Boolean(n)!==Boolean(t)?!1:sd(n.dateSpan,t.dateSpan)}function dv(n,t){for(var e,r={},u=0,f=t.pluginHooks.datePointTransforms;ur.start)return{endDelta:u};return null}function cyt(n,t,r){for(var s,l,a,e=i({},t.leftoverProps),f=0,o=r.pluginHooks.externalDefTransforms;f1,k=r.span.start===u;f+=r.levelCoord-e;e=r.levelCoord+r.thickness;g?(f+=r.thickness,k&&h.push({seg:fu(s,r.span.start,r.span.end,i),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):k&&(h.push({seg:fu(s,r.span.start,r.span.end,i),isVisible:!0,isAbsolute:!1,absoluteTop:0,marginTop:f}),f=0)}v.push(b);y.push(h);p.push(f)}return{singleColPlacements:v,multiColPlacements:y,leftoverMargins:p}}function ipt(n,t){for(var r,e,u,f=[],i=0;i=0;t-=1)if(i=s(vy[t]),r=ti(i,n),r!==null&&r>1)return i;return n}function wy(n,t){var i=new iv(n.renderRange,t);return new rv(i,!1)}function ywt(n){var r=n.navLinkData?{"data-navlink":n.navLinkData,tabIndex:0}:{};return t(c,null,n.text&&t("a",i({className:"fc-list-day-text"},r),n.text),n.sideText&&t("a",i({className:"fc-list-day-side-text"},r),n.sideText))}function pwt(n){var r=n.event,u=r.url,f=u?{href:u}:{};return t("a",i({},f),r.title)}function wwt(n,i,r){var u=r.options,s;if(u.displayEventTime!==!1){var h=n.eventRange.def,o=n.eventRange.instance,e=!1,f=void 0;return(h.allDay?e=!0:dk(n.eventRange.range)?n.isStart?f=gr(n,i,r,null,null,o.range.start,n.end):n.isEnd?f=gr(n,i,r,null,null,n.start,o.range.end):e=!0:f=gr(n,i,r),e)?(s={text:r.options.allDayText,view:r.viewApi},t(b,{hookProps:s,classNames:u.allDayClassNames,content:u.allDayContent,defaultContent:bwt,didMount:u.allDayDidMount,willUnmount:u.allDayWillUnmount},function(n,i,r,u){return t("td",{className:["fc-list-event-time"].concat(i).join(" "),ref:n},u)})):t("td",{className:"fc-list-event-time"},f)}return null}function bwt(n){return n.text}function kwt(n){return n.text}function dwt(n){for(var t=a(n.renderRange.start),u=n.renderRange.end,i=[],r=[];t0?t="positive":(n.scrollLeft=1,t=n.scrollLeft>0?"reverse":"negative"),vr(n),t}function nkt(n,t,i,r,u){n.forEach(function(n,f){var h=t[f],c=h.naturalBound,e=h.parentBound,l=e.right-e.left,a=e.bottom-e.bottom,o,s;l>r||a>u?(o=i[f].left-c.left,s=i[f].top-c.top):(o="",s="");ci(n,{position:"relative",left:o,right:-o,top:s})})}function tkt(n,t,i){n.forEach(function(n,r){var u=t[r],o=u.textAlign,s=u.elWidth,e=u.parentBound,h=e.right-e.left,f;f=o==="center"&&h>i?(i-s)/2:"";ci(n,{left:f,right:f,top:0})})}function ikt(){var n=document.createElement("div"),t;return(n.className="fc-sticky",document.body.appendChild(n),t=window.getComputedStyle(n).position,vr(n),t.indexOf("sticky")!==-1)?t:null}function fkt(n){for(var u,i=0,t=0,r=n;t .fc-scroller")}function kkt(n){return n.map(function(n){var t=window.getComputedStyle(n);return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop,overflowX:t.overflowX,overflowY:t.overflowY,marginBottom:t.marginBottom}})}function dkt(n,t){n.forEach(function(n,i){n.style.overflowX="visible";n.style.overflowY="visible";n.style.marginBottom="";n.style.left=-t[i].scrollLeft+"px"})}function gkt(n,t){n.forEach(function(n,i){var r=t[i];n.style.overflowX=r.overflowX;n.style.overflowY=r.overflowY;n.style.marginBottom=r.marginBottom;n.style.left="";n.scrollLeft=r.scrollLeft;n.scrollTop=r.scrollTop})}function ky(n,t,i,r){var u={labelInterval:i.slotLabelInterval,slotDuration:i.slotDuration},e,g,v,w,b,c,l,k,f;rdt(u,n,t);srt(u,n,t);udt(u,n,t);e=i.slotLabelFormat;g=Array.isArray(e)?e:e!=null?[e]:fdt(u,n,t,i);u.headerFormats=g.map(function(n){return y(n)});u.isTimeScale=Boolean(u.slotDuration.milliseconds);v=null;u.isTimeScale||(w=ii(u.slotDuration).unit,/year|month|week/.test(w)&&(v=w));u.largeUnit=v;u.emphasizeWeeks=tl(u.slotDuration)===1&&ou("weeks",n,t)>=2&&!i.businessHours;b=i.snapDuration;b&&(c=s(b),l=ti(u.slotDuration,c));l==null&&(c=u.slotDuration,l=1);u.snapDuration=c;u.snapsPerSlot=l;var rt=tt(n.slotMaxTime)-tt(n.slotMinTime),o=ort(n.renderRange.start,u,t),h=ort(n.renderRange.end,u,t);for(u.isTimeScale&&(o=t.add(o,n.slotMinTime),h=t.add(p(h,-1),n.slotMaxTime)),u.timeWindowMs=rt,u.normalizedRange={start:o,end:h},k=[],f=o;fot.MAX_TIMELINE_SLOTS&&(console.warn("slotLabelInterval results in too many cells"),n.labelInterval=null));n.slotDuration&&(e=i.countDurationsBetween(r.start,r.end,n.slotDuration),e>ot.MAX_TIMELINE_SLOTS&&(console.warn("slotDuration results in too many cells"),n.slotDuration=null));n.labelInterval&&n.slotDuration&&(u=ti(n.labelInterval,n.slotDuration),(u===null||u<1)&&(console.warn("slotLabelInterval must be a multiple of slotDuration"),n.slotDuration=null))}function srt(n,t,i){var a=t.currentRange,r=n.labelInterval,u,f,o,h,c,e,l,v;if(!r){if(u=void 0,n.slotDuration){for(f=0,o=th;f=ndt)break;n.labelInterval=r}return r}function udt(n,t,i){var h=t.currentRange,r=n.slotDuration,f,u,e,l;if(!r){for(f=srt(n,t,i),u=0,e=th;u1&&o<=nh){r=c;break}}r&&(l=i.countDurationsBetween(h.start,h.end,r),l>tdt&&(r=null));r||(r=f);n.slotDuration=r}return r}function fdt(n,t,i,r){var f,e,o=n.labelInterval,s=ii(o).unit,h=r.weekNumbers,u=f=e=null;s!=="week"||h||(s="day");switch(s){case"year":u={year:"numeric"};break;case"month":ou("years",t,i)>1&&(u={year:"numeric"});f={month:"short"};break;case"week":ou("years",t,i)>1&&(u={year:"numeric"});f={week:"narrow"};break;case"day":ou("years",t,i)>1?u={year:"numeric",month:"long"}:ou("months",t,i)>1&&(u={month:"long"});h&&(f={week:"short"});e={weekday:"narrow",day:"numeric"};break;case"hour":h&&(u={week:"short"});ou("days",t,i)>1&&(f={weekday:"short",day:"numeric",month:"numeric",omitCommas:!0});e={hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"};break;case"minute":rk(o)/60>=nh?(u={hour:"numeric",meridiem:"short"},f=function(n){return":"+yt(n.date.minute,2)}):u={hour:"numeric",minute:"numeric",meridiem:"short"};break;case"second":uk(o)/60>=nh?(u={hour:"numeric",minute:"2-digit",meridiem:"lowercase"},f=function(n){return":"+yt(n.date.second,2)}):u={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"};break;case"millisecond":u={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"};f=function(n){return"."+yt(n.millisecond,3)}}return[].concat(u||[],f||[],e||[])}function ou(n,t,i){var r=t.currentRange,u=null;return n==="years"?u=i.diffWholeYears(r.start,r.end):n==="months"?u=i.diffWholeMonths(r.start,r.end):n==="weeks"?u=i.diffWholeMonths(r.start,r.end):n==="days"&&(u=yr(r.start,r.end)),u||0}function edt(n,t){for(var o=n.slotDates,s=n.emphasizeWeeks,i=null,u=[],r=0,f=o;r1&&!p,e=null,w=k[i]||(p?b:null);d?(o=t.format(u,y),f&&f.text===o?f.colspan+=1:e=hrt(u,o,w)):!f||li(t.countDurationsBetween(n.normalizedRange.start,u,n.labelInterval))?(o=t.format(u,y),e=hrt(u,o,w)):f.colspan+=1;e&&(e.weekStart=v,h.push(e))}return l}function hrt(n,t,i){return{date:n,text:t,rowUnit:i,colspan:1,isWeekStart:!1}}function sdt(n){return n.text}function hdt(n){return{level:n.level,date:n.dateEnv.toDate(n.dateMarker),view:n.viewApi,text:n.text}}function dy(n,t,i){var u=i.countDurationsBetween(t.normalizedRange.start,n,t.snapDuration),f,r;return u<0?0:u>=t.snapDiffToIndex.length?t.snapCnt:(f=Math.floor(u),r=t.snapDiffToIndex[f],li(r)?r+=u-f:r=Math.ceil(r),r)}function rh(n,t){return n===null?{left:"",right:""}:t?{right:n,left:""}:{left:n,right:""}}function uh(n,t){return n?t?{right:n.start,left:-n.end}:{left:n.start,right:-n.end}:{left:"",right:""}}function vdt(n,t){return t.map(function(t){var i=t.toISOString();return n[i]})}function vrt(n,t,i){var o=[],r,u;if(i)for(r=0,u=n;r=0;t-=1)if(u=r[t],i=u.parseMeta(n),i)return{meta:i,sourceDefId:t};return null}function agt(n){for(var t in n)console.warn("Unknown resource prop '"+t+"'")}function vgt(n,t,i){var r=i.options,u=i.dateProfile;if(!n||!t)return nut(r.initialResources||r.resources,u.activeRange,r.refetchResourcesOnNavigate,i);switch(t.type){case"RESET_RESOURCE_SOURCE":return nut(t.resourceSourceInput,u.activeRange,r.refetchResourcesOnNavigate,i);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return ygt(n,u.activeRange,r.refetchResourcesOnNavigate,i);case"RECEIVE_RESOURCES":case"RECEIVE_RESOURCE_ERROR":return wgt(n,t.fetchId,t.fetchRange);case"REFETCH_RESOURCES":return op(n,u.activeRange,i);default:return n}}function nut(n,t,i,r){if(n){var u=cgt(n);return op(u,i?t:null,r)}return null}function ygt(n,t,i,r){return i&&!pgt(n)&&(!n.fetchRange||!hl(n.fetchRange,t))?op(n,t,r):n}function pgt(n){return Boolean(drt(n.sourceDefId).ignoreRange)}function op(n,t,r){var f=drt(n.sourceDefId),u=vt();return f.fetch({resourceSource:n,range:t,context:r},function(n){r.dispatch({type:"RECEIVE_RESOURCES",fetchId:u,fetchRange:t,rawResources:n.rawResources})},function(n){r.dispatch({type:"RECEIVE_RESOURCE_ERROR",fetchId:u,fetchRange:t,error:n})}),i(i({},n),{isFetching:!0,latestFetchId:u})}function wgt(n,t,r){return t===n.latestFetchId?i(i({},n),{isFetching:!1,fetchRange:r}):n}function hp(n,t,r,u){var o,s,c;t===void 0&&(t="");var h=nr(n,tut),f=h.refined,l=h.extra,e={id:f.id||sp+vt(),parentId:f.parentId||t,title:f.title||"",businessHours:f.businessHours?kl(f.businessHours,u):null,ui:dr({editable:f.eventEditable,startEditable:f.eventStartEditable,durationEditable:f.eventDurationEditable,constraint:f.eventConstraint,overlap:f.eventOverlap,allow:f.eventAllow,classNames:f.eventClassNames,backgroundColor:f.eventBackgroundColor,borderColor:f.eventBorderColor,textColor:f.eventTextColor,color:f.eventColor},u),extendedProps:i(i({},l),f.extendedProps)};if(Object.freeze(e.ui.classNames),Object.freeze(e.extendedProps),!r[e.id]&&(r[e.id]=e,f.children))for(o=0,s=f.children;o0)break;t.splice(r,0,n)}function kp(n){var t=i(i(i({},n.extendedProps),n.ui),n);return delete t.ui,delete t.extendedProps,t}function cut(n,t){return n.spec===t.spec&&n.value===t.value}function rti(n,t,i,r,u){var f=oy(n,t);return r?new vp(f,i,u):new ap(f,i,u)}function eti(n,t,i,r,u){var f=wy(n,t);return r?new vp(f,i,u):new ap(f,i,u)}function put(n){for(var i,e=n.depth,u=n.hasChildren,o=n.isExpanded,s=n.onExpanderClick,r=[],f=0;f3;)i.pop()();if(i[1]1&&(u.year==="numeric"||u.year==="2-digit")&&(u.month==="numeric"||u.month==="2-digit")&&(u.day==="numeric"||u.day==="2-digit")&&(e=1),f=this.format(n,i),o=this.format(t,i),f===o)return f;var w=lot(u,e),a=sk(w,c,i),v=a(n),y=a(t),s=aot(f,v,o,y),p=c.separator||r||i.defaultSeparator||"";return s?s.before+v+p+y+s.after:f+p+o},n.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";case 2:return"day";default:return"time"}},n}();ck=function(){function n(n){this.cmdStr=n}return n.prototype.format=function(n,t,i){return t.cmdFormatter(this.cmdStr,be(n,null,t,i))},n.prototype.formatRange=function(n,t,i,r){return i.cmdFormatter(this.cmdStr,be(n,t,i,r))},n}();lk=function(){function n(n){this.func=n}return n.prototype.format=function(n,t,i){return this.func(be(n,null,t,i))},n.prototype.formatRange=function(n,t,i,r){return this.func(be(n,t,i,r))},n}();var fl={navLinkDayClick:r,navLinkWeekClick:r,duration:s,bootstrapFontAwesome:r,buttonIcons:r,customButtons:r,defaultAllDayEventDuration:s,defaultTimedEventDuration:s,nextDayThreshold:s,scrollTime:s,scrollTimeReset:Boolean,slotMinTime:s,slotMaxTime:s,dayPopoverFormat:y,slotDuration:s,snapDuration:s,headerToolbar:r,footerToolbar:r,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:y,dayHeaderClassNames:r,dayHeaderContent:r,dayHeaderDidMount:r,dayHeaderWillUnmount:r,dayCellClassNames:r,dayCellContent:r,dayCellDidMount:r,dayCellWillUnmount:r,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:r,weekNumbers:Boolean,weekNumberClassNames:r,weekNumberContent:r,weekNumberDidMount:r,weekNumberWillUnmount:r,editable:Boolean,viewClassNames:r,viewDidMount:r,viewWillUnmount:r,nowIndicator:Boolean,nowIndicatorClassNames:r,nowIndicatorContent:r,nowIndicatorDidMount:r,nowIndicatorWillUnmount:r,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:r,locale:r,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:r,eventOrder:ce,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:r,contentHeight:r,direction:String,weekNumberFormat:y,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,progressiveEventRendering:Boolean,businessHours:r,initialDate:r,now:r,eventDataTransform:r,stickyHeaderDates:r,stickyFooterScrollbar:r,viewHeight:r,defaultAllDay:Boolean,eventSourceFailure:r,eventSourceSuccess:r,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:r,eventConstraint:r,eventAllow:r,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:r,eventContent:r,eventDidMount:r,eventWillUnmount:r,selectConstraint:r,selectOverlap:r,selectAllow:r,droppable:Boolean,unselectCancel:String,slotLabelFormat:r,slotLaneClassNames:r,slotLaneContent:r,slotLaneDidMount:r,slotLaneWillUnmount:r,slotLabelClassNames:r,slotLabelContent:r,slotLabelDidMount:r,slotLabelWillUnmount:r,dayMaxEvents:r,dayMaxEventRows:r,dayMinWidth:Number,slotLabelInterval:s,allDayText:String,allDayClassNames:r,allDayContent:r,allDayDidMount:r,allDayWillUnmount:r,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:y,rerenderDelay:Number,moreLinkText:r,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:r,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:s,hiddenDays:r,monthMode:Boolean,fixedWeekCount:Boolean,validRange:r,visibleRange:r,titleFormat:r,noEventsText:String,moreLinkClick:r,moreLinkClassNames:r,moreLinkContent:r,moreLinkDidMount:r,moreLinkWillUnmount:r},ri={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30},ak={datesSet:r,eventsSet:r,eventAdd:r,eventChange:r,eventRemove:r,windowResize:r,eventClick:r,eventMouseEnter:r,eventMouseLeave:r,select:r,unselect:r,loading:r,_unmount:r,_beforeprint:r,_afterprint:r,_noEventDrop:r,_noEventResize:r,_resize:r,_scrollRequest:r},vk={buttonText:r,views:r,plugins:r,initialEvents:r,events:r,eventSources:r},el={headerToolbar:ke,footerToolbar:ke,buttonText:ke,buttonIcons:ke};yk={type:String,component:r,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:r,usesMinMaxTime:Boolean,classNames:r,content:r,didMount:r,willUnmount:r};gu={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:r,overlap:r,allow:r,className:du,classNames:du,color:String,backgroundColor:String,borderColor:String,textColor:String};pk={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};var to={id:String,groupId:String,title:String,url:String},wk={start:r,end:r,date:r,allDay:Boolean},bot=i(i(i({},to),wk),{extendedProps:r});od={start:r,end:r,allDay:Boolean};vl=function(){function n(n,t,i){this.type=n;this.getCurrentData=t;this.dateEnv=i}return Object.defineProperty(n.prototype,"calendar",{get:function(){return this.getCurrentData().calendarApi},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"title",{get:function(){return this.getCurrentData().viewTitle},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"activeStart",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"activeEnd",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"currentStart",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"currentEnd",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)},enumerable:!1,configurable:!0}),n.prototype.getOption=function(n){return this.getCurrentData().options[n]},n}();ld={id:String,defaultAllDay:Boolean,url:String,format:String,events:r,eventDataTransform:r,success:r,failure:r};pi=function(){function n(){}return n.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},n.prototype.dispatch=function(n){return this.currentDataManager.dispatch(n)},Object.defineProperty(n.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),n.prototype.batchRendering=function(n){n()},n.prototype.updateSize=function(){this.trigger("_resize",!0)},n.prototype.setOption=function(n,t){this.dispatch({type:"SET_OPTION",optionName:n,rawOptionValue:t})},n.prototype.getOption=function(n){return this.currentDataManager.currentCalendarOptionsInput[n]},n.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},n.prototype.on=function(n,t){var i=this.currentDataManager;if(i.currentCalendarOptionsRefiners[n])i.emitter.on(n,t);else console.warn("Unknown listener name '"+n+"'")},n.prototype.off=function(n,t){this.currentDataManager.emitter.off(n,t)},n.prototype.trigger=function(n){for(var i,r=[],t=1;t=r[t]&&n=r[t]&&n0},n.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},n.prototype.canScrollUp=function(){return this.getScrollTop()>0},n.prototype.canScrollDown=function(){return this.getScrollTop()0},n.prototype.canScrollRight=function(){return this.getScrollLeft()1&&(t=a(t),t=p(t,-1),t=u.add(t,e))),{start:i,end:t}},n.prototype.buildRangeFromDuration=function(n,t,i,r){function l(){u=h.startOf(n,e);c=h.add(u,i);o={start:u,end:c}}var s=this.props,h=s.dateEnv,e=s.dateAlignment,u,c,o,f;return e||(f=this.props.dateIncrement,e=f?tt(f)f.end&&(e+=this.insertEntry({index:n.index,thickness:n.thickness,span:{start:f.end,end:u.end}},o))),e)?(i.push.apply(i,l([{index:n.index,thickness:n.thickness,span:ko(f,u)}],o)),e):(i.push(n),0)},n.prototype.insertEntryAt=function(n,t){var u=this,f=u.entriesByLevel,r=u.levelCoords,i=t.level;i>=r.length||r[i]>t.levelCoord?(pa(r,i,t.levelCoord),pa(f,i,[n])):pa(f[i],t.lateralEnd,n);this.stackCnts[ki(n)]=t.stackCnt},n.prototype.findInsertion=function(n){for(var r,f=this,h=f.levelCoords,p=f.entriesByLevel,w=f.stackCnts,c=f.strictOrder,b=h.length,t=0,l=0,s=0,e=0,a=-1,o=null,i=0;i=t+n.thickness)break;var v=p[i],u=void 0,y=wa(v,n.span.start,va);for(s=y[0]+y[1],e=s;(u=v[e])&&u.span.startr)&&(t=r+u.thickness,a=i,o=u),e+=1;r1?(w=a&&o.getClass("buttonGroup")||"",t.apply(void 0,l(["div",{className:w}],f))):f[0]},r}(e),vn=function(n){function i(){return n!==null&&n.apply(this,arguments)||this}return u(i,n),i.prototype.render=function(){var f=this.props,n=f.model,o=f.extraClassName,i=!1,r,u,s=n.center,e;return n.left?(i=!0,r=n.left):r=n.start,n.right?(i=!0,u=n.right):u=n.end,e=[o||"","fc-toolbar",i?"fc-toolbar-ltr":"",],t("div",{className:e.join(" ")},this.renderSection("start",r||[]),this.renderSection("center",s||[]),this.renderSection("end",u||[]))},i.prototype.renderSection=function(n,i){var r=this.props;return t(lat,{key:n,widgetGroups:i,title:r.title,activeButton:r.activeButton,isTodayEnabled:r.isTodayEnabled,isPrevEnabled:r.isPrevEnabled,isNextEnabled:r.isNextEnabled})},i}(e),aat=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(n){t.el=n;g(t.props.elRef,n);t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return u(i,n),i.prototype.render=function(){var u=this,n=u.props,f=u.state,i=n.aspectRatio,o=["fc-view-harness",i||n.liquid||n.height?"fc-view-harness-active":"fc-view-harness-passive",],r="",e="";return i?f.availableWidth!==null?r=f.availableWidth/i:e=100/i+"%":r=n.height||"",t("div",{ref:this.handleEl,onClick:n.onClick,className:o.join(" "),style:{height:r,paddingBottom:e}},n.children)},i.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},i.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},i.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},i}(e),vat=function(n){function t(t){var i=n.call(this,t)||this;return i.handleSegClick=function(n,t){var r=i.component,o=r.context,u=ir(t),f,e;u&&r.isValidSegDownEl(n.target)&&(f=d(n.target,".fc-event-forced-url"),e=f?f.querySelector("a[href]").href:"",o.emitter.trigger("eventClick",{el:t,event:new v(r.context,u.eventRange.def,u.eventRange.instance),jsEvent:n,view:o.viewApi}),e&&!n.defaultPrevented&&(window.location.href=e))},i.destroy=hc(t.el,"click",".fc-event",i.handleSegClick),i}return u(t,n),t}(di),yat=function(n){function t(t){var i=n.call(this,t)||this;return i.handleEventElRemove=function(n){n===i.currentSegEl&&i.handleSegLeave(null,i.currentSegEl)},i.handleSegEnter=function(n,t){ir(t)&&(i.currentSegEl=t,i.triggerEvent("eventMouseEnter",n,t))},i.handleSegLeave=function(n,t){i.currentSegEl&&(i.currentSegEl=null,i.triggerEvent("eventMouseLeave",n,t))},i.removeHoverListeners=iet(t.el,".fc-event",i.handleSegEnter,i.handleSegLeave),i}return u(t,n),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(n,t,i){var u=this.component,r=u.context,f=ir(i);(!t||u.isValidSegDownEl(t.target))&&r.emitter.trigger(n,{el:i,event:new v(r,f.eventRange.def,f.eventRange.instance),jsEvent:t,view:r.viewApi})},t}(di),yn=function(n){function r(){var t=n!==null&&n.apply(this,arguments)||this;return t.buildViewContext=f(sht),t.buildViewPropTransformers=f(wat),t.buildToolbarProps=f(pat),t.handleNavLinkClick=ob("a[data-navlink]",t._handleNavLinkClick.bind(t)),t.headerRef=h(),t.footerRef=h(),t.interactionsStore={},t.registerInteractiveComponent=function(n,i){var r=hat(n,i),u=[vat,yat,],f=u.concat(t.props.pluginHooks.componentInteractions),e=f.map(function(n){return new n(r)});t.interactionsStore[n.uid]=e;vf[n.uid]=r},t.unregisterInteractiveComponent=function(n){for(var u,i=0,r=t.interactionsStore[n.uid];i1?{"data-navlink":ur(u),tabIndex:0}:{},y=i(i(i({date:o.toDate(u),view:h},n.extraHookProps),{text:a}),f);return t(b,{hookProps:y,classNames:r.dayHeaderClassNames,content:r.dayHeaderContent,defaultContent:pn,didMount:r.dayHeaderDidMount,willUnmount:r.dayHeaderWillUnmount},function(r,e,o,s){return t("th",i({ref:r,className:l.concat(e).join(" "),"data-date":f.isDisabled?undefined:br(u),colSpan:n.colSpan},n.extraDataAttrs),t("div",{className:"fc-scrollgrid-sync-inner"},!f.isDisabled&&t("a",i({ref:o,className:["fc-col-header-cell-cushion",n.isSticky?"fc-sticky":"",].join(" ")},v),s)))})},r}(e),tv=function(n){function r(){return n!==null&&n.apply(this,arguments)||this}return u(r,n),r.prototype.render=function(){var n=this.props,r=this.context,o=r.dateEnv,s=r.theme,h=r.viewApi,u=r.options,f=p(new Date(2592e5),n.dow),e={dow:n.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},c=[ga].concat(rr(e,s),n.extraClassNames||[]),l=o.format(f,n.dayHeaderFormat),a=i(i(i(i({date:f},e),{view:h}),n.extraHookProps),{text:l});return t(b,{hookProps:a,classNames:u.dayHeaderClassNames,content:u.dayHeaderContent,defaultContent:pn,didMount:u.dayHeaderDidMount,willUnmount:u.dayHeaderWillUnmount},function(r,u,f,e){return t("th",i({ref:r,className:c.concat(u).join(" "),colSpan:n.colSpan},n.extraDataAttrs),t("div",{className:"fc-scrollgrid-sync-inner"},t("a",{className:["fc-col-header-cell-cushion",n.isSticky?"fc-sticky":"",].join(" "),ref:f},e)))})},r}(e),at=function(n){function t(t,i){var r=n.call(this,t,i)||this;return r.initialNowDate=of(i.options.now,i.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return u(t,n),t.prototype.render=function(){var n=this,i=n.props,t=n.state;return i.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(n){n.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var r=this,u=r.props,f=r.context,e=gt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),n=f.dateEnv.startOf(e,u.unit),t=f.dateEnv.add(n,s(1,u.unit)),i=t.valueOf()-e.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:n,todayRange:wn(n)},nextState:{nowDate:t,todayRange:wn(t)},waitMs:i}},t.prototype.setTimeout=function(){var n=this,t=this.computeTiming(),i=t.nextState,r=t.waitMs;this.timeoutId=setTimeout(function(){n.setState(i,function(){n.setTimeout()})},r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=lt,t}(ao);ts=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.createDayHeaderFormatter=f(bat),t}return u(i,n),i.prototype.render=function(){var e=this.context,n=this.props,i=n.dates,o=n.dateProfile,r=n.datesRepDistinctDays,u=n.renderIntro,f=this.createDayHeaderFormatter(e.options.dayHeaderFormat,r,i.length);return t(at,{unit:"day"},function(n,e){return t("tr",null,u&&u("day"),i.map(function(n){return r?t(nv,{key:n.toISOString(),date:n,dateProfile:o,todayRange:e,colCnt:i.length,dayHeaderFormat:f}):t(tv,{key:n.getUTCDay(),dow:n.getUTCDay(),dayHeaderFormat:f})}))})},i}(e);var iv=function(){function n(n,t){for(var i=n.start,e=n.end,r=[],u=[],f=-1;i=t.length?t[t.length-1]+1:t[i]},n}(),rv=function(){function n(n,t){var r=n.dates,i,f,u;if(t){for(f=r[0].getUTCDay(),i=1;iu)return!0;return!1},i.prototype.needsYScrolling=function(){var n,i;if(us.test(this.props.overflowY))return!1;var r=this.el,u=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),t=r.children;for(n=0;nu)return!0;return!1},i.prototype.getXScrollbarWidth=function(){return us.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},i.prototype.getYScrollbarWidth=function(){return us.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},i}(e),nt=function(){function n(n){var t=this;this.masterCallback=n;this.currentMap={};this.depths={};this.callbackMap={};this.handleValue=function(n,i){var e=t,r=e.depths,u=e.currentMap,f=!1,o=!1;n!==null?(f=i in u,u[i]=n,r[i]=(r[i]||0)+1,o=!0):(r[i]-=1,r[i]||(delete u[i],delete t.callbackMap[i],f=!0));t.masterCallback&&(f&&t.masterCallback(null,String(i)),o&&t.masterCallback(n,String(i)))}}return n.prototype.createRef=function(n){var i=this,t=this.callbackMap[n];return t||(t=this.callbackMap[n]=function(t){i.handleValue(t,String(n))}),t},n.prototype.collect=function(n,t,i){return gc(this.currentMap,n,t,i)},n.prototype.getAll=function(){return kc(this.currentMap)},n}();pf=function(n){function r(){var t=n!==null&&n.apply(this,arguments)||this;return t.processCols=f(function(n){return n},cv),t.renderMicroColGroup=f(lv),t.scrollerRefs=new nt,t.scrollerElRefs=new nt(t._handleScrollerEl.bind(t)),t.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},t.handleSizing=function(){t.setState(i({shrinkWidth:t.computeShrinkWidth()},t.computeScrollerDims()))},t}return u(r,n),r.prototype.render=function(){var h=this,r=h.props,y=h.state,p=h.context,f=r.sections||[],w=this.processCols(r.cols),c=this.renderMicroColGroup(w,y.shrinkWidth),v=yv(r.liquid,p),u;r.collapsibleWidth&&v.push("fc-scrollgrid-collapsible");for(var a=f.length,n=0,i,e=[],o=[],s=[];n=0&&n=0&&t0&&(this.everMovedDown=!0);f<0?this.everMovedLeft=!0:f>0&&(this.everMovedRight=!0);this.pointerScreenX=i;this.pointerScreenY=r;this.isAnimating||(this.isAnimating=!0,this.requestAnimation(ett()))}},n.prototype.stop=function(){var n,t,i;if(this.isEnabled){for(this.isAnimating=!1,n=0,t=this.scrollCaches;n=0&&o>=0&&s>=0&&h>=0&&(s<=u&&this.everMovedUp&&r.canScrollUp()&&(!i||i.distance>s)&&(i={scrollCache:r,name:"top",distance:s}),h<=u&&this.everMovedDown&&r.canScrollDown()&&(!i||i.distance>h)&&(i={scrollCache:r,name:"bottom",distance:h}),e<=u&&this.everMovedLeft&&r.canScrollLeft()&&(!i||i.distance>e)&&(i={scrollCache:r,name:"left",distance:e}),o<=u&&this.everMovedRight&&r.canScrollRight()&&(!i||i.distance>o)&&(i={scrollCache:r,name:"right",distance:o}))}return i},n.prototype.buildCaches=function(){return this.queryScrollEls().map(function(n){return n===window?new kvt(!1):new ftt(n,!1)})},n.prototype.queryScrollEls=function(){for(var t,n=[],i=0,r=this.scrollQuery;i=t*t&&r.handleDistanceSurpassed(n)}r.isDragging&&(n.origEvent.type!=="scroll"&&(r.mirror.handleMove(n.pageX,n.pageY),r.autoScroller.handleMove(n.pageX,n.pageY)),r.emitter.trigger("dragmove",n))}};r.onPointerUp=function(n){r.isInteracting&&(r.isInteracting=!1,cb(document.body),ab(document.body),r.emitter.trigger("pointerup",n),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(n)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};u=r.pointer=new as(t);u.emitter.on("pointerdown",r.onPointerDown);u.emitter.on("pointermove",r.onPointerMove);u.emitter.on("pointerup",r.onPointerUp);return i&&(u.selector=i),r.mirror=new bvt,r.autoScroller=new dvt,r}return u(t,n),t.prototype.destroy=function(){this.pointer.destroy();this.onPointerUp({})},t.prototype.startDelay=function(n){var t=this;typeof this.delay=="number"?this.delayTimeoutId=setTimeout(function(){t.delayTimeoutId=null;t.handleDelayEnd(n)},this.delay):this.handleDelayEnd(n)},t.prototype.handleDelayEnd=function(n){this.isDelayEnded=!0;this.tryStartDrag(n)},t.prototype.handleDistanceSurpassed=function(n){this.isDistanceSurpassed=!0;this.tryStartDrag(n)},t.prototype.tryStartDrag=function(n){this.isDelayEnded&&this.isDistanceSurpassed&&(!this.pointer.wasTouchScroll||this.touchScrollAllowed)&&(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(n.pageX,n.pageY),this.emitter.trigger("dragstart",n),this.touchScrollAllowed===!1&&this.pointer.cancelTouchScroll())},t.prototype.tryStopDrag=function(n){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,n))},t.prototype.stopDrag=function(n){this.isDragging=!1;this.emitter.trigger("dragend",n)},t.prototype.setIgnoreMove=function(n){this.pointer.shouldIgnoreMove=n},t.prototype.setMirrorIsVisible=function(n){this.mirror.setIsVisible(n)},t.prototype.setMirrorNeedsRevert=function(n){this.mirrorNeedsRevert=n},t.prototype.setAutoScrollEnabled=function(n){this.autoScroller.isEnabled=n},t}(ba),gvt=function(){function n(n){this.origRect=co(n);this.scrollCaches=ea(n).map(function(n){return new ftt(n,!0)})}return n.prototype.destroy=function(){for(var i,n=0,t=this.scrollCaches;n=0&&c=0&&lu.layer)&&(i.componentId=f,i.context=o.context,i.rect.left+=s,i.rect.right+=s,i.rect.top+=h,i.rect.bottom+=h,u=i))}return u},n}();ott=function(n){function t(t){var r=n.call(this,t)||this,u;r.handlePointerDown=function(n){var t=r.dragging,i=n.origEvent.target;t.setIgnoreMove(!r.component.isValidDateDownEl(i))};r.handleDragEnd=function(n){var s=r.component,h=r.dragging.pointer,t,o;if(!h.wasTouchScroll){var f=r.hitDragging,u=f.initialHit,e=f.finalHit;u&&e&&vs(u,e)&&(t=s.context,o=i(i({},dv(u.dateSpan,t)),{dayEl:u.dayEl,jsEvent:n.origEvent,view:t.viewApi||t.calendarApi.view}),t.emitter.trigger("dateClick",o))}};r.dragging=new lr(t.el);r.dragging.autoScroller.isEnabled=!1;u=r.hitDragging=new uu(r.dragging,go(t));u.emitter.on("pointerdown",r.handlePointerDown);u.emitter.on("dragend",r.handleDragEnd);return r}return u(t,n),t.prototype.destroy=function(){this.dragging.destroy()},t}(di);stt=function(n){function t(t){var i=n.call(this,t)||this,r;i.dragSelection=null;i.handlePointerDown=function(n){var r=i,t=r.component,u=r.dragging,f=t.context.options,e=f.selectable&&t.isValidDateDownEl(n.origEvent.target);u.setIgnoreMove(!e);u.delay=n.isTouch?iyt(t):null};i.handleDragStart=function(n){i.component.context.calendarApi.unselect(n)};i.handleHitUpdate=function(n,t){var u=i.component.context,r=null,e=!1,f,o;n&&(f=i.hitDragging.initialHit,o=n.componentId===f.componentId&&i.isHitComboAllowed&&!i.isHitComboAllowed(f,n),o||(r=ryt(f,n,u.pluginHooks.dateSelectionTransformers)),r&&bn(r,n.dateProfile,u)||(e=!0,r=null));r?u.dispatch({type:"SELECT_DATES",selection:r}):t||u.dispatch({type:"UNSELECT_DATES"});e?au():vu();t||(i.dragSelection=r)};i.handlePointerUp=function(n){i.dragSelection&&(ll(i.dragSelection,n,i.component.context),i.dragSelection=null)};var e=t.component,f=e.context.options,u=i.dragging=new lr(t.el);u.touchScrollAllowed=!1;u.minDistance=f.selectMinDistance||0;u.autoScroller.isEnabled=f.dragScroll;r=i.hitDragging=new uu(i.dragging,go(t));r.emitter.on("pointerdown",i.handlePointerDown);r.emitter.on("dragstart",i.handleDragStart);r.emitter.on("hitupdate",i.handleHitUpdate);r.emitter.on("pointerup",i.handlePointerUp);return i}return u(t,n),t.prototype.destroy=function(){this.dragging.destroy()},t}(di);gv=function(n){function t(r){var u=n.call(this,r)||this,f;u.subjectEl=null;u.subjectSeg=null;u.isDragging=!1;u.eventRange=null;u.relevantEvents=null;u.receivingContext=null;u.validMutation=null;u.mutatedRelevantEvents=null;u.handlePointerDown=function(n){var f=n.origEvent.target,o=u,t=o.component,i=o.dragging,s=i.mirror,r=t.context.options,c=t.context,e;u.subjectEl=n.subjectEl;var l=u.subjectSeg=ir(n.subjectEl),a=u.eventRange=l.eventRange,h=a.instance.instanceId;u.relevantEvents=ge(c.getCurrentData().eventStore,h);i.minDistance=n.isTouch?0:r.eventDragMinDistance;i.delay=n.isTouch&&h!==t.props.eventSelection?fyt(t):null;s.parentNode=r.fixedMirrorParent?r.fixedMirrorParent:d(f,".fc");s.revertDuration=r.dragRevertDuration;e=t.isValidSegDownEl(f)&&!d(f,".fc-event-resizer");i.setIgnoreMove(!e);u.isDragging=e&&n.subjectEl.classList.contains("fc-event-draggable")};u.handleDragStart=function(n){var t=u.component.context,i=u.eventRange,r=i.instance.instanceId;n.isTouch?r!==u.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"});u.isDragging&&(t.calendarApi.unselect(n),t.emitter.trigger("eventDragStart",{el:u.subjectEl,event:new v(t,i.def,i.instance),jsEvent:n.origEvent,view:t.viewApi}))};u.handleHitUpdate=function(n,t){var o;if(u.isDragging){var s=u.relevantEvents,h=u.hitDragging.initialHit,c=u.component.context,i=null,r=null,f=null,l=!1,e={affectedEvents:s,mutatedEvents:it(),isEvent:!0};n&&(i=n.context,o=i.options,c===i||o.editable&&o.droppable?(r=uyt(h,n,i.getCurrentData().pluginHooks.eventDragMutationMassagers),r&&(f=eo(s,i.getCurrentData().eventUiBases,r,i),e.mutatedEvents=f,rs(e,n.dateProfile,i)||(l=!0,r=null,f=null,e.mutatedEvents=it()))):i=null);u.displayDrag(i,e);l?au():vu();t||(c===i&&vs(h,n)&&(r=null),u.dragging.setMirrorNeedsRevert(!r),u.dragging.setMirrorIsVisible(!n||!document.querySelector(".fc-event-mirror")),u.receivingContext=i,u.validMutation=r,u.mutatedRelevantEvents=f)}};u.handlePointerUp=function(){u.isDragging||u.cleanup()};u.handleDragEnd=function(n){var nt,p,w,s,b,tt,k,d;if(u.isDragging){var t=u.component.context,h=t.viewApi,g=u,r=g.receivingContext,c=g.validMutation,l=u.eventRange.def,e=u.eventRange.instance,a=new v(t,l,e),o=u.relevantEvents,f=u.mutatedRelevantEvents,y=u.hitDragging.finalHit;if(u.clearDrag(),t.emitter.trigger("eventDragStop",{el:u.subjectEl,event:a,jsEvent:n.origEvent,view:h}),c){if(r===t){for(nt=new v(t,f.defs[l.defId],e?f.instances[e.instanceId]:null),t.dispatch({type:"MERGE_EVENTS",eventStore:f}),p={oldEvent:a,event:nt,relatedEvents:wi(f,t,e),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:o})}},w={},s=0,b=t.getCurrentData().pluginHooks.eventDropTransformers;s=0)for(o=t.lateralStart;o1,showWeekNumbers:n.showWeekNumbers,todayRange:o,dateProfile:h,cells:f,renderIntro:n.renderRowIntro,businessHourSegs:l[e],eventSelection:n.eventSelection,bgEventSegs:a[e].filter(fpt),fgEventSegs:v[e],dateSelectionSegs:y[e],eventDrag:p[e],eventResize:w[e],dayMaxEvents:u,dayMaxEventRows:r,clientWidth:n.clientWidth,clientHeight:n.clientHeight,forPrint:n.forPrint})}))))}))},r.prototype.prepareHits=function(){this.rowPositions=new fi(this.rootEl,this.rowRefs.collect().map(function(n){return n.getCellEls()[0]}),!1,!0);this.colPositions=new fi(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},r.prototype.queryHit=function(n,t){var o=this,f=o.colPositions,e=o.rowPositions,r=f.leftToIndex(n),u=e.topToIndex(t),s;return u!=null&&r!=null?(s=this.props.cells[u][r],{dateProfile:this.props.dateProfile,dateSpan:i({range:this.getCellRange(u,r),allDay:!0},s.extraDateSpan),dayEl:this.getCellEl(u,r),rect:{left:f.lefts[r],right:f.rights[r],top:e.tops[u],bottom:e.bottoms[u]},layer:0}):null},r.prototype.getCellEl=function(n,t){return this.rowRefs.currentMap[n].getCellEls()[t]},r.prototype.getCellRange=function(n,t){var i=this.props.cells[n][t].date,r=p(i,1);return{start:i,end:r}},r}(rt);var fy=function(n){function t(){var t=n!==null&&n.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return u(t,n),t.prototype.sliceRange=function(n,t){return t.sliceRange(n)},t}(is),ey=function(n){function r(){var t=n!==null&&n.apply(this,arguments)||this;return t.slicer=new fy,t.tableRef=h(),t}return u(r,n),r.prototype.render=function(){var r=this,n=r.props,u=r.context;return t(ws,i({ref:this.tableRef},this.slicer.sliceProps(n,n.dateProfile,n.nextDayThreshold,u,n.dayTableModel),{dateProfile:n.dateProfile,cells:n.dayTableModel.cells,colGroupNode:n.colGroupNode,tableMinWidth:n.tableMinWidth,renderRowIntro:n.renderRowIntro,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.showWeekNumbers,expandRows:n.expandRows,headerAlignElRef:n.headerAlignElRef,clientWidth:n.clientWidth,clientHeight:n.clientHeight,forPrint:n.forPrint}))},r}(rt),ktt=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.buildDayTableModel=f(oy),t.headerRef=h(),t.tableRef=h(),t}return u(i,n),i.prototype.render=function(){var u=this,f=this.context,i=f.options,s=f.dateProfileGenerator,n=this.props,r=this.buildDayTableModel(n.dateProfile,s),e=i.dayHeaders&&t(ts,{ref:this.headerRef,dateProfile:n.dateProfile,dates:r.headerDates,datesRepDistinctDays:r.rowCnt===1}),o=function(f){return t(ey,{ref:u.tableRef,dateProfile:n.dateProfile,dayTableModel:r,businessHours:n.businessHours,dateSelection:n.dateSelection,eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,nextDayThreshold:i.nextDayThreshold,colGroupNode:f.tableColGroupNode,tableMinWidth:f.tableMinWidth,dayMaxEvents:i.dayMaxEvents,dayMaxEventRows:i.dayMaxEventRows,showWeekNumbers:i.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:u.headerElRef,clientWidth:f.clientWidth,clientHeight:f.clientHeight,forPrint:n.forPrint})};return i.dayMinWidth?this.renderHScrollLayout(e,o,r.colCnt,i.dayMinWidth):this.renderSimpleLayout(e,o)},i}(ny);var ept=function(n){function t(){return n!==null&&n.apply(this,arguments)||this}return u(t,n),t.prototype.buildRenderRange=function(t,i,r){var o=this.props.dateEnv,s=n.prototype.buildRenderRange.call(this,t,i,r),f=s.start,u=s.end,e,h;return/^(year|month)$/.test(i)&&(f=o.startOfWeek(f),e=o.startOfWeek(u),e.valueOf()!==u.valueOf()&&(u=pc(e,1))),this.props.monthMode&&this.props.fixedWeekCount&&(h=Math.ceil(wb(f,u)),u=pc(u,6-h)),{start:f,end:u}},t}(yo),dtt=k({initialView:"dayGridMonth",views:{dayGrid:{component:ktt,dateProfileGeneratorClass:ept},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),opt=function(n){function t(){return n!==null&&n.apply(this,arguments)||this}return u(t,n),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(n){return n.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(n){return n.allDay?nd(n)?["timed","allDay"]:["allDay"]:["timed"]},t}(sf),spt=y({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});var cpt=function(n){function r(){return n!==null&&n.apply(this,arguments)||this}return u(r,n),r.prototype.render=function(){return this.props.slatMetas.map(function(n){return t("tr",{key:n.key},t(gtt,i({},n)))})},r}(e),lpt=y({week:"short"}),apt=5,sy=function(n){function r(){var r=n!==null&&n.apply(this,arguments)||this;return r.allDaySplitter=new opt,r.headerElRef=h(),r.rootElRef=h(),r.scrollerElRef=h(),r.state={slatCoords:null},r.handleScrollTopRequest=function(n){var t=r.scrollerElRef.current;t&&(t.scrollTop=n)},r.renderHeadAxis=function(n,u){u===void 0&&(u="");var e=r.context.options,o=r.props.dateProfile,f=o.renderRange,s=ni(f.start,f.end),h=e.navLinks&&s===1?{"data-navlink":ur(f.start,"week"),tabIndex:0}:{};return e.weekNumbers&&n==="day"?t(hs,{date:f.start,defaultFormat:lpt},function(n,r,f,e){return t("th",{ref:n,className:["fc-timegrid-axis","fc-scrollgrid-shrink",].concat(r).join(" ")},t("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:u}},t("a",i({ref:f,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},h),e)))}):t("th",{className:"fc-timegrid-axis"},t("div",{className:"fc-timegrid-axis-frame",style:{height:u}}))},r.renderTableRowAxis=function(n){var u=r.context,i=u.options,f=u.viewApi,e={text:i.allDayText,view:f};return t(b,{hookProps:e,classNames:i.allDayClassNames,content:i.allDayContent,defaultContent:vpt,didMount:i.allDayDidMount,willUnmount:i.allDayWillUnmount},function(i,r,u,f){return t("td",{ref:i,className:["fc-timegrid-axis","fc-scrollgrid-shrink",].concat(r).join(" ")},t("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(n==null?" fc-timegrid-axis-frame-liquid":""),style:{height:n}},t("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:u},f)))})},r.handleSlatCoords=function(n){r.setState({slatCoords:n})},r}return u(r,n),r.prototype.renderSimpleLayout=function(n,i,r){var o=this,f=o.context,e=o.props,u=[],s=hr(f.options);return n&&u.push({type:"header",key:"header",isSticky:s,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:n}}),i&&(u.push({type:"body",key:"all-day",chunk:{content:i}}),u.push({type:"body",key:"all-day-divider",outerContent:t("tr",{className:"fc-scrollgrid-section"},t("td",{className:"fc-timegrid-divider "+f.theme.getClass("tableCellShaded")}))})),u.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(f.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:r}}),t(bt,{viewSpec:f.viewSpec,elRef:this.rootElRef},function(n,i){return t("div",{className:["fc-timegrid"].concat(i).join(" "),ref:n},t(pf,{liquid:!e.isHeightAuto&&!e.forPrint,collapsibleWidth:e.forPrint,cols:[{width:"shrink"}],sections:u}))})},r.prototype.renderHScrollLayout=function(n,i,r,u,f,e,o){var a=this,v=this.context.pluginHooks.scrollGridImpl,l;if(!v)throw new Error("No ScrollGrid implementation");var y=this,s=y.context,c=y.props,p=!c.forPrint&&hr(s.options),w=!c.forPrint&&yf(s.options),h=[];return n&&h.push({type:"header",key:"header",isSticky:p,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(n){return t("tr",null,a.renderHeadAxis("day",n.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:n},]}),i&&(h.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(n){return t("tr",null,a.renderTableRowAxis(n.rowSyncHeights[0]))}},{key:"cols",content:i},]}),h.push({key:"all-day-divider",type:"body",outerContent:t("tr",{className:"fc-scrollgrid-section"},t("td",{colSpan:2,className:"fc-timegrid-divider "+s.theme.getClass("tableCellShaded")}))})),l=s.options.nowIndicator,h.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(s.options.expandRows),chunks:[{key:"axis",content:function(n){return t("div",{className:"fc-timegrid-axis-chunk"},t("table",{style:{height:n.expandRows?n.clientHeight:""}},n.tableColGroupNode,t("tbody",null,t(cpt,{slatMetas:e}))),t("div",{className:"fc-timegrid-now-indicator-container"},t(at,{unit:l?"minute":"day"},function(n){var i=l&&o&&o.safeComputeTop(n);return typeof i=="number"?t(cr,{isAxis:!0,date:n},function(n,r,u,f){return t("div",{ref:n,className:["fc-timegrid-now-indicator-arrow"].concat(r).join(" "),style:{top:i}},f)}):null})))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:r},]}),w&&h.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:sr},{key:"cols",content:sr},]}),t(bt,{viewSpec:s.viewSpec,elRef:this.rootElRef},function(n,i){return t("div",{className:["fc-timegrid"].concat(i).join(" "),ref:n},t(v,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:u,minWidth:f}]},],sections:h}))})},r.prototype.getAllDayMaxEventProps=function(){var i=this.context.options,n=i.dayMaxEvents,t=i.dayMaxEventRows;return(n===!0||t===!0)&&(n=undefined,t=apt),{dayMaxEvents:n,dayMaxEventRows:t}},r}(rt);var nit=function(){function n(n,t,i){this.positions=n;this.dateProfile=t;this.slotDuration=i}return n.prototype.safeComputeTop=function(n){var i=this.dateProfile,r,t;return wt(i.currentRange,n)&&(r=a(n),t=n.valueOf()-r.valueOf(),t>=tt(i.slotMinTime)&&t0,b=Boolean(o)&&o.span.end-o.span.start0?r.renderSegList(e,s):r.renderEmptyMessage()))})},r.prototype.renderEmptyMessage=function(){var i=this.context,n=i.options,r=i.viewApi,u={text:n.noEventsText,view:r};return t(b,{hookProps:u,classNames:n.noEventsClassNames,content:n.noEventsContent,defaultContent:kwt,didMount:n.noEventsDidMount,willUnmount:n.noEventsWillUnmount},function(n,i,r,u){return t("div",{className:["fc-list-empty"].concat(i).join(" "),ref:n},t("div",{className:"fc-list-empty-cushion",ref:r},u))})},r.prototype.renderSegList=function(n,r){var u=this.context,e=u.theme,o=u.options,f=gwt(n);return t(at,{unit:"day"},function(n,u){for(var h,v,c,y,l,a=[],s=0;sthis.lastSizingDate.valueOf()+ot.SCROLLGRID_RESIZE_INTERVAL?(this.lastSizingDate=n,this.recentSizingCnt=0,!0):(this.recentSizingCnt+=1)<=10},r.prototype.computeShrinkWidths=function(){var r=this,u=this.compileColGroupStats(this.props.colGroups.map(function(n){return[n]})),n=this.getDims(),f=n[0],t=n[1],e=f*t,i=[];return u.forEach(function(n,u){if(n.hasShrinkCol){var f=r.chunkElRefs.collect(u,e,t);i[u]=ov(f)}}),i},r.prototype.computeSectionRowMaxHeights=function(){for(var u,f,i,s,h,d,c,g,r,a,v,it,n,y=new Map,p=this.getDims(),rt=p[0],t=p[1],w=[],o=0;o1)?t(kut,{key:o,colSpec:e,fieldValue:h,rowSpan:s}):t(but,{key:o,colSpec:e,resource:i,fieldValue:h,depth:u,hasChildren:n.hasChildren,isExpanded:n.isExpanded,innerHeight:n.innerHeight})}))},i}(e);ah.addPropsEquality({rowSpans:ht});gp=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.innerInnerRef=h(),t.onExpanderClick=function(){var n=t.props;t.context.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:n.id,isExpanded:!n.isExpanded})},t}return u(i,n),i.prototype.render=function(){var r=this,u=this,n=u.props,f=u.context,e={groupValue:n.group.value,view:f.viewApi},i=n.group.spec;return t("tr",null,t(b,{hookProps:e,classNames:i.labelClassNames,content:i.labelContent,defaultContent:cti,didMount:i.labelDidMount,willUnmount:i.labelWillUnmount},function(i,u,e,o){return t("td",{ref:i,colSpan:n.spreadsheetColCnt,className:["fc-datagrid-cell","fc-resource-group",f.theme.getClass("tableCellShaded"),].concat(u).join(" ")},t("div",{className:"fc-datagrid-cell-frame",style:{height:n.innerHeight}},t("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner",ref:r.innerInnerRef},t(put,{depth:0,hasChildren:!0,isExpanded:n.isExpanded,onExpanderClick:r.onExpanderClick}),t("span",{className:"fc-datagrid-cell-main",ref:e},o))))}))},i}(e);gp.addPropsEquality({group:cut});var lti=20,ati=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.resizerElRefs=new nt(t._handleColResizerEl.bind(t)),t.colDraggings={},t}return u(i,n),i.prototype.render=function(){var h=this,r=this.props,u=r.colSpecs,n=r.superHeaderRendering,i=r.rowInnerHeights,e={view:this.context.viewApi},f=[],o,s;return i=i.slice(),n&&(o=i.shift(),f.push(t("tr",{key:"row-super"},t(b,{hookProps:e,classNames:n.headerClassNames,content:n.headerContent,didMount:n.headerDidMount,willUnmount:n.headerWillUnmount},function(n,i,r,f){return t("th",{colSpan:u.length,ref:n,className:["fc-datagrid-cell","fc-datagrid-cell-super",].concat(i).join(" ")},t("div",{className:"fc-datagrid-cell-frame",style:{height:o}},t("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner",ref:r},f)))})))),s=i.shift(),f.push(t("tr",{key:"row"},u.map(function(n,i){var r=i===u.length-1;return t(b,{key:i,hookProps:e,classNames:n.headerClassNames,content:n.headerContent,didMount:n.headerDidMount,willUnmount:n.headerWillUnmount},function(u,f,e,o){return t("th",{ref:u,className:["fc-datagrid-cell"].concat(f).join(" ")},t("div",{className:"fc-datagrid-cell-frame",style:{height:s}},t("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner"},n.isMain&&t("span",{className:"fc-datagrid-expander fc-datagrid-expander-placeholder"},t("span",{className:"fc-icon"})),t("span",{className:"fc-datagrid-cell-main",ref:e},o)),!r&&t("div",{className:"fc-datagrid-cell-resizer",ref:h.resizerElRefs.createRef(i)})))})}))),t(c,null,f)},i.prototype._handleColResizerEl=function(n,t){var r=this.colDraggings,i;n?(i=this.initColResizing(n,parseInt(t,10)),i&&(r[t]=i)):(i=r[t],i&&(i.destroy(),delete r[t]))},i.prototype.initColResizing=function(n,t){var u=this.context,s=u.pluginHooks,h=u.isRtl,f=this.props.onColWidthChange,e=s.elementDraggingImpl,i,o,r;if(e){i=new e(n);i.emitter.on("dragstart",function(){var i=dt(d(n,"tr"),"th");r=i.map(function(n){return n.getBoundingClientRect().width});o=r[t]});i.emitter.on("dragmove",function(n){r[t]=Math.max(o+n.deltaX*(h?-1:1),lti);f&&f(r.slice())});return i.setAutoScrollEnabled(!1),i}return null},i}(e),vti=function(n){function i(){return n!==null&&n.apply(this,arguments)||this}return u(i,n),i.prototype.render=function(){var n=this,r=n.props,i=n.context,u={resource:new ft(i,r.resource)};return t(tu,{hookProps:u,content:i.options.resourceLaneContent},function(n,i){return i&&t("div",{className:"fc-timeline-lane-misc",ref:n},i)})},i}(e),dut=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.refineHookProps=yi(yti),t.normalizeClassNames=iu(),t.handleHeightChange=function(n,i){if(t.props.onHeightChange)t.props.onHeightChange(d(n,"tr"),i)},t}return u(i,n),i.prototype.render=function(){var e=this,r=this,n=r.props,u=r.context,i=u.options,f=this.refineHookProps({resource:n.resource,context:u}),o=this.normalizeClassNames(i.resourceLaneClassNames,f);return t("tr",{ref:n.elRef},t(bi,{hookProps:f,didMount:i.resourceLaneDidMount,willUnmount:i.resourceLaneWillUnmount},function(i){return t("td",{ref:i,className:["fc-timeline-lane","fc-resource"].concat(o).join(" "),"data-resource-id":n.resource.id},t("div",{className:"fc-timeline-lane-frame",style:{height:n.innerHeight}},t(vti,{resource:n.resource}),t(fh,{dateProfile:n.dateProfile,tDateProfile:n.tDateProfile,nowDate:n.nowDate,todayRange:n.todayRange,nextDayThreshold:n.nextDayThreshold,businessHours:n.businessHours,eventStore:n.eventStore,eventUiBases:n.eventUiBases,dateSelection:n.dateSelection,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,timelineCoords:n.timelineCoords,onHeightChange:e.handleHeightChange,resourceId:n.resource.id})))}))},i}(e);var pti=function(n){function i(){return n!==null&&n.apply(this,arguments)||this}return u(i,n),i.prototype.render=function(){var r=this,i=this.props,n=this.props.renderingHooks,u={groupValue:i.groupValue,view:this.context.viewApi};return t("tr",{ref:i.elRef},t(b,{hookProps:u,classNames:n.laneClassNames,content:n.laneContent,didMount:n.laneDidMount,willUnmount:n.laneWillUnmount},function(n,u,f,e){return t("td",{ref:n,className:["fc-timeline-lane","fc-resource-group",r.context.theme.getClass("tableCellShaded"),].concat(u).join(" ")},t("div",{style:{height:i.innerHeight},ref:f},e))}))},i}(e),wti=function(n){function r(){return n!==null&&n.apply(this,arguments)||this}return u(r,n),r.prototype.render=function(){var r=this,n=r.props,e=r.context,u=n.rowElRefs,f=n.innerHeights;return t("tbody",null,n.rowNodes.map(function(r,o){if(r.group)return t(pti,{key:r.id,elRef:u.createRef(r.id),groupValue:r.group.value,renderingHooks:r.group.spec,innerHeight:f[o]||""});if(r.resource){var s=r.resource;return t(dut,i({key:r.id,elRef:u.createRef(r.id)},n.splitProps[s.id],{resource:s,dateProfile:n.dateProfile,tDateProfile:n.tDateProfile,nowDate:n.nowDate,todayRange:n.todayRange,nextDayThreshold:e.options.nextDayThreshold,businessHours:s.businessHours||n.fallbackBusinessHours,innerHeight:f[o]||"",timelineCoords:n.slatCoords,onHeightChange:n.onRowHeightChange}))}return null}))},r}(e),bti=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.rootElRef=h(),t.rowElRefs=new nt,t}return u(i,n),i.prototype.render=function(){var i=this,n=i.props,r=i.context;return t("table",{ref:this.rootElRef,className:"fc-scrollgrid-sync-table "+r.theme.getClass("table"),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:n.minHeight}},t(wti,{rowElRefs:this.rowElRefs,rowNodes:n.rowNodes,dateProfile:n.dateProfile,tDateProfile:n.tDateProfile,nowDate:n.nowDate,todayRange:n.todayRange,splitProps:n.splitProps,fallbackBusinessHours:n.fallbackBusinessHours,slatCoords:n.slatCoords,innerHeights:n.innerHeights,onRowHeightChange:n.onRowHeightChange}))},i.prototype.componentDidMount=function(){this.updateCoords()},i.prototype.componentDidUpdate=function(){this.updateCoords()},i.prototype.componentWillUnmount=function(){if(this.props.onRowCoords)this.props.onRowCoords(null)},i.prototype.updateCoords=function(){var n=this.props;if(n.onRowCoords&&n.clientWidth!==null)this.props.onRowCoords(new fi(this.rootElRef.current,kti(this.rowElRefs.currentMap,n.rowNodes),!1,!0))},i}(e);gut=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.computeHasResourceBusinessHours=f(dti),t.resourceSplitter=new oh,t.bgSlicer=new ip,t.slatsRef=h(),t.state={slatCoords:null},t.handleEl=function(n){n?t.context.registerInteractiveComponent(t,{el:n}):t.context.unregisterInteractiveComponent(t)},t.handleSlatCoords=function(n){if(t.setState({slatCoords:n}),t.props.onSlatCoords)t.props.onSlatCoords(n)},t.handleRowCoords=function(n){if(t.rowCoords=n,t.props.onRowCoords)t.props.onRowCoords(n)},t}return u(i,n),i.prototype.render=function(){var o=this,s=this,n=s.props,h=s.state,i=s.context,f=n.dateProfile,e=n.tDateProfile,v=ii(e.slotDuration).unit,l=this.computeHasResourceBusinessHours(n.rowNodes),a=this.resourceSplitter.splitProps(n),y=a[""],r=this.bgSlicer.sliceProps(y,f,e.isTimeScale?null:n.nextDayThreshold,i,f,i.dateProfileGenerator,e,i.dateEnv),u=h.slatCoords&&h.slatCoords.dateProfile===n.dateProfile?h.slatCoords:null;return t("div",{ref:this.handleEl,className:["fc-timeline-body",n.expandRows?"fc-timeline-body-expandrows":"",].join(" "),style:{minWidth:n.tableMinWidth}},t(at,{unit:v},function(s,h){return t(c,null,t(np,{ref:o.slatsRef,dateProfile:f,tDateProfile:e,nowDate:s,todayRange:h,clientWidth:n.clientWidth,tableColGroupNode:n.tableColGroupNode,tableMinWidth:n.tableMinWidth,onCoords:o.handleSlatCoords,onScrollLeftRequest:n.onScrollLeftRequest}),t(tp,{businessHourSegs:l?null:r.businessHourSegs,bgEventSegs:r.bgEventSegs,timelineCoords:u,eventResizeSegs:r.eventResize?r.eventResize.segs:[],dateSelectionSegs:r.dateSelectionSegs,nowDate:s,todayRange:h}),t(bti,{rowNodes:n.rowNodes,dateProfile:f,tDateProfile:n.tDateProfile,nowDate:s,todayRange:h,splitProps:a,fallbackBusinessHours:l?n.businessHours:null,clientWidth:n.clientWidth,minHeight:n.expandRows?n.clientHeight:"",tableMinWidth:n.tableMinWidth,innerHeights:n.rowInnerHeights,slatCoords:u,onRowCoords:o.handleRowCoords,onRowHeightChange:n.onRowHeightChange}),i.options.nowIndicator&&u&&u.isDateInRange(s)&&t("div",{className:"fc-timeline-now-indicator-container"},t(cr,{isAxis:!1,date:s},function(n,r,f,e){return t("div",{ref:n,className:["fc-timeline-now-indicator-line"].concat(r).join(" "),style:rh(u.dateToCoord(s),i.isRtl)},e)})))}))},i.prototype.queryHit=function(n,t){var u=this.rowCoords,r=u.topToIndex(t),f,i;return r!=null&&(f=this.props.rowNodes[r].resource,f&&(i=this.slatsRef.current.positionToHit(n),i))?{dateProfile:this.props.dateProfile,dateSpan:{range:i.dateSpan.range,allDay:i.dateSpan.allDay,resourceId:f.id},rect:{left:i.left,right:i.right,top:u.tops[r],bottom:u.bottoms[r]},dayEl:i.dayEl,layer:0}:null},i}(rt);var nft=30,gti=function(n){function i(){var t=n!==null&&n.apply(this,arguments)||this;return t.scrollGridRef=h(),t.timeBodyScrollerElRef=h(),t.spreadsheetHeaderChunkElRef=h(),t.rootElRef=h(),t.ensureScrollGridResizeId=0,t.state={resourceAreaWidthOverride:null},t.ensureScrollGridResize=function(){t.ensureScrollGridResizeId&&clearTimeout(t.ensureScrollGridResizeId);t.ensureScrollGridResizeId=setTimeout(function(){t.scrollGridRef.current.handleSizing(!1)},ot.SCROLLGRID_RESIZE_INTERVAL+1)},t}return u(i,n),i.prototype.render=function(){var u=this,n=u.props,f=u.state,i=u.context,r=i.options,s=!n.forPrint&&hr(r),h=!n.forPrint&&yf(r),e=[{type:"header",key:"header",syncRowHeights:!0,isSticky:s,chunks:[{key:"datagrid",elRef:this.spreadsheetHeaderChunkElRef,tableClassName:"fc-datagrid-header",rowContent:n.spreadsheetHeaderRows},{key:"divider",outerContent:t("td",{className:"fc-resource-timeline-divider "+i.theme.getClass("tableCellShaded")})},{key:"timeline",content:n.timeHeaderContent},]},{type:"body",key:"body",syncRowHeights:!0,liquid:!0,expandRows:Boolean(r.expandRows),chunks:[{key:"datagrid",tableClassName:"fc-datagrid-body",rowContent:n.spreadsheetBodyRows},{key:"divider",outerContent:t("td",{className:"fc-resource-timeline-divider "+i.theme.getClass("tableCellShaded")})},{key:"timeline",scrollerElRef:this.timeBodyScrollerElRef,content:n.timeBodyContent},]},],o;return h&&e.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"datagrid",content:sr},{key:"divider",outerContent:t("td",{className:"fc-resource-timeline-divider "+i.theme.getClass("tableCellShaded")})},{key:"timeline",content:sr},]}),o=f.resourceAreaWidthOverride!=null?f.resourceAreaWidthOverride:r.resourceAreaWidth,t(ne,{ref:this.scrollGridRef,elRef:this.rootElRef,liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:!1,colGroups:[{cols:n.spreadsheetCols,width:o},{cols:[]},{cols:n.timeCols},],sections:e})},i.prototype.forceTimeScroll=function(n){var t=this.scrollGridRef.current;t.forceScrollLeft(2,n)},i.prototype.forceResourceScroll=function(n){var t=this.scrollGridRef.current;t.forceScrollTop(1,n)},i.prototype.getResourceScroll=function(){var n=this.timeBodyScrollerElRef.current;return n.scrollTop},i.prototype.componentDidMount=function(){this.initSpreadsheetResizing()},i.prototype.componentWillUnmount=function(){this.destroySpreadsheetResizing()},i.prototype.initSpreadsheetResizing=function(){var i=this,r=this.context,o=r.isRtl,s=r.pluginHooks,u=s.elementDraggingImpl,h=this.spreadsheetHeaderChunkElRef.current,t,n,f,e;if(u){t=this.rootElRef.current;n=this.spreadsheetResizerDragging=new u(t,".fc-resource-timeline-divider");n.emitter.on("dragstart",function(){f=h.getBoundingClientRect().width;e=t.getBoundingClientRect().width});n.emitter.on("dragmove",function(n){var t=f+n.deltaX*(o?-1:1);t=Math.max(t,nft);t=Math.min(t,e-nft);i.setState({resourceAreaWidthOverride:t},i.ensureScrollGridResize)});n.setAutoScrollEnabled(!1)}},i.prototype.destroySpreadsheetResizing=function(){this.spreadsheetResizerDragging&&this.spreadsheetResizerDragging.destroy()},i}(e),nw=function(n){function i(t,i){var r=n.call(this,t,i)||this;return r.processColOptions=f(rii),r.buildTimelineDateProfile=f(ky),r.hasNesting=f(iii),r.buildRowNodes=f(bp),r.layoutRef=h(),r.rowNodes=[],r.renderedRowNodes=[],r.buildRowIndex=f(nii),r.handleSlatCoords=function(n){r.setState({slatCoords:n})},r.handleRowCoords=function(n){r.rowCoords=n;r.scrollResponder.update(!1)},r.handleMaxCushionWidth=function(n){r.setState({slotCushionMaxWidth:Math.ceil(n)})},r.handleScrollLeftRequest=function(n){var t=r.layoutRef.current;t.forceTimeScroll(n)},r.handleScrollRequest=function(n){var i=r.rowCoords,o=r.layoutRef.current,u=n.rowId||n.resourceId,f,t,e;return i?(u&&(f=r.buildRowIndex(r.renderedRowNodes),t=f[u],t!=null&&(e=n.fromBottom!=null?i.bottoms[t]-n.fromBottom:i.tops[t],o.forceResourceScroll(e))),!0):null},r.handleColWidthChange=function(n){r.setState({spreadsheetColWidths:n})},r.state={resourceAreaWidth:i.options.resourceAreaWidth,spreadsheetColWidths:[]},r}return u(i,n),i.prototype.render=function(){var i=this,o=this,n=o.props,l=o.state,r=o.context,f=r.options,v=r.viewSpec,u=this.processColOptions(r.options),y=u.superHeaderRendering,p=u.groupSpecs,w=u.orderSpecs,b=u.isVGrouping,s=u.colSpecs,e=this.buildTimelineDateProfile(n.dateProfile,r.dateEnv,f,r.dateProfileGenerator),h=this.rowNodes=this.buildRowNodes(n.resourceStore,p,w,b,n.resourceEntityExpansions,f.resourcesInitiallyExpanded),k=["fc-resource-timeline",this.hasNesting(h)?"":"fc-resource-timeline-flat","fc-timeline",f.eventOverlap===!1?"fc-timeline-overlap-disabled":"fc-timeline-overlap-enabled",],a=f.slotMinWidth,d=up(e,a||this.computeFallbackSlotMinWidth(e));return t(bt,{viewSpec:v},function(u,f){return t("div",{ref:u,className:k.concat(f).join(" ")},t(gti,{ref:i.layoutRef,forPrint:n.forPrint,isHeightAuto:n.isHeightAuto,spreadsheetCols:tii(s,l.spreadsheetColWidths,""),spreadsheetHeaderRows:function(n){return t(ati,{superHeaderRendering:y,colSpecs:s,onColWidthChange:i.handleColWidthChange,rowInnerHeights:n.rowSyncHeights})},spreadsheetBodyRows:function(n){return t(c,null,i.renderSpreadsheetRows(h,s,n.rowSyncHeights))},timeCols:d,timeHeaderContent:function(r){return t(gy,{clientWidth:r.clientWidth,clientHeight:r.clientHeight,tableMinWidth:r.tableMinWidth,tableColGroupNode:r.tableColGroupNode,dateProfile:n.dateProfile,tDateProfile:e,slatCoords:l.slatCoords,rowInnerHeights:r.rowSyncHeights,onMaxCushionWidth:a?null:i.handleMaxCushionWidth})},timeBodyContent:function(u){return t(gut,{dateProfile:n.dateProfile,clientWidth:u.clientWidth,clientHeight:u.clientHeight,tableMinWidth:u.tableMinWidth,tableColGroupNode:u.tableColGroupNode,expandRows:u.expandRows,tDateProfile:e,rowNodes:h,businessHours:n.businessHours,dateSelection:n.dateSelection,eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,resourceStore:n.resourceStore,nextDayThreshold:r.options.nextDayThreshold,rowInnerHeights:u.rowSyncHeights,onSlatCoords:i.handleSlatCoords,onRowCoords:i.handleRowCoords,onScrollLeftRequest:i.handleScrollLeftRequest,onRowHeightChange:u.reportRowHeightChange})}}))})},i.prototype.renderSpreadsheetRows=function(n,i,r){return n.map(function(n,u){return n.group?t(gp,{key:n.id,id:n.id,spreadsheetColCnt:i.length,isExpanded:n.isExpanded,group:n.group,innerHeight:r[u]||""}):n.resource?t(ah,{key:n.id,colSpecs:i,rowSpans:n.rowSpans,depth:n.depth,isExpanded:n.isExpanded,hasChildren:n.hasChildren,resource:n.resource,innerHeight:r[u]||""}):null})},i.prototype.componentDidMount=function(){this.renderedRowNodes=this.rowNodes;this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)},i.prototype.getSnapshotBeforeUpdate=function(){return this.props.forPrint?{}:{resourceScroll:this.queryResourceScroll()}},i.prototype.componentDidUpdate=function(n,t,i){this.renderedRowNodes=this.rowNodes;this.scrollResponder.update(n.dateProfile!==this.props.dateProfile);i.resourceScroll&&this.handleScrollRequest(i.resourceScroll)},i.prototype.componentWillUnmount=function(){this.scrollResponder.detach()},i.prototype.computeFallbackSlotMinWidth=function(n){return Math.max(30,(this.state.slotCushionMaxWidth||0)/n.slotsPerLabel)},i.prototype.queryResourceScroll=function(){var r=this,u=r.rowCoords,o=r.renderedRowNodes,n,e,i;if(u){var s=this.layoutRef.current,f=u.bottoms,h=s.getResourceScroll(),t={};for(n=0;n0){t.rowId=e.id;t.fromBottom=i;break}return t}return null},i}(e);return nw.addStateEquality({spreadsheetColWidths:ht}),tft=k({deps:[ar,lh,fp,],initialView:"resourceTimelineDay",views:{resourceTimeline:{type:"timeline",component:nw,needsResourceData:!0,resourceAreaWidth:"30%",resourcesInitiallyExpanded:!0,eventResizableFromStart:!0},resourceTimelineDay:{type:"resourceTimeline",duration:{days:1}},resourceTimelineWeek:{type:"resourceTimeline",duration:{weeks:1}},resourceTimelineMonth:{type:"resourceTimeline",duration:{months:1}},resourceTimelineYear:{type:"resourceTimeline",duration:{years:1}}}}),wo.push(wyt,dtt,sit,vit,nbt,lbt,urt,lkt,fp,lh,uti,yut,tft),n.AbstractResourceDayTableModel=lp,n.BASE_OPTION_DEFAULTS=ri,n.BASE_OPTION_REFINERS=fl,n.BaseComponent=e,n.BgEvent=kf,n.BootstrapTheme=kt,n.Calendar=itt,n.CalendarApi=pi,n.CalendarContent=yn,n.CalendarDataManager=bo,n.CalendarDataProvider=cn,n.CalendarRoot=ka,n.Component=ao,n.ContentHook=tu,n.CustomContentRenderContext=vo,n.DEFAULT_RESOURCE_ORDER=te,n.DateComponent=rt,n.DateEnv=pl,n.DateProfileGenerator=yo,n.DayCellContent=os,n.DayCellRoot=bf,n.DayGridView=ktt,n.DayHeader=ts,n.DayResourceTableModel=vp,n.DaySeriesModel=iv,n.DayTable=ey,n.DayTableModel=rv,n.DayTableSlicer=fy,n.DayTimeCols=ly,n.DayTimeColsSlicer=ks,n.DayTimeColsView=py,n.DelayedRunner=or,n.Draggable=vyt,n.ElementDragging=ba,n.ElementScrollController=og,n.Emitter=fr,n.EventApi=v,n.EventRoot=ru,n.EventSourceApi=hi,n.FeaturefulElementDragging=lr,n.Fragment=c,n.Interaction=di,n.ListView=by,n.MoreLinkRoot=cs,n.MountHook=bi,n.NamedTimeZoneImpl=ln,n.NowIndicatorRoot=cr,n.NowTimer=at,n.PointerDragging=as,n.PositionCache=fi,n.RefMap=nt,n.RenderHook=b,n.ResourceApi=ft,n.ResourceDayHeader=hh,n.ResourceDayTable=dp,n.ResourceDayTableModel=ap,n.ResourceDayTableView=lut,n.ResourceDayTimeCols=aut,n.ResourceDayTimeColsView=vut,n.ResourceLabelRoot=eut,n.ResourceSplitter=oh,n.ResourceTimelineLane=dut,n.ResourceTimelineView=nw,n.ScrollController=lo,n.ScrollGrid=ne,n.ScrollResponder=ag,n.Scroller=fs,n.SegHierarchy=af,n.SimpleScrollGrid=pf,n.Slicer=is,n.Splitter=sf,n.SpreadsheetRow=ah,n.StandardEvent=wf,n.Table=ws,n.TableDateCell=nv,n.TableDowCell=tv,n.TableView=ny,n.Theme=er,n.ThirdPartyDraggable=pyt,n.TimeCols=bs,n.TimeColsSlatsCoords=nit,n.TimeColsView=sy,n.TimelineCoords=art,n.TimelineHeader=gy,n.TimelineHeaderRows=lrt,n.TimelineLane=fh,n.TimelineLaneBg=tp,n.TimelineLaneSlicer=ip,n.TimelineSlats=np,n.TimelineView=rp,n.VResourceJoiner=yp,n.VResourceSplitter=pp,n.ViewApi=vl,n.ViewContextType=lt,n.ViewRoot=bt,n.WeekNumberRoot=hs,n.WindowScrollController=sg,n.addDays=p,n.addDurations=ve,n.addMs=gt,n.addWeeks=pc,n.allowContextMenu=ab,n.allowSelection=cb,n.applyMutationToEventStore=eo,n.applyStyle=ci,n.applyStyleProp=sc,n.asCleanDays=tl,n.asRoughMinutes=rk,n.asRoughMs=tt,n.asRoughSeconds=uk,n.binarySearch=wa,n.buildClassNameNormalizer=iu,n.buildDayRanges=ay,n.buildDayTableModel=oy,n.buildEntryKey=ki,n.buildEventApis=wi,n.buildEventRangeKey=uo,n.buildHashFromArray=aet,n.buildIsoString=wu,n.buildNavLinkData=ur,n.buildResourceFields=kp,n.buildRowNodes=bp,n.buildSegCompareObj=id,n.buildSegTimeText=gr,n.buildSlatCols=up,n.buildSlatMetas=yy,n.buildTimeColsModel=wy,n.buildTimelineDateProfile=ky,n.collectFromHash=gc,n.combineEventUis=no,n.compareByFieldSpec=vb,n.compareByFieldSpecs=ac,n.compareNumbers=yb,n.compareObjs=ae,n.computeEarliestSegStart=df,n.computeEdges=ua,n.computeFallbackHeaderFormat=da,n.computeHeightAndMargins=uht,n.computeInnerRect=fa,n.computeRect=co,n.computeSegDraggable=rd,n.computeSegEndResizable=fd,n.computeSegStartResizable=ud,n.computeShrinkWidth=ov,n.computeSmallestCellWidth=pb,n.computeVisibleDayRange=tf,n.config=ot,n.constrainPoint=rg,n.coordToCss=rh,n.coordsToCss=uh,n.createContext=sa,n.createDuration=s,n.createElement=t,n.createEmptyEventStore=it,n.createEventInstance=yu,n.createEventUi=dr,n.createFormatter=y,n.createPlugin=k,n.createPortal=cg,n.createRef=h,n.diffDates=tr,n.diffDayAndTime=bb,n.diffDays=ni,n.diffPoints=fg,n.diffWeeks=wb,n.diffWholeDays=yr,n.diffWholeWeeks=kb,n.disableCursor=au,n.elementClosest=d,n.elementMatches=he,n.enableCursor=vu,n.eventTupleToStore=kr,n.filterEventStoreDefs=ku,n.filterHash=pt,n.findDirectChildren=fb,n.findElements=dt,n.flattenResources=wp,n.flexibleCompare=vc,n.flushToDom=cf,n.formatDate=bst,n.formatDayString=br,n.formatIsoTimeString=fk,n.formatRange=kst,n.getAllowYScrolling=sv,n.getCanVGrowWithinCell=oo,n.getClippingParents=ea,n.getDateMeta=nu,n.getDayClassNames=rr,n.getDefaultEventEnd=fo,n.getElSeg=ir,n.getEntrySpanEnd=va,n.getEventClassNames=ed,n.getIsRtlScrollbarOnLeft=hf,n.getPublicId=cp,n.getRectCenter=ug,n.getRelevantEvents=ge,n.getScrollGridClassNames=yv,n.getScrollbarWidths=ra,n.getSectionClassNames=pv,n.getSectionHasLiquidHeight=es,n.getSegMeta=st,n.getSlotClassNames=ta,n.getStickyFooterScrollbar=yf,n.getStickyHeaderDates=hr,n.getUnequalProps=dc,n.globalLocales=kd,n.globalPlugins=wo,n.greatestDurationDenominator=ii,n.groupIntersectingEntries=ya,n.guid=vt,n.hasBgRendering=nd,n.hasShrinkWidth=vv,n.identity=r,n.interactionSettingsStore=vf,n.interactionSettingsToStore=go,n.intersectRanges=ui,n.intersectRects=dl,n.intersectSpans=ko,n.isArraysEqual=ht,n.isColPropsEqual=cv,n.isDateSelectionValid=bn,n.isDateSpansEqual=sd,n.isGroupsEqual=cut,n.isInt=li,n.isInteractionValid=rs,n.isMultiDayRange=dk,n.isPropsEqual=ut,n.isPropsValid=fv,n.isValidDate=le,n.joinSpans=an,n.listenBySelector=hc,n.mapHash=w,n.memoize=f,n.memoizeArraylike=ye,n.memoizeHashlike=ul,n.memoizeObjArg=yi,n.mergeEventStores=bu,n.multiplyDuration=il,n.padStart=yt,n.parseBusinessHours=kl,n.parseClassNames=du,n.parseDragMeta=ns,n.parseEventDef=nf,n.parseFieldSpecs=ce,n.parseMarker=bd,n.pointInsideRect=ig,n.preventContextMenu=lb,n.preventDefault=lu,n.preventSelection=hb,n.rangeContainsMarker=wt,n.rangeContainsRange=uf,n.rangesEqual=hl,n.rangesIntersect=rf,n.refineEventDef=io,n.refineProps=nr,n.removeElement=vr,n.removeExact=ek,n.render=hg,n.renderChunkContent=hv,n.renderFill=ss,n.renderMicroColGroup=lv,n.renderScrollShim=sr,n.requestJson=po,n.sanitizeShrinkWidth=av,n.setElSeg=cl,n.setRef=g,n.setScrollFromLeftEdge=bit,n.sliceEventStore=ff,n.sliceEvents=sat,n.sortEventSegs=ef,n.startOfDay=a,n.translateRect=gl,n.triggerDateSelect=ll,n.unmountComponentAtNode=lg,n.unpromisify=oa,n.version=ttt,n.whenTransitionDone=sb,n.wholeDivideDurations=ti,Object.defineProperty(n,"__esModule",{value:!0}),n}({}); \ No newline at end of file +var FullCalendar=function(e){"use strict";var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,n)};function n(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n3)for(n=[n],i=3;i0?g(v.type,v.props,v.key,null,v.__v):v)){if(v.__=n,v.__b=n.__b+1,null===(h=D[p])||h&&v.key==h.key&&v.type===h.type)D[p]=void 0;else for(f=0;f3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),L(v(oe,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}(ne.prototype=new y).__e=function(e){var t=this,n=te(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),re(t,e,r)):o()};n?n(i):i()}},ne.prototype.render=function(e){this.u=null,this.o=new Map;var t=R(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},ne.prototype.componentDidUpdate=ne.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){re(e,n,t)}))};var ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,se=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,le=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ue=i.event;function ce(){}function de(){return this.cancelBubble}function pe(){return this.defaultPrevented}i.event=function(e){return ue&&(e=ue(e)),e.persist=ce,e.isPropagationStopped=de,e.isDefaultPrevented=pe,e.nativeEvent=e};var fe={configurable:!0,get:function(){return this.class}},he=i.vnode;i.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!le(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():se.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=R(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=R(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(fe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",fe)),e.$$typeof=ae,he&&he(e)};var ve=i.__r;i.__r=function(e){ve&&ve(e)},"object"==typeof performance&&"function"==typeof performance.now&&performance.now.bind(performance);var ge="undefined"!=typeof globalThis?globalThis:window;ge.FullCalendarVDom?console.warn("FullCalendar VDOM already loaded"):ge.FullCalendarVDom={Component:y,createElement:v,render:L,createRef:function(){return{current:null}},Fragment:m,createContext:function(e){var t=function(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){var e=this,t=!this.getChildContext,r=n.apply(this,arguments);if(t){var o=[];this.shouldComponentUpdate=function(t){e.props.value!==t.value&&o.forEach((function(e){e.context=t.value,e.forceUpdate()}))},this.sub=function(e){o.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){o.splice(o.indexOf(e),1),t&&t.call(e)}}}return r},t},createPortal:function(e,t){return v(ie,{__v:e,i:t})},flushSync:function(e){e();var t=i.debounceRendering,n=[];function r(e){n.push(e)}i.debounceRendering=r,L(v(me,{}),document.createElement("div"));for(;n.length;)n.shift()();i.debounceRendering=t},unmountComponentAtNode:function(e){L(null,e)}};var me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return v("div",{})},t.prototype.componentDidMount=function(){this.setState({})},t}(y);var ye=function(){function e(e,t){this.context=e,this.internalEventSource=t}return e.prototype.remove=function(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"format",{get:function(){return this.internalEventSource.meta.format},enumerable:!1,configurable:!0}),e}();function Ee(e){e.parentNode&&e.parentNode.removeChild(e)}function Se(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(be(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function be(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function De(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o=0;i-=1){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=Et(o))}for(i=e.length-1;i>=0;i-=1){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function St(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function bt(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Dt(e){for(var t={},n=0,r=e;n10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",jt(t,!0)))),r}function Bt(e){return e.toISOString().replace(/T.*$/,"")}function zt(e){return Ze(e.getUTCHours(),2)+":"+Ze(e.getUTCMinutes(),2)+":"+Ze(e.getUTCSeconds(),2)}function jt(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=Math.round(r%60);return t?n+Ze(o,2)+":"+Ze(i,2):"GMT"+n+o+(i?":"+Ze(i,2):"")}function Gt(e,t,n){if(e===t)return!0;var r,o=e.length;if(o!==t.length)return!1;for(r=0;r1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=nn(function(e,t){var n={};for(var r in e)(!(r in Xt)||Xt[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o=Ut(t)&&(r=tt(r,1))}return e.start&&(n=lt(e.start),r&&r<=n&&(r=tt(n,1))),{start:n,end:r}}function Vn(e){var t=Wn(e);return ot(t.start,t.end)>1}function Fn(e,t,n,r){return"year"===r?Nt(n.diffWholeYears(e,t),"year"):"month"===r?Nt(n.diffWholeMonths(e,t),"month"):it(e,t)}function Bn(e,t){var n,r,o=[],i=t.start;for(e.sort(zn),n=0;ni&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return it.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Zn(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=(n||t.end),isToday:t&&Zn(t,r.start)}}function lr(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function ur(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}function cr(e,t){var n=e.eventRange,r=n.def,o=n.instance,i=r.url;if(i)return{href:i};var a=t.emitter,s=t.options.eventInteractive;return null==s&&null==(s=r.interactive)&&(s=Boolean(a.hasHandlers("eventClick"))),s?Oe((function(e){a.trigger("eventClick",{el:e.target,event:new xr(t,r,o),jsEvent:e,view:t.viewApi})})):{}}var dr={start:yn,end:yn,allDay:Boolean};function pr(e,t,n){var o=function(e,t){var n=mn(e,dr),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function fr(e,t){return Gn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function hr(e,t,n){return r(r({},vr(e,t,n)),{timeZone:t.timeZone})}function vr(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function gr(e,t,n){var r=On({editable:!1},n),o=Ln(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:er(o,t),instance:mt(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function mr(e,t,n){n.emitter.trigger("select",r(r({},yr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function yr(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a=0;r-=1){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Le(),sourceDefId:s.sourceDefId,meta:s.meta,ui:kn(i,t),extendedProps:a}}return null}function _r(e){return r(r(r({},_n),wr),e.pluginHooks.eventSourceRefiners)}function Tr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var kr=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=nt(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ft(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?ht(dt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ht(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-pt(ft(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ft(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?pt(ft(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ft(e))*60):new Date(e.valueOf()-(t||0))},e}(),Ur=[],Wr={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},Vr=r(r({},Wr),{buttonHints:{prev:"Previous $0",next:"Next $0",today:function(e,t){return"day"===t?"Today":"This "+e}},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:function(e){return"Show "+e+" more event"+(1===e?"":"s")}});function Fr(e){for(var t=e.length>0?e[0].code:"en",n=Ur.concat(e),r={en:Vr},o=0,i=n;o0;o-=1){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||Vr;return zr(e,n,r)}(e,t):zr(e.code,[e.code],e)}function zr(e,t,n){var r=Et([Wr,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function jr(e){var t=Br(e.locale||"en",Fr([]).map);return new Lr(r(r({timeZone:cn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var Gr,qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function Yr(e,t){return En(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},qr),e)}))}(e),null,t)}function Zr(e,t){return e.left>=t.left&&e.left=t.top&&e.top
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Gr}var eo={defs:{},instances:{}},to=function(){function e(){this.getKeysForEventDefs=qt(this._getKeysForEventDefs),this.splitDateSelection=qt(this._splitDateSpan),this.splitEventStore=qt(this._splitEventStore),this.splitIndividualUi=qt(this._splitIndividualUi),this.splitEventDrag=qt(this._splitInteraction),this.splitEventResize=qt(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=bt(n,(function(e,n){return t.eventUiBuilders[n]||qt(no)})),n){var d=n[c],p=a[c]||eo,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);nn:!!t&&e>=t.end)}}function oo(e,t){var n=["fc-day","fc-day-"+Qe[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}var io=ln({year:"numeric",month:"long",day:"numeric"}),ao=ln({week:"long"});function so(e,t,n,o){void 0===n&&(n="day"),void 0===o&&(o=!0);var i=e.dateEnv,a=e.options,s=e.calendarApi,l=i.format(t,"week"===n?ao:io);if(a.navLinks){var u=i.toDate(t),c=function(e){var r="day"===n?a.navLinkDayClick:"week"===n?a.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return r({title:Xe(a.navLinkHint,[l,u],l),"data-navlink":""},o?He(c):{onClick:c})}return{"aria-label":l}}var lo,uo=null;function co(){return null===uo&&(uo=function(){var e=document.createElement("div");we(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Ee(e),t}()),uo}function po(){return lo||(lo=function(){var e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);var t=fo(e);return document.body.removeChild(e),t}()),lo}function fo(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function ho(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=fo(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return co()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function vo(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():go(e),o=ho(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function go(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function mo(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function yo(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var Eo=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=jn(s,o.range)),s=jn(s=this.adjustActiveRange(s),r),l=qn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=Vt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return Nt({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(Lt(o)<0&&(a=lt(a),a=n.add(a,o)),Lt(i)>1&&(s=tt(s=lt(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&Ut(c)e.fetchRange.end}(e,t,n)})),t,!1,n)}function pi(e,t,n,r,o){var i={};for(var a in e){var s=e[a];t[a]?i[a]=fi(s,n,r,o):i[a]=s}return i}function fi(e,t,n,o){var i=o.options,a=o.calendarApi,s=o.pluginHooks.eventSourceDefs[e.sourceDefId],l=Le();return s.fetch({eventSource:e,range:t,isRefetch:n,context:o},(function(n){var r=n.rawEvents;i.eventSourceSuccess&&(r=i.eventSourceSuccess.call(a,r,n.xhr)||r),e.success&&(r=e.success.call(a,r,n.xhr)||r),o.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(function(n){console.warn(n.message,n),i.eventSourceFailure&&i.eventSourceFailure.call(a,n),e.failure&&e.failure(n),o.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),r(r({},e),{isFetching:!0,latestFetchId:l})}function hi(e,t){return St(e,(function(e){return vi(e,t)}))}function vi(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function gi(e,t,n,r,o){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,o,i){if(t&&n===t.latestFetchId){var a=En(function(e,t,n){var r=n.options.eventDataTransform,o=t?t.eventDataTransform:null;o&&(e=mi(e,o));r&&(e=mi(e,r));return e}(o,t,i),t,i);return r&&(a=xt(a,r,i)),Cn(yi(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,o);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=xt(t,n,r));return Cn(e,t)}(e,t.eventStore,r?r.activeRange:null,o);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Cn(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?xt(e,r.activeRange,o):e;case"REMOVE_EVENTS":return function(e,t){var n=e.defs,r=e.instances,o={},i={};for(var a in n)t.defs[a]||(o[a]=n[a]);for(var s in r)!t.instances[s]&&o[r[s].defId]&&(i[s]=r[s]);return{defs:o,instances:i}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return yi(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return wn(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function mi(e,t){var n;if(t){n=[];for(var r=0,o=e;r=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Ti(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function ki(e,t){for(var n=Ct(t.getCurrentData().eventSources),r=[],o=0,i=e;o1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var Ni=function(){function e(e){var t=this;this.computeOptionsData=qt(this._computeOptionsData),this.computeCurrentViewData=qt(this._computeCurrentViewData),this.organizeRawLocales=qt(Fr),this.buildLocale=qt(Br),this.buildPluginHooks=jo(),this.buildDateEnv=qt(Hi),this.buildTheme=qt(Oi),this.parseToolbars=qt(Ci),this.buildViewSpecs=qt(oi),this.buildDateProfileGenerator=Yt(Ai),this.buildViewApi=qt(Li),this.buildViewUiProps=Yt(Vi),this.buildEventUiBySource=qt(Ui,wt),this.buildEventUiBases=qt(Wi),this.parseContextBusinessHours=Yt(Bi),this.buildTitle=qt(Pi),this.emitter=new Eo,this.actionRunner=new Ii(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Tr(s.now,l)),d=a.dateProfileGenerator.build(c);Zn(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;fs.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:a.end}},i)),r?(n.push.apply(n,o([{index:e.index,thickness:e.thickness,span:$i(s,a)}],i)),r):(n.push(e),0)},e.prototype.insertEntryAt=function(e,t){var n=this.entriesByLevel,r=this.levelCoords;-1===t.lateral?(Ji(r,t.level,t.levelCoord),Ji(n,t.level,[e])):Ji(n[t.level],t.lateral,e),this.stackCnts[Zi(e)]=t.stackCnt},e.prototype.findInsertion=function(e){for(var t=this,n=t.levelCoords,r=t.entriesByLevel,o=t.strictOrder,i=t.stackCnts,a=n.length,s=0,l=-1,u=-1,c=null,d=0,p=0;p=s+e.thickness)break;for(var h=r[p],v=void 0,g=Qi(h,e.span.start,Yi),m=g[0]+g[1];(v=h[m])&&v.span.starts&&(s=y,c=v,l=p,u=m),y===s&&(d=Math.max(d,i[Zi(v)]+1)),m+=1}}var E=0;if(c)for(E=l+1;En(e[o-1]))return[o,0];for(;ra))return[i,1];r=i+1}}return[r,0]}var ea=function(){function e(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}return e.prototype.destroy=function(){},e}();function ta(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}function na(e){var t;return(t={})[e.component.uid]=e,t}var ra={},oa=function(){function e(e,t){this.emitter=new Eo}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),ia={},aa={startTime:Nt,duration:Nt,create:Boolean,sourceId:String};function sa(e){var t=mn(e,aa),n=t.refined,r=t.extra;return{startTime:n.startTime||null,duration:n.duration||null,create:null==n.create||n.create,sourceId:n.sourceId,leftoverProps:r}}var la=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props.widgetGroups.map((function(t){return e.renderWidgetGroup(t)}));return _o.apply(void 0,o(["div",{className:"fc-toolbar-chunk"}],t))},t.prototype.renderWidgetGroup=function(e){for(var t=this.props,n=this.context.theme,r=[],i=!0,a=0,s=e;a1){var m=i&&n.getClass("buttonGroup")||"";return _o.apply(void 0,o(["div",{className:m}],r))}return r[0]},t}(Uo),ua=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.sectionWidgets,s=a.center;return a.left?(i=!0,e=a.left):e=a.start,a.right?(i=!0,t=a.right):t=a.end,_o("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return _o(la,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})},t}(Uo),ca=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(e){t.el=e,Fo(t.props.elRef,e),t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=e.aspectRatio,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",i="";return n?null!==t.availableWidth?o=t.availableWidth/n:i=1/n*100+"%":o=e.height||"",_o("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:o,paddingBottom:i}},e.children)},t.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},t.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},t}(Uo),da=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=Jn(t);if(i&&r.isValidSegDownEl(e.target)){var a=Se(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new xr(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=Ie(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(ea),pa=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){Jn(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,Ie(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=Jn(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new xr(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(ea),fa=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=qt(Ao),t.buildViewPropTransformers=qt(va),t.buildToolbarProps=qt(ha),t.headerRef=ko(),t.footerRef=ko(),t.interactionsStore={},t.state={viewLabelId:xe()},t.registerInteractiveComponent=function(e,n){var r=ta(e,n),o=[da,pa].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,ra[e.uid]=r},t.unregisterInteractiveComponent=function(e){var n=t.interactionsStore[e.uid];if(n){for(var r=0,o=n;r10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var ya="fc-col-header-cell";function Ea(e){return e.text}var Sa=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=ro(s,a.todayRange,null,l),c=[ya].concat(oo(u,o)),d=t.format(s,a.dayHeaderFormat),p=!u.isDisabled&&a.colCnt>1?so(this.context,s):{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return _o(Yo,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:Ea,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return _o("th",r({ref:e,role:"columnheader",className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:Bt(s),colSpan:a.colSpan},a.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&_o("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(Uo),ba=ln({weekday:"long"}),Da=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=tt(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[ya].concat(oo(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return _o(Yo,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:Ea,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,o,i,a){return _o("th",r({ref:t,role:"columnheader",className:u.concat(o).join(" "),colSpan:e.colSpan},e.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},_o("a",{"aria-label":n.format(s,ba),className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:i},a)))}))},t}(Uo),Ca=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Tr(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=nt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,Nt(1,e.unit)),i=o.valueOf()-n.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:r,todayRange:wa(r)},nextState:{nowDate:o,todayRange:wa(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=Oo,t}(Ro);function wa(e){var t=lt(e);return{start:t,end:tt(t,1)}}var Ra=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=qt(_a),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return _o(Ca,{unit:"day"},(function(e,t){return _o("tr",{role:"row"},i&&i("day"),n.map((function(e){return o?_o(Sa,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):_o(Da,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(Uo);function _a(e,t,n){return e||ma(t,n)}var Ta=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),ka=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;nt)return!0}return!1},t.prototype.needsYScrolling=function(){if(Wa.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;rt)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Wa.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Wa.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(Uo),Fa=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):(o[n]-=1,o[n]||(delete i[n],delete t.callbackMap[n],a=!0)),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return kt(this.currentMap,e,t,n)},e.prototype.getAll=function(){return Ct(this.currentMap)},e}();function Ba(e){for(var t=0,n=0,r=De(e,".fc-scrollgrid-shrink");n=0&&e=0&&tt.eventRange.range.end?e:t}var Cs=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this)||this;return o.isRendering=!1,o.isRendered=!1,o.currentClassNames=[],o.customContentRenderId=0,o.handleAction=function(e){switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":o.renderRunner.tryDrain()}},o.handleData=function(e){o.currentData=e,o.renderRunner.request(e.calendarOptions.rerenderDelay)},o.handleRenderRequest=function(){if(o.isRendering){o.isRendered=!0;var e=o.currentData;Po((function(){To(_o(ga,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(function(t,n,i,a){return o.setClassNames(t),o.setHeight(n),_o(Zo.Provider,{value:o.customContentRenderId},_o(fa,r({isHeightAuto:i,forPrint:a},e)))})),o.el)}))}else o.isRendered&&(o.isRendered=!1,No(o.el),o.setClassNames([]),o.setHeight(""))},o.el=t,o.renderRunner=new Mi(o.handleRenderRequest),new Ni({optionOverrides:n,calendarApi:o,onAction:o.handleAction,onData:o.handleData}),o}return n(t,e),Object.defineProperty(t.prototype,"view",{get:function(){return this.currentData.viewApi},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()},t.prototype.destroy=function(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())},t.prototype.updateSize=function(){var t=this;Po((function(){e.prototype.updateSize.call(t)}))},t.prototype.batchRendering=function(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")},t.prototype.pauseRendering=function(){this.renderRunner.pause("pauseRendering")},t.prototype.resumeRendering=function(){this.renderRunner.resume("pauseRendering",!0)},t.prototype.resetOptions=function(e,t){this.currentDataManager.resetOptions(e,t)},t.prototype.setClassNames=function(e){if(!Gt(e,this.currentClassNames)){for(var t=this.el.classList,n=0,r=this.currentClassNames;n0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Ns()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(e){return this.queryScrollEls(e).map((function(e){return e===window?new Ps(!1):new Is(e,!1)}))},e.prototype.queryScrollEls=function(e){for(var t=[],n=0,r=this.scrollQuery;n=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,Fe(document.body),ze(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new Ts(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new xs,r.autoScroller=new Hs,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(oa),As=function(){function e(e){this.origRect=go(e),this.scrollCaches=mo(e).map((function(e){return new Is(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&c=0&&do.layer)&&(v.componentId=i,v.context=a.context,v.rect.left+=l,v.rect.right+=l,v.rect.top+=u,v.rect.bottom+=u,o=v)}}}return o},e}();function Us(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&fr(e.dateSpan,t.dateSpan)}function Ws(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;ar.start)return{endDelta:s};return null}(a,e,r.subjectEl.classList.contains("fc-event-resizer-start"),s.range)));l&&(u=Sr(i,o.getCurrentData().eventUiBases,l,o),d.mutatedEvents=u,Ia(d,e.dateProfile,o)||(c=!0,l=null,u=null,d.mutatedEvents=null)),u?o.dispatch({type:"SET_EVENT_RESIZE",state:d}):o.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Ue():We(),t||(l&&Us(a,e)&&(l=null),n.validMutation=l,n.mutatedRelevantEvents=u)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new xr(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new xr(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:Ir(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||Nt(0),endDelta:n.validMutation.endDelta||Nt(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Os(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new Ls(n.dragging,na(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return Se(e.subjectEl,".fc-event")},t}(ea);var js=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=function(e){var n=t.context.options.unselectCancel,r=_e(e.origEvent);t.matchesCancel=!!Se(r,n),t.matchesEvent=!!Se(r,Bs.SELECTOR)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto;!i||i&&t.matchesCancel||n.calendarApi.unselect(e)}o.eventSelection&&!t.matchesEvent&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new Ts(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerdown",this.onDocumentPointerDown),n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),Gs={fixedMirrorParent:yn},qs={dateClick:yn,eventDragStart:yn,eventDragStop:yn,eventDrop:yn,eventResizeStart:yn,eventResizeStop:yn,eventResize:yn,drop:yn,eventReceive:yn,eventLeave:yn},Ys=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;i1,S=y.span.start===s;d+=y.levelCoord-c,c=y.levelCoord+y.thickness,E?(d+=y.thickness,S&&v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:y.levelCoord,marginTop:0})):S&&(v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:y.levelCoord,marginTop:d}),d=0)}o.push(u),i.push(v),a.push(d)}return{singleColPlacements:o,multiColPlacements:i,leftoverMargins:a}}(s.toRects(),e,a),h=f.singleColPlacements,v=f.multiColPlacements,g=f.leftoverMargins,m=[],y=[],E=0,S=u;E1,showWeekNumbers:t.showWeekNumbers,todayRange:h,dateProfile:n,cells:i,renderIntro:t.renderRowIntro,businessHourSegs:s[f],eventSelection:t.eventSelection,bgEventSegs:l[f].filter(yl),fgEventSegs:u[f],dateSelectionSegs:c[f],eventDrag:d[f],eventResize:p[f],dayMaxEvents:o,dayMaxEventRows:r,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:t.forPrint})})))))})))},t.prototype.prepareHits=function(){this.rowPositions=new So(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new So(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.queryHit=function(e,t){var n=this.colPositions,o=this.rowPositions,i=n.leftToIndex(e),a=o.topToIndex(t);if(null!=a&&null!=i){var s=this.props.cells[a][i];return{dateProfile:this.props.dateProfile,dateSpan:r({range:this.getCellRange(a,i),allDay:!0},s.extraDateSpan),dayEl:this.getCellEl(a,i),rect:{left:n.lefts[i],right:n.rights[i],top:o.tops[a],bottom:o.bottoms[a]},layer:0}}return null},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:tt(n,1)}},t}(Bo);function yl(e){return e.eventRange.def.allDay}var El=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(xa),Sl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new El,t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return _o(ml,r({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t}(Bo),bl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=qt(Dl),t.headerRef=ko(),t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&_o(Ra,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return _o(Sl,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(Js);function Dl(e,t){var n=new Ta(e.renderRange,t);return new ka(n,/year|month|week/.test(e.currentRangeUnit))}var Cl=zo({initialView:"dayGridMonth",views:{dayGrid:{component:bl,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=et(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=et(l,6-Math.ceil(rt(s,l))));return{start:s,end:l}},t}(ai)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),wl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?Kn(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(to),Rl=ln({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function _l(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return _o(Oo.Consumer,null,(function(n){if(!e.isLabeled)return _o("td",{className:t.join(" "),"data-time":e.isoTimeStr});var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Rl:Array.isArray(o.slotLabelFormat)?ln(o.slotLabelFormat[0]):ln(o.slotLabelFormat),s={level:0,time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return _o(Yo,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:Tl,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return _o("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},_o("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},_o("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}))}function Tl(e){return e.text}var kl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return _o("tr",{key:e.key},_o(_l,r({},e)))}))},t}(Uo),xl=ln({week:"short"}),Ml=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new wl,t.headerElRef=ko(),t.rootElRef=ko(),t.scrollerElRef=ko(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e,n){void 0===n&&(n="");var o=t.context.options,i=t.props.dateProfile.renderRange,a=1===ot(i.start,i.end)?so(t.context,i.start,"week"):{};return o.weekNumbers&&"day"===e?_o(fs,{date:i.start,defaultFormat:xl},(function(e,t,o,i){return _o("th",{ref:e,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(t).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:n}},_o("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},a),i)))})):_o("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},_o("div",{className:"fc-timegrid-axis-frame",style:{height:n}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return _o(Yo,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Il,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return _o("td",{ref:t,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},_o("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=Qa(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),_o(ti,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(ts,{liquid:!o.isHeightAuto&&!o.forPrint,collapsibleWidth:o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&Qa(u.options),p=!c.forPrint&&es(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderHeadAxis("day",e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return _o("div",{className:"fc-timegrid-axis-chunk"},_o("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,_o("tbody",null,_o(kl,{slatMetas:i}))),_o("div",{className:"fc-timegrid-now-indicator-container"},_o(Ca,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);return"number"==typeof t?_o(is,{isAxis:!0,date:e},(function(e,n,r,o){return _o("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)})):null}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:Ja},{key:"cols",content:Ja}]}),_o(ti,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(l,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}(Bo);function Il(e){return e.text}var Pl=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(Zn(t.currentRange,e)){var n=lt(e),r=e.valueOf()-n.valueOf();if(r>=Ut(t.slotMinTime)&&r0,E=Boolean(l)&&l.span.end-l.span.start=0;t-=1)if(null!==(r=Wt(n=Nt(ru[t]),e))&&r>1)return n;return e}(r),u=[];Ut(a)0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return _o(Yo,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:hu,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return _o("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},_o("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=this.state,s=a.timeHeaderId,l=a.eventHeaderId,u=a.dateHeaderIdRoot,c=function(e){var t,n,r=[];for(t=0;t table { + height: 100%; + } +.fc { + + /* border for both header AND body cells */ + +} +.fc .fc-timeline-slot-minor { + border-style: dotted; + } +.fc { + + /* header cells (aka "label") */ + +} +.fc .fc-timeline-slot-frame { + display: flex; + align-items: center; /* vertical align */ + justify-content: center; /* horizontal align */ + overflow: hidden; /* important so text doesn't bleed out and cause extra scroll */ + } +.fc .fc-timeline-header-row-chrono { /* a row of times */ + } +.fc .fc-timeline-header-row-chrono .fc-timeline-slot-frame { + justify-content: flex-start; /* horizontal align left or right */ + } +.fc .fc-timeline-slot-cushion { + padding: 4px 5px; /* TODO: unify with fc-col-header? */ + white-space: normal; + } +.fc { + + /* NOTE: how does the top row of cells get horizontally centered? */ + /* for the non-chrono-row, the fc-sticky system looks for text-align center, */ + /* and it's a fluke that the default browser stylesheet already does this for */ + /* TODO: have StickyScrolling look at natural left coord to detect centeredness. */ + +} +/* only owns one side, so can do dotted */ +.fc-direction-ltr .fc-timeline-slot { border-right: 0 !important } +.fc-direction-rtl .fc-timeline-slot { border-left: 0 !important } +.fc .fc-timeline-now-indicator-container { + position: absolute; + z-index: 4; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 0; + } +.fc .fc-timeline-now-indicator-arrow, + .fc .fc-timeline-now-indicator-line { + position: absolute; + top: 0; + border-style: solid; + border-color: red; + border-color: var(--fc-now-indicator-color, red); + } +.fc .fc-timeline-now-indicator-arrow { + margin: 0 -6px; /* 5, then one more to counteract scroller's negative margins */ + + /* triangle pointing down. TODO: mixin */ + border-width: 6px 5px 0 5px; + border-left-color: transparent; + border-right-color: transparent; + } +.fc .fc-timeline-now-indicator-line { + margin: 0 -1px; /* counteract scroller's negative margins */ + bottom: 0; + border-width: 0 0 0 1px; + } +.fc { + + /* container */ + +} +.fc .fc-timeline-events { + position: relative; + z-index: 3; + width: 0; /* for event positioning. will end up on correct side based on dir */ + } +.fc { + + /* harness */ + +} +.fc .fc-timeline-event-harness, + .fc .fc-timeline-more-link { + position: absolute; + top: 0; /* for when when top can't be computed yet */ + /* JS will set tht left/right */ + } +/* z-index, scoped within fc-timeline-events */ +.fc-timeline-event { z-index: 1 } +.fc-timeline-event.fc-event-mirror { z-index: 2 } +.fc-timeline-event { + position: relative; /* contains things. TODO: make part of fc-h-event and fc-v-event */ + display: flex; /* for v-aligning start/end arrows and making fc-event-main stretch all the way */ + align-items: center; + border-radius: 0; + padding: 2px 1px; + margin-bottom: 1px; + font-size: .85em; + font-size: var(--fc-small-font-size, .85em) + + /* time and title spacing */ + /* ---------------------------------------------------------------------------------------------------- */ +} +.fc-timeline-event .fc-event-main { + flex-grow: 1; + flex-shrink: 1; + min-width: 0; /* important for allowing to shrink all the way */ + } +.fc-timeline-event .fc-event-time { + font-weight: bold; + } +.fc-timeline-event .fc-event-time, + .fc-timeline-event .fc-event-title { + white-space: normal; + padding: 0 2px; + } +/* move 1px away from slot line */ +.fc-direction-ltr .fc-timeline-event.fc-event-end, + .fc-direction-ltr .fc-timeline-more-link { + margin-right: 1px; + } +.fc-direction-rtl .fc-timeline-event.fc-event-end, + .fc-direction-rtl .fc-timeline-more-link { + margin-left: 1px; + } +/* make event beefier when overlap not allowed */ +.fc-timeline-overlap-disabled .fc-timeline-event { + padding-top: 5px; + padding-bottom: 5px; + margin-bottom: 0; +} +/* arrows indicating the event continues into past/future */ +/* ---------------------------------------------------------------------------------------------------- */ +/* part of the flexbox flow */ +.fc-timeline-event:not(.fc-event-start):before, +.fc-timeline-event:not(.fc-event-end):after { + content: ""; + flex-grow: 0; + flex-shrink: 0; + opacity: .5; + + /* triangle. TODO: mixin */ + width: 0; + height: 0; + margin: 0 1px; + border: 5px solid #000; /* TODO: var */ + border-top-color: transparent; + border-bottom-color: transparent; +} +/* pointing left */ +.fc-direction-ltr .fc-timeline-event:not(.fc-event-start):before, +.fc-direction-rtl .fc-timeline-event:not(.fc-event-end):after { + border-left: 0; +} +/* pointing right */ +.fc-direction-ltr .fc-timeline-event:not(.fc-event-end):after, +.fc-direction-rtl .fc-timeline-event:not(.fc-event-start):before { + border-right: 0; +} +/* +more events indicator */ +/* ---------------------------------------------------------------------------------------------------- */ +.fc-timeline-more-link { + font-size: .85em; + font-size: var(--fc-small-font-size, .85em); + color: inherit; + color: var(--fc-more-link-text-color, inherit); + background: #d0d0d0; + background: var(--fc-more-link-bg-color, #d0d0d0); + padding: 1px; + cursor: pointer; +} +.fc-timeline-more-link-inner { /* has fc-sticky */ + display: inline-block; + left: 0; + right: 0; + padding: 2px; +} +.fc .fc-timeline-bg { /* a container for bg content */ + position: absolute; + z-index: 2; + top: 0; + bottom: 0; + width: 0; + left: 0; /* will take precedence when LTR */ + right: 0; /* will take precedence when RTL */ /* TODO: kill */ + } +.fc .fc-timeline-bg .fc-non-business { z-index: 1 } +.fc .fc-timeline-bg .fc-bg-event { z-index: 2 } +.fc .fc-timeline-bg .fc-highlight { z-index: 3 } +.fc .fc-timeline-bg-harness { + position: absolute; + top: 0; + bottom: 0; + } + + + + + .fc .fc-resource-timeline-divider { + width: 3px; /* important to have width to shrink this cell. no cross-browser problems */ + cursor: col-resize; + } + +.fc { + + + /* will match horizontal groups in the datagrid AND group lanes in the timeline area */ + +} + +.fc .fc-resource-timeline .fc-resource-group:not([rowspan]) { + background: rgba(208, 208, 208, 0.3); + background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); + } + +.fc .fc-timeline-lane-frame { + position: relative; /* contains the fc-timeline-bg container, which liquidly expands */ + /* the height is explicitly set by row-height-sync */ + } + +.fc .fc-timeline-overlap-enabled .fc-timeline-lane-frame .fc-timeline-events { /* has height set on it */ + box-sizing: content-box; /* padding no longer part of height */ + padding-bottom: 10px; /* give extra spacing underneath for selecting */ + } + +/* hack to make bg expand to lane's full height in resource-timeline with expandRows (#6134) */ +.fc-timeline-body-expandrows td.fc-timeline-lane { + position: relative; + } +.fc-timeline-body-expandrows .fc-timeline-lane-frame { + position: static; + } +/* the "frame" */ +.fc-datagrid-cell-frame-liquid { + height: 100%; /* needs liquid hack */ +} +.fc-liquid-hack .fc-datagrid-cell-frame-liquid { + height: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } +.fc { + + /* the "frame" in a HEADER */ + /* needs to position the column resizer */ + /* needs to vertically center content */ + +} +.fc .fc-datagrid-header .fc-datagrid-cell-frame { + position: relative; /* for resizer */ + display: flex; + justify-content: flex-start; /* horizontal align (natural left/right) */ + align-items: center; /* vertical align */ + } +.fc { + + /* the column resizer (only in HEADER) */ + +} +.fc .fc-datagrid-cell-resizer { + position: absolute; + z-index: 1; + top: 0; + bottom: 0; + width: 5px; + cursor: col-resize; + } +.fc { + + /* the cushion */ + +} +.fc .fc-datagrid-cell-cushion { + padding: 8px; + white-space: normal; + overflow: hidden; /* problem for col resizer :( */ + } +.fc { + + /* expander icons */ + +} +.fc .fc-datagrid-expander { + cursor: pointer; + opacity: 0.65 + + } +.fc .fc-datagrid-expander .fc-icon { /* the expander and spacers before the expander */ + display: inline-block; + width: 1em; /* ensure constant width, esp for empty icons */ + } +.fc .fc-datagrid-expander-placeholder { + cursor: auto; + } +.fc .fc-resource-timeline-flat .fc-datagrid-expander-placeholder { + display: none; + } +.fc-direction-ltr .fc-datagrid-cell-resizer { right: -3px } +.fc-direction-rtl .fc-datagrid-cell-resizer { left: -3px } +.fc-direction-ltr .fc-datagrid-expander { margin-right: 3px } +.fc-direction-rtl .fc-datagrid-expander { margin-left: 3px } diff --git a/app/assets/stylesheets/property_hire_fullcalendar.css b/app/assets/stylesheets/property_hire_fullcalendar.css index a0416d0..475287b 100644 --- a/app/assets/stylesheets/property_hire_fullcalendar.css +++ b/app/assets/stylesheets/property_hire_fullcalendar.css @@ -1,13 +1,12 @@ /* classes attached to */ -.table-bordered th, .table-bordered td { - border: 1px solid #dee2e6; -} +/* TODO: make fc-event selector work when calender in shadow DOM */ .fc-not-allowed, .fc-not-allowed .fc-event { /* override events' custom cursors */ cursor: not-allowed; } +/* TODO: not attached to body. attached to specific els. move */ .fc-unselectable { -webkit-user-select: none; -moz-user-select: none; @@ -531,14 +530,17 @@ a.fc-event:hover { bottom: -20px; } /* selecting (always TOUCH) */ +/* OR, focused by tab-index */ +/* (TODO: maybe not the best focus-styling for .fc-daygrid-dot-event) */ /* ---------------------------------------------------------------------------------------------------- */ -.fc-event-selected { +.fc-event-selected, +.fc-event:focus { box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2) /* expand hit area (subclasses should expand) */ } -.fc-event-selected:before { +.fc-event-selected:before, .fc-event:focus:before { content: ""; position: absolute; z-index: 3; @@ -547,12 +549,13 @@ a.fc-event:hover { right: 0; bottom: 0; } -.fc-event-selected { +.fc-event-selected, +.fc-event:focus { /* dimmer effect */ } -.fc-event-selected:after { +.fc-event-selected:after, .fc-event:focus:after { content: ""; background: rgba(0, 0, 0, 0.25); background: var(--fc-event-selected-overlay-color, rgba(0, 0, 0, 0.25)); @@ -631,29 +634,29 @@ A HORIZONTAL event .fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end { cursor: w-resize; left: -4px; - left: calc(var(--fc-event-resizer-thickness, 8px) / -2); + left: calc(-0.5 * var(--fc-event-resizer-thickness, 8px)); } .fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end, .fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start { cursor: e-resize; right: -4px; - right: calc(var(--fc-event-resizer-thickness, 8px) / -2); + right: calc(-0.5 * var(--fc-event-resizer-thickness, 8px)); } /* resizers for TOUCH */ .fc-h-event.fc-event-selected .fc-event-resizer { top: 50%; margin-top: -4px; - margin-top: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2); + margin-top: calc(-0.5 * var(--fc-event-resizer-dot-total-width, 8px)); } .fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start, .fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end { left: -4px; - left: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2); + left: calc(-0.5 * var(--fc-event-resizer-dot-total-width, 8px)); } .fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end, .fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start { right: -4px; - right: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2); + right: calc(-0.5 * var(--fc-event-resizer-dot-total-width, 8px)); } .fc .fc-popover { position: absolute; @@ -1136,14 +1139,14 @@ A VERTICAL event min-height: 100%; /* liquid-hack is below */ position: relative; } -.fc-liquid-hack .fc-timegrid-col-frame { +.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame { height: auto; position: absolute; top: 0; right: 0; bottom: 0; left: 0; - } + } .fc-media-screen .fc-timegrid-cols { position: absolute; /* no z-index. children will decide and go above slots */ top: 0; @@ -1360,6 +1363,23 @@ A VERTICAL event background: #fff; background: var(--fc-page-bg-color, #fff); /* for when headers are styled to be transparent and sticky */ } +.fc { + + /* only exists for aria reasons, hide for non-screen-readers */ + +} +.fc .fc-list-table thead { + position: absolute; + left: -10000px; + } +.fc { + + /* the table's border-style:hidden gets confused by hidden thead. force-hide top border of first cell */ + +} +.fc .fc-list-table tbody > tr:first-child th { + border-top: 0; + } .fc .fc-list-table th { padding: 0; /* uses an inner-wrapper instead... */ } @@ -1447,365 +1467,28 @@ A VERTICAL event - .fc .fc-event, - .fc .fc-scrollgrid table tr { - -moz-column-break-inside: avoid; - break-inside: avoid; + .fc-theme-bootstrap5 a:not([href]) { + color: inherit; + text-decoration: inherit; } -.fc-media-print { - display: block; /* undo flexbox. FF doesn't know how to flow */ - max-width: 100% /* width will be hardcoded too */ +.fc-theme-bootstrap5 .fc-list, + .fc-theme-bootstrap5 .fc-scrollgrid, + .fc-theme-bootstrap5 td, + .fc-theme-bootstrap5 th { + border: 1px solid var(--bs-gray-400); + } + +.fc-theme-bootstrap5 { + + /* HACK: reapply core styles after highe-precedence border statement above */ } -.fc-media-print .fc-timegrid-slots, - .fc-media-print .fc-timegrid-axis-chunk, - .fc-media-print .fc-timeline-slots, - .fc-media-print .fc-non-business, - .fc-media-print .fc-bg-event { - display: none; +.fc-theme-bootstrap5 .fc-scrollgrid { + border-right-width: 0; + border-bottom-width: 0; } -.fc-media-print .fc-toolbar button, - .fc-media-print .fc-h-event, - .fc-media-print .fc-v-event { - color: #000 !important; - background: #fff !important; - } - -.fc-media-print .fc-event, - .fc-media-print .fc-event-main { /* often controls the text-color */ - color: #000 !important; - } - -.fc-media-print .fc-timegrid-event { - margin: 0.5em 0; - } - - - - .fc .fc-timeline-body { - min-height: 100%; - position: relative; - z-index: 1; /* scope slots, bg, etc */ - } -/* -vertical slots in both the header AND the body -*/ -.fc .fc-timeline-slots { - position: absolute; - z-index: 1; - top: 0; - bottom: 0 - } -.fc .fc-timeline-slots > table { - height: 100%; - } -.fc { - - /* border for both header AND body cells */ - -} -.fc .fc-timeline-slot-minor { - border-style: dotted; - } -.fc { - - /* header cells (aka "label") */ - -} -.fc .fc-timeline-slot-frame { - display: flex; - align-items: center; /* vertical align */ - justify-content: center; /* horizontal align */ - overflow: hidden; /* important so text doesn't bleed out and cause extra scroll */ - } -.fc .fc-timeline-header-row-chrono { /* a row of times */ - } -.fc .fc-timeline-header-row-chrono .fc-timeline-slot-frame { - justify-content: flex-start; /* horizontal align left or right */ - } -.fc .fc-timeline-slot-cushion { - padding: 4px 5px; /* TODO: unify with fc-col-header? */ - white-space: normal; - } -.fc { - - /* NOTE: how does the top row of cells get horizontally centered? */ - /* for the non-chrono-row, the fc-sticky system looks for text-align center, */ - /* and it's a fluke that the default browser stylesheet already does this for */ - /* TODO: have StickyScrolling look at natural left coord to detect centeredness. */ - -} -/* only owns one side, so can do dotted */ -.fc-direction-ltr .fc-timeline-slot { border-right: 0 !important } -.fc-direction-rtl .fc-timeline-slot { border-left: 0 !important } -.fc .fc-timeline-now-indicator-container { - position: absolute; - z-index: 4; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 0; - } -.fc .fc-timeline-now-indicator-arrow, - .fc .fc-timeline-now-indicator-line { - position: absolute; - top: 0; - border-style: solid; - border-color: red; - border-color: var(--fc-now-indicator-color, red); - } -.fc .fc-timeline-now-indicator-arrow { - margin: 0 -6px; /* 5, then one more to counteract scroller's negative margins */ - - /* triangle pointing down. TODO: mixin */ - border-width: 6px 5px 0 5px; - border-left-color: transparent; - border-right-color: transparent; - } -.fc .fc-timeline-now-indicator-line { - margin: 0 -1px; /* counteract scroller's negative margins */ - bottom: 0; - border-width: 0 0 0 1px; - } -.fc { - - /* container */ - -} -.fc .fc-timeline-events { - position: relative; - z-index: 3; - width: 0; /* for event positioning. will end up on correct side based on dir */ - } -.fc { - - /* harness */ - -} -.fc .fc-timeline-event-harness, - .fc .fc-timeline-more-link { - position: absolute; - top: 0; /* for when when top can't be computed yet */ - /* JS will set tht left/right */ - } -/* z-index, scoped within fc-timeline-events */ -.fc-timeline-event { z-index: 1 } -.fc-timeline-event.fc-event-mirror { z-index: 2 } -.fc-timeline-event { - position: relative; /* contains things. TODO: make part of fc-h-event and fc-v-event */ - display: flex; /* for v-aligning start/end arrows and making fc-event-main stretch all the way */ - align-items: center; - border-radius: 0; - padding: 2px 1px; - margin-bottom: 1px; - font-size: .85em; - font-size: var(--fc-small-font-size, .85em) - - /* time and title spacing */ - /* ---------------------------------------------------------------------------------------------------- */ -} -.fc-timeline-event .fc-event-main { - flex-grow: 1; - flex-shrink: 1; - min-width: 0; /* important for allowing to shrink all the way */ - } -.fc-timeline-event .fc-event-time { - font-weight: bold; - } -.fc-timeline-event .fc-event-time, - .fc-timeline-event .fc-event-title { - white-space: normal; - padding: 0 2px; - } -/* move 1px away from slot line */ -.fc-direction-ltr .fc-timeline-event.fc-event-end, - .fc-direction-ltr .fc-timeline-more-link { - margin-right: 1px; - } -.fc-direction-rtl .fc-timeline-event.fc-event-end, - .fc-direction-rtl .fc-timeline-more-link { - margin-left: 1px; - } -/* make event beefier when overlap not allowed */ -.fc-timeline-overlap-disabled .fc-timeline-event { - padding-top: 5px; - padding-bottom: 5px; - margin-bottom: 0; -} -/* arrows indicating the event continues into past/future */ -/* ---------------------------------------------------------------------------------------------------- */ -/* part of the flexbox flow */ -.fc-timeline-event:not(.fc-event-start):before, -.fc-timeline-event:not(.fc-event-end):after { - content: ""; - flex-grow: 0; - flex-shrink: 0; - opacity: .5; - - /* triangle. TODO: mixin */ - width: 0; - height: 0; - margin: 0 1px; - border: 5px solid #000; /* TODO: var */ - border-top-color: transparent; - border-bottom-color: transparent; -} -/* pointing left */ -.fc-direction-ltr .fc-timeline-event:not(.fc-event-start):before, -.fc-direction-rtl .fc-timeline-event:not(.fc-event-end):after { - border-left: 0; -} -/* pointing right */ -.fc-direction-ltr .fc-timeline-event:not(.fc-event-end):after, -.fc-direction-rtl .fc-timeline-event:not(.fc-event-start):before { - border-right: 0; -} -/* +more events indicator */ -/* ---------------------------------------------------------------------------------------------------- */ -.fc-timeline-more-link { - font-size: .85em; - font-size: var(--fc-small-font-size, .85em); - color: inherit; - color: var(--fc-more-link-text-color, inherit); - background: #d0d0d0; - background: var(--fc-more-link-bg-color, #d0d0d0); - padding: 1px; - cursor: pointer; -} -.fc-timeline-more-link-inner { /* has fc-sticky */ - display: inline-block; - left: 0; - right: 0; - padding: 2px; -} -.fc .fc-timeline-bg { /* a container for bg content */ - position: absolute; - z-index: 2; - top: 0; - bottom: 0; - width: 0; - left: 0; /* will take precedence when LTR */ - right: 0; /* will take precedence when RTL */ /* TODO: kill */ - } -.fc .fc-timeline-bg .fc-non-business { z-index: 1 } -.fc .fc-timeline-bg .fc-bg-event { z-index: 2 } -.fc .fc-timeline-bg .fc-highlight { z-index: 3 } -.fc .fc-timeline-bg-harness { - position: absolute; - top: 0; - bottom: 0; - } - - - - - .fc .fc-resource-timeline-divider { - width: 3px; /* important to have width to shrink this cell. no cross-browser problems */ - cursor: col-resize; - } - -.fc { - - - /* will match horizontal groups in the datagrid AND group lanes in the timeline area */ - -} - -.fc .fc-resource-timeline .fc-resource-group:not([rowspan]) { - background: rgba(208, 208, 208, 0.3); - background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3)); - } - -.fc .fc-timeline-lane-frame { - position: relative; /* contains the fc-timeline-bg container, which liquidly expands */ - /* the height is explicitly set by row-height-sync */ - } - -.fc .fc-timeline-overlap-enabled .fc-timeline-lane-frame .fc-timeline-events { /* has height set on it */ - box-sizing: content-box; /* padding no longer part of height */ - padding-bottom: 10px; /* give extra spacing underneath for selecting */ - } - -/* hack to make bg expand to lane's full height in resource-timeline with expandRows (#6134) */ -.fc-timeline-body-expandrows td.fc-timeline-lane { - position: relative; - } -.fc-timeline-body-expandrows .fc-timeline-lane-frame { - position: static; - } -/* the "frame" */ -.fc-datagrid-cell-frame-liquid { - height: 100%; /* needs liquid hack */ -} -.fc-liquid-hack .fc-datagrid-cell-frame-liquid { - height: auto; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - } -.fc { - - /* the "frame" in a HEADER */ - /* needs to position the column resizer */ - /* needs to vertically center content */ - -} -.fc .fc-datagrid-header .fc-datagrid-cell-frame { - position: relative; /* for resizer */ - display: flex; - justify-content: flex-start; /* horizontal align (natural left/right) */ - align-items: center; /* vertical align */ - } -.fc { - - /* the column resizer (only in HEADER) */ - -} -.fc .fc-datagrid-cell-resizer { - position: absolute; - z-index: 1; - top: 0; - bottom: 0; - width: 5px; - cursor: col-resize; - } -.fc { - - /* the cushion */ - -} -.fc .fc-datagrid-cell-cushion { - padding: 8px; - white-space: normal; - overflow: hidden; /* problem for col resizer :( */ - } -.fc { - - /* expander icons */ - -} -.fc .fc-datagrid-expander { - cursor: pointer; - opacity: 0.65 - - } -.fc .fc-datagrid-expander .fc-icon { /* the expander and spacers before the expander */ - display: inline-block; - width: 1em; /* ensure constant width, esp for empty icons */ - } -.fc .fc-datagrid-expander-placeholder { - cursor: auto; - } -.fc .fc-resource-timeline-flat .fc-datagrid-expander-placeholder { - display: none; - } -.fc-direction-ltr .fc-datagrid-cell-resizer { right: -3px } -.fc-direction-rtl .fc-datagrid-cell-resizer { left: -3px } -.fc-direction-ltr .fc-datagrid-expander { margin-right: 3px } -.fc-direction-rtl .fc-datagrid-expander { margin-left: 3px } - +.fc-theme-bootstrap5-shaded { + background-color: var(--bs-gray-200); +} \ No newline at end of file